🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@mastra/server

Package Overview
Dependencies
Maintainers
7
Versions
1083
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@mastra/server - npm Package Compare versions

Comparing version
1.46.0-alpha.5
to
1.46.0
+56
dist/api-schema-manifest-F6SF6FJT.js
import { SERVER_ROUTES } from './chunk-FYBFIW5N.js';
import { schemaToJsonSchema } from './chunk-BRC4XSFG.js';
// src/server/server-adapter/api-schema-manifest.ts
function convertSchema(schema) {
return schema ? schemaToJsonSchema(schema) : void 0;
}
function asJsonSchema(value) {
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
}
function schemaType(schema) {
const type = schema?.type;
return Array.isArray(type) ? type.find(Boolean) : type;
}
function inferResponseShape(responseSchema) {
if (!responseSchema) return { kind: "unknown" };
const type = schemaType(responseSchema);
if (type === "array") return { kind: "array" };
if (type !== "object") return { kind: "single" };
const properties = responseSchema.properties && !Array.isArray(responseSchema.properties) ? responseSchema.properties : {};
const propertyNames = Object.keys(properties);
const paginationProperty = "page" in properties ? "page" : "pagination" in properties ? "pagination" : void 0;
const listProperty = Object.entries(properties).find(
([, property]) => schemaType(asJsonSchema(property)) === "array"
)?.[0];
if (listProperty && (paginationProperty || propertyNames.length <= 2)) {
return { kind: "object-property", listProperty, paginationProperty };
}
if (responseSchema.additionalProperties && propertyNames.length === 0) return { kind: "record" };
return { kind: "single" };
}
function isManifestRoute(route) {
return route.responseType === "json" && !route.deprecated;
}
function buildApiSchemaManifest(routes = SERVER_ROUTES) {
return {
version: 1,
routes: routes.filter(isManifestRoute).map((route) => {
const responseSchema = convertSchema(route.responseSchema);
return {
method: route.method,
path: route.path,
responseType: route.responseType,
pathParamSchema: convertSchema(route.pathParamSchema),
queryParamSchema: convertSchema(route.queryParamSchema),
bodySchema: convertSchema(route.bodySchema),
responseSchema,
responseShape: inferResponseShape(responseSchema)
};
})
};
}
export { buildApiSchemaManifest };
//# sourceMappingURL=api-schema-manifest-F6SF6FJT.js.map
//# sourceMappingURL=api-schema-manifest-F6SF6FJT.js.map
{"version":3,"sources":["../src/server/server-adapter/api-schema-manifest.ts"],"names":[],"mappings":";;;;AA2BA,SAAS,cAAc,MAAA,EAA4D;AACjF,EAAA,OAAO,MAAA,GAAS,kBAAA,CAAmB,MAAM,CAAA,GAAI,MAAA;AAC/C;AAEA,SAAS,aAAa,KAAA,EAAyC;AAC7D,EAAA,OAAO,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,KAAA,GAAwB,MAAA;AAChG;AAEA,SAAS,WAAW,MAAA,EAAkE;AACpF,EAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,EAAA,OAAO,MAAM,OAAA,CAAQ,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA;AACpD;AAEA,SAAS,mBAAmB,cAAA,EAAiE;AAC3F,EAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAE,MAAM,SAAA,EAAU;AAE9C,EAAA,MAAM,IAAA,GAAO,WAAW,cAAc,CAAA;AACtC,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,EAAE,MAAM,OAAA,EAAQ;AAC7C,EAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAE/C,EAAA,MAAM,UAAA,GACJ,cAAA,CAAe,UAAA,IAAc,CAAC,KAAA,CAAM,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA,GAAI,cAAA,CAAe,UAAA,GAAa,EAAC;AACxG,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC5C,EAAA,MAAM,qBAAqB,MAAA,IAAU,UAAA,GAAa,MAAA,GAAS,YAAA,IAAgB,aAAa,YAAA,GAAe,MAAA;AACvG,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAA;AAAA,IAC9C,CAAC,GAAG,QAAQ,MAAM,UAAA,CAAW,YAAA,CAAa,QAAQ,CAAC,CAAA,KAAM;AAAA,MACvD,CAAC,CAAA;AAEL,EAAA,IAAI,YAAA,KAAiB,kBAAA,IAAsB,aAAA,CAAc,MAAA,IAAU,CAAA,CAAA,EAAI;AACrE,IAAA,OAAO,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAA,EAAc,kBAAA,EAAmB;AAAA,EACrE;AACA,EAAA,IAAI,cAAA,CAAe,wBAAwB,aAAA,CAAc,MAAA,KAAW,GAAG,OAAO,EAAE,MAAM,QAAA,EAAS;AAC/F,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AAEA,SAAS,gBAAgB,KAAA,EAA6B;AACpD,EAAA,OAAO,KAAA,CAAM,YAAA,KAAiB,MAAA,IAAU,CAAC,KAAA,CAAM,UAAA;AACjD;AAEO,SAAS,sBAAA,CAAuB,SAAiC,aAAA,EAAkC;AACxG,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,QAAQ,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAE,IAAI,CAAA,KAAA,KAAS;AAClD,MAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,cAAc,CAAA;AACzD,MAAA,OAAO;AAAA,QACL,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,eAAA,EAAiB,aAAA,CAAc,KAAA,CAAM,eAAe,CAAA;AAAA,QACpD,gBAAA,EAAkB,aAAA,CAAc,KAAA,CAAM,gBAAgB,CAAA;AAAA,QACtD,UAAA,EAAY,aAAA,CAAc,KAAA,CAAM,UAAU,CAAA;AAAA,QAC1C,cAAA;AAAA,QACA,aAAA,EAAe,mBAAmB,cAAc;AAAA,OAClD;AAAA,IACF,CAAC;AAAA,GACH;AACF","file":"api-schema-manifest-F6SF6FJT.js","sourcesContent":["import type { JSONSchema7 } from '@mastra/schema-compat';\nimport { schemaToJsonSchema } from './openapi-utils';\nimport { SERVER_ROUTES } from './routes/index';\nimport type { ServerRoute } from './routes/index';\n\nexport interface ApiSchemaResponseShape {\n kind: 'array' | 'record' | 'object-property' | 'single' | 'unknown';\n listProperty?: string;\n paginationProperty?: string;\n}\n\nexport interface ApiSchemaManifestRoute {\n method: string;\n path: string;\n responseType: string;\n pathParamSchema?: JSONSchema7;\n queryParamSchema?: JSONSchema7;\n bodySchema?: JSONSchema7;\n responseSchema?: JSONSchema7;\n responseShape: ApiSchemaResponseShape;\n}\n\nexport interface ApiSchemaManifest {\n version: 1;\n routes: ApiSchemaManifestRoute[];\n}\n\nfunction convertSchema(schema: ServerRoute['bodySchema']): JSONSchema7 | undefined {\n return schema ? schemaToJsonSchema(schema) : undefined;\n}\n\nfunction asJsonSchema(value: unknown): JSONSchema7 | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as JSONSchema7) : undefined;\n}\n\nfunction schemaType(schema: JSONSchema7 | undefined): JSONSchema7['type'] | undefined {\n const type = schema?.type;\n return Array.isArray(type) ? type.find(Boolean) : type;\n}\n\nfunction inferResponseShape(responseSchema: JSONSchema7 | undefined): ApiSchemaResponseShape {\n if (!responseSchema) return { kind: 'unknown' };\n\n const type = schemaType(responseSchema);\n if (type === 'array') return { kind: 'array' };\n if (type !== 'object') return { kind: 'single' };\n\n const properties =\n responseSchema.properties && !Array.isArray(responseSchema.properties) ? responseSchema.properties : {};\n const propertyNames = Object.keys(properties);\n const paginationProperty = 'page' in properties ? 'page' : 'pagination' in properties ? 'pagination' : undefined;\n const listProperty = Object.entries(properties).find(\n ([, property]) => schemaType(asJsonSchema(property)) === 'array',\n )?.[0];\n\n if (listProperty && (paginationProperty || propertyNames.length <= 2)) {\n return { kind: 'object-property', listProperty, paginationProperty };\n }\n if (responseSchema.additionalProperties && propertyNames.length === 0) return { kind: 'record' };\n return { kind: 'single' };\n}\n\nfunction isManifestRoute(route: ServerRoute): boolean {\n return route.responseType === 'json' && !route.deprecated;\n}\n\nexport function buildApiSchemaManifest(routes: readonly ServerRoute[] = SERVER_ROUTES): ApiSchemaManifest {\n return {\n version: 1,\n routes: routes.filter(isManifestRoute).map(route => {\n const responseSchema = convertSchema(route.responseSchema);\n return {\n method: route.method,\n path: route.path,\n responseType: route.responseType,\n pathParamSchema: convertSchema(route.pathParamSchema),\n queryParamSchema: convertSchema(route.queryParamSchema),\n bodySchema: convertSchema(route.bodySchema),\n responseSchema,\n responseShape: inferResponseShape(responseSchema),\n };\n }),\n };\n}\n"]}
'use strict';
var chunk2CLXY7EU_cjs = require('./chunk-2CLXY7EU.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
// src/server/server-adapter/api-schema-manifest.ts
function convertSchema(schema) {
return schema ? chunkG54X6VE6_cjs.schemaToJsonSchema(schema) : void 0;
}
function asJsonSchema(value) {
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
}
function schemaType(schema) {
const type = schema?.type;
return Array.isArray(type) ? type.find(Boolean) : type;
}
function inferResponseShape(responseSchema) {
if (!responseSchema) return { kind: "unknown" };
const type = schemaType(responseSchema);
if (type === "array") return { kind: "array" };
if (type !== "object") return { kind: "single" };
const properties = responseSchema.properties && !Array.isArray(responseSchema.properties) ? responseSchema.properties : {};
const propertyNames = Object.keys(properties);
const paginationProperty = "page" in properties ? "page" : "pagination" in properties ? "pagination" : void 0;
const listProperty = Object.entries(properties).find(
([, property]) => schemaType(asJsonSchema(property)) === "array"
)?.[0];
if (listProperty && (paginationProperty || propertyNames.length <= 2)) {
return { kind: "object-property", listProperty, paginationProperty };
}
if (responseSchema.additionalProperties && propertyNames.length === 0) return { kind: "record" };
return { kind: "single" };
}
function isManifestRoute(route) {
return route.responseType === "json" && !route.deprecated;
}
function buildApiSchemaManifest(routes = chunk2CLXY7EU_cjs.SERVER_ROUTES) {
return {
version: 1,
routes: routes.filter(isManifestRoute).map((route) => {
const responseSchema = convertSchema(route.responseSchema);
return {
method: route.method,
path: route.path,
responseType: route.responseType,
pathParamSchema: convertSchema(route.pathParamSchema),
queryParamSchema: convertSchema(route.queryParamSchema),
bodySchema: convertSchema(route.bodySchema),
responseSchema,
responseShape: inferResponseShape(responseSchema)
};
})
};
}
exports.buildApiSchemaManifest = buildApiSchemaManifest;
//# sourceMappingURL=api-schema-manifest-PVHR2FGG.cjs.map
//# sourceMappingURL=api-schema-manifest-PVHR2FGG.cjs.map
{"version":3,"sources":["../src/server/server-adapter/api-schema-manifest.ts"],"names":["schemaToJsonSchema","SERVER_ROUTES"],"mappings":";;;;;;AA2BA,SAAS,cAAc,MAAA,EAA4D;AACjF,EAAA,OAAO,MAAA,GAASA,oCAAA,CAAmB,MAAM,CAAA,GAAI,MAAA;AAC/C;AAEA,SAAS,aAAa,KAAA,EAAyC;AAC7D,EAAA,OAAO,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,KAAA,GAAwB,MAAA;AAChG;AAEA,SAAS,WAAW,MAAA,EAAkE;AACpF,EAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,EAAA,OAAO,MAAM,OAAA,CAAQ,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA;AACpD;AAEA,SAAS,mBAAmB,cAAA,EAAiE;AAC3F,EAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAE,MAAM,SAAA,EAAU;AAE9C,EAAA,MAAM,IAAA,GAAO,WAAW,cAAc,CAAA;AACtC,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,EAAE,MAAM,OAAA,EAAQ;AAC7C,EAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAE/C,EAAA,MAAM,UAAA,GACJ,cAAA,CAAe,UAAA,IAAc,CAAC,KAAA,CAAM,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA,GAAI,cAAA,CAAe,UAAA,GAAa,EAAC;AACxG,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC5C,EAAA,MAAM,qBAAqB,MAAA,IAAU,UAAA,GAAa,MAAA,GAAS,YAAA,IAAgB,aAAa,YAAA,GAAe,MAAA;AACvG,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAA;AAAA,IAC9C,CAAC,GAAG,QAAQ,MAAM,UAAA,CAAW,YAAA,CAAa,QAAQ,CAAC,CAAA,KAAM;AAAA,MACvD,CAAC,CAAA;AAEL,EAAA,IAAI,YAAA,KAAiB,kBAAA,IAAsB,aAAA,CAAc,MAAA,IAAU,CAAA,CAAA,EAAI;AACrE,IAAA,OAAO,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAA,EAAc,kBAAA,EAAmB;AAAA,EACrE;AACA,EAAA,IAAI,cAAA,CAAe,wBAAwB,aAAA,CAAc,MAAA,KAAW,GAAG,OAAO,EAAE,MAAM,QAAA,EAAS;AAC/F,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AAEA,SAAS,gBAAgB,KAAA,EAA6B;AACpD,EAAA,OAAO,KAAA,CAAM,YAAA,KAAiB,MAAA,IAAU,CAAC,KAAA,CAAM,UAAA;AACjD;AAEO,SAAS,sBAAA,CAAuB,SAAiCC,+BAAA,EAAkC;AACxG,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,QAAQ,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAE,IAAI,CAAA,KAAA,KAAS;AAClD,MAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,cAAc,CAAA;AACzD,MAAA,OAAO;AAAA,QACL,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,eAAA,EAAiB,aAAA,CAAc,KAAA,CAAM,eAAe,CAAA;AAAA,QACpD,gBAAA,EAAkB,aAAA,CAAc,KAAA,CAAM,gBAAgB,CAAA;AAAA,QACtD,UAAA,EAAY,aAAA,CAAc,KAAA,CAAM,UAAU,CAAA;AAAA,QAC1C,cAAA;AAAA,QACA,aAAA,EAAe,mBAAmB,cAAc;AAAA,OAClD;AAAA,IACF,CAAC;AAAA,GACH;AACF","file":"api-schema-manifest-PVHR2FGG.cjs","sourcesContent":["import type { JSONSchema7 } from '@mastra/schema-compat';\nimport { schemaToJsonSchema } from './openapi-utils';\nimport { SERVER_ROUTES } from './routes/index';\nimport type { ServerRoute } from './routes/index';\n\nexport interface ApiSchemaResponseShape {\n kind: 'array' | 'record' | 'object-property' | 'single' | 'unknown';\n listProperty?: string;\n paginationProperty?: string;\n}\n\nexport interface ApiSchemaManifestRoute {\n method: string;\n path: string;\n responseType: string;\n pathParamSchema?: JSONSchema7;\n queryParamSchema?: JSONSchema7;\n bodySchema?: JSONSchema7;\n responseSchema?: JSONSchema7;\n responseShape: ApiSchemaResponseShape;\n}\n\nexport interface ApiSchemaManifest {\n version: 1;\n routes: ApiSchemaManifestRoute[];\n}\n\nfunction convertSchema(schema: ServerRoute['bodySchema']): JSONSchema7 | undefined {\n return schema ? schemaToJsonSchema(schema) : undefined;\n}\n\nfunction asJsonSchema(value: unknown): JSONSchema7 | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as JSONSchema7) : undefined;\n}\n\nfunction schemaType(schema: JSONSchema7 | undefined): JSONSchema7['type'] | undefined {\n const type = schema?.type;\n return Array.isArray(type) ? type.find(Boolean) : type;\n}\n\nfunction inferResponseShape(responseSchema: JSONSchema7 | undefined): ApiSchemaResponseShape {\n if (!responseSchema) return { kind: 'unknown' };\n\n const type = schemaType(responseSchema);\n if (type === 'array') return { kind: 'array' };\n if (type !== 'object') return { kind: 'single' };\n\n const properties =\n responseSchema.properties && !Array.isArray(responseSchema.properties) ? responseSchema.properties : {};\n const propertyNames = Object.keys(properties);\n const paginationProperty = 'page' in properties ? 'page' : 'pagination' in properties ? 'pagination' : undefined;\n const listProperty = Object.entries(properties).find(\n ([, property]) => schemaType(asJsonSchema(property)) === 'array',\n )?.[0];\n\n if (listProperty && (paginationProperty || propertyNames.length <= 2)) {\n return { kind: 'object-property', listProperty, paginationProperty };\n }\n if (responseSchema.additionalProperties && propertyNames.length === 0) return { kind: 'record' };\n return { kind: 'single' };\n}\n\nfunction isManifestRoute(route: ServerRoute): boolean {\n return route.responseType === 'json' && !route.deprecated;\n}\n\nexport function buildApiSchemaManifest(routes: readonly ServerRoute[] = SERVER_ROUTES): ApiSchemaManifest {\n return {\n version: 1,\n routes: routes.filter(isManifestRoute).map(route => {\n const responseSchema = convertSchema(route.responseSchema);\n return {\n method: route.method,\n path: route.path,\n responseType: route.responseType,\n pathParamSchema: convertSchema(route.pathParamSchema),\n queryParamSchema: convertSchema(route.queryParamSchema),\n bodySchema: convertSchema(route.bodySchema),\n responseSchema,\n responseShape: inferResponseShape(responseSchema),\n };\n }),\n };\n}\n"]}
'use strict';
var chunkXOQEKMY2_cjs = require('./chunk-XOQEKMY2.cjs');
var chunkVNWPOCOT_cjs = require('./chunk-VNWPOCOT.cjs');
var chunkE2EYPHRE_cjs = require('./chunk-E2EYPHRE.cjs');
var chunkOT2JWWCT_cjs = require('./chunk-OT2JWWCT.cjs');
var chunkDULEYONH_cjs = require('./chunk-DULEYONH.cjs');
var chunkUD7JBYUI_cjs = require('./chunk-UD7JBYUI.cjs');
var chunkUZ43QCIA_cjs = require('./chunk-UZ43QCIA.cjs');
var chunkBTMYAVRX_cjs = require('./chunk-BTMYAVRX.cjs');
var chunkIRJJ2JJG_cjs = require('./chunk-IRJJ2JJG.cjs');
var chunkY3MYKCTO_cjs = require('./chunk-Y3MYKCTO.cjs');
var chunkUZINJHAF_cjs = require('./chunk-UZINJHAF.cjs');
var chunkRM4ITWAQ_cjs = require('./chunk-RM4ITWAQ.cjs');
var chunkCZ5EDK57_cjs = require('./chunk-CZ5EDK57.cjs');
var chunkONBABU5V_cjs = require('./chunk-ONBABU5V.cjs');
var chunk4NYA6U6Y_cjs = require('./chunk-4NYA6U6Y.cjs');
var chunkPJLW25AQ_cjs = require('./chunk-PJLW25AQ.cjs');
var chunkS2HKHYJ3_cjs = require('./chunk-S2HKHYJ3.cjs');
var chunkI6AIWII6_cjs = require('./chunk-I6AIWII6.cjs');
var chunkJZJ3PP2H_cjs = require('./chunk-JZJ3PP2H.cjs');
var chunkZFRMJ23H_cjs = require('./chunk-ZFRMJ23H.cjs');
var chunk7FIDKZUG_cjs = require('./chunk-7FIDKZUG.cjs');
var chunkBTIK5TXF_cjs = require('./chunk-BTIK5TXF.cjs');
var chunkJGLVYJ3S_cjs = require('./chunk-JGLVYJ3S.cjs');
var chunkPMGFP7II_cjs = require('./chunk-PMGFP7II.cjs');
var chunkUSU23GYD_cjs = require('./chunk-USU23GYD.cjs');
var chunkUITLSJUW_cjs = require('./chunk-UITLSJUW.cjs');
var chunkM5DAKMVZ_cjs = require('./chunk-M5DAKMVZ.cjs');
var chunkJY2LHUT4_cjs = require('./chunk-JY2LHUT4.cjs');
var chunkIMHKYH3U_cjs = require('./chunk-IMHKYH3U.cjs');
var chunk6HRGFBAF_cjs = require('./chunk-6HRGFBAF.cjs');
var chunk7X243C5K_cjs = require('./chunk-7X243C5K.cjs');
var chunk7B36J5MV_cjs = require('./chunk-7B36J5MV.cjs');
var chunkGU4AEOGA_cjs = require('./chunk-GU4AEOGA.cjs');
var chunkDEK4ZGUR_cjs = require('./chunk-DEK4ZGUR.cjs');
var chunkK3FM6RLZ_cjs = require('./chunk-K3FM6RLZ.cjs');
var chunk4ZHHKMDQ_cjs = require('./chunk-4ZHHKMDQ.cjs');
var chunk7DKSWNOM_cjs = require('./chunk-7DKSWNOM.cjs');
var chunkL4V4FQDA_cjs = require('./chunk-L4V4FQDA.cjs');
var chunkU72IZ5BP_cjs = require('./chunk-U72IZ5BP.cjs');
var chunkT32FQPWH_cjs = require('./chunk-T32FQPWH.cjs');
// src/server/server-adapter/routes/permissions.ts
var METHOD_TO_ACTION = {
GET: "read",
POST: "write",
// Default for POST, may be overridden to 'execute'
PUT: "write",
PATCH: "write",
DELETE: "delete"
};
var EXECUTE_PATTERNS = [
"/generate",
"/stream",
"/execute",
"/start",
"/resume",
"/restart",
"/cancel",
"/approve",
"/decline",
"/speak",
"/listen",
"/query",
"/search",
"/observe",
"/time-travel",
"/enhance",
"/clone"
];
var PUBLISH_PATTERNS = ["/publish", "/activate", "/restore"];
var STORED_RESOURCE_SEGMENTS = {
agents: "stored-agents",
"mcp-clients": "stored-mcp-clients",
"prompt-blocks": "stored-prompt-blocks",
scorers: "stored-scorers",
skills: "stored-skills",
workspaces: "stored-workspaces"
};
function extractResource(path) {
const segments = path.replace(/^\//, "").split("/");
if (segments.length === 0) {
return null;
}
const firstSegment = segments[0];
if (firstSegment === "stored" && segments[1]) {
return STORED_RESOURCE_SEGMENTS[segments[1]] ?? null;
}
if (firstSegment === ".well-known") {
return "a2a";
}
return firstSegment || null;
}
function deriveAction(method, path) {
const upperMethod = method.toUpperCase();
if (upperMethod === "POST") {
if (path.startsWith("/stored/")) {
const isPublishOperation = PUBLISH_PATTERNS.some((pattern) => path.endsWith(pattern));
if (isPublishOperation) {
return "publish";
}
}
const isExecuteOperation = EXECUTE_PATTERNS.some((pattern) => path.includes(pattern));
return isExecuteOperation ? "execute" : "write";
}
return METHOD_TO_ACTION[upperMethod] || "read";
}
function derivePermission(route) {
if (route.method === "ALL") {
return null;
}
const resource = extractResource(route.path);
if (!resource) {
return null;
}
const action = deriveAction(route.method, route.path);
return `${resource}:${action}`;
}
function getEffectivePermission(route) {
if (route.requiresAuth === false) {
return null;
}
if (route.requiresPermission) {
return route.requiresPermission;
}
return derivePermission(route);
}
// src/server/server-adapter/routes/a2a.ts
var A2A_ROUTES = [chunkK3FM6RLZ_cjs.GET_AGENT_CARD_ROUTE, chunkK3FM6RLZ_cjs.AGENT_EXECUTION_ROUTE];
// src/server/server-adapter/routes/agent-builder.ts
var AGENT_BUILDER_ROUTES = [
chunkL4V4FQDA_cjs.LIST_AGENT_BUILDER_ACTIONS_ROUTE,
chunkL4V4FQDA_cjs.GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE,
chunkL4V4FQDA_cjs.LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE,
chunkL4V4FQDA_cjs.GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE,
chunkL4V4FQDA_cjs.CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE,
chunkL4V4FQDA_cjs.STREAM_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.START_ASYNC_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.START_AGENT_BUILDER_ACTION_RUN_ROUTE,
chunkL4V4FQDA_cjs.OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.RESUME_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE
];
// src/server/server-adapter/routes/agents.ts
var AGENTS_ROUTES = [
// ============================================================================
// Agent Core Routes
// ============================================================================
chunk7DKSWNOM_cjs.LIST_AGENTS_ROUTE,
chunk7DKSWNOM_cjs.GET_PROVIDERS_ROUTE,
chunk7DKSWNOM_cjs.GET_AGENT_BY_ID_ROUTE,
chunk7DKSWNOM_cjs.CLONE_AGENT_ROUTE,
// ============================================================================
// Voice Routes
// ============================================================================
chunkPMGFP7II_cjs.GET_SPEAKERS_ROUTE,
chunkPMGFP7II_cjs.GET_SPEAKERS_DEPRECATED_ROUTE,
// ============================================================================
// Agent Execution Routes
// ============================================================================
chunk7DKSWNOM_cjs.GENERATE_AGENT_ROUTE,
chunk7DKSWNOM_cjs.GENERATE_AGENT_VNEXT_ROUTE,
chunk7DKSWNOM_cjs.STREAM_GENERATE_ROUTE,
chunk7DKSWNOM_cjs.STREAM_UNTIL_IDLE_GENERATE_ROUTE,
chunk7DKSWNOM_cjs.STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,
// ============================================================================
// Resumable Stream Routes
// ============================================================================
chunk7DKSWNOM_cjs.OBSERVE_AGENT_STREAM_ROUTE,
chunk7DKSWNOM_cjs.SEND_AGENT_MESSAGE_ROUTE,
chunk7DKSWNOM_cjs.QUEUE_AGENT_MESSAGE_ROUTE,
chunk7DKSWNOM_cjs.SEND_AGENT_SIGNAL_ROUTE,
chunk7DKSWNOM_cjs.ABORT_AGENT_THREAD_ROUTE,
chunk7DKSWNOM_cjs.SUBSCRIBE_AGENT_THREAD_ROUTE,
// ============================================================================
// Tool Routes
// ============================================================================
chunkUITLSJUW_cjs.EXECUTE_AGENT_TOOL_ROUTE,
chunk7DKSWNOM_cjs.APPROVE_TOOL_CALL_ROUTE,
chunk7DKSWNOM_cjs.SEND_TOOL_APPROVAL_ROUTE,
chunk7DKSWNOM_cjs.DECLINE_TOOL_CALL_ROUTE,
chunk7DKSWNOM_cjs.RESUME_STREAM_ROUTE,
chunk7DKSWNOM_cjs.APPROVE_TOOL_CALL_GENERATE_ROUTE,
chunk7DKSWNOM_cjs.DECLINE_TOOL_CALL_GENERATE_ROUTE,
chunk7DKSWNOM_cjs.APPROVE_NETWORK_TOOL_CALL_ROUTE,
chunk7DKSWNOM_cjs.DECLINE_NETWORK_TOOL_CALL_ROUTE,
chunk7DKSWNOM_cjs.RESUME_STREAM_UNTIL_IDLE_ROUTE,
// ============================================================================
// Network Routes
// ============================================================================
chunk7DKSWNOM_cjs.STREAM_NETWORK_ROUTE,
// ============================================================================
// Model Management Routes
// ============================================================================
chunk7DKSWNOM_cjs.UPDATE_AGENT_MODEL_ROUTE,
chunk7DKSWNOM_cjs.RESET_AGENT_MODEL_ROUTE,
chunk7DKSWNOM_cjs.REORDER_AGENT_MODEL_LIST_ROUTE,
chunk7DKSWNOM_cjs.UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,
// ============================================================================
// Instruction Enhancement Routes
// ============================================================================
chunk7DKSWNOM_cjs.ENHANCE_INSTRUCTIONS_ROUTE,
// ============================================================================
// Agent Tool Routes
// ============================================================================
chunkUITLSJUW_cjs.GET_AGENT_TOOL_ROUTE,
// ============================================================================
// Agent Skill Routes
// ============================================================================
chunk7DKSWNOM_cjs.GET_AGENT_SKILL_ROUTE,
// ============================================================================
// Voice/Speech Routes
// ============================================================================
chunkPMGFP7II_cjs.GENERATE_SPEECH_ROUTE,
chunkPMGFP7II_cjs.GENERATE_SPEECH_DEPRECATED_ROUTE,
chunkPMGFP7II_cjs.TRANSCRIBE_SPEECH_ROUTE,
chunkPMGFP7II_cjs.TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,
chunkPMGFP7II_cjs.GET_LISTENER_ROUTE,
// ============================================================================
// Deprecated Routes
// ============================================================================
chunk7DKSWNOM_cjs.STREAM_VNEXT_DEPRECATED_ROUTE,
chunk7DKSWNOM_cjs.STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,
chunk7DKSWNOM_cjs.STREAM_UI_MESSAGE_DEPRECATED_ROUTE
];
// src/server/server-adapter/routes/background-tasks.ts
var BACKGROUND_TASK_ROUTES = [
chunkZFRMJ23H_cjs.BACKGROUND_TASK_STREAM_ROUTE,
chunkZFRMJ23H_cjs.LIST_BACKGROUND_TASKS_ROUTE,
chunkZFRMJ23H_cjs.GET_BACKGROUND_TASK_ROUTE
];
// src/server/server-adapter/routes/channels.ts
var CHANNELS_ROUTES = [
chunkBTIK5TXF_cjs.LIST_CHANNEL_PLATFORMS_ROUTE,
chunkBTIK5TXF_cjs.LIST_CHANNEL_INSTALLATIONS_ROUTE,
chunkBTIK5TXF_cjs.CONNECT_CHANNEL_ROUTE,
chunkBTIK5TXF_cjs.DISCONNECT_CHANNEL_ROUTE
];
// src/server/server-adapter/routes/conversations.ts
var CONVERSATIONS_ROUTES = [
chunkDEK4ZGUR_cjs.CREATE_CONVERSATION_ROUTE,
chunkDEK4ZGUR_cjs.GET_CONVERSATION_ROUTE,
chunkDEK4ZGUR_cjs.GET_CONVERSATION_ITEMS_ROUTE,
chunkDEK4ZGUR_cjs.DELETE_CONVERSATION_ROUTE
];
// src/server/server-adapter/routes/datasets.ts
var DATASETS_ROUTES = [
// Dataset CRUD
chunkPJLW25AQ_cjs.LIST_DATASETS_ROUTE,
chunkPJLW25AQ_cjs.CREATE_DATASET_ROUTE,
chunkPJLW25AQ_cjs.GET_DATASET_ROUTE,
chunkPJLW25AQ_cjs.UPDATE_DATASET_ROUTE,
chunkPJLW25AQ_cjs.DELETE_DATASET_ROUTE,
// Item list and add
chunkPJLW25AQ_cjs.LIST_ITEMS_ROUTE,
chunkPJLW25AQ_cjs.ADD_ITEM_ROUTE,
// Batch operations - MUST come before item-specific routes to avoid /items/batch matching /items/:itemId
chunkPJLW25AQ_cjs.BATCH_INSERT_ITEMS_ROUTE,
chunkPJLW25AQ_cjs.BATCH_DELETE_ITEMS_ROUTE,
// Item-specific CRUD (uses :itemId param)
chunkPJLW25AQ_cjs.GET_ITEM_ROUTE,
chunkPJLW25AQ_cjs.UPDATE_ITEM_ROUTE,
chunkPJLW25AQ_cjs.DELETE_ITEM_ROUTE,
// Version operations
chunkPJLW25AQ_cjs.LIST_DATASET_VERSIONS_ROUTE,
chunkPJLW25AQ_cjs.LIST_ITEM_VERSIONS_ROUTE,
chunkPJLW25AQ_cjs.GET_ITEM_VERSION_ROUTE,
// All experiments (cross-dataset) - MUST come before dataset-scoped experiments
chunkPJLW25AQ_cjs.LIST_ALL_EXPERIMENTS_ROUTE,
// Experiment review summary (cross-dataset) - MUST come before dataset-scoped experiments
chunkPJLW25AQ_cjs.EXPERIMENT_REVIEW_SUMMARY_ROUTE,
// Experiment operations (dataset-scoped)
chunkPJLW25AQ_cjs.LIST_EXPERIMENTS_ROUTE,
chunkPJLW25AQ_cjs.TRIGGER_EXPERIMENT_ROUTE,
chunkPJLW25AQ_cjs.GET_EXPERIMENT_ROUTE,
chunkPJLW25AQ_cjs.LIST_EXPERIMENT_RESULTS_ROUTE,
chunkPJLW25AQ_cjs.UPDATE_EXPERIMENT_RESULT_ROUTE,
// Analytics
chunkPJLW25AQ_cjs.COMPARE_EXPERIMENTS_ROUTE,
// AI generation
chunkPJLW25AQ_cjs.GENERATE_ITEMS_ROUTE,
// Failure analysis
chunkPJLW25AQ_cjs.CLUSTER_FAILURES_ROUTE
];
// src/server/server-adapter/routes/editor-builder.ts
var EDITOR_BUILDER_ROUTES = [
chunkS2HKHYJ3_cjs.GET_EDITOR_BUILDER_SETTINGS_ROUTE,
chunkS2HKHYJ3_cjs.GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE,
chunkS2HKHYJ3_cjs.GET_INFRASTRUCTURE_STATUS_ROUTE,
chunk7FIDKZUG_cjs.LIST_BUILDER_REGISTRIES_ROUTE,
chunk7FIDKZUG_cjs.BUILDER_REGISTRY_SEARCH_ROUTE,
chunk7FIDKZUG_cjs.BUILDER_REGISTRY_POPULAR_ROUTE,
chunk7FIDKZUG_cjs.BUILDER_REGISTRY_PREVIEW_ROUTE,
chunk7FIDKZUG_cjs.BUILDER_REGISTRY_INSTALL_ROUTE
];
// src/server/server-adapter/routes/harness.ts
var HARNESS_ROUTES = [
chunkI6AIWII6_cjs.LIST_HARNESSES_ROUTE,
chunkI6AIWII6_cjs.LIST_HARNESS_MODES_ROUTE,
chunkI6AIWII6_cjs.LIST_HARNESS_MODELS_ROUTE,
chunkI6AIWII6_cjs.CREATE_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_SESSION_STATE_ROUTE,
chunkI6AIWII6_cjs.LIST_HARNESS_THREADS_ROUTE,
chunkI6AIWII6_cjs.CREATE_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.DELETE_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.RENAME_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.CLONE_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.LIST_HARNESS_THREAD_MESSAGES_ROUTE,
chunkI6AIWII6_cjs.STREAM_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.SEND_HARNESS_MESSAGE_ROUTE,
chunkI6AIWII6_cjs.STEER_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.FOLLOW_UP_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.ABORT_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.HARNESS_TOOL_APPROVAL_ROUTE,
chunkI6AIWII6_cjs.HARNESS_TOOL_SUSPENSION_ROUTE,
chunkI6AIWII6_cjs.SWITCH_HARNESS_MODE_ROUTE,
chunkI6AIWII6_cjs.SWITCH_HARNESS_MODEL_ROUTE,
chunkI6AIWII6_cjs.SWITCH_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.SEND_HARNESS_NOTIFICATION_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_WORKSPACE_STATUS_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_OM_RECORD_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_RESOURCE_ID_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_RESOURCE_IDS_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_GOAL_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_GOAL_ROUTE,
chunkI6AIWII6_cjs.UPDATE_HARNESS_GOAL_ROUTE,
chunkI6AIWII6_cjs.CLEAR_HARNESS_GOAL_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_PERMISSIONS_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_CATEGORY_PERMISSION_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_TOOL_PERMISSION_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_SESSION_STATE_ROUTE
];
// src/server/server-adapter/routes/legacy.ts
var LEGACY_ROUTES = [
// ============================================================================
// Legacy Agent Routes
// ============================================================================
chunk7DKSWNOM_cjs.GENERATE_LEGACY_ROUTE,
chunk7DKSWNOM_cjs.STREAM_GENERATE_LEGACY_ROUTE,
// ============================================================================
// Legacy Workflow Routes
// ============================================================================
chunkU72IZ5BP_cjs.STREAM_LEGACY_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE
];
// src/server/server-adapter/routes/logs.ts
var LOGS_ROUTES = [chunkGU4AEOGA_cjs.LIST_LOG_TRANSPORTS_ROUTE, chunkGU4AEOGA_cjs.LIST_LOGS_ROUTE, chunkGU4AEOGA_cjs.LIST_LOGS_BY_RUN_ID_ROUTE];
// src/server/server-adapter/routes/mcp.ts
var MCP_ROUTES = [
// ============================================================================
// MCP Server Registry Routes
// ============================================================================
chunkIMHKYH3U_cjs.LIST_MCP_SERVERS_ROUTE,
chunkIMHKYH3U_cjs.GET_MCP_SERVER_DETAIL_ROUTE,
// ============================================================================
// MCP Server Tool Routes
// ============================================================================
chunkIMHKYH3U_cjs.LIST_MCP_SERVER_TOOLS_ROUTE,
chunkIMHKYH3U_cjs.GET_MCP_SERVER_TOOL_DETAIL_ROUTE,
chunkIMHKYH3U_cjs.EXECUTE_MCP_SERVER_TOOL_ROUTE,
// ============================================================================
// MCP Server Resource Routes
// ============================================================================
chunkIMHKYH3U_cjs.LIST_MCP_SERVER_RESOURCES_ROUTE,
chunkIMHKYH3U_cjs.READ_MCP_SERVER_RESOURCE_ROUTE,
// ============================================================================
// MCP Transport Routes (handled by adapters)
// ============================================================================
chunkIMHKYH3U_cjs.MCP_HTTP_TRANSPORT_ROUTE,
chunkIMHKYH3U_cjs.MCP_SSE_TRANSPORT_ROUTE,
chunkIMHKYH3U_cjs.MCP_SSE_MESSAGES_ROUTE
];
// src/server/server-adapter/routes/memory.ts
var MEMORY_ROUTES = [
chunk6HRGFBAF_cjs.GET_MEMORY_STATUS_ROUTE,
chunk6HRGFBAF_cjs.GET_MEMORY_CONFIG_ROUTE,
chunk6HRGFBAF_cjs.GET_OBSERVATIONAL_MEMORY_ROUTE,
chunk6HRGFBAF_cjs.AWAIT_BUFFER_STATUS_ROUTE,
chunk6HRGFBAF_cjs.LIST_THREADS_ROUTE,
chunk6HRGFBAF_cjs.GET_THREAD_BY_ID_ROUTE,
chunk6HRGFBAF_cjs.LIST_MESSAGES_ROUTE,
chunk6HRGFBAF_cjs.GET_WORKING_MEMORY_ROUTE,
chunk6HRGFBAF_cjs.SAVE_MESSAGES_ROUTE,
chunk6HRGFBAF_cjs.CREATE_THREAD_ROUTE,
chunk6HRGFBAF_cjs.UPDATE_THREAD_ROUTE,
chunk6HRGFBAF_cjs.DELETE_THREAD_ROUTE,
chunk6HRGFBAF_cjs.CLONE_THREAD_ROUTE,
chunk6HRGFBAF_cjs.UPDATE_WORKING_MEMORY_ROUTE,
chunk6HRGFBAF_cjs.DELETE_MESSAGES_ROUTE,
chunk6HRGFBAF_cjs.SEARCH_MEMORY_ROUTE,
chunk6HRGFBAF_cjs.GET_MEMORY_STATUS_NETWORK_ROUTE,
chunk6HRGFBAF_cjs.LIST_THREADS_NETWORK_ROUTE,
chunk6HRGFBAF_cjs.GET_THREAD_BY_ID_NETWORK_ROUTE,
chunk6HRGFBAF_cjs.LIST_MESSAGES_NETWORK_ROUTE,
chunk6HRGFBAF_cjs.SAVE_MESSAGES_NETWORK_ROUTE,
chunk6HRGFBAF_cjs.CREATE_THREAD_NETWORK_ROUTE,
chunk6HRGFBAF_cjs.UPDATE_THREAD_NETWORK_ROUTE,
chunk6HRGFBAF_cjs.DELETE_THREAD_NETWORK_ROUTE,
chunk6HRGFBAF_cjs.DELETE_MESSAGES_NETWORK_ROUTE
];
// src/server/server-adapter/routes/observability.ts
var OBSERVABILITY_ROUTES = [
// Legacy
chunk7X243C5K_cjs.LIST_TRACES_ROUTE,
chunk7X243C5K_cjs.LIST_TRACES_LIGHT_ROUTE,
chunk7X243C5K_cjs.LIST_BRANCHES_ROUTE,
chunk7X243C5K_cjs.GET_BRANCH_ROUTE,
chunk7X243C5K_cjs.GET_TRACE_ROUTE,
chunk7X243C5K_cjs.GET_TRACE_LIGHT_ROUTE,
chunk7X243C5K_cjs.GET_SPAN_ROUTE,
chunk7X243C5K_cjs.GET_TRACE_TRAJECTORY_ROUTE,
chunk7X243C5K_cjs.SCORE_TRACES_ROUTE,
chunk7X243C5K_cjs.LIST_SCORES_BY_SPAN_ROUTE,
// New observability routes
chunk7B36J5MV_cjs.LIST_METRICS,
chunk7B36J5MV_cjs.LIST_LOGS,
chunk7B36J5MV_cjs.LIST_SCORES,
chunk7B36J5MV_cjs.CREATE_SCORE,
chunk7B36J5MV_cjs.GET_SCORE,
chunk7B36J5MV_cjs.GET_SCORE_AGGREGATE,
chunk7B36J5MV_cjs.GET_SCORE_BREAKDOWN,
chunk7B36J5MV_cjs.GET_SCORE_TIME_SERIES,
chunk7B36J5MV_cjs.GET_SCORE_PERCENTILES,
chunk7B36J5MV_cjs.LIST_FEEDBACK,
chunk7B36J5MV_cjs.CREATE_FEEDBACK,
chunk7B36J5MV_cjs.GET_FEEDBACK_AGGREGATE,
chunk7B36J5MV_cjs.GET_FEEDBACK_BREAKDOWN,
chunk7B36J5MV_cjs.GET_FEEDBACK_TIME_SERIES,
chunk7B36J5MV_cjs.GET_FEEDBACK_PERCENTILES,
chunk7B36J5MV_cjs.GET_METRIC_AGGREGATE,
chunk7B36J5MV_cjs.GET_METRIC_BREAKDOWN,
chunk7B36J5MV_cjs.GET_METRIC_TIME_SERIES,
chunk7B36J5MV_cjs.GET_METRIC_PERCENTILES,
chunk7B36J5MV_cjs.GET_METRIC_NAMES,
chunk7B36J5MV_cjs.GET_METRIC_LABEL_KEYS,
chunk7B36J5MV_cjs.GET_METRIC_LABEL_VALUES,
chunk7B36J5MV_cjs.GET_ENTITY_TYPES,
chunk7B36J5MV_cjs.GET_ENTITY_NAMES,
chunk7B36J5MV_cjs.GET_SERVICE_NAMES,
chunk7B36J5MV_cjs.GET_ENVIRONMENTS,
chunk7B36J5MV_cjs.GET_TAGS
];
// src/server/server-adapter/routes/processor-providers.ts
var PROCESSOR_PROVIDER_ROUTES = [chunk4NYA6U6Y_cjs.LIST_PROCESSOR_PROVIDERS_ROUTE, chunk4NYA6U6Y_cjs.GET_PROCESSOR_PROVIDER_ROUTE];
// src/server/server-adapter/routes/processors.ts
var PROCESSORS_ROUTES = [chunkUZINJHAF_cjs.LIST_PROCESSORS_ROUTE, chunkUZINJHAF_cjs.GET_PROCESSOR_BY_ID_ROUTE, chunkUZINJHAF_cjs.EXECUTE_PROCESSOR_ROUTE];
// src/server/server-adapter/routes/responses.ts
var RESPONSES_ROUTES = [chunkJY2LHUT4_cjs.CREATE_RESPONSE_ROUTE, chunkJY2LHUT4_cjs.GET_RESPONSE_ROUTE, chunkJY2LHUT4_cjs.DELETE_RESPONSE_ROUTE];
// src/server/server-adapter/routes/schedules.ts
var SCHEDULES_ROUTES = [
chunkCZ5EDK57_cjs.LIST_SCHEDULES_ROUTE,
chunkCZ5EDK57_cjs.GET_SCHEDULE_ROUTE,
chunkCZ5EDK57_cjs.LIST_SCHEDULE_TRIGGERS_ROUTE,
chunkCZ5EDK57_cjs.PAUSE_SCHEDULE_ROUTE,
chunkCZ5EDK57_cjs.RESUME_SCHEDULE_ROUTE
];
// src/server/server-adapter/routes/scorers.ts
var SCORES_ROUTES = [
chunkM5DAKMVZ_cjs.LIST_SCORERS_ROUTE,
chunkM5DAKMVZ_cjs.GET_SCORER_ROUTE,
chunkM5DAKMVZ_cjs.LIST_SCORES_BY_RUN_ID_ROUTE,
chunkM5DAKMVZ_cjs.LIST_SCORES_BY_SCORER_ID_ROUTE,
chunkM5DAKMVZ_cjs.LIST_SCORES_BY_ENTITY_ID_ROUTE,
chunkM5DAKMVZ_cjs.SAVE_SCORE_ROUTE
];
// src/server/server-adapter/routes/stored-agents.ts
var STORED_AGENTS_ROUTES = [
// ============================================================================
// Stored Agents CRUD Routes
// IMPORTANT: Routes with literal paths (e.g., /preview-instructions) must come
// BEFORE routes with path parameters (e.g., /:storedAgentId) to ensure correct matching.
// ============================================================================
chunkUD7JBYUI_cjs.LIST_STORED_AGENTS_ROUTE,
chunkUD7JBYUI_cjs.PREVIEW_INSTRUCTIONS_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
chunkUD7JBYUI_cjs.GET_STORED_AGENT_DEPENDENTS_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE (longer literal)
chunkUD7JBYUI_cjs.EXPORT_STORED_AGENT_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
chunkUD7JBYUI_cjs.OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
chunkUD7JBYUI_cjs.GET_STORED_AGENT_ROUTE,
chunkUD7JBYUI_cjs.CREATE_STORED_AGENT_ROUTE,
chunkUD7JBYUI_cjs.UPDATE_STORED_AGENT_ROUTE,
chunkUD7JBYUI_cjs.DELETE_STORED_AGENT_ROUTE,
// ============================================================================
// Agent Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
// ============================================================================
chunkT32FQPWH_cjs.LIST_AGENT_VERSIONS_ROUTE,
chunkT32FQPWH_cjs.CREATE_AGENT_VERSION_ROUTE,
chunkT32FQPWH_cjs.COMPARE_AGENT_VERSIONS_ROUTE,
// Must be before GET_AGENT_VERSION_ROUTE
chunkT32FQPWH_cjs.GET_AGENT_VERSION_ROUTE,
chunkT32FQPWH_cjs.ACTIVATE_AGENT_VERSION_ROUTE,
chunkT32FQPWH_cjs.RESTORE_AGENT_VERSION_ROUTE,
chunkT32FQPWH_cjs.DELETE_AGENT_VERSION_ROUTE,
// ============================================================================
// Favorites (EE)
// ============================================================================
chunkDULEYONH_cjs.FAVORITE_STORED_AGENT_ROUTE,
chunkDULEYONH_cjs.UNFAVORITE_STORED_AGENT_ROUTE
];
// src/server/server-adapter/routes/stored-mcp-clients.ts
var STORED_MCP_CLIENTS_ROUTES = [
// Stored MCP Clients CRUD Routes
chunkUZ43QCIA_cjs.LIST_STORED_MCP_CLIENTS_ROUTE,
chunkUZ43QCIA_cjs.GET_STORED_MCP_CLIENT_ROUTE,
chunkUZ43QCIA_cjs.CREATE_STORED_MCP_CLIENT_ROUTE,
chunkUZ43QCIA_cjs.UPDATE_STORED_MCP_CLIENT_ROUTE,
chunkUZ43QCIA_cjs.DELETE_STORED_MCP_CLIENT_ROUTE,
// MCP Client Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
chunkJZJ3PP2H_cjs.LIST_MCP_CLIENT_VERSIONS_ROUTE,
chunkJZJ3PP2H_cjs.CREATE_MCP_CLIENT_VERSION_ROUTE,
chunkJZJ3PP2H_cjs.COMPARE_MCP_CLIENT_VERSIONS_ROUTE,
chunkJZJ3PP2H_cjs.GET_MCP_CLIENT_VERSION_ROUTE,
chunkJZJ3PP2H_cjs.ACTIVATE_MCP_CLIENT_VERSION_ROUTE,
chunkJZJ3PP2H_cjs.RESTORE_MCP_CLIENT_VERSION_ROUTE,
chunkJZJ3PP2H_cjs.DELETE_MCP_CLIENT_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-prompt-blocks.ts
var STORED_PROMPT_BLOCKS_ROUTES = [
// Stored Prompt Blocks CRUD Routes
chunkBTMYAVRX_cjs.LIST_STORED_PROMPT_BLOCKS_ROUTE,
chunkBTMYAVRX_cjs.GET_STORED_PROMPT_BLOCK_ROUTE,
chunkBTMYAVRX_cjs.CREATE_STORED_PROMPT_BLOCK_ROUTE,
chunkBTMYAVRX_cjs.UPDATE_STORED_PROMPT_BLOCK_ROUTE,
chunkBTMYAVRX_cjs.DELETE_STORED_PROMPT_BLOCK_ROUTE,
// Prompt Block Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
chunkRM4ITWAQ_cjs.LIST_PROMPT_BLOCK_VERSIONS_ROUTE,
chunkRM4ITWAQ_cjs.CREATE_PROMPT_BLOCK_VERSION_ROUTE,
chunkRM4ITWAQ_cjs.COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE,
chunkRM4ITWAQ_cjs.GET_PROMPT_BLOCK_VERSION_ROUTE,
chunkRM4ITWAQ_cjs.ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE,
chunkRM4ITWAQ_cjs.RESTORE_PROMPT_BLOCK_VERSION_ROUTE,
chunkRM4ITWAQ_cjs.DELETE_PROMPT_BLOCK_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-scorers.ts
var STORED_SCORERS_ROUTES = [
// Stored Scorers CRUD Routes
chunkIRJJ2JJG_cjs.LIST_STORED_SCORERS_ROUTE,
chunkIRJJ2JJG_cjs.GET_STORED_SCORER_ROUTE,
chunkIRJJ2JJG_cjs.CREATE_STORED_SCORER_ROUTE,
chunkIRJJ2JJG_cjs.UPDATE_STORED_SCORER_ROUTE,
chunkIRJJ2JJG_cjs.DELETE_STORED_SCORER_ROUTE,
// Scorer Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
chunkONBABU5V_cjs.LIST_SCORER_VERSIONS_ROUTE,
chunkONBABU5V_cjs.CREATE_SCORER_VERSION_ROUTE,
chunkONBABU5V_cjs.COMPARE_SCORER_VERSIONS_ROUTE,
chunkONBABU5V_cjs.GET_SCORER_VERSION_ROUTE,
chunkONBABU5V_cjs.ACTIVATE_SCORER_VERSION_ROUTE,
chunkONBABU5V_cjs.RESTORE_SCORER_VERSION_ROUTE,
chunkONBABU5V_cjs.DELETE_SCORER_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-skills.ts
var STORED_SKILLS_ROUTES = [
// Stored Skills CRUD Routes
chunkXOQEKMY2_cjs.LIST_STORED_SKILLS_ROUTE,
chunkXOQEKMY2_cjs.GET_STORED_SKILL_ROUTE,
chunkXOQEKMY2_cjs.CREATE_STORED_SKILL_ROUTE,
chunkXOQEKMY2_cjs.UPDATE_STORED_SKILL_ROUTE,
chunkXOQEKMY2_cjs.DELETE_STORED_SKILL_ROUTE,
// Publish
chunkXOQEKMY2_cjs.PUBLISH_STORED_SKILL_ROUTE,
// Favorites (EE)
chunkY3MYKCTO_cjs.FAVORITE_STORED_SKILL_ROUTE,
chunkY3MYKCTO_cjs.UNFAVORITE_STORED_SKILL_ROUTE
];
// src/server/server-adapter/routes/stored-workspaces.ts
var STORED_WORKSPACES_ROUTES = [
// Stored Workspaces CRUD Routes
chunkVNWPOCOT_cjs.LIST_STORED_WORKSPACES_ROUTE,
chunkVNWPOCOT_cjs.GET_STORED_WORKSPACE_ROUTE,
chunkVNWPOCOT_cjs.CREATE_STORED_WORKSPACE_ROUTE,
chunkVNWPOCOT_cjs.UPDATE_STORED_WORKSPACE_ROUTE,
chunkVNWPOCOT_cjs.DELETE_STORED_WORKSPACE_ROUTE
];
// src/server/server-adapter/routes/system.ts
var SYSTEM_ROUTES = [chunkE2EYPHRE_cjs.GET_SYSTEM_PACKAGES_ROUTE, chunkE2EYPHRE_cjs.GET_API_SCHEMA_ROUTE];
// src/server/server-adapter/routes/tool-providers.ts
var TOOL_PROVIDER_ROUTES = [
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDERS_ROUTE,
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDER_TOOLKITS_ROUTE,
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDER_TOOLS_ROUTE,
chunkOT2JWWCT_cjs.GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE,
chunkOT2JWWCT_cjs.AUTHORIZE_TOOL_PROVIDER_ROUTE,
chunkOT2JWWCT_cjs.GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE,
chunkOT2JWWCT_cjs.TOOL_PROVIDER_CONNECTION_STATUS_ROUTE,
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE,
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE,
chunkOT2JWWCT_cjs.DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE,
chunkOT2JWWCT_cjs.UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE,
chunkOT2JWWCT_cjs.GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE,
chunkOT2JWWCT_cjs.GET_TOOL_PROVIDER_HEALTH_ROUTE
];
// src/server/server-adapter/routes/tools.ts
var TOOLS_ROUTES = [chunkUITLSJUW_cjs.LIST_TOOLS_ROUTE, chunkUITLSJUW_cjs.GET_TOOL_BY_ID_ROUTE, chunkUITLSJUW_cjs.EXECUTE_TOOL_ROUTE];
// src/server/server-adapter/routes/vectors.ts
var VECTORS_ROUTES = [
chunkJGLVYJ3S_cjs.UPSERT_VECTORS_ROUTE,
chunkJGLVYJ3S_cjs.CREATE_INDEX_ROUTE,
chunkJGLVYJ3S_cjs.QUERY_VECTORS_ROUTE,
chunkJGLVYJ3S_cjs.LIST_INDEXES_ROUTE,
chunkJGLVYJ3S_cjs.DESCRIBE_INDEX_ROUTE,
chunkJGLVYJ3S_cjs.DELETE_INDEX_ROUTE,
chunkJGLVYJ3S_cjs.LIST_VECTORS_ROUTE,
chunkJGLVYJ3S_cjs.LIST_EMBEDDERS_ROUTE
];
// src/server/server-adapter/routes/workflows.ts
var WORKFLOWS_ROUTES = [
chunkU72IZ5BP_cjs.LIST_WORKFLOWS_ROUTE,
chunkU72IZ5BP_cjs.GET_WORKFLOW_BY_ID_ROUTE,
chunkU72IZ5BP_cjs.LIST_WORKFLOW_RUNS_ROUTE,
chunkU72IZ5BP_cjs.GET_WORKFLOW_RUN_BY_ID_ROUTE,
chunkU72IZ5BP_cjs.DELETE_WORKFLOW_RUN_BY_ID_ROUTE,
chunkU72IZ5BP_cjs.CREATE_WORKFLOW_RUN_ROUTE,
chunkU72IZ5BP_cjs.STREAM_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESUME_STREAM_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.START_ASYNC_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.START_WORKFLOW_RUN_ROUTE,
chunkU72IZ5BP_cjs.OBSERVE_STREAM_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESUME_ASYNC_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESUME_NO_WAIT_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESUME_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.CANCEL_WORKFLOW_RUN_ROUTE,
chunkU72IZ5BP_cjs.TIME_TRAVEL_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESTART_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESTART_ASYNC_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE,
chunkU72IZ5BP_cjs.RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE,
chunkU72IZ5BP_cjs.EXECUTE_WORKFLOW_STEP_ROUTE,
chunkU72IZ5BP_cjs.RECEIVE_WORKFLOW_EVENT_ROUTE
];
// src/server/server-adapter/routes/workspace.ts
var WORKSPACE_ROUTES = [
// List all workspaces route (at /api/workspaces)
chunkUSU23GYD_cjs.LIST_WORKSPACES_ROUTE,
// Get workspace route (at /api/workspaces/:workspaceId)
chunkUSU23GYD_cjs.GET_WORKSPACE_ROUTE,
// Filesystem routes (at /api/workspaces/:workspaceId/fs/*)
...chunkUSU23GYD_cjs.WORKSPACE_FS_ROUTES,
// Search routes (at /api/workspaces/:workspaceId/search, /api/workspaces/:workspaceId/index)
...chunkUSU23GYD_cjs.WORKSPACE_SEARCH_ROUTES,
// Skills routes (search must come before parameterized routes)
...chunkUSU23GYD_cjs.WORKSPACE_SKILLS_ROUTES,
// skills.sh proxy routes (at /api/workspaces/:workspaceId/skills-sh/*)
...chunkUSU23GYD_cjs.WORKSPACE_SKILLS_SH_ROUTES
];
// src/server/server-adapter/routes/index.ts
var SERVER_ROUTES = [
...AGENTS_ROUTES,
...chunk4ZHHKMDQ_cjs.AUTH_ROUTES,
...WORKFLOWS_ROUTES,
...TOOLS_ROUTES,
...PROCESSORS_ROUTES,
...RESPONSES_ROUTES,
...CONVERSATIONS_ROUTES,
...MEMORY_ROUTES,
...SCORES_ROUTES,
...OBSERVABILITY_ROUTES,
...LOGS_ROUTES,
...VECTORS_ROUTES,
...A2A_ROUTES,
...WORKSPACE_ROUTES,
...LEGACY_ROUTES,
...MCP_ROUTES,
...STORED_AGENTS_ROUTES,
...STORED_MCP_CLIENTS_ROUTES,
...STORED_PROMPT_BLOCKS_ROUTES,
...STORED_SCORERS_ROUTES,
...STORED_WORKSPACES_ROUTES,
...STORED_SKILLS_ROUTES,
...TOOL_PROVIDER_ROUTES,
...PROCESSOR_PROVIDER_ROUTES,
...SYSTEM_ROUTES,
...DATASETS_ROUTES,
...BACKGROUND_TASK_ROUTES,
...EDITOR_BUILDER_ROUTES,
...AGENT_BUILDER_ROUTES,
...SCHEDULES_ROUTES,
...CHANNELS_ROUTES,
...HARNESS_ROUTES
];
exports.SERVER_ROUTES = SERVER_ROUTES;
exports.deriveAction = deriveAction;
exports.derivePermission = derivePermission;
exports.extractResource = extractResource;
exports.getEffectivePermission = getEffectivePermission;
//# sourceMappingURL=chunk-2CLXY7EU.cjs.map
//# sourceMappingURL=chunk-2CLXY7EU.cjs.map

Sorry, the diff of this file is too big to display

import { storedSkillIdPathParams } from './chunk-UIRQU4GW.js';
import { favoriteToggleResponseSchema } from './chunk-SFPN7SHZ.js';
import { requireBuilderFeature } from './chunk-TPGA2ZTS.js';
import { getCallerAuthorId, assertReadAccess } from './chunk-56AYHXOU.js';
import { assertStoredResourceScope, getStoredResourceScope } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
// src/server/handlers/stored-skill-favorites.ts
async function getFavoritesContext(mastra) {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new HTTPException(500, { message: "Favorites storage domain is not available" });
}
return { skillStore, favoritesStore };
}
var FAVORITE_STORED_SKILL_ROUTE = createRoute({
method: "PUT",
path: "/stored/skills/:storedSkillId/favorite",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
responseSchema: favoriteToggleResponseSchema,
summary: "Favorite a stored skill",
description: "Marks the stored skill as favorited by the calling user. Idempotent.",
tags: ["Stored Skills"],
requiresAuth: true,
requiresPermission: "stored-skills:read",
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
await requireBuilderFeature(mastra, "favorites");
const callerId = getCallerAuthorId(requestContext);
if (!callerId) {
throw new HTTPException(401, { message: "Authentication required" });
}
const { skillStore, favoritesStore } = await getFavoritesContext(mastra);
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
const result = await favoritesStore.favorite({
userId: callerId,
entityType: "skill",
entityId: storedSkillId
});
return result;
} catch (error) {
return handleError(error, "Error favoriting stored skill");
}
}
});
var UNFAVORITE_STORED_SKILL_ROUTE = createRoute({
method: "DELETE",
path: "/stored/skills/:storedSkillId/favorite",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
responseSchema: favoriteToggleResponseSchema,
summary: "Unfavorite a stored skill",
description: "Removes the caller\u2019s favorite from the stored skill. Idempotent.",
tags: ["Stored Skills"],
requiresAuth: true,
requiresPermission: "stored-skills:read",
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
await requireBuilderFeature(mastra, "favorites");
const callerId = getCallerAuthorId(requestContext);
if (!callerId) {
throw new HTTPException(401, { message: "Authentication required" });
}
const { skillStore, favoritesStore } = await getFavoritesContext(mastra);
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
const result = await favoritesStore.unfavorite({
userId: callerId,
entityType: "skill",
entityId: storedSkillId
});
return result;
} catch (error) {
return handleError(error, "Error unfavoriting stored skill");
}
}
});
export { FAVORITE_STORED_SKILL_ROUTE, UNFAVORITE_STORED_SKILL_ROUTE };
//# sourceMappingURL=chunk-5V2QWK2S.js.map
//# sourceMappingURL=chunk-5V2QWK2S.js.map
{"version":3,"sources":["../src/server/handlers/stored-skill-favorites.ts"],"names":[],"mappings":"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","file":"chunk-5V2QWK2S.js","sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedSkillIdPathParams } from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { skillStore, favoritesStore };\n}\n\n/**\n * PUT /stored/skills/:storedSkillId/favorite\n */\nexport const FAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored skill',\n description: 'Marks the stored skill as favorited by the calling user. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the skill (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId/favorite\n */\nexport const UNFAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored skill',\n description: 'Removes the caller’s favorite from the stored skill. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored skill');\n }\n },\n});\n"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

'use strict';
var chunkS2HKHYJ3_cjs = require('./chunk-S2HKHYJ3.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
// src/server/handlers/favorites-enrichment.ts
async function prepareFavoritesEnrichment(mastra, requestContext, entityType, entityIds) {
if (!await chunkS2HKHYJ3_cjs.isBuilderFeatureEnabled(mastra, "favorites")) return null;
const userId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!userId) return null;
const storage = mastra.getStorage();
if (!storage) return null;
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) return null;
const starredIds = entityIds.length === 0 ? /* @__PURE__ */ new Set() : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });
return { userId, starredIds, favoritesStore };
}
function stripFavoriteFields(record) {
if ("isFavorited" in record || "favoriteCount" in record) {
const copy = { ...record };
delete copy.isFavorited;
delete copy.favoriteCount;
return copy;
}
return record;
}
async function enrichOrStripFavorites(mastra, requestContext, entityType, record) {
const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);
if (enrichment) {
return { ...record, isFavorited: enrichment.starredIds.has(record.id) };
}
return stripFavoriteFields(record);
}
exports.enrichOrStripFavorites = enrichOrStripFavorites;
exports.prepareFavoritesEnrichment = prepareFavoritesEnrichment;
exports.stripFavoriteFields = stripFavoriteFields;
//# sourceMappingURL=chunk-73MURMD2.cjs.map
//# sourceMappingURL=chunk-73MURMD2.cjs.map
{"version":3,"sources":["../src/server/handlers/favorites-enrichment.ts"],"names":["isBuilderFeatureEnabled","getCallerAuthorId"],"mappings":";;;;;;AAyBA,eAAsB,0BAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,SAAA,EACqC;AACrC,EAAA,IAAI,CAAE,MAAMA,yCAAA,CAAwB,MAAA,EAAQ,WAAW,GAAI,OAAO,IAAA;AAElE,EAAA,MAAM,MAAA,GAASC,oCAAkB,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AACzD,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,MAAM,UAAA,GACJ,SAAA,CAAU,MAAA,KAAW,CAAA,uBACb,GAAA,EAAY,GAChB,MAAM,cAAA,CAAe,gBAAA,CAAiB,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAA;AAC7E,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,cAAA,EAAe;AAC9C;AAMO,SAAS,oBAAsC,MAAA,EAAc;AAClE,EAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,eAAA,IAAmB,MAAA,EAAQ;AACxD,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AASA,eAAsB,sBAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,MAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,MAAM,0BAAA,CAA2B,MAAA,EAAQ,gBAAgB,UAAA,EAAY,CAAC,MAAA,CAAO,EAAE,CAAC,CAAA;AACnG,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,WAAW,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,EACxE;AACA,EAAA,OAAO,oBAAoB,MAAM,CAAA;AACnC","file":"chunk-73MURMD2.cjs","sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { FavoritesStorage, StorageFavoriteEntityType } from '@mastra/core/storage';\n\nimport { getCallerAuthorId } from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\n\n/**\n * Result of `prepareFavoritesEnrichment` — `null` when the `favorites` EE feature is off.\n * When non-null the caller may use `starredIds` to set `isFavorited` on records\n * and may pass `userId` along to storage list paths for pin-favorited-first\n * sorting (`pinFavoritedFor`).\n */\nexport type FavoritesEnrichmentContext = {\n userId: string;\n starredIds: Set<string>;\n favoritesStore: FavoritesStorage;\n} | null;\n\n/**\n * Resolve the EE feature flag plus the caller's favorited set for a list of\n * candidate entity IDs in one shot. Soft-gated: returns `null` if the feature\n * is off or there's no caller — handlers should drop `isFavorited` / `favoriteCount`\n * fields and ignore `?favoritedOnly=true` in that case.\n */\nexport async function prepareFavoritesEnrichment(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n entityIds: string[],\n): Promise<FavoritesEnrichmentContext> {\n if (!(await isBuilderFeatureEnabled(mastra, 'favorites'))) return null;\n\n const userId = getCallerAuthorId(requestContext);\n if (!userId) return null;\n\n const storage = mastra.getStorage();\n if (!storage) return null;\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) return null;\n\n const starredIds =\n entityIds.length === 0\n ? new Set<string>()\n : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });\n return { userId, starredIds, favoritesStore };\n}\n\n/**\n * Strip the favorites EE fields from a record. Used when the feature is off so\n * stale values from storage do not leak through the API.\n */\nexport function stripFavoriteFields<T extends object>(record: T): T {\n if ('isFavorited' in record || 'favoriteCount' in record) {\n const copy = { ...record } as Record<string, unknown>;\n delete copy.isFavorited;\n delete copy.favoriteCount;\n return copy as T;\n }\n return record;\n}\n\n/**\n * Convenience for single-entity handlers (GET / POST / PATCH): annotate\n * `isFavorited` from the caller's favorites set when enrichment is available,\n * otherwise strip both favorite fields. `favoriteCount` is the canonical\n * mirrored counter and is left in place so callers can render share-count UI\n * (it's identical across viewers).\n */\nexport async function enrichOrStripFavorites<T extends { id: string }>(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n record: T,\n): Promise<T> {\n const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);\n if (enrichment) {\n return { ...record, isFavorited: enrichment.starredIds.has(record.id) };\n }\n return stripFavoriteFields(record);\n}\n"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

import { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from './chunk-ZA2G7XV3.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { readFileSync } from 'fs';
var SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3e3;
async function getSourceProviderCapabilities(getCapabilities) {
let timeout;
try {
return await Promise.race([
getCapabilities(),
new Promise((_, reject) => {
timeout = setTimeout(
() => reject(new Error("Source provider capabilities timed out")),
SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS
);
})
]);
} finally {
if (timeout) clearTimeout(timeout);
}
}
async function getEditorSourceCapabilities(editor) {
const editorSource = editor.getSource?.();
if (!editorSource) return void 0;
if (editorSource === "db") {
return {
source: editorSource,
storage: "database",
canSave: true,
canOpenChangeRequest: false
};
}
const configuredProvider = editor.getSourceControlProvider?.();
if (configuredProvider) {
const provider = {
id: configuredProvider.id,
displayName: configuredProvider.displayName
};
try {
const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());
return {
source: editorSource,
storage: "source-provider",
provider,
canSave: capabilities.canWrite,
canOpenChangeRequest: capabilities.canOpenChangeRequest,
unavailableReason: capabilities.canWrite ? void 0 : capabilities.reason
};
} catch {
return {
source: editorSource,
storage: "source-provider",
provider,
canSave: false,
canOpenChangeRequest: false,
unavailableReason: "Unable to load source provider capabilities."
};
}
}
const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;
if (sourceProvider) {
return {
source: editorSource,
storage: "source-provider",
provider: {
id: sourceProvider,
displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider
},
canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== "false",
canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === "true"
};
}
const isHosted = process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;
if (isHosted) {
return {
source: editorSource,
storage: "unavailable",
canSave: false,
canOpenChangeRequest: false,
unavailableReason: "Code-source editing requires a source provider in hosted Studio."
};
}
return {
source: editorSource,
storage: "filesystem",
canSave: true,
canOpenChangeRequest: false
};
}
var GET_API_SCHEMA_ROUTE = createRoute({
method: "GET",
path: "/system/api-schema",
responseType: "json",
responseSchema: apiSchemaManifestResponseSchema,
summary: "Get API schema manifest",
description: "Returns the route-contract-derived API schema manifest for the machine-readable CLI",
tags: ["System"],
requiresAuth: true,
handler: async () => {
const { buildApiSchemaManifest } = await import('./api-schema-manifest-F6SF6FJT.js');
return buildApiSchemaManifest();
}
});
var GET_SYSTEM_PACKAGES_ROUTE = createRoute({
method: "GET",
path: "/system/packages",
responseType: "json",
responseSchema: systemPackagesResponseSchema,
summary: "Get installed Mastra packages",
description: "Returns a list of all installed Mastra packages and their versions from the project",
tags: ["System"],
requiresAuth: true,
handler: async ({ mastra }) => {
try {
const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;
let packages = [];
if (packagesFilePath) {
try {
const fileContent = readFileSync(packagesFilePath, "utf-8");
packages = JSON.parse(fileContent);
} catch {
packages = [];
}
}
const storage = mastra.getStorage();
const storageType = storage?.name;
const observabilityStorage = storage?.stores?.observability;
const observabilityStorageType = observabilityStorage?.constructor.name;
const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;
const observabilityEnabled = !!mastra.observability.getDefaultInstance();
const editor = mastra.getEditor();
const editorSource = editor?.getSource?.();
const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : void 0;
return {
packages,
isDev: process.env.MASTRA_DEV === "true",
cmsEnabled: !!editor,
editorSource,
editorSourceCapabilities,
observabilityEnabled,
storageType,
observabilityStorageType,
observabilityRuntimeStrategy
};
} catch (error) {
return handleError(error, "Error getting system packages");
}
}
});
export { GET_API_SCHEMA_ROUTE, GET_SYSTEM_PACKAGES_ROUTE };
//# sourceMappingURL=chunk-7HMXQIPK.js.map
//# sourceMappingURL=chunk-7HMXQIPK.js.map
{"version":3,"sources":["../src/server/handlers/system.ts"],"names":[],"mappings":"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","file":"chunk-7HMXQIPK.js","sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport type { MastraPackage } from '../schemas/system';\nimport { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from '../schemas/system';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\nconst SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3000;\n\nasync function getSourceProviderCapabilities(\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n getCapabilities(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error('Source provider capabilities timed out')),\n SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS,\n );\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nasync function getEditorSourceCapabilities(editor: {\n getSource?: () => 'code' | 'db' | undefined;\n getSourceControlProvider?: () =>\n | {\n id: string;\n displayName: string;\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>;\n }\n | undefined;\n}) {\n const editorSource = editor.getSource?.();\n if (!editorSource) return undefined;\n\n if (editorSource === 'db') {\n return {\n source: editorSource,\n storage: 'database' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n }\n\n const configuredProvider = editor.getSourceControlProvider?.();\n if (configuredProvider) {\n const provider = {\n id: configuredProvider.id,\n displayName: configuredProvider.displayName,\n };\n try {\n const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: capabilities.canWrite,\n canOpenChangeRequest: capabilities.canOpenChangeRequest,\n unavailableReason: capabilities.canWrite ? undefined : capabilities.reason,\n };\n } catch {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Unable to load source provider capabilities.',\n };\n }\n }\n\n const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;\n\n if (sourceProvider) {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider: {\n id: sourceProvider,\n displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider,\n },\n canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== 'false',\n canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === 'true',\n };\n }\n\n const isHosted =\n process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;\n\n if (isHosted) {\n return {\n source: editorSource,\n storage: 'unavailable' as const,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Code-source editing requires a source provider in hosted Studio.',\n };\n }\n\n return {\n source: editorSource,\n storage: 'filesystem' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n}\n\nexport const GET_API_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/system/api-schema',\n responseType: 'json',\n responseSchema: apiSchemaManifestResponseSchema,\n summary: 'Get API schema manifest',\n description: 'Returns the route-contract-derived API schema manifest for the machine-readable CLI',\n tags: ['System'],\n requiresAuth: true,\n handler: async () => {\n // Dynamic import to avoid circular dependency issues\n const { buildApiSchemaManifest } = await import('../server-adapter/api-schema-manifest');\n return buildApiSchemaManifest();\n },\n});\n\nexport const GET_SYSTEM_PACKAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/system/packages',\n responseType: 'json',\n responseSchema: systemPackagesResponseSchema,\n summary: 'Get installed Mastra packages',\n description: 'Returns a list of all installed Mastra packages and their versions from the project',\n tags: ['System'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;\n\n let packages: MastraPackage[] = [];\n\n if (packagesFilePath) {\n try {\n const fileContent = readFileSync(packagesFilePath, 'utf-8');\n packages = JSON.parse(fileContent);\n } catch {\n packages = [];\n }\n }\n\n const storage = mastra.getStorage();\n const storageType = storage?.name;\n const observabilityStorage = storage?.stores?.observability;\n const observabilityStorageType = observabilityStorage?.constructor.name;\n const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;\n const observabilityEnabled = !!mastra.observability.getDefaultInstance();\n\n const editor = mastra.getEditor();\n const editorSource = editor?.getSource?.();\n const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : undefined;\n\n return {\n packages,\n isDev: process.env.MASTRA_DEV === 'true',\n cmsEnabled: !!editor,\n editorSource,\n editorSourceCapabilities,\n observabilityEnabled,\n storageType,\n observabilityStorageType,\n observabilityRuntimeStrategy,\n };\n } catch (error) {\n return handleError(error, 'Error getting system packages');\n }\n },\n});\n"]}
import { validateMetadataAvatarUrl } from './chunk-HMJL3C3H.js';
import { stripFavoriteFields, prepareFavoritesEnrichment, enrichOrStripFavorites } from './chunk-PUW3RA3B.js';
import { isBuilderFeatureEnabled } from './chunk-TPGA2ZTS.js';
import { prepareAuthorEnrichment, attachAuthor } from './chunk-KLV64VVH.js';
import { resolveAuthorFilter, getCallerAuthorId, matchesAuthorFilter, assertReadAccess, assertWriteAccess } from './chunk-56AYHXOU.js';
import { handleAutoVersioning } from './chunk-33QPJPK4.js';
import { listStoredAgentsResponseSchema, listStoredAgentsQuerySchema, exportStoredAgentResponseSchema, exportStoredAgentBodySchema, storedAgentIdPathParams, openStoredAgentChangeRequestResponseSchema, openStoredAgentChangeRequestBodySchema, getStoredAgentResponseSchema, createStoredAgentResponseSchema, createStoredAgentBodySchema, updateStoredAgentResponseSchema, updateStoredAgentBodySchema, deleteStoredAgentResponseSchema, getStoredAgentDependentsResponseSchema, previewInstructionsResponseSchema, previewInstructionsBodySchema } from './chunk-SPVKRK56.js';
import { statusQuerySchema } from './chunk-2YY3EMMS.js';
import { getStoredResourceScope, scopeStoredResourceMetadata, assertStoredResourceScope, toSlug } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
// src/server/handlers/stored-agents.ts
async function resolveBrowserField(browser, mastra) {
if (browser === true) {
const editor = mastra.getEditor?.();
const builder = await editor?.resolveBuilder?.();
const defaultBrowser = builder?.getConfiguration?.()?.agent?.browser;
if (!defaultBrowser) {
console.warn(
"[mastra:server] Browser enabled (browser: true) but no default browser config found in builder configuration. The agent will be created/updated without browser access. Set `editor.builder.configuration.agent.browser` to fix this."
);
}
return defaultBrowser ?? void 0;
}
if (browser === false) {
return null;
}
return browser;
}
var AGENT_SNAPSHOT_CONFIG_FIELDS = [
"name",
"description",
"instructions",
"model",
"tools",
"defaultOptions",
"workflows",
"agents",
"integrationTools",
"toolProviders",
"inputProcessors",
"outputProcessors",
"memory",
"scorers",
"requestContextSchema",
"mcpClients",
"skills",
"workspace",
"browser"
];
var CODE_AGENT_OVERRIDE_FIELDS = [
"instructions",
"tools",
"integrationTools",
"mcpClients",
"requestContextSchema"
];
function getCodeAgentOwnership(editorConfig) {
if (editorConfig === false) {
return { ownsInstructions: false, ownsTools: false, ownsToolDescriptionsOnly: false };
}
if (editorConfig === void 0 || editorConfig === null) {
return { ownsInstructions: true, ownsTools: true, ownsToolDescriptionsOnly: false };
}
if (typeof editorConfig !== "object") {
return { ownsInstructions: false, ownsTools: false, ownsToolDescriptionsOnly: false };
}
const cfg = editorConfig;
const ownsInstructions = cfg.instructions === true;
const toolsCfg = cfg.tools;
const ownsTools = toolsCfg === true;
const ownsToolDescriptionsOnly = typeof toolsCfg === "object" && toolsCfg !== null && toolsCfg.description === true;
return { ownsInstructions, ownsTools, ownsToolDescriptionsOnly };
}
function hasNonEmptyInstructions(value) {
if (typeof value === "string") {
return value.trim().length > 0;
}
if (!Array.isArray(value)) {
return false;
}
return value.some((block) => {
if (!block || typeof block !== "object") {
return false;
}
const typedBlock = block;
if (typedBlock.type === "prompt_block_ref") {
return typeof typedBlock.id === "string" && typedBlock.id.length > 0;
}
return typeof typedBlock.content === "string" && typedBlock.content.trim().length > 0;
});
}
function assertOwnedInstructionsNotEmpty(instructions) {
if (!hasNonEmptyInstructions(instructions)) {
throw new HTTPException(400, { message: "Instructions are required" });
}
}
function sortForStableJson(value) {
if (Array.isArray(value)) {
return value.map(sortForStableJson);
}
if (value && typeof value === "object" && !(value instanceof Date)) {
return Object.fromEntries(
Object.entries(value).filter(([, entry]) => entry !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, sortForStableJson(entry)])
);
}
return value;
}
function buildExportConfig(input, agent) {
const editorConfig = agent?.__getEditorConfig?.();
const isCodeAgent = agent?.source === "code";
const allowedFields = isCodeAgent ? CODE_AGENT_OVERRIDE_FIELDS : AGENT_SNAPSHOT_CONFIG_FIELDS;
const ownership = isCodeAgent ? getCodeAgentOwnership(editorConfig) : null;
const config = {};
for (const field of allowedFields) {
if (input[field] === void 0) continue;
if (ownership) {
if (field === "instructions" && !ownership.ownsInstructions) continue;
if ((field === "tools" || field === "integrationTools" || field === "mcpClients") && !ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
continue;
}
}
config[field] = input[field];
}
return sortForStableJson(config);
}
function agentExportFilename(agentId) {
return `agents/${encodeURIComponent(agentId)}.json`;
}
function sourceChangeRequestHeadRef(agentId) {
const safeAgentId = agentId.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "agent";
return `mastra/${safeAgentId}`;
}
function sourceChangeRequestMessage(agentId, userName, changeMessage) {
const normalizedUserName = userName?.replace(/\s+/g, " ").trim();
const normalizedMessage = changeMessage?.replace(/\s+/g, " ").trim();
const message = normalizedMessage || `Update ${agentId} agent override`;
return normalizedUserName ? `${message} by ${normalizedUserName}` : message;
}
var LIST_STORED_AGENTS_ROUTE = createRoute({
method: "GET",
path: "/stored/agents",
responseType: "json",
queryParamSchema: listStoredAgentsQuerySchema,
responseSchema: listStoredAgentsResponseSchema,
summary: "List stored agents",
description: "Returns a paginated list of all agents stored in the database",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
page,
perPage,
orderBy,
status,
authorId,
visibility,
metadata,
favoritedOnly,
pinFavoritedFor
}) => {
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 filter = resolveAuthorFilter({
requestContext,
resource: "stored-agents",
queryAuthorId: authorId,
queryVisibility: visibility === "public" ? "public" : void 0
});
const scope = await getStoredResourceScope(mastra, requestContext);
const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);
const callerId = getCallerAuthorId(requestContext);
const favoritesEnabled = await isBuilderFeatureEnabled(mastra, "favorites");
const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;
const favoriteSubjectId = pinFavoritedFor ?? callerId;
if (honoredStarredOnly) {
const effectivePerPage = perPage ?? 100;
if (!favoriteSubjectId) {
return { agents: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new HTTPException(500, { message: "Favorites storage domain is not available" });
}
const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: "agent" });
if (starredIds.length === 0) {
return { agents: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const allMatching = await agentsStore.listResolved({
perPage: false,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata,
entityIds: starredIds
});
const visible = allMatching.agents.filter((record) => matchesAuthorFilter(record, filter));
const total = visible.length;
const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;
const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;
const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);
const annotated2 = sliced.map((record) => ({ ...record, isFavorited: true }));
const authors2 = await prepareAuthorEnrichment(
mastra,
requestContext,
annotated2.map((a) => a.authorId)
);
const withAuthors2 = authors2 ? annotated2.map((record) => attachAuthor(record, authors2)) : annotated2;
const hasMore = effectivePerPage > 0 && endIdx < total;
return { agents: withAuthors2, total, page, perPage: effectivePerPage, hasMore };
}
const result = await agentsStore.listResolved({
page,
perPage,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata
});
const visibleAgents = result.agents.filter((record) => matchesAuthorFilter(record, filter));
const authors = await prepareAuthorEnrichment(
mastra,
requestContext,
visibleAgents.map((a) => a.authorId)
);
if (!favoritesEnabled) {
const stripped = visibleAgents.map(stripFavoriteFields);
const withAuthors2 = authors ? stripped.map((record) => attachAuthor(record, authors)) : stripped;
return { ...result, agents: withAuthors2 };
}
const enrichment = await prepareFavoritesEnrichment(
mastra,
requestContext,
"agent",
visibleAgents.map((a) => a.id)
);
const annotated = enrichment ? visibleAgents.map((record) => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) })) : visibleAgents.map(stripFavoriteFields);
const withAuthors = authors ? annotated.map((record) => attachAuthor(record, authors)) : annotated;
return { ...result, agents: withAuthors };
} catch (error) {
return handleError(error, "Error listing stored agents");
}
}
});
async function buildStoredAgentExport({
mastra,
requestContext,
storedAgentId,
body
}) {
const storage = mastra.getStorage();
const agentsStore = storage ? await storage.getStore("agents") : void 0;
const storedAgent = await agentsStore?.getByIdResolved(storedAgentId, { status: "draft" });
if (storedAgent) {
assertStoredResourceScope(storedAgent, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: storedAgent });
}
let codeAgent;
try {
codeAgent = mastra.getAgentById?.(storedAgentId);
} catch {
codeAgent = void 0;
}
if (!storedAgent && !codeAgent) {
throw new HTTPException(404, { message: `Agent with id ${storedAgentId} not found` });
}
const config = buildExportConfig(body, codeAgent);
const content = `${JSON.stringify(config, null, 2)}
`;
return {
agentId: storedAgentId,
fileName: agentExportFilename(storedAgentId),
content,
config
};
}
var EXPORT_STORED_AGENT_ROUTE = createRoute({
method: "POST",
path: "/stored/agents/:storedAgentId/export",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
bodySchema: exportStoredAgentBodySchema,
responseSchema: exportStoredAgentResponseSchema,
summary: "Export stored agent override JSON",
description: "Returns deterministic JSON for an agent configuration or code-agent override without mutating storage",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, ...body }) => {
try {
return await buildStoredAgentExport({ mastra, requestContext, storedAgentId, body });
} catch (error) {
return handleError(error, "Error exporting stored agent");
}
}
});
var OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE = createRoute({
method: "POST",
path: "/stored/agents/:storedAgentId/change-request",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
bodySchema: openStoredAgentChangeRequestBodySchema,
responseSchema: openStoredAgentChangeRequestResponseSchema,
summary: "Open stored agent source change request",
description: "Opens a source-provider change request for deterministic agent override JSON without mutating storage",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, ...body }) => {
try {
const provider = mastra.getEditor?.()?.getSourceControlProvider?.();
if (!provider?.openChangeRequest) {
throw new HTTPException(400, { message: "Source control provider cannot open change requests" });
}
const openChangeRequest = provider.openChangeRequest.bind(provider);
const { changeMessage, userName, inspectOnly, ...exportBody } = body;
const headRef = sourceChangeRequestHeadRef(storedAgentId);
const title = `Update ${storedAgentId} agent override`;
const result = inspectOnly ? await openChangeRequest({
title,
headRef,
files: []
}) : await (async () => {
const response = await buildStoredAgentExport({ mastra, requestContext, storedAgentId, body: exportBody });
const message = sourceChangeRequestMessage(storedAgentId, userName, changeMessage);
return openChangeRequest({
title,
body: `Updates ${response.fileName} from Mastra Studio.`,
headRef,
files: [
{
path: response.fileName,
content: response.content,
message
}
]
});
})();
const storage = mastra.getStorage();
const agentsStore = storage ? await storage.getStore("agents") : void 0;
await agentsStore?.useProviderRef?.(storedAgentId, result.ref ?? headRef);
mastra.getEditor?.()?.agent?.clearCache?.(storedAgentId);
return result;
} catch (error) {
return handleError(error, "Error opening stored agent change request");
}
}
});
var GET_STORED_AGENT_ROUTE = createRoute({
method: "GET",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
queryParamSchema: statusQuerySchema,
responseSchema: getStoredAgentResponseSchema,
summary: "Get stored agent by ID",
description: "Returns a specific agent from storage by its unique identifier. Use ?status=draft to resolve with the latest (draft) version, or ?status=published (default) for the active published version.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, status }) => {
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.getByIdResolved(storedAgentId, { status });
if (!agent) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const authors = await prepareAuthorEnrichment(mastra, requestContext, [agent.authorId]);
const withFavorite = await enrichOrStripFavorites(mastra, requestContext, "agent", agent);
return attachAuthor(withFavorite, authors);
} catch (error) {
return handleError(error, "Error getting stored agent");
}
}
});
var CREATE_STORED_AGENT_ROUTE = createRoute({
method: "POST",
path: "/stored/agents",
responseType: "json",
bodySchema: createStoredAgentBodySchema,
responseSchema: createStoredAgentResponseSchema,
summary: "Create stored agent",
description: "Creates a new agent in storage with the provided configuration",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
id: providedId,
metadata,
visibility: bodyVisibility,
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser,
requestContextSchema
}) => {
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 id = providedId || toSlug(name);
if (!id) {
throw new HTTPException(400, {
message: "Could not derive agent ID from name. Please provide an explicit id."
});
}
const existing = await agentsStore.getById(id);
if (existing) {
throw new HTTPException(409, { message: `Agent with id ${id} already exists` });
}
const authorId = getCallerAuthorId(requestContext) ?? void 0;
const visibility = authorId ? bodyVisibility ?? "private" : "public";
validateMetadataAvatarUrl(metadata);
const resolvedBrowser = await resolveBrowserField(browser, mastra);
let createInstructions = instructions;
let createTools = tools;
let createIntegrationTools = integrationTools;
let createMcpClients = mcpClients;
let codeAgentForCreate;
try {
codeAgentForCreate = mastra.getAgentById?.(id);
} catch {
codeAgentForCreate = void 0;
}
if (codeAgentForCreate?.source === "code") {
const ownership = getCodeAgentOwnership(codeAgentForCreate.__getEditorConfig?.());
if (ownership.ownsInstructions) {
assertOwnedInstructionsNotEmpty(createInstructions);
} else {
createInstructions = void 0;
}
if (!ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
createTools = void 0;
createIntegrationTools = void 0;
createMcpClients = void 0;
}
}
const input = {
id,
authorId,
visibility,
metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),
name,
description,
instructions: createInstructions,
model,
tools: createTools,
defaultOptions,
workflows,
agents,
integrationTools: createIntegrationTools,
toolProviders,
mcpClients: createMcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
};
const editor = mastra.getEditor?.();
if (editor) {
await editor.agent.create(input);
} else {
await agentsStore.create({ agent: input });
}
const { versions } = await agentsStore.listVersions({ agentId: id, perPage: 1 });
const initialVersion = versions[0];
if (initialVersion) {
await agentsStore.update({
id,
activeVersionId: initialVersion.id,
status: "published"
});
editor?.agent.clearCache(id);
}
const resolved = await agentsStore.getByIdResolved(id, { status: "published" });
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve created agent" });
}
return enrichOrStripFavorites(mastra, requestContext, "agent", resolved);
} catch (error) {
return handleError(error, "Error creating stored agent");
}
}
});
var UPDATE_STORED_AGENT_ROUTE = createRoute({
method: "PATCH",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
bodySchema: updateStoredAgentBodySchema,
responseSchema: updateStoredAgentResponseSchema,
summary: "Update stored agent",
description: "Updates an existing agent in storage with the provided fields",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
storedAgentId,
// Metadata-level fields
authorId,
metadata,
visibility,
// Config fields (snapshot-level)
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser,
requestContextSchema,
// Version metadata
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 existing = await agentsStore.getById(storedAgentId);
if (!existing) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
const scope = await getStoredResourceScope(mastra, requestContext);
assertStoredResourceScope(existing, scope);
assertWriteAccess({
requestContext,
resource: "stored-agents",
resourceId: storedAgentId,
action: "edit",
record: existing
});
validateMetadataAvatarUrl(metadata);
const callerAuthorId = getCallerAuthorId(requestContext) ?? void 0;
const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? "public" : void 0;
const resolvedBrowser = await resolveBrowserField(browser, mastra);
let codeAgentForUpdate;
try {
codeAgentForUpdate = mastra.getAgentById?.(storedAgentId);
} catch {
codeAgentForUpdate = void 0;
}
if (codeAgentForUpdate?.source === "code") {
const ownership = getCodeAgentOwnership(codeAgentForUpdate.__getEditorConfig?.());
if (ownership.ownsInstructions) {
if (instructions !== void 0) {
assertOwnedInstructionsNotEmpty(instructions);
}
} else {
instructions = void 0;
}
if (!ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
tools = void 0;
integrationTools = void 0;
mcpClients = void 0;
}
}
const mergedMetadata = { ...existing.metadata ?? {}, ...metadata ?? {} };
const scopedMetadata = scopeStoredResourceMetadata(mergedMetadata, scope);
const updatedAgent = await agentsStore.update({
id: storedAgentId,
authorId,
metadata: scopedMetadata,
visibility: resolvedVisibility,
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
});
const configFields = {
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
};
const providedConfigFields = Object.fromEntries(Object.entries(configFields).filter(([_, v]) => v !== void 0));
const autoVersionResult = await handleAutoVersioning(
agentsStore,
storedAgentId,
"agentId",
AGENT_SNAPSHOT_CONFIG_FIELDS,
existing,
updatedAgent,
providedConfigFields,
changeMessage ? { changeMessage } : void 0
);
if (!autoVersionResult) {
throw new Error("handleAutoVersioning returned undefined");
}
const isCodeSource = mastra.getEditor?.()?.getSource?.() === "code";
if (isCodeSource && autoVersionResult.versionCreated && !changeMessage) {
const { versions } = await agentsStore.listVersions({ agentId: storedAgentId, perPage: 2 });
const previousVersion = versions[1];
if (previousVersion) {
await agentsStore.deleteVersion(previousVersion.id);
}
}
if (autoVersionResult.versionCreated) {
const { versions } = await agentsStore.listVersions({ agentId: storedAgentId, perPage: 1 });
const latestVersion = versions[0];
if (latestVersion) {
await agentsStore.update({
id: storedAgentId,
activeVersionId: latestVersion.id
});
}
}
const editor = mastra.getEditor();
if (editor) {
editor.agent.clearCache(storedAgentId);
}
const resolved = await agentsStore.getByIdResolved(storedAgentId, { status: "draft" });
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve updated agent" });
}
return enrichOrStripFavorites(mastra, requestContext, "agent", resolved);
} catch (error) {
return handleError(error, "Error updating stored agent");
}
}
});
var DELETE_STORED_AGENT_ROUTE = createRoute({
method: "DELETE",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
responseSchema: deleteStoredAgentResponseSchema,
summary: "Delete stored agent",
description: "Deletes an agent from storage by its unique identifier",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId }) => {
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 existing = await agentsStore.getById(storedAgentId);
if (!existing) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));
assertWriteAccess({
requestContext,
resource: "stored-agents",
resourceId: storedAgentId,
action: "delete",
record: existing
});
await agentsStore.delete(storedAgentId);
try {
const favoritesStore = await storage.getStore("favorites");
await favoritesStore?.deleteFavoritesForEntity({ entityType: "agent", entityId: storedAgentId });
} catch (cascadeError) {
mastra.getLogger?.()?.warn?.("Failed to cascade-delete favorites for agent", { storedAgentId, error: cascadeError });
}
mastra.getEditor()?.agent.clearCache(storedAgentId);
return { success: true, message: `Agent ${storedAgentId} deleted successfully` };
} catch (error) {
return handleError(error, "Error deleting stored agent");
}
}
});
var GET_STORED_AGENT_DEPENDENTS_ROUTE = createRoute({
method: "GET",
path: "/stored/agents/:storedAgentId/dependents",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
responseSchema: getStoredAgentDependentsResponseSchema,
summary: "List dependents of a stored agent",
description: "Returns agents that reference the target as a sub-agent. Used to warn before deleting or unsharing. Caller-readable references appear in `dependents` (id + name); cross-workspace references the caller cannot read are aggregated in `hiddenCount` and only surfaced when the target is public.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId }) => {
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 target = await agentsStore.getById(storedAgentId);
if (!target) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(target, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: target });
const filter = resolveAuthorFilter({ requestContext, resource: "stored-agents" });
const all = await agentsStore.listResolved({
perPage: false,
status: "published"
});
const targetIsPublic = target.visibility === "public";
const dependents = [];
let hiddenCount = 0;
for (const record of all.agents) {
if (record.id === storedAgentId) continue;
if (!referencesTarget(record.agents, storedAgentId)) continue;
if (matchesAuthorFilter(record, filter)) {
dependents.push({
id: record.id,
name: record.name ?? record.id
});
} else if (targetIsPublic) {
hiddenCount += 1;
}
}
return { dependents, hiddenCount };
} catch (error) {
return handleError(error, "Error listing stored agent dependents");
}
}
});
function referencesTarget(subAgents, targetId) {
if (!subAgents) return false;
if (Array.isArray(subAgents)) {
return subAgents.some((variant) => {
const value = variant?.value;
return Boolean(value && typeof value === "object" && Object.prototype.hasOwnProperty.call(value, targetId));
});
}
if (typeof subAgents === "object") {
return Object.prototype.hasOwnProperty.call(subAgents, targetId);
}
return false;
}
var PREVIEW_INSTRUCTIONS_ROUTE = createRoute({
method: "POST",
path: "/stored/agents/preview-instructions",
responseType: "json",
bodySchema: previewInstructionsBodySchema,
responseSchema: previewInstructionsResponseSchema,
summary: "Preview resolved instructions",
description: "Resolves an array of instruction blocks against a request context, evaluating rules, fetching prompt block references, and rendering template variables. Returns the final concatenated instruction string.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, blocks, context }) => {
try {
const editor = mastra.getEditor();
if (!editor) {
throw new HTTPException(500, { message: "Editor is not configured" });
}
const result = await editor.prompt.preview(blocks, context ?? {});
return { result };
} catch (error) {
return handleError(error, "Error previewing instructions");
}
}
});
export { CREATE_STORED_AGENT_ROUTE, DELETE_STORED_AGENT_ROUTE, EXPORT_STORED_AGENT_ROUTE, GET_STORED_AGENT_DEPENDENTS_ROUTE, GET_STORED_AGENT_ROUTE, LIST_STORED_AGENTS_ROUTE, OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE, PREVIEW_INSTRUCTIONS_ROUTE, UPDATE_STORED_AGENT_ROUTE };
//# sourceMappingURL=chunk-C4U5EL4H.js.map
//# sourceMappingURL=chunk-C4U5EL4H.js.map

Sorry, the diff of this file is too big to display

'use strict';
var chunkHTBC6CVX_cjs = require('./chunk-HTBC6CVX.cjs');
var chunkF3HP5HM6_cjs = require('./chunk-F3HP5HM6.cjs');
var chunkYLWKZ3VK_cjs = require('./chunk-YLWKZ3VK.cjs');
var chunk7DKSWNOM_cjs = require('./chunk-7DKSWNOM.cjs');
var chunkRVD3DGBZ_cjs = require('./chunk-RVD3DGBZ.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
var crypto = require('crypto');
// src/server/handlers/conversations.ts
var conversations_exports = {};
chunkO7I5CWRX_cjs.__export(conversations_exports, {
CREATE_CONVERSATION_ROUTE: () => CREATE_CONVERSATION_ROUTE,
DELETE_CONVERSATION_ROUTE: () => DELETE_CONVERSATION_ROUTE,
GET_CONVERSATION_ITEMS_ROUTE: () => GET_CONVERSATION_ITEMS_ROUTE,
GET_CONVERSATION_ROUTE: () => GET_CONVERSATION_ROUTE
});
function buildConversationObject({ thread }) {
return {
id: thread.id,
object: "conversation",
thread
};
}
function buildConversationItemsList(items) {
return {
object: "list",
data: items,
first_id: items[0]?.id ?? null,
last_id: items.at(-1)?.id ?? null,
has_more: false
};
}
function buildConversationDeleted(conversationId) {
return {
id: conversationId,
object: "conversation.deleted",
deleted: true
};
}
var CREATE_CONVERSATION_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/v1/conversations",
responseType: "json",
bodySchema: chunkHTBC6CVX_cjs.createConversationBodySchema,
responseSchema: chunkHTBC6CVX_cjs.conversationObjectSchema,
summary: "Create a conversation",
description: "Creates a new thread-backed conversation for agent-backed Responses API requests",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_CREATE,
handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {
try {
if (!mastra) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Mastra instance is required for conversations" });
}
const agent = await chunk7DKSWNOM_cjs.getAgentFromSystem({ mastra, agentId: agent_id });
const memory = await agent.getMemory({ requestContext });
if (!memory) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Agent "${agent.id}" does not have memory configured` });
}
if (!await chunkYLWKZ3VK_cjs.getAgentMemoryStore({ agent, requestContext })) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Memory storage is not configured for agent "${agent.id}"` });
}
const threadId = conversation_id ?? crypto.randomUUID();
const resourceId = chunkRVD3DGBZ_cjs.getEffectiveResourceId(requestContext, resource_id) ?? threadId;
const thread = await memory.createThread({
threadId,
resourceId,
title,
metadata
});
return buildConversationObject({ thread });
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error creating conversation");
}
}
});
var GET_CONVERSATION_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/v1/conversations/:conversationId",
responseType: "json",
pathParamSchema: chunkHTBC6CVX_cjs.conversationIdPathParams,
responseSchema: chunkHTBC6CVX_cjs.conversationObjectSchema,
summary: "Retrieve a conversation",
description: "Returns a conversation object backed by a Mastra memory thread",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await chunkYLWKZ3VK_cjs.findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
return buildConversationObject({ thread: match.thread });
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error retrieving conversation");
}
}
});
var GET_CONVERSATION_ITEMS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/v1/conversations/:conversationId/items",
responseType: "json",
pathParamSchema: chunkHTBC6CVX_cjs.conversationIdPathParams,
responseSchema: chunkHTBC6CVX_cjs.conversationItemsListSchema,
summary: "List conversation items",
description: "Returns OpenAI-style conversation items derived from the stored thread messages",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await chunkYLWKZ3VK_cjs.findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
const { messages } = await match.memoryStore.listMessages({
threadId: conversationId,
page: 0,
perPage: 1e3
});
return buildConversationItemsList(chunkF3HP5HM6_cjs.mapMastraMessagesToConversationItems(messages));
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error retrieving conversation");
}
}
});
var DELETE_CONVERSATION_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/v1/conversations/:conversationId",
responseType: "json",
pathParamSchema: chunkHTBC6CVX_cjs.conversationIdPathParams,
responseSchema: chunkHTBC6CVX_cjs.conversationDeletedSchema,
summary: "Delete a conversation",
description: "Deletes a thread-backed conversation and its stored items",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_DELETE,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await chunkYLWKZ3VK_cjs.findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
await match.memoryStore.deleteThread({ threadId: conversationId });
return buildConversationDeleted(conversationId);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error deleting conversation");
}
}
});
exports.CREATE_CONVERSATION_ROUTE = CREATE_CONVERSATION_ROUTE;
exports.DELETE_CONVERSATION_ROUTE = DELETE_CONVERSATION_ROUTE;
exports.GET_CONVERSATION_ITEMS_ROUTE = GET_CONVERSATION_ITEMS_ROUTE;
exports.GET_CONVERSATION_ROUTE = GET_CONVERSATION_ROUTE;
exports.conversations_exports = conversations_exports;
//# sourceMappingURL=chunk-DEK4ZGUR.cjs.map
//# sourceMappingURL=chunk-DEK4ZGUR.cjs.map
{"version":3,"sources":["../src/server/handlers/conversations.ts"],"names":["__export","createRoute","createConversationBodySchema","conversationObjectSchema","MastraFGAPermissions","HTTPException","getAgentFromSystem","getAgentMemoryStore","randomUUID","getEffectiveResourceId","handleError","conversationIdPathParams","findConversationThreadAcrossAgents","conversationItemsListSchema","mapMastraMessagesToConversationItems","conversationDeletedSchema"],"mappings":"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","file":"chunk-DEK4ZGUR.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n conversationDeletedSchema,\n conversationIdPathParams,\n conversationItemsListSchema,\n conversationObjectSchema,\n createConversationBodySchema,\n} from '../schemas/conversations';\nimport type { ConversationDeleted, ConversationItemsList, ConversationObject } from '../schemas/conversations';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { mapMastraMessagesToConversationItems } from './responses.adapter';\nimport { findConversationThreadAcrossAgents, getAgentMemoryStore } from './responses.storage';\nimport { getEffectiveResourceId } from './utils';\n\nfunction buildConversationObject({ thread }: { thread: ConversationObject['thread'] }): ConversationObject {\n return {\n id: thread.id,\n object: 'conversation',\n thread,\n };\n}\n\nfunction buildConversationItemsList(items: ConversationItemsList['data']): ConversationItemsList {\n return {\n object: 'list',\n data: items,\n first_id: items[0]?.id ?? null,\n last_id: items.at(-1)?.id ?? null,\n has_more: false,\n };\n}\n\nfunction buildConversationDeleted(conversationId: string): ConversationDeleted {\n return {\n id: conversationId,\n object: 'conversation.deleted',\n deleted: true,\n };\n}\n\nexport const CREATE_CONVERSATION_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/conversations',\n responseType: 'json',\n bodySchema: createConversationBodySchema,\n responseSchema: conversationObjectSchema,\n summary: 'Create a conversation',\n description: 'Creates a new thread-backed conversation for agent-backed Responses API requests',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_CREATE,\n handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {\n try {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for conversations' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId: agent_id });\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new HTTPException(400, { message: `Agent \"${agent.id}\" does not have memory configured` });\n }\n if (!(await getAgentMemoryStore({ agent, requestContext }))) {\n throw new HTTPException(400, { message: `Memory storage is not configured for agent \"${agent.id}\"` });\n }\n\n const threadId = conversation_id ?? randomUUID();\n const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;\n const thread = await memory.createThread({\n threadId,\n resourceId,\n title,\n metadata,\n });\n\n return buildConversationObject({ thread });\n } catch (error) {\n return handleError(error, 'Error creating conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationObjectSchema,\n summary: 'Retrieve a conversation',\n description: 'Returns a conversation object backed by a Mastra memory thread',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n return buildConversationObject({ thread: match.thread });\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId/items',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationItemsListSchema,\n summary: 'List conversation items',\n description: 'Returns OpenAI-style conversation items derived from the stored thread messages',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n const { messages } = await match.memoryStore.listMessages({\n threadId: conversationId,\n page: 0,\n perPage: 1000,\n });\n\n return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const DELETE_CONVERSATION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationDeletedSchema,\n summary: 'Delete a conversation',\n description: 'Deletes a thread-backed conversation and its stored items',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await match.memoryStore.deleteThread({ threadId: conversationId });\n\n return buildConversationDeleted(conversationId);\n } catch (error) {\n return handleError(error, 'Error deleting conversation');\n }\n },\n});\n"]}
'use strict';
var chunkO4O2EJF7_cjs = require('./chunk-O4O2EJF7.cjs');
var chunkS2HKHYJ3_cjs = require('./chunk-S2HKHYJ3.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
var chunkTIWGWGIO_cjs = require('./chunk-TIWGWGIO.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
// src/server/handlers/stored-agent-favorites.ts
async function getFavoritesContext(mastra) {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentStore = await storage.getStore("agents");
if (!agentStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Favorites storage domain is not available" });
}
return { agentStore, favoritesStore };
}
var FAVORITE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "PUT",
path: "/stored/agents/:storedAgentId/favorite",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
responseSchema: chunkO4O2EJF7_cjs.favoriteToggleResponseSchema,
summary: "Favorite a stored agent",
description: "Marks the stored agent as favorited by the calling user. Idempotent.",
tags: ["Stored Agents"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
await chunkS2HKHYJ3_cjs.requireBuilderFeature(mastra, "favorites");
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!callerId) {
throw new chunk64ITUOXI_cjs.HTTPException(401, { message: "Authentication required" });
}
const { agentStore, favoritesStore } = await getFavoritesContext(mastra);
const agent = await agentStore.getById(storedAgentId);
if (!agent) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(agent, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const result = await favoritesStore.favorite({
userId: callerId,
entityType: "agent",
entityId: storedAgentId
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error favoriting stored agent");
}
}
});
var UNFAVORITE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/stored/agents/:storedAgentId/favorite",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
responseSchema: chunkO4O2EJF7_cjs.favoriteToggleResponseSchema,
summary: "Unfavorite a stored agent",
description: "Removes the caller\u2019s favorite from the stored agent. Idempotent.",
tags: ["Stored Agents"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
await chunkS2HKHYJ3_cjs.requireBuilderFeature(mastra, "favorites");
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!callerId) {
throw new chunk64ITUOXI_cjs.HTTPException(401, { message: "Authentication required" });
}
const { agentStore, favoritesStore } = await getFavoritesContext(mastra);
const agent = await agentStore.getById(storedAgentId);
if (!agent) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(agent, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const result = await favoritesStore.unfavorite({
userId: callerId,
entityType: "agent",
entityId: storedAgentId
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error unfavoriting stored agent");
}
}
});
exports.FAVORITE_STORED_AGENT_ROUTE = FAVORITE_STORED_AGENT_ROUTE;
exports.UNFAVORITE_STORED_AGENT_ROUTE = UNFAVORITE_STORED_AGENT_ROUTE;
//# sourceMappingURL=chunk-DULEYONH.cjs.map
//# sourceMappingURL=chunk-DULEYONH.cjs.map
{"version":3,"sources":["../src/server/handlers/stored-agent-favorites.ts"],"names":["HTTPException","createRoute","storedAgentIdPathParams","favoriteToggleResponseSchema","requireBuilderFeature","getCallerAuthorId","assertStoredResourceScope","getStoredResourceScope","assertReadAccess","handleError"],"mappings":"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","file":"chunk-DULEYONH.cjs","sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedAgentIdPathParams } from '../schemas/stored-agents';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const agentStore = await storage.getStore('agents');\n if (!agentStore) {\n throw new HTTPException(500, { message: 'Agents storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { agentStore, favoritesStore };\n}\n\n/**\n * PUT /stored/agents/:storedAgentId/favorite\n */\nexport const FAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored agent',\n description: 'Marks the stored agent as favorited by the calling user. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the agent (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored agent');\n }\n },\n});\n\n/**\n * DELETE /stored/agents/:storedAgentId/favorite\n */\nexport const UNFAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored agent',\n description: 'Removes the caller’s favorite from the stored agent. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored agent');\n }\n },\n});\n"]}
'use strict';
var chunkAKJAQVZ3_cjs = require('./chunk-AKJAQVZ3.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var fs = require('fs');
var SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3e3;
async function getSourceProviderCapabilities(getCapabilities) {
let timeout;
try {
return await Promise.race([
getCapabilities(),
new Promise((_, reject) => {
timeout = setTimeout(
() => reject(new Error("Source provider capabilities timed out")),
SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS
);
})
]);
} finally {
if (timeout) clearTimeout(timeout);
}
}
async function getEditorSourceCapabilities(editor) {
const editorSource = editor.getSource?.();
if (!editorSource) return void 0;
if (editorSource === "db") {
return {
source: editorSource,
storage: "database",
canSave: true,
canOpenChangeRequest: false
};
}
const configuredProvider = editor.getSourceControlProvider?.();
if (configuredProvider) {
const provider = {
id: configuredProvider.id,
displayName: configuredProvider.displayName
};
try {
const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());
return {
source: editorSource,
storage: "source-provider",
provider,
canSave: capabilities.canWrite,
canOpenChangeRequest: capabilities.canOpenChangeRequest,
unavailableReason: capabilities.canWrite ? void 0 : capabilities.reason
};
} catch {
return {
source: editorSource,
storage: "source-provider",
provider,
canSave: false,
canOpenChangeRequest: false,
unavailableReason: "Unable to load source provider capabilities."
};
}
}
const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;
if (sourceProvider) {
return {
source: editorSource,
storage: "source-provider",
provider: {
id: sourceProvider,
displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider
},
canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== "false",
canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === "true"
};
}
const isHosted = process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;
if (isHosted) {
return {
source: editorSource,
storage: "unavailable",
canSave: false,
canOpenChangeRequest: false,
unavailableReason: "Code-source editing requires a source provider in hosted Studio."
};
}
return {
source: editorSource,
storage: "filesystem",
canSave: true,
canOpenChangeRequest: false
};
}
var GET_API_SCHEMA_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/system/api-schema",
responseType: "json",
responseSchema: chunkAKJAQVZ3_cjs.apiSchemaManifestResponseSchema,
summary: "Get API schema manifest",
description: "Returns the route-contract-derived API schema manifest for the machine-readable CLI",
tags: ["System"],
requiresAuth: true,
handler: async () => {
const { buildApiSchemaManifest } = await import('./api-schema-manifest-PVHR2FGG.cjs');
return buildApiSchemaManifest();
}
});
var GET_SYSTEM_PACKAGES_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/system/packages",
responseType: "json",
responseSchema: chunkAKJAQVZ3_cjs.systemPackagesResponseSchema,
summary: "Get installed Mastra packages",
description: "Returns a list of all installed Mastra packages and their versions from the project",
tags: ["System"],
requiresAuth: true,
handler: async ({ mastra }) => {
try {
const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;
let packages = [];
if (packagesFilePath) {
try {
const fileContent = fs.readFileSync(packagesFilePath, "utf-8");
packages = JSON.parse(fileContent);
} catch {
packages = [];
}
}
const storage = mastra.getStorage();
const storageType = storage?.name;
const observabilityStorage = storage?.stores?.observability;
const observabilityStorageType = observabilityStorage?.constructor.name;
const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;
const observabilityEnabled = !!mastra.observability.getDefaultInstance();
const editor = mastra.getEditor();
const editorSource = editor?.getSource?.();
const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : void 0;
return {
packages,
isDev: process.env.MASTRA_DEV === "true",
cmsEnabled: !!editor,
editorSource,
editorSourceCapabilities,
observabilityEnabled,
storageType,
observabilityStorageType,
observabilityRuntimeStrategy
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting system packages");
}
}
});
exports.GET_API_SCHEMA_ROUTE = GET_API_SCHEMA_ROUTE;
exports.GET_SYSTEM_PACKAGES_ROUTE = GET_SYSTEM_PACKAGES_ROUTE;
//# sourceMappingURL=chunk-E2EYPHRE.cjs.map
//# sourceMappingURL=chunk-E2EYPHRE.cjs.map
{"version":3,"sources":["../src/server/handlers/system.ts"],"names":["createRoute","apiSchemaManifestResponseSchema","systemPackagesResponseSchema","readFileSync","handleError"],"mappings":"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","file":"chunk-E2EYPHRE.cjs","sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport type { MastraPackage } from '../schemas/system';\nimport { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from '../schemas/system';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\nconst SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3000;\n\nasync function getSourceProviderCapabilities(\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n getCapabilities(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error('Source provider capabilities timed out')),\n SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS,\n );\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nasync function getEditorSourceCapabilities(editor: {\n getSource?: () => 'code' | 'db' | undefined;\n getSourceControlProvider?: () =>\n | {\n id: string;\n displayName: string;\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>;\n }\n | undefined;\n}) {\n const editorSource = editor.getSource?.();\n if (!editorSource) return undefined;\n\n if (editorSource === 'db') {\n return {\n source: editorSource,\n storage: 'database' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n }\n\n const configuredProvider = editor.getSourceControlProvider?.();\n if (configuredProvider) {\n const provider = {\n id: configuredProvider.id,\n displayName: configuredProvider.displayName,\n };\n try {\n const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: capabilities.canWrite,\n canOpenChangeRequest: capabilities.canOpenChangeRequest,\n unavailableReason: capabilities.canWrite ? undefined : capabilities.reason,\n };\n } catch {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Unable to load source provider capabilities.',\n };\n }\n }\n\n const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;\n\n if (sourceProvider) {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider: {\n id: sourceProvider,\n displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider,\n },\n canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== 'false',\n canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === 'true',\n };\n }\n\n const isHosted =\n process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;\n\n if (isHosted) {\n return {\n source: editorSource,\n storage: 'unavailable' as const,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Code-source editing requires a source provider in hosted Studio.',\n };\n }\n\n return {\n source: editorSource,\n storage: 'filesystem' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n}\n\nexport const GET_API_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/system/api-schema',\n responseType: 'json',\n responseSchema: apiSchemaManifestResponseSchema,\n summary: 'Get API schema manifest',\n description: 'Returns the route-contract-derived API schema manifest for the machine-readable CLI',\n tags: ['System'],\n requiresAuth: true,\n handler: async () => {\n // Dynamic import to avoid circular dependency issues\n const { buildApiSchemaManifest } = await import('../server-adapter/api-schema-manifest');\n return buildApiSchemaManifest();\n },\n});\n\nexport const GET_SYSTEM_PACKAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/system/packages',\n responseType: 'json',\n responseSchema: systemPackagesResponseSchema,\n summary: 'Get installed Mastra packages',\n description: 'Returns a list of all installed Mastra packages and their versions from the project',\n tags: ['System'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;\n\n let packages: MastraPackage[] = [];\n\n if (packagesFilePath) {\n try {\n const fileContent = readFileSync(packagesFilePath, 'utf-8');\n packages = JSON.parse(fileContent);\n } catch {\n packages = [];\n }\n }\n\n const storage = mastra.getStorage();\n const storageType = storage?.name;\n const observabilityStorage = storage?.stores?.observability;\n const observabilityStorageType = observabilityStorage?.constructor.name;\n const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;\n const observabilityEnabled = !!mastra.observability.getDefaultInstance();\n\n const editor = mastra.getEditor();\n const editorSource = editor?.getSource?.();\n const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : undefined;\n\n return {\n packages,\n isDev: process.env.MASTRA_DEV === 'true',\n cmsEnabled: !!editor,\n editorSource,\n editorSourceCapabilities,\n observabilityEnabled,\n storageType,\n observabilityStorageType,\n observabilityRuntimeStrategy,\n };\n } catch (error) {\n return handleError(error, 'Error getting system packages');\n }\n },\n});\n"]}
import { conversationObjectSchema, createConversationBodySchema, conversationIdPathParams, conversationItemsListSchema, conversationDeletedSchema } from './chunk-WOE6XG6B.js';
import { mapMastraMessagesToConversationItems } from './chunk-TLLV2JP5.js';
import { getAgentMemoryStore, findConversationThreadAcrossAgents } from './chunk-RY5RETAD.js';
import { getAgentFromSystem } from './chunk-WKSF3TVK.js';
import { MastraFGAPermissions, getEffectiveResourceId } from './chunk-3ENQND57.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { __export } from './chunk-PR4QN5HX.js';
import { randomUUID } from 'crypto';
// src/server/handlers/conversations.ts
var conversations_exports = {};
__export(conversations_exports, {
CREATE_CONVERSATION_ROUTE: () => CREATE_CONVERSATION_ROUTE,
DELETE_CONVERSATION_ROUTE: () => DELETE_CONVERSATION_ROUTE,
GET_CONVERSATION_ITEMS_ROUTE: () => GET_CONVERSATION_ITEMS_ROUTE,
GET_CONVERSATION_ROUTE: () => GET_CONVERSATION_ROUTE
});
function buildConversationObject({ thread }) {
return {
id: thread.id,
object: "conversation",
thread
};
}
function buildConversationItemsList(items) {
return {
object: "list",
data: items,
first_id: items[0]?.id ?? null,
last_id: items.at(-1)?.id ?? null,
has_more: false
};
}
function buildConversationDeleted(conversationId) {
return {
id: conversationId,
object: "conversation.deleted",
deleted: true
};
}
var CREATE_CONVERSATION_ROUTE = createRoute({
method: "POST",
path: "/v1/conversations",
responseType: "json",
bodySchema: createConversationBodySchema,
responseSchema: conversationObjectSchema,
summary: "Create a conversation",
description: "Creates a new thread-backed conversation for agent-backed Responses API requests",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_CREATE,
handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {
try {
if (!mastra) {
throw new HTTPException(500, { message: "Mastra instance is required for conversations" });
}
const agent = await getAgentFromSystem({ mastra, agentId: agent_id });
const memory = await agent.getMemory({ requestContext });
if (!memory) {
throw new HTTPException(400, { message: `Agent "${agent.id}" does not have memory configured` });
}
if (!await getAgentMemoryStore({ agent, requestContext })) {
throw new HTTPException(400, { message: `Memory storage is not configured for agent "${agent.id}"` });
}
const threadId = conversation_id ?? randomUUID();
const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;
const thread = await memory.createThread({
threadId,
resourceId,
title,
metadata
});
return buildConversationObject({ thread });
} catch (error) {
return handleError(error, "Error creating conversation");
}
}
});
var GET_CONVERSATION_ROUTE = createRoute({
method: "GET",
path: "/v1/conversations/:conversationId",
responseType: "json",
pathParamSchema: conversationIdPathParams,
responseSchema: conversationObjectSchema,
summary: "Retrieve a conversation",
description: "Returns a conversation object backed by a Mastra memory thread",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
return buildConversationObject({ thread: match.thread });
} catch (error) {
return handleError(error, "Error retrieving conversation");
}
}
});
var GET_CONVERSATION_ITEMS_ROUTE = createRoute({
method: "GET",
path: "/v1/conversations/:conversationId/items",
responseType: "json",
pathParamSchema: conversationIdPathParams,
responseSchema: conversationItemsListSchema,
summary: "List conversation items",
description: "Returns OpenAI-style conversation items derived from the stored thread messages",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
const { messages } = await match.memoryStore.listMessages({
threadId: conversationId,
page: 0,
perPage: 1e3
});
return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));
} catch (error) {
return handleError(error, "Error retrieving conversation");
}
}
});
var DELETE_CONVERSATION_ROUTE = createRoute({
method: "DELETE",
path: "/v1/conversations/:conversationId",
responseType: "json",
pathParamSchema: conversationIdPathParams,
responseSchema: conversationDeletedSchema,
summary: "Delete a conversation",
description: "Deletes a thread-backed conversation and its stored items",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_DELETE,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
await match.memoryStore.deleteThread({ threadId: conversationId });
return buildConversationDeleted(conversationId);
} catch (error) {
return handleError(error, "Error deleting conversation");
}
}
});
export { CREATE_CONVERSATION_ROUTE, DELETE_CONVERSATION_ROUTE, GET_CONVERSATION_ITEMS_ROUTE, GET_CONVERSATION_ROUTE, conversations_exports };
//# sourceMappingURL=chunk-E345K7K7.js.map
//# sourceMappingURL=chunk-E345K7K7.js.map
{"version":3,"sources":["../src/server/handlers/conversations.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,IAAA,qBAAA,GAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,4BAAA,EAAA,MAAA,4BAAA;AAAA,EAAA,sBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAkBA,SAAS,uBAAA,CAAwB,EAAE,MAAA,EAAO,EAAiE;AACzG,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,EAAA;AAAA,IACX,MAAA,EAAQ,cAAA;AAAA,IACR;AAAA,GACF;AACF;AAEA,SAAS,2BAA2B,KAAA,EAA6D;AAC/F,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,KAAA,CAAM,CAAC,CAAA,EAAG,EAAA,IAAM,IAAA;AAAA,IAC1B,OAAA,EAAS,KAAA,CAAM,EAAA,CAAG,EAAE,GAAG,EAAA,IAAM,IAAA;AAAA,IAC7B,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,yBAAyB,cAAA,EAA6C;AAC7E,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAA;AAAA,IACJ,MAAA,EAAQ,sBAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AACF;AAEO,IAAM,4BAA4B,WAAA,CAAY;AAAA,EACnD,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,mBAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,UAAA,EAAY,4BAAA;AAAA,EACZ,cAAA,EAAgB,wBAAA;AAAA,EAChB,OAAA,EAAS,uBAAA;AAAA,EACT,WAAA,EAAa,kFAAA;AAAA,EACb,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,EAClB,YAAA,EAAc,IAAA;AAAA,EACd,oBAAoB,oBAAA,CAAqB,aAAA;AAAA,EACzC,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,UAAU,eAAA,EAAiB,WAAA,EAAa,KAAA,EAAO,QAAA,EAAS,KAAM;AACtG,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,iDAAiD,CAAA;AAAA,MAC3F;AAEA,MAAA,MAAM,QAAQ,MAAM,kBAAA,CAAmB,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAA;AACpE,MAAA,MAAM,SAAS,MAAM,KAAA,CAAM,SAAA,CAAU,EAAE,gBAAgB,CAAA;AACvD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,cAAc,GAAA,EAAK,EAAE,SAAS,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,iCAAA,CAAA,EAAqC,CAAA;AAAA,MACjG;AACA,MAAA,IAAI,CAAE,MAAM,mBAAA,CAAoB,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA,EAAI;AAC3D,QAAA,MAAM,IAAI,cAAc,GAAA,EAAK,EAAE,SAAS,CAAA,4CAAA,EAA+C,KAAA,CAAM,EAAE,CAAA,CAAA,CAAA,EAAK,CAAA;AAAA,MACtG;AAEA,MAAA,MAAM,QAAA,GAAW,mBAAmB,UAAA,EAAW;AAC/C,MAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,cAAA,EAAgB,WAAW,CAAA,IAAK,QAAA;AAC1E,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,QACvC,QAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO,uBAAA,CAAwB,EAAE,MAAA,EAAQ,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,6BAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,yBAAyB,WAAA,CAAY;AAAA,EAChD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,mCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,wBAAA;AAAA,EACjB,cAAA,EAAgB,wBAAA;AAAA,EAChB,OAAA,EAAS,yBAAA;AAAA,EACT,WAAA,EAAa,gEAAA;AAAA,EACb,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,EAClB,YAAA,EAAc,IAAA;AAAA,EACd,oBAAoB,oBAAA,CAAqB,WAAA;AAAA,EACzC,SAAS,OAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,gBAAe,KAAM;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,kCAAA,CAAmC,EAAE,MAAA,EAAQ,cAAA,EAAgB,gBAAgB,CAAA;AACjG,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,cAAc,GAAA,EAAK,EAAE,SAAS,CAAA,aAAA,EAAgB,cAAc,kBAAkB,CAAA;AAAA,MAC1F;AAEA,MAAA,OAAO,uBAAA,CAAwB,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAAA,IACzD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,+BAA+B,CAAA;AAAA,IAC3D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,+BAA+B,WAAA,CAAY;AAAA,EACtD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,yCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,wBAAA;AAAA,EACjB,cAAA,EAAgB,2BAAA;AAAA,EAChB,OAAA,EAAS,yBAAA;AAAA,EACT,WAAA,EAAa,iFAAA;AAAA,EACb,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,EAClB,YAAA,EAAc,IAAA;AAAA,EACd,oBAAoB,oBAAA,CAAqB,WAAA;AAAA,EACzC,SAAS,OAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,gBAAe,KAAM;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,kCAAA,CAAmC,EAAE,MAAA,EAAQ,cAAA,EAAgB,gBAAgB,CAAA;AACjG,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,cAAc,GAAA,EAAK,EAAE,SAAS,CAAA,aAAA,EAAgB,cAAc,kBAAkB,CAAA;AAAA,MAC1F;AAEA,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,KAAA,CAAM,YAAY,YAAA,CAAa;AAAA,QACxD,QAAA,EAAU,cAAA;AAAA,QACV,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,OAAO,0BAAA,CAA2B,oCAAA,CAAqC,QAAQ,CAAC,CAAA;AAAA,IAClF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,+BAA+B,CAAA;AAAA,IAC3D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,4BAA4B,WAAA,CAAY;AAAA,EACnD,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,mCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,wBAAA;AAAA,EACjB,cAAA,EAAgB,yBAAA;AAAA,EAChB,OAAA,EAAS,uBAAA;AAAA,EACT,WAAA,EAAa,2DAAA;AAAA,EACb,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,EAClB,YAAA,EAAc,IAAA;AAAA,EACd,oBAAoB,oBAAA,CAAqB,aAAA;AAAA,EACzC,SAAS,OAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,gBAAe,KAAM;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,kCAAA,CAAmC,EAAE,MAAA,EAAQ,cAAA,EAAgB,gBAAgB,CAAA;AACjG,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,cAAc,GAAA,EAAK,EAAE,SAAS,CAAA,aAAA,EAAgB,cAAc,kBAAkB,CAAA;AAAA,MAC1F;AAEA,MAAA,MAAM,MAAM,WAAA,CAAY,YAAA,CAAa,EAAE,QAAA,EAAU,gBAAgB,CAAA;AAEjE,MAAA,OAAO,yBAAyB,cAAc,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,6BAA6B,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAC","file":"chunk-E345K7K7.js","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n conversationDeletedSchema,\n conversationIdPathParams,\n conversationItemsListSchema,\n conversationObjectSchema,\n createConversationBodySchema,\n} from '../schemas/conversations';\nimport type { ConversationDeleted, ConversationItemsList, ConversationObject } from '../schemas/conversations';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { mapMastraMessagesToConversationItems } from './responses.adapter';\nimport { findConversationThreadAcrossAgents, getAgentMemoryStore } from './responses.storage';\nimport { getEffectiveResourceId } from './utils';\n\nfunction buildConversationObject({ thread }: { thread: ConversationObject['thread'] }): ConversationObject {\n return {\n id: thread.id,\n object: 'conversation',\n thread,\n };\n}\n\nfunction buildConversationItemsList(items: ConversationItemsList['data']): ConversationItemsList {\n return {\n object: 'list',\n data: items,\n first_id: items[0]?.id ?? null,\n last_id: items.at(-1)?.id ?? null,\n has_more: false,\n };\n}\n\nfunction buildConversationDeleted(conversationId: string): ConversationDeleted {\n return {\n id: conversationId,\n object: 'conversation.deleted',\n deleted: true,\n };\n}\n\nexport const CREATE_CONVERSATION_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/conversations',\n responseType: 'json',\n bodySchema: createConversationBodySchema,\n responseSchema: conversationObjectSchema,\n summary: 'Create a conversation',\n description: 'Creates a new thread-backed conversation for agent-backed Responses API requests',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_CREATE,\n handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {\n try {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for conversations' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId: agent_id });\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new HTTPException(400, { message: `Agent \"${agent.id}\" does not have memory configured` });\n }\n if (!(await getAgentMemoryStore({ agent, requestContext }))) {\n throw new HTTPException(400, { message: `Memory storage is not configured for agent \"${agent.id}\"` });\n }\n\n const threadId = conversation_id ?? randomUUID();\n const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;\n const thread = await memory.createThread({\n threadId,\n resourceId,\n title,\n metadata,\n });\n\n return buildConversationObject({ thread });\n } catch (error) {\n return handleError(error, 'Error creating conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationObjectSchema,\n summary: 'Retrieve a conversation',\n description: 'Returns a conversation object backed by a Mastra memory thread',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n return buildConversationObject({ thread: match.thread });\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId/items',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationItemsListSchema,\n summary: 'List conversation items',\n description: 'Returns OpenAI-style conversation items derived from the stored thread messages',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n const { messages } = await match.memoryStore.listMessages({\n threadId: conversationId,\n page: 0,\n perPage: 1000,\n });\n\n return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const DELETE_CONVERSATION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationDeletedSchema,\n summary: 'Delete a conversation',\n description: 'Deletes a thread-backed conversation and its stored items',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await match.memoryStore.deleteThread({ threadId: conversationId });\n\n return buildConversationDeleted(conversationId);\n } catch (error) {\n return handleError(error, 'Error deleting conversation');\n }\n },\n});\n"]}
import { getAgentFromSystem } from './chunk-WKSF3TVK.js';
import { listToolsResponseSchema, serializedToolSchema, toolIdPathParams, executeToolResponseSchema, executeToolContextBodySchema, agentToolPathParams, executeToolBodySchema } from './chunk-4JILES3G.js';
import { MastraFGAPermissions, validateBody } from './chunk-3ENQND57.js';
import { optionalRunIdSchema } from './chunk-2YY3EMMS.js';
import { stringify } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { standardSchemaToJSONSchema, toStandardSchema5 } from './chunk-JIL453ER.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { __export } from './chunk-PR4QN5HX.js';
import { isVercelTool, isProviderDefinedTool } from '@mastra/core/tools';
// src/server/handlers/tools.ts
var tools_exports = {};
__export(tools_exports, {
EXECUTE_AGENT_TOOL_ROUTE: () => EXECUTE_AGENT_TOOL_ROUTE,
EXECUTE_TOOL_ROUTE: () => EXECUTE_TOOL_ROUTE,
GET_AGENT_TOOL_ROUTE: () => GET_AGENT_TOOL_ROUTE,
GET_TOOL_BY_ID_ROUTE: () => GET_TOOL_BY_ID_ROUTE,
LIST_TOOLS_ROUTE: () => LIST_TOOLS_ROUTE
});
function resolveLazySchema(schema) {
if (typeof schema === "function" && !("~standard" in schema)) {
return resolveLazySchema(schema());
}
return schema;
}
function schemaToJsonSchema(schema) {
if (!schema) {
return void 0;
}
return standardSchemaToJSONSchema(toStandardSchema5(schema), { target: "draft-2020-12" });
}
function serializeSchema(schema) {
const jsonSchema = schemaToJsonSchema(resolveLazySchema(schema));
if (jsonSchema === void 0) return void 0;
return stringify(jsonSchema);
}
async function findToolInAgents(mastra, toolId, requestContext) {
const agents = mastra.listAgents() || {};
for (const agent of Object.values(agents)) {
try {
const agentTools = await agent.listTools({ requestContext });
const found = Object.values(agentTools || {}).find((t) => t.id === toolId);
if (found) return found;
} catch (error) {
mastra.getLogger?.()?.warn?.("Failed to list tools for agent while resolving tool by id", {
agentId: agent?.id,
toolId,
error: error instanceof Error ? error.message : String(error)
});
}
}
return void 0;
}
function serializeTool(tool) {
if (isProviderDefinedTool(tool)) {
const resolvedInput = resolveLazySchema(tool.inputSchema);
const resolvedOutput = resolveLazySchema(tool.outputSchema);
return {
...tool,
inputSchema: resolvedInput && typeof resolvedInput === "object" && "jsonSchema" in resolvedInput ? stringify(resolvedInput.jsonSchema) : void 0,
outputSchema: resolvedOutput && typeof resolvedOutput === "object" && "jsonSchema" in resolvedOutput ? stringify(resolvedOutput.jsonSchema) : void 0
};
}
return {
...tool,
inputSchema: serializeSchema(tool.inputSchema),
outputSchema: serializeSchema(tool.outputSchema),
requestContextSchema: serializeSchema(tool.requestContextSchema)
};
}
var LIST_TOOLS_ROUTE = createRoute({
method: "GET",
path: "/tools",
responseType: "json",
responseSchema: listToolsResponseSchema,
summary: "List all tools",
description: "Returns a list of all available tools in the system",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, registeredTools, requestContext }) => {
try {
const registered = registeredTools && Object.keys(registeredTools).length > 0 ? registeredTools : {};
const allTools = {};
const seenToolIds = /* @__PURE__ */ new Map();
for (const [key, tool] of Object.entries(registered)) {
const toolId = typeof tool?.id === "string" ? tool.id : void 0;
if (toolId !== void 0) seenToolIds.set(toolId, key);
allTools[key] = tool;
}
for (const [key, tool] of Object.entries(mastra.listTools() ?? {})) {
const toolId = typeof tool?.id === "string" ? tool.id : void 0;
if (toolId !== void 0 && seenToolIds.has(toolId)) continue;
if (toolId !== void 0) seenToolIds.set(toolId, key);
allTools[key] = tool;
}
const serializedTools = Object.entries(allTools).reduce(
(acc, [id, _tool]) => {
acc[id] = serializeTool(_tool);
return acc;
},
{}
);
const fgaProvider = mastra.getServer?.()?.fga;
const user = requestContext?.get("user");
if (fgaProvider && user) {
const toolList = Object.entries(serializedTools).map(([id, t]) => ({ id, ...t }));
const accessible = await fgaProvider.filterAccessible(user, toolList, "tool", MastraFGAPermissions.TOOLS_READ);
const accessibleSet = new Set(accessible.map((t) => t.id));
for (const id of Object.keys(serializedTools)) {
if (!accessibleSet.has(id)) {
delete serializedTools[id];
}
}
}
return serializedTools;
} catch (error) {
return handleError(error, "Error getting tools");
}
}
});
var GET_TOOL_BY_ID_ROUTE = createRoute({
method: "GET",
path: "/tools/:toolId",
responseType: "json",
pathParamSchema: toolIdPathParams,
responseSchema: serializedToolSchema,
summary: "Get tool by ID",
description: "Returns details for a specific tool including its schema and configuration",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, registeredTools, toolId, requestContext }) => {
try {
let tool;
if (registeredTools && Object.keys(registeredTools).length > 0) {
tool = Object.values(registeredTools).find((t) => t.id === toolId);
}
if (!tool) {
try {
tool = mastra.getToolById(toolId);
} catch {
}
}
if (!tool) {
tool = await findToolInAgents(mastra, toolId, requestContext);
}
if (!tool) {
throw new HTTPException(404, { message: "Tool not found" });
}
return serializeTool(tool);
} catch (error) {
return handleError(error, "Error getting tool");
}
}
});
var EXECUTE_TOOL_ROUTE = createRoute({
method: "POST",
path: "/tools/:toolId/execute",
responseType: "json",
pathParamSchema: toolIdPathParams,
queryParamSchema: optionalRunIdSchema,
bodySchema: executeToolContextBodySchema,
responseSchema: executeToolResponseSchema,
summary: "Execute tool",
description: "Executes a specific tool with the provided input data",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, runId, toolId, registeredTools, requestContext, ...bodyParams }) => {
try {
if (!toolId) {
throw new HTTPException(400, { message: "Tool ID is required" });
}
let tool;
if (registeredTools && Object.keys(registeredTools).length > 0) {
tool = Object.values(registeredTools).find((t) => t.id === toolId);
}
if (!tool) {
try {
tool = mastra.getToolById(toolId);
} catch {
}
}
if (!tool) {
tool = await findToolInAgents(mastra, toolId, requestContext);
}
if (!tool) {
throw new HTTPException(404, { message: "Tool not found" });
}
if (!tool?.execute) {
throw new HTTPException(400, { message: "Tool is not executable" });
}
const { data } = bodyParams;
validateBody({ data });
let result;
if (isVercelTool(tool)) {
result = await tool.execute(data);
} else {
result = await tool.execute(data, {
mastra,
requestContext,
// TODO: Pass proper tracing context when server API supports tracing
tracingContext: { currentSpan: void 0 },
...runId ? {
workflow: {
runId,
suspend: async () => {
}
}
} : {}
});
}
return result;
} catch (error) {
return handleError(error, "Error executing tool");
}
}
});
var GET_AGENT_TOOL_ROUTE = createRoute({
method: "GET",
path: "/agents/:agentId/tools/:toolId",
responseType: "json",
pathParamSchema: agentToolPathParams,
responseSchema: serializedToolSchema,
summary: "Get agent tool",
description: "Returns details for a specific tool assigned to the agent",
tags: ["Agents", "Tools"],
requiresAuth: true,
handler: async ({ mastra, agentId, toolId, requestContext }) => {
try {
if (!agentId) {
throw new HTTPException(400, { message: "Agent ID is required" });
}
const agent = await getAgentFromSystem({ mastra, agentId });
const agentTools = await agent.listTools({ requestContext });
const tool = Object.values(agentTools || {}).find((tool2) => tool2.id === toolId);
if (!tool) {
throw new HTTPException(404, { message: "Tool not found" });
}
return serializeTool(tool);
} catch (error) {
return handleError(error, "Error getting agent tool");
}
}
});
var EXECUTE_AGENT_TOOL_ROUTE = createRoute({
method: "POST",
path: "/agents/:agentId/tools/:toolId/execute",
responseType: "json",
pathParamSchema: agentToolPathParams,
bodySchema: executeToolBodySchema,
responseSchema: executeToolResponseSchema,
summary: "Execute agent tool",
description: "Executes a specific tool assigned to the agent with the provided input data",
tags: ["Agents", "Tools"],
requiresAuth: true,
handler: async ({ mastra, agentId, toolId, data, requestContext }) => {
try {
if (!agentId) {
throw new HTTPException(400, { message: "Agent ID is required" });
}
const agent = await getAgentFromSystem({ mastra, agentId });
const agentTools = await agent.listTools({ requestContext });
const tool = Object.values(agentTools || {}).find((tool2) => tool2.id === toolId);
if (!tool) {
throw new HTTPException(404, { message: "Tool not found" });
}
if (!tool?.execute) {
throw new HTTPException(400, { message: "Tool is not executable" });
}
const result = await tool.execute(data, {
mastra,
requestContext,
// TODO: Pass proper tracing context when server API supports tracing
tracingContext: { currentSpan: void 0 }
});
return result;
} catch (error) {
return handleError(error, "Error executing agent tool");
}
}
});
export { EXECUTE_AGENT_TOOL_ROUTE, EXECUTE_TOOL_ROUTE, GET_AGENT_TOOL_ROUTE, GET_TOOL_BY_ID_ROUTE, LIST_TOOLS_ROUTE, tools_exports };
//# sourceMappingURL=chunk-F5EEKLC4.js.map
//# sourceMappingURL=chunk-F5EEKLC4.js.map
{"version":3,"sources":["../src/server/handlers/tools.ts"],"names":["tool"],"mappings":"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","file":"chunk-F5EEKLC4.js","sourcesContent":["import { isVercelTool, isProviderDefinedTool } from '@mastra/core/tools';\nimport { toStandardSchema, standardSchemaToJSONSchema } from '@mastra/schema-compat/schema';\nimport type { PublicSchema } from '@mastra/schema-compat/schema';\nimport { stringify } from 'superjson';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n executeToolContextBodySchema,\n executeToolResponseSchema,\n listToolsResponseSchema,\n serializedToolSchema,\n toolIdPathParams,\n agentToolPathParams,\n executeToolBodySchema,\n} from '../schemas/agents';\nimport { optionalRunIdSchema } from '../schemas/common';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { validateBody } from './utils';\n\n/**\n * Resolves a schema that may be a lazy function (e.g. AI SDK provider tools).\n * Recursively resolves until a non-function value is returned.\n * Skips functions that are themselves valid schemas (e.g. ArkType types are\n * callable but also implement StandardSchema via ~standard).\n */\nfunction resolveLazySchema(schema: unknown): unknown {\n if (typeof schema === 'function' && !('~standard' in schema)) {\n return resolveLazySchema(schema());\n }\n return schema;\n}\n\nfunction schemaToJsonSchema(schema: PublicSchema<unknown> | undefined) {\n if (!schema) {\n return undefined;\n }\n\n return standardSchemaToJSONSchema(toStandardSchema(schema), { target: 'draft-2020-12' });\n}\n\nfunction serializeSchema(schema: unknown): string | undefined {\n const jsonSchema = schemaToJsonSchema(resolveLazySchema(schema) as PublicSchema<unknown> | undefined);\n if (jsonSchema === undefined) return undefined;\n return stringify(jsonSchema);\n}\n\n/**\n * Searches dynamically-resolved agent tools (provided via `toolsResolver` /\n * function-based `tools`) for a tool with the given id. Used as a fallback\n * after the static tool registry (`registeredTools` + `mastra.getToolById`)\n * misses, so global tool routes can resolve tools that only exist on agents.\n *\n * Errors thrown by an individual agent's `listTools()` are logged and\n * skipped so a single broken resolver doesn't take down the whole lookup.\n */\nasync function findToolInAgents(mastra: any, toolId: string, requestContext: any): Promise<any | undefined> {\n const agents = mastra.listAgents() || {};\n for (const agent of Object.values(agents) as any[]) {\n try {\n const agentTools = await agent.listTools({ requestContext });\n const found = Object.values(agentTools || {}).find((t: any) => t.id === toolId);\n if (found) return found;\n } catch (error) {\n mastra.getLogger?.()?.warn?.('Failed to list tools for agent while resolving tool by id', {\n agentId: agent?.id,\n toolId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return undefined;\n}\n\n/**\n * Serializes a tool for API responses, handling both regular tools (with Zod schemas)\n * and provider-defined tools (with AI SDK lazy schemas).\n */\nfunction serializeTool(tool: any): any {\n // Provider-defined tools (e.g. google.tools.googleSearch(), openai.tools.webSearch())\n // have lazy inputSchema functions that return AI SDK Schema objects, not Zod schemas.\n // We resolve them and use the jsonSchema property directly.\n if (isProviderDefinedTool(tool)) {\n const resolvedInput = resolveLazySchema(tool.inputSchema);\n const resolvedOutput = resolveLazySchema(tool.outputSchema);\n return {\n ...tool,\n inputSchema:\n resolvedInput && typeof resolvedInput === 'object' && 'jsonSchema' in resolvedInput\n ? stringify(resolvedInput.jsonSchema)\n : undefined,\n outputSchema:\n resolvedOutput && typeof resolvedOutput === 'object' && 'jsonSchema' in resolvedOutput\n ? stringify(resolvedOutput.jsonSchema)\n : undefined,\n };\n }\n\n return {\n ...tool,\n inputSchema: serializeSchema(tool.inputSchema),\n outputSchema: serializeSchema(tool.outputSchema),\n requestContextSchema: serializeSchema(tool.requestContextSchema),\n };\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport const LIST_TOOLS_ROUTE = createRoute({\n method: 'GET',\n path: '/tools',\n responseType: 'json',\n responseSchema: listToolsResponseSchema,\n summary: 'List all tools',\n description: 'Returns a list of all available tools in the system',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, registeredTools, requestContext }) => {\n try {\n // Merge tools from two sources: mastra.listTools() includes dynamically created tools\n // (e.g. MCP tools, or agent tools registered by their intrinsic id), while registeredTools\n // includes tools discovered by the CLI bundler (keyed by export name).\n //\n // The same tool instance can appear in both maps under different keys (e.g. an agent\n // registers it by `tool.id` while the bundler registers it by export name). Dedupe by\n // `tool.id`, preferring the registeredTools (bundler) key, so each tool appears once.\n const registered = registeredTools && Object.keys(registeredTools).length > 0 ? registeredTools : {};\n\n const allTools: Record<string, any> = {};\n const seenToolIds = new Map<string, string>();\n\n // registeredTools first so their key wins for a given tool.id.\n for (const [key, tool] of Object.entries(registered)) {\n const toolId = typeof (tool as any)?.id === 'string' ? (tool as any).id : undefined;\n if (toolId !== undefined) seenToolIds.set(toolId, key);\n allTools[key] = tool;\n }\n\n for (const [key, tool] of Object.entries(mastra.listTools() ?? {})) {\n const toolId = typeof (tool as any)?.id === 'string' ? (tool as any).id : undefined;\n // Skip if this exact tool.id was already registered (under any key) by registeredTools.\n if (toolId !== undefined && seenToolIds.has(toolId)) continue;\n if (toolId !== undefined) seenToolIds.set(toolId, key);\n allTools[key] = tool;\n }\n\n const serializedTools = Object.entries(allTools).reduce(\n (acc, [id, _tool]) => {\n acc[id] = serializeTool(_tool);\n return acc;\n },\n {} as Record<string, any>,\n );\n\n // Filter tools by FGA if configured\n const fgaProvider = mastra.getServer?.()?.fga;\n const user = requestContext?.get('user');\n if (fgaProvider && user) {\n const toolList = Object.entries(serializedTools).map(([id, t]) => ({ id, ...t }));\n const accessible = await fgaProvider.filterAccessible(user, toolList, 'tool', MastraFGAPermissions.TOOLS_READ);\n const accessibleSet = new Set(accessible.map((t: any) => t.id));\n for (const id of Object.keys(serializedTools)) {\n if (!accessibleSet.has(id)) {\n delete serializedTools[id];\n }\n }\n }\n\n return serializedTools;\n } catch (error) {\n return handleError(error, 'Error getting tools');\n }\n },\n});\n\nexport const GET_TOOL_BY_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/tools/:toolId',\n responseType: 'json',\n pathParamSchema: toolIdPathParams,\n responseSchema: serializedToolSchema,\n summary: 'Get tool by ID',\n description: 'Returns details for a specific tool including its schema and configuration',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, registeredTools, toolId, requestContext }) => {\n try {\n let tool: any;\n\n // Try explicit registeredTools first, then fallback to mastra\n if (registeredTools && Object.keys(registeredTools).length > 0) {\n tool = Object.values(registeredTools).find((t: any) => t.id === toolId);\n }\n if (!tool) {\n try {\n tool = mastra.getToolById(toolId);\n } catch {\n // tool not found in global registry, continue to agent fallback\n }\n }\n\n // Fallback: search dynamically-resolved agent tools (toolsResolver)\n if (!tool) {\n tool = await findToolInAgents(mastra, toolId, requestContext);\n }\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n return serializeTool(tool);\n } catch (error) {\n return handleError(error, 'Error getting tool');\n }\n },\n});\n\nexport const EXECUTE_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: toolIdPathParams,\n queryParamSchema: optionalRunIdSchema,\n bodySchema: executeToolContextBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute tool',\n description: 'Executes a specific tool with the provided input data',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, runId, toolId, registeredTools, requestContext, ...bodyParams }) => {\n try {\n if (!toolId) {\n throw new HTTPException(400, { message: 'Tool ID is required' });\n }\n\n let tool: any;\n\n // Try explicit registeredTools first, then fallback to mastra\n if (registeredTools && Object.keys(registeredTools).length > 0) {\n tool = Object.values(registeredTools).find((t: any) => t.id === toolId);\n }\n if (!tool) {\n try {\n tool = mastra.getToolById(toolId);\n } catch {\n // tool not found in global registry, continue to agent fallback\n }\n }\n\n // Fallback: search dynamically-resolved agent tools (toolsResolver)\n if (!tool) {\n tool = await findToolInAgents(mastra, toolId, requestContext);\n }\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n if (!tool?.execute) {\n throw new HTTPException(400, { message: 'Tool is not executable' });\n }\n\n const { data } = bodyParams;\n\n validateBody({ data });\n\n let result;\n if (isVercelTool(tool)) {\n result = await (tool as any).execute(data);\n } else {\n result = await tool.execute(data!, {\n mastra,\n requestContext,\n // TODO: Pass proper tracing context when server API supports tracing\n tracingContext: { currentSpan: undefined },\n ...(runId\n ? {\n workflow: {\n runId,\n suspend: async () => {},\n },\n }\n : {}),\n });\n }\n\n return result;\n } catch (error) {\n return handleError(error, 'Error executing tool');\n }\n },\n});\n\n// ============================================================================\n// Agent Tool Routes\n// ============================================================================\n\nexport const GET_AGENT_TOOL_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/tools/:toolId',\n responseType: 'json',\n pathParamSchema: agentToolPathParams,\n responseSchema: serializedToolSchema,\n summary: 'Get agent tool',\n description: 'Returns details for a specific tool assigned to the agent',\n tags: ['Agents', 'Tools'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, toolId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const agentTools = await agent.listTools({ requestContext });\n\n const tool = Object.values(agentTools || {}).find((tool: any) => tool.id === toolId) as any;\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n return serializeTool(tool);\n } catch (error) {\n return handleError(error, 'Error getting agent tool');\n }\n },\n});\n\nexport const EXECUTE_AGENT_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: agentToolPathParams,\n bodySchema: executeToolBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute agent tool',\n description: 'Executes a specific tool assigned to the agent with the provided input data',\n tags: ['Agents', 'Tools'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, toolId, data, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const agentTools = await agent.listTools({ requestContext });\n\n const tool = Object.values(agentTools || {}).find((tool: any) => tool.id === toolId) as any;\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n if (!tool?.execute) {\n throw new HTTPException(400, { message: 'Tool is not executable' });\n }\n\n const result = await tool.execute(data, {\n mastra,\n requestContext,\n // TODO: Pass proper tracing context when server API supports tracing\n tracingContext: { currentSpan: undefined },\n });\n\n return result;\n } catch (error) {\n return handleError(error, 'Error executing agent tool');\n }\n },\n});\n"]}
import { LIST_STORED_SKILLS_ROUTE, GET_STORED_SKILL_ROUTE, CREATE_STORED_SKILL_ROUTE, UPDATE_STORED_SKILL_ROUTE, DELETE_STORED_SKILL_ROUTE, PUBLISH_STORED_SKILL_ROUTE } from './chunk-TS5QYSEZ.js';
import { LIST_STORED_WORKSPACES_ROUTE, GET_STORED_WORKSPACE_ROUTE, CREATE_STORED_WORKSPACE_ROUTE, UPDATE_STORED_WORKSPACE_ROUTE, DELETE_STORED_WORKSPACE_ROUTE } from './chunk-M25LVAUH.js';
import { GET_SYSTEM_PACKAGES_ROUTE, GET_API_SCHEMA_ROUTE } from './chunk-7HMXQIPK.js';
import { LIST_TOOL_PROVIDERS_ROUTE, LIST_TOOL_PROVIDER_TOOLKITS_ROUTE, LIST_TOOL_PROVIDER_TOOLS_ROUTE, GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE, AUTHORIZE_TOOL_PROVIDER_ROUTE, GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE, TOOL_PROVIDER_CONNECTION_STATUS_ROUTE, LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE, LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE, DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE, UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE, GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE, GET_TOOL_PROVIDER_HEALTH_ROUTE } from './chunk-2Z3TLC4L.js';
import { FAVORITE_STORED_AGENT_ROUTE, UNFAVORITE_STORED_AGENT_ROUTE } from './chunk-ZZOHO2FT.js';
import { LIST_STORED_AGENTS_ROUTE, PREVIEW_INSTRUCTIONS_ROUTE, GET_STORED_AGENT_DEPENDENTS_ROUTE, EXPORT_STORED_AGENT_ROUTE, OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE, GET_STORED_AGENT_ROUTE, CREATE_STORED_AGENT_ROUTE, UPDATE_STORED_AGENT_ROUTE, DELETE_STORED_AGENT_ROUTE } from './chunk-C4U5EL4H.js';
import { LIST_STORED_MCP_CLIENTS_ROUTE, GET_STORED_MCP_CLIENT_ROUTE, CREATE_STORED_MCP_CLIENT_ROUTE, UPDATE_STORED_MCP_CLIENT_ROUTE, DELETE_STORED_MCP_CLIENT_ROUTE } from './chunk-KBOC52HT.js';
import { LIST_STORED_PROMPT_BLOCKS_ROUTE, GET_STORED_PROMPT_BLOCK_ROUTE, CREATE_STORED_PROMPT_BLOCK_ROUTE, UPDATE_STORED_PROMPT_BLOCK_ROUTE, DELETE_STORED_PROMPT_BLOCK_ROUTE } from './chunk-SJPWXUKZ.js';
import { LIST_STORED_SCORERS_ROUTE, GET_STORED_SCORER_ROUTE, CREATE_STORED_SCORER_ROUTE, UPDATE_STORED_SCORER_ROUTE, DELETE_STORED_SCORER_ROUTE } from './chunk-E2JNW3QM.js';
import { FAVORITE_STORED_SKILL_ROUTE, UNFAVORITE_STORED_SKILL_ROUTE } from './chunk-5V2QWK2S.js';
import { LIST_PROCESSORS_ROUTE, GET_PROCESSOR_BY_ID_ROUTE, EXECUTE_PROCESSOR_ROUTE } from './chunk-MQMPNMZH.js';
import { LIST_PROMPT_BLOCK_VERSIONS_ROUTE, CREATE_PROMPT_BLOCK_VERSION_ROUTE, COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE, GET_PROMPT_BLOCK_VERSION_ROUTE, ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE, RESTORE_PROMPT_BLOCK_VERSION_ROUTE, DELETE_PROMPT_BLOCK_VERSION_ROUTE } from './chunk-BB6RVOJY.js';
import { LIST_SCHEDULES_ROUTE, GET_SCHEDULE_ROUTE, LIST_SCHEDULE_TRIGGERS_ROUTE, PAUSE_SCHEDULE_ROUTE, RESUME_SCHEDULE_ROUTE } from './chunk-WAIWLM6T.js';
import { LIST_SCORER_VERSIONS_ROUTE, CREATE_SCORER_VERSION_ROUTE, COMPARE_SCORER_VERSIONS_ROUTE, GET_SCORER_VERSION_ROUTE, ACTIVATE_SCORER_VERSION_ROUTE, RESTORE_SCORER_VERSION_ROUTE, DELETE_SCORER_VERSION_ROUTE } from './chunk-46Y4Y2RB.js';
import { LIST_PROCESSOR_PROVIDERS_ROUTE, GET_PROCESSOR_PROVIDER_ROUTE } from './chunk-IDCRGQOI.js';
import { LIST_DATASETS_ROUTE, CREATE_DATASET_ROUTE, GET_DATASET_ROUTE, UPDATE_DATASET_ROUTE, DELETE_DATASET_ROUTE, LIST_ITEMS_ROUTE, ADD_ITEM_ROUTE, BATCH_INSERT_ITEMS_ROUTE, BATCH_DELETE_ITEMS_ROUTE, GET_ITEM_ROUTE, UPDATE_ITEM_ROUTE, DELETE_ITEM_ROUTE, LIST_DATASET_VERSIONS_ROUTE, LIST_ITEM_VERSIONS_ROUTE, GET_ITEM_VERSION_ROUTE, LIST_ALL_EXPERIMENTS_ROUTE, EXPERIMENT_REVIEW_SUMMARY_ROUTE, LIST_EXPERIMENTS_ROUTE, TRIGGER_EXPERIMENT_ROUTE, GET_EXPERIMENT_ROUTE, LIST_EXPERIMENT_RESULTS_ROUTE, UPDATE_EXPERIMENT_RESULT_ROUTE, COMPARE_EXPERIMENTS_ROUTE, GENERATE_ITEMS_ROUTE, CLUSTER_FAILURES_ROUTE } from './chunk-GADWAAGI.js';
import { GET_EDITOR_BUILDER_SETTINGS_ROUTE, GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE, GET_INFRASTRUCTURE_STATUS_ROUTE } from './chunk-TPGA2ZTS.js';
import { LIST_HARNESSES_ROUTE, LIST_HARNESS_MODES_ROUTE, LIST_HARNESS_MODELS_ROUTE, CREATE_HARNESS_SESSION_ROUTE, GET_HARNESS_SESSION_STATE_ROUTE, LIST_HARNESS_THREADS_ROUTE, CREATE_HARNESS_THREAD_ROUTE, DELETE_HARNESS_THREAD_ROUTE, RENAME_HARNESS_THREAD_ROUTE, CLONE_HARNESS_THREAD_ROUTE, LIST_HARNESS_THREAD_MESSAGES_ROUTE, STREAM_HARNESS_SESSION_ROUTE, SEND_HARNESS_MESSAGE_ROUTE, STEER_HARNESS_SESSION_ROUTE, FOLLOW_UP_HARNESS_SESSION_ROUTE, ABORT_HARNESS_SESSION_ROUTE, HARNESS_TOOL_APPROVAL_ROUTE, HARNESS_TOOL_SUSPENSION_ROUTE, SWITCH_HARNESS_MODE_ROUTE, SWITCH_HARNESS_MODEL_ROUTE, SWITCH_HARNESS_THREAD_ROUTE, SEND_HARNESS_NOTIFICATION_ROUTE, GET_HARNESS_WORKSPACE_STATUS_ROUTE, GET_HARNESS_OM_RECORD_ROUTE, SET_HARNESS_RESOURCE_ID_ROUTE, GET_HARNESS_RESOURCE_IDS_ROUTE, GET_HARNESS_GOAL_ROUTE, SET_HARNESS_GOAL_ROUTE, UPDATE_HARNESS_GOAL_ROUTE, CLEAR_HARNESS_GOAL_ROUTE, GET_HARNESS_PERMISSIONS_ROUTE, SET_HARNESS_CATEGORY_PERMISSION_ROUTE, SET_HARNESS_TOOL_PERMISSION_ROUTE, SET_HARNESS_SESSION_STATE_ROUTE } from './chunk-MYNSU6B4.js';
import { LIST_MCP_CLIENT_VERSIONS_ROUTE, CREATE_MCP_CLIENT_VERSION_ROUTE, COMPARE_MCP_CLIENT_VERSIONS_ROUTE, GET_MCP_CLIENT_VERSION_ROUTE, ACTIVATE_MCP_CLIENT_VERSION_ROUTE, RESTORE_MCP_CLIENT_VERSION_ROUTE, DELETE_MCP_CLIENT_VERSION_ROUTE } from './chunk-MMY24AC4.js';
import { BACKGROUND_TASK_STREAM_ROUTE, LIST_BACKGROUND_TASKS_ROUTE, GET_BACKGROUND_TASK_ROUTE } from './chunk-JUORD32P.js';
import { LIST_BUILDER_REGISTRIES_ROUTE, BUILDER_REGISTRY_SEARCH_ROUTE, BUILDER_REGISTRY_POPULAR_ROUTE, BUILDER_REGISTRY_PREVIEW_ROUTE, BUILDER_REGISTRY_INSTALL_ROUTE } from './chunk-C2A2BZFY.js';
import { LIST_CHANNEL_PLATFORMS_ROUTE, LIST_CHANNEL_INSTALLATIONS_ROUTE, CONNECT_CHANNEL_ROUTE, DISCONNECT_CHANNEL_ROUTE } from './chunk-VRERZRJQ.js';
import { UPSERT_VECTORS_ROUTE, CREATE_INDEX_ROUTE, QUERY_VECTORS_ROUTE, LIST_INDEXES_ROUTE, DESCRIBE_INDEX_ROUTE, DELETE_INDEX_ROUTE, LIST_VECTORS_ROUTE, LIST_EMBEDDERS_ROUTE } from './chunk-MMZL6I4C.js';
import { GET_SPEAKERS_ROUTE, GET_SPEAKERS_DEPRECATED_ROUTE, GENERATE_SPEECH_ROUTE, GENERATE_SPEECH_DEPRECATED_ROUTE, TRANSCRIBE_SPEECH_ROUTE, TRANSCRIBE_SPEECH_DEPRECATED_ROUTE, GET_LISTENER_ROUTE } from './chunk-LQZHT5U7.js';
import { LIST_WORKSPACES_ROUTE, GET_WORKSPACE_ROUTE, WORKSPACE_FS_ROUTES, WORKSPACE_SEARCH_ROUTES, WORKSPACE_SKILLS_ROUTES, WORKSPACE_SKILLS_SH_ROUTES } from './chunk-WF6VLJGR.js';
import { EXECUTE_AGENT_TOOL_ROUTE, GET_AGENT_TOOL_ROUTE, LIST_TOOLS_ROUTE, GET_TOOL_BY_ID_ROUTE, EXECUTE_TOOL_ROUTE } from './chunk-F5EEKLC4.js';
import { LIST_SCORERS_ROUTE, GET_SCORER_ROUTE, LIST_SCORES_BY_RUN_ID_ROUTE, LIST_SCORES_BY_SCORER_ID_ROUTE, LIST_SCORES_BY_ENTITY_ID_ROUTE, SAVE_SCORE_ROUTE } from './chunk-MLLGO6XZ.js';
import { CREATE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE } from './chunk-PLWZVSGT.js';
import { LIST_MCP_SERVERS_ROUTE, GET_MCP_SERVER_DETAIL_ROUTE, LIST_MCP_SERVER_TOOLS_ROUTE, GET_MCP_SERVER_TOOL_DETAIL_ROUTE, EXECUTE_MCP_SERVER_TOOL_ROUTE, LIST_MCP_SERVER_RESOURCES_ROUTE, READ_MCP_SERVER_RESOURCE_ROUTE, MCP_HTTP_TRANSPORT_ROUTE, MCP_SSE_TRANSPORT_ROUTE, MCP_SSE_MESSAGES_ROUTE } from './chunk-RQGQAYCL.js';
import { GET_MEMORY_STATUS_ROUTE, GET_MEMORY_CONFIG_ROUTE, GET_OBSERVATIONAL_MEMORY_ROUTE, AWAIT_BUFFER_STATUS_ROUTE, LIST_THREADS_ROUTE, GET_THREAD_BY_ID_ROUTE, LIST_MESSAGES_ROUTE, GET_WORKING_MEMORY_ROUTE, SAVE_MESSAGES_ROUTE, CREATE_THREAD_ROUTE, UPDATE_THREAD_ROUTE, DELETE_THREAD_ROUTE, CLONE_THREAD_ROUTE, UPDATE_WORKING_MEMORY_ROUTE, DELETE_MESSAGES_ROUTE, SEARCH_MEMORY_ROUTE, GET_MEMORY_STATUS_NETWORK_ROUTE, LIST_THREADS_NETWORK_ROUTE, GET_THREAD_BY_ID_NETWORK_ROUTE, LIST_MESSAGES_NETWORK_ROUTE, SAVE_MESSAGES_NETWORK_ROUTE, CREATE_THREAD_NETWORK_ROUTE, UPDATE_THREAD_NETWORK_ROUTE, DELETE_THREAD_NETWORK_ROUTE, DELETE_MESSAGES_NETWORK_ROUTE } from './chunk-HZWJL5Y4.js';
import { LIST_TRACES_ROUTE, LIST_TRACES_LIGHT_ROUTE, LIST_BRANCHES_ROUTE, GET_BRANCH_ROUTE, GET_TRACE_ROUTE, GET_TRACE_LIGHT_ROUTE, GET_SPAN_ROUTE, GET_TRACE_TRAJECTORY_ROUTE, SCORE_TRACES_ROUTE, LIST_SCORES_BY_SPAN_ROUTE } from './chunk-TIXNAAKQ.js';
import { LIST_METRICS, LIST_LOGS, LIST_SCORES, CREATE_SCORE, GET_SCORE, GET_SCORE_AGGREGATE, GET_SCORE_BREAKDOWN, GET_SCORE_TIME_SERIES, GET_SCORE_PERCENTILES, LIST_FEEDBACK, CREATE_FEEDBACK, GET_FEEDBACK_AGGREGATE, GET_FEEDBACK_BREAKDOWN, GET_FEEDBACK_TIME_SERIES, GET_FEEDBACK_PERCENTILES, GET_METRIC_AGGREGATE, GET_METRIC_BREAKDOWN, GET_METRIC_TIME_SERIES, GET_METRIC_PERCENTILES, GET_METRIC_NAMES, GET_METRIC_LABEL_KEYS, GET_METRIC_LABEL_VALUES, GET_ENTITY_TYPES, GET_ENTITY_NAMES, GET_SERVICE_NAMES, GET_ENVIRONMENTS, GET_TAGS } from './chunk-5FFEBJ3X.js';
import { LIST_LOG_TRANSPORTS_ROUTE, LIST_LOGS_ROUTE, LIST_LOGS_BY_RUN_ID_ROUTE } from './chunk-OHWAEEZJ.js';
import { CREATE_CONVERSATION_ROUTE, GET_CONVERSATION_ROUTE, GET_CONVERSATION_ITEMS_ROUTE, DELETE_CONVERSATION_ROUTE } from './chunk-E345K7K7.js';
import { GET_AGENT_CARD_ROUTE, AGENT_EXECUTION_ROUTE } from './chunk-NEPOKWAA.js';
import { AUTH_ROUTES } from './chunk-R4O5HVDI.js';
import { LIST_AGENTS_ROUTE, GET_PROVIDERS_ROUTE, GET_AGENT_BY_ID_ROUTE, CLONE_AGENT_ROUTE, GENERATE_AGENT_ROUTE, GENERATE_AGENT_VNEXT_ROUTE, STREAM_GENERATE_ROUTE, STREAM_UNTIL_IDLE_GENERATE_ROUTE, STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE, OBSERVE_AGENT_STREAM_ROUTE, SEND_AGENT_MESSAGE_ROUTE, QUEUE_AGENT_MESSAGE_ROUTE, SEND_AGENT_SIGNAL_ROUTE, ABORT_AGENT_THREAD_ROUTE, SUBSCRIBE_AGENT_THREAD_ROUTE, APPROVE_TOOL_CALL_ROUTE, SEND_TOOL_APPROVAL_ROUTE, DECLINE_TOOL_CALL_ROUTE, RESUME_STREAM_ROUTE, APPROVE_TOOL_CALL_GENERATE_ROUTE, DECLINE_TOOL_CALL_GENERATE_ROUTE, APPROVE_NETWORK_TOOL_CALL_ROUTE, DECLINE_NETWORK_TOOL_CALL_ROUTE, RESUME_STREAM_UNTIL_IDLE_ROUTE, STREAM_NETWORK_ROUTE, UPDATE_AGENT_MODEL_ROUTE, RESET_AGENT_MODEL_ROUTE, REORDER_AGENT_MODEL_LIST_ROUTE, UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE, ENHANCE_INSTRUCTIONS_ROUTE, GET_AGENT_SKILL_ROUTE, STREAM_VNEXT_DEPRECATED_ROUTE, STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE, STREAM_UI_MESSAGE_DEPRECATED_ROUTE, GENERATE_LEGACY_ROUTE, STREAM_GENERATE_LEGACY_ROUTE } from './chunk-WKSF3TVK.js';
import { LIST_AGENT_BUILDER_ACTIONS_ROUTE, GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE, LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE, GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE, CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE, STREAM_AGENT_BUILDER_ACTION_ROUTE, STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE, START_ASYNC_AGENT_BUILDER_ACTION_ROUTE, START_AGENT_BUILDER_ACTION_RUN_ROUTE, OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE, OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE, RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE, RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE, RESUME_AGENT_BUILDER_ACTION_ROUTE, RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE, CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE } from './chunk-ILVGJFCT.js';
import { LIST_WORKFLOWS_ROUTE, GET_WORKFLOW_BY_ID_ROUTE, LIST_WORKFLOW_RUNS_ROUTE, GET_WORKFLOW_RUN_BY_ID_ROUTE, DELETE_WORKFLOW_RUN_BY_ID_ROUTE, CREATE_WORKFLOW_RUN_ROUTE, STREAM_WORKFLOW_ROUTE, RESUME_STREAM_WORKFLOW_ROUTE, START_ASYNC_WORKFLOW_ROUTE, START_WORKFLOW_RUN_ROUTE, OBSERVE_STREAM_WORKFLOW_ROUTE, RESUME_ASYNC_WORKFLOW_ROUTE, RESUME_NO_WAIT_WORKFLOW_ROUTE, RESUME_WORKFLOW_ROUTE, CANCEL_WORKFLOW_RUN_ROUTE, TIME_TRAVEL_WORKFLOW_ROUTE, TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE, TIME_TRAVEL_STREAM_WORKFLOW_ROUTE, RESTART_WORKFLOW_ROUTE, RESTART_ASYNC_WORKFLOW_ROUTE, RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE, RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE, EXECUTE_WORKFLOW_STEP_ROUTE, RECEIVE_WORKFLOW_EVENT_ROUTE, STREAM_LEGACY_WORKFLOW_ROUTE, OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE } from './chunk-R7624SPL.js';
import { LIST_AGENT_VERSIONS_ROUTE, CREATE_AGENT_VERSION_ROUTE, COMPARE_AGENT_VERSIONS_ROUTE, GET_AGENT_VERSION_ROUTE, ACTIVATE_AGENT_VERSION_ROUTE, RESTORE_AGENT_VERSION_ROUTE, DELETE_AGENT_VERSION_ROUTE } from './chunk-56TEDJND.js';
// src/server/server-adapter/routes/permissions.ts
var METHOD_TO_ACTION = {
GET: "read",
POST: "write",
// Default for POST, may be overridden to 'execute'
PUT: "write",
PATCH: "write",
DELETE: "delete"
};
var EXECUTE_PATTERNS = [
"/generate",
"/stream",
"/execute",
"/start",
"/resume",
"/restart",
"/cancel",
"/approve",
"/decline",
"/speak",
"/listen",
"/query",
"/search",
"/observe",
"/time-travel",
"/enhance",
"/clone"
];
var PUBLISH_PATTERNS = ["/publish", "/activate", "/restore"];
var STORED_RESOURCE_SEGMENTS = {
agents: "stored-agents",
"mcp-clients": "stored-mcp-clients",
"prompt-blocks": "stored-prompt-blocks",
scorers: "stored-scorers",
skills: "stored-skills",
workspaces: "stored-workspaces"
};
function extractResource(path) {
const segments = path.replace(/^\//, "").split("/");
if (segments.length === 0) {
return null;
}
const firstSegment = segments[0];
if (firstSegment === "stored" && segments[1]) {
return STORED_RESOURCE_SEGMENTS[segments[1]] ?? null;
}
if (firstSegment === ".well-known") {
return "a2a";
}
return firstSegment || null;
}
function deriveAction(method, path) {
const upperMethod = method.toUpperCase();
if (upperMethod === "POST") {
if (path.startsWith("/stored/")) {
const isPublishOperation = PUBLISH_PATTERNS.some((pattern) => path.endsWith(pattern));
if (isPublishOperation) {
return "publish";
}
}
const isExecuteOperation = EXECUTE_PATTERNS.some((pattern) => path.includes(pattern));
return isExecuteOperation ? "execute" : "write";
}
return METHOD_TO_ACTION[upperMethod] || "read";
}
function derivePermission(route) {
if (route.method === "ALL") {
return null;
}
const resource = extractResource(route.path);
if (!resource) {
return null;
}
const action = deriveAction(route.method, route.path);
return `${resource}:${action}`;
}
function getEffectivePermission(route) {
if (route.requiresAuth === false) {
return null;
}
if (route.requiresPermission) {
return route.requiresPermission;
}
return derivePermission(route);
}
// src/server/server-adapter/routes/a2a.ts
var A2A_ROUTES = [GET_AGENT_CARD_ROUTE, AGENT_EXECUTION_ROUTE];
// src/server/server-adapter/routes/agent-builder.ts
var AGENT_BUILDER_ROUTES = [
LIST_AGENT_BUILDER_ACTIONS_ROUTE,
GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE,
LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE,
GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE,
CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE,
STREAM_AGENT_BUILDER_ACTION_ROUTE,
STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,
START_ASYNC_AGENT_BUILDER_ACTION_ROUTE,
START_AGENT_BUILDER_ACTION_RUN_ROUTE,
OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE,
OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,
RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE,
RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE,
RESUME_AGENT_BUILDER_ACTION_ROUTE,
RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE,
CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE
];
// src/server/server-adapter/routes/agents.ts
var AGENTS_ROUTES = [
// ============================================================================
// Agent Core Routes
// ============================================================================
LIST_AGENTS_ROUTE,
GET_PROVIDERS_ROUTE,
GET_AGENT_BY_ID_ROUTE,
CLONE_AGENT_ROUTE,
// ============================================================================
// Voice Routes
// ============================================================================
GET_SPEAKERS_ROUTE,
GET_SPEAKERS_DEPRECATED_ROUTE,
// ============================================================================
// Agent Execution Routes
// ============================================================================
GENERATE_AGENT_ROUTE,
GENERATE_AGENT_VNEXT_ROUTE,
STREAM_GENERATE_ROUTE,
STREAM_UNTIL_IDLE_GENERATE_ROUTE,
STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,
// ============================================================================
// Resumable Stream Routes
// ============================================================================
OBSERVE_AGENT_STREAM_ROUTE,
SEND_AGENT_MESSAGE_ROUTE,
QUEUE_AGENT_MESSAGE_ROUTE,
SEND_AGENT_SIGNAL_ROUTE,
ABORT_AGENT_THREAD_ROUTE,
SUBSCRIBE_AGENT_THREAD_ROUTE,
// ============================================================================
// Tool Routes
// ============================================================================
EXECUTE_AGENT_TOOL_ROUTE,
APPROVE_TOOL_CALL_ROUTE,
SEND_TOOL_APPROVAL_ROUTE,
DECLINE_TOOL_CALL_ROUTE,
RESUME_STREAM_ROUTE,
APPROVE_TOOL_CALL_GENERATE_ROUTE,
DECLINE_TOOL_CALL_GENERATE_ROUTE,
APPROVE_NETWORK_TOOL_CALL_ROUTE,
DECLINE_NETWORK_TOOL_CALL_ROUTE,
RESUME_STREAM_UNTIL_IDLE_ROUTE,
// ============================================================================
// Network Routes
// ============================================================================
STREAM_NETWORK_ROUTE,
// ============================================================================
// Model Management Routes
// ============================================================================
UPDATE_AGENT_MODEL_ROUTE,
RESET_AGENT_MODEL_ROUTE,
REORDER_AGENT_MODEL_LIST_ROUTE,
UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,
// ============================================================================
// Instruction Enhancement Routes
// ============================================================================
ENHANCE_INSTRUCTIONS_ROUTE,
// ============================================================================
// Agent Tool Routes
// ============================================================================
GET_AGENT_TOOL_ROUTE,
// ============================================================================
// Agent Skill Routes
// ============================================================================
GET_AGENT_SKILL_ROUTE,
// ============================================================================
// Voice/Speech Routes
// ============================================================================
GENERATE_SPEECH_ROUTE,
GENERATE_SPEECH_DEPRECATED_ROUTE,
TRANSCRIBE_SPEECH_ROUTE,
TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,
GET_LISTENER_ROUTE,
// ============================================================================
// Deprecated Routes
// ============================================================================
STREAM_VNEXT_DEPRECATED_ROUTE,
STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,
STREAM_UI_MESSAGE_DEPRECATED_ROUTE
];
// src/server/server-adapter/routes/background-tasks.ts
var BACKGROUND_TASK_ROUTES = [
BACKGROUND_TASK_STREAM_ROUTE,
LIST_BACKGROUND_TASKS_ROUTE,
GET_BACKGROUND_TASK_ROUTE
];
// src/server/server-adapter/routes/channels.ts
var CHANNELS_ROUTES = [
LIST_CHANNEL_PLATFORMS_ROUTE,
LIST_CHANNEL_INSTALLATIONS_ROUTE,
CONNECT_CHANNEL_ROUTE,
DISCONNECT_CHANNEL_ROUTE
];
// src/server/server-adapter/routes/conversations.ts
var CONVERSATIONS_ROUTES = [
CREATE_CONVERSATION_ROUTE,
GET_CONVERSATION_ROUTE,
GET_CONVERSATION_ITEMS_ROUTE,
DELETE_CONVERSATION_ROUTE
];
// src/server/server-adapter/routes/datasets.ts
var DATASETS_ROUTES = [
// Dataset CRUD
LIST_DATASETS_ROUTE,
CREATE_DATASET_ROUTE,
GET_DATASET_ROUTE,
UPDATE_DATASET_ROUTE,
DELETE_DATASET_ROUTE,
// Item list and add
LIST_ITEMS_ROUTE,
ADD_ITEM_ROUTE,
// Batch operations - MUST come before item-specific routes to avoid /items/batch matching /items/:itemId
BATCH_INSERT_ITEMS_ROUTE,
BATCH_DELETE_ITEMS_ROUTE,
// Item-specific CRUD (uses :itemId param)
GET_ITEM_ROUTE,
UPDATE_ITEM_ROUTE,
DELETE_ITEM_ROUTE,
// Version operations
LIST_DATASET_VERSIONS_ROUTE,
LIST_ITEM_VERSIONS_ROUTE,
GET_ITEM_VERSION_ROUTE,
// All experiments (cross-dataset) - MUST come before dataset-scoped experiments
LIST_ALL_EXPERIMENTS_ROUTE,
// Experiment review summary (cross-dataset) - MUST come before dataset-scoped experiments
EXPERIMENT_REVIEW_SUMMARY_ROUTE,
// Experiment operations (dataset-scoped)
LIST_EXPERIMENTS_ROUTE,
TRIGGER_EXPERIMENT_ROUTE,
GET_EXPERIMENT_ROUTE,
LIST_EXPERIMENT_RESULTS_ROUTE,
UPDATE_EXPERIMENT_RESULT_ROUTE,
// Analytics
COMPARE_EXPERIMENTS_ROUTE,
// AI generation
GENERATE_ITEMS_ROUTE,
// Failure analysis
CLUSTER_FAILURES_ROUTE
];
// src/server/server-adapter/routes/editor-builder.ts
var EDITOR_BUILDER_ROUTES = [
GET_EDITOR_BUILDER_SETTINGS_ROUTE,
GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE,
GET_INFRASTRUCTURE_STATUS_ROUTE,
LIST_BUILDER_REGISTRIES_ROUTE,
BUILDER_REGISTRY_SEARCH_ROUTE,
BUILDER_REGISTRY_POPULAR_ROUTE,
BUILDER_REGISTRY_PREVIEW_ROUTE,
BUILDER_REGISTRY_INSTALL_ROUTE
];
// src/server/server-adapter/routes/harness.ts
var HARNESS_ROUTES = [
LIST_HARNESSES_ROUTE,
LIST_HARNESS_MODES_ROUTE,
LIST_HARNESS_MODELS_ROUTE,
CREATE_HARNESS_SESSION_ROUTE,
GET_HARNESS_SESSION_STATE_ROUTE,
LIST_HARNESS_THREADS_ROUTE,
CREATE_HARNESS_THREAD_ROUTE,
DELETE_HARNESS_THREAD_ROUTE,
RENAME_HARNESS_THREAD_ROUTE,
CLONE_HARNESS_THREAD_ROUTE,
LIST_HARNESS_THREAD_MESSAGES_ROUTE,
STREAM_HARNESS_SESSION_ROUTE,
SEND_HARNESS_MESSAGE_ROUTE,
STEER_HARNESS_SESSION_ROUTE,
FOLLOW_UP_HARNESS_SESSION_ROUTE,
ABORT_HARNESS_SESSION_ROUTE,
HARNESS_TOOL_APPROVAL_ROUTE,
HARNESS_TOOL_SUSPENSION_ROUTE,
SWITCH_HARNESS_MODE_ROUTE,
SWITCH_HARNESS_MODEL_ROUTE,
SWITCH_HARNESS_THREAD_ROUTE,
SEND_HARNESS_NOTIFICATION_ROUTE,
GET_HARNESS_WORKSPACE_STATUS_ROUTE,
GET_HARNESS_OM_RECORD_ROUTE,
SET_HARNESS_RESOURCE_ID_ROUTE,
GET_HARNESS_RESOURCE_IDS_ROUTE,
GET_HARNESS_GOAL_ROUTE,
SET_HARNESS_GOAL_ROUTE,
UPDATE_HARNESS_GOAL_ROUTE,
CLEAR_HARNESS_GOAL_ROUTE,
GET_HARNESS_PERMISSIONS_ROUTE,
SET_HARNESS_CATEGORY_PERMISSION_ROUTE,
SET_HARNESS_TOOL_PERMISSION_ROUTE,
SET_HARNESS_SESSION_STATE_ROUTE
];
// src/server/server-adapter/routes/legacy.ts
var LEGACY_ROUTES = [
// ============================================================================
// Legacy Agent Routes
// ============================================================================
GENERATE_LEGACY_ROUTE,
STREAM_GENERATE_LEGACY_ROUTE,
// ============================================================================
// Legacy Workflow Routes
// ============================================================================
STREAM_LEGACY_WORKFLOW_ROUTE,
OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE
];
// src/server/server-adapter/routes/logs.ts
var LOGS_ROUTES = [LIST_LOG_TRANSPORTS_ROUTE, LIST_LOGS_ROUTE, LIST_LOGS_BY_RUN_ID_ROUTE];
// src/server/server-adapter/routes/mcp.ts
var MCP_ROUTES = [
// ============================================================================
// MCP Server Registry Routes
// ============================================================================
LIST_MCP_SERVERS_ROUTE,
GET_MCP_SERVER_DETAIL_ROUTE,
// ============================================================================
// MCP Server Tool Routes
// ============================================================================
LIST_MCP_SERVER_TOOLS_ROUTE,
GET_MCP_SERVER_TOOL_DETAIL_ROUTE,
EXECUTE_MCP_SERVER_TOOL_ROUTE,
// ============================================================================
// MCP Server Resource Routes
// ============================================================================
LIST_MCP_SERVER_RESOURCES_ROUTE,
READ_MCP_SERVER_RESOURCE_ROUTE,
// ============================================================================
// MCP Transport Routes (handled by adapters)
// ============================================================================
MCP_HTTP_TRANSPORT_ROUTE,
MCP_SSE_TRANSPORT_ROUTE,
MCP_SSE_MESSAGES_ROUTE
];
// src/server/server-adapter/routes/memory.ts
var MEMORY_ROUTES = [
GET_MEMORY_STATUS_ROUTE,
GET_MEMORY_CONFIG_ROUTE,
GET_OBSERVATIONAL_MEMORY_ROUTE,
AWAIT_BUFFER_STATUS_ROUTE,
LIST_THREADS_ROUTE,
GET_THREAD_BY_ID_ROUTE,
LIST_MESSAGES_ROUTE,
GET_WORKING_MEMORY_ROUTE,
SAVE_MESSAGES_ROUTE,
CREATE_THREAD_ROUTE,
UPDATE_THREAD_ROUTE,
DELETE_THREAD_ROUTE,
CLONE_THREAD_ROUTE,
UPDATE_WORKING_MEMORY_ROUTE,
DELETE_MESSAGES_ROUTE,
SEARCH_MEMORY_ROUTE,
GET_MEMORY_STATUS_NETWORK_ROUTE,
LIST_THREADS_NETWORK_ROUTE,
GET_THREAD_BY_ID_NETWORK_ROUTE,
LIST_MESSAGES_NETWORK_ROUTE,
SAVE_MESSAGES_NETWORK_ROUTE,
CREATE_THREAD_NETWORK_ROUTE,
UPDATE_THREAD_NETWORK_ROUTE,
DELETE_THREAD_NETWORK_ROUTE,
DELETE_MESSAGES_NETWORK_ROUTE
];
// src/server/server-adapter/routes/observability.ts
var OBSERVABILITY_ROUTES = [
// Legacy
LIST_TRACES_ROUTE,
LIST_TRACES_LIGHT_ROUTE,
LIST_BRANCHES_ROUTE,
GET_BRANCH_ROUTE,
GET_TRACE_ROUTE,
GET_TRACE_LIGHT_ROUTE,
GET_SPAN_ROUTE,
GET_TRACE_TRAJECTORY_ROUTE,
SCORE_TRACES_ROUTE,
LIST_SCORES_BY_SPAN_ROUTE,
// New observability routes
LIST_METRICS,
LIST_LOGS,
LIST_SCORES,
CREATE_SCORE,
GET_SCORE,
GET_SCORE_AGGREGATE,
GET_SCORE_BREAKDOWN,
GET_SCORE_TIME_SERIES,
GET_SCORE_PERCENTILES,
LIST_FEEDBACK,
CREATE_FEEDBACK,
GET_FEEDBACK_AGGREGATE,
GET_FEEDBACK_BREAKDOWN,
GET_FEEDBACK_TIME_SERIES,
GET_FEEDBACK_PERCENTILES,
GET_METRIC_AGGREGATE,
GET_METRIC_BREAKDOWN,
GET_METRIC_TIME_SERIES,
GET_METRIC_PERCENTILES,
GET_METRIC_NAMES,
GET_METRIC_LABEL_KEYS,
GET_METRIC_LABEL_VALUES,
GET_ENTITY_TYPES,
GET_ENTITY_NAMES,
GET_SERVICE_NAMES,
GET_ENVIRONMENTS,
GET_TAGS
];
// src/server/server-adapter/routes/processor-providers.ts
var PROCESSOR_PROVIDER_ROUTES = [LIST_PROCESSOR_PROVIDERS_ROUTE, GET_PROCESSOR_PROVIDER_ROUTE];
// src/server/server-adapter/routes/processors.ts
var PROCESSORS_ROUTES = [LIST_PROCESSORS_ROUTE, GET_PROCESSOR_BY_ID_ROUTE, EXECUTE_PROCESSOR_ROUTE];
// src/server/server-adapter/routes/responses.ts
var RESPONSES_ROUTES = [CREATE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE];
// src/server/server-adapter/routes/schedules.ts
var SCHEDULES_ROUTES = [
LIST_SCHEDULES_ROUTE,
GET_SCHEDULE_ROUTE,
LIST_SCHEDULE_TRIGGERS_ROUTE,
PAUSE_SCHEDULE_ROUTE,
RESUME_SCHEDULE_ROUTE
];
// src/server/server-adapter/routes/scorers.ts
var SCORES_ROUTES = [
LIST_SCORERS_ROUTE,
GET_SCORER_ROUTE,
LIST_SCORES_BY_RUN_ID_ROUTE,
LIST_SCORES_BY_SCORER_ID_ROUTE,
LIST_SCORES_BY_ENTITY_ID_ROUTE,
SAVE_SCORE_ROUTE
];
// src/server/server-adapter/routes/stored-agents.ts
var STORED_AGENTS_ROUTES = [
// ============================================================================
// Stored Agents CRUD Routes
// IMPORTANT: Routes with literal paths (e.g., /preview-instructions) must come
// BEFORE routes with path parameters (e.g., /:storedAgentId) to ensure correct matching.
// ============================================================================
LIST_STORED_AGENTS_ROUTE,
PREVIEW_INSTRUCTIONS_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
GET_STORED_AGENT_DEPENDENTS_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE (longer literal)
EXPORT_STORED_AGENT_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
GET_STORED_AGENT_ROUTE,
CREATE_STORED_AGENT_ROUTE,
UPDATE_STORED_AGENT_ROUTE,
DELETE_STORED_AGENT_ROUTE,
// ============================================================================
// Agent Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
// ============================================================================
LIST_AGENT_VERSIONS_ROUTE,
CREATE_AGENT_VERSION_ROUTE,
COMPARE_AGENT_VERSIONS_ROUTE,
// Must be before GET_AGENT_VERSION_ROUTE
GET_AGENT_VERSION_ROUTE,
ACTIVATE_AGENT_VERSION_ROUTE,
RESTORE_AGENT_VERSION_ROUTE,
DELETE_AGENT_VERSION_ROUTE,
// ============================================================================
// Favorites (EE)
// ============================================================================
FAVORITE_STORED_AGENT_ROUTE,
UNFAVORITE_STORED_AGENT_ROUTE
];
// src/server/server-adapter/routes/stored-mcp-clients.ts
var STORED_MCP_CLIENTS_ROUTES = [
// Stored MCP Clients CRUD Routes
LIST_STORED_MCP_CLIENTS_ROUTE,
GET_STORED_MCP_CLIENT_ROUTE,
CREATE_STORED_MCP_CLIENT_ROUTE,
UPDATE_STORED_MCP_CLIENT_ROUTE,
DELETE_STORED_MCP_CLIENT_ROUTE,
// MCP Client Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
LIST_MCP_CLIENT_VERSIONS_ROUTE,
CREATE_MCP_CLIENT_VERSION_ROUTE,
COMPARE_MCP_CLIENT_VERSIONS_ROUTE,
GET_MCP_CLIENT_VERSION_ROUTE,
ACTIVATE_MCP_CLIENT_VERSION_ROUTE,
RESTORE_MCP_CLIENT_VERSION_ROUTE,
DELETE_MCP_CLIENT_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-prompt-blocks.ts
var STORED_PROMPT_BLOCKS_ROUTES = [
// Stored Prompt Blocks CRUD Routes
LIST_STORED_PROMPT_BLOCKS_ROUTE,
GET_STORED_PROMPT_BLOCK_ROUTE,
CREATE_STORED_PROMPT_BLOCK_ROUTE,
UPDATE_STORED_PROMPT_BLOCK_ROUTE,
DELETE_STORED_PROMPT_BLOCK_ROUTE,
// Prompt Block Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
LIST_PROMPT_BLOCK_VERSIONS_ROUTE,
CREATE_PROMPT_BLOCK_VERSION_ROUTE,
COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE,
GET_PROMPT_BLOCK_VERSION_ROUTE,
ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE,
RESTORE_PROMPT_BLOCK_VERSION_ROUTE,
DELETE_PROMPT_BLOCK_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-scorers.ts
var STORED_SCORERS_ROUTES = [
// Stored Scorers CRUD Routes
LIST_STORED_SCORERS_ROUTE,
GET_STORED_SCORER_ROUTE,
CREATE_STORED_SCORER_ROUTE,
UPDATE_STORED_SCORER_ROUTE,
DELETE_STORED_SCORER_ROUTE,
// Scorer Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
LIST_SCORER_VERSIONS_ROUTE,
CREATE_SCORER_VERSION_ROUTE,
COMPARE_SCORER_VERSIONS_ROUTE,
GET_SCORER_VERSION_ROUTE,
ACTIVATE_SCORER_VERSION_ROUTE,
RESTORE_SCORER_VERSION_ROUTE,
DELETE_SCORER_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-skills.ts
var STORED_SKILLS_ROUTES = [
// Stored Skills CRUD Routes
LIST_STORED_SKILLS_ROUTE,
GET_STORED_SKILL_ROUTE,
CREATE_STORED_SKILL_ROUTE,
UPDATE_STORED_SKILL_ROUTE,
DELETE_STORED_SKILL_ROUTE,
// Publish
PUBLISH_STORED_SKILL_ROUTE,
// Favorites (EE)
FAVORITE_STORED_SKILL_ROUTE,
UNFAVORITE_STORED_SKILL_ROUTE
];
// src/server/server-adapter/routes/stored-workspaces.ts
var STORED_WORKSPACES_ROUTES = [
// Stored Workspaces CRUD Routes
LIST_STORED_WORKSPACES_ROUTE,
GET_STORED_WORKSPACE_ROUTE,
CREATE_STORED_WORKSPACE_ROUTE,
UPDATE_STORED_WORKSPACE_ROUTE,
DELETE_STORED_WORKSPACE_ROUTE
];
// src/server/server-adapter/routes/system.ts
var SYSTEM_ROUTES = [GET_SYSTEM_PACKAGES_ROUTE, GET_API_SCHEMA_ROUTE];
// src/server/server-adapter/routes/tool-providers.ts
var TOOL_PROVIDER_ROUTES = [
LIST_TOOL_PROVIDERS_ROUTE,
LIST_TOOL_PROVIDER_TOOLKITS_ROUTE,
LIST_TOOL_PROVIDER_TOOLS_ROUTE,
GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE,
AUTHORIZE_TOOL_PROVIDER_ROUTE,
GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE,
TOOL_PROVIDER_CONNECTION_STATUS_ROUTE,
LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE,
LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE,
DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE,
UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE,
GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE,
GET_TOOL_PROVIDER_HEALTH_ROUTE
];
// src/server/server-adapter/routes/tools.ts
var TOOLS_ROUTES = [LIST_TOOLS_ROUTE, GET_TOOL_BY_ID_ROUTE, EXECUTE_TOOL_ROUTE];
// src/server/server-adapter/routes/vectors.ts
var VECTORS_ROUTES = [
UPSERT_VECTORS_ROUTE,
CREATE_INDEX_ROUTE,
QUERY_VECTORS_ROUTE,
LIST_INDEXES_ROUTE,
DESCRIBE_INDEX_ROUTE,
DELETE_INDEX_ROUTE,
LIST_VECTORS_ROUTE,
LIST_EMBEDDERS_ROUTE
];
// src/server/server-adapter/routes/workflows.ts
var WORKFLOWS_ROUTES = [
LIST_WORKFLOWS_ROUTE,
GET_WORKFLOW_BY_ID_ROUTE,
LIST_WORKFLOW_RUNS_ROUTE,
GET_WORKFLOW_RUN_BY_ID_ROUTE,
DELETE_WORKFLOW_RUN_BY_ID_ROUTE,
CREATE_WORKFLOW_RUN_ROUTE,
STREAM_WORKFLOW_ROUTE,
RESUME_STREAM_WORKFLOW_ROUTE,
START_ASYNC_WORKFLOW_ROUTE,
START_WORKFLOW_RUN_ROUTE,
OBSERVE_STREAM_WORKFLOW_ROUTE,
RESUME_ASYNC_WORKFLOW_ROUTE,
RESUME_NO_WAIT_WORKFLOW_ROUTE,
RESUME_WORKFLOW_ROUTE,
CANCEL_WORKFLOW_RUN_ROUTE,
TIME_TRAVEL_WORKFLOW_ROUTE,
TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,
TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,
RESTART_WORKFLOW_ROUTE,
RESTART_ASYNC_WORKFLOW_ROUTE,
RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE,
RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE,
EXECUTE_WORKFLOW_STEP_ROUTE,
RECEIVE_WORKFLOW_EVENT_ROUTE
];
// src/server/server-adapter/routes/workspace.ts
var WORKSPACE_ROUTES = [
// List all workspaces route (at /api/workspaces)
LIST_WORKSPACES_ROUTE,
// Get workspace route (at /api/workspaces/:workspaceId)
GET_WORKSPACE_ROUTE,
// Filesystem routes (at /api/workspaces/:workspaceId/fs/*)
...WORKSPACE_FS_ROUTES,
// Search routes (at /api/workspaces/:workspaceId/search, /api/workspaces/:workspaceId/index)
...WORKSPACE_SEARCH_ROUTES,
// Skills routes (search must come before parameterized routes)
...WORKSPACE_SKILLS_ROUTES,
// skills.sh proxy routes (at /api/workspaces/:workspaceId/skills-sh/*)
...WORKSPACE_SKILLS_SH_ROUTES
];
// src/server/server-adapter/routes/index.ts
var SERVER_ROUTES = [
...AGENTS_ROUTES,
...AUTH_ROUTES,
...WORKFLOWS_ROUTES,
...TOOLS_ROUTES,
...PROCESSORS_ROUTES,
...RESPONSES_ROUTES,
...CONVERSATIONS_ROUTES,
...MEMORY_ROUTES,
...SCORES_ROUTES,
...OBSERVABILITY_ROUTES,
...LOGS_ROUTES,
...VECTORS_ROUTES,
...A2A_ROUTES,
...WORKSPACE_ROUTES,
...LEGACY_ROUTES,
...MCP_ROUTES,
...STORED_AGENTS_ROUTES,
...STORED_MCP_CLIENTS_ROUTES,
...STORED_PROMPT_BLOCKS_ROUTES,
...STORED_SCORERS_ROUTES,
...STORED_WORKSPACES_ROUTES,
...STORED_SKILLS_ROUTES,
...TOOL_PROVIDER_ROUTES,
...PROCESSOR_PROVIDER_ROUTES,
...SYSTEM_ROUTES,
...DATASETS_ROUTES,
...BACKGROUND_TASK_ROUTES,
...EDITOR_BUILDER_ROUTES,
...AGENT_BUILDER_ROUTES,
...SCHEDULES_ROUTES,
...CHANNELS_ROUTES,
...HARNESS_ROUTES
];
export { SERVER_ROUTES, deriveAction, derivePermission, extractResource, getEffectivePermission };
//# sourceMappingURL=chunk-FYBFIW5N.js.map
//# sourceMappingURL=chunk-FYBFIW5N.js.map
{"version":3,"sources":["../src/server/server-adapter/routes/permissions.ts","../src/server/server-adapter/routes/a2a.ts","../src/server/server-adapter/routes/agent-builder.ts","../src/server/server-adapter/routes/agents.ts","../src/server/server-adapter/routes/background-tasks.ts","../src/server/server-adapter/routes/channels.ts","../src/server/server-adapter/routes/conversations.ts","../src/server/server-adapter/routes/datasets.ts","../src/server/server-adapter/routes/editor-builder.ts","../src/server/server-adapter/routes/harness.ts","../src/server/server-adapter/routes/legacy.ts","../src/server/server-adapter/routes/logs.ts","../src/server/server-adapter/routes/mcp.ts","../src/server/server-adapter/routes/memory.ts","../src/server/server-adapter/routes/observability.ts","../src/server/server-adapter/routes/processor-providers.ts","../src/server/server-adapter/routes/processors.ts","../src/server/server-adapter/routes/responses.ts","../src/server/server-adapter/routes/schedules.ts","../src/server/server-adapter/routes/scorers.ts","../src/server/server-adapter/routes/stored-agents.ts","../src/server/server-adapter/routes/stored-mcp-clients.ts","../src/server/server-adapter/routes/stored-prompt-blocks.ts","../src/server/server-adapter/routes/stored-scorers.ts","../src/server/server-adapter/routes/stored-skills.ts","../src/server/server-adapter/routes/stored-workspaces.ts","../src/server/server-adapter/routes/system.ts","../src/server/server-adapter/routes/tool-providers.ts","../src/server/server-adapter/routes/tools.ts","../src/server/server-adapter/routes/vectors.ts","../src/server/server-adapter/routes/workflows.ts","../src/server/server-adapter/routes/workspace.ts","../src/server/server-adapter/routes/index.ts"],"names":[],"mappings":"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","file":"chunk-FYBFIW5N.js","sourcesContent":["/**\n * Permission derivation utilities for automatic route permission assignment.\n *\n * This module provides convention-based permission derivation from route paths and methods,\n * reducing the need to manually specify permissions on each route.\n *\n * Convention: `{resource}:{action}`\n * - resource: First path segment after common prefixes (e.g., 'agents', 'workflows', 'memory')\n * - action: Derived from HTTP method (GET→read, POST→write/execute, DELETE→delete, etc.)\n */\n\nimport type { ServerRoute } from './index';\n\n/**\n * Map HTTP methods to permission actions.\n * POST is context-dependent (write for data, execute for operations).\n */\nconst METHOD_TO_ACTION: Record<string, string> = {\n GET: 'read',\n POST: 'write', // Default for POST, may be overridden to 'execute'\n PUT: 'write',\n PATCH: 'write',\n DELETE: 'delete',\n};\n\n/**\n * Path patterns that indicate an \"execute\" action rather than \"write\" for POST requests.\n * These are typically operation endpoints rather than data creation endpoints.\n */\nconst EXECUTE_PATTERNS = [\n '/generate',\n '/stream',\n '/execute',\n '/start',\n '/resume',\n '/restart',\n '/cancel',\n '/approve',\n '/decline',\n '/speak',\n '/listen',\n '/query',\n '/search',\n '/observe',\n '/time-travel',\n '/enhance',\n '/clone',\n];\n\nconst PUBLISH_PATTERNS = ['/publish', '/activate', '/restore'];\n\n/**\n * Maps `/stored/<family>` URL segments to canonical permission resource slugs.\n */\nconst STORED_RESOURCE_SEGMENTS: Record<string, string> = {\n agents: 'stored-agents',\n 'mcp-clients': 'stored-mcp-clients',\n 'prompt-blocks': 'stored-prompt-blocks',\n scorers: 'stored-scorers',\n skills: 'stored-skills',\n workspaces: 'stored-workspaces',\n};\n\n/**\n * Extracts the primary resource name from a route path.\n *\n * The resource is derived from the first path segment, with special handling\n * for compound resources and well-known paths.\n *\n * Note: The canonical list of resources is generated in permissions.generated.ts\n * from SERVER_ROUTES via `pnpm generate:permissions`.\n *\n * @param path - The route path (e.g., '/agents/:agentId/generate')\n * @returns The resource name (e.g., 'agents') or null if not identifiable\n *\n * @example\n * extractResource('/agents/:agentId') // → 'agents'\n * extractResource('/memory/threads/:threadId') // → 'memory'\n * extractResource('/stored/agents/:agentId') // → 'stored-agents'\n * extractResource('/stored/skills/:skillId') // → 'stored-skills'\n */\nexport function extractResource(path: string): string | null {\n // Remove leading slash and split by segments\n const segments = path.replace(/^\\//, '').split('/');\n\n if (segments.length === 0) {\n return null;\n }\n\n const firstSegment = segments[0];\n\n // Handle special case: /stored/<family> → 'stored-<family>' (or mapped slug).\n // Uses exact segment match (not startsWith) so paths like /stored/skills-archive\n // don't incorrectly collapse into a stored family.\n if (firstSegment === 'stored' && segments[1]) {\n return STORED_RESOURCE_SEGMENTS[segments[1]] ?? null;\n }\n\n // Handle .well-known paths (A2A protocol)\n if (firstSegment === '.well-known') {\n return 'a2a';\n }\n\n return firstSegment || null;\n}\n\n/**\n * Determines the action based on HTTP method and path context.\n *\n * @param method - HTTP method (GET, POST, PUT, DELETE, etc.)\n * @param path - The route path for context\n * @returns The action string (read, write, execute, delete)\n */\nexport function deriveAction(method: string, path: string): string {\n const upperMethod = method.toUpperCase();\n\n // For POST requests, check if it's a publish, execute, or write operation.\n // Publish takes precedence over execute since these suffixes are distinct\n // version-lifecycle operations on stored resources. Restrict publish-suffix\n // matching to /stored/* paths so unrelated routes that happen to end with\n // /activate or /restore aren't accidentally classified as publish.\n if (upperMethod === 'POST') {\n // Restrict publish-suffix matching to /stored/* paths so unrelated routes\n // that happen to end with /activate or /restore aren't accidentally\n // classified as publish.\n if (path.startsWith('/stored/')) {\n const isPublishOperation = PUBLISH_PATTERNS.some(pattern => path.endsWith(pattern));\n if (isPublishOperation) {\n return 'publish';\n }\n }\n const isExecuteOperation = EXECUTE_PATTERNS.some(pattern => path.includes(pattern));\n return isExecuteOperation ? 'execute' : 'write';\n }\n\n return METHOD_TO_ACTION[upperMethod] || 'read';\n}\n\n/**\n * Derives a permission string from a route's path and method.\n *\n * Uses convention: `{resource}:{action}`\n *\n * @param route - The server route to derive permission for\n * @returns The derived permission string, or null if cannot be derived\n *\n * @example\n * derivePermission({ path: '/agents', method: 'GET' }) // → 'agents:read'\n * derivePermission({ path: '/agents/:id/generate', method: 'POST' }) // → 'agents:execute'\n * derivePermission({ path: '/workflows/:id', method: 'DELETE' }) // → 'workflows:delete'\n */\nexport function derivePermission(route: Pick<ServerRoute, 'path' | 'method'>): string | null {\n // Skip for ALL method (typically MCP transports)\n if (route.method === 'ALL') {\n return null;\n }\n\n const resource = extractResource(route.path);\n if (!resource) {\n return null;\n }\n\n const action = deriveAction(route.method, route.path);\n\n return `${resource}:${action}`;\n}\n\n/**\n * Gets the effective permission for a route.\n *\n * Priority:\n * 1. Explicit requiresPermission on the route (string or string[])\n * 2. Derived permission from path/method convention\n * 3. null (no permission required - should only happen for public routes)\n *\n * When the route specifies an array of permissions, the user needs ANY ONE\n * of them (logical OR). This is useful for routes that serve multiple\n * resource types.\n *\n * @param route - The server route\n * @returns The permission string, array of alternative permissions, or null\n */\nexport function getEffectivePermission(route: ServerRoute): string | string[] | null {\n // If route is explicitly public, no permission needed\n if (route.requiresAuth === false) {\n return null;\n }\n\n // Use explicit permission if set\n if (route.requiresPermission) {\n return route.requiresPermission;\n }\n\n // Derive permission from convention\n return derivePermission(route);\n}\n","import { GET_AGENT_CARD_ROUTE, AGENT_EXECUTION_ROUTE } from '../../handlers/a2a';\n\nexport const A2A_ROUTES = [GET_AGENT_CARD_ROUTE, AGENT_EXECUTION_ROUTE] as const;\n","import {\n LIST_AGENT_BUILDER_ACTIONS_ROUTE,\n GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE,\n LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE,\n GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE,\n CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE,\n STREAM_AGENT_BUILDER_ACTION_ROUTE,\n STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,\n START_ASYNC_AGENT_BUILDER_ACTION_ROUTE,\n START_AGENT_BUILDER_ACTION_RUN_ROUTE,\n OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE,\n OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE,\n CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE,\n} from '../../handlers/agent-builder';\n\nexport const AGENT_BUILDER_ROUTES = [\n LIST_AGENT_BUILDER_ACTIONS_ROUTE,\n GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE,\n LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE,\n GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE,\n CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE,\n STREAM_AGENT_BUILDER_ACTION_ROUTE,\n STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,\n START_ASYNC_AGENT_BUILDER_ACTION_ROUTE,\n START_AGENT_BUILDER_ACTION_RUN_ROUTE,\n OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE,\n OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE,\n CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE,\n] as const;\n","import {\n // Agent route objects\n LIST_AGENTS_ROUTE,\n GET_AGENT_BY_ID_ROUTE,\n CLONE_AGENT_ROUTE,\n GENERATE_AGENT_ROUTE,\n GENERATE_AGENT_VNEXT_ROUTE,\n STREAM_GENERATE_ROUTE,\n STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,\n OBSERVE_AGENT_STREAM_ROUTE,\n SEND_AGENT_MESSAGE_ROUTE,\n QUEUE_AGENT_MESSAGE_ROUTE,\n SEND_AGENT_SIGNAL_ROUTE,\n ABORT_AGENT_THREAD_ROUTE,\n SUBSCRIBE_AGENT_THREAD_ROUTE,\n GET_PROVIDERS_ROUTE,\n APPROVE_TOOL_CALL_ROUTE,\n SEND_TOOL_APPROVAL_ROUTE,\n DECLINE_TOOL_CALL_ROUTE,\n RESUME_STREAM_ROUTE,\n APPROVE_TOOL_CALL_GENERATE_ROUTE,\n DECLINE_TOOL_CALL_GENERATE_ROUTE,\n STREAM_NETWORK_ROUTE,\n UPDATE_AGENT_MODEL_ROUTE,\n RESET_AGENT_MODEL_ROUTE,\n REORDER_AGENT_MODEL_LIST_ROUTE,\n UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,\n ENHANCE_INSTRUCTIONS_ROUTE,\n STREAM_VNEXT_DEPRECATED_ROUTE,\n STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,\n STREAM_UI_MESSAGE_DEPRECATED_ROUTE,\n APPROVE_NETWORK_TOOL_CALL_ROUTE,\n DECLINE_NETWORK_TOOL_CALL_ROUTE,\n GET_AGENT_SKILL_ROUTE,\n STREAM_UNTIL_IDLE_GENERATE_ROUTE,\n RESUME_STREAM_UNTIL_IDLE_ROUTE,\n} from '../../handlers/agents';\nimport { GET_AGENT_TOOL_ROUTE, EXECUTE_AGENT_TOOL_ROUTE } from '../../handlers/tools';\nimport {\n GET_SPEAKERS_ROUTE,\n GET_SPEAKERS_DEPRECATED_ROUTE,\n GENERATE_SPEECH_ROUTE,\n GENERATE_SPEECH_DEPRECATED_ROUTE,\n TRANSCRIBE_SPEECH_ROUTE,\n TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,\n GET_LISTENER_ROUTE,\n} from '../../handlers/voice';\nimport type { ServerRoute } from '.';\n\nexport const AGENTS_ROUTES: readonly ServerRoute[] = [\n // ============================================================================\n // Agent Core Routes\n // ============================================================================\n LIST_AGENTS_ROUTE,\n GET_PROVIDERS_ROUTE,\n GET_AGENT_BY_ID_ROUTE,\n CLONE_AGENT_ROUTE,\n\n // ============================================================================\n // Voice Routes\n // ============================================================================\n GET_SPEAKERS_ROUTE,\n GET_SPEAKERS_DEPRECATED_ROUTE,\n\n // ============================================================================\n // Agent Execution Routes\n // ============================================================================\n GENERATE_AGENT_ROUTE,\n GENERATE_AGENT_VNEXT_ROUTE,\n STREAM_GENERATE_ROUTE,\n STREAM_UNTIL_IDLE_GENERATE_ROUTE,\n STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,\n\n // ============================================================================\n // Resumable Stream Routes\n // ============================================================================\n OBSERVE_AGENT_STREAM_ROUTE,\n SEND_AGENT_MESSAGE_ROUTE,\n QUEUE_AGENT_MESSAGE_ROUTE,\n SEND_AGENT_SIGNAL_ROUTE,\n ABORT_AGENT_THREAD_ROUTE,\n SUBSCRIBE_AGENT_THREAD_ROUTE,\n\n // ============================================================================\n // Tool Routes\n // ============================================================================\n EXECUTE_AGENT_TOOL_ROUTE,\n APPROVE_TOOL_CALL_ROUTE,\n SEND_TOOL_APPROVAL_ROUTE,\n DECLINE_TOOL_CALL_ROUTE,\n RESUME_STREAM_ROUTE,\n APPROVE_TOOL_CALL_GENERATE_ROUTE,\n DECLINE_TOOL_CALL_GENERATE_ROUTE,\n APPROVE_NETWORK_TOOL_CALL_ROUTE,\n DECLINE_NETWORK_TOOL_CALL_ROUTE,\n RESUME_STREAM_UNTIL_IDLE_ROUTE,\n\n // ============================================================================\n // Network Routes\n // ============================================================================\n STREAM_NETWORK_ROUTE,\n\n // ============================================================================\n // Model Management Routes\n // ============================================================================\n UPDATE_AGENT_MODEL_ROUTE,\n RESET_AGENT_MODEL_ROUTE,\n REORDER_AGENT_MODEL_LIST_ROUTE,\n UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,\n\n // ============================================================================\n // Instruction Enhancement Routes\n // ============================================================================\n ENHANCE_INSTRUCTIONS_ROUTE,\n\n // ============================================================================\n // Agent Tool Routes\n // ============================================================================\n GET_AGENT_TOOL_ROUTE,\n\n // ============================================================================\n // Agent Skill Routes\n // ============================================================================\n GET_AGENT_SKILL_ROUTE,\n\n // ============================================================================\n // Voice/Speech Routes\n // ============================================================================\n GENERATE_SPEECH_ROUTE,\n GENERATE_SPEECH_DEPRECATED_ROUTE,\n TRANSCRIBE_SPEECH_ROUTE,\n TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,\n GET_LISTENER_ROUTE,\n\n // ============================================================================\n // Deprecated Routes\n // ============================================================================\n STREAM_VNEXT_DEPRECATED_ROUTE,\n STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,\n STREAM_UI_MESSAGE_DEPRECATED_ROUTE,\n];\n\n/**\n * Type-level tuple preserving each agent route's specific schema types.\n * Used by ServerRoutes to build the type-level route map.\n */\nexport type AgentRoutes = readonly [\n typeof LIST_AGENTS_ROUTE,\n typeof GET_PROVIDERS_ROUTE,\n typeof GET_AGENT_BY_ID_ROUTE,\n typeof CLONE_AGENT_ROUTE,\n typeof GET_SPEAKERS_ROUTE,\n typeof GET_SPEAKERS_DEPRECATED_ROUTE,\n typeof GENERATE_AGENT_ROUTE,\n typeof GENERATE_AGENT_VNEXT_ROUTE,\n typeof STREAM_GENERATE_ROUTE,\n typeof STREAM_UNTIL_IDLE_GENERATE_ROUTE,\n typeof STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,\n typeof SEND_AGENT_MESSAGE_ROUTE,\n typeof QUEUE_AGENT_MESSAGE_ROUTE,\n typeof SEND_AGENT_SIGNAL_ROUTE,\n typeof ABORT_AGENT_THREAD_ROUTE,\n typeof SUBSCRIBE_AGENT_THREAD_ROUTE,\n typeof EXECUTE_AGENT_TOOL_ROUTE,\n typeof APPROVE_TOOL_CALL_ROUTE,\n typeof SEND_TOOL_APPROVAL_ROUTE,\n typeof DECLINE_TOOL_CALL_ROUTE,\n typeof RESUME_STREAM_ROUTE,\n typeof RESUME_STREAM_UNTIL_IDLE_ROUTE,\n typeof APPROVE_TOOL_CALL_GENERATE_ROUTE,\n typeof DECLINE_TOOL_CALL_GENERATE_ROUTE,\n typeof APPROVE_NETWORK_TOOL_CALL_ROUTE,\n typeof DECLINE_NETWORK_TOOL_CALL_ROUTE,\n typeof STREAM_NETWORK_ROUTE,\n typeof UPDATE_AGENT_MODEL_ROUTE,\n typeof RESET_AGENT_MODEL_ROUTE,\n typeof REORDER_AGENT_MODEL_LIST_ROUTE,\n typeof UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,\n typeof ENHANCE_INSTRUCTIONS_ROUTE,\n typeof GET_AGENT_TOOL_ROUTE,\n typeof GET_AGENT_SKILL_ROUTE,\n typeof GENERATE_SPEECH_ROUTE,\n typeof GENERATE_SPEECH_DEPRECATED_ROUTE,\n typeof TRANSCRIBE_SPEECH_ROUTE,\n typeof TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,\n typeof GET_LISTENER_ROUTE,\n typeof STREAM_VNEXT_DEPRECATED_ROUTE,\n typeof STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,\n typeof STREAM_UI_MESSAGE_DEPRECATED_ROUTE,\n];\n","import {\n BACKGROUND_TASK_STREAM_ROUTE,\n GET_BACKGROUND_TASK_ROUTE,\n LIST_BACKGROUND_TASKS_ROUTE,\n} from '../../handlers/background-tasks';\nimport type { ServerRoute } from '.';\n\nexport const BACKGROUND_TASK_ROUTES: ServerRoute<any, any, any>[] = [\n BACKGROUND_TASK_STREAM_ROUTE,\n LIST_BACKGROUND_TASKS_ROUTE,\n GET_BACKGROUND_TASK_ROUTE,\n];\n","import {\n LIST_CHANNEL_PLATFORMS_ROUTE,\n LIST_CHANNEL_INSTALLATIONS_ROUTE,\n CONNECT_CHANNEL_ROUTE,\n DISCONNECT_CHANNEL_ROUTE,\n} from '../../handlers/channels';\n\nexport const CHANNELS_ROUTES = [\n LIST_CHANNEL_PLATFORMS_ROUTE,\n LIST_CHANNEL_INSTALLATIONS_ROUTE,\n CONNECT_CHANNEL_ROUTE,\n DISCONNECT_CHANNEL_ROUTE,\n] as const;\n","import {\n CREATE_CONVERSATION_ROUTE,\n DELETE_CONVERSATION_ROUTE,\n GET_CONVERSATION_ITEMS_ROUTE,\n GET_CONVERSATION_ROUTE,\n} from '../../handlers/conversations';\n\nexport const CONVERSATIONS_ROUTES = [\n CREATE_CONVERSATION_ROUTE,\n GET_CONVERSATION_ROUTE,\n GET_CONVERSATION_ITEMS_ROUTE,\n DELETE_CONVERSATION_ROUTE,\n] as const;\n","import {\n LIST_DATASETS_ROUTE,\n CREATE_DATASET_ROUTE,\n GET_DATASET_ROUTE,\n UPDATE_DATASET_ROUTE,\n DELETE_DATASET_ROUTE,\n LIST_ITEMS_ROUTE,\n ADD_ITEM_ROUTE,\n GET_ITEM_ROUTE,\n UPDATE_ITEM_ROUTE,\n DELETE_ITEM_ROUTE,\n LIST_ALL_EXPERIMENTS_ROUTE,\n EXPERIMENT_REVIEW_SUMMARY_ROUTE,\n LIST_EXPERIMENTS_ROUTE,\n TRIGGER_EXPERIMENT_ROUTE,\n GET_EXPERIMENT_ROUTE,\n LIST_EXPERIMENT_RESULTS_ROUTE,\n UPDATE_EXPERIMENT_RESULT_ROUTE,\n COMPARE_EXPERIMENTS_ROUTE,\n LIST_DATASET_VERSIONS_ROUTE,\n LIST_ITEM_VERSIONS_ROUTE,\n GET_ITEM_VERSION_ROUTE,\n BATCH_INSERT_ITEMS_ROUTE,\n BATCH_DELETE_ITEMS_ROUTE,\n GENERATE_ITEMS_ROUTE,\n CLUSTER_FAILURES_ROUTE,\n} from '../../handlers/datasets';\n\nexport const DATASETS_ROUTES = [\n // Dataset CRUD\n LIST_DATASETS_ROUTE,\n CREATE_DATASET_ROUTE,\n GET_DATASET_ROUTE,\n UPDATE_DATASET_ROUTE,\n DELETE_DATASET_ROUTE,\n // Item list and add\n LIST_ITEMS_ROUTE,\n ADD_ITEM_ROUTE,\n // Batch operations - MUST come before item-specific routes to avoid /items/batch matching /items/:itemId\n BATCH_INSERT_ITEMS_ROUTE,\n BATCH_DELETE_ITEMS_ROUTE,\n // Item-specific CRUD (uses :itemId param)\n GET_ITEM_ROUTE,\n UPDATE_ITEM_ROUTE,\n DELETE_ITEM_ROUTE,\n // Version operations\n LIST_DATASET_VERSIONS_ROUTE,\n LIST_ITEM_VERSIONS_ROUTE,\n GET_ITEM_VERSION_ROUTE,\n // All experiments (cross-dataset) - MUST come before dataset-scoped experiments\n LIST_ALL_EXPERIMENTS_ROUTE,\n // Experiment review summary (cross-dataset) - MUST come before dataset-scoped experiments\n EXPERIMENT_REVIEW_SUMMARY_ROUTE,\n // Experiment operations (dataset-scoped)\n LIST_EXPERIMENTS_ROUTE,\n TRIGGER_EXPERIMENT_ROUTE,\n GET_EXPERIMENT_ROUTE,\n LIST_EXPERIMENT_RESULTS_ROUTE,\n UPDATE_EXPERIMENT_RESULT_ROUTE,\n // Analytics\n COMPARE_EXPERIMENTS_ROUTE,\n // AI generation\n GENERATE_ITEMS_ROUTE,\n // Failure analysis\n CLUSTER_FAILURES_ROUTE,\n] as const;\n","import {\n BUILDER_REGISTRY_INSTALL_ROUTE,\n BUILDER_REGISTRY_POPULAR_ROUTE,\n BUILDER_REGISTRY_PREVIEW_ROUTE,\n BUILDER_REGISTRY_SEARCH_ROUTE,\n LIST_BUILDER_REGISTRIES_ROUTE,\n} from '../../handlers/builder-registry';\nimport {\n GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE,\n GET_EDITOR_BUILDER_SETTINGS_ROUTE,\n GET_INFRASTRUCTURE_STATUS_ROUTE,\n} from '../../handlers/editor-builder';\n\n/**\n * Editor Builder Routes\n *\n * Routes for agent builder settings, infrastructure status, and external\n * skill registries.\n */\nexport const EDITOR_BUILDER_ROUTES = [\n GET_EDITOR_BUILDER_SETTINGS_ROUTE,\n GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE,\n GET_INFRASTRUCTURE_STATUS_ROUTE,\n LIST_BUILDER_REGISTRIES_ROUTE,\n BUILDER_REGISTRY_SEARCH_ROUTE,\n BUILDER_REGISTRY_POPULAR_ROUTE,\n BUILDER_REGISTRY_PREVIEW_ROUTE,\n BUILDER_REGISTRY_INSTALL_ROUTE,\n] as const;\n","import {\n LIST_HARNESSES_ROUTE,\n CREATE_HARNESS_SESSION_ROUTE,\n GET_HARNESS_SESSION_STATE_ROUTE,\n STREAM_HARNESS_SESSION_ROUTE,\n SEND_HARNESS_MESSAGE_ROUTE,\n STEER_HARNESS_SESSION_ROUTE,\n ABORT_HARNESS_SESSION_ROUTE,\n HARNESS_TOOL_APPROVAL_ROUTE,\n HARNESS_TOOL_SUSPENSION_ROUTE,\n SWITCH_HARNESS_MODE_ROUTE,\n SWITCH_HARNESS_MODEL_ROUTE,\n SWITCH_HARNESS_THREAD_ROUTE,\n LIST_HARNESS_MODES_ROUTE,\n LIST_HARNESS_THREADS_ROUTE,\n SEND_HARNESS_NOTIFICATION_ROUTE,\n CREATE_HARNESS_THREAD_ROUTE,\n DELETE_HARNESS_THREAD_ROUTE,\n RENAME_HARNESS_THREAD_ROUTE,\n CLONE_HARNESS_THREAD_ROUTE,\n LIST_HARNESS_THREAD_MESSAGES_ROUTE,\n FOLLOW_UP_HARNESS_SESSION_ROUTE,\n LIST_HARNESS_MODELS_ROUTE,\n GET_HARNESS_WORKSPACE_STATUS_ROUTE,\n GET_HARNESS_OM_RECORD_ROUTE,\n SET_HARNESS_RESOURCE_ID_ROUTE,\n GET_HARNESS_RESOURCE_IDS_ROUTE,\n GET_HARNESS_GOAL_ROUTE,\n SET_HARNESS_GOAL_ROUTE,\n UPDATE_HARNESS_GOAL_ROUTE,\n CLEAR_HARNESS_GOAL_ROUTE,\n GET_HARNESS_PERMISSIONS_ROUTE,\n SET_HARNESS_CATEGORY_PERMISSION_ROUTE,\n SET_HARNESS_TOOL_PERMISSION_ROUTE,\n SET_HARNESS_SESSION_STATE_ROUTE,\n} from '../../handlers/harness';\nimport type { ServerRoute } from '.';\n\nexport const HARNESS_ROUTES: readonly ServerRoute[] = [\n LIST_HARNESSES_ROUTE,\n LIST_HARNESS_MODES_ROUTE,\n LIST_HARNESS_MODELS_ROUTE,\n CREATE_HARNESS_SESSION_ROUTE,\n GET_HARNESS_SESSION_STATE_ROUTE,\n LIST_HARNESS_THREADS_ROUTE,\n CREATE_HARNESS_THREAD_ROUTE,\n DELETE_HARNESS_THREAD_ROUTE,\n RENAME_HARNESS_THREAD_ROUTE,\n CLONE_HARNESS_THREAD_ROUTE,\n LIST_HARNESS_THREAD_MESSAGES_ROUTE,\n STREAM_HARNESS_SESSION_ROUTE,\n SEND_HARNESS_MESSAGE_ROUTE,\n STEER_HARNESS_SESSION_ROUTE,\n FOLLOW_UP_HARNESS_SESSION_ROUTE,\n ABORT_HARNESS_SESSION_ROUTE,\n HARNESS_TOOL_APPROVAL_ROUTE,\n HARNESS_TOOL_SUSPENSION_ROUTE,\n SWITCH_HARNESS_MODE_ROUTE,\n SWITCH_HARNESS_MODEL_ROUTE,\n SWITCH_HARNESS_THREAD_ROUTE,\n SEND_HARNESS_NOTIFICATION_ROUTE,\n GET_HARNESS_WORKSPACE_STATUS_ROUTE,\n GET_HARNESS_OM_RECORD_ROUTE,\n SET_HARNESS_RESOURCE_ID_ROUTE,\n GET_HARNESS_RESOURCE_IDS_ROUTE,\n GET_HARNESS_GOAL_ROUTE,\n SET_HARNESS_GOAL_ROUTE,\n UPDATE_HARNESS_GOAL_ROUTE,\n CLEAR_HARNESS_GOAL_ROUTE,\n GET_HARNESS_PERMISSIONS_ROUTE,\n SET_HARNESS_CATEGORY_PERMISSION_ROUTE,\n SET_HARNESS_TOOL_PERMISSION_ROUTE,\n SET_HARNESS_SESSION_STATE_ROUTE,\n];\n","/**\n * Legacy routes that are deprecated but still exist in deployer for backward compatibility.\n * These routes should not be used in new code and will be removed in a future version.\n */\n\nimport { GENERATE_LEGACY_ROUTE, STREAM_GENERATE_LEGACY_ROUTE } from '../../handlers/agents';\nimport { STREAM_LEGACY_WORKFLOW_ROUTE, OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE } from '../../handlers/workflows';\n\nexport const LEGACY_ROUTES = [\n // ============================================================================\n // Legacy Agent Routes\n // ============================================================================\n GENERATE_LEGACY_ROUTE,\n STREAM_GENERATE_LEGACY_ROUTE,\n\n // ============================================================================\n // Legacy Workflow Routes\n // ============================================================================\n STREAM_LEGACY_WORKFLOW_ROUTE,\n OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE,\n] as const;\n","import { LIST_LOG_TRANSPORTS_ROUTE, LIST_LOGS_ROUTE, LIST_LOGS_BY_RUN_ID_ROUTE } from '../../handlers/logs';\n\nexport const LOGS_ROUTES = [LIST_LOG_TRANSPORTS_ROUTE, LIST_LOGS_ROUTE, LIST_LOGS_BY_RUN_ID_ROUTE] as const;\n","import {\n LIST_MCP_SERVERS_ROUTE,\n GET_MCP_SERVER_DETAIL_ROUTE,\n LIST_MCP_SERVER_TOOLS_ROUTE,\n GET_MCP_SERVER_TOOL_DETAIL_ROUTE,\n EXECUTE_MCP_SERVER_TOOL_ROUTE,\n LIST_MCP_SERVER_RESOURCES_ROUTE,\n READ_MCP_SERVER_RESOURCE_ROUTE,\n MCP_HTTP_TRANSPORT_ROUTE,\n MCP_SSE_TRANSPORT_ROUTE,\n MCP_SSE_MESSAGES_ROUTE,\n} from '../../handlers/mcp';\n\n/**\n * MCP Routes\n *\n * Registry routes provide access to the MCP server registry and tools.\n * Transport routes handle the MCP protocol communication (HTTP and SSE).\n */\nexport const MCP_ROUTES = [\n // ============================================================================\n // MCP Server Registry Routes\n // ============================================================================\n LIST_MCP_SERVERS_ROUTE,\n GET_MCP_SERVER_DETAIL_ROUTE,\n\n // ============================================================================\n // MCP Server Tool Routes\n // ============================================================================\n LIST_MCP_SERVER_TOOLS_ROUTE,\n GET_MCP_SERVER_TOOL_DETAIL_ROUTE,\n EXECUTE_MCP_SERVER_TOOL_ROUTE,\n\n // ============================================================================\n // MCP Server Resource Routes\n // ============================================================================\n LIST_MCP_SERVER_RESOURCES_ROUTE,\n READ_MCP_SERVER_RESOURCE_ROUTE,\n\n // ============================================================================\n // MCP Transport Routes (handled by adapters)\n // ============================================================================\n MCP_HTTP_TRANSPORT_ROUTE,\n MCP_SSE_TRANSPORT_ROUTE,\n MCP_SSE_MESSAGES_ROUTE,\n] as const;\n","import {\n GET_MEMORY_STATUS_ROUTE,\n GET_MEMORY_CONFIG_ROUTE,\n GET_OBSERVATIONAL_MEMORY_ROUTE,\n AWAIT_BUFFER_STATUS_ROUTE,\n LIST_THREADS_ROUTE,\n GET_THREAD_BY_ID_ROUTE,\n LIST_MESSAGES_ROUTE,\n GET_WORKING_MEMORY_ROUTE,\n SAVE_MESSAGES_ROUTE,\n CREATE_THREAD_ROUTE,\n UPDATE_THREAD_ROUTE,\n DELETE_THREAD_ROUTE,\n CLONE_THREAD_ROUTE,\n UPDATE_WORKING_MEMORY_ROUTE,\n DELETE_MESSAGES_ROUTE,\n SEARCH_MEMORY_ROUTE,\n GET_MEMORY_STATUS_NETWORK_ROUTE,\n LIST_THREADS_NETWORK_ROUTE,\n GET_THREAD_BY_ID_NETWORK_ROUTE,\n LIST_MESSAGES_NETWORK_ROUTE,\n SAVE_MESSAGES_NETWORK_ROUTE,\n CREATE_THREAD_NETWORK_ROUTE,\n UPDATE_THREAD_NETWORK_ROUTE,\n DELETE_THREAD_NETWORK_ROUTE,\n DELETE_MESSAGES_NETWORK_ROUTE,\n} from '../../handlers/memory';\n\nexport const MEMORY_ROUTES = [\n GET_MEMORY_STATUS_ROUTE,\n GET_MEMORY_CONFIG_ROUTE,\n GET_OBSERVATIONAL_MEMORY_ROUTE,\n AWAIT_BUFFER_STATUS_ROUTE,\n LIST_THREADS_ROUTE,\n GET_THREAD_BY_ID_ROUTE,\n LIST_MESSAGES_ROUTE,\n GET_WORKING_MEMORY_ROUTE,\n SAVE_MESSAGES_ROUTE,\n CREATE_THREAD_ROUTE,\n UPDATE_THREAD_ROUTE,\n DELETE_THREAD_ROUTE,\n CLONE_THREAD_ROUTE,\n UPDATE_WORKING_MEMORY_ROUTE,\n DELETE_MESSAGES_ROUTE,\n SEARCH_MEMORY_ROUTE,\n GET_MEMORY_STATUS_NETWORK_ROUTE,\n LIST_THREADS_NETWORK_ROUTE,\n GET_THREAD_BY_ID_NETWORK_ROUTE,\n LIST_MESSAGES_NETWORK_ROUTE,\n SAVE_MESSAGES_NETWORK_ROUTE,\n CREATE_THREAD_NETWORK_ROUTE,\n UPDATE_THREAD_NETWORK_ROUTE,\n DELETE_THREAD_NETWORK_ROUTE,\n DELETE_MESSAGES_NETWORK_ROUTE,\n] as const;\n","import {\n LIST_TRACES_ROUTE,\n LIST_TRACES_LIGHT_ROUTE,\n LIST_BRANCHES_ROUTE,\n GET_BRANCH_ROUTE,\n GET_TRACE_ROUTE,\n GET_TRACE_LIGHT_ROUTE,\n GET_SPAN_ROUTE,\n GET_TRACE_TRAJECTORY_ROUTE,\n SCORE_TRACES_ROUTE,\n LIST_SCORES_BY_SPAN_ROUTE,\n} from '../../handlers/observability';\nimport {\n LIST_METRICS,\n LIST_LOGS,\n LIST_SCORES,\n CREATE_SCORE,\n GET_SCORE,\n GET_SCORE_AGGREGATE,\n GET_SCORE_BREAKDOWN,\n GET_SCORE_TIME_SERIES,\n GET_SCORE_PERCENTILES,\n LIST_FEEDBACK,\n CREATE_FEEDBACK,\n GET_FEEDBACK_AGGREGATE,\n GET_FEEDBACK_BREAKDOWN,\n GET_FEEDBACK_TIME_SERIES,\n GET_FEEDBACK_PERCENTILES,\n GET_METRIC_AGGREGATE,\n GET_METRIC_BREAKDOWN,\n GET_METRIC_TIME_SERIES,\n GET_METRIC_PERCENTILES,\n GET_METRIC_NAMES,\n GET_METRIC_LABEL_KEYS,\n GET_METRIC_LABEL_VALUES,\n GET_ENTITY_TYPES,\n GET_ENTITY_NAMES,\n GET_SERVICE_NAMES,\n GET_ENVIRONMENTS,\n GET_TAGS,\n} from '../../handlers/observability-new-endpoints';\n\nexport const OBSERVABILITY_ROUTES = [\n // Legacy\n LIST_TRACES_ROUTE,\n LIST_TRACES_LIGHT_ROUTE,\n LIST_BRANCHES_ROUTE,\n GET_BRANCH_ROUTE,\n GET_TRACE_ROUTE,\n GET_TRACE_LIGHT_ROUTE,\n GET_SPAN_ROUTE,\n GET_TRACE_TRAJECTORY_ROUTE,\n SCORE_TRACES_ROUTE,\n LIST_SCORES_BY_SPAN_ROUTE,\n // New observability routes\n LIST_METRICS,\n LIST_LOGS,\n LIST_SCORES,\n CREATE_SCORE,\n GET_SCORE,\n GET_SCORE_AGGREGATE,\n GET_SCORE_BREAKDOWN,\n GET_SCORE_TIME_SERIES,\n GET_SCORE_PERCENTILES,\n LIST_FEEDBACK,\n CREATE_FEEDBACK,\n GET_FEEDBACK_AGGREGATE,\n GET_FEEDBACK_BREAKDOWN,\n GET_FEEDBACK_TIME_SERIES,\n GET_FEEDBACK_PERCENTILES,\n GET_METRIC_AGGREGATE,\n GET_METRIC_BREAKDOWN,\n GET_METRIC_TIME_SERIES,\n GET_METRIC_PERCENTILES,\n GET_METRIC_NAMES,\n GET_METRIC_LABEL_KEYS,\n GET_METRIC_LABEL_VALUES,\n GET_ENTITY_TYPES,\n GET_ENTITY_NAMES,\n GET_SERVICE_NAMES,\n GET_ENVIRONMENTS,\n GET_TAGS,\n] as const;\n","import { LIST_PROCESSOR_PROVIDERS_ROUTE, GET_PROCESSOR_PROVIDER_ROUTE } from '../../handlers/processor-providers';\n\nexport const PROCESSOR_PROVIDER_ROUTES = [LIST_PROCESSOR_PROVIDERS_ROUTE, GET_PROCESSOR_PROVIDER_ROUTE] as const;\n","import { LIST_PROCESSORS_ROUTE, GET_PROCESSOR_BY_ID_ROUTE, EXECUTE_PROCESSOR_ROUTE } from '../../handlers/processors';\n\nexport const PROCESSORS_ROUTES = [LIST_PROCESSORS_ROUTE, GET_PROCESSOR_BY_ID_ROUTE, EXECUTE_PROCESSOR_ROUTE] as const;\n","import { CREATE_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE } from '../../handlers/responses';\n\nexport const RESPONSES_ROUTES = [CREATE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE] as const;\n","import {\n GET_SCHEDULE_ROUTE,\n LIST_SCHEDULES_ROUTE,\n LIST_SCHEDULE_TRIGGERS_ROUTE,\n PAUSE_SCHEDULE_ROUTE,\n RESUME_SCHEDULE_ROUTE,\n} from '../../handlers/schedules';\nimport type { ServerRoute } from '.';\n\nexport const SCHEDULES_ROUTES: ServerRoute<any, any, any>[] = [\n LIST_SCHEDULES_ROUTE,\n GET_SCHEDULE_ROUTE,\n LIST_SCHEDULE_TRIGGERS_ROUTE,\n PAUSE_SCHEDULE_ROUTE,\n RESUME_SCHEDULE_ROUTE,\n];\n","import {\n LIST_SCORERS_ROUTE,\n GET_SCORER_ROUTE,\n LIST_SCORES_BY_RUN_ID_ROUTE,\n LIST_SCORES_BY_SCORER_ID_ROUTE,\n LIST_SCORES_BY_ENTITY_ID_ROUTE,\n SAVE_SCORE_ROUTE,\n} from '../../handlers/scores';\n\nexport const SCORES_ROUTES = [\n LIST_SCORERS_ROUTE,\n GET_SCORER_ROUTE,\n LIST_SCORES_BY_RUN_ID_ROUTE,\n LIST_SCORES_BY_SCORER_ID_ROUTE,\n LIST_SCORES_BY_ENTITY_ID_ROUTE,\n SAVE_SCORE_ROUTE,\n] as const;\n","import {\n LIST_AGENT_VERSIONS_ROUTE,\n CREATE_AGENT_VERSION_ROUTE,\n GET_AGENT_VERSION_ROUTE,\n ACTIVATE_AGENT_VERSION_ROUTE,\n RESTORE_AGENT_VERSION_ROUTE,\n DELETE_AGENT_VERSION_ROUTE,\n COMPARE_AGENT_VERSIONS_ROUTE,\n} from '../../handlers/agent-versions';\nimport { FAVORITE_STORED_AGENT_ROUTE, UNFAVORITE_STORED_AGENT_ROUTE } from '../../handlers/stored-agent-favorites';\nimport {\n LIST_STORED_AGENTS_ROUTE,\n GET_STORED_AGENT_ROUTE,\n GET_STORED_AGENT_DEPENDENTS_ROUTE,\n CREATE_STORED_AGENT_ROUTE,\n UPDATE_STORED_AGENT_ROUTE,\n DELETE_STORED_AGENT_ROUTE,\n PREVIEW_INSTRUCTIONS_ROUTE,\n EXPORT_STORED_AGENT_ROUTE,\n OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE,\n} from '../../handlers/stored-agents';\nimport type { ServerRoute } from '.';\n\n/**\n * Routes for stored agents CRUD operations and version management.\n * These routes provide API access to agent configurations stored in the database,\n * enabling dynamic creation and management of agents via Mastra Studio.\n */\nexport const STORED_AGENTS_ROUTES: readonly ServerRoute[] = [\n // ============================================================================\n // Stored Agents CRUD Routes\n // IMPORTANT: Routes with literal paths (e.g., /preview-instructions) must come\n // BEFORE routes with path parameters (e.g., /:storedAgentId) to ensure correct matching.\n // ============================================================================\n LIST_STORED_AGENTS_ROUTE,\n PREVIEW_INSTRUCTIONS_ROUTE, // Must be before GET_STORED_AGENT_ROUTE\n GET_STORED_AGENT_DEPENDENTS_ROUTE, // Must be before GET_STORED_AGENT_ROUTE (longer literal)\n EXPORT_STORED_AGENT_ROUTE, // Must be before GET_STORED_AGENT_ROUTE\n OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE, // Must be before GET_STORED_AGENT_ROUTE\n GET_STORED_AGENT_ROUTE,\n CREATE_STORED_AGENT_ROUTE,\n UPDATE_STORED_AGENT_ROUTE,\n DELETE_STORED_AGENT_ROUTE,\n\n // ============================================================================\n // Agent Versions Routes\n // IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE\n // routes with path parameters (e.g., /:versionId) to ensure correct matching.\n // ============================================================================\n LIST_AGENT_VERSIONS_ROUTE,\n CREATE_AGENT_VERSION_ROUTE,\n COMPARE_AGENT_VERSIONS_ROUTE, // Must be before GET_AGENT_VERSION_ROUTE\n GET_AGENT_VERSION_ROUTE,\n ACTIVATE_AGENT_VERSION_ROUTE,\n RESTORE_AGENT_VERSION_ROUTE,\n DELETE_AGENT_VERSION_ROUTE,\n\n // ============================================================================\n // Favorites (EE)\n // ============================================================================\n FAVORITE_STORED_AGENT_ROUTE,\n UNFAVORITE_STORED_AGENT_ROUTE,\n];\n\n/**\n * Type-level tuple preserving each stored agent route's specific schema types.\n * Used by ServerRoutes to build the type-level route map.\n */\nexport type StoredAgentRoutes = readonly [\n typeof LIST_STORED_AGENTS_ROUTE,\n typeof PREVIEW_INSTRUCTIONS_ROUTE,\n typeof GET_STORED_AGENT_DEPENDENTS_ROUTE,\n typeof EXPORT_STORED_AGENT_ROUTE,\n typeof OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE,\n typeof GET_STORED_AGENT_ROUTE,\n typeof CREATE_STORED_AGENT_ROUTE,\n typeof UPDATE_STORED_AGENT_ROUTE,\n typeof DELETE_STORED_AGENT_ROUTE,\n typeof LIST_AGENT_VERSIONS_ROUTE,\n typeof CREATE_AGENT_VERSION_ROUTE,\n typeof COMPARE_AGENT_VERSIONS_ROUTE,\n typeof GET_AGENT_VERSION_ROUTE,\n typeof ACTIVATE_AGENT_VERSION_ROUTE,\n typeof RESTORE_AGENT_VERSION_ROUTE,\n typeof DELETE_AGENT_VERSION_ROUTE,\n typeof FAVORITE_STORED_AGENT_ROUTE,\n typeof UNFAVORITE_STORED_AGENT_ROUTE,\n];\n","import {\n LIST_MCP_CLIENT_VERSIONS_ROUTE,\n CREATE_MCP_CLIENT_VERSION_ROUTE,\n GET_MCP_CLIENT_VERSION_ROUTE,\n ACTIVATE_MCP_CLIENT_VERSION_ROUTE,\n RESTORE_MCP_CLIENT_VERSION_ROUTE,\n DELETE_MCP_CLIENT_VERSION_ROUTE,\n COMPARE_MCP_CLIENT_VERSIONS_ROUTE,\n} from '../../handlers/mcp-client-versions';\nimport {\n LIST_STORED_MCP_CLIENTS_ROUTE,\n GET_STORED_MCP_CLIENT_ROUTE,\n CREATE_STORED_MCP_CLIENT_ROUTE,\n UPDATE_STORED_MCP_CLIENT_ROUTE,\n DELETE_STORED_MCP_CLIENT_ROUTE,\n} from '../../handlers/stored-mcp-clients';\n\nexport const STORED_MCP_CLIENTS_ROUTES = [\n // Stored MCP Clients CRUD Routes\n LIST_STORED_MCP_CLIENTS_ROUTE,\n GET_STORED_MCP_CLIENT_ROUTE,\n CREATE_STORED_MCP_CLIENT_ROUTE,\n UPDATE_STORED_MCP_CLIENT_ROUTE,\n DELETE_STORED_MCP_CLIENT_ROUTE,\n\n // MCP Client Versions Routes\n // IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE\n // routes with path parameters (e.g., /:versionId) to ensure correct matching.\n LIST_MCP_CLIENT_VERSIONS_ROUTE,\n CREATE_MCP_CLIENT_VERSION_ROUTE,\n COMPARE_MCP_CLIENT_VERSIONS_ROUTE,\n GET_MCP_CLIENT_VERSION_ROUTE,\n ACTIVATE_MCP_CLIENT_VERSION_ROUTE,\n RESTORE_MCP_CLIENT_VERSION_ROUTE,\n DELETE_MCP_CLIENT_VERSION_ROUTE,\n] as const;\n","import {\n LIST_PROMPT_BLOCK_VERSIONS_ROUTE,\n CREATE_PROMPT_BLOCK_VERSION_ROUTE,\n GET_PROMPT_BLOCK_VERSION_ROUTE,\n ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE,\n RESTORE_PROMPT_BLOCK_VERSION_ROUTE,\n DELETE_PROMPT_BLOCK_VERSION_ROUTE,\n COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE,\n} from '../../handlers/prompt-block-versions';\nimport {\n LIST_STORED_PROMPT_BLOCKS_ROUTE,\n GET_STORED_PROMPT_BLOCK_ROUTE,\n CREATE_STORED_PROMPT_BLOCK_ROUTE,\n UPDATE_STORED_PROMPT_BLOCK_ROUTE,\n DELETE_STORED_PROMPT_BLOCK_ROUTE,\n} from '../../handlers/stored-prompt-blocks';\n\nexport const STORED_PROMPT_BLOCKS_ROUTES = [\n // Stored Prompt Blocks CRUD Routes\n LIST_STORED_PROMPT_BLOCKS_ROUTE,\n GET_STORED_PROMPT_BLOCK_ROUTE,\n CREATE_STORED_PROMPT_BLOCK_ROUTE,\n UPDATE_STORED_PROMPT_BLOCK_ROUTE,\n DELETE_STORED_PROMPT_BLOCK_ROUTE,\n\n // Prompt Block Versions Routes\n // IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE\n // routes with path parameters (e.g., /:versionId) to ensure correct matching.\n LIST_PROMPT_BLOCK_VERSIONS_ROUTE,\n CREATE_PROMPT_BLOCK_VERSION_ROUTE,\n COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE,\n GET_PROMPT_BLOCK_VERSION_ROUTE,\n ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE,\n RESTORE_PROMPT_BLOCK_VERSION_ROUTE,\n DELETE_PROMPT_BLOCK_VERSION_ROUTE,\n] as const;\n","import {\n LIST_SCORER_VERSIONS_ROUTE,\n CREATE_SCORER_VERSION_ROUTE,\n GET_SCORER_VERSION_ROUTE,\n ACTIVATE_SCORER_VERSION_ROUTE,\n RESTORE_SCORER_VERSION_ROUTE,\n DELETE_SCORER_VERSION_ROUTE,\n COMPARE_SCORER_VERSIONS_ROUTE,\n} from '../../handlers/scorer-versions';\nimport {\n LIST_STORED_SCORERS_ROUTE,\n GET_STORED_SCORER_ROUTE,\n CREATE_STORED_SCORER_ROUTE,\n UPDATE_STORED_SCORER_ROUTE,\n DELETE_STORED_SCORER_ROUTE,\n} from '../../handlers/stored-scorers';\n\nexport const STORED_SCORERS_ROUTES = [\n // Stored Scorers CRUD Routes\n LIST_STORED_SCORERS_ROUTE,\n GET_STORED_SCORER_ROUTE,\n CREATE_STORED_SCORER_ROUTE,\n UPDATE_STORED_SCORER_ROUTE,\n DELETE_STORED_SCORER_ROUTE,\n\n // Scorer Versions Routes\n // IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE\n // routes with path parameters (e.g., /:versionId) to ensure correct matching.\n LIST_SCORER_VERSIONS_ROUTE,\n CREATE_SCORER_VERSION_ROUTE,\n COMPARE_SCORER_VERSIONS_ROUTE,\n GET_SCORER_VERSION_ROUTE,\n ACTIVATE_SCORER_VERSION_ROUTE,\n RESTORE_SCORER_VERSION_ROUTE,\n DELETE_SCORER_VERSION_ROUTE,\n] as const;\n","import { FAVORITE_STORED_SKILL_ROUTE, UNFAVORITE_STORED_SKILL_ROUTE } from '../../handlers/stored-skill-favorites';\nimport {\n LIST_STORED_SKILLS_ROUTE,\n GET_STORED_SKILL_ROUTE,\n CREATE_STORED_SKILL_ROUTE,\n UPDATE_STORED_SKILL_ROUTE,\n DELETE_STORED_SKILL_ROUTE,\n PUBLISH_STORED_SKILL_ROUTE,\n} from '../../handlers/stored-skills';\n\nexport const STORED_SKILLS_ROUTES = [\n // Stored Skills CRUD Routes\n LIST_STORED_SKILLS_ROUTE,\n GET_STORED_SKILL_ROUTE,\n CREATE_STORED_SKILL_ROUTE,\n UPDATE_STORED_SKILL_ROUTE,\n DELETE_STORED_SKILL_ROUTE,\n // Publish\n PUBLISH_STORED_SKILL_ROUTE,\n // Favorites (EE)\n FAVORITE_STORED_SKILL_ROUTE,\n UNFAVORITE_STORED_SKILL_ROUTE,\n] as const;\n","import {\n LIST_STORED_WORKSPACES_ROUTE,\n GET_STORED_WORKSPACE_ROUTE,\n CREATE_STORED_WORKSPACE_ROUTE,\n UPDATE_STORED_WORKSPACE_ROUTE,\n DELETE_STORED_WORKSPACE_ROUTE,\n} from '../../handlers/stored-workspaces';\n\nexport const STORED_WORKSPACES_ROUTES = [\n // Stored Workspaces CRUD Routes\n LIST_STORED_WORKSPACES_ROUTE,\n GET_STORED_WORKSPACE_ROUTE,\n CREATE_STORED_WORKSPACE_ROUTE,\n UPDATE_STORED_WORKSPACE_ROUTE,\n DELETE_STORED_WORKSPACE_ROUTE,\n] as const;\n","import { GET_API_SCHEMA_ROUTE, GET_SYSTEM_PACKAGES_ROUTE } from '../../handlers/system';\n\n/**\n * System Routes\n *\n * Routes for system information and diagnostics.\n */\nexport const SYSTEM_ROUTES = [GET_SYSTEM_PACKAGES_ROUTE, GET_API_SCHEMA_ROUTE] as const;\n","import {\n AUTHORIZE_TOOL_PROVIDER_ROUTE,\n DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE,\n GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE,\n GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE,\n GET_TOOL_PROVIDER_HEALTH_ROUTE,\n GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE,\n LIST_TOOL_PROVIDERS_ROUTE,\n LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE,\n LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE,\n LIST_TOOL_PROVIDER_TOOLKITS_ROUTE,\n LIST_TOOL_PROVIDER_TOOLS_ROUTE,\n TOOL_PROVIDER_CONNECTION_STATUS_ROUTE,\n UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE,\n} from '../../handlers/tool-providers';\n\nexport const TOOL_PROVIDER_ROUTES = [\n LIST_TOOL_PROVIDERS_ROUTE,\n LIST_TOOL_PROVIDER_TOOLKITS_ROUTE,\n LIST_TOOL_PROVIDER_TOOLS_ROUTE,\n GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE,\n AUTHORIZE_TOOL_PROVIDER_ROUTE,\n GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE,\n TOOL_PROVIDER_CONNECTION_STATUS_ROUTE,\n LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE,\n LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE,\n DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE,\n UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE,\n GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE,\n GET_TOOL_PROVIDER_HEALTH_ROUTE,\n] as const;\n","import { LIST_TOOLS_ROUTE, GET_TOOL_BY_ID_ROUTE, EXECUTE_TOOL_ROUTE } from '../../handlers/tools';\n\nexport const TOOLS_ROUTES = [LIST_TOOLS_ROUTE, GET_TOOL_BY_ID_ROUTE, EXECUTE_TOOL_ROUTE] as const;\n","import {\n UPSERT_VECTORS_ROUTE,\n CREATE_INDEX_ROUTE,\n QUERY_VECTORS_ROUTE,\n LIST_INDEXES_ROUTE,\n DESCRIBE_INDEX_ROUTE,\n DELETE_INDEX_ROUTE,\n LIST_VECTORS_ROUTE,\n LIST_EMBEDDERS_ROUTE,\n} from '../../handlers/vector';\n\nexport const VECTORS_ROUTES = [\n UPSERT_VECTORS_ROUTE,\n CREATE_INDEX_ROUTE,\n QUERY_VECTORS_ROUTE,\n LIST_INDEXES_ROUTE,\n DESCRIBE_INDEX_ROUTE,\n DELETE_INDEX_ROUTE,\n LIST_VECTORS_ROUTE,\n LIST_EMBEDDERS_ROUTE,\n] as const;\n","import {\n LIST_WORKFLOWS_ROUTE,\n GET_WORKFLOW_BY_ID_ROUTE,\n LIST_WORKFLOW_RUNS_ROUTE,\n GET_WORKFLOW_RUN_BY_ID_ROUTE,\n CREATE_WORKFLOW_RUN_ROUTE,\n STREAM_WORKFLOW_ROUTE,\n RESUME_STREAM_WORKFLOW_ROUTE,\n START_ASYNC_WORKFLOW_ROUTE,\n START_WORKFLOW_RUN_ROUTE,\n OBSERVE_STREAM_WORKFLOW_ROUTE,\n RESUME_ASYNC_WORKFLOW_ROUTE,\n RESUME_NO_WAIT_WORKFLOW_ROUTE,\n RESUME_WORKFLOW_ROUTE,\n CANCEL_WORKFLOW_RUN_ROUTE,\n TIME_TRAVEL_WORKFLOW_ROUTE,\n TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,\n RESTART_WORKFLOW_ROUTE,\n RESTART_ASYNC_WORKFLOW_ROUTE,\n RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE,\n RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE,\n TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,\n DELETE_WORKFLOW_RUN_BY_ID_ROUTE,\n EXECUTE_WORKFLOW_STEP_ROUTE,\n RECEIVE_WORKFLOW_EVENT_ROUTE,\n} from '../../handlers/workflows';\n\nexport const WORKFLOWS_ROUTES = [\n LIST_WORKFLOWS_ROUTE,\n GET_WORKFLOW_BY_ID_ROUTE,\n LIST_WORKFLOW_RUNS_ROUTE,\n GET_WORKFLOW_RUN_BY_ID_ROUTE,\n DELETE_WORKFLOW_RUN_BY_ID_ROUTE,\n CREATE_WORKFLOW_RUN_ROUTE,\n STREAM_WORKFLOW_ROUTE,\n RESUME_STREAM_WORKFLOW_ROUTE,\n START_ASYNC_WORKFLOW_ROUTE,\n START_WORKFLOW_RUN_ROUTE,\n OBSERVE_STREAM_WORKFLOW_ROUTE,\n RESUME_ASYNC_WORKFLOW_ROUTE,\n RESUME_NO_WAIT_WORKFLOW_ROUTE,\n RESUME_WORKFLOW_ROUTE,\n CANCEL_WORKFLOW_RUN_ROUTE,\n TIME_TRAVEL_WORKFLOW_ROUTE,\n TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,\n TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,\n RESTART_WORKFLOW_ROUTE,\n RESTART_ASYNC_WORKFLOW_ROUTE,\n RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE,\n RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE,\n EXECUTE_WORKFLOW_STEP_ROUTE,\n RECEIVE_WORKFLOW_EVENT_ROUTE,\n] as const;\n","/**\n * Workspace Routes\n *\n * All routes for workspace operations under /api/workspaces/*\n */\n\nimport {\n LIST_WORKSPACES_ROUTE,\n GET_WORKSPACE_ROUTE,\n WORKSPACE_FS_ROUTES,\n WORKSPACE_SEARCH_ROUTES,\n WORKSPACE_SKILLS_ROUTES,\n WORKSPACE_SKILLS_SH_ROUTES,\n} from '../../handlers/workspace';\n\nexport const WORKSPACE_ROUTES = [\n // List all workspaces route (at /api/workspaces)\n LIST_WORKSPACES_ROUTE,\n\n // Get workspace route (at /api/workspaces/:workspaceId)\n GET_WORKSPACE_ROUTE,\n\n // Filesystem routes (at /api/workspaces/:workspaceId/fs/*)\n ...WORKSPACE_FS_ROUTES,\n\n // Search routes (at /api/workspaces/:workspaceId/search, /api/workspaces/:workspaceId/index)\n ...WORKSPACE_SEARCH_ROUTES,\n\n // Skills routes (search must come before parameterized routes)\n ...WORKSPACE_SKILLS_ROUTES,\n\n // skills.sh proxy routes (at /api/workspaces/:workspaceId/skills-sh/*)\n ...WORKSPACE_SKILLS_SH_ROUTES,\n] as const;\n","import type { Mastra } from '@mastra/core';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { FGARouteConfig, MastraFGAPermissionInput } from '@mastra/core/auth/ee';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { ApiRoute, ValidationErrorHook } from '@mastra/core/server';\nimport type * as z from 'zod/v4';\nimport type { InMemoryTaskStore } from '../../a2a/store';\nimport type { OpenAPIRoute } from '../openapi-utils';\nimport { A2A_ROUTES } from './a2a';\nimport { AGENT_BUILDER_ROUTES } from './agent-builder';\nimport { AGENTS_ROUTES } from './agents';\nimport type { AgentRoutes } from './agents';\nimport { AUTH_ROUTES } from './auth';\nimport { BACKGROUND_TASK_ROUTES } from './background-tasks';\nimport { CHANNELS_ROUTES } from './channels';\nimport { CONVERSATIONS_ROUTES } from './conversations';\nimport { DATASETS_ROUTES } from './datasets';\nimport { EDITOR_BUILDER_ROUTES } from './editor-builder';\nimport { HARNESS_ROUTES } from './harness';\nimport { LEGACY_ROUTES } from './legacy';\nimport { LOGS_ROUTES } from './logs';\nimport { MCP_ROUTES } from './mcp';\nimport { MEMORY_ROUTES } from './memory';\nimport { OBSERVABILITY_ROUTES } from './observability';\nimport { PROCESSOR_PROVIDER_ROUTES } from './processor-providers';\nimport { PROCESSORS_ROUTES } from './processors';\nimport { RESPONSES_ROUTES } from './responses';\nimport { SCHEDULES_ROUTES } from './schedules';\nimport { SCORES_ROUTES } from './scorers';\nimport { STORED_AGENTS_ROUTES } from './stored-agents';\nimport type { StoredAgentRoutes } from './stored-agents';\nimport { STORED_MCP_CLIENTS_ROUTES } from './stored-mcp-clients';\nimport { STORED_PROMPT_BLOCKS_ROUTES } from './stored-prompt-blocks';\nimport { STORED_SCORERS_ROUTES } from './stored-scorers';\nimport { STORED_SKILLS_ROUTES } from './stored-skills';\nimport { STORED_WORKSPACES_ROUTES } from './stored-workspaces';\nimport type { MastraStreamReturn } from './stream-types';\nimport { SYSTEM_ROUTES } from './system';\nimport { TOOL_PROVIDER_ROUTES } from './tool-providers';\nimport { TOOLS_ROUTES } from './tools';\nimport { VECTORS_ROUTES } from './vectors';\nimport { WORKFLOWS_ROUTES } from './workflows';\nimport { WORKSPACE_ROUTES } from './workspace';\n\n/**\n * Server context fields that are available to route handlers.\n * These are injected by the server adapters (Express, Hono, etc.)\n * Fields other than `mastra` are optional to allow direct handler testing.\n */\nexport type ServerContext = {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools?: ToolsInput;\n taskStore?: InMemoryTaskStore;\n abortSignal: AbortSignal;\n /** The route prefix configured for the server (e.g., '/api') */\n routePrefix?: string;\n /** The web-standard Request object for accessing headers, cookies, etc. */\n request?: Request;\n};\n\n/**\n * Utility type to infer parameters from Zod schemas.\n * Merges path params, query params, and body params into a single type.\n */\nexport type InferParams<\n TPathSchema extends z.ZodTypeAny | undefined,\n TQuerySchema extends z.ZodTypeAny | undefined,\n TBodySchema extends z.ZodTypeAny | undefined,\n> = (TPathSchema extends z.ZodTypeAny ? z.infer<TPathSchema> : {}) &\n (TQuerySchema extends z.ZodTypeAny ? z.infer<TQuerySchema> : {}) &\n (TBodySchema extends z.ZodTypeAny ? z.infer<TBodySchema> : {});\n\n/**\n * All supported response types for server routes.\n * - 'json': Standard JSON response\n * - 'stream': Streaming response (SSE or raw stream)\n * - 'datastream-response': Pre-built Response object for data streams\n * - 'mcp-http': MCP Streamable HTTP transport (handled by adapter)\n * - 'mcp-sse': MCP SSE transport (handled by adapter)\n */\nexport type ResponseType = 'stream' | 'json' | 'datastream-response' | 'mcp-http' | 'mcp-sse';\n\nexport type ServerRouteHandler<\n TParams = Record<string, unknown>,\n TResponse = unknown,\n TResponseType extends ResponseType = 'json',\n> = (\n params: TParams & ServerContext,\n) => Promise<\n TResponseType extends 'stream'\n ? MastraStreamReturn\n : TResponseType extends 'datastream-response'\n ? Response\n : TResponse\n>;\n\n/**\n * Phantom type for preserving Zod schema types on routes.\n * Not present at runtime — used only for type-level inference via RouteMap.\n */\nexport interface RouteSchemas<\n TPathSchema = unknown,\n TQuerySchema = unknown,\n TBodySchema = unknown,\n TResponseSchema = unknown,\n> {\n readonly pathParams: TPathSchema;\n readonly queryParams: TQuerySchema;\n readonly body: TBodySchema;\n readonly response: TResponseSchema;\n}\n\nexport type ServerRoute<\n TParams = Record<string, unknown>,\n TResponse = unknown,\n TResponseType extends ResponseType = ResponseType,\n TSchemas extends RouteSchemas = RouteSchemas,\n TMethod extends string = string,\n TPath extends string = string,\n> = Omit<ApiRoute, 'handler' | 'createHandler' | 'method' | 'path' | 'openapi'> & {\n method: TMethod;\n path: TPath;\n responseType: TResponseType;\n streamFormat?: 'sse' | 'stream'; // Only used when responseType is 'stream', defaults to 'stream'\n sseFlushOnConnect?: boolean;\n // Method signature is bivariant in params, allowing heterogeneous route arrays\n // while still preserving specific param types on individual routes.\n handler(params: TParams & ServerContext): ReturnType<ServerRouteHandler<TParams, TResponse, TResponseType>>;\n pathParamSchema?: z.ZodSchema;\n queryParamSchema?: z.ZodSchema;\n bodySchema?: z.ZodSchema;\n responseSchema?: z.ZodSchema;\n openapi?: OpenAPIRoute; // Auto-generated OpenAPI spec for this route\n maxBodySize?: number; // Optional route-specific body size limit in bytes\n deprecated?: boolean; // Flag for deprecated routes (used for route parity, skipped in tests)\n /**\n * Permission required to access this route (EE feature).\n * If set, the user must have this permission to access the route.\n * Uses the format: `resource:action` or `resource:action:resourceId`\n *\n * When an array is provided, the user needs ANY ONE of the listed permissions\n * (logical OR). This is useful for routes that serve multiple resource types,\n * e.g. a streaming endpoint used by both runtime and stored agents.\n *\n * @example\n * requiresPermission: MastraFGAPermissions.AGENTS_READ\n * requiresPermission: MastraFGAPermissions.WORKFLOWS_EXECUTE\n */\n requiresPermission?: MastraFGAPermissionInput | MastraFGAPermissionInput[];\n /**\n * FGA authorization config for this route (EE feature).\n * If set, the user must have the specified permission on the resource.\n *\n * @example\n * fga: { resourceType: 'agent', resourceIdParam: 'agentId', permission: MastraFGAPermissions.AGENTS_EXECUTE }\n */\n fga?: FGARouteConfig;\n onValidationError?: ValidationErrorHook;\n /** @internal Phantom type — not present at runtime. Used for type-level schema inference. */\n readonly __schemas?: TSchemas;\n};\n\nexport const SERVER_ROUTES: readonly ServerRoute[] = [\n ...AGENTS_ROUTES,\n ...AUTH_ROUTES,\n ...WORKFLOWS_ROUTES,\n ...TOOLS_ROUTES,\n ...PROCESSORS_ROUTES,\n ...RESPONSES_ROUTES,\n ...CONVERSATIONS_ROUTES,\n ...MEMORY_ROUTES,\n ...SCORES_ROUTES,\n ...OBSERVABILITY_ROUTES,\n ...LOGS_ROUTES,\n ...VECTORS_ROUTES,\n ...A2A_ROUTES,\n ...WORKSPACE_ROUTES,\n ...LEGACY_ROUTES,\n ...MCP_ROUTES,\n ...STORED_AGENTS_ROUTES,\n ...STORED_MCP_CLIENTS_ROUTES,\n ...STORED_PROMPT_BLOCKS_ROUTES,\n ...STORED_SCORERS_ROUTES,\n ...STORED_WORKSPACES_ROUTES,\n ...STORED_SKILLS_ROUTES,\n ...TOOL_PROVIDER_ROUTES,\n ...PROCESSOR_PROVIDER_ROUTES,\n ...SYSTEM_ROUTES,\n ...DATASETS_ROUTES,\n ...BACKGROUND_TASK_ROUTES,\n ...EDITOR_BUILDER_ROUTES,\n ...AGENT_BUILDER_ROUTES,\n ...SCHEDULES_ROUTES,\n ...CHANNELS_ROUTES,\n ...HARNESS_ROUTES,\n];\n\n/**\n * Union type of all individual route arrays.\n * Built from the per-domain `as const` tuples to preserve each route's specific schema types.\n */\nexport type ServerRoutes = readonly [\n ...AgentRoutes,\n ...typeof AUTH_ROUTES,\n ...typeof WORKFLOWS_ROUTES,\n ...typeof TOOLS_ROUTES,\n ...typeof PROCESSORS_ROUTES,\n ...typeof RESPONSES_ROUTES,\n ...typeof CONVERSATIONS_ROUTES,\n ...typeof MEMORY_ROUTES,\n ...typeof SCORES_ROUTES,\n ...typeof OBSERVABILITY_ROUTES,\n ...typeof LOGS_ROUTES,\n ...typeof VECTORS_ROUTES,\n ...typeof A2A_ROUTES,\n ...typeof AGENT_BUILDER_ROUTES,\n ...typeof WORKSPACE_ROUTES,\n ...typeof LEGACY_ROUTES,\n ...typeof MCP_ROUTES,\n ...StoredAgentRoutes,\n ...typeof STORED_MCP_CLIENTS_ROUTES,\n ...typeof STORED_PROMPT_BLOCKS_ROUTES,\n ...typeof STORED_SCORERS_ROUTES,\n ...typeof STORED_WORKSPACES_ROUTES,\n ...typeof STORED_SKILLS_ROUTES,\n ...typeof TOOL_PROVIDER_ROUTES,\n ...typeof PROCESSOR_PROVIDER_ROUTES,\n ...typeof SYSTEM_ROUTES,\n ...typeof DATASETS_ROUTES,\n ...typeof EDITOR_BUILDER_ROUTES,\n ...typeof CHANNELS_ROUTES,\n];\n\n// Export route builder and OpenAPI utilities\nexport { createRoute, createPublicRoute, pickParams, jsonQueryParam, wrapSchemaForQueryParams } from './route-builder';\nexport { generateOpenAPIDocument } from '../openapi-utils';\n\n// Export permission utilities\nexport { derivePermission, extractResource, deriveAction, getEffectivePermission } from './permissions';\n"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

'use strict';
var chunk42WZN6MM_cjs = require('./chunk-42WZN6MM.cjs');
var chunkF3HP5HM6_cjs = require('./chunk-F3HP5HM6.cjs');
var chunkYLWKZ3VK_cjs = require('./chunk-YLWKZ3VK.cjs');
var chunk7DKSWNOM_cjs = require('./chunk-7DKSWNOM.cjs');
var chunkRVD3DGBZ_cjs = require('./chunk-RVD3DGBZ.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
var crypto = require('crypto');
// src/server/handlers/responses.ts
var responses_exports = {};
chunkO7I5CWRX_cjs.__export(responses_exports, {
CREATE_RESPONSE_ROUTE: () => CREATE_RESPONSE_ROUTE,
DELETE_RESPONSE_ROUTE: () => DELETE_RESPONSE_ROUTE,
GET_RESPONSE_ROUTE: () => GET_RESPONSE_ROUTE
});
var JSON_OBJECT_RESPONSE_SCHEMA = {
type: "object",
additionalProperties: true
};
function jsonResponse(data, status = 200) {
return new Response(JSON.stringify(data), {
status,
headers: {
"Content-Type": "application/json"
}
});
}
function createStructuredOutput(text) {
if (!text) {
return void 0;
}
switch (text.format.type) {
case "json_object":
return {
schema: JSON_OBJECT_RESPONSE_SCHEMA,
jsonPromptInjection: true
};
case "json_schema":
return {
schema: text.format.schema
};
default:
return void 0;
}
}
function getStreamedMessageOutputItem(response, responseId) {
return response.output.find(
(item) => item.type === "message" && item.id === responseId
) ?? null;
}
async function resolveThreadExecutionContext({
agent,
store,
conversationId,
previousResponseTurnRecord,
requestContext
}) {
if (conversationId && previousResponseTurnRecord && previousResponseTurnRecord.thread.id !== conversationId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "conversation_id and previous_response_id must reference the same conversation thread when both are provided"
});
}
if (previousResponseTurnRecord) {
return {
threadId: previousResponseTurnRecord.thread.id,
resourceId: previousResponseTurnRecord.thread.resourceId
};
}
const effectiveThreadId = chunkRVD3DGBZ_cjs.getEffectiveThreadId(requestContext, void 0);
const effectiveResourceId = chunkRVD3DGBZ_cjs.getEffectiveResourceId(requestContext, void 0);
if (!store && !conversationId && !effectiveThreadId) {
return null;
}
const memory = await agent.getMemory({ requestContext });
if (!memory) {
if (conversationId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "conversation_id requires the target agent to have memory configured"
});
}
return null;
}
if (conversationId) {
const existingThread2 = await memory.getThreadById({ threadId: conversationId });
if (!existingThread2) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
await chunkRVD3DGBZ_cjs.enforceThreadAccess({
mastra: agent.getMastraInstance(),
requestContext,
threadId: conversationId,
thread: existingThread2,
effectiveResourceId
});
return {
threadId: existingThread2.id,
resourceId: effectiveResourceId ?? existingThread2.resourceId
};
}
if (!effectiveThreadId) {
if (!store) {
return null;
}
const threadId2 = crypto.randomUUID();
const createdThread2 = await memory.createThread({
threadId: threadId2,
resourceId: effectiveResourceId ?? threadId2
});
return {
threadId: createdThread2.id,
resourceId: createdThread2.resourceId
};
}
const threadId = effectiveThreadId;
const existingThread = await memory.getThreadById({ threadId });
if (existingThread) {
await chunkRVD3DGBZ_cjs.enforceThreadAccess({
mastra: agent.getMastraInstance(),
requestContext,
threadId,
thread: existingThread,
effectiveResourceId
});
return {
threadId: existingThread.id,
resourceId: effectiveResourceId ?? existingThread.resourceId
};
}
if (!store) {
return null;
}
const resourceId = effectiveResourceId ?? threadId;
const createdThread = await memory.createThread({
threadId,
resourceId
});
return {
threadId: createdThread.id,
resourceId: createdThread.resourceId
};
}
function createExecutionMemory(threadContext) {
if (!threadContext) {
return void 0;
}
return {
memory: {
thread: threadContext.threadId,
resource: threadContext.resourceId
}
};
}
async function resolveResponseAgent({
mastra,
agentId
}) {
if (!agentId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "Responses requests require an agent_id"
});
}
if (!mastra) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Mastra instance is required for agent-backed responses" });
}
return chunk7DKSWNOM_cjs.getAgentFromSystem({ mastra, agentId });
}
async function resolveAgentMemoryStore({
agent,
requestContext,
errorMessage
}) {
const agentMemoryStore = await chunkYLWKZ3VK_cjs.getAgentMemoryStore({ agent, requestContext });
if (!agentMemoryStore) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: errorMessage });
}
return agentMemoryStore;
}
async function executeGenerate({
agent,
resolvedModel,
modelOverride,
instructions,
text,
providerOptions,
input,
requestContext,
abortSignal,
threadContext
}) {
const executionMemory = createExecutionMemory(threadContext);
const structuredOutput = createStructuredOutput(text);
const modelOption = modelOverride ? { model: modelOverride } : {};
const commonOptions = {
instructions,
requestContext,
abortSignal,
...modelOption,
structuredOutput,
providerOptions,
...executionMemory ?? {}
};
if (resolvedModel.specificationVersion === "v1") {
if (threadContext) {
return await agent.generateLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions,
resourceId: threadContext.resourceId,
threadId: threadContext.threadId
});
}
return await agent.generateLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions
});
}
return await agent.generate(input, commonOptions);
}
async function executeStream({
agent,
resolvedModel,
modelOverride,
instructions,
text,
providerOptions,
input,
requestContext,
abortSignal,
threadContext
}) {
const executionMemory = createExecutionMemory(threadContext);
const structuredOutput = createStructuredOutput(text);
const modelOption = modelOverride ? { model: modelOverride } : {};
const commonOptions = {
instructions,
requestContext,
abortSignal,
...modelOption,
structuredOutput,
providerOptions,
...executionMemory ?? {}
};
if (resolvedModel.specificationVersion === "v1") {
if (threadContext) {
return await agent.streamLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions,
resourceId: threadContext.resourceId,
threadId: threadContext.threadId
});
}
return await agent.streamLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions
});
}
return await agent.stream(input, commonOptions);
}
async function resolveUsage(result) {
return await (result.totalUsage ?? result.usage ?? null);
}
async function resolveProviderMetadata(result) {
return await (result.providerMetadata ?? void 0);
}
async function resolveFinishReason(result) {
return await result.finishReason ?? void 0;
}
async function resolveText(result) {
return await result.text ?? "";
}
async function resolveCompletedResponseState(result, fallbackText) {
const usage = await resolveUsage(result);
return {
completedAt: Math.floor(Date.now() / 1e3),
status: chunkF3HP5HM6_cjs.toResponseStatus(await resolveFinishReason(result)),
text: await resolveText(result) || fallbackText,
usage,
usageDetails: chunkF3HP5HM6_cjs.toResponseUsage(usage),
providerOptions: await resolveProviderMetadata(result)
};
}
async function storeCompletedResponse({
agentMemoryStore,
didStore,
threadContext,
responseId,
metadata,
completedState,
messages,
outputItems
}) {
if (!didStore || !threadContext) {
return;
}
await chunkYLWKZ3VK_cjs.persistResponseTurnRecord({
memoryStore: agentMemoryStore,
responseId,
metadata: {
...metadata,
completedAt: completedState.completedAt,
status: completedState.status,
usage: completedState.usageDetails,
providerOptions: completedState.providerOptions,
messageIds: [],
outputItems
},
threadContext,
messages
});
}
async function finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result,
responseId,
createdAt,
model,
instructions,
previousResponseId,
conversationId,
configuredTools,
responseMetadata,
fallbackText,
fallbackOutputItems
}) {
const completedState = await resolveCompletedResponseState(result, fallbackText);
const fallbackItems = fallbackOutputItems?.(completedState);
const responseMessages = await chunkYLWKZ3VK_cjs.resolveResponseTurnMessagesForStorage({
result,
responseId,
text: completedState.text,
threadContext,
fallbackOutputItems: threadContext ? fallbackItems : void 0
});
const response = chunkF3HP5HM6_cjs.buildCompletedResponse({
responseId,
outputMessageId: responseId,
model,
createdAt,
completedAt: completedState.completedAt,
status: completedState.status,
text: completedState.text,
usage: completedState.usage,
instructions,
textConfig: responseMetadata.text,
previousResponseId,
conversationId,
providerOptions: completedState.providerOptions,
tools: configuredTools,
messages: responseMessages,
fallbackOutputItems: fallbackItems,
store: didStore
});
await storeCompletedResponse({
agentMemoryStore,
didStore,
threadContext,
responseId,
metadata: responseMetadata,
completedState,
messages: responseMessages,
outputItems: response.output
});
return { completedState, response, responseMessages };
}
async function prepareCreateResponseRequest({
body,
mastra,
requestContext
}) {
const executionInput = chunkF3HP5HM6_cjs.mapResponseInputToExecutionMessages(body.input);
let previousResponseTurnRecord = null;
let resolvedAgent = null;
if (body.previous_response_id) {
if (body.agent_id) {
resolvedAgent = await resolveResponseAgent({ mastra, agentId: body.agent_id });
previousResponseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecord({
agent: resolvedAgent,
responseId: body.previous_response_id,
requestContext
});
if (!previousResponseTurnRecord) {
const owningResponseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecordAcrossAgents({
mastra,
responseId: body.previous_response_id,
requestContext
});
if (owningResponseTurnRecord) {
if (owningResponseTurnRecord.metadata.agentId === body.agent_id) {
previousResponseTurnRecord = owningResponseTurnRecord;
} else {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: `Stored response ${body.previous_response_id} belongs to agent ${owningResponseTurnRecord.metadata.agentId}, not ${body.agent_id}`
});
}
}
if (!previousResponseTurnRecord) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });
}
}
} else {
if (!mastra) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Mastra instance is required for agent-backed responses" });
}
previousResponseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecordAcrossAgents({
mastra,
responseId: body.previous_response_id,
requestContext
});
if (!previousResponseTurnRecord) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });
}
}
}
const agent = resolvedAgent ?? await resolveResponseAgent({
mastra,
agentId: body.agent_id ?? previousResponseTurnRecord?.metadata.agentId
});
const resolvedModel = await agent.getModel({
requestContext,
modelConfig: body.model
});
const responseModel = body.model ?? (() => {
if (resolvedModel.provider && resolvedModel.modelId) {
const publicProviderId = resolvedModel.provider.includes(".") ? resolvedModel.provider.split(".")[0] : resolvedModel.provider;
return `${publicProviderId}/${resolvedModel.modelId}`;
}
if (resolvedModel.modelId) {
return resolvedModel.modelId;
}
throw new chunk64ITUOXI_cjs.HTTPException(500, {
message: "Responses route could not determine the effective model for this request"
});
})();
const shouldStore = body.store ?? false;
const needsMemoryStore = shouldStore || Boolean(body.conversation_id) || Boolean(body.previous_response_id);
const agentMemoryStore = needsMemoryStore ? await resolveAgentMemoryStore({
agent,
requestContext,
errorMessage: body.previous_response_id ? "previous_response_id requires the target agent to have memory storage configured" : shouldStore ? "Stored responses require the target agent to have memory storage configured" : "conversation_id requires the target agent to have memory storage configured"
}) : null;
const configuredTools = chunkF3HP5HM6_cjs.mapMastraToolsToResponseTools(
await Promise.resolve(agent.listTools({ requestContext }))
);
const responseId = chunkF3HP5HM6_cjs.createMessageId();
const createdAt = Math.floor(Date.now() / 1e3);
const threadContext = await resolveThreadExecutionContext({
agent,
store: shouldStore,
conversationId: body.conversation_id,
previousResponseTurnRecord,
requestContext
});
if (shouldStore && !threadContext) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "Stored responses require the target agent to have memory configured"
});
}
const didStore = shouldStore && Boolean(threadContext);
return {
agent,
agentMemoryStore,
configuredTools,
createdAt,
didStore,
executionInput,
previousResponseTurnRecord,
resolvedModel,
responseId,
responseModel,
responseMetadata: {
agentId: agent.id,
model: responseModel,
createdAt,
instructions: body.instructions,
text: body.text,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
tools: configuredTools,
store: didStore
},
threadContext
};
}
function createResponseEventStream({
agentMemoryStore,
body,
configuredTools,
createdAt,
didStore,
previousResponseTurnRecord,
responseId,
responseModel,
responseMetadata,
streamResult,
threadContext
}) {
const createdResponse = chunkF3HP5HM6_cjs.buildInProgressResponse({
responseId,
model: responseModel,
createdAt,
instructions: body.instructions,
textConfig: body.text,
previousResponseId: body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
tools: configuredTools,
store: didStore
});
return new ReadableStream({
async start(controller) {
let sequenceNumber = 1;
const enqueueEvent = (eventName, payload) => {
controller.enqueue(
chunkF3HP5HM6_cjs.formatSseEvent(eventName, {
...payload,
sequence_number: sequenceNumber++
})
);
};
enqueueEvent("response.created", {
type: "response.created",
response: createdResponse
});
enqueueEvent("response.in_progress", {
type: "response.in_progress",
response: createdResponse
});
const streamEvents = chunkF3HP5HM6_cjs.createResponseStreamEventTranslator(responseId);
const fullStream = await streamResult.fullStream;
const reader = fullStream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
for (const event of streamEvents.consume(value)) {
enqueueEvent(event.event, event.payload);
}
}
for (const event of streamEvents.flushPendingToolResults()) {
enqueueEvent(event.event, event.payload);
}
const { completedState, response } = await finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result: streamResult,
responseId,
createdAt,
model: responseModel,
instructions: body.instructions,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
configuredTools,
responseMetadata,
fallbackText: streamEvents.text,
fallbackOutputItems: (completedState2) => streamEvents.getOutputItems({
text: completedState2.text,
status: completedState2.status
})
});
const completedItem = getStreamedMessageOutputItem(response, responseId);
if (completedItem || completedState.text) {
for (const event of streamEvents.completeText(
completedState.text,
completedItem ?? {
id: responseId,
type: "message",
role: "assistant",
status: "completed",
content: [chunkF3HP5HM6_cjs.createOutputTextPart(completedState.text)]
}
)) {
enqueueEvent(event.event, event.payload);
}
}
enqueueEvent("response.completed", {
type: "response.completed",
response
});
controller.close();
} catch (error) {
controller.error(error);
} finally {
reader.releaseLock();
}
}
});
}
var CREATE_RESPONSE_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/v1/responses",
responseType: "datastream-response",
bodySchema: chunk42WZN6MM_cjs.createResponseBodySchema,
responseSchema: chunk42WZN6MM_cjs.responseObjectSchema,
summary: "Create a response",
description: "Creates a response through a Mastra-hosted Responses API-compatible route",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_EXECUTE,
handler: async ({ mastra, requestContext, abortSignal, ...body }) => {
try {
const {
agent,
agentMemoryStore,
configuredTools,
createdAt,
didStore,
executionInput,
previousResponseTurnRecord,
resolvedModel,
responseId,
responseModel,
responseMetadata,
threadContext
} = await prepareCreateResponseRequest({ body, mastra, requestContext });
if (!body.stream) {
const result = await executeGenerate({
agent,
resolvedModel,
modelOverride: body.model,
instructions: body.instructions,
text: body.text,
providerOptions: body.providerOptions,
input: executionInput,
requestContext,
abortSignal,
threadContext
});
const { response } = await finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result,
responseId,
createdAt,
model: responseModel,
instructions: body.instructions,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
configuredTools,
responseMetadata,
fallbackText: ""
});
return jsonResponse(response);
}
const streamResult = await executeStream({
agent,
resolvedModel,
modelOverride: body.model,
instructions: body.instructions,
text: body.text,
providerOptions: body.providerOptions,
input: executionInput,
requestContext,
abortSignal,
threadContext
});
const stream = createResponseEventStream({
agentMemoryStore,
body,
configuredTools,
createdAt,
didStore,
previousResponseTurnRecord,
responseId,
responseModel,
responseMetadata,
streamResult,
threadContext
});
return new Response(stream, {
headers: {
"Content-Type": "text/event-stream; charset=utf-8",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"X-Accel-Buffering": "no"
}
});
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error creating response");
}
}
});
var GET_RESPONSE_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/v1/responses/:responseId",
responseType: "json",
pathParamSchema: chunk42WZN6MM_cjs.responseIdPathParams,
responseSchema: chunk42WZN6MM_cjs.responseObjectSchema,
summary: "Retrieve a stored response",
description: "Returns a previously stored response object",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, responseId }) => {
try {
const responseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });
if (!responseTurnRecord) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored response ${responseId} was not found` });
}
return chunkF3HP5HM6_cjs.mapResponseTurnRecordToResponse(responseTurnRecord);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error retrieving response");
}
}
});
var DELETE_RESPONSE_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/v1/responses/:responseId",
responseType: "json",
pathParamSchema: chunk42WZN6MM_cjs.responseIdPathParams,
responseSchema: chunk42WZN6MM_cjs.deleteResponseSchema,
summary: "Delete a stored response",
description: "Deletes a stored response so it can no longer be retrieved or chained",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_DELETE,
handler: async ({ mastra, requestContext, responseId }) => {
try {
const responseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });
if (!responseTurnRecord) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored response ${responseId} was not found` });
}
await chunkYLWKZ3VK_cjs.deleteResponseTurnRecord({ responseTurnRecord });
const response = {
id: responseId,
object: "response",
deleted: true
};
return response;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error deleting response");
}
}
});
exports.CREATE_RESPONSE_ROUTE = CREATE_RESPONSE_ROUTE;
exports.DELETE_RESPONSE_ROUTE = DELETE_RESPONSE_ROUTE;
exports.GET_RESPONSE_ROUTE = GET_RESPONSE_ROUTE;
exports.responses_exports = responses_exports;
//# sourceMappingURL=chunk-JY2LHUT4.cjs.map
//# sourceMappingURL=chunk-JY2LHUT4.cjs.map
{"version":3,"sources":["../src/server/handlers/responses.ts"],"names":["__export","HTTPException","getEffectiveThreadId","getEffectiveResourceId","existingThread","enforceThreadAccess","threadId","randomUUID","createdThread","getAgentFromSystem","getAgentMemoryStore","toResponseStatus","toResponseUsage","persistResponseTurnRecord","resolveResponseTurnMessagesForStorage","buildCompletedResponse","mapResponseInputToExecutionMessages","findResponseTurnRecord","findResponseTurnRecordAcrossAgents","mapMastraToolsToResponseTools","createMessageId","buildInProgressResponse","formatSseEvent","createResponseStreamEventTranslator","completedState","createOutputTextPart","createRoute","createResponseBodySchema","responseObjectSchema","MastraFGAPermissions","handleError","responseIdPathParams","mapResponseTurnRecordToResponse","deleteResponseSchema","deleteResponseTurnRecord"],"mappings":"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","file":"chunk-JY2LHUT4.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { Agent, MastraDBMessage } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n createResponseBodySchema,\n deleteResponseSchema,\n responseIdPathParams,\n responseObjectSchema,\n} from '../schemas/responses';\nimport type { CreateResponseBody, DeleteResponse, ResponseObject } from '../schemas/responses';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport {\n buildCompletedResponse,\n buildInProgressResponse,\n createResponseStreamEventTranslator,\n createMessageId,\n createOutputTextPart,\n formatSseEvent,\n mapMastraToolsToResponseTools,\n mapResponseInputToExecutionMessages,\n mapResponseTurnRecordToResponse,\n toResponseStatus,\n toResponseUsage,\n} from './responses.adapter';\nimport {\n deleteResponseTurnRecord,\n findResponseTurnRecord,\n findResponseTurnRecordAcrossAgents,\n getAgentMemoryStore,\n persistResponseTurnRecord,\n resolveResponseTurnMessagesForStorage,\n} from './responses.storage';\nimport type {\n ProviderMetadataLike,\n ResponseTurnRecord,\n ResponseTurnRecordMetadata,\n ThreadExecutionContext,\n UsageLike,\n} from './responses.storage';\nimport { enforceThreadAccess, getEffectiveResourceId, getEffectiveThreadId } from './utils';\n\ntype AgentExecutionInput = Parameters<Agent['generate']>[0];\ntype ResolvedAgentModel = Awaited<ReturnType<Agent['getModel']>>;\n\ntype ResponseExecutionResult = {\n text?: string;\n finishReason?: string;\n totalUsage?: UsageLike | Promise<UsageLike>;\n usage?: UsageLike | Promise<UsageLike>;\n providerMetadata?: ProviderMetadataLike | Promise<ProviderMetadataLike>;\n response?: {\n id?: string;\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype ResponseStreamResult = {\n fullStream: ReadableStream<unknown> | Promise<ReadableStream<unknown>>;\n text: Promise<string> | string;\n finishReason: Promise<string | undefined> | string | undefined;\n totalUsage?: Promise<UsageLike> | UsageLike;\n usage?: Promise<UsageLike> | UsageLike;\n providerMetadata?: Promise<ProviderMetadataLike> | ProviderMetadataLike;\n response?:\n | Promise<{\n id?: string;\n dbMessages?: MastraDBMessage[];\n }>\n | {\n id?: string;\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype CompletedResponseState = {\n completedAt: number;\n status: ResponseObject['status'];\n text: string;\n usage: UsageLike;\n usageDetails: ResponseObject['usage'];\n providerOptions: ProviderMetadataLike;\n};\n\ntype FinalizedResponse = {\n completedState: CompletedResponseState;\n response: ResponseObject;\n responseMessages: MastraDBMessage[];\n};\n\ntype PreparedCreateResponseRequest = {\n agent: Agent<any, any, any, any>;\n agentMemoryStore: MemoryStorage | null;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n createdAt: number;\n didStore: boolean;\n executionInput: AgentExecutionInput;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n resolvedModel: ResolvedAgentModel;\n responseId: string;\n responseModel: string;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n threadContext: ThreadExecutionContext | null;\n};\n\nconst JSON_OBJECT_RESPONSE_SCHEMA = {\n type: 'object',\n additionalProperties: true,\n} as const;\n\nfunction jsonResponse(data: ResponseObject, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n}\n\nfunction createStructuredOutput(text: CreateResponseBody['text']) {\n if (!text) {\n return undefined;\n }\n\n switch (text.format.type) {\n case 'json_object':\n return {\n schema: JSON_OBJECT_RESPONSE_SCHEMA,\n jsonPromptInjection: true,\n };\n case 'json_schema':\n return {\n schema: text.format.schema,\n };\n default:\n return undefined;\n }\n}\n\nfunction getStreamedMessageOutputItem(response: ResponseObject, responseId: string) {\n return (\n response.output.find(\n (item): item is Extract<ResponseObject['output'][number], { type: 'message' }> =>\n item.type === 'message' && item.id === responseId,\n ) ?? null\n );\n}\n\n/**\n * Resolves the memory thread that should back the current response request.\n *\n * If `previous_response_id` is present, the request continues on that stored thread.\n * Otherwise, the route only creates or reuses a thread when the caller asked to store\n * the response and the resolved agent actually has memory configured.\n */\nasync function resolveThreadExecutionContext({\n agent,\n store,\n conversationId,\n previousResponseTurnRecord,\n requestContext,\n}: {\n agent: Agent<any, any, any, any>;\n store: boolean;\n conversationId?: string;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n requestContext: RequestContext;\n}): Promise<ThreadExecutionContext | null> {\n if (conversationId && previousResponseTurnRecord && previousResponseTurnRecord.thread.id !== conversationId) {\n throw new HTTPException(400, {\n message:\n 'conversation_id and previous_response_id must reference the same conversation thread when both are provided',\n });\n }\n\n if (previousResponseTurnRecord) {\n return {\n threadId: previousResponseTurnRecord.thread.id,\n resourceId: previousResponseTurnRecord.thread.resourceId,\n };\n }\n\n const effectiveThreadId = getEffectiveThreadId(requestContext, undefined);\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n\n if (!store && !conversationId && !effectiveThreadId) {\n return null;\n }\n\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n if (conversationId) {\n throw new HTTPException(400, {\n message: 'conversation_id requires the target agent to have memory configured',\n });\n }\n\n return null;\n }\n\n if (conversationId) {\n const existingThread = await memory.getThreadById({ threadId: conversationId });\n if (!existingThread) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await enforceThreadAccess({\n mastra: agent.getMastraInstance(),\n requestContext,\n threadId: conversationId,\n thread: existingThread,\n effectiveResourceId,\n });\n return {\n threadId: existingThread.id,\n resourceId: effectiveResourceId ?? existingThread.resourceId,\n };\n }\n\n if (!effectiveThreadId) {\n if (!store) {\n return null;\n }\n\n const threadId = randomUUID();\n const createdThread = await memory.createThread({\n threadId,\n resourceId: effectiveResourceId ?? threadId,\n });\n\n return {\n threadId: createdThread.id,\n resourceId: createdThread.resourceId,\n };\n }\n\n const threadId = effectiveThreadId;\n const existingThread = await memory.getThreadById({ threadId });\n if (existingThread) {\n await enforceThreadAccess({\n mastra: agent.getMastraInstance(),\n requestContext,\n threadId,\n thread: existingThread,\n effectiveResourceId,\n });\n return {\n threadId: existingThread.id,\n resourceId: effectiveResourceId ?? existingThread.resourceId,\n };\n }\n\n if (!store) {\n return null;\n }\n\n const resourceId = effectiveResourceId ?? threadId;\n const createdThread = await memory.createThread({\n threadId,\n resourceId,\n });\n\n return {\n threadId: createdThread.id,\n resourceId: createdThread.resourceId,\n };\n}\n\nfunction createExecutionMemory(threadContext: ThreadExecutionContext | null) {\n if (!threadContext) {\n return undefined;\n }\n\n return {\n memory: {\n thread: threadContext.threadId,\n resource: threadContext.resourceId,\n },\n } as const;\n}\n\n/**\n * Resolves the registered Mastra agent that owns the response request.\n */\nasync function resolveResponseAgent({\n mastra,\n agentId,\n}: {\n mastra: Mastra | undefined;\n agentId?: string;\n}): Promise<Agent<any, any, any, any>> {\n if (!agentId) {\n throw new HTTPException(400, {\n message: 'Responses requests require an agent_id',\n });\n }\n\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for agent-backed responses' });\n }\n\n return getAgentFromSystem({ mastra, agentId });\n}\n\nasync function resolveAgentMemoryStore({\n agent,\n requestContext,\n errorMessage,\n}: {\n agent: Agent<any, any, any, any>;\n requestContext: RequestContext;\n errorMessage: string;\n}): Promise<MemoryStorage> {\n const agentMemoryStore = await getAgentMemoryStore({ agent, requestContext });\n if (!agentMemoryStore) {\n throw new HTTPException(400, { message: errorMessage });\n }\n\n return agentMemoryStore;\n}\n\n/**\n * Executes a non-streaming Responses API request through the resolved Mastra agent.\n */\nasync function executeGenerate({\n agent,\n resolvedModel,\n modelOverride,\n instructions,\n text,\n providerOptions,\n input,\n requestContext,\n abortSignal,\n threadContext,\n}: {\n agent: Agent;\n resolvedModel: ResolvedAgentModel;\n modelOverride?: string;\n instructions: string | undefined;\n text: CreateResponseBody['text'];\n providerOptions: CreateResponseBody['providerOptions'];\n input: AgentExecutionInput;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n threadContext: ThreadExecutionContext | null;\n}) {\n const executionMemory = createExecutionMemory(threadContext);\n const structuredOutput = createStructuredOutput(text);\n const modelOption = modelOverride ? { model: modelOverride } : {};\n const commonOptions = {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n structuredOutput,\n providerOptions,\n ...(executionMemory ?? {}),\n };\n\n if (resolvedModel.specificationVersion === 'v1') {\n if (threadContext) {\n return (await agent.generateLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n resourceId: threadContext.resourceId,\n threadId: threadContext.threadId,\n } as never)) as ResponseExecutionResult;\n }\n\n return (await agent.generateLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n } as never)) as ResponseExecutionResult;\n }\n\n return (await agent.generate(input, commonOptions as never)) as ResponseExecutionResult;\n}\n\n/**\n * Executes a streaming Responses API request through the resolved Mastra agent.\n */\nasync function executeStream({\n agent,\n resolvedModel,\n modelOverride,\n instructions,\n text,\n providerOptions,\n input,\n requestContext,\n abortSignal,\n threadContext,\n}: {\n agent: Agent;\n resolvedModel: ResolvedAgentModel;\n modelOverride?: string;\n instructions: string | undefined;\n text: CreateResponseBody['text'];\n providerOptions: CreateResponseBody['providerOptions'];\n input: AgentExecutionInput;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n threadContext: ThreadExecutionContext | null;\n}) {\n const executionMemory = createExecutionMemory(threadContext);\n const structuredOutput = createStructuredOutput(text);\n const modelOption = modelOverride ? { model: modelOverride } : {};\n const commonOptions = {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n structuredOutput,\n providerOptions,\n ...(executionMemory ?? {}),\n };\n\n if (resolvedModel.specificationVersion === 'v1') {\n if (threadContext) {\n return (await agent.streamLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n resourceId: threadContext.resourceId,\n threadId: threadContext.threadId,\n } as never)) as ResponseStreamResult;\n }\n\n return (await agent.streamLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n } as never)) as ResponseStreamResult;\n }\n\n return (await agent.stream(input, commonOptions as never)) as ResponseStreamResult;\n}\n\nasync function resolveUsage(result: ResponseExecutionResult | ResponseStreamResult): Promise<UsageLike> {\n return (await (result.totalUsage ?? result.usage ?? null)) as UsageLike;\n}\n\nasync function resolveProviderMetadata(\n result: ResponseExecutionResult | ResponseStreamResult,\n): Promise<ProviderMetadataLike> {\n return (await (result.providerMetadata ?? undefined)) as ProviderMetadataLike;\n}\n\nasync function resolveFinishReason(\n result: ResponseExecutionResult | ResponseStreamResult,\n): Promise<string | undefined> {\n return (await result.finishReason) ?? undefined;\n}\n\nasync function resolveText(result: ResponseExecutionResult | ResponseStreamResult): Promise<string> {\n return (await result.text) ?? '';\n}\n\n/**\n * Resolves the final response state shared by streaming and non-streaming flows.\n */\nasync function resolveCompletedResponseState(\n result: ResponseExecutionResult | ResponseStreamResult,\n fallbackText: string,\n): Promise<CompletedResponseState> {\n const usage = await resolveUsage(result);\n\n return {\n completedAt: Math.floor(Date.now() / 1000),\n status: toResponseStatus(await resolveFinishReason(result)),\n text: (await resolveText(result)) || fallbackText,\n usage,\n usageDetails: toResponseUsage(usage),\n providerOptions: await resolveProviderMetadata(result),\n };\n}\n\n/**\n * Stores the completed response when the request opted into memory-backed persistence.\n */\nasync function storeCompletedResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n responseId,\n metadata,\n completedState,\n messages,\n outputItems,\n}: {\n agentMemoryStore: MemoryStorage | null;\n didStore: boolean;\n threadContext: ThreadExecutionContext | null;\n responseId: string;\n metadata: Omit<ResponseTurnRecordMetadata, 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'>;\n completedState: CompletedResponseState;\n messages: MastraDBMessage[];\n outputItems: ResponseObject['output'];\n}): Promise<void> {\n if (!didStore || !threadContext) {\n return;\n }\n\n await persistResponseTurnRecord({\n memoryStore: agentMemoryStore,\n responseId,\n metadata: {\n ...metadata,\n completedAt: completedState.completedAt,\n status: completedState.status,\n usage: completedState.usageDetails,\n providerOptions: completedState.providerOptions,\n messageIds: [],\n outputItems,\n },\n threadContext,\n messages,\n });\n}\n\n/**\n * Resolves the final response object and persists the stored response turn when needed.\n */\nasync function finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result,\n responseId,\n createdAt,\n model,\n instructions,\n previousResponseId,\n conversationId,\n configuredTools,\n responseMetadata,\n fallbackText,\n fallbackOutputItems,\n}: {\n agentMemoryStore: MemoryStorage | null;\n didStore: boolean;\n threadContext: ThreadExecutionContext | null;\n result: ResponseExecutionResult | ResponseStreamResult;\n responseId: string;\n createdAt: number;\n model: string;\n instructions: string | undefined;\n previousResponseId?: string;\n conversationId?: string;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n fallbackText: string;\n fallbackOutputItems?: (completedState: CompletedResponseState) => ResponseObject['output'];\n}): Promise<FinalizedResponse> {\n const completedState = await resolveCompletedResponseState(result, fallbackText);\n const fallbackItems = fallbackOutputItems?.(completedState);\n const responseMessages = await resolveResponseTurnMessagesForStorage({\n result,\n responseId,\n text: completedState.text,\n threadContext,\n fallbackOutputItems: threadContext ? fallbackItems : undefined,\n });\n const response = buildCompletedResponse({\n responseId,\n outputMessageId: responseId,\n model,\n createdAt,\n completedAt: completedState.completedAt,\n status: completedState.status,\n text: completedState.text,\n usage: completedState.usage,\n instructions,\n textConfig: responseMetadata.text,\n previousResponseId,\n conversationId,\n providerOptions: completedState.providerOptions,\n tools: configuredTools,\n messages: responseMessages,\n fallbackOutputItems: fallbackItems,\n store: didStore,\n });\n\n await storeCompletedResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n responseId,\n metadata: responseMetadata,\n completedState,\n messages: responseMessages,\n outputItems: response.output,\n });\n\n return { completedState, response, responseMessages };\n}\n\n/**\n * Resolves all request-scoped Mastra primitives needed to execute a Responses create\n * call: the owning agent, the memory thread context, the normalized execution input,\n * and the response-turn metadata that may be persisted later.\n */\nasync function prepareCreateResponseRequest({\n body,\n mastra,\n requestContext,\n}: {\n body: CreateResponseBody;\n mastra: Mastra | undefined;\n requestContext: RequestContext;\n}): Promise<PreparedCreateResponseRequest> {\n const executionInput = mapResponseInputToExecutionMessages(body.input) as AgentExecutionInput;\n let previousResponseTurnRecord: ResponseTurnRecord | null = null;\n let resolvedAgent: Agent<any, any, any, any> | null = null;\n\n if (body.previous_response_id) {\n if (body.agent_id) {\n resolvedAgent = await resolveResponseAgent({ mastra, agentId: body.agent_id });\n previousResponseTurnRecord = await findResponseTurnRecord({\n agent: resolvedAgent,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (!previousResponseTurnRecord) {\n const owningResponseTurnRecord = await findResponseTurnRecordAcrossAgents({\n mastra,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (owningResponseTurnRecord) {\n if (owningResponseTurnRecord.metadata.agentId === body.agent_id) {\n previousResponseTurnRecord = owningResponseTurnRecord;\n } else {\n throw new HTTPException(400, {\n message: `Stored response ${body.previous_response_id} belongs to agent ${owningResponseTurnRecord.metadata.agentId}, not ${body.agent_id}`,\n });\n }\n }\n\n if (!previousResponseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });\n }\n }\n } else {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for agent-backed responses' });\n }\n\n previousResponseTurnRecord = await findResponseTurnRecordAcrossAgents({\n mastra,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (!previousResponseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });\n }\n }\n }\n\n const agent =\n resolvedAgent ??\n (await resolveResponseAgent({\n mastra,\n agentId: body.agent_id ?? previousResponseTurnRecord?.metadata.agentId,\n }));\n const resolvedModel = await agent.getModel({\n requestContext,\n modelConfig: body.model,\n });\n const responseModel =\n body.model ??\n (() => {\n if (resolvedModel.provider && resolvedModel.modelId) {\n const publicProviderId = resolvedModel.provider.includes('.')\n ? resolvedModel.provider.split('.')[0]!\n : resolvedModel.provider;\n return `${publicProviderId}/${resolvedModel.modelId}`;\n }\n\n if (resolvedModel.modelId) {\n return resolvedModel.modelId;\n }\n\n throw new HTTPException(500, {\n message: 'Responses route could not determine the effective model for this request',\n });\n })();\n const shouldStore = body.store ?? false;\n const needsMemoryStore = shouldStore || Boolean(body.conversation_id) || Boolean(body.previous_response_id);\n const agentMemoryStore = needsMemoryStore\n ? await resolveAgentMemoryStore({\n agent,\n requestContext,\n errorMessage: body.previous_response_id\n ? 'previous_response_id requires the target agent to have memory storage configured'\n : shouldStore\n ? 'Stored responses require the target agent to have memory storage configured'\n : 'conversation_id requires the target agent to have memory storage configured',\n })\n : null;\n const configuredTools = mapMastraToolsToResponseTools(\n (await Promise.resolve(agent.listTools({ requestContext }))) as Record<string, unknown>,\n );\n\n const responseId = createMessageId();\n const createdAt = Math.floor(Date.now() / 1000);\n const threadContext = await resolveThreadExecutionContext({\n agent,\n store: shouldStore,\n conversationId: body.conversation_id,\n previousResponseTurnRecord,\n requestContext,\n });\n\n if (shouldStore && !threadContext) {\n throw new HTTPException(400, {\n message: 'Stored responses require the target agent to have memory configured',\n });\n }\n\n const didStore = shouldStore && Boolean(threadContext);\n\n return {\n agent,\n agentMemoryStore,\n configuredTools,\n createdAt,\n didStore,\n executionInput,\n previousResponseTurnRecord,\n resolvedModel,\n responseId,\n responseModel,\n responseMetadata: {\n agentId: agent.id,\n model: responseModel,\n createdAt,\n instructions: body.instructions,\n text: body.text,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n tools: configuredTools,\n store: didStore,\n },\n threadContext,\n };\n}\n\n/**\n * Bridges a Mastra agent stream into OpenAI-style Responses SSE events and completes\n * the stored response-turn record when the stream finishes.\n */\nfunction createResponseEventStream({\n agentMemoryStore,\n body,\n configuredTools,\n createdAt,\n didStore,\n previousResponseTurnRecord,\n responseId,\n responseModel,\n responseMetadata,\n streamResult,\n threadContext,\n}: {\n agentMemoryStore: MemoryStorage | null;\n body: CreateResponseBody;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n createdAt: number;\n didStore: boolean;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n responseId: string;\n responseModel: string;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n streamResult: ResponseStreamResult;\n threadContext: ThreadExecutionContext | null;\n}) {\n const createdResponse = buildInProgressResponse({\n responseId,\n model: responseModel,\n createdAt,\n instructions: body.instructions,\n textConfig: body.text,\n previousResponseId: body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n tools: configuredTools,\n store: didStore,\n });\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n let sequenceNumber = 1;\n const enqueueEvent = (eventName: string, payload: Record<string, unknown>) => {\n controller.enqueue(\n formatSseEvent(eventName, {\n ...payload,\n sequence_number: sequenceNumber++,\n }),\n );\n };\n\n enqueueEvent('response.created', {\n type: 'response.created',\n response: createdResponse,\n });\n enqueueEvent('response.in_progress', {\n type: 'response.in_progress',\n response: createdResponse,\n });\n\n const streamEvents = createResponseStreamEventTranslator(responseId);\n const fullStream = await streamResult.fullStream;\n const reader = fullStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n for (const event of streamEvents.consume(value)) {\n enqueueEvent(event.event, event.payload);\n }\n }\n\n for (const event of streamEvents.flushPendingToolResults()) {\n enqueueEvent(event.event, event.payload);\n }\n\n const { completedState, response } = await finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result: streamResult,\n responseId,\n createdAt,\n model: responseModel,\n instructions: body.instructions,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n configuredTools,\n responseMetadata,\n fallbackText: streamEvents.text,\n fallbackOutputItems: completedState =>\n streamEvents.getOutputItems({\n text: completedState.text,\n status: completedState.status,\n }),\n });\n\n const completedItem = getStreamedMessageOutputItem(response, responseId);\n if (completedItem || completedState.text) {\n for (const event of streamEvents.completeText(\n completedState.text,\n completedItem ?? {\n id: responseId,\n type: 'message' as const,\n role: 'assistant' as const,\n status: 'completed' as const,\n content: [createOutputTextPart(completedState.text)],\n },\n )) {\n enqueueEvent(event.event, event.payload);\n }\n }\n enqueueEvent('response.completed', {\n type: 'response.completed',\n response,\n });\n controller.close();\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n}\n\nexport const CREATE_RESPONSE_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/responses',\n responseType: 'datastream-response',\n bodySchema: createResponseBodySchema,\n responseSchema: responseObjectSchema,\n summary: 'Create a response',\n description: 'Creates a response through a Mastra-hosted Responses API-compatible route',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_EXECUTE,\n handler: async ({ mastra, requestContext, abortSignal, ...body }) => {\n try {\n const {\n agent,\n agentMemoryStore,\n configuredTools,\n createdAt,\n didStore,\n executionInput,\n previousResponseTurnRecord,\n resolvedModel,\n responseId,\n responseModel,\n responseMetadata,\n threadContext,\n } = await prepareCreateResponseRequest({ body, mastra, requestContext });\n\n if (!body.stream) {\n const result = await executeGenerate({\n agent,\n resolvedModel,\n modelOverride: body.model,\n instructions: body.instructions,\n text: body.text,\n providerOptions: body.providerOptions,\n input: executionInput,\n requestContext,\n abortSignal,\n threadContext,\n });\n\n const { response } = await finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result,\n responseId,\n createdAt,\n model: responseModel,\n instructions: body.instructions,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n configuredTools,\n responseMetadata,\n fallbackText: '',\n });\n\n return jsonResponse(response);\n }\n\n const streamResult = await executeStream({\n agent,\n resolvedModel,\n modelOverride: body.model,\n instructions: body.instructions,\n text: body.text,\n providerOptions: body.providerOptions,\n input: executionInput,\n requestContext,\n abortSignal,\n threadContext,\n });\n\n const stream = createResponseEventStream({\n agentMemoryStore,\n body,\n configuredTools,\n createdAt,\n didStore,\n previousResponseTurnRecord,\n responseId,\n responseModel,\n responseMetadata,\n streamResult,\n threadContext,\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream; charset=utf-8',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n } catch (error) {\n return handleError(error, 'Error creating response');\n }\n },\n});\n\nexport const GET_RESPONSE_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/responses/:responseId',\n responseType: 'json',\n pathParamSchema: responseIdPathParams,\n responseSchema: responseObjectSchema,\n summary: 'Retrieve a stored response',\n description: 'Returns a previously stored response object',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, responseId }) => {\n try {\n const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });\n if (!responseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });\n }\n\n return mapResponseTurnRecordToResponse(responseTurnRecord);\n } catch (error) {\n return handleError(error, 'Error retrieving response');\n }\n },\n});\n\nexport const DELETE_RESPONSE_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/responses/:responseId',\n responseType: 'json',\n pathParamSchema: responseIdPathParams,\n responseSchema: deleteResponseSchema,\n summary: 'Delete a stored response',\n description: 'Deletes a stored response so it can no longer be retrieved or chained',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, responseId }) => {\n try {\n const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });\n if (!responseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });\n }\n\n await deleteResponseTurnRecord({ responseTurnRecord });\n\n const response: DeleteResponse = {\n id: responseId,\n object: 'response',\n deleted: true,\n };\n\n return response;\n } catch (error) {\n return handleError(error, 'Error deleting response');\n }\n },\n});\n"]}
'use strict';
var chunkCXAJPAJ2_cjs = require('./chunk-CXAJPAJ2.cjs');
var chunk4ZHHKMDQ_cjs = require('./chunk-4ZHHKMDQ.cjs');
var chunk7DKSWNOM_cjs = require('./chunk-7DKSWNOM.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
var util = require('util');
var a2a = require('@mastra/core/a2a');
var v4 = require('zod/v4');
var crypto2 = require('crypto');
var promises = require('dns/promises');
var http = require('http');
var https = require('https');
var net = require('net');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var crypto2__namespace = /*#__PURE__*/_interopNamespace(crypto2);
// ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js
var require_canonicalize = chunkO7I5CWRX_cjs.__commonJS({
"../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js"(exports, module) {
module.exports = function serialize(object) {
if (object === null || typeof object !== "object" || object.toJSON != null) {
return JSON.stringify(object);
}
if (Array.isArray(object)) {
return "[" + object.reduce((t, cv, ci) => {
const comma = ci === 0 ? "" : ",";
const value = cv === void 0 || typeof cv === "symbol" ? null : cv;
return t + comma + serialize(value);
}, "") + "]";
}
return "{" + Object.keys(object).sort().reduce((t, cv, ci) => {
if (object[cv] === void 0 || typeof object[cv] === "symbol") {
return t;
}
const comma = t.length === 0 ? "" : ",";
return t + comma + serialize(cv) + ":" + serialize(object[cv]);
}, "") + "}";
};
}
});
// src/server/handlers/a2a.ts
var a2a_exports = {};
chunkO7I5CWRX_cjs.__export(a2a_exports, {
AGENT_EXECUTION_ROUTE: () => AGENT_EXECUTION_ROUTE,
GET_AGENT_CARD_ROUTE: () => GET_AGENT_CARD_ROUTE,
getAgentCardByIdHandler: () => getAgentCardByIdHandler,
getAgentExecutionHandler: () => getAgentExecutionHandler,
handleDeleteTaskPushNotificationConfig: () => handleDeleteTaskPushNotificationConfig,
handleGetTaskPushNotificationConfig: () => handleGetTaskPushNotificationConfig,
handleListTaskPushNotificationConfig: () => handleListTaskPushNotificationConfig,
handleMessageSend: () => handleMessageSend,
handleMessageStream: () => handleMessageStream,
handleSetTaskPushNotificationConfig: () => handleSetTaskPushNotificationConfig,
handleTaskCancel: () => handleTaskCancel,
handleTaskGet: () => handleTaskGet,
handleTaskResubscribe: () => handleTaskResubscribe
});
// src/server/a2a/agent-card-signing.ts
var import_canonicalize = chunkO7I5CWRX_cjs.__toESM(require_canonicalize(), 1);
var SUPPORTED_JWS_ALGORITHMS = /* @__PURE__ */ new Set([
"ES256",
"ES384",
"ES512",
"RS256",
"RS384",
"RS512",
"PS256",
"PS384",
"PS512"
]);
function stripAgentCardSignatures(agentCard) {
const unsignedCard = structuredClone(agentCard);
delete unsignedCard.signatures;
return unsignedCard;
}
function importSigningKey(signing) {
const { privateKey } = signing;
if (typeof privateKey === "string") {
return crypto2__namespace.createPrivateKey(privateKey);
}
return crypto2__namespace.createPrivateKey({
key: privateKey,
format: "jwk"
});
}
function getProtectedHeader(signing) {
const { alg, ...rest } = signing.protectedHeader;
if (!SUPPORTED_JWS_ALGORITHMS.has(alg)) {
throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${alg}`);
}
return {
...rest,
alg
};
}
function getSignatureOptions(algorithm) {
if (algorithm.startsWith("ES")) {
return { dsaEncoding: "ieee-p1363" };
}
if (algorithm.startsWith("PS")) {
return {
padding: crypto2__namespace.constants.RSA_PKCS1_PSS_PADDING,
saltLength: crypto2__namespace.constants.RSA_PSS_SALTLEN_DIGEST
};
}
return {};
}
function getDigestAlgorithm(algorithm) {
if (algorithm.endsWith("256")) return "sha256";
if (algorithm.endsWith("384")) return "sha384";
if (algorithm.endsWith("512")) return "sha512";
throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${algorithm}`);
}
async function signAgentCard({
agentCard,
signing
}) {
const canonicalPayload = (0, import_canonicalize.default)(stripAgentCardSignatures(agentCard));
if (!canonicalPayload) {
throw new Error("Failed to canonicalize A2A Agent Card for signing");
}
const key = importSigningKey(signing);
const protectedHeader = getProtectedHeader(signing);
const encodedHeader = Buffer.from(JSON.stringify(protectedHeader), "utf8").toString("base64url");
const encodedPayload = Buffer.from(canonicalPayload, "utf8").toString("base64url");
const signingInput = `${encodedHeader}.${encodedPayload}`;
const signatureBuffer = crypto2__namespace.sign(
getDigestAlgorithm(String(protectedHeader.alg)),
Buffer.from(signingInput, "utf8"),
{
key,
...getSignatureOptions(String(protectedHeader.alg))
}
);
const signatureValue = signatureBuffer.toString("base64url");
if (!encodedHeader || !signatureValue) {
throw new Error("Failed to create compact JWS for A2A Agent Card");
}
const signature = {
protected: encodedHeader,
signature: signatureValue,
header: signing.header
};
return {
...agentCard,
signatures: [...agentCard.signatures ?? [], signature]
};
}
function normalizeError(error, reqId, taskId, logger) {
let a2aError;
if (error instanceof a2a.MastraA2AError) {
a2aError = error;
} else if (error instanceof Error) {
a2aError = a2a.MastraA2AError.internalError(error.message, { stack: error.stack });
} else {
a2aError = a2a.MastraA2AError.internalError("An unknown error occurred.", error);
}
if (taskId && !a2aError.taskId) {
a2aError.taskId = taskId;
}
logger?.error(`Error processing request (Task: ${a2aError.taskId ?? "N/A"}, ReqID: ${reqId ?? "N/A"}):`, a2aError);
return createErrorResponse(reqId, a2aError.toJSONRPCError());
}
function createErrorResponse(id, error) {
return {
jsonrpc: "2.0",
id,
// Can be null if request ID was invalid/missing
error
};
}
function createSuccessResponse(id, result) {
if (!id) {
throw a2a.MastraA2AError.internalError("Cannot create success response for null ID.");
}
return {
jsonrpc: "2.0",
id,
result
};
}
function convertToCoreMessage(message) {
return {
role: message.role === "user" ? "user" : "assistant",
content: message.parts.map((msg) => convertToCoreMessagePart(msg))
};
}
function convertToCoreMessagePart(part) {
switch (part.kind) {
case "text":
return {
type: "text",
text: part.text
};
case "file":
return {
type: "file",
data: "uri" in part.file ? new URL(part.file.uri) : part.file.bytes,
mimeType: part.file.mimeType
};
case "data":
throw new Error("Data parts are not supported in core messages");
}
}
var DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER = "X-A2A-Notification-Token";
function isDisallowedHostname(hostname) {
const normalized = hostname.toLowerCase();
return normalized === "localhost" || normalized.endsWith(".localhost") || normalized.endsWith(".local") || normalized.endsWith(".internal") || !normalized.includes(".");
}
function isDisallowedIpv4(address) {
const [first = -1, second = -1] = address.split(".").map(Number);
return first === 10 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
}
function isDisallowedIpv6(address) {
const normalized = address.toLowerCase();
return normalized === "::1" || normalized.startsWith("fe8") || normalized.startsWith("fe9") || normalized.startsWith("fea") || normalized.startsWith("feb") || normalized.startsWith("fc") || normalized.startsWith("fd");
}
function isDisallowedIpAddress(address) {
const version = net.isIP(address);
if (version === 4) {
return isDisallowedIpv4(address);
}
if (version === 6) {
return isDisallowedIpv6(address);
}
return false;
}
var DefaultPushNotificationSender = class {
constructor(pushNotificationStore, options = {}) {
this.pushNotificationStore = pushNotificationStore;
this.options = options;
}
pushNotificationStore;
options;
getStore() {
return this.pushNotificationStore;
}
async resolveValidatedDestination(rawUrl) {
const url = new URL(rawUrl);
if (url.protocol !== "https:" && url.protocol !== "http:") {
throw new Error(`Push notification URL must use http or https: ${url.protocol}`);
}
const hostname = url.hostname.toLowerCase();
if (this.options.allowedHosts && !this.options.allowedHosts.includes(hostname)) {
throw new Error(`Push notification host is not allowed: ${hostname}`);
}
if (isDisallowedHostname(hostname)) {
throw new Error(`Push notification URL must not target local or internal hosts: ${hostname}`);
}
if (isDisallowedIpAddress(hostname)) {
throw new Error(`Push notification URL must not target local or private IPs: ${hostname}`);
}
const resolvedAddresses = net.isIP(hostname) === 0 ? await (this.options.lookup ?? promises.lookup)(hostname, { all: true, verbatim: true }) : [{ address: hostname, family: net.isIP(hostname) }];
if (resolvedAddresses.some((result) => isDisallowedIpAddress(result.address))) {
throw new Error(`Push notification URL resolved to a local or private IP: ${hostname}`);
}
const requestUrl = new URL(url.toString());
requestUrl.hostname = resolvedAddresses[0].address;
return {
originalUrl: url,
requestUrl,
hostHeader: url.host,
servername: net.isIP(hostname) === 0 ? hostname : void 0
};
}
async postTaskSnapshot({
requestUrl,
hostHeader,
servername,
headers,
body,
timeout
}) {
headers.set("host", hostHeader);
const signal = typeof AbortSignal.timeout === "function" ? AbortSignal.timeout(timeout) : void 0;
if (this.options.fetch) {
return this.options.fetch(requestUrl.toString(), {
method: "POST",
headers,
body,
signal
});
}
const transport = requestUrl.protocol === "https:" ? https.request : http.request;
return await new Promise((resolve, reject) => {
const request = transport(
{
protocol: requestUrl.protocol,
hostname: requestUrl.hostname,
port: requestUrl.port || void 0,
path: `${requestUrl.pathname}${requestUrl.search}`,
method: "POST",
headers: Object.fromEntries(headers.entries()),
servername
},
(response) => {
response.resume();
response.on("end", () => {
resolve({
ok: !!response.statusCode && response.statusCode >= 200 && response.statusCode < 300,
status: response.statusCode ?? 0,
statusText: response.statusMessage ?? ""
});
});
}
);
request.on("error", reject);
if (signal) {
signal.addEventListener(
"abort",
() => {
request.destroy(signal.reason instanceof Error ? signal.reason : new Error("Push notification timed out"));
},
{ once: true }
);
}
request.end(body);
});
}
async sendNotifications({
agentId,
task,
logger
}) {
const configs = this.pushNotificationStore.list({
agentId,
params: { id: task.id }
});
if (configs.length === 0) {
return;
}
await Promise.allSettled(
configs.map(async (config) => {
const headers = new Headers({
"content-type": "application/json"
});
if (config.pushNotificationConfig.token) {
headers.set(
this.options.tokenHeaderName ?? DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER,
config.pushNotificationConfig.token
);
}
const auth = config.pushNotificationConfig.authentication;
if (auth?.credentials) {
if (auth.schemes.includes("Bearer")) {
headers.set("authorization", `Bearer ${auth.credentials}`);
} else if (auth.schemes.includes("Basic")) {
headers.set("authorization", `Basic ${auth.credentials}`);
}
}
const { requestUrl, hostHeader, servername } = await this.resolveValidatedDestination(
config.pushNotificationConfig.url
);
const response = await this.postTaskSnapshot({
requestUrl,
hostHeader,
servername,
headers,
body: JSON.stringify(task),
timeout: this.options.timeout ?? 5e3
});
if (!response.ok) {
throw new Error(
`Push notification failed with status ${response.status} ${response.statusText ?? ""}`.trim()
);
}
})
).then((results) => {
for (const result of results) {
if (result.status === "rejected") {
logger?.error("Failed to deliver A2A push notification", result.reason);
}
}
});
}
};
// src/server/a2a/push-notification-store.ts
function normalizeConfigId(taskId, configId) {
return configId || taskId;
}
var InMemoryPushNotificationStore = class {
store = /* @__PURE__ */ new Map();
getKey(agentId, taskId) {
return JSON.stringify([agentId, taskId]);
}
set({ agentId, config }) {
const key = this.getKey(agentId, config.taskId);
const configs = this.store.get(key) ?? /* @__PURE__ */ new Map();
const normalizedConfig = {
taskId: config.taskId,
pushNotificationConfig: {
...config.pushNotificationConfig,
id: normalizeConfigId(config.taskId, config.pushNotificationConfig.id)
}
};
configs.set(normalizedConfig.pushNotificationConfig.id, structuredClone(normalizedConfig));
this.store.set(key, configs);
return structuredClone(normalizedConfig);
}
get({
agentId,
params
}) {
const key = this.getKey(agentId, params.id);
const configId = normalizeConfigId(params.id, params.pushNotificationConfigId);
const config = this.store.get(key)?.get(configId);
return config ? structuredClone(config) : null;
}
list({
agentId,
params
}) {
const key = this.getKey(agentId, params.id);
return Array.from(this.store.get(key)?.values() ?? []).map((config) => structuredClone(config));
}
delete({ agentId, params }) {
const key = this.getKey(agentId, params.id);
const configs = this.store.get(key);
if (!configs) {
return false;
}
const deleted = configs.delete(params.pushNotificationConfigId);
if (configs.size === 0) {
this.store.delete(key);
}
return deleted;
}
};
// src/server/a2a/tasks.ts
function isTaskStatusUpdate(update) {
return "state" in update && !("parts" in update);
}
function isArtifactUpdate(update) {
return "kind" in update && update.kind === "artifact-update";
}
function applyUpdateToTask(current, update) {
let newTask = structuredClone(current);
if (isTaskStatusUpdate(update)) {
newTask.status = {
...newTask.status,
// Keep existing properties if not overwritten
...update,
// Apply updates
timestamp: (/* @__PURE__ */ new Date()).toISOString()
};
} else if (isArtifactUpdate(update)) {
if (!newTask.artifacts) {
newTask.artifacts = [];
} else {
newTask.artifacts = [...newTask.artifacts];
}
const artifact = update.artifact;
const existingIndex = newTask.artifacts.findIndex((a) => a.name === artifact.name);
const existingArtifact = newTask.artifacts[existingIndex];
if (existingArtifact) {
if (update.append) {
const appendedArtifact = JSON.parse(JSON.stringify(existingArtifact));
appendedArtifact.parts.push(...artifact.parts);
if (artifact.metadata) {
appendedArtifact.metadata = {
...appendedArtifact.metadata || {},
...artifact.metadata
};
}
if (artifact.description) appendedArtifact.description = artifact.description;
newTask.artifacts[existingIndex] = appendedArtifact;
} else {
newTask.artifacts[existingIndex] = { ...artifact };
}
} else {
newTask.artifacts.push({ ...artifact });
}
}
return newTask;
}
async function loadOrCreateTask({
agentId,
taskId,
taskStore,
message,
contextId,
metadata,
logger
}) {
const data = await taskStore.load({ agentId, taskId });
if (!data) {
const initialTask = {
id: taskId,
contextId: contextId || crypto.randomUUID(),
status: {
state: "submitted",
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
message: void 0
},
artifacts: [],
history: [message],
metadata,
kind: "task"
};
logger?.info(`[Task ${taskId}] Created new task.`);
await taskStore.save({ agentId, data: initialTask });
return initialTask;
}
logger?.info(`[Task ${taskId}] Loaded existing task.`);
let updatedData = data;
updatedData.history = [...data.history || [], message];
const { status } = data;
const finalStates = ["completed", "failed", "canceled"];
if (finalStates.includes(status.state)) {
logger?.warn(`[Task ${taskId}] Received message for task in final state ${status.state}. Restarting.`);
updatedData = applyUpdateToTask(updatedData, {
state: "submitted",
message: void 0
});
} else if (status.state === "input-required") {
logger?.info(`[Task ${taskId}] Changing state from 'input-required' to 'working'.`);
updatedData = applyUpdateToTask(updatedData, { state: "working" });
} else if (status.state === "working") {
logger?.warn(`[Task ${taskId}] Received message while already 'working'. Proceeding.`);
}
await taskStore.save({ agentId, data: updatedData });
return updatedData;
}
function createTaskContext({
task,
userMessage,
history,
activeCancellations
}) {
return {
task: structuredClone(task),
userMessage,
history: structuredClone(history),
isCancelled: () => activeCancellations.has(task.id)
};
}
// src/server/handlers/a2a.ts
var messagePartSchema = v4.z.discriminatedUnion("kind", [
v4.z.object({
kind: v4.z.literal("text"),
text: v4.z.string(),
metadata: v4.z.record(v4.z.string(), v4.z.any()).optional()
}),
v4.z.object({
kind: v4.z.literal("file"),
file: v4.z.union([
v4.z.object({
bytes: v4.z.string(),
mimeType: v4.z.string().optional(),
name: v4.z.string().optional()
}),
v4.z.object({
uri: v4.z.string(),
mimeType: v4.z.string().optional(),
name: v4.z.string().optional()
})
]),
metadata: v4.z.record(v4.z.string(), v4.z.any()).optional()
}),
v4.z.object({
kind: v4.z.literal("data"),
data: v4.z.record(v4.z.string(), v4.z.any()),
metadata: v4.z.record(v4.z.string(), v4.z.any()).optional()
})
]);
var messageSendParamsSchema = v4.z.object({
message: v4.z.object({
role: v4.z.enum(["user", "agent"]),
parts: v4.z.array(messagePartSchema),
kind: v4.z.literal("message"),
messageId: v4.z.string(),
contextId: v4.z.string().optional(),
taskId: v4.z.string().optional(),
referenceTaskIds: v4.z.array(v4.z.string()).optional(),
extensions: v4.z.array(v4.z.string()).optional(),
metadata: v4.z.record(v4.z.string(), v4.z.any()).optional()
}),
configuration: v4.z.object({
acceptedOutputModes: v4.z.array(v4.z.string()).optional(),
blocking: v4.z.boolean().optional(),
historyLength: v4.z.number().optional(),
pushNotificationConfig: v4.z.object({
url: v4.z.string(),
id: v4.z.string().optional(),
token: v4.z.string().optional(),
authentication: v4.z.object({
schemes: v4.z.array(v4.z.string()),
credentials: v4.z.string().optional()
}).optional()
}).optional()
}).optional()
});
var defaultPushNotificationStore = new InMemoryPushNotificationStore();
var defaultPushNotificationSender = new DefaultPushNotificationSender(defaultPushNotificationStore);
function createAgentCardDefaults({
pushNotifications = false
} = {}) {
return {
protocolVersion: "0.3.0",
additionalInterfaces: [],
supportsAuthenticatedExtendedCard: false,
security: [],
securitySchemes: {},
capabilities: {
streaming: true,
pushNotifications,
stateTransitionHistory: false,
extensions: []
},
defaultInputModes: ["text/plain"],
defaultOutputModes: ["text/plain"]
};
}
async function getAgentCardByIdHandler({
mastra,
agentId,
executionUrl = `/a2a/${agentId}`,
provider = {
organization: "Mastra",
url: "https://mastra.ai"
},
version = "1.0",
pushNotifications = false,
requestContext
}) {
const agent = await chunk7DKSWNOM_cjs.getAgentFromSystem({ mastra, agentId });
const [instructions, tools] = await Promise.all([agent.getInstructions({ requestContext }), agent.listTools({ requestContext })]);
const agentCard = {
name: agent.id || agentId,
description: chunkGZ4HWZWE_cjs.convertInstructionsToString(instructions),
url: executionUrl,
provider,
version,
...createAgentCardDefaults({ pushNotifications }),
// Convert agent tools to skills format for A2A protocol
skills: Object.entries(tools).map(([toolId, tool]) => ({
id: toolId,
name: toolId,
description: tool.description || `Tool: ${toolId}`,
// Optional fields
tags: ["tool"]
}))
};
const signing = mastra.getServer?.()?.a2a?.agentCardSigning;
if (!signing) {
return agentCard;
}
return signAgentCard({
agentCard,
signing
});
}
function getA2AExecutionUrl({
agentId,
request,
routePrefix
}) {
const executionPath = `${routePrefix ?? ""}/a2a/${agentId}`;
if (!request) {
return executionPath;
}
return `${chunk4ZHHKMDQ_cjs.getPublicOrigin(request)}${executionPath}`;
}
function validateMessageSendParams(params) {
try {
messageSendParamsSchema.parse(params);
} catch (error) {
if (error instanceof v4.z.ZodError) {
throw a2a.MastraA2AError.invalidParams(error.issues[0].message);
}
throw error;
}
}
function createArtifactUpdate({
taskId,
contextId,
text,
data
}) {
const parts = [
...text ? [{ kind: "text", text }] : [],
...data ? [{ kind: "data", data }] : []
];
if (parts.length === 0) {
return void 0;
}
return {
kind: "artifact-update",
taskId,
contextId,
lastChunk: true,
artifact: {
artifactId: `${taskId}:response`,
name: data ? "response.json" : "response.txt",
parts
}
};
}
function createTextChunkArtifactUpdate({
taskId,
contextId,
text,
append,
lastChunk
}) {
return {
kind: "artifact-update",
taskId,
contextId,
...append ? { append: true } : {},
...lastChunk !== void 0 ? { lastChunk } : {},
artifact: {
artifactId: `${taskId}:response:text`,
name: "response.txt",
parts: [{ kind: "text", text }]
}
};
}
function createDataArtifactUpdate({
taskId,
contextId,
data,
lastChunk
}) {
return {
kind: "artifact-update",
taskId,
contextId,
...{ lastChunk } ,
artifact: {
artifactId: `${taskId}:response:data`,
name: "response.json",
parts: [{ kind: "data", data }]
}
};
}
function resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
}) {
if (pushNotificationSender) {
return {
pushNotificationStore: pushNotificationSender.getStore(),
pushNotificationSender
};
}
if (pushNotificationStore) {
return {
pushNotificationStore,
pushNotificationSender: new DefaultPushNotificationSender(pushNotificationStore)
};
}
return {
pushNotificationStore: defaultPushNotificationStore,
pushNotificationSender: defaultPushNotificationSender
};
}
function createTaskPushNotificationConfig(taskId, pushNotificationConfig) {
return {
taskId,
pushNotificationConfig: {
...pushNotificationConfig,
id: pushNotificationConfig.id ?? taskId
}
};
}
function shouldSendPushNotification(previousTask, nextTask) {
const pushTriggerStates = ["completed", "failed", "canceled", "input-required"];
if (!pushTriggerStates.includes(nextTask.status.state)) {
return false;
}
return previousTask?.status.state !== nextTask.status.state;
}
async function saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender,
previousTask,
nextTask,
agentId,
logger
}) {
await taskStore.save({ agentId, data: nextTask });
if (!shouldSendPushNotification(previousTask, nextTask)) {
return;
}
void pushNotificationSender.sendNotifications({
agentId,
task: nextTask,
logger
}).catch((error) => {
logger?.error("Failed to schedule A2A push notification", error);
});
}
function extractFullStreamTextDelta(value) {
if (typeof value !== "object" || value === null || !("type" in value)) {
return null;
}
const chunk = value;
switch (chunk.type) {
case "text-delta":
if (typeof chunk.payload?.text === "string") {
return chunk.payload.text;
}
if (typeof chunk.payload?.delta === "string") {
return chunk.payload.delta;
}
if (typeof chunk.textDelta === "string") {
return chunk.textDelta;
}
if (typeof chunk.delta === "string") {
return chunk.delta;
}
if (typeof chunk.text === "string") {
return chunk.text;
}
return null;
default:
return null;
}
}
function extractFinalStructuredObject(value) {
if (typeof value !== "object" || value === null || !("type" in value)) {
return void 0;
}
const chunk = value;
if (chunk.type !== "object-result") {
return void 0;
}
const objectValue = chunk.payload?.object ?? chunk.object;
return objectValue && typeof objectValue === "object" ? objectValue : void 0;
}
function isTerminalTaskState(state) {
return ["completed", "failed", "canceled"].includes(state);
}
function artifactIdentity(artifact) {
return artifact.artifactId || artifact.name;
}
function areArtifactPartsEqual(left, right) {
if (left === right) {
return true;
}
if (left.length !== right.length) {
return false;
}
return left.every((part, index) => {
const other = right[index];
if (!other || part.kind !== other.kind) {
return false;
}
if (part.kind === "text" && other.kind === "text") {
return part.text === other.text;
}
return part === other;
});
}
function areArtifactsEqual(left, right) {
if (left === right) {
return true;
}
if (!left || !right) {
return left === right;
}
return left.artifactId === right.artifactId && left.name === right.name && left.description === right.description && left.metadata === right.metadata && areArtifactPartsEqual(left.parts, right.parts);
}
function areStatusMessagePartsEqual(left, right) {
return left === right || util.isDeepStrictEqual(left, right);
}
function areStatusMessagesEqual(left, right) {
if (left === right) {
return true;
}
if (!left || !right) {
return left === right;
}
return left.messageId === right.messageId && left.kind === right.kind && left.role === right.role && left.contextId === right.contextId && left.taskId === right.taskId && util.isDeepStrictEqual(left.referenceTaskIds, right.referenceTaskIds) && util.isDeepStrictEqual(left.extensions, right.extensions) && util.isDeepStrictEqual(left.metadata, right.metadata) && areStatusMessagePartsEqual(left.parts, right.parts);
}
function didTaskStatusChange(previous, next) {
return previous.status.state !== next.status.state || previous.status.timestamp !== next.status.timestamp || !areStatusMessagesEqual(previous.status.message, next.status.message);
}
function getTaskArtifactUpdates({ previous, next }) {
const previousArtifacts = new Map((previous.artifacts ?? []).map((artifact) => [artifactIdentity(artifact), artifact]));
const changedArtifacts = (next.artifacts ?? []).filter((artifact) => {
const priorArtifact = previousArtifacts.get(artifactIdentity(artifact));
return !priorArtifact || !areArtifactsEqual(priorArtifact, artifact);
});
return changedArtifacts.map((artifact, index) => ({
kind: "artifact-update",
taskId: next.id,
contextId: next.contextId,
lastChunk: isTerminalTaskState(next.status.state) && index === changedArtifacts.length - 1,
artifact: structuredClone(artifact)
}));
}
async function handleMessageSend({
requestId,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
agent,
agentId,
logger,
requestContext
}) {
validateMessageSendParams(params);
const { message, metadata } = params;
const { contextId } = message;
const taskId = message.taskId || crypto.randomUUID();
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let currentData = await loadOrCreateTask({
taskId,
taskStore,
agentId,
message,
contextId,
metadata
});
if (params.configuration?.pushNotificationConfig) {
resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig)
});
}
const context = createTaskContext({
task: currentData,
userMessage: message,
history: currentData.history || [],
activeCancellations: taskStore.activeCancellations
});
try {
const resourceId = metadata?.resourceId ?? message.metadata?.resourceId ?? agentId;
const result = await agent.generate([convertToCoreMessage(message)], {
runId: taskId,
requestContext,
...contextId ? { threadId: contextId, resourceId } : {}
});
const artifactUpdate = createArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: result.text,
data: result.object
});
if (artifactUpdate) {
currentData = applyUpdateToTask(currentData, artifactUpdate);
}
currentData = applyUpdateToTask(currentData, {
state: "completed",
message: void 0
});
currentData.metadata = {
...currentData.metadata,
execution: {
toolCalls: result.toolCalls,
toolResults: result.toolResults,
usage: result.usage,
finishReason: result.finishReason
}
};
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask: context.task,
nextTask: currentData,
agentId,
logger
});
context.task = currentData;
} catch (handlerError) {
const failureStatusUpdate = {
state: "failed",
message: {
messageId: crypto.randomUUID(),
role: "agent",
parts: [
{
kind: "text",
text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`
}
],
kind: "message"
}
};
currentData = applyUpdateToTask(currentData, failureStatusUpdate);
try {
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask: context.task,
nextTask: currentData,
agentId,
logger
});
} catch (saveError) {
logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);
}
return normalizeError(handlerError, requestId, currentData.id, logger);
}
return createSuccessResponse(requestId, currentData);
}
async function handleTaskGet({
requestId,
taskStore,
agentId,
taskId
}) {
const task = await taskStore.load({ agentId, taskId });
if (!task) {
throw a2a.MastraA2AError.taskNotFound(taskId);
}
return createSuccessResponse(requestId, task);
}
async function loadTaskOrThrow({
taskStore,
agentId,
taskId
}) {
const task = await taskStore.load({ agentId, taskId });
if (!task) {
throw a2a.MastraA2AError.taskNotFound(taskId);
}
return task;
}
async function handleSetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.taskId
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const config = resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(params.taskId, params.pushNotificationConfig)
});
return createSuccessResponse(requestId, config);
}
async function handleGetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const config = resolvedPushNotificationStore.get({
agentId,
params
});
if (!config) {
throw a2a.MastraA2AError.invalidParams(
`Push notification config not found: ${params.pushNotificationConfigId ?? params.id}`
);
}
return createSuccessResponse(requestId, config);
}
async function handleListTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const configs = resolvedPushNotificationStore.list({
agentId,
params
});
return createSuccessResponse(requestId, configs);
}
async function handleDeleteTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const deleted = resolvedPushNotificationStore.delete({
agentId,
params
});
if (!deleted) {
throw a2a.MastraA2AError.invalidParams(`Push notification config not found: ${params.pushNotificationConfigId}`);
}
return createSuccessResponse(requestId, null);
}
async function* handleMessageStream({
requestId,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
agent,
agentId,
logger,
requestContext
}) {
validateMessageSendParams(params);
const { message, metadata } = params;
const { contextId } = message;
const taskId = message.taskId || crypto.randomUUID();
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let currentData = await loadOrCreateTask({
taskId,
taskStore,
agentId,
message,
contextId,
metadata
});
if (params.configuration?.pushNotificationConfig) {
resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig)
});
}
currentData = applyUpdateToTask(currentData, {
state: "working",
message: {
messageId: crypto.randomUUID(),
kind: "message",
role: "agent",
parts: [{ kind: "text", text: "Generating response..." }]
}
});
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, currentData);
try {
const resourceId = metadata?.resourceId ?? message.metadata?.resourceId ?? agentId;
const result = await agent.stream([convertToCoreMessage(message)], {
runId: taskId,
requestContext,
...contextId ? { threadId: contextId, resourceId } : {}
});
let sawTextArtifact = false;
let pendingTextChunk;
let structuredData;
for await (const chunk of result.fullStream) {
const textDelta = extractFullStreamTextDelta(chunk);
if (textDelta !== null) {
if (!pendingTextChunk) {
pendingTextChunk = textDelta;
continue;
}
const textUpdate = createTextChunkArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: pendingTextChunk,
append: sawTextArtifact,
lastChunk: false
});
currentData = applyUpdateToTask(currentData, textUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, textUpdate);
sawTextArtifact = true;
pendingTextChunk = textDelta;
continue;
}
const finalStructuredObject = extractFinalStructuredObject(chunk);
if (finalStructuredObject) {
structuredData = finalStructuredObject;
}
}
structuredData ??= await result.object;
if (!pendingTextChunk && !sawTextArtifact) {
const finalText = await result.text;
if (finalText) {
pendingTextChunk = finalText;
}
}
if (pendingTextChunk) {
const textUpdate = createTextChunkArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: pendingTextChunk,
append: sawTextArtifact,
lastChunk: !structuredData
});
currentData = applyUpdateToTask(currentData, textUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, textUpdate);
sawTextArtifact = true;
pendingTextChunk = void 0;
}
if (structuredData) {
const dataUpdate = createDataArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
data: structuredData,
lastChunk: true
});
currentData = applyUpdateToTask(currentData, dataUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, dataUpdate);
}
const previousTask = currentData;
const completedTask = applyUpdateToTask(currentData, {
state: "completed",
message: void 0
});
completedTask.metadata = {
...completedTask.metadata,
execution: {
toolCalls: await result.toolCalls,
toolResults: await result.toolResults,
usage: await result.usage,
finishReason: await result.finishReason
}
};
currentData = completedTask;
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask,
nextTask: currentData,
agentId,
logger
});
} catch (handlerError) {
const previousTask = currentData;
currentData = applyUpdateToTask(currentData, {
state: "failed",
message: {
messageId: crypto.randomUUID(),
role: "agent",
parts: [
{
kind: "text",
text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`
}
],
kind: "message"
}
});
try {
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask,
nextTask: currentData,
agentId,
logger
});
} catch (saveError) {
logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);
}
}
yield createSuccessResponse(requestId, {
kind: "status-update",
taskId: currentData.id,
contextId: currentData.contextId,
status: currentData.status,
final: true
});
}
async function* handleTaskResubscribe({
requestId,
taskStore,
agentId,
taskId,
abortSignal
}) {
let snapshot = taskStore.loadWithVersion({ agentId, taskId });
if (!snapshot) {
throw a2a.MastraA2AError.taskNotFound(taskId);
}
yield createSuccessResponse(requestId, snapshot.task);
if (isTerminalTaskState(snapshot.task.status.state)) {
return;
}
while (true) {
const { task, version } = snapshot;
const nextUpdate = await taskStore.waitForNextUpdate({
agentId,
taskId,
afterVersion: version,
signal: abortSignal
});
for (const artifactUpdate of getTaskArtifactUpdates({ previous: task, next: nextUpdate.task })) {
yield createSuccessResponse(requestId, artifactUpdate);
}
if (didTaskStatusChange(task, nextUpdate.task)) {
yield createSuccessResponse(requestId, {
kind: "status-update",
taskId: nextUpdate.task.id,
contextId: nextUpdate.task.contextId,
status: nextUpdate.task.status,
final: isTerminalTaskState(nextUpdate.task.status.state)
});
}
if (isTerminalTaskState(nextUpdate.task.status.state)) {
return;
}
snapshot = nextUpdate;
}
}
function getTaskIdFromParams(params) {
if (!params || typeof params !== "object") {
return void 0;
}
if ("id" in params && typeof params.id === "string") {
return params.id;
}
if ("taskId" in params && typeof params.taskId === "string") {
return params.taskId;
}
if ("message" in params && params.message && typeof params.message === "object" && "taskId" in params.message) {
return typeof params.message.taskId === "string" ? params.message.taskId : void 0;
}
return void 0;
}
function isAsyncIterable(value) {
return !!value && typeof value === "object" && Symbol.asyncIterator in value;
}
function createA2AJsonResponse(payload) {
return Response.json(payload);
}
function createA2ASSEResponse(payload) {
const encoder = new TextEncoder();
const iterable = isAsyncIterable(payload) ? payload : (async function* () {
yield payload;
})();
const stream = new ReadableStream({
async start(controller) {
try {
for await (const chunk of iterable) {
controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}
`));
}
} catch (error) {
controller.error(error);
return;
}
controller.close();
}
});
return new Response(stream, {
headers: {
"Content-Type": "text/event-stream; charset=utf-8",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"X-Accel-Buffering": "no"
}
});
}
async function handleTaskCancel({
requestId,
taskStore,
pushNotificationSender,
agentId,
taskId,
logger
}) {
let data = await taskStore.load({
agentId,
taskId
});
if (!data) {
throw a2a.MastraA2AError.taskNotFound(taskId);
}
const finalStates = ["completed", "failed", "canceled"];
if (finalStates.includes(data.status.state)) {
logger?.info(`Task ${taskId} already in final state ${data.status.state}, cannot cancel.`);
return createSuccessResponse(requestId, data);
}
taskStore.activeCancellations.add(taskId);
const cancelUpdate = {
state: "canceled",
message: {
role: "agent",
parts: [{ kind: "text", text: "Task cancelled by request." }],
kind: "message",
messageId: crypto.randomUUID()
}
};
const previousTask = data;
data = applyUpdateToTask(data, cancelUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvePushNotificationPair({ pushNotificationSender }).pushNotificationSender,
previousTask,
nextTask: data,
agentId,
logger
});
taskStore.activeCancellations.delete(taskId);
return createSuccessResponse(requestId, data);
}
async function getAgentExecutionHandler({
requestId,
mastra,
agentId,
requestContext,
method,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
logger,
abortSignal
}) {
const agent = await chunk7DKSWNOM_cjs.getAgentFromSystem({ mastra, agentId });
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let taskId;
try {
taskId = getTaskIdFromParams(params);
switch (method) {
case "message/send": {
const result = await handleMessageSend({
requestId,
params,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender,
agent,
agentId,
logger,
requestContext
});
return result;
}
case "message/stream": {
const result = await handleMessageStream({
requestId,
taskStore,
params,
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender,
agent,
agentId,
logger,
requestContext
});
return result;
}
case "tasks/get": {
const result = await handleTaskGet({
requestId,
taskStore,
agentId,
taskId: taskId || "No task ID provided"
});
return result;
}
case "tasks/cancel": {
const result = await handleTaskCancel({
requestId,
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
agentId,
taskId: taskId || "No task ID provided",
logger
});
return result;
}
case "tasks/resubscribe":
return await handleTaskResubscribe({
requestId,
taskStore,
agentId,
taskId: taskId || "No task ID provided",
abortSignal
});
case "tasks/pushNotificationConfig/set":
return await handleSetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/get":
return await handleGetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/list":
return await handleListTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/delete":
return await handleDeleteTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "agent/getAuthenticatedExtendedCard":
throw a2a.MastraA2AError.extendedAgentCardNotConfigured();
default:
throw a2a.MastraA2AError.methodNotFound(method);
}
} catch (error) {
if (error instanceof a2a.MastraA2AError && taskId && !error.taskId) {
error.taskId = taskId;
}
return normalizeError(error, requestId, taskId, logger);
}
}
var GET_AGENT_CARD_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/.well-known/:agentId/agent-card.json",
responseType: "json",
pathParamSchema: chunkCXAJPAJ2_cjs.a2aAgentIdPathParams,
responseSchema: chunkCXAJPAJ2_cjs.agentCardResponseSchema,
summary: "Get agent card",
description: "Returns the agent card information for A2A protocol discovery",
tags: ["Agent-to-Agent"],
requiresAuth: true,
handler: async (ctx) => {
const executionUrl = getA2AExecutionUrl({
agentId: ctx.agentId,
request: ctx.request,
routePrefix: ctx.routePrefix
});
return getAgentCardByIdHandler({
mastra: ctx.mastra,
requestContext: ctx.requestContext,
agentId: ctx.agentId,
executionUrl,
pushNotifications: true
});
}
});
var AGENT_EXECUTION_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/a2a/:agentId",
responseType: "datastream-response",
pathParamSchema: chunkCXAJPAJ2_cjs.a2aAgentIdPathParams,
bodySchema: chunkCXAJPAJ2_cjs.agentExecutionBodySchema,
responseSchema: chunkCXAJPAJ2_cjs.agentExecutionResponseSchema,
summary: "Execute agent",
description: "Executes an agent action via JSON-RPC 2.0 over A2A protocol",
tags: ["Agent-to-Agent"],
requiresAuth: true,
handler: async ({ mastra, agentId, requestContext, taskStore, abortSignal, ...bodyParams }) => {
const { id: requestId, method } = bodyParams;
const params = "params" in bodyParams ? bodyParams.params : void 0;
const result = await getAgentExecutionHandler({
requestId,
mastra,
agentId,
requestContext,
method,
params,
taskStore,
abortSignal
});
if (method === "message/stream" || method === "tasks/resubscribe") {
return createA2ASSEResponse(result);
}
return createA2AJsonResponse(result);
}
});
exports.AGENT_EXECUTION_ROUTE = AGENT_EXECUTION_ROUTE;
exports.GET_AGENT_CARD_ROUTE = GET_AGENT_CARD_ROUTE;
exports.a2a_exports = a2a_exports;
exports.getAgentCardByIdHandler = getAgentCardByIdHandler;
exports.getAgentExecutionHandler = getAgentExecutionHandler;
exports.handleDeleteTaskPushNotificationConfig = handleDeleteTaskPushNotificationConfig;
exports.handleGetTaskPushNotificationConfig = handleGetTaskPushNotificationConfig;
exports.handleListTaskPushNotificationConfig = handleListTaskPushNotificationConfig;
exports.handleMessageSend = handleMessageSend;
exports.handleMessageStream = handleMessageStream;
exports.handleSetTaskPushNotificationConfig = handleSetTaskPushNotificationConfig;
exports.handleTaskCancel = handleTaskCancel;
exports.handleTaskGet = handleTaskGet;
exports.handleTaskResubscribe = handleTaskResubscribe;
//# sourceMappingURL=chunk-K3FM6RLZ.cjs.map
//# sourceMappingURL=chunk-K3FM6RLZ.cjs.map

Sorry, the diff of this file is too big to display

'use strict';
var chunkDCDQNIYY_cjs = require('./chunk-DCDQNIYY.cjs');
var chunk7DKSWNOM_cjs = require('./chunk-7DKSWNOM.cjs');
var chunkDIG2K5CV_cjs = require('./chunk-DIG2K5CV.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
// src/server/handlers/scores.ts
var scores_exports = {};
chunkO7I5CWRX_cjs.__export(scores_exports, {
GET_SCORER_ROUTE: () => GET_SCORER_ROUTE,
LIST_SCORERS_ROUTE: () => LIST_SCORERS_ROUTE,
LIST_SCORES_BY_ENTITY_ID_ROUTE: () => LIST_SCORES_BY_ENTITY_ID_ROUTE,
LIST_SCORES_BY_RUN_ID_ROUTE: () => LIST_SCORES_BY_RUN_ID_ROUTE,
LIST_SCORES_BY_SCORER_ID_ROUTE: () => LIST_SCORES_BY_SCORER_ID_ROUTE,
SAVE_SCORE_ROUTE: () => SAVE_SCORE_ROUTE
});
async function listScorersFromSystem({
mastra,
requestContext
}) {
const agents = mastra.listAgents();
const workflows = mastra.listWorkflows();
const scorersMap = /* @__PURE__ */ new Map();
const processAgentScorers = async (agent) => {
const scorers = await agent.listScorers({
requestContext
}) || {};
if (Object.keys(scorers).length > 0) {
for (const [_scorerId, scorer] of Object.entries(scorers)) {
const scorerId = scorer.scorer.id;
if (scorersMap.has(scorerId)) {
scorersMap.get(scorerId)?.agentIds.push(agent.id);
scorersMap.get(scorerId)?.agentNames.push(agent.name);
} else {
scorersMap.set(scorerId, {
workflowIds: [],
...scorer,
agentNames: [agent.name],
agentIds: [agent.id],
isRegistered: false,
source: scorer.scorer.source ?? "code"
});
}
}
}
};
for (const [_, agent] of Object.entries(agents)) {
await processAgentScorers(agent);
}
try {
const editor = mastra.getEditor();
const storedAgentsResult = await editor?.agent.list();
if (storedAgentsResult?.agents) {
for (const storedAgentConfig of storedAgentsResult.agents) {
try {
const agent = await editor?.agent.getById(storedAgentConfig.id);
if (agent) {
await processAgentScorers(agent);
}
} catch {
}
}
}
} catch {
}
try {
const editor = mastra.getEditor();
const storedScorersResult = await editor?.scorer.list();
if (storedScorersResult?.scorerDefinitions) {
for (const storedScorerConfig of storedScorersResult.scorerDefinitions) {
try {
await editor?.scorer.getById(storedScorerConfig.id);
} catch {
}
}
}
} catch {
}
for (const [workflowId, workflow] of Object.entries(workflows)) {
const scorers = await workflow.listScorers({
requestContext
}) || {};
if (Object.keys(scorers).length > 0) {
for (const [_scorerId, scorer] of Object.entries(scorers)) {
const scorerName = scorer.scorer.name;
if (scorersMap.has(scorerName)) {
scorersMap.get(scorerName)?.workflowIds.push(workflowId);
} else {
scorersMap.set(scorerName, {
agentIds: [],
agentNames: [],
...scorer,
workflowIds: [workflowId],
isRegistered: false,
source: scorer.scorer.source ?? "code"
});
}
}
}
}
const registeredScorers = await mastra.listScorers();
for (const [_scorerId, scorer] of Object.entries(registeredScorers || {})) {
const scorerId = scorer.id;
if (scorersMap.has(scorerId)) {
scorersMap.get(scorerId).isRegistered = true;
} else {
scorersMap.set(scorerId, {
scorer,
agentIds: [],
agentNames: [],
workflowIds: [],
isRegistered: true,
source: scorer.source ?? "code"
});
}
}
return Object.fromEntries(scorersMap.entries());
}
function getTraceDetails(traceIdWithSpanId) {
if (!traceIdWithSpanId) {
return {};
}
const [traceId, spanId] = traceIdWithSpanId.split("-");
return {
...traceId ? { traceId } : {},
...spanId ? { spanId } : {}
};
}
var LIST_SCORERS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/scorers",
responseType: "json",
responseSchema: chunkDCDQNIYY_cjs.listScorersResponseSchema,
summary: "List all scorers",
description: "Returns a list of all registered scorers with their configuration and associated agents and workflows",
tags: ["Scoring"],
requiresAuth: true,
handler: (async ({ mastra, requestContext }) => {
const scorers = await listScorersFromSystem({
mastra,
requestContext
});
return scorers;
})
});
var GET_SCORER_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/scorers/:scorerId",
responseType: "json",
pathParamSchema: chunkDCDQNIYY_cjs.scorerIdPathParams,
responseSchema: chunkDCDQNIYY_cjs.scorerEntrySchema.nullable(),
summary: "Get scorer by ID",
description: "Returns details for a specific scorer including its configuration and associations",
tags: ["Scoring"],
requiresAuth: true,
handler: (async ({ mastra, scorerId, requestContext }) => {
const scorers = await listScorersFromSystem({
mastra,
requestContext
});
const scorer = scorers[scorerId];
if (!scorer) {
return null;
}
return scorer;
})
});
var LIST_SCORES_BY_RUN_ID_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/run/:runId",
responseType: "json",
pathParamSchema: chunkDIG2K5CV_cjs.runIdSchema,
queryParamSchema: chunkDCDQNIYY_cjs.listScoresByRunIdQuerySchema,
responseSchema: chunkDCDQNIYY_cjs.scoresWithPaginationResponseSchema,
summary: "List scores by run ID",
description: "Returns all scores for a specific execution run",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, runId, ...params }) => {
try {
const { page, perPage } = params;
const pagination = {
page: page ?? 0,
perPage: perPage ?? 10
};
const scores = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scores?.listScoresByRunId?.({
runId,
pagination
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting scores by run id");
}
}
});
var LIST_SCORES_BY_SCORER_ID_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/scorer/:scorerId",
responseType: "json",
pathParamSchema: chunkDCDQNIYY_cjs.scorerIdPathParams,
queryParamSchema: chunkDCDQNIYY_cjs.listScoresByScorerIdQuerySchema,
responseSchema: chunkDCDQNIYY_cjs.scoresWithPaginationResponseSchema,
summary: "List scores by scorer ID",
description: "Returns all scores generated by a specific scorer",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, scorerId, ...params }) => {
try {
const { page, perPage, entityId, entityType } = params;
const filters = Object.fromEntries(Object.entries({ entityId, entityType }).filter(([_, v]) => v !== void 0));
const scores = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scores?.listScoresByScorerId?.({
scorerId,
pagination: { page: page ?? 0, perPage: perPage ?? 10 },
...filters
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting scores by scorer id");
}
}
});
var LIST_SCORES_BY_ENTITY_ID_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/entity/:entityType/:entityId",
responseType: "json",
pathParamSchema: chunkDCDQNIYY_cjs.entityPathParams,
queryParamSchema: chunkDCDQNIYY_cjs.listScoresByEntityIdQuerySchema,
responseSchema: chunkDCDQNIYY_cjs.scoresWithPaginationResponseSchema,
summary: "List scores by entity ID",
description: "Returns all scores for a specific entity (agent or workflow)",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, entityId, entityType, ...params }) => {
try {
const { page, perPage } = params;
let entityIdToUse = entityId;
if (entityType === "AGENT") {
const agent = await chunk7DKSWNOM_cjs.getAgentFromSystem({ mastra, agentId: entityId });
entityIdToUse = agent.id;
} else if (entityType === "WORKFLOW") {
const workflow = mastra.getWorkflowById(entityId);
entityIdToUse = workflow.id;
}
const pagination = {
page: page ?? 0,
perPage: perPage ?? 10
};
const scoresStore = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scoresStore?.listScoresByEntityId?.({
entityId: entityIdToUse,
entityType,
pagination
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting scores by entity id");
}
}
});
var SAVE_SCORE_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/scores",
responseType: "json",
bodySchema: chunkDCDQNIYY_cjs.saveScoreBodySchema,
responseSchema: chunkDCDQNIYY_cjs.saveScoreResponseSchema,
summary: "Save score",
description: "Saves a new score record to storage",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, ...params }) => {
try {
const { score } = params;
const scoresStore = await mastra.getStorage()?.getStore("scores");
const result = await scoresStore?.saveScore?.(score);
if (!result) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage not configured" });
}
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error saving score");
}
}
});
exports.GET_SCORER_ROUTE = GET_SCORER_ROUTE;
exports.LIST_SCORERS_ROUTE = LIST_SCORERS_ROUTE;
exports.LIST_SCORES_BY_ENTITY_ID_ROUTE = LIST_SCORES_BY_ENTITY_ID_ROUTE;
exports.LIST_SCORES_BY_RUN_ID_ROUTE = LIST_SCORES_BY_RUN_ID_ROUTE;
exports.LIST_SCORES_BY_SCORER_ID_ROUTE = LIST_SCORES_BY_SCORER_ID_ROUTE;
exports.SAVE_SCORE_ROUTE = SAVE_SCORE_ROUTE;
exports.scores_exports = scores_exports;
//# sourceMappingURL=chunk-M5DAKMVZ.cjs.map
//# sourceMappingURL=chunk-M5DAKMVZ.cjs.map
{"version":3,"sources":["../src/server/handlers/scores.ts"],"names":["__export","createRoute","listScorersResponseSchema","scorerIdPathParams","scorerEntrySchema","runIdSchema","listScoresByRunIdQuerySchema","scoresWithPaginationResponseSchema","handleError","listScoresByScorerIdQuerySchema","entityPathParams","listScoresByEntityIdQuerySchema","getAgentFromSystem","saveScoreBodySchema","saveScoreResponseSchema","HTTPException"],"mappings":"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","file":"chunk-M5DAKMVZ.cjs","sourcesContent":["import type { MastraScorerEntry, ScoreRowData } from '@mastra/core/evals';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { HTTPException } from '../http-exception';\nimport { runIdSchema } from '../schemas/common';\nimport {\n listScorersResponseSchema,\n scorerEntrySchema,\n scorerIdPathParams,\n entityPathParams,\n listScoresByRunIdQuerySchema,\n listScoresByScorerIdQuerySchema,\n listScoresByEntityIdQuerySchema,\n saveScoreBodySchema,\n scoresWithPaginationResponseSchema,\n saveScoreResponseSchema,\n} from '../schemas/scores';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport type { Context } from '../types';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\n\nasync function listScorersFromSystem({\n mastra,\n requestContext,\n}: Context & {\n requestContext: RequestContext;\n}) {\n const agents = mastra.listAgents();\n const workflows = mastra.listWorkflows();\n\n const scorersMap = new Map<\n string,\n MastraScorerEntry & {\n agentIds: string[];\n agentNames: string[];\n workflowIds: string[];\n isRegistered: boolean;\n source: 'code' | 'stored';\n }\n >();\n\n // Helper function to process an agent's scorers\n const processAgentScorers = async (agent: {\n id: string;\n name: string;\n listScorers: (typeof agents)[string]['listScorers'];\n }) => {\n const scorers =\n (await agent.listScorers({\n requestContext,\n })) || {};\n\n if (Object.keys(scorers).length > 0) {\n for (const [_scorerId, scorer] of Object.entries(scorers)) {\n const scorerId = scorer.scorer.id;\n if (scorersMap.has(scorerId)) {\n scorersMap.get(scorerId)?.agentIds.push(agent.id);\n scorersMap.get(scorerId)?.agentNames.push(agent.name);\n } else {\n scorersMap.set(scorerId, {\n workflowIds: [],\n ...scorer,\n agentNames: [agent.name],\n agentIds: [agent.id],\n isRegistered: false,\n source: scorer.scorer.source ?? 'code',\n });\n }\n }\n }\n };\n\n // Process code-defined agents\n for (const [_, agent] of Object.entries(agents)) {\n await processAgentScorers(agent);\n }\n\n // Process stored agents (database-backed agents)\n try {\n const editor = mastra.getEditor();\n const storedAgentsResult = await editor?.agent.list();\n if (storedAgentsResult?.agents) {\n for (const storedAgentConfig of storedAgentsResult.agents) {\n try {\n const agent = await editor?.agent.getById(storedAgentConfig.id);\n if (agent) {\n await processAgentScorers(agent);\n }\n } catch {\n // Skip individual agents that fail to hydrate\n }\n }\n }\n } catch {\n // Silently ignore if storage is not configured - not all setups have storage\n }\n\n // Process stored scorers (standalone CMS-created scorers)\n try {\n const editor = mastra.getEditor();\n const storedScorersResult = await editor?.scorer.list();\n if (storedScorersResult?.scorerDefinitions) {\n for (const storedScorerConfig of storedScorersResult.scorerDefinitions) {\n try {\n await editor?.scorer.getById(storedScorerConfig.id);\n } catch {\n // Skip individual scorers that fail to hydrate\n }\n }\n }\n } catch {\n // Silently ignore if storage is not configured\n }\n\n for (const [workflowId, workflow] of Object.entries(workflows)) {\n const scorers =\n (await workflow.listScorers({\n requestContext,\n })) || {};\n\n if (Object.keys(scorers).length > 0) {\n for (const [_scorerId, scorer] of Object.entries(scorers)) {\n const scorerName = scorer.scorer.name;\n if (scorersMap.has(scorerName)) {\n scorersMap.get(scorerName)?.workflowIds.push(workflowId);\n } else {\n scorersMap.set(scorerName, {\n agentIds: [],\n agentNames: [],\n ...scorer,\n workflowIds: [workflowId],\n isRegistered: false,\n source: scorer.scorer.source ?? 'code',\n });\n }\n }\n }\n }\n\n const registeredScorers = await mastra.listScorers();\n for (const [_scorerId, scorer] of Object.entries(registeredScorers || {})) {\n const scorerId = scorer.id;\n if (scorersMap.has(scorerId)) {\n scorersMap.get(scorerId)!.isRegistered = true;\n } else {\n scorersMap.set(scorerId, {\n scorer: scorer,\n agentIds: [],\n agentNames: [],\n workflowIds: [],\n isRegistered: true,\n source: scorer.source ?? 'code',\n });\n }\n }\n\n return Object.fromEntries(scorersMap.entries());\n}\n\n// Legacy function to get trace and span details\nfunction getTraceDetails(traceIdWithSpanId?: string) {\n if (!traceIdWithSpanId) {\n return {};\n }\n\n const [traceId, spanId] = traceIdWithSpanId.split('-');\n\n return {\n ...(traceId ? { traceId } : {}),\n ...(spanId ? { spanId } : {}),\n };\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport const LIST_SCORERS_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorers',\n responseType: 'json',\n responseSchema: listScorersResponseSchema,\n summary: 'List all scorers',\n description: 'Returns a list of all registered scorers with their configuration and associated agents and workflows',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: (async ({ mastra, requestContext }: any) => {\n const scorers = await listScorersFromSystem({\n mastra,\n requestContext,\n });\n return scorers;\n }) as any,\n});\n\nexport const GET_SCORER_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorers/:scorerId',\n responseType: 'json',\n pathParamSchema: scorerIdPathParams,\n responseSchema: scorerEntrySchema.nullable(),\n summary: 'Get scorer by ID',\n description: 'Returns details for a specific scorer including its configuration and associations',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: (async ({ mastra, scorerId, requestContext }: any) => {\n const scorers = await listScorersFromSystem({\n mastra,\n requestContext,\n });\n\n const scorer = scorers[scorerId];\n\n if (!scorer) {\n return null;\n }\n\n return scorer;\n }) as any,\n});\n\nexport const LIST_SCORES_BY_RUN_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/run/:runId',\n responseType: 'json',\n pathParamSchema: runIdSchema,\n queryParamSchema: listScoresByRunIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by run ID',\n description: 'Returns all scores for a specific execution run',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, runId, ...params }) => {\n try {\n const { page, perPage } = params;\n const pagination: StoragePagination = {\n page: page ?? 0,\n perPage: perPage ?? 10,\n };\n const scores = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scores?.listScoresByRunId?.({\n runId,\n pagination,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by run id');\n }\n },\n});\n\nexport const LIST_SCORES_BY_SCORER_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorer/:scorerId',\n responseType: 'json',\n pathParamSchema: scorerIdPathParams,\n queryParamSchema: listScoresByScorerIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by scorer ID',\n description: 'Returns all scores generated by a specific scorer',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, scorerId, ...params }) => {\n try {\n const { page, perPage, entityId, entityType } = params;\n const filters = Object.fromEntries(Object.entries({ entityId, entityType }).filter(([_, v]) => v !== undefined));\n const scores = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scores?.listScoresByScorerId?.({\n scorerId,\n pagination: { page: page ?? 0, perPage: perPage ?? 10 },\n ...filters,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by scorer id');\n }\n },\n});\n\nexport const LIST_SCORES_BY_ENTITY_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/entity/:entityType/:entityId',\n responseType: 'json',\n pathParamSchema: entityPathParams,\n queryParamSchema: listScoresByEntityIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by entity ID',\n description: 'Returns all scores for a specific entity (agent or workflow)',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, entityId, entityType, ...params }) => {\n try {\n const { page, perPage } = params;\n let entityIdToUse = entityId;\n\n if (entityType === 'AGENT') {\n const agent = await getAgentFromSystem({ mastra, agentId: entityId });\n entityIdToUse = agent.id;\n } else if (entityType === 'WORKFLOW') {\n const workflow = mastra.getWorkflowById(entityId);\n entityIdToUse = workflow.id;\n }\n\n const pagination: StoragePagination = {\n page: page ?? 0,\n perPage: perPage ?? 10,\n };\n\n const scoresStore = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scoresStore?.listScoresByEntityId?.({\n entityId: entityIdToUse,\n entityType,\n pagination,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by entity id');\n }\n },\n});\n\nexport const SAVE_SCORE_ROUTE = createRoute({\n method: 'POST',\n path: '/scores',\n responseType: 'json',\n bodySchema: saveScoreBodySchema,\n responseSchema: saveScoreResponseSchema,\n summary: 'Save score',\n description: 'Saves a new score record to storage',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n try {\n const { score } = params as { score: ScoreRowData };\n const scoresStore = await mastra.getStorage()?.getStore('scores');\n const result = await scoresStore?.saveScore?.(score);\n if (!result) {\n throw new HTTPException(500, { message: 'Storage not configured' });\n }\n return result;\n } catch (error) {\n return handleError(error, 'Error saving score');\n }\n },\n});\n"]}
import { listScorersResponseSchema, scorerIdPathParams, scorerEntrySchema, scoresWithPaginationResponseSchema, listScoresByRunIdQuerySchema, listScoresByScorerIdQuerySchema, listScoresByEntityIdQuerySchema, entityPathParams, saveScoreResponseSchema, saveScoreBodySchema } from './chunk-OC4S3EDO.js';
import { getAgentFromSystem } from './chunk-WKSF3TVK.js';
import { runIdSchema } from './chunk-2YY3EMMS.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { __export } from './chunk-PR4QN5HX.js';
// src/server/handlers/scores.ts
var scores_exports = {};
__export(scores_exports, {
GET_SCORER_ROUTE: () => GET_SCORER_ROUTE,
LIST_SCORERS_ROUTE: () => LIST_SCORERS_ROUTE,
LIST_SCORES_BY_ENTITY_ID_ROUTE: () => LIST_SCORES_BY_ENTITY_ID_ROUTE,
LIST_SCORES_BY_RUN_ID_ROUTE: () => LIST_SCORES_BY_RUN_ID_ROUTE,
LIST_SCORES_BY_SCORER_ID_ROUTE: () => LIST_SCORES_BY_SCORER_ID_ROUTE,
SAVE_SCORE_ROUTE: () => SAVE_SCORE_ROUTE
});
async function listScorersFromSystem({
mastra,
requestContext
}) {
const agents = mastra.listAgents();
const workflows = mastra.listWorkflows();
const scorersMap = /* @__PURE__ */ new Map();
const processAgentScorers = async (agent) => {
const scorers = await agent.listScorers({
requestContext
}) || {};
if (Object.keys(scorers).length > 0) {
for (const [_scorerId, scorer] of Object.entries(scorers)) {
const scorerId = scorer.scorer.id;
if (scorersMap.has(scorerId)) {
scorersMap.get(scorerId)?.agentIds.push(agent.id);
scorersMap.get(scorerId)?.agentNames.push(agent.name);
} else {
scorersMap.set(scorerId, {
workflowIds: [],
...scorer,
agentNames: [agent.name],
agentIds: [agent.id],
isRegistered: false,
source: scorer.scorer.source ?? "code"
});
}
}
}
};
for (const [_, agent] of Object.entries(agents)) {
await processAgentScorers(agent);
}
try {
const editor = mastra.getEditor();
const storedAgentsResult = await editor?.agent.list();
if (storedAgentsResult?.agents) {
for (const storedAgentConfig of storedAgentsResult.agents) {
try {
const agent = await editor?.agent.getById(storedAgentConfig.id);
if (agent) {
await processAgentScorers(agent);
}
} catch {
}
}
}
} catch {
}
try {
const editor = mastra.getEditor();
const storedScorersResult = await editor?.scorer.list();
if (storedScorersResult?.scorerDefinitions) {
for (const storedScorerConfig of storedScorersResult.scorerDefinitions) {
try {
await editor?.scorer.getById(storedScorerConfig.id);
} catch {
}
}
}
} catch {
}
for (const [workflowId, workflow] of Object.entries(workflows)) {
const scorers = await workflow.listScorers({
requestContext
}) || {};
if (Object.keys(scorers).length > 0) {
for (const [_scorerId, scorer] of Object.entries(scorers)) {
const scorerName = scorer.scorer.name;
if (scorersMap.has(scorerName)) {
scorersMap.get(scorerName)?.workflowIds.push(workflowId);
} else {
scorersMap.set(scorerName, {
agentIds: [],
agentNames: [],
...scorer,
workflowIds: [workflowId],
isRegistered: false,
source: scorer.scorer.source ?? "code"
});
}
}
}
}
const registeredScorers = await mastra.listScorers();
for (const [_scorerId, scorer] of Object.entries(registeredScorers || {})) {
const scorerId = scorer.id;
if (scorersMap.has(scorerId)) {
scorersMap.get(scorerId).isRegistered = true;
} else {
scorersMap.set(scorerId, {
scorer,
agentIds: [],
agentNames: [],
workflowIds: [],
isRegistered: true,
source: scorer.source ?? "code"
});
}
}
return Object.fromEntries(scorersMap.entries());
}
function getTraceDetails(traceIdWithSpanId) {
if (!traceIdWithSpanId) {
return {};
}
const [traceId, spanId] = traceIdWithSpanId.split("-");
return {
...traceId ? { traceId } : {},
...spanId ? { spanId } : {}
};
}
var LIST_SCORERS_ROUTE = createRoute({
method: "GET",
path: "/scores/scorers",
responseType: "json",
responseSchema: listScorersResponseSchema,
summary: "List all scorers",
description: "Returns a list of all registered scorers with their configuration and associated agents and workflows",
tags: ["Scoring"],
requiresAuth: true,
handler: (async ({ mastra, requestContext }) => {
const scorers = await listScorersFromSystem({
mastra,
requestContext
});
return scorers;
})
});
var GET_SCORER_ROUTE = createRoute({
method: "GET",
path: "/scores/scorers/:scorerId",
responseType: "json",
pathParamSchema: scorerIdPathParams,
responseSchema: scorerEntrySchema.nullable(),
summary: "Get scorer by ID",
description: "Returns details for a specific scorer including its configuration and associations",
tags: ["Scoring"],
requiresAuth: true,
handler: (async ({ mastra, scorerId, requestContext }) => {
const scorers = await listScorersFromSystem({
mastra,
requestContext
});
const scorer = scorers[scorerId];
if (!scorer) {
return null;
}
return scorer;
})
});
var LIST_SCORES_BY_RUN_ID_ROUTE = createRoute({
method: "GET",
path: "/scores/run/:runId",
responseType: "json",
pathParamSchema: runIdSchema,
queryParamSchema: listScoresByRunIdQuerySchema,
responseSchema: scoresWithPaginationResponseSchema,
summary: "List scores by run ID",
description: "Returns all scores for a specific execution run",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, runId, ...params }) => {
try {
const { page, perPage } = params;
const pagination = {
page: page ?? 0,
perPage: perPage ?? 10
};
const scores = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scores?.listScoresByRunId?.({
runId,
pagination
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return handleError(error, "Error getting scores by run id");
}
}
});
var LIST_SCORES_BY_SCORER_ID_ROUTE = createRoute({
method: "GET",
path: "/scores/scorer/:scorerId",
responseType: "json",
pathParamSchema: scorerIdPathParams,
queryParamSchema: listScoresByScorerIdQuerySchema,
responseSchema: scoresWithPaginationResponseSchema,
summary: "List scores by scorer ID",
description: "Returns all scores generated by a specific scorer",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, scorerId, ...params }) => {
try {
const { page, perPage, entityId, entityType } = params;
const filters = Object.fromEntries(Object.entries({ entityId, entityType }).filter(([_, v]) => v !== void 0));
const scores = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scores?.listScoresByScorerId?.({
scorerId,
pagination: { page: page ?? 0, perPage: perPage ?? 10 },
...filters
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return handleError(error, "Error getting scores by scorer id");
}
}
});
var LIST_SCORES_BY_ENTITY_ID_ROUTE = createRoute({
method: "GET",
path: "/scores/entity/:entityType/:entityId",
responseType: "json",
pathParamSchema: entityPathParams,
queryParamSchema: listScoresByEntityIdQuerySchema,
responseSchema: scoresWithPaginationResponseSchema,
summary: "List scores by entity ID",
description: "Returns all scores for a specific entity (agent or workflow)",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, entityId, entityType, ...params }) => {
try {
const { page, perPage } = params;
let entityIdToUse = entityId;
if (entityType === "AGENT") {
const agent = await getAgentFromSystem({ mastra, agentId: entityId });
entityIdToUse = agent.id;
} else if (entityType === "WORKFLOW") {
const workflow = mastra.getWorkflowById(entityId);
entityIdToUse = workflow.id;
}
const pagination = {
page: page ?? 0,
perPage: perPage ?? 10
};
const scoresStore = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scoresStore?.listScoresByEntityId?.({
entityId: entityIdToUse,
entityType,
pagination
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return handleError(error, "Error getting scores by entity id");
}
}
});
var SAVE_SCORE_ROUTE = createRoute({
method: "POST",
path: "/scores",
responseType: "json",
bodySchema: saveScoreBodySchema,
responseSchema: saveScoreResponseSchema,
summary: "Save score",
description: "Saves a new score record to storage",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, ...params }) => {
try {
const { score } = params;
const scoresStore = await mastra.getStorage()?.getStore("scores");
const result = await scoresStore?.saveScore?.(score);
if (!result) {
throw new HTTPException(500, { message: "Storage not configured" });
}
return result;
} catch (error) {
return handleError(error, "Error saving score");
}
}
});
export { GET_SCORER_ROUTE, LIST_SCORERS_ROUTE, LIST_SCORES_BY_ENTITY_ID_ROUTE, LIST_SCORES_BY_RUN_ID_ROUTE, LIST_SCORES_BY_SCORER_ID_ROUTE, SAVE_SCORE_ROUTE, scores_exports };
//# sourceMappingURL=chunk-MLLGO6XZ.js.map
//# sourceMappingURL=chunk-MLLGO6XZ.js.map
{"version":3,"sources":["../src/server/handlers/scores.ts"],"names":[],"mappings":";;;;;;;;;AAAA,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,8BAAA,EAAA,MAAA,8BAAA;AAAA,EAAA,2BAAA,EAAA,MAAA,2BAAA;AAAA,EAAA,8BAAA,EAAA,MAAA,8BAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAsBA,eAAe,qBAAA,CAAsB;AAAA,EACnC,MAAA;AAAA,EACA;AACF,CAAA,EAEG;AACD,EAAA,MAAM,MAAA,GAAS,OAAO,UAAA,EAAW;AACjC,EAAA,MAAM,SAAA,GAAY,OAAO,aAAA,EAAc;AAEvC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EASrB;AAGF,EAAA,MAAM,mBAAA,GAAsB,OAAO,KAAA,KAI7B;AACJ,IAAA,MAAM,OAAA,GACH,MAAM,KAAA,CAAM,WAAA,CAAY;AAAA,MACvB;AAAA,KACD,KAAM,EAAC;AAEV,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACzD,QAAA,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO,EAAA;AAC/B,QAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,UAAA,UAAA,CAAW,IAAI,QAAQ,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,MAAM,EAAE,CAAA;AAChD,UAAA,UAAA,CAAW,IAAI,QAAQ,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QACtD,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,IAAI,QAAA,EAAU;AAAA,YACvB,aAAa,EAAC;AAAA,YACd,GAAG,MAAA;AAAA,YACH,UAAA,EAAY,CAAC,KAAA,CAAM,IAAI,CAAA;AAAA,YACvB,QAAA,EAAU,CAAC,KAAA,CAAM,EAAE,CAAA;AAAA,YACnB,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU;AAAA,WACjC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC/C,IAAA,MAAM,oBAAoB,KAAK,CAAA;AAAA,EACjC;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,IAAA,MAAM,kBAAA,GAAqB,MAAM,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAK;AACpD,IAAA,IAAI,oBAAoB,MAAA,EAAQ;AAC9B,MAAA,KAAA,MAAW,iBAAA,IAAqB,mBAAmB,MAAA,EAAQ;AACzD,QAAA,IAAI;AACF,UAAA,MAAM,QAAQ,MAAM,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAC9D,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,oBAAoB,KAAK,CAAA;AAAA,UACjC;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,IAAA,MAAM,mBAAA,GAAsB,MAAM,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAK;AACtD,IAAA,IAAI,qBAAqB,iBAAA,EAAmB;AAC1C,MAAA,KAAA,MAAW,kBAAA,IAAsB,oBAAoB,iBAAA,EAAmB;AACtE,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,EAAE,CAAA;AAAA,QACpD,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC9D,IAAA,MAAM,OAAA,GACH,MAAM,QAAA,CAAS,WAAA,CAAY;AAAA,MAC1B;AAAA,KACD,KAAM,EAAC;AAEV,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACzD,QAAA,MAAM,UAAA,GAAa,OAAO,MAAA,CAAO,IAAA;AACjC,QAAA,IAAI,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA,EAAG;AAC9B,UAAA,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA,EAAG,WAAA,CAAY,KAAK,UAAU,CAAA;AAAA,QACzD,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,IAAI,UAAA,EAAY;AAAA,YACzB,UAAU,EAAC;AAAA,YACX,YAAY,EAAC;AAAA,YACb,GAAG,MAAA;AAAA,YACH,WAAA,EAAa,CAAC,UAAU,CAAA;AAAA,YACxB,YAAA,EAAc,KAAA;AAAA,YACd,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU;AAAA,WACjC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,iBAAA,GAAoB,MAAM,MAAA,CAAO,WAAA,EAAY;AACnD,EAAA,KAAA,MAAW,CAAC,WAAW,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,iBAAA,IAAqB,EAAE,CAAA,EAAG;AACzE,IAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AACxB,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,MAAA,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,CAAG,YAAA,GAAe,IAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,IAAI,QAAA,EAAU;AAAA,QACvB,MAAA;AAAA,QACA,UAAU,EAAC;AAAA,QACX,YAAY,EAAC;AAAA,QACb,aAAa,EAAC;AAAA,QACd,YAAA,EAAc,IAAA;AAAA,QACd,MAAA,EAAQ,OAAO,MAAA,IAAU;AAAA,OAC1B,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,UAAA,CAAW,OAAA,EAAS,CAAA;AAChD;AAGA,SAAS,gBAAgB,iBAAA,EAA4B;AACnD,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,MAAM,CAAA,GAAI,iBAAA,CAAkB,MAAM,GAAG,CAAA;AAErD,EAAA,OAAO;AAAA,IACL,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAAA,IAC7B,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW;AAAC,GAC7B;AACF;AAMO,IAAM,qBAAqB,WAAA,CAAY;AAAA,EAC5C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,iBAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,cAAA,EAAgB,yBAAA;AAAA,EAChB,OAAA,EAAS,kBAAA;AAAA,EACT,WAAA,EAAa,uGAAA;AAAA,EACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,GAAU,OAAO,EAAE,MAAA,EAAQ,gBAAe,KAAW;AACnD,IAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,CAAsB;AAAA,MAC1C,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AACF,CAAC;AAEM,IAAM,mBAAmB,WAAA,CAAY;AAAA,EAC1C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,2BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,kBAAA;AAAA,EACjB,cAAA,EAAgB,kBAAkB,QAAA,EAAS;AAAA,EAC3C,OAAA,EAAS,kBAAA;AAAA,EACT,WAAA,EAAa,oFAAA;AAAA,EACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,UAAU,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,gBAAe,KAAW;AAC7D,IAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,CAAsB;AAAA,MAC1C,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,QAAQ,QAAQ,CAAA;AAE/B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF,CAAC;AAEM,IAAM,8BAA8B,WAAA,CAAY;AAAA,EACrD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,oBAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,WAAA;AAAA,EACjB,gBAAA,EAAkB,4BAAA;AAAA,EAClB,cAAA,EAAgB,kCAAA;AAAA,EAChB,OAAA,EAAS,uBAAA;AAAA,EACT,WAAA,EAAa,iDAAA;AAAA,EACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,KAAA,EAAO,GAAG,QAAO,KAAM;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA;AAC1B,MAAA,MAAM,UAAA,GAAgC;AAAA,QACpC,MAAM,IAAA,IAAQ,CAAA;AAAA,QACd,SAAS,OAAA,IAAW;AAAA,OACtB;AACA,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,UAAA,EAAW,EAAG,SAAS,QAAQ,CAAA;AAC3D,MAAA,MAAM,YAAA,GAAgB,MAAM,MAAA,EAAQ,iBAAA,GAAoB;AAAA,QACtD,KAAA;AAAA,QACA;AAAA,OACD,CAAA,IAAM,EAAE,UAAA,EAAY,EAAE,OAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,KAAA,EAAM,EAAG,MAAA,EAAQ,EAAC,EAAE;AACnF,MAAA,OAAO;AAAA,QACL,YAAY,YAAA,CAAa,UAAA;AAAA,QACzB,MAAA,EAAQ,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAyB,EAAE,GAAG,KAAA,EAAO,GAAG,eAAA,CAAgB,KAAA,CAAM,OAAO,GAAE,CAAE;AAAA,OAC5G;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,gCAAgC,CAAA;AAAA,IAC5D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iCAAiC,WAAA,CAAY;AAAA,EACxD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,0BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,kBAAA;AAAA,EACjB,gBAAA,EAAkB,+BAAA;AAAA,EAClB,cAAA,EAAgB,kCAAA;AAAA,EAChB,OAAA,EAAS,0BAAA;AAAA,EACT,WAAA,EAAa,mDAAA;AAAA,EACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,QAAA,EAAU,GAAG,QAAO,KAAM;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,YAAW,GAAI,MAAA;AAChD,MAAA,MAAM,UAAU,MAAA,CAAO,WAAA,CAAY,OAAO,OAAA,CAAQ,EAAE,UAAU,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,KAAM,MAAS,CAAC,CAAA;AAC/G,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,UAAA,EAAW,EAAG,SAAS,QAAQ,CAAA;AAC3D,MAAA,MAAM,YAAA,GAAgB,MAAM,MAAA,EAAQ,oBAAA,GAAuB;AAAA,QACzD,QAAA;AAAA,QACA,YAAY,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,OAAA,EAAS,WAAW,EAAA,EAAG;AAAA,QACtD,GAAG;AAAA,OACJ,CAAA,IAAM,EAAE,UAAA,EAAY,EAAE,OAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,KAAA,EAAM,EAAG,MAAA,EAAQ,EAAC,EAAE;AACnF,MAAA,OAAO;AAAA,QACL,YAAY,YAAA,CAAa,UAAA;AAAA,QACzB,MAAA,EAAQ,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAyB,EAAE,GAAG,KAAA,EAAO,GAAG,eAAA,CAAgB,KAAA,CAAM,OAAO,GAAE,CAAE;AAAA,OAC5G;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,mCAAmC,CAAA;AAAA,IAC/D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iCAAiC,WAAA,CAAY;AAAA,EACxD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,sCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,gBAAA;AAAA,EACjB,gBAAA,EAAkB,+BAAA;AAAA,EAClB,cAAA,EAAgB,kCAAA;AAAA,EAChB,OAAA,EAAS,0BAAA;AAAA,EACT,WAAA,EAAa,8DAAA;AAAA,EACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,UAAU,UAAA,EAAY,GAAG,QAAO,KAAM;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAA;AAC1B,MAAA,IAAI,aAAA,GAAgB,QAAA;AAEpB,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,MAAM,QAAQ,MAAM,kBAAA,CAAmB,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAA;AACpE,QAAA,aAAA,GAAgB,KAAA,CAAM,EAAA;AAAA,MACxB,CAAA,MAAA,IAAW,eAAe,UAAA,EAAY;AACpC,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,eAAA,CAAgB,QAAQ,CAAA;AAChD,QAAA,aAAA,GAAgB,QAAA,CAAS,EAAA;AAAA,MAC3B;AAEA,MAAA,MAAM,UAAA,GAAgC;AAAA,QACpC,MAAM,IAAA,IAAQ,CAAA;AAAA,QACd,SAAS,OAAA,IAAW;AAAA,OACtB;AAEA,MAAA,MAAM,cAAc,MAAM,MAAA,CAAO,UAAA,EAAW,EAAG,SAAS,QAAQ,CAAA;AAChE,MAAA,MAAM,YAAA,GAAgB,MAAM,WAAA,EAAa,oBAAA,GAAuB;AAAA,QAC9D,QAAA,EAAU,aAAA;AAAA,QACV,UAAA;AAAA,QACA;AAAA,OACD,CAAA,IAAM,EAAE,UAAA,EAAY,EAAE,OAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,GAAG,OAAA,EAAS,KAAA,EAAM,EAAG,MAAA,EAAQ,EAAC,EAAE;AAEnF,MAAA,OAAO;AAAA,QACL,YAAY,YAAA,CAAa,UAAA;AAAA,QACzB,MAAA,EAAQ,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAyB,EAAE,GAAG,KAAA,EAAO,GAAG,eAAA,CAAgB,KAAA,CAAM,OAAO,GAAE,CAAE;AAAA,OAC5G;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,mCAAmC,CAAA;AAAA,IAC/D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,mBAAmB,WAAA,CAAY;AAAA,EAC1C,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,UAAA,EAAY,mBAAA;AAAA,EACZ,cAAA,EAAgB,uBAAA;AAAA,EAChB,OAAA,EAAS,YAAA;AAAA,EACT,WAAA,EAAa,qCAAA;AAAA,EACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,GAAG,QAAO,KAAM;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,MAAA,MAAM,cAAc,MAAM,MAAA,CAAO,UAAA,EAAW,EAAG,SAAS,QAAQ,CAAA;AAChE,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,EAAa,SAAA,GAAY,KAAK,CAAA;AACnD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,0BAA0B,CAAA;AAAA,MACpE;AACA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,oBAAoB,CAAA;AAAA,IAChD;AAAA,EACF;AACF,CAAC","file":"chunk-MLLGO6XZ.js","sourcesContent":["import type { MastraScorerEntry, ScoreRowData } from '@mastra/core/evals';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { HTTPException } from '../http-exception';\nimport { runIdSchema } from '../schemas/common';\nimport {\n listScorersResponseSchema,\n scorerEntrySchema,\n scorerIdPathParams,\n entityPathParams,\n listScoresByRunIdQuerySchema,\n listScoresByScorerIdQuerySchema,\n listScoresByEntityIdQuerySchema,\n saveScoreBodySchema,\n scoresWithPaginationResponseSchema,\n saveScoreResponseSchema,\n} from '../schemas/scores';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport type { Context } from '../types';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\n\nasync function listScorersFromSystem({\n mastra,\n requestContext,\n}: Context & {\n requestContext: RequestContext;\n}) {\n const agents = mastra.listAgents();\n const workflows = mastra.listWorkflows();\n\n const scorersMap = new Map<\n string,\n MastraScorerEntry & {\n agentIds: string[];\n agentNames: string[];\n workflowIds: string[];\n isRegistered: boolean;\n source: 'code' | 'stored';\n }\n >();\n\n // Helper function to process an agent's scorers\n const processAgentScorers = async (agent: {\n id: string;\n name: string;\n listScorers: (typeof agents)[string]['listScorers'];\n }) => {\n const scorers =\n (await agent.listScorers({\n requestContext,\n })) || {};\n\n if (Object.keys(scorers).length > 0) {\n for (const [_scorerId, scorer] of Object.entries(scorers)) {\n const scorerId = scorer.scorer.id;\n if (scorersMap.has(scorerId)) {\n scorersMap.get(scorerId)?.agentIds.push(agent.id);\n scorersMap.get(scorerId)?.agentNames.push(agent.name);\n } else {\n scorersMap.set(scorerId, {\n workflowIds: [],\n ...scorer,\n agentNames: [agent.name],\n agentIds: [agent.id],\n isRegistered: false,\n source: scorer.scorer.source ?? 'code',\n });\n }\n }\n }\n };\n\n // Process code-defined agents\n for (const [_, agent] of Object.entries(agents)) {\n await processAgentScorers(agent);\n }\n\n // Process stored agents (database-backed agents)\n try {\n const editor = mastra.getEditor();\n const storedAgentsResult = await editor?.agent.list();\n if (storedAgentsResult?.agents) {\n for (const storedAgentConfig of storedAgentsResult.agents) {\n try {\n const agent = await editor?.agent.getById(storedAgentConfig.id);\n if (agent) {\n await processAgentScorers(agent);\n }\n } catch {\n // Skip individual agents that fail to hydrate\n }\n }\n }\n } catch {\n // Silently ignore if storage is not configured - not all setups have storage\n }\n\n // Process stored scorers (standalone CMS-created scorers)\n try {\n const editor = mastra.getEditor();\n const storedScorersResult = await editor?.scorer.list();\n if (storedScorersResult?.scorerDefinitions) {\n for (const storedScorerConfig of storedScorersResult.scorerDefinitions) {\n try {\n await editor?.scorer.getById(storedScorerConfig.id);\n } catch {\n // Skip individual scorers that fail to hydrate\n }\n }\n }\n } catch {\n // Silently ignore if storage is not configured\n }\n\n for (const [workflowId, workflow] of Object.entries(workflows)) {\n const scorers =\n (await workflow.listScorers({\n requestContext,\n })) || {};\n\n if (Object.keys(scorers).length > 0) {\n for (const [_scorerId, scorer] of Object.entries(scorers)) {\n const scorerName = scorer.scorer.name;\n if (scorersMap.has(scorerName)) {\n scorersMap.get(scorerName)?.workflowIds.push(workflowId);\n } else {\n scorersMap.set(scorerName, {\n agentIds: [],\n agentNames: [],\n ...scorer,\n workflowIds: [workflowId],\n isRegistered: false,\n source: scorer.scorer.source ?? 'code',\n });\n }\n }\n }\n }\n\n const registeredScorers = await mastra.listScorers();\n for (const [_scorerId, scorer] of Object.entries(registeredScorers || {})) {\n const scorerId = scorer.id;\n if (scorersMap.has(scorerId)) {\n scorersMap.get(scorerId)!.isRegistered = true;\n } else {\n scorersMap.set(scorerId, {\n scorer: scorer,\n agentIds: [],\n agentNames: [],\n workflowIds: [],\n isRegistered: true,\n source: scorer.source ?? 'code',\n });\n }\n }\n\n return Object.fromEntries(scorersMap.entries());\n}\n\n// Legacy function to get trace and span details\nfunction getTraceDetails(traceIdWithSpanId?: string) {\n if (!traceIdWithSpanId) {\n return {};\n }\n\n const [traceId, spanId] = traceIdWithSpanId.split('-');\n\n return {\n ...(traceId ? { traceId } : {}),\n ...(spanId ? { spanId } : {}),\n };\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport const LIST_SCORERS_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorers',\n responseType: 'json',\n responseSchema: listScorersResponseSchema,\n summary: 'List all scorers',\n description: 'Returns a list of all registered scorers with their configuration and associated agents and workflows',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: (async ({ mastra, requestContext }: any) => {\n const scorers = await listScorersFromSystem({\n mastra,\n requestContext,\n });\n return scorers;\n }) as any,\n});\n\nexport const GET_SCORER_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorers/:scorerId',\n responseType: 'json',\n pathParamSchema: scorerIdPathParams,\n responseSchema: scorerEntrySchema.nullable(),\n summary: 'Get scorer by ID',\n description: 'Returns details for a specific scorer including its configuration and associations',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: (async ({ mastra, scorerId, requestContext }: any) => {\n const scorers = await listScorersFromSystem({\n mastra,\n requestContext,\n });\n\n const scorer = scorers[scorerId];\n\n if (!scorer) {\n return null;\n }\n\n return scorer;\n }) as any,\n});\n\nexport const LIST_SCORES_BY_RUN_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/run/:runId',\n responseType: 'json',\n pathParamSchema: runIdSchema,\n queryParamSchema: listScoresByRunIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by run ID',\n description: 'Returns all scores for a specific execution run',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, runId, ...params }) => {\n try {\n const { page, perPage } = params;\n const pagination: StoragePagination = {\n page: page ?? 0,\n perPage: perPage ?? 10,\n };\n const scores = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scores?.listScoresByRunId?.({\n runId,\n pagination,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by run id');\n }\n },\n});\n\nexport const LIST_SCORES_BY_SCORER_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorer/:scorerId',\n responseType: 'json',\n pathParamSchema: scorerIdPathParams,\n queryParamSchema: listScoresByScorerIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by scorer ID',\n description: 'Returns all scores generated by a specific scorer',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, scorerId, ...params }) => {\n try {\n const { page, perPage, entityId, entityType } = params;\n const filters = Object.fromEntries(Object.entries({ entityId, entityType }).filter(([_, v]) => v !== undefined));\n const scores = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scores?.listScoresByScorerId?.({\n scorerId,\n pagination: { page: page ?? 0, perPage: perPage ?? 10 },\n ...filters,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by scorer id');\n }\n },\n});\n\nexport const LIST_SCORES_BY_ENTITY_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/entity/:entityType/:entityId',\n responseType: 'json',\n pathParamSchema: entityPathParams,\n queryParamSchema: listScoresByEntityIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by entity ID',\n description: 'Returns all scores for a specific entity (agent or workflow)',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, entityId, entityType, ...params }) => {\n try {\n const { page, perPage } = params;\n let entityIdToUse = entityId;\n\n if (entityType === 'AGENT') {\n const agent = await getAgentFromSystem({ mastra, agentId: entityId });\n entityIdToUse = agent.id;\n } else if (entityType === 'WORKFLOW') {\n const workflow = mastra.getWorkflowById(entityId);\n entityIdToUse = workflow.id;\n }\n\n const pagination: StoragePagination = {\n page: page ?? 0,\n perPage: perPage ?? 10,\n };\n\n const scoresStore = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scoresStore?.listScoresByEntityId?.({\n entityId: entityIdToUse,\n entityType,\n pagination,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by entity id');\n }\n },\n});\n\nexport const SAVE_SCORE_ROUTE = createRoute({\n method: 'POST',\n path: '/scores',\n responseType: 'json',\n bodySchema: saveScoreBodySchema,\n responseSchema: saveScoreResponseSchema,\n summary: 'Save score',\n description: 'Saves a new score record to storage',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n try {\n const { score } = params as { score: ScoreRowData };\n const scoresStore = await mastra.getStorage()?.getStore('scores');\n const result = await scoresStore?.saveScore?.(score);\n if (!result) {\n throw new HTTPException(500, { message: 'Storage not configured' });\n }\n return result;\n } catch (error) {\n return handleError(error, 'Error saving score');\n }\n },\n});\n"]}
import { agentCardResponseSchema, a2aAgentIdPathParams, agentExecutionResponseSchema, agentExecutionBodySchema } from './chunk-KEE6UMGC.js';
import { getPublicOrigin } from './chunk-R4O5HVDI.js';
import { getAgentFromSystem } from './chunk-WKSF3TVK.js';
import { convertInstructionsToString } from './chunk-IBUJJIRW.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { __commonJS, __export, __toESM } from './chunk-PR4QN5HX.js';
import { isDeepStrictEqual } from 'util';
import { MastraA2AError } from '@mastra/core/a2a';
import { z } from 'zod/v4';
import * as crypto2 from 'crypto';
import { lookup } from 'dns/promises';
import { request as request$1 } from 'http';
import { request } from 'https';
import { isIP } from 'net';
// ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js
var require_canonicalize = __commonJS({
"../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js"(exports, module) {
module.exports = function serialize(object) {
if (object === null || typeof object !== "object" || object.toJSON != null) {
return JSON.stringify(object);
}
if (Array.isArray(object)) {
return "[" + object.reduce((t, cv, ci) => {
const comma = ci === 0 ? "" : ",";
const value = cv === void 0 || typeof cv === "symbol" ? null : cv;
return t + comma + serialize(value);
}, "") + "]";
}
return "{" + Object.keys(object).sort().reduce((t, cv, ci) => {
if (object[cv] === void 0 || typeof object[cv] === "symbol") {
return t;
}
const comma = t.length === 0 ? "" : ",";
return t + comma + serialize(cv) + ":" + serialize(object[cv]);
}, "") + "}";
};
}
});
// src/server/handlers/a2a.ts
var a2a_exports = {};
__export(a2a_exports, {
AGENT_EXECUTION_ROUTE: () => AGENT_EXECUTION_ROUTE,
GET_AGENT_CARD_ROUTE: () => GET_AGENT_CARD_ROUTE,
getAgentCardByIdHandler: () => getAgentCardByIdHandler,
getAgentExecutionHandler: () => getAgentExecutionHandler,
handleDeleteTaskPushNotificationConfig: () => handleDeleteTaskPushNotificationConfig,
handleGetTaskPushNotificationConfig: () => handleGetTaskPushNotificationConfig,
handleListTaskPushNotificationConfig: () => handleListTaskPushNotificationConfig,
handleMessageSend: () => handleMessageSend,
handleMessageStream: () => handleMessageStream,
handleSetTaskPushNotificationConfig: () => handleSetTaskPushNotificationConfig,
handleTaskCancel: () => handleTaskCancel,
handleTaskGet: () => handleTaskGet,
handleTaskResubscribe: () => handleTaskResubscribe
});
// src/server/a2a/agent-card-signing.ts
var import_canonicalize = __toESM(require_canonicalize(), 1);
var SUPPORTED_JWS_ALGORITHMS = /* @__PURE__ */ new Set([
"ES256",
"ES384",
"ES512",
"RS256",
"RS384",
"RS512",
"PS256",
"PS384",
"PS512"
]);
function stripAgentCardSignatures(agentCard) {
const unsignedCard = structuredClone(agentCard);
delete unsignedCard.signatures;
return unsignedCard;
}
function importSigningKey(signing) {
const { privateKey } = signing;
if (typeof privateKey === "string") {
return crypto2.createPrivateKey(privateKey);
}
return crypto2.createPrivateKey({
key: privateKey,
format: "jwk"
});
}
function getProtectedHeader(signing) {
const { alg, ...rest } = signing.protectedHeader;
if (!SUPPORTED_JWS_ALGORITHMS.has(alg)) {
throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${alg}`);
}
return {
...rest,
alg
};
}
function getSignatureOptions(algorithm) {
if (algorithm.startsWith("ES")) {
return { dsaEncoding: "ieee-p1363" };
}
if (algorithm.startsWith("PS")) {
return {
padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
};
}
return {};
}
function getDigestAlgorithm(algorithm) {
if (algorithm.endsWith("256")) return "sha256";
if (algorithm.endsWith("384")) return "sha384";
if (algorithm.endsWith("512")) return "sha512";
throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${algorithm}`);
}
async function signAgentCard({
agentCard,
signing
}) {
const canonicalPayload = (0, import_canonicalize.default)(stripAgentCardSignatures(agentCard));
if (!canonicalPayload) {
throw new Error("Failed to canonicalize A2A Agent Card for signing");
}
const key = importSigningKey(signing);
const protectedHeader = getProtectedHeader(signing);
const encodedHeader = Buffer.from(JSON.stringify(protectedHeader), "utf8").toString("base64url");
const encodedPayload = Buffer.from(canonicalPayload, "utf8").toString("base64url");
const signingInput = `${encodedHeader}.${encodedPayload}`;
const signatureBuffer = crypto2.sign(
getDigestAlgorithm(String(protectedHeader.alg)),
Buffer.from(signingInput, "utf8"),
{
key,
...getSignatureOptions(String(protectedHeader.alg))
}
);
const signatureValue = signatureBuffer.toString("base64url");
if (!encodedHeader || !signatureValue) {
throw new Error("Failed to create compact JWS for A2A Agent Card");
}
const signature = {
protected: encodedHeader,
signature: signatureValue,
header: signing.header
};
return {
...agentCard,
signatures: [...agentCard.signatures ?? [], signature]
};
}
function normalizeError(error, reqId, taskId, logger) {
let a2aError;
if (error instanceof MastraA2AError) {
a2aError = error;
} else if (error instanceof Error) {
a2aError = MastraA2AError.internalError(error.message, { stack: error.stack });
} else {
a2aError = MastraA2AError.internalError("An unknown error occurred.", error);
}
if (taskId && !a2aError.taskId) {
a2aError.taskId = taskId;
}
logger?.error(`Error processing request (Task: ${a2aError.taskId ?? "N/A"}, ReqID: ${reqId ?? "N/A"}):`, a2aError);
return createErrorResponse(reqId, a2aError.toJSONRPCError());
}
function createErrorResponse(id, error) {
return {
jsonrpc: "2.0",
id,
// Can be null if request ID was invalid/missing
error
};
}
function createSuccessResponse(id, result) {
if (!id) {
throw MastraA2AError.internalError("Cannot create success response for null ID.");
}
return {
jsonrpc: "2.0",
id,
result
};
}
function convertToCoreMessage(message) {
return {
role: message.role === "user" ? "user" : "assistant",
content: message.parts.map((msg) => convertToCoreMessagePart(msg))
};
}
function convertToCoreMessagePart(part) {
switch (part.kind) {
case "text":
return {
type: "text",
text: part.text
};
case "file":
return {
type: "file",
data: "uri" in part.file ? new URL(part.file.uri) : part.file.bytes,
mimeType: part.file.mimeType
};
case "data":
throw new Error("Data parts are not supported in core messages");
}
}
var DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER = "X-A2A-Notification-Token";
function isDisallowedHostname(hostname) {
const normalized = hostname.toLowerCase();
return normalized === "localhost" || normalized.endsWith(".localhost") || normalized.endsWith(".local") || normalized.endsWith(".internal") || !normalized.includes(".");
}
function isDisallowedIpv4(address) {
const [first = -1, second = -1] = address.split(".").map(Number);
return first === 10 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
}
function isDisallowedIpv6(address) {
const normalized = address.toLowerCase();
return normalized === "::1" || normalized.startsWith("fe8") || normalized.startsWith("fe9") || normalized.startsWith("fea") || normalized.startsWith("feb") || normalized.startsWith("fc") || normalized.startsWith("fd");
}
function isDisallowedIpAddress(address) {
const version = isIP(address);
if (version === 4) {
return isDisallowedIpv4(address);
}
if (version === 6) {
return isDisallowedIpv6(address);
}
return false;
}
var DefaultPushNotificationSender = class {
constructor(pushNotificationStore, options = {}) {
this.pushNotificationStore = pushNotificationStore;
this.options = options;
}
pushNotificationStore;
options;
getStore() {
return this.pushNotificationStore;
}
async resolveValidatedDestination(rawUrl) {
const url = new URL(rawUrl);
if (url.protocol !== "https:" && url.protocol !== "http:") {
throw new Error(`Push notification URL must use http or https: ${url.protocol}`);
}
const hostname = url.hostname.toLowerCase();
if (this.options.allowedHosts && !this.options.allowedHosts.includes(hostname)) {
throw new Error(`Push notification host is not allowed: ${hostname}`);
}
if (isDisallowedHostname(hostname)) {
throw new Error(`Push notification URL must not target local or internal hosts: ${hostname}`);
}
if (isDisallowedIpAddress(hostname)) {
throw new Error(`Push notification URL must not target local or private IPs: ${hostname}`);
}
const resolvedAddresses = isIP(hostname) === 0 ? await (this.options.lookup ?? lookup)(hostname, { all: true, verbatim: true }) : [{ address: hostname, family: isIP(hostname) }];
if (resolvedAddresses.some((result) => isDisallowedIpAddress(result.address))) {
throw new Error(`Push notification URL resolved to a local or private IP: ${hostname}`);
}
const requestUrl = new URL(url.toString());
requestUrl.hostname = resolvedAddresses[0].address;
return {
originalUrl: url,
requestUrl,
hostHeader: url.host,
servername: isIP(hostname) === 0 ? hostname : void 0
};
}
async postTaskSnapshot({
requestUrl,
hostHeader,
servername,
headers,
body,
timeout
}) {
headers.set("host", hostHeader);
const signal = typeof AbortSignal.timeout === "function" ? AbortSignal.timeout(timeout) : void 0;
if (this.options.fetch) {
return this.options.fetch(requestUrl.toString(), {
method: "POST",
headers,
body,
signal
});
}
const transport = requestUrl.protocol === "https:" ? request : request$1;
return await new Promise((resolve, reject) => {
const request = transport(
{
protocol: requestUrl.protocol,
hostname: requestUrl.hostname,
port: requestUrl.port || void 0,
path: `${requestUrl.pathname}${requestUrl.search}`,
method: "POST",
headers: Object.fromEntries(headers.entries()),
servername
},
(response) => {
response.resume();
response.on("end", () => {
resolve({
ok: !!response.statusCode && response.statusCode >= 200 && response.statusCode < 300,
status: response.statusCode ?? 0,
statusText: response.statusMessage ?? ""
});
});
}
);
request.on("error", reject);
if (signal) {
signal.addEventListener(
"abort",
() => {
request.destroy(signal.reason instanceof Error ? signal.reason : new Error("Push notification timed out"));
},
{ once: true }
);
}
request.end(body);
});
}
async sendNotifications({
agentId,
task,
logger
}) {
const configs = this.pushNotificationStore.list({
agentId,
params: { id: task.id }
});
if (configs.length === 0) {
return;
}
await Promise.allSettled(
configs.map(async (config) => {
const headers = new Headers({
"content-type": "application/json"
});
if (config.pushNotificationConfig.token) {
headers.set(
this.options.tokenHeaderName ?? DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER,
config.pushNotificationConfig.token
);
}
const auth = config.pushNotificationConfig.authentication;
if (auth?.credentials) {
if (auth.schemes.includes("Bearer")) {
headers.set("authorization", `Bearer ${auth.credentials}`);
} else if (auth.schemes.includes("Basic")) {
headers.set("authorization", `Basic ${auth.credentials}`);
}
}
const { requestUrl, hostHeader, servername } = await this.resolveValidatedDestination(
config.pushNotificationConfig.url
);
const response = await this.postTaskSnapshot({
requestUrl,
hostHeader,
servername,
headers,
body: JSON.stringify(task),
timeout: this.options.timeout ?? 5e3
});
if (!response.ok) {
throw new Error(
`Push notification failed with status ${response.status} ${response.statusText ?? ""}`.trim()
);
}
})
).then((results) => {
for (const result of results) {
if (result.status === "rejected") {
logger?.error("Failed to deliver A2A push notification", result.reason);
}
}
});
}
};
// src/server/a2a/push-notification-store.ts
function normalizeConfigId(taskId, configId) {
return configId || taskId;
}
var InMemoryPushNotificationStore = class {
store = /* @__PURE__ */ new Map();
getKey(agentId, taskId) {
return JSON.stringify([agentId, taskId]);
}
set({ agentId, config }) {
const key = this.getKey(agentId, config.taskId);
const configs = this.store.get(key) ?? /* @__PURE__ */ new Map();
const normalizedConfig = {
taskId: config.taskId,
pushNotificationConfig: {
...config.pushNotificationConfig,
id: normalizeConfigId(config.taskId, config.pushNotificationConfig.id)
}
};
configs.set(normalizedConfig.pushNotificationConfig.id, structuredClone(normalizedConfig));
this.store.set(key, configs);
return structuredClone(normalizedConfig);
}
get({
agentId,
params
}) {
const key = this.getKey(agentId, params.id);
const configId = normalizeConfigId(params.id, params.pushNotificationConfigId);
const config = this.store.get(key)?.get(configId);
return config ? structuredClone(config) : null;
}
list({
agentId,
params
}) {
const key = this.getKey(agentId, params.id);
return Array.from(this.store.get(key)?.values() ?? []).map((config) => structuredClone(config));
}
delete({ agentId, params }) {
const key = this.getKey(agentId, params.id);
const configs = this.store.get(key);
if (!configs) {
return false;
}
const deleted = configs.delete(params.pushNotificationConfigId);
if (configs.size === 0) {
this.store.delete(key);
}
return deleted;
}
};
// src/server/a2a/tasks.ts
function isTaskStatusUpdate(update) {
return "state" in update && !("parts" in update);
}
function isArtifactUpdate(update) {
return "kind" in update && update.kind === "artifact-update";
}
function applyUpdateToTask(current, update) {
let newTask = structuredClone(current);
if (isTaskStatusUpdate(update)) {
newTask.status = {
...newTask.status,
// Keep existing properties if not overwritten
...update,
// Apply updates
timestamp: (/* @__PURE__ */ new Date()).toISOString()
};
} else if (isArtifactUpdate(update)) {
if (!newTask.artifacts) {
newTask.artifacts = [];
} else {
newTask.artifacts = [...newTask.artifacts];
}
const artifact = update.artifact;
const existingIndex = newTask.artifacts.findIndex((a) => a.name === artifact.name);
const existingArtifact = newTask.artifacts[existingIndex];
if (existingArtifact) {
if (update.append) {
const appendedArtifact = JSON.parse(JSON.stringify(existingArtifact));
appendedArtifact.parts.push(...artifact.parts);
if (artifact.metadata) {
appendedArtifact.metadata = {
...appendedArtifact.metadata || {},
...artifact.metadata
};
}
if (artifact.description) appendedArtifact.description = artifact.description;
newTask.artifacts[existingIndex] = appendedArtifact;
} else {
newTask.artifacts[existingIndex] = { ...artifact };
}
} else {
newTask.artifacts.push({ ...artifact });
}
}
return newTask;
}
async function loadOrCreateTask({
agentId,
taskId,
taskStore,
message,
contextId,
metadata,
logger
}) {
const data = await taskStore.load({ agentId, taskId });
if (!data) {
const initialTask = {
id: taskId,
contextId: contextId || crypto.randomUUID(),
status: {
state: "submitted",
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
message: void 0
},
artifacts: [],
history: [message],
metadata,
kind: "task"
};
logger?.info(`[Task ${taskId}] Created new task.`);
await taskStore.save({ agentId, data: initialTask });
return initialTask;
}
logger?.info(`[Task ${taskId}] Loaded existing task.`);
let updatedData = data;
updatedData.history = [...data.history || [], message];
const { status } = data;
const finalStates = ["completed", "failed", "canceled"];
if (finalStates.includes(status.state)) {
logger?.warn(`[Task ${taskId}] Received message for task in final state ${status.state}. Restarting.`);
updatedData = applyUpdateToTask(updatedData, {
state: "submitted",
message: void 0
});
} else if (status.state === "input-required") {
logger?.info(`[Task ${taskId}] Changing state from 'input-required' to 'working'.`);
updatedData = applyUpdateToTask(updatedData, { state: "working" });
} else if (status.state === "working") {
logger?.warn(`[Task ${taskId}] Received message while already 'working'. Proceeding.`);
}
await taskStore.save({ agentId, data: updatedData });
return updatedData;
}
function createTaskContext({
task,
userMessage,
history,
activeCancellations
}) {
return {
task: structuredClone(task),
userMessage,
history: structuredClone(history),
isCancelled: () => activeCancellations.has(task.id)
};
}
// src/server/handlers/a2a.ts
var messagePartSchema = z.discriminatedUnion("kind", [
z.object({
kind: z.literal("text"),
text: z.string(),
metadata: z.record(z.string(), z.any()).optional()
}),
z.object({
kind: z.literal("file"),
file: z.union([
z.object({
bytes: z.string(),
mimeType: z.string().optional(),
name: z.string().optional()
}),
z.object({
uri: z.string(),
mimeType: z.string().optional(),
name: z.string().optional()
})
]),
metadata: z.record(z.string(), z.any()).optional()
}),
z.object({
kind: z.literal("data"),
data: z.record(z.string(), z.any()),
metadata: z.record(z.string(), z.any()).optional()
})
]);
var messageSendParamsSchema = z.object({
message: z.object({
role: z.enum(["user", "agent"]),
parts: z.array(messagePartSchema),
kind: z.literal("message"),
messageId: z.string(),
contextId: z.string().optional(),
taskId: z.string().optional(),
referenceTaskIds: z.array(z.string()).optional(),
extensions: z.array(z.string()).optional(),
metadata: z.record(z.string(), z.any()).optional()
}),
configuration: z.object({
acceptedOutputModes: z.array(z.string()).optional(),
blocking: z.boolean().optional(),
historyLength: z.number().optional(),
pushNotificationConfig: z.object({
url: z.string(),
id: z.string().optional(),
token: z.string().optional(),
authentication: z.object({
schemes: z.array(z.string()),
credentials: z.string().optional()
}).optional()
}).optional()
}).optional()
});
var defaultPushNotificationStore = new InMemoryPushNotificationStore();
var defaultPushNotificationSender = new DefaultPushNotificationSender(defaultPushNotificationStore);
function createAgentCardDefaults({
pushNotifications = false
} = {}) {
return {
protocolVersion: "0.3.0",
additionalInterfaces: [],
supportsAuthenticatedExtendedCard: false,
security: [],
securitySchemes: {},
capabilities: {
streaming: true,
pushNotifications,
stateTransitionHistory: false,
extensions: []
},
defaultInputModes: ["text/plain"],
defaultOutputModes: ["text/plain"]
};
}
async function getAgentCardByIdHandler({
mastra,
agentId,
executionUrl = `/a2a/${agentId}`,
provider = {
organization: "Mastra",
url: "https://mastra.ai"
},
version = "1.0",
pushNotifications = false,
requestContext
}) {
const agent = await getAgentFromSystem({ mastra, agentId });
const [instructions, tools] = await Promise.all([agent.getInstructions({ requestContext }), agent.listTools({ requestContext })]);
const agentCard = {
name: agent.id || agentId,
description: convertInstructionsToString(instructions),
url: executionUrl,
provider,
version,
...createAgentCardDefaults({ pushNotifications }),
// Convert agent tools to skills format for A2A protocol
skills: Object.entries(tools).map(([toolId, tool]) => ({
id: toolId,
name: toolId,
description: tool.description || `Tool: ${toolId}`,
// Optional fields
tags: ["tool"]
}))
};
const signing = mastra.getServer?.()?.a2a?.agentCardSigning;
if (!signing) {
return agentCard;
}
return signAgentCard({
agentCard,
signing
});
}
function getA2AExecutionUrl({
agentId,
request,
routePrefix
}) {
const executionPath = `${routePrefix ?? ""}/a2a/${agentId}`;
if (!request) {
return executionPath;
}
return `${getPublicOrigin(request)}${executionPath}`;
}
function validateMessageSendParams(params) {
try {
messageSendParamsSchema.parse(params);
} catch (error) {
if (error instanceof z.ZodError) {
throw MastraA2AError.invalidParams(error.issues[0].message);
}
throw error;
}
}
function createArtifactUpdate({
taskId,
contextId,
text,
data
}) {
const parts = [
...text ? [{ kind: "text", text }] : [],
...data ? [{ kind: "data", data }] : []
];
if (parts.length === 0) {
return void 0;
}
return {
kind: "artifact-update",
taskId,
contextId,
lastChunk: true,
artifact: {
artifactId: `${taskId}:response`,
name: data ? "response.json" : "response.txt",
parts
}
};
}
function createTextChunkArtifactUpdate({
taskId,
contextId,
text,
append,
lastChunk
}) {
return {
kind: "artifact-update",
taskId,
contextId,
...append ? { append: true } : {},
...lastChunk !== void 0 ? { lastChunk } : {},
artifact: {
artifactId: `${taskId}:response:text`,
name: "response.txt",
parts: [{ kind: "text", text }]
}
};
}
function createDataArtifactUpdate({
taskId,
contextId,
data,
lastChunk
}) {
return {
kind: "artifact-update",
taskId,
contextId,
...{ lastChunk } ,
artifact: {
artifactId: `${taskId}:response:data`,
name: "response.json",
parts: [{ kind: "data", data }]
}
};
}
function resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
}) {
if (pushNotificationSender) {
return {
pushNotificationStore: pushNotificationSender.getStore(),
pushNotificationSender
};
}
if (pushNotificationStore) {
return {
pushNotificationStore,
pushNotificationSender: new DefaultPushNotificationSender(pushNotificationStore)
};
}
return {
pushNotificationStore: defaultPushNotificationStore,
pushNotificationSender: defaultPushNotificationSender
};
}
function createTaskPushNotificationConfig(taskId, pushNotificationConfig) {
return {
taskId,
pushNotificationConfig: {
...pushNotificationConfig,
id: pushNotificationConfig.id ?? taskId
}
};
}
function shouldSendPushNotification(previousTask, nextTask) {
const pushTriggerStates = ["completed", "failed", "canceled", "input-required"];
if (!pushTriggerStates.includes(nextTask.status.state)) {
return false;
}
return previousTask?.status.state !== nextTask.status.state;
}
async function saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender,
previousTask,
nextTask,
agentId,
logger
}) {
await taskStore.save({ agentId, data: nextTask });
if (!shouldSendPushNotification(previousTask, nextTask)) {
return;
}
void pushNotificationSender.sendNotifications({
agentId,
task: nextTask,
logger
}).catch((error) => {
logger?.error("Failed to schedule A2A push notification", error);
});
}
function extractFullStreamTextDelta(value) {
if (typeof value !== "object" || value === null || !("type" in value)) {
return null;
}
const chunk = value;
switch (chunk.type) {
case "text-delta":
if (typeof chunk.payload?.text === "string") {
return chunk.payload.text;
}
if (typeof chunk.payload?.delta === "string") {
return chunk.payload.delta;
}
if (typeof chunk.textDelta === "string") {
return chunk.textDelta;
}
if (typeof chunk.delta === "string") {
return chunk.delta;
}
if (typeof chunk.text === "string") {
return chunk.text;
}
return null;
default:
return null;
}
}
function extractFinalStructuredObject(value) {
if (typeof value !== "object" || value === null || !("type" in value)) {
return void 0;
}
const chunk = value;
if (chunk.type !== "object-result") {
return void 0;
}
const objectValue = chunk.payload?.object ?? chunk.object;
return objectValue && typeof objectValue === "object" ? objectValue : void 0;
}
function isTerminalTaskState(state) {
return ["completed", "failed", "canceled"].includes(state);
}
function artifactIdentity(artifact) {
return artifact.artifactId || artifact.name;
}
function areArtifactPartsEqual(left, right) {
if (left === right) {
return true;
}
if (left.length !== right.length) {
return false;
}
return left.every((part, index) => {
const other = right[index];
if (!other || part.kind !== other.kind) {
return false;
}
if (part.kind === "text" && other.kind === "text") {
return part.text === other.text;
}
return part === other;
});
}
function areArtifactsEqual(left, right) {
if (left === right) {
return true;
}
if (!left || !right) {
return left === right;
}
return left.artifactId === right.artifactId && left.name === right.name && left.description === right.description && left.metadata === right.metadata && areArtifactPartsEqual(left.parts, right.parts);
}
function areStatusMessagePartsEqual(left, right) {
return left === right || isDeepStrictEqual(left, right);
}
function areStatusMessagesEqual(left, right) {
if (left === right) {
return true;
}
if (!left || !right) {
return left === right;
}
return left.messageId === right.messageId && left.kind === right.kind && left.role === right.role && left.contextId === right.contextId && left.taskId === right.taskId && isDeepStrictEqual(left.referenceTaskIds, right.referenceTaskIds) && isDeepStrictEqual(left.extensions, right.extensions) && isDeepStrictEqual(left.metadata, right.metadata) && areStatusMessagePartsEqual(left.parts, right.parts);
}
function didTaskStatusChange(previous, next) {
return previous.status.state !== next.status.state || previous.status.timestamp !== next.status.timestamp || !areStatusMessagesEqual(previous.status.message, next.status.message);
}
function getTaskArtifactUpdates({ previous, next }) {
const previousArtifacts = new Map((previous.artifacts ?? []).map((artifact) => [artifactIdentity(artifact), artifact]));
const changedArtifacts = (next.artifacts ?? []).filter((artifact) => {
const priorArtifact = previousArtifacts.get(artifactIdentity(artifact));
return !priorArtifact || !areArtifactsEqual(priorArtifact, artifact);
});
return changedArtifacts.map((artifact, index) => ({
kind: "artifact-update",
taskId: next.id,
contextId: next.contextId,
lastChunk: isTerminalTaskState(next.status.state) && index === changedArtifacts.length - 1,
artifact: structuredClone(artifact)
}));
}
async function handleMessageSend({
requestId,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
agent,
agentId,
logger,
requestContext
}) {
validateMessageSendParams(params);
const { message, metadata } = params;
const { contextId } = message;
const taskId = message.taskId || crypto.randomUUID();
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let currentData = await loadOrCreateTask({
taskId,
taskStore,
agentId,
message,
contextId,
metadata
});
if (params.configuration?.pushNotificationConfig) {
resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig)
});
}
const context = createTaskContext({
task: currentData,
userMessage: message,
history: currentData.history || [],
activeCancellations: taskStore.activeCancellations
});
try {
const resourceId = metadata?.resourceId ?? message.metadata?.resourceId ?? agentId;
const result = await agent.generate([convertToCoreMessage(message)], {
runId: taskId,
requestContext,
...contextId ? { threadId: contextId, resourceId } : {}
});
const artifactUpdate = createArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: result.text,
data: result.object
});
if (artifactUpdate) {
currentData = applyUpdateToTask(currentData, artifactUpdate);
}
currentData = applyUpdateToTask(currentData, {
state: "completed",
message: void 0
});
currentData.metadata = {
...currentData.metadata,
execution: {
toolCalls: result.toolCalls,
toolResults: result.toolResults,
usage: result.usage,
finishReason: result.finishReason
}
};
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask: context.task,
nextTask: currentData,
agentId,
logger
});
context.task = currentData;
} catch (handlerError) {
const failureStatusUpdate = {
state: "failed",
message: {
messageId: crypto.randomUUID(),
role: "agent",
parts: [
{
kind: "text",
text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`
}
],
kind: "message"
}
};
currentData = applyUpdateToTask(currentData, failureStatusUpdate);
try {
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask: context.task,
nextTask: currentData,
agentId,
logger
});
} catch (saveError) {
logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);
}
return normalizeError(handlerError, requestId, currentData.id, logger);
}
return createSuccessResponse(requestId, currentData);
}
async function handleTaskGet({
requestId,
taskStore,
agentId,
taskId
}) {
const task = await taskStore.load({ agentId, taskId });
if (!task) {
throw MastraA2AError.taskNotFound(taskId);
}
return createSuccessResponse(requestId, task);
}
async function loadTaskOrThrow({
taskStore,
agentId,
taskId
}) {
const task = await taskStore.load({ agentId, taskId });
if (!task) {
throw MastraA2AError.taskNotFound(taskId);
}
return task;
}
async function handleSetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.taskId
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const config = resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(params.taskId, params.pushNotificationConfig)
});
return createSuccessResponse(requestId, config);
}
async function handleGetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const config = resolvedPushNotificationStore.get({
agentId,
params
});
if (!config) {
throw MastraA2AError.invalidParams(
`Push notification config not found: ${params.pushNotificationConfigId ?? params.id}`
);
}
return createSuccessResponse(requestId, config);
}
async function handleListTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const configs = resolvedPushNotificationStore.list({
agentId,
params
});
return createSuccessResponse(requestId, configs);
}
async function handleDeleteTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const deleted = resolvedPushNotificationStore.delete({
agentId,
params
});
if (!deleted) {
throw MastraA2AError.invalidParams(`Push notification config not found: ${params.pushNotificationConfigId}`);
}
return createSuccessResponse(requestId, null);
}
async function* handleMessageStream({
requestId,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
agent,
agentId,
logger,
requestContext
}) {
validateMessageSendParams(params);
const { message, metadata } = params;
const { contextId } = message;
const taskId = message.taskId || crypto.randomUUID();
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let currentData = await loadOrCreateTask({
taskId,
taskStore,
agentId,
message,
contextId,
metadata
});
if (params.configuration?.pushNotificationConfig) {
resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig)
});
}
currentData = applyUpdateToTask(currentData, {
state: "working",
message: {
messageId: crypto.randomUUID(),
kind: "message",
role: "agent",
parts: [{ kind: "text", text: "Generating response..." }]
}
});
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, currentData);
try {
const resourceId = metadata?.resourceId ?? message.metadata?.resourceId ?? agentId;
const result = await agent.stream([convertToCoreMessage(message)], {
runId: taskId,
requestContext,
...contextId ? { threadId: contextId, resourceId } : {}
});
let sawTextArtifact = false;
let pendingTextChunk;
let structuredData;
for await (const chunk of result.fullStream) {
const textDelta = extractFullStreamTextDelta(chunk);
if (textDelta !== null) {
if (!pendingTextChunk) {
pendingTextChunk = textDelta;
continue;
}
const textUpdate = createTextChunkArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: pendingTextChunk,
append: sawTextArtifact,
lastChunk: false
});
currentData = applyUpdateToTask(currentData, textUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, textUpdate);
sawTextArtifact = true;
pendingTextChunk = textDelta;
continue;
}
const finalStructuredObject = extractFinalStructuredObject(chunk);
if (finalStructuredObject) {
structuredData = finalStructuredObject;
}
}
structuredData ??= await result.object;
if (!pendingTextChunk && !sawTextArtifact) {
const finalText = await result.text;
if (finalText) {
pendingTextChunk = finalText;
}
}
if (pendingTextChunk) {
const textUpdate = createTextChunkArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: pendingTextChunk,
append: sawTextArtifact,
lastChunk: !structuredData
});
currentData = applyUpdateToTask(currentData, textUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, textUpdate);
sawTextArtifact = true;
pendingTextChunk = void 0;
}
if (structuredData) {
const dataUpdate = createDataArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
data: structuredData,
lastChunk: true
});
currentData = applyUpdateToTask(currentData, dataUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, dataUpdate);
}
const previousTask = currentData;
const completedTask = applyUpdateToTask(currentData, {
state: "completed",
message: void 0
});
completedTask.metadata = {
...completedTask.metadata,
execution: {
toolCalls: await result.toolCalls,
toolResults: await result.toolResults,
usage: await result.usage,
finishReason: await result.finishReason
}
};
currentData = completedTask;
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask,
nextTask: currentData,
agentId,
logger
});
} catch (handlerError) {
const previousTask = currentData;
currentData = applyUpdateToTask(currentData, {
state: "failed",
message: {
messageId: crypto.randomUUID(),
role: "agent",
parts: [
{
kind: "text",
text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`
}
],
kind: "message"
}
});
try {
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask,
nextTask: currentData,
agentId,
logger
});
} catch (saveError) {
logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);
}
}
yield createSuccessResponse(requestId, {
kind: "status-update",
taskId: currentData.id,
contextId: currentData.contextId,
status: currentData.status,
final: true
});
}
async function* handleTaskResubscribe({
requestId,
taskStore,
agentId,
taskId,
abortSignal
}) {
let snapshot = taskStore.loadWithVersion({ agentId, taskId });
if (!snapshot) {
throw MastraA2AError.taskNotFound(taskId);
}
yield createSuccessResponse(requestId, snapshot.task);
if (isTerminalTaskState(snapshot.task.status.state)) {
return;
}
while (true) {
const { task, version } = snapshot;
const nextUpdate = await taskStore.waitForNextUpdate({
agentId,
taskId,
afterVersion: version,
signal: abortSignal
});
for (const artifactUpdate of getTaskArtifactUpdates({ previous: task, next: nextUpdate.task })) {
yield createSuccessResponse(requestId, artifactUpdate);
}
if (didTaskStatusChange(task, nextUpdate.task)) {
yield createSuccessResponse(requestId, {
kind: "status-update",
taskId: nextUpdate.task.id,
contextId: nextUpdate.task.contextId,
status: nextUpdate.task.status,
final: isTerminalTaskState(nextUpdate.task.status.state)
});
}
if (isTerminalTaskState(nextUpdate.task.status.state)) {
return;
}
snapshot = nextUpdate;
}
}
function getTaskIdFromParams(params) {
if (!params || typeof params !== "object") {
return void 0;
}
if ("id" in params && typeof params.id === "string") {
return params.id;
}
if ("taskId" in params && typeof params.taskId === "string") {
return params.taskId;
}
if ("message" in params && params.message && typeof params.message === "object" && "taskId" in params.message) {
return typeof params.message.taskId === "string" ? params.message.taskId : void 0;
}
return void 0;
}
function isAsyncIterable(value) {
return !!value && typeof value === "object" && Symbol.asyncIterator in value;
}
function createA2AJsonResponse(payload) {
return Response.json(payload);
}
function createA2ASSEResponse(payload) {
const encoder = new TextEncoder();
const iterable = isAsyncIterable(payload) ? payload : (async function* () {
yield payload;
})();
const stream = new ReadableStream({
async start(controller) {
try {
for await (const chunk of iterable) {
controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}
`));
}
} catch (error) {
controller.error(error);
return;
}
controller.close();
}
});
return new Response(stream, {
headers: {
"Content-Type": "text/event-stream; charset=utf-8",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"X-Accel-Buffering": "no"
}
});
}
async function handleTaskCancel({
requestId,
taskStore,
pushNotificationSender,
agentId,
taskId,
logger
}) {
let data = await taskStore.load({
agentId,
taskId
});
if (!data) {
throw MastraA2AError.taskNotFound(taskId);
}
const finalStates = ["completed", "failed", "canceled"];
if (finalStates.includes(data.status.state)) {
logger?.info(`Task ${taskId} already in final state ${data.status.state}, cannot cancel.`);
return createSuccessResponse(requestId, data);
}
taskStore.activeCancellations.add(taskId);
const cancelUpdate = {
state: "canceled",
message: {
role: "agent",
parts: [{ kind: "text", text: "Task cancelled by request." }],
kind: "message",
messageId: crypto.randomUUID()
}
};
const previousTask = data;
data = applyUpdateToTask(data, cancelUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvePushNotificationPair({ pushNotificationSender }).pushNotificationSender,
previousTask,
nextTask: data,
agentId,
logger
});
taskStore.activeCancellations.delete(taskId);
return createSuccessResponse(requestId, data);
}
async function getAgentExecutionHandler({
requestId,
mastra,
agentId,
requestContext,
method,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
logger,
abortSignal
}) {
const agent = await getAgentFromSystem({ mastra, agentId });
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let taskId;
try {
taskId = getTaskIdFromParams(params);
switch (method) {
case "message/send": {
const result = await handleMessageSend({
requestId,
params,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender,
agent,
agentId,
logger,
requestContext
});
return result;
}
case "message/stream": {
const result = await handleMessageStream({
requestId,
taskStore,
params,
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender,
agent,
agentId,
logger,
requestContext
});
return result;
}
case "tasks/get": {
const result = await handleTaskGet({
requestId,
taskStore,
agentId,
taskId: taskId || "No task ID provided"
});
return result;
}
case "tasks/cancel": {
const result = await handleTaskCancel({
requestId,
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
agentId,
taskId: taskId || "No task ID provided",
logger
});
return result;
}
case "tasks/resubscribe":
return await handleTaskResubscribe({
requestId,
taskStore,
agentId,
taskId: taskId || "No task ID provided",
abortSignal
});
case "tasks/pushNotificationConfig/set":
return await handleSetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/get":
return await handleGetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/list":
return await handleListTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/delete":
return await handleDeleteTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "agent/getAuthenticatedExtendedCard":
throw MastraA2AError.extendedAgentCardNotConfigured();
default:
throw MastraA2AError.methodNotFound(method);
}
} catch (error) {
if (error instanceof MastraA2AError && taskId && !error.taskId) {
error.taskId = taskId;
}
return normalizeError(error, requestId, taskId, logger);
}
}
var GET_AGENT_CARD_ROUTE = createRoute({
method: "GET",
path: "/.well-known/:agentId/agent-card.json",
responseType: "json",
pathParamSchema: a2aAgentIdPathParams,
responseSchema: agentCardResponseSchema,
summary: "Get agent card",
description: "Returns the agent card information for A2A protocol discovery",
tags: ["Agent-to-Agent"],
requiresAuth: true,
handler: async (ctx) => {
const executionUrl = getA2AExecutionUrl({
agentId: ctx.agentId,
request: ctx.request,
routePrefix: ctx.routePrefix
});
return getAgentCardByIdHandler({
mastra: ctx.mastra,
requestContext: ctx.requestContext,
agentId: ctx.agentId,
executionUrl,
pushNotifications: true
});
}
});
var AGENT_EXECUTION_ROUTE = createRoute({
method: "POST",
path: "/a2a/:agentId",
responseType: "datastream-response",
pathParamSchema: a2aAgentIdPathParams,
bodySchema: agentExecutionBodySchema,
responseSchema: agentExecutionResponseSchema,
summary: "Execute agent",
description: "Executes an agent action via JSON-RPC 2.0 over A2A protocol",
tags: ["Agent-to-Agent"],
requiresAuth: true,
handler: async ({ mastra, agentId, requestContext, taskStore, abortSignal, ...bodyParams }) => {
const { id: requestId, method } = bodyParams;
const params = "params" in bodyParams ? bodyParams.params : void 0;
const result = await getAgentExecutionHandler({
requestId,
mastra,
agentId,
requestContext,
method,
params,
taskStore,
abortSignal
});
if (method === "message/stream" || method === "tasks/resubscribe") {
return createA2ASSEResponse(result);
}
return createA2AJsonResponse(result);
}
});
export { AGENT_EXECUTION_ROUTE, GET_AGENT_CARD_ROUTE, a2a_exports, getAgentCardByIdHandler, getAgentExecutionHandler, handleDeleteTaskPushNotificationConfig, handleGetTaskPushNotificationConfig, handleListTaskPushNotificationConfig, handleMessageSend, handleMessageStream, handleSetTaskPushNotificationConfig, handleTaskCancel, handleTaskGet, handleTaskResubscribe };
//# sourceMappingURL=chunk-NEPOKWAA.js.map
//# sourceMappingURL=chunk-NEPOKWAA.js.map

Sorry, the diff of this file is too big to display

import { responseObjectSchema, createResponseBodySchema, responseIdPathParams, deleteResponseSchema } from './chunk-BIUL4Y6W.js';
import { mapResponseTurnRecordToResponse, mapResponseInputToExecutionMessages, mapMastraToolsToResponseTools, createMessageId, buildCompletedResponse, buildInProgressResponse, createResponseStreamEventTranslator, createOutputTextPart, toResponseUsage, toResponseStatus, formatSseEvent } from './chunk-TLLV2JP5.js';
import { findResponseTurnRecordAcrossAgents, deleteResponseTurnRecord, findResponseTurnRecord, resolveResponseTurnMessagesForStorage, getAgentMemoryStore, persistResponseTurnRecord } from './chunk-RY5RETAD.js';
import { getAgentFromSystem } from './chunk-WKSF3TVK.js';
import { MastraFGAPermissions, getEffectiveThreadId, getEffectiveResourceId, enforceThreadAccess } from './chunk-3ENQND57.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { __export } from './chunk-PR4QN5HX.js';
import { randomUUID } from 'crypto';
// src/server/handlers/responses.ts
var responses_exports = {};
__export(responses_exports, {
CREATE_RESPONSE_ROUTE: () => CREATE_RESPONSE_ROUTE,
DELETE_RESPONSE_ROUTE: () => DELETE_RESPONSE_ROUTE,
GET_RESPONSE_ROUTE: () => GET_RESPONSE_ROUTE
});
var JSON_OBJECT_RESPONSE_SCHEMA = {
type: "object",
additionalProperties: true
};
function jsonResponse(data, status = 200) {
return new Response(JSON.stringify(data), {
status,
headers: {
"Content-Type": "application/json"
}
});
}
function createStructuredOutput(text) {
if (!text) {
return void 0;
}
switch (text.format.type) {
case "json_object":
return {
schema: JSON_OBJECT_RESPONSE_SCHEMA,
jsonPromptInjection: true
};
case "json_schema":
return {
schema: text.format.schema
};
default:
return void 0;
}
}
function getStreamedMessageOutputItem(response, responseId) {
return response.output.find(
(item) => item.type === "message" && item.id === responseId
) ?? null;
}
async function resolveThreadExecutionContext({
agent,
store,
conversationId,
previousResponseTurnRecord,
requestContext
}) {
if (conversationId && previousResponseTurnRecord && previousResponseTurnRecord.thread.id !== conversationId) {
throw new HTTPException(400, {
message: "conversation_id and previous_response_id must reference the same conversation thread when both are provided"
});
}
if (previousResponseTurnRecord) {
return {
threadId: previousResponseTurnRecord.thread.id,
resourceId: previousResponseTurnRecord.thread.resourceId
};
}
const effectiveThreadId = getEffectiveThreadId(requestContext, void 0);
const effectiveResourceId = getEffectiveResourceId(requestContext, void 0);
if (!store && !conversationId && !effectiveThreadId) {
return null;
}
const memory = await agent.getMemory({ requestContext });
if (!memory) {
if (conversationId) {
throw new HTTPException(400, {
message: "conversation_id requires the target agent to have memory configured"
});
}
return null;
}
if (conversationId) {
const existingThread2 = await memory.getThreadById({ threadId: conversationId });
if (!existingThread2) {
throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
await enforceThreadAccess({
mastra: agent.getMastraInstance(),
requestContext,
threadId: conversationId,
thread: existingThread2,
effectiveResourceId
});
return {
threadId: existingThread2.id,
resourceId: effectiveResourceId ?? existingThread2.resourceId
};
}
if (!effectiveThreadId) {
if (!store) {
return null;
}
const threadId2 = randomUUID();
const createdThread2 = await memory.createThread({
threadId: threadId2,
resourceId: effectiveResourceId ?? threadId2
});
return {
threadId: createdThread2.id,
resourceId: createdThread2.resourceId
};
}
const threadId = effectiveThreadId;
const existingThread = await memory.getThreadById({ threadId });
if (existingThread) {
await enforceThreadAccess({
mastra: agent.getMastraInstance(),
requestContext,
threadId,
thread: existingThread,
effectiveResourceId
});
return {
threadId: existingThread.id,
resourceId: effectiveResourceId ?? existingThread.resourceId
};
}
if (!store) {
return null;
}
const resourceId = effectiveResourceId ?? threadId;
const createdThread = await memory.createThread({
threadId,
resourceId
});
return {
threadId: createdThread.id,
resourceId: createdThread.resourceId
};
}
function createExecutionMemory(threadContext) {
if (!threadContext) {
return void 0;
}
return {
memory: {
thread: threadContext.threadId,
resource: threadContext.resourceId
}
};
}
async function resolveResponseAgent({
mastra,
agentId
}) {
if (!agentId) {
throw new HTTPException(400, {
message: "Responses requests require an agent_id"
});
}
if (!mastra) {
throw new HTTPException(500, { message: "Mastra instance is required for agent-backed responses" });
}
return getAgentFromSystem({ mastra, agentId });
}
async function resolveAgentMemoryStore({
agent,
requestContext,
errorMessage
}) {
const agentMemoryStore = await getAgentMemoryStore({ agent, requestContext });
if (!agentMemoryStore) {
throw new HTTPException(400, { message: errorMessage });
}
return agentMemoryStore;
}
async function executeGenerate({
agent,
resolvedModel,
modelOverride,
instructions,
text,
providerOptions,
input,
requestContext,
abortSignal,
threadContext
}) {
const executionMemory = createExecutionMemory(threadContext);
const structuredOutput = createStructuredOutput(text);
const modelOption = modelOverride ? { model: modelOverride } : {};
const commonOptions = {
instructions,
requestContext,
abortSignal,
...modelOption,
structuredOutput,
providerOptions,
...executionMemory ?? {}
};
if (resolvedModel.specificationVersion === "v1") {
if (threadContext) {
return await agent.generateLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions,
resourceId: threadContext.resourceId,
threadId: threadContext.threadId
});
}
return await agent.generateLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions
});
}
return await agent.generate(input, commonOptions);
}
async function executeStream({
agent,
resolvedModel,
modelOverride,
instructions,
text,
providerOptions,
input,
requestContext,
abortSignal,
threadContext
}) {
const executionMemory = createExecutionMemory(threadContext);
const structuredOutput = createStructuredOutput(text);
const modelOption = modelOverride ? { model: modelOverride } : {};
const commonOptions = {
instructions,
requestContext,
abortSignal,
...modelOption,
structuredOutput,
providerOptions,
...executionMemory ?? {}
};
if (resolvedModel.specificationVersion === "v1") {
if (threadContext) {
return await agent.streamLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions,
resourceId: threadContext.resourceId,
threadId: threadContext.threadId
});
}
return await agent.streamLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions
});
}
return await agent.stream(input, commonOptions);
}
async function resolveUsage(result) {
return await (result.totalUsage ?? result.usage ?? null);
}
async function resolveProviderMetadata(result) {
return await (result.providerMetadata ?? void 0);
}
async function resolveFinishReason(result) {
return await result.finishReason ?? void 0;
}
async function resolveText(result) {
return await result.text ?? "";
}
async function resolveCompletedResponseState(result, fallbackText) {
const usage = await resolveUsage(result);
return {
completedAt: Math.floor(Date.now() / 1e3),
status: toResponseStatus(await resolveFinishReason(result)),
text: await resolveText(result) || fallbackText,
usage,
usageDetails: toResponseUsage(usage),
providerOptions: await resolveProviderMetadata(result)
};
}
async function storeCompletedResponse({
agentMemoryStore,
didStore,
threadContext,
responseId,
metadata,
completedState,
messages,
outputItems
}) {
if (!didStore || !threadContext) {
return;
}
await persistResponseTurnRecord({
memoryStore: agentMemoryStore,
responseId,
metadata: {
...metadata,
completedAt: completedState.completedAt,
status: completedState.status,
usage: completedState.usageDetails,
providerOptions: completedState.providerOptions,
messageIds: [],
outputItems
},
threadContext,
messages
});
}
async function finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result,
responseId,
createdAt,
model,
instructions,
previousResponseId,
conversationId,
configuredTools,
responseMetadata,
fallbackText,
fallbackOutputItems
}) {
const completedState = await resolveCompletedResponseState(result, fallbackText);
const fallbackItems = fallbackOutputItems?.(completedState);
const responseMessages = await resolveResponseTurnMessagesForStorage({
result,
responseId,
text: completedState.text,
threadContext,
fallbackOutputItems: threadContext ? fallbackItems : void 0
});
const response = buildCompletedResponse({
responseId,
outputMessageId: responseId,
model,
createdAt,
completedAt: completedState.completedAt,
status: completedState.status,
text: completedState.text,
usage: completedState.usage,
instructions,
textConfig: responseMetadata.text,
previousResponseId,
conversationId,
providerOptions: completedState.providerOptions,
tools: configuredTools,
messages: responseMessages,
fallbackOutputItems: fallbackItems,
store: didStore
});
await storeCompletedResponse({
agentMemoryStore,
didStore,
threadContext,
responseId,
metadata: responseMetadata,
completedState,
messages: responseMessages,
outputItems: response.output
});
return { completedState, response, responseMessages };
}
async function prepareCreateResponseRequest({
body,
mastra,
requestContext
}) {
const executionInput = mapResponseInputToExecutionMessages(body.input);
let previousResponseTurnRecord = null;
let resolvedAgent = null;
if (body.previous_response_id) {
if (body.agent_id) {
resolvedAgent = await resolveResponseAgent({ mastra, agentId: body.agent_id });
previousResponseTurnRecord = await findResponseTurnRecord({
agent: resolvedAgent,
responseId: body.previous_response_id,
requestContext
});
if (!previousResponseTurnRecord) {
const owningResponseTurnRecord = await findResponseTurnRecordAcrossAgents({
mastra,
responseId: body.previous_response_id,
requestContext
});
if (owningResponseTurnRecord) {
if (owningResponseTurnRecord.metadata.agentId === body.agent_id) {
previousResponseTurnRecord = owningResponseTurnRecord;
} else {
throw new HTTPException(400, {
message: `Stored response ${body.previous_response_id} belongs to agent ${owningResponseTurnRecord.metadata.agentId}, not ${body.agent_id}`
});
}
}
if (!previousResponseTurnRecord) {
throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });
}
}
} else {
if (!mastra) {
throw new HTTPException(500, { message: "Mastra instance is required for agent-backed responses" });
}
previousResponseTurnRecord = await findResponseTurnRecordAcrossAgents({
mastra,
responseId: body.previous_response_id,
requestContext
});
if (!previousResponseTurnRecord) {
throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });
}
}
}
const agent = resolvedAgent ?? await resolveResponseAgent({
mastra,
agentId: body.agent_id ?? previousResponseTurnRecord?.metadata.agentId
});
const resolvedModel = await agent.getModel({
requestContext,
modelConfig: body.model
});
const responseModel = body.model ?? (() => {
if (resolvedModel.provider && resolvedModel.modelId) {
const publicProviderId = resolvedModel.provider.includes(".") ? resolvedModel.provider.split(".")[0] : resolvedModel.provider;
return `${publicProviderId}/${resolvedModel.modelId}`;
}
if (resolvedModel.modelId) {
return resolvedModel.modelId;
}
throw new HTTPException(500, {
message: "Responses route could not determine the effective model for this request"
});
})();
const shouldStore = body.store ?? false;
const needsMemoryStore = shouldStore || Boolean(body.conversation_id) || Boolean(body.previous_response_id);
const agentMemoryStore = needsMemoryStore ? await resolveAgentMemoryStore({
agent,
requestContext,
errorMessage: body.previous_response_id ? "previous_response_id requires the target agent to have memory storage configured" : shouldStore ? "Stored responses require the target agent to have memory storage configured" : "conversation_id requires the target agent to have memory storage configured"
}) : null;
const configuredTools = mapMastraToolsToResponseTools(
await Promise.resolve(agent.listTools({ requestContext }))
);
const responseId = createMessageId();
const createdAt = Math.floor(Date.now() / 1e3);
const threadContext = await resolveThreadExecutionContext({
agent,
store: shouldStore,
conversationId: body.conversation_id,
previousResponseTurnRecord,
requestContext
});
if (shouldStore && !threadContext) {
throw new HTTPException(400, {
message: "Stored responses require the target agent to have memory configured"
});
}
const didStore = shouldStore && Boolean(threadContext);
return {
agent,
agentMemoryStore,
configuredTools,
createdAt,
didStore,
executionInput,
previousResponseTurnRecord,
resolvedModel,
responseId,
responseModel,
responseMetadata: {
agentId: agent.id,
model: responseModel,
createdAt,
instructions: body.instructions,
text: body.text,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
tools: configuredTools,
store: didStore
},
threadContext
};
}
function createResponseEventStream({
agentMemoryStore,
body,
configuredTools,
createdAt,
didStore,
previousResponseTurnRecord,
responseId,
responseModel,
responseMetadata,
streamResult,
threadContext
}) {
const createdResponse = buildInProgressResponse({
responseId,
model: responseModel,
createdAt,
instructions: body.instructions,
textConfig: body.text,
previousResponseId: body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
tools: configuredTools,
store: didStore
});
return new ReadableStream({
async start(controller) {
let sequenceNumber = 1;
const enqueueEvent = (eventName, payload) => {
controller.enqueue(
formatSseEvent(eventName, {
...payload,
sequence_number: sequenceNumber++
})
);
};
enqueueEvent("response.created", {
type: "response.created",
response: createdResponse
});
enqueueEvent("response.in_progress", {
type: "response.in_progress",
response: createdResponse
});
const streamEvents = createResponseStreamEventTranslator(responseId);
const fullStream = await streamResult.fullStream;
const reader = fullStream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
for (const event of streamEvents.consume(value)) {
enqueueEvent(event.event, event.payload);
}
}
for (const event of streamEvents.flushPendingToolResults()) {
enqueueEvent(event.event, event.payload);
}
const { completedState, response } = await finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result: streamResult,
responseId,
createdAt,
model: responseModel,
instructions: body.instructions,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
configuredTools,
responseMetadata,
fallbackText: streamEvents.text,
fallbackOutputItems: (completedState2) => streamEvents.getOutputItems({
text: completedState2.text,
status: completedState2.status
})
});
const completedItem = getStreamedMessageOutputItem(response, responseId);
if (completedItem || completedState.text) {
for (const event of streamEvents.completeText(
completedState.text,
completedItem ?? {
id: responseId,
type: "message",
role: "assistant",
status: "completed",
content: [createOutputTextPart(completedState.text)]
}
)) {
enqueueEvent(event.event, event.payload);
}
}
enqueueEvent("response.completed", {
type: "response.completed",
response
});
controller.close();
} catch (error) {
controller.error(error);
} finally {
reader.releaseLock();
}
}
});
}
var CREATE_RESPONSE_ROUTE = createRoute({
method: "POST",
path: "/v1/responses",
responseType: "datastream-response",
bodySchema: createResponseBodySchema,
responseSchema: responseObjectSchema,
summary: "Create a response",
description: "Creates a response through a Mastra-hosted Responses API-compatible route",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_EXECUTE,
handler: async ({ mastra, requestContext, abortSignal, ...body }) => {
try {
const {
agent,
agentMemoryStore,
configuredTools,
createdAt,
didStore,
executionInput,
previousResponseTurnRecord,
resolvedModel,
responseId,
responseModel,
responseMetadata,
threadContext
} = await prepareCreateResponseRequest({ body, mastra, requestContext });
if (!body.stream) {
const result = await executeGenerate({
agent,
resolvedModel,
modelOverride: body.model,
instructions: body.instructions,
text: body.text,
providerOptions: body.providerOptions,
input: executionInput,
requestContext,
abortSignal,
threadContext
});
const { response } = await finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result,
responseId,
createdAt,
model: responseModel,
instructions: body.instructions,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
configuredTools,
responseMetadata,
fallbackText: ""
});
return jsonResponse(response);
}
const streamResult = await executeStream({
agent,
resolvedModel,
modelOverride: body.model,
instructions: body.instructions,
text: body.text,
providerOptions: body.providerOptions,
input: executionInput,
requestContext,
abortSignal,
threadContext
});
const stream = createResponseEventStream({
agentMemoryStore,
body,
configuredTools,
createdAt,
didStore,
previousResponseTurnRecord,
responseId,
responseModel,
responseMetadata,
streamResult,
threadContext
});
return new Response(stream, {
headers: {
"Content-Type": "text/event-stream; charset=utf-8",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"X-Accel-Buffering": "no"
}
});
} catch (error) {
return handleError(error, "Error creating response");
}
}
});
var GET_RESPONSE_ROUTE = createRoute({
method: "GET",
path: "/v1/responses/:responseId",
responseType: "json",
pathParamSchema: responseIdPathParams,
responseSchema: responseObjectSchema,
summary: "Retrieve a stored response",
description: "Returns a previously stored response object",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, responseId }) => {
try {
const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });
if (!responseTurnRecord) {
throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });
}
return mapResponseTurnRecordToResponse(responseTurnRecord);
} catch (error) {
return handleError(error, "Error retrieving response");
}
}
});
var DELETE_RESPONSE_ROUTE = createRoute({
method: "DELETE",
path: "/v1/responses/:responseId",
responseType: "json",
pathParamSchema: responseIdPathParams,
responseSchema: deleteResponseSchema,
summary: "Delete a stored response",
description: "Deletes a stored response so it can no longer be retrieved or chained",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_DELETE,
handler: async ({ mastra, requestContext, responseId }) => {
try {
const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });
if (!responseTurnRecord) {
throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });
}
await deleteResponseTurnRecord({ responseTurnRecord });
const response = {
id: responseId,
object: "response",
deleted: true
};
return response;
} catch (error) {
return handleError(error, "Error deleting response");
}
}
});
export { CREATE_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE, responses_exports };
//# sourceMappingURL=chunk-PLWZVSGT.js.map
//# sourceMappingURL=chunk-PLWZVSGT.js.map
{"version":3,"sources":["../src/server/handlers/responses.ts"],"names":["existingThread","threadId","createdThread","completedState"],"mappings":"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","file":"chunk-PLWZVSGT.js","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { Agent, MastraDBMessage } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n createResponseBodySchema,\n deleteResponseSchema,\n responseIdPathParams,\n responseObjectSchema,\n} from '../schemas/responses';\nimport type { CreateResponseBody, DeleteResponse, ResponseObject } from '../schemas/responses';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport {\n buildCompletedResponse,\n buildInProgressResponse,\n createResponseStreamEventTranslator,\n createMessageId,\n createOutputTextPart,\n formatSseEvent,\n mapMastraToolsToResponseTools,\n mapResponseInputToExecutionMessages,\n mapResponseTurnRecordToResponse,\n toResponseStatus,\n toResponseUsage,\n} from './responses.adapter';\nimport {\n deleteResponseTurnRecord,\n findResponseTurnRecord,\n findResponseTurnRecordAcrossAgents,\n getAgentMemoryStore,\n persistResponseTurnRecord,\n resolveResponseTurnMessagesForStorage,\n} from './responses.storage';\nimport type {\n ProviderMetadataLike,\n ResponseTurnRecord,\n ResponseTurnRecordMetadata,\n ThreadExecutionContext,\n UsageLike,\n} from './responses.storage';\nimport { enforceThreadAccess, getEffectiveResourceId, getEffectiveThreadId } from './utils';\n\ntype AgentExecutionInput = Parameters<Agent['generate']>[0];\ntype ResolvedAgentModel = Awaited<ReturnType<Agent['getModel']>>;\n\ntype ResponseExecutionResult = {\n text?: string;\n finishReason?: string;\n totalUsage?: UsageLike | Promise<UsageLike>;\n usage?: UsageLike | Promise<UsageLike>;\n providerMetadata?: ProviderMetadataLike | Promise<ProviderMetadataLike>;\n response?: {\n id?: string;\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype ResponseStreamResult = {\n fullStream: ReadableStream<unknown> | Promise<ReadableStream<unknown>>;\n text: Promise<string> | string;\n finishReason: Promise<string | undefined> | string | undefined;\n totalUsage?: Promise<UsageLike> | UsageLike;\n usage?: Promise<UsageLike> | UsageLike;\n providerMetadata?: Promise<ProviderMetadataLike> | ProviderMetadataLike;\n response?:\n | Promise<{\n id?: string;\n dbMessages?: MastraDBMessage[];\n }>\n | {\n id?: string;\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype CompletedResponseState = {\n completedAt: number;\n status: ResponseObject['status'];\n text: string;\n usage: UsageLike;\n usageDetails: ResponseObject['usage'];\n providerOptions: ProviderMetadataLike;\n};\n\ntype FinalizedResponse = {\n completedState: CompletedResponseState;\n response: ResponseObject;\n responseMessages: MastraDBMessage[];\n};\n\ntype PreparedCreateResponseRequest = {\n agent: Agent<any, any, any, any>;\n agentMemoryStore: MemoryStorage | null;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n createdAt: number;\n didStore: boolean;\n executionInput: AgentExecutionInput;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n resolvedModel: ResolvedAgentModel;\n responseId: string;\n responseModel: string;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n threadContext: ThreadExecutionContext | null;\n};\n\nconst JSON_OBJECT_RESPONSE_SCHEMA = {\n type: 'object',\n additionalProperties: true,\n} as const;\n\nfunction jsonResponse(data: ResponseObject, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n}\n\nfunction createStructuredOutput(text: CreateResponseBody['text']) {\n if (!text) {\n return undefined;\n }\n\n switch (text.format.type) {\n case 'json_object':\n return {\n schema: JSON_OBJECT_RESPONSE_SCHEMA,\n jsonPromptInjection: true,\n };\n case 'json_schema':\n return {\n schema: text.format.schema,\n };\n default:\n return undefined;\n }\n}\n\nfunction getStreamedMessageOutputItem(response: ResponseObject, responseId: string) {\n return (\n response.output.find(\n (item): item is Extract<ResponseObject['output'][number], { type: 'message' }> =>\n item.type === 'message' && item.id === responseId,\n ) ?? null\n );\n}\n\n/**\n * Resolves the memory thread that should back the current response request.\n *\n * If `previous_response_id` is present, the request continues on that stored thread.\n * Otherwise, the route only creates or reuses a thread when the caller asked to store\n * the response and the resolved agent actually has memory configured.\n */\nasync function resolveThreadExecutionContext({\n agent,\n store,\n conversationId,\n previousResponseTurnRecord,\n requestContext,\n}: {\n agent: Agent<any, any, any, any>;\n store: boolean;\n conversationId?: string;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n requestContext: RequestContext;\n}): Promise<ThreadExecutionContext | null> {\n if (conversationId && previousResponseTurnRecord && previousResponseTurnRecord.thread.id !== conversationId) {\n throw new HTTPException(400, {\n message:\n 'conversation_id and previous_response_id must reference the same conversation thread when both are provided',\n });\n }\n\n if (previousResponseTurnRecord) {\n return {\n threadId: previousResponseTurnRecord.thread.id,\n resourceId: previousResponseTurnRecord.thread.resourceId,\n };\n }\n\n const effectiveThreadId = getEffectiveThreadId(requestContext, undefined);\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n\n if (!store && !conversationId && !effectiveThreadId) {\n return null;\n }\n\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n if (conversationId) {\n throw new HTTPException(400, {\n message: 'conversation_id requires the target agent to have memory configured',\n });\n }\n\n return null;\n }\n\n if (conversationId) {\n const existingThread = await memory.getThreadById({ threadId: conversationId });\n if (!existingThread) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await enforceThreadAccess({\n mastra: agent.getMastraInstance(),\n requestContext,\n threadId: conversationId,\n thread: existingThread,\n effectiveResourceId,\n });\n return {\n threadId: existingThread.id,\n resourceId: effectiveResourceId ?? existingThread.resourceId,\n };\n }\n\n if (!effectiveThreadId) {\n if (!store) {\n return null;\n }\n\n const threadId = randomUUID();\n const createdThread = await memory.createThread({\n threadId,\n resourceId: effectiveResourceId ?? threadId,\n });\n\n return {\n threadId: createdThread.id,\n resourceId: createdThread.resourceId,\n };\n }\n\n const threadId = effectiveThreadId;\n const existingThread = await memory.getThreadById({ threadId });\n if (existingThread) {\n await enforceThreadAccess({\n mastra: agent.getMastraInstance(),\n requestContext,\n threadId,\n thread: existingThread,\n effectiveResourceId,\n });\n return {\n threadId: existingThread.id,\n resourceId: effectiveResourceId ?? existingThread.resourceId,\n };\n }\n\n if (!store) {\n return null;\n }\n\n const resourceId = effectiveResourceId ?? threadId;\n const createdThread = await memory.createThread({\n threadId,\n resourceId,\n });\n\n return {\n threadId: createdThread.id,\n resourceId: createdThread.resourceId,\n };\n}\n\nfunction createExecutionMemory(threadContext: ThreadExecutionContext | null) {\n if (!threadContext) {\n return undefined;\n }\n\n return {\n memory: {\n thread: threadContext.threadId,\n resource: threadContext.resourceId,\n },\n } as const;\n}\n\n/**\n * Resolves the registered Mastra agent that owns the response request.\n */\nasync function resolveResponseAgent({\n mastra,\n agentId,\n}: {\n mastra: Mastra | undefined;\n agentId?: string;\n}): Promise<Agent<any, any, any, any>> {\n if (!agentId) {\n throw new HTTPException(400, {\n message: 'Responses requests require an agent_id',\n });\n }\n\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for agent-backed responses' });\n }\n\n return getAgentFromSystem({ mastra, agentId });\n}\n\nasync function resolveAgentMemoryStore({\n agent,\n requestContext,\n errorMessage,\n}: {\n agent: Agent<any, any, any, any>;\n requestContext: RequestContext;\n errorMessage: string;\n}): Promise<MemoryStorage> {\n const agentMemoryStore = await getAgentMemoryStore({ agent, requestContext });\n if (!agentMemoryStore) {\n throw new HTTPException(400, { message: errorMessage });\n }\n\n return agentMemoryStore;\n}\n\n/**\n * Executes a non-streaming Responses API request through the resolved Mastra agent.\n */\nasync function executeGenerate({\n agent,\n resolvedModel,\n modelOverride,\n instructions,\n text,\n providerOptions,\n input,\n requestContext,\n abortSignal,\n threadContext,\n}: {\n agent: Agent;\n resolvedModel: ResolvedAgentModel;\n modelOverride?: string;\n instructions: string | undefined;\n text: CreateResponseBody['text'];\n providerOptions: CreateResponseBody['providerOptions'];\n input: AgentExecutionInput;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n threadContext: ThreadExecutionContext | null;\n}) {\n const executionMemory = createExecutionMemory(threadContext);\n const structuredOutput = createStructuredOutput(text);\n const modelOption = modelOverride ? { model: modelOverride } : {};\n const commonOptions = {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n structuredOutput,\n providerOptions,\n ...(executionMemory ?? {}),\n };\n\n if (resolvedModel.specificationVersion === 'v1') {\n if (threadContext) {\n return (await agent.generateLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n resourceId: threadContext.resourceId,\n threadId: threadContext.threadId,\n } as never)) as ResponseExecutionResult;\n }\n\n return (await agent.generateLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n } as never)) as ResponseExecutionResult;\n }\n\n return (await agent.generate(input, commonOptions as never)) as ResponseExecutionResult;\n}\n\n/**\n * Executes a streaming Responses API request through the resolved Mastra agent.\n */\nasync function executeStream({\n agent,\n resolvedModel,\n modelOverride,\n instructions,\n text,\n providerOptions,\n input,\n requestContext,\n abortSignal,\n threadContext,\n}: {\n agent: Agent;\n resolvedModel: ResolvedAgentModel;\n modelOverride?: string;\n instructions: string | undefined;\n text: CreateResponseBody['text'];\n providerOptions: CreateResponseBody['providerOptions'];\n input: AgentExecutionInput;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n threadContext: ThreadExecutionContext | null;\n}) {\n const executionMemory = createExecutionMemory(threadContext);\n const structuredOutput = createStructuredOutput(text);\n const modelOption = modelOverride ? { model: modelOverride } : {};\n const commonOptions = {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n structuredOutput,\n providerOptions,\n ...(executionMemory ?? {}),\n };\n\n if (resolvedModel.specificationVersion === 'v1') {\n if (threadContext) {\n return (await agent.streamLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n resourceId: threadContext.resourceId,\n threadId: threadContext.threadId,\n } as never)) as ResponseStreamResult;\n }\n\n return (await agent.streamLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n } as never)) as ResponseStreamResult;\n }\n\n return (await agent.stream(input, commonOptions as never)) as ResponseStreamResult;\n}\n\nasync function resolveUsage(result: ResponseExecutionResult | ResponseStreamResult): Promise<UsageLike> {\n return (await (result.totalUsage ?? result.usage ?? null)) as UsageLike;\n}\n\nasync function resolveProviderMetadata(\n result: ResponseExecutionResult | ResponseStreamResult,\n): Promise<ProviderMetadataLike> {\n return (await (result.providerMetadata ?? undefined)) as ProviderMetadataLike;\n}\n\nasync function resolveFinishReason(\n result: ResponseExecutionResult | ResponseStreamResult,\n): Promise<string | undefined> {\n return (await result.finishReason) ?? undefined;\n}\n\nasync function resolveText(result: ResponseExecutionResult | ResponseStreamResult): Promise<string> {\n return (await result.text) ?? '';\n}\n\n/**\n * Resolves the final response state shared by streaming and non-streaming flows.\n */\nasync function resolveCompletedResponseState(\n result: ResponseExecutionResult | ResponseStreamResult,\n fallbackText: string,\n): Promise<CompletedResponseState> {\n const usage = await resolveUsage(result);\n\n return {\n completedAt: Math.floor(Date.now() / 1000),\n status: toResponseStatus(await resolveFinishReason(result)),\n text: (await resolveText(result)) || fallbackText,\n usage,\n usageDetails: toResponseUsage(usage),\n providerOptions: await resolveProviderMetadata(result),\n };\n}\n\n/**\n * Stores the completed response when the request opted into memory-backed persistence.\n */\nasync function storeCompletedResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n responseId,\n metadata,\n completedState,\n messages,\n outputItems,\n}: {\n agentMemoryStore: MemoryStorage | null;\n didStore: boolean;\n threadContext: ThreadExecutionContext | null;\n responseId: string;\n metadata: Omit<ResponseTurnRecordMetadata, 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'>;\n completedState: CompletedResponseState;\n messages: MastraDBMessage[];\n outputItems: ResponseObject['output'];\n}): Promise<void> {\n if (!didStore || !threadContext) {\n return;\n }\n\n await persistResponseTurnRecord({\n memoryStore: agentMemoryStore,\n responseId,\n metadata: {\n ...metadata,\n completedAt: completedState.completedAt,\n status: completedState.status,\n usage: completedState.usageDetails,\n providerOptions: completedState.providerOptions,\n messageIds: [],\n outputItems,\n },\n threadContext,\n messages,\n });\n}\n\n/**\n * Resolves the final response object and persists the stored response turn when needed.\n */\nasync function finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result,\n responseId,\n createdAt,\n model,\n instructions,\n previousResponseId,\n conversationId,\n configuredTools,\n responseMetadata,\n fallbackText,\n fallbackOutputItems,\n}: {\n agentMemoryStore: MemoryStorage | null;\n didStore: boolean;\n threadContext: ThreadExecutionContext | null;\n result: ResponseExecutionResult | ResponseStreamResult;\n responseId: string;\n createdAt: number;\n model: string;\n instructions: string | undefined;\n previousResponseId?: string;\n conversationId?: string;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n fallbackText: string;\n fallbackOutputItems?: (completedState: CompletedResponseState) => ResponseObject['output'];\n}): Promise<FinalizedResponse> {\n const completedState = await resolveCompletedResponseState(result, fallbackText);\n const fallbackItems = fallbackOutputItems?.(completedState);\n const responseMessages = await resolveResponseTurnMessagesForStorage({\n result,\n responseId,\n text: completedState.text,\n threadContext,\n fallbackOutputItems: threadContext ? fallbackItems : undefined,\n });\n const response = buildCompletedResponse({\n responseId,\n outputMessageId: responseId,\n model,\n createdAt,\n completedAt: completedState.completedAt,\n status: completedState.status,\n text: completedState.text,\n usage: completedState.usage,\n instructions,\n textConfig: responseMetadata.text,\n previousResponseId,\n conversationId,\n providerOptions: completedState.providerOptions,\n tools: configuredTools,\n messages: responseMessages,\n fallbackOutputItems: fallbackItems,\n store: didStore,\n });\n\n await storeCompletedResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n responseId,\n metadata: responseMetadata,\n completedState,\n messages: responseMessages,\n outputItems: response.output,\n });\n\n return { completedState, response, responseMessages };\n}\n\n/**\n * Resolves all request-scoped Mastra primitives needed to execute a Responses create\n * call: the owning agent, the memory thread context, the normalized execution input,\n * and the response-turn metadata that may be persisted later.\n */\nasync function prepareCreateResponseRequest({\n body,\n mastra,\n requestContext,\n}: {\n body: CreateResponseBody;\n mastra: Mastra | undefined;\n requestContext: RequestContext;\n}): Promise<PreparedCreateResponseRequest> {\n const executionInput = mapResponseInputToExecutionMessages(body.input) as AgentExecutionInput;\n let previousResponseTurnRecord: ResponseTurnRecord | null = null;\n let resolvedAgent: Agent<any, any, any, any> | null = null;\n\n if (body.previous_response_id) {\n if (body.agent_id) {\n resolvedAgent = await resolveResponseAgent({ mastra, agentId: body.agent_id });\n previousResponseTurnRecord = await findResponseTurnRecord({\n agent: resolvedAgent,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (!previousResponseTurnRecord) {\n const owningResponseTurnRecord = await findResponseTurnRecordAcrossAgents({\n mastra,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (owningResponseTurnRecord) {\n if (owningResponseTurnRecord.metadata.agentId === body.agent_id) {\n previousResponseTurnRecord = owningResponseTurnRecord;\n } else {\n throw new HTTPException(400, {\n message: `Stored response ${body.previous_response_id} belongs to agent ${owningResponseTurnRecord.metadata.agentId}, not ${body.agent_id}`,\n });\n }\n }\n\n if (!previousResponseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });\n }\n }\n } else {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for agent-backed responses' });\n }\n\n previousResponseTurnRecord = await findResponseTurnRecordAcrossAgents({\n mastra,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (!previousResponseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });\n }\n }\n }\n\n const agent =\n resolvedAgent ??\n (await resolveResponseAgent({\n mastra,\n agentId: body.agent_id ?? previousResponseTurnRecord?.metadata.agentId,\n }));\n const resolvedModel = await agent.getModel({\n requestContext,\n modelConfig: body.model,\n });\n const responseModel =\n body.model ??\n (() => {\n if (resolvedModel.provider && resolvedModel.modelId) {\n const publicProviderId = resolvedModel.provider.includes('.')\n ? resolvedModel.provider.split('.')[0]!\n : resolvedModel.provider;\n return `${publicProviderId}/${resolvedModel.modelId}`;\n }\n\n if (resolvedModel.modelId) {\n return resolvedModel.modelId;\n }\n\n throw new HTTPException(500, {\n message: 'Responses route could not determine the effective model for this request',\n });\n })();\n const shouldStore = body.store ?? false;\n const needsMemoryStore = shouldStore || Boolean(body.conversation_id) || Boolean(body.previous_response_id);\n const agentMemoryStore = needsMemoryStore\n ? await resolveAgentMemoryStore({\n agent,\n requestContext,\n errorMessage: body.previous_response_id\n ? 'previous_response_id requires the target agent to have memory storage configured'\n : shouldStore\n ? 'Stored responses require the target agent to have memory storage configured'\n : 'conversation_id requires the target agent to have memory storage configured',\n })\n : null;\n const configuredTools = mapMastraToolsToResponseTools(\n (await Promise.resolve(agent.listTools({ requestContext }))) as Record<string, unknown>,\n );\n\n const responseId = createMessageId();\n const createdAt = Math.floor(Date.now() / 1000);\n const threadContext = await resolveThreadExecutionContext({\n agent,\n store: shouldStore,\n conversationId: body.conversation_id,\n previousResponseTurnRecord,\n requestContext,\n });\n\n if (shouldStore && !threadContext) {\n throw new HTTPException(400, {\n message: 'Stored responses require the target agent to have memory configured',\n });\n }\n\n const didStore = shouldStore && Boolean(threadContext);\n\n return {\n agent,\n agentMemoryStore,\n configuredTools,\n createdAt,\n didStore,\n executionInput,\n previousResponseTurnRecord,\n resolvedModel,\n responseId,\n responseModel,\n responseMetadata: {\n agentId: agent.id,\n model: responseModel,\n createdAt,\n instructions: body.instructions,\n text: body.text,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n tools: configuredTools,\n store: didStore,\n },\n threadContext,\n };\n}\n\n/**\n * Bridges a Mastra agent stream into OpenAI-style Responses SSE events and completes\n * the stored response-turn record when the stream finishes.\n */\nfunction createResponseEventStream({\n agentMemoryStore,\n body,\n configuredTools,\n createdAt,\n didStore,\n previousResponseTurnRecord,\n responseId,\n responseModel,\n responseMetadata,\n streamResult,\n threadContext,\n}: {\n agentMemoryStore: MemoryStorage | null;\n body: CreateResponseBody;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n createdAt: number;\n didStore: boolean;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n responseId: string;\n responseModel: string;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n streamResult: ResponseStreamResult;\n threadContext: ThreadExecutionContext | null;\n}) {\n const createdResponse = buildInProgressResponse({\n responseId,\n model: responseModel,\n createdAt,\n instructions: body.instructions,\n textConfig: body.text,\n previousResponseId: body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n tools: configuredTools,\n store: didStore,\n });\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n let sequenceNumber = 1;\n const enqueueEvent = (eventName: string, payload: Record<string, unknown>) => {\n controller.enqueue(\n formatSseEvent(eventName, {\n ...payload,\n sequence_number: sequenceNumber++,\n }),\n );\n };\n\n enqueueEvent('response.created', {\n type: 'response.created',\n response: createdResponse,\n });\n enqueueEvent('response.in_progress', {\n type: 'response.in_progress',\n response: createdResponse,\n });\n\n const streamEvents = createResponseStreamEventTranslator(responseId);\n const fullStream = await streamResult.fullStream;\n const reader = fullStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n for (const event of streamEvents.consume(value)) {\n enqueueEvent(event.event, event.payload);\n }\n }\n\n for (const event of streamEvents.flushPendingToolResults()) {\n enqueueEvent(event.event, event.payload);\n }\n\n const { completedState, response } = await finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result: streamResult,\n responseId,\n createdAt,\n model: responseModel,\n instructions: body.instructions,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n configuredTools,\n responseMetadata,\n fallbackText: streamEvents.text,\n fallbackOutputItems: completedState =>\n streamEvents.getOutputItems({\n text: completedState.text,\n status: completedState.status,\n }),\n });\n\n const completedItem = getStreamedMessageOutputItem(response, responseId);\n if (completedItem || completedState.text) {\n for (const event of streamEvents.completeText(\n completedState.text,\n completedItem ?? {\n id: responseId,\n type: 'message' as const,\n role: 'assistant' as const,\n status: 'completed' as const,\n content: [createOutputTextPart(completedState.text)],\n },\n )) {\n enqueueEvent(event.event, event.payload);\n }\n }\n enqueueEvent('response.completed', {\n type: 'response.completed',\n response,\n });\n controller.close();\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n}\n\nexport const CREATE_RESPONSE_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/responses',\n responseType: 'datastream-response',\n bodySchema: createResponseBodySchema,\n responseSchema: responseObjectSchema,\n summary: 'Create a response',\n description: 'Creates a response through a Mastra-hosted Responses API-compatible route',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_EXECUTE,\n handler: async ({ mastra, requestContext, abortSignal, ...body }) => {\n try {\n const {\n agent,\n agentMemoryStore,\n configuredTools,\n createdAt,\n didStore,\n executionInput,\n previousResponseTurnRecord,\n resolvedModel,\n responseId,\n responseModel,\n responseMetadata,\n threadContext,\n } = await prepareCreateResponseRequest({ body, mastra, requestContext });\n\n if (!body.stream) {\n const result = await executeGenerate({\n agent,\n resolvedModel,\n modelOverride: body.model,\n instructions: body.instructions,\n text: body.text,\n providerOptions: body.providerOptions,\n input: executionInput,\n requestContext,\n abortSignal,\n threadContext,\n });\n\n const { response } = await finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result,\n responseId,\n createdAt,\n model: responseModel,\n instructions: body.instructions,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n configuredTools,\n responseMetadata,\n fallbackText: '',\n });\n\n return jsonResponse(response);\n }\n\n const streamResult = await executeStream({\n agent,\n resolvedModel,\n modelOverride: body.model,\n instructions: body.instructions,\n text: body.text,\n providerOptions: body.providerOptions,\n input: executionInput,\n requestContext,\n abortSignal,\n threadContext,\n });\n\n const stream = createResponseEventStream({\n agentMemoryStore,\n body,\n configuredTools,\n createdAt,\n didStore,\n previousResponseTurnRecord,\n responseId,\n responseModel,\n responseMetadata,\n streamResult,\n threadContext,\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream; charset=utf-8',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n } catch (error) {\n return handleError(error, 'Error creating response');\n }\n },\n});\n\nexport const GET_RESPONSE_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/responses/:responseId',\n responseType: 'json',\n pathParamSchema: responseIdPathParams,\n responseSchema: responseObjectSchema,\n summary: 'Retrieve a stored response',\n description: 'Returns a previously stored response object',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, responseId }) => {\n try {\n const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });\n if (!responseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });\n }\n\n return mapResponseTurnRecordToResponse(responseTurnRecord);\n } catch (error) {\n return handleError(error, 'Error retrieving response');\n }\n },\n});\n\nexport const DELETE_RESPONSE_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/responses/:responseId',\n responseType: 'json',\n pathParamSchema: responseIdPathParams,\n responseSchema: deleteResponseSchema,\n summary: 'Delete a stored response',\n description: 'Deletes a stored response so it can no longer be retrieved or chained',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, responseId }) => {\n try {\n const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });\n if (!responseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });\n }\n\n await deleteResponseTurnRecord({ responseTurnRecord });\n\n const response: DeleteResponse = {\n id: responseId,\n object: 'response',\n deleted: true,\n };\n\n return response;\n } catch (error) {\n return handleError(error, 'Error deleting response');\n }\n },\n});\n"]}
import { isBuilderFeatureEnabled } from './chunk-TPGA2ZTS.js';
import { getCallerAuthorId } from './chunk-56AYHXOU.js';
// src/server/handlers/favorites-enrichment.ts
async function prepareFavoritesEnrichment(mastra, requestContext, entityType, entityIds) {
if (!await isBuilderFeatureEnabled(mastra, "favorites")) return null;
const userId = getCallerAuthorId(requestContext);
if (!userId) return null;
const storage = mastra.getStorage();
if (!storage) return null;
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) return null;
const starredIds = entityIds.length === 0 ? /* @__PURE__ */ new Set() : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });
return { userId, starredIds, favoritesStore };
}
function stripFavoriteFields(record) {
if ("isFavorited" in record || "favoriteCount" in record) {
const copy = { ...record };
delete copy.isFavorited;
delete copy.favoriteCount;
return copy;
}
return record;
}
async function enrichOrStripFavorites(mastra, requestContext, entityType, record) {
const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);
if (enrichment) {
return { ...record, isFavorited: enrichment.starredIds.has(record.id) };
}
return stripFavoriteFields(record);
}
export { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields };
//# sourceMappingURL=chunk-PUW3RA3B.js.map
//# sourceMappingURL=chunk-PUW3RA3B.js.map
{"version":3,"sources":["../src/server/handlers/favorites-enrichment.ts"],"names":[],"mappings":";;;;AAyBA,eAAsB,0BAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,SAAA,EACqC;AACrC,EAAA,IAAI,CAAE,MAAM,uBAAA,CAAwB,MAAA,EAAQ,WAAW,GAAI,OAAO,IAAA;AAElE,EAAA,MAAM,MAAA,GAAS,kBAAkB,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AACzD,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,MAAM,UAAA,GACJ,SAAA,CAAU,MAAA,KAAW,CAAA,uBACb,GAAA,EAAY,GAChB,MAAM,cAAA,CAAe,gBAAA,CAAiB,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAA;AAC7E,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,cAAA,EAAe;AAC9C;AAMO,SAAS,oBAAsC,MAAA,EAAc;AAClE,EAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,eAAA,IAAmB,MAAA,EAAQ;AACxD,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AASA,eAAsB,sBAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,MAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,MAAM,0BAAA,CAA2B,MAAA,EAAQ,gBAAgB,UAAA,EAAY,CAAC,MAAA,CAAO,EAAE,CAAC,CAAA;AACnG,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,WAAW,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,EACxE;AACA,EAAA,OAAO,oBAAoB,MAAM,CAAA;AACnC","file":"chunk-PUW3RA3B.js","sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { FavoritesStorage, StorageFavoriteEntityType } from '@mastra/core/storage';\n\nimport { getCallerAuthorId } from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\n\n/**\n * Result of `prepareFavoritesEnrichment` — `null` when the `favorites` EE feature is off.\n * When non-null the caller may use `starredIds` to set `isFavorited` on records\n * and may pass `userId` along to storage list paths for pin-favorited-first\n * sorting (`pinFavoritedFor`).\n */\nexport type FavoritesEnrichmentContext = {\n userId: string;\n starredIds: Set<string>;\n favoritesStore: FavoritesStorage;\n} | null;\n\n/**\n * Resolve the EE feature flag plus the caller's favorited set for a list of\n * candidate entity IDs in one shot. Soft-gated: returns `null` if the feature\n * is off or there's no caller — handlers should drop `isFavorited` / `favoriteCount`\n * fields and ignore `?favoritedOnly=true` in that case.\n */\nexport async function prepareFavoritesEnrichment(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n entityIds: string[],\n): Promise<FavoritesEnrichmentContext> {\n if (!(await isBuilderFeatureEnabled(mastra, 'favorites'))) return null;\n\n const userId = getCallerAuthorId(requestContext);\n if (!userId) return null;\n\n const storage = mastra.getStorage();\n if (!storage) return null;\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) return null;\n\n const starredIds =\n entityIds.length === 0\n ? new Set<string>()\n : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });\n return { userId, starredIds, favoritesStore };\n}\n\n/**\n * Strip the favorites EE fields from a record. Used when the feature is off so\n * stale values from storage do not leak through the API.\n */\nexport function stripFavoriteFields<T extends object>(record: T): T {\n if ('isFavorited' in record || 'favoriteCount' in record) {\n const copy = { ...record } as Record<string, unknown>;\n delete copy.isFavorited;\n delete copy.favoriteCount;\n return copy as T;\n }\n return record;\n}\n\n/**\n * Convenience for single-entity handlers (GET / POST / PATCH): annotate\n * `isFavorited` from the caller's favorites set when enrichment is available,\n * otherwise strip both favorite fields. `favoriteCount` is the canonical\n * mirrored counter and is left in place so callers can render share-count UI\n * (it's identical across viewers).\n */\nexport async function enrichOrStripFavorites<T extends { id: string }>(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n record: T,\n): Promise<T> {\n const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);\n if (enrichment) {\n return { ...record, isFavorited: enrichment.starredIds.has(record.id) };\n }\n return stripFavoriteFields(record);\n}\n"]}
'use strict';
var chunkV23ANIEC_cjs = require('./chunk-V23ANIEC.cjs');
var chunk7DKSWNOM_cjs = require('./chunk-7DKSWNOM.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
// src/server/utils/resolve-builder-model-policy.ts
async function resolveBuilderModelPolicy(editor) {
if (!editor) return { active: false };
if (typeof editor.resolveBuilder !== "function") return { active: false };
if (typeof editor.hasEnabledBuilderConfig === "function" && !editor.hasEnabledBuilderConfig()) {
return { active: false };
}
try {
const builder = await editor.resolveBuilder();
const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');
return builderToModelPolicy(builder);
} catch {
return { active: false };
}
}
// src/server/handlers/editor-builder.ts
async function resolveBuilderFeatures(mastra) {
const editor = mastra.getEditor();
if (!editor || typeof editor.resolveBuilder !== "function") return null;
if (!editor.hasEnabledBuilderConfig?.()) return null;
const builder = await editor.resolveBuilder();
if (!builder || !builder.enabled) return null;
const features = builder.getFeatures?.()?.agent;
if (!features) return null;
const parsed = chunkV23ANIEC_cjs.agentFeaturesSchema.safeParse(features);
return parsed.success ? parsed.data : null;
}
async function isBuilderFeatureEnabled(mastra, feature) {
const features = await resolveBuilderFeatures(mastra);
return features?.[feature] === true;
}
async function requireBuilderFeature(mastra, feature) {
if (!await isBuilderFeatureEnabled(mastra, feature)) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Not Found" });
}
}
var GET_EDITOR_BUILDER_SETTINGS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/editor/builder/settings",
responseType: "json",
responseSchema: chunkV23ANIEC_cjs.builderSettingsResponseSchema,
summary: "Get agent builder settings",
description: "Returns the agent builder feature flags and configuration for UI gating",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra }) => {
try {
const editor = mastra.getEditor();
if (!editor) {
return { enabled: false, modelPolicy: { active: false } };
}
if (typeof editor.resolveBuilder !== "function") {
return { enabled: false, modelPolicy: { active: false } };
}
if (!editor.hasEnabledBuilderConfig?.()) {
return { enabled: false, modelPolicy: { active: false } };
}
const builder = await editor.resolveBuilder();
if (!builder || !builder.enabled) {
return { enabled: false, modelPolicy: { active: false } };
}
const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];
const configuration = builder.getConfiguration();
const collectAliases = (registry) => Object.entries(registry).map(([key, entity]) => ({
id: entity.id || key,
key
}));
const toolAliases = collectAliases(mastra.listTools() ?? {});
const agentAliases = collectAliases(mastra.listAgents() ?? {});
const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});
const toResponseKey = (aliases, byId) => {
const map = /* @__PURE__ */ new Map();
for (const a of aliases) {
map.set(a.id, byId === "id" ? a.id : a.key);
map.set(a.key, byId === "id" ? a.id : a.key);
}
return map;
};
const toolKeyMap = toResponseKey(toolAliases, "key");
const agentKeyMap = toResponseKey(agentAliases, "id");
const workflowKeyMap = toResponseKey(workflowAliases, "key");
const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');
const picker = resolvePickerVisibility({
config: configuration?.agent,
registeredToolIds: toolAliases.flatMap((a) => [a.id, a.key]),
registeredAgentIds: agentAliases.flatMap((a) => [a.id, a.key]),
registeredWorkflowIds: workflowAliases.flatMap((a) => [a.id, a.key])
});
const normalize = (visible, map) => {
if (visible === null) return null;
const out = [];
const seen = /* @__PURE__ */ new Set();
for (const id of visible) {
const mapped = map.get(id);
if (mapped && !seen.has(mapped)) {
seen.add(mapped);
out.push(mapped);
}
}
return out;
};
const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];
return {
enabled: true,
features: builder.getFeatures(),
configuration,
modelPolicy: builderToModelPolicy(builder),
picker: {
visibleTools: normalize(picker.visibleTools, toolKeyMap),
visibleAgents: normalize(picker.visibleAgents, agentKeyMap),
visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap)
},
...modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting builder settings");
}
}
});
var GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/editor/builder/models/available",
responseType: "json",
responseSchema: chunkV23ANIEC_cjs.builderAvailableModelsResponseSchema,
summary: "List builder-available AI models",
description: "Returns AI providers/models filtered by the active agent-builder model policy.",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra }) => {
try {
const providers = (await chunk7DKSWNOM_cjs.buildProvidersList(mastra)).filter((provider) => provider.connected);
const policy = await resolveBuilderModelPolicy(mastra.getEditor());
if (!policy.active || !policy.allowed || policy.allowed.length === 0) {
return { providers };
}
const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');
const filtered = providers.map((provider) => ({
...provider,
models: provider.models.filter((modelId) => isModelAllowed(policy.allowed, { provider: provider.id, modelId }))
})).filter((provider) => provider.models.length > 0);
return { providers: filtered };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error fetching available models");
}
}
});
var GET_INFRASTRUCTURE_STATUS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/editor/builder/infrastructure",
responseType: "json",
responseSchema: chunkV23ANIEC_cjs.infrastructureStatusResponseSchema,
summary: "Get infrastructure status",
description: "Agent Builder infrastructure configuration and lightweight runtime status.",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "infrastructure:read",
handler: async ({ mastra }) => {
try {
const formatConfigValue = (value) => {
if (value === null || value === void 0) return "not set";
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? "" : "s"}`;
return value.constructor?.name && value.constructor.name !== "Object" ? value.constructor.name : "configured";
};
const getProviderName = (value) => {
if (!value) return null;
if (typeof value === "object" && "provider" in value && typeof value.provider === "string")
return value.provider;
if (typeof value === "object" && "constructor" in value) {
const name = value.constructor?.name;
return name && name !== "Object" ? name : "configured";
}
return null;
};
const getConfigEntries = (config, omittedKeys = []) => Object.entries(config).filter(([key, value]) => !omittedKeys.includes(key) && value !== void 0 && value !== null).map(([key, value]) => ({ key, value: formatConfigValue(value) }));
const channelProviders = mastra.getChannelProviders() ?? {};
const channels = {
providers: Object.entries(channelProviders).map(([id, provider]) => {
const info = provider.getInfo?.();
const routes = provider.getRoutes?.() ?? [];
return {
id: info?.id ?? id,
name: info?.name ?? id,
isConfigured: info?.isConfigured ?? false,
routeCount: routes.length
};
}).filter((provider) => provider.isConfigured)
};
const editor = mastra.getEditor();
let browser = {
type: null,
provider: null,
env: null,
registered: false,
availableProviders: [],
config: []
};
let workspace = {
type: null,
workspaceId: null,
name: null,
source: null,
registered: false,
hasFilesystem: false,
hasSandbox: false,
filesystemProvider: null,
sandboxProvider: null,
config: []
};
let registries = {
skillsSh: { enabled: false }
};
if (editor?.resolveBuilder) {
const browsers = editor.__browsers;
const builder = await editor.resolveBuilder();
const builderRegistries = builder?.getRegistries?.();
registries = {
skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true }
};
const configuration = builder?.getConfiguration?.()?.agent;
const browserRef = configuration?.browser;
const browserConfig = browserRef?.config ?? {};
const providerId = browserConfig.provider ?? null;
browser = {
type: browserRef?.type ?? null,
provider: providerId,
env: browserConfig.env ?? null,
registered: providerId ? !!browsers?.has(providerId) : false,
availableProviders: browsers ? Array.from(browsers.keys()) : [],
config: getConfigEntries(browserConfig, ["provider", "env"])
};
const workspaceRef = configuration?.workspace;
const workspaceConfig = workspaceRef?.config ?? {};
const registeredWorkspaces = mastra.listWorkspaces();
const registeredWorkspace = workspaceRef?.workspaceId ? registeredWorkspaces[workspaceRef.workspaceId] : void 0;
const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;
const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;
const filesystemConfig = typeof workspaceConfig.filesystem === "object" && workspaceConfig.filesystem && "config" in workspaceConfig.filesystem ? workspaceConfig.filesystem.config : {};
const sandboxConfig = typeof workspaceConfig.sandbox === "object" && workspaceConfig.sandbox && "config" in workspaceConfig.sandbox ? workspaceConfig.sandbox.config : {};
workspace = {
type: workspaceRef?.type ?? null,
workspaceId: workspaceRef?.workspaceId ?? null,
name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,
source: registeredWorkspace?.source ?? null,
registered: !!registeredWorkspace,
hasFilesystem: !!filesystem,
hasSandbox: !!sandbox,
filesystemProvider: getProviderName(filesystem),
sandboxProvider: getProviderName(sandbox),
config: [
...getConfigEntries(filesystemConfig).map((entry) => ({ ...entry, key: `filesystem.${entry.key}` })),
...getConfigEntries(sandboxConfig).map((entry) => ({ ...entry, key: `sandbox.${entry.key}` }))
]
};
}
return { channels, browser, workspace, registries };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting infrastructure status");
}
}
});
exports.GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE;
exports.GET_EDITOR_BUILDER_SETTINGS_ROUTE = GET_EDITOR_BUILDER_SETTINGS_ROUTE;
exports.GET_INFRASTRUCTURE_STATUS_ROUTE = GET_INFRASTRUCTURE_STATUS_ROUTE;
exports.isBuilderFeatureEnabled = isBuilderFeatureEnabled;
exports.requireBuilderFeature = requireBuilderFeature;
//# sourceMappingURL=chunk-S2HKHYJ3.cjs.map
//# sourceMappingURL=chunk-S2HKHYJ3.cjs.map
{"version":3,"sources":["../src/server/utils/resolve-builder-model-policy.ts","../src/server/handlers/editor-builder.ts"],"names":["agentFeaturesSchema","HTTPException","createRoute","builderSettingsResponseSchema","handleError","builderAvailableModelsResponseSchema","buildProvidersList","infrastructureStatusResponseSchema"],"mappings":"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","file":"chunk-S2HKHYJ3.cjs","sourcesContent":["import type { BuilderModelPolicy } from '@mastra/core/agent-builder/ee';\nimport type { IMastraEditor } from '@mastra/core/editor';\n\n/**\n * Server-side wrapper around `builderToModelPolicy`.\n *\n * Handles the optional `IMastraEditor` builder API surface (older / OSS editors\n * may not implement `hasEnabledBuilderConfig` / `resolveBuilder`) and returns\n * a uniform `BuilderModelPolicy` to every call site.\n *\n * Returns `{ active: false }` whenever:\n * - no editor is configured,\n * - the editor doesn't expose builder methods,\n * - the builder config is disabled, or\n * - resolving the builder fails / yields nothing.\n *\n * The `@mastra/core/agent-builder/ee` subpath is loaded lazily so this module\n * remains importable on `@mastra/core` versions that pre-date the subpath\n * (the subpath was added in core 1.34.0). The dynamic import is only reached\n * once an editor is actually configured, by which point a compatible core is\n * guaranteed.\n */\nexport async function resolveBuilderModelPolicy(editor: IMastraEditor | undefined): Promise<BuilderModelPolicy> {\n if (!editor) return { active: false };\n if (typeof editor.resolveBuilder !== 'function') return { active: false };\n if (typeof editor.hasEnabledBuilderConfig === 'function' && !editor.hasEnabledBuilderConfig()) {\n return { active: false };\n }\n\n // Degrade to inactive on builder-resolution failure rather than letting the\n // rejection escape: agent execution routes seed this on every request, so a\n // transient failure must not 500 the entire route.\n try {\n const builder = await editor.resolveBuilder();\n const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');\n return builderToModelPolicy(builder);\n } catch {\n return { active: false };\n }\n}\n","import type { Mastra } from '@mastra/core';\n\nimport { HTTPException } from '../http-exception';\nimport {\n agentFeaturesSchema,\n builderAvailableModelsResponseSchema,\n builderSettingsResponseSchema,\n infrastructureStatusResponseSchema,\n} from '../schemas/editor-builder';\nimport type { AgentFeatures, InfrastructureStatus } from '../schemas/editor-builder';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { resolveBuilderModelPolicy } from '../utils/resolve-builder-model-policy';\nimport { buildProvidersList } from './agents';\nimport { handleError } from './error';\n\n/**\n * Resolve the active builder feature flags. Returns `null` when the editor is\n * absent, the builder is disabled, or no features are configured.\n */\nasync function resolveBuilderFeatures(mastra: Mastra): Promise<AgentFeatures | null> {\n const editor = mastra.getEditor();\n if (!editor || typeof editor.resolveBuilder !== 'function') return null;\n if (!editor.hasEnabledBuilderConfig?.()) return null;\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) return null;\n const features = builder.getFeatures?.()?.agent;\n if (!features) return null;\n // Validate the shape so unknown keys cannot smuggle through.\n const parsed = agentFeaturesSchema.safeParse(features);\n return parsed.success ? parsed.data : null;\n}\n\n/**\n * Returns whether a given agent-builder feature is enabled. Used by list /\n * get-by-id handlers to soft-gate response enrichment (omit fields, ignore\n * favoritedOnly / pinFavoritedFor params) when the feature is off.\n */\nexport async function isBuilderFeatureEnabled(mastra: Mastra, feature: keyof AgentFeatures): Promise<boolean> {\n const features = await resolveBuilderFeatures(mastra);\n return features?.[feature] === true;\n}\n\n/**\n * Hard-gate helper for mutation routes that must not exist when the feature\n * is off. Throws `HTTPException(404)` so we don't leak the existence of the\n * feature surface (matches behavior of unregistered routes).\n */\nexport async function requireBuilderFeature(mastra: Mastra, feature: keyof AgentFeatures): Promise<void> {\n if (!(await isBuilderFeatureEnabled(mastra, feature))) {\n throw new HTTPException(404, { message: 'Not Found' });\n }\n}\n\n/**\n * GET /editor/builder/settings\n *\n * Returns the agent builder settings configured by the admin.\n * Used by frontend to determine which features to display.\n */\nexport const GET_EDITOR_BUILDER_SETTINGS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/settings',\n responseType: 'json',\n responseSchema: builderSettingsResponseSchema,\n summary: 'Get agent builder settings',\n description: 'Returns the agent builder feature flags and configuration for UI gating',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n const editor = mastra.getEditor();\n\n // No editor configured\n if (!editor) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Editor doesn't support builder (older version or OSS)\n if (typeof editor.resolveBuilder !== 'function') {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Check if builder is enabled in config\n if (!editor.hasEnabledBuilderConfig?.()) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Resolve the builder instance\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];\n const configuration = builder.getConfiguration();\n\n // Picker allowlists are written against entity `.id` (what users see in\n // the UI, URLs, traces). The client filters list responses by their\n // response keys, which are not always `.id`:\n // - GET /agents keys by `agent.id`\n // - GET /tools keys by registration key (values include `id`)\n // - GET /workflows keys by registration key (values omit `id`)\n // To keep the client filter simple, we accept `.id` (fallback to\n // registration key) for matching, but emit visible IDs as response keys\n // so `Object.keys(data)` lines up.\n type AliasPair = { id: string; key: string };\n const collectAliases = (registry: Record<string, unknown>): AliasPair[] =>\n Object.entries(registry).map(([key, entity]) => ({\n id: (entity as { id?: string }).id || key,\n key,\n }));\n\n const toolAliases = collectAliases(mastra.listTools() ?? {});\n const agentAliases = collectAliases(mastra.listAgents() ?? {});\n const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});\n\n // Tools/workflows responses are keyed by registration key. Agents\n // response is keyed by `.id`.\n const toResponseKey = (aliases: AliasPair[], byId: 'id' | 'key') => {\n const map = new Map<string, string>();\n for (const a of aliases) {\n map.set(a.id, byId === 'id' ? a.id : a.key);\n map.set(a.key, byId === 'id' ? a.id : a.key);\n }\n return map;\n };\n const toolKeyMap = toResponseKey(toolAliases, 'key');\n const agentKeyMap = toResponseKey(agentAliases, 'id');\n const workflowKeyMap = toResponseKey(workflowAliases, 'key');\n\n // Lazy-load the EE subpath so this module remains importable on\n // `@mastra/core` versions that pre-date it (added in core 1.34.0).\n // We only reach here after `builder.enabled` is true, which guarantees\n // a compatible core.\n const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');\n\n const picker = resolvePickerVisibility({\n config: configuration?.agent,\n registeredToolIds: toolAliases.flatMap(a => [a.id, a.key]),\n registeredAgentIds: agentAliases.flatMap(a => [a.id, a.key]),\n registeredWorkflowIds: workflowAliases.flatMap(a => [a.id, a.key]),\n });\n\n const normalize = (visible: string[] | null, map: Map<string, string>): string[] | null => {\n if (visible === null) return null;\n const out: string[] = [];\n const seen = new Set<string>();\n for (const id of visible) {\n const mapped = map.get(id);\n if (mapped && !seen.has(mapped)) {\n seen.add(mapped);\n out.push(mapped);\n }\n }\n return out;\n };\n\n const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];\n\n return {\n enabled: true,\n features: builder.getFeatures(),\n configuration,\n modelPolicy: builderToModelPolicy(builder),\n picker: {\n visibleTools: normalize(picker.visibleTools, toolKeyMap),\n visibleAgents: normalize(picker.visibleAgents, agentKeyMap),\n visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap),\n },\n ...(modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}),\n };\n } catch (error) {\n return handleError(error, 'Error getting builder settings');\n }\n },\n});\n\n/**\n * GET /editor/builder/models/available\n *\n * Returns the configured AI providers/models the agent builder may use. The\n * server is the single authority: it scopes the list to providers with a\n * configured API key (`connected`) and applies the active builder model\n * policy via `isModelAllowed`, so the Studio surfaces can render the response\n * verbatim without importing any EE matcher into the browser.\n *\n * - Providers without a configured API key are always omitted — the builder\n * decides the agent's model from this list, so an unconnected provider would\n * produce an agent that can never run.\n * - Policy inactive (or no allowlist) ⇒ all connected providers are returned.\n * - Policy active with an allowlist ⇒ each connected provider's models are\n * filtered, and providers left with no allowed models are omitted entirely.\n */\nexport const GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/models/available',\n responseType: 'json',\n responseSchema: builderAvailableModelsResponseSchema,\n summary: 'List builder-available AI models',\n description: 'Returns AI providers/models filtered by the active agent-builder model policy.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n // Only surface providers whose API key is configured (`connected`). The\n // agent builder decides the agent's model from this list, so including\n // providers without a key lets it pick a model that can never run. We\n // scope to connected providers so every choice is actually usable.\n const providers = (await buildProvidersList(mastra)).filter(provider => provider.connected);\n const policy = await resolveBuilderModelPolicy(mastra.getEditor());\n\n // Inactive policy (or no allowlist) ⇒ no allowlist filtering to apply.\n if (!policy.active || !policy.allowed || policy.allowed.length === 0) {\n return { providers };\n }\n\n // Lazy-load the EE matcher (server-only); mirrors the convention used by\n // resolve-builder-model-policy and the settings handler.\n const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');\n\n const filtered = providers\n .map(provider => ({\n ...provider,\n models: provider.models.filter(modelId => isModelAllowed(policy.allowed, { provider: provider.id, modelId })),\n }))\n .filter(provider => provider.models.length > 0);\n\n return { providers: filtered };\n } catch (error) {\n return handleError(error, 'Error fetching available models');\n }\n },\n});\n\n/**\n * GET /editor/builder/infrastructure\n *\n * Returns the runtime status of Mastra-opinionated primitives (channels,\n * browser providers, workspaces). Admin-only; surfaced in Studio Settings so\n * admins can sanity-check what's wired up to the running server.\n */\nexport const GET_INFRASTRUCTURE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/infrastructure',\n responseType: 'json',\n responseSchema: infrastructureStatusResponseSchema,\n summary: 'Get infrastructure status',\n description: 'Agent Builder infrastructure configuration and lightweight runtime status.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'infrastructure:read',\n handler: async ({ mastra }) => {\n try {\n const formatConfigValue = (value: unknown): string => {\n if (value === null || value === undefined) return 'not set';\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? '' : 's'}`;\n return value.constructor?.name && value.constructor.name !== 'Object' ? value.constructor.name : 'configured';\n };\n\n const getProviderName = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'object' && 'provider' in value && typeof value.provider === 'string')\n return value.provider;\n if (typeof value === 'object' && 'constructor' in value) {\n const name = (value as { constructor?: { name?: string } }).constructor?.name;\n return name && name !== 'Object' ? name : 'configured';\n }\n return null;\n };\n\n const getConfigEntries = (config: Record<string, unknown>, omittedKeys: string[] = []) =>\n Object.entries(config)\n .filter(([key, value]) => !omittedKeys.includes(key) && value !== undefined && value !== null)\n .map(([key, value]) => ({ key, value: formatConfigValue(value) }));\n\n const channelProviders = mastra.getChannelProviders() ?? {};\n const channels: InfrastructureStatus['channels'] = {\n providers: Object.entries(channelProviders)\n .map(([id, provider]) => {\n const info = provider.getInfo?.();\n const routes = provider.getRoutes?.() ?? [];\n return {\n id: info?.id ?? id,\n name: info?.name ?? id,\n isConfigured: info?.isConfigured ?? false,\n routeCount: routes.length,\n };\n })\n .filter(provider => provider.isConfigured),\n };\n\n const editor = mastra.getEditor();\n let browser: InfrastructureStatus['browser'] = {\n type: null,\n provider: null,\n env: null,\n registered: false,\n availableProviders: [],\n config: [],\n };\n let workspace: InfrastructureStatus['workspace'] = {\n type: null,\n workspaceId: null,\n name: null,\n source: null,\n registered: false,\n hasFilesystem: false,\n hasSandbox: false,\n filesystemProvider: null,\n sandboxProvider: null,\n config: [],\n };\n let registries: InfrastructureStatus['registries'] = {\n skillsSh: { enabled: false },\n };\n\n if (editor?.resolveBuilder) {\n const browsers = (editor as unknown as { __browsers?: Map<string, unknown> }).__browsers;\n const builder = await editor.resolveBuilder();\n const builderRegistries = builder?.getRegistries?.();\n registries = {\n skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true },\n };\n const configuration = builder?.getConfiguration?.()?.agent as\n | {\n browser?: { type?: string; config?: { provider?: string; env?: string } };\n workspace?: {\n type?: string;\n workspaceId?: string;\n config?: { name?: string; filesystem?: unknown; sandbox?: unknown };\n };\n }\n | undefined;\n\n const browserRef = configuration?.browser;\n const browserConfig = browserRef?.config ?? {};\n const providerId = browserConfig.provider ?? null;\n browser = {\n type: browserRef?.type ?? null,\n provider: providerId,\n env: browserConfig.env ?? null,\n registered: providerId ? !!browsers?.has(providerId) : false,\n availableProviders: browsers ? Array.from(browsers.keys()) : [],\n config: getConfigEntries(browserConfig, ['provider', 'env']),\n };\n\n const workspaceRef = configuration?.workspace;\n const workspaceConfig = workspaceRef?.config ?? {};\n const registeredWorkspaces = mastra.listWorkspaces();\n const registeredWorkspace = workspaceRef?.workspaceId\n ? registeredWorkspaces[workspaceRef.workspaceId]\n : undefined;\n const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;\n const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;\n const filesystemConfig =\n typeof workspaceConfig.filesystem === 'object' &&\n workspaceConfig.filesystem &&\n 'config' in workspaceConfig.filesystem\n ? (workspaceConfig.filesystem.config as Record<string, unknown>)\n : {};\n const sandboxConfig =\n typeof workspaceConfig.sandbox === 'object' && workspaceConfig.sandbox && 'config' in workspaceConfig.sandbox\n ? (workspaceConfig.sandbox.config as Record<string, unknown>)\n : {};\n workspace = {\n type: workspaceRef?.type ?? null,\n workspaceId: workspaceRef?.workspaceId ?? null,\n name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,\n source: registeredWorkspace?.source ?? null,\n registered: !!registeredWorkspace,\n hasFilesystem: !!filesystem,\n hasSandbox: !!sandbox,\n filesystemProvider: getProviderName(filesystem),\n sandboxProvider: getProviderName(sandbox),\n config: [\n ...getConfigEntries(filesystemConfig).map(entry => ({ ...entry, key: `filesystem.${entry.key}` })),\n ...getConfigEntries(sandboxConfig).map(entry => ({ ...entry, key: `sandbox.${entry.key}` })),\n ],\n };\n }\n\n return { channels, browser, workspace, registries };\n } catch (error) {\n return handleError(error, 'Error getting infrastructure status');\n }\n },\n});\n"]}
import { builderSettingsResponseSchema, builderAvailableModelsResponseSchema, infrastructureStatusResponseSchema, agentFeaturesSchema } from './chunk-4BJSE3LM.js';
import { buildProvidersList } from './chunk-WKSF3TVK.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
// src/server/utils/resolve-builder-model-policy.ts
async function resolveBuilderModelPolicy(editor) {
if (!editor) return { active: false };
if (typeof editor.resolveBuilder !== "function") return { active: false };
if (typeof editor.hasEnabledBuilderConfig === "function" && !editor.hasEnabledBuilderConfig()) {
return { active: false };
}
try {
const builder = await editor.resolveBuilder();
const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');
return builderToModelPolicy(builder);
} catch {
return { active: false };
}
}
// src/server/handlers/editor-builder.ts
async function resolveBuilderFeatures(mastra) {
const editor = mastra.getEditor();
if (!editor || typeof editor.resolveBuilder !== "function") return null;
if (!editor.hasEnabledBuilderConfig?.()) return null;
const builder = await editor.resolveBuilder();
if (!builder || !builder.enabled) return null;
const features = builder.getFeatures?.()?.agent;
if (!features) return null;
const parsed = agentFeaturesSchema.safeParse(features);
return parsed.success ? parsed.data : null;
}
async function isBuilderFeatureEnabled(mastra, feature) {
const features = await resolveBuilderFeatures(mastra);
return features?.[feature] === true;
}
async function requireBuilderFeature(mastra, feature) {
if (!await isBuilderFeatureEnabled(mastra, feature)) {
throw new HTTPException(404, { message: "Not Found" });
}
}
var GET_EDITOR_BUILDER_SETTINGS_ROUTE = createRoute({
method: "GET",
path: "/editor/builder/settings",
responseType: "json",
responseSchema: builderSettingsResponseSchema,
summary: "Get agent builder settings",
description: "Returns the agent builder feature flags and configuration for UI gating",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra }) => {
try {
const editor = mastra.getEditor();
if (!editor) {
return { enabled: false, modelPolicy: { active: false } };
}
if (typeof editor.resolveBuilder !== "function") {
return { enabled: false, modelPolicy: { active: false } };
}
if (!editor.hasEnabledBuilderConfig?.()) {
return { enabled: false, modelPolicy: { active: false } };
}
const builder = await editor.resolveBuilder();
if (!builder || !builder.enabled) {
return { enabled: false, modelPolicy: { active: false } };
}
const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];
const configuration = builder.getConfiguration();
const collectAliases = (registry) => Object.entries(registry).map(([key, entity]) => ({
id: entity.id || key,
key
}));
const toolAliases = collectAliases(mastra.listTools() ?? {});
const agentAliases = collectAliases(mastra.listAgents() ?? {});
const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});
const toResponseKey = (aliases, byId) => {
const map = /* @__PURE__ */ new Map();
for (const a of aliases) {
map.set(a.id, byId === "id" ? a.id : a.key);
map.set(a.key, byId === "id" ? a.id : a.key);
}
return map;
};
const toolKeyMap = toResponseKey(toolAliases, "key");
const agentKeyMap = toResponseKey(agentAliases, "id");
const workflowKeyMap = toResponseKey(workflowAliases, "key");
const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');
const picker = resolvePickerVisibility({
config: configuration?.agent,
registeredToolIds: toolAliases.flatMap((a) => [a.id, a.key]),
registeredAgentIds: agentAliases.flatMap((a) => [a.id, a.key]),
registeredWorkflowIds: workflowAliases.flatMap((a) => [a.id, a.key])
});
const normalize = (visible, map) => {
if (visible === null) return null;
const out = [];
const seen = /* @__PURE__ */ new Set();
for (const id of visible) {
const mapped = map.get(id);
if (mapped && !seen.has(mapped)) {
seen.add(mapped);
out.push(mapped);
}
}
return out;
};
const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];
return {
enabled: true,
features: builder.getFeatures(),
configuration,
modelPolicy: builderToModelPolicy(builder),
picker: {
visibleTools: normalize(picker.visibleTools, toolKeyMap),
visibleAgents: normalize(picker.visibleAgents, agentKeyMap),
visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap)
},
...modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}
};
} catch (error) {
return handleError(error, "Error getting builder settings");
}
}
});
var GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = createRoute({
method: "GET",
path: "/editor/builder/models/available",
responseType: "json",
responseSchema: builderAvailableModelsResponseSchema,
summary: "List builder-available AI models",
description: "Returns AI providers/models filtered by the active agent-builder model policy.",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra }) => {
try {
const providers = (await buildProvidersList(mastra)).filter((provider) => provider.connected);
const policy = await resolveBuilderModelPolicy(mastra.getEditor());
if (!policy.active || !policy.allowed || policy.allowed.length === 0) {
return { providers };
}
const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');
const filtered = providers.map((provider) => ({
...provider,
models: provider.models.filter((modelId) => isModelAllowed(policy.allowed, { provider: provider.id, modelId }))
})).filter((provider) => provider.models.length > 0);
return { providers: filtered };
} catch (error) {
return handleError(error, "Error fetching available models");
}
}
});
var GET_INFRASTRUCTURE_STATUS_ROUTE = createRoute({
method: "GET",
path: "/editor/builder/infrastructure",
responseType: "json",
responseSchema: infrastructureStatusResponseSchema,
summary: "Get infrastructure status",
description: "Agent Builder infrastructure configuration and lightweight runtime status.",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "infrastructure:read",
handler: async ({ mastra }) => {
try {
const formatConfigValue = (value) => {
if (value === null || value === void 0) return "not set";
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? "" : "s"}`;
return value.constructor?.name && value.constructor.name !== "Object" ? value.constructor.name : "configured";
};
const getProviderName = (value) => {
if (!value) return null;
if (typeof value === "object" && "provider" in value && typeof value.provider === "string")
return value.provider;
if (typeof value === "object" && "constructor" in value) {
const name = value.constructor?.name;
return name && name !== "Object" ? name : "configured";
}
return null;
};
const getConfigEntries = (config, omittedKeys = []) => Object.entries(config).filter(([key, value]) => !omittedKeys.includes(key) && value !== void 0 && value !== null).map(([key, value]) => ({ key, value: formatConfigValue(value) }));
const channelProviders = mastra.getChannelProviders() ?? {};
const channels = {
providers: Object.entries(channelProviders).map(([id, provider]) => {
const info = provider.getInfo?.();
const routes = provider.getRoutes?.() ?? [];
return {
id: info?.id ?? id,
name: info?.name ?? id,
isConfigured: info?.isConfigured ?? false,
routeCount: routes.length
};
}).filter((provider) => provider.isConfigured)
};
const editor = mastra.getEditor();
let browser = {
type: null,
provider: null,
env: null,
registered: false,
availableProviders: [],
config: []
};
let workspace = {
type: null,
workspaceId: null,
name: null,
source: null,
registered: false,
hasFilesystem: false,
hasSandbox: false,
filesystemProvider: null,
sandboxProvider: null,
config: []
};
let registries = {
skillsSh: { enabled: false }
};
if (editor?.resolveBuilder) {
const browsers = editor.__browsers;
const builder = await editor.resolveBuilder();
const builderRegistries = builder?.getRegistries?.();
registries = {
skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true }
};
const configuration = builder?.getConfiguration?.()?.agent;
const browserRef = configuration?.browser;
const browserConfig = browserRef?.config ?? {};
const providerId = browserConfig.provider ?? null;
browser = {
type: browserRef?.type ?? null,
provider: providerId,
env: browserConfig.env ?? null,
registered: providerId ? !!browsers?.has(providerId) : false,
availableProviders: browsers ? Array.from(browsers.keys()) : [],
config: getConfigEntries(browserConfig, ["provider", "env"])
};
const workspaceRef = configuration?.workspace;
const workspaceConfig = workspaceRef?.config ?? {};
const registeredWorkspaces = mastra.listWorkspaces();
const registeredWorkspace = workspaceRef?.workspaceId ? registeredWorkspaces[workspaceRef.workspaceId] : void 0;
const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;
const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;
const filesystemConfig = typeof workspaceConfig.filesystem === "object" && workspaceConfig.filesystem && "config" in workspaceConfig.filesystem ? workspaceConfig.filesystem.config : {};
const sandboxConfig = typeof workspaceConfig.sandbox === "object" && workspaceConfig.sandbox && "config" in workspaceConfig.sandbox ? workspaceConfig.sandbox.config : {};
workspace = {
type: workspaceRef?.type ?? null,
workspaceId: workspaceRef?.workspaceId ?? null,
name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,
source: registeredWorkspace?.source ?? null,
registered: !!registeredWorkspace,
hasFilesystem: !!filesystem,
hasSandbox: !!sandbox,
filesystemProvider: getProviderName(filesystem),
sandboxProvider: getProviderName(sandbox),
config: [
...getConfigEntries(filesystemConfig).map((entry) => ({ ...entry, key: `filesystem.${entry.key}` })),
...getConfigEntries(sandboxConfig).map((entry) => ({ ...entry, key: `sandbox.${entry.key}` }))
]
};
}
return { channels, browser, workspace, registries };
} catch (error) {
return handleError(error, "Error getting infrastructure status");
}
}
});
export { GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE, GET_EDITOR_BUILDER_SETTINGS_ROUTE, GET_INFRASTRUCTURE_STATUS_ROUTE, isBuilderFeatureEnabled, requireBuilderFeature };
//# sourceMappingURL=chunk-TPGA2ZTS.js.map
//# sourceMappingURL=chunk-TPGA2ZTS.js.map
{"version":3,"sources":["../src/server/utils/resolve-builder-model-policy.ts","../src/server/handlers/editor-builder.ts"],"names":[],"mappings":"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","file":"chunk-TPGA2ZTS.js","sourcesContent":["import type { BuilderModelPolicy } from '@mastra/core/agent-builder/ee';\nimport type { IMastraEditor } from '@mastra/core/editor';\n\n/**\n * Server-side wrapper around `builderToModelPolicy`.\n *\n * Handles the optional `IMastraEditor` builder API surface (older / OSS editors\n * may not implement `hasEnabledBuilderConfig` / `resolveBuilder`) and returns\n * a uniform `BuilderModelPolicy` to every call site.\n *\n * Returns `{ active: false }` whenever:\n * - no editor is configured,\n * - the editor doesn't expose builder methods,\n * - the builder config is disabled, or\n * - resolving the builder fails / yields nothing.\n *\n * The `@mastra/core/agent-builder/ee` subpath is loaded lazily so this module\n * remains importable on `@mastra/core` versions that pre-date the subpath\n * (the subpath was added in core 1.34.0). The dynamic import is only reached\n * once an editor is actually configured, by which point a compatible core is\n * guaranteed.\n */\nexport async function resolveBuilderModelPolicy(editor: IMastraEditor | undefined): Promise<BuilderModelPolicy> {\n if (!editor) return { active: false };\n if (typeof editor.resolveBuilder !== 'function') return { active: false };\n if (typeof editor.hasEnabledBuilderConfig === 'function' && !editor.hasEnabledBuilderConfig()) {\n return { active: false };\n }\n\n // Degrade to inactive on builder-resolution failure rather than letting the\n // rejection escape: agent execution routes seed this on every request, so a\n // transient failure must not 500 the entire route.\n try {\n const builder = await editor.resolveBuilder();\n const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');\n return builderToModelPolicy(builder);\n } catch {\n return { active: false };\n }\n}\n","import type { Mastra } from '@mastra/core';\n\nimport { HTTPException } from '../http-exception';\nimport {\n agentFeaturesSchema,\n builderAvailableModelsResponseSchema,\n builderSettingsResponseSchema,\n infrastructureStatusResponseSchema,\n} from '../schemas/editor-builder';\nimport type { AgentFeatures, InfrastructureStatus } from '../schemas/editor-builder';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { resolveBuilderModelPolicy } from '../utils/resolve-builder-model-policy';\nimport { buildProvidersList } from './agents';\nimport { handleError } from './error';\n\n/**\n * Resolve the active builder feature flags. Returns `null` when the editor is\n * absent, the builder is disabled, or no features are configured.\n */\nasync function resolveBuilderFeatures(mastra: Mastra): Promise<AgentFeatures | null> {\n const editor = mastra.getEditor();\n if (!editor || typeof editor.resolveBuilder !== 'function') return null;\n if (!editor.hasEnabledBuilderConfig?.()) return null;\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) return null;\n const features = builder.getFeatures?.()?.agent;\n if (!features) return null;\n // Validate the shape so unknown keys cannot smuggle through.\n const parsed = agentFeaturesSchema.safeParse(features);\n return parsed.success ? parsed.data : null;\n}\n\n/**\n * Returns whether a given agent-builder feature is enabled. Used by list /\n * get-by-id handlers to soft-gate response enrichment (omit fields, ignore\n * favoritedOnly / pinFavoritedFor params) when the feature is off.\n */\nexport async function isBuilderFeatureEnabled(mastra: Mastra, feature: keyof AgentFeatures): Promise<boolean> {\n const features = await resolveBuilderFeatures(mastra);\n return features?.[feature] === true;\n}\n\n/**\n * Hard-gate helper for mutation routes that must not exist when the feature\n * is off. Throws `HTTPException(404)` so we don't leak the existence of the\n * feature surface (matches behavior of unregistered routes).\n */\nexport async function requireBuilderFeature(mastra: Mastra, feature: keyof AgentFeatures): Promise<void> {\n if (!(await isBuilderFeatureEnabled(mastra, feature))) {\n throw new HTTPException(404, { message: 'Not Found' });\n }\n}\n\n/**\n * GET /editor/builder/settings\n *\n * Returns the agent builder settings configured by the admin.\n * Used by frontend to determine which features to display.\n */\nexport const GET_EDITOR_BUILDER_SETTINGS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/settings',\n responseType: 'json',\n responseSchema: builderSettingsResponseSchema,\n summary: 'Get agent builder settings',\n description: 'Returns the agent builder feature flags and configuration for UI gating',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n const editor = mastra.getEditor();\n\n // No editor configured\n if (!editor) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Editor doesn't support builder (older version or OSS)\n if (typeof editor.resolveBuilder !== 'function') {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Check if builder is enabled in config\n if (!editor.hasEnabledBuilderConfig?.()) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Resolve the builder instance\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];\n const configuration = builder.getConfiguration();\n\n // Picker allowlists are written against entity `.id` (what users see in\n // the UI, URLs, traces). The client filters list responses by their\n // response keys, which are not always `.id`:\n // - GET /agents keys by `agent.id`\n // - GET /tools keys by registration key (values include `id`)\n // - GET /workflows keys by registration key (values omit `id`)\n // To keep the client filter simple, we accept `.id` (fallback to\n // registration key) for matching, but emit visible IDs as response keys\n // so `Object.keys(data)` lines up.\n type AliasPair = { id: string; key: string };\n const collectAliases = (registry: Record<string, unknown>): AliasPair[] =>\n Object.entries(registry).map(([key, entity]) => ({\n id: (entity as { id?: string }).id || key,\n key,\n }));\n\n const toolAliases = collectAliases(mastra.listTools() ?? {});\n const agentAliases = collectAliases(mastra.listAgents() ?? {});\n const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});\n\n // Tools/workflows responses are keyed by registration key. Agents\n // response is keyed by `.id`.\n const toResponseKey = (aliases: AliasPair[], byId: 'id' | 'key') => {\n const map = new Map<string, string>();\n for (const a of aliases) {\n map.set(a.id, byId === 'id' ? a.id : a.key);\n map.set(a.key, byId === 'id' ? a.id : a.key);\n }\n return map;\n };\n const toolKeyMap = toResponseKey(toolAliases, 'key');\n const agentKeyMap = toResponseKey(agentAliases, 'id');\n const workflowKeyMap = toResponseKey(workflowAliases, 'key');\n\n // Lazy-load the EE subpath so this module remains importable on\n // `@mastra/core` versions that pre-date it (added in core 1.34.0).\n // We only reach here after `builder.enabled` is true, which guarantees\n // a compatible core.\n const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');\n\n const picker = resolvePickerVisibility({\n config: configuration?.agent,\n registeredToolIds: toolAliases.flatMap(a => [a.id, a.key]),\n registeredAgentIds: agentAliases.flatMap(a => [a.id, a.key]),\n registeredWorkflowIds: workflowAliases.flatMap(a => [a.id, a.key]),\n });\n\n const normalize = (visible: string[] | null, map: Map<string, string>): string[] | null => {\n if (visible === null) return null;\n const out: string[] = [];\n const seen = new Set<string>();\n for (const id of visible) {\n const mapped = map.get(id);\n if (mapped && !seen.has(mapped)) {\n seen.add(mapped);\n out.push(mapped);\n }\n }\n return out;\n };\n\n const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];\n\n return {\n enabled: true,\n features: builder.getFeatures(),\n configuration,\n modelPolicy: builderToModelPolicy(builder),\n picker: {\n visibleTools: normalize(picker.visibleTools, toolKeyMap),\n visibleAgents: normalize(picker.visibleAgents, agentKeyMap),\n visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap),\n },\n ...(modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}),\n };\n } catch (error) {\n return handleError(error, 'Error getting builder settings');\n }\n },\n});\n\n/**\n * GET /editor/builder/models/available\n *\n * Returns the configured AI providers/models the agent builder may use. The\n * server is the single authority: it scopes the list to providers with a\n * configured API key (`connected`) and applies the active builder model\n * policy via `isModelAllowed`, so the Studio surfaces can render the response\n * verbatim without importing any EE matcher into the browser.\n *\n * - Providers without a configured API key are always omitted — the builder\n * decides the agent's model from this list, so an unconnected provider would\n * produce an agent that can never run.\n * - Policy inactive (or no allowlist) ⇒ all connected providers are returned.\n * - Policy active with an allowlist ⇒ each connected provider's models are\n * filtered, and providers left with no allowed models are omitted entirely.\n */\nexport const GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/models/available',\n responseType: 'json',\n responseSchema: builderAvailableModelsResponseSchema,\n summary: 'List builder-available AI models',\n description: 'Returns AI providers/models filtered by the active agent-builder model policy.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n // Only surface providers whose API key is configured (`connected`). The\n // agent builder decides the agent's model from this list, so including\n // providers without a key lets it pick a model that can never run. We\n // scope to connected providers so every choice is actually usable.\n const providers = (await buildProvidersList(mastra)).filter(provider => provider.connected);\n const policy = await resolveBuilderModelPolicy(mastra.getEditor());\n\n // Inactive policy (or no allowlist) ⇒ no allowlist filtering to apply.\n if (!policy.active || !policy.allowed || policy.allowed.length === 0) {\n return { providers };\n }\n\n // Lazy-load the EE matcher (server-only); mirrors the convention used by\n // resolve-builder-model-policy and the settings handler.\n const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');\n\n const filtered = providers\n .map(provider => ({\n ...provider,\n models: provider.models.filter(modelId => isModelAllowed(policy.allowed, { provider: provider.id, modelId })),\n }))\n .filter(provider => provider.models.length > 0);\n\n return { providers: filtered };\n } catch (error) {\n return handleError(error, 'Error fetching available models');\n }\n },\n});\n\n/**\n * GET /editor/builder/infrastructure\n *\n * Returns the runtime status of Mastra-opinionated primitives (channels,\n * browser providers, workspaces). Admin-only; surfaced in Studio Settings so\n * admins can sanity-check what's wired up to the running server.\n */\nexport const GET_INFRASTRUCTURE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/infrastructure',\n responseType: 'json',\n responseSchema: infrastructureStatusResponseSchema,\n summary: 'Get infrastructure status',\n description: 'Agent Builder infrastructure configuration and lightweight runtime status.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'infrastructure:read',\n handler: async ({ mastra }) => {\n try {\n const formatConfigValue = (value: unknown): string => {\n if (value === null || value === undefined) return 'not set';\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? '' : 's'}`;\n return value.constructor?.name && value.constructor.name !== 'Object' ? value.constructor.name : 'configured';\n };\n\n const getProviderName = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'object' && 'provider' in value && typeof value.provider === 'string')\n return value.provider;\n if (typeof value === 'object' && 'constructor' in value) {\n const name = (value as { constructor?: { name?: string } }).constructor?.name;\n return name && name !== 'Object' ? name : 'configured';\n }\n return null;\n };\n\n const getConfigEntries = (config: Record<string, unknown>, omittedKeys: string[] = []) =>\n Object.entries(config)\n .filter(([key, value]) => !omittedKeys.includes(key) && value !== undefined && value !== null)\n .map(([key, value]) => ({ key, value: formatConfigValue(value) }));\n\n const channelProviders = mastra.getChannelProviders() ?? {};\n const channels: InfrastructureStatus['channels'] = {\n providers: Object.entries(channelProviders)\n .map(([id, provider]) => {\n const info = provider.getInfo?.();\n const routes = provider.getRoutes?.() ?? [];\n return {\n id: info?.id ?? id,\n name: info?.name ?? id,\n isConfigured: info?.isConfigured ?? false,\n routeCount: routes.length,\n };\n })\n .filter(provider => provider.isConfigured),\n };\n\n const editor = mastra.getEditor();\n let browser: InfrastructureStatus['browser'] = {\n type: null,\n provider: null,\n env: null,\n registered: false,\n availableProviders: [],\n config: [],\n };\n let workspace: InfrastructureStatus['workspace'] = {\n type: null,\n workspaceId: null,\n name: null,\n source: null,\n registered: false,\n hasFilesystem: false,\n hasSandbox: false,\n filesystemProvider: null,\n sandboxProvider: null,\n config: [],\n };\n let registries: InfrastructureStatus['registries'] = {\n skillsSh: { enabled: false },\n };\n\n if (editor?.resolveBuilder) {\n const browsers = (editor as unknown as { __browsers?: Map<string, unknown> }).__browsers;\n const builder = await editor.resolveBuilder();\n const builderRegistries = builder?.getRegistries?.();\n registries = {\n skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true },\n };\n const configuration = builder?.getConfiguration?.()?.agent as\n | {\n browser?: { type?: string; config?: { provider?: string; env?: string } };\n workspace?: {\n type?: string;\n workspaceId?: string;\n config?: { name?: string; filesystem?: unknown; sandbox?: unknown };\n };\n }\n | undefined;\n\n const browserRef = configuration?.browser;\n const browserConfig = browserRef?.config ?? {};\n const providerId = browserConfig.provider ?? null;\n browser = {\n type: browserRef?.type ?? null,\n provider: providerId,\n env: browserConfig.env ?? null,\n registered: providerId ? !!browsers?.has(providerId) : false,\n availableProviders: browsers ? Array.from(browsers.keys()) : [],\n config: getConfigEntries(browserConfig, ['provider', 'env']),\n };\n\n const workspaceRef = configuration?.workspace;\n const workspaceConfig = workspaceRef?.config ?? {};\n const registeredWorkspaces = mastra.listWorkspaces();\n const registeredWorkspace = workspaceRef?.workspaceId\n ? registeredWorkspaces[workspaceRef.workspaceId]\n : undefined;\n const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;\n const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;\n const filesystemConfig =\n typeof workspaceConfig.filesystem === 'object' &&\n workspaceConfig.filesystem &&\n 'config' in workspaceConfig.filesystem\n ? (workspaceConfig.filesystem.config as Record<string, unknown>)\n : {};\n const sandboxConfig =\n typeof workspaceConfig.sandbox === 'object' && workspaceConfig.sandbox && 'config' in workspaceConfig.sandbox\n ? (workspaceConfig.sandbox.config as Record<string, unknown>)\n : {};\n workspace = {\n type: workspaceRef?.type ?? null,\n workspaceId: workspaceRef?.workspaceId ?? null,\n name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,\n source: registeredWorkspace?.source ?? null,\n registered: !!registeredWorkspace,\n hasFilesystem: !!filesystem,\n hasSandbox: !!sandbox,\n filesystemProvider: getProviderName(filesystem),\n sandboxProvider: getProviderName(sandbox),\n config: [\n ...getConfigEntries(filesystemConfig).map(entry => ({ ...entry, key: `filesystem.${entry.key}` })),\n ...getConfigEntries(sandboxConfig).map(entry => ({ ...entry, key: `sandbox.${entry.key}` })),\n ],\n };\n }\n\n return { channels, browser, workspace, registries };\n } catch (error) {\n return handleError(error, 'Error getting infrastructure status');\n }\n },\n});\n"]}
import { listStoredSkillsResponseSchema, listStoredSkillsQuerySchema, getStoredSkillResponseSchema, storedSkillIdPathParams, createStoredSkillResponseSchema, createStoredSkillBodySchema, updateStoredSkillResponseSchema, updateStoredSkillBodySchema, deleteStoredSkillResponseSchema, publishStoredSkillResponseSchema, publishStoredSkillBodySchema } from './chunk-UIRQU4GW.js';
import { stripFavoriteFields, prepareFavoritesEnrichment, enrichOrStripFavorites } from './chunk-PUW3RA3B.js';
import { isBuilderFeatureEnabled } from './chunk-TPGA2ZTS.js';
import { resolveAuthorFilter, getCallerAuthorId, matchesAuthorFilter, assertReadAccess, assertWriteAccess } from './chunk-56AYHXOU.js';
import { getStoredResourceScope, scopeStoredResourceMetadata, assertStoredResourceScope, toSlug } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { LocalSkillSource } from '@mastra/core/workspace';
var INDEXED_FOLDERS = ["references", "scripts", "assets"];
function extractIndexedPathsFromFiles(files, existing) {
if (!files || files.length === 0) return {};
const root = files.find((n) => n.type === "folder");
if (!root?.children) return {};
const result = {};
for (const folderName of INDEXED_FOLDERS) {
const folder = root.children.find((n) => n.type === "folder" && n.name === folderName);
if (!folder?.children || folder.children.length === 0) continue;
const existingPaths = new Set(existing[folderName] ?? []);
const paths = [...existingPaths];
collectFilePaths(folder.children, folderName, existingPaths, paths);
if (paths.length > 0) {
result[folderName] = paths;
}
}
return result;
}
function collectFilePaths(nodes, prefix, existingPaths, out) {
for (const node of nodes) {
if (node.type === "file") {
const relativePath = `${prefix}/${node.name}`;
if (!existingPaths.has(relativePath)) {
out.push(relativePath);
}
} else if (node.type === "folder" && node.children) {
collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);
}
}
}
var LIST_STORED_SKILLS_ROUTE = createRoute({
method: "GET",
path: "/stored/skills",
responseType: "json",
queryParamSchema: listStoredSkillsQuerySchema,
responseSchema: listStoredSkillsResponseSchema,
summary: "List stored skills",
description: "Returns a paginated list of all skill configurations stored in the database",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
page,
perPage,
orderBy,
status,
authorId,
visibility,
metadata,
favoritedOnly,
pinFavoritedFor
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const filter = resolveAuthorFilter({
requestContext,
resource: "stored-skills",
queryAuthorId: authorId,
queryVisibility: visibility
});
const scope = await getStoredResourceScope(mastra, requestContext);
const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);
const callerId = getCallerAuthorId(requestContext);
const favoritesEnabled = await isBuilderFeatureEnabled(mastra, "favorites");
const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;
const favoriteSubjectId = pinFavoritedFor ?? callerId;
if (honoredStarredOnly) {
const effectivePerPage = perPage ?? 100;
if (!favoriteSubjectId) {
return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new HTTPException(500, { message: "Favorites storage domain is not available" });
}
const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: "skill" });
if (starredIds.length === 0) {
return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const allMatching = await skillStore.listResolved({
perPage: false,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata,
entityIds: starredIds
});
const visible = allMatching.skills.filter((record) => matchesAuthorFilter(record, filter));
const total = visible.length;
const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;
const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;
const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);
const annotated2 = sliced.map((record) => ({ ...record, isFavorited: true }));
const hasMore = effectivePerPage > 0 && endIdx < total;
return {
skills: annotated2,
total,
page,
perPage: effectivePerPage,
hasMore
};
}
const result = await skillStore.listResolved({
page,
perPage,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata
});
const visibleSkills = result.skills.filter((record) => matchesAuthorFilter(record, filter));
if (!favoritesEnabled) {
return { ...result, skills: visibleSkills.map(stripFavoriteFields) };
}
const enrichment = await prepareFavoritesEnrichment(
mastra,
requestContext,
"skill",
visibleSkills.map((s) => s.id)
);
const annotated = enrichment ? visibleSkills.map((record) => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) })) : visibleSkills.map(stripFavoriteFields);
return { ...result, skills: annotated };
} catch (error) {
return handleError(error, "Error listing stored skills");
}
}
});
var GET_STORED_SKILL_ROUTE = createRoute({
method: "GET",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
responseSchema: getStoredSkillResponseSchema,
summary: "Get stored skill by ID",
description: "Returns a specific skill from storage by its unique identifier (resolved with active version config)",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
return enrichOrStripFavorites(mastra, requestContext, "skill", skill);
} catch (error) {
return handleError(error, "Error getting stored skill");
}
}
});
var CREATE_STORED_SKILL_ROUTE = createRoute({
method: "POST",
path: "/stored/skills",
responseType: "json",
bodySchema: createStoredSkillBodySchema,
responseSchema: createStoredSkillResponseSchema,
summary: "Create stored skill",
description: "Creates a new skill configuration in storage with the provided details",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
id: providedId,
name,
description,
instructions,
license,
compatibility,
source,
references,
scripts,
assets,
files,
metadata,
visibility: bodyVisibility
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const id = providedId || toSlug(name);
if (!id) {
throw new HTTPException(400, {
message: "Could not derive skill ID from name. Please provide an explicit id."
});
}
const existing = await skillStore.getById(id);
if (existing) {
throw new HTTPException(409, { message: `Skill with id ${id} already exists` });
}
const authorId = getCallerAuthorId(requestContext) ?? void 0;
const visibility = authorId ? bodyVisibility ?? "private" : "public";
const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });
await skillStore.create({
skill: {
id,
authorId,
visibility,
name,
description,
instructions,
license,
compatibility,
source,
references: indexedPaths.references ?? references,
scripts: indexedPaths.scripts ?? scripts,
assets: indexedPaths.assets ?? assets,
files,
metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext))
}
});
const resolved = await skillStore.getByIdResolved(id);
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve created skill" });
}
return enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return handleError(error, "Error creating stored skill");
}
}
});
var UPDATE_STORED_SKILL_ROUTE = createRoute({
method: "PATCH",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
bodySchema: updateStoredSkillBodySchema,
responseSchema: updateStoredSkillResponseSchema,
summary: "Update stored skill",
description: "Updates an existing skill in storage with the provided fields",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
storedSkillId,
// Entity-level fields
authorId,
visibility,
// Config fields (snapshot-level)
name,
description,
instructions,
license,
compatibility,
source,
references,
scripts,
assets,
files,
metadata
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
const scope = await getStoredResourceScope(mastra, requestContext);
assertStoredResourceScope(existing, scope);
assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "edit",
record: existing
});
const callerAuthorId = getCallerAuthorId(requestContext) ?? void 0;
const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? "public" : void 0;
const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};
const update = { id: storedSkillId };
if (authorId !== void 0) update.authorId = authorId;
if (resolvedVisibility !== void 0) update.visibility = resolvedVisibility;
if (name !== void 0) update.name = name;
if (description !== void 0) update.description = description;
if (instructions !== void 0) update.instructions = instructions;
if (license !== void 0) update.license = license;
if (compatibility !== void 0) update.compatibility = compatibility;
if (source !== void 0) update.source = source;
const resolvedReferences = indexedPaths.references ?? references;
const resolvedScripts = indexedPaths.scripts ?? scripts;
const resolvedAssets = indexedPaths.assets ?? assets;
if (resolvedReferences !== void 0) update.references = resolvedReferences;
if (resolvedScripts !== void 0) update.scripts = resolvedScripts;
if (resolvedAssets !== void 0) update.assets = resolvedAssets;
if (files !== void 0) update.files = files;
if (metadata !== void 0) {
update.metadata = scopeStoredResourceMetadata({ ...existing.metadata ?? {}, ...metadata }, scope);
}
await skillStore.update(update);
const resolved = await skillStore.getByIdResolved(storedSkillId);
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve updated skill" });
}
return enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return handleError(error, "Error updating stored skill");
}
}
});
var DELETE_STORED_SKILL_ROUTE = createRoute({
method: "DELETE",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
responseSchema: deleteStoredSkillResponseSchema,
summary: "Delete stored skill",
description: "Deletes a skill from storage by its unique identifier",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));
assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "delete",
record: existing
});
await skillStore.delete(storedSkillId);
try {
const favoritesStore = await storage.getStore("favorites");
await favoritesStore?.deleteFavoritesForEntity({ entityType: "skill", entityId: storedSkillId });
} catch (cascadeError) {
mastra.getLogger?.()?.warn?.("Failed to cascade-delete favorites for skill", { storedSkillId, error: cascadeError });
}
return {
success: true,
message: `Skill ${storedSkillId} deleted successfully`
};
} catch (error) {
return handleError(error, "Error deleting stored skill");
}
}
});
var PUBLISH_STORED_SKILL_ROUTE = createRoute({
method: "POST",
path: "/stored/skills/:storedSkillId/publish",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
bodySchema: publishStoredSkillBodySchema,
responseSchema: publishStoredSkillResponseSchema,
summary: "Publish stored skill",
description: "Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const blobStore = await storage.getStore("blobs");
if (!blobStore) {
throw new HTTPException(500, { message: "Blob storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));
assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "edit",
record: existing
});
const path = await import('path');
const fs = await import('fs/promises');
const resolvedPath = path.default.resolve(skillPath);
const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());
if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {
throw new HTTPException(400, {
message: `skillPath must be within the allowed directory: ${allowedBase}`
});
}
try {
const stat = await fs.stat(resolvedPath);
if (!stat.isDirectory()) {
throw new HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });
}
} catch (err) {
if (err instanceof HTTPException) throw err;
if (err?.code === "ENOENT") {
throw new HTTPException(400, {
message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`
});
}
throw err;
}
try {
await fs.stat(path.default.join(resolvedPath, "SKILL.md"));
} catch (err) {
if (err?.code === "ENOENT") {
throw new HTTPException(400, {
message: `skillPath is missing SKILL.md: ${resolvedPath}`
});
}
throw err;
}
const source = new LocalSkillSource();
const { publishSkillFromSource } = await import('@mastra/core/workspace');
const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);
const snapshotUpdate = {};
for (const [key, value] of Object.entries(snapshot)) {
if (value !== void 0) snapshotUpdate[key] = value;
}
await skillStore.update({
id: storedSkillId,
...snapshotUpdate,
tree,
files,
status: "published"
});
const latestVersion = await skillStore.getLatestVersion(storedSkillId);
if (latestVersion) {
await skillStore.update({
id: storedSkillId,
activeVersionId: latestVersion.id
});
}
const resolved = await skillStore.getByIdResolved(storedSkillId);
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve skill after publish" });
}
return enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return handleError(error, "Error publishing stored skill");
}
}
});
export { CREATE_STORED_SKILL_ROUTE, DELETE_STORED_SKILL_ROUTE, GET_STORED_SKILL_ROUTE, LIST_STORED_SKILLS_ROUTE, PUBLISH_STORED_SKILL_ROUTE, UPDATE_STORED_SKILL_ROUTE };
//# sourceMappingURL=chunk-TS5QYSEZ.js.map
//# sourceMappingURL=chunk-TS5QYSEZ.js.map
{"version":3,"sources":["../src/server/handlers/stored-skills.ts"],"names":["annotated"],"mappings":"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","file":"chunk-TS5QYSEZ.js","sourcesContent":["import type { StorageSkillFileNode } from '@mastra/core/storage';\nimport { LocalSkillSource } from '@mastra/core/workspace';\n\nimport { HTTPException } from '../http-exception';\nimport {\n storedSkillIdPathParams,\n listStoredSkillsQuerySchema,\n createStoredSkillBodySchema,\n updateStoredSkillBodySchema,\n publishStoredSkillBodySchema,\n listStoredSkillsResponseSchema,\n getStoredSkillResponseSchema,\n createStoredSkillResponseSchema,\n updateStoredSkillResponseSchema,\n deleteStoredSkillResponseSchema,\n publishStoredSkillResponseSchema,\n} from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { toSlug, assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata } from '../utils';\n\nimport {\n assertReadAccess,\n assertWriteAccess,\n getCallerAuthorId,\n matchesAuthorFilter,\n resolveAuthorFilter,\n} from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\nimport { handleError } from './error';\nimport { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from './favorites-enrichment';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Well-known folder names in the skill file tree whose children represent\n * indexable path arrays (references, scripts, assets).\n */\nconst INDEXED_FOLDERS = ['references', 'scripts', 'assets'] as const;\n\n/**\n * Walks the `files` tree and collects relative file paths for each well-known\n * folder (references, scripts, assets). Returned arrays only include entries\n * that are not already present in any explicitly-provided arrays so callers\n * can pass both `files` and `references` without creating duplicates.\n */\nfunction extractIndexedPathsFromFiles(\n files: StorageSkillFileNode[] | undefined,\n existing: {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n },\n): {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n} {\n if (!files || files.length === 0) return {};\n\n // Find the root folder (first folder node, usually id=\"root\")\n const root = files.find(n => n.type === 'folder');\n if (!root?.children) return {};\n\n const result: Record<string, string[]> = {};\n\n for (const folderName of INDEXED_FOLDERS) {\n const folder = root.children.find(n => n.type === 'folder' && n.name === folderName);\n if (!folder?.children || folder.children.length === 0) continue;\n\n const existingPaths = new Set(existing[folderName] ?? []);\n const paths: string[] = [...existingPaths];\n\n collectFilePaths(folder.children, folderName, existingPaths, paths);\n\n if (paths.length > 0) {\n result[folderName] = paths;\n }\n }\n\n return result;\n}\n\n/** Recursively collects file paths from a subtree, building relative paths. */\nfunction collectFilePaths(\n nodes: StorageSkillFileNode[],\n prefix: string,\n existingPaths: Set<string>,\n out: string[],\n): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const relativePath = `${prefix}/${node.name}`;\n if (!existingPaths.has(relativePath)) {\n out.push(relativePath);\n }\n } else if (node.type === 'folder' && node.children) {\n collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);\n }\n }\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/skills - List all stored skills\n */\nexport const LIST_STORED_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills',\n responseType: 'json',\n queryParamSchema: listStoredSkillsQuerySchema,\n responseSchema: listStoredSkillsResponseSchema,\n summary: 'List stored skills',\n description: 'Returns a paginated list of all skill configurations stored in the database',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n page,\n perPage,\n orderBy,\n status,\n authorId,\n visibility,\n metadata,\n favoritedOnly,\n pinFavoritedFor,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const filter = resolveAuthorFilter({\n requestContext,\n resource: 'stored-skills',\n queryAuthorId: authorId,\n queryVisibility: visibility,\n });\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);\n\n const callerId = getCallerAuthorId(requestContext);\n const favoritesEnabled = await isBuilderFeatureEnabled(mastra, 'favorites');\n const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;\n const favoriteSubjectId = pinFavoritedFor ?? callerId;\n\n // `?favoritedOnly=true` flow: fetch caller's favorited IDs, restrict the list\n // to that set, then post-filter by visibility and recompute total/pages.\n if (honoredStarredOnly) {\n const effectivePerPage: number = perPage ?? 100;\n if (!favoriteSubjectId) {\n // Caller cannot have favorited anything without an identity.\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: 'skill' });\n if (starredIds.length === 0) {\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const allMatching = await skillStore.listResolved({\n perPage: false,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n entityIds: starredIds,\n });\n const visible = allMatching.skills.filter(record => matchesAuthorFilter(record, filter));\n const total = visible.length;\n const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;\n const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;\n const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);\n const annotated = sliced.map(record => ({ ...record, isFavorited: true }));\n const hasMore = effectivePerPage > 0 && endIdx < total;\n return {\n skills: annotated,\n total,\n page,\n perPage: effectivePerPage,\n hasMore,\n };\n }\n\n const result = await skillStore.listResolved({\n page,\n perPage,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n });\n\n // Post-filter to enforce ownership + visibility rules across all backends.\n // Storage adapters can only do an equality filter on authorId, so we apply\n // the ownedOrPublic / publicOnly logic here.\n // Note: `result.total` / `result.hasMore` reflect the storage-reported\n // count before this post-filter. For `unrestricted` / `exact` filters\n // nothing is removed; for `ownedOrPublic` / `publicOnly`, downstream UIs\n // should treat the filter as a view over the caller's scope — an\n // approximation is OK and preserves pagination math.\n const visibleSkills = result.skills.filter(record => matchesAuthorFilter(record, filter));\n\n if (!favoritesEnabled) {\n return { ...result, skills: visibleSkills.map(stripFavoriteFields) };\n }\n\n const enrichment = await prepareFavoritesEnrichment(\n mastra,\n requestContext,\n 'skill',\n visibleSkills.map(s => s.id),\n );\n const annotated = enrichment\n ? visibleSkills.map(record => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) }))\n : visibleSkills.map(stripFavoriteFields);\n\n return { ...result, skills: annotated };\n } catch (error) {\n return handleError(error, 'Error listing stored skills');\n }\n },\n});\n\n/**\n * GET /stored/skills/:storedSkillId - Get a stored skill by ID\n */\nexport const GET_STORED_SKILL_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: getStoredSkillResponseSchema,\n summary: 'Get stored skill by ID',\n description: 'Returns a specific skill from storage by its unique identifier (resolved with active version config)',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', skill);\n } catch (error) {\n return handleError(error, 'Error getting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills - Create a new stored skill\n */\nexport const CREATE_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills',\n responseType: 'json',\n bodySchema: createStoredSkillBodySchema,\n responseSchema: createStoredSkillResponseSchema,\n summary: 'Create stored skill',\n description: 'Creates a new skill configuration in storage with the provided details',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n id: providedId,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n visibility: bodyVisibility,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive skill ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if skill with this ID already exists\n const existing = await skillStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Skill with id ${id} already exists` });\n }\n\n // Force authorId from the authenticated caller; ignore any body-provided value.\n // No owner = always public (no auth / no user context).\n // With an owner, respect the client's choice, defaulting to 'private'.\n const authorId = getCallerAuthorId(requestContext) ?? undefined;\n const visibility: 'private' | 'public' = authorId ? (bodyVisibility ?? 'private') : 'public';\n\n // Derive references/scripts/assets path arrays from the files tree\n // so agents can discover them via skill_read even when only `files` is provided.\n const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });\n\n await skillStore.create({\n skill: {\n id,\n authorId,\n visibility,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references: indexedPaths.references ?? references,\n scripts: indexedPaths.scripts ?? scripts,\n assets: indexedPaths.assets ?? assets,\n files,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n },\n });\n\n // Return the resolved skill (thin record + version config)\n const resolved = await skillStore.getByIdResolved(id);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error creating stored skill');\n }\n },\n});\n\n/**\n * PATCH /stored/skills/:storedSkillId - Update a stored skill\n */\nexport const UPDATE_STORED_SKILL_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: updateStoredSkillBodySchema,\n responseSchema: updateStoredSkillResponseSchema,\n summary: 'Update stored skill',\n description: 'Updates an existing skill in storage with the provided fields',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n storedSkillId,\n // Entity-level fields\n authorId,\n visibility,\n // Config fields (snapshot-level)\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // No owner = always public, regardless of what the client sent.\n const callerAuthorId = getCallerAuthorId(requestContext) ?? undefined;\n const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? 'public' : undefined;\n\n // Derive references/scripts/assets path arrays from the files tree\n const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};\n\n // Update the skill with both entity-level and config-level fields.\n // The storage layer handles separating these into record updates vs\n // new-version creation, but it uses `field in updates` to detect config\n // changes — so we must only include fields the caller actually sent.\n // Forwarding `undefined` keys would trigger a spurious version create\n // and pass `undefined` into the database driver.\n const update: Record<string, unknown> = { id: storedSkillId };\n if (authorId !== undefined) update.authorId = authorId;\n if (resolvedVisibility !== undefined) update.visibility = resolvedVisibility;\n if (name !== undefined) update.name = name;\n if (description !== undefined) update.description = description;\n if (instructions !== undefined) update.instructions = instructions;\n if (license !== undefined) update.license = license;\n if (compatibility !== undefined) update.compatibility = compatibility;\n if (source !== undefined) update.source = source;\n const resolvedReferences = indexedPaths.references ?? references;\n const resolvedScripts = indexedPaths.scripts ?? scripts;\n const resolvedAssets = indexedPaths.assets ?? assets;\n if (resolvedReferences !== undefined) update.references = resolvedReferences;\n if (resolvedScripts !== undefined) update.scripts = resolvedScripts;\n if (resolvedAssets !== undefined) update.assets = resolvedAssets;\n if (files !== undefined) update.files = files;\n if (metadata !== undefined) {\n update.metadata = scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope);\n }\n\n await skillStore.update(update as Parameters<typeof skillStore.update>[0]);\n\n // Return the resolved skill with the updated config\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error updating stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId - Delete a stored skill\n */\nexport const DELETE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: deleteStoredSkillResponseSchema,\n summary: 'Delete stored skill',\n description: 'Deletes a skill from storage by its unique identifier',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `skills:delete[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'delete',\n record: existing,\n });\n\n await skillStore.delete(storedSkillId);\n\n // Cascade: drop any favorite rows referencing this skill. Failure must not\n // abort the delete.\n try {\n const favoritesStore = await storage.getStore('favorites');\n await favoritesStore?.deleteFavoritesForEntity({ entityType: 'skill', entityId: storedSkillId });\n } catch (cascadeError) {\n mastra\n .getLogger?.()\n ?.warn?.('Failed to cascade-delete favorites for skill', { storedSkillId, error: cascadeError });\n }\n\n return {\n success: true,\n message: `Skill ${storedSkillId} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills/:storedSkillId/publish - Publish a skill from filesystem\n * Walks the skill directory, hashes files into blob store, creates a new version\n * with the tree manifest, and sets activeVersionId.\n */\nexport const PUBLISH_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills/:storedSkillId/publish',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: publishStoredSkillBodySchema,\n responseSchema: publishStoredSkillResponseSchema,\n summary: 'Publish stored skill',\n description:\n 'Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const blobStore = await storage.getStore('blobs');\n if (!blobStore) {\n throw new HTTPException(500, { message: 'Blob storage domain is not available' });\n }\n\n // Verify skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // Validate skillPath to prevent path traversal\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n const resolvedPath = path.default.resolve(skillPath);\n const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());\n if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {\n throw new HTTPException(400, {\n message: `skillPath must be within the allowed directory: ${allowedBase}`,\n });\n }\n\n // Verify the source directory exists and contains a SKILL.md before attempting\n // to publish, so callers get a 400 with context instead of a raw 500/ENOENT.\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });\n }\n } catch (err) {\n if (err instanceof HTTPException) throw err;\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`,\n });\n }\n throw err;\n }\n try {\n await fs.stat(path.default.join(resolvedPath, 'SKILL.md'));\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath is missing SKILL.md: ${resolvedPath}`,\n });\n }\n throw err;\n }\n\n // Use LocalSkillSource to read from the server filesystem\n const source = new LocalSkillSource();\n const { publishSkillFromSource } = await import('@mastra/core/workspace');\n\n const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);\n\n // Strip undefined keys from the snapshot before passing to update(). The\n // storage layer treats \"field present\" as \"field changed\"; forwarding\n // undefined would overwrite populated columns with undefined and trip\n // NOT NULL / \"undefined cannot be passed as argument\" errors in\n // adapters that bind args raw (libsql, pg).\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 // `files` is the nested folder/file structure shown in the editor; without\n // it the column would stay null and the UI would render an empty tree.\n await skillStore.update({\n id: storedSkillId,\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(storedSkillId);\n if (latestVersion) {\n await skillStore.update({\n id: storedSkillId,\n activeVersionId: latestVersion.id,\n });\n }\n\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve skill after publish' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error publishing stored skill');\n }\n },\n});\n"]}
'use strict';
var chunkZCX2J552_cjs = require('./chunk-ZCX2J552.cjs');
var chunk73MURMD2_cjs = require('./chunk-73MURMD2.cjs');
var chunkS2HKHYJ3_cjs = require('./chunk-S2HKHYJ3.cjs');
var chunkM3UP3Z3G_cjs = require('./chunk-M3UP3Z3G.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
var chunk2XZ2466F_cjs = require('./chunk-2XZ2466F.cjs');
var chunkTIWGWGIO_cjs = require('./chunk-TIWGWGIO.cjs');
var chunkDIG2K5CV_cjs = require('./chunk-DIG2K5CV.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
// src/server/handlers/stored-agents.ts
async function resolveBrowserField(browser, mastra) {
if (browser === true) {
const editor = mastra.getEditor?.();
const builder = await editor?.resolveBuilder?.();
const defaultBrowser = builder?.getConfiguration?.()?.agent?.browser;
if (!defaultBrowser) {
console.warn(
"[mastra:server] Browser enabled (browser: true) but no default browser config found in builder configuration. The agent will be created/updated without browser access. Set `editor.builder.configuration.agent.browser` to fix this."
);
}
return defaultBrowser ?? void 0;
}
if (browser === false) {
return null;
}
return browser;
}
var AGENT_SNAPSHOT_CONFIG_FIELDS = [
"name",
"description",
"instructions",
"model",
"tools",
"defaultOptions",
"workflows",
"agents",
"integrationTools",
"toolProviders",
"inputProcessors",
"outputProcessors",
"memory",
"scorers",
"requestContextSchema",
"mcpClients",
"skills",
"workspace",
"browser"
];
var CODE_AGENT_OVERRIDE_FIELDS = [
"instructions",
"tools",
"integrationTools",
"mcpClients",
"requestContextSchema"
];
function getCodeAgentOwnership(editorConfig) {
if (editorConfig === false) {
return { ownsInstructions: false, ownsTools: false, ownsToolDescriptionsOnly: false };
}
if (editorConfig === void 0 || editorConfig === null) {
return { ownsInstructions: true, ownsTools: true, ownsToolDescriptionsOnly: false };
}
if (typeof editorConfig !== "object") {
return { ownsInstructions: false, ownsTools: false, ownsToolDescriptionsOnly: false };
}
const cfg = editorConfig;
const ownsInstructions = cfg.instructions === true;
const toolsCfg = cfg.tools;
const ownsTools = toolsCfg === true;
const ownsToolDescriptionsOnly = typeof toolsCfg === "object" && toolsCfg !== null && toolsCfg.description === true;
return { ownsInstructions, ownsTools, ownsToolDescriptionsOnly };
}
function hasNonEmptyInstructions(value) {
if (typeof value === "string") {
return value.trim().length > 0;
}
if (!Array.isArray(value)) {
return false;
}
return value.some((block) => {
if (!block || typeof block !== "object") {
return false;
}
const typedBlock = block;
if (typedBlock.type === "prompt_block_ref") {
return typeof typedBlock.id === "string" && typedBlock.id.length > 0;
}
return typeof typedBlock.content === "string" && typedBlock.content.trim().length > 0;
});
}
function assertOwnedInstructionsNotEmpty(instructions) {
if (!hasNonEmptyInstructions(instructions)) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Instructions are required" });
}
}
function sortForStableJson(value) {
if (Array.isArray(value)) {
return value.map(sortForStableJson);
}
if (value && typeof value === "object" && !(value instanceof Date)) {
return Object.fromEntries(
Object.entries(value).filter(([, entry]) => entry !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, sortForStableJson(entry)])
);
}
return value;
}
function buildExportConfig(input, agent) {
const editorConfig = agent?.__getEditorConfig?.();
const isCodeAgent = agent?.source === "code";
const allowedFields = isCodeAgent ? CODE_AGENT_OVERRIDE_FIELDS : AGENT_SNAPSHOT_CONFIG_FIELDS;
const ownership = isCodeAgent ? getCodeAgentOwnership(editorConfig) : null;
const config = {};
for (const field of allowedFields) {
if (input[field] === void 0) continue;
if (ownership) {
if (field === "instructions" && !ownership.ownsInstructions) continue;
if ((field === "tools" || field === "integrationTools" || field === "mcpClients") && !ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
continue;
}
}
config[field] = input[field];
}
return sortForStableJson(config);
}
function agentExportFilename(agentId) {
return `agents/${encodeURIComponent(agentId)}.json`;
}
function sourceChangeRequestHeadRef(agentId) {
const safeAgentId = agentId.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "agent";
return `mastra/${safeAgentId}`;
}
function sourceChangeRequestMessage(agentId, userName, changeMessage) {
const normalizedUserName = userName?.replace(/\s+/g, " ").trim();
const normalizedMessage = changeMessage?.replace(/\s+/g, " ").trim();
const message = normalizedMessage || `Update ${agentId} agent override`;
return normalizedUserName ? `${message} by ${normalizedUserName}` : message;
}
var LIST_STORED_AGENTS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/agents",
responseType: "json",
queryParamSchema: chunkTIWGWGIO_cjs.listStoredAgentsQuerySchema,
responseSchema: chunkTIWGWGIO_cjs.listStoredAgentsResponseSchema,
summary: "List stored agents",
description: "Returns a paginated list of all agents stored in the database",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
page,
perPage,
orderBy,
status,
authorId,
visibility,
metadata,
favoritedOnly,
pinFavoritedFor
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const filter = chunkKGUHJRHZ_cjs.resolveAuthorFilter({
requestContext,
resource: "stored-agents",
queryAuthorId: authorId,
queryVisibility: visibility === "public" ? "public" : void 0
});
const scope = await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext);
const scopedMetadata = chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(metadata, scope);
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
const favoritesEnabled = await chunkS2HKHYJ3_cjs.isBuilderFeatureEnabled(mastra, "favorites");
const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;
const favoriteSubjectId = pinFavoritedFor ?? callerId;
if (honoredStarredOnly) {
const effectivePerPage = perPage ?? 100;
if (!favoriteSubjectId) {
return { agents: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Favorites storage domain is not available" });
}
const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: "agent" });
if (starredIds.length === 0) {
return { agents: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const allMatching = await agentsStore.listResolved({
perPage: false,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata,
entityIds: starredIds
});
const visible = allMatching.agents.filter((record) => chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter));
const total = visible.length;
const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;
const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;
const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);
const annotated2 = sliced.map((record) => ({ ...record, isFavorited: true }));
const authors2 = await chunkM3UP3Z3G_cjs.prepareAuthorEnrichment(
mastra,
requestContext,
annotated2.map((a) => a.authorId)
);
const withAuthors2 = authors2 ? annotated2.map((record) => chunkM3UP3Z3G_cjs.attachAuthor(record, authors2)) : annotated2;
const hasMore = effectivePerPage > 0 && endIdx < total;
return { agents: withAuthors2, total, page, perPage: effectivePerPage, hasMore };
}
const result = await agentsStore.listResolved({
page,
perPage,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata
});
const visibleAgents = result.agents.filter((record) => chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter));
const authors = await chunkM3UP3Z3G_cjs.prepareAuthorEnrichment(
mastra,
requestContext,
visibleAgents.map((a) => a.authorId)
);
if (!favoritesEnabled) {
const stripped = visibleAgents.map(chunk73MURMD2_cjs.stripFavoriteFields);
const withAuthors2 = authors ? stripped.map((record) => chunkM3UP3Z3G_cjs.attachAuthor(record, authors)) : stripped;
return { ...result, agents: withAuthors2 };
}
const enrichment = await chunk73MURMD2_cjs.prepareFavoritesEnrichment(
mastra,
requestContext,
"agent",
visibleAgents.map((a) => a.id)
);
const annotated = enrichment ? visibleAgents.map((record) => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) })) : visibleAgents.map(chunk73MURMD2_cjs.stripFavoriteFields);
const withAuthors = authors ? annotated.map((record) => chunkM3UP3Z3G_cjs.attachAuthor(record, authors)) : annotated;
return { ...result, agents: withAuthors };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error listing stored agents");
}
}
});
async function buildStoredAgentExport({
mastra,
requestContext,
storedAgentId,
body
}) {
const storage = mastra.getStorage();
const agentsStore = storage ? await storage.getStore("agents") : void 0;
const storedAgent = await agentsStore?.getByIdResolved(storedAgentId, { status: "draft" });
if (storedAgent) {
chunkGZ4HWZWE_cjs.assertStoredResourceScope(storedAgent, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: storedAgent });
}
let codeAgent;
try {
codeAgent = mastra.getAgentById?.(storedAgentId);
} catch {
codeAgent = void 0;
}
if (!storedAgent && !codeAgent) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Agent with id ${storedAgentId} not found` });
}
const config = buildExportConfig(body, codeAgent);
const content = `${JSON.stringify(config, null, 2)}
`;
return {
agentId: storedAgentId,
fileName: agentExportFilename(storedAgentId),
content,
config
};
}
var EXPORT_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/agents/:storedAgentId/export",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
bodySchema: chunkTIWGWGIO_cjs.exportStoredAgentBodySchema,
responseSchema: chunkTIWGWGIO_cjs.exportStoredAgentResponseSchema,
summary: "Export stored agent override JSON",
description: "Returns deterministic JSON for an agent configuration or code-agent override without mutating storage",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, ...body }) => {
try {
return await buildStoredAgentExport({ mastra, requestContext, storedAgentId, body });
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error exporting stored agent");
}
}
});
var OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/agents/:storedAgentId/change-request",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
bodySchema: chunkTIWGWGIO_cjs.openStoredAgentChangeRequestBodySchema,
responseSchema: chunkTIWGWGIO_cjs.openStoredAgentChangeRequestResponseSchema,
summary: "Open stored agent source change request",
description: "Opens a source-provider change request for deterministic agent override JSON without mutating storage",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, ...body }) => {
try {
const provider = mastra.getEditor?.()?.getSourceControlProvider?.();
if (!provider?.openChangeRequest) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Source control provider cannot open change requests" });
}
const openChangeRequest = provider.openChangeRequest.bind(provider);
const { changeMessage, userName, inspectOnly, ...exportBody } = body;
const headRef = sourceChangeRequestHeadRef(storedAgentId);
const title = `Update ${storedAgentId} agent override`;
const result = inspectOnly ? await openChangeRequest({
title,
headRef,
files: []
}) : await (async () => {
const response = await buildStoredAgentExport({ mastra, requestContext, storedAgentId, body: exportBody });
const message = sourceChangeRequestMessage(storedAgentId, userName, changeMessage);
return openChangeRequest({
title,
body: `Updates ${response.fileName} from Mastra Studio.`,
headRef,
files: [
{
path: response.fileName,
content: response.content,
message
}
]
});
})();
const storage = mastra.getStorage();
const agentsStore = storage ? await storage.getStore("agents") : void 0;
await agentsStore?.useProviderRef?.(storedAgentId, result.ref ?? headRef);
mastra.getEditor?.()?.agent?.clearCache?.(storedAgentId);
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error opening stored agent change request");
}
}
});
var GET_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
queryParamSchema: chunkDIG2K5CV_cjs.statusQuerySchema,
responseSchema: chunkTIWGWGIO_cjs.getStoredAgentResponseSchema,
summary: "Get stored agent by ID",
description: "Returns a specific agent from storage by its unique identifier. Use ?status=draft to resolve with the latest (draft) version, or ?status=published (default) for the active published version.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, status }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const agent = await agentsStore.getByIdResolved(storedAgentId, { status });
if (!agent) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(agent, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const authors = await chunkM3UP3Z3G_cjs.prepareAuthorEnrichment(mastra, requestContext, [agent.authorId]);
const withFavorite = await chunk73MURMD2_cjs.enrichOrStripFavorites(mastra, requestContext, "agent", agent);
return chunkM3UP3Z3G_cjs.attachAuthor(withFavorite, authors);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting stored agent");
}
}
});
var CREATE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/agents",
responseType: "json",
bodySchema: chunkTIWGWGIO_cjs.createStoredAgentBodySchema,
responseSchema: chunkTIWGWGIO_cjs.createStoredAgentResponseSchema,
summary: "Create stored agent",
description: "Creates a new agent in storage with the provided configuration",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
id: providedId,
metadata,
visibility: bodyVisibility,
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser,
requestContextSchema
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const id = providedId || chunkGZ4HWZWE_cjs.toSlug(name);
if (!id) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "Could not derive agent ID from name. Please provide an explicit id."
});
}
const existing = await agentsStore.getById(id);
if (existing) {
throw new chunk64ITUOXI_cjs.HTTPException(409, { message: `Agent with id ${id} already exists` });
}
const authorId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext) ?? void 0;
const visibility = authorId ? bodyVisibility ?? "private" : "public";
chunkZCX2J552_cjs.validateMetadataAvatarUrl(metadata);
const resolvedBrowser = await resolveBrowserField(browser, mastra);
let createInstructions = instructions;
let createTools = tools;
let createIntegrationTools = integrationTools;
let createMcpClients = mcpClients;
let codeAgentForCreate;
try {
codeAgentForCreate = mastra.getAgentById?.(id);
} catch {
codeAgentForCreate = void 0;
}
if (codeAgentForCreate?.source === "code") {
const ownership = getCodeAgentOwnership(codeAgentForCreate.__getEditorConfig?.());
if (ownership.ownsInstructions) {
assertOwnedInstructionsNotEmpty(createInstructions);
} else {
createInstructions = void 0;
}
if (!ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
createTools = void 0;
createIntegrationTools = void 0;
createMcpClients = void 0;
}
}
const input = {
id,
authorId,
visibility,
metadata: chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(metadata, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext)),
name,
description,
instructions: createInstructions,
model,
tools: createTools,
defaultOptions,
workflows,
agents,
integrationTools: createIntegrationTools,
toolProviders,
mcpClients: createMcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
};
const editor = mastra.getEditor?.();
if (editor) {
await editor.agent.create(input);
} else {
await agentsStore.create({ agent: input });
}
const { versions } = await agentsStore.listVersions({ agentId: id, perPage: 1 });
const initialVersion = versions[0];
if (initialVersion) {
await agentsStore.update({
id,
activeVersionId: initialVersion.id,
status: "published"
});
editor?.agent.clearCache(id);
}
const resolved = await agentsStore.getByIdResolved(id, { status: "published" });
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve created agent" });
}
return chunk73MURMD2_cjs.enrichOrStripFavorites(mastra, requestContext, "agent", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error creating stored agent");
}
}
});
var UPDATE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "PATCH",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
bodySchema: chunkTIWGWGIO_cjs.updateStoredAgentBodySchema,
responseSchema: chunkTIWGWGIO_cjs.updateStoredAgentResponseSchema,
summary: "Update stored agent",
description: "Updates an existing agent in storage with the provided fields",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
storedAgentId,
// Metadata-level fields
authorId,
metadata,
visibility,
// Config fields (snapshot-level)
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser,
requestContextSchema,
// Version metadata
changeMessage
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const existing = await agentsStore.getById(storedAgentId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
const scope = await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext);
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, scope);
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-agents",
resourceId: storedAgentId,
action: "edit",
record: existing
});
chunkZCX2J552_cjs.validateMetadataAvatarUrl(metadata);
const callerAuthorId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext) ?? void 0;
const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? "public" : void 0;
const resolvedBrowser = await resolveBrowserField(browser, mastra);
let codeAgentForUpdate;
try {
codeAgentForUpdate = mastra.getAgentById?.(storedAgentId);
} catch {
codeAgentForUpdate = void 0;
}
if (codeAgentForUpdate?.source === "code") {
const ownership = getCodeAgentOwnership(codeAgentForUpdate.__getEditorConfig?.());
if (ownership.ownsInstructions) {
if (instructions !== void 0) {
assertOwnedInstructionsNotEmpty(instructions);
}
} else {
instructions = void 0;
}
if (!ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
tools = void 0;
integrationTools = void 0;
mcpClients = void 0;
}
}
const mergedMetadata = { ...existing.metadata ?? {}, ...metadata ?? {} };
const scopedMetadata = chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(mergedMetadata, scope);
const updatedAgent = await agentsStore.update({
id: storedAgentId,
authorId,
metadata: scopedMetadata,
visibility: resolvedVisibility,
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
});
const configFields = {
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
};
const providedConfigFields = Object.fromEntries(Object.entries(configFields).filter(([_, v]) => v !== void 0));
const autoVersionResult = await chunk2XZ2466F_cjs.handleAutoVersioning(
agentsStore,
storedAgentId,
"agentId",
AGENT_SNAPSHOT_CONFIG_FIELDS,
existing,
updatedAgent,
providedConfigFields,
changeMessage ? { changeMessage } : void 0
);
if (!autoVersionResult) {
throw new Error("handleAutoVersioning returned undefined");
}
const isCodeSource = mastra.getEditor?.()?.getSource?.() === "code";
if (isCodeSource && autoVersionResult.versionCreated && !changeMessage) {
const { versions } = await agentsStore.listVersions({ agentId: storedAgentId, perPage: 2 });
const previousVersion = versions[1];
if (previousVersion) {
await agentsStore.deleteVersion(previousVersion.id);
}
}
if (autoVersionResult.versionCreated) {
const { versions } = await agentsStore.listVersions({ agentId: storedAgentId, perPage: 1 });
const latestVersion = versions[0];
if (latestVersion) {
await agentsStore.update({
id: storedAgentId,
activeVersionId: latestVersion.id
});
}
}
const editor = mastra.getEditor();
if (editor) {
editor.agent.clearCache(storedAgentId);
}
const resolved = await agentsStore.getByIdResolved(storedAgentId, { status: "draft" });
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve updated agent" });
}
return chunk73MURMD2_cjs.enrichOrStripFavorites(mastra, requestContext, "agent", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error updating stored agent");
}
}
});
var DELETE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
responseSchema: chunkTIWGWGIO_cjs.deleteStoredAgentResponseSchema,
summary: "Delete stored agent",
description: "Deletes an agent from storage by its unique identifier",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const existing = await agentsStore.getById(storedAgentId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-agents",
resourceId: storedAgentId,
action: "delete",
record: existing
});
await agentsStore.delete(storedAgentId);
try {
const favoritesStore = await storage.getStore("favorites");
await favoritesStore?.deleteFavoritesForEntity({ entityType: "agent", entityId: storedAgentId });
} catch (cascadeError) {
mastra.getLogger?.()?.warn?.("Failed to cascade-delete favorites for agent", { storedAgentId, error: cascadeError });
}
mastra.getEditor()?.agent.clearCache(storedAgentId);
return { success: true, message: `Agent ${storedAgentId} deleted successfully` };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error deleting stored agent");
}
}
});
var GET_STORED_AGENT_DEPENDENTS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/agents/:storedAgentId/dependents",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
responseSchema: chunkTIWGWGIO_cjs.getStoredAgentDependentsResponseSchema,
summary: "List dependents of a stored agent",
description: "Returns agents that reference the target as a sub-agent. Used to warn before deleting or unsharing. Caller-readable references appear in `dependents` (id + name); cross-workspace references the caller cannot read are aggregated in `hiddenCount` and only surfaced when the target is public.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const target = await agentsStore.getById(storedAgentId);
if (!target) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(target, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: target });
const filter = chunkKGUHJRHZ_cjs.resolveAuthorFilter({ requestContext, resource: "stored-agents" });
const all = await agentsStore.listResolved({
perPage: false,
status: "published"
});
const targetIsPublic = target.visibility === "public";
const dependents = [];
let hiddenCount = 0;
for (const record of all.agents) {
if (record.id === storedAgentId) continue;
if (!referencesTarget(record.agents, storedAgentId)) continue;
if (chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter)) {
dependents.push({
id: record.id,
name: record.name ?? record.id
});
} else if (targetIsPublic) {
hiddenCount += 1;
}
}
return { dependents, hiddenCount };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error listing stored agent dependents");
}
}
});
function referencesTarget(subAgents, targetId) {
if (!subAgents) return false;
if (Array.isArray(subAgents)) {
return subAgents.some((variant) => {
const value = variant?.value;
return Boolean(value && typeof value === "object" && Object.prototype.hasOwnProperty.call(value, targetId));
});
}
if (typeof subAgents === "object") {
return Object.prototype.hasOwnProperty.call(subAgents, targetId);
}
return false;
}
var PREVIEW_INSTRUCTIONS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/agents/preview-instructions",
responseType: "json",
bodySchema: chunkTIWGWGIO_cjs.previewInstructionsBodySchema,
responseSchema: chunkTIWGWGIO_cjs.previewInstructionsResponseSchema,
summary: "Preview resolved instructions",
description: "Resolves an array of instruction blocks against a request context, evaluating rules, fetching prompt block references, and rendering template variables. Returns the final concatenated instruction string.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, blocks, context }) => {
try {
const editor = mastra.getEditor();
if (!editor) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Editor is not configured" });
}
const result = await editor.prompt.preview(blocks, context ?? {});
return { result };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error previewing instructions");
}
}
});
exports.CREATE_STORED_AGENT_ROUTE = CREATE_STORED_AGENT_ROUTE;
exports.DELETE_STORED_AGENT_ROUTE = DELETE_STORED_AGENT_ROUTE;
exports.EXPORT_STORED_AGENT_ROUTE = EXPORT_STORED_AGENT_ROUTE;
exports.GET_STORED_AGENT_DEPENDENTS_ROUTE = GET_STORED_AGENT_DEPENDENTS_ROUTE;
exports.GET_STORED_AGENT_ROUTE = GET_STORED_AGENT_ROUTE;
exports.LIST_STORED_AGENTS_ROUTE = LIST_STORED_AGENTS_ROUTE;
exports.OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE = OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE;
exports.PREVIEW_INSTRUCTIONS_ROUTE = PREVIEW_INSTRUCTIONS_ROUTE;
exports.UPDATE_STORED_AGENT_ROUTE = UPDATE_STORED_AGENT_ROUTE;
//# sourceMappingURL=chunk-UD7JBYUI.cjs.map
//# sourceMappingURL=chunk-UD7JBYUI.cjs.map

Sorry, the diff of this file is too big to display

'use strict';
var chunk7DKSWNOM_cjs = require('./chunk-7DKSWNOM.cjs');
var chunkQQCQV7ZF_cjs = require('./chunk-QQCQV7ZF.cjs');
var chunkRVD3DGBZ_cjs = require('./chunk-RVD3DGBZ.cjs');
var chunkDIG2K5CV_cjs = require('./chunk-DIG2K5CV.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk3YQ7NWF6_cjs = require('./chunk-3YQ7NWF6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
var tools = require('@mastra/core/tools');
// src/server/handlers/tools.ts
var tools_exports = {};
chunkO7I5CWRX_cjs.__export(tools_exports, {
EXECUTE_AGENT_TOOL_ROUTE: () => EXECUTE_AGENT_TOOL_ROUTE,
EXECUTE_TOOL_ROUTE: () => EXECUTE_TOOL_ROUTE,
GET_AGENT_TOOL_ROUTE: () => GET_AGENT_TOOL_ROUTE,
GET_TOOL_BY_ID_ROUTE: () => GET_TOOL_BY_ID_ROUTE,
LIST_TOOLS_ROUTE: () => LIST_TOOLS_ROUTE
});
function resolveLazySchema(schema) {
if (typeof schema === "function" && !("~standard" in schema)) {
return resolveLazySchema(schema());
}
return schema;
}
function schemaToJsonSchema(schema) {
if (!schema) {
return void 0;
}
return chunk3YQ7NWF6_cjs.standardSchemaToJSONSchema(chunk3YQ7NWF6_cjs.toStandardSchema5(schema), { target: "draft-2020-12" });
}
function serializeSchema(schema) {
const jsonSchema = schemaToJsonSchema(resolveLazySchema(schema));
if (jsonSchema === void 0) return void 0;
return chunkGZ4HWZWE_cjs.stringify(jsonSchema);
}
async function findToolInAgents(mastra, toolId, requestContext) {
const agents = mastra.listAgents() || {};
for (const agent of Object.values(agents)) {
try {
const agentTools = await agent.listTools({ requestContext });
const found = Object.values(agentTools || {}).find((t) => t.id === toolId);
if (found) return found;
} catch (error) {
mastra.getLogger?.()?.warn?.("Failed to list tools for agent while resolving tool by id", {
agentId: agent?.id,
toolId,
error: error instanceof Error ? error.message : String(error)
});
}
}
return void 0;
}
function serializeTool(tool) {
if (tools.isProviderDefinedTool(tool)) {
const resolvedInput = resolveLazySchema(tool.inputSchema);
const resolvedOutput = resolveLazySchema(tool.outputSchema);
return {
...tool,
inputSchema: resolvedInput && typeof resolvedInput === "object" && "jsonSchema" in resolvedInput ? chunkGZ4HWZWE_cjs.stringify(resolvedInput.jsonSchema) : void 0,
outputSchema: resolvedOutput && typeof resolvedOutput === "object" && "jsonSchema" in resolvedOutput ? chunkGZ4HWZWE_cjs.stringify(resolvedOutput.jsonSchema) : void 0
};
}
return {
...tool,
inputSchema: serializeSchema(tool.inputSchema),
outputSchema: serializeSchema(tool.outputSchema),
requestContextSchema: serializeSchema(tool.requestContextSchema)
};
}
var LIST_TOOLS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/tools",
responseType: "json",
responseSchema: chunkQQCQV7ZF_cjs.listToolsResponseSchema,
summary: "List all tools",
description: "Returns a list of all available tools in the system",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, registeredTools, requestContext }) => {
try {
const registered = registeredTools && Object.keys(registeredTools).length > 0 ? registeredTools : {};
const allTools = {};
const seenToolIds = /* @__PURE__ */ new Map();
for (const [key, tool] of Object.entries(registered)) {
const toolId = typeof tool?.id === "string" ? tool.id : void 0;
if (toolId !== void 0) seenToolIds.set(toolId, key);
allTools[key] = tool;
}
for (const [key, tool] of Object.entries(mastra.listTools() ?? {})) {
const toolId = typeof tool?.id === "string" ? tool.id : void 0;
if (toolId !== void 0 && seenToolIds.has(toolId)) continue;
if (toolId !== void 0) seenToolIds.set(toolId, key);
allTools[key] = tool;
}
const serializedTools = Object.entries(allTools).reduce(
(acc, [id, _tool]) => {
acc[id] = serializeTool(_tool);
return acc;
},
{}
);
const fgaProvider = mastra.getServer?.()?.fga;
const user = requestContext?.get("user");
if (fgaProvider && user) {
const toolList = Object.entries(serializedTools).map(([id, t]) => ({ id, ...t }));
const accessible = await fgaProvider.filterAccessible(user, toolList, "tool", chunkRVD3DGBZ_cjs.MastraFGAPermissions.TOOLS_READ);
const accessibleSet = new Set(accessible.map((t) => t.id));
for (const id of Object.keys(serializedTools)) {
if (!accessibleSet.has(id)) {
delete serializedTools[id];
}
}
}
return serializedTools;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting tools");
}
}
});
var GET_TOOL_BY_ID_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/tools/:toolId",
responseType: "json",
pathParamSchema: chunkQQCQV7ZF_cjs.toolIdPathParams,
responseSchema: chunkQQCQV7ZF_cjs.serializedToolSchema,
summary: "Get tool by ID",
description: "Returns details for a specific tool including its schema and configuration",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, registeredTools, toolId, requestContext }) => {
try {
let tool;
if (registeredTools && Object.keys(registeredTools).length > 0) {
tool = Object.values(registeredTools).find((t) => t.id === toolId);
}
if (!tool) {
try {
tool = mastra.getToolById(toolId);
} catch {
}
}
if (!tool) {
tool = await findToolInAgents(mastra, toolId, requestContext);
}
if (!tool) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Tool not found" });
}
return serializeTool(tool);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting tool");
}
}
});
var EXECUTE_TOOL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/tools/:toolId/execute",
responseType: "json",
pathParamSchema: chunkQQCQV7ZF_cjs.toolIdPathParams,
queryParamSchema: chunkDIG2K5CV_cjs.optionalRunIdSchema,
bodySchema: chunkQQCQV7ZF_cjs.executeToolContextBodySchema,
responseSchema: chunkQQCQV7ZF_cjs.executeToolResponseSchema,
summary: "Execute tool",
description: "Executes a specific tool with the provided input data",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, runId, toolId, registeredTools, requestContext, ...bodyParams }) => {
try {
if (!toolId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Tool ID is required" });
}
let tool;
if (registeredTools && Object.keys(registeredTools).length > 0) {
tool = Object.values(registeredTools).find((t) => t.id === toolId);
}
if (!tool) {
try {
tool = mastra.getToolById(toolId);
} catch {
}
}
if (!tool) {
tool = await findToolInAgents(mastra, toolId, requestContext);
}
if (!tool) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Tool not found" });
}
if (!tool?.execute) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Tool is not executable" });
}
const { data } = bodyParams;
chunkRVD3DGBZ_cjs.validateBody({ data });
let result;
if (tools.isVercelTool(tool)) {
result = await tool.execute(data);
} else {
result = await tool.execute(data, {
mastra,
requestContext,
// TODO: Pass proper tracing context when server API supports tracing
tracingContext: { currentSpan: void 0 },
...runId ? {
workflow: {
runId,
suspend: async () => {
}
}
} : {}
});
}
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error executing tool");
}
}
});
var GET_AGENT_TOOL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/agents/:agentId/tools/:toolId",
responseType: "json",
pathParamSchema: chunkQQCQV7ZF_cjs.agentToolPathParams,
responseSchema: chunkQQCQV7ZF_cjs.serializedToolSchema,
summary: "Get agent tool",
description: "Returns details for a specific tool assigned to the agent",
tags: ["Agents", "Tools"],
requiresAuth: true,
handler: async ({ mastra, agentId, toolId, requestContext }) => {
try {
if (!agentId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Agent ID is required" });
}
const agent = await chunk7DKSWNOM_cjs.getAgentFromSystem({ mastra, agentId });
const agentTools = await agent.listTools({ requestContext });
const tool = Object.values(agentTools || {}).find((tool2) => tool2.id === toolId);
if (!tool) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Tool not found" });
}
return serializeTool(tool);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting agent tool");
}
}
});
var EXECUTE_AGENT_TOOL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/agents/:agentId/tools/:toolId/execute",
responseType: "json",
pathParamSchema: chunkQQCQV7ZF_cjs.agentToolPathParams,
bodySchema: chunkQQCQV7ZF_cjs.executeToolBodySchema,
responseSchema: chunkQQCQV7ZF_cjs.executeToolResponseSchema,
summary: "Execute agent tool",
description: "Executes a specific tool assigned to the agent with the provided input data",
tags: ["Agents", "Tools"],
requiresAuth: true,
handler: async ({ mastra, agentId, toolId, data, requestContext }) => {
try {
if (!agentId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Agent ID is required" });
}
const agent = await chunk7DKSWNOM_cjs.getAgentFromSystem({ mastra, agentId });
const agentTools = await agent.listTools({ requestContext });
const tool = Object.values(agentTools || {}).find((tool2) => tool2.id === toolId);
if (!tool) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Tool not found" });
}
if (!tool?.execute) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Tool is not executable" });
}
const result = await tool.execute(data, {
mastra,
requestContext,
// TODO: Pass proper tracing context when server API supports tracing
tracingContext: { currentSpan: void 0 }
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error executing agent tool");
}
}
});
exports.EXECUTE_AGENT_TOOL_ROUTE = EXECUTE_AGENT_TOOL_ROUTE;
exports.EXECUTE_TOOL_ROUTE = EXECUTE_TOOL_ROUTE;
exports.GET_AGENT_TOOL_ROUTE = GET_AGENT_TOOL_ROUTE;
exports.GET_TOOL_BY_ID_ROUTE = GET_TOOL_BY_ID_ROUTE;
exports.LIST_TOOLS_ROUTE = LIST_TOOLS_ROUTE;
exports.tools_exports = tools_exports;
//# sourceMappingURL=chunk-UITLSJUW.cjs.map
//# sourceMappingURL=chunk-UITLSJUW.cjs.map
{"version":3,"sources":["../src/server/handlers/tools.ts"],"names":["__export","standardSchemaToJSONSchema","toStandardSchema5","stringify","isProviderDefinedTool","createRoute","listToolsResponseSchema","MastraFGAPermissions","handleError","toolIdPathParams","serializedToolSchema","HTTPException","optionalRunIdSchema","executeToolContextBodySchema","executeToolResponseSchema","validateBody","isVercelTool","agentToolPathParams","getAgentFromSystem","tool","executeToolBodySchema"],"mappings":"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","file":"chunk-UITLSJUW.cjs","sourcesContent":["import { isVercelTool, isProviderDefinedTool } from '@mastra/core/tools';\nimport { toStandardSchema, standardSchemaToJSONSchema } from '@mastra/schema-compat/schema';\nimport type { PublicSchema } from '@mastra/schema-compat/schema';\nimport { stringify } from 'superjson';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n executeToolContextBodySchema,\n executeToolResponseSchema,\n listToolsResponseSchema,\n serializedToolSchema,\n toolIdPathParams,\n agentToolPathParams,\n executeToolBodySchema,\n} from '../schemas/agents';\nimport { optionalRunIdSchema } from '../schemas/common';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { validateBody } from './utils';\n\n/**\n * Resolves a schema that may be a lazy function (e.g. AI SDK provider tools).\n * Recursively resolves until a non-function value is returned.\n * Skips functions that are themselves valid schemas (e.g. ArkType types are\n * callable but also implement StandardSchema via ~standard).\n */\nfunction resolveLazySchema(schema: unknown): unknown {\n if (typeof schema === 'function' && !('~standard' in schema)) {\n return resolveLazySchema(schema());\n }\n return schema;\n}\n\nfunction schemaToJsonSchema(schema: PublicSchema<unknown> | undefined) {\n if (!schema) {\n return undefined;\n }\n\n return standardSchemaToJSONSchema(toStandardSchema(schema), { target: 'draft-2020-12' });\n}\n\nfunction serializeSchema(schema: unknown): string | undefined {\n const jsonSchema = schemaToJsonSchema(resolveLazySchema(schema) as PublicSchema<unknown> | undefined);\n if (jsonSchema === undefined) return undefined;\n return stringify(jsonSchema);\n}\n\n/**\n * Searches dynamically-resolved agent tools (provided via `toolsResolver` /\n * function-based `tools`) for a tool with the given id. Used as a fallback\n * after the static tool registry (`registeredTools` + `mastra.getToolById`)\n * misses, so global tool routes can resolve tools that only exist on agents.\n *\n * Errors thrown by an individual agent's `listTools()` are logged and\n * skipped so a single broken resolver doesn't take down the whole lookup.\n */\nasync function findToolInAgents(mastra: any, toolId: string, requestContext: any): Promise<any | undefined> {\n const agents = mastra.listAgents() || {};\n for (const agent of Object.values(agents) as any[]) {\n try {\n const agentTools = await agent.listTools({ requestContext });\n const found = Object.values(agentTools || {}).find((t: any) => t.id === toolId);\n if (found) return found;\n } catch (error) {\n mastra.getLogger?.()?.warn?.('Failed to list tools for agent while resolving tool by id', {\n agentId: agent?.id,\n toolId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return undefined;\n}\n\n/**\n * Serializes a tool for API responses, handling both regular tools (with Zod schemas)\n * and provider-defined tools (with AI SDK lazy schemas).\n */\nfunction serializeTool(tool: any): any {\n // Provider-defined tools (e.g. google.tools.googleSearch(), openai.tools.webSearch())\n // have lazy inputSchema functions that return AI SDK Schema objects, not Zod schemas.\n // We resolve them and use the jsonSchema property directly.\n if (isProviderDefinedTool(tool)) {\n const resolvedInput = resolveLazySchema(tool.inputSchema);\n const resolvedOutput = resolveLazySchema(tool.outputSchema);\n return {\n ...tool,\n inputSchema:\n resolvedInput && typeof resolvedInput === 'object' && 'jsonSchema' in resolvedInput\n ? stringify(resolvedInput.jsonSchema)\n : undefined,\n outputSchema:\n resolvedOutput && typeof resolvedOutput === 'object' && 'jsonSchema' in resolvedOutput\n ? stringify(resolvedOutput.jsonSchema)\n : undefined,\n };\n }\n\n return {\n ...tool,\n inputSchema: serializeSchema(tool.inputSchema),\n outputSchema: serializeSchema(tool.outputSchema),\n requestContextSchema: serializeSchema(tool.requestContextSchema),\n };\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport const LIST_TOOLS_ROUTE = createRoute({\n method: 'GET',\n path: '/tools',\n responseType: 'json',\n responseSchema: listToolsResponseSchema,\n summary: 'List all tools',\n description: 'Returns a list of all available tools in the system',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, registeredTools, requestContext }) => {\n try {\n // Merge tools from two sources: mastra.listTools() includes dynamically created tools\n // (e.g. MCP tools, or agent tools registered by their intrinsic id), while registeredTools\n // includes tools discovered by the CLI bundler (keyed by export name).\n //\n // The same tool instance can appear in both maps under different keys (e.g. an agent\n // registers it by `tool.id` while the bundler registers it by export name). Dedupe by\n // `tool.id`, preferring the registeredTools (bundler) key, so each tool appears once.\n const registered = registeredTools && Object.keys(registeredTools).length > 0 ? registeredTools : {};\n\n const allTools: Record<string, any> = {};\n const seenToolIds = new Map<string, string>();\n\n // registeredTools first so their key wins for a given tool.id.\n for (const [key, tool] of Object.entries(registered)) {\n const toolId = typeof (tool as any)?.id === 'string' ? (tool as any).id : undefined;\n if (toolId !== undefined) seenToolIds.set(toolId, key);\n allTools[key] = tool;\n }\n\n for (const [key, tool] of Object.entries(mastra.listTools() ?? {})) {\n const toolId = typeof (tool as any)?.id === 'string' ? (tool as any).id : undefined;\n // Skip if this exact tool.id was already registered (under any key) by registeredTools.\n if (toolId !== undefined && seenToolIds.has(toolId)) continue;\n if (toolId !== undefined) seenToolIds.set(toolId, key);\n allTools[key] = tool;\n }\n\n const serializedTools = Object.entries(allTools).reduce(\n (acc, [id, _tool]) => {\n acc[id] = serializeTool(_tool);\n return acc;\n },\n {} as Record<string, any>,\n );\n\n // Filter tools by FGA if configured\n const fgaProvider = mastra.getServer?.()?.fga;\n const user = requestContext?.get('user');\n if (fgaProvider && user) {\n const toolList = Object.entries(serializedTools).map(([id, t]) => ({ id, ...t }));\n const accessible = await fgaProvider.filterAccessible(user, toolList, 'tool', MastraFGAPermissions.TOOLS_READ);\n const accessibleSet = new Set(accessible.map((t: any) => t.id));\n for (const id of Object.keys(serializedTools)) {\n if (!accessibleSet.has(id)) {\n delete serializedTools[id];\n }\n }\n }\n\n return serializedTools;\n } catch (error) {\n return handleError(error, 'Error getting tools');\n }\n },\n});\n\nexport const GET_TOOL_BY_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/tools/:toolId',\n responseType: 'json',\n pathParamSchema: toolIdPathParams,\n responseSchema: serializedToolSchema,\n summary: 'Get tool by ID',\n description: 'Returns details for a specific tool including its schema and configuration',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, registeredTools, toolId, requestContext }) => {\n try {\n let tool: any;\n\n // Try explicit registeredTools first, then fallback to mastra\n if (registeredTools && Object.keys(registeredTools).length > 0) {\n tool = Object.values(registeredTools).find((t: any) => t.id === toolId);\n }\n if (!tool) {\n try {\n tool = mastra.getToolById(toolId);\n } catch {\n // tool not found in global registry, continue to agent fallback\n }\n }\n\n // Fallback: search dynamically-resolved agent tools (toolsResolver)\n if (!tool) {\n tool = await findToolInAgents(mastra, toolId, requestContext);\n }\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n return serializeTool(tool);\n } catch (error) {\n return handleError(error, 'Error getting tool');\n }\n },\n});\n\nexport const EXECUTE_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: toolIdPathParams,\n queryParamSchema: optionalRunIdSchema,\n bodySchema: executeToolContextBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute tool',\n description: 'Executes a specific tool with the provided input data',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, runId, toolId, registeredTools, requestContext, ...bodyParams }) => {\n try {\n if (!toolId) {\n throw new HTTPException(400, { message: 'Tool ID is required' });\n }\n\n let tool: any;\n\n // Try explicit registeredTools first, then fallback to mastra\n if (registeredTools && Object.keys(registeredTools).length > 0) {\n tool = Object.values(registeredTools).find((t: any) => t.id === toolId);\n }\n if (!tool) {\n try {\n tool = mastra.getToolById(toolId);\n } catch {\n // tool not found in global registry, continue to agent fallback\n }\n }\n\n // Fallback: search dynamically-resolved agent tools (toolsResolver)\n if (!tool) {\n tool = await findToolInAgents(mastra, toolId, requestContext);\n }\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n if (!tool?.execute) {\n throw new HTTPException(400, { message: 'Tool is not executable' });\n }\n\n const { data } = bodyParams;\n\n validateBody({ data });\n\n let result;\n if (isVercelTool(tool)) {\n result = await (tool as any).execute(data);\n } else {\n result = await tool.execute(data!, {\n mastra,\n requestContext,\n // TODO: Pass proper tracing context when server API supports tracing\n tracingContext: { currentSpan: undefined },\n ...(runId\n ? {\n workflow: {\n runId,\n suspend: async () => {},\n },\n }\n : {}),\n });\n }\n\n return result;\n } catch (error) {\n return handleError(error, 'Error executing tool');\n }\n },\n});\n\n// ============================================================================\n// Agent Tool Routes\n// ============================================================================\n\nexport const GET_AGENT_TOOL_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/tools/:toolId',\n responseType: 'json',\n pathParamSchema: agentToolPathParams,\n responseSchema: serializedToolSchema,\n summary: 'Get agent tool',\n description: 'Returns details for a specific tool assigned to the agent',\n tags: ['Agents', 'Tools'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, toolId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const agentTools = await agent.listTools({ requestContext });\n\n const tool = Object.values(agentTools || {}).find((tool: any) => tool.id === toolId) as any;\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n return serializeTool(tool);\n } catch (error) {\n return handleError(error, 'Error getting agent tool');\n }\n },\n});\n\nexport const EXECUTE_AGENT_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: agentToolPathParams,\n bodySchema: executeToolBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute agent tool',\n description: 'Executes a specific tool assigned to the agent with the provided input data',\n tags: ['Agents', 'Tools'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, toolId, data, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const agentTools = await agent.listTools({ requestContext });\n\n const tool = Object.values(agentTools || {}).find((tool: any) => tool.id === toolId) as any;\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n if (!tool?.execute) {\n throw new HTTPException(400, { message: 'Tool is not executable' });\n }\n\n const result = await tool.execute(data, {\n mastra,\n requestContext,\n // TODO: Pass proper tracing context when server API supports tracing\n tracingContext: { currentSpan: undefined },\n });\n\n return result;\n } catch (error) {\n return handleError(error, 'Error executing agent tool');\n }\n },\n});\n"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

'use strict';
var chunkT3C54LPX_cjs = require('./chunk-T3C54LPX.cjs');
var chunk73MURMD2_cjs = require('./chunk-73MURMD2.cjs');
var chunkS2HKHYJ3_cjs = require('./chunk-S2HKHYJ3.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var workspace = require('@mastra/core/workspace');
var INDEXED_FOLDERS = ["references", "scripts", "assets"];
function extractIndexedPathsFromFiles(files, existing) {
if (!files || files.length === 0) return {};
const root = files.find((n) => n.type === "folder");
if (!root?.children) return {};
const result = {};
for (const folderName of INDEXED_FOLDERS) {
const folder = root.children.find((n) => n.type === "folder" && n.name === folderName);
if (!folder?.children || folder.children.length === 0) continue;
const existingPaths = new Set(existing[folderName] ?? []);
const paths = [...existingPaths];
collectFilePaths(folder.children, folderName, existingPaths, paths);
if (paths.length > 0) {
result[folderName] = paths;
}
}
return result;
}
function collectFilePaths(nodes, prefix, existingPaths, out) {
for (const node of nodes) {
if (node.type === "file") {
const relativePath = `${prefix}/${node.name}`;
if (!existingPaths.has(relativePath)) {
out.push(relativePath);
}
} else if (node.type === "folder" && node.children) {
collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);
}
}
}
var LIST_STORED_SKILLS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/skills",
responseType: "json",
queryParamSchema: chunkT3C54LPX_cjs.listStoredSkillsQuerySchema,
responseSchema: chunkT3C54LPX_cjs.listStoredSkillsResponseSchema,
summary: "List stored skills",
description: "Returns a paginated list of all skill configurations stored in the database",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
page,
perPage,
orderBy,
status,
authorId,
visibility,
metadata,
favoritedOnly,
pinFavoritedFor
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const filter = chunkKGUHJRHZ_cjs.resolveAuthorFilter({
requestContext,
resource: "stored-skills",
queryAuthorId: authorId,
queryVisibility: visibility
});
const scope = await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext);
const scopedMetadata = chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(metadata, scope);
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
const favoritesEnabled = await chunkS2HKHYJ3_cjs.isBuilderFeatureEnabled(mastra, "favorites");
const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;
const favoriteSubjectId = pinFavoritedFor ?? callerId;
if (honoredStarredOnly) {
const effectivePerPage = perPage ?? 100;
if (!favoriteSubjectId) {
return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Favorites storage domain is not available" });
}
const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: "skill" });
if (starredIds.length === 0) {
return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const allMatching = await skillStore.listResolved({
perPage: false,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata,
entityIds: starredIds
});
const visible = allMatching.skills.filter((record) => chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter));
const total = visible.length;
const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;
const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;
const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);
const annotated2 = sliced.map((record) => ({ ...record, isFavorited: true }));
const hasMore = effectivePerPage > 0 && endIdx < total;
return {
skills: annotated2,
total,
page,
perPage: effectivePerPage,
hasMore
};
}
const result = await skillStore.listResolved({
page,
perPage,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata
});
const visibleSkills = result.skills.filter((record) => chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter));
if (!favoritesEnabled) {
return { ...result, skills: visibleSkills.map(chunk73MURMD2_cjs.stripFavoriteFields) };
}
const enrichment = await chunk73MURMD2_cjs.prepareFavoritesEnrichment(
mastra,
requestContext,
"skill",
visibleSkills.map((s) => s.id)
);
const annotated = enrichment ? visibleSkills.map((record) => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) })) : visibleSkills.map(chunk73MURMD2_cjs.stripFavoriteFields);
return { ...result, skills: annotated };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error listing stored skills");
}
}
});
var GET_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
responseSchema: chunkT3C54LPX_cjs.getStoredSkillResponseSchema,
summary: "Get stored skill by ID",
description: "Returns a specific skill from storage by its unique identifier (resolved with active version config)",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(skill, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
return chunk73MURMD2_cjs.enrichOrStripFavorites(mastra, requestContext, "skill", skill);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting stored skill");
}
}
});
var CREATE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/skills",
responseType: "json",
bodySchema: chunkT3C54LPX_cjs.createStoredSkillBodySchema,
responseSchema: chunkT3C54LPX_cjs.createStoredSkillResponseSchema,
summary: "Create stored skill",
description: "Creates a new skill configuration in storage with the provided details",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
id: providedId,
name,
description,
instructions,
license,
compatibility,
source,
references,
scripts,
assets,
files,
metadata,
visibility: bodyVisibility
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const id = providedId || chunkGZ4HWZWE_cjs.toSlug(name);
if (!id) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "Could not derive skill ID from name. Please provide an explicit id."
});
}
const existing = await skillStore.getById(id);
if (existing) {
throw new chunk64ITUOXI_cjs.HTTPException(409, { message: `Skill with id ${id} already exists` });
}
const authorId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext) ?? void 0;
const visibility = authorId ? bodyVisibility ?? "private" : "public";
const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });
await skillStore.create({
skill: {
id,
authorId,
visibility,
name,
description,
instructions,
license,
compatibility,
source,
references: indexedPaths.references ?? references,
scripts: indexedPaths.scripts ?? scripts,
assets: indexedPaths.assets ?? assets,
files,
metadata: chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(metadata, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext))
}
});
const resolved = await skillStore.getByIdResolved(id);
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve created skill" });
}
return chunk73MURMD2_cjs.enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error creating stored skill");
}
}
});
var UPDATE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "PATCH",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
bodySchema: chunkT3C54LPX_cjs.updateStoredSkillBodySchema,
responseSchema: chunkT3C54LPX_cjs.updateStoredSkillResponseSchema,
summary: "Update stored skill",
description: "Updates an existing skill in storage with the provided fields",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
storedSkillId,
// Entity-level fields
authorId,
visibility,
// Config fields (snapshot-level)
name,
description,
instructions,
license,
compatibility,
source,
references,
scripts,
assets,
files,
metadata
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
const scope = await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext);
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, scope);
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "edit",
record: existing
});
const callerAuthorId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext) ?? void 0;
const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? "public" : void 0;
const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};
const update = { id: storedSkillId };
if (authorId !== void 0) update.authorId = authorId;
if (resolvedVisibility !== void 0) update.visibility = resolvedVisibility;
if (name !== void 0) update.name = name;
if (description !== void 0) update.description = description;
if (instructions !== void 0) update.instructions = instructions;
if (license !== void 0) update.license = license;
if (compatibility !== void 0) update.compatibility = compatibility;
if (source !== void 0) update.source = source;
const resolvedReferences = indexedPaths.references ?? references;
const resolvedScripts = indexedPaths.scripts ?? scripts;
const resolvedAssets = indexedPaths.assets ?? assets;
if (resolvedReferences !== void 0) update.references = resolvedReferences;
if (resolvedScripts !== void 0) update.scripts = resolvedScripts;
if (resolvedAssets !== void 0) update.assets = resolvedAssets;
if (files !== void 0) update.files = files;
if (metadata !== void 0) {
update.metadata = chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata({ ...existing.metadata ?? {}, ...metadata }, scope);
}
await skillStore.update(update);
const resolved = await skillStore.getByIdResolved(storedSkillId);
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve updated skill" });
}
return chunk73MURMD2_cjs.enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error updating stored skill");
}
}
});
var DELETE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
responseSchema: chunkT3C54LPX_cjs.deleteStoredSkillResponseSchema,
summary: "Delete stored skill",
description: "Deletes a skill from storage by its unique identifier",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "delete",
record: existing
});
await skillStore.delete(storedSkillId);
try {
const favoritesStore = await storage.getStore("favorites");
await favoritesStore?.deleteFavoritesForEntity({ entityType: "skill", entityId: storedSkillId });
} catch (cascadeError) {
mastra.getLogger?.()?.warn?.("Failed to cascade-delete favorites for skill", { storedSkillId, error: cascadeError });
}
return {
success: true,
message: `Skill ${storedSkillId} deleted successfully`
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error deleting stored skill");
}
}
});
var PUBLISH_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/skills/:storedSkillId/publish",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
bodySchema: chunkT3C54LPX_cjs.publishStoredSkillBodySchema,
responseSchema: chunkT3C54LPX_cjs.publishStoredSkillResponseSchema,
summary: "Publish stored skill",
description: "Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const blobStore = await storage.getStore("blobs");
if (!blobStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Blob storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "edit",
record: existing
});
const path = await import('path');
const fs = await import('fs/promises');
const resolvedPath = path.default.resolve(skillPath);
const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());
if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: `skillPath must be within the allowed directory: ${allowedBase}`
});
}
try {
const stat = await fs.stat(resolvedPath);
if (!stat.isDirectory()) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });
}
} catch (err) {
if (err instanceof chunk64ITUOXI_cjs.HTTPException) throw err;
if (err?.code === "ENOENT") {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`
});
}
throw err;
}
try {
await fs.stat(path.default.join(resolvedPath, "SKILL.md"));
} catch (err) {
if (err?.code === "ENOENT") {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: `skillPath is missing SKILL.md: ${resolvedPath}`
});
}
throw err;
}
const source = new workspace.LocalSkillSource();
const { publishSkillFromSource } = await import('@mastra/core/workspace');
const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);
const snapshotUpdate = {};
for (const [key, value] of Object.entries(snapshot)) {
if (value !== void 0) snapshotUpdate[key] = value;
}
await skillStore.update({
id: storedSkillId,
...snapshotUpdate,
tree,
files,
status: "published"
});
const latestVersion = await skillStore.getLatestVersion(storedSkillId);
if (latestVersion) {
await skillStore.update({
id: storedSkillId,
activeVersionId: latestVersion.id
});
}
const resolved = await skillStore.getByIdResolved(storedSkillId);
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve skill after publish" });
}
return chunk73MURMD2_cjs.enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error publishing stored skill");
}
}
});
exports.CREATE_STORED_SKILL_ROUTE = CREATE_STORED_SKILL_ROUTE;
exports.DELETE_STORED_SKILL_ROUTE = DELETE_STORED_SKILL_ROUTE;
exports.GET_STORED_SKILL_ROUTE = GET_STORED_SKILL_ROUTE;
exports.LIST_STORED_SKILLS_ROUTE = LIST_STORED_SKILLS_ROUTE;
exports.PUBLISH_STORED_SKILL_ROUTE = PUBLISH_STORED_SKILL_ROUTE;
exports.UPDATE_STORED_SKILL_ROUTE = UPDATE_STORED_SKILL_ROUTE;
//# sourceMappingURL=chunk-XOQEKMY2.cjs.map
//# sourceMappingURL=chunk-XOQEKMY2.cjs.map
{"version":3,"sources":["../src/server/handlers/stored-skills.ts"],"names":["createRoute","listStoredSkillsQuerySchema","listStoredSkillsResponseSchema","HTTPException","resolveAuthorFilter","getStoredResourceScope","scopeStoredResourceMetadata","getCallerAuthorId","isBuilderFeatureEnabled","matchesAuthorFilter","annotated","stripFavoriteFields","prepareFavoritesEnrichment","handleError","storedSkillIdPathParams","getStoredSkillResponseSchema","assertStoredResourceScope","assertReadAccess","enrichOrStripFavorites","createStoredSkillBodySchema","createStoredSkillResponseSchema","toSlug","updateStoredSkillBodySchema","updateStoredSkillResponseSchema","assertWriteAccess","deleteStoredSkillResponseSchema","publishStoredSkillBodySchema","publishStoredSkillResponseSchema","LocalSkillSource"],"mappings":"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","file":"chunk-XOQEKMY2.cjs","sourcesContent":["import type { StorageSkillFileNode } from '@mastra/core/storage';\nimport { LocalSkillSource } from '@mastra/core/workspace';\n\nimport { HTTPException } from '../http-exception';\nimport {\n storedSkillIdPathParams,\n listStoredSkillsQuerySchema,\n createStoredSkillBodySchema,\n updateStoredSkillBodySchema,\n publishStoredSkillBodySchema,\n listStoredSkillsResponseSchema,\n getStoredSkillResponseSchema,\n createStoredSkillResponseSchema,\n updateStoredSkillResponseSchema,\n deleteStoredSkillResponseSchema,\n publishStoredSkillResponseSchema,\n} from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { toSlug, assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata } from '../utils';\n\nimport {\n assertReadAccess,\n assertWriteAccess,\n getCallerAuthorId,\n matchesAuthorFilter,\n resolveAuthorFilter,\n} from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\nimport { handleError } from './error';\nimport { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from './favorites-enrichment';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Well-known folder names in the skill file tree whose children represent\n * indexable path arrays (references, scripts, assets).\n */\nconst INDEXED_FOLDERS = ['references', 'scripts', 'assets'] as const;\n\n/**\n * Walks the `files` tree and collects relative file paths for each well-known\n * folder (references, scripts, assets). Returned arrays only include entries\n * that are not already present in any explicitly-provided arrays so callers\n * can pass both `files` and `references` without creating duplicates.\n */\nfunction extractIndexedPathsFromFiles(\n files: StorageSkillFileNode[] | undefined,\n existing: {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n },\n): {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n} {\n if (!files || files.length === 0) return {};\n\n // Find the root folder (first folder node, usually id=\"root\")\n const root = files.find(n => n.type === 'folder');\n if (!root?.children) return {};\n\n const result: Record<string, string[]> = {};\n\n for (const folderName of INDEXED_FOLDERS) {\n const folder = root.children.find(n => n.type === 'folder' && n.name === folderName);\n if (!folder?.children || folder.children.length === 0) continue;\n\n const existingPaths = new Set(existing[folderName] ?? []);\n const paths: string[] = [...existingPaths];\n\n collectFilePaths(folder.children, folderName, existingPaths, paths);\n\n if (paths.length > 0) {\n result[folderName] = paths;\n }\n }\n\n return result;\n}\n\n/** Recursively collects file paths from a subtree, building relative paths. */\nfunction collectFilePaths(\n nodes: StorageSkillFileNode[],\n prefix: string,\n existingPaths: Set<string>,\n out: string[],\n): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const relativePath = `${prefix}/${node.name}`;\n if (!existingPaths.has(relativePath)) {\n out.push(relativePath);\n }\n } else if (node.type === 'folder' && node.children) {\n collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);\n }\n }\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/skills - List all stored skills\n */\nexport const LIST_STORED_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills',\n responseType: 'json',\n queryParamSchema: listStoredSkillsQuerySchema,\n responseSchema: listStoredSkillsResponseSchema,\n summary: 'List stored skills',\n description: 'Returns a paginated list of all skill configurations stored in the database',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n page,\n perPage,\n orderBy,\n status,\n authorId,\n visibility,\n metadata,\n favoritedOnly,\n pinFavoritedFor,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const filter = resolveAuthorFilter({\n requestContext,\n resource: 'stored-skills',\n queryAuthorId: authorId,\n queryVisibility: visibility,\n });\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);\n\n const callerId = getCallerAuthorId(requestContext);\n const favoritesEnabled = await isBuilderFeatureEnabled(mastra, 'favorites');\n const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;\n const favoriteSubjectId = pinFavoritedFor ?? callerId;\n\n // `?favoritedOnly=true` flow: fetch caller's favorited IDs, restrict the list\n // to that set, then post-filter by visibility and recompute total/pages.\n if (honoredStarredOnly) {\n const effectivePerPage: number = perPage ?? 100;\n if (!favoriteSubjectId) {\n // Caller cannot have favorited anything without an identity.\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: 'skill' });\n if (starredIds.length === 0) {\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const allMatching = await skillStore.listResolved({\n perPage: false,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n entityIds: starredIds,\n });\n const visible = allMatching.skills.filter(record => matchesAuthorFilter(record, filter));\n const total = visible.length;\n const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;\n const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;\n const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);\n const annotated = sliced.map(record => ({ ...record, isFavorited: true }));\n const hasMore = effectivePerPage > 0 && endIdx < total;\n return {\n skills: annotated,\n total,\n page,\n perPage: effectivePerPage,\n hasMore,\n };\n }\n\n const result = await skillStore.listResolved({\n page,\n perPage,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n });\n\n // Post-filter to enforce ownership + visibility rules across all backends.\n // Storage adapters can only do an equality filter on authorId, so we apply\n // the ownedOrPublic / publicOnly logic here.\n // Note: `result.total` / `result.hasMore` reflect the storage-reported\n // count before this post-filter. For `unrestricted` / `exact` filters\n // nothing is removed; for `ownedOrPublic` / `publicOnly`, downstream UIs\n // should treat the filter as a view over the caller's scope — an\n // approximation is OK and preserves pagination math.\n const visibleSkills = result.skills.filter(record => matchesAuthorFilter(record, filter));\n\n if (!favoritesEnabled) {\n return { ...result, skills: visibleSkills.map(stripFavoriteFields) };\n }\n\n const enrichment = await prepareFavoritesEnrichment(\n mastra,\n requestContext,\n 'skill',\n visibleSkills.map(s => s.id),\n );\n const annotated = enrichment\n ? visibleSkills.map(record => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) }))\n : visibleSkills.map(stripFavoriteFields);\n\n return { ...result, skills: annotated };\n } catch (error) {\n return handleError(error, 'Error listing stored skills');\n }\n },\n});\n\n/**\n * GET /stored/skills/:storedSkillId - Get a stored skill by ID\n */\nexport const GET_STORED_SKILL_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: getStoredSkillResponseSchema,\n summary: 'Get stored skill by ID',\n description: 'Returns a specific skill from storage by its unique identifier (resolved with active version config)',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', skill);\n } catch (error) {\n return handleError(error, 'Error getting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills - Create a new stored skill\n */\nexport const CREATE_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills',\n responseType: 'json',\n bodySchema: createStoredSkillBodySchema,\n responseSchema: createStoredSkillResponseSchema,\n summary: 'Create stored skill',\n description: 'Creates a new skill configuration in storage with the provided details',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n id: providedId,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n visibility: bodyVisibility,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive skill ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if skill with this ID already exists\n const existing = await skillStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Skill with id ${id} already exists` });\n }\n\n // Force authorId from the authenticated caller; ignore any body-provided value.\n // No owner = always public (no auth / no user context).\n // With an owner, respect the client's choice, defaulting to 'private'.\n const authorId = getCallerAuthorId(requestContext) ?? undefined;\n const visibility: 'private' | 'public' = authorId ? (bodyVisibility ?? 'private') : 'public';\n\n // Derive references/scripts/assets path arrays from the files tree\n // so agents can discover them via skill_read even when only `files` is provided.\n const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });\n\n await skillStore.create({\n skill: {\n id,\n authorId,\n visibility,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references: indexedPaths.references ?? references,\n scripts: indexedPaths.scripts ?? scripts,\n assets: indexedPaths.assets ?? assets,\n files,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n },\n });\n\n // Return the resolved skill (thin record + version config)\n const resolved = await skillStore.getByIdResolved(id);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error creating stored skill');\n }\n },\n});\n\n/**\n * PATCH /stored/skills/:storedSkillId - Update a stored skill\n */\nexport const UPDATE_STORED_SKILL_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: updateStoredSkillBodySchema,\n responseSchema: updateStoredSkillResponseSchema,\n summary: 'Update stored skill',\n description: 'Updates an existing skill in storage with the provided fields',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n storedSkillId,\n // Entity-level fields\n authorId,\n visibility,\n // Config fields (snapshot-level)\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // No owner = always public, regardless of what the client sent.\n const callerAuthorId = getCallerAuthorId(requestContext) ?? undefined;\n const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? 'public' : undefined;\n\n // Derive references/scripts/assets path arrays from the files tree\n const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};\n\n // Update the skill with both entity-level and config-level fields.\n // The storage layer handles separating these into record updates vs\n // new-version creation, but it uses `field in updates` to detect config\n // changes — so we must only include fields the caller actually sent.\n // Forwarding `undefined` keys would trigger a spurious version create\n // and pass `undefined` into the database driver.\n const update: Record<string, unknown> = { id: storedSkillId };\n if (authorId !== undefined) update.authorId = authorId;\n if (resolvedVisibility !== undefined) update.visibility = resolvedVisibility;\n if (name !== undefined) update.name = name;\n if (description !== undefined) update.description = description;\n if (instructions !== undefined) update.instructions = instructions;\n if (license !== undefined) update.license = license;\n if (compatibility !== undefined) update.compatibility = compatibility;\n if (source !== undefined) update.source = source;\n const resolvedReferences = indexedPaths.references ?? references;\n const resolvedScripts = indexedPaths.scripts ?? scripts;\n const resolvedAssets = indexedPaths.assets ?? assets;\n if (resolvedReferences !== undefined) update.references = resolvedReferences;\n if (resolvedScripts !== undefined) update.scripts = resolvedScripts;\n if (resolvedAssets !== undefined) update.assets = resolvedAssets;\n if (files !== undefined) update.files = files;\n if (metadata !== undefined) {\n update.metadata = scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope);\n }\n\n await skillStore.update(update as Parameters<typeof skillStore.update>[0]);\n\n // Return the resolved skill with the updated config\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error updating stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId - Delete a stored skill\n */\nexport const DELETE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: deleteStoredSkillResponseSchema,\n summary: 'Delete stored skill',\n description: 'Deletes a skill from storage by its unique identifier',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `skills:delete[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'delete',\n record: existing,\n });\n\n await skillStore.delete(storedSkillId);\n\n // Cascade: drop any favorite rows referencing this skill. Failure must not\n // abort the delete.\n try {\n const favoritesStore = await storage.getStore('favorites');\n await favoritesStore?.deleteFavoritesForEntity({ entityType: 'skill', entityId: storedSkillId });\n } catch (cascadeError) {\n mastra\n .getLogger?.()\n ?.warn?.('Failed to cascade-delete favorites for skill', { storedSkillId, error: cascadeError });\n }\n\n return {\n success: true,\n message: `Skill ${storedSkillId} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills/:storedSkillId/publish - Publish a skill from filesystem\n * Walks the skill directory, hashes files into blob store, creates a new version\n * with the tree manifest, and sets activeVersionId.\n */\nexport const PUBLISH_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills/:storedSkillId/publish',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: publishStoredSkillBodySchema,\n responseSchema: publishStoredSkillResponseSchema,\n summary: 'Publish stored skill',\n description:\n 'Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const blobStore = await storage.getStore('blobs');\n if (!blobStore) {\n throw new HTTPException(500, { message: 'Blob storage domain is not available' });\n }\n\n // Verify skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // Validate skillPath to prevent path traversal\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n const resolvedPath = path.default.resolve(skillPath);\n const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());\n if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {\n throw new HTTPException(400, {\n message: `skillPath must be within the allowed directory: ${allowedBase}`,\n });\n }\n\n // Verify the source directory exists and contains a SKILL.md before attempting\n // to publish, so callers get a 400 with context instead of a raw 500/ENOENT.\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });\n }\n } catch (err) {\n if (err instanceof HTTPException) throw err;\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`,\n });\n }\n throw err;\n }\n try {\n await fs.stat(path.default.join(resolvedPath, 'SKILL.md'));\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath is missing SKILL.md: ${resolvedPath}`,\n });\n }\n throw err;\n }\n\n // Use LocalSkillSource to read from the server filesystem\n const source = new LocalSkillSource();\n const { publishSkillFromSource } = await import('@mastra/core/workspace');\n\n const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);\n\n // Strip undefined keys from the snapshot before passing to update(). The\n // storage layer treats \"field present\" as \"field changed\"; forwarding\n // undefined would overwrite populated columns with undefined and trip\n // NOT NULL / \"undefined cannot be passed as argument\" errors in\n // adapters that bind args raw (libsql, pg).\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 // `files` is the nested folder/file structure shown in the editor; without\n // it the column would stay null and the UI would render an empty tree.\n await skillStore.update({\n id: storedSkillId,\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(storedSkillId);\n if (latestVersion) {\n await skillStore.update({\n id: storedSkillId,\n activeVersionId: latestVersion.id,\n });\n }\n\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve skill after publish' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error publishing stored skill');\n }\n },\n});\n"]}
'use strict';
var chunkT3C54LPX_cjs = require('./chunk-T3C54LPX.cjs');
var chunkO4O2EJF7_cjs = require('./chunk-O4O2EJF7.cjs');
var chunkS2HKHYJ3_cjs = require('./chunk-S2HKHYJ3.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
// src/server/handlers/stored-skill-favorites.ts
async function getFavoritesContext(mastra) {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Favorites storage domain is not available" });
}
return { skillStore, favoritesStore };
}
var FAVORITE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "PUT",
path: "/stored/skills/:storedSkillId/favorite",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
responseSchema: chunkO4O2EJF7_cjs.favoriteToggleResponseSchema,
summary: "Favorite a stored skill",
description: "Marks the stored skill as favorited by the calling user. Idempotent.",
tags: ["Stored Skills"],
requiresAuth: true,
requiresPermission: "stored-skills:read",
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
await chunkS2HKHYJ3_cjs.requireBuilderFeature(mastra, "favorites");
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!callerId) {
throw new chunk64ITUOXI_cjs.HTTPException(401, { message: "Authentication required" });
}
const { skillStore, favoritesStore } = await getFavoritesContext(mastra);
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(skill, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
const result = await favoritesStore.favorite({
userId: callerId,
entityType: "skill",
entityId: storedSkillId
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error favoriting stored skill");
}
}
});
var UNFAVORITE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/stored/skills/:storedSkillId/favorite",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
responseSchema: chunkO4O2EJF7_cjs.favoriteToggleResponseSchema,
summary: "Unfavorite a stored skill",
description: "Removes the caller\u2019s favorite from the stored skill. Idempotent.",
tags: ["Stored Skills"],
requiresAuth: true,
requiresPermission: "stored-skills:read",
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
await chunkS2HKHYJ3_cjs.requireBuilderFeature(mastra, "favorites");
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!callerId) {
throw new chunk64ITUOXI_cjs.HTTPException(401, { message: "Authentication required" });
}
const { skillStore, favoritesStore } = await getFavoritesContext(mastra);
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(skill, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
const result = await favoritesStore.unfavorite({
userId: callerId,
entityType: "skill",
entityId: storedSkillId
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error unfavoriting stored skill");
}
}
});
exports.FAVORITE_STORED_SKILL_ROUTE = FAVORITE_STORED_SKILL_ROUTE;
exports.UNFAVORITE_STORED_SKILL_ROUTE = UNFAVORITE_STORED_SKILL_ROUTE;
//# sourceMappingURL=chunk-Y3MYKCTO.cjs.map
//# sourceMappingURL=chunk-Y3MYKCTO.cjs.map
{"version":3,"sources":["../src/server/handlers/stored-skill-favorites.ts"],"names":["HTTPException","createRoute","storedSkillIdPathParams","favoriteToggleResponseSchema","requireBuilderFeature","getCallerAuthorId","assertStoredResourceScope","getStoredResourceScope","assertReadAccess","handleError"],"mappings":"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","file":"chunk-Y3MYKCTO.cjs","sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedSkillIdPathParams } from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { skillStore, favoritesStore };\n}\n\n/**\n * PUT /stored/skills/:storedSkillId/favorite\n */\nexport const FAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored skill',\n description: 'Marks the stored skill as favorited by the calling user. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the skill (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId/favorite\n */\nexport const UNFAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored skill',\n description: 'Removes the caller’s favorite from the stored skill. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored skill');\n }\n },\n});\n"]}
import { favoriteToggleResponseSchema } from './chunk-SFPN7SHZ.js';
import { requireBuilderFeature } from './chunk-TPGA2ZTS.js';
import { getCallerAuthorId, assertReadAccess } from './chunk-56AYHXOU.js';
import { storedAgentIdPathParams } from './chunk-SPVKRK56.js';
import { assertStoredResourceScope, getStoredResourceScope } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
// src/server/handlers/stored-agent-favorites.ts
async function getFavoritesContext(mastra) {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const agentStore = await storage.getStore("agents");
if (!agentStore) {
throw new HTTPException(500, { message: "Agents storage domain is not available" });
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new HTTPException(500, { message: "Favorites storage domain is not available" });
}
return { agentStore, favoritesStore };
}
var FAVORITE_STORED_AGENT_ROUTE = createRoute({
method: "PUT",
path: "/stored/agents/:storedAgentId/favorite",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
responseSchema: favoriteToggleResponseSchema,
summary: "Favorite a stored agent",
description: "Marks the stored agent as favorited by the calling user. Idempotent.",
tags: ["Stored Agents"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
await requireBuilderFeature(mastra, "favorites");
const callerId = getCallerAuthorId(requestContext);
if (!callerId) {
throw new HTTPException(401, { message: "Authentication required" });
}
const { agentStore, favoritesStore } = await getFavoritesContext(mastra);
const agent = await agentStore.getById(storedAgentId);
if (!agent) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const result = await favoritesStore.favorite({
userId: callerId,
entityType: "agent",
entityId: storedAgentId
});
return result;
} catch (error) {
return handleError(error, "Error favoriting stored agent");
}
}
});
var UNFAVORITE_STORED_AGENT_ROUTE = createRoute({
method: "DELETE",
path: "/stored/agents/:storedAgentId/favorite",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
responseSchema: favoriteToggleResponseSchema,
summary: "Unfavorite a stored agent",
description: "Removes the caller\u2019s favorite from the stored agent. Idempotent.",
tags: ["Stored Agents"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
await requireBuilderFeature(mastra, "favorites");
const callerId = getCallerAuthorId(requestContext);
if (!callerId) {
throw new HTTPException(401, { message: "Authentication required" });
}
const { agentStore, favoritesStore } = await getFavoritesContext(mastra);
const agent = await agentStore.getById(storedAgentId);
if (!agent) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const result = await favoritesStore.unfavorite({
userId: callerId,
entityType: "agent",
entityId: storedAgentId
});
return result;
} catch (error) {
return handleError(error, "Error unfavoriting stored agent");
}
}
});
export { FAVORITE_STORED_AGENT_ROUTE, UNFAVORITE_STORED_AGENT_ROUTE };
//# sourceMappingURL=chunk-ZZOHO2FT.js.map
//# sourceMappingURL=chunk-ZZOHO2FT.js.map
{"version":3,"sources":["../src/server/handlers/stored-agent-favorites.ts"],"names":[],"mappings":"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","file":"chunk-ZZOHO2FT.js","sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedAgentIdPathParams } from '../schemas/stored-agents';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const agentStore = await storage.getStore('agents');\n if (!agentStore) {\n throw new HTTPException(500, { message: 'Agents storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { agentStore, favoritesStore };\n}\n\n/**\n * PUT /stored/agents/:storedAgentId/favorite\n */\nexport const FAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored agent',\n description: 'Marks the stored agent as favorited by the calling user. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the agent (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored agent');\n }\n },\n});\n\n/**\n * DELETE /stored/agents/:storedAgentId/favorite\n */\nexport const UNFAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored agent',\n description: 'Removes the caller’s favorite from the stored agent. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored agent');\n }\n },\n});\n"]}
+1
-1
{
"version": "1.46.0-alpha.5",
"version": "1.46.0",
"package": "@mastra/server",

@@ -4,0 +4,0 @@ "exports": {},

@@ -6,3 +6,3 @@ ---

package: "@mastra/server"
version: "1.46.0-alpha.5"
version: "1.46.0"
---

@@ -9,0 +9,0 @@

@@ -6,12 +6,12 @@ 'use strict';

var chunkUSU23GYD_cjs = require('../chunk-USU23GYD.cjs');
var chunkRWW6SPX2_cjs = require('../chunk-RWW6SPX2.cjs');
var chunkEMRTFZVU_cjs = require('../chunk-EMRTFZVU.cjs');
var chunkH2WXUVWU_cjs = require('../chunk-H2WXUVWU.cjs');
var chunkUITLSJUW_cjs = require('../chunk-UITLSJUW.cjs');
var chunkM5DAKMVZ_cjs = require('../chunk-M5DAKMVZ.cjs');
var chunkJY2LHUT4_cjs = require('../chunk-JY2LHUT4.cjs');
var chunkIMHKYH3U_cjs = require('../chunk-IMHKYH3U.cjs');
var chunk27RDIRLQ_cjs = require('../chunk-27RDIRLQ.cjs');
var chunk6HRGFBAF_cjs = require('../chunk-6HRGFBAF.cjs');
var chunk7X243C5K_cjs = require('../chunk-7X243C5K.cjs');
var chunkSPHAWZ5H_cjs = require('../chunk-SPHAWZ5H.cjs');
var chunkGU4AEOGA_cjs = require('../chunk-GU4AEOGA.cjs');
var chunkRHRIAUUE_cjs = require('../chunk-RHRIAUUE.cjs');
var chunkUNXPZBTJ_cjs = require('../chunk-UNXPZBTJ.cjs');
var chunkDEK4ZGUR_cjs = require('../chunk-DEK4ZGUR.cjs');
var chunkK3FM6RLZ_cjs = require('../chunk-K3FM6RLZ.cjs');
var chunk7DKSWNOM_cjs = require('../chunk-7DKSWNOM.cjs');
var chunkL4V4FQDA_cjs = require('../chunk-L4V4FQDA.cjs');

@@ -37,11 +37,11 @@ var chunkU72IZ5BP_cjs = require('../chunk-U72IZ5BP.cjs');

enumerable: true,
get: function () { return chunkRWW6SPX2_cjs.tools_exports; }
get: function () { return chunkUITLSJUW_cjs.tools_exports; }
});
Object.defineProperty(exports, "scores", {
enumerable: true,
get: function () { return chunkEMRTFZVU_cjs.scores_exports; }
get: function () { return chunkM5DAKMVZ_cjs.scores_exports; }
});
Object.defineProperty(exports, "responses", {
enumerable: true,
get: function () { return chunkH2WXUVWU_cjs.responses_exports; }
get: function () { return chunkJY2LHUT4_cjs.responses_exports; }
});

@@ -54,3 +54,3 @@ Object.defineProperty(exports, "mcp", {

enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.memory_exports; }
get: function () { return chunk6HRGFBAF_cjs.memory_exports; }
});

@@ -61,6 +61,2 @@ Object.defineProperty(exports, "observability", {

});
Object.defineProperty(exports, "conversations", {
enumerable: true,
get: function () { return chunkSPHAWZ5H_cjs.conversations_exports; }
});
Object.defineProperty(exports, "logs", {

@@ -70,9 +66,13 @@ enumerable: true,

});
Object.defineProperty(exports, "conversations", {
enumerable: true,
get: function () { return chunkDEK4ZGUR_cjs.conversations_exports; }
});
Object.defineProperty(exports, "a2a", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.a2a_exports; }
get: function () { return chunkK3FM6RLZ_cjs.a2a_exports; }
});
Object.defineProperty(exports, "agents", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.agents_exports; }
get: function () { return chunk7DKSWNOM_cjs.agents_exports; }
});

@@ -79,0 +79,0 @@ Object.defineProperty(exports, "agentBuilder", {

export { vector_exports as vector } from '../chunk-MMZL6I4C.js';
export { voice_exports as voice } from '../chunk-LQZHT5U7.js';
export { workspace_exports as workspace } from '../chunk-WF6VLJGR.js';
export { tools_exports as tools } from '../chunk-T3T23PHF.js';
export { scores_exports as scores } from '../chunk-5LOPQPIH.js';
export { responses_exports as responses } from '../chunk-BSUXHFFY.js';
export { tools_exports as tools } from '../chunk-F5EEKLC4.js';
export { scores_exports as scores } from '../chunk-MLLGO6XZ.js';
export { responses_exports as responses } from '../chunk-PLWZVSGT.js';
export { mcp_exports as mcp } from '../chunk-RQGQAYCL.js';
export { memory_exports as memory } from '../chunk-CQHYURGT.js';
export { memory_exports as memory } from '../chunk-HZWJL5Y4.js';
export { observability_exports as observability } from '../chunk-TIXNAAKQ.js';
export { conversations_exports as conversations } from '../chunk-BJPP22F6.js';
export { logs_exports as logs } from '../chunk-OHWAEEZJ.js';
export { a2a_exports as a2a } from '../chunk-L5JZZ7PX.js';
export { agents_exports as agents } from '../chunk-L6FOTAND.js';
export { conversations_exports as conversations } from '../chunk-E345K7K7.js';
export { a2a_exports as a2a } from '../chunk-NEPOKWAA.js';
export { agents_exports as agents } from '../chunk-WKSF3TVK.js';
export { agent_builder_exports as agentBuilder } from '../chunk-ILVGJFCT.js';

@@ -15,0 +15,0 @@ export { workflows_exports as workflows } from '../chunk-R7624SPL.js';

'use strict';
var chunkRHRIAUUE_cjs = require('../../chunk-RHRIAUUE.cjs');
var chunkK3FM6RLZ_cjs = require('../../chunk-K3FM6RLZ.cjs');

@@ -9,53 +9,53 @@

enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.AGENT_EXECUTION_ROUTE; }
get: function () { return chunkK3FM6RLZ_cjs.AGENT_EXECUTION_ROUTE; }
});
Object.defineProperty(exports, "GET_AGENT_CARD_ROUTE", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.GET_AGENT_CARD_ROUTE; }
get: function () { return chunkK3FM6RLZ_cjs.GET_AGENT_CARD_ROUTE; }
});
Object.defineProperty(exports, "getAgentCardByIdHandler", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.getAgentCardByIdHandler; }
get: function () { return chunkK3FM6RLZ_cjs.getAgentCardByIdHandler; }
});
Object.defineProperty(exports, "getAgentExecutionHandler", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.getAgentExecutionHandler; }
get: function () { return chunkK3FM6RLZ_cjs.getAgentExecutionHandler; }
});
Object.defineProperty(exports, "handleDeleteTaskPushNotificationConfig", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleDeleteTaskPushNotificationConfig; }
get: function () { return chunkK3FM6RLZ_cjs.handleDeleteTaskPushNotificationConfig; }
});
Object.defineProperty(exports, "handleGetTaskPushNotificationConfig", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleGetTaskPushNotificationConfig; }
get: function () { return chunkK3FM6RLZ_cjs.handleGetTaskPushNotificationConfig; }
});
Object.defineProperty(exports, "handleListTaskPushNotificationConfig", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleListTaskPushNotificationConfig; }
get: function () { return chunkK3FM6RLZ_cjs.handleListTaskPushNotificationConfig; }
});
Object.defineProperty(exports, "handleMessageSend", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleMessageSend; }
get: function () { return chunkK3FM6RLZ_cjs.handleMessageSend; }
});
Object.defineProperty(exports, "handleMessageStream", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleMessageStream; }
get: function () { return chunkK3FM6RLZ_cjs.handleMessageStream; }
});
Object.defineProperty(exports, "handleSetTaskPushNotificationConfig", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleSetTaskPushNotificationConfig; }
get: function () { return chunkK3FM6RLZ_cjs.handleSetTaskPushNotificationConfig; }
});
Object.defineProperty(exports, "handleTaskCancel", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleTaskCancel; }
get: function () { return chunkK3FM6RLZ_cjs.handleTaskCancel; }
});
Object.defineProperty(exports, "handleTaskGet", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleTaskGet; }
get: function () { return chunkK3FM6RLZ_cjs.handleTaskGet; }
});
Object.defineProperty(exports, "handleTaskResubscribe", {
enumerable: true,
get: function () { return chunkRHRIAUUE_cjs.handleTaskResubscribe; }
get: function () { return chunkK3FM6RLZ_cjs.handleTaskResubscribe; }
});
//# sourceMappingURL=a2a.cjs.map
//# sourceMappingURL=a2a.cjs.map

@@ -1,3 +0,3 @@

export { AGENT_EXECUTION_ROUTE, GET_AGENT_CARD_ROUTE, getAgentCardByIdHandler, getAgentExecutionHandler, handleDeleteTaskPushNotificationConfig, handleGetTaskPushNotificationConfig, handleListTaskPushNotificationConfig, handleMessageSend, handleMessageStream, handleSetTaskPushNotificationConfig, handleTaskCancel, handleTaskGet, handleTaskResubscribe } from '../../chunk-L5JZZ7PX.js';
export { AGENT_EXECUTION_ROUTE, GET_AGENT_CARD_ROUTE, getAgentCardByIdHandler, getAgentExecutionHandler, handleDeleteTaskPushNotificationConfig, handleGetTaskPushNotificationConfig, handleListTaskPushNotificationConfig, handleMessageSend, handleMessageStream, handleSetTaskPushNotificationConfig, handleTaskCancel, handleTaskGet, handleTaskResubscribe } from '../../chunk-NEPOKWAA.js';
//# sourceMappingURL=a2a.js.map
//# sourceMappingURL=a2a.js.map
'use strict';
var chunkUNXPZBTJ_cjs = require('../../chunk-UNXPZBTJ.cjs');
var chunk7DKSWNOM_cjs = require('../../chunk-7DKSWNOM.cjs');

@@ -9,181 +9,181 @@

enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.ABORT_AGENT_THREAD_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.ABORT_AGENT_THREAD_ROUTE; }
});
Object.defineProperty(exports, "APPROVE_NETWORK_TOOL_CALL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.APPROVE_NETWORK_TOOL_CALL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.APPROVE_NETWORK_TOOL_CALL_ROUTE; }
});
Object.defineProperty(exports, "APPROVE_TOOL_CALL_GENERATE_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.APPROVE_TOOL_CALL_GENERATE_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.APPROVE_TOOL_CALL_GENERATE_ROUTE; }
});
Object.defineProperty(exports, "APPROVE_TOOL_CALL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.APPROVE_TOOL_CALL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.APPROVE_TOOL_CALL_ROUTE; }
});
Object.defineProperty(exports, "CLONE_AGENT_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.CLONE_AGENT_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.CLONE_AGENT_ROUTE; }
});
Object.defineProperty(exports, "DECLINE_NETWORK_TOOL_CALL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.DECLINE_NETWORK_TOOL_CALL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.DECLINE_NETWORK_TOOL_CALL_ROUTE; }
});
Object.defineProperty(exports, "DECLINE_TOOL_CALL_GENERATE_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.DECLINE_TOOL_CALL_GENERATE_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.DECLINE_TOOL_CALL_GENERATE_ROUTE; }
});
Object.defineProperty(exports, "DECLINE_TOOL_CALL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.DECLINE_TOOL_CALL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.DECLINE_TOOL_CALL_ROUTE; }
});
Object.defineProperty(exports, "ENHANCE_INSTRUCTIONS_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.ENHANCE_INSTRUCTIONS_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.ENHANCE_INSTRUCTIONS_ROUTE; }
});
Object.defineProperty(exports, "GENERATE_AGENT_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.GENERATE_AGENT_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.GENERATE_AGENT_ROUTE; }
});
Object.defineProperty(exports, "GENERATE_AGENT_VNEXT_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.GENERATE_AGENT_VNEXT_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.GENERATE_AGENT_VNEXT_ROUTE; }
});
Object.defineProperty(exports, "GENERATE_LEGACY_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.GENERATE_LEGACY_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.GENERATE_LEGACY_ROUTE; }
});
Object.defineProperty(exports, "GET_AGENT_BY_ID_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.GET_AGENT_BY_ID_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.GET_AGENT_BY_ID_ROUTE; }
});
Object.defineProperty(exports, "GET_AGENT_SKILL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.GET_AGENT_SKILL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.GET_AGENT_SKILL_ROUTE; }
});
Object.defineProperty(exports, "GET_PROVIDERS_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.GET_PROVIDERS_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.GET_PROVIDERS_ROUTE; }
});
Object.defineProperty(exports, "LIST_AGENTS_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.LIST_AGENTS_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.LIST_AGENTS_ROUTE; }
});
Object.defineProperty(exports, "OBSERVE_AGENT_STREAM_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.OBSERVE_AGENT_STREAM_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.OBSERVE_AGENT_STREAM_ROUTE; }
});
Object.defineProperty(exports, "QUEUE_AGENT_MESSAGE_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.QUEUE_AGENT_MESSAGE_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.QUEUE_AGENT_MESSAGE_ROUTE; }
});
Object.defineProperty(exports, "REORDER_AGENT_MODEL_LIST_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.REORDER_AGENT_MODEL_LIST_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.REORDER_AGENT_MODEL_LIST_ROUTE; }
});
Object.defineProperty(exports, "RESET_AGENT_MODEL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.RESET_AGENT_MODEL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.RESET_AGENT_MODEL_ROUTE; }
});
Object.defineProperty(exports, "RESUME_STREAM_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.RESUME_STREAM_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.RESUME_STREAM_ROUTE; }
});
Object.defineProperty(exports, "RESUME_STREAM_UNTIL_IDLE_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.RESUME_STREAM_UNTIL_IDLE_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.RESUME_STREAM_UNTIL_IDLE_ROUTE; }
});
Object.defineProperty(exports, "SEND_AGENT_MESSAGE_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.SEND_AGENT_MESSAGE_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.SEND_AGENT_MESSAGE_ROUTE; }
});
Object.defineProperty(exports, "SEND_AGENT_SIGNAL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.SEND_AGENT_SIGNAL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.SEND_AGENT_SIGNAL_ROUTE; }
});
Object.defineProperty(exports, "SEND_TOOL_APPROVAL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.SEND_TOOL_APPROVAL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.SEND_TOOL_APPROVAL_ROUTE; }
});
Object.defineProperty(exports, "STREAM_GENERATE_LEGACY_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.STREAM_GENERATE_LEGACY_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.STREAM_GENERATE_LEGACY_ROUTE; }
});
Object.defineProperty(exports, "STREAM_GENERATE_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.STREAM_GENERATE_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.STREAM_GENERATE_ROUTE; }
});
Object.defineProperty(exports, "STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE; }
});
Object.defineProperty(exports, "STREAM_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.STREAM_NETWORK_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.STREAM_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "STREAM_UI_MESSAGE_DEPRECATED_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.STREAM_UI_MESSAGE_DEPRECATED_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.STREAM_UI_MESSAGE_DEPRECATED_ROUTE; }
});
Object.defineProperty(exports, "STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE; }
});
Object.defineProperty(exports, "STREAM_UNTIL_IDLE_GENERATE_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.STREAM_UNTIL_IDLE_GENERATE_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.STREAM_UNTIL_IDLE_GENERATE_ROUTE; }
});
Object.defineProperty(exports, "STREAM_VNEXT_DEPRECATED_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.STREAM_VNEXT_DEPRECATED_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.STREAM_VNEXT_DEPRECATED_ROUTE; }
});
Object.defineProperty(exports, "SUBSCRIBE_AGENT_THREAD_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.SUBSCRIBE_AGENT_THREAD_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.SUBSCRIBE_AGENT_THREAD_ROUTE; }
});
Object.defineProperty(exports, "UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE; }
});
Object.defineProperty(exports, "UPDATE_AGENT_MODEL_ROUTE", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.UPDATE_AGENT_MODEL_ROUTE; }
get: function () { return chunk7DKSWNOM_cjs.UPDATE_AGENT_MODEL_ROUTE; }
});
Object.defineProperty(exports, "buildProvidersList", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.buildProvidersList; }
get: function () { return chunk7DKSWNOM_cjs.buildProvidersList; }
});
Object.defineProperty(exports, "extractVersionOptions", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.extractVersionOptions; }
get: function () { return chunk7DKSWNOM_cjs.extractVersionOptions; }
});
Object.defineProperty(exports, "getAgentFromSystem", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.getAgentFromSystem; }
get: function () { return chunk7DKSWNOM_cjs.getAgentFromSystem; }
});
Object.defineProperty(exports, "getBrowserToolsFromAgent", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.getBrowserToolsFromAgent; }
get: function () { return chunk7DKSWNOM_cjs.getBrowserToolsFromAgent; }
});
Object.defineProperty(exports, "getSerializedAgentTools", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.getSerializedAgentTools; }
get: function () { return chunk7DKSWNOM_cjs.getSerializedAgentTools; }
});
Object.defineProperty(exports, "getSerializedProcessors", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.getSerializedProcessors; }
get: function () { return chunk7DKSWNOM_cjs.getSerializedProcessors; }
});
Object.defineProperty(exports, "getSerializedSkillsFromAgent", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.getSerializedSkillsFromAgent; }
get: function () { return chunk7DKSWNOM_cjs.getSerializedSkillsFromAgent; }
});
Object.defineProperty(exports, "getWorkspaceToolsFromAgent", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.getWorkspaceToolsFromAgent; }
get: function () { return chunk7DKSWNOM_cjs.getWorkspaceToolsFromAgent; }
});
Object.defineProperty(exports, "isProviderConnected", {
enumerable: true,
get: function () { return chunkUNXPZBTJ_cjs.isProviderConnected; }
get: function () { return chunk7DKSWNOM_cjs.isProviderConnected; }
});
//# sourceMappingURL=agents.cjs.map
//# sourceMappingURL=agents.cjs.map

@@ -1,3 +0,3 @@

export { ABORT_AGENT_THREAD_ROUTE, APPROVE_NETWORK_TOOL_CALL_ROUTE, APPROVE_TOOL_CALL_GENERATE_ROUTE, APPROVE_TOOL_CALL_ROUTE, CLONE_AGENT_ROUTE, DECLINE_NETWORK_TOOL_CALL_ROUTE, DECLINE_TOOL_CALL_GENERATE_ROUTE, DECLINE_TOOL_CALL_ROUTE, ENHANCE_INSTRUCTIONS_ROUTE, GENERATE_AGENT_ROUTE, GENERATE_AGENT_VNEXT_ROUTE, GENERATE_LEGACY_ROUTE, GET_AGENT_BY_ID_ROUTE, GET_AGENT_SKILL_ROUTE, GET_PROVIDERS_ROUTE, LIST_AGENTS_ROUTE, OBSERVE_AGENT_STREAM_ROUTE, QUEUE_AGENT_MESSAGE_ROUTE, REORDER_AGENT_MODEL_LIST_ROUTE, RESET_AGENT_MODEL_ROUTE, RESUME_STREAM_ROUTE, RESUME_STREAM_UNTIL_IDLE_ROUTE, SEND_AGENT_MESSAGE_ROUTE, SEND_AGENT_SIGNAL_ROUTE, SEND_TOOL_APPROVAL_ROUTE, STREAM_GENERATE_LEGACY_ROUTE, STREAM_GENERATE_ROUTE, STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE, STREAM_NETWORK_ROUTE, STREAM_UI_MESSAGE_DEPRECATED_ROUTE, STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE, STREAM_UNTIL_IDLE_GENERATE_ROUTE, STREAM_VNEXT_DEPRECATED_ROUTE, SUBSCRIBE_AGENT_THREAD_ROUTE, UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE, UPDATE_AGENT_MODEL_ROUTE, buildProvidersList, extractVersionOptions, getAgentFromSystem, getBrowserToolsFromAgent, getSerializedAgentTools, getSerializedProcessors, getSerializedSkillsFromAgent, getWorkspaceToolsFromAgent, isProviderConnected } from '../../chunk-L6FOTAND.js';
export { ABORT_AGENT_THREAD_ROUTE, APPROVE_NETWORK_TOOL_CALL_ROUTE, APPROVE_TOOL_CALL_GENERATE_ROUTE, APPROVE_TOOL_CALL_ROUTE, CLONE_AGENT_ROUTE, DECLINE_NETWORK_TOOL_CALL_ROUTE, DECLINE_TOOL_CALL_GENERATE_ROUTE, DECLINE_TOOL_CALL_ROUTE, ENHANCE_INSTRUCTIONS_ROUTE, GENERATE_AGENT_ROUTE, GENERATE_AGENT_VNEXT_ROUTE, GENERATE_LEGACY_ROUTE, GET_AGENT_BY_ID_ROUTE, GET_AGENT_SKILL_ROUTE, GET_PROVIDERS_ROUTE, LIST_AGENTS_ROUTE, OBSERVE_AGENT_STREAM_ROUTE, QUEUE_AGENT_MESSAGE_ROUTE, REORDER_AGENT_MODEL_LIST_ROUTE, RESET_AGENT_MODEL_ROUTE, RESUME_STREAM_ROUTE, RESUME_STREAM_UNTIL_IDLE_ROUTE, SEND_AGENT_MESSAGE_ROUTE, SEND_AGENT_SIGNAL_ROUTE, SEND_TOOL_APPROVAL_ROUTE, STREAM_GENERATE_LEGACY_ROUTE, STREAM_GENERATE_ROUTE, STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE, STREAM_NETWORK_ROUTE, STREAM_UI_MESSAGE_DEPRECATED_ROUTE, STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE, STREAM_UNTIL_IDLE_GENERATE_ROUTE, STREAM_VNEXT_DEPRECATED_ROUTE, SUBSCRIBE_AGENT_THREAD_ROUTE, UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE, UPDATE_AGENT_MODEL_ROUTE, buildProvidersList, extractVersionOptions, getAgentFromSystem, getBrowserToolsFromAgent, getSerializedAgentTools, getSerializedProcessors, getSerializedSkillsFromAgent, getWorkspaceToolsFromAgent, isProviderConnected } from '../../chunk-WKSF3TVK.js';
//# sourceMappingURL=agents.js.map
//# sourceMappingURL=agents.js.map
'use strict';
var chunkSPHAWZ5H_cjs = require('../../chunk-SPHAWZ5H.cjs');
var chunkDEK4ZGUR_cjs = require('../../chunk-DEK4ZGUR.cjs');

@@ -9,17 +9,17 @@

enumerable: true,
get: function () { return chunkSPHAWZ5H_cjs.CREATE_CONVERSATION_ROUTE; }
get: function () { return chunkDEK4ZGUR_cjs.CREATE_CONVERSATION_ROUTE; }
});
Object.defineProperty(exports, "DELETE_CONVERSATION_ROUTE", {
enumerable: true,
get: function () { return chunkSPHAWZ5H_cjs.DELETE_CONVERSATION_ROUTE; }
get: function () { return chunkDEK4ZGUR_cjs.DELETE_CONVERSATION_ROUTE; }
});
Object.defineProperty(exports, "GET_CONVERSATION_ITEMS_ROUTE", {
enumerable: true,
get: function () { return chunkSPHAWZ5H_cjs.GET_CONVERSATION_ITEMS_ROUTE; }
get: function () { return chunkDEK4ZGUR_cjs.GET_CONVERSATION_ITEMS_ROUTE; }
});
Object.defineProperty(exports, "GET_CONVERSATION_ROUTE", {
enumerable: true,
get: function () { return chunkSPHAWZ5H_cjs.GET_CONVERSATION_ROUTE; }
get: function () { return chunkDEK4ZGUR_cjs.GET_CONVERSATION_ROUTE; }
});
//# sourceMappingURL=conversations.cjs.map
//# sourceMappingURL=conversations.cjs.map

@@ -1,3 +0,3 @@

export { CREATE_CONVERSATION_ROUTE, DELETE_CONVERSATION_ROUTE, GET_CONVERSATION_ITEMS_ROUTE, GET_CONVERSATION_ROUTE } from '../../chunk-BJPP22F6.js';
export { CREATE_CONVERSATION_ROUTE, DELETE_CONVERSATION_ROUTE, GET_CONVERSATION_ITEMS_ROUTE, GET_CONVERSATION_ROUTE } from '../../chunk-E345K7K7.js';
//# sourceMappingURL=conversations.js.map
//# sourceMappingURL=conversations.js.map
'use strict';
var chunkTDMX66RN_cjs = require('../../chunk-TDMX66RN.cjs');
var chunkS2HKHYJ3_cjs = require('../../chunk-S2HKHYJ3.cjs');

@@ -9,21 +9,21 @@

enumerable: true,
get: function () { return chunkTDMX66RN_cjs.GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE; }
get: function () { return chunkS2HKHYJ3_cjs.GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE; }
});
Object.defineProperty(exports, "GET_EDITOR_BUILDER_SETTINGS_ROUTE", {
enumerable: true,
get: function () { return chunkTDMX66RN_cjs.GET_EDITOR_BUILDER_SETTINGS_ROUTE; }
get: function () { return chunkS2HKHYJ3_cjs.GET_EDITOR_BUILDER_SETTINGS_ROUTE; }
});
Object.defineProperty(exports, "GET_INFRASTRUCTURE_STATUS_ROUTE", {
enumerable: true,
get: function () { return chunkTDMX66RN_cjs.GET_INFRASTRUCTURE_STATUS_ROUTE; }
get: function () { return chunkS2HKHYJ3_cjs.GET_INFRASTRUCTURE_STATUS_ROUTE; }
});
Object.defineProperty(exports, "isBuilderFeatureEnabled", {
enumerable: true,
get: function () { return chunkTDMX66RN_cjs.isBuilderFeatureEnabled; }
get: function () { return chunkS2HKHYJ3_cjs.isBuilderFeatureEnabled; }
});
Object.defineProperty(exports, "requireBuilderFeature", {
enumerable: true,
get: function () { return chunkTDMX66RN_cjs.requireBuilderFeature; }
get: function () { return chunkS2HKHYJ3_cjs.requireBuilderFeature; }
});
//# sourceMappingURL=editor-builder.cjs.map
//# sourceMappingURL=editor-builder.cjs.map

@@ -1,3 +0,3 @@

export { GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE, GET_EDITOR_BUILDER_SETTINGS_ROUTE, GET_INFRASTRUCTURE_STATUS_ROUTE, isBuilderFeatureEnabled, requireBuilderFeature } from '../../chunk-N3D3A56J.js';
export { GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE, GET_EDITOR_BUILDER_SETTINGS_ROUTE, GET_INFRASTRUCTURE_STATUS_ROUTE, isBuilderFeatureEnabled, requireBuilderFeature } from '../../chunk-TPGA2ZTS.js';
//# sourceMappingURL=editor-builder.js.map
//# sourceMappingURL=editor-builder.js.map
'use strict';
var chunkFUEIM3CA_cjs = require('../../chunk-FUEIM3CA.cjs');
var chunk73MURMD2_cjs = require('../../chunk-73MURMD2.cjs');

@@ -9,13 +9,13 @@

enumerable: true,
get: function () { return chunkFUEIM3CA_cjs.enrichOrStripFavorites; }
get: function () { return chunk73MURMD2_cjs.enrichOrStripFavorites; }
});
Object.defineProperty(exports, "prepareFavoritesEnrichment", {
enumerable: true,
get: function () { return chunkFUEIM3CA_cjs.prepareFavoritesEnrichment; }
get: function () { return chunk73MURMD2_cjs.prepareFavoritesEnrichment; }
});
Object.defineProperty(exports, "stripFavoriteFields", {
enumerable: true,
get: function () { return chunkFUEIM3CA_cjs.stripFavoriteFields; }
get: function () { return chunk73MURMD2_cjs.stripFavoriteFields; }
});
//# sourceMappingURL=favorites-enrichment.cjs.map
//# sourceMappingURL=favorites-enrichment.cjs.map

@@ -1,3 +0,3 @@

export { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from '../../chunk-QWTUGYUI.js';
export { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from '../../chunk-PUW3RA3B.js';
//# sourceMappingURL=favorites-enrichment.js.map
//# sourceMappingURL=favorites-enrichment.js.map
'use strict';
var chunk27RDIRLQ_cjs = require('../../chunk-27RDIRLQ.cjs');
var chunk6HRGFBAF_cjs = require('../../chunk-6HRGFBAF.cjs');

@@ -9,105 +9,105 @@

enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.AWAIT_BUFFER_STATUS_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.AWAIT_BUFFER_STATUS_ROUTE; }
});
Object.defineProperty(exports, "CLONE_THREAD_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.CLONE_THREAD_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.CLONE_THREAD_ROUTE; }
});
Object.defineProperty(exports, "CREATE_THREAD_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.CREATE_THREAD_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.CREATE_THREAD_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "CREATE_THREAD_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.CREATE_THREAD_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.CREATE_THREAD_ROUTE; }
});
Object.defineProperty(exports, "DELETE_MESSAGES_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.DELETE_MESSAGES_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.DELETE_MESSAGES_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "DELETE_MESSAGES_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.DELETE_MESSAGES_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.DELETE_MESSAGES_ROUTE; }
});
Object.defineProperty(exports, "DELETE_THREAD_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.DELETE_THREAD_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.DELETE_THREAD_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "DELETE_THREAD_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.DELETE_THREAD_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.DELETE_THREAD_ROUTE; }
});
Object.defineProperty(exports, "GET_MEMORY_CONFIG_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.GET_MEMORY_CONFIG_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.GET_MEMORY_CONFIG_ROUTE; }
});
Object.defineProperty(exports, "GET_MEMORY_STATUS_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.GET_MEMORY_STATUS_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.GET_MEMORY_STATUS_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "GET_MEMORY_STATUS_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.GET_MEMORY_STATUS_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.GET_MEMORY_STATUS_ROUTE; }
});
Object.defineProperty(exports, "GET_OBSERVATIONAL_MEMORY_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.GET_OBSERVATIONAL_MEMORY_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.GET_OBSERVATIONAL_MEMORY_ROUTE; }
});
Object.defineProperty(exports, "GET_THREAD_BY_ID_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.GET_THREAD_BY_ID_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.GET_THREAD_BY_ID_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "GET_THREAD_BY_ID_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.GET_THREAD_BY_ID_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.GET_THREAD_BY_ID_ROUTE; }
});
Object.defineProperty(exports, "GET_WORKING_MEMORY_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.GET_WORKING_MEMORY_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.GET_WORKING_MEMORY_ROUTE; }
});
Object.defineProperty(exports, "LIST_MESSAGES_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.LIST_MESSAGES_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.LIST_MESSAGES_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "LIST_MESSAGES_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.LIST_MESSAGES_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.LIST_MESSAGES_ROUTE; }
});
Object.defineProperty(exports, "LIST_THREADS_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.LIST_THREADS_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.LIST_THREADS_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "LIST_THREADS_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.LIST_THREADS_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.LIST_THREADS_ROUTE; }
});
Object.defineProperty(exports, "SAVE_MESSAGES_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.SAVE_MESSAGES_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.SAVE_MESSAGES_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "SAVE_MESSAGES_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.SAVE_MESSAGES_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.SAVE_MESSAGES_ROUTE; }
});
Object.defineProperty(exports, "SEARCH_MEMORY_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.SEARCH_MEMORY_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.SEARCH_MEMORY_ROUTE; }
});
Object.defineProperty(exports, "UPDATE_THREAD_NETWORK_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.UPDATE_THREAD_NETWORK_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.UPDATE_THREAD_NETWORK_ROUTE; }
});
Object.defineProperty(exports, "UPDATE_THREAD_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.UPDATE_THREAD_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.UPDATE_THREAD_ROUTE; }
});
Object.defineProperty(exports, "UPDATE_WORKING_MEMORY_ROUTE", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.UPDATE_WORKING_MEMORY_ROUTE; }
get: function () { return chunk6HRGFBAF_cjs.UPDATE_WORKING_MEMORY_ROUTE; }
});
Object.defineProperty(exports, "getTextContent", {
enumerable: true,
get: function () { return chunk27RDIRLQ_cjs.getTextContent; }
get: function () { return chunk6HRGFBAF_cjs.getTextContent; }
});
//# sourceMappingURL=memory.cjs.map
//# sourceMappingURL=memory.cjs.map

@@ -1,3 +0,3 @@

export { AWAIT_BUFFER_STATUS_ROUTE, CLONE_THREAD_ROUTE, CREATE_THREAD_NETWORK_ROUTE, CREATE_THREAD_ROUTE, DELETE_MESSAGES_NETWORK_ROUTE, DELETE_MESSAGES_ROUTE, DELETE_THREAD_NETWORK_ROUTE, DELETE_THREAD_ROUTE, GET_MEMORY_CONFIG_ROUTE, GET_MEMORY_STATUS_NETWORK_ROUTE, GET_MEMORY_STATUS_ROUTE, GET_OBSERVATIONAL_MEMORY_ROUTE, GET_THREAD_BY_ID_NETWORK_ROUTE, GET_THREAD_BY_ID_ROUTE, GET_WORKING_MEMORY_ROUTE, LIST_MESSAGES_NETWORK_ROUTE, LIST_MESSAGES_ROUTE, LIST_THREADS_NETWORK_ROUTE, LIST_THREADS_ROUTE, SAVE_MESSAGES_NETWORK_ROUTE, SAVE_MESSAGES_ROUTE, SEARCH_MEMORY_ROUTE, UPDATE_THREAD_NETWORK_ROUTE, UPDATE_THREAD_ROUTE, UPDATE_WORKING_MEMORY_ROUTE, getTextContent } from '../../chunk-CQHYURGT.js';
export { AWAIT_BUFFER_STATUS_ROUTE, CLONE_THREAD_ROUTE, CREATE_THREAD_NETWORK_ROUTE, CREATE_THREAD_ROUTE, DELETE_MESSAGES_NETWORK_ROUTE, DELETE_MESSAGES_ROUTE, DELETE_THREAD_NETWORK_ROUTE, DELETE_THREAD_ROUTE, GET_MEMORY_CONFIG_ROUTE, GET_MEMORY_STATUS_NETWORK_ROUTE, GET_MEMORY_STATUS_ROUTE, GET_OBSERVATIONAL_MEMORY_ROUTE, GET_THREAD_BY_ID_NETWORK_ROUTE, GET_THREAD_BY_ID_ROUTE, GET_WORKING_MEMORY_ROUTE, LIST_MESSAGES_NETWORK_ROUTE, LIST_MESSAGES_ROUTE, LIST_THREADS_NETWORK_ROUTE, LIST_THREADS_ROUTE, SAVE_MESSAGES_NETWORK_ROUTE, SAVE_MESSAGES_ROUTE, SEARCH_MEMORY_ROUTE, UPDATE_THREAD_NETWORK_ROUTE, UPDATE_THREAD_ROUTE, UPDATE_WORKING_MEMORY_ROUTE, getTextContent } from '../../chunk-HZWJL5Y4.js';
//# sourceMappingURL=memory.js.map
//# sourceMappingURL=memory.js.map
'use strict';
var chunkH2WXUVWU_cjs = require('../../chunk-H2WXUVWU.cjs');
var chunkJY2LHUT4_cjs = require('../../chunk-JY2LHUT4.cjs');

@@ -9,13 +9,13 @@

enumerable: true,
get: function () { return chunkH2WXUVWU_cjs.CREATE_RESPONSE_ROUTE; }
get: function () { return chunkJY2LHUT4_cjs.CREATE_RESPONSE_ROUTE; }
});
Object.defineProperty(exports, "DELETE_RESPONSE_ROUTE", {
enumerable: true,
get: function () { return chunkH2WXUVWU_cjs.DELETE_RESPONSE_ROUTE; }
get: function () { return chunkJY2LHUT4_cjs.DELETE_RESPONSE_ROUTE; }
});
Object.defineProperty(exports, "GET_RESPONSE_ROUTE", {
enumerable: true,
get: function () { return chunkH2WXUVWU_cjs.GET_RESPONSE_ROUTE; }
get: function () { return chunkJY2LHUT4_cjs.GET_RESPONSE_ROUTE; }
});
//# sourceMappingURL=responses.cjs.map
//# sourceMappingURL=responses.cjs.map

@@ -1,3 +0,3 @@

export { CREATE_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE } from '../../chunk-BSUXHFFY.js';
export { CREATE_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE } from '../../chunk-PLWZVSGT.js';
//# sourceMappingURL=responses.js.map
//# sourceMappingURL=responses.js.map
'use strict';
var chunkEMRTFZVU_cjs = require('../../chunk-EMRTFZVU.cjs');
var chunkM5DAKMVZ_cjs = require('../../chunk-M5DAKMVZ.cjs');

@@ -9,25 +9,25 @@

enumerable: true,
get: function () { return chunkEMRTFZVU_cjs.GET_SCORER_ROUTE; }
get: function () { return chunkM5DAKMVZ_cjs.GET_SCORER_ROUTE; }
});
Object.defineProperty(exports, "LIST_SCORERS_ROUTE", {
enumerable: true,
get: function () { return chunkEMRTFZVU_cjs.LIST_SCORERS_ROUTE; }
get: function () { return chunkM5DAKMVZ_cjs.LIST_SCORERS_ROUTE; }
});
Object.defineProperty(exports, "LIST_SCORES_BY_ENTITY_ID_ROUTE", {
enumerable: true,
get: function () { return chunkEMRTFZVU_cjs.LIST_SCORES_BY_ENTITY_ID_ROUTE; }
get: function () { return chunkM5DAKMVZ_cjs.LIST_SCORES_BY_ENTITY_ID_ROUTE; }
});
Object.defineProperty(exports, "LIST_SCORES_BY_RUN_ID_ROUTE", {
enumerable: true,
get: function () { return chunkEMRTFZVU_cjs.LIST_SCORES_BY_RUN_ID_ROUTE; }
get: function () { return chunkM5DAKMVZ_cjs.LIST_SCORES_BY_RUN_ID_ROUTE; }
});
Object.defineProperty(exports, "LIST_SCORES_BY_SCORER_ID_ROUTE", {
enumerable: true,
get: function () { return chunkEMRTFZVU_cjs.LIST_SCORES_BY_SCORER_ID_ROUTE; }
get: function () { return chunkM5DAKMVZ_cjs.LIST_SCORES_BY_SCORER_ID_ROUTE; }
});
Object.defineProperty(exports, "SAVE_SCORE_ROUTE", {
enumerable: true,
get: function () { return chunkEMRTFZVU_cjs.SAVE_SCORE_ROUTE; }
get: function () { return chunkM5DAKMVZ_cjs.SAVE_SCORE_ROUTE; }
});
//# sourceMappingURL=scores.cjs.map
//# sourceMappingURL=scores.cjs.map

@@ -1,3 +0,3 @@

export { GET_SCORER_ROUTE, LIST_SCORERS_ROUTE, LIST_SCORES_BY_ENTITY_ID_ROUTE, LIST_SCORES_BY_RUN_ID_ROUTE, LIST_SCORES_BY_SCORER_ID_ROUTE, SAVE_SCORE_ROUTE } from '../../chunk-5LOPQPIH.js';
export { GET_SCORER_ROUTE, LIST_SCORERS_ROUTE, LIST_SCORES_BY_ENTITY_ID_ROUTE, LIST_SCORES_BY_RUN_ID_ROUTE, LIST_SCORES_BY_SCORER_ID_ROUTE, SAVE_SCORE_ROUTE } from '../../chunk-MLLGO6XZ.js';
//# sourceMappingURL=scores.js.map
//# sourceMappingURL=scores.js.map
'use strict';
var chunkDW6LIDTI_cjs = require('../../chunk-DW6LIDTI.cjs');
var chunkDULEYONH_cjs = require('../../chunk-DULEYONH.cjs');

@@ -9,9 +9,9 @@

enumerable: true,
get: function () { return chunkDW6LIDTI_cjs.FAVORITE_STORED_AGENT_ROUTE; }
get: function () { return chunkDULEYONH_cjs.FAVORITE_STORED_AGENT_ROUTE; }
});
Object.defineProperty(exports, "UNFAVORITE_STORED_AGENT_ROUTE", {
enumerable: true,
get: function () { return chunkDW6LIDTI_cjs.UNFAVORITE_STORED_AGENT_ROUTE; }
get: function () { return chunkDULEYONH_cjs.UNFAVORITE_STORED_AGENT_ROUTE; }
});
//# sourceMappingURL=stored-agent-favorites.cjs.map
//# sourceMappingURL=stored-agent-favorites.cjs.map

@@ -1,3 +0,3 @@

export { FAVORITE_STORED_AGENT_ROUTE, UNFAVORITE_STORED_AGENT_ROUTE } from '../../chunk-XCTWO6W3.js';
export { FAVORITE_STORED_AGENT_ROUTE, UNFAVORITE_STORED_AGENT_ROUTE } from '../../chunk-ZZOHO2FT.js';
//# sourceMappingURL=stored-agent-favorites.js.map
//# sourceMappingURL=stored-agent-favorites.js.map
'use strict';
var chunk6TFOQW4W_cjs = require('../../chunk-6TFOQW4W.cjs');
var chunkUD7JBYUI_cjs = require('../../chunk-UD7JBYUI.cjs');

@@ -9,37 +9,37 @@

enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.CREATE_STORED_AGENT_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.CREATE_STORED_AGENT_ROUTE; }
});
Object.defineProperty(exports, "DELETE_STORED_AGENT_ROUTE", {
enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.DELETE_STORED_AGENT_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.DELETE_STORED_AGENT_ROUTE; }
});
Object.defineProperty(exports, "EXPORT_STORED_AGENT_ROUTE", {
enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.EXPORT_STORED_AGENT_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.EXPORT_STORED_AGENT_ROUTE; }
});
Object.defineProperty(exports, "GET_STORED_AGENT_DEPENDENTS_ROUTE", {
enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.GET_STORED_AGENT_DEPENDENTS_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.GET_STORED_AGENT_DEPENDENTS_ROUTE; }
});
Object.defineProperty(exports, "GET_STORED_AGENT_ROUTE", {
enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.GET_STORED_AGENT_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.GET_STORED_AGENT_ROUTE; }
});
Object.defineProperty(exports, "LIST_STORED_AGENTS_ROUTE", {
enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.LIST_STORED_AGENTS_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.LIST_STORED_AGENTS_ROUTE; }
});
Object.defineProperty(exports, "OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE", {
enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE; }
});
Object.defineProperty(exports, "PREVIEW_INSTRUCTIONS_ROUTE", {
enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.PREVIEW_INSTRUCTIONS_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.PREVIEW_INSTRUCTIONS_ROUTE; }
});
Object.defineProperty(exports, "UPDATE_STORED_AGENT_ROUTE", {
enumerable: true,
get: function () { return chunk6TFOQW4W_cjs.UPDATE_STORED_AGENT_ROUTE; }
get: function () { return chunkUD7JBYUI_cjs.UPDATE_STORED_AGENT_ROUTE; }
});
//# sourceMappingURL=stored-agents.cjs.map
//# sourceMappingURL=stored-agents.cjs.map

@@ -1,3 +0,3 @@

export { CREATE_STORED_AGENT_ROUTE, DELETE_STORED_AGENT_ROUTE, EXPORT_STORED_AGENT_ROUTE, GET_STORED_AGENT_DEPENDENTS_ROUTE, GET_STORED_AGENT_ROUTE, LIST_STORED_AGENTS_ROUTE, OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE, PREVIEW_INSTRUCTIONS_ROUTE, UPDATE_STORED_AGENT_ROUTE } from '../../chunk-KXYFKA7K.js';
export { CREATE_STORED_AGENT_ROUTE, DELETE_STORED_AGENT_ROUTE, EXPORT_STORED_AGENT_ROUTE, GET_STORED_AGENT_DEPENDENTS_ROUTE, GET_STORED_AGENT_ROUTE, LIST_STORED_AGENTS_ROUTE, OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE, PREVIEW_INSTRUCTIONS_ROUTE, UPDATE_STORED_AGENT_ROUTE } from '../../chunk-C4U5EL4H.js';
//# sourceMappingURL=stored-agents.js.map
//# sourceMappingURL=stored-agents.js.map
'use strict';
var chunkSBAFNGQD_cjs = require('../../chunk-SBAFNGQD.cjs');
var chunkY3MYKCTO_cjs = require('../../chunk-Y3MYKCTO.cjs');

@@ -9,9 +9,9 @@

enumerable: true,
get: function () { return chunkSBAFNGQD_cjs.FAVORITE_STORED_SKILL_ROUTE; }
get: function () { return chunkY3MYKCTO_cjs.FAVORITE_STORED_SKILL_ROUTE; }
});
Object.defineProperty(exports, "UNFAVORITE_STORED_SKILL_ROUTE", {
enumerable: true,
get: function () { return chunkSBAFNGQD_cjs.UNFAVORITE_STORED_SKILL_ROUTE; }
get: function () { return chunkY3MYKCTO_cjs.UNFAVORITE_STORED_SKILL_ROUTE; }
});
//# sourceMappingURL=stored-skill-favorites.cjs.map
//# sourceMappingURL=stored-skill-favorites.cjs.map

@@ -1,3 +0,3 @@

export { FAVORITE_STORED_SKILL_ROUTE, UNFAVORITE_STORED_SKILL_ROUTE } from '../../chunk-CGXMRNFE.js';
export { FAVORITE_STORED_SKILL_ROUTE, UNFAVORITE_STORED_SKILL_ROUTE } from '../../chunk-5V2QWK2S.js';
//# sourceMappingURL=stored-skill-favorites.js.map
//# sourceMappingURL=stored-skill-favorites.js.map
'use strict';
var chunkMIAMR6TW_cjs = require('../../chunk-MIAMR6TW.cjs');
var chunkXOQEKMY2_cjs = require('../../chunk-XOQEKMY2.cjs');

@@ -9,25 +9,25 @@

enumerable: true,
get: function () { return chunkMIAMR6TW_cjs.CREATE_STORED_SKILL_ROUTE; }
get: function () { return chunkXOQEKMY2_cjs.CREATE_STORED_SKILL_ROUTE; }
});
Object.defineProperty(exports, "DELETE_STORED_SKILL_ROUTE", {
enumerable: true,
get: function () { return chunkMIAMR6TW_cjs.DELETE_STORED_SKILL_ROUTE; }
get: function () { return chunkXOQEKMY2_cjs.DELETE_STORED_SKILL_ROUTE; }
});
Object.defineProperty(exports, "GET_STORED_SKILL_ROUTE", {
enumerable: true,
get: function () { return chunkMIAMR6TW_cjs.GET_STORED_SKILL_ROUTE; }
get: function () { return chunkXOQEKMY2_cjs.GET_STORED_SKILL_ROUTE; }
});
Object.defineProperty(exports, "LIST_STORED_SKILLS_ROUTE", {
enumerable: true,
get: function () { return chunkMIAMR6TW_cjs.LIST_STORED_SKILLS_ROUTE; }
get: function () { return chunkXOQEKMY2_cjs.LIST_STORED_SKILLS_ROUTE; }
});
Object.defineProperty(exports, "PUBLISH_STORED_SKILL_ROUTE", {
enumerable: true,
get: function () { return chunkMIAMR6TW_cjs.PUBLISH_STORED_SKILL_ROUTE; }
get: function () { return chunkXOQEKMY2_cjs.PUBLISH_STORED_SKILL_ROUTE; }
});
Object.defineProperty(exports, "UPDATE_STORED_SKILL_ROUTE", {
enumerable: true,
get: function () { return chunkMIAMR6TW_cjs.UPDATE_STORED_SKILL_ROUTE; }
get: function () { return chunkXOQEKMY2_cjs.UPDATE_STORED_SKILL_ROUTE; }
});
//# sourceMappingURL=stored-skills.cjs.map
//# sourceMappingURL=stored-skills.cjs.map

@@ -1,3 +0,3 @@

export { CREATE_STORED_SKILL_ROUTE, DELETE_STORED_SKILL_ROUTE, GET_STORED_SKILL_ROUTE, LIST_STORED_SKILLS_ROUTE, PUBLISH_STORED_SKILL_ROUTE, UPDATE_STORED_SKILL_ROUTE } from '../../chunk-PC73QIVI.js';
export { CREATE_STORED_SKILL_ROUTE, DELETE_STORED_SKILL_ROUTE, GET_STORED_SKILL_ROUTE, LIST_STORED_SKILLS_ROUTE, PUBLISH_STORED_SKILL_ROUTE, UPDATE_STORED_SKILL_ROUTE } from '../../chunk-TS5QYSEZ.js';
//# sourceMappingURL=stored-skills.js.map
//# sourceMappingURL=stored-skills.js.map
'use strict';
var chunkXLQY5MPS_cjs = require('../../chunk-XLQY5MPS.cjs');
var chunkE2EYPHRE_cjs = require('../../chunk-E2EYPHRE.cjs');

@@ -9,9 +9,9 @@

enumerable: true,
get: function () { return chunkXLQY5MPS_cjs.GET_API_SCHEMA_ROUTE; }
get: function () { return chunkE2EYPHRE_cjs.GET_API_SCHEMA_ROUTE; }
});
Object.defineProperty(exports, "GET_SYSTEM_PACKAGES_ROUTE", {
enumerable: true,
get: function () { return chunkXLQY5MPS_cjs.GET_SYSTEM_PACKAGES_ROUTE; }
get: function () { return chunkE2EYPHRE_cjs.GET_SYSTEM_PACKAGES_ROUTE; }
});
//# sourceMappingURL=system.cjs.map
//# sourceMappingURL=system.cjs.map

@@ -1,3 +0,3 @@

export { GET_API_SCHEMA_ROUTE, GET_SYSTEM_PACKAGES_ROUTE } from '../../chunk-Q5RXMLH2.js';
export { GET_API_SCHEMA_ROUTE, GET_SYSTEM_PACKAGES_ROUTE } from '../../chunk-7HMXQIPK.js';
//# sourceMappingURL=system.js.map
//# sourceMappingURL=system.js.map
'use strict';
var chunkRWW6SPX2_cjs = require('../../chunk-RWW6SPX2.cjs');
var chunkUITLSJUW_cjs = require('../../chunk-UITLSJUW.cjs');

@@ -9,21 +9,21 @@

enumerable: true,
get: function () { return chunkRWW6SPX2_cjs.EXECUTE_AGENT_TOOL_ROUTE; }
get: function () { return chunkUITLSJUW_cjs.EXECUTE_AGENT_TOOL_ROUTE; }
});
Object.defineProperty(exports, "EXECUTE_TOOL_ROUTE", {
enumerable: true,
get: function () { return chunkRWW6SPX2_cjs.EXECUTE_TOOL_ROUTE; }
get: function () { return chunkUITLSJUW_cjs.EXECUTE_TOOL_ROUTE; }
});
Object.defineProperty(exports, "GET_AGENT_TOOL_ROUTE", {
enumerable: true,
get: function () { return chunkRWW6SPX2_cjs.GET_AGENT_TOOL_ROUTE; }
get: function () { return chunkUITLSJUW_cjs.GET_AGENT_TOOL_ROUTE; }
});
Object.defineProperty(exports, "GET_TOOL_BY_ID_ROUTE", {
enumerable: true,
get: function () { return chunkRWW6SPX2_cjs.GET_TOOL_BY_ID_ROUTE; }
get: function () { return chunkUITLSJUW_cjs.GET_TOOL_BY_ID_ROUTE; }
});
Object.defineProperty(exports, "LIST_TOOLS_ROUTE", {
enumerable: true,
get: function () { return chunkRWW6SPX2_cjs.LIST_TOOLS_ROUTE; }
get: function () { return chunkUITLSJUW_cjs.LIST_TOOLS_ROUTE; }
});
//# sourceMappingURL=tools.cjs.map
//# sourceMappingURL=tools.cjs.map

@@ -1,3 +0,3 @@

export { EXECUTE_AGENT_TOOL_ROUTE, EXECUTE_TOOL_ROUTE, GET_AGENT_TOOL_ROUTE, GET_TOOL_BY_ID_ROUTE, LIST_TOOLS_ROUTE } from '../../chunk-T3T23PHF.js';
export { EXECUTE_AGENT_TOOL_ROUTE, EXECUTE_TOOL_ROUTE, GET_AGENT_TOOL_ROUTE, GET_TOOL_BY_ID_ROUTE, LIST_TOOLS_ROUTE } from '../../chunk-F5EEKLC4.js';
//# sourceMappingURL=tools.js.map
//# sourceMappingURL=tools.js.map

@@ -1,27 +0,21 @@

export { SKILL_ORIGIN_METADATA_KEY, buildOriginMetadata, createStoredSkillBodySchema, createStoredSkillResponseSchema, deleteStoredSkillResponseSchema, getStoredSkillResponseSchema, listStoredSkillsQuerySchema, listStoredSkillsResponseSchema, publishStoredSkillBodySchema, publishStoredSkillResponseSchema, readSkillOrigin, skillOriginSchema, storedSkillIdPathParams, storedSkillSchema, updateStoredSkillBodySchema, updateStoredSkillResponseSchema } from '../../chunk-UIRQU4GW.js';
export { apiSchemaManifestResponseSchema, apiSchemaManifestRouteSchema, apiSchemaResponseShapeSchema, editorSourceCapabilitiesSchema, editorSourceSchema, mastraPackageSchema, observabilityRuntimeStrategySchema, systemPackagesResponseSchema } from '../../chunk-ZA2G7XV3.js';
export { activateScorerVersionResponseSchema, compareScorerVersionsQuerySchema, compareScorerVersionsResponseSchema, createScorerVersionBodySchema, createScorerVersionResponseSchema, deleteScorerVersionResponseSchema, getScorerVersionResponseSchema, listScorerVersionsQuerySchema, listScorerVersionsResponseSchema, restoreScorerVersionResponseSchema, scorerVersionIdPathParams, scorerVersionPathParams, scorerVersionSchema } from '../../chunk-VK3T6KKQ.js';
export { createStoredMCPClientBodySchema, createStoredMCPClientResponseSchema, deleteStoredMCPClientResponseSchema, getStoredMCPClientResponseSchema, listStoredMCPClientsQuerySchema, listStoredMCPClientsResponseSchema, storedMCPClientIdPathParams, storedMCPClientSchema, updateStoredMCPClientBodySchema, updateStoredMCPClientResponseSchema } from '../../chunk-K6WBL3KZ.js';
export { createStoredPromptBlockBodySchema, createStoredPromptBlockResponseSchema, deleteStoredPromptBlockResponseSchema, getStoredPromptBlockResponseSchema, listStoredPromptBlocksQuerySchema, listStoredPromptBlocksResponseSchema, storedPromptBlockIdPathParams, storedPromptBlockSchema, updateStoredPromptBlockBodySchema, updateStoredPromptBlockResponseSchema } from '../../chunk-BUFXUC67.js';
export { createStoredScorerBodySchema, createStoredScorerResponseSchema, deleteStoredScorerResponseSchema, getStoredScorerResponseSchema, listStoredScorersQuerySchema, listStoredScorersResponseSchema, storedScorerIdPathParams, storedScorerSchema, updateStoredScorerBodySchema, updateStoredScorerResponseSchema } from '../../chunk-XJ7WQBFW.js';
export { getProcessorProviderResponseSchema, getProcessorProvidersResponseSchema, processorProviderIdPathParams } from '../../chunk-SJOVDYRT.js';
export { SKILL_ORIGIN_METADATA_KEY, buildOriginMetadata, createStoredSkillBodySchema, createStoredSkillResponseSchema, deleteStoredSkillResponseSchema, getStoredSkillResponseSchema, listStoredSkillsQuerySchema, listStoredSkillsResponseSchema, publishStoredSkillBodySchema, publishStoredSkillResponseSchema, readSkillOrigin, skillOriginSchema, storedSkillIdPathParams, storedSkillSchema, updateStoredSkillBodySchema, updateStoredSkillResponseSchema } from '../../chunk-UIRQU4GW.js';
export { executeProcessorBodySchema, executeProcessorResponseSchema, listProcessorsResponseSchema, processorConfigurationSchema, processorIdPathParams, serializedProcessorSchema as processorSerializedSchema, serializedProcessorDetailSchema } from '../../chunk-2R5GLZJD.js';
export { activatePromptBlockVersionResponseSchema, comparePromptBlockVersionsQuerySchema, comparePromptBlockVersionsResponseSchema, createPromptBlockVersionBodySchema, createPromptBlockVersionResponseSchema, deletePromptBlockVersionResponseSchema, getPromptBlockVersionResponseSchema, listPromptBlockVersionsQuerySchema, listPromptBlockVersionsResponseSchema, promptBlockVersionIdPathParams, promptBlockVersionPathParams, promptBlockVersionSchema, restorePromptBlockVersionResponseSchema } from '../../chunk-3BLT6ISZ.js';
export { activateMCPClientVersionResponseSchema, compareMCPClientVersionsQuerySchema, compareMCPClientVersionsResponseSchema, createMCPClientVersionBodySchema, createMCPClientVersionResponseSchema, deleteMCPClientVersionResponseSchema, getMCPClientVersionResponseSchema, listMCPClientVersionsQuerySchema, listMCPClientVersionsResponseSchema, mcpClientVersionIdPathParams, mcpClientVersionPathParams, mcpClientVersionSchema, restoreMCPClientVersionResponseSchema } from '../../chunk-EFJIK2PW.js';
export { activateScorerVersionResponseSchema, compareScorerVersionsQuerySchema, compareScorerVersionsResponseSchema, createScorerVersionBodySchema, createScorerVersionResponseSchema, deleteScorerVersionResponseSchema, getScorerVersionResponseSchema, listScorerVersionsQuerySchema, listScorerVersionsResponseSchema, restoreScorerVersionResponseSchema, scorerVersionIdPathParams, scorerVersionPathParams, scorerVersionSchema } from '../../chunk-VK3T6KKQ.js';
export { getProcessorProviderResponseSchema, getProcessorProvidersResponseSchema, processorProviderIdPathParams } from '../../chunk-SJOVDYRT.js';
export { addItemBodySchema, batchDeleteItemsBodySchema, batchDeleteItemsResponseSchema, batchInsertItemsBodySchema, batchInsertItemsResponseSchema, clusterFailuresBodySchema, clusterFailuresResponseSchema, compareExperimentsBodySchema, comparisonResponseSchema, createDatasetBodySchema, datasetAndExperimentIdPathParams, datasetAndItemIdPathParams, datasetIdPathParams, datasetItemResponseSchema, datasetItemVersionPathParams, datasetResponseSchema, datasetVersionResponseSchema, experimentIdPathParams, experimentResponseSchema, experimentResultIdPathParams, experimentResultResponseSchema, experimentReviewCountsSchema, experimentSummaryResponseSchema, generateItemsBodySchema, generateItemsResponseSchema, itemIdPathParams, itemVersionResponseSchema, listDatasetVersionsResponseSchema, listDatasetsResponseSchema, listExperimentResultsResponseSchema, listExperimentsResponseSchema, listItemVersionsResponseSchema, listItemsQuerySchema, listItemsResponseSchema, paginationQuerySchema, reviewSummaryResponseSchema, scorerResultSchema, triggerExperimentBodySchema, updateDatasetBodySchema, updateExperimentResultBodySchema, updateItemBodySchema } from '../../chunk-X7KQ23MW.js';
export { agentConfigurationSchema, agentFeaturesSchema, agentModelsSchema, builderAvailableModelsResponseSchema, builderModelPolicySchema, builderPickerSchema, builderSettingsResponseSchema, defaultModelEntrySchema, infrastructureStatusResponseSchema, pickerAllowlistSchema, providerModelEntrySchema } from '../../chunk-4BJSE3LM.js';
export { agentVersionPathParams, agentVersionSchema, compareVersionsResponseSchema, createVersionResponseSchema, getVersionResponseSchema, listVersionsResponseSchema, restoreVersionResponseSchema, versionIdPathParams } from '../../chunk-ONDWDP2S.js';
export { activateVersionResponseSchema, compareVersionsQuerySchema, createCompareVersionsResponseSchema, createListVersionsResponseSchema, createVersionBodySchema, deleteVersionResponseSchema, listVersionsQuerySchema, versionDiffEntrySchema, versionOrderBySchema } from '../../chunk-3OQMTFIV.js';
export { activateMCPClientVersionResponseSchema, compareMCPClientVersionsQuerySchema, compareMCPClientVersionsResponseSchema, createMCPClientVersionBodySchema, createMCPClientVersionResponseSchema, deleteMCPClientVersionResponseSchema, getMCPClientVersionResponseSchema, listMCPClientVersionsQuerySchema, listMCPClientVersionsResponseSchema, mcpClientVersionIdPathParams, mcpClientVersionPathParams, mcpClientVersionSchema, restoreMCPClientVersionResponseSchema } from '../../chunk-EFJIK2PW.js';
export { createIndexBodySchema, createIndexResponseSchema, deleteIndexResponseSchema, describeIndexResponseSchema, listEmbeddersResponseSchema, listIndexesResponseSchema, listVectorsResponseSchema, queryVectorsBodySchema, queryVectorsResponseSchema, upsertVectorsBodySchema, upsertVectorsResponseSchema, vectorIndexPathParams, vectorNamePathParams } from '../../chunk-RVICRXZF.js';
export { entityPathParams, listScorersResponseSchema, listScoresByEntityIdQuerySchema, listScoresByRunIdQuerySchema, listScoresByScorerIdQuerySchema, saveScoreBodySchema, saveScoreResponseSchema, scorerEntrySchema, scorerIdPathParams, scoresWithPaginationResponseSchema } from '../../chunk-OC4S3EDO.js';
export { getMcpServerDetailQuerySchema, jsonRpcErrorSchema, listMcpServerToolsResponseSchema, listMcpServersQuerySchema, listMcpServersResponseSchema, executeToolBodySchema as mcpExecuteToolBodySchema, executeToolResponseSchema as mcpExecuteToolResponseSchema, mcpServerDetailPathParams, mcpServerIdPathParams, mcpServerToolPathParams, mcpToolInfoSchema, serverDetailSchema, serverInfoSchema, versionDetailSchema } from '../../chunk-356JZOB2.js';
export { listLogTransportsResponseSchema, listLogsQuerySchema, listLogsResponseSchema } from '../../chunk-MXZPGEC2.js';
export { conversationDeletedSchema, conversationIdPathParams, conversationItemsListSchema, conversationObjectSchema, createConversationBodySchema } from '../../chunk-WOE6XG6B.js';
export { conversationItemMessageSchema, conversationItemSchema, conversationMessageContentSchema, createResponseBodySchema, deleteResponseSchema, responseIdPathParams, responseInputMessageSchema, responseInputTextContentSchema, responseInputTextPartSchema, responseObjectSchema, responseOutputFunctionCallOutputSchema, responseOutputFunctionCallSchema, responseOutputItemSchema, responseOutputMessageSchema, responseOutputTextSchema, responseTextFormatSchema, responseToolSchema, responseUsageSchema } from '../../chunk-BIUL4Y6W.js';
export { agentIdQuerySchema, awaitBufferStatusBodySchema, awaitBufferStatusResponseSchema, cloneThreadBodySchema, cloneThreadResponseSchema, createThreadBodySchema, createThreadNetworkQuerySchema, deleteMessagesBodySchema, deleteMessagesNetworkQuerySchema, deleteMessagesQuerySchema, deleteMessagesResponseSchema, deleteThreadNetworkQuerySchema, deleteThreadQuerySchema, deleteThreadResponseSchema, getMemoryConfigQuerySchema, getMemoryStatusNetworkQuerySchema, getMemoryStatusQuerySchema, getObservationalMemoryQuerySchema, getObservationalMemoryResponseSchema, getThreadByIdNetworkQuerySchema, getThreadByIdQuerySchema, getThreadByIdResponseSchema, getWorkingMemoryQuerySchema, getWorkingMemoryResponseSchema, listMessagesNetworkQuerySchema, listMessagesQuerySchema, listMessagesResponseSchema, listThreadsNetworkQuerySchema, listThreadsQuerySchema, listThreadsResponseSchema, memoryConfigResponseSchema, memoryStatusResponseSchema, optionalAgentIdQuerySchema, saveMessagesBodySchema, saveMessagesNetworkQuerySchema, saveMessagesResponseSchema, searchMemoryQuerySchema, searchMemoryResponseSchema, threadIdPathParams, updateThreadBodySchema, updateThreadNetworkQuerySchema, updateWorkingMemoryBodySchema, updateWorkingMemoryResponseSchema } from '../../chunk-UZKVYNYR.js';
export { listLogTransportsResponseSchema, listLogsQuerySchema, listLogsResponseSchema } from '../../chunk-MXZPGEC2.js';
export { agentExecutionBodySchema as a2aAgentExecutionBodySchema, a2aAgentIdPathParams, a2aTaskPathParams, agentCardResponseSchema, agentExecutionResponseSchema, messageSendBodySchema, taskQueryBodySchema, taskResponseSchema } from '../../chunk-KEE6UMGC.js';
export { conditionalFieldSchema, createStoredAgentBodySchema, createStoredAgentResponseSchema, deleteStoredAgentResponseSchema, exportStoredAgentBodySchema, exportStoredAgentResponseSchema, getStoredAgentDependentsResponseSchema, getStoredAgentResponseSchema, instructionsSchema, listStoredAgentsQuerySchema, listStoredAgentsResponseSchema, modelConfigSchema, openStoredAgentChangeRequestBodySchema, openStoredAgentChangeRequestResponseSchema, previewInstructionsBodySchema, previewInstructionsResponseSchema, processorGraphEntrySchema, processorGraphStepSchema, processorPhaseSchema, resolvedAuthorSchema, scorerConfigSchema, semanticRecallSchema, serializedMemoryConfigSchema, serializedObservationConfigSchema, serializedObservationalMemoryConfigObjectSchema, serializedObservationalMemoryConfigSchema, serializedReflectionConfigSchema, snapshotConfigSchema, storedAgentIdPathParams, storedAgentSchema, storedProcessorGraphSchema, titleGenerationSchema, toolConfigSchema, toolsConfigSchema, updateStoredAgentBodySchema, updateStoredAgentResponseSchema } from '../../chunk-SPVKRK56.js';
export { createStoredWorkspaceBodySchema, createStoredWorkspaceResponseSchema, deleteStoredWorkspaceResponseSchema, getStoredWorkspaceResponseSchema, listStoredWorkspacesQuerySchema, listStoredWorkspacesResponseSchema, storedWorkspaceIdPathParams, storedWorkspaceSchema, updateStoredWorkspaceBodySchema, updateStoredWorkspaceResponseSchema, snapshotConfigSchema as workspaceSnapshotConfigSchema } from '../../chunk-64QFFUEH.js';
export { authStatusToolProviderResponseSchema, authorizeToolProviderBodySchema, authorizeToolProviderResponseSchema, connectionSchema, connectionScopeSchema, connectionStatusToolProviderBodySchema, connectionStatusToolProviderResponseSchema, connectionUsageQuerySchema, connectionUsageResponseSchema, disconnectConnectionQuerySchema, disconnectConnectionResponseSchema, getToolProviderToolSchemaResponseSchema, listConnectionFieldsQuerySchema, listConnectionFieldsResponseSchema, listConnectionsQuerySchema, listConnectionsResponseSchema, listToolProviderToolkitsResponseSchema, listToolProviderToolsQuerySchema, listToolProviderToolsResponseSchema, listToolProvidersResponseSchema, toolProviderAuthStatusPathParams, toolProviderConfigSchema, toolProviderConnectionPathParams, toolProviderHealthResponseSchema, toolProviderIdPathParams, toolProvidersSchema, toolSlugPathParams, updateConnectionBodySchema, updateConnectionResponseSchema } from '../../chunk-SFAWHLOX.js';
export { ruleGroupSchema, ruleSchema } from '../../chunk-JA4UAHWP.js';
export { authenticatedCapabilitiesSchema, authenticatedUserSchema, capabilitiesResponseSchema, capabilityFlagsSchema, credentialsResponseSchema, credentialsSignInBodySchema, credentialsSignUpBodySchema, currentUserResponseSchema, loginConfigSchema, logoutResponseSchema, permissionPatternsResponseSchema, publicCapabilitiesSchema, refreshResponseSchema, ssoCallbackQuerySchema, ssoCallbackResponseSchema, ssoConfigSchema, ssoLoginQuerySchema, ssoLoginResponseSchema, userAccessSchema } from '../../chunk-LWA65ME7.js';

@@ -33,2 +27,8 @@ export { fileEntrySchema, fsDeleteQuerySchema, fsDeleteResponseSchema, fsListQuerySchema, fsListResponseSchema, fsMkdirBodySchema, fsMkdirResponseSchema, fsPathParams, fsReadQuerySchema, fsReadResponseSchema, fsStatQuerySchema, fsStatResponseSchema, fsWriteBodySchema, fsWriteResponseSchema, getAgentSkillResponseSchema, getSkillResponseSchema, indexBodySchema, indexResponseSchema, listReferencesResponseSchema, listSkillsResponseSchema, listWorkspacesResponseSchema, mountInfoSchema, searchQuerySchema, searchResponseSchema, searchResultSchema, searchSkillsQuerySchema, searchSkillsResponseSchema, skillDisambiguationQuerySchema, skillMetadataSchema, skillMetadataWithPathSchema, skillNamePathParams, skillReferencePathParams, skillReferenceResponseSchema, skillSchema, skillSearchResultSchema, skillSourceSchema, skillsShInstallBodySchema, skillsShInstallResponseSchema, skillsShListResponseSchema, skillsShPopularQuerySchema, skillsShPreviewQuerySchema, skillsShPreviewResponseSchema, skillsShRemoveBodySchema, skillsShRemoveResponseSchema, skillsShSearchQuerySchema, skillsShSearchResponseSchema, skillsShSkillSchema, skillsShSourceSchema, skillsShUpdateBodySchema, skillsShUpdateResponseSchema, workspaceIdPathParams, workspaceInfoResponseSchema } from '../../chunk-ZHULRNJG.js';

export { generateSpeechBodySchema, getListenerResponseSchema, speakResponseSchema, transcribeSpeechBodySchema, transcribeSpeechResponseSchema, voiceSpeakersResponseSchema } from '../../chunk-LPT77UR6.js';
export { agentVersionPathParams, agentVersionSchema, compareVersionsResponseSchema, createVersionResponseSchema, getVersionResponseSchema, listVersionsResponseSchema, restoreVersionResponseSchema, versionIdPathParams } from '../../chunk-ONDWDP2S.js';
export { activateVersionResponseSchema, compareVersionsQuerySchema, createCompareVersionsResponseSchema, createListVersionsResponseSchema, createVersionBodySchema, deleteVersionResponseSchema, listVersionsQuerySchema, versionDiffEntrySchema, versionOrderBySchema } from '../../chunk-3OQMTFIV.js';
export { conditionalFieldSchema, createStoredAgentBodySchema, createStoredAgentResponseSchema, deleteStoredAgentResponseSchema, exportStoredAgentBodySchema, exportStoredAgentResponseSchema, getStoredAgentDependentsResponseSchema, getStoredAgentResponseSchema, instructionsSchema, listStoredAgentsQuerySchema, listStoredAgentsResponseSchema, modelConfigSchema, openStoredAgentChangeRequestBodySchema, openStoredAgentChangeRequestResponseSchema, previewInstructionsBodySchema, previewInstructionsResponseSchema, processorGraphEntrySchema, processorGraphStepSchema, processorPhaseSchema, resolvedAuthorSchema, scorerConfigSchema, semanticRecallSchema, serializedMemoryConfigSchema, serializedObservationConfigSchema, serializedObservationalMemoryConfigObjectSchema, serializedObservationalMemoryConfigSchema, serializedReflectionConfigSchema, snapshotConfigSchema, storedAgentIdPathParams, storedAgentSchema, storedProcessorGraphSchema, titleGenerationSchema, toolConfigSchema, toolsConfigSchema, updateStoredAgentBodySchema, updateStoredAgentResponseSchema } from '../../chunk-SPVKRK56.js';
export { createStoredWorkspaceBodySchema, createStoredWorkspaceResponseSchema, deleteStoredWorkspaceResponseSchema, getStoredWorkspaceResponseSchema, listStoredWorkspacesQuerySchema, listStoredWorkspacesResponseSchema, storedWorkspaceIdPathParams, storedWorkspaceSchema, updateStoredWorkspaceBodySchema, updateStoredWorkspaceResponseSchema, snapshotConfigSchema as workspaceSnapshotConfigSchema } from '../../chunk-64QFFUEH.js';
export { authStatusToolProviderResponseSchema, authorizeToolProviderBodySchema, authorizeToolProviderResponseSchema, connectionSchema, connectionScopeSchema, connectionStatusToolProviderBodySchema, connectionStatusToolProviderResponseSchema, connectionUsageQuerySchema, connectionUsageResponseSchema, disconnectConnectionQuerySchema, disconnectConnectionResponseSchema, getToolProviderToolSchemaResponseSchema, listConnectionFieldsQuerySchema, listConnectionFieldsResponseSchema, listConnectionsQuerySchema, listConnectionsResponseSchema, listToolProviderToolkitsResponseSchema, listToolProviderToolsQuerySchema, listToolProviderToolsResponseSchema, listToolProvidersResponseSchema, toolProviderAuthStatusPathParams, toolProviderConfigSchema, toolProviderConnectionPathParams, toolProviderHealthResponseSchema, toolProviderIdPathParams, toolProvidersSchema, toolSlugPathParams, updateConnectionBodySchema, updateConnectionResponseSchema } from '../../chunk-SFAWHLOX.js';
export { ruleGroupSchema, ruleSchema } from '../../chunk-JA4UAHWP.js';
export { defaultOptionsSchema } from '../../chunk-TKP6FJQ3.js';

@@ -35,0 +35,0 @@ export { baseLogMessageSchema, coreMessageSchema, createCombinedPaginationSchema, createPagePaginationSchema, messageResponseSchema, optionalRunIdSchema, paginationInfoSchema, partialQuerySchema, runIdSchema, statusQuerySchema, successResponseSchema, tracingOptionsSchema } from '../../chunk-2YY3EMMS.js';

'use strict';
var chunk2BGZ3WEG_cjs = require('../../chunk-2BGZ3WEG.cjs');
var chunk2CLXY7EU_cjs = require('../../chunk-2CLXY7EU.cjs');
var chunk4PQR3D5Y_cjs = require('../../chunk-4PQR3D5Y.cjs');

@@ -66,3 +66,3 @@ var chunkGZ4HWZWE_cjs = require('../../chunk-GZ4HWZWE.cjs');

}
const permission = chunk2BGZ3WEG_cjs.getEffectivePermission(route);
const permission = chunk2CLXY7EU_cjs.getEffectivePermission(route);
if (!permission) {

@@ -281,3 +281,3 @@ return null;

function getRoutePermissions(route) {
return [chunk2BGZ3WEG_cjs.getEffectivePermission(route), route.fga?.permission].flatMap((value) => Array.isArray(value) ? value : [value]).filter((permission) => Boolean(permission));
return [chunk2CLXY7EU_cjs.getEffectivePermission(route), route.fga?.permission].flatMap((value) => Array.isArray(value) ? value : [value]).filter((permission) => Boolean(permission));
}

@@ -616,3 +616,3 @@ async function resolveRouteFGAConfig(fgaProvider, route, requestContext, params) {

}
const requiredPermission = chunk2BGZ3WEG_cjs.getEffectivePermission(route);
const requiredPermission = chunk2CLXY7EU_cjs.getEffectivePermission(route);
if (!requiredPermission) {

@@ -710,3 +710,3 @@ return null;

);
const routes = [...chunk2BGZ3WEG_cjs.SERVER_ROUTES, ...customRoutes];
const routes = [...chunk2CLXY7EU_cjs.SERVER_ROUTES, ...customRoutes];
if (fgaProvider.validatePermissions) {

@@ -883,3 +883,3 @@ const permissions = [...new Set(routes.flatMap((route) => getRoutePermissions(route)))];

buildOpenAPISpec(config, prefix) {
const openApiSpec = chunkG54X6VE6_cjs.generateOpenAPIDocument(chunk2BGZ3WEG_cjs.SERVER_ROUTES, config);
const openApiSpec = chunkG54X6VE6_cjs.generateOpenAPIDocument(chunk2CLXY7EU_cjs.SERVER_ROUTES, config);
if (prefix) {

@@ -919,3 +919,3 @@ openApiSpec.servers = [{ url: prefix }];

async registerRoutes() {
for (const route of chunk2BGZ3WEG_cjs.SERVER_ROUTES) {
for (const route of chunk2CLXY7EU_cjs.SERVER_ROUTES) {
await this.registerRoute(this.app, route, { prefix: this.prefix });

@@ -1009,3 +1009,3 @@ }

}
const effectivePermission = route.path ? chunk2BGZ3WEG_cjs.getEffectivePermission(route) : null;
const effectivePermission = route.path ? chunk2CLXY7EU_cjs.getEffectivePermission(route) : null;
const permission = fgaConfig.permission || effectivePermission || `${getFGAResourcePermissionSlug(fgaConfig.resourceType)}:${deriveFGAAction(route.method)}`;

@@ -1052,19 +1052,19 @@ const authorized = await fgaProvider.check(user, {

enumerable: true,
get: function () { return chunk2BGZ3WEG_cjs.SERVER_ROUTES; }
get: function () { return chunk2CLXY7EU_cjs.SERVER_ROUTES; }
});
Object.defineProperty(exports, "deriveAction", {
enumerable: true,
get: function () { return chunk2BGZ3WEG_cjs.deriveAction; }
get: function () { return chunk2CLXY7EU_cjs.deriveAction; }
});
Object.defineProperty(exports, "derivePermission", {
enumerable: true,
get: function () { return chunk2BGZ3WEG_cjs.derivePermission; }
get: function () { return chunk2CLXY7EU_cjs.derivePermission; }
});
Object.defineProperty(exports, "extractResource", {
enumerable: true,
get: function () { return chunk2BGZ3WEG_cjs.extractResource; }
get: function () { return chunk2CLXY7EU_cjs.extractResource; }
});
Object.defineProperty(exports, "getEffectivePermission", {
enumerable: true,
get: function () { return chunk2BGZ3WEG_cjs.getEffectivePermission; }
get: function () { return chunk2CLXY7EU_cjs.getEffectivePermission; }
});

@@ -1071,0 +1071,0 @@ Object.defineProperty(exports, "WorkflowRegistry", {

@@ -1,3 +0,3 @@

import { getEffectivePermission, SERVER_ROUTES } from '../../chunk-YI5CKY7A.js';
export { SERVER_ROUTES, deriveAction, derivePermission, extractResource, getEffectivePermission } from '../../chunk-YI5CKY7A.js';
import { getEffectivePermission, SERVER_ROUTES } from '../../chunk-FYBFIW5N.js';
export { SERVER_ROUTES, deriveAction, derivePermission, extractResource, getEffectivePermission } from '../../chunk-FYBFIW5N.js';
import { coreAuthMiddleware } from '../../chunk-HATXNJ4V.js';

@@ -4,0 +4,0 @@ import { normalizeRoutePath } from '../../chunk-IBUJJIRW.js';

{
"name": "@mastra/server",
"version": "1.46.0-alpha.5",
"version": "1.46.0",
"description": "",

@@ -119,10 +119,10 @@ "type": "module",

"@internal/core": "0.1.0",
"@internal/types-builder": "0.0.82",
"@internal/test-utils": "0.0.43",
"@mastra/agent-builder": "1.1.1-alpha.1",
"@internal/voice": "0.0.7",
"@internal/lint": "0.0.107",
"@internal/lint": "0.0.108",
"@internal/storage-test-utils": "0.0.104",
"@internal/types-builder": "0.0.83",
"@internal/voice": "0.0.8",
"@mastra/agent-builder": "1.1.1",
"@mastra/core": "1.46.0",
"@mastra/schema-compat": "1.3.0",
"@mastra/core": "1.46.0-alpha.5",
"@internal/storage-test-utils": "0.0.103"
"@internal/test-utils": "0.0.44"
},

@@ -129,0 +129,0 @@ "homepage": "https://mastra.ai",

'use strict';
var chunk2BGZ3WEG_cjs = require('./chunk-2BGZ3WEG.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
// src/server/server-adapter/api-schema-manifest.ts
function convertSchema(schema) {
return schema ? chunkG54X6VE6_cjs.schemaToJsonSchema(schema) : void 0;
}
function asJsonSchema(value) {
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
}
function schemaType(schema) {
const type = schema?.type;
return Array.isArray(type) ? type.find(Boolean) : type;
}
function inferResponseShape(responseSchema) {
if (!responseSchema) return { kind: "unknown" };
const type = schemaType(responseSchema);
if (type === "array") return { kind: "array" };
if (type !== "object") return { kind: "single" };
const properties = responseSchema.properties && !Array.isArray(responseSchema.properties) ? responseSchema.properties : {};
const propertyNames = Object.keys(properties);
const paginationProperty = "page" in properties ? "page" : "pagination" in properties ? "pagination" : void 0;
const listProperty = Object.entries(properties).find(
([, property]) => schemaType(asJsonSchema(property)) === "array"
)?.[0];
if (listProperty && (paginationProperty || propertyNames.length <= 2)) {
return { kind: "object-property", listProperty, paginationProperty };
}
if (responseSchema.additionalProperties && propertyNames.length === 0) return { kind: "record" };
return { kind: "single" };
}
function isManifestRoute(route) {
return route.responseType === "json" && !route.deprecated;
}
function buildApiSchemaManifest(routes = chunk2BGZ3WEG_cjs.SERVER_ROUTES) {
return {
version: 1,
routes: routes.filter(isManifestRoute).map((route) => {
const responseSchema = convertSchema(route.responseSchema);
return {
method: route.method,
path: route.path,
responseType: route.responseType,
pathParamSchema: convertSchema(route.pathParamSchema),
queryParamSchema: convertSchema(route.queryParamSchema),
bodySchema: convertSchema(route.bodySchema),
responseSchema,
responseShape: inferResponseShape(responseSchema)
};
})
};
}
exports.buildApiSchemaManifest = buildApiSchemaManifest;
//# sourceMappingURL=api-schema-manifest-3PMRQVN5.cjs.map
//# sourceMappingURL=api-schema-manifest-3PMRQVN5.cjs.map
{"version":3,"sources":["../src/server/server-adapter/api-schema-manifest.ts"],"names":["schemaToJsonSchema","SERVER_ROUTES"],"mappings":";;;;;;AA2BA,SAAS,cAAc,MAAA,EAA4D;AACjF,EAAA,OAAO,MAAA,GAASA,oCAAA,CAAmB,MAAM,CAAA,GAAI,MAAA;AAC/C;AAEA,SAAS,aAAa,KAAA,EAAyC;AAC7D,EAAA,OAAO,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,KAAA,GAAwB,MAAA;AAChG;AAEA,SAAS,WAAW,MAAA,EAAkE;AACpF,EAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,EAAA,OAAO,MAAM,OAAA,CAAQ,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA;AACpD;AAEA,SAAS,mBAAmB,cAAA,EAAiE;AAC3F,EAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAE,MAAM,SAAA,EAAU;AAE9C,EAAA,MAAM,IAAA,GAAO,WAAW,cAAc,CAAA;AACtC,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,EAAE,MAAM,OAAA,EAAQ;AAC7C,EAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAE/C,EAAA,MAAM,UAAA,GACJ,cAAA,CAAe,UAAA,IAAc,CAAC,KAAA,CAAM,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA,GAAI,cAAA,CAAe,UAAA,GAAa,EAAC;AACxG,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC5C,EAAA,MAAM,qBAAqB,MAAA,IAAU,UAAA,GAAa,MAAA,GAAS,YAAA,IAAgB,aAAa,YAAA,GAAe,MAAA;AACvG,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAA;AAAA,IAC9C,CAAC,GAAG,QAAQ,MAAM,UAAA,CAAW,YAAA,CAAa,QAAQ,CAAC,CAAA,KAAM;AAAA,MACvD,CAAC,CAAA;AAEL,EAAA,IAAI,YAAA,KAAiB,kBAAA,IAAsB,aAAA,CAAc,MAAA,IAAU,CAAA,CAAA,EAAI;AACrE,IAAA,OAAO,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAA,EAAc,kBAAA,EAAmB;AAAA,EACrE;AACA,EAAA,IAAI,cAAA,CAAe,wBAAwB,aAAA,CAAc,MAAA,KAAW,GAAG,OAAO,EAAE,MAAM,QAAA,EAAS;AAC/F,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AAEA,SAAS,gBAAgB,KAAA,EAA6B;AACpD,EAAA,OAAO,KAAA,CAAM,YAAA,KAAiB,MAAA,IAAU,CAAC,KAAA,CAAM,UAAA;AACjD;AAEO,SAAS,sBAAA,CAAuB,SAAiCC,+BAAA,EAAkC;AACxG,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,QAAQ,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAE,IAAI,CAAA,KAAA,KAAS;AAClD,MAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,cAAc,CAAA;AACzD,MAAA,OAAO;AAAA,QACL,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,eAAA,EAAiB,aAAA,CAAc,KAAA,CAAM,eAAe,CAAA;AAAA,QACpD,gBAAA,EAAkB,aAAA,CAAc,KAAA,CAAM,gBAAgB,CAAA;AAAA,QACtD,UAAA,EAAY,aAAA,CAAc,KAAA,CAAM,UAAU,CAAA;AAAA,QAC1C,cAAA;AAAA,QACA,aAAA,EAAe,mBAAmB,cAAc;AAAA,OAClD;AAAA,IACF,CAAC;AAAA,GACH;AACF","file":"api-schema-manifest-3PMRQVN5.cjs","sourcesContent":["import type { JSONSchema7 } from '@mastra/schema-compat';\nimport { schemaToJsonSchema } from './openapi-utils';\nimport { SERVER_ROUTES } from './routes/index';\nimport type { ServerRoute } from './routes/index';\n\nexport interface ApiSchemaResponseShape {\n kind: 'array' | 'record' | 'object-property' | 'single' | 'unknown';\n listProperty?: string;\n paginationProperty?: string;\n}\n\nexport interface ApiSchemaManifestRoute {\n method: string;\n path: string;\n responseType: string;\n pathParamSchema?: JSONSchema7;\n queryParamSchema?: JSONSchema7;\n bodySchema?: JSONSchema7;\n responseSchema?: JSONSchema7;\n responseShape: ApiSchemaResponseShape;\n}\n\nexport interface ApiSchemaManifest {\n version: 1;\n routes: ApiSchemaManifestRoute[];\n}\n\nfunction convertSchema(schema: ServerRoute['bodySchema']): JSONSchema7 | undefined {\n return schema ? schemaToJsonSchema(schema) : undefined;\n}\n\nfunction asJsonSchema(value: unknown): JSONSchema7 | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as JSONSchema7) : undefined;\n}\n\nfunction schemaType(schema: JSONSchema7 | undefined): JSONSchema7['type'] | undefined {\n const type = schema?.type;\n return Array.isArray(type) ? type.find(Boolean) : type;\n}\n\nfunction inferResponseShape(responseSchema: JSONSchema7 | undefined): ApiSchemaResponseShape {\n if (!responseSchema) return { kind: 'unknown' };\n\n const type = schemaType(responseSchema);\n if (type === 'array') return { kind: 'array' };\n if (type !== 'object') return { kind: 'single' };\n\n const properties =\n responseSchema.properties && !Array.isArray(responseSchema.properties) ? responseSchema.properties : {};\n const propertyNames = Object.keys(properties);\n const paginationProperty = 'page' in properties ? 'page' : 'pagination' in properties ? 'pagination' : undefined;\n const listProperty = Object.entries(properties).find(\n ([, property]) => schemaType(asJsonSchema(property)) === 'array',\n )?.[0];\n\n if (listProperty && (paginationProperty || propertyNames.length <= 2)) {\n return { kind: 'object-property', listProperty, paginationProperty };\n }\n if (responseSchema.additionalProperties && propertyNames.length === 0) return { kind: 'record' };\n return { kind: 'single' };\n}\n\nfunction isManifestRoute(route: ServerRoute): boolean {\n return route.responseType === 'json' && !route.deprecated;\n}\n\nexport function buildApiSchemaManifest(routes: readonly ServerRoute[] = SERVER_ROUTES): ApiSchemaManifest {\n return {\n version: 1,\n routes: routes.filter(isManifestRoute).map(route => {\n const responseSchema = convertSchema(route.responseSchema);\n return {\n method: route.method,\n path: route.path,\n responseType: route.responseType,\n pathParamSchema: convertSchema(route.pathParamSchema),\n queryParamSchema: convertSchema(route.queryParamSchema),\n bodySchema: convertSchema(route.bodySchema),\n responseSchema,\n responseShape: inferResponseShape(responseSchema),\n };\n }),\n };\n}\n"]}
import { SERVER_ROUTES } from './chunk-YI5CKY7A.js';
import { schemaToJsonSchema } from './chunk-BRC4XSFG.js';
// src/server/server-adapter/api-schema-manifest.ts
function convertSchema(schema) {
return schema ? schemaToJsonSchema(schema) : void 0;
}
function asJsonSchema(value) {
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
}
function schemaType(schema) {
const type = schema?.type;
return Array.isArray(type) ? type.find(Boolean) : type;
}
function inferResponseShape(responseSchema) {
if (!responseSchema) return { kind: "unknown" };
const type = schemaType(responseSchema);
if (type === "array") return { kind: "array" };
if (type !== "object") return { kind: "single" };
const properties = responseSchema.properties && !Array.isArray(responseSchema.properties) ? responseSchema.properties : {};
const propertyNames = Object.keys(properties);
const paginationProperty = "page" in properties ? "page" : "pagination" in properties ? "pagination" : void 0;
const listProperty = Object.entries(properties).find(
([, property]) => schemaType(asJsonSchema(property)) === "array"
)?.[0];
if (listProperty && (paginationProperty || propertyNames.length <= 2)) {
return { kind: "object-property", listProperty, paginationProperty };
}
if (responseSchema.additionalProperties && propertyNames.length === 0) return { kind: "record" };
return { kind: "single" };
}
function isManifestRoute(route) {
return route.responseType === "json" && !route.deprecated;
}
function buildApiSchemaManifest(routes = SERVER_ROUTES) {
return {
version: 1,
routes: routes.filter(isManifestRoute).map((route) => {
const responseSchema = convertSchema(route.responseSchema);
return {
method: route.method,
path: route.path,
responseType: route.responseType,
pathParamSchema: convertSchema(route.pathParamSchema),
queryParamSchema: convertSchema(route.queryParamSchema),
bodySchema: convertSchema(route.bodySchema),
responseSchema,
responseShape: inferResponseShape(responseSchema)
};
})
};
}
export { buildApiSchemaManifest };
//# sourceMappingURL=api-schema-manifest-Z45VRZSJ.js.map
//# sourceMappingURL=api-schema-manifest-Z45VRZSJ.js.map
{"version":3,"sources":["../src/server/server-adapter/api-schema-manifest.ts"],"names":[],"mappings":";;;;AA2BA,SAAS,cAAc,MAAA,EAA4D;AACjF,EAAA,OAAO,MAAA,GAAS,kBAAA,CAAmB,MAAM,CAAA,GAAI,MAAA;AAC/C;AAEA,SAAS,aAAa,KAAA,EAAyC;AAC7D,EAAA,OAAO,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,KAAA,GAAwB,MAAA;AAChG;AAEA,SAAS,WAAW,MAAA,EAAkE;AACpF,EAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,EAAA,OAAO,MAAM,OAAA,CAAQ,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA;AACpD;AAEA,SAAS,mBAAmB,cAAA,EAAiE;AAC3F,EAAA,IAAI,CAAC,cAAA,EAAgB,OAAO,EAAE,MAAM,SAAA,EAAU;AAE9C,EAAA,MAAM,IAAA,GAAO,WAAW,cAAc,CAAA;AACtC,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,EAAE,MAAM,OAAA,EAAQ;AAC7C,EAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAE/C,EAAA,MAAM,UAAA,GACJ,cAAA,CAAe,UAAA,IAAc,CAAC,KAAA,CAAM,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA,GAAI,cAAA,CAAe,UAAA,GAAa,EAAC;AACxG,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC5C,EAAA,MAAM,qBAAqB,MAAA,IAAU,UAAA,GAAa,MAAA,GAAS,YAAA,IAAgB,aAAa,YAAA,GAAe,MAAA;AACvG,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAA;AAAA,IAC9C,CAAC,GAAG,QAAQ,MAAM,UAAA,CAAW,YAAA,CAAa,QAAQ,CAAC,CAAA,KAAM;AAAA,MACvD,CAAC,CAAA;AAEL,EAAA,IAAI,YAAA,KAAiB,kBAAA,IAAsB,aAAA,CAAc,MAAA,IAAU,CAAA,CAAA,EAAI;AACrE,IAAA,OAAO,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAA,EAAc,kBAAA,EAAmB;AAAA,EACrE;AACA,EAAA,IAAI,cAAA,CAAe,wBAAwB,aAAA,CAAc,MAAA,KAAW,GAAG,OAAO,EAAE,MAAM,QAAA,EAAS;AAC/F,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AAEA,SAAS,gBAAgB,KAAA,EAA6B;AACpD,EAAA,OAAO,KAAA,CAAM,YAAA,KAAiB,MAAA,IAAU,CAAC,KAAA,CAAM,UAAA;AACjD;AAEO,SAAS,sBAAA,CAAuB,SAAiC,aAAA,EAAkC;AACxG,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,QAAQ,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAE,IAAI,CAAA,KAAA,KAAS;AAClD,MAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,cAAc,CAAA;AACzD,MAAA,OAAO;AAAA,QACL,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,eAAA,EAAiB,aAAA,CAAc,KAAA,CAAM,eAAe,CAAA;AAAA,QACpD,gBAAA,EAAkB,aAAA,CAAc,KAAA,CAAM,gBAAgB,CAAA;AAAA,QACtD,UAAA,EAAY,aAAA,CAAc,KAAA,CAAM,UAAU,CAAA;AAAA,QAC1C,cAAA;AAAA,QACA,aAAA,EAAe,mBAAmB,cAAc;AAAA,OAClD;AAAA,IACF,CAAC;AAAA,GACH;AACF","file":"api-schema-manifest-Z45VRZSJ.js","sourcesContent":["import type { JSONSchema7 } from '@mastra/schema-compat';\nimport { schemaToJsonSchema } from './openapi-utils';\nimport { SERVER_ROUTES } from './routes/index';\nimport type { ServerRoute } from './routes/index';\n\nexport interface ApiSchemaResponseShape {\n kind: 'array' | 'record' | 'object-property' | 'single' | 'unknown';\n listProperty?: string;\n paginationProperty?: string;\n}\n\nexport interface ApiSchemaManifestRoute {\n method: string;\n path: string;\n responseType: string;\n pathParamSchema?: JSONSchema7;\n queryParamSchema?: JSONSchema7;\n bodySchema?: JSONSchema7;\n responseSchema?: JSONSchema7;\n responseShape: ApiSchemaResponseShape;\n}\n\nexport interface ApiSchemaManifest {\n version: 1;\n routes: ApiSchemaManifestRoute[];\n}\n\nfunction convertSchema(schema: ServerRoute['bodySchema']): JSONSchema7 | undefined {\n return schema ? schemaToJsonSchema(schema) : undefined;\n}\n\nfunction asJsonSchema(value: unknown): JSONSchema7 | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as JSONSchema7) : undefined;\n}\n\nfunction schemaType(schema: JSONSchema7 | undefined): JSONSchema7['type'] | undefined {\n const type = schema?.type;\n return Array.isArray(type) ? type.find(Boolean) : type;\n}\n\nfunction inferResponseShape(responseSchema: JSONSchema7 | undefined): ApiSchemaResponseShape {\n if (!responseSchema) return { kind: 'unknown' };\n\n const type = schemaType(responseSchema);\n if (type === 'array') return { kind: 'array' };\n if (type !== 'object') return { kind: 'single' };\n\n const properties =\n responseSchema.properties && !Array.isArray(responseSchema.properties) ? responseSchema.properties : {};\n const propertyNames = Object.keys(properties);\n const paginationProperty = 'page' in properties ? 'page' : 'pagination' in properties ? 'pagination' : undefined;\n const listProperty = Object.entries(properties).find(\n ([, property]) => schemaType(asJsonSchema(property)) === 'array',\n )?.[0];\n\n if (listProperty && (paginationProperty || propertyNames.length <= 2)) {\n return { kind: 'object-property', listProperty, paginationProperty };\n }\n if (responseSchema.additionalProperties && propertyNames.length === 0) return { kind: 'record' };\n return { kind: 'single' };\n}\n\nfunction isManifestRoute(route: ServerRoute): boolean {\n return route.responseType === 'json' && !route.deprecated;\n}\n\nexport function buildApiSchemaManifest(routes: readonly ServerRoute[] = SERVER_ROUTES): ApiSchemaManifest {\n return {\n version: 1,\n routes: routes.filter(isManifestRoute).map(route => {\n const responseSchema = convertSchema(route.responseSchema);\n return {\n method: route.method,\n path: route.path,\n responseType: route.responseType,\n pathParamSchema: convertSchema(route.pathParamSchema),\n queryParamSchema: convertSchema(route.queryParamSchema),\n bodySchema: convertSchema(route.bodySchema),\n responseSchema,\n responseShape: inferResponseShape(responseSchema),\n };\n }),\n };\n}\n"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

'use strict';
var chunkSBAFNGQD_cjs = require('./chunk-SBAFNGQD.cjs');
var chunkMIAMR6TW_cjs = require('./chunk-MIAMR6TW.cjs');
var chunkVNWPOCOT_cjs = require('./chunk-VNWPOCOT.cjs');
var chunkXLQY5MPS_cjs = require('./chunk-XLQY5MPS.cjs');
var chunkOT2JWWCT_cjs = require('./chunk-OT2JWWCT.cjs');
var chunkONBABU5V_cjs = require('./chunk-ONBABU5V.cjs');
var chunkDW6LIDTI_cjs = require('./chunk-DW6LIDTI.cjs');
var chunk6TFOQW4W_cjs = require('./chunk-6TFOQW4W.cjs');
var chunkUZ43QCIA_cjs = require('./chunk-UZ43QCIA.cjs');
var chunkBTMYAVRX_cjs = require('./chunk-BTMYAVRX.cjs');
var chunkIRJJ2JJG_cjs = require('./chunk-IRJJ2JJG.cjs');
var chunk4NYA6U6Y_cjs = require('./chunk-4NYA6U6Y.cjs');
var chunkUZINJHAF_cjs = require('./chunk-UZINJHAF.cjs');
var chunkRM4ITWAQ_cjs = require('./chunk-RM4ITWAQ.cjs');
var chunkCZ5EDK57_cjs = require('./chunk-CZ5EDK57.cjs');
var chunkJZJ3PP2H_cjs = require('./chunk-JZJ3PP2H.cjs');
var chunkPJLW25AQ_cjs = require('./chunk-PJLW25AQ.cjs');
var chunkTDMX66RN_cjs = require('./chunk-TDMX66RN.cjs');
var chunkI6AIWII6_cjs = require('./chunk-I6AIWII6.cjs');
var chunkT32FQPWH_cjs = require('./chunk-T32FQPWH.cjs');
var chunkZFRMJ23H_cjs = require('./chunk-ZFRMJ23H.cjs');
var chunk7FIDKZUG_cjs = require('./chunk-7FIDKZUG.cjs');
var chunkBTIK5TXF_cjs = require('./chunk-BTIK5TXF.cjs');
var chunkJGLVYJ3S_cjs = require('./chunk-JGLVYJ3S.cjs');
var chunkPMGFP7II_cjs = require('./chunk-PMGFP7II.cjs');
var chunkUSU23GYD_cjs = require('./chunk-USU23GYD.cjs');
var chunkRWW6SPX2_cjs = require('./chunk-RWW6SPX2.cjs');
var chunkEMRTFZVU_cjs = require('./chunk-EMRTFZVU.cjs');
var chunkH2WXUVWU_cjs = require('./chunk-H2WXUVWU.cjs');
var chunkIMHKYH3U_cjs = require('./chunk-IMHKYH3U.cjs');
var chunk27RDIRLQ_cjs = require('./chunk-27RDIRLQ.cjs');
var chunk7X243C5K_cjs = require('./chunk-7X243C5K.cjs');
var chunk7B36J5MV_cjs = require('./chunk-7B36J5MV.cjs');
var chunkSPHAWZ5H_cjs = require('./chunk-SPHAWZ5H.cjs');
var chunkGU4AEOGA_cjs = require('./chunk-GU4AEOGA.cjs');
var chunkRHRIAUUE_cjs = require('./chunk-RHRIAUUE.cjs');
var chunkUNXPZBTJ_cjs = require('./chunk-UNXPZBTJ.cjs');
var chunk4ZHHKMDQ_cjs = require('./chunk-4ZHHKMDQ.cjs');
var chunkL4V4FQDA_cjs = require('./chunk-L4V4FQDA.cjs');
var chunkU72IZ5BP_cjs = require('./chunk-U72IZ5BP.cjs');
// src/server/server-adapter/routes/permissions.ts
var METHOD_TO_ACTION = {
GET: "read",
POST: "write",
// Default for POST, may be overridden to 'execute'
PUT: "write",
PATCH: "write",
DELETE: "delete"
};
var EXECUTE_PATTERNS = [
"/generate",
"/stream",
"/execute",
"/start",
"/resume",
"/restart",
"/cancel",
"/approve",
"/decline",
"/speak",
"/listen",
"/query",
"/search",
"/observe",
"/time-travel",
"/enhance",
"/clone"
];
var PUBLISH_PATTERNS = ["/publish", "/activate", "/restore"];
var STORED_RESOURCE_SEGMENTS = {
agents: "stored-agents",
"mcp-clients": "stored-mcp-clients",
"prompt-blocks": "stored-prompt-blocks",
scorers: "stored-scorers",
skills: "stored-skills",
workspaces: "stored-workspaces"
};
function extractResource(path) {
const segments = path.replace(/^\//, "").split("/");
if (segments.length === 0) {
return null;
}
const firstSegment = segments[0];
if (firstSegment === "stored" && segments[1]) {
return STORED_RESOURCE_SEGMENTS[segments[1]] ?? null;
}
if (firstSegment === ".well-known") {
return "a2a";
}
return firstSegment || null;
}
function deriveAction(method, path) {
const upperMethod = method.toUpperCase();
if (upperMethod === "POST") {
if (path.startsWith("/stored/")) {
const isPublishOperation = PUBLISH_PATTERNS.some((pattern) => path.endsWith(pattern));
if (isPublishOperation) {
return "publish";
}
}
const isExecuteOperation = EXECUTE_PATTERNS.some((pattern) => path.includes(pattern));
return isExecuteOperation ? "execute" : "write";
}
return METHOD_TO_ACTION[upperMethod] || "read";
}
function derivePermission(route) {
if (route.method === "ALL") {
return null;
}
const resource = extractResource(route.path);
if (!resource) {
return null;
}
const action = deriveAction(route.method, route.path);
return `${resource}:${action}`;
}
function getEffectivePermission(route) {
if (route.requiresAuth === false) {
return null;
}
if (route.requiresPermission) {
return route.requiresPermission;
}
return derivePermission(route);
}
// src/server/server-adapter/routes/a2a.ts
var A2A_ROUTES = [chunkRHRIAUUE_cjs.GET_AGENT_CARD_ROUTE, chunkRHRIAUUE_cjs.AGENT_EXECUTION_ROUTE];
// src/server/server-adapter/routes/agent-builder.ts
var AGENT_BUILDER_ROUTES = [
chunkL4V4FQDA_cjs.LIST_AGENT_BUILDER_ACTIONS_ROUTE,
chunkL4V4FQDA_cjs.GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE,
chunkL4V4FQDA_cjs.LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE,
chunkL4V4FQDA_cjs.GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE,
chunkL4V4FQDA_cjs.CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE,
chunkL4V4FQDA_cjs.STREAM_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.START_ASYNC_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.START_AGENT_BUILDER_ACTION_RUN_ROUTE,
chunkL4V4FQDA_cjs.OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.RESUME_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE,
chunkL4V4FQDA_cjs.CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE
];
// src/server/server-adapter/routes/agents.ts
var AGENTS_ROUTES = [
// ============================================================================
// Agent Core Routes
// ============================================================================
chunkUNXPZBTJ_cjs.LIST_AGENTS_ROUTE,
chunkUNXPZBTJ_cjs.GET_PROVIDERS_ROUTE,
chunkUNXPZBTJ_cjs.GET_AGENT_BY_ID_ROUTE,
chunkUNXPZBTJ_cjs.CLONE_AGENT_ROUTE,
// ============================================================================
// Voice Routes
// ============================================================================
chunkPMGFP7II_cjs.GET_SPEAKERS_ROUTE,
chunkPMGFP7II_cjs.GET_SPEAKERS_DEPRECATED_ROUTE,
// ============================================================================
// Agent Execution Routes
// ============================================================================
chunkUNXPZBTJ_cjs.GENERATE_AGENT_ROUTE,
chunkUNXPZBTJ_cjs.GENERATE_AGENT_VNEXT_ROUTE,
chunkUNXPZBTJ_cjs.STREAM_GENERATE_ROUTE,
chunkUNXPZBTJ_cjs.STREAM_UNTIL_IDLE_GENERATE_ROUTE,
chunkUNXPZBTJ_cjs.STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,
// ============================================================================
// Resumable Stream Routes
// ============================================================================
chunkUNXPZBTJ_cjs.OBSERVE_AGENT_STREAM_ROUTE,
chunkUNXPZBTJ_cjs.SEND_AGENT_MESSAGE_ROUTE,
chunkUNXPZBTJ_cjs.QUEUE_AGENT_MESSAGE_ROUTE,
chunkUNXPZBTJ_cjs.SEND_AGENT_SIGNAL_ROUTE,
chunkUNXPZBTJ_cjs.ABORT_AGENT_THREAD_ROUTE,
chunkUNXPZBTJ_cjs.SUBSCRIBE_AGENT_THREAD_ROUTE,
// ============================================================================
// Tool Routes
// ============================================================================
chunkRWW6SPX2_cjs.EXECUTE_AGENT_TOOL_ROUTE,
chunkUNXPZBTJ_cjs.APPROVE_TOOL_CALL_ROUTE,
chunkUNXPZBTJ_cjs.SEND_TOOL_APPROVAL_ROUTE,
chunkUNXPZBTJ_cjs.DECLINE_TOOL_CALL_ROUTE,
chunkUNXPZBTJ_cjs.RESUME_STREAM_ROUTE,
chunkUNXPZBTJ_cjs.APPROVE_TOOL_CALL_GENERATE_ROUTE,
chunkUNXPZBTJ_cjs.DECLINE_TOOL_CALL_GENERATE_ROUTE,
chunkUNXPZBTJ_cjs.APPROVE_NETWORK_TOOL_CALL_ROUTE,
chunkUNXPZBTJ_cjs.DECLINE_NETWORK_TOOL_CALL_ROUTE,
chunkUNXPZBTJ_cjs.RESUME_STREAM_UNTIL_IDLE_ROUTE,
// ============================================================================
// Network Routes
// ============================================================================
chunkUNXPZBTJ_cjs.STREAM_NETWORK_ROUTE,
// ============================================================================
// Model Management Routes
// ============================================================================
chunkUNXPZBTJ_cjs.UPDATE_AGENT_MODEL_ROUTE,
chunkUNXPZBTJ_cjs.RESET_AGENT_MODEL_ROUTE,
chunkUNXPZBTJ_cjs.REORDER_AGENT_MODEL_LIST_ROUTE,
chunkUNXPZBTJ_cjs.UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,
// ============================================================================
// Instruction Enhancement Routes
// ============================================================================
chunkUNXPZBTJ_cjs.ENHANCE_INSTRUCTIONS_ROUTE,
// ============================================================================
// Agent Tool Routes
// ============================================================================
chunkRWW6SPX2_cjs.GET_AGENT_TOOL_ROUTE,
// ============================================================================
// Agent Skill Routes
// ============================================================================
chunkUNXPZBTJ_cjs.GET_AGENT_SKILL_ROUTE,
// ============================================================================
// Voice/Speech Routes
// ============================================================================
chunkPMGFP7II_cjs.GENERATE_SPEECH_ROUTE,
chunkPMGFP7II_cjs.GENERATE_SPEECH_DEPRECATED_ROUTE,
chunkPMGFP7II_cjs.TRANSCRIBE_SPEECH_ROUTE,
chunkPMGFP7II_cjs.TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,
chunkPMGFP7II_cjs.GET_LISTENER_ROUTE,
// ============================================================================
// Deprecated Routes
// ============================================================================
chunkUNXPZBTJ_cjs.STREAM_VNEXT_DEPRECATED_ROUTE,
chunkUNXPZBTJ_cjs.STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,
chunkUNXPZBTJ_cjs.STREAM_UI_MESSAGE_DEPRECATED_ROUTE
];
// src/server/server-adapter/routes/background-tasks.ts
var BACKGROUND_TASK_ROUTES = [
chunkZFRMJ23H_cjs.BACKGROUND_TASK_STREAM_ROUTE,
chunkZFRMJ23H_cjs.LIST_BACKGROUND_TASKS_ROUTE,
chunkZFRMJ23H_cjs.GET_BACKGROUND_TASK_ROUTE
];
// src/server/server-adapter/routes/channels.ts
var CHANNELS_ROUTES = [
chunkBTIK5TXF_cjs.LIST_CHANNEL_PLATFORMS_ROUTE,
chunkBTIK5TXF_cjs.LIST_CHANNEL_INSTALLATIONS_ROUTE,
chunkBTIK5TXF_cjs.CONNECT_CHANNEL_ROUTE,
chunkBTIK5TXF_cjs.DISCONNECT_CHANNEL_ROUTE
];
// src/server/server-adapter/routes/conversations.ts
var CONVERSATIONS_ROUTES = [
chunkSPHAWZ5H_cjs.CREATE_CONVERSATION_ROUTE,
chunkSPHAWZ5H_cjs.GET_CONVERSATION_ROUTE,
chunkSPHAWZ5H_cjs.GET_CONVERSATION_ITEMS_ROUTE,
chunkSPHAWZ5H_cjs.DELETE_CONVERSATION_ROUTE
];
// src/server/server-adapter/routes/datasets.ts
var DATASETS_ROUTES = [
// Dataset CRUD
chunkPJLW25AQ_cjs.LIST_DATASETS_ROUTE,
chunkPJLW25AQ_cjs.CREATE_DATASET_ROUTE,
chunkPJLW25AQ_cjs.GET_DATASET_ROUTE,
chunkPJLW25AQ_cjs.UPDATE_DATASET_ROUTE,
chunkPJLW25AQ_cjs.DELETE_DATASET_ROUTE,
// Item list and add
chunkPJLW25AQ_cjs.LIST_ITEMS_ROUTE,
chunkPJLW25AQ_cjs.ADD_ITEM_ROUTE,
// Batch operations - MUST come before item-specific routes to avoid /items/batch matching /items/:itemId
chunkPJLW25AQ_cjs.BATCH_INSERT_ITEMS_ROUTE,
chunkPJLW25AQ_cjs.BATCH_DELETE_ITEMS_ROUTE,
// Item-specific CRUD (uses :itemId param)
chunkPJLW25AQ_cjs.GET_ITEM_ROUTE,
chunkPJLW25AQ_cjs.UPDATE_ITEM_ROUTE,
chunkPJLW25AQ_cjs.DELETE_ITEM_ROUTE,
// Version operations
chunkPJLW25AQ_cjs.LIST_DATASET_VERSIONS_ROUTE,
chunkPJLW25AQ_cjs.LIST_ITEM_VERSIONS_ROUTE,
chunkPJLW25AQ_cjs.GET_ITEM_VERSION_ROUTE,
// All experiments (cross-dataset) - MUST come before dataset-scoped experiments
chunkPJLW25AQ_cjs.LIST_ALL_EXPERIMENTS_ROUTE,
// Experiment review summary (cross-dataset) - MUST come before dataset-scoped experiments
chunkPJLW25AQ_cjs.EXPERIMENT_REVIEW_SUMMARY_ROUTE,
// Experiment operations (dataset-scoped)
chunkPJLW25AQ_cjs.LIST_EXPERIMENTS_ROUTE,
chunkPJLW25AQ_cjs.TRIGGER_EXPERIMENT_ROUTE,
chunkPJLW25AQ_cjs.GET_EXPERIMENT_ROUTE,
chunkPJLW25AQ_cjs.LIST_EXPERIMENT_RESULTS_ROUTE,
chunkPJLW25AQ_cjs.UPDATE_EXPERIMENT_RESULT_ROUTE,
// Analytics
chunkPJLW25AQ_cjs.COMPARE_EXPERIMENTS_ROUTE,
// AI generation
chunkPJLW25AQ_cjs.GENERATE_ITEMS_ROUTE,
// Failure analysis
chunkPJLW25AQ_cjs.CLUSTER_FAILURES_ROUTE
];
// src/server/server-adapter/routes/editor-builder.ts
var EDITOR_BUILDER_ROUTES = [
chunkTDMX66RN_cjs.GET_EDITOR_BUILDER_SETTINGS_ROUTE,
chunkTDMX66RN_cjs.GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE,
chunkTDMX66RN_cjs.GET_INFRASTRUCTURE_STATUS_ROUTE,
chunk7FIDKZUG_cjs.LIST_BUILDER_REGISTRIES_ROUTE,
chunk7FIDKZUG_cjs.BUILDER_REGISTRY_SEARCH_ROUTE,
chunk7FIDKZUG_cjs.BUILDER_REGISTRY_POPULAR_ROUTE,
chunk7FIDKZUG_cjs.BUILDER_REGISTRY_PREVIEW_ROUTE,
chunk7FIDKZUG_cjs.BUILDER_REGISTRY_INSTALL_ROUTE
];
// src/server/server-adapter/routes/harness.ts
var HARNESS_ROUTES = [
chunkI6AIWII6_cjs.LIST_HARNESSES_ROUTE,
chunkI6AIWII6_cjs.LIST_HARNESS_MODES_ROUTE,
chunkI6AIWII6_cjs.LIST_HARNESS_MODELS_ROUTE,
chunkI6AIWII6_cjs.CREATE_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_SESSION_STATE_ROUTE,
chunkI6AIWII6_cjs.LIST_HARNESS_THREADS_ROUTE,
chunkI6AIWII6_cjs.CREATE_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.DELETE_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.RENAME_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.CLONE_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.LIST_HARNESS_THREAD_MESSAGES_ROUTE,
chunkI6AIWII6_cjs.STREAM_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.SEND_HARNESS_MESSAGE_ROUTE,
chunkI6AIWII6_cjs.STEER_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.FOLLOW_UP_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.ABORT_HARNESS_SESSION_ROUTE,
chunkI6AIWII6_cjs.HARNESS_TOOL_APPROVAL_ROUTE,
chunkI6AIWII6_cjs.HARNESS_TOOL_SUSPENSION_ROUTE,
chunkI6AIWII6_cjs.SWITCH_HARNESS_MODE_ROUTE,
chunkI6AIWII6_cjs.SWITCH_HARNESS_MODEL_ROUTE,
chunkI6AIWII6_cjs.SWITCH_HARNESS_THREAD_ROUTE,
chunkI6AIWII6_cjs.SEND_HARNESS_NOTIFICATION_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_WORKSPACE_STATUS_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_OM_RECORD_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_RESOURCE_ID_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_RESOURCE_IDS_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_GOAL_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_GOAL_ROUTE,
chunkI6AIWII6_cjs.UPDATE_HARNESS_GOAL_ROUTE,
chunkI6AIWII6_cjs.CLEAR_HARNESS_GOAL_ROUTE,
chunkI6AIWII6_cjs.GET_HARNESS_PERMISSIONS_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_CATEGORY_PERMISSION_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_TOOL_PERMISSION_ROUTE,
chunkI6AIWII6_cjs.SET_HARNESS_SESSION_STATE_ROUTE
];
// src/server/server-adapter/routes/legacy.ts
var LEGACY_ROUTES = [
// ============================================================================
// Legacy Agent Routes
// ============================================================================
chunkUNXPZBTJ_cjs.GENERATE_LEGACY_ROUTE,
chunkUNXPZBTJ_cjs.STREAM_GENERATE_LEGACY_ROUTE,
// ============================================================================
// Legacy Workflow Routes
// ============================================================================
chunkU72IZ5BP_cjs.STREAM_LEGACY_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE
];
// src/server/server-adapter/routes/logs.ts
var LOGS_ROUTES = [chunkGU4AEOGA_cjs.LIST_LOG_TRANSPORTS_ROUTE, chunkGU4AEOGA_cjs.LIST_LOGS_ROUTE, chunkGU4AEOGA_cjs.LIST_LOGS_BY_RUN_ID_ROUTE];
// src/server/server-adapter/routes/mcp.ts
var MCP_ROUTES = [
// ============================================================================
// MCP Server Registry Routes
// ============================================================================
chunkIMHKYH3U_cjs.LIST_MCP_SERVERS_ROUTE,
chunkIMHKYH3U_cjs.GET_MCP_SERVER_DETAIL_ROUTE,
// ============================================================================
// MCP Server Tool Routes
// ============================================================================
chunkIMHKYH3U_cjs.LIST_MCP_SERVER_TOOLS_ROUTE,
chunkIMHKYH3U_cjs.GET_MCP_SERVER_TOOL_DETAIL_ROUTE,
chunkIMHKYH3U_cjs.EXECUTE_MCP_SERVER_TOOL_ROUTE,
// ============================================================================
// MCP Server Resource Routes
// ============================================================================
chunkIMHKYH3U_cjs.LIST_MCP_SERVER_RESOURCES_ROUTE,
chunkIMHKYH3U_cjs.READ_MCP_SERVER_RESOURCE_ROUTE,
// ============================================================================
// MCP Transport Routes (handled by adapters)
// ============================================================================
chunkIMHKYH3U_cjs.MCP_HTTP_TRANSPORT_ROUTE,
chunkIMHKYH3U_cjs.MCP_SSE_TRANSPORT_ROUTE,
chunkIMHKYH3U_cjs.MCP_SSE_MESSAGES_ROUTE
];
// src/server/server-adapter/routes/memory.ts
var MEMORY_ROUTES = [
chunk27RDIRLQ_cjs.GET_MEMORY_STATUS_ROUTE,
chunk27RDIRLQ_cjs.GET_MEMORY_CONFIG_ROUTE,
chunk27RDIRLQ_cjs.GET_OBSERVATIONAL_MEMORY_ROUTE,
chunk27RDIRLQ_cjs.AWAIT_BUFFER_STATUS_ROUTE,
chunk27RDIRLQ_cjs.LIST_THREADS_ROUTE,
chunk27RDIRLQ_cjs.GET_THREAD_BY_ID_ROUTE,
chunk27RDIRLQ_cjs.LIST_MESSAGES_ROUTE,
chunk27RDIRLQ_cjs.GET_WORKING_MEMORY_ROUTE,
chunk27RDIRLQ_cjs.SAVE_MESSAGES_ROUTE,
chunk27RDIRLQ_cjs.CREATE_THREAD_ROUTE,
chunk27RDIRLQ_cjs.UPDATE_THREAD_ROUTE,
chunk27RDIRLQ_cjs.DELETE_THREAD_ROUTE,
chunk27RDIRLQ_cjs.CLONE_THREAD_ROUTE,
chunk27RDIRLQ_cjs.UPDATE_WORKING_MEMORY_ROUTE,
chunk27RDIRLQ_cjs.DELETE_MESSAGES_ROUTE,
chunk27RDIRLQ_cjs.SEARCH_MEMORY_ROUTE,
chunk27RDIRLQ_cjs.GET_MEMORY_STATUS_NETWORK_ROUTE,
chunk27RDIRLQ_cjs.LIST_THREADS_NETWORK_ROUTE,
chunk27RDIRLQ_cjs.GET_THREAD_BY_ID_NETWORK_ROUTE,
chunk27RDIRLQ_cjs.LIST_MESSAGES_NETWORK_ROUTE,
chunk27RDIRLQ_cjs.SAVE_MESSAGES_NETWORK_ROUTE,
chunk27RDIRLQ_cjs.CREATE_THREAD_NETWORK_ROUTE,
chunk27RDIRLQ_cjs.UPDATE_THREAD_NETWORK_ROUTE,
chunk27RDIRLQ_cjs.DELETE_THREAD_NETWORK_ROUTE,
chunk27RDIRLQ_cjs.DELETE_MESSAGES_NETWORK_ROUTE
];
// src/server/server-adapter/routes/observability.ts
var OBSERVABILITY_ROUTES = [
// Legacy
chunk7X243C5K_cjs.LIST_TRACES_ROUTE,
chunk7X243C5K_cjs.LIST_TRACES_LIGHT_ROUTE,
chunk7X243C5K_cjs.LIST_BRANCHES_ROUTE,
chunk7X243C5K_cjs.GET_BRANCH_ROUTE,
chunk7X243C5K_cjs.GET_TRACE_ROUTE,
chunk7X243C5K_cjs.GET_TRACE_LIGHT_ROUTE,
chunk7X243C5K_cjs.GET_SPAN_ROUTE,
chunk7X243C5K_cjs.GET_TRACE_TRAJECTORY_ROUTE,
chunk7X243C5K_cjs.SCORE_TRACES_ROUTE,
chunk7X243C5K_cjs.LIST_SCORES_BY_SPAN_ROUTE,
// New observability routes
chunk7B36J5MV_cjs.LIST_METRICS,
chunk7B36J5MV_cjs.LIST_LOGS,
chunk7B36J5MV_cjs.LIST_SCORES,
chunk7B36J5MV_cjs.CREATE_SCORE,
chunk7B36J5MV_cjs.GET_SCORE,
chunk7B36J5MV_cjs.GET_SCORE_AGGREGATE,
chunk7B36J5MV_cjs.GET_SCORE_BREAKDOWN,
chunk7B36J5MV_cjs.GET_SCORE_TIME_SERIES,
chunk7B36J5MV_cjs.GET_SCORE_PERCENTILES,
chunk7B36J5MV_cjs.LIST_FEEDBACK,
chunk7B36J5MV_cjs.CREATE_FEEDBACK,
chunk7B36J5MV_cjs.GET_FEEDBACK_AGGREGATE,
chunk7B36J5MV_cjs.GET_FEEDBACK_BREAKDOWN,
chunk7B36J5MV_cjs.GET_FEEDBACK_TIME_SERIES,
chunk7B36J5MV_cjs.GET_FEEDBACK_PERCENTILES,
chunk7B36J5MV_cjs.GET_METRIC_AGGREGATE,
chunk7B36J5MV_cjs.GET_METRIC_BREAKDOWN,
chunk7B36J5MV_cjs.GET_METRIC_TIME_SERIES,
chunk7B36J5MV_cjs.GET_METRIC_PERCENTILES,
chunk7B36J5MV_cjs.GET_METRIC_NAMES,
chunk7B36J5MV_cjs.GET_METRIC_LABEL_KEYS,
chunk7B36J5MV_cjs.GET_METRIC_LABEL_VALUES,
chunk7B36J5MV_cjs.GET_ENTITY_TYPES,
chunk7B36J5MV_cjs.GET_ENTITY_NAMES,
chunk7B36J5MV_cjs.GET_SERVICE_NAMES,
chunk7B36J5MV_cjs.GET_ENVIRONMENTS,
chunk7B36J5MV_cjs.GET_TAGS
];
// src/server/server-adapter/routes/processor-providers.ts
var PROCESSOR_PROVIDER_ROUTES = [chunk4NYA6U6Y_cjs.LIST_PROCESSOR_PROVIDERS_ROUTE, chunk4NYA6U6Y_cjs.GET_PROCESSOR_PROVIDER_ROUTE];
// src/server/server-adapter/routes/processors.ts
var PROCESSORS_ROUTES = [chunkUZINJHAF_cjs.LIST_PROCESSORS_ROUTE, chunkUZINJHAF_cjs.GET_PROCESSOR_BY_ID_ROUTE, chunkUZINJHAF_cjs.EXECUTE_PROCESSOR_ROUTE];
// src/server/server-adapter/routes/responses.ts
var RESPONSES_ROUTES = [chunkH2WXUVWU_cjs.CREATE_RESPONSE_ROUTE, chunkH2WXUVWU_cjs.GET_RESPONSE_ROUTE, chunkH2WXUVWU_cjs.DELETE_RESPONSE_ROUTE];
// src/server/server-adapter/routes/schedules.ts
var SCHEDULES_ROUTES = [
chunkCZ5EDK57_cjs.LIST_SCHEDULES_ROUTE,
chunkCZ5EDK57_cjs.GET_SCHEDULE_ROUTE,
chunkCZ5EDK57_cjs.LIST_SCHEDULE_TRIGGERS_ROUTE,
chunkCZ5EDK57_cjs.PAUSE_SCHEDULE_ROUTE,
chunkCZ5EDK57_cjs.RESUME_SCHEDULE_ROUTE
];
// src/server/server-adapter/routes/scorers.ts
var SCORES_ROUTES = [
chunkEMRTFZVU_cjs.LIST_SCORERS_ROUTE,
chunkEMRTFZVU_cjs.GET_SCORER_ROUTE,
chunkEMRTFZVU_cjs.LIST_SCORES_BY_RUN_ID_ROUTE,
chunkEMRTFZVU_cjs.LIST_SCORES_BY_SCORER_ID_ROUTE,
chunkEMRTFZVU_cjs.LIST_SCORES_BY_ENTITY_ID_ROUTE,
chunkEMRTFZVU_cjs.SAVE_SCORE_ROUTE
];
// src/server/server-adapter/routes/stored-agents.ts
var STORED_AGENTS_ROUTES = [
// ============================================================================
// Stored Agents CRUD Routes
// IMPORTANT: Routes with literal paths (e.g., /preview-instructions) must come
// BEFORE routes with path parameters (e.g., /:storedAgentId) to ensure correct matching.
// ============================================================================
chunk6TFOQW4W_cjs.LIST_STORED_AGENTS_ROUTE,
chunk6TFOQW4W_cjs.PREVIEW_INSTRUCTIONS_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
chunk6TFOQW4W_cjs.GET_STORED_AGENT_DEPENDENTS_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE (longer literal)
chunk6TFOQW4W_cjs.EXPORT_STORED_AGENT_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
chunk6TFOQW4W_cjs.OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
chunk6TFOQW4W_cjs.GET_STORED_AGENT_ROUTE,
chunk6TFOQW4W_cjs.CREATE_STORED_AGENT_ROUTE,
chunk6TFOQW4W_cjs.UPDATE_STORED_AGENT_ROUTE,
chunk6TFOQW4W_cjs.DELETE_STORED_AGENT_ROUTE,
// ============================================================================
// Agent Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
// ============================================================================
chunkT32FQPWH_cjs.LIST_AGENT_VERSIONS_ROUTE,
chunkT32FQPWH_cjs.CREATE_AGENT_VERSION_ROUTE,
chunkT32FQPWH_cjs.COMPARE_AGENT_VERSIONS_ROUTE,
// Must be before GET_AGENT_VERSION_ROUTE
chunkT32FQPWH_cjs.GET_AGENT_VERSION_ROUTE,
chunkT32FQPWH_cjs.ACTIVATE_AGENT_VERSION_ROUTE,
chunkT32FQPWH_cjs.RESTORE_AGENT_VERSION_ROUTE,
chunkT32FQPWH_cjs.DELETE_AGENT_VERSION_ROUTE,
// ============================================================================
// Favorites (EE)
// ============================================================================
chunkDW6LIDTI_cjs.FAVORITE_STORED_AGENT_ROUTE,
chunkDW6LIDTI_cjs.UNFAVORITE_STORED_AGENT_ROUTE
];
// src/server/server-adapter/routes/stored-mcp-clients.ts
var STORED_MCP_CLIENTS_ROUTES = [
// Stored MCP Clients CRUD Routes
chunkUZ43QCIA_cjs.LIST_STORED_MCP_CLIENTS_ROUTE,
chunkUZ43QCIA_cjs.GET_STORED_MCP_CLIENT_ROUTE,
chunkUZ43QCIA_cjs.CREATE_STORED_MCP_CLIENT_ROUTE,
chunkUZ43QCIA_cjs.UPDATE_STORED_MCP_CLIENT_ROUTE,
chunkUZ43QCIA_cjs.DELETE_STORED_MCP_CLIENT_ROUTE,
// MCP Client Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
chunkJZJ3PP2H_cjs.LIST_MCP_CLIENT_VERSIONS_ROUTE,
chunkJZJ3PP2H_cjs.CREATE_MCP_CLIENT_VERSION_ROUTE,
chunkJZJ3PP2H_cjs.COMPARE_MCP_CLIENT_VERSIONS_ROUTE,
chunkJZJ3PP2H_cjs.GET_MCP_CLIENT_VERSION_ROUTE,
chunkJZJ3PP2H_cjs.ACTIVATE_MCP_CLIENT_VERSION_ROUTE,
chunkJZJ3PP2H_cjs.RESTORE_MCP_CLIENT_VERSION_ROUTE,
chunkJZJ3PP2H_cjs.DELETE_MCP_CLIENT_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-prompt-blocks.ts
var STORED_PROMPT_BLOCKS_ROUTES = [
// Stored Prompt Blocks CRUD Routes
chunkBTMYAVRX_cjs.LIST_STORED_PROMPT_BLOCKS_ROUTE,
chunkBTMYAVRX_cjs.GET_STORED_PROMPT_BLOCK_ROUTE,
chunkBTMYAVRX_cjs.CREATE_STORED_PROMPT_BLOCK_ROUTE,
chunkBTMYAVRX_cjs.UPDATE_STORED_PROMPT_BLOCK_ROUTE,
chunkBTMYAVRX_cjs.DELETE_STORED_PROMPT_BLOCK_ROUTE,
// Prompt Block Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
chunkRM4ITWAQ_cjs.LIST_PROMPT_BLOCK_VERSIONS_ROUTE,
chunkRM4ITWAQ_cjs.CREATE_PROMPT_BLOCK_VERSION_ROUTE,
chunkRM4ITWAQ_cjs.COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE,
chunkRM4ITWAQ_cjs.GET_PROMPT_BLOCK_VERSION_ROUTE,
chunkRM4ITWAQ_cjs.ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE,
chunkRM4ITWAQ_cjs.RESTORE_PROMPT_BLOCK_VERSION_ROUTE,
chunkRM4ITWAQ_cjs.DELETE_PROMPT_BLOCK_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-scorers.ts
var STORED_SCORERS_ROUTES = [
// Stored Scorers CRUD Routes
chunkIRJJ2JJG_cjs.LIST_STORED_SCORERS_ROUTE,
chunkIRJJ2JJG_cjs.GET_STORED_SCORER_ROUTE,
chunkIRJJ2JJG_cjs.CREATE_STORED_SCORER_ROUTE,
chunkIRJJ2JJG_cjs.UPDATE_STORED_SCORER_ROUTE,
chunkIRJJ2JJG_cjs.DELETE_STORED_SCORER_ROUTE,
// Scorer Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
chunkONBABU5V_cjs.LIST_SCORER_VERSIONS_ROUTE,
chunkONBABU5V_cjs.CREATE_SCORER_VERSION_ROUTE,
chunkONBABU5V_cjs.COMPARE_SCORER_VERSIONS_ROUTE,
chunkONBABU5V_cjs.GET_SCORER_VERSION_ROUTE,
chunkONBABU5V_cjs.ACTIVATE_SCORER_VERSION_ROUTE,
chunkONBABU5V_cjs.RESTORE_SCORER_VERSION_ROUTE,
chunkONBABU5V_cjs.DELETE_SCORER_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-skills.ts
var STORED_SKILLS_ROUTES = [
// Stored Skills CRUD Routes
chunkMIAMR6TW_cjs.LIST_STORED_SKILLS_ROUTE,
chunkMIAMR6TW_cjs.GET_STORED_SKILL_ROUTE,
chunkMIAMR6TW_cjs.CREATE_STORED_SKILL_ROUTE,
chunkMIAMR6TW_cjs.UPDATE_STORED_SKILL_ROUTE,
chunkMIAMR6TW_cjs.DELETE_STORED_SKILL_ROUTE,
// Publish
chunkMIAMR6TW_cjs.PUBLISH_STORED_SKILL_ROUTE,
// Favorites (EE)
chunkSBAFNGQD_cjs.FAVORITE_STORED_SKILL_ROUTE,
chunkSBAFNGQD_cjs.UNFAVORITE_STORED_SKILL_ROUTE
];
// src/server/server-adapter/routes/stored-workspaces.ts
var STORED_WORKSPACES_ROUTES = [
// Stored Workspaces CRUD Routes
chunkVNWPOCOT_cjs.LIST_STORED_WORKSPACES_ROUTE,
chunkVNWPOCOT_cjs.GET_STORED_WORKSPACE_ROUTE,
chunkVNWPOCOT_cjs.CREATE_STORED_WORKSPACE_ROUTE,
chunkVNWPOCOT_cjs.UPDATE_STORED_WORKSPACE_ROUTE,
chunkVNWPOCOT_cjs.DELETE_STORED_WORKSPACE_ROUTE
];
// src/server/server-adapter/routes/system.ts
var SYSTEM_ROUTES = [chunkXLQY5MPS_cjs.GET_SYSTEM_PACKAGES_ROUTE, chunkXLQY5MPS_cjs.GET_API_SCHEMA_ROUTE];
// src/server/server-adapter/routes/tool-providers.ts
var TOOL_PROVIDER_ROUTES = [
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDERS_ROUTE,
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDER_TOOLKITS_ROUTE,
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDER_TOOLS_ROUTE,
chunkOT2JWWCT_cjs.GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE,
chunkOT2JWWCT_cjs.AUTHORIZE_TOOL_PROVIDER_ROUTE,
chunkOT2JWWCT_cjs.GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE,
chunkOT2JWWCT_cjs.TOOL_PROVIDER_CONNECTION_STATUS_ROUTE,
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE,
chunkOT2JWWCT_cjs.LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE,
chunkOT2JWWCT_cjs.DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE,
chunkOT2JWWCT_cjs.UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE,
chunkOT2JWWCT_cjs.GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE,
chunkOT2JWWCT_cjs.GET_TOOL_PROVIDER_HEALTH_ROUTE
];
// src/server/server-adapter/routes/tools.ts
var TOOLS_ROUTES = [chunkRWW6SPX2_cjs.LIST_TOOLS_ROUTE, chunkRWW6SPX2_cjs.GET_TOOL_BY_ID_ROUTE, chunkRWW6SPX2_cjs.EXECUTE_TOOL_ROUTE];
// src/server/server-adapter/routes/vectors.ts
var VECTORS_ROUTES = [
chunkJGLVYJ3S_cjs.UPSERT_VECTORS_ROUTE,
chunkJGLVYJ3S_cjs.CREATE_INDEX_ROUTE,
chunkJGLVYJ3S_cjs.QUERY_VECTORS_ROUTE,
chunkJGLVYJ3S_cjs.LIST_INDEXES_ROUTE,
chunkJGLVYJ3S_cjs.DESCRIBE_INDEX_ROUTE,
chunkJGLVYJ3S_cjs.DELETE_INDEX_ROUTE,
chunkJGLVYJ3S_cjs.LIST_VECTORS_ROUTE,
chunkJGLVYJ3S_cjs.LIST_EMBEDDERS_ROUTE
];
// src/server/server-adapter/routes/workflows.ts
var WORKFLOWS_ROUTES = [
chunkU72IZ5BP_cjs.LIST_WORKFLOWS_ROUTE,
chunkU72IZ5BP_cjs.GET_WORKFLOW_BY_ID_ROUTE,
chunkU72IZ5BP_cjs.LIST_WORKFLOW_RUNS_ROUTE,
chunkU72IZ5BP_cjs.GET_WORKFLOW_RUN_BY_ID_ROUTE,
chunkU72IZ5BP_cjs.DELETE_WORKFLOW_RUN_BY_ID_ROUTE,
chunkU72IZ5BP_cjs.CREATE_WORKFLOW_RUN_ROUTE,
chunkU72IZ5BP_cjs.STREAM_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESUME_STREAM_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.START_ASYNC_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.START_WORKFLOW_RUN_ROUTE,
chunkU72IZ5BP_cjs.OBSERVE_STREAM_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESUME_ASYNC_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESUME_NO_WAIT_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESUME_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.CANCEL_WORKFLOW_RUN_ROUTE,
chunkU72IZ5BP_cjs.TIME_TRAVEL_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESTART_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESTART_ASYNC_WORKFLOW_ROUTE,
chunkU72IZ5BP_cjs.RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE,
chunkU72IZ5BP_cjs.RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE,
chunkU72IZ5BP_cjs.EXECUTE_WORKFLOW_STEP_ROUTE,
chunkU72IZ5BP_cjs.RECEIVE_WORKFLOW_EVENT_ROUTE
];
// src/server/server-adapter/routes/workspace.ts
var WORKSPACE_ROUTES = [
// List all workspaces route (at /api/workspaces)
chunkUSU23GYD_cjs.LIST_WORKSPACES_ROUTE,
// Get workspace route (at /api/workspaces/:workspaceId)
chunkUSU23GYD_cjs.GET_WORKSPACE_ROUTE,
// Filesystem routes (at /api/workspaces/:workspaceId/fs/*)
...chunkUSU23GYD_cjs.WORKSPACE_FS_ROUTES,
// Search routes (at /api/workspaces/:workspaceId/search, /api/workspaces/:workspaceId/index)
...chunkUSU23GYD_cjs.WORKSPACE_SEARCH_ROUTES,
// Skills routes (search must come before parameterized routes)
...chunkUSU23GYD_cjs.WORKSPACE_SKILLS_ROUTES,
// skills.sh proxy routes (at /api/workspaces/:workspaceId/skills-sh/*)
...chunkUSU23GYD_cjs.WORKSPACE_SKILLS_SH_ROUTES
];
// src/server/server-adapter/routes/index.ts
var SERVER_ROUTES = [
...AGENTS_ROUTES,
...chunk4ZHHKMDQ_cjs.AUTH_ROUTES,
...WORKFLOWS_ROUTES,
...TOOLS_ROUTES,
...PROCESSORS_ROUTES,
...RESPONSES_ROUTES,
...CONVERSATIONS_ROUTES,
...MEMORY_ROUTES,
...SCORES_ROUTES,
...OBSERVABILITY_ROUTES,
...LOGS_ROUTES,
...VECTORS_ROUTES,
...A2A_ROUTES,
...WORKSPACE_ROUTES,
...LEGACY_ROUTES,
...MCP_ROUTES,
...STORED_AGENTS_ROUTES,
...STORED_MCP_CLIENTS_ROUTES,
...STORED_PROMPT_BLOCKS_ROUTES,
...STORED_SCORERS_ROUTES,
...STORED_WORKSPACES_ROUTES,
...STORED_SKILLS_ROUTES,
...TOOL_PROVIDER_ROUTES,
...PROCESSOR_PROVIDER_ROUTES,
...SYSTEM_ROUTES,
...DATASETS_ROUTES,
...BACKGROUND_TASK_ROUTES,
...EDITOR_BUILDER_ROUTES,
...AGENT_BUILDER_ROUTES,
...SCHEDULES_ROUTES,
...CHANNELS_ROUTES,
...HARNESS_ROUTES
];
exports.SERVER_ROUTES = SERVER_ROUTES;
exports.deriveAction = deriveAction;
exports.derivePermission = derivePermission;
exports.extractResource = extractResource;
exports.getEffectivePermission = getEffectivePermission;
//# sourceMappingURL=chunk-2BGZ3WEG.cjs.map
//# sourceMappingURL=chunk-2BGZ3WEG.cjs.map

Sorry, the diff of this file is too big to display

import { listScorersResponseSchema, scorerIdPathParams, scorerEntrySchema, scoresWithPaginationResponseSchema, listScoresByRunIdQuerySchema, listScoresByScorerIdQuerySchema, listScoresByEntityIdQuerySchema, entityPathParams, saveScoreResponseSchema, saveScoreBodySchema } from './chunk-OC4S3EDO.js';
import { getAgentFromSystem } from './chunk-L6FOTAND.js';
import { runIdSchema } from './chunk-2YY3EMMS.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { __export } from './chunk-PR4QN5HX.js';
// src/server/handlers/scores.ts
var scores_exports = {};
__export(scores_exports, {
GET_SCORER_ROUTE: () => GET_SCORER_ROUTE,
LIST_SCORERS_ROUTE: () => LIST_SCORERS_ROUTE,
LIST_SCORES_BY_ENTITY_ID_ROUTE: () => LIST_SCORES_BY_ENTITY_ID_ROUTE,
LIST_SCORES_BY_RUN_ID_ROUTE: () => LIST_SCORES_BY_RUN_ID_ROUTE,
LIST_SCORES_BY_SCORER_ID_ROUTE: () => LIST_SCORES_BY_SCORER_ID_ROUTE,
SAVE_SCORE_ROUTE: () => SAVE_SCORE_ROUTE
});
async function listScorersFromSystem({
mastra,
requestContext
}) {
const agents = mastra.listAgents();
const workflows = mastra.listWorkflows();
const scorersMap = /* @__PURE__ */ new Map();
const processAgentScorers = async (agent) => {
const scorers = await agent.listScorers({
requestContext
}) || {};
if (Object.keys(scorers).length > 0) {
for (const [_scorerId, scorer] of Object.entries(scorers)) {
const scorerId = scorer.scorer.id;
if (scorersMap.has(scorerId)) {
scorersMap.get(scorerId)?.agentIds.push(agent.id);
scorersMap.get(scorerId)?.agentNames.push(agent.name);
} else {
scorersMap.set(scorerId, {
workflowIds: [],
...scorer,
agentNames: [agent.name],
agentIds: [agent.id],
isRegistered: false,
source: scorer.scorer.source ?? "code"
});
}
}
}
};
for (const [_, agent] of Object.entries(agents)) {
await processAgentScorers(agent);
}
try {
const editor = mastra.getEditor();
const storedAgentsResult = await editor?.agent.list();
if (storedAgentsResult?.agents) {
for (const storedAgentConfig of storedAgentsResult.agents) {
try {
const agent = await editor?.agent.getById(storedAgentConfig.id);
if (agent) {
await processAgentScorers(agent);
}
} catch {
}
}
}
} catch {
}
try {
const editor = mastra.getEditor();
const storedScorersResult = await editor?.scorer.list();
if (storedScorersResult?.scorerDefinitions) {
for (const storedScorerConfig of storedScorersResult.scorerDefinitions) {
try {
await editor?.scorer.getById(storedScorerConfig.id);
} catch {
}
}
}
} catch {
}
for (const [workflowId, workflow] of Object.entries(workflows)) {
const scorers = await workflow.listScorers({
requestContext
}) || {};
if (Object.keys(scorers).length > 0) {
for (const [_scorerId, scorer] of Object.entries(scorers)) {
const scorerName = scorer.scorer.name;
if (scorersMap.has(scorerName)) {
scorersMap.get(scorerName)?.workflowIds.push(workflowId);
} else {
scorersMap.set(scorerName, {
agentIds: [],
agentNames: [],
...scorer,
workflowIds: [workflowId],
isRegistered: false,
source: scorer.scorer.source ?? "code"
});
}
}
}
}
const registeredScorers = await mastra.listScorers();
for (const [_scorerId, scorer] of Object.entries(registeredScorers || {})) {
const scorerId = scorer.id;
if (scorersMap.has(scorerId)) {
scorersMap.get(scorerId).isRegistered = true;
} else {
scorersMap.set(scorerId, {
scorer,
agentIds: [],
agentNames: [],
workflowIds: [],
isRegistered: true,
source: scorer.source ?? "code"
});
}
}
return Object.fromEntries(scorersMap.entries());
}
function getTraceDetails(traceIdWithSpanId) {
if (!traceIdWithSpanId) {
return {};
}
const [traceId, spanId] = traceIdWithSpanId.split("-");
return {
...traceId ? { traceId } : {},
...spanId ? { spanId } : {}
};
}
var LIST_SCORERS_ROUTE = createRoute({
method: "GET",
path: "/scores/scorers",
responseType: "json",
responseSchema: listScorersResponseSchema,
summary: "List all scorers",
description: "Returns a list of all registered scorers with their configuration and associated agents and workflows",
tags: ["Scoring"],
requiresAuth: true,
handler: (async ({ mastra, requestContext }) => {
const scorers = await listScorersFromSystem({
mastra,
requestContext
});
return scorers;
})
});
var GET_SCORER_ROUTE = createRoute({
method: "GET",
path: "/scores/scorers/:scorerId",
responseType: "json",
pathParamSchema: scorerIdPathParams,
responseSchema: scorerEntrySchema.nullable(),
summary: "Get scorer by ID",
description: "Returns details for a specific scorer including its configuration and associations",
tags: ["Scoring"],
requiresAuth: true,
handler: (async ({ mastra, scorerId, requestContext }) => {
const scorers = await listScorersFromSystem({
mastra,
requestContext
});
const scorer = scorers[scorerId];
if (!scorer) {
return null;
}
return scorer;
})
});
var LIST_SCORES_BY_RUN_ID_ROUTE = createRoute({
method: "GET",
path: "/scores/run/:runId",
responseType: "json",
pathParamSchema: runIdSchema,
queryParamSchema: listScoresByRunIdQuerySchema,
responseSchema: scoresWithPaginationResponseSchema,
summary: "List scores by run ID",
description: "Returns all scores for a specific execution run",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, runId, ...params }) => {
try {
const { page, perPage } = params;
const pagination = {
page: page ?? 0,
perPage: perPage ?? 10
};
const scores = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scores?.listScoresByRunId?.({
runId,
pagination
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return handleError(error, "Error getting scores by run id");
}
}
});
var LIST_SCORES_BY_SCORER_ID_ROUTE = createRoute({
method: "GET",
path: "/scores/scorer/:scorerId",
responseType: "json",
pathParamSchema: scorerIdPathParams,
queryParamSchema: listScoresByScorerIdQuerySchema,
responseSchema: scoresWithPaginationResponseSchema,
summary: "List scores by scorer ID",
description: "Returns all scores generated by a specific scorer",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, scorerId, ...params }) => {
try {
const { page, perPage, entityId, entityType } = params;
const filters = Object.fromEntries(Object.entries({ entityId, entityType }).filter(([_, v]) => v !== void 0));
const scores = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scores?.listScoresByScorerId?.({
scorerId,
pagination: { page: page ?? 0, perPage: perPage ?? 10 },
...filters
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return handleError(error, "Error getting scores by scorer id");
}
}
});
var LIST_SCORES_BY_ENTITY_ID_ROUTE = createRoute({
method: "GET",
path: "/scores/entity/:entityType/:entityId",
responseType: "json",
pathParamSchema: entityPathParams,
queryParamSchema: listScoresByEntityIdQuerySchema,
responseSchema: scoresWithPaginationResponseSchema,
summary: "List scores by entity ID",
description: "Returns all scores for a specific entity (agent or workflow)",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, entityId, entityType, ...params }) => {
try {
const { page, perPage } = params;
let entityIdToUse = entityId;
if (entityType === "AGENT") {
const agent = await getAgentFromSystem({ mastra, agentId: entityId });
entityIdToUse = agent.id;
} else if (entityType === "WORKFLOW") {
const workflow = mastra.getWorkflowById(entityId);
entityIdToUse = workflow.id;
}
const pagination = {
page: page ?? 0,
perPage: perPage ?? 10
};
const scoresStore = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scoresStore?.listScoresByEntityId?.({
entityId: entityIdToUse,
entityType,
pagination
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return handleError(error, "Error getting scores by entity id");
}
}
});
var SAVE_SCORE_ROUTE = createRoute({
method: "POST",
path: "/scores",
responseType: "json",
bodySchema: saveScoreBodySchema,
responseSchema: saveScoreResponseSchema,
summary: "Save score",
description: "Saves a new score record to storage",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, ...params }) => {
try {
const { score } = params;
const scoresStore = await mastra.getStorage()?.getStore("scores");
const result = await scoresStore?.saveScore?.(score);
if (!result) {
throw new HTTPException(500, { message: "Storage not configured" });
}
return result;
} catch (error) {
return handleError(error, "Error saving score");
}
}
});
export { GET_SCORER_ROUTE, LIST_SCORERS_ROUTE, LIST_SCORES_BY_ENTITY_ID_ROUTE, LIST_SCORES_BY_RUN_ID_ROUTE, LIST_SCORES_BY_SCORER_ID_ROUTE, SAVE_SCORE_ROUTE, scores_exports };
//# sourceMappingURL=chunk-5LOPQPIH.js.map
//# sourceMappingURL=chunk-5LOPQPIH.js.map
{"version":3,"sources":["../src/server/handlers/scores.ts"],"names":[],"mappings":"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","file":"chunk-5LOPQPIH.js","sourcesContent":["import type { MastraScorerEntry, ScoreRowData } from '@mastra/core/evals';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { HTTPException } from '../http-exception';\nimport { runIdSchema } from '../schemas/common';\nimport {\n listScorersResponseSchema,\n scorerEntrySchema,\n scorerIdPathParams,\n entityPathParams,\n listScoresByRunIdQuerySchema,\n listScoresByScorerIdQuerySchema,\n listScoresByEntityIdQuerySchema,\n saveScoreBodySchema,\n scoresWithPaginationResponseSchema,\n saveScoreResponseSchema,\n} from '../schemas/scores';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport type { Context } from '../types';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\n\nasync function listScorersFromSystem({\n mastra,\n requestContext,\n}: Context & {\n requestContext: RequestContext;\n}) {\n const agents = mastra.listAgents();\n const workflows = mastra.listWorkflows();\n\n const scorersMap = new Map<\n string,\n MastraScorerEntry & {\n agentIds: string[];\n agentNames: string[];\n workflowIds: string[];\n isRegistered: boolean;\n source: 'code' | 'stored';\n }\n >();\n\n // Helper function to process an agent's scorers\n const processAgentScorers = async (agent: {\n id: string;\n name: string;\n listScorers: (typeof agents)[string]['listScorers'];\n }) => {\n const scorers =\n (await agent.listScorers({\n requestContext,\n })) || {};\n\n if (Object.keys(scorers).length > 0) {\n for (const [_scorerId, scorer] of Object.entries(scorers)) {\n const scorerId = scorer.scorer.id;\n if (scorersMap.has(scorerId)) {\n scorersMap.get(scorerId)?.agentIds.push(agent.id);\n scorersMap.get(scorerId)?.agentNames.push(agent.name);\n } else {\n scorersMap.set(scorerId, {\n workflowIds: [],\n ...scorer,\n agentNames: [agent.name],\n agentIds: [agent.id],\n isRegistered: false,\n source: scorer.scorer.source ?? 'code',\n });\n }\n }\n }\n };\n\n // Process code-defined agents\n for (const [_, agent] of Object.entries(agents)) {\n await processAgentScorers(agent);\n }\n\n // Process stored agents (database-backed agents)\n try {\n const editor = mastra.getEditor();\n const storedAgentsResult = await editor?.agent.list();\n if (storedAgentsResult?.agents) {\n for (const storedAgentConfig of storedAgentsResult.agents) {\n try {\n const agent = await editor?.agent.getById(storedAgentConfig.id);\n if (agent) {\n await processAgentScorers(agent);\n }\n } catch {\n // Skip individual agents that fail to hydrate\n }\n }\n }\n } catch {\n // Silently ignore if storage is not configured - not all setups have storage\n }\n\n // Process stored scorers (standalone CMS-created scorers)\n try {\n const editor = mastra.getEditor();\n const storedScorersResult = await editor?.scorer.list();\n if (storedScorersResult?.scorerDefinitions) {\n for (const storedScorerConfig of storedScorersResult.scorerDefinitions) {\n try {\n await editor?.scorer.getById(storedScorerConfig.id);\n } catch {\n // Skip individual scorers that fail to hydrate\n }\n }\n }\n } catch {\n // Silently ignore if storage is not configured\n }\n\n for (const [workflowId, workflow] of Object.entries(workflows)) {\n const scorers =\n (await workflow.listScorers({\n requestContext,\n })) || {};\n\n if (Object.keys(scorers).length > 0) {\n for (const [_scorerId, scorer] of Object.entries(scorers)) {\n const scorerName = scorer.scorer.name;\n if (scorersMap.has(scorerName)) {\n scorersMap.get(scorerName)?.workflowIds.push(workflowId);\n } else {\n scorersMap.set(scorerName, {\n agentIds: [],\n agentNames: [],\n ...scorer,\n workflowIds: [workflowId],\n isRegistered: false,\n source: scorer.scorer.source ?? 'code',\n });\n }\n }\n }\n }\n\n const registeredScorers = await mastra.listScorers();\n for (const [_scorerId, scorer] of Object.entries(registeredScorers || {})) {\n const scorerId = scorer.id;\n if (scorersMap.has(scorerId)) {\n scorersMap.get(scorerId)!.isRegistered = true;\n } else {\n scorersMap.set(scorerId, {\n scorer: scorer,\n agentIds: [],\n agentNames: [],\n workflowIds: [],\n isRegistered: true,\n source: scorer.source ?? 'code',\n });\n }\n }\n\n return Object.fromEntries(scorersMap.entries());\n}\n\n// Legacy function to get trace and span details\nfunction getTraceDetails(traceIdWithSpanId?: string) {\n if (!traceIdWithSpanId) {\n return {};\n }\n\n const [traceId, spanId] = traceIdWithSpanId.split('-');\n\n return {\n ...(traceId ? { traceId } : {}),\n ...(spanId ? { spanId } : {}),\n };\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport const LIST_SCORERS_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorers',\n responseType: 'json',\n responseSchema: listScorersResponseSchema,\n summary: 'List all scorers',\n description: 'Returns a list of all registered scorers with their configuration and associated agents and workflows',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: (async ({ mastra, requestContext }: any) => {\n const scorers = await listScorersFromSystem({\n mastra,\n requestContext,\n });\n return scorers;\n }) as any,\n});\n\nexport const GET_SCORER_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorers/:scorerId',\n responseType: 'json',\n pathParamSchema: scorerIdPathParams,\n responseSchema: scorerEntrySchema.nullable(),\n summary: 'Get scorer by ID',\n description: 'Returns details for a specific scorer including its configuration and associations',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: (async ({ mastra, scorerId, requestContext }: any) => {\n const scorers = await listScorersFromSystem({\n mastra,\n requestContext,\n });\n\n const scorer = scorers[scorerId];\n\n if (!scorer) {\n return null;\n }\n\n return scorer;\n }) as any,\n});\n\nexport const LIST_SCORES_BY_RUN_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/run/:runId',\n responseType: 'json',\n pathParamSchema: runIdSchema,\n queryParamSchema: listScoresByRunIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by run ID',\n description: 'Returns all scores for a specific execution run',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, runId, ...params }) => {\n try {\n const { page, perPage } = params;\n const pagination: StoragePagination = {\n page: page ?? 0,\n perPage: perPage ?? 10,\n };\n const scores = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scores?.listScoresByRunId?.({\n runId,\n pagination,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by run id');\n }\n },\n});\n\nexport const LIST_SCORES_BY_SCORER_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorer/:scorerId',\n responseType: 'json',\n pathParamSchema: scorerIdPathParams,\n queryParamSchema: listScoresByScorerIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by scorer ID',\n description: 'Returns all scores generated by a specific scorer',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, scorerId, ...params }) => {\n try {\n const { page, perPage, entityId, entityType } = params;\n const filters = Object.fromEntries(Object.entries({ entityId, entityType }).filter(([_, v]) => v !== undefined));\n const scores = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scores?.listScoresByScorerId?.({\n scorerId,\n pagination: { page: page ?? 0, perPage: perPage ?? 10 },\n ...filters,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by scorer id');\n }\n },\n});\n\nexport const LIST_SCORES_BY_ENTITY_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/entity/:entityType/:entityId',\n responseType: 'json',\n pathParamSchema: entityPathParams,\n queryParamSchema: listScoresByEntityIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by entity ID',\n description: 'Returns all scores for a specific entity (agent or workflow)',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, entityId, entityType, ...params }) => {\n try {\n const { page, perPage } = params;\n let entityIdToUse = entityId;\n\n if (entityType === 'AGENT') {\n const agent = await getAgentFromSystem({ mastra, agentId: entityId });\n entityIdToUse = agent.id;\n } else if (entityType === 'WORKFLOW') {\n const workflow = mastra.getWorkflowById(entityId);\n entityIdToUse = workflow.id;\n }\n\n const pagination: StoragePagination = {\n page: page ?? 0,\n perPage: perPage ?? 10,\n };\n\n const scoresStore = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scoresStore?.listScoresByEntityId?.({\n entityId: entityIdToUse,\n entityType,\n pagination,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by entity id');\n }\n },\n});\n\nexport const SAVE_SCORE_ROUTE = createRoute({\n method: 'POST',\n path: '/scores',\n responseType: 'json',\n bodySchema: saveScoreBodySchema,\n responseSchema: saveScoreResponseSchema,\n summary: 'Save score',\n description: 'Saves a new score record to storage',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n try {\n const { score } = params as { score: ScoreRowData };\n const scoresStore = await mastra.getStorage()?.getStore('scores');\n const result = await scoresStore?.saveScore?.(score);\n if (!result) {\n throw new HTTPException(500, { message: 'Storage not configured' });\n }\n return result;\n } catch (error) {\n return handleError(error, 'Error saving score');\n }\n },\n});\n"]}
'use strict';
var chunkZCX2J552_cjs = require('./chunk-ZCX2J552.cjs');
var chunkFUEIM3CA_cjs = require('./chunk-FUEIM3CA.cjs');
var chunkTDMX66RN_cjs = require('./chunk-TDMX66RN.cjs');
var chunk2XZ2466F_cjs = require('./chunk-2XZ2466F.cjs');
var chunkM3UP3Z3G_cjs = require('./chunk-M3UP3Z3G.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
var chunkTIWGWGIO_cjs = require('./chunk-TIWGWGIO.cjs');
var chunkDIG2K5CV_cjs = require('./chunk-DIG2K5CV.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
// src/server/handlers/stored-agents.ts
async function resolveBrowserField(browser, mastra) {
if (browser === true) {
const editor = mastra.getEditor?.();
const builder = await editor?.resolveBuilder?.();
const defaultBrowser = builder?.getConfiguration?.()?.agent?.browser;
if (!defaultBrowser) {
console.warn(
"[mastra:server] Browser enabled (browser: true) but no default browser config found in builder configuration. The agent will be created/updated without browser access. Set `editor.builder.configuration.agent.browser` to fix this."
);
}
return defaultBrowser ?? void 0;
}
if (browser === false) {
return null;
}
return browser;
}
var AGENT_SNAPSHOT_CONFIG_FIELDS = [
"name",
"description",
"instructions",
"model",
"tools",
"defaultOptions",
"workflows",
"agents",
"integrationTools",
"toolProviders",
"inputProcessors",
"outputProcessors",
"memory",
"scorers",
"requestContextSchema",
"mcpClients",
"skills",
"workspace",
"browser"
];
var CODE_AGENT_OVERRIDE_FIELDS = [
"instructions",
"tools",
"integrationTools",
"mcpClients",
"requestContextSchema"
];
function getCodeAgentOwnership(editorConfig) {
if (editorConfig === false) {
return { ownsInstructions: false, ownsTools: false, ownsToolDescriptionsOnly: false };
}
if (editorConfig === void 0 || editorConfig === null) {
return { ownsInstructions: true, ownsTools: true, ownsToolDescriptionsOnly: false };
}
if (typeof editorConfig !== "object") {
return { ownsInstructions: false, ownsTools: false, ownsToolDescriptionsOnly: false };
}
const cfg = editorConfig;
const ownsInstructions = cfg.instructions === true;
const toolsCfg = cfg.tools;
const ownsTools = toolsCfg === true;
const ownsToolDescriptionsOnly = typeof toolsCfg === "object" && toolsCfg !== null && toolsCfg.description === true;
return { ownsInstructions, ownsTools, ownsToolDescriptionsOnly };
}
function hasNonEmptyInstructions(value) {
if (typeof value === "string") {
return value.trim().length > 0;
}
if (!Array.isArray(value)) {
return false;
}
return value.some((block) => {
if (!block || typeof block !== "object") {
return false;
}
const typedBlock = block;
if (typedBlock.type === "prompt_block_ref") {
return typeof typedBlock.id === "string" && typedBlock.id.length > 0;
}
return typeof typedBlock.content === "string" && typedBlock.content.trim().length > 0;
});
}
function assertOwnedInstructionsNotEmpty(instructions) {
if (!hasNonEmptyInstructions(instructions)) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Instructions are required" });
}
}
function sortForStableJson(value) {
if (Array.isArray(value)) {
return value.map(sortForStableJson);
}
if (value && typeof value === "object" && !(value instanceof Date)) {
return Object.fromEntries(
Object.entries(value).filter(([, entry]) => entry !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, sortForStableJson(entry)])
);
}
return value;
}
function buildExportConfig(input, agent) {
const editorConfig = agent?.__getEditorConfig?.();
const isCodeAgent = agent?.source === "code";
const allowedFields = isCodeAgent ? CODE_AGENT_OVERRIDE_FIELDS : AGENT_SNAPSHOT_CONFIG_FIELDS;
const ownership = isCodeAgent ? getCodeAgentOwnership(editorConfig) : null;
const config = {};
for (const field of allowedFields) {
if (input[field] === void 0) continue;
if (ownership) {
if (field === "instructions" && !ownership.ownsInstructions) continue;
if ((field === "tools" || field === "integrationTools" || field === "mcpClients") && !ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
continue;
}
}
config[field] = input[field];
}
return sortForStableJson(config);
}
function agentExportFilename(agentId) {
return `agents/${encodeURIComponent(agentId)}.json`;
}
function sourceChangeRequestHeadRef(agentId) {
const safeAgentId = agentId.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "agent";
return `mastra/${safeAgentId}`;
}
function sourceChangeRequestMessage(agentId, userName, changeMessage) {
const normalizedUserName = userName?.replace(/\s+/g, " ").trim();
const normalizedMessage = changeMessage?.replace(/\s+/g, " ").trim();
const message = normalizedMessage || `Update ${agentId} agent override`;
return normalizedUserName ? `${message} by ${normalizedUserName}` : message;
}
var LIST_STORED_AGENTS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/agents",
responseType: "json",
queryParamSchema: chunkTIWGWGIO_cjs.listStoredAgentsQuerySchema,
responseSchema: chunkTIWGWGIO_cjs.listStoredAgentsResponseSchema,
summary: "List stored agents",
description: "Returns a paginated list of all agents stored in the database",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
page,
perPage,
orderBy,
status,
authorId,
visibility,
metadata,
favoritedOnly,
pinFavoritedFor
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const filter = chunkKGUHJRHZ_cjs.resolveAuthorFilter({
requestContext,
resource: "stored-agents",
queryAuthorId: authorId,
queryVisibility: visibility === "public" ? "public" : void 0
});
const scope = await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext);
const scopedMetadata = chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(metadata, scope);
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
const favoritesEnabled = await chunkTDMX66RN_cjs.isBuilderFeatureEnabled(mastra, "favorites");
const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;
const favoriteSubjectId = pinFavoritedFor ?? callerId;
if (honoredStarredOnly) {
const effectivePerPage = perPage ?? 100;
if (!favoriteSubjectId) {
return { agents: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Favorites storage domain is not available" });
}
const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: "agent" });
if (starredIds.length === 0) {
return { agents: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const allMatching = await agentsStore.listResolved({
perPage: false,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata,
entityIds: starredIds
});
const visible = allMatching.agents.filter((record) => chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter));
const total = visible.length;
const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;
const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;
const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);
const annotated2 = sliced.map((record) => ({ ...record, isFavorited: true }));
const authors2 = await chunkM3UP3Z3G_cjs.prepareAuthorEnrichment(
mastra,
requestContext,
annotated2.map((a) => a.authorId)
);
const withAuthors2 = authors2 ? annotated2.map((record) => chunkM3UP3Z3G_cjs.attachAuthor(record, authors2)) : annotated2;
const hasMore = effectivePerPage > 0 && endIdx < total;
return { agents: withAuthors2, total, page, perPage: effectivePerPage, hasMore };
}
const result = await agentsStore.listResolved({
page,
perPage,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata
});
const visibleAgents = result.agents.filter((record) => chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter));
const authors = await chunkM3UP3Z3G_cjs.prepareAuthorEnrichment(
mastra,
requestContext,
visibleAgents.map((a) => a.authorId)
);
if (!favoritesEnabled) {
const stripped = visibleAgents.map(chunkFUEIM3CA_cjs.stripFavoriteFields);
const withAuthors2 = authors ? stripped.map((record) => chunkM3UP3Z3G_cjs.attachAuthor(record, authors)) : stripped;
return { ...result, agents: withAuthors2 };
}
const enrichment = await chunkFUEIM3CA_cjs.prepareFavoritesEnrichment(
mastra,
requestContext,
"agent",
visibleAgents.map((a) => a.id)
);
const annotated = enrichment ? visibleAgents.map((record) => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) })) : visibleAgents.map(chunkFUEIM3CA_cjs.stripFavoriteFields);
const withAuthors = authors ? annotated.map((record) => chunkM3UP3Z3G_cjs.attachAuthor(record, authors)) : annotated;
return { ...result, agents: withAuthors };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error listing stored agents");
}
}
});
async function buildStoredAgentExport({
mastra,
requestContext,
storedAgentId,
body
}) {
const storage = mastra.getStorage();
const agentsStore = storage ? await storage.getStore("agents") : void 0;
const storedAgent = await agentsStore?.getByIdResolved(storedAgentId, { status: "draft" });
if (storedAgent) {
chunkGZ4HWZWE_cjs.assertStoredResourceScope(storedAgent, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: storedAgent });
}
let codeAgent;
try {
codeAgent = mastra.getAgentById?.(storedAgentId);
} catch {
codeAgent = void 0;
}
if (!storedAgent && !codeAgent) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Agent with id ${storedAgentId} not found` });
}
const config = buildExportConfig(body, codeAgent);
const content = `${JSON.stringify(config, null, 2)}
`;
return {
agentId: storedAgentId,
fileName: agentExportFilename(storedAgentId),
content,
config
};
}
var EXPORT_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/agents/:storedAgentId/export",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
bodySchema: chunkTIWGWGIO_cjs.exportStoredAgentBodySchema,
responseSchema: chunkTIWGWGIO_cjs.exportStoredAgentResponseSchema,
summary: "Export stored agent override JSON",
description: "Returns deterministic JSON for an agent configuration or code-agent override without mutating storage",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, ...body }) => {
try {
return await buildStoredAgentExport({ mastra, requestContext, storedAgentId, body });
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error exporting stored agent");
}
}
});
var OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/agents/:storedAgentId/change-request",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
bodySchema: chunkTIWGWGIO_cjs.openStoredAgentChangeRequestBodySchema,
responseSchema: chunkTIWGWGIO_cjs.openStoredAgentChangeRequestResponseSchema,
summary: "Open stored agent source change request",
description: "Opens a source-provider change request for deterministic agent override JSON without mutating storage",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, ...body }) => {
try {
const provider = mastra.getEditor?.()?.getSourceControlProvider?.();
if (!provider?.openChangeRequest) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Source control provider cannot open change requests" });
}
const openChangeRequest = provider.openChangeRequest.bind(provider);
const { changeMessage, userName, inspectOnly, ...exportBody } = body;
const headRef = sourceChangeRequestHeadRef(storedAgentId);
const title = `Update ${storedAgentId} agent override`;
const result = inspectOnly ? await openChangeRequest({
title,
headRef,
files: []
}) : await (async () => {
const response = await buildStoredAgentExport({ mastra, requestContext, storedAgentId, body: exportBody });
const message = sourceChangeRequestMessage(storedAgentId, userName, changeMessage);
return openChangeRequest({
title,
body: `Updates ${response.fileName} from Mastra Studio.`,
headRef,
files: [
{
path: response.fileName,
content: response.content,
message
}
]
});
})();
const storage = mastra.getStorage();
const agentsStore = storage ? await storage.getStore("agents") : void 0;
await agentsStore?.useProviderRef?.(storedAgentId, result.ref ?? headRef);
mastra.getEditor?.()?.agent?.clearCache?.(storedAgentId);
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error opening stored agent change request");
}
}
});
var GET_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
queryParamSchema: chunkDIG2K5CV_cjs.statusQuerySchema,
responseSchema: chunkTIWGWGIO_cjs.getStoredAgentResponseSchema,
summary: "Get stored agent by ID",
description: "Returns a specific agent from storage by its unique identifier. Use ?status=draft to resolve with the latest (draft) version, or ?status=published (default) for the active published version.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, status }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const agent = await agentsStore.getByIdResolved(storedAgentId, { status });
if (!agent) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(agent, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const authors = await chunkM3UP3Z3G_cjs.prepareAuthorEnrichment(mastra, requestContext, [agent.authorId]);
const withFavorite = await chunkFUEIM3CA_cjs.enrichOrStripFavorites(mastra, requestContext, "agent", agent);
return chunkM3UP3Z3G_cjs.attachAuthor(withFavorite, authors);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting stored agent");
}
}
});
var CREATE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/agents",
responseType: "json",
bodySchema: chunkTIWGWGIO_cjs.createStoredAgentBodySchema,
responseSchema: chunkTIWGWGIO_cjs.createStoredAgentResponseSchema,
summary: "Create stored agent",
description: "Creates a new agent in storage with the provided configuration",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
id: providedId,
metadata,
visibility: bodyVisibility,
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser,
requestContextSchema
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const id = providedId || chunkGZ4HWZWE_cjs.toSlug(name);
if (!id) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "Could not derive agent ID from name. Please provide an explicit id."
});
}
const existing = await agentsStore.getById(id);
if (existing) {
throw new chunk64ITUOXI_cjs.HTTPException(409, { message: `Agent with id ${id} already exists` });
}
const authorId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext) ?? void 0;
const visibility = authorId ? bodyVisibility ?? "private" : "public";
chunkZCX2J552_cjs.validateMetadataAvatarUrl(metadata);
const resolvedBrowser = await resolveBrowserField(browser, mastra);
let createInstructions = instructions;
let createTools = tools;
let createIntegrationTools = integrationTools;
let createMcpClients = mcpClients;
let codeAgentForCreate;
try {
codeAgentForCreate = mastra.getAgentById?.(id);
} catch {
codeAgentForCreate = void 0;
}
if (codeAgentForCreate?.source === "code") {
const ownership = getCodeAgentOwnership(codeAgentForCreate.__getEditorConfig?.());
if (ownership.ownsInstructions) {
assertOwnedInstructionsNotEmpty(createInstructions);
} else {
createInstructions = void 0;
}
if (!ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
createTools = void 0;
createIntegrationTools = void 0;
createMcpClients = void 0;
}
}
const input = {
id,
authorId,
visibility,
metadata: chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(metadata, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext)),
name,
description,
instructions: createInstructions,
model,
tools: createTools,
defaultOptions,
workflows,
agents,
integrationTools: createIntegrationTools,
toolProviders,
mcpClients: createMcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
};
const editor = mastra.getEditor?.();
if (editor) {
await editor.agent.create(input);
} else {
await agentsStore.create({ agent: input });
}
const { versions } = await agentsStore.listVersions({ agentId: id, perPage: 1 });
const initialVersion = versions[0];
if (initialVersion) {
await agentsStore.update({
id,
activeVersionId: initialVersion.id,
status: "published"
});
editor?.agent.clearCache(id);
}
const resolved = await agentsStore.getByIdResolved(id, { status: "published" });
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve created agent" });
}
return chunkFUEIM3CA_cjs.enrichOrStripFavorites(mastra, requestContext, "agent", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error creating stored agent");
}
}
});
var UPDATE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "PATCH",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
bodySchema: chunkTIWGWGIO_cjs.updateStoredAgentBodySchema,
responseSchema: chunkTIWGWGIO_cjs.updateStoredAgentResponseSchema,
summary: "Update stored agent",
description: "Updates an existing agent in storage with the provided fields",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
storedAgentId,
// Metadata-level fields
authorId,
metadata,
visibility,
// Config fields (snapshot-level)
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser,
requestContextSchema,
// Version metadata
changeMessage
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const existing = await agentsStore.getById(storedAgentId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
const scope = await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext);
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, scope);
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-agents",
resourceId: storedAgentId,
action: "edit",
record: existing
});
chunkZCX2J552_cjs.validateMetadataAvatarUrl(metadata);
const callerAuthorId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext) ?? void 0;
const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? "public" : void 0;
const resolvedBrowser = await resolveBrowserField(browser, mastra);
let codeAgentForUpdate;
try {
codeAgentForUpdate = mastra.getAgentById?.(storedAgentId);
} catch {
codeAgentForUpdate = void 0;
}
if (codeAgentForUpdate?.source === "code") {
const ownership = getCodeAgentOwnership(codeAgentForUpdate.__getEditorConfig?.());
if (ownership.ownsInstructions) {
if (instructions !== void 0) {
assertOwnedInstructionsNotEmpty(instructions);
}
} else {
instructions = void 0;
}
if (!ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
tools = void 0;
integrationTools = void 0;
mcpClients = void 0;
}
}
const mergedMetadata = { ...existing.metadata ?? {}, ...metadata ?? {} };
const scopedMetadata = chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(mergedMetadata, scope);
const updatedAgent = await agentsStore.update({
id: storedAgentId,
authorId,
metadata: scopedMetadata,
visibility: resolvedVisibility,
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
});
const configFields = {
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
};
const providedConfigFields = Object.fromEntries(Object.entries(configFields).filter(([_, v]) => v !== void 0));
const autoVersionResult = await chunk2XZ2466F_cjs.handleAutoVersioning(
agentsStore,
storedAgentId,
"agentId",
AGENT_SNAPSHOT_CONFIG_FIELDS,
existing,
updatedAgent,
providedConfigFields,
changeMessage ? { changeMessage } : void 0
);
if (!autoVersionResult) {
throw new Error("handleAutoVersioning returned undefined");
}
const isCodeSource = mastra.getEditor?.()?.getSource?.() === "code";
if (isCodeSource && autoVersionResult.versionCreated && !changeMessage) {
const { versions } = await agentsStore.listVersions({ agentId: storedAgentId, perPage: 2 });
const previousVersion = versions[1];
if (previousVersion) {
await agentsStore.deleteVersion(previousVersion.id);
}
}
if (autoVersionResult.versionCreated) {
const { versions } = await agentsStore.listVersions({ agentId: storedAgentId, perPage: 1 });
const latestVersion = versions[0];
if (latestVersion) {
await agentsStore.update({
id: storedAgentId,
activeVersionId: latestVersion.id
});
}
}
const editor = mastra.getEditor();
if (editor) {
editor.agent.clearCache(storedAgentId);
}
const resolved = await agentsStore.getByIdResolved(storedAgentId, { status: "draft" });
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve updated agent" });
}
return chunkFUEIM3CA_cjs.enrichOrStripFavorites(mastra, requestContext, "agent", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error updating stored agent");
}
}
});
var DELETE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
responseSchema: chunkTIWGWGIO_cjs.deleteStoredAgentResponseSchema,
summary: "Delete stored agent",
description: "Deletes an agent from storage by its unique identifier",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const existing = await agentsStore.getById(storedAgentId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-agents",
resourceId: storedAgentId,
action: "delete",
record: existing
});
await agentsStore.delete(storedAgentId);
try {
const favoritesStore = await storage.getStore("favorites");
await favoritesStore?.deleteFavoritesForEntity({ entityType: "agent", entityId: storedAgentId });
} catch (cascadeError) {
mastra.getLogger?.()?.warn?.("Failed to cascade-delete favorites for agent", { storedAgentId, error: cascadeError });
}
mastra.getEditor()?.agent.clearCache(storedAgentId);
return { success: true, message: `Agent ${storedAgentId} deleted successfully` };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error deleting stored agent");
}
}
});
var GET_STORED_AGENT_DEPENDENTS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/agents/:storedAgentId/dependents",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
responseSchema: chunkTIWGWGIO_cjs.getStoredAgentDependentsResponseSchema,
summary: "List dependents of a stored agent",
description: "Returns agents that reference the target as a sub-agent. Used to warn before deleting or unsharing. Caller-readable references appear in `dependents` (id + name); cross-workspace references the caller cannot read are aggregated in `hiddenCount` and only surfaced when the target is public.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentsStore = await storage.getStore("agents");
if (!agentsStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const target = await agentsStore.getById(storedAgentId);
if (!target) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(target, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: target });
const filter = chunkKGUHJRHZ_cjs.resolveAuthorFilter({ requestContext, resource: "stored-agents" });
const all = await agentsStore.listResolved({
perPage: false,
status: "published"
});
const targetIsPublic = target.visibility === "public";
const dependents = [];
let hiddenCount = 0;
for (const record of all.agents) {
if (record.id === storedAgentId) continue;
if (!referencesTarget(record.agents, storedAgentId)) continue;
if (chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter)) {
dependents.push({
id: record.id,
name: record.name ?? record.id
});
} else if (targetIsPublic) {
hiddenCount += 1;
}
}
return { dependents, hiddenCount };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error listing stored agent dependents");
}
}
});
function referencesTarget(subAgents, targetId) {
if (!subAgents) return false;
if (Array.isArray(subAgents)) {
return subAgents.some((variant) => {
const value = variant?.value;
return Boolean(value && typeof value === "object" && Object.prototype.hasOwnProperty.call(value, targetId));
});
}
if (typeof subAgents === "object") {
return Object.prototype.hasOwnProperty.call(subAgents, targetId);
}
return false;
}
var PREVIEW_INSTRUCTIONS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/agents/preview-instructions",
responseType: "json",
bodySchema: chunkTIWGWGIO_cjs.previewInstructionsBodySchema,
responseSchema: chunkTIWGWGIO_cjs.previewInstructionsResponseSchema,
summary: "Preview resolved instructions",
description: "Resolves an array of instruction blocks against a request context, evaluating rules, fetching prompt block references, and rendering template variables. Returns the final concatenated instruction string.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, blocks, context }) => {
try {
const editor = mastra.getEditor();
if (!editor) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Editor is not configured" });
}
const result = await editor.prompt.preview(blocks, context ?? {});
return { result };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error previewing instructions");
}
}
});
exports.CREATE_STORED_AGENT_ROUTE = CREATE_STORED_AGENT_ROUTE;
exports.DELETE_STORED_AGENT_ROUTE = DELETE_STORED_AGENT_ROUTE;
exports.EXPORT_STORED_AGENT_ROUTE = EXPORT_STORED_AGENT_ROUTE;
exports.GET_STORED_AGENT_DEPENDENTS_ROUTE = GET_STORED_AGENT_DEPENDENTS_ROUTE;
exports.GET_STORED_AGENT_ROUTE = GET_STORED_AGENT_ROUTE;
exports.LIST_STORED_AGENTS_ROUTE = LIST_STORED_AGENTS_ROUTE;
exports.OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE = OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE;
exports.PREVIEW_INSTRUCTIONS_ROUTE = PREVIEW_INSTRUCTIONS_ROUTE;
exports.UPDATE_STORED_AGENT_ROUTE = UPDATE_STORED_AGENT_ROUTE;
//# sourceMappingURL=chunk-6TFOQW4W.cjs.map
//# sourceMappingURL=chunk-6TFOQW4W.cjs.map

Sorry, the diff of this file is too big to display

import { conversationObjectSchema, createConversationBodySchema, conversationIdPathParams, conversationItemsListSchema, conversationDeletedSchema } from './chunk-WOE6XG6B.js';
import { mapMastraMessagesToConversationItems } from './chunk-TLLV2JP5.js';
import { getAgentMemoryStore, findConversationThreadAcrossAgents } from './chunk-RY5RETAD.js';
import { getAgentFromSystem } from './chunk-L6FOTAND.js';
import { MastraFGAPermissions, getEffectiveResourceId } from './chunk-3ENQND57.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { __export } from './chunk-PR4QN5HX.js';
import { randomUUID } from 'crypto';
// src/server/handlers/conversations.ts
var conversations_exports = {};
__export(conversations_exports, {
CREATE_CONVERSATION_ROUTE: () => CREATE_CONVERSATION_ROUTE,
DELETE_CONVERSATION_ROUTE: () => DELETE_CONVERSATION_ROUTE,
GET_CONVERSATION_ITEMS_ROUTE: () => GET_CONVERSATION_ITEMS_ROUTE,
GET_CONVERSATION_ROUTE: () => GET_CONVERSATION_ROUTE
});
function buildConversationObject({ thread }) {
return {
id: thread.id,
object: "conversation",
thread
};
}
function buildConversationItemsList(items) {
return {
object: "list",
data: items,
first_id: items[0]?.id ?? null,
last_id: items.at(-1)?.id ?? null,
has_more: false
};
}
function buildConversationDeleted(conversationId) {
return {
id: conversationId,
object: "conversation.deleted",
deleted: true
};
}
var CREATE_CONVERSATION_ROUTE = createRoute({
method: "POST",
path: "/v1/conversations",
responseType: "json",
bodySchema: createConversationBodySchema,
responseSchema: conversationObjectSchema,
summary: "Create a conversation",
description: "Creates a new thread-backed conversation for agent-backed Responses API requests",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_CREATE,
handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {
try {
if (!mastra) {
throw new HTTPException(500, { message: "Mastra instance is required for conversations" });
}
const agent = await getAgentFromSystem({ mastra, agentId: agent_id });
const memory = await agent.getMemory({ requestContext });
if (!memory) {
throw new HTTPException(400, { message: `Agent "${agent.id}" does not have memory configured` });
}
if (!await getAgentMemoryStore({ agent, requestContext })) {
throw new HTTPException(400, { message: `Memory storage is not configured for agent "${agent.id}"` });
}
const threadId = conversation_id ?? randomUUID();
const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;
const thread = await memory.createThread({
threadId,
resourceId,
title,
metadata
});
return buildConversationObject({ thread });
} catch (error) {
return handleError(error, "Error creating conversation");
}
}
});
var GET_CONVERSATION_ROUTE = createRoute({
method: "GET",
path: "/v1/conversations/:conversationId",
responseType: "json",
pathParamSchema: conversationIdPathParams,
responseSchema: conversationObjectSchema,
summary: "Retrieve a conversation",
description: "Returns a conversation object backed by a Mastra memory thread",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
return buildConversationObject({ thread: match.thread });
} catch (error) {
return handleError(error, "Error retrieving conversation");
}
}
});
var GET_CONVERSATION_ITEMS_ROUTE = createRoute({
method: "GET",
path: "/v1/conversations/:conversationId/items",
responseType: "json",
pathParamSchema: conversationIdPathParams,
responseSchema: conversationItemsListSchema,
summary: "List conversation items",
description: "Returns OpenAI-style conversation items derived from the stored thread messages",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
const { messages } = await match.memoryStore.listMessages({
threadId: conversationId,
page: 0,
perPage: 1e3
});
return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));
} catch (error) {
return handleError(error, "Error retrieving conversation");
}
}
});
var DELETE_CONVERSATION_ROUTE = createRoute({
method: "DELETE",
path: "/v1/conversations/:conversationId",
responseType: "json",
pathParamSchema: conversationIdPathParams,
responseSchema: conversationDeletedSchema,
summary: "Delete a conversation",
description: "Deletes a thread-backed conversation and its stored items",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_DELETE,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
await match.memoryStore.deleteThread({ threadId: conversationId });
return buildConversationDeleted(conversationId);
} catch (error) {
return handleError(error, "Error deleting conversation");
}
}
});
export { CREATE_CONVERSATION_ROUTE, DELETE_CONVERSATION_ROUTE, GET_CONVERSATION_ITEMS_ROUTE, GET_CONVERSATION_ROUTE, conversations_exports };
//# sourceMappingURL=chunk-BJPP22F6.js.map
//# sourceMappingURL=chunk-BJPP22F6.js.map
{"version":3,"sources":["../src/server/handlers/conversations.ts"],"names":[],"mappings":"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","file":"chunk-BJPP22F6.js","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n conversationDeletedSchema,\n conversationIdPathParams,\n conversationItemsListSchema,\n conversationObjectSchema,\n createConversationBodySchema,\n} from '../schemas/conversations';\nimport type { ConversationDeleted, ConversationItemsList, ConversationObject } from '../schemas/conversations';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { mapMastraMessagesToConversationItems } from './responses.adapter';\nimport { findConversationThreadAcrossAgents, getAgentMemoryStore } from './responses.storage';\nimport { getEffectiveResourceId } from './utils';\n\nfunction buildConversationObject({ thread }: { thread: ConversationObject['thread'] }): ConversationObject {\n return {\n id: thread.id,\n object: 'conversation',\n thread,\n };\n}\n\nfunction buildConversationItemsList(items: ConversationItemsList['data']): ConversationItemsList {\n return {\n object: 'list',\n data: items,\n first_id: items[0]?.id ?? null,\n last_id: items.at(-1)?.id ?? null,\n has_more: false,\n };\n}\n\nfunction buildConversationDeleted(conversationId: string): ConversationDeleted {\n return {\n id: conversationId,\n object: 'conversation.deleted',\n deleted: true,\n };\n}\n\nexport const CREATE_CONVERSATION_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/conversations',\n responseType: 'json',\n bodySchema: createConversationBodySchema,\n responseSchema: conversationObjectSchema,\n summary: 'Create a conversation',\n description: 'Creates a new thread-backed conversation for agent-backed Responses API requests',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_CREATE,\n handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {\n try {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for conversations' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId: agent_id });\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new HTTPException(400, { message: `Agent \"${agent.id}\" does not have memory configured` });\n }\n if (!(await getAgentMemoryStore({ agent, requestContext }))) {\n throw new HTTPException(400, { message: `Memory storage is not configured for agent \"${agent.id}\"` });\n }\n\n const threadId = conversation_id ?? randomUUID();\n const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;\n const thread = await memory.createThread({\n threadId,\n resourceId,\n title,\n metadata,\n });\n\n return buildConversationObject({ thread });\n } catch (error) {\n return handleError(error, 'Error creating conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationObjectSchema,\n summary: 'Retrieve a conversation',\n description: 'Returns a conversation object backed by a Mastra memory thread',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n return buildConversationObject({ thread: match.thread });\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId/items',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationItemsListSchema,\n summary: 'List conversation items',\n description: 'Returns OpenAI-style conversation items derived from the stored thread messages',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n const { messages } = await match.memoryStore.listMessages({\n threadId: conversationId,\n page: 0,\n perPage: 1000,\n });\n\n return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const DELETE_CONVERSATION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationDeletedSchema,\n summary: 'Delete a conversation',\n description: 'Deletes a thread-backed conversation and its stored items',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await match.memoryStore.deleteThread({ threadId: conversationId });\n\n return buildConversationDeleted(conversationId);\n } catch (error) {\n return handleError(error, 'Error deleting conversation');\n }\n },\n});\n"]}
import { responseObjectSchema, createResponseBodySchema, responseIdPathParams, deleteResponseSchema } from './chunk-BIUL4Y6W.js';
import { mapResponseTurnRecordToResponse, mapResponseInputToExecutionMessages, mapMastraToolsToResponseTools, createMessageId, buildCompletedResponse, buildInProgressResponse, createResponseStreamEventTranslator, createOutputTextPart, toResponseUsage, toResponseStatus, formatSseEvent } from './chunk-TLLV2JP5.js';
import { findResponseTurnRecordAcrossAgents, deleteResponseTurnRecord, findResponseTurnRecord, resolveResponseTurnMessagesForStorage, getAgentMemoryStore, persistResponseTurnRecord } from './chunk-RY5RETAD.js';
import { getAgentFromSystem } from './chunk-L6FOTAND.js';
import { MastraFGAPermissions, getEffectiveThreadId, getEffectiveResourceId, enforceThreadAccess } from './chunk-3ENQND57.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { __export } from './chunk-PR4QN5HX.js';
import { randomUUID } from 'crypto';
// src/server/handlers/responses.ts
var responses_exports = {};
__export(responses_exports, {
CREATE_RESPONSE_ROUTE: () => CREATE_RESPONSE_ROUTE,
DELETE_RESPONSE_ROUTE: () => DELETE_RESPONSE_ROUTE,
GET_RESPONSE_ROUTE: () => GET_RESPONSE_ROUTE
});
var JSON_OBJECT_RESPONSE_SCHEMA = {
type: "object",
additionalProperties: true
};
function jsonResponse(data, status = 200) {
return new Response(JSON.stringify(data), {
status,
headers: {
"Content-Type": "application/json"
}
});
}
function createStructuredOutput(text) {
if (!text) {
return void 0;
}
switch (text.format.type) {
case "json_object":
return {
schema: JSON_OBJECT_RESPONSE_SCHEMA,
jsonPromptInjection: true
};
case "json_schema":
return {
schema: text.format.schema
};
default:
return void 0;
}
}
function getStreamedMessageOutputItem(response, responseId) {
return response.output.find(
(item) => item.type === "message" && item.id === responseId
) ?? null;
}
async function resolveThreadExecutionContext({
agent,
store,
conversationId,
previousResponseTurnRecord,
requestContext
}) {
if (conversationId && previousResponseTurnRecord && previousResponseTurnRecord.thread.id !== conversationId) {
throw new HTTPException(400, {
message: "conversation_id and previous_response_id must reference the same conversation thread when both are provided"
});
}
if (previousResponseTurnRecord) {
return {
threadId: previousResponseTurnRecord.thread.id,
resourceId: previousResponseTurnRecord.thread.resourceId
};
}
const effectiveThreadId = getEffectiveThreadId(requestContext, void 0);
const effectiveResourceId = getEffectiveResourceId(requestContext, void 0);
if (!store && !conversationId && !effectiveThreadId) {
return null;
}
const memory = await agent.getMemory({ requestContext });
if (!memory) {
if (conversationId) {
throw new HTTPException(400, {
message: "conversation_id requires the target agent to have memory configured"
});
}
return null;
}
if (conversationId) {
const existingThread2 = await memory.getThreadById({ threadId: conversationId });
if (!existingThread2) {
throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
await enforceThreadAccess({
mastra: agent.getMastraInstance(),
requestContext,
threadId: conversationId,
thread: existingThread2,
effectiveResourceId
});
return {
threadId: existingThread2.id,
resourceId: effectiveResourceId ?? existingThread2.resourceId
};
}
if (!effectiveThreadId) {
if (!store) {
return null;
}
const threadId2 = randomUUID();
const createdThread2 = await memory.createThread({
threadId: threadId2,
resourceId: effectiveResourceId ?? threadId2
});
return {
threadId: createdThread2.id,
resourceId: createdThread2.resourceId
};
}
const threadId = effectiveThreadId;
const existingThread = await memory.getThreadById({ threadId });
if (existingThread) {
await enforceThreadAccess({
mastra: agent.getMastraInstance(),
requestContext,
threadId,
thread: existingThread,
effectiveResourceId
});
return {
threadId: existingThread.id,
resourceId: effectiveResourceId ?? existingThread.resourceId
};
}
if (!store) {
return null;
}
const resourceId = effectiveResourceId ?? threadId;
const createdThread = await memory.createThread({
threadId,
resourceId
});
return {
threadId: createdThread.id,
resourceId: createdThread.resourceId
};
}
function createExecutionMemory(threadContext) {
if (!threadContext) {
return void 0;
}
return {
memory: {
thread: threadContext.threadId,
resource: threadContext.resourceId
}
};
}
async function resolveResponseAgent({
mastra,
agentId
}) {
if (!agentId) {
throw new HTTPException(400, {
message: "Responses requests require an agent_id"
});
}
if (!mastra) {
throw new HTTPException(500, { message: "Mastra instance is required for agent-backed responses" });
}
return getAgentFromSystem({ mastra, agentId });
}
async function resolveAgentMemoryStore({
agent,
requestContext,
errorMessage
}) {
const agentMemoryStore = await getAgentMemoryStore({ agent, requestContext });
if (!agentMemoryStore) {
throw new HTTPException(400, { message: errorMessage });
}
return agentMemoryStore;
}
async function executeGenerate({
agent,
resolvedModel,
modelOverride,
instructions,
text,
providerOptions,
input,
requestContext,
abortSignal,
threadContext
}) {
const executionMemory = createExecutionMemory(threadContext);
const structuredOutput = createStructuredOutput(text);
const modelOption = modelOverride ? { model: modelOverride } : {};
const commonOptions = {
instructions,
requestContext,
abortSignal,
...modelOption,
structuredOutput,
providerOptions,
...executionMemory ?? {}
};
if (resolvedModel.specificationVersion === "v1") {
if (threadContext) {
return await agent.generateLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions,
resourceId: threadContext.resourceId,
threadId: threadContext.threadId
});
}
return await agent.generateLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions
});
}
return await agent.generate(input, commonOptions);
}
async function executeStream({
agent,
resolvedModel,
modelOverride,
instructions,
text,
providerOptions,
input,
requestContext,
abortSignal,
threadContext
}) {
const executionMemory = createExecutionMemory(threadContext);
const structuredOutput = createStructuredOutput(text);
const modelOption = modelOverride ? { model: modelOverride } : {};
const commonOptions = {
instructions,
requestContext,
abortSignal,
...modelOption,
structuredOutput,
providerOptions,
...executionMemory ?? {}
};
if (resolvedModel.specificationVersion === "v1") {
if (threadContext) {
return await agent.streamLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions,
resourceId: threadContext.resourceId,
threadId: threadContext.threadId
});
}
return await agent.streamLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions
});
}
return await agent.stream(input, commonOptions);
}
async function resolveUsage(result) {
return await (result.totalUsage ?? result.usage ?? null);
}
async function resolveProviderMetadata(result) {
return await (result.providerMetadata ?? void 0);
}
async function resolveFinishReason(result) {
return await result.finishReason ?? void 0;
}
async function resolveText(result) {
return await result.text ?? "";
}
async function resolveCompletedResponseState(result, fallbackText) {
const usage = await resolveUsage(result);
return {
completedAt: Math.floor(Date.now() / 1e3),
status: toResponseStatus(await resolveFinishReason(result)),
text: await resolveText(result) || fallbackText,
usage,
usageDetails: toResponseUsage(usage),
providerOptions: await resolveProviderMetadata(result)
};
}
async function storeCompletedResponse({
agentMemoryStore,
didStore,
threadContext,
responseId,
metadata,
completedState,
messages,
outputItems
}) {
if (!didStore || !threadContext) {
return;
}
await persistResponseTurnRecord({
memoryStore: agentMemoryStore,
responseId,
metadata: {
...metadata,
completedAt: completedState.completedAt,
status: completedState.status,
usage: completedState.usageDetails,
providerOptions: completedState.providerOptions,
messageIds: [],
outputItems
},
threadContext,
messages
});
}
async function finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result,
responseId,
createdAt,
model,
instructions,
previousResponseId,
conversationId,
configuredTools,
responseMetadata,
fallbackText,
fallbackOutputItems
}) {
const completedState = await resolveCompletedResponseState(result, fallbackText);
const fallbackItems = fallbackOutputItems?.(completedState);
const responseMessages = await resolveResponseTurnMessagesForStorage({
result,
responseId,
text: completedState.text,
threadContext,
fallbackOutputItems: threadContext ? fallbackItems : void 0
});
const response = buildCompletedResponse({
responseId,
outputMessageId: responseId,
model,
createdAt,
completedAt: completedState.completedAt,
status: completedState.status,
text: completedState.text,
usage: completedState.usage,
instructions,
textConfig: responseMetadata.text,
previousResponseId,
conversationId,
providerOptions: completedState.providerOptions,
tools: configuredTools,
messages: responseMessages,
fallbackOutputItems: fallbackItems,
store: didStore
});
await storeCompletedResponse({
agentMemoryStore,
didStore,
threadContext,
responseId,
metadata: responseMetadata,
completedState,
messages: responseMessages,
outputItems: response.output
});
return { completedState, response, responseMessages };
}
async function prepareCreateResponseRequest({
body,
mastra,
requestContext
}) {
const executionInput = mapResponseInputToExecutionMessages(body.input);
let previousResponseTurnRecord = null;
let resolvedAgent = null;
if (body.previous_response_id) {
if (body.agent_id) {
resolvedAgent = await resolveResponseAgent({ mastra, agentId: body.agent_id });
previousResponseTurnRecord = await findResponseTurnRecord({
agent: resolvedAgent,
responseId: body.previous_response_id,
requestContext
});
if (!previousResponseTurnRecord) {
const owningResponseTurnRecord = await findResponseTurnRecordAcrossAgents({
mastra,
responseId: body.previous_response_id,
requestContext
});
if (owningResponseTurnRecord) {
if (owningResponseTurnRecord.metadata.agentId === body.agent_id) {
previousResponseTurnRecord = owningResponseTurnRecord;
} else {
throw new HTTPException(400, {
message: `Stored response ${body.previous_response_id} belongs to agent ${owningResponseTurnRecord.metadata.agentId}, not ${body.agent_id}`
});
}
}
if (!previousResponseTurnRecord) {
throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });
}
}
} else {
if (!mastra) {
throw new HTTPException(500, { message: "Mastra instance is required for agent-backed responses" });
}
previousResponseTurnRecord = await findResponseTurnRecordAcrossAgents({
mastra,
responseId: body.previous_response_id,
requestContext
});
if (!previousResponseTurnRecord) {
throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });
}
}
}
const agent = resolvedAgent ?? await resolveResponseAgent({
mastra,
agentId: body.agent_id ?? previousResponseTurnRecord?.metadata.agentId
});
const resolvedModel = await agent.getModel({
requestContext,
modelConfig: body.model
});
const responseModel = body.model ?? (() => {
if (resolvedModel.provider && resolvedModel.modelId) {
const publicProviderId = resolvedModel.provider.includes(".") ? resolvedModel.provider.split(".")[0] : resolvedModel.provider;
return `${publicProviderId}/${resolvedModel.modelId}`;
}
if (resolvedModel.modelId) {
return resolvedModel.modelId;
}
throw new HTTPException(500, {
message: "Responses route could not determine the effective model for this request"
});
})();
const shouldStore = body.store ?? false;
const needsMemoryStore = shouldStore || Boolean(body.conversation_id) || Boolean(body.previous_response_id);
const agentMemoryStore = needsMemoryStore ? await resolveAgentMemoryStore({
agent,
requestContext,
errorMessage: body.previous_response_id ? "previous_response_id requires the target agent to have memory storage configured" : shouldStore ? "Stored responses require the target agent to have memory storage configured" : "conversation_id requires the target agent to have memory storage configured"
}) : null;
const configuredTools = mapMastraToolsToResponseTools(
await Promise.resolve(agent.listTools({ requestContext }))
);
const responseId = createMessageId();
const createdAt = Math.floor(Date.now() / 1e3);
const threadContext = await resolveThreadExecutionContext({
agent,
store: shouldStore,
conversationId: body.conversation_id,
previousResponseTurnRecord,
requestContext
});
if (shouldStore && !threadContext) {
throw new HTTPException(400, {
message: "Stored responses require the target agent to have memory configured"
});
}
const didStore = shouldStore && Boolean(threadContext);
return {
agent,
agentMemoryStore,
configuredTools,
createdAt,
didStore,
executionInput,
previousResponseTurnRecord,
resolvedModel,
responseId,
responseModel,
responseMetadata: {
agentId: agent.id,
model: responseModel,
createdAt,
instructions: body.instructions,
text: body.text,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
tools: configuredTools,
store: didStore
},
threadContext
};
}
function createResponseEventStream({
agentMemoryStore,
body,
configuredTools,
createdAt,
didStore,
previousResponseTurnRecord,
responseId,
responseModel,
responseMetadata,
streamResult,
threadContext
}) {
const createdResponse = buildInProgressResponse({
responseId,
model: responseModel,
createdAt,
instructions: body.instructions,
textConfig: body.text,
previousResponseId: body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
tools: configuredTools,
store: didStore
});
return new ReadableStream({
async start(controller) {
let sequenceNumber = 1;
const enqueueEvent = (eventName, payload) => {
controller.enqueue(
formatSseEvent(eventName, {
...payload,
sequence_number: sequenceNumber++
})
);
};
enqueueEvent("response.created", {
type: "response.created",
response: createdResponse
});
enqueueEvent("response.in_progress", {
type: "response.in_progress",
response: createdResponse
});
const streamEvents = createResponseStreamEventTranslator(responseId);
const fullStream = await streamResult.fullStream;
const reader = fullStream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
for (const event of streamEvents.consume(value)) {
enqueueEvent(event.event, event.payload);
}
}
for (const event of streamEvents.flushPendingToolResults()) {
enqueueEvent(event.event, event.payload);
}
const { completedState, response } = await finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result: streamResult,
responseId,
createdAt,
model: responseModel,
instructions: body.instructions,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
configuredTools,
responseMetadata,
fallbackText: streamEvents.text,
fallbackOutputItems: (completedState2) => streamEvents.getOutputItems({
text: completedState2.text,
status: completedState2.status
})
});
const completedItem = getStreamedMessageOutputItem(response, responseId);
if (completedItem || completedState.text) {
for (const event of streamEvents.completeText(
completedState.text,
completedItem ?? {
id: responseId,
type: "message",
role: "assistant",
status: "completed",
content: [createOutputTextPart(completedState.text)]
}
)) {
enqueueEvent(event.event, event.payload);
}
}
enqueueEvent("response.completed", {
type: "response.completed",
response
});
controller.close();
} catch (error) {
controller.error(error);
} finally {
reader.releaseLock();
}
}
});
}
var CREATE_RESPONSE_ROUTE = createRoute({
method: "POST",
path: "/v1/responses",
responseType: "datastream-response",
bodySchema: createResponseBodySchema,
responseSchema: responseObjectSchema,
summary: "Create a response",
description: "Creates a response through a Mastra-hosted Responses API-compatible route",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_EXECUTE,
handler: async ({ mastra, requestContext, abortSignal, ...body }) => {
try {
const {
agent,
agentMemoryStore,
configuredTools,
createdAt,
didStore,
executionInput,
previousResponseTurnRecord,
resolvedModel,
responseId,
responseModel,
responseMetadata,
threadContext
} = await prepareCreateResponseRequest({ body, mastra, requestContext });
if (!body.stream) {
const result = await executeGenerate({
agent,
resolvedModel,
modelOverride: body.model,
instructions: body.instructions,
text: body.text,
providerOptions: body.providerOptions,
input: executionInput,
requestContext,
abortSignal,
threadContext
});
const { response } = await finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result,
responseId,
createdAt,
model: responseModel,
instructions: body.instructions,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
configuredTools,
responseMetadata,
fallbackText: ""
});
return jsonResponse(response);
}
const streamResult = await executeStream({
agent,
resolvedModel,
modelOverride: body.model,
instructions: body.instructions,
text: body.text,
providerOptions: body.providerOptions,
input: executionInput,
requestContext,
abortSignal,
threadContext
});
const stream = createResponseEventStream({
agentMemoryStore,
body,
configuredTools,
createdAt,
didStore,
previousResponseTurnRecord,
responseId,
responseModel,
responseMetadata,
streamResult,
threadContext
});
return new Response(stream, {
headers: {
"Content-Type": "text/event-stream; charset=utf-8",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"X-Accel-Buffering": "no"
}
});
} catch (error) {
return handleError(error, "Error creating response");
}
}
});
var GET_RESPONSE_ROUTE = createRoute({
method: "GET",
path: "/v1/responses/:responseId",
responseType: "json",
pathParamSchema: responseIdPathParams,
responseSchema: responseObjectSchema,
summary: "Retrieve a stored response",
description: "Returns a previously stored response object",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, responseId }) => {
try {
const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });
if (!responseTurnRecord) {
throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });
}
return mapResponseTurnRecordToResponse(responseTurnRecord);
} catch (error) {
return handleError(error, "Error retrieving response");
}
}
});
var DELETE_RESPONSE_ROUTE = createRoute({
method: "DELETE",
path: "/v1/responses/:responseId",
responseType: "json",
pathParamSchema: responseIdPathParams,
responseSchema: deleteResponseSchema,
summary: "Delete a stored response",
description: "Deletes a stored response so it can no longer be retrieved or chained",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: MastraFGAPermissions.AGENTS_DELETE,
handler: async ({ mastra, requestContext, responseId }) => {
try {
const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });
if (!responseTurnRecord) {
throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });
}
await deleteResponseTurnRecord({ responseTurnRecord });
const response = {
id: responseId,
object: "response",
deleted: true
};
return response;
} catch (error) {
return handleError(error, "Error deleting response");
}
}
});
export { CREATE_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE, responses_exports };
//# sourceMappingURL=chunk-BSUXHFFY.js.map
//# sourceMappingURL=chunk-BSUXHFFY.js.map
{"version":3,"sources":["../src/server/handlers/responses.ts"],"names":["existingThread","threadId","createdThread","completedState"],"mappings":"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","file":"chunk-BSUXHFFY.js","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { Agent, MastraDBMessage } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n createResponseBodySchema,\n deleteResponseSchema,\n responseIdPathParams,\n responseObjectSchema,\n} from '../schemas/responses';\nimport type { CreateResponseBody, DeleteResponse, ResponseObject } from '../schemas/responses';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport {\n buildCompletedResponse,\n buildInProgressResponse,\n createResponseStreamEventTranslator,\n createMessageId,\n createOutputTextPart,\n formatSseEvent,\n mapMastraToolsToResponseTools,\n mapResponseInputToExecutionMessages,\n mapResponseTurnRecordToResponse,\n toResponseStatus,\n toResponseUsage,\n} from './responses.adapter';\nimport {\n deleteResponseTurnRecord,\n findResponseTurnRecord,\n findResponseTurnRecordAcrossAgents,\n getAgentMemoryStore,\n persistResponseTurnRecord,\n resolveResponseTurnMessagesForStorage,\n} from './responses.storage';\nimport type {\n ProviderMetadataLike,\n ResponseTurnRecord,\n ResponseTurnRecordMetadata,\n ThreadExecutionContext,\n UsageLike,\n} from './responses.storage';\nimport { enforceThreadAccess, getEffectiveResourceId, getEffectiveThreadId } from './utils';\n\ntype AgentExecutionInput = Parameters<Agent['generate']>[0];\ntype ResolvedAgentModel = Awaited<ReturnType<Agent['getModel']>>;\n\ntype ResponseExecutionResult = {\n text?: string;\n finishReason?: string;\n totalUsage?: UsageLike | Promise<UsageLike>;\n usage?: UsageLike | Promise<UsageLike>;\n providerMetadata?: ProviderMetadataLike | Promise<ProviderMetadataLike>;\n response?: {\n id?: string;\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype ResponseStreamResult = {\n fullStream: ReadableStream<unknown> | Promise<ReadableStream<unknown>>;\n text: Promise<string> | string;\n finishReason: Promise<string | undefined> | string | undefined;\n totalUsage?: Promise<UsageLike> | UsageLike;\n usage?: Promise<UsageLike> | UsageLike;\n providerMetadata?: Promise<ProviderMetadataLike> | ProviderMetadataLike;\n response?:\n | Promise<{\n id?: string;\n dbMessages?: MastraDBMessage[];\n }>\n | {\n id?: string;\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype CompletedResponseState = {\n completedAt: number;\n status: ResponseObject['status'];\n text: string;\n usage: UsageLike;\n usageDetails: ResponseObject['usage'];\n providerOptions: ProviderMetadataLike;\n};\n\ntype FinalizedResponse = {\n completedState: CompletedResponseState;\n response: ResponseObject;\n responseMessages: MastraDBMessage[];\n};\n\ntype PreparedCreateResponseRequest = {\n agent: Agent<any, any, any, any>;\n agentMemoryStore: MemoryStorage | null;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n createdAt: number;\n didStore: boolean;\n executionInput: AgentExecutionInput;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n resolvedModel: ResolvedAgentModel;\n responseId: string;\n responseModel: string;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n threadContext: ThreadExecutionContext | null;\n};\n\nconst JSON_OBJECT_RESPONSE_SCHEMA = {\n type: 'object',\n additionalProperties: true,\n} as const;\n\nfunction jsonResponse(data: ResponseObject, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n}\n\nfunction createStructuredOutput(text: CreateResponseBody['text']) {\n if (!text) {\n return undefined;\n }\n\n switch (text.format.type) {\n case 'json_object':\n return {\n schema: JSON_OBJECT_RESPONSE_SCHEMA,\n jsonPromptInjection: true,\n };\n case 'json_schema':\n return {\n schema: text.format.schema,\n };\n default:\n return undefined;\n }\n}\n\nfunction getStreamedMessageOutputItem(response: ResponseObject, responseId: string) {\n return (\n response.output.find(\n (item): item is Extract<ResponseObject['output'][number], { type: 'message' }> =>\n item.type === 'message' && item.id === responseId,\n ) ?? null\n );\n}\n\n/**\n * Resolves the memory thread that should back the current response request.\n *\n * If `previous_response_id` is present, the request continues on that stored thread.\n * Otherwise, the route only creates or reuses a thread when the caller asked to store\n * the response and the resolved agent actually has memory configured.\n */\nasync function resolveThreadExecutionContext({\n agent,\n store,\n conversationId,\n previousResponseTurnRecord,\n requestContext,\n}: {\n agent: Agent<any, any, any, any>;\n store: boolean;\n conversationId?: string;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n requestContext: RequestContext;\n}): Promise<ThreadExecutionContext | null> {\n if (conversationId && previousResponseTurnRecord && previousResponseTurnRecord.thread.id !== conversationId) {\n throw new HTTPException(400, {\n message:\n 'conversation_id and previous_response_id must reference the same conversation thread when both are provided',\n });\n }\n\n if (previousResponseTurnRecord) {\n return {\n threadId: previousResponseTurnRecord.thread.id,\n resourceId: previousResponseTurnRecord.thread.resourceId,\n };\n }\n\n const effectiveThreadId = getEffectiveThreadId(requestContext, undefined);\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n\n if (!store && !conversationId && !effectiveThreadId) {\n return null;\n }\n\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n if (conversationId) {\n throw new HTTPException(400, {\n message: 'conversation_id requires the target agent to have memory configured',\n });\n }\n\n return null;\n }\n\n if (conversationId) {\n const existingThread = await memory.getThreadById({ threadId: conversationId });\n if (!existingThread) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await enforceThreadAccess({\n mastra: agent.getMastraInstance(),\n requestContext,\n threadId: conversationId,\n thread: existingThread,\n effectiveResourceId,\n });\n return {\n threadId: existingThread.id,\n resourceId: effectiveResourceId ?? existingThread.resourceId,\n };\n }\n\n if (!effectiveThreadId) {\n if (!store) {\n return null;\n }\n\n const threadId = randomUUID();\n const createdThread = await memory.createThread({\n threadId,\n resourceId: effectiveResourceId ?? threadId,\n });\n\n return {\n threadId: createdThread.id,\n resourceId: createdThread.resourceId,\n };\n }\n\n const threadId = effectiveThreadId;\n const existingThread = await memory.getThreadById({ threadId });\n if (existingThread) {\n await enforceThreadAccess({\n mastra: agent.getMastraInstance(),\n requestContext,\n threadId,\n thread: existingThread,\n effectiveResourceId,\n });\n return {\n threadId: existingThread.id,\n resourceId: effectiveResourceId ?? existingThread.resourceId,\n };\n }\n\n if (!store) {\n return null;\n }\n\n const resourceId = effectiveResourceId ?? threadId;\n const createdThread = await memory.createThread({\n threadId,\n resourceId,\n });\n\n return {\n threadId: createdThread.id,\n resourceId: createdThread.resourceId,\n };\n}\n\nfunction createExecutionMemory(threadContext: ThreadExecutionContext | null) {\n if (!threadContext) {\n return undefined;\n }\n\n return {\n memory: {\n thread: threadContext.threadId,\n resource: threadContext.resourceId,\n },\n } as const;\n}\n\n/**\n * Resolves the registered Mastra agent that owns the response request.\n */\nasync function resolveResponseAgent({\n mastra,\n agentId,\n}: {\n mastra: Mastra | undefined;\n agentId?: string;\n}): Promise<Agent<any, any, any, any>> {\n if (!agentId) {\n throw new HTTPException(400, {\n message: 'Responses requests require an agent_id',\n });\n }\n\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for agent-backed responses' });\n }\n\n return getAgentFromSystem({ mastra, agentId });\n}\n\nasync function resolveAgentMemoryStore({\n agent,\n requestContext,\n errorMessage,\n}: {\n agent: Agent<any, any, any, any>;\n requestContext: RequestContext;\n errorMessage: string;\n}): Promise<MemoryStorage> {\n const agentMemoryStore = await getAgentMemoryStore({ agent, requestContext });\n if (!agentMemoryStore) {\n throw new HTTPException(400, { message: errorMessage });\n }\n\n return agentMemoryStore;\n}\n\n/**\n * Executes a non-streaming Responses API request through the resolved Mastra agent.\n */\nasync function executeGenerate({\n agent,\n resolvedModel,\n modelOverride,\n instructions,\n text,\n providerOptions,\n input,\n requestContext,\n abortSignal,\n threadContext,\n}: {\n agent: Agent;\n resolvedModel: ResolvedAgentModel;\n modelOverride?: string;\n instructions: string | undefined;\n text: CreateResponseBody['text'];\n providerOptions: CreateResponseBody['providerOptions'];\n input: AgentExecutionInput;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n threadContext: ThreadExecutionContext | null;\n}) {\n const executionMemory = createExecutionMemory(threadContext);\n const structuredOutput = createStructuredOutput(text);\n const modelOption = modelOverride ? { model: modelOverride } : {};\n const commonOptions = {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n structuredOutput,\n providerOptions,\n ...(executionMemory ?? {}),\n };\n\n if (resolvedModel.specificationVersion === 'v1') {\n if (threadContext) {\n return (await agent.generateLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n resourceId: threadContext.resourceId,\n threadId: threadContext.threadId,\n } as never)) as ResponseExecutionResult;\n }\n\n return (await agent.generateLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n } as never)) as ResponseExecutionResult;\n }\n\n return (await agent.generate(input, commonOptions as never)) as ResponseExecutionResult;\n}\n\n/**\n * Executes a streaming Responses API request through the resolved Mastra agent.\n */\nasync function executeStream({\n agent,\n resolvedModel,\n modelOverride,\n instructions,\n text,\n providerOptions,\n input,\n requestContext,\n abortSignal,\n threadContext,\n}: {\n agent: Agent;\n resolvedModel: ResolvedAgentModel;\n modelOverride?: string;\n instructions: string | undefined;\n text: CreateResponseBody['text'];\n providerOptions: CreateResponseBody['providerOptions'];\n input: AgentExecutionInput;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n threadContext: ThreadExecutionContext | null;\n}) {\n const executionMemory = createExecutionMemory(threadContext);\n const structuredOutput = createStructuredOutput(text);\n const modelOption = modelOverride ? { model: modelOverride } : {};\n const commonOptions = {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n structuredOutput,\n providerOptions,\n ...(executionMemory ?? {}),\n };\n\n if (resolvedModel.specificationVersion === 'v1') {\n if (threadContext) {\n return (await agent.streamLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n resourceId: threadContext.resourceId,\n threadId: threadContext.threadId,\n } as never)) as ResponseStreamResult;\n }\n\n return (await agent.streamLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n } as never)) as ResponseStreamResult;\n }\n\n return (await agent.stream(input, commonOptions as never)) as ResponseStreamResult;\n}\n\nasync function resolveUsage(result: ResponseExecutionResult | ResponseStreamResult): Promise<UsageLike> {\n return (await (result.totalUsage ?? result.usage ?? null)) as UsageLike;\n}\n\nasync function resolveProviderMetadata(\n result: ResponseExecutionResult | ResponseStreamResult,\n): Promise<ProviderMetadataLike> {\n return (await (result.providerMetadata ?? undefined)) as ProviderMetadataLike;\n}\n\nasync function resolveFinishReason(\n result: ResponseExecutionResult | ResponseStreamResult,\n): Promise<string | undefined> {\n return (await result.finishReason) ?? undefined;\n}\n\nasync function resolveText(result: ResponseExecutionResult | ResponseStreamResult): Promise<string> {\n return (await result.text) ?? '';\n}\n\n/**\n * Resolves the final response state shared by streaming and non-streaming flows.\n */\nasync function resolveCompletedResponseState(\n result: ResponseExecutionResult | ResponseStreamResult,\n fallbackText: string,\n): Promise<CompletedResponseState> {\n const usage = await resolveUsage(result);\n\n return {\n completedAt: Math.floor(Date.now() / 1000),\n status: toResponseStatus(await resolveFinishReason(result)),\n text: (await resolveText(result)) || fallbackText,\n usage,\n usageDetails: toResponseUsage(usage),\n providerOptions: await resolveProviderMetadata(result),\n };\n}\n\n/**\n * Stores the completed response when the request opted into memory-backed persistence.\n */\nasync function storeCompletedResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n responseId,\n metadata,\n completedState,\n messages,\n outputItems,\n}: {\n agentMemoryStore: MemoryStorage | null;\n didStore: boolean;\n threadContext: ThreadExecutionContext | null;\n responseId: string;\n metadata: Omit<ResponseTurnRecordMetadata, 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'>;\n completedState: CompletedResponseState;\n messages: MastraDBMessage[];\n outputItems: ResponseObject['output'];\n}): Promise<void> {\n if (!didStore || !threadContext) {\n return;\n }\n\n await persistResponseTurnRecord({\n memoryStore: agentMemoryStore,\n responseId,\n metadata: {\n ...metadata,\n completedAt: completedState.completedAt,\n status: completedState.status,\n usage: completedState.usageDetails,\n providerOptions: completedState.providerOptions,\n messageIds: [],\n outputItems,\n },\n threadContext,\n messages,\n });\n}\n\n/**\n * Resolves the final response object and persists the stored response turn when needed.\n */\nasync function finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result,\n responseId,\n createdAt,\n model,\n instructions,\n previousResponseId,\n conversationId,\n configuredTools,\n responseMetadata,\n fallbackText,\n fallbackOutputItems,\n}: {\n agentMemoryStore: MemoryStorage | null;\n didStore: boolean;\n threadContext: ThreadExecutionContext | null;\n result: ResponseExecutionResult | ResponseStreamResult;\n responseId: string;\n createdAt: number;\n model: string;\n instructions: string | undefined;\n previousResponseId?: string;\n conversationId?: string;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n fallbackText: string;\n fallbackOutputItems?: (completedState: CompletedResponseState) => ResponseObject['output'];\n}): Promise<FinalizedResponse> {\n const completedState = await resolveCompletedResponseState(result, fallbackText);\n const fallbackItems = fallbackOutputItems?.(completedState);\n const responseMessages = await resolveResponseTurnMessagesForStorage({\n result,\n responseId,\n text: completedState.text,\n threadContext,\n fallbackOutputItems: threadContext ? fallbackItems : undefined,\n });\n const response = buildCompletedResponse({\n responseId,\n outputMessageId: responseId,\n model,\n createdAt,\n completedAt: completedState.completedAt,\n status: completedState.status,\n text: completedState.text,\n usage: completedState.usage,\n instructions,\n textConfig: responseMetadata.text,\n previousResponseId,\n conversationId,\n providerOptions: completedState.providerOptions,\n tools: configuredTools,\n messages: responseMessages,\n fallbackOutputItems: fallbackItems,\n store: didStore,\n });\n\n await storeCompletedResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n responseId,\n metadata: responseMetadata,\n completedState,\n messages: responseMessages,\n outputItems: response.output,\n });\n\n return { completedState, response, responseMessages };\n}\n\n/**\n * Resolves all request-scoped Mastra primitives needed to execute a Responses create\n * call: the owning agent, the memory thread context, the normalized execution input,\n * and the response-turn metadata that may be persisted later.\n */\nasync function prepareCreateResponseRequest({\n body,\n mastra,\n requestContext,\n}: {\n body: CreateResponseBody;\n mastra: Mastra | undefined;\n requestContext: RequestContext;\n}): Promise<PreparedCreateResponseRequest> {\n const executionInput = mapResponseInputToExecutionMessages(body.input) as AgentExecutionInput;\n let previousResponseTurnRecord: ResponseTurnRecord | null = null;\n let resolvedAgent: Agent<any, any, any, any> | null = null;\n\n if (body.previous_response_id) {\n if (body.agent_id) {\n resolvedAgent = await resolveResponseAgent({ mastra, agentId: body.agent_id });\n previousResponseTurnRecord = await findResponseTurnRecord({\n agent: resolvedAgent,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (!previousResponseTurnRecord) {\n const owningResponseTurnRecord = await findResponseTurnRecordAcrossAgents({\n mastra,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (owningResponseTurnRecord) {\n if (owningResponseTurnRecord.metadata.agentId === body.agent_id) {\n previousResponseTurnRecord = owningResponseTurnRecord;\n } else {\n throw new HTTPException(400, {\n message: `Stored response ${body.previous_response_id} belongs to agent ${owningResponseTurnRecord.metadata.agentId}, not ${body.agent_id}`,\n });\n }\n }\n\n if (!previousResponseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });\n }\n }\n } else {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for agent-backed responses' });\n }\n\n previousResponseTurnRecord = await findResponseTurnRecordAcrossAgents({\n mastra,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (!previousResponseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });\n }\n }\n }\n\n const agent =\n resolvedAgent ??\n (await resolveResponseAgent({\n mastra,\n agentId: body.agent_id ?? previousResponseTurnRecord?.metadata.agentId,\n }));\n const resolvedModel = await agent.getModel({\n requestContext,\n modelConfig: body.model,\n });\n const responseModel =\n body.model ??\n (() => {\n if (resolvedModel.provider && resolvedModel.modelId) {\n const publicProviderId = resolvedModel.provider.includes('.')\n ? resolvedModel.provider.split('.')[0]!\n : resolvedModel.provider;\n return `${publicProviderId}/${resolvedModel.modelId}`;\n }\n\n if (resolvedModel.modelId) {\n return resolvedModel.modelId;\n }\n\n throw new HTTPException(500, {\n message: 'Responses route could not determine the effective model for this request',\n });\n })();\n const shouldStore = body.store ?? false;\n const needsMemoryStore = shouldStore || Boolean(body.conversation_id) || Boolean(body.previous_response_id);\n const agentMemoryStore = needsMemoryStore\n ? await resolveAgentMemoryStore({\n agent,\n requestContext,\n errorMessage: body.previous_response_id\n ? 'previous_response_id requires the target agent to have memory storage configured'\n : shouldStore\n ? 'Stored responses require the target agent to have memory storage configured'\n : 'conversation_id requires the target agent to have memory storage configured',\n })\n : null;\n const configuredTools = mapMastraToolsToResponseTools(\n (await Promise.resolve(agent.listTools({ requestContext }))) as Record<string, unknown>,\n );\n\n const responseId = createMessageId();\n const createdAt = Math.floor(Date.now() / 1000);\n const threadContext = await resolveThreadExecutionContext({\n agent,\n store: shouldStore,\n conversationId: body.conversation_id,\n previousResponseTurnRecord,\n requestContext,\n });\n\n if (shouldStore && !threadContext) {\n throw new HTTPException(400, {\n message: 'Stored responses require the target agent to have memory configured',\n });\n }\n\n const didStore = shouldStore && Boolean(threadContext);\n\n return {\n agent,\n agentMemoryStore,\n configuredTools,\n createdAt,\n didStore,\n executionInput,\n previousResponseTurnRecord,\n resolvedModel,\n responseId,\n responseModel,\n responseMetadata: {\n agentId: agent.id,\n model: responseModel,\n createdAt,\n instructions: body.instructions,\n text: body.text,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n tools: configuredTools,\n store: didStore,\n },\n threadContext,\n };\n}\n\n/**\n * Bridges a Mastra agent stream into OpenAI-style Responses SSE events and completes\n * the stored response-turn record when the stream finishes.\n */\nfunction createResponseEventStream({\n agentMemoryStore,\n body,\n configuredTools,\n createdAt,\n didStore,\n previousResponseTurnRecord,\n responseId,\n responseModel,\n responseMetadata,\n streamResult,\n threadContext,\n}: {\n agentMemoryStore: MemoryStorage | null;\n body: CreateResponseBody;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n createdAt: number;\n didStore: boolean;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n responseId: string;\n responseModel: string;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n streamResult: ResponseStreamResult;\n threadContext: ThreadExecutionContext | null;\n}) {\n const createdResponse = buildInProgressResponse({\n responseId,\n model: responseModel,\n createdAt,\n instructions: body.instructions,\n textConfig: body.text,\n previousResponseId: body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n tools: configuredTools,\n store: didStore,\n });\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n let sequenceNumber = 1;\n const enqueueEvent = (eventName: string, payload: Record<string, unknown>) => {\n controller.enqueue(\n formatSseEvent(eventName, {\n ...payload,\n sequence_number: sequenceNumber++,\n }),\n );\n };\n\n enqueueEvent('response.created', {\n type: 'response.created',\n response: createdResponse,\n });\n enqueueEvent('response.in_progress', {\n type: 'response.in_progress',\n response: createdResponse,\n });\n\n const streamEvents = createResponseStreamEventTranslator(responseId);\n const fullStream = await streamResult.fullStream;\n const reader = fullStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n for (const event of streamEvents.consume(value)) {\n enqueueEvent(event.event, event.payload);\n }\n }\n\n for (const event of streamEvents.flushPendingToolResults()) {\n enqueueEvent(event.event, event.payload);\n }\n\n const { completedState, response } = await finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result: streamResult,\n responseId,\n createdAt,\n model: responseModel,\n instructions: body.instructions,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n configuredTools,\n responseMetadata,\n fallbackText: streamEvents.text,\n fallbackOutputItems: completedState =>\n streamEvents.getOutputItems({\n text: completedState.text,\n status: completedState.status,\n }),\n });\n\n const completedItem = getStreamedMessageOutputItem(response, responseId);\n if (completedItem || completedState.text) {\n for (const event of streamEvents.completeText(\n completedState.text,\n completedItem ?? {\n id: responseId,\n type: 'message' as const,\n role: 'assistant' as const,\n status: 'completed' as const,\n content: [createOutputTextPart(completedState.text)],\n },\n )) {\n enqueueEvent(event.event, event.payload);\n }\n }\n enqueueEvent('response.completed', {\n type: 'response.completed',\n response,\n });\n controller.close();\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n}\n\nexport const CREATE_RESPONSE_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/responses',\n responseType: 'datastream-response',\n bodySchema: createResponseBodySchema,\n responseSchema: responseObjectSchema,\n summary: 'Create a response',\n description: 'Creates a response through a Mastra-hosted Responses API-compatible route',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_EXECUTE,\n handler: async ({ mastra, requestContext, abortSignal, ...body }) => {\n try {\n const {\n agent,\n agentMemoryStore,\n configuredTools,\n createdAt,\n didStore,\n executionInput,\n previousResponseTurnRecord,\n resolvedModel,\n responseId,\n responseModel,\n responseMetadata,\n threadContext,\n } = await prepareCreateResponseRequest({ body, mastra, requestContext });\n\n if (!body.stream) {\n const result = await executeGenerate({\n agent,\n resolvedModel,\n modelOverride: body.model,\n instructions: body.instructions,\n text: body.text,\n providerOptions: body.providerOptions,\n input: executionInput,\n requestContext,\n abortSignal,\n threadContext,\n });\n\n const { response } = await finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result,\n responseId,\n createdAt,\n model: responseModel,\n instructions: body.instructions,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n configuredTools,\n responseMetadata,\n fallbackText: '',\n });\n\n return jsonResponse(response);\n }\n\n const streamResult = await executeStream({\n agent,\n resolvedModel,\n modelOverride: body.model,\n instructions: body.instructions,\n text: body.text,\n providerOptions: body.providerOptions,\n input: executionInput,\n requestContext,\n abortSignal,\n threadContext,\n });\n\n const stream = createResponseEventStream({\n agentMemoryStore,\n body,\n configuredTools,\n createdAt,\n didStore,\n previousResponseTurnRecord,\n responseId,\n responseModel,\n responseMetadata,\n streamResult,\n threadContext,\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream; charset=utf-8',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n } catch (error) {\n return handleError(error, 'Error creating response');\n }\n },\n});\n\nexport const GET_RESPONSE_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/responses/:responseId',\n responseType: 'json',\n pathParamSchema: responseIdPathParams,\n responseSchema: responseObjectSchema,\n summary: 'Retrieve a stored response',\n description: 'Returns a previously stored response object',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, responseId }) => {\n try {\n const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });\n if (!responseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });\n }\n\n return mapResponseTurnRecordToResponse(responseTurnRecord);\n } catch (error) {\n return handleError(error, 'Error retrieving response');\n }\n },\n});\n\nexport const DELETE_RESPONSE_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/responses/:responseId',\n responseType: 'json',\n pathParamSchema: responseIdPathParams,\n responseSchema: deleteResponseSchema,\n summary: 'Delete a stored response',\n description: 'Deletes a stored response so it can no longer be retrieved or chained',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, responseId }) => {\n try {\n const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });\n if (!responseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });\n }\n\n await deleteResponseTurnRecord({ responseTurnRecord });\n\n const response: DeleteResponse = {\n id: responseId,\n object: 'response',\n deleted: true,\n };\n\n return response;\n } catch (error) {\n return handleError(error, 'Error deleting response');\n }\n },\n});\n"]}
import { storedSkillIdPathParams } from './chunk-UIRQU4GW.js';
import { favoriteToggleResponseSchema } from './chunk-SFPN7SHZ.js';
import { requireBuilderFeature } from './chunk-N3D3A56J.js';
import { getCallerAuthorId, assertReadAccess } from './chunk-56AYHXOU.js';
import { assertStoredResourceScope, getStoredResourceScope } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
// src/server/handlers/stored-skill-favorites.ts
async function getFavoritesContext(mastra) {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new HTTPException(500, { message: "Favorites storage domain is not available" });
}
return { skillStore, favoritesStore };
}
var FAVORITE_STORED_SKILL_ROUTE = createRoute({
method: "PUT",
path: "/stored/skills/:storedSkillId/favorite",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
responseSchema: favoriteToggleResponseSchema,
summary: "Favorite a stored skill",
description: "Marks the stored skill as favorited by the calling user. Idempotent.",
tags: ["Stored Skills"],
requiresAuth: true,
requiresPermission: "stored-skills:read",
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
await requireBuilderFeature(mastra, "favorites");
const callerId = getCallerAuthorId(requestContext);
if (!callerId) {
throw new HTTPException(401, { message: "Authentication required" });
}
const { skillStore, favoritesStore } = await getFavoritesContext(mastra);
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
const result = await favoritesStore.favorite({
userId: callerId,
entityType: "skill",
entityId: storedSkillId
});
return result;
} catch (error) {
return handleError(error, "Error favoriting stored skill");
}
}
});
var UNFAVORITE_STORED_SKILL_ROUTE = createRoute({
method: "DELETE",
path: "/stored/skills/:storedSkillId/favorite",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
responseSchema: favoriteToggleResponseSchema,
summary: "Unfavorite a stored skill",
description: "Removes the caller\u2019s favorite from the stored skill. Idempotent.",
tags: ["Stored Skills"],
requiresAuth: true,
requiresPermission: "stored-skills:read",
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
await requireBuilderFeature(mastra, "favorites");
const callerId = getCallerAuthorId(requestContext);
if (!callerId) {
throw new HTTPException(401, { message: "Authentication required" });
}
const { skillStore, favoritesStore } = await getFavoritesContext(mastra);
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
const result = await favoritesStore.unfavorite({
userId: callerId,
entityType: "skill",
entityId: storedSkillId
});
return result;
} catch (error) {
return handleError(error, "Error unfavoriting stored skill");
}
}
});
export { FAVORITE_STORED_SKILL_ROUTE, UNFAVORITE_STORED_SKILL_ROUTE };
//# sourceMappingURL=chunk-CGXMRNFE.js.map
//# sourceMappingURL=chunk-CGXMRNFE.js.map
{"version":3,"sources":["../src/server/handlers/stored-skill-favorites.ts"],"names":[],"mappings":"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","file":"chunk-CGXMRNFE.js","sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedSkillIdPathParams } from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { skillStore, favoritesStore };\n}\n\n/**\n * PUT /stored/skills/:storedSkillId/favorite\n */\nexport const FAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored skill',\n description: 'Marks the stored skill as favorited by the calling user. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the skill (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId/favorite\n */\nexport const UNFAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored skill',\n description: 'Removes the caller’s favorite from the stored skill. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored skill');\n }\n },\n});\n"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

'use strict';
var chunkO4O2EJF7_cjs = require('./chunk-O4O2EJF7.cjs');
var chunkTDMX66RN_cjs = require('./chunk-TDMX66RN.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
var chunkTIWGWGIO_cjs = require('./chunk-TIWGWGIO.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
// src/server/handlers/stored-agent-favorites.ts
async function getFavoritesContext(mastra) {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const agentStore = await storage.getStore("agents");
if (!agentStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Agents storage domain is not available" });
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Favorites storage domain is not available" });
}
return { agentStore, favoritesStore };
}
var FAVORITE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "PUT",
path: "/stored/agents/:storedAgentId/favorite",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
responseSchema: chunkO4O2EJF7_cjs.favoriteToggleResponseSchema,
summary: "Favorite a stored agent",
description: "Marks the stored agent as favorited by the calling user. Idempotent.",
tags: ["Stored Agents"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
await chunkTDMX66RN_cjs.requireBuilderFeature(mastra, "favorites");
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!callerId) {
throw new chunk64ITUOXI_cjs.HTTPException(401, { message: "Authentication required" });
}
const { agentStore, favoritesStore } = await getFavoritesContext(mastra);
const agent = await agentStore.getById(storedAgentId);
if (!agent) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(agent, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const result = await favoritesStore.favorite({
userId: callerId,
entityType: "agent",
entityId: storedAgentId
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error favoriting stored agent");
}
}
});
var UNFAVORITE_STORED_AGENT_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/stored/agents/:storedAgentId/favorite",
responseType: "json",
pathParamSchema: chunkTIWGWGIO_cjs.storedAgentIdPathParams,
responseSchema: chunkO4O2EJF7_cjs.favoriteToggleResponseSchema,
summary: "Unfavorite a stored agent",
description: "Removes the caller\u2019s favorite from the stored agent. Idempotent.",
tags: ["Stored Agents"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
await chunkTDMX66RN_cjs.requireBuilderFeature(mastra, "favorites");
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!callerId) {
throw new chunk64ITUOXI_cjs.HTTPException(401, { message: "Authentication required" });
}
const { agentStore, favoritesStore } = await getFavoritesContext(mastra);
const agent = await agentStore.getById(storedAgentId);
if (!agent) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(agent, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const result = await favoritesStore.unfavorite({
userId: callerId,
entityType: "agent",
entityId: storedAgentId
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error unfavoriting stored agent");
}
}
});
exports.FAVORITE_STORED_AGENT_ROUTE = FAVORITE_STORED_AGENT_ROUTE;
exports.UNFAVORITE_STORED_AGENT_ROUTE = UNFAVORITE_STORED_AGENT_ROUTE;
//# sourceMappingURL=chunk-DW6LIDTI.cjs.map
//# sourceMappingURL=chunk-DW6LIDTI.cjs.map
{"version":3,"sources":["../src/server/handlers/stored-agent-favorites.ts"],"names":["HTTPException","createRoute","storedAgentIdPathParams","favoriteToggleResponseSchema","requireBuilderFeature","getCallerAuthorId","assertStoredResourceScope","getStoredResourceScope","assertReadAccess","handleError"],"mappings":"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","file":"chunk-DW6LIDTI.cjs","sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedAgentIdPathParams } from '../schemas/stored-agents';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const agentStore = await storage.getStore('agents');\n if (!agentStore) {\n throw new HTTPException(500, { message: 'Agents storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { agentStore, favoritesStore };\n}\n\n/**\n * PUT /stored/agents/:storedAgentId/favorite\n */\nexport const FAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored agent',\n description: 'Marks the stored agent as favorited by the calling user. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the agent (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored agent');\n }\n },\n});\n\n/**\n * DELETE /stored/agents/:storedAgentId/favorite\n */\nexport const UNFAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored agent',\n description: 'Removes the caller’s favorite from the stored agent. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored agent');\n }\n },\n});\n"]}
'use strict';
var chunkDCDQNIYY_cjs = require('./chunk-DCDQNIYY.cjs');
var chunkUNXPZBTJ_cjs = require('./chunk-UNXPZBTJ.cjs');
var chunkDIG2K5CV_cjs = require('./chunk-DIG2K5CV.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
// src/server/handlers/scores.ts
var scores_exports = {};
chunkO7I5CWRX_cjs.__export(scores_exports, {
GET_SCORER_ROUTE: () => GET_SCORER_ROUTE,
LIST_SCORERS_ROUTE: () => LIST_SCORERS_ROUTE,
LIST_SCORES_BY_ENTITY_ID_ROUTE: () => LIST_SCORES_BY_ENTITY_ID_ROUTE,
LIST_SCORES_BY_RUN_ID_ROUTE: () => LIST_SCORES_BY_RUN_ID_ROUTE,
LIST_SCORES_BY_SCORER_ID_ROUTE: () => LIST_SCORES_BY_SCORER_ID_ROUTE,
SAVE_SCORE_ROUTE: () => SAVE_SCORE_ROUTE
});
async function listScorersFromSystem({
mastra,
requestContext
}) {
const agents = mastra.listAgents();
const workflows = mastra.listWorkflows();
const scorersMap = /* @__PURE__ */ new Map();
const processAgentScorers = async (agent) => {
const scorers = await agent.listScorers({
requestContext
}) || {};
if (Object.keys(scorers).length > 0) {
for (const [_scorerId, scorer] of Object.entries(scorers)) {
const scorerId = scorer.scorer.id;
if (scorersMap.has(scorerId)) {
scorersMap.get(scorerId)?.agentIds.push(agent.id);
scorersMap.get(scorerId)?.agentNames.push(agent.name);
} else {
scorersMap.set(scorerId, {
workflowIds: [],
...scorer,
agentNames: [agent.name],
agentIds: [agent.id],
isRegistered: false,
source: scorer.scorer.source ?? "code"
});
}
}
}
};
for (const [_, agent] of Object.entries(agents)) {
await processAgentScorers(agent);
}
try {
const editor = mastra.getEditor();
const storedAgentsResult = await editor?.agent.list();
if (storedAgentsResult?.agents) {
for (const storedAgentConfig of storedAgentsResult.agents) {
try {
const agent = await editor?.agent.getById(storedAgentConfig.id);
if (agent) {
await processAgentScorers(agent);
}
} catch {
}
}
}
} catch {
}
try {
const editor = mastra.getEditor();
const storedScorersResult = await editor?.scorer.list();
if (storedScorersResult?.scorerDefinitions) {
for (const storedScorerConfig of storedScorersResult.scorerDefinitions) {
try {
await editor?.scorer.getById(storedScorerConfig.id);
} catch {
}
}
}
} catch {
}
for (const [workflowId, workflow] of Object.entries(workflows)) {
const scorers = await workflow.listScorers({
requestContext
}) || {};
if (Object.keys(scorers).length > 0) {
for (const [_scorerId, scorer] of Object.entries(scorers)) {
const scorerName = scorer.scorer.name;
if (scorersMap.has(scorerName)) {
scorersMap.get(scorerName)?.workflowIds.push(workflowId);
} else {
scorersMap.set(scorerName, {
agentIds: [],
agentNames: [],
...scorer,
workflowIds: [workflowId],
isRegistered: false,
source: scorer.scorer.source ?? "code"
});
}
}
}
}
const registeredScorers = await mastra.listScorers();
for (const [_scorerId, scorer] of Object.entries(registeredScorers || {})) {
const scorerId = scorer.id;
if (scorersMap.has(scorerId)) {
scorersMap.get(scorerId).isRegistered = true;
} else {
scorersMap.set(scorerId, {
scorer,
agentIds: [],
agentNames: [],
workflowIds: [],
isRegistered: true,
source: scorer.source ?? "code"
});
}
}
return Object.fromEntries(scorersMap.entries());
}
function getTraceDetails(traceIdWithSpanId) {
if (!traceIdWithSpanId) {
return {};
}
const [traceId, spanId] = traceIdWithSpanId.split("-");
return {
...traceId ? { traceId } : {},
...spanId ? { spanId } : {}
};
}
var LIST_SCORERS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/scorers",
responseType: "json",
responseSchema: chunkDCDQNIYY_cjs.listScorersResponseSchema,
summary: "List all scorers",
description: "Returns a list of all registered scorers with their configuration and associated agents and workflows",
tags: ["Scoring"],
requiresAuth: true,
handler: (async ({ mastra, requestContext }) => {
const scorers = await listScorersFromSystem({
mastra,
requestContext
});
return scorers;
})
});
var GET_SCORER_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/scorers/:scorerId",
responseType: "json",
pathParamSchema: chunkDCDQNIYY_cjs.scorerIdPathParams,
responseSchema: chunkDCDQNIYY_cjs.scorerEntrySchema.nullable(),
summary: "Get scorer by ID",
description: "Returns details for a specific scorer including its configuration and associations",
tags: ["Scoring"],
requiresAuth: true,
handler: (async ({ mastra, scorerId, requestContext }) => {
const scorers = await listScorersFromSystem({
mastra,
requestContext
});
const scorer = scorers[scorerId];
if (!scorer) {
return null;
}
return scorer;
})
});
var LIST_SCORES_BY_RUN_ID_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/run/:runId",
responseType: "json",
pathParamSchema: chunkDIG2K5CV_cjs.runIdSchema,
queryParamSchema: chunkDCDQNIYY_cjs.listScoresByRunIdQuerySchema,
responseSchema: chunkDCDQNIYY_cjs.scoresWithPaginationResponseSchema,
summary: "List scores by run ID",
description: "Returns all scores for a specific execution run",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, runId, ...params }) => {
try {
const { page, perPage } = params;
const pagination = {
page: page ?? 0,
perPage: perPage ?? 10
};
const scores = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scores?.listScoresByRunId?.({
runId,
pagination
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting scores by run id");
}
}
});
var LIST_SCORES_BY_SCORER_ID_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/scorer/:scorerId",
responseType: "json",
pathParamSchema: chunkDCDQNIYY_cjs.scorerIdPathParams,
queryParamSchema: chunkDCDQNIYY_cjs.listScoresByScorerIdQuerySchema,
responseSchema: chunkDCDQNIYY_cjs.scoresWithPaginationResponseSchema,
summary: "List scores by scorer ID",
description: "Returns all scores generated by a specific scorer",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, scorerId, ...params }) => {
try {
const { page, perPage, entityId, entityType } = params;
const filters = Object.fromEntries(Object.entries({ entityId, entityType }).filter(([_, v]) => v !== void 0));
const scores = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scores?.listScoresByScorerId?.({
scorerId,
pagination: { page: page ?? 0, perPage: perPage ?? 10 },
...filters
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting scores by scorer id");
}
}
});
var LIST_SCORES_BY_ENTITY_ID_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/scores/entity/:entityType/:entityId",
responseType: "json",
pathParamSchema: chunkDCDQNIYY_cjs.entityPathParams,
queryParamSchema: chunkDCDQNIYY_cjs.listScoresByEntityIdQuerySchema,
responseSchema: chunkDCDQNIYY_cjs.scoresWithPaginationResponseSchema,
summary: "List scores by entity ID",
description: "Returns all scores for a specific entity (agent or workflow)",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, entityId, entityType, ...params }) => {
try {
const { page, perPage } = params;
let entityIdToUse = entityId;
if (entityType === "AGENT") {
const agent = await chunkUNXPZBTJ_cjs.getAgentFromSystem({ mastra, agentId: entityId });
entityIdToUse = agent.id;
} else if (entityType === "WORKFLOW") {
const workflow = mastra.getWorkflowById(entityId);
entityIdToUse = workflow.id;
}
const pagination = {
page: page ?? 0,
perPage: perPage ?? 10
};
const scoresStore = await mastra.getStorage()?.getStore("scores");
const scoreResults = await scoresStore?.listScoresByEntityId?.({
entityId: entityIdToUse,
entityType,
pagination
}) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };
return {
pagination: scoreResults.pagination,
scores: scoreResults.scores.map((score) => ({ ...score, ...getTraceDetails(score.traceId) }))
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting scores by entity id");
}
}
});
var SAVE_SCORE_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/scores",
responseType: "json",
bodySchema: chunkDCDQNIYY_cjs.saveScoreBodySchema,
responseSchema: chunkDCDQNIYY_cjs.saveScoreResponseSchema,
summary: "Save score",
description: "Saves a new score record to storage",
tags: ["Scoring"],
requiresAuth: true,
handler: async ({ mastra, ...params }) => {
try {
const { score } = params;
const scoresStore = await mastra.getStorage()?.getStore("scores");
const result = await scoresStore?.saveScore?.(score);
if (!result) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage not configured" });
}
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error saving score");
}
}
});
exports.GET_SCORER_ROUTE = GET_SCORER_ROUTE;
exports.LIST_SCORERS_ROUTE = LIST_SCORERS_ROUTE;
exports.LIST_SCORES_BY_ENTITY_ID_ROUTE = LIST_SCORES_BY_ENTITY_ID_ROUTE;
exports.LIST_SCORES_BY_RUN_ID_ROUTE = LIST_SCORES_BY_RUN_ID_ROUTE;
exports.LIST_SCORES_BY_SCORER_ID_ROUTE = LIST_SCORES_BY_SCORER_ID_ROUTE;
exports.SAVE_SCORE_ROUTE = SAVE_SCORE_ROUTE;
exports.scores_exports = scores_exports;
//# sourceMappingURL=chunk-EMRTFZVU.cjs.map
//# sourceMappingURL=chunk-EMRTFZVU.cjs.map
{"version":3,"sources":["../src/server/handlers/scores.ts"],"names":["__export","createRoute","listScorersResponseSchema","scorerIdPathParams","scorerEntrySchema","runIdSchema","listScoresByRunIdQuerySchema","scoresWithPaginationResponseSchema","handleError","listScoresByScorerIdQuerySchema","entityPathParams","listScoresByEntityIdQuerySchema","getAgentFromSystem","saveScoreBodySchema","saveScoreResponseSchema","HTTPException"],"mappings":"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","file":"chunk-EMRTFZVU.cjs","sourcesContent":["import type { MastraScorerEntry, ScoreRowData } from '@mastra/core/evals';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { HTTPException } from '../http-exception';\nimport { runIdSchema } from '../schemas/common';\nimport {\n listScorersResponseSchema,\n scorerEntrySchema,\n scorerIdPathParams,\n entityPathParams,\n listScoresByRunIdQuerySchema,\n listScoresByScorerIdQuerySchema,\n listScoresByEntityIdQuerySchema,\n saveScoreBodySchema,\n scoresWithPaginationResponseSchema,\n saveScoreResponseSchema,\n} from '../schemas/scores';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport type { Context } from '../types';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\n\nasync function listScorersFromSystem({\n mastra,\n requestContext,\n}: Context & {\n requestContext: RequestContext;\n}) {\n const agents = mastra.listAgents();\n const workflows = mastra.listWorkflows();\n\n const scorersMap = new Map<\n string,\n MastraScorerEntry & {\n agentIds: string[];\n agentNames: string[];\n workflowIds: string[];\n isRegistered: boolean;\n source: 'code' | 'stored';\n }\n >();\n\n // Helper function to process an agent's scorers\n const processAgentScorers = async (agent: {\n id: string;\n name: string;\n listScorers: (typeof agents)[string]['listScorers'];\n }) => {\n const scorers =\n (await agent.listScorers({\n requestContext,\n })) || {};\n\n if (Object.keys(scorers).length > 0) {\n for (const [_scorerId, scorer] of Object.entries(scorers)) {\n const scorerId = scorer.scorer.id;\n if (scorersMap.has(scorerId)) {\n scorersMap.get(scorerId)?.agentIds.push(agent.id);\n scorersMap.get(scorerId)?.agentNames.push(agent.name);\n } else {\n scorersMap.set(scorerId, {\n workflowIds: [],\n ...scorer,\n agentNames: [agent.name],\n agentIds: [agent.id],\n isRegistered: false,\n source: scorer.scorer.source ?? 'code',\n });\n }\n }\n }\n };\n\n // Process code-defined agents\n for (const [_, agent] of Object.entries(agents)) {\n await processAgentScorers(agent);\n }\n\n // Process stored agents (database-backed agents)\n try {\n const editor = mastra.getEditor();\n const storedAgentsResult = await editor?.agent.list();\n if (storedAgentsResult?.agents) {\n for (const storedAgentConfig of storedAgentsResult.agents) {\n try {\n const agent = await editor?.agent.getById(storedAgentConfig.id);\n if (agent) {\n await processAgentScorers(agent);\n }\n } catch {\n // Skip individual agents that fail to hydrate\n }\n }\n }\n } catch {\n // Silently ignore if storage is not configured - not all setups have storage\n }\n\n // Process stored scorers (standalone CMS-created scorers)\n try {\n const editor = mastra.getEditor();\n const storedScorersResult = await editor?.scorer.list();\n if (storedScorersResult?.scorerDefinitions) {\n for (const storedScorerConfig of storedScorersResult.scorerDefinitions) {\n try {\n await editor?.scorer.getById(storedScorerConfig.id);\n } catch {\n // Skip individual scorers that fail to hydrate\n }\n }\n }\n } catch {\n // Silently ignore if storage is not configured\n }\n\n for (const [workflowId, workflow] of Object.entries(workflows)) {\n const scorers =\n (await workflow.listScorers({\n requestContext,\n })) || {};\n\n if (Object.keys(scorers).length > 0) {\n for (const [_scorerId, scorer] of Object.entries(scorers)) {\n const scorerName = scorer.scorer.name;\n if (scorersMap.has(scorerName)) {\n scorersMap.get(scorerName)?.workflowIds.push(workflowId);\n } else {\n scorersMap.set(scorerName, {\n agentIds: [],\n agentNames: [],\n ...scorer,\n workflowIds: [workflowId],\n isRegistered: false,\n source: scorer.scorer.source ?? 'code',\n });\n }\n }\n }\n }\n\n const registeredScorers = await mastra.listScorers();\n for (const [_scorerId, scorer] of Object.entries(registeredScorers || {})) {\n const scorerId = scorer.id;\n if (scorersMap.has(scorerId)) {\n scorersMap.get(scorerId)!.isRegistered = true;\n } else {\n scorersMap.set(scorerId, {\n scorer: scorer,\n agentIds: [],\n agentNames: [],\n workflowIds: [],\n isRegistered: true,\n source: scorer.source ?? 'code',\n });\n }\n }\n\n return Object.fromEntries(scorersMap.entries());\n}\n\n// Legacy function to get trace and span details\nfunction getTraceDetails(traceIdWithSpanId?: string) {\n if (!traceIdWithSpanId) {\n return {};\n }\n\n const [traceId, spanId] = traceIdWithSpanId.split('-');\n\n return {\n ...(traceId ? { traceId } : {}),\n ...(spanId ? { spanId } : {}),\n };\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport const LIST_SCORERS_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorers',\n responseType: 'json',\n responseSchema: listScorersResponseSchema,\n summary: 'List all scorers',\n description: 'Returns a list of all registered scorers with their configuration and associated agents and workflows',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: (async ({ mastra, requestContext }: any) => {\n const scorers = await listScorersFromSystem({\n mastra,\n requestContext,\n });\n return scorers;\n }) as any,\n});\n\nexport const GET_SCORER_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorers/:scorerId',\n responseType: 'json',\n pathParamSchema: scorerIdPathParams,\n responseSchema: scorerEntrySchema.nullable(),\n summary: 'Get scorer by ID',\n description: 'Returns details for a specific scorer including its configuration and associations',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: (async ({ mastra, scorerId, requestContext }: any) => {\n const scorers = await listScorersFromSystem({\n mastra,\n requestContext,\n });\n\n const scorer = scorers[scorerId];\n\n if (!scorer) {\n return null;\n }\n\n return scorer;\n }) as any,\n});\n\nexport const LIST_SCORES_BY_RUN_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/run/:runId',\n responseType: 'json',\n pathParamSchema: runIdSchema,\n queryParamSchema: listScoresByRunIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by run ID',\n description: 'Returns all scores for a specific execution run',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, runId, ...params }) => {\n try {\n const { page, perPage } = params;\n const pagination: StoragePagination = {\n page: page ?? 0,\n perPage: perPage ?? 10,\n };\n const scores = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scores?.listScoresByRunId?.({\n runId,\n pagination,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by run id');\n }\n },\n});\n\nexport const LIST_SCORES_BY_SCORER_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/scorer/:scorerId',\n responseType: 'json',\n pathParamSchema: scorerIdPathParams,\n queryParamSchema: listScoresByScorerIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by scorer ID',\n description: 'Returns all scores generated by a specific scorer',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, scorerId, ...params }) => {\n try {\n const { page, perPage, entityId, entityType } = params;\n const filters = Object.fromEntries(Object.entries({ entityId, entityType }).filter(([_, v]) => v !== undefined));\n const scores = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scores?.listScoresByScorerId?.({\n scorerId,\n pagination: { page: page ?? 0, perPage: perPage ?? 10 },\n ...filters,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by scorer id');\n }\n },\n});\n\nexport const LIST_SCORES_BY_ENTITY_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/scores/entity/:entityType/:entityId',\n responseType: 'json',\n pathParamSchema: entityPathParams,\n queryParamSchema: listScoresByEntityIdQuerySchema,\n responseSchema: scoresWithPaginationResponseSchema,\n summary: 'List scores by entity ID',\n description: 'Returns all scores for a specific entity (agent or workflow)',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, entityId, entityType, ...params }) => {\n try {\n const { page, perPage } = params;\n let entityIdToUse = entityId;\n\n if (entityType === 'AGENT') {\n const agent = await getAgentFromSystem({ mastra, agentId: entityId });\n entityIdToUse = agent.id;\n } else if (entityType === 'WORKFLOW') {\n const workflow = mastra.getWorkflowById(entityId);\n entityIdToUse = workflow.id;\n }\n\n const pagination: StoragePagination = {\n page: page ?? 0,\n perPage: perPage ?? 10,\n };\n\n const scoresStore = await mastra.getStorage()?.getStore('scores');\n const scoreResults = (await scoresStore?.listScoresByEntityId?.({\n entityId: entityIdToUse,\n entityType,\n pagination,\n })) || { pagination: { total: 0, page: 0, perPage: 0, hasMore: false }, scores: [] };\n\n return {\n pagination: scoreResults.pagination,\n scores: scoreResults.scores.map((score: ScoreRowData) => ({ ...score, ...getTraceDetails(score.traceId) })),\n };\n } catch (error) {\n return handleError(error, 'Error getting scores by entity id');\n }\n },\n});\n\nexport const SAVE_SCORE_ROUTE = createRoute({\n method: 'POST',\n path: '/scores',\n responseType: 'json',\n bodySchema: saveScoreBodySchema,\n responseSchema: saveScoreResponseSchema,\n summary: 'Save score',\n description: 'Saves a new score record to storage',\n tags: ['Scoring'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n try {\n const { score } = params as { score: ScoreRowData };\n const scoresStore = await mastra.getStorage()?.getStore('scores');\n const result = await scoresStore?.saveScore?.(score);\n if (!result) {\n throw new HTTPException(500, { message: 'Storage not configured' });\n }\n return result;\n } catch (error) {\n return handleError(error, 'Error saving score');\n }\n },\n});\n"]}
'use strict';
var chunkTDMX66RN_cjs = require('./chunk-TDMX66RN.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
// src/server/handlers/favorites-enrichment.ts
async function prepareFavoritesEnrichment(mastra, requestContext, entityType, entityIds) {
if (!await chunkTDMX66RN_cjs.isBuilderFeatureEnabled(mastra, "favorites")) return null;
const userId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!userId) return null;
const storage = mastra.getStorage();
if (!storage) return null;
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) return null;
const starredIds = entityIds.length === 0 ? /* @__PURE__ */ new Set() : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });
return { userId, starredIds, favoritesStore };
}
function stripFavoriteFields(record) {
if ("isFavorited" in record || "favoriteCount" in record) {
const copy = { ...record };
delete copy.isFavorited;
delete copy.favoriteCount;
return copy;
}
return record;
}
async function enrichOrStripFavorites(mastra, requestContext, entityType, record) {
const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);
if (enrichment) {
return { ...record, isFavorited: enrichment.starredIds.has(record.id) };
}
return stripFavoriteFields(record);
}
exports.enrichOrStripFavorites = enrichOrStripFavorites;
exports.prepareFavoritesEnrichment = prepareFavoritesEnrichment;
exports.stripFavoriteFields = stripFavoriteFields;
//# sourceMappingURL=chunk-FUEIM3CA.cjs.map
//# sourceMappingURL=chunk-FUEIM3CA.cjs.map
{"version":3,"sources":["../src/server/handlers/favorites-enrichment.ts"],"names":["isBuilderFeatureEnabled","getCallerAuthorId"],"mappings":";;;;;;AAyBA,eAAsB,0BAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,SAAA,EACqC;AACrC,EAAA,IAAI,CAAE,MAAMA,yCAAA,CAAwB,MAAA,EAAQ,WAAW,GAAI,OAAO,IAAA;AAElE,EAAA,MAAM,MAAA,GAASC,oCAAkB,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AACzD,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,MAAM,UAAA,GACJ,SAAA,CAAU,MAAA,KAAW,CAAA,uBACb,GAAA,EAAY,GAChB,MAAM,cAAA,CAAe,gBAAA,CAAiB,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAA;AAC7E,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,cAAA,EAAe;AAC9C;AAMO,SAAS,oBAAsC,MAAA,EAAc;AAClE,EAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,eAAA,IAAmB,MAAA,EAAQ;AACxD,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AASA,eAAsB,sBAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,MAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,MAAM,0BAAA,CAA2B,MAAA,EAAQ,gBAAgB,UAAA,EAAY,CAAC,MAAA,CAAO,EAAE,CAAC,CAAA;AACnG,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,WAAW,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,EACxE;AACA,EAAA,OAAO,oBAAoB,MAAM,CAAA;AACnC","file":"chunk-FUEIM3CA.cjs","sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { FavoritesStorage, StorageFavoriteEntityType } from '@mastra/core/storage';\n\nimport { getCallerAuthorId } from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\n\n/**\n * Result of `prepareFavoritesEnrichment` — `null` when the `favorites` EE feature is off.\n * When non-null the caller may use `starredIds` to set `isFavorited` on records\n * and may pass `userId` along to storage list paths for pin-favorited-first\n * sorting (`pinFavoritedFor`).\n */\nexport type FavoritesEnrichmentContext = {\n userId: string;\n starredIds: Set<string>;\n favoritesStore: FavoritesStorage;\n} | null;\n\n/**\n * Resolve the EE feature flag plus the caller's favorited set for a list of\n * candidate entity IDs in one shot. Soft-gated: returns `null` if the feature\n * is off or there's no caller — handlers should drop `isFavorited` / `favoriteCount`\n * fields and ignore `?favoritedOnly=true` in that case.\n */\nexport async function prepareFavoritesEnrichment(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n entityIds: string[],\n): Promise<FavoritesEnrichmentContext> {\n if (!(await isBuilderFeatureEnabled(mastra, 'favorites'))) return null;\n\n const userId = getCallerAuthorId(requestContext);\n if (!userId) return null;\n\n const storage = mastra.getStorage();\n if (!storage) return null;\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) return null;\n\n const starredIds =\n entityIds.length === 0\n ? new Set<string>()\n : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });\n return { userId, starredIds, favoritesStore };\n}\n\n/**\n * Strip the favorites EE fields from a record. Used when the feature is off so\n * stale values from storage do not leak through the API.\n */\nexport function stripFavoriteFields<T extends object>(record: T): T {\n if ('isFavorited' in record || 'favoriteCount' in record) {\n const copy = { ...record } as Record<string, unknown>;\n delete copy.isFavorited;\n delete copy.favoriteCount;\n return copy as T;\n }\n return record;\n}\n\n/**\n * Convenience for single-entity handlers (GET / POST / PATCH): annotate\n * `isFavorited` from the caller's favorites set when enrichment is available,\n * otherwise strip both favorite fields. `favoriteCount` is the canonical\n * mirrored counter and is left in place so callers can render share-count UI\n * (it's identical across viewers).\n */\nexport async function enrichOrStripFavorites<T extends { id: string }>(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n record: T,\n): Promise<T> {\n const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);\n if (enrichment) {\n return { ...record, isFavorited: enrichment.starredIds.has(record.id) };\n }\n return stripFavoriteFields(record);\n}\n"]}
'use strict';
var chunk42WZN6MM_cjs = require('./chunk-42WZN6MM.cjs');
var chunkF3HP5HM6_cjs = require('./chunk-F3HP5HM6.cjs');
var chunkYLWKZ3VK_cjs = require('./chunk-YLWKZ3VK.cjs');
var chunkUNXPZBTJ_cjs = require('./chunk-UNXPZBTJ.cjs');
var chunkRVD3DGBZ_cjs = require('./chunk-RVD3DGBZ.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
var crypto = require('crypto');
// src/server/handlers/responses.ts
var responses_exports = {};
chunkO7I5CWRX_cjs.__export(responses_exports, {
CREATE_RESPONSE_ROUTE: () => CREATE_RESPONSE_ROUTE,
DELETE_RESPONSE_ROUTE: () => DELETE_RESPONSE_ROUTE,
GET_RESPONSE_ROUTE: () => GET_RESPONSE_ROUTE
});
var JSON_OBJECT_RESPONSE_SCHEMA = {
type: "object",
additionalProperties: true
};
function jsonResponse(data, status = 200) {
return new Response(JSON.stringify(data), {
status,
headers: {
"Content-Type": "application/json"
}
});
}
function createStructuredOutput(text) {
if (!text) {
return void 0;
}
switch (text.format.type) {
case "json_object":
return {
schema: JSON_OBJECT_RESPONSE_SCHEMA,
jsonPromptInjection: true
};
case "json_schema":
return {
schema: text.format.schema
};
default:
return void 0;
}
}
function getStreamedMessageOutputItem(response, responseId) {
return response.output.find(
(item) => item.type === "message" && item.id === responseId
) ?? null;
}
async function resolveThreadExecutionContext({
agent,
store,
conversationId,
previousResponseTurnRecord,
requestContext
}) {
if (conversationId && previousResponseTurnRecord && previousResponseTurnRecord.thread.id !== conversationId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "conversation_id and previous_response_id must reference the same conversation thread when both are provided"
});
}
if (previousResponseTurnRecord) {
return {
threadId: previousResponseTurnRecord.thread.id,
resourceId: previousResponseTurnRecord.thread.resourceId
};
}
const effectiveThreadId = chunkRVD3DGBZ_cjs.getEffectiveThreadId(requestContext, void 0);
const effectiveResourceId = chunkRVD3DGBZ_cjs.getEffectiveResourceId(requestContext, void 0);
if (!store && !conversationId && !effectiveThreadId) {
return null;
}
const memory = await agent.getMemory({ requestContext });
if (!memory) {
if (conversationId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "conversation_id requires the target agent to have memory configured"
});
}
return null;
}
if (conversationId) {
const existingThread2 = await memory.getThreadById({ threadId: conversationId });
if (!existingThread2) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
await chunkRVD3DGBZ_cjs.enforceThreadAccess({
mastra: agent.getMastraInstance(),
requestContext,
threadId: conversationId,
thread: existingThread2,
effectiveResourceId
});
return {
threadId: existingThread2.id,
resourceId: effectiveResourceId ?? existingThread2.resourceId
};
}
if (!effectiveThreadId) {
if (!store) {
return null;
}
const threadId2 = crypto.randomUUID();
const createdThread2 = await memory.createThread({
threadId: threadId2,
resourceId: effectiveResourceId ?? threadId2
});
return {
threadId: createdThread2.id,
resourceId: createdThread2.resourceId
};
}
const threadId = effectiveThreadId;
const existingThread = await memory.getThreadById({ threadId });
if (existingThread) {
await chunkRVD3DGBZ_cjs.enforceThreadAccess({
mastra: agent.getMastraInstance(),
requestContext,
threadId,
thread: existingThread,
effectiveResourceId
});
return {
threadId: existingThread.id,
resourceId: effectiveResourceId ?? existingThread.resourceId
};
}
if (!store) {
return null;
}
const resourceId = effectiveResourceId ?? threadId;
const createdThread = await memory.createThread({
threadId,
resourceId
});
return {
threadId: createdThread.id,
resourceId: createdThread.resourceId
};
}
function createExecutionMemory(threadContext) {
if (!threadContext) {
return void 0;
}
return {
memory: {
thread: threadContext.threadId,
resource: threadContext.resourceId
}
};
}
async function resolveResponseAgent({
mastra,
agentId
}) {
if (!agentId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "Responses requests require an agent_id"
});
}
if (!mastra) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Mastra instance is required for agent-backed responses" });
}
return chunkUNXPZBTJ_cjs.getAgentFromSystem({ mastra, agentId });
}
async function resolveAgentMemoryStore({
agent,
requestContext,
errorMessage
}) {
const agentMemoryStore = await chunkYLWKZ3VK_cjs.getAgentMemoryStore({ agent, requestContext });
if (!agentMemoryStore) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: errorMessage });
}
return agentMemoryStore;
}
async function executeGenerate({
agent,
resolvedModel,
modelOverride,
instructions,
text,
providerOptions,
input,
requestContext,
abortSignal,
threadContext
}) {
const executionMemory = createExecutionMemory(threadContext);
const structuredOutput = createStructuredOutput(text);
const modelOption = modelOverride ? { model: modelOverride } : {};
const commonOptions = {
instructions,
requestContext,
abortSignal,
...modelOption,
structuredOutput,
providerOptions,
...executionMemory ?? {}
};
if (resolvedModel.specificationVersion === "v1") {
if (threadContext) {
return await agent.generateLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions,
resourceId: threadContext.resourceId,
threadId: threadContext.threadId
});
}
return await agent.generateLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions
});
}
return await agent.generate(input, commonOptions);
}
async function executeStream({
agent,
resolvedModel,
modelOverride,
instructions,
text,
providerOptions,
input,
requestContext,
abortSignal,
threadContext
}) {
const executionMemory = createExecutionMemory(threadContext);
const structuredOutput = createStructuredOutput(text);
const modelOption = modelOverride ? { model: modelOverride } : {};
const commonOptions = {
instructions,
requestContext,
abortSignal,
...modelOption,
structuredOutput,
providerOptions,
...executionMemory ?? {}
};
if (resolvedModel.specificationVersion === "v1") {
if (threadContext) {
return await agent.streamLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions,
resourceId: threadContext.resourceId,
threadId: threadContext.threadId
});
}
return await agent.streamLegacy(input, {
instructions,
requestContext,
abortSignal,
...modelOption,
output: structuredOutput?.schema,
providerOptions
});
}
return await agent.stream(input, commonOptions);
}
async function resolveUsage(result) {
return await (result.totalUsage ?? result.usage ?? null);
}
async function resolveProviderMetadata(result) {
return await (result.providerMetadata ?? void 0);
}
async function resolveFinishReason(result) {
return await result.finishReason ?? void 0;
}
async function resolveText(result) {
return await result.text ?? "";
}
async function resolveCompletedResponseState(result, fallbackText) {
const usage = await resolveUsage(result);
return {
completedAt: Math.floor(Date.now() / 1e3),
status: chunkF3HP5HM6_cjs.toResponseStatus(await resolveFinishReason(result)),
text: await resolveText(result) || fallbackText,
usage,
usageDetails: chunkF3HP5HM6_cjs.toResponseUsage(usage),
providerOptions: await resolveProviderMetadata(result)
};
}
async function storeCompletedResponse({
agentMemoryStore,
didStore,
threadContext,
responseId,
metadata,
completedState,
messages,
outputItems
}) {
if (!didStore || !threadContext) {
return;
}
await chunkYLWKZ3VK_cjs.persistResponseTurnRecord({
memoryStore: agentMemoryStore,
responseId,
metadata: {
...metadata,
completedAt: completedState.completedAt,
status: completedState.status,
usage: completedState.usageDetails,
providerOptions: completedState.providerOptions,
messageIds: [],
outputItems
},
threadContext,
messages
});
}
async function finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result,
responseId,
createdAt,
model,
instructions,
previousResponseId,
conversationId,
configuredTools,
responseMetadata,
fallbackText,
fallbackOutputItems
}) {
const completedState = await resolveCompletedResponseState(result, fallbackText);
const fallbackItems = fallbackOutputItems?.(completedState);
const responseMessages = await chunkYLWKZ3VK_cjs.resolveResponseTurnMessagesForStorage({
result,
responseId,
text: completedState.text,
threadContext,
fallbackOutputItems: threadContext ? fallbackItems : void 0
});
const response = chunkF3HP5HM6_cjs.buildCompletedResponse({
responseId,
outputMessageId: responseId,
model,
createdAt,
completedAt: completedState.completedAt,
status: completedState.status,
text: completedState.text,
usage: completedState.usage,
instructions,
textConfig: responseMetadata.text,
previousResponseId,
conversationId,
providerOptions: completedState.providerOptions,
tools: configuredTools,
messages: responseMessages,
fallbackOutputItems: fallbackItems,
store: didStore
});
await storeCompletedResponse({
agentMemoryStore,
didStore,
threadContext,
responseId,
metadata: responseMetadata,
completedState,
messages: responseMessages,
outputItems: response.output
});
return { completedState, response, responseMessages };
}
async function prepareCreateResponseRequest({
body,
mastra,
requestContext
}) {
const executionInput = chunkF3HP5HM6_cjs.mapResponseInputToExecutionMessages(body.input);
let previousResponseTurnRecord = null;
let resolvedAgent = null;
if (body.previous_response_id) {
if (body.agent_id) {
resolvedAgent = await resolveResponseAgent({ mastra, agentId: body.agent_id });
previousResponseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecord({
agent: resolvedAgent,
responseId: body.previous_response_id,
requestContext
});
if (!previousResponseTurnRecord) {
const owningResponseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecordAcrossAgents({
mastra,
responseId: body.previous_response_id,
requestContext
});
if (owningResponseTurnRecord) {
if (owningResponseTurnRecord.metadata.agentId === body.agent_id) {
previousResponseTurnRecord = owningResponseTurnRecord;
} else {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: `Stored response ${body.previous_response_id} belongs to agent ${owningResponseTurnRecord.metadata.agentId}, not ${body.agent_id}`
});
}
}
if (!previousResponseTurnRecord) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });
}
}
} else {
if (!mastra) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Mastra instance is required for agent-backed responses" });
}
previousResponseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecordAcrossAgents({
mastra,
responseId: body.previous_response_id,
requestContext
});
if (!previousResponseTurnRecord) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });
}
}
}
const agent = resolvedAgent ?? await resolveResponseAgent({
mastra,
agentId: body.agent_id ?? previousResponseTurnRecord?.metadata.agentId
});
const resolvedModel = await agent.getModel({
requestContext,
modelConfig: body.model
});
const responseModel = body.model ?? (() => {
if (resolvedModel.provider && resolvedModel.modelId) {
const publicProviderId = resolvedModel.provider.includes(".") ? resolvedModel.provider.split(".")[0] : resolvedModel.provider;
return `${publicProviderId}/${resolvedModel.modelId}`;
}
if (resolvedModel.modelId) {
return resolvedModel.modelId;
}
throw new chunk64ITUOXI_cjs.HTTPException(500, {
message: "Responses route could not determine the effective model for this request"
});
})();
const shouldStore = body.store ?? false;
const needsMemoryStore = shouldStore || Boolean(body.conversation_id) || Boolean(body.previous_response_id);
const agentMemoryStore = needsMemoryStore ? await resolveAgentMemoryStore({
agent,
requestContext,
errorMessage: body.previous_response_id ? "previous_response_id requires the target agent to have memory storage configured" : shouldStore ? "Stored responses require the target agent to have memory storage configured" : "conversation_id requires the target agent to have memory storage configured"
}) : null;
const configuredTools = chunkF3HP5HM6_cjs.mapMastraToolsToResponseTools(
await Promise.resolve(agent.listTools({ requestContext }))
);
const responseId = chunkF3HP5HM6_cjs.createMessageId();
const createdAt = Math.floor(Date.now() / 1e3);
const threadContext = await resolveThreadExecutionContext({
agent,
store: shouldStore,
conversationId: body.conversation_id,
previousResponseTurnRecord,
requestContext
});
if (shouldStore && !threadContext) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "Stored responses require the target agent to have memory configured"
});
}
const didStore = shouldStore && Boolean(threadContext);
return {
agent,
agentMemoryStore,
configuredTools,
createdAt,
didStore,
executionInput,
previousResponseTurnRecord,
resolvedModel,
responseId,
responseModel,
responseMetadata: {
agentId: agent.id,
model: responseModel,
createdAt,
instructions: body.instructions,
text: body.text,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
tools: configuredTools,
store: didStore
},
threadContext
};
}
function createResponseEventStream({
agentMemoryStore,
body,
configuredTools,
createdAt,
didStore,
previousResponseTurnRecord,
responseId,
responseModel,
responseMetadata,
streamResult,
threadContext
}) {
const createdResponse = chunkF3HP5HM6_cjs.buildInProgressResponse({
responseId,
model: responseModel,
createdAt,
instructions: body.instructions,
textConfig: body.text,
previousResponseId: body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
tools: configuredTools,
store: didStore
});
return new ReadableStream({
async start(controller) {
let sequenceNumber = 1;
const enqueueEvent = (eventName, payload) => {
controller.enqueue(
chunkF3HP5HM6_cjs.formatSseEvent(eventName, {
...payload,
sequence_number: sequenceNumber++
})
);
};
enqueueEvent("response.created", {
type: "response.created",
response: createdResponse
});
enqueueEvent("response.in_progress", {
type: "response.in_progress",
response: createdResponse
});
const streamEvents = chunkF3HP5HM6_cjs.createResponseStreamEventTranslator(responseId);
const fullStream = await streamResult.fullStream;
const reader = fullStream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
for (const event of streamEvents.consume(value)) {
enqueueEvent(event.event, event.payload);
}
}
for (const event of streamEvents.flushPendingToolResults()) {
enqueueEvent(event.event, event.payload);
}
const { completedState, response } = await finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result: streamResult,
responseId,
createdAt,
model: responseModel,
instructions: body.instructions,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
configuredTools,
responseMetadata,
fallbackText: streamEvents.text,
fallbackOutputItems: (completedState2) => streamEvents.getOutputItems({
text: completedState2.text,
status: completedState2.status
})
});
const completedItem = getStreamedMessageOutputItem(response, responseId);
if (completedItem || completedState.text) {
for (const event of streamEvents.completeText(
completedState.text,
completedItem ?? {
id: responseId,
type: "message",
role: "assistant",
status: "completed",
content: [chunkF3HP5HM6_cjs.createOutputTextPart(completedState.text)]
}
)) {
enqueueEvent(event.event, event.payload);
}
}
enqueueEvent("response.completed", {
type: "response.completed",
response
});
controller.close();
} catch (error) {
controller.error(error);
} finally {
reader.releaseLock();
}
}
});
}
var CREATE_RESPONSE_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/v1/responses",
responseType: "datastream-response",
bodySchema: chunk42WZN6MM_cjs.createResponseBodySchema,
responseSchema: chunk42WZN6MM_cjs.responseObjectSchema,
summary: "Create a response",
description: "Creates a response through a Mastra-hosted Responses API-compatible route",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_EXECUTE,
handler: async ({ mastra, requestContext, abortSignal, ...body }) => {
try {
const {
agent,
agentMemoryStore,
configuredTools,
createdAt,
didStore,
executionInput,
previousResponseTurnRecord,
resolvedModel,
responseId,
responseModel,
responseMetadata,
threadContext
} = await prepareCreateResponseRequest({ body, mastra, requestContext });
if (!body.stream) {
const result = await executeGenerate({
agent,
resolvedModel,
modelOverride: body.model,
instructions: body.instructions,
text: body.text,
providerOptions: body.providerOptions,
input: executionInput,
requestContext,
abortSignal,
threadContext
});
const { response } = await finalizeResponse({
agentMemoryStore,
didStore,
threadContext,
result,
responseId,
createdAt,
model: responseModel,
instructions: body.instructions,
previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,
conversationId: threadContext?.threadId ?? body.conversation_id,
configuredTools,
responseMetadata,
fallbackText: ""
});
return jsonResponse(response);
}
const streamResult = await executeStream({
agent,
resolvedModel,
modelOverride: body.model,
instructions: body.instructions,
text: body.text,
providerOptions: body.providerOptions,
input: executionInput,
requestContext,
abortSignal,
threadContext
});
const stream = createResponseEventStream({
agentMemoryStore,
body,
configuredTools,
createdAt,
didStore,
previousResponseTurnRecord,
responseId,
responseModel,
responseMetadata,
streamResult,
threadContext
});
return new Response(stream, {
headers: {
"Content-Type": "text/event-stream; charset=utf-8",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"X-Accel-Buffering": "no"
}
});
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error creating response");
}
}
});
var GET_RESPONSE_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/v1/responses/:responseId",
responseType: "json",
pathParamSchema: chunk42WZN6MM_cjs.responseIdPathParams,
responseSchema: chunk42WZN6MM_cjs.responseObjectSchema,
summary: "Retrieve a stored response",
description: "Returns a previously stored response object",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, responseId }) => {
try {
const responseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });
if (!responseTurnRecord) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored response ${responseId} was not found` });
}
return chunkF3HP5HM6_cjs.mapResponseTurnRecordToResponse(responseTurnRecord);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error retrieving response");
}
}
});
var DELETE_RESPONSE_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/v1/responses/:responseId",
responseType: "json",
pathParamSchema: chunk42WZN6MM_cjs.responseIdPathParams,
responseSchema: chunk42WZN6MM_cjs.deleteResponseSchema,
summary: "Delete a stored response",
description: "Deletes a stored response so it can no longer be retrieved or chained",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_DELETE,
handler: async ({ mastra, requestContext, responseId }) => {
try {
const responseTurnRecord = await chunkYLWKZ3VK_cjs.findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });
if (!responseTurnRecord) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored response ${responseId} was not found` });
}
await chunkYLWKZ3VK_cjs.deleteResponseTurnRecord({ responseTurnRecord });
const response = {
id: responseId,
object: "response",
deleted: true
};
return response;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error deleting response");
}
}
});
exports.CREATE_RESPONSE_ROUTE = CREATE_RESPONSE_ROUTE;
exports.DELETE_RESPONSE_ROUTE = DELETE_RESPONSE_ROUTE;
exports.GET_RESPONSE_ROUTE = GET_RESPONSE_ROUTE;
exports.responses_exports = responses_exports;
//# sourceMappingURL=chunk-H2WXUVWU.cjs.map
//# sourceMappingURL=chunk-H2WXUVWU.cjs.map
{"version":3,"sources":["../src/server/handlers/responses.ts"],"names":["__export","HTTPException","getEffectiveThreadId","getEffectiveResourceId","existingThread","enforceThreadAccess","threadId","randomUUID","createdThread","getAgentFromSystem","getAgentMemoryStore","toResponseStatus","toResponseUsage","persistResponseTurnRecord","resolveResponseTurnMessagesForStorage","buildCompletedResponse","mapResponseInputToExecutionMessages","findResponseTurnRecord","findResponseTurnRecordAcrossAgents","mapMastraToolsToResponseTools","createMessageId","buildInProgressResponse","formatSseEvent","createResponseStreamEventTranslator","completedState","createOutputTextPart","createRoute","createResponseBodySchema","responseObjectSchema","MastraFGAPermissions","handleError","responseIdPathParams","mapResponseTurnRecordToResponse","deleteResponseSchema","deleteResponseTurnRecord"],"mappings":"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","file":"chunk-H2WXUVWU.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { Agent, MastraDBMessage } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MemoryStorage } from '@mastra/core/storage';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n createResponseBodySchema,\n deleteResponseSchema,\n responseIdPathParams,\n responseObjectSchema,\n} from '../schemas/responses';\nimport type { CreateResponseBody, DeleteResponse, ResponseObject } from '../schemas/responses';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport {\n buildCompletedResponse,\n buildInProgressResponse,\n createResponseStreamEventTranslator,\n createMessageId,\n createOutputTextPart,\n formatSseEvent,\n mapMastraToolsToResponseTools,\n mapResponseInputToExecutionMessages,\n mapResponseTurnRecordToResponse,\n toResponseStatus,\n toResponseUsage,\n} from './responses.adapter';\nimport {\n deleteResponseTurnRecord,\n findResponseTurnRecord,\n findResponseTurnRecordAcrossAgents,\n getAgentMemoryStore,\n persistResponseTurnRecord,\n resolveResponseTurnMessagesForStorage,\n} from './responses.storage';\nimport type {\n ProviderMetadataLike,\n ResponseTurnRecord,\n ResponseTurnRecordMetadata,\n ThreadExecutionContext,\n UsageLike,\n} from './responses.storage';\nimport { enforceThreadAccess, getEffectiveResourceId, getEffectiveThreadId } from './utils';\n\ntype AgentExecutionInput = Parameters<Agent['generate']>[0];\ntype ResolvedAgentModel = Awaited<ReturnType<Agent['getModel']>>;\n\ntype ResponseExecutionResult = {\n text?: string;\n finishReason?: string;\n totalUsage?: UsageLike | Promise<UsageLike>;\n usage?: UsageLike | Promise<UsageLike>;\n providerMetadata?: ProviderMetadataLike | Promise<ProviderMetadataLike>;\n response?: {\n id?: string;\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype ResponseStreamResult = {\n fullStream: ReadableStream<unknown> | Promise<ReadableStream<unknown>>;\n text: Promise<string> | string;\n finishReason: Promise<string | undefined> | string | undefined;\n totalUsage?: Promise<UsageLike> | UsageLike;\n usage?: Promise<UsageLike> | UsageLike;\n providerMetadata?: Promise<ProviderMetadataLike> | ProviderMetadataLike;\n response?:\n | Promise<{\n id?: string;\n dbMessages?: MastraDBMessage[];\n }>\n | {\n id?: string;\n dbMessages?: MastraDBMessage[];\n };\n};\n\ntype CompletedResponseState = {\n completedAt: number;\n status: ResponseObject['status'];\n text: string;\n usage: UsageLike;\n usageDetails: ResponseObject['usage'];\n providerOptions: ProviderMetadataLike;\n};\n\ntype FinalizedResponse = {\n completedState: CompletedResponseState;\n response: ResponseObject;\n responseMessages: MastraDBMessage[];\n};\n\ntype PreparedCreateResponseRequest = {\n agent: Agent<any, any, any, any>;\n agentMemoryStore: MemoryStorage | null;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n createdAt: number;\n didStore: boolean;\n executionInput: AgentExecutionInput;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n resolvedModel: ResolvedAgentModel;\n responseId: string;\n responseModel: string;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n threadContext: ThreadExecutionContext | null;\n};\n\nconst JSON_OBJECT_RESPONSE_SCHEMA = {\n type: 'object',\n additionalProperties: true,\n} as const;\n\nfunction jsonResponse(data: ResponseObject, status: number = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n}\n\nfunction createStructuredOutput(text: CreateResponseBody['text']) {\n if (!text) {\n return undefined;\n }\n\n switch (text.format.type) {\n case 'json_object':\n return {\n schema: JSON_OBJECT_RESPONSE_SCHEMA,\n jsonPromptInjection: true,\n };\n case 'json_schema':\n return {\n schema: text.format.schema,\n };\n default:\n return undefined;\n }\n}\n\nfunction getStreamedMessageOutputItem(response: ResponseObject, responseId: string) {\n return (\n response.output.find(\n (item): item is Extract<ResponseObject['output'][number], { type: 'message' }> =>\n item.type === 'message' && item.id === responseId,\n ) ?? null\n );\n}\n\n/**\n * Resolves the memory thread that should back the current response request.\n *\n * If `previous_response_id` is present, the request continues on that stored thread.\n * Otherwise, the route only creates or reuses a thread when the caller asked to store\n * the response and the resolved agent actually has memory configured.\n */\nasync function resolveThreadExecutionContext({\n agent,\n store,\n conversationId,\n previousResponseTurnRecord,\n requestContext,\n}: {\n agent: Agent<any, any, any, any>;\n store: boolean;\n conversationId?: string;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n requestContext: RequestContext;\n}): Promise<ThreadExecutionContext | null> {\n if (conversationId && previousResponseTurnRecord && previousResponseTurnRecord.thread.id !== conversationId) {\n throw new HTTPException(400, {\n message:\n 'conversation_id and previous_response_id must reference the same conversation thread when both are provided',\n });\n }\n\n if (previousResponseTurnRecord) {\n return {\n threadId: previousResponseTurnRecord.thread.id,\n resourceId: previousResponseTurnRecord.thread.resourceId,\n };\n }\n\n const effectiveThreadId = getEffectiveThreadId(requestContext, undefined);\n const effectiveResourceId = getEffectiveResourceId(requestContext, undefined);\n\n if (!store && !conversationId && !effectiveThreadId) {\n return null;\n }\n\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n if (conversationId) {\n throw new HTTPException(400, {\n message: 'conversation_id requires the target agent to have memory configured',\n });\n }\n\n return null;\n }\n\n if (conversationId) {\n const existingThread = await memory.getThreadById({ threadId: conversationId });\n if (!existingThread) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await enforceThreadAccess({\n mastra: agent.getMastraInstance(),\n requestContext,\n threadId: conversationId,\n thread: existingThread,\n effectiveResourceId,\n });\n return {\n threadId: existingThread.id,\n resourceId: effectiveResourceId ?? existingThread.resourceId,\n };\n }\n\n if (!effectiveThreadId) {\n if (!store) {\n return null;\n }\n\n const threadId = randomUUID();\n const createdThread = await memory.createThread({\n threadId,\n resourceId: effectiveResourceId ?? threadId,\n });\n\n return {\n threadId: createdThread.id,\n resourceId: createdThread.resourceId,\n };\n }\n\n const threadId = effectiveThreadId;\n const existingThread = await memory.getThreadById({ threadId });\n if (existingThread) {\n await enforceThreadAccess({\n mastra: agent.getMastraInstance(),\n requestContext,\n threadId,\n thread: existingThread,\n effectiveResourceId,\n });\n return {\n threadId: existingThread.id,\n resourceId: effectiveResourceId ?? existingThread.resourceId,\n };\n }\n\n if (!store) {\n return null;\n }\n\n const resourceId = effectiveResourceId ?? threadId;\n const createdThread = await memory.createThread({\n threadId,\n resourceId,\n });\n\n return {\n threadId: createdThread.id,\n resourceId: createdThread.resourceId,\n };\n}\n\nfunction createExecutionMemory(threadContext: ThreadExecutionContext | null) {\n if (!threadContext) {\n return undefined;\n }\n\n return {\n memory: {\n thread: threadContext.threadId,\n resource: threadContext.resourceId,\n },\n } as const;\n}\n\n/**\n * Resolves the registered Mastra agent that owns the response request.\n */\nasync function resolveResponseAgent({\n mastra,\n agentId,\n}: {\n mastra: Mastra | undefined;\n agentId?: string;\n}): Promise<Agent<any, any, any, any>> {\n if (!agentId) {\n throw new HTTPException(400, {\n message: 'Responses requests require an agent_id',\n });\n }\n\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for agent-backed responses' });\n }\n\n return getAgentFromSystem({ mastra, agentId });\n}\n\nasync function resolveAgentMemoryStore({\n agent,\n requestContext,\n errorMessage,\n}: {\n agent: Agent<any, any, any, any>;\n requestContext: RequestContext;\n errorMessage: string;\n}): Promise<MemoryStorage> {\n const agentMemoryStore = await getAgentMemoryStore({ agent, requestContext });\n if (!agentMemoryStore) {\n throw new HTTPException(400, { message: errorMessage });\n }\n\n return agentMemoryStore;\n}\n\n/**\n * Executes a non-streaming Responses API request through the resolved Mastra agent.\n */\nasync function executeGenerate({\n agent,\n resolvedModel,\n modelOverride,\n instructions,\n text,\n providerOptions,\n input,\n requestContext,\n abortSignal,\n threadContext,\n}: {\n agent: Agent;\n resolvedModel: ResolvedAgentModel;\n modelOverride?: string;\n instructions: string | undefined;\n text: CreateResponseBody['text'];\n providerOptions: CreateResponseBody['providerOptions'];\n input: AgentExecutionInput;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n threadContext: ThreadExecutionContext | null;\n}) {\n const executionMemory = createExecutionMemory(threadContext);\n const structuredOutput = createStructuredOutput(text);\n const modelOption = modelOverride ? { model: modelOverride } : {};\n const commonOptions = {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n structuredOutput,\n providerOptions,\n ...(executionMemory ?? {}),\n };\n\n if (resolvedModel.specificationVersion === 'v1') {\n if (threadContext) {\n return (await agent.generateLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n resourceId: threadContext.resourceId,\n threadId: threadContext.threadId,\n } as never)) as ResponseExecutionResult;\n }\n\n return (await agent.generateLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n } as never)) as ResponseExecutionResult;\n }\n\n return (await agent.generate(input, commonOptions as never)) as ResponseExecutionResult;\n}\n\n/**\n * Executes a streaming Responses API request through the resolved Mastra agent.\n */\nasync function executeStream({\n agent,\n resolvedModel,\n modelOverride,\n instructions,\n text,\n providerOptions,\n input,\n requestContext,\n abortSignal,\n threadContext,\n}: {\n agent: Agent;\n resolvedModel: ResolvedAgentModel;\n modelOverride?: string;\n instructions: string | undefined;\n text: CreateResponseBody['text'];\n providerOptions: CreateResponseBody['providerOptions'];\n input: AgentExecutionInput;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n threadContext: ThreadExecutionContext | null;\n}) {\n const executionMemory = createExecutionMemory(threadContext);\n const structuredOutput = createStructuredOutput(text);\n const modelOption = modelOverride ? { model: modelOverride } : {};\n const commonOptions = {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n structuredOutput,\n providerOptions,\n ...(executionMemory ?? {}),\n };\n\n if (resolvedModel.specificationVersion === 'v1') {\n if (threadContext) {\n return (await agent.streamLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n resourceId: threadContext.resourceId,\n threadId: threadContext.threadId,\n } as never)) as ResponseStreamResult;\n }\n\n return (await agent.streamLegacy(input, {\n instructions,\n requestContext,\n abortSignal,\n ...modelOption,\n output: structuredOutput?.schema,\n providerOptions,\n } as never)) as ResponseStreamResult;\n }\n\n return (await agent.stream(input, commonOptions as never)) as ResponseStreamResult;\n}\n\nasync function resolveUsage(result: ResponseExecutionResult | ResponseStreamResult): Promise<UsageLike> {\n return (await (result.totalUsage ?? result.usage ?? null)) as UsageLike;\n}\n\nasync function resolveProviderMetadata(\n result: ResponseExecutionResult | ResponseStreamResult,\n): Promise<ProviderMetadataLike> {\n return (await (result.providerMetadata ?? undefined)) as ProviderMetadataLike;\n}\n\nasync function resolveFinishReason(\n result: ResponseExecutionResult | ResponseStreamResult,\n): Promise<string | undefined> {\n return (await result.finishReason) ?? undefined;\n}\n\nasync function resolveText(result: ResponseExecutionResult | ResponseStreamResult): Promise<string> {\n return (await result.text) ?? '';\n}\n\n/**\n * Resolves the final response state shared by streaming and non-streaming flows.\n */\nasync function resolveCompletedResponseState(\n result: ResponseExecutionResult | ResponseStreamResult,\n fallbackText: string,\n): Promise<CompletedResponseState> {\n const usage = await resolveUsage(result);\n\n return {\n completedAt: Math.floor(Date.now() / 1000),\n status: toResponseStatus(await resolveFinishReason(result)),\n text: (await resolveText(result)) || fallbackText,\n usage,\n usageDetails: toResponseUsage(usage),\n providerOptions: await resolveProviderMetadata(result),\n };\n}\n\n/**\n * Stores the completed response when the request opted into memory-backed persistence.\n */\nasync function storeCompletedResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n responseId,\n metadata,\n completedState,\n messages,\n outputItems,\n}: {\n agentMemoryStore: MemoryStorage | null;\n didStore: boolean;\n threadContext: ThreadExecutionContext | null;\n responseId: string;\n metadata: Omit<ResponseTurnRecordMetadata, 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'>;\n completedState: CompletedResponseState;\n messages: MastraDBMessage[];\n outputItems: ResponseObject['output'];\n}): Promise<void> {\n if (!didStore || !threadContext) {\n return;\n }\n\n await persistResponseTurnRecord({\n memoryStore: agentMemoryStore,\n responseId,\n metadata: {\n ...metadata,\n completedAt: completedState.completedAt,\n status: completedState.status,\n usage: completedState.usageDetails,\n providerOptions: completedState.providerOptions,\n messageIds: [],\n outputItems,\n },\n threadContext,\n messages,\n });\n}\n\n/**\n * Resolves the final response object and persists the stored response turn when needed.\n */\nasync function finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result,\n responseId,\n createdAt,\n model,\n instructions,\n previousResponseId,\n conversationId,\n configuredTools,\n responseMetadata,\n fallbackText,\n fallbackOutputItems,\n}: {\n agentMemoryStore: MemoryStorage | null;\n didStore: boolean;\n threadContext: ThreadExecutionContext | null;\n result: ResponseExecutionResult | ResponseStreamResult;\n responseId: string;\n createdAt: number;\n model: string;\n instructions: string | undefined;\n previousResponseId?: string;\n conversationId?: string;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n fallbackText: string;\n fallbackOutputItems?: (completedState: CompletedResponseState) => ResponseObject['output'];\n}): Promise<FinalizedResponse> {\n const completedState = await resolveCompletedResponseState(result, fallbackText);\n const fallbackItems = fallbackOutputItems?.(completedState);\n const responseMessages = await resolveResponseTurnMessagesForStorage({\n result,\n responseId,\n text: completedState.text,\n threadContext,\n fallbackOutputItems: threadContext ? fallbackItems : undefined,\n });\n const response = buildCompletedResponse({\n responseId,\n outputMessageId: responseId,\n model,\n createdAt,\n completedAt: completedState.completedAt,\n status: completedState.status,\n text: completedState.text,\n usage: completedState.usage,\n instructions,\n textConfig: responseMetadata.text,\n previousResponseId,\n conversationId,\n providerOptions: completedState.providerOptions,\n tools: configuredTools,\n messages: responseMessages,\n fallbackOutputItems: fallbackItems,\n store: didStore,\n });\n\n await storeCompletedResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n responseId,\n metadata: responseMetadata,\n completedState,\n messages: responseMessages,\n outputItems: response.output,\n });\n\n return { completedState, response, responseMessages };\n}\n\n/**\n * Resolves all request-scoped Mastra primitives needed to execute a Responses create\n * call: the owning agent, the memory thread context, the normalized execution input,\n * and the response-turn metadata that may be persisted later.\n */\nasync function prepareCreateResponseRequest({\n body,\n mastra,\n requestContext,\n}: {\n body: CreateResponseBody;\n mastra: Mastra | undefined;\n requestContext: RequestContext;\n}): Promise<PreparedCreateResponseRequest> {\n const executionInput = mapResponseInputToExecutionMessages(body.input) as AgentExecutionInput;\n let previousResponseTurnRecord: ResponseTurnRecord | null = null;\n let resolvedAgent: Agent<any, any, any, any> | null = null;\n\n if (body.previous_response_id) {\n if (body.agent_id) {\n resolvedAgent = await resolveResponseAgent({ mastra, agentId: body.agent_id });\n previousResponseTurnRecord = await findResponseTurnRecord({\n agent: resolvedAgent,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (!previousResponseTurnRecord) {\n const owningResponseTurnRecord = await findResponseTurnRecordAcrossAgents({\n mastra,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (owningResponseTurnRecord) {\n if (owningResponseTurnRecord.metadata.agentId === body.agent_id) {\n previousResponseTurnRecord = owningResponseTurnRecord;\n } else {\n throw new HTTPException(400, {\n message: `Stored response ${body.previous_response_id} belongs to agent ${owningResponseTurnRecord.metadata.agentId}, not ${body.agent_id}`,\n });\n }\n }\n\n if (!previousResponseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });\n }\n }\n } else {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for agent-backed responses' });\n }\n\n previousResponseTurnRecord = await findResponseTurnRecordAcrossAgents({\n mastra,\n responseId: body.previous_response_id,\n requestContext,\n });\n\n if (!previousResponseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${body.previous_response_id} was not found` });\n }\n }\n }\n\n const agent =\n resolvedAgent ??\n (await resolveResponseAgent({\n mastra,\n agentId: body.agent_id ?? previousResponseTurnRecord?.metadata.agentId,\n }));\n const resolvedModel = await agent.getModel({\n requestContext,\n modelConfig: body.model,\n });\n const responseModel =\n body.model ??\n (() => {\n if (resolvedModel.provider && resolvedModel.modelId) {\n const publicProviderId = resolvedModel.provider.includes('.')\n ? resolvedModel.provider.split('.')[0]!\n : resolvedModel.provider;\n return `${publicProviderId}/${resolvedModel.modelId}`;\n }\n\n if (resolvedModel.modelId) {\n return resolvedModel.modelId;\n }\n\n throw new HTTPException(500, {\n message: 'Responses route could not determine the effective model for this request',\n });\n })();\n const shouldStore = body.store ?? false;\n const needsMemoryStore = shouldStore || Boolean(body.conversation_id) || Boolean(body.previous_response_id);\n const agentMemoryStore = needsMemoryStore\n ? await resolveAgentMemoryStore({\n agent,\n requestContext,\n errorMessage: body.previous_response_id\n ? 'previous_response_id requires the target agent to have memory storage configured'\n : shouldStore\n ? 'Stored responses require the target agent to have memory storage configured'\n : 'conversation_id requires the target agent to have memory storage configured',\n })\n : null;\n const configuredTools = mapMastraToolsToResponseTools(\n (await Promise.resolve(agent.listTools({ requestContext }))) as Record<string, unknown>,\n );\n\n const responseId = createMessageId();\n const createdAt = Math.floor(Date.now() / 1000);\n const threadContext = await resolveThreadExecutionContext({\n agent,\n store: shouldStore,\n conversationId: body.conversation_id,\n previousResponseTurnRecord,\n requestContext,\n });\n\n if (shouldStore && !threadContext) {\n throw new HTTPException(400, {\n message: 'Stored responses require the target agent to have memory configured',\n });\n }\n\n const didStore = shouldStore && Boolean(threadContext);\n\n return {\n agent,\n agentMemoryStore,\n configuredTools,\n createdAt,\n didStore,\n executionInput,\n previousResponseTurnRecord,\n resolvedModel,\n responseId,\n responseModel,\n responseMetadata: {\n agentId: agent.id,\n model: responseModel,\n createdAt,\n instructions: body.instructions,\n text: body.text,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n tools: configuredTools,\n store: didStore,\n },\n threadContext,\n };\n}\n\n/**\n * Bridges a Mastra agent stream into OpenAI-style Responses SSE events and completes\n * the stored response-turn record when the stream finishes.\n */\nfunction createResponseEventStream({\n agentMemoryStore,\n body,\n configuredTools,\n createdAt,\n didStore,\n previousResponseTurnRecord,\n responseId,\n responseModel,\n responseMetadata,\n streamResult,\n threadContext,\n}: {\n agentMemoryStore: MemoryStorage | null;\n body: CreateResponseBody;\n configuredTools: ReturnType<typeof mapMastraToolsToResponseTools>;\n createdAt: number;\n didStore: boolean;\n previousResponseTurnRecord: ResponseTurnRecord | null;\n responseId: string;\n responseModel: string;\n responseMetadata: Omit<\n ResponseTurnRecordMetadata,\n 'completedAt' | 'status' | 'usage' | 'providerOptions' | 'messageIds'\n >;\n streamResult: ResponseStreamResult;\n threadContext: ThreadExecutionContext | null;\n}) {\n const createdResponse = buildInProgressResponse({\n responseId,\n model: responseModel,\n createdAt,\n instructions: body.instructions,\n textConfig: body.text,\n previousResponseId: body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n tools: configuredTools,\n store: didStore,\n });\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n let sequenceNumber = 1;\n const enqueueEvent = (eventName: string, payload: Record<string, unknown>) => {\n controller.enqueue(\n formatSseEvent(eventName, {\n ...payload,\n sequence_number: sequenceNumber++,\n }),\n );\n };\n\n enqueueEvent('response.created', {\n type: 'response.created',\n response: createdResponse,\n });\n enqueueEvent('response.in_progress', {\n type: 'response.in_progress',\n response: createdResponse,\n });\n\n const streamEvents = createResponseStreamEventTranslator(responseId);\n const fullStream = await streamResult.fullStream;\n const reader = fullStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n for (const event of streamEvents.consume(value)) {\n enqueueEvent(event.event, event.payload);\n }\n }\n\n for (const event of streamEvents.flushPendingToolResults()) {\n enqueueEvent(event.event, event.payload);\n }\n\n const { completedState, response } = await finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result: streamResult,\n responseId,\n createdAt,\n model: responseModel,\n instructions: body.instructions,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n configuredTools,\n responseMetadata,\n fallbackText: streamEvents.text,\n fallbackOutputItems: completedState =>\n streamEvents.getOutputItems({\n text: completedState.text,\n status: completedState.status,\n }),\n });\n\n const completedItem = getStreamedMessageOutputItem(response, responseId);\n if (completedItem || completedState.text) {\n for (const event of streamEvents.completeText(\n completedState.text,\n completedItem ?? {\n id: responseId,\n type: 'message' as const,\n role: 'assistant' as const,\n status: 'completed' as const,\n content: [createOutputTextPart(completedState.text)],\n },\n )) {\n enqueueEvent(event.event, event.payload);\n }\n }\n enqueueEvent('response.completed', {\n type: 'response.completed',\n response,\n });\n controller.close();\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n}\n\nexport const CREATE_RESPONSE_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/responses',\n responseType: 'datastream-response',\n bodySchema: createResponseBodySchema,\n responseSchema: responseObjectSchema,\n summary: 'Create a response',\n description: 'Creates a response through a Mastra-hosted Responses API-compatible route',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_EXECUTE,\n handler: async ({ mastra, requestContext, abortSignal, ...body }) => {\n try {\n const {\n agent,\n agentMemoryStore,\n configuredTools,\n createdAt,\n didStore,\n executionInput,\n previousResponseTurnRecord,\n resolvedModel,\n responseId,\n responseModel,\n responseMetadata,\n threadContext,\n } = await prepareCreateResponseRequest({ body, mastra, requestContext });\n\n if (!body.stream) {\n const result = await executeGenerate({\n agent,\n resolvedModel,\n modelOverride: body.model,\n instructions: body.instructions,\n text: body.text,\n providerOptions: body.providerOptions,\n input: executionInput,\n requestContext,\n abortSignal,\n threadContext,\n });\n\n const { response } = await finalizeResponse({\n agentMemoryStore,\n didStore,\n threadContext,\n result,\n responseId,\n createdAt,\n model: responseModel,\n instructions: body.instructions,\n previousResponseId: previousResponseTurnRecord?.message.id ?? body.previous_response_id,\n conversationId: threadContext?.threadId ?? body.conversation_id,\n configuredTools,\n responseMetadata,\n fallbackText: '',\n });\n\n return jsonResponse(response);\n }\n\n const streamResult = await executeStream({\n agent,\n resolvedModel,\n modelOverride: body.model,\n instructions: body.instructions,\n text: body.text,\n providerOptions: body.providerOptions,\n input: executionInput,\n requestContext,\n abortSignal,\n threadContext,\n });\n\n const stream = createResponseEventStream({\n agentMemoryStore,\n body,\n configuredTools,\n createdAt,\n didStore,\n previousResponseTurnRecord,\n responseId,\n responseModel,\n responseMetadata,\n streamResult,\n threadContext,\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream; charset=utf-8',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n } catch (error) {\n return handleError(error, 'Error creating response');\n }\n },\n});\n\nexport const GET_RESPONSE_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/responses/:responseId',\n responseType: 'json',\n pathParamSchema: responseIdPathParams,\n responseSchema: responseObjectSchema,\n summary: 'Retrieve a stored response',\n description: 'Returns a previously stored response object',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, responseId }) => {\n try {\n const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });\n if (!responseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });\n }\n\n return mapResponseTurnRecordToResponse(responseTurnRecord);\n } catch (error) {\n return handleError(error, 'Error retrieving response');\n }\n },\n});\n\nexport const DELETE_RESPONSE_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/responses/:responseId',\n responseType: 'json',\n pathParamSchema: responseIdPathParams,\n responseSchema: deleteResponseSchema,\n summary: 'Delete a stored response',\n description: 'Deletes a stored response so it can no longer be retrieved or chained',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, responseId }) => {\n try {\n const responseTurnRecord = await findResponseTurnRecordAcrossAgents({ mastra, responseId, requestContext });\n if (!responseTurnRecord) {\n throw new HTTPException(404, { message: `Stored response ${responseId} was not found` });\n }\n\n await deleteResponseTurnRecord({ responseTurnRecord });\n\n const response: DeleteResponse = {\n id: responseId,\n object: 'response',\n deleted: true,\n };\n\n return response;\n } catch (error) {\n return handleError(error, 'Error deleting response');\n }\n },\n});\n"]}
import { validateMetadataAvatarUrl } from './chunk-HMJL3C3H.js';
import { stripFavoriteFields, prepareFavoritesEnrichment, enrichOrStripFavorites } from './chunk-QWTUGYUI.js';
import { isBuilderFeatureEnabled } from './chunk-N3D3A56J.js';
import { handleAutoVersioning } from './chunk-33QPJPK4.js';
import { prepareAuthorEnrichment, attachAuthor } from './chunk-KLV64VVH.js';
import { resolveAuthorFilter, getCallerAuthorId, matchesAuthorFilter, assertReadAccess, assertWriteAccess } from './chunk-56AYHXOU.js';
import { listStoredAgentsResponseSchema, listStoredAgentsQuerySchema, exportStoredAgentResponseSchema, exportStoredAgentBodySchema, storedAgentIdPathParams, openStoredAgentChangeRequestResponseSchema, openStoredAgentChangeRequestBodySchema, getStoredAgentResponseSchema, createStoredAgentResponseSchema, createStoredAgentBodySchema, updateStoredAgentResponseSchema, updateStoredAgentBodySchema, deleteStoredAgentResponseSchema, getStoredAgentDependentsResponseSchema, previewInstructionsResponseSchema, previewInstructionsBodySchema } from './chunk-SPVKRK56.js';
import { statusQuerySchema } from './chunk-2YY3EMMS.js';
import { getStoredResourceScope, scopeStoredResourceMetadata, assertStoredResourceScope, toSlug } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
// src/server/handlers/stored-agents.ts
async function resolveBrowserField(browser, mastra) {
if (browser === true) {
const editor = mastra.getEditor?.();
const builder = await editor?.resolveBuilder?.();
const defaultBrowser = builder?.getConfiguration?.()?.agent?.browser;
if (!defaultBrowser) {
console.warn(
"[mastra:server] Browser enabled (browser: true) but no default browser config found in builder configuration. The agent will be created/updated without browser access. Set `editor.builder.configuration.agent.browser` to fix this."
);
}
return defaultBrowser ?? void 0;
}
if (browser === false) {
return null;
}
return browser;
}
var AGENT_SNAPSHOT_CONFIG_FIELDS = [
"name",
"description",
"instructions",
"model",
"tools",
"defaultOptions",
"workflows",
"agents",
"integrationTools",
"toolProviders",
"inputProcessors",
"outputProcessors",
"memory",
"scorers",
"requestContextSchema",
"mcpClients",
"skills",
"workspace",
"browser"
];
var CODE_AGENT_OVERRIDE_FIELDS = [
"instructions",
"tools",
"integrationTools",
"mcpClients",
"requestContextSchema"
];
function getCodeAgentOwnership(editorConfig) {
if (editorConfig === false) {
return { ownsInstructions: false, ownsTools: false, ownsToolDescriptionsOnly: false };
}
if (editorConfig === void 0 || editorConfig === null) {
return { ownsInstructions: true, ownsTools: true, ownsToolDescriptionsOnly: false };
}
if (typeof editorConfig !== "object") {
return { ownsInstructions: false, ownsTools: false, ownsToolDescriptionsOnly: false };
}
const cfg = editorConfig;
const ownsInstructions = cfg.instructions === true;
const toolsCfg = cfg.tools;
const ownsTools = toolsCfg === true;
const ownsToolDescriptionsOnly = typeof toolsCfg === "object" && toolsCfg !== null && toolsCfg.description === true;
return { ownsInstructions, ownsTools, ownsToolDescriptionsOnly };
}
function hasNonEmptyInstructions(value) {
if (typeof value === "string") {
return value.trim().length > 0;
}
if (!Array.isArray(value)) {
return false;
}
return value.some((block) => {
if (!block || typeof block !== "object") {
return false;
}
const typedBlock = block;
if (typedBlock.type === "prompt_block_ref") {
return typeof typedBlock.id === "string" && typedBlock.id.length > 0;
}
return typeof typedBlock.content === "string" && typedBlock.content.trim().length > 0;
});
}
function assertOwnedInstructionsNotEmpty(instructions) {
if (!hasNonEmptyInstructions(instructions)) {
throw new HTTPException(400, { message: "Instructions are required" });
}
}
function sortForStableJson(value) {
if (Array.isArray(value)) {
return value.map(sortForStableJson);
}
if (value && typeof value === "object" && !(value instanceof Date)) {
return Object.fromEntries(
Object.entries(value).filter(([, entry]) => entry !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, sortForStableJson(entry)])
);
}
return value;
}
function buildExportConfig(input, agent) {
const editorConfig = agent?.__getEditorConfig?.();
const isCodeAgent = agent?.source === "code";
const allowedFields = isCodeAgent ? CODE_AGENT_OVERRIDE_FIELDS : AGENT_SNAPSHOT_CONFIG_FIELDS;
const ownership = isCodeAgent ? getCodeAgentOwnership(editorConfig) : null;
const config = {};
for (const field of allowedFields) {
if (input[field] === void 0) continue;
if (ownership) {
if (field === "instructions" && !ownership.ownsInstructions) continue;
if ((field === "tools" || field === "integrationTools" || field === "mcpClients") && !ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
continue;
}
}
config[field] = input[field];
}
return sortForStableJson(config);
}
function agentExportFilename(agentId) {
return `agents/${encodeURIComponent(agentId)}.json`;
}
function sourceChangeRequestHeadRef(agentId) {
const safeAgentId = agentId.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "agent";
return `mastra/${safeAgentId}`;
}
function sourceChangeRequestMessage(agentId, userName, changeMessage) {
const normalizedUserName = userName?.replace(/\s+/g, " ").trim();
const normalizedMessage = changeMessage?.replace(/\s+/g, " ").trim();
const message = normalizedMessage || `Update ${agentId} agent override`;
return normalizedUserName ? `${message} by ${normalizedUserName}` : message;
}
var LIST_STORED_AGENTS_ROUTE = createRoute({
method: "GET",
path: "/stored/agents",
responseType: "json",
queryParamSchema: listStoredAgentsQuerySchema,
responseSchema: listStoredAgentsResponseSchema,
summary: "List stored agents",
description: "Returns a paginated list of all agents stored in the database",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
page,
perPage,
orderBy,
status,
authorId,
visibility,
metadata,
favoritedOnly,
pinFavoritedFor
}) => {
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 filter = resolveAuthorFilter({
requestContext,
resource: "stored-agents",
queryAuthorId: authorId,
queryVisibility: visibility === "public" ? "public" : void 0
});
const scope = await getStoredResourceScope(mastra, requestContext);
const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);
const callerId = getCallerAuthorId(requestContext);
const favoritesEnabled = await isBuilderFeatureEnabled(mastra, "favorites");
const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;
const favoriteSubjectId = pinFavoritedFor ?? callerId;
if (honoredStarredOnly) {
const effectivePerPage = perPage ?? 100;
if (!favoriteSubjectId) {
return { agents: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new HTTPException(500, { message: "Favorites storage domain is not available" });
}
const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: "agent" });
if (starredIds.length === 0) {
return { agents: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const allMatching = await agentsStore.listResolved({
perPage: false,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata,
entityIds: starredIds
});
const visible = allMatching.agents.filter((record) => matchesAuthorFilter(record, filter));
const total = visible.length;
const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;
const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;
const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);
const annotated2 = sliced.map((record) => ({ ...record, isFavorited: true }));
const authors2 = await prepareAuthorEnrichment(
mastra,
requestContext,
annotated2.map((a) => a.authorId)
);
const withAuthors2 = authors2 ? annotated2.map((record) => attachAuthor(record, authors2)) : annotated2;
const hasMore = effectivePerPage > 0 && endIdx < total;
return { agents: withAuthors2, total, page, perPage: effectivePerPage, hasMore };
}
const result = await agentsStore.listResolved({
page,
perPage,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata
});
const visibleAgents = result.agents.filter((record) => matchesAuthorFilter(record, filter));
const authors = await prepareAuthorEnrichment(
mastra,
requestContext,
visibleAgents.map((a) => a.authorId)
);
if (!favoritesEnabled) {
const stripped = visibleAgents.map(stripFavoriteFields);
const withAuthors2 = authors ? stripped.map((record) => attachAuthor(record, authors)) : stripped;
return { ...result, agents: withAuthors2 };
}
const enrichment = await prepareFavoritesEnrichment(
mastra,
requestContext,
"agent",
visibleAgents.map((a) => a.id)
);
const annotated = enrichment ? visibleAgents.map((record) => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) })) : visibleAgents.map(stripFavoriteFields);
const withAuthors = authors ? annotated.map((record) => attachAuthor(record, authors)) : annotated;
return { ...result, agents: withAuthors };
} catch (error) {
return handleError(error, "Error listing stored agents");
}
}
});
async function buildStoredAgentExport({
mastra,
requestContext,
storedAgentId,
body
}) {
const storage = mastra.getStorage();
const agentsStore = storage ? await storage.getStore("agents") : void 0;
const storedAgent = await agentsStore?.getByIdResolved(storedAgentId, { status: "draft" });
if (storedAgent) {
assertStoredResourceScope(storedAgent, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: storedAgent });
}
let codeAgent;
try {
codeAgent = mastra.getAgentById?.(storedAgentId);
} catch {
codeAgent = void 0;
}
if (!storedAgent && !codeAgent) {
throw new HTTPException(404, { message: `Agent with id ${storedAgentId} not found` });
}
const config = buildExportConfig(body, codeAgent);
const content = `${JSON.stringify(config, null, 2)}
`;
return {
agentId: storedAgentId,
fileName: agentExportFilename(storedAgentId),
content,
config
};
}
var EXPORT_STORED_AGENT_ROUTE = createRoute({
method: "POST",
path: "/stored/agents/:storedAgentId/export",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
bodySchema: exportStoredAgentBodySchema,
responseSchema: exportStoredAgentResponseSchema,
summary: "Export stored agent override JSON",
description: "Returns deterministic JSON for an agent configuration or code-agent override without mutating storage",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, ...body }) => {
try {
return await buildStoredAgentExport({ mastra, requestContext, storedAgentId, body });
} catch (error) {
return handleError(error, "Error exporting stored agent");
}
}
});
var OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE = createRoute({
method: "POST",
path: "/stored/agents/:storedAgentId/change-request",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
bodySchema: openStoredAgentChangeRequestBodySchema,
responseSchema: openStoredAgentChangeRequestResponseSchema,
summary: "Open stored agent source change request",
description: "Opens a source-provider change request for deterministic agent override JSON without mutating storage",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, ...body }) => {
try {
const provider = mastra.getEditor?.()?.getSourceControlProvider?.();
if (!provider?.openChangeRequest) {
throw new HTTPException(400, { message: "Source control provider cannot open change requests" });
}
const openChangeRequest = provider.openChangeRequest.bind(provider);
const { changeMessage, userName, inspectOnly, ...exportBody } = body;
const headRef = sourceChangeRequestHeadRef(storedAgentId);
const title = `Update ${storedAgentId} agent override`;
const result = inspectOnly ? await openChangeRequest({
title,
headRef,
files: []
}) : await (async () => {
const response = await buildStoredAgentExport({ mastra, requestContext, storedAgentId, body: exportBody });
const message = sourceChangeRequestMessage(storedAgentId, userName, changeMessage);
return openChangeRequest({
title,
body: `Updates ${response.fileName} from Mastra Studio.`,
headRef,
files: [
{
path: response.fileName,
content: response.content,
message
}
]
});
})();
const storage = mastra.getStorage();
const agentsStore = storage ? await storage.getStore("agents") : void 0;
await agentsStore?.useProviderRef?.(storedAgentId, result.ref ?? headRef);
mastra.getEditor?.()?.agent?.clearCache?.(storedAgentId);
return result;
} catch (error) {
return handleError(error, "Error opening stored agent change request");
}
}
});
var GET_STORED_AGENT_ROUTE = createRoute({
method: "GET",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
queryParamSchema: statusQuerySchema,
responseSchema: getStoredAgentResponseSchema,
summary: "Get stored agent by ID",
description: "Returns a specific agent from storage by its unique identifier. Use ?status=draft to resolve with the latest (draft) version, or ?status=published (default) for the active published version.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId, status }) => {
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.getByIdResolved(storedAgentId, { status });
if (!agent) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const authors = await prepareAuthorEnrichment(mastra, requestContext, [agent.authorId]);
const withFavorite = await enrichOrStripFavorites(mastra, requestContext, "agent", agent);
return attachAuthor(withFavorite, authors);
} catch (error) {
return handleError(error, "Error getting stored agent");
}
}
});
var CREATE_STORED_AGENT_ROUTE = createRoute({
method: "POST",
path: "/stored/agents",
responseType: "json",
bodySchema: createStoredAgentBodySchema,
responseSchema: createStoredAgentResponseSchema,
summary: "Create stored agent",
description: "Creates a new agent in storage with the provided configuration",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
id: providedId,
metadata,
visibility: bodyVisibility,
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser,
requestContextSchema
}) => {
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 id = providedId || toSlug(name);
if (!id) {
throw new HTTPException(400, {
message: "Could not derive agent ID from name. Please provide an explicit id."
});
}
const existing = await agentsStore.getById(id);
if (existing) {
throw new HTTPException(409, { message: `Agent with id ${id} already exists` });
}
const authorId = getCallerAuthorId(requestContext) ?? void 0;
const visibility = authorId ? bodyVisibility ?? "private" : "public";
validateMetadataAvatarUrl(metadata);
const resolvedBrowser = await resolveBrowserField(browser, mastra);
let createInstructions = instructions;
let createTools = tools;
let createIntegrationTools = integrationTools;
let createMcpClients = mcpClients;
let codeAgentForCreate;
try {
codeAgentForCreate = mastra.getAgentById?.(id);
} catch {
codeAgentForCreate = void 0;
}
if (codeAgentForCreate?.source === "code") {
const ownership = getCodeAgentOwnership(codeAgentForCreate.__getEditorConfig?.());
if (ownership.ownsInstructions) {
assertOwnedInstructionsNotEmpty(createInstructions);
} else {
createInstructions = void 0;
}
if (!ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
createTools = void 0;
createIntegrationTools = void 0;
createMcpClients = void 0;
}
}
const input = {
id,
authorId,
visibility,
metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),
name,
description,
instructions: createInstructions,
model,
tools: createTools,
defaultOptions,
workflows,
agents,
integrationTools: createIntegrationTools,
toolProviders,
mcpClients: createMcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
};
const editor = mastra.getEditor?.();
if (editor) {
await editor.agent.create(input);
} else {
await agentsStore.create({ agent: input });
}
const { versions } = await agentsStore.listVersions({ agentId: id, perPage: 1 });
const initialVersion = versions[0];
if (initialVersion) {
await agentsStore.update({
id,
activeVersionId: initialVersion.id,
status: "published"
});
editor?.agent.clearCache(id);
}
const resolved = await agentsStore.getByIdResolved(id, { status: "published" });
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve created agent" });
}
return enrichOrStripFavorites(mastra, requestContext, "agent", resolved);
} catch (error) {
return handleError(error, "Error creating stored agent");
}
}
});
var UPDATE_STORED_AGENT_ROUTE = createRoute({
method: "PATCH",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
bodySchema: updateStoredAgentBodySchema,
responseSchema: updateStoredAgentResponseSchema,
summary: "Update stored agent",
description: "Updates an existing agent in storage with the provided fields",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
storedAgentId,
// Metadata-level fields
authorId,
metadata,
visibility,
// Config fields (snapshot-level)
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser,
requestContextSchema,
// Version metadata
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 existing = await agentsStore.getById(storedAgentId);
if (!existing) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
const scope = await getStoredResourceScope(mastra, requestContext);
assertStoredResourceScope(existing, scope);
assertWriteAccess({
requestContext,
resource: "stored-agents",
resourceId: storedAgentId,
action: "edit",
record: existing
});
validateMetadataAvatarUrl(metadata);
const callerAuthorId = getCallerAuthorId(requestContext) ?? void 0;
const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? "public" : void 0;
const resolvedBrowser = await resolveBrowserField(browser, mastra);
let codeAgentForUpdate;
try {
codeAgentForUpdate = mastra.getAgentById?.(storedAgentId);
} catch {
codeAgentForUpdate = void 0;
}
if (codeAgentForUpdate?.source === "code") {
const ownership = getCodeAgentOwnership(codeAgentForUpdate.__getEditorConfig?.());
if (ownership.ownsInstructions) {
if (instructions !== void 0) {
assertOwnedInstructionsNotEmpty(instructions);
}
} else {
instructions = void 0;
}
if (!ownership.ownsTools && !ownership.ownsToolDescriptionsOnly) {
tools = void 0;
integrationTools = void 0;
mcpClients = void 0;
}
}
const mergedMetadata = { ...existing.metadata ?? {}, ...metadata ?? {} };
const scopedMetadata = scopeStoredResourceMetadata(mergedMetadata, scope);
const updatedAgent = await agentsStore.update({
id: storedAgentId,
authorId,
metadata: scopedMetadata,
visibility: resolvedVisibility,
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
});
const configFields = {
name,
description,
instructions,
model,
tools,
defaultOptions,
workflows,
agents,
integrationTools,
toolProviders,
mcpClients,
inputProcessors,
outputProcessors,
memory,
scorers,
skills,
workspace,
browser: resolvedBrowser,
requestContextSchema
};
const providedConfigFields = Object.fromEntries(Object.entries(configFields).filter(([_, v]) => v !== void 0));
const autoVersionResult = await handleAutoVersioning(
agentsStore,
storedAgentId,
"agentId",
AGENT_SNAPSHOT_CONFIG_FIELDS,
existing,
updatedAgent,
providedConfigFields,
changeMessage ? { changeMessage } : void 0
);
if (!autoVersionResult) {
throw new Error("handleAutoVersioning returned undefined");
}
const isCodeSource = mastra.getEditor?.()?.getSource?.() === "code";
if (isCodeSource && autoVersionResult.versionCreated && !changeMessage) {
const { versions } = await agentsStore.listVersions({ agentId: storedAgentId, perPage: 2 });
const previousVersion = versions[1];
if (previousVersion) {
await agentsStore.deleteVersion(previousVersion.id);
}
}
if (autoVersionResult.versionCreated) {
const { versions } = await agentsStore.listVersions({ agentId: storedAgentId, perPage: 1 });
const latestVersion = versions[0];
if (latestVersion) {
await agentsStore.update({
id: storedAgentId,
activeVersionId: latestVersion.id
});
}
}
const editor = mastra.getEditor();
if (editor) {
editor.agent.clearCache(storedAgentId);
}
const resolved = await agentsStore.getByIdResolved(storedAgentId, { status: "draft" });
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve updated agent" });
}
return enrichOrStripFavorites(mastra, requestContext, "agent", resolved);
} catch (error) {
return handleError(error, "Error updating stored agent");
}
}
});
var DELETE_STORED_AGENT_ROUTE = createRoute({
method: "DELETE",
path: "/stored/agents/:storedAgentId",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
responseSchema: deleteStoredAgentResponseSchema,
summary: "Delete stored agent",
description: "Deletes an agent from storage by its unique identifier",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId }) => {
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 existing = await agentsStore.getById(storedAgentId);
if (!existing) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));
assertWriteAccess({
requestContext,
resource: "stored-agents",
resourceId: storedAgentId,
action: "delete",
record: existing
});
await agentsStore.delete(storedAgentId);
try {
const favoritesStore = await storage.getStore("favorites");
await favoritesStore?.deleteFavoritesForEntity({ entityType: "agent", entityId: storedAgentId });
} catch (cascadeError) {
mastra.getLogger?.()?.warn?.("Failed to cascade-delete favorites for agent", { storedAgentId, error: cascadeError });
}
mastra.getEditor()?.agent.clearCache(storedAgentId);
return { success: true, message: `Agent ${storedAgentId} deleted successfully` };
} catch (error) {
return handleError(error, "Error deleting stored agent");
}
}
});
var GET_STORED_AGENT_DEPENDENTS_ROUTE = createRoute({
method: "GET",
path: "/stored/agents/:storedAgentId/dependents",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
responseSchema: getStoredAgentDependentsResponseSchema,
summary: "List dependents of a stored agent",
description: "Returns agents that reference the target as a sub-agent. Used to warn before deleting or unsharing. Caller-readable references appear in `dependents` (id + name); cross-workspace references the caller cannot read are aggregated in `hiddenCount` and only surfaced when the target is public.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedAgentId }) => {
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 target = await agentsStore.getById(storedAgentId);
if (!target) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(target, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: target });
const filter = resolveAuthorFilter({ requestContext, resource: "stored-agents" });
const all = await agentsStore.listResolved({
perPage: false,
status: "published"
});
const targetIsPublic = target.visibility === "public";
const dependents = [];
let hiddenCount = 0;
for (const record of all.agents) {
if (record.id === storedAgentId) continue;
if (!referencesTarget(record.agents, storedAgentId)) continue;
if (matchesAuthorFilter(record, filter)) {
dependents.push({
id: record.id,
name: record.name ?? record.id
});
} else if (targetIsPublic) {
hiddenCount += 1;
}
}
return { dependents, hiddenCount };
} catch (error) {
return handleError(error, "Error listing stored agent dependents");
}
}
});
function referencesTarget(subAgents, targetId) {
if (!subAgents) return false;
if (Array.isArray(subAgents)) {
return subAgents.some((variant) => {
const value = variant?.value;
return Boolean(value && typeof value === "object" && Object.prototype.hasOwnProperty.call(value, targetId));
});
}
if (typeof subAgents === "object") {
return Object.prototype.hasOwnProperty.call(subAgents, targetId);
}
return false;
}
var PREVIEW_INSTRUCTIONS_ROUTE = createRoute({
method: "POST",
path: "/stored/agents/preview-instructions",
responseType: "json",
bodySchema: previewInstructionsBodySchema,
responseSchema: previewInstructionsResponseSchema,
summary: "Preview resolved instructions",
description: "Resolves an array of instruction blocks against a request context, evaluating rules, fetching prompt block references, and rendering template variables. Returns the final concatenated instruction string.",
tags: ["Stored Agents"],
requiresAuth: true,
handler: async ({ mastra, blocks, context }) => {
try {
const editor = mastra.getEditor();
if (!editor) {
throw new HTTPException(500, { message: "Editor is not configured" });
}
const result = await editor.prompt.preview(blocks, context ?? {});
return { result };
} catch (error) {
return handleError(error, "Error previewing instructions");
}
}
});
export { CREATE_STORED_AGENT_ROUTE, DELETE_STORED_AGENT_ROUTE, EXPORT_STORED_AGENT_ROUTE, GET_STORED_AGENT_DEPENDENTS_ROUTE, GET_STORED_AGENT_ROUTE, LIST_STORED_AGENTS_ROUTE, OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE, PREVIEW_INSTRUCTIONS_ROUTE, UPDATE_STORED_AGENT_ROUTE };
//# sourceMappingURL=chunk-KXYFKA7K.js.map
//# sourceMappingURL=chunk-KXYFKA7K.js.map

Sorry, the diff of this file is too big to display

import { agentCardResponseSchema, a2aAgentIdPathParams, agentExecutionResponseSchema, agentExecutionBodySchema } from './chunk-KEE6UMGC.js';
import { getAgentFromSystem } from './chunk-L6FOTAND.js';
import { getPublicOrigin } from './chunk-R4O5HVDI.js';
import { convertInstructionsToString } from './chunk-IBUJJIRW.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { __commonJS, __export, __toESM } from './chunk-PR4QN5HX.js';
import { isDeepStrictEqual } from 'util';
import { MastraA2AError } from '@mastra/core/a2a';
import { z } from 'zod/v4';
import * as crypto2 from 'crypto';
import { lookup } from 'dns/promises';
import { request as request$1 } from 'http';
import { request } from 'https';
import { isIP } from 'net';
// ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js
var require_canonicalize = __commonJS({
"../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js"(exports, module) {
module.exports = function serialize(object) {
if (object === null || typeof object !== "object" || object.toJSON != null) {
return JSON.stringify(object);
}
if (Array.isArray(object)) {
return "[" + object.reduce((t, cv, ci) => {
const comma = ci === 0 ? "" : ",";
const value = cv === void 0 || typeof cv === "symbol" ? null : cv;
return t + comma + serialize(value);
}, "") + "]";
}
return "{" + Object.keys(object).sort().reduce((t, cv, ci) => {
if (object[cv] === void 0 || typeof object[cv] === "symbol") {
return t;
}
const comma = t.length === 0 ? "" : ",";
return t + comma + serialize(cv) + ":" + serialize(object[cv]);
}, "") + "}";
};
}
});
// src/server/handlers/a2a.ts
var a2a_exports = {};
__export(a2a_exports, {
AGENT_EXECUTION_ROUTE: () => AGENT_EXECUTION_ROUTE,
GET_AGENT_CARD_ROUTE: () => GET_AGENT_CARD_ROUTE,
getAgentCardByIdHandler: () => getAgentCardByIdHandler,
getAgentExecutionHandler: () => getAgentExecutionHandler,
handleDeleteTaskPushNotificationConfig: () => handleDeleteTaskPushNotificationConfig,
handleGetTaskPushNotificationConfig: () => handleGetTaskPushNotificationConfig,
handleListTaskPushNotificationConfig: () => handleListTaskPushNotificationConfig,
handleMessageSend: () => handleMessageSend,
handleMessageStream: () => handleMessageStream,
handleSetTaskPushNotificationConfig: () => handleSetTaskPushNotificationConfig,
handleTaskCancel: () => handleTaskCancel,
handleTaskGet: () => handleTaskGet,
handleTaskResubscribe: () => handleTaskResubscribe
});
// src/server/a2a/agent-card-signing.ts
var import_canonicalize = __toESM(require_canonicalize(), 1);
var SUPPORTED_JWS_ALGORITHMS = /* @__PURE__ */ new Set([
"ES256",
"ES384",
"ES512",
"RS256",
"RS384",
"RS512",
"PS256",
"PS384",
"PS512"
]);
function stripAgentCardSignatures(agentCard) {
const unsignedCard = structuredClone(agentCard);
delete unsignedCard.signatures;
return unsignedCard;
}
function importSigningKey(signing) {
const { privateKey } = signing;
if (typeof privateKey === "string") {
return crypto2.createPrivateKey(privateKey);
}
return crypto2.createPrivateKey({
key: privateKey,
format: "jwk"
});
}
function getProtectedHeader(signing) {
const { alg, ...rest } = signing.protectedHeader;
if (!SUPPORTED_JWS_ALGORITHMS.has(alg)) {
throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${alg}`);
}
return {
...rest,
alg
};
}
function getSignatureOptions(algorithm) {
if (algorithm.startsWith("ES")) {
return { dsaEncoding: "ieee-p1363" };
}
if (algorithm.startsWith("PS")) {
return {
padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
};
}
return {};
}
function getDigestAlgorithm(algorithm) {
if (algorithm.endsWith("256")) return "sha256";
if (algorithm.endsWith("384")) return "sha384";
if (algorithm.endsWith("512")) return "sha512";
throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${algorithm}`);
}
async function signAgentCard({
agentCard,
signing
}) {
const canonicalPayload = (0, import_canonicalize.default)(stripAgentCardSignatures(agentCard));
if (!canonicalPayload) {
throw new Error("Failed to canonicalize A2A Agent Card for signing");
}
const key = importSigningKey(signing);
const protectedHeader = getProtectedHeader(signing);
const encodedHeader = Buffer.from(JSON.stringify(protectedHeader), "utf8").toString("base64url");
const encodedPayload = Buffer.from(canonicalPayload, "utf8").toString("base64url");
const signingInput = `${encodedHeader}.${encodedPayload}`;
const signatureBuffer = crypto2.sign(
getDigestAlgorithm(String(protectedHeader.alg)),
Buffer.from(signingInput, "utf8"),
{
key,
...getSignatureOptions(String(protectedHeader.alg))
}
);
const signatureValue = signatureBuffer.toString("base64url");
if (!encodedHeader || !signatureValue) {
throw new Error("Failed to create compact JWS for A2A Agent Card");
}
const signature = {
protected: encodedHeader,
signature: signatureValue,
header: signing.header
};
return {
...agentCard,
signatures: [...agentCard.signatures ?? [], signature]
};
}
function normalizeError(error, reqId, taskId, logger) {
let a2aError;
if (error instanceof MastraA2AError) {
a2aError = error;
} else if (error instanceof Error) {
a2aError = MastraA2AError.internalError(error.message, { stack: error.stack });
} else {
a2aError = MastraA2AError.internalError("An unknown error occurred.", error);
}
if (taskId && !a2aError.taskId) {
a2aError.taskId = taskId;
}
logger?.error(`Error processing request (Task: ${a2aError.taskId ?? "N/A"}, ReqID: ${reqId ?? "N/A"}):`, a2aError);
return createErrorResponse(reqId, a2aError.toJSONRPCError());
}
function createErrorResponse(id, error) {
return {
jsonrpc: "2.0",
id,
// Can be null if request ID was invalid/missing
error
};
}
function createSuccessResponse(id, result) {
if (!id) {
throw MastraA2AError.internalError("Cannot create success response for null ID.");
}
return {
jsonrpc: "2.0",
id,
result
};
}
function convertToCoreMessage(message) {
return {
role: message.role === "user" ? "user" : "assistant",
content: message.parts.map((msg) => convertToCoreMessagePart(msg))
};
}
function convertToCoreMessagePart(part) {
switch (part.kind) {
case "text":
return {
type: "text",
text: part.text
};
case "file":
return {
type: "file",
data: "uri" in part.file ? new URL(part.file.uri) : part.file.bytes,
mimeType: part.file.mimeType
};
case "data":
throw new Error("Data parts are not supported in core messages");
}
}
var DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER = "X-A2A-Notification-Token";
function isDisallowedHostname(hostname) {
const normalized = hostname.toLowerCase();
return normalized === "localhost" || normalized.endsWith(".localhost") || normalized.endsWith(".local") || normalized.endsWith(".internal") || !normalized.includes(".");
}
function isDisallowedIpv4(address) {
const [first = -1, second = -1] = address.split(".").map(Number);
return first === 10 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
}
function isDisallowedIpv6(address) {
const normalized = address.toLowerCase();
return normalized === "::1" || normalized.startsWith("fe8") || normalized.startsWith("fe9") || normalized.startsWith("fea") || normalized.startsWith("feb") || normalized.startsWith("fc") || normalized.startsWith("fd");
}
function isDisallowedIpAddress(address) {
const version = isIP(address);
if (version === 4) {
return isDisallowedIpv4(address);
}
if (version === 6) {
return isDisallowedIpv6(address);
}
return false;
}
var DefaultPushNotificationSender = class {
constructor(pushNotificationStore, options = {}) {
this.pushNotificationStore = pushNotificationStore;
this.options = options;
}
pushNotificationStore;
options;
getStore() {
return this.pushNotificationStore;
}
async resolveValidatedDestination(rawUrl) {
const url = new URL(rawUrl);
if (url.protocol !== "https:" && url.protocol !== "http:") {
throw new Error(`Push notification URL must use http or https: ${url.protocol}`);
}
const hostname = url.hostname.toLowerCase();
if (this.options.allowedHosts && !this.options.allowedHosts.includes(hostname)) {
throw new Error(`Push notification host is not allowed: ${hostname}`);
}
if (isDisallowedHostname(hostname)) {
throw new Error(`Push notification URL must not target local or internal hosts: ${hostname}`);
}
if (isDisallowedIpAddress(hostname)) {
throw new Error(`Push notification URL must not target local or private IPs: ${hostname}`);
}
const resolvedAddresses = isIP(hostname) === 0 ? await (this.options.lookup ?? lookup)(hostname, { all: true, verbatim: true }) : [{ address: hostname, family: isIP(hostname) }];
if (resolvedAddresses.some((result) => isDisallowedIpAddress(result.address))) {
throw new Error(`Push notification URL resolved to a local or private IP: ${hostname}`);
}
const requestUrl = new URL(url.toString());
requestUrl.hostname = resolvedAddresses[0].address;
return {
originalUrl: url,
requestUrl,
hostHeader: url.host,
servername: isIP(hostname) === 0 ? hostname : void 0
};
}
async postTaskSnapshot({
requestUrl,
hostHeader,
servername,
headers,
body,
timeout
}) {
headers.set("host", hostHeader);
const signal = typeof AbortSignal.timeout === "function" ? AbortSignal.timeout(timeout) : void 0;
if (this.options.fetch) {
return this.options.fetch(requestUrl.toString(), {
method: "POST",
headers,
body,
signal
});
}
const transport = requestUrl.protocol === "https:" ? request : request$1;
return await new Promise((resolve, reject) => {
const request = transport(
{
protocol: requestUrl.protocol,
hostname: requestUrl.hostname,
port: requestUrl.port || void 0,
path: `${requestUrl.pathname}${requestUrl.search}`,
method: "POST",
headers: Object.fromEntries(headers.entries()),
servername
},
(response) => {
response.resume();
response.on("end", () => {
resolve({
ok: !!response.statusCode && response.statusCode >= 200 && response.statusCode < 300,
status: response.statusCode ?? 0,
statusText: response.statusMessage ?? ""
});
});
}
);
request.on("error", reject);
if (signal) {
signal.addEventListener(
"abort",
() => {
request.destroy(signal.reason instanceof Error ? signal.reason : new Error("Push notification timed out"));
},
{ once: true }
);
}
request.end(body);
});
}
async sendNotifications({
agentId,
task,
logger
}) {
const configs = this.pushNotificationStore.list({
agentId,
params: { id: task.id }
});
if (configs.length === 0) {
return;
}
await Promise.allSettled(
configs.map(async (config) => {
const headers = new Headers({
"content-type": "application/json"
});
if (config.pushNotificationConfig.token) {
headers.set(
this.options.tokenHeaderName ?? DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER,
config.pushNotificationConfig.token
);
}
const auth = config.pushNotificationConfig.authentication;
if (auth?.credentials) {
if (auth.schemes.includes("Bearer")) {
headers.set("authorization", `Bearer ${auth.credentials}`);
} else if (auth.schemes.includes("Basic")) {
headers.set("authorization", `Basic ${auth.credentials}`);
}
}
const { requestUrl, hostHeader, servername } = await this.resolveValidatedDestination(
config.pushNotificationConfig.url
);
const response = await this.postTaskSnapshot({
requestUrl,
hostHeader,
servername,
headers,
body: JSON.stringify(task),
timeout: this.options.timeout ?? 5e3
});
if (!response.ok) {
throw new Error(
`Push notification failed with status ${response.status} ${response.statusText ?? ""}`.trim()
);
}
})
).then((results) => {
for (const result of results) {
if (result.status === "rejected") {
logger?.error("Failed to deliver A2A push notification", result.reason);
}
}
});
}
};
// src/server/a2a/push-notification-store.ts
function normalizeConfigId(taskId, configId) {
return configId || taskId;
}
var InMemoryPushNotificationStore = class {
store = /* @__PURE__ */ new Map();
getKey(agentId, taskId) {
return JSON.stringify([agentId, taskId]);
}
set({ agentId, config }) {
const key = this.getKey(agentId, config.taskId);
const configs = this.store.get(key) ?? /* @__PURE__ */ new Map();
const normalizedConfig = {
taskId: config.taskId,
pushNotificationConfig: {
...config.pushNotificationConfig,
id: normalizeConfigId(config.taskId, config.pushNotificationConfig.id)
}
};
configs.set(normalizedConfig.pushNotificationConfig.id, structuredClone(normalizedConfig));
this.store.set(key, configs);
return structuredClone(normalizedConfig);
}
get({
agentId,
params
}) {
const key = this.getKey(agentId, params.id);
const configId = normalizeConfigId(params.id, params.pushNotificationConfigId);
const config = this.store.get(key)?.get(configId);
return config ? structuredClone(config) : null;
}
list({
agentId,
params
}) {
const key = this.getKey(agentId, params.id);
return Array.from(this.store.get(key)?.values() ?? []).map((config) => structuredClone(config));
}
delete({ agentId, params }) {
const key = this.getKey(agentId, params.id);
const configs = this.store.get(key);
if (!configs) {
return false;
}
const deleted = configs.delete(params.pushNotificationConfigId);
if (configs.size === 0) {
this.store.delete(key);
}
return deleted;
}
};
// src/server/a2a/tasks.ts
function isTaskStatusUpdate(update) {
return "state" in update && !("parts" in update);
}
function isArtifactUpdate(update) {
return "kind" in update && update.kind === "artifact-update";
}
function applyUpdateToTask(current, update) {
let newTask = structuredClone(current);
if (isTaskStatusUpdate(update)) {
newTask.status = {
...newTask.status,
// Keep existing properties if not overwritten
...update,
// Apply updates
timestamp: (/* @__PURE__ */ new Date()).toISOString()
};
} else if (isArtifactUpdate(update)) {
if (!newTask.artifacts) {
newTask.artifacts = [];
} else {
newTask.artifacts = [...newTask.artifacts];
}
const artifact = update.artifact;
const existingIndex = newTask.artifacts.findIndex((a) => a.name === artifact.name);
const existingArtifact = newTask.artifacts[existingIndex];
if (existingArtifact) {
if (update.append) {
const appendedArtifact = JSON.parse(JSON.stringify(existingArtifact));
appendedArtifact.parts.push(...artifact.parts);
if (artifact.metadata) {
appendedArtifact.metadata = {
...appendedArtifact.metadata || {},
...artifact.metadata
};
}
if (artifact.description) appendedArtifact.description = artifact.description;
newTask.artifacts[existingIndex] = appendedArtifact;
} else {
newTask.artifacts[existingIndex] = { ...artifact };
}
} else {
newTask.artifacts.push({ ...artifact });
}
}
return newTask;
}
async function loadOrCreateTask({
agentId,
taskId,
taskStore,
message,
contextId,
metadata,
logger
}) {
const data = await taskStore.load({ agentId, taskId });
if (!data) {
const initialTask = {
id: taskId,
contextId: contextId || crypto.randomUUID(),
status: {
state: "submitted",
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
message: void 0
},
artifacts: [],
history: [message],
metadata,
kind: "task"
};
logger?.info(`[Task ${taskId}] Created new task.`);
await taskStore.save({ agentId, data: initialTask });
return initialTask;
}
logger?.info(`[Task ${taskId}] Loaded existing task.`);
let updatedData = data;
updatedData.history = [...data.history || [], message];
const { status } = data;
const finalStates = ["completed", "failed", "canceled"];
if (finalStates.includes(status.state)) {
logger?.warn(`[Task ${taskId}] Received message for task in final state ${status.state}. Restarting.`);
updatedData = applyUpdateToTask(updatedData, {
state: "submitted",
message: void 0
});
} else if (status.state === "input-required") {
logger?.info(`[Task ${taskId}] Changing state from 'input-required' to 'working'.`);
updatedData = applyUpdateToTask(updatedData, { state: "working" });
} else if (status.state === "working") {
logger?.warn(`[Task ${taskId}] Received message while already 'working'. Proceeding.`);
}
await taskStore.save({ agentId, data: updatedData });
return updatedData;
}
function createTaskContext({
task,
userMessage,
history,
activeCancellations
}) {
return {
task: structuredClone(task),
userMessage,
history: structuredClone(history),
isCancelled: () => activeCancellations.has(task.id)
};
}
// src/server/handlers/a2a.ts
var messagePartSchema = z.discriminatedUnion("kind", [
z.object({
kind: z.literal("text"),
text: z.string(),
metadata: z.record(z.string(), z.any()).optional()
}),
z.object({
kind: z.literal("file"),
file: z.union([
z.object({
bytes: z.string(),
mimeType: z.string().optional(),
name: z.string().optional()
}),
z.object({
uri: z.string(),
mimeType: z.string().optional(),
name: z.string().optional()
})
]),
metadata: z.record(z.string(), z.any()).optional()
}),
z.object({
kind: z.literal("data"),
data: z.record(z.string(), z.any()),
metadata: z.record(z.string(), z.any()).optional()
})
]);
var messageSendParamsSchema = z.object({
message: z.object({
role: z.enum(["user", "agent"]),
parts: z.array(messagePartSchema),
kind: z.literal("message"),
messageId: z.string(),
contextId: z.string().optional(),
taskId: z.string().optional(),
referenceTaskIds: z.array(z.string()).optional(),
extensions: z.array(z.string()).optional(),
metadata: z.record(z.string(), z.any()).optional()
}),
configuration: z.object({
acceptedOutputModes: z.array(z.string()).optional(),
blocking: z.boolean().optional(),
historyLength: z.number().optional(),
pushNotificationConfig: z.object({
url: z.string(),
id: z.string().optional(),
token: z.string().optional(),
authentication: z.object({
schemes: z.array(z.string()),
credentials: z.string().optional()
}).optional()
}).optional()
}).optional()
});
var defaultPushNotificationStore = new InMemoryPushNotificationStore();
var defaultPushNotificationSender = new DefaultPushNotificationSender(defaultPushNotificationStore);
function createAgentCardDefaults({
pushNotifications = false
} = {}) {
return {
protocolVersion: "0.3.0",
additionalInterfaces: [],
supportsAuthenticatedExtendedCard: false,
security: [],
securitySchemes: {},
capabilities: {
streaming: true,
pushNotifications,
stateTransitionHistory: false,
extensions: []
},
defaultInputModes: ["text/plain"],
defaultOutputModes: ["text/plain"]
};
}
async function getAgentCardByIdHandler({
mastra,
agentId,
executionUrl = `/a2a/${agentId}`,
provider = {
organization: "Mastra",
url: "https://mastra.ai"
},
version = "1.0",
pushNotifications = false,
requestContext
}) {
const agent = await getAgentFromSystem({ mastra, agentId });
const [instructions, tools] = await Promise.all([agent.getInstructions({ requestContext }), agent.listTools({ requestContext })]);
const agentCard = {
name: agent.id || agentId,
description: convertInstructionsToString(instructions),
url: executionUrl,
provider,
version,
...createAgentCardDefaults({ pushNotifications }),
// Convert agent tools to skills format for A2A protocol
skills: Object.entries(tools).map(([toolId, tool]) => ({
id: toolId,
name: toolId,
description: tool.description || `Tool: ${toolId}`,
// Optional fields
tags: ["tool"]
}))
};
const signing = mastra.getServer?.()?.a2a?.agentCardSigning;
if (!signing) {
return agentCard;
}
return signAgentCard({
agentCard,
signing
});
}
function getA2AExecutionUrl({
agentId,
request,
routePrefix
}) {
const executionPath = `${routePrefix ?? ""}/a2a/${agentId}`;
if (!request) {
return executionPath;
}
return `${getPublicOrigin(request)}${executionPath}`;
}
function validateMessageSendParams(params) {
try {
messageSendParamsSchema.parse(params);
} catch (error) {
if (error instanceof z.ZodError) {
throw MastraA2AError.invalidParams(error.issues[0].message);
}
throw error;
}
}
function createArtifactUpdate({
taskId,
contextId,
text,
data
}) {
const parts = [
...text ? [{ kind: "text", text }] : [],
...data ? [{ kind: "data", data }] : []
];
if (parts.length === 0) {
return void 0;
}
return {
kind: "artifact-update",
taskId,
contextId,
lastChunk: true,
artifact: {
artifactId: `${taskId}:response`,
name: data ? "response.json" : "response.txt",
parts
}
};
}
function createTextChunkArtifactUpdate({
taskId,
contextId,
text,
append,
lastChunk
}) {
return {
kind: "artifact-update",
taskId,
contextId,
...append ? { append: true } : {},
...lastChunk !== void 0 ? { lastChunk } : {},
artifact: {
artifactId: `${taskId}:response:text`,
name: "response.txt",
parts: [{ kind: "text", text }]
}
};
}
function createDataArtifactUpdate({
taskId,
contextId,
data,
lastChunk
}) {
return {
kind: "artifact-update",
taskId,
contextId,
...{ lastChunk } ,
artifact: {
artifactId: `${taskId}:response:data`,
name: "response.json",
parts: [{ kind: "data", data }]
}
};
}
function resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
}) {
if (pushNotificationSender) {
return {
pushNotificationStore: pushNotificationSender.getStore(),
pushNotificationSender
};
}
if (pushNotificationStore) {
return {
pushNotificationStore,
pushNotificationSender: new DefaultPushNotificationSender(pushNotificationStore)
};
}
return {
pushNotificationStore: defaultPushNotificationStore,
pushNotificationSender: defaultPushNotificationSender
};
}
function createTaskPushNotificationConfig(taskId, pushNotificationConfig) {
return {
taskId,
pushNotificationConfig: {
...pushNotificationConfig,
id: pushNotificationConfig.id ?? taskId
}
};
}
function shouldSendPushNotification(previousTask, nextTask) {
const pushTriggerStates = ["completed", "failed", "canceled", "input-required"];
if (!pushTriggerStates.includes(nextTask.status.state)) {
return false;
}
return previousTask?.status.state !== nextTask.status.state;
}
async function saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender,
previousTask,
nextTask,
agentId,
logger
}) {
await taskStore.save({ agentId, data: nextTask });
if (!shouldSendPushNotification(previousTask, nextTask)) {
return;
}
void pushNotificationSender.sendNotifications({
agentId,
task: nextTask,
logger
}).catch((error) => {
logger?.error("Failed to schedule A2A push notification", error);
});
}
function extractFullStreamTextDelta(value) {
if (typeof value !== "object" || value === null || !("type" in value)) {
return null;
}
const chunk = value;
switch (chunk.type) {
case "text-delta":
if (typeof chunk.payload?.text === "string") {
return chunk.payload.text;
}
if (typeof chunk.payload?.delta === "string") {
return chunk.payload.delta;
}
if (typeof chunk.textDelta === "string") {
return chunk.textDelta;
}
if (typeof chunk.delta === "string") {
return chunk.delta;
}
if (typeof chunk.text === "string") {
return chunk.text;
}
return null;
default:
return null;
}
}
function extractFinalStructuredObject(value) {
if (typeof value !== "object" || value === null || !("type" in value)) {
return void 0;
}
const chunk = value;
if (chunk.type !== "object-result") {
return void 0;
}
const objectValue = chunk.payload?.object ?? chunk.object;
return objectValue && typeof objectValue === "object" ? objectValue : void 0;
}
function isTerminalTaskState(state) {
return ["completed", "failed", "canceled"].includes(state);
}
function artifactIdentity(artifact) {
return artifact.artifactId || artifact.name;
}
function areArtifactPartsEqual(left, right) {
if (left === right) {
return true;
}
if (left.length !== right.length) {
return false;
}
return left.every((part, index) => {
const other = right[index];
if (!other || part.kind !== other.kind) {
return false;
}
if (part.kind === "text" && other.kind === "text") {
return part.text === other.text;
}
return part === other;
});
}
function areArtifactsEqual(left, right) {
if (left === right) {
return true;
}
if (!left || !right) {
return left === right;
}
return left.artifactId === right.artifactId && left.name === right.name && left.description === right.description && left.metadata === right.metadata && areArtifactPartsEqual(left.parts, right.parts);
}
function areStatusMessagePartsEqual(left, right) {
return left === right || isDeepStrictEqual(left, right);
}
function areStatusMessagesEqual(left, right) {
if (left === right) {
return true;
}
if (!left || !right) {
return left === right;
}
return left.messageId === right.messageId && left.kind === right.kind && left.role === right.role && left.contextId === right.contextId && left.taskId === right.taskId && isDeepStrictEqual(left.referenceTaskIds, right.referenceTaskIds) && isDeepStrictEqual(left.extensions, right.extensions) && isDeepStrictEqual(left.metadata, right.metadata) && areStatusMessagePartsEqual(left.parts, right.parts);
}
function didTaskStatusChange(previous, next) {
return previous.status.state !== next.status.state || previous.status.timestamp !== next.status.timestamp || !areStatusMessagesEqual(previous.status.message, next.status.message);
}
function getTaskArtifactUpdates({ previous, next }) {
const previousArtifacts = new Map((previous.artifacts ?? []).map((artifact) => [artifactIdentity(artifact), artifact]));
const changedArtifacts = (next.artifacts ?? []).filter((artifact) => {
const priorArtifact = previousArtifacts.get(artifactIdentity(artifact));
return !priorArtifact || !areArtifactsEqual(priorArtifact, artifact);
});
return changedArtifacts.map((artifact, index) => ({
kind: "artifact-update",
taskId: next.id,
contextId: next.contextId,
lastChunk: isTerminalTaskState(next.status.state) && index === changedArtifacts.length - 1,
artifact: structuredClone(artifact)
}));
}
async function handleMessageSend({
requestId,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
agent,
agentId,
logger,
requestContext
}) {
validateMessageSendParams(params);
const { message, metadata } = params;
const { contextId } = message;
const taskId = message.taskId || crypto.randomUUID();
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let currentData = await loadOrCreateTask({
taskId,
taskStore,
agentId,
message,
contextId,
metadata
});
if (params.configuration?.pushNotificationConfig) {
resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig)
});
}
const context = createTaskContext({
task: currentData,
userMessage: message,
history: currentData.history || [],
activeCancellations: taskStore.activeCancellations
});
try {
const resourceId = metadata?.resourceId ?? message.metadata?.resourceId ?? agentId;
const result = await agent.generate([convertToCoreMessage(message)], {
runId: taskId,
requestContext,
...contextId ? { threadId: contextId, resourceId } : {}
});
const artifactUpdate = createArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: result.text,
data: result.object
});
if (artifactUpdate) {
currentData = applyUpdateToTask(currentData, artifactUpdate);
}
currentData = applyUpdateToTask(currentData, {
state: "completed",
message: void 0
});
currentData.metadata = {
...currentData.metadata,
execution: {
toolCalls: result.toolCalls,
toolResults: result.toolResults,
usage: result.usage,
finishReason: result.finishReason
}
};
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask: context.task,
nextTask: currentData,
agentId,
logger
});
context.task = currentData;
} catch (handlerError) {
const failureStatusUpdate = {
state: "failed",
message: {
messageId: crypto.randomUUID(),
role: "agent",
parts: [
{
kind: "text",
text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`
}
],
kind: "message"
}
};
currentData = applyUpdateToTask(currentData, failureStatusUpdate);
try {
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask: context.task,
nextTask: currentData,
agentId,
logger
});
} catch (saveError) {
logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);
}
return normalizeError(handlerError, requestId, currentData.id, logger);
}
return createSuccessResponse(requestId, currentData);
}
async function handleTaskGet({
requestId,
taskStore,
agentId,
taskId
}) {
const task = await taskStore.load({ agentId, taskId });
if (!task) {
throw MastraA2AError.taskNotFound(taskId);
}
return createSuccessResponse(requestId, task);
}
async function loadTaskOrThrow({
taskStore,
agentId,
taskId
}) {
const task = await taskStore.load({ agentId, taskId });
if (!task) {
throw MastraA2AError.taskNotFound(taskId);
}
return task;
}
async function handleSetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.taskId
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const config = resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(params.taskId, params.pushNotificationConfig)
});
return createSuccessResponse(requestId, config);
}
async function handleGetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const config = resolvedPushNotificationStore.get({
agentId,
params
});
if (!config) {
throw MastraA2AError.invalidParams(
`Push notification config not found: ${params.pushNotificationConfigId ?? params.id}`
);
}
return createSuccessResponse(requestId, config);
}
async function handleListTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const configs = resolvedPushNotificationStore.list({
agentId,
params
});
return createSuccessResponse(requestId, configs);
}
async function handleDeleteTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const deleted = resolvedPushNotificationStore.delete({
agentId,
params
});
if (!deleted) {
throw MastraA2AError.invalidParams(`Push notification config not found: ${params.pushNotificationConfigId}`);
}
return createSuccessResponse(requestId, null);
}
async function* handleMessageStream({
requestId,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
agent,
agentId,
logger,
requestContext
}) {
validateMessageSendParams(params);
const { message, metadata } = params;
const { contextId } = message;
const taskId = message.taskId || crypto.randomUUID();
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let currentData = await loadOrCreateTask({
taskId,
taskStore,
agentId,
message,
contextId,
metadata
});
if (params.configuration?.pushNotificationConfig) {
resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig)
});
}
currentData = applyUpdateToTask(currentData, {
state: "working",
message: {
messageId: crypto.randomUUID(),
kind: "message",
role: "agent",
parts: [{ kind: "text", text: "Generating response..." }]
}
});
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, currentData);
try {
const resourceId = metadata?.resourceId ?? message.metadata?.resourceId ?? agentId;
const result = await agent.stream([convertToCoreMessage(message)], {
runId: taskId,
requestContext,
...contextId ? { threadId: contextId, resourceId } : {}
});
let sawTextArtifact = false;
let pendingTextChunk;
let structuredData;
for await (const chunk of result.fullStream) {
const textDelta = extractFullStreamTextDelta(chunk);
if (textDelta !== null) {
if (!pendingTextChunk) {
pendingTextChunk = textDelta;
continue;
}
const textUpdate = createTextChunkArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: pendingTextChunk,
append: sawTextArtifact,
lastChunk: false
});
currentData = applyUpdateToTask(currentData, textUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, textUpdate);
sawTextArtifact = true;
pendingTextChunk = textDelta;
continue;
}
const finalStructuredObject = extractFinalStructuredObject(chunk);
if (finalStructuredObject) {
structuredData = finalStructuredObject;
}
}
structuredData ??= await result.object;
if (!pendingTextChunk && !sawTextArtifact) {
const finalText = await result.text;
if (finalText) {
pendingTextChunk = finalText;
}
}
if (pendingTextChunk) {
const textUpdate = createTextChunkArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: pendingTextChunk,
append: sawTextArtifact,
lastChunk: !structuredData
});
currentData = applyUpdateToTask(currentData, textUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, textUpdate);
sawTextArtifact = true;
pendingTextChunk = void 0;
}
if (structuredData) {
const dataUpdate = createDataArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
data: structuredData,
lastChunk: true
});
currentData = applyUpdateToTask(currentData, dataUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, dataUpdate);
}
const previousTask = currentData;
const completedTask = applyUpdateToTask(currentData, {
state: "completed",
message: void 0
});
completedTask.metadata = {
...completedTask.metadata,
execution: {
toolCalls: await result.toolCalls,
toolResults: await result.toolResults,
usage: await result.usage,
finishReason: await result.finishReason
}
};
currentData = completedTask;
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask,
nextTask: currentData,
agentId,
logger
});
} catch (handlerError) {
const previousTask = currentData;
currentData = applyUpdateToTask(currentData, {
state: "failed",
message: {
messageId: crypto.randomUUID(),
role: "agent",
parts: [
{
kind: "text",
text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`
}
],
kind: "message"
}
});
try {
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask,
nextTask: currentData,
agentId,
logger
});
} catch (saveError) {
logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);
}
}
yield createSuccessResponse(requestId, {
kind: "status-update",
taskId: currentData.id,
contextId: currentData.contextId,
status: currentData.status,
final: true
});
}
async function* handleTaskResubscribe({
requestId,
taskStore,
agentId,
taskId,
abortSignal
}) {
let snapshot = taskStore.loadWithVersion({ agentId, taskId });
if (!snapshot) {
throw MastraA2AError.taskNotFound(taskId);
}
yield createSuccessResponse(requestId, snapshot.task);
if (isTerminalTaskState(snapshot.task.status.state)) {
return;
}
while (true) {
const { task, version } = snapshot;
const nextUpdate = await taskStore.waitForNextUpdate({
agentId,
taskId,
afterVersion: version,
signal: abortSignal
});
for (const artifactUpdate of getTaskArtifactUpdates({ previous: task, next: nextUpdate.task })) {
yield createSuccessResponse(requestId, artifactUpdate);
}
if (didTaskStatusChange(task, nextUpdate.task)) {
yield createSuccessResponse(requestId, {
kind: "status-update",
taskId: nextUpdate.task.id,
contextId: nextUpdate.task.contextId,
status: nextUpdate.task.status,
final: isTerminalTaskState(nextUpdate.task.status.state)
});
}
if (isTerminalTaskState(nextUpdate.task.status.state)) {
return;
}
snapshot = nextUpdate;
}
}
function getTaskIdFromParams(params) {
if (!params || typeof params !== "object") {
return void 0;
}
if ("id" in params && typeof params.id === "string") {
return params.id;
}
if ("taskId" in params && typeof params.taskId === "string") {
return params.taskId;
}
if ("message" in params && params.message && typeof params.message === "object" && "taskId" in params.message) {
return typeof params.message.taskId === "string" ? params.message.taskId : void 0;
}
return void 0;
}
function isAsyncIterable(value) {
return !!value && typeof value === "object" && Symbol.asyncIterator in value;
}
function createA2AJsonResponse(payload) {
return Response.json(payload);
}
function createA2ASSEResponse(payload) {
const encoder = new TextEncoder();
const iterable = isAsyncIterable(payload) ? payload : (async function* () {
yield payload;
})();
const stream = new ReadableStream({
async start(controller) {
try {
for await (const chunk of iterable) {
controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}
`));
}
} catch (error) {
controller.error(error);
return;
}
controller.close();
}
});
return new Response(stream, {
headers: {
"Content-Type": "text/event-stream; charset=utf-8",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"X-Accel-Buffering": "no"
}
});
}
async function handleTaskCancel({
requestId,
taskStore,
pushNotificationSender,
agentId,
taskId,
logger
}) {
let data = await taskStore.load({
agentId,
taskId
});
if (!data) {
throw MastraA2AError.taskNotFound(taskId);
}
const finalStates = ["completed", "failed", "canceled"];
if (finalStates.includes(data.status.state)) {
logger?.info(`Task ${taskId} already in final state ${data.status.state}, cannot cancel.`);
return createSuccessResponse(requestId, data);
}
taskStore.activeCancellations.add(taskId);
const cancelUpdate = {
state: "canceled",
message: {
role: "agent",
parts: [{ kind: "text", text: "Task cancelled by request." }],
kind: "message",
messageId: crypto.randomUUID()
}
};
const previousTask = data;
data = applyUpdateToTask(data, cancelUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvePushNotificationPair({ pushNotificationSender }).pushNotificationSender,
previousTask,
nextTask: data,
agentId,
logger
});
taskStore.activeCancellations.delete(taskId);
return createSuccessResponse(requestId, data);
}
async function getAgentExecutionHandler({
requestId,
mastra,
agentId,
requestContext,
method,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
logger,
abortSignal
}) {
const agent = await getAgentFromSystem({ mastra, agentId });
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let taskId;
try {
taskId = getTaskIdFromParams(params);
switch (method) {
case "message/send": {
const result = await handleMessageSend({
requestId,
params,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender,
agent,
agentId,
logger,
requestContext
});
return result;
}
case "message/stream": {
const result = await handleMessageStream({
requestId,
taskStore,
params,
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender,
agent,
agentId,
logger,
requestContext
});
return result;
}
case "tasks/get": {
const result = await handleTaskGet({
requestId,
taskStore,
agentId,
taskId: taskId || "No task ID provided"
});
return result;
}
case "tasks/cancel": {
const result = await handleTaskCancel({
requestId,
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
agentId,
taskId: taskId || "No task ID provided",
logger
});
return result;
}
case "tasks/resubscribe":
return await handleTaskResubscribe({
requestId,
taskStore,
agentId,
taskId: taskId || "No task ID provided",
abortSignal
});
case "tasks/pushNotificationConfig/set":
return await handleSetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/get":
return await handleGetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/list":
return await handleListTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/delete":
return await handleDeleteTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "agent/getAuthenticatedExtendedCard":
throw MastraA2AError.extendedAgentCardNotConfigured();
default:
throw MastraA2AError.methodNotFound(method);
}
} catch (error) {
if (error instanceof MastraA2AError && taskId && !error.taskId) {
error.taskId = taskId;
}
return normalizeError(error, requestId, taskId, logger);
}
}
var GET_AGENT_CARD_ROUTE = createRoute({
method: "GET",
path: "/.well-known/:agentId/agent-card.json",
responseType: "json",
pathParamSchema: a2aAgentIdPathParams,
responseSchema: agentCardResponseSchema,
summary: "Get agent card",
description: "Returns the agent card information for A2A protocol discovery",
tags: ["Agent-to-Agent"],
requiresAuth: true,
handler: async (ctx) => {
const executionUrl = getA2AExecutionUrl({
agentId: ctx.agentId,
request: ctx.request,
routePrefix: ctx.routePrefix
});
return getAgentCardByIdHandler({
mastra: ctx.mastra,
requestContext: ctx.requestContext,
agentId: ctx.agentId,
executionUrl,
pushNotifications: true
});
}
});
var AGENT_EXECUTION_ROUTE = createRoute({
method: "POST",
path: "/a2a/:agentId",
responseType: "datastream-response",
pathParamSchema: a2aAgentIdPathParams,
bodySchema: agentExecutionBodySchema,
responseSchema: agentExecutionResponseSchema,
summary: "Execute agent",
description: "Executes an agent action via JSON-RPC 2.0 over A2A protocol",
tags: ["Agent-to-Agent"],
requiresAuth: true,
handler: async ({ mastra, agentId, requestContext, taskStore, abortSignal, ...bodyParams }) => {
const { id: requestId, method } = bodyParams;
const params = "params" in bodyParams ? bodyParams.params : void 0;
const result = await getAgentExecutionHandler({
requestId,
mastra,
agentId,
requestContext,
method,
params,
taskStore,
abortSignal
});
if (method === "message/stream" || method === "tasks/resubscribe") {
return createA2ASSEResponse(result);
}
return createA2AJsonResponse(result);
}
});
export { AGENT_EXECUTION_ROUTE, GET_AGENT_CARD_ROUTE, a2a_exports, getAgentCardByIdHandler, getAgentExecutionHandler, handleDeleteTaskPushNotificationConfig, handleGetTaskPushNotificationConfig, handleListTaskPushNotificationConfig, handleMessageSend, handleMessageStream, handleSetTaskPushNotificationConfig, handleTaskCancel, handleTaskGet, handleTaskResubscribe };
//# sourceMappingURL=chunk-L5JZZ7PX.js.map
//# sourceMappingURL=chunk-L5JZZ7PX.js.map

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

'use strict';
var chunkT3C54LPX_cjs = require('./chunk-T3C54LPX.cjs');
var chunkFUEIM3CA_cjs = require('./chunk-FUEIM3CA.cjs');
var chunkTDMX66RN_cjs = require('./chunk-TDMX66RN.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var workspace = require('@mastra/core/workspace');
var INDEXED_FOLDERS = ["references", "scripts", "assets"];
function extractIndexedPathsFromFiles(files, existing) {
if (!files || files.length === 0) return {};
const root = files.find((n) => n.type === "folder");
if (!root?.children) return {};
const result = {};
for (const folderName of INDEXED_FOLDERS) {
const folder = root.children.find((n) => n.type === "folder" && n.name === folderName);
if (!folder?.children || folder.children.length === 0) continue;
const existingPaths = new Set(existing[folderName] ?? []);
const paths = [...existingPaths];
collectFilePaths(folder.children, folderName, existingPaths, paths);
if (paths.length > 0) {
result[folderName] = paths;
}
}
return result;
}
function collectFilePaths(nodes, prefix, existingPaths, out) {
for (const node of nodes) {
if (node.type === "file") {
const relativePath = `${prefix}/${node.name}`;
if (!existingPaths.has(relativePath)) {
out.push(relativePath);
}
} else if (node.type === "folder" && node.children) {
collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);
}
}
}
var LIST_STORED_SKILLS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/skills",
responseType: "json",
queryParamSchema: chunkT3C54LPX_cjs.listStoredSkillsQuerySchema,
responseSchema: chunkT3C54LPX_cjs.listStoredSkillsResponseSchema,
summary: "List stored skills",
description: "Returns a paginated list of all skill configurations stored in the database",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
page,
perPage,
orderBy,
status,
authorId,
visibility,
metadata,
favoritedOnly,
pinFavoritedFor
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const filter = chunkKGUHJRHZ_cjs.resolveAuthorFilter({
requestContext,
resource: "stored-skills",
queryAuthorId: authorId,
queryVisibility: visibility
});
const scope = await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext);
const scopedMetadata = chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(metadata, scope);
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
const favoritesEnabled = await chunkTDMX66RN_cjs.isBuilderFeatureEnabled(mastra, "favorites");
const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;
const favoriteSubjectId = pinFavoritedFor ?? callerId;
if (honoredStarredOnly) {
const effectivePerPage = perPage ?? 100;
if (!favoriteSubjectId) {
return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Favorites storage domain is not available" });
}
const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: "skill" });
if (starredIds.length === 0) {
return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const allMatching = await skillStore.listResolved({
perPage: false,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata,
entityIds: starredIds
});
const visible = allMatching.skills.filter((record) => chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter));
const total = visible.length;
const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;
const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;
const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);
const annotated2 = sliced.map((record) => ({ ...record, isFavorited: true }));
const hasMore = effectivePerPage > 0 && endIdx < total;
return {
skills: annotated2,
total,
page,
perPage: effectivePerPage,
hasMore
};
}
const result = await skillStore.listResolved({
page,
perPage,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata
});
const visibleSkills = result.skills.filter((record) => chunkKGUHJRHZ_cjs.matchesAuthorFilter(record, filter));
if (!favoritesEnabled) {
return { ...result, skills: visibleSkills.map(chunkFUEIM3CA_cjs.stripFavoriteFields) };
}
const enrichment = await chunkFUEIM3CA_cjs.prepareFavoritesEnrichment(
mastra,
requestContext,
"skill",
visibleSkills.map((s) => s.id)
);
const annotated = enrichment ? visibleSkills.map((record) => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) })) : visibleSkills.map(chunkFUEIM3CA_cjs.stripFavoriteFields);
return { ...result, skills: annotated };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error listing stored skills");
}
}
});
var GET_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
responseSchema: chunkT3C54LPX_cjs.getStoredSkillResponseSchema,
summary: "Get stored skill by ID",
description: "Returns a specific skill from storage by its unique identifier (resolved with active version config)",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(skill, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
return chunkFUEIM3CA_cjs.enrichOrStripFavorites(mastra, requestContext, "skill", skill);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting stored skill");
}
}
});
var CREATE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/skills",
responseType: "json",
bodySchema: chunkT3C54LPX_cjs.createStoredSkillBodySchema,
responseSchema: chunkT3C54LPX_cjs.createStoredSkillResponseSchema,
summary: "Create stored skill",
description: "Creates a new skill configuration in storage with the provided details",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
id: providedId,
name,
description,
instructions,
license,
compatibility,
source,
references,
scripts,
assets,
files,
metadata,
visibility: bodyVisibility
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const id = providedId || chunkGZ4HWZWE_cjs.toSlug(name);
if (!id) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: "Could not derive skill ID from name. Please provide an explicit id."
});
}
const existing = await skillStore.getById(id);
if (existing) {
throw new chunk64ITUOXI_cjs.HTTPException(409, { message: `Skill with id ${id} already exists` });
}
const authorId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext) ?? void 0;
const visibility = authorId ? bodyVisibility ?? "private" : "public";
const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });
await skillStore.create({
skill: {
id,
authorId,
visibility,
name,
description,
instructions,
license,
compatibility,
source,
references: indexedPaths.references ?? references,
scripts: indexedPaths.scripts ?? scripts,
assets: indexedPaths.assets ?? assets,
files,
metadata: chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata(metadata, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext))
}
});
const resolved = await skillStore.getByIdResolved(id);
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve created skill" });
}
return chunkFUEIM3CA_cjs.enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error creating stored skill");
}
}
});
var UPDATE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "PATCH",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
bodySchema: chunkT3C54LPX_cjs.updateStoredSkillBodySchema,
responseSchema: chunkT3C54LPX_cjs.updateStoredSkillResponseSchema,
summary: "Update stored skill",
description: "Updates an existing skill in storage with the provided fields",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
storedSkillId,
// Entity-level fields
authorId,
visibility,
// Config fields (snapshot-level)
name,
description,
instructions,
license,
compatibility,
source,
references,
scripts,
assets,
files,
metadata
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
const scope = await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext);
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, scope);
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "edit",
record: existing
});
const callerAuthorId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext) ?? void 0;
const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? "public" : void 0;
const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};
const update = { id: storedSkillId };
if (authorId !== void 0) update.authorId = authorId;
if (resolvedVisibility !== void 0) update.visibility = resolvedVisibility;
if (name !== void 0) update.name = name;
if (description !== void 0) update.description = description;
if (instructions !== void 0) update.instructions = instructions;
if (license !== void 0) update.license = license;
if (compatibility !== void 0) update.compatibility = compatibility;
if (source !== void 0) update.source = source;
const resolvedReferences = indexedPaths.references ?? references;
const resolvedScripts = indexedPaths.scripts ?? scripts;
const resolvedAssets = indexedPaths.assets ?? assets;
if (resolvedReferences !== void 0) update.references = resolvedReferences;
if (resolvedScripts !== void 0) update.scripts = resolvedScripts;
if (resolvedAssets !== void 0) update.assets = resolvedAssets;
if (files !== void 0) update.files = files;
if (metadata !== void 0) {
update.metadata = chunkGZ4HWZWE_cjs.scopeStoredResourceMetadata({ ...existing.metadata ?? {}, ...metadata }, scope);
}
await skillStore.update(update);
const resolved = await skillStore.getByIdResolved(storedSkillId);
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve updated skill" });
}
return chunkFUEIM3CA_cjs.enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error updating stored skill");
}
}
});
var DELETE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
responseSchema: chunkT3C54LPX_cjs.deleteStoredSkillResponseSchema,
summary: "Delete stored skill",
description: "Deletes a skill from storage by its unique identifier",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "delete",
record: existing
});
await skillStore.delete(storedSkillId);
try {
const favoritesStore = await storage.getStore("favorites");
await favoritesStore?.deleteFavoritesForEntity({ entityType: "skill", entityId: storedSkillId });
} catch (cascadeError) {
mastra.getLogger?.()?.warn?.("Failed to cascade-delete favorites for skill", { storedSkillId, error: cascadeError });
}
return {
success: true,
message: `Skill ${storedSkillId} deleted successfully`
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error deleting stored skill");
}
}
});
var PUBLISH_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/stored/skills/:storedSkillId/publish",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
bodySchema: chunkT3C54LPX_cjs.publishStoredSkillBodySchema,
responseSchema: chunkT3C54LPX_cjs.publishStoredSkillResponseSchema,
summary: "Publish stored skill",
description: "Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const blobStore = await storage.getStore("blobs");
if (!blobStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Blob storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(existing, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "edit",
record: existing
});
const path = await import('path');
const fs = await import('fs/promises');
const resolvedPath = path.default.resolve(skillPath);
const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());
if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: `skillPath must be within the allowed directory: ${allowedBase}`
});
}
try {
const stat = await fs.stat(resolvedPath);
if (!stat.isDirectory()) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });
}
} catch (err) {
if (err instanceof chunk64ITUOXI_cjs.HTTPException) throw err;
if (err?.code === "ENOENT") {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`
});
}
throw err;
}
try {
await fs.stat(path.default.join(resolvedPath, "SKILL.md"));
} catch (err) {
if (err?.code === "ENOENT") {
throw new chunk64ITUOXI_cjs.HTTPException(400, {
message: `skillPath is missing SKILL.md: ${resolvedPath}`
});
}
throw err;
}
const source = new workspace.LocalSkillSource();
const { publishSkillFromSource } = await import('@mastra/core/workspace');
const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);
const snapshotUpdate = {};
for (const [key, value] of Object.entries(snapshot)) {
if (value !== void 0) snapshotUpdate[key] = value;
}
await skillStore.update({
id: storedSkillId,
...snapshotUpdate,
tree,
files,
status: "published"
});
const latestVersion = await skillStore.getLatestVersion(storedSkillId);
if (latestVersion) {
await skillStore.update({
id: storedSkillId,
activeVersionId: latestVersion.id
});
}
const resolved = await skillStore.getByIdResolved(storedSkillId);
if (!resolved) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Failed to resolve skill after publish" });
}
return chunkFUEIM3CA_cjs.enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error publishing stored skill");
}
}
});
exports.CREATE_STORED_SKILL_ROUTE = CREATE_STORED_SKILL_ROUTE;
exports.DELETE_STORED_SKILL_ROUTE = DELETE_STORED_SKILL_ROUTE;
exports.GET_STORED_SKILL_ROUTE = GET_STORED_SKILL_ROUTE;
exports.LIST_STORED_SKILLS_ROUTE = LIST_STORED_SKILLS_ROUTE;
exports.PUBLISH_STORED_SKILL_ROUTE = PUBLISH_STORED_SKILL_ROUTE;
exports.UPDATE_STORED_SKILL_ROUTE = UPDATE_STORED_SKILL_ROUTE;
//# sourceMappingURL=chunk-MIAMR6TW.cjs.map
//# sourceMappingURL=chunk-MIAMR6TW.cjs.map
{"version":3,"sources":["../src/server/handlers/stored-skills.ts"],"names":["createRoute","listStoredSkillsQuerySchema","listStoredSkillsResponseSchema","HTTPException","resolveAuthorFilter","getStoredResourceScope","scopeStoredResourceMetadata","getCallerAuthorId","isBuilderFeatureEnabled","matchesAuthorFilter","annotated","stripFavoriteFields","prepareFavoritesEnrichment","handleError","storedSkillIdPathParams","getStoredSkillResponseSchema","assertStoredResourceScope","assertReadAccess","enrichOrStripFavorites","createStoredSkillBodySchema","createStoredSkillResponseSchema","toSlug","updateStoredSkillBodySchema","updateStoredSkillResponseSchema","assertWriteAccess","deleteStoredSkillResponseSchema","publishStoredSkillBodySchema","publishStoredSkillResponseSchema","LocalSkillSource"],"mappings":"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","file":"chunk-MIAMR6TW.cjs","sourcesContent":["import type { StorageSkillFileNode } from '@mastra/core/storage';\nimport { LocalSkillSource } from '@mastra/core/workspace';\n\nimport { HTTPException } from '../http-exception';\nimport {\n storedSkillIdPathParams,\n listStoredSkillsQuerySchema,\n createStoredSkillBodySchema,\n updateStoredSkillBodySchema,\n publishStoredSkillBodySchema,\n listStoredSkillsResponseSchema,\n getStoredSkillResponseSchema,\n createStoredSkillResponseSchema,\n updateStoredSkillResponseSchema,\n deleteStoredSkillResponseSchema,\n publishStoredSkillResponseSchema,\n} from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { toSlug, assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata } from '../utils';\n\nimport {\n assertReadAccess,\n assertWriteAccess,\n getCallerAuthorId,\n matchesAuthorFilter,\n resolveAuthorFilter,\n} from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\nimport { handleError } from './error';\nimport { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from './favorites-enrichment';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Well-known folder names in the skill file tree whose children represent\n * indexable path arrays (references, scripts, assets).\n */\nconst INDEXED_FOLDERS = ['references', 'scripts', 'assets'] as const;\n\n/**\n * Walks the `files` tree and collects relative file paths for each well-known\n * folder (references, scripts, assets). Returned arrays only include entries\n * that are not already present in any explicitly-provided arrays so callers\n * can pass both `files` and `references` without creating duplicates.\n */\nfunction extractIndexedPathsFromFiles(\n files: StorageSkillFileNode[] | undefined,\n existing: {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n },\n): {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n} {\n if (!files || files.length === 0) return {};\n\n // Find the root folder (first folder node, usually id=\"root\")\n const root = files.find(n => n.type === 'folder');\n if (!root?.children) return {};\n\n const result: Record<string, string[]> = {};\n\n for (const folderName of INDEXED_FOLDERS) {\n const folder = root.children.find(n => n.type === 'folder' && n.name === folderName);\n if (!folder?.children || folder.children.length === 0) continue;\n\n const existingPaths = new Set(existing[folderName] ?? []);\n const paths: string[] = [...existingPaths];\n\n collectFilePaths(folder.children, folderName, existingPaths, paths);\n\n if (paths.length > 0) {\n result[folderName] = paths;\n }\n }\n\n return result;\n}\n\n/** Recursively collects file paths from a subtree, building relative paths. */\nfunction collectFilePaths(\n nodes: StorageSkillFileNode[],\n prefix: string,\n existingPaths: Set<string>,\n out: string[],\n): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const relativePath = `${prefix}/${node.name}`;\n if (!existingPaths.has(relativePath)) {\n out.push(relativePath);\n }\n } else if (node.type === 'folder' && node.children) {\n collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);\n }\n }\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/skills - List all stored skills\n */\nexport const LIST_STORED_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills',\n responseType: 'json',\n queryParamSchema: listStoredSkillsQuerySchema,\n responseSchema: listStoredSkillsResponseSchema,\n summary: 'List stored skills',\n description: 'Returns a paginated list of all skill configurations stored in the database',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n page,\n perPage,\n orderBy,\n status,\n authorId,\n visibility,\n metadata,\n favoritedOnly,\n pinFavoritedFor,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const filter = resolveAuthorFilter({\n requestContext,\n resource: 'stored-skills',\n queryAuthorId: authorId,\n queryVisibility: visibility,\n });\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);\n\n const callerId = getCallerAuthorId(requestContext);\n const favoritesEnabled = await isBuilderFeatureEnabled(mastra, 'favorites');\n const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;\n const favoriteSubjectId = pinFavoritedFor ?? callerId;\n\n // `?favoritedOnly=true` flow: fetch caller's favorited IDs, restrict the list\n // to that set, then post-filter by visibility and recompute total/pages.\n if (honoredStarredOnly) {\n const effectivePerPage: number = perPage ?? 100;\n if (!favoriteSubjectId) {\n // Caller cannot have favorited anything without an identity.\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: 'skill' });\n if (starredIds.length === 0) {\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const allMatching = await skillStore.listResolved({\n perPage: false,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n entityIds: starredIds,\n });\n const visible = allMatching.skills.filter(record => matchesAuthorFilter(record, filter));\n const total = visible.length;\n const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;\n const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;\n const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);\n const annotated = sliced.map(record => ({ ...record, isFavorited: true }));\n const hasMore = effectivePerPage > 0 && endIdx < total;\n return {\n skills: annotated,\n total,\n page,\n perPage: effectivePerPage,\n hasMore,\n };\n }\n\n const result = await skillStore.listResolved({\n page,\n perPage,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n });\n\n // Post-filter to enforce ownership + visibility rules across all backends.\n // Storage adapters can only do an equality filter on authorId, so we apply\n // the ownedOrPublic / publicOnly logic here.\n // Note: `result.total` / `result.hasMore` reflect the storage-reported\n // count before this post-filter. For `unrestricted` / `exact` filters\n // nothing is removed; for `ownedOrPublic` / `publicOnly`, downstream UIs\n // should treat the filter as a view over the caller's scope — an\n // approximation is OK and preserves pagination math.\n const visibleSkills = result.skills.filter(record => matchesAuthorFilter(record, filter));\n\n if (!favoritesEnabled) {\n return { ...result, skills: visibleSkills.map(stripFavoriteFields) };\n }\n\n const enrichment = await prepareFavoritesEnrichment(\n mastra,\n requestContext,\n 'skill',\n visibleSkills.map(s => s.id),\n );\n const annotated = enrichment\n ? visibleSkills.map(record => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) }))\n : visibleSkills.map(stripFavoriteFields);\n\n return { ...result, skills: annotated };\n } catch (error) {\n return handleError(error, 'Error listing stored skills');\n }\n },\n});\n\n/**\n * GET /stored/skills/:storedSkillId - Get a stored skill by ID\n */\nexport const GET_STORED_SKILL_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: getStoredSkillResponseSchema,\n summary: 'Get stored skill by ID',\n description: 'Returns a specific skill from storage by its unique identifier (resolved with active version config)',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', skill);\n } catch (error) {\n return handleError(error, 'Error getting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills - Create a new stored skill\n */\nexport const CREATE_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills',\n responseType: 'json',\n bodySchema: createStoredSkillBodySchema,\n responseSchema: createStoredSkillResponseSchema,\n summary: 'Create stored skill',\n description: 'Creates a new skill configuration in storage with the provided details',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n id: providedId,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n visibility: bodyVisibility,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive skill ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if skill with this ID already exists\n const existing = await skillStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Skill with id ${id} already exists` });\n }\n\n // Force authorId from the authenticated caller; ignore any body-provided value.\n // No owner = always public (no auth / no user context).\n // With an owner, respect the client's choice, defaulting to 'private'.\n const authorId = getCallerAuthorId(requestContext) ?? undefined;\n const visibility: 'private' | 'public' = authorId ? (bodyVisibility ?? 'private') : 'public';\n\n // Derive references/scripts/assets path arrays from the files tree\n // so agents can discover them via skill_read even when only `files` is provided.\n const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });\n\n await skillStore.create({\n skill: {\n id,\n authorId,\n visibility,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references: indexedPaths.references ?? references,\n scripts: indexedPaths.scripts ?? scripts,\n assets: indexedPaths.assets ?? assets,\n files,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n },\n });\n\n // Return the resolved skill (thin record + version config)\n const resolved = await skillStore.getByIdResolved(id);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error creating stored skill');\n }\n },\n});\n\n/**\n * PATCH /stored/skills/:storedSkillId - Update a stored skill\n */\nexport const UPDATE_STORED_SKILL_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: updateStoredSkillBodySchema,\n responseSchema: updateStoredSkillResponseSchema,\n summary: 'Update stored skill',\n description: 'Updates an existing skill in storage with the provided fields',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n storedSkillId,\n // Entity-level fields\n authorId,\n visibility,\n // Config fields (snapshot-level)\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // No owner = always public, regardless of what the client sent.\n const callerAuthorId = getCallerAuthorId(requestContext) ?? undefined;\n const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? 'public' : undefined;\n\n // Derive references/scripts/assets path arrays from the files tree\n const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};\n\n // Update the skill with both entity-level and config-level fields.\n // The storage layer handles separating these into record updates vs\n // new-version creation, but it uses `field in updates` to detect config\n // changes — so we must only include fields the caller actually sent.\n // Forwarding `undefined` keys would trigger a spurious version create\n // and pass `undefined` into the database driver.\n const update: Record<string, unknown> = { id: storedSkillId };\n if (authorId !== undefined) update.authorId = authorId;\n if (resolvedVisibility !== undefined) update.visibility = resolvedVisibility;\n if (name !== undefined) update.name = name;\n if (description !== undefined) update.description = description;\n if (instructions !== undefined) update.instructions = instructions;\n if (license !== undefined) update.license = license;\n if (compatibility !== undefined) update.compatibility = compatibility;\n if (source !== undefined) update.source = source;\n const resolvedReferences = indexedPaths.references ?? references;\n const resolvedScripts = indexedPaths.scripts ?? scripts;\n const resolvedAssets = indexedPaths.assets ?? assets;\n if (resolvedReferences !== undefined) update.references = resolvedReferences;\n if (resolvedScripts !== undefined) update.scripts = resolvedScripts;\n if (resolvedAssets !== undefined) update.assets = resolvedAssets;\n if (files !== undefined) update.files = files;\n if (metadata !== undefined) {\n update.metadata = scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope);\n }\n\n await skillStore.update(update as Parameters<typeof skillStore.update>[0]);\n\n // Return the resolved skill with the updated config\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error updating stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId - Delete a stored skill\n */\nexport const DELETE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: deleteStoredSkillResponseSchema,\n summary: 'Delete stored skill',\n description: 'Deletes a skill from storage by its unique identifier',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `skills:delete[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'delete',\n record: existing,\n });\n\n await skillStore.delete(storedSkillId);\n\n // Cascade: drop any favorite rows referencing this skill. Failure must not\n // abort the delete.\n try {\n const favoritesStore = await storage.getStore('favorites');\n await favoritesStore?.deleteFavoritesForEntity({ entityType: 'skill', entityId: storedSkillId });\n } catch (cascadeError) {\n mastra\n .getLogger?.()\n ?.warn?.('Failed to cascade-delete favorites for skill', { storedSkillId, error: cascadeError });\n }\n\n return {\n success: true,\n message: `Skill ${storedSkillId} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills/:storedSkillId/publish - Publish a skill from filesystem\n * Walks the skill directory, hashes files into blob store, creates a new version\n * with the tree manifest, and sets activeVersionId.\n */\nexport const PUBLISH_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills/:storedSkillId/publish',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: publishStoredSkillBodySchema,\n responseSchema: publishStoredSkillResponseSchema,\n summary: 'Publish stored skill',\n description:\n 'Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const blobStore = await storage.getStore('blobs');\n if (!blobStore) {\n throw new HTTPException(500, { message: 'Blob storage domain is not available' });\n }\n\n // Verify skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // Validate skillPath to prevent path traversal\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n const resolvedPath = path.default.resolve(skillPath);\n const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());\n if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {\n throw new HTTPException(400, {\n message: `skillPath must be within the allowed directory: ${allowedBase}`,\n });\n }\n\n // Verify the source directory exists and contains a SKILL.md before attempting\n // to publish, so callers get a 400 with context instead of a raw 500/ENOENT.\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });\n }\n } catch (err) {\n if (err instanceof HTTPException) throw err;\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`,\n });\n }\n throw err;\n }\n try {\n await fs.stat(path.default.join(resolvedPath, 'SKILL.md'));\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath is missing SKILL.md: ${resolvedPath}`,\n });\n }\n throw err;\n }\n\n // Use LocalSkillSource to read from the server filesystem\n const source = new LocalSkillSource();\n const { publishSkillFromSource } = await import('@mastra/core/workspace');\n\n const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);\n\n // Strip undefined keys from the snapshot before passing to update(). The\n // storage layer treats \"field present\" as \"field changed\"; forwarding\n // undefined would overwrite populated columns with undefined and trip\n // NOT NULL / \"undefined cannot be passed as argument\" errors in\n // adapters that bind args raw (libsql, pg).\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 // `files` is the nested folder/file structure shown in the editor; without\n // it the column would stay null and the UI would render an empty tree.\n await skillStore.update({\n id: storedSkillId,\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(storedSkillId);\n if (latestVersion) {\n await skillStore.update({\n id: storedSkillId,\n activeVersionId: latestVersion.id,\n });\n }\n\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve skill after publish' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error publishing stored skill');\n }\n },\n});\n"]}
import { builderSettingsResponseSchema, builderAvailableModelsResponseSchema, infrastructureStatusResponseSchema, agentFeaturesSchema } from './chunk-4BJSE3LM.js';
import { buildProvidersList } from './chunk-L6FOTAND.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
// src/server/utils/resolve-builder-model-policy.ts
async function resolveBuilderModelPolicy(editor) {
if (!editor) return { active: false };
if (typeof editor.resolveBuilder !== "function") return { active: false };
if (typeof editor.hasEnabledBuilderConfig === "function" && !editor.hasEnabledBuilderConfig()) {
return { active: false };
}
try {
const builder = await editor.resolveBuilder();
const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');
return builderToModelPolicy(builder);
} catch {
return { active: false };
}
}
// src/server/handlers/editor-builder.ts
async function resolveBuilderFeatures(mastra) {
const editor = mastra.getEditor();
if (!editor || typeof editor.resolveBuilder !== "function") return null;
if (!editor.hasEnabledBuilderConfig?.()) return null;
const builder = await editor.resolveBuilder();
if (!builder || !builder.enabled) return null;
const features = builder.getFeatures?.()?.agent;
if (!features) return null;
const parsed = agentFeaturesSchema.safeParse(features);
return parsed.success ? parsed.data : null;
}
async function isBuilderFeatureEnabled(mastra, feature) {
const features = await resolveBuilderFeatures(mastra);
return features?.[feature] === true;
}
async function requireBuilderFeature(mastra, feature) {
if (!await isBuilderFeatureEnabled(mastra, feature)) {
throw new HTTPException(404, { message: "Not Found" });
}
}
var GET_EDITOR_BUILDER_SETTINGS_ROUTE = createRoute({
method: "GET",
path: "/editor/builder/settings",
responseType: "json",
responseSchema: builderSettingsResponseSchema,
summary: "Get agent builder settings",
description: "Returns the agent builder feature flags and configuration for UI gating",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra }) => {
try {
const editor = mastra.getEditor();
if (!editor) {
return { enabled: false, modelPolicy: { active: false } };
}
if (typeof editor.resolveBuilder !== "function") {
return { enabled: false, modelPolicy: { active: false } };
}
if (!editor.hasEnabledBuilderConfig?.()) {
return { enabled: false, modelPolicy: { active: false } };
}
const builder = await editor.resolveBuilder();
if (!builder || !builder.enabled) {
return { enabled: false, modelPolicy: { active: false } };
}
const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];
const configuration = builder.getConfiguration();
const collectAliases = (registry) => Object.entries(registry).map(([key, entity]) => ({
id: entity.id || key,
key
}));
const toolAliases = collectAliases(mastra.listTools() ?? {});
const agentAliases = collectAliases(mastra.listAgents() ?? {});
const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});
const toResponseKey = (aliases, byId) => {
const map = /* @__PURE__ */ new Map();
for (const a of aliases) {
map.set(a.id, byId === "id" ? a.id : a.key);
map.set(a.key, byId === "id" ? a.id : a.key);
}
return map;
};
const toolKeyMap = toResponseKey(toolAliases, "key");
const agentKeyMap = toResponseKey(agentAliases, "id");
const workflowKeyMap = toResponseKey(workflowAliases, "key");
const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');
const picker = resolvePickerVisibility({
config: configuration?.agent,
registeredToolIds: toolAliases.flatMap((a) => [a.id, a.key]),
registeredAgentIds: agentAliases.flatMap((a) => [a.id, a.key]),
registeredWorkflowIds: workflowAliases.flatMap((a) => [a.id, a.key])
});
const normalize = (visible, map) => {
if (visible === null) return null;
const out = [];
const seen = /* @__PURE__ */ new Set();
for (const id of visible) {
const mapped = map.get(id);
if (mapped && !seen.has(mapped)) {
seen.add(mapped);
out.push(mapped);
}
}
return out;
};
const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];
return {
enabled: true,
features: builder.getFeatures(),
configuration,
modelPolicy: builderToModelPolicy(builder),
picker: {
visibleTools: normalize(picker.visibleTools, toolKeyMap),
visibleAgents: normalize(picker.visibleAgents, agentKeyMap),
visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap)
},
...modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}
};
} catch (error) {
return handleError(error, "Error getting builder settings");
}
}
});
var GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = createRoute({
method: "GET",
path: "/editor/builder/models/available",
responseType: "json",
responseSchema: builderAvailableModelsResponseSchema,
summary: "List builder-available AI models",
description: "Returns AI providers/models filtered by the active agent-builder model policy.",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra }) => {
try {
const providers = (await buildProvidersList(mastra)).filter((provider) => provider.connected);
const policy = await resolveBuilderModelPolicy(mastra.getEditor());
if (!policy.active || !policy.allowed || policy.allowed.length === 0) {
return { providers };
}
const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');
const filtered = providers.map((provider) => ({
...provider,
models: provider.models.filter((modelId) => isModelAllowed(policy.allowed, { provider: provider.id, modelId }))
})).filter((provider) => provider.models.length > 0);
return { providers: filtered };
} catch (error) {
return handleError(error, "Error fetching available models");
}
}
});
var GET_INFRASTRUCTURE_STATUS_ROUTE = createRoute({
method: "GET",
path: "/editor/builder/infrastructure",
responseType: "json",
responseSchema: infrastructureStatusResponseSchema,
summary: "Get infrastructure status",
description: "Agent Builder infrastructure configuration and lightweight runtime status.",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "infrastructure:read",
handler: async ({ mastra }) => {
try {
const formatConfigValue = (value) => {
if (value === null || value === void 0) return "not set";
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? "" : "s"}`;
return value.constructor?.name && value.constructor.name !== "Object" ? value.constructor.name : "configured";
};
const getProviderName = (value) => {
if (!value) return null;
if (typeof value === "object" && "provider" in value && typeof value.provider === "string")
return value.provider;
if (typeof value === "object" && "constructor" in value) {
const name = value.constructor?.name;
return name && name !== "Object" ? name : "configured";
}
return null;
};
const getConfigEntries = (config, omittedKeys = []) => Object.entries(config).filter(([key, value]) => !omittedKeys.includes(key) && value !== void 0 && value !== null).map(([key, value]) => ({ key, value: formatConfigValue(value) }));
const channelProviders = mastra.getChannelProviders() ?? {};
const channels = {
providers: Object.entries(channelProviders).map(([id, provider]) => {
const info = provider.getInfo?.();
const routes = provider.getRoutes?.() ?? [];
return {
id: info?.id ?? id,
name: info?.name ?? id,
isConfigured: info?.isConfigured ?? false,
routeCount: routes.length
};
}).filter((provider) => provider.isConfigured)
};
const editor = mastra.getEditor();
let browser = {
type: null,
provider: null,
env: null,
registered: false,
availableProviders: [],
config: []
};
let workspace = {
type: null,
workspaceId: null,
name: null,
source: null,
registered: false,
hasFilesystem: false,
hasSandbox: false,
filesystemProvider: null,
sandboxProvider: null,
config: []
};
let registries = {
skillsSh: { enabled: false }
};
if (editor?.resolveBuilder) {
const browsers = editor.__browsers;
const builder = await editor.resolveBuilder();
const builderRegistries = builder?.getRegistries?.();
registries = {
skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true }
};
const configuration = builder?.getConfiguration?.()?.agent;
const browserRef = configuration?.browser;
const browserConfig = browserRef?.config ?? {};
const providerId = browserConfig.provider ?? null;
browser = {
type: browserRef?.type ?? null,
provider: providerId,
env: browserConfig.env ?? null,
registered: providerId ? !!browsers?.has(providerId) : false,
availableProviders: browsers ? Array.from(browsers.keys()) : [],
config: getConfigEntries(browserConfig, ["provider", "env"])
};
const workspaceRef = configuration?.workspace;
const workspaceConfig = workspaceRef?.config ?? {};
const registeredWorkspaces = mastra.listWorkspaces();
const registeredWorkspace = workspaceRef?.workspaceId ? registeredWorkspaces[workspaceRef.workspaceId] : void 0;
const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;
const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;
const filesystemConfig = typeof workspaceConfig.filesystem === "object" && workspaceConfig.filesystem && "config" in workspaceConfig.filesystem ? workspaceConfig.filesystem.config : {};
const sandboxConfig = typeof workspaceConfig.sandbox === "object" && workspaceConfig.sandbox && "config" in workspaceConfig.sandbox ? workspaceConfig.sandbox.config : {};
workspace = {
type: workspaceRef?.type ?? null,
workspaceId: workspaceRef?.workspaceId ?? null,
name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,
source: registeredWorkspace?.source ?? null,
registered: !!registeredWorkspace,
hasFilesystem: !!filesystem,
hasSandbox: !!sandbox,
filesystemProvider: getProviderName(filesystem),
sandboxProvider: getProviderName(sandbox),
config: [
...getConfigEntries(filesystemConfig).map((entry) => ({ ...entry, key: `filesystem.${entry.key}` })),
...getConfigEntries(sandboxConfig).map((entry) => ({ ...entry, key: `sandbox.${entry.key}` }))
]
};
}
return { channels, browser, workspace, registries };
} catch (error) {
return handleError(error, "Error getting infrastructure status");
}
}
});
export { GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE, GET_EDITOR_BUILDER_SETTINGS_ROUTE, GET_INFRASTRUCTURE_STATUS_ROUTE, isBuilderFeatureEnabled, requireBuilderFeature };
//# sourceMappingURL=chunk-N3D3A56J.js.map
//# sourceMappingURL=chunk-N3D3A56J.js.map
{"version":3,"sources":["../src/server/utils/resolve-builder-model-policy.ts","../src/server/handlers/editor-builder.ts"],"names":[],"mappings":"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","file":"chunk-N3D3A56J.js","sourcesContent":["import type { BuilderModelPolicy } from '@mastra/core/agent-builder/ee';\nimport type { IMastraEditor } from '@mastra/core/editor';\n\n/**\n * Server-side wrapper around `builderToModelPolicy`.\n *\n * Handles the optional `IMastraEditor` builder API surface (older / OSS editors\n * may not implement `hasEnabledBuilderConfig` / `resolveBuilder`) and returns\n * a uniform `BuilderModelPolicy` to every call site.\n *\n * Returns `{ active: false }` whenever:\n * - no editor is configured,\n * - the editor doesn't expose builder methods,\n * - the builder config is disabled, or\n * - resolving the builder fails / yields nothing.\n *\n * The `@mastra/core/agent-builder/ee` subpath is loaded lazily so this module\n * remains importable on `@mastra/core` versions that pre-date the subpath\n * (the subpath was added in core 1.34.0). The dynamic import is only reached\n * once an editor is actually configured, by which point a compatible core is\n * guaranteed.\n */\nexport async function resolveBuilderModelPolicy(editor: IMastraEditor | undefined): Promise<BuilderModelPolicy> {\n if (!editor) return { active: false };\n if (typeof editor.resolveBuilder !== 'function') return { active: false };\n if (typeof editor.hasEnabledBuilderConfig === 'function' && !editor.hasEnabledBuilderConfig()) {\n return { active: false };\n }\n\n // Degrade to inactive on builder-resolution failure rather than letting the\n // rejection escape: agent execution routes seed this on every request, so a\n // transient failure must not 500 the entire route.\n try {\n const builder = await editor.resolveBuilder();\n const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');\n return builderToModelPolicy(builder);\n } catch {\n return { active: false };\n }\n}\n","import type { Mastra } from '@mastra/core';\n\nimport { HTTPException } from '../http-exception';\nimport {\n agentFeaturesSchema,\n builderAvailableModelsResponseSchema,\n builderSettingsResponseSchema,\n infrastructureStatusResponseSchema,\n} from '../schemas/editor-builder';\nimport type { AgentFeatures, InfrastructureStatus } from '../schemas/editor-builder';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { resolveBuilderModelPolicy } from '../utils/resolve-builder-model-policy';\nimport { buildProvidersList } from './agents';\nimport { handleError } from './error';\n\n/**\n * Resolve the active builder feature flags. Returns `null` when the editor is\n * absent, the builder is disabled, or no features are configured.\n */\nasync function resolveBuilderFeatures(mastra: Mastra): Promise<AgentFeatures | null> {\n const editor = mastra.getEditor();\n if (!editor || typeof editor.resolveBuilder !== 'function') return null;\n if (!editor.hasEnabledBuilderConfig?.()) return null;\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) return null;\n const features = builder.getFeatures?.()?.agent;\n if (!features) return null;\n // Validate the shape so unknown keys cannot smuggle through.\n const parsed = agentFeaturesSchema.safeParse(features);\n return parsed.success ? parsed.data : null;\n}\n\n/**\n * Returns whether a given agent-builder feature is enabled. Used by list /\n * get-by-id handlers to soft-gate response enrichment (omit fields, ignore\n * favoritedOnly / pinFavoritedFor params) when the feature is off.\n */\nexport async function isBuilderFeatureEnabled(mastra: Mastra, feature: keyof AgentFeatures): Promise<boolean> {\n const features = await resolveBuilderFeatures(mastra);\n return features?.[feature] === true;\n}\n\n/**\n * Hard-gate helper for mutation routes that must not exist when the feature\n * is off. Throws `HTTPException(404)` so we don't leak the existence of the\n * feature surface (matches behavior of unregistered routes).\n */\nexport async function requireBuilderFeature(mastra: Mastra, feature: keyof AgentFeatures): Promise<void> {\n if (!(await isBuilderFeatureEnabled(mastra, feature))) {\n throw new HTTPException(404, { message: 'Not Found' });\n }\n}\n\n/**\n * GET /editor/builder/settings\n *\n * Returns the agent builder settings configured by the admin.\n * Used by frontend to determine which features to display.\n */\nexport const GET_EDITOR_BUILDER_SETTINGS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/settings',\n responseType: 'json',\n responseSchema: builderSettingsResponseSchema,\n summary: 'Get agent builder settings',\n description: 'Returns the agent builder feature flags and configuration for UI gating',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n const editor = mastra.getEditor();\n\n // No editor configured\n if (!editor) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Editor doesn't support builder (older version or OSS)\n if (typeof editor.resolveBuilder !== 'function') {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Check if builder is enabled in config\n if (!editor.hasEnabledBuilderConfig?.()) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Resolve the builder instance\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];\n const configuration = builder.getConfiguration();\n\n // Picker allowlists are written against entity `.id` (what users see in\n // the UI, URLs, traces). The client filters list responses by their\n // response keys, which are not always `.id`:\n // - GET /agents keys by `agent.id`\n // - GET /tools keys by registration key (values include `id`)\n // - GET /workflows keys by registration key (values omit `id`)\n // To keep the client filter simple, we accept `.id` (fallback to\n // registration key) for matching, but emit visible IDs as response keys\n // so `Object.keys(data)` lines up.\n type AliasPair = { id: string; key: string };\n const collectAliases = (registry: Record<string, unknown>): AliasPair[] =>\n Object.entries(registry).map(([key, entity]) => ({\n id: (entity as { id?: string }).id || key,\n key,\n }));\n\n const toolAliases = collectAliases(mastra.listTools() ?? {});\n const agentAliases = collectAliases(mastra.listAgents() ?? {});\n const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});\n\n // Tools/workflows responses are keyed by registration key. Agents\n // response is keyed by `.id`.\n const toResponseKey = (aliases: AliasPair[], byId: 'id' | 'key') => {\n const map = new Map<string, string>();\n for (const a of aliases) {\n map.set(a.id, byId === 'id' ? a.id : a.key);\n map.set(a.key, byId === 'id' ? a.id : a.key);\n }\n return map;\n };\n const toolKeyMap = toResponseKey(toolAliases, 'key');\n const agentKeyMap = toResponseKey(agentAliases, 'id');\n const workflowKeyMap = toResponseKey(workflowAliases, 'key');\n\n // Lazy-load the EE subpath so this module remains importable on\n // `@mastra/core` versions that pre-date it (added in core 1.34.0).\n // We only reach here after `builder.enabled` is true, which guarantees\n // a compatible core.\n const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');\n\n const picker = resolvePickerVisibility({\n config: configuration?.agent,\n registeredToolIds: toolAliases.flatMap(a => [a.id, a.key]),\n registeredAgentIds: agentAliases.flatMap(a => [a.id, a.key]),\n registeredWorkflowIds: workflowAliases.flatMap(a => [a.id, a.key]),\n });\n\n const normalize = (visible: string[] | null, map: Map<string, string>): string[] | null => {\n if (visible === null) return null;\n const out: string[] = [];\n const seen = new Set<string>();\n for (const id of visible) {\n const mapped = map.get(id);\n if (mapped && !seen.has(mapped)) {\n seen.add(mapped);\n out.push(mapped);\n }\n }\n return out;\n };\n\n const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];\n\n return {\n enabled: true,\n features: builder.getFeatures(),\n configuration,\n modelPolicy: builderToModelPolicy(builder),\n picker: {\n visibleTools: normalize(picker.visibleTools, toolKeyMap),\n visibleAgents: normalize(picker.visibleAgents, agentKeyMap),\n visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap),\n },\n ...(modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}),\n };\n } catch (error) {\n return handleError(error, 'Error getting builder settings');\n }\n },\n});\n\n/**\n * GET /editor/builder/models/available\n *\n * Returns the configured AI providers/models the agent builder may use. The\n * server is the single authority: it scopes the list to providers with a\n * configured API key (`connected`) and applies the active builder model\n * policy via `isModelAllowed`, so the Studio surfaces can render the response\n * verbatim without importing any EE matcher into the browser.\n *\n * - Providers without a configured API key are always omitted — the builder\n * decides the agent's model from this list, so an unconnected provider would\n * produce an agent that can never run.\n * - Policy inactive (or no allowlist) ⇒ all connected providers are returned.\n * - Policy active with an allowlist ⇒ each connected provider's models are\n * filtered, and providers left with no allowed models are omitted entirely.\n */\nexport const GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/models/available',\n responseType: 'json',\n responseSchema: builderAvailableModelsResponseSchema,\n summary: 'List builder-available AI models',\n description: 'Returns AI providers/models filtered by the active agent-builder model policy.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n // Only surface providers whose API key is configured (`connected`). The\n // agent builder decides the agent's model from this list, so including\n // providers without a key lets it pick a model that can never run. We\n // scope to connected providers so every choice is actually usable.\n const providers = (await buildProvidersList(mastra)).filter(provider => provider.connected);\n const policy = await resolveBuilderModelPolicy(mastra.getEditor());\n\n // Inactive policy (or no allowlist) ⇒ no allowlist filtering to apply.\n if (!policy.active || !policy.allowed || policy.allowed.length === 0) {\n return { providers };\n }\n\n // Lazy-load the EE matcher (server-only); mirrors the convention used by\n // resolve-builder-model-policy and the settings handler.\n const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');\n\n const filtered = providers\n .map(provider => ({\n ...provider,\n models: provider.models.filter(modelId => isModelAllowed(policy.allowed, { provider: provider.id, modelId })),\n }))\n .filter(provider => provider.models.length > 0);\n\n return { providers: filtered };\n } catch (error) {\n return handleError(error, 'Error fetching available models');\n }\n },\n});\n\n/**\n * GET /editor/builder/infrastructure\n *\n * Returns the runtime status of Mastra-opinionated primitives (channels,\n * browser providers, workspaces). Admin-only; surfaced in Studio Settings so\n * admins can sanity-check what's wired up to the running server.\n */\nexport const GET_INFRASTRUCTURE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/infrastructure',\n responseType: 'json',\n responseSchema: infrastructureStatusResponseSchema,\n summary: 'Get infrastructure status',\n description: 'Agent Builder infrastructure configuration and lightweight runtime status.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'infrastructure:read',\n handler: async ({ mastra }) => {\n try {\n const formatConfigValue = (value: unknown): string => {\n if (value === null || value === undefined) return 'not set';\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? '' : 's'}`;\n return value.constructor?.name && value.constructor.name !== 'Object' ? value.constructor.name : 'configured';\n };\n\n const getProviderName = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'object' && 'provider' in value && typeof value.provider === 'string')\n return value.provider;\n if (typeof value === 'object' && 'constructor' in value) {\n const name = (value as { constructor?: { name?: string } }).constructor?.name;\n return name && name !== 'Object' ? name : 'configured';\n }\n return null;\n };\n\n const getConfigEntries = (config: Record<string, unknown>, omittedKeys: string[] = []) =>\n Object.entries(config)\n .filter(([key, value]) => !omittedKeys.includes(key) && value !== undefined && value !== null)\n .map(([key, value]) => ({ key, value: formatConfigValue(value) }));\n\n const channelProviders = mastra.getChannelProviders() ?? {};\n const channels: InfrastructureStatus['channels'] = {\n providers: Object.entries(channelProviders)\n .map(([id, provider]) => {\n const info = provider.getInfo?.();\n const routes = provider.getRoutes?.() ?? [];\n return {\n id: info?.id ?? id,\n name: info?.name ?? id,\n isConfigured: info?.isConfigured ?? false,\n routeCount: routes.length,\n };\n })\n .filter(provider => provider.isConfigured),\n };\n\n const editor = mastra.getEditor();\n let browser: InfrastructureStatus['browser'] = {\n type: null,\n provider: null,\n env: null,\n registered: false,\n availableProviders: [],\n config: [],\n };\n let workspace: InfrastructureStatus['workspace'] = {\n type: null,\n workspaceId: null,\n name: null,\n source: null,\n registered: false,\n hasFilesystem: false,\n hasSandbox: false,\n filesystemProvider: null,\n sandboxProvider: null,\n config: [],\n };\n let registries: InfrastructureStatus['registries'] = {\n skillsSh: { enabled: false },\n };\n\n if (editor?.resolveBuilder) {\n const browsers = (editor as unknown as { __browsers?: Map<string, unknown> }).__browsers;\n const builder = await editor.resolveBuilder();\n const builderRegistries = builder?.getRegistries?.();\n registries = {\n skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true },\n };\n const configuration = builder?.getConfiguration?.()?.agent as\n | {\n browser?: { type?: string; config?: { provider?: string; env?: string } };\n workspace?: {\n type?: string;\n workspaceId?: string;\n config?: { name?: string; filesystem?: unknown; sandbox?: unknown };\n };\n }\n | undefined;\n\n const browserRef = configuration?.browser;\n const browserConfig = browserRef?.config ?? {};\n const providerId = browserConfig.provider ?? null;\n browser = {\n type: browserRef?.type ?? null,\n provider: providerId,\n env: browserConfig.env ?? null,\n registered: providerId ? !!browsers?.has(providerId) : false,\n availableProviders: browsers ? Array.from(browsers.keys()) : [],\n config: getConfigEntries(browserConfig, ['provider', 'env']),\n };\n\n const workspaceRef = configuration?.workspace;\n const workspaceConfig = workspaceRef?.config ?? {};\n const registeredWorkspaces = mastra.listWorkspaces();\n const registeredWorkspace = workspaceRef?.workspaceId\n ? registeredWorkspaces[workspaceRef.workspaceId]\n : undefined;\n const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;\n const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;\n const filesystemConfig =\n typeof workspaceConfig.filesystem === 'object' &&\n workspaceConfig.filesystem &&\n 'config' in workspaceConfig.filesystem\n ? (workspaceConfig.filesystem.config as Record<string, unknown>)\n : {};\n const sandboxConfig =\n typeof workspaceConfig.sandbox === 'object' && workspaceConfig.sandbox && 'config' in workspaceConfig.sandbox\n ? (workspaceConfig.sandbox.config as Record<string, unknown>)\n : {};\n workspace = {\n type: workspaceRef?.type ?? null,\n workspaceId: workspaceRef?.workspaceId ?? null,\n name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,\n source: registeredWorkspace?.source ?? null,\n registered: !!registeredWorkspace,\n hasFilesystem: !!filesystem,\n hasSandbox: !!sandbox,\n filesystemProvider: getProviderName(filesystem),\n sandboxProvider: getProviderName(sandbox),\n config: [\n ...getConfigEntries(filesystemConfig).map(entry => ({ ...entry, key: `filesystem.${entry.key}` })),\n ...getConfigEntries(sandboxConfig).map(entry => ({ ...entry, key: `sandbox.${entry.key}` })),\n ],\n };\n }\n\n return { channels, browser, workspace, registries };\n } catch (error) {\n return handleError(error, 'Error getting infrastructure status');\n }\n },\n});\n"]}
import { listStoredSkillsResponseSchema, listStoredSkillsQuerySchema, getStoredSkillResponseSchema, storedSkillIdPathParams, createStoredSkillResponseSchema, createStoredSkillBodySchema, updateStoredSkillResponseSchema, updateStoredSkillBodySchema, deleteStoredSkillResponseSchema, publishStoredSkillResponseSchema, publishStoredSkillBodySchema } from './chunk-UIRQU4GW.js';
import { stripFavoriteFields, prepareFavoritesEnrichment, enrichOrStripFavorites } from './chunk-QWTUGYUI.js';
import { isBuilderFeatureEnabled } from './chunk-N3D3A56J.js';
import { resolveAuthorFilter, getCallerAuthorId, matchesAuthorFilter, assertReadAccess, assertWriteAccess } from './chunk-56AYHXOU.js';
import { getStoredResourceScope, scopeStoredResourceMetadata, assertStoredResourceScope, toSlug } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { LocalSkillSource } from '@mastra/core/workspace';
var INDEXED_FOLDERS = ["references", "scripts", "assets"];
function extractIndexedPathsFromFiles(files, existing) {
if (!files || files.length === 0) return {};
const root = files.find((n) => n.type === "folder");
if (!root?.children) return {};
const result = {};
for (const folderName of INDEXED_FOLDERS) {
const folder = root.children.find((n) => n.type === "folder" && n.name === folderName);
if (!folder?.children || folder.children.length === 0) continue;
const existingPaths = new Set(existing[folderName] ?? []);
const paths = [...existingPaths];
collectFilePaths(folder.children, folderName, existingPaths, paths);
if (paths.length > 0) {
result[folderName] = paths;
}
}
return result;
}
function collectFilePaths(nodes, prefix, existingPaths, out) {
for (const node of nodes) {
if (node.type === "file") {
const relativePath = `${prefix}/${node.name}`;
if (!existingPaths.has(relativePath)) {
out.push(relativePath);
}
} else if (node.type === "folder" && node.children) {
collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);
}
}
}
var LIST_STORED_SKILLS_ROUTE = createRoute({
method: "GET",
path: "/stored/skills",
responseType: "json",
queryParamSchema: listStoredSkillsQuerySchema,
responseSchema: listStoredSkillsResponseSchema,
summary: "List stored skills",
description: "Returns a paginated list of all skill configurations stored in the database",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
page,
perPage,
orderBy,
status,
authorId,
visibility,
metadata,
favoritedOnly,
pinFavoritedFor
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const filter = resolveAuthorFilter({
requestContext,
resource: "stored-skills",
queryAuthorId: authorId,
queryVisibility: visibility
});
const scope = await getStoredResourceScope(mastra, requestContext);
const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);
const callerId = getCallerAuthorId(requestContext);
const favoritesEnabled = await isBuilderFeatureEnabled(mastra, "favorites");
const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;
const favoriteSubjectId = pinFavoritedFor ?? callerId;
if (honoredStarredOnly) {
const effectivePerPage = perPage ?? 100;
if (!favoriteSubjectId) {
return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new HTTPException(500, { message: "Favorites storage domain is not available" });
}
const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: "skill" });
if (starredIds.length === 0) {
return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };
}
const allMatching = await skillStore.listResolved({
perPage: false,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata,
entityIds: starredIds
});
const visible = allMatching.skills.filter((record) => matchesAuthorFilter(record, filter));
const total = visible.length;
const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;
const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;
const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);
const annotated2 = sliced.map((record) => ({ ...record, isFavorited: true }));
const hasMore = effectivePerPage > 0 && endIdx < total;
return {
skills: annotated2,
total,
page,
perPage: effectivePerPage,
hasMore
};
}
const result = await skillStore.listResolved({
page,
perPage,
orderBy,
status,
authorId: filter.kind === "exact" ? filter.authorId : void 0,
metadata: scopedMetadata
});
const visibleSkills = result.skills.filter((record) => matchesAuthorFilter(record, filter));
if (!favoritesEnabled) {
return { ...result, skills: visibleSkills.map(stripFavoriteFields) };
}
const enrichment = await prepareFavoritesEnrichment(
mastra,
requestContext,
"skill",
visibleSkills.map((s) => s.id)
);
const annotated = enrichment ? visibleSkills.map((record) => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) })) : visibleSkills.map(stripFavoriteFields);
return { ...result, skills: annotated };
} catch (error) {
return handleError(error, "Error listing stored skills");
}
}
});
var GET_STORED_SKILL_ROUTE = createRoute({
method: "GET",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
responseSchema: getStoredSkillResponseSchema,
summary: "Get stored skill by ID",
description: "Returns a specific skill from storage by its unique identifier (resolved with active version config)",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
return enrichOrStripFavorites(mastra, requestContext, "skill", skill);
} catch (error) {
return handleError(error, "Error getting stored skill");
}
}
});
var CREATE_STORED_SKILL_ROUTE = createRoute({
method: "POST",
path: "/stored/skills",
responseType: "json",
bodySchema: createStoredSkillBodySchema,
responseSchema: createStoredSkillResponseSchema,
summary: "Create stored skill",
description: "Creates a new skill configuration in storage with the provided details",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
id: providedId,
name,
description,
instructions,
license,
compatibility,
source,
references,
scripts,
assets,
files,
metadata,
visibility: bodyVisibility
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const id = providedId || toSlug(name);
if (!id) {
throw new HTTPException(400, {
message: "Could not derive skill ID from name. Please provide an explicit id."
});
}
const existing = await skillStore.getById(id);
if (existing) {
throw new HTTPException(409, { message: `Skill with id ${id} already exists` });
}
const authorId = getCallerAuthorId(requestContext) ?? void 0;
const visibility = authorId ? bodyVisibility ?? "private" : "public";
const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });
await skillStore.create({
skill: {
id,
authorId,
visibility,
name,
description,
instructions,
license,
compatibility,
source,
references: indexedPaths.references ?? references,
scripts: indexedPaths.scripts ?? scripts,
assets: indexedPaths.assets ?? assets,
files,
metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext))
}
});
const resolved = await skillStore.getByIdResolved(id);
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve created skill" });
}
return enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return handleError(error, "Error creating stored skill");
}
}
});
var UPDATE_STORED_SKILL_ROUTE = createRoute({
method: "PATCH",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
bodySchema: updateStoredSkillBodySchema,
responseSchema: updateStoredSkillResponseSchema,
summary: "Update stored skill",
description: "Updates an existing skill in storage with the provided fields",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({
mastra,
requestContext,
storedSkillId,
// Entity-level fields
authorId,
visibility,
// Config fields (snapshot-level)
name,
description,
instructions,
license,
compatibility,
source,
references,
scripts,
assets,
files,
metadata
}) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
const scope = await getStoredResourceScope(mastra, requestContext);
assertStoredResourceScope(existing, scope);
assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "edit",
record: existing
});
const callerAuthorId = getCallerAuthorId(requestContext) ?? void 0;
const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? "public" : void 0;
const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};
const update = { id: storedSkillId };
if (authorId !== void 0) update.authorId = authorId;
if (resolvedVisibility !== void 0) update.visibility = resolvedVisibility;
if (name !== void 0) update.name = name;
if (description !== void 0) update.description = description;
if (instructions !== void 0) update.instructions = instructions;
if (license !== void 0) update.license = license;
if (compatibility !== void 0) update.compatibility = compatibility;
if (source !== void 0) update.source = source;
const resolvedReferences = indexedPaths.references ?? references;
const resolvedScripts = indexedPaths.scripts ?? scripts;
const resolvedAssets = indexedPaths.assets ?? assets;
if (resolvedReferences !== void 0) update.references = resolvedReferences;
if (resolvedScripts !== void 0) update.scripts = resolvedScripts;
if (resolvedAssets !== void 0) update.assets = resolvedAssets;
if (files !== void 0) update.files = files;
if (metadata !== void 0) {
update.metadata = scopeStoredResourceMetadata({ ...existing.metadata ?? {}, ...metadata }, scope);
}
await skillStore.update(update);
const resolved = await skillStore.getByIdResolved(storedSkillId);
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve updated skill" });
}
return enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return handleError(error, "Error updating stored skill");
}
}
});
var DELETE_STORED_SKILL_ROUTE = createRoute({
method: "DELETE",
path: "/stored/skills/:storedSkillId",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
responseSchema: deleteStoredSkillResponseSchema,
summary: "Delete stored skill",
description: "Deletes a skill from storage by its unique identifier",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));
assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "delete",
record: existing
});
await skillStore.delete(storedSkillId);
try {
const favoritesStore = await storage.getStore("favorites");
await favoritesStore?.deleteFavoritesForEntity({ entityType: "skill", entityId: storedSkillId });
} catch (cascadeError) {
mastra.getLogger?.()?.warn?.("Failed to cascade-delete favorites for skill", { storedSkillId, error: cascadeError });
}
return {
success: true,
message: `Skill ${storedSkillId} deleted successfully`
};
} catch (error) {
return handleError(error, "Error deleting stored skill");
}
}
});
var PUBLISH_STORED_SKILL_ROUTE = createRoute({
method: "POST",
path: "/stored/skills/:storedSkillId/publish",
responseType: "json",
pathParamSchema: storedSkillIdPathParams,
bodySchema: publishStoredSkillBodySchema,
responseSchema: publishStoredSkillResponseSchema,
summary: "Publish stored skill",
description: "Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published",
tags: ["Stored Skills"],
requiresAuth: true,
handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {
try {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new HTTPException(500, { message: "Skills storage domain is not available" });
}
const blobStore = await storage.getStore("blobs");
if (!blobStore) {
throw new HTTPException(500, { message: "Blob storage domain is not available" });
}
const existing = await skillStore.getByIdResolved(storedSkillId);
if (!existing) {
throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));
assertWriteAccess({
requestContext,
resource: "stored-skills",
resourceId: storedSkillId,
action: "edit",
record: existing
});
const path = await import('path');
const fs = await import('fs/promises');
const resolvedPath = path.default.resolve(skillPath);
const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());
if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {
throw new HTTPException(400, {
message: `skillPath must be within the allowed directory: ${allowedBase}`
});
}
try {
const stat = await fs.stat(resolvedPath);
if (!stat.isDirectory()) {
throw new HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });
}
} catch (err) {
if (err instanceof HTTPException) throw err;
if (err?.code === "ENOENT") {
throw new HTTPException(400, {
message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`
});
}
throw err;
}
try {
await fs.stat(path.default.join(resolvedPath, "SKILL.md"));
} catch (err) {
if (err?.code === "ENOENT") {
throw new HTTPException(400, {
message: `skillPath is missing SKILL.md: ${resolvedPath}`
});
}
throw err;
}
const source = new LocalSkillSource();
const { publishSkillFromSource } = await import('@mastra/core/workspace');
const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);
const snapshotUpdate = {};
for (const [key, value] of Object.entries(snapshot)) {
if (value !== void 0) snapshotUpdate[key] = value;
}
await skillStore.update({
id: storedSkillId,
...snapshotUpdate,
tree,
files,
status: "published"
});
const latestVersion = await skillStore.getLatestVersion(storedSkillId);
if (latestVersion) {
await skillStore.update({
id: storedSkillId,
activeVersionId: latestVersion.id
});
}
const resolved = await skillStore.getByIdResolved(storedSkillId);
if (!resolved) {
throw new HTTPException(500, { message: "Failed to resolve skill after publish" });
}
return enrichOrStripFavorites(mastra, requestContext, "skill", resolved);
} catch (error) {
return handleError(error, "Error publishing stored skill");
}
}
});
export { CREATE_STORED_SKILL_ROUTE, DELETE_STORED_SKILL_ROUTE, GET_STORED_SKILL_ROUTE, LIST_STORED_SKILLS_ROUTE, PUBLISH_STORED_SKILL_ROUTE, UPDATE_STORED_SKILL_ROUTE };
//# sourceMappingURL=chunk-PC73QIVI.js.map
//# sourceMappingURL=chunk-PC73QIVI.js.map
{"version":3,"sources":["../src/server/handlers/stored-skills.ts"],"names":["annotated"],"mappings":"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","file":"chunk-PC73QIVI.js","sourcesContent":["import type { StorageSkillFileNode } from '@mastra/core/storage';\nimport { LocalSkillSource } from '@mastra/core/workspace';\n\nimport { HTTPException } from '../http-exception';\nimport {\n storedSkillIdPathParams,\n listStoredSkillsQuerySchema,\n createStoredSkillBodySchema,\n updateStoredSkillBodySchema,\n publishStoredSkillBodySchema,\n listStoredSkillsResponseSchema,\n getStoredSkillResponseSchema,\n createStoredSkillResponseSchema,\n updateStoredSkillResponseSchema,\n deleteStoredSkillResponseSchema,\n publishStoredSkillResponseSchema,\n} from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { toSlug, assertStoredResourceScope, getStoredResourceScope, scopeStoredResourceMetadata } from '../utils';\n\nimport {\n assertReadAccess,\n assertWriteAccess,\n getCallerAuthorId,\n matchesAuthorFilter,\n resolveAuthorFilter,\n} from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\nimport { handleError } from './error';\nimport { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields } from './favorites-enrichment';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Well-known folder names in the skill file tree whose children represent\n * indexable path arrays (references, scripts, assets).\n */\nconst INDEXED_FOLDERS = ['references', 'scripts', 'assets'] as const;\n\n/**\n * Walks the `files` tree and collects relative file paths for each well-known\n * folder (references, scripts, assets). Returned arrays only include entries\n * that are not already present in any explicitly-provided arrays so callers\n * can pass both `files` and `references` without creating duplicates.\n */\nfunction extractIndexedPathsFromFiles(\n files: StorageSkillFileNode[] | undefined,\n existing: {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n },\n): {\n references?: string[];\n scripts?: string[];\n assets?: string[];\n} {\n if (!files || files.length === 0) return {};\n\n // Find the root folder (first folder node, usually id=\"root\")\n const root = files.find(n => n.type === 'folder');\n if (!root?.children) return {};\n\n const result: Record<string, string[]> = {};\n\n for (const folderName of INDEXED_FOLDERS) {\n const folder = root.children.find(n => n.type === 'folder' && n.name === folderName);\n if (!folder?.children || folder.children.length === 0) continue;\n\n const existingPaths = new Set(existing[folderName] ?? []);\n const paths: string[] = [...existingPaths];\n\n collectFilePaths(folder.children, folderName, existingPaths, paths);\n\n if (paths.length > 0) {\n result[folderName] = paths;\n }\n }\n\n return result;\n}\n\n/** Recursively collects file paths from a subtree, building relative paths. */\nfunction collectFilePaths(\n nodes: StorageSkillFileNode[],\n prefix: string,\n existingPaths: Set<string>,\n out: string[],\n): void {\n for (const node of nodes) {\n if (node.type === 'file') {\n const relativePath = `${prefix}/${node.name}`;\n if (!existingPaths.has(relativePath)) {\n out.push(relativePath);\n }\n } else if (node.type === 'folder' && node.children) {\n collectFilePaths(node.children, `${prefix}/${node.name}`, existingPaths, out);\n }\n }\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /stored/skills - List all stored skills\n */\nexport const LIST_STORED_SKILLS_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills',\n responseType: 'json',\n queryParamSchema: listStoredSkillsQuerySchema,\n responseSchema: listStoredSkillsResponseSchema,\n summary: 'List stored skills',\n description: 'Returns a paginated list of all skill configurations stored in the database',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n page,\n perPage,\n orderBy,\n status,\n authorId,\n visibility,\n metadata,\n favoritedOnly,\n pinFavoritedFor,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const filter = resolveAuthorFilter({\n requestContext,\n resource: 'stored-skills',\n queryAuthorId: authorId,\n queryVisibility: visibility,\n });\n\n const scope = await getStoredResourceScope(mastra, requestContext);\n const scopedMetadata = scopeStoredResourceMetadata(metadata, scope);\n\n const callerId = getCallerAuthorId(requestContext);\n const favoritesEnabled = await isBuilderFeatureEnabled(mastra, 'favorites');\n const honoredStarredOnly = favoritesEnabled && favoritedOnly === true;\n const favoriteSubjectId = pinFavoritedFor ?? callerId;\n\n // `?favoritedOnly=true` flow: fetch caller's favorited IDs, restrict the list\n // to that set, then post-filter by visibility and recompute total/pages.\n if (honoredStarredOnly) {\n const effectivePerPage: number = perPage ?? 100;\n if (!favoriteSubjectId) {\n // Caller cannot have favorited anything without an identity.\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n const starredIds = await favoritesStore.listFavoritedIds({ userId: favoriteSubjectId, entityType: 'skill' });\n if (starredIds.length === 0) {\n return { skills: [], total: 0, page, perPage: effectivePerPage, hasMore: false };\n }\n const allMatching = await skillStore.listResolved({\n perPage: false,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n entityIds: starredIds,\n });\n const visible = allMatching.skills.filter(record => matchesAuthorFilter(record, filter));\n const total = visible.length;\n const startIdx = effectivePerPage === 0 ? 0 : page * effectivePerPage;\n const endIdx = effectivePerPage === 0 ? 0 : startIdx + effectivePerPage;\n const sliced = effectivePerPage === 0 ? [] : visible.slice(startIdx, endIdx);\n const annotated = sliced.map(record => ({ ...record, isFavorited: true }));\n const hasMore = effectivePerPage > 0 && endIdx < total;\n return {\n skills: annotated,\n total,\n page,\n perPage: effectivePerPage,\n hasMore,\n };\n }\n\n const result = await skillStore.listResolved({\n page,\n perPage,\n orderBy,\n status,\n authorId: filter.kind === 'exact' ? filter.authorId : undefined,\n metadata: scopedMetadata,\n });\n\n // Post-filter to enforce ownership + visibility rules across all backends.\n // Storage adapters can only do an equality filter on authorId, so we apply\n // the ownedOrPublic / publicOnly logic here.\n // Note: `result.total` / `result.hasMore` reflect the storage-reported\n // count before this post-filter. For `unrestricted` / `exact` filters\n // nothing is removed; for `ownedOrPublic` / `publicOnly`, downstream UIs\n // should treat the filter as a view over the caller's scope — an\n // approximation is OK and preserves pagination math.\n const visibleSkills = result.skills.filter(record => matchesAuthorFilter(record, filter));\n\n if (!favoritesEnabled) {\n return { ...result, skills: visibleSkills.map(stripFavoriteFields) };\n }\n\n const enrichment = await prepareFavoritesEnrichment(\n mastra,\n requestContext,\n 'skill',\n visibleSkills.map(s => s.id),\n );\n const annotated = enrichment\n ? visibleSkills.map(record => ({ ...record, isFavorited: enrichment.starredIds.has(record.id) }))\n : visibleSkills.map(stripFavoriteFields);\n\n return { ...result, skills: annotated };\n } catch (error) {\n return handleError(error, 'Error listing stored skills');\n }\n },\n});\n\n/**\n * GET /stored/skills/:storedSkillId - Get a stored skill by ID\n */\nexport const GET_STORED_SKILL_ROUTE = createRoute({\n method: 'GET',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: getStoredSkillResponseSchema,\n summary: 'Get stored skill by ID',\n description: 'Returns a specific skill from storage by its unique identifier (resolved with active version config)',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', skill);\n } catch (error) {\n return handleError(error, 'Error getting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills - Create a new stored skill\n */\nexport const CREATE_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills',\n responseType: 'json',\n bodySchema: createStoredSkillBodySchema,\n responseSchema: createStoredSkillResponseSchema,\n summary: 'Create stored skill',\n description: 'Creates a new skill configuration in storage with the provided details',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n id: providedId,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n visibility: bodyVisibility,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Derive ID from name if not explicitly provided\n const id = providedId || toSlug(name);\n\n if (!id) {\n throw new HTTPException(400, {\n message: 'Could not derive skill ID from name. Please provide an explicit id.',\n });\n }\n\n // Check if skill with this ID already exists\n const existing = await skillStore.getById(id);\n if (existing) {\n throw new HTTPException(409, { message: `Skill with id ${id} already exists` });\n }\n\n // Force authorId from the authenticated caller; ignore any body-provided value.\n // No owner = always public (no auth / no user context).\n // With an owner, respect the client's choice, defaulting to 'private'.\n const authorId = getCallerAuthorId(requestContext) ?? undefined;\n const visibility: 'private' | 'public' = authorId ? (bodyVisibility ?? 'private') : 'public';\n\n // Derive references/scripts/assets path arrays from the files tree\n // so agents can discover them via skill_read even when only `files` is provided.\n const indexedPaths = extractIndexedPathsFromFiles(files, { references, scripts, assets });\n\n await skillStore.create({\n skill: {\n id,\n authorId,\n visibility,\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references: indexedPaths.references ?? references,\n scripts: indexedPaths.scripts ?? scripts,\n assets: indexedPaths.assets ?? assets,\n files,\n metadata: scopeStoredResourceMetadata(metadata, await getStoredResourceScope(mastra, requestContext)),\n },\n });\n\n // Return the resolved skill (thin record + version config)\n const resolved = await skillStore.getByIdResolved(id);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve created skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error creating stored skill');\n }\n },\n});\n\n/**\n * PATCH /stored/skills/:storedSkillId - Update a stored skill\n */\nexport const UPDATE_STORED_SKILL_ROUTE = createRoute({\n method: 'PATCH',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: updateStoredSkillBodySchema,\n responseSchema: updateStoredSkillResponseSchema,\n summary: 'Update stored skill',\n description: 'Updates an existing skill in storage with the provided fields',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({\n mastra,\n requestContext,\n storedSkillId,\n // Entity-level fields\n authorId,\n visibility,\n // Config fields (snapshot-level)\n name,\n description,\n instructions,\n license,\n compatibility,\n source,\n references,\n scripts,\n assets,\n files,\n metadata,\n }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n const scope = await getStoredResourceScope(mastra, requestContext);\n assertStoredResourceScope(existing, scope);\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // No owner = always public, regardless of what the client sent.\n const callerAuthorId = getCallerAuthorId(requestContext) ?? undefined;\n const resolvedVisibility = callerAuthorId ? visibility : visibility != null ? 'public' : undefined;\n\n // Derive references/scripts/assets path arrays from the files tree\n const indexedPaths = files ? extractIndexedPathsFromFiles(files, { references, scripts, assets }) : {};\n\n // Update the skill with both entity-level and config-level fields.\n // The storage layer handles separating these into record updates vs\n // new-version creation, but it uses `field in updates` to detect config\n // changes — so we must only include fields the caller actually sent.\n // Forwarding `undefined` keys would trigger a spurious version create\n // and pass `undefined` into the database driver.\n const update: Record<string, unknown> = { id: storedSkillId };\n if (authorId !== undefined) update.authorId = authorId;\n if (resolvedVisibility !== undefined) update.visibility = resolvedVisibility;\n if (name !== undefined) update.name = name;\n if (description !== undefined) update.description = description;\n if (instructions !== undefined) update.instructions = instructions;\n if (license !== undefined) update.license = license;\n if (compatibility !== undefined) update.compatibility = compatibility;\n if (source !== undefined) update.source = source;\n const resolvedReferences = indexedPaths.references ?? references;\n const resolvedScripts = indexedPaths.scripts ?? scripts;\n const resolvedAssets = indexedPaths.assets ?? assets;\n if (resolvedReferences !== undefined) update.references = resolvedReferences;\n if (resolvedScripts !== undefined) update.scripts = resolvedScripts;\n if (resolvedAssets !== undefined) update.assets = resolvedAssets;\n if (files !== undefined) update.files = files;\n if (metadata !== undefined) {\n update.metadata = scopeStoredResourceMetadata({ ...(existing.metadata ?? {}), ...metadata }, scope);\n }\n\n await skillStore.update(update as Parameters<typeof skillStore.update>[0]);\n\n // Return the resolved skill with the updated config\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve updated skill' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error updating stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId - Delete a stored skill\n */\nexport const DELETE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: deleteStoredSkillResponseSchema,\n summary: 'Delete stored skill',\n description: 'Deletes a skill from storage by its unique identifier',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n // Check if skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `skills:delete[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'delete',\n record: existing,\n });\n\n await skillStore.delete(storedSkillId);\n\n // Cascade: drop any favorite rows referencing this skill. Failure must not\n // abort the delete.\n try {\n const favoritesStore = await storage.getStore('favorites');\n await favoritesStore?.deleteFavoritesForEntity({ entityType: 'skill', entityId: storedSkillId });\n } catch (cascadeError) {\n mastra\n .getLogger?.()\n ?.warn?.('Failed to cascade-delete favorites for skill', { storedSkillId, error: cascadeError });\n }\n\n return {\n success: true,\n message: `Skill ${storedSkillId} deleted successfully`,\n };\n } catch (error) {\n return handleError(error, 'Error deleting stored skill');\n }\n },\n});\n\n/**\n * POST /stored/skills/:storedSkillId/publish - Publish a skill from filesystem\n * Walks the skill directory, hashes files into blob store, creates a new version\n * with the tree manifest, and sets activeVersionId.\n */\nexport const PUBLISH_STORED_SKILL_ROUTE = createRoute({\n method: 'POST',\n path: '/stored/skills/:storedSkillId/publish',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n bodySchema: publishStoredSkillBodySchema,\n responseSchema: publishStoredSkillResponseSchema,\n summary: 'Publish stored skill',\n description:\n 'Snapshots the skill directory from the filesystem into content-addressable blob storage, creates a new version with a tree manifest, and marks the skill as published',\n tags: ['Stored Skills'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, storedSkillId, skillPath }) => {\n try {\n const storage = mastra.getStorage();\n\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n\n const blobStore = await storage.getStore('blobs');\n if (!blobStore) {\n throw new HTTPException(500, { message: 'Blob storage domain is not available' });\n }\n\n // Verify skill exists. Skill metadata lives on the resolved snapshot.\n const existing = await skillStore.getByIdResolved(storedSkillId);\n if (!existing) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(existing, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller isn't the owner, admin, or `stored-skills:write[:<id>]` holder.\n assertWriteAccess({\n requestContext,\n resource: 'stored-skills',\n resourceId: storedSkillId,\n action: 'edit',\n record: existing,\n });\n\n // Validate skillPath to prevent path traversal\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n const resolvedPath = path.default.resolve(skillPath);\n const allowedBase = path.default.resolve(process.env.SKILLS_BASE_DIR || process.cwd());\n if (!resolvedPath.startsWith(allowedBase + path.default.sep) && resolvedPath !== allowedBase) {\n throw new HTTPException(400, {\n message: `skillPath must be within the allowed directory: ${allowedBase}`,\n });\n }\n\n // Verify the source directory exists and contains a SKILL.md before attempting\n // to publish, so callers get a 400 with context instead of a raw 500/ENOENT.\n try {\n const stat = await fs.stat(resolvedPath);\n if (!stat.isDirectory()) {\n throw new HTTPException(400, { message: `skillPath is not a directory: ${resolvedPath}` });\n }\n } catch (err) {\n if (err instanceof HTTPException) throw err;\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath does not exist on the server filesystem: ${resolvedPath}. Create the skill directory (with a SKILL.md) before publishing, or use a skill that was materialized to disk.`,\n });\n }\n throw err;\n }\n try {\n await fs.stat(path.default.join(resolvedPath, 'SKILL.md'));\n } catch (err) {\n if ((err as NodeJS.ErrnoException)?.code === 'ENOENT') {\n throw new HTTPException(400, {\n message: `skillPath is missing SKILL.md: ${resolvedPath}`,\n });\n }\n throw err;\n }\n\n // Use LocalSkillSource to read from the server filesystem\n const source = new LocalSkillSource();\n const { publishSkillFromSource } = await import('@mastra/core/workspace');\n\n const { snapshot, tree, files } = await publishSkillFromSource(source, resolvedPath, blobStore);\n\n // Strip undefined keys from the snapshot before passing to update(). The\n // storage layer treats \"field present\" as \"field changed\"; forwarding\n // undefined would overwrite populated columns with undefined and trip\n // NOT NULL / \"undefined cannot be passed as argument\" errors in\n // adapters that bind args raw (libsql, pg).\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 // `files` is the nested folder/file structure shown in the editor; without\n // it the column would stay null and the UI would render an empty tree.\n await skillStore.update({\n id: storedSkillId,\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(storedSkillId);\n if (latestVersion) {\n await skillStore.update({\n id: storedSkillId,\n activeVersionId: latestVersion.id,\n });\n }\n\n const resolved = await skillStore.getByIdResolved(storedSkillId);\n if (!resolved) {\n throw new HTTPException(500, { message: 'Failed to resolve skill after publish' });\n }\n\n return enrichOrStripFavorites(mastra, requestContext, 'skill', resolved);\n } catch (error) {\n return handleError(error, 'Error publishing stored skill');\n }\n },\n});\n"]}
import { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from './chunk-ZA2G7XV3.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { readFileSync } from 'fs';
var SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3e3;
async function getSourceProviderCapabilities(getCapabilities) {
let timeout;
try {
return await Promise.race([
getCapabilities(),
new Promise((_, reject) => {
timeout = setTimeout(
() => reject(new Error("Source provider capabilities timed out")),
SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS
);
})
]);
} finally {
if (timeout) clearTimeout(timeout);
}
}
async function getEditorSourceCapabilities(editor) {
const editorSource = editor.getSource?.();
if (!editorSource) return void 0;
if (editorSource === "db") {
return {
source: editorSource,
storage: "database",
canSave: true,
canOpenChangeRequest: false
};
}
const configuredProvider = editor.getSourceControlProvider?.();
if (configuredProvider) {
const provider = {
id: configuredProvider.id,
displayName: configuredProvider.displayName
};
try {
const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());
return {
source: editorSource,
storage: "source-provider",
provider,
canSave: capabilities.canWrite,
canOpenChangeRequest: capabilities.canOpenChangeRequest,
unavailableReason: capabilities.canWrite ? void 0 : capabilities.reason
};
} catch {
return {
source: editorSource,
storage: "source-provider",
provider,
canSave: false,
canOpenChangeRequest: false,
unavailableReason: "Unable to load source provider capabilities."
};
}
}
const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;
if (sourceProvider) {
return {
source: editorSource,
storage: "source-provider",
provider: {
id: sourceProvider,
displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider
},
canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== "false",
canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === "true"
};
}
const isHosted = process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;
if (isHosted) {
return {
source: editorSource,
storage: "unavailable",
canSave: false,
canOpenChangeRequest: false,
unavailableReason: "Code-source editing requires a source provider in hosted Studio."
};
}
return {
source: editorSource,
storage: "filesystem",
canSave: true,
canOpenChangeRequest: false
};
}
var GET_API_SCHEMA_ROUTE = createRoute({
method: "GET",
path: "/system/api-schema",
responseType: "json",
responseSchema: apiSchemaManifestResponseSchema,
summary: "Get API schema manifest",
description: "Returns the route-contract-derived API schema manifest for the machine-readable CLI",
tags: ["System"],
requiresAuth: true,
handler: async () => {
const { buildApiSchemaManifest } = await import('./api-schema-manifest-Z45VRZSJ.js');
return buildApiSchemaManifest();
}
});
var GET_SYSTEM_PACKAGES_ROUTE = createRoute({
method: "GET",
path: "/system/packages",
responseType: "json",
responseSchema: systemPackagesResponseSchema,
summary: "Get installed Mastra packages",
description: "Returns a list of all installed Mastra packages and their versions from the project",
tags: ["System"],
requiresAuth: true,
handler: async ({ mastra }) => {
try {
const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;
let packages = [];
if (packagesFilePath) {
try {
const fileContent = readFileSync(packagesFilePath, "utf-8");
packages = JSON.parse(fileContent);
} catch {
packages = [];
}
}
const storage = mastra.getStorage();
const storageType = storage?.name;
const observabilityStorage = storage?.stores?.observability;
const observabilityStorageType = observabilityStorage?.constructor.name;
const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;
const observabilityEnabled = !!mastra.observability.getDefaultInstance();
const editor = mastra.getEditor();
const editorSource = editor?.getSource?.();
const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : void 0;
return {
packages,
isDev: process.env.MASTRA_DEV === "true",
cmsEnabled: !!editor,
editorSource,
editorSourceCapabilities,
observabilityEnabled,
storageType,
observabilityStorageType,
observabilityRuntimeStrategy
};
} catch (error) {
return handleError(error, "Error getting system packages");
}
}
});
export { GET_API_SCHEMA_ROUTE, GET_SYSTEM_PACKAGES_ROUTE };
//# sourceMappingURL=chunk-Q5RXMLH2.js.map
//# sourceMappingURL=chunk-Q5RXMLH2.js.map
{"version":3,"sources":["../src/server/handlers/system.ts"],"names":[],"mappings":"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","file":"chunk-Q5RXMLH2.js","sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport type { MastraPackage } from '../schemas/system';\nimport { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from '../schemas/system';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\nconst SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3000;\n\nasync function getSourceProviderCapabilities(\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n getCapabilities(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error('Source provider capabilities timed out')),\n SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS,\n );\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nasync function getEditorSourceCapabilities(editor: {\n getSource?: () => 'code' | 'db' | undefined;\n getSourceControlProvider?: () =>\n | {\n id: string;\n displayName: string;\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>;\n }\n | undefined;\n}) {\n const editorSource = editor.getSource?.();\n if (!editorSource) return undefined;\n\n if (editorSource === 'db') {\n return {\n source: editorSource,\n storage: 'database' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n }\n\n const configuredProvider = editor.getSourceControlProvider?.();\n if (configuredProvider) {\n const provider = {\n id: configuredProvider.id,\n displayName: configuredProvider.displayName,\n };\n try {\n const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: capabilities.canWrite,\n canOpenChangeRequest: capabilities.canOpenChangeRequest,\n unavailableReason: capabilities.canWrite ? undefined : capabilities.reason,\n };\n } catch {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Unable to load source provider capabilities.',\n };\n }\n }\n\n const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;\n\n if (sourceProvider) {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider: {\n id: sourceProvider,\n displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider,\n },\n canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== 'false',\n canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === 'true',\n };\n }\n\n const isHosted =\n process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;\n\n if (isHosted) {\n return {\n source: editorSource,\n storage: 'unavailable' as const,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Code-source editing requires a source provider in hosted Studio.',\n };\n }\n\n return {\n source: editorSource,\n storage: 'filesystem' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n}\n\nexport const GET_API_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/system/api-schema',\n responseType: 'json',\n responseSchema: apiSchemaManifestResponseSchema,\n summary: 'Get API schema manifest',\n description: 'Returns the route-contract-derived API schema manifest for the machine-readable CLI',\n tags: ['System'],\n requiresAuth: true,\n handler: async () => {\n // Dynamic import to avoid circular dependency issues\n const { buildApiSchemaManifest } = await import('../server-adapter/api-schema-manifest');\n return buildApiSchemaManifest();\n },\n});\n\nexport const GET_SYSTEM_PACKAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/system/packages',\n responseType: 'json',\n responseSchema: systemPackagesResponseSchema,\n summary: 'Get installed Mastra packages',\n description: 'Returns a list of all installed Mastra packages and their versions from the project',\n tags: ['System'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;\n\n let packages: MastraPackage[] = [];\n\n if (packagesFilePath) {\n try {\n const fileContent = readFileSync(packagesFilePath, 'utf-8');\n packages = JSON.parse(fileContent);\n } catch {\n packages = [];\n }\n }\n\n const storage = mastra.getStorage();\n const storageType = storage?.name;\n const observabilityStorage = storage?.stores?.observability;\n const observabilityStorageType = observabilityStorage?.constructor.name;\n const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;\n const observabilityEnabled = !!mastra.observability.getDefaultInstance();\n\n const editor = mastra.getEditor();\n const editorSource = editor?.getSource?.();\n const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : undefined;\n\n return {\n packages,\n isDev: process.env.MASTRA_DEV === 'true',\n cmsEnabled: !!editor,\n editorSource,\n editorSourceCapabilities,\n observabilityEnabled,\n storageType,\n observabilityStorageType,\n observabilityRuntimeStrategy,\n };\n } catch (error) {\n return handleError(error, 'Error getting system packages');\n }\n },\n});\n"]}
import { isBuilderFeatureEnabled } from './chunk-N3D3A56J.js';
import { getCallerAuthorId } from './chunk-56AYHXOU.js';
// src/server/handlers/favorites-enrichment.ts
async function prepareFavoritesEnrichment(mastra, requestContext, entityType, entityIds) {
if (!await isBuilderFeatureEnabled(mastra, "favorites")) return null;
const userId = getCallerAuthorId(requestContext);
if (!userId) return null;
const storage = mastra.getStorage();
if (!storage) return null;
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) return null;
const starredIds = entityIds.length === 0 ? /* @__PURE__ */ new Set() : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });
return { userId, starredIds, favoritesStore };
}
function stripFavoriteFields(record) {
if ("isFavorited" in record || "favoriteCount" in record) {
const copy = { ...record };
delete copy.isFavorited;
delete copy.favoriteCount;
return copy;
}
return record;
}
async function enrichOrStripFavorites(mastra, requestContext, entityType, record) {
const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);
if (enrichment) {
return { ...record, isFavorited: enrichment.starredIds.has(record.id) };
}
return stripFavoriteFields(record);
}
export { enrichOrStripFavorites, prepareFavoritesEnrichment, stripFavoriteFields };
//# sourceMappingURL=chunk-QWTUGYUI.js.map
//# sourceMappingURL=chunk-QWTUGYUI.js.map
{"version":3,"sources":["../src/server/handlers/favorites-enrichment.ts"],"names":[],"mappings":";;;;AAyBA,eAAsB,0BAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,SAAA,EACqC;AACrC,EAAA,IAAI,CAAE,MAAM,uBAAA,CAAwB,MAAA,EAAQ,WAAW,GAAI,OAAO,IAAA;AAElE,EAAA,MAAM,MAAA,GAAS,kBAAkB,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AACzD,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAE5B,EAAA,MAAM,UAAA,GACJ,SAAA,CAAU,MAAA,KAAW,CAAA,uBACb,GAAA,EAAY,GAChB,MAAM,cAAA,CAAe,gBAAA,CAAiB,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAA;AAC7E,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,cAAA,EAAe;AAC9C;AAMO,SAAS,oBAAsC,MAAA,EAAc;AAClE,EAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,eAAA,IAAmB,MAAA,EAAQ;AACxD,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AACZ,IAAA,OAAO,IAAA,CAAK,aAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AASA,eAAsB,sBAAA,CACpB,MAAA,EACA,cAAA,EACA,UAAA,EACA,MAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,MAAM,0BAAA,CAA2B,MAAA,EAAQ,gBAAgB,UAAA,EAAY,CAAC,MAAA,CAAO,EAAE,CAAC,CAAA;AACnG,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,WAAW,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,EACxE;AACA,EAAA,OAAO,oBAAoB,MAAM,CAAA;AACnC","file":"chunk-QWTUGYUI.js","sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { FavoritesStorage, StorageFavoriteEntityType } from '@mastra/core/storage';\n\nimport { getCallerAuthorId } from './authorship';\nimport { isBuilderFeatureEnabled } from './editor-builder';\n\n/**\n * Result of `prepareFavoritesEnrichment` — `null` when the `favorites` EE feature is off.\n * When non-null the caller may use `starredIds` to set `isFavorited` on records\n * and may pass `userId` along to storage list paths for pin-favorited-first\n * sorting (`pinFavoritedFor`).\n */\nexport type FavoritesEnrichmentContext = {\n userId: string;\n starredIds: Set<string>;\n favoritesStore: FavoritesStorage;\n} | null;\n\n/**\n * Resolve the EE feature flag plus the caller's favorited set for a list of\n * candidate entity IDs in one shot. Soft-gated: returns `null` if the feature\n * is off or there's no caller — handlers should drop `isFavorited` / `favoriteCount`\n * fields and ignore `?favoritedOnly=true` in that case.\n */\nexport async function prepareFavoritesEnrichment(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n entityIds: string[],\n): Promise<FavoritesEnrichmentContext> {\n if (!(await isBuilderFeatureEnabled(mastra, 'favorites'))) return null;\n\n const userId = getCallerAuthorId(requestContext);\n if (!userId) return null;\n\n const storage = mastra.getStorage();\n if (!storage) return null;\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) return null;\n\n const starredIds =\n entityIds.length === 0\n ? new Set<string>()\n : await favoritesStore.isFavoritedBatch({ userId, entityType, entityIds });\n return { userId, starredIds, favoritesStore };\n}\n\n/**\n * Strip the favorites EE fields from a record. Used when the feature is off so\n * stale values from storage do not leak through the API.\n */\nexport function stripFavoriteFields<T extends object>(record: T): T {\n if ('isFavorited' in record || 'favoriteCount' in record) {\n const copy = { ...record } as Record<string, unknown>;\n delete copy.isFavorited;\n delete copy.favoriteCount;\n return copy as T;\n }\n return record;\n}\n\n/**\n * Convenience for single-entity handlers (GET / POST / PATCH): annotate\n * `isFavorited` from the caller's favorites set when enrichment is available,\n * otherwise strip both favorite fields. `favoriteCount` is the canonical\n * mirrored counter and is left in place so callers can render share-count UI\n * (it's identical across viewers).\n */\nexport async function enrichOrStripFavorites<T extends { id: string }>(\n mastra: Mastra,\n requestContext: RequestContext,\n entityType: StorageFavoriteEntityType,\n record: T,\n): Promise<T> {\n const enrichment = await prepareFavoritesEnrichment(mastra, requestContext, entityType, [record.id]);\n if (enrichment) {\n return { ...record, isFavorited: enrichment.starredIds.has(record.id) };\n }\n return stripFavoriteFields(record);\n}\n"]}
'use strict';
var chunkCXAJPAJ2_cjs = require('./chunk-CXAJPAJ2.cjs');
var chunkUNXPZBTJ_cjs = require('./chunk-UNXPZBTJ.cjs');
var chunk4ZHHKMDQ_cjs = require('./chunk-4ZHHKMDQ.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
var util = require('util');
var a2a = require('@mastra/core/a2a');
var v4 = require('zod/v4');
var crypto2 = require('crypto');
var promises = require('dns/promises');
var http = require('http');
var https = require('https');
var net = require('net');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var crypto2__namespace = /*#__PURE__*/_interopNamespace(crypto2);
// ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js
var require_canonicalize = chunkO7I5CWRX_cjs.__commonJS({
"../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js"(exports, module) {
module.exports = function serialize(object) {
if (object === null || typeof object !== "object" || object.toJSON != null) {
return JSON.stringify(object);
}
if (Array.isArray(object)) {
return "[" + object.reduce((t, cv, ci) => {
const comma = ci === 0 ? "" : ",";
const value = cv === void 0 || typeof cv === "symbol" ? null : cv;
return t + comma + serialize(value);
}, "") + "]";
}
return "{" + Object.keys(object).sort().reduce((t, cv, ci) => {
if (object[cv] === void 0 || typeof object[cv] === "symbol") {
return t;
}
const comma = t.length === 0 ? "" : ",";
return t + comma + serialize(cv) + ":" + serialize(object[cv]);
}, "") + "}";
};
}
});
// src/server/handlers/a2a.ts
var a2a_exports = {};
chunkO7I5CWRX_cjs.__export(a2a_exports, {
AGENT_EXECUTION_ROUTE: () => AGENT_EXECUTION_ROUTE,
GET_AGENT_CARD_ROUTE: () => GET_AGENT_CARD_ROUTE,
getAgentCardByIdHandler: () => getAgentCardByIdHandler,
getAgentExecutionHandler: () => getAgentExecutionHandler,
handleDeleteTaskPushNotificationConfig: () => handleDeleteTaskPushNotificationConfig,
handleGetTaskPushNotificationConfig: () => handleGetTaskPushNotificationConfig,
handleListTaskPushNotificationConfig: () => handleListTaskPushNotificationConfig,
handleMessageSend: () => handleMessageSend,
handleMessageStream: () => handleMessageStream,
handleSetTaskPushNotificationConfig: () => handleSetTaskPushNotificationConfig,
handleTaskCancel: () => handleTaskCancel,
handleTaskGet: () => handleTaskGet,
handleTaskResubscribe: () => handleTaskResubscribe
});
// src/server/a2a/agent-card-signing.ts
var import_canonicalize = chunkO7I5CWRX_cjs.__toESM(require_canonicalize(), 1);
var SUPPORTED_JWS_ALGORITHMS = /* @__PURE__ */ new Set([
"ES256",
"ES384",
"ES512",
"RS256",
"RS384",
"RS512",
"PS256",
"PS384",
"PS512"
]);
function stripAgentCardSignatures(agentCard) {
const unsignedCard = structuredClone(agentCard);
delete unsignedCard.signatures;
return unsignedCard;
}
function importSigningKey(signing) {
const { privateKey } = signing;
if (typeof privateKey === "string") {
return crypto2__namespace.createPrivateKey(privateKey);
}
return crypto2__namespace.createPrivateKey({
key: privateKey,
format: "jwk"
});
}
function getProtectedHeader(signing) {
const { alg, ...rest } = signing.protectedHeader;
if (!SUPPORTED_JWS_ALGORITHMS.has(alg)) {
throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${alg}`);
}
return {
...rest,
alg
};
}
function getSignatureOptions(algorithm) {
if (algorithm.startsWith("ES")) {
return { dsaEncoding: "ieee-p1363" };
}
if (algorithm.startsWith("PS")) {
return {
padding: crypto2__namespace.constants.RSA_PKCS1_PSS_PADDING,
saltLength: crypto2__namespace.constants.RSA_PSS_SALTLEN_DIGEST
};
}
return {};
}
function getDigestAlgorithm(algorithm) {
if (algorithm.endsWith("256")) return "sha256";
if (algorithm.endsWith("384")) return "sha384";
if (algorithm.endsWith("512")) return "sha512";
throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${algorithm}`);
}
async function signAgentCard({
agentCard,
signing
}) {
const canonicalPayload = (0, import_canonicalize.default)(stripAgentCardSignatures(agentCard));
if (!canonicalPayload) {
throw new Error("Failed to canonicalize A2A Agent Card for signing");
}
const key = importSigningKey(signing);
const protectedHeader = getProtectedHeader(signing);
const encodedHeader = Buffer.from(JSON.stringify(protectedHeader), "utf8").toString("base64url");
const encodedPayload = Buffer.from(canonicalPayload, "utf8").toString("base64url");
const signingInput = `${encodedHeader}.${encodedPayload}`;
const signatureBuffer = crypto2__namespace.sign(
getDigestAlgorithm(String(protectedHeader.alg)),
Buffer.from(signingInput, "utf8"),
{
key,
...getSignatureOptions(String(protectedHeader.alg))
}
);
const signatureValue = signatureBuffer.toString("base64url");
if (!encodedHeader || !signatureValue) {
throw new Error("Failed to create compact JWS for A2A Agent Card");
}
const signature = {
protected: encodedHeader,
signature: signatureValue,
header: signing.header
};
return {
...agentCard,
signatures: [...agentCard.signatures ?? [], signature]
};
}
function normalizeError(error, reqId, taskId, logger) {
let a2aError;
if (error instanceof a2a.MastraA2AError) {
a2aError = error;
} else if (error instanceof Error) {
a2aError = a2a.MastraA2AError.internalError(error.message, { stack: error.stack });
} else {
a2aError = a2a.MastraA2AError.internalError("An unknown error occurred.", error);
}
if (taskId && !a2aError.taskId) {
a2aError.taskId = taskId;
}
logger?.error(`Error processing request (Task: ${a2aError.taskId ?? "N/A"}, ReqID: ${reqId ?? "N/A"}):`, a2aError);
return createErrorResponse(reqId, a2aError.toJSONRPCError());
}
function createErrorResponse(id, error) {
return {
jsonrpc: "2.0",
id,
// Can be null if request ID was invalid/missing
error
};
}
function createSuccessResponse(id, result) {
if (!id) {
throw a2a.MastraA2AError.internalError("Cannot create success response for null ID.");
}
return {
jsonrpc: "2.0",
id,
result
};
}
function convertToCoreMessage(message) {
return {
role: message.role === "user" ? "user" : "assistant",
content: message.parts.map((msg) => convertToCoreMessagePart(msg))
};
}
function convertToCoreMessagePart(part) {
switch (part.kind) {
case "text":
return {
type: "text",
text: part.text
};
case "file":
return {
type: "file",
data: "uri" in part.file ? new URL(part.file.uri) : part.file.bytes,
mimeType: part.file.mimeType
};
case "data":
throw new Error("Data parts are not supported in core messages");
}
}
var DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER = "X-A2A-Notification-Token";
function isDisallowedHostname(hostname) {
const normalized = hostname.toLowerCase();
return normalized === "localhost" || normalized.endsWith(".localhost") || normalized.endsWith(".local") || normalized.endsWith(".internal") || !normalized.includes(".");
}
function isDisallowedIpv4(address) {
const [first = -1, second = -1] = address.split(".").map(Number);
return first === 10 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
}
function isDisallowedIpv6(address) {
const normalized = address.toLowerCase();
return normalized === "::1" || normalized.startsWith("fe8") || normalized.startsWith("fe9") || normalized.startsWith("fea") || normalized.startsWith("feb") || normalized.startsWith("fc") || normalized.startsWith("fd");
}
function isDisallowedIpAddress(address) {
const version = net.isIP(address);
if (version === 4) {
return isDisallowedIpv4(address);
}
if (version === 6) {
return isDisallowedIpv6(address);
}
return false;
}
var DefaultPushNotificationSender = class {
constructor(pushNotificationStore, options = {}) {
this.pushNotificationStore = pushNotificationStore;
this.options = options;
}
pushNotificationStore;
options;
getStore() {
return this.pushNotificationStore;
}
async resolveValidatedDestination(rawUrl) {
const url = new URL(rawUrl);
if (url.protocol !== "https:" && url.protocol !== "http:") {
throw new Error(`Push notification URL must use http or https: ${url.protocol}`);
}
const hostname = url.hostname.toLowerCase();
if (this.options.allowedHosts && !this.options.allowedHosts.includes(hostname)) {
throw new Error(`Push notification host is not allowed: ${hostname}`);
}
if (isDisallowedHostname(hostname)) {
throw new Error(`Push notification URL must not target local or internal hosts: ${hostname}`);
}
if (isDisallowedIpAddress(hostname)) {
throw new Error(`Push notification URL must not target local or private IPs: ${hostname}`);
}
const resolvedAddresses = net.isIP(hostname) === 0 ? await (this.options.lookup ?? promises.lookup)(hostname, { all: true, verbatim: true }) : [{ address: hostname, family: net.isIP(hostname) }];
if (resolvedAddresses.some((result) => isDisallowedIpAddress(result.address))) {
throw new Error(`Push notification URL resolved to a local or private IP: ${hostname}`);
}
const requestUrl = new URL(url.toString());
requestUrl.hostname = resolvedAddresses[0].address;
return {
originalUrl: url,
requestUrl,
hostHeader: url.host,
servername: net.isIP(hostname) === 0 ? hostname : void 0
};
}
async postTaskSnapshot({
requestUrl,
hostHeader,
servername,
headers,
body,
timeout
}) {
headers.set("host", hostHeader);
const signal = typeof AbortSignal.timeout === "function" ? AbortSignal.timeout(timeout) : void 0;
if (this.options.fetch) {
return this.options.fetch(requestUrl.toString(), {
method: "POST",
headers,
body,
signal
});
}
const transport = requestUrl.protocol === "https:" ? https.request : http.request;
return await new Promise((resolve, reject) => {
const request = transport(
{
protocol: requestUrl.protocol,
hostname: requestUrl.hostname,
port: requestUrl.port || void 0,
path: `${requestUrl.pathname}${requestUrl.search}`,
method: "POST",
headers: Object.fromEntries(headers.entries()),
servername
},
(response) => {
response.resume();
response.on("end", () => {
resolve({
ok: !!response.statusCode && response.statusCode >= 200 && response.statusCode < 300,
status: response.statusCode ?? 0,
statusText: response.statusMessage ?? ""
});
});
}
);
request.on("error", reject);
if (signal) {
signal.addEventListener(
"abort",
() => {
request.destroy(signal.reason instanceof Error ? signal.reason : new Error("Push notification timed out"));
},
{ once: true }
);
}
request.end(body);
});
}
async sendNotifications({
agentId,
task,
logger
}) {
const configs = this.pushNotificationStore.list({
agentId,
params: { id: task.id }
});
if (configs.length === 0) {
return;
}
await Promise.allSettled(
configs.map(async (config) => {
const headers = new Headers({
"content-type": "application/json"
});
if (config.pushNotificationConfig.token) {
headers.set(
this.options.tokenHeaderName ?? DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER,
config.pushNotificationConfig.token
);
}
const auth = config.pushNotificationConfig.authentication;
if (auth?.credentials) {
if (auth.schemes.includes("Bearer")) {
headers.set("authorization", `Bearer ${auth.credentials}`);
} else if (auth.schemes.includes("Basic")) {
headers.set("authorization", `Basic ${auth.credentials}`);
}
}
const { requestUrl, hostHeader, servername } = await this.resolveValidatedDestination(
config.pushNotificationConfig.url
);
const response = await this.postTaskSnapshot({
requestUrl,
hostHeader,
servername,
headers,
body: JSON.stringify(task),
timeout: this.options.timeout ?? 5e3
});
if (!response.ok) {
throw new Error(
`Push notification failed with status ${response.status} ${response.statusText ?? ""}`.trim()
);
}
})
).then((results) => {
for (const result of results) {
if (result.status === "rejected") {
logger?.error("Failed to deliver A2A push notification", result.reason);
}
}
});
}
};
// src/server/a2a/push-notification-store.ts
function normalizeConfigId(taskId, configId) {
return configId || taskId;
}
var InMemoryPushNotificationStore = class {
store = /* @__PURE__ */ new Map();
getKey(agentId, taskId) {
return JSON.stringify([agentId, taskId]);
}
set({ agentId, config }) {
const key = this.getKey(agentId, config.taskId);
const configs = this.store.get(key) ?? /* @__PURE__ */ new Map();
const normalizedConfig = {
taskId: config.taskId,
pushNotificationConfig: {
...config.pushNotificationConfig,
id: normalizeConfigId(config.taskId, config.pushNotificationConfig.id)
}
};
configs.set(normalizedConfig.pushNotificationConfig.id, structuredClone(normalizedConfig));
this.store.set(key, configs);
return structuredClone(normalizedConfig);
}
get({
agentId,
params
}) {
const key = this.getKey(agentId, params.id);
const configId = normalizeConfigId(params.id, params.pushNotificationConfigId);
const config = this.store.get(key)?.get(configId);
return config ? structuredClone(config) : null;
}
list({
agentId,
params
}) {
const key = this.getKey(agentId, params.id);
return Array.from(this.store.get(key)?.values() ?? []).map((config) => structuredClone(config));
}
delete({ agentId, params }) {
const key = this.getKey(agentId, params.id);
const configs = this.store.get(key);
if (!configs) {
return false;
}
const deleted = configs.delete(params.pushNotificationConfigId);
if (configs.size === 0) {
this.store.delete(key);
}
return deleted;
}
};
// src/server/a2a/tasks.ts
function isTaskStatusUpdate(update) {
return "state" in update && !("parts" in update);
}
function isArtifactUpdate(update) {
return "kind" in update && update.kind === "artifact-update";
}
function applyUpdateToTask(current, update) {
let newTask = structuredClone(current);
if (isTaskStatusUpdate(update)) {
newTask.status = {
...newTask.status,
// Keep existing properties if not overwritten
...update,
// Apply updates
timestamp: (/* @__PURE__ */ new Date()).toISOString()
};
} else if (isArtifactUpdate(update)) {
if (!newTask.artifacts) {
newTask.artifacts = [];
} else {
newTask.artifacts = [...newTask.artifacts];
}
const artifact = update.artifact;
const existingIndex = newTask.artifacts.findIndex((a) => a.name === artifact.name);
const existingArtifact = newTask.artifacts[existingIndex];
if (existingArtifact) {
if (update.append) {
const appendedArtifact = JSON.parse(JSON.stringify(existingArtifact));
appendedArtifact.parts.push(...artifact.parts);
if (artifact.metadata) {
appendedArtifact.metadata = {
...appendedArtifact.metadata || {},
...artifact.metadata
};
}
if (artifact.description) appendedArtifact.description = artifact.description;
newTask.artifacts[existingIndex] = appendedArtifact;
} else {
newTask.artifacts[existingIndex] = { ...artifact };
}
} else {
newTask.artifacts.push({ ...artifact });
}
}
return newTask;
}
async function loadOrCreateTask({
agentId,
taskId,
taskStore,
message,
contextId,
metadata,
logger
}) {
const data = await taskStore.load({ agentId, taskId });
if (!data) {
const initialTask = {
id: taskId,
contextId: contextId || crypto.randomUUID(),
status: {
state: "submitted",
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
message: void 0
},
artifacts: [],
history: [message],
metadata,
kind: "task"
};
logger?.info(`[Task ${taskId}] Created new task.`);
await taskStore.save({ agentId, data: initialTask });
return initialTask;
}
logger?.info(`[Task ${taskId}] Loaded existing task.`);
let updatedData = data;
updatedData.history = [...data.history || [], message];
const { status } = data;
const finalStates = ["completed", "failed", "canceled"];
if (finalStates.includes(status.state)) {
logger?.warn(`[Task ${taskId}] Received message for task in final state ${status.state}. Restarting.`);
updatedData = applyUpdateToTask(updatedData, {
state: "submitted",
message: void 0
});
} else if (status.state === "input-required") {
logger?.info(`[Task ${taskId}] Changing state from 'input-required' to 'working'.`);
updatedData = applyUpdateToTask(updatedData, { state: "working" });
} else if (status.state === "working") {
logger?.warn(`[Task ${taskId}] Received message while already 'working'. Proceeding.`);
}
await taskStore.save({ agentId, data: updatedData });
return updatedData;
}
function createTaskContext({
task,
userMessage,
history,
activeCancellations
}) {
return {
task: structuredClone(task),
userMessage,
history: structuredClone(history),
isCancelled: () => activeCancellations.has(task.id)
};
}
// src/server/handlers/a2a.ts
var messagePartSchema = v4.z.discriminatedUnion("kind", [
v4.z.object({
kind: v4.z.literal("text"),
text: v4.z.string(),
metadata: v4.z.record(v4.z.string(), v4.z.any()).optional()
}),
v4.z.object({
kind: v4.z.literal("file"),
file: v4.z.union([
v4.z.object({
bytes: v4.z.string(),
mimeType: v4.z.string().optional(),
name: v4.z.string().optional()
}),
v4.z.object({
uri: v4.z.string(),
mimeType: v4.z.string().optional(),
name: v4.z.string().optional()
})
]),
metadata: v4.z.record(v4.z.string(), v4.z.any()).optional()
}),
v4.z.object({
kind: v4.z.literal("data"),
data: v4.z.record(v4.z.string(), v4.z.any()),
metadata: v4.z.record(v4.z.string(), v4.z.any()).optional()
})
]);
var messageSendParamsSchema = v4.z.object({
message: v4.z.object({
role: v4.z.enum(["user", "agent"]),
parts: v4.z.array(messagePartSchema),
kind: v4.z.literal("message"),
messageId: v4.z.string(),
contextId: v4.z.string().optional(),
taskId: v4.z.string().optional(),
referenceTaskIds: v4.z.array(v4.z.string()).optional(),
extensions: v4.z.array(v4.z.string()).optional(),
metadata: v4.z.record(v4.z.string(), v4.z.any()).optional()
}),
configuration: v4.z.object({
acceptedOutputModes: v4.z.array(v4.z.string()).optional(),
blocking: v4.z.boolean().optional(),
historyLength: v4.z.number().optional(),
pushNotificationConfig: v4.z.object({
url: v4.z.string(),
id: v4.z.string().optional(),
token: v4.z.string().optional(),
authentication: v4.z.object({
schemes: v4.z.array(v4.z.string()),
credentials: v4.z.string().optional()
}).optional()
}).optional()
}).optional()
});
var defaultPushNotificationStore = new InMemoryPushNotificationStore();
var defaultPushNotificationSender = new DefaultPushNotificationSender(defaultPushNotificationStore);
function createAgentCardDefaults({
pushNotifications = false
} = {}) {
return {
protocolVersion: "0.3.0",
additionalInterfaces: [],
supportsAuthenticatedExtendedCard: false,
security: [],
securitySchemes: {},
capabilities: {
streaming: true,
pushNotifications,
stateTransitionHistory: false,
extensions: []
},
defaultInputModes: ["text/plain"],
defaultOutputModes: ["text/plain"]
};
}
async function getAgentCardByIdHandler({
mastra,
agentId,
executionUrl = `/a2a/${agentId}`,
provider = {
organization: "Mastra",
url: "https://mastra.ai"
},
version = "1.0",
pushNotifications = false,
requestContext
}) {
const agent = await chunkUNXPZBTJ_cjs.getAgentFromSystem({ mastra, agentId });
const [instructions, tools] = await Promise.all([agent.getInstructions({ requestContext }), agent.listTools({ requestContext })]);
const agentCard = {
name: agent.id || agentId,
description: chunkGZ4HWZWE_cjs.convertInstructionsToString(instructions),
url: executionUrl,
provider,
version,
...createAgentCardDefaults({ pushNotifications }),
// Convert agent tools to skills format for A2A protocol
skills: Object.entries(tools).map(([toolId, tool]) => ({
id: toolId,
name: toolId,
description: tool.description || `Tool: ${toolId}`,
// Optional fields
tags: ["tool"]
}))
};
const signing = mastra.getServer?.()?.a2a?.agentCardSigning;
if (!signing) {
return agentCard;
}
return signAgentCard({
agentCard,
signing
});
}
function getA2AExecutionUrl({
agentId,
request,
routePrefix
}) {
const executionPath = `${routePrefix ?? ""}/a2a/${agentId}`;
if (!request) {
return executionPath;
}
return `${chunk4ZHHKMDQ_cjs.getPublicOrigin(request)}${executionPath}`;
}
function validateMessageSendParams(params) {
try {
messageSendParamsSchema.parse(params);
} catch (error) {
if (error instanceof v4.z.ZodError) {
throw a2a.MastraA2AError.invalidParams(error.issues[0].message);
}
throw error;
}
}
function createArtifactUpdate({
taskId,
contextId,
text,
data
}) {
const parts = [
...text ? [{ kind: "text", text }] : [],
...data ? [{ kind: "data", data }] : []
];
if (parts.length === 0) {
return void 0;
}
return {
kind: "artifact-update",
taskId,
contextId,
lastChunk: true,
artifact: {
artifactId: `${taskId}:response`,
name: data ? "response.json" : "response.txt",
parts
}
};
}
function createTextChunkArtifactUpdate({
taskId,
contextId,
text,
append,
lastChunk
}) {
return {
kind: "artifact-update",
taskId,
contextId,
...append ? { append: true } : {},
...lastChunk !== void 0 ? { lastChunk } : {},
artifact: {
artifactId: `${taskId}:response:text`,
name: "response.txt",
parts: [{ kind: "text", text }]
}
};
}
function createDataArtifactUpdate({
taskId,
contextId,
data,
lastChunk
}) {
return {
kind: "artifact-update",
taskId,
contextId,
...{ lastChunk } ,
artifact: {
artifactId: `${taskId}:response:data`,
name: "response.json",
parts: [{ kind: "data", data }]
}
};
}
function resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
}) {
if (pushNotificationSender) {
return {
pushNotificationStore: pushNotificationSender.getStore(),
pushNotificationSender
};
}
if (pushNotificationStore) {
return {
pushNotificationStore,
pushNotificationSender: new DefaultPushNotificationSender(pushNotificationStore)
};
}
return {
pushNotificationStore: defaultPushNotificationStore,
pushNotificationSender: defaultPushNotificationSender
};
}
function createTaskPushNotificationConfig(taskId, pushNotificationConfig) {
return {
taskId,
pushNotificationConfig: {
...pushNotificationConfig,
id: pushNotificationConfig.id ?? taskId
}
};
}
function shouldSendPushNotification(previousTask, nextTask) {
const pushTriggerStates = ["completed", "failed", "canceled", "input-required"];
if (!pushTriggerStates.includes(nextTask.status.state)) {
return false;
}
return previousTask?.status.state !== nextTask.status.state;
}
async function saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender,
previousTask,
nextTask,
agentId,
logger
}) {
await taskStore.save({ agentId, data: nextTask });
if (!shouldSendPushNotification(previousTask, nextTask)) {
return;
}
void pushNotificationSender.sendNotifications({
agentId,
task: nextTask,
logger
}).catch((error) => {
logger?.error("Failed to schedule A2A push notification", error);
});
}
function extractFullStreamTextDelta(value) {
if (typeof value !== "object" || value === null || !("type" in value)) {
return null;
}
const chunk = value;
switch (chunk.type) {
case "text-delta":
if (typeof chunk.payload?.text === "string") {
return chunk.payload.text;
}
if (typeof chunk.payload?.delta === "string") {
return chunk.payload.delta;
}
if (typeof chunk.textDelta === "string") {
return chunk.textDelta;
}
if (typeof chunk.delta === "string") {
return chunk.delta;
}
if (typeof chunk.text === "string") {
return chunk.text;
}
return null;
default:
return null;
}
}
function extractFinalStructuredObject(value) {
if (typeof value !== "object" || value === null || !("type" in value)) {
return void 0;
}
const chunk = value;
if (chunk.type !== "object-result") {
return void 0;
}
const objectValue = chunk.payload?.object ?? chunk.object;
return objectValue && typeof objectValue === "object" ? objectValue : void 0;
}
function isTerminalTaskState(state) {
return ["completed", "failed", "canceled"].includes(state);
}
function artifactIdentity(artifact) {
return artifact.artifactId || artifact.name;
}
function areArtifactPartsEqual(left, right) {
if (left === right) {
return true;
}
if (left.length !== right.length) {
return false;
}
return left.every((part, index) => {
const other = right[index];
if (!other || part.kind !== other.kind) {
return false;
}
if (part.kind === "text" && other.kind === "text") {
return part.text === other.text;
}
return part === other;
});
}
function areArtifactsEqual(left, right) {
if (left === right) {
return true;
}
if (!left || !right) {
return left === right;
}
return left.artifactId === right.artifactId && left.name === right.name && left.description === right.description && left.metadata === right.metadata && areArtifactPartsEqual(left.parts, right.parts);
}
function areStatusMessagePartsEqual(left, right) {
return left === right || util.isDeepStrictEqual(left, right);
}
function areStatusMessagesEqual(left, right) {
if (left === right) {
return true;
}
if (!left || !right) {
return left === right;
}
return left.messageId === right.messageId && left.kind === right.kind && left.role === right.role && left.contextId === right.contextId && left.taskId === right.taskId && util.isDeepStrictEqual(left.referenceTaskIds, right.referenceTaskIds) && util.isDeepStrictEqual(left.extensions, right.extensions) && util.isDeepStrictEqual(left.metadata, right.metadata) && areStatusMessagePartsEqual(left.parts, right.parts);
}
function didTaskStatusChange(previous, next) {
return previous.status.state !== next.status.state || previous.status.timestamp !== next.status.timestamp || !areStatusMessagesEqual(previous.status.message, next.status.message);
}
function getTaskArtifactUpdates({ previous, next }) {
const previousArtifacts = new Map((previous.artifacts ?? []).map((artifact) => [artifactIdentity(artifact), artifact]));
const changedArtifacts = (next.artifacts ?? []).filter((artifact) => {
const priorArtifact = previousArtifacts.get(artifactIdentity(artifact));
return !priorArtifact || !areArtifactsEqual(priorArtifact, artifact);
});
return changedArtifacts.map((artifact, index) => ({
kind: "artifact-update",
taskId: next.id,
contextId: next.contextId,
lastChunk: isTerminalTaskState(next.status.state) && index === changedArtifacts.length - 1,
artifact: structuredClone(artifact)
}));
}
async function handleMessageSend({
requestId,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
agent,
agentId,
logger,
requestContext
}) {
validateMessageSendParams(params);
const { message, metadata } = params;
const { contextId } = message;
const taskId = message.taskId || crypto.randomUUID();
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let currentData = await loadOrCreateTask({
taskId,
taskStore,
agentId,
message,
contextId,
metadata
});
if (params.configuration?.pushNotificationConfig) {
resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig)
});
}
const context = createTaskContext({
task: currentData,
userMessage: message,
history: currentData.history || [],
activeCancellations: taskStore.activeCancellations
});
try {
const resourceId = metadata?.resourceId ?? message.metadata?.resourceId ?? agentId;
const result = await agent.generate([convertToCoreMessage(message)], {
runId: taskId,
requestContext,
...contextId ? { threadId: contextId, resourceId } : {}
});
const artifactUpdate = createArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: result.text,
data: result.object
});
if (artifactUpdate) {
currentData = applyUpdateToTask(currentData, artifactUpdate);
}
currentData = applyUpdateToTask(currentData, {
state: "completed",
message: void 0
});
currentData.metadata = {
...currentData.metadata,
execution: {
toolCalls: result.toolCalls,
toolResults: result.toolResults,
usage: result.usage,
finishReason: result.finishReason
}
};
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask: context.task,
nextTask: currentData,
agentId,
logger
});
context.task = currentData;
} catch (handlerError) {
const failureStatusUpdate = {
state: "failed",
message: {
messageId: crypto.randomUUID(),
role: "agent",
parts: [
{
kind: "text",
text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`
}
],
kind: "message"
}
};
currentData = applyUpdateToTask(currentData, failureStatusUpdate);
try {
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask: context.task,
nextTask: currentData,
agentId,
logger
});
} catch (saveError) {
logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);
}
return normalizeError(handlerError, requestId, currentData.id, logger);
}
return createSuccessResponse(requestId, currentData);
}
async function handleTaskGet({
requestId,
taskStore,
agentId,
taskId
}) {
const task = await taskStore.load({ agentId, taskId });
if (!task) {
throw a2a.MastraA2AError.taskNotFound(taskId);
}
return createSuccessResponse(requestId, task);
}
async function loadTaskOrThrow({
taskStore,
agentId,
taskId
}) {
const task = await taskStore.load({ agentId, taskId });
if (!task) {
throw a2a.MastraA2AError.taskNotFound(taskId);
}
return task;
}
async function handleSetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.taskId
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const config = resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(params.taskId, params.pushNotificationConfig)
});
return createSuccessResponse(requestId, config);
}
async function handleGetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const config = resolvedPushNotificationStore.get({
agentId,
params
});
if (!config) {
throw a2a.MastraA2AError.invalidParams(
`Push notification config not found: ${params.pushNotificationConfigId ?? params.id}`
);
}
return createSuccessResponse(requestId, config);
}
async function handleListTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const configs = resolvedPushNotificationStore.list({
agentId,
params
});
return createSuccessResponse(requestId, configs);
}
async function handleDeleteTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore,
agentId,
params
}) {
await loadTaskOrThrow({
taskStore,
agentId,
taskId: params.id
});
const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({
pushNotificationStore
});
const deleted = resolvedPushNotificationStore.delete({
agentId,
params
});
if (!deleted) {
throw a2a.MastraA2AError.invalidParams(`Push notification config not found: ${params.pushNotificationConfigId}`);
}
return createSuccessResponse(requestId, null);
}
async function* handleMessageStream({
requestId,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
agent,
agentId,
logger,
requestContext
}) {
validateMessageSendParams(params);
const { message, metadata } = params;
const { contextId } = message;
const taskId = message.taskId || crypto.randomUUID();
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let currentData = await loadOrCreateTask({
taskId,
taskStore,
agentId,
message,
contextId,
metadata
});
if (params.configuration?.pushNotificationConfig) {
resolvedPushNotificationStore.set({
agentId,
config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig)
});
}
currentData = applyUpdateToTask(currentData, {
state: "working",
message: {
messageId: crypto.randomUUID(),
kind: "message",
role: "agent",
parts: [{ kind: "text", text: "Generating response..." }]
}
});
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, currentData);
try {
const resourceId = metadata?.resourceId ?? message.metadata?.resourceId ?? agentId;
const result = await agent.stream([convertToCoreMessage(message)], {
runId: taskId,
requestContext,
...contextId ? { threadId: contextId, resourceId } : {}
});
let sawTextArtifact = false;
let pendingTextChunk;
let structuredData;
for await (const chunk of result.fullStream) {
const textDelta = extractFullStreamTextDelta(chunk);
if (textDelta !== null) {
if (!pendingTextChunk) {
pendingTextChunk = textDelta;
continue;
}
const textUpdate = createTextChunkArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: pendingTextChunk,
append: sawTextArtifact,
lastChunk: false
});
currentData = applyUpdateToTask(currentData, textUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, textUpdate);
sawTextArtifact = true;
pendingTextChunk = textDelta;
continue;
}
const finalStructuredObject = extractFinalStructuredObject(chunk);
if (finalStructuredObject) {
structuredData = finalStructuredObject;
}
}
structuredData ??= await result.object;
if (!pendingTextChunk && !sawTextArtifact) {
const finalText = await result.text;
if (finalText) {
pendingTextChunk = finalText;
}
}
if (pendingTextChunk) {
const textUpdate = createTextChunkArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
text: pendingTextChunk,
append: sawTextArtifact,
lastChunk: !structuredData
});
currentData = applyUpdateToTask(currentData, textUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, textUpdate);
sawTextArtifact = true;
pendingTextChunk = void 0;
}
if (structuredData) {
const dataUpdate = createDataArtifactUpdate({
taskId: currentData.id,
contextId: currentData.contextId,
data: structuredData,
lastChunk: true
});
currentData = applyUpdateToTask(currentData, dataUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
nextTask: currentData,
agentId,
logger
});
yield createSuccessResponse(requestId, dataUpdate);
}
const previousTask = currentData;
const completedTask = applyUpdateToTask(currentData, {
state: "completed",
message: void 0
});
completedTask.metadata = {
...completedTask.metadata,
execution: {
toolCalls: await result.toolCalls,
toolResults: await result.toolResults,
usage: await result.usage,
finishReason: await result.finishReason
}
};
currentData = completedTask;
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask,
nextTask: currentData,
agentId,
logger
});
} catch (handlerError) {
const previousTask = currentData;
currentData = applyUpdateToTask(currentData, {
state: "failed",
message: {
messageId: crypto.randomUUID(),
role: "agent",
parts: [
{
kind: "text",
text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`
}
],
kind: "message"
}
});
try {
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
previousTask,
nextTask: currentData,
agentId,
logger
});
} catch (saveError) {
logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);
}
}
yield createSuccessResponse(requestId, {
kind: "status-update",
taskId: currentData.id,
contextId: currentData.contextId,
status: currentData.status,
final: true
});
}
async function* handleTaskResubscribe({
requestId,
taskStore,
agentId,
taskId,
abortSignal
}) {
let snapshot = taskStore.loadWithVersion({ agentId, taskId });
if (!snapshot) {
throw a2a.MastraA2AError.taskNotFound(taskId);
}
yield createSuccessResponse(requestId, snapshot.task);
if (isTerminalTaskState(snapshot.task.status.state)) {
return;
}
while (true) {
const { task, version } = snapshot;
const nextUpdate = await taskStore.waitForNextUpdate({
agentId,
taskId,
afterVersion: version,
signal: abortSignal
});
for (const artifactUpdate of getTaskArtifactUpdates({ previous: task, next: nextUpdate.task })) {
yield createSuccessResponse(requestId, artifactUpdate);
}
if (didTaskStatusChange(task, nextUpdate.task)) {
yield createSuccessResponse(requestId, {
kind: "status-update",
taskId: nextUpdate.task.id,
contextId: nextUpdate.task.contextId,
status: nextUpdate.task.status,
final: isTerminalTaskState(nextUpdate.task.status.state)
});
}
if (isTerminalTaskState(nextUpdate.task.status.state)) {
return;
}
snapshot = nextUpdate;
}
}
function getTaskIdFromParams(params) {
if (!params || typeof params !== "object") {
return void 0;
}
if ("id" in params && typeof params.id === "string") {
return params.id;
}
if ("taskId" in params && typeof params.taskId === "string") {
return params.taskId;
}
if ("message" in params && params.message && typeof params.message === "object" && "taskId" in params.message) {
return typeof params.message.taskId === "string" ? params.message.taskId : void 0;
}
return void 0;
}
function isAsyncIterable(value) {
return !!value && typeof value === "object" && Symbol.asyncIterator in value;
}
function createA2AJsonResponse(payload) {
return Response.json(payload);
}
function createA2ASSEResponse(payload) {
const encoder = new TextEncoder();
const iterable = isAsyncIterable(payload) ? payload : (async function* () {
yield payload;
})();
const stream = new ReadableStream({
async start(controller) {
try {
for await (const chunk of iterable) {
controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}
`));
}
} catch (error) {
controller.error(error);
return;
}
controller.close();
}
});
return new Response(stream, {
headers: {
"Content-Type": "text/event-stream; charset=utf-8",
"Cache-Control": "no-cache",
Connection: "keep-alive",
"X-Accel-Buffering": "no"
}
});
}
async function handleTaskCancel({
requestId,
taskStore,
pushNotificationSender,
agentId,
taskId,
logger
}) {
let data = await taskStore.load({
agentId,
taskId
});
if (!data) {
throw a2a.MastraA2AError.taskNotFound(taskId);
}
const finalStates = ["completed", "failed", "canceled"];
if (finalStates.includes(data.status.state)) {
logger?.info(`Task ${taskId} already in final state ${data.status.state}, cannot cancel.`);
return createSuccessResponse(requestId, data);
}
taskStore.activeCancellations.add(taskId);
const cancelUpdate = {
state: "canceled",
message: {
role: "agent",
parts: [{ kind: "text", text: "Task cancelled by request." }],
kind: "message",
messageId: crypto.randomUUID()
}
};
const previousTask = data;
data = applyUpdateToTask(data, cancelUpdate);
await saveTaskAndMaybeSendPushNotification({
taskStore,
pushNotificationSender: resolvePushNotificationPair({ pushNotificationSender }).pushNotificationSender,
previousTask,
nextTask: data,
agentId,
logger
});
taskStore.activeCancellations.delete(taskId);
return createSuccessResponse(requestId, data);
}
async function getAgentExecutionHandler({
requestId,
mastra,
agentId,
requestContext,
method,
params,
taskStore,
pushNotificationStore,
pushNotificationSender,
logger,
abortSignal
}) {
const agent = await chunkUNXPZBTJ_cjs.getAgentFromSystem({ mastra, agentId });
const {
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender
} = resolvePushNotificationPair({
pushNotificationStore,
pushNotificationSender
});
let taskId;
try {
taskId = getTaskIdFromParams(params);
switch (method) {
case "message/send": {
const result = await handleMessageSend({
requestId,
params,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender,
agent,
agentId,
logger,
requestContext
});
return result;
}
case "message/stream": {
const result = await handleMessageStream({
requestId,
taskStore,
params,
pushNotificationStore: resolvedPushNotificationStore,
pushNotificationSender: resolvedPushNotificationSender,
agent,
agentId,
logger,
requestContext
});
return result;
}
case "tasks/get": {
const result = await handleTaskGet({
requestId,
taskStore,
agentId,
taskId: taskId || "No task ID provided"
});
return result;
}
case "tasks/cancel": {
const result = await handleTaskCancel({
requestId,
taskStore,
pushNotificationSender: resolvedPushNotificationSender,
agentId,
taskId: taskId || "No task ID provided",
logger
});
return result;
}
case "tasks/resubscribe":
return await handleTaskResubscribe({
requestId,
taskStore,
agentId,
taskId: taskId || "No task ID provided",
abortSignal
});
case "tasks/pushNotificationConfig/set":
return await handleSetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/get":
return await handleGetTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/list":
return await handleListTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "tasks/pushNotificationConfig/delete":
return await handleDeleteTaskPushNotificationConfig({
requestId,
taskStore,
pushNotificationStore: resolvedPushNotificationStore,
agentId,
params
});
case "agent/getAuthenticatedExtendedCard":
throw a2a.MastraA2AError.extendedAgentCardNotConfigured();
default:
throw a2a.MastraA2AError.methodNotFound(method);
}
} catch (error) {
if (error instanceof a2a.MastraA2AError && taskId && !error.taskId) {
error.taskId = taskId;
}
return normalizeError(error, requestId, taskId, logger);
}
}
var GET_AGENT_CARD_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/.well-known/:agentId/agent-card.json",
responseType: "json",
pathParamSchema: chunkCXAJPAJ2_cjs.a2aAgentIdPathParams,
responseSchema: chunkCXAJPAJ2_cjs.agentCardResponseSchema,
summary: "Get agent card",
description: "Returns the agent card information for A2A protocol discovery",
tags: ["Agent-to-Agent"],
requiresAuth: true,
handler: async (ctx) => {
const executionUrl = getA2AExecutionUrl({
agentId: ctx.agentId,
request: ctx.request,
routePrefix: ctx.routePrefix
});
return getAgentCardByIdHandler({
mastra: ctx.mastra,
requestContext: ctx.requestContext,
agentId: ctx.agentId,
executionUrl,
pushNotifications: true
});
}
});
var AGENT_EXECUTION_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/a2a/:agentId",
responseType: "datastream-response",
pathParamSchema: chunkCXAJPAJ2_cjs.a2aAgentIdPathParams,
bodySchema: chunkCXAJPAJ2_cjs.agentExecutionBodySchema,
responseSchema: chunkCXAJPAJ2_cjs.agentExecutionResponseSchema,
summary: "Execute agent",
description: "Executes an agent action via JSON-RPC 2.0 over A2A protocol",
tags: ["Agent-to-Agent"],
requiresAuth: true,
handler: async ({ mastra, agentId, requestContext, taskStore, abortSignal, ...bodyParams }) => {
const { id: requestId, method } = bodyParams;
const params = "params" in bodyParams ? bodyParams.params : void 0;
const result = await getAgentExecutionHandler({
requestId,
mastra,
agentId,
requestContext,
method,
params,
taskStore,
abortSignal
});
if (method === "message/stream" || method === "tasks/resubscribe") {
return createA2ASSEResponse(result);
}
return createA2AJsonResponse(result);
}
});
exports.AGENT_EXECUTION_ROUTE = AGENT_EXECUTION_ROUTE;
exports.GET_AGENT_CARD_ROUTE = GET_AGENT_CARD_ROUTE;
exports.a2a_exports = a2a_exports;
exports.getAgentCardByIdHandler = getAgentCardByIdHandler;
exports.getAgentExecutionHandler = getAgentExecutionHandler;
exports.handleDeleteTaskPushNotificationConfig = handleDeleteTaskPushNotificationConfig;
exports.handleGetTaskPushNotificationConfig = handleGetTaskPushNotificationConfig;
exports.handleListTaskPushNotificationConfig = handleListTaskPushNotificationConfig;
exports.handleMessageSend = handleMessageSend;
exports.handleMessageStream = handleMessageStream;
exports.handleSetTaskPushNotificationConfig = handleSetTaskPushNotificationConfig;
exports.handleTaskCancel = handleTaskCancel;
exports.handleTaskGet = handleTaskGet;
exports.handleTaskResubscribe = handleTaskResubscribe;
//# sourceMappingURL=chunk-RHRIAUUE.cjs.map
//# sourceMappingURL=chunk-RHRIAUUE.cjs.map

Sorry, the diff of this file is too big to display

'use strict';
var chunkUNXPZBTJ_cjs = require('./chunk-UNXPZBTJ.cjs');
var chunkQQCQV7ZF_cjs = require('./chunk-QQCQV7ZF.cjs');
var chunkRVD3DGBZ_cjs = require('./chunk-RVD3DGBZ.cjs');
var chunkDIG2K5CV_cjs = require('./chunk-DIG2K5CV.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk3YQ7NWF6_cjs = require('./chunk-3YQ7NWF6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
var tools = require('@mastra/core/tools');
// src/server/handlers/tools.ts
var tools_exports = {};
chunkO7I5CWRX_cjs.__export(tools_exports, {
EXECUTE_AGENT_TOOL_ROUTE: () => EXECUTE_AGENT_TOOL_ROUTE,
EXECUTE_TOOL_ROUTE: () => EXECUTE_TOOL_ROUTE,
GET_AGENT_TOOL_ROUTE: () => GET_AGENT_TOOL_ROUTE,
GET_TOOL_BY_ID_ROUTE: () => GET_TOOL_BY_ID_ROUTE,
LIST_TOOLS_ROUTE: () => LIST_TOOLS_ROUTE
});
function resolveLazySchema(schema) {
if (typeof schema === "function" && !("~standard" in schema)) {
return resolveLazySchema(schema());
}
return schema;
}
function schemaToJsonSchema(schema) {
if (!schema) {
return void 0;
}
return chunk3YQ7NWF6_cjs.standardSchemaToJSONSchema(chunk3YQ7NWF6_cjs.toStandardSchema5(schema), { target: "draft-2020-12" });
}
function serializeSchema(schema) {
const jsonSchema = schemaToJsonSchema(resolveLazySchema(schema));
if (jsonSchema === void 0) return void 0;
return chunkGZ4HWZWE_cjs.stringify(jsonSchema);
}
async function findToolInAgents(mastra, toolId, requestContext) {
const agents = mastra.listAgents() || {};
for (const agent of Object.values(agents)) {
try {
const agentTools = await agent.listTools({ requestContext });
const found = Object.values(agentTools || {}).find((t) => t.id === toolId);
if (found) return found;
} catch (error) {
mastra.getLogger?.()?.warn?.("Failed to list tools for agent while resolving tool by id", {
agentId: agent?.id,
toolId,
error: error instanceof Error ? error.message : String(error)
});
}
}
return void 0;
}
function serializeTool(tool) {
if (tools.isProviderDefinedTool(tool)) {
const resolvedInput = resolveLazySchema(tool.inputSchema);
const resolvedOutput = resolveLazySchema(tool.outputSchema);
return {
...tool,
inputSchema: resolvedInput && typeof resolvedInput === "object" && "jsonSchema" in resolvedInput ? chunkGZ4HWZWE_cjs.stringify(resolvedInput.jsonSchema) : void 0,
outputSchema: resolvedOutput && typeof resolvedOutput === "object" && "jsonSchema" in resolvedOutput ? chunkGZ4HWZWE_cjs.stringify(resolvedOutput.jsonSchema) : void 0
};
}
return {
...tool,
inputSchema: serializeSchema(tool.inputSchema),
outputSchema: serializeSchema(tool.outputSchema),
requestContextSchema: serializeSchema(tool.requestContextSchema)
};
}
var LIST_TOOLS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/tools",
responseType: "json",
responseSchema: chunkQQCQV7ZF_cjs.listToolsResponseSchema,
summary: "List all tools",
description: "Returns a list of all available tools in the system",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, registeredTools, requestContext }) => {
try {
const registered = registeredTools && Object.keys(registeredTools).length > 0 ? registeredTools : {};
const allTools = {};
const seenToolIds = /* @__PURE__ */ new Map();
for (const [key, tool] of Object.entries(registered)) {
const toolId = typeof tool?.id === "string" ? tool.id : void 0;
if (toolId !== void 0) seenToolIds.set(toolId, key);
allTools[key] = tool;
}
for (const [key, tool] of Object.entries(mastra.listTools() ?? {})) {
const toolId = typeof tool?.id === "string" ? tool.id : void 0;
if (toolId !== void 0 && seenToolIds.has(toolId)) continue;
if (toolId !== void 0) seenToolIds.set(toolId, key);
allTools[key] = tool;
}
const serializedTools = Object.entries(allTools).reduce(
(acc, [id, _tool]) => {
acc[id] = serializeTool(_tool);
return acc;
},
{}
);
const fgaProvider = mastra.getServer?.()?.fga;
const user = requestContext?.get("user");
if (fgaProvider && user) {
const toolList = Object.entries(serializedTools).map(([id, t]) => ({ id, ...t }));
const accessible = await fgaProvider.filterAccessible(user, toolList, "tool", chunkRVD3DGBZ_cjs.MastraFGAPermissions.TOOLS_READ);
const accessibleSet = new Set(accessible.map((t) => t.id));
for (const id of Object.keys(serializedTools)) {
if (!accessibleSet.has(id)) {
delete serializedTools[id];
}
}
}
return serializedTools;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting tools");
}
}
});
var GET_TOOL_BY_ID_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/tools/:toolId",
responseType: "json",
pathParamSchema: chunkQQCQV7ZF_cjs.toolIdPathParams,
responseSchema: chunkQQCQV7ZF_cjs.serializedToolSchema,
summary: "Get tool by ID",
description: "Returns details for a specific tool including its schema and configuration",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, registeredTools, toolId, requestContext }) => {
try {
let tool;
if (registeredTools && Object.keys(registeredTools).length > 0) {
tool = Object.values(registeredTools).find((t) => t.id === toolId);
}
if (!tool) {
try {
tool = mastra.getToolById(toolId);
} catch {
}
}
if (!tool) {
tool = await findToolInAgents(mastra, toolId, requestContext);
}
if (!tool) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Tool not found" });
}
return serializeTool(tool);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting tool");
}
}
});
var EXECUTE_TOOL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/tools/:toolId/execute",
responseType: "json",
pathParamSchema: chunkQQCQV7ZF_cjs.toolIdPathParams,
queryParamSchema: chunkDIG2K5CV_cjs.optionalRunIdSchema,
bodySchema: chunkQQCQV7ZF_cjs.executeToolContextBodySchema,
responseSchema: chunkQQCQV7ZF_cjs.executeToolResponseSchema,
summary: "Execute tool",
description: "Executes a specific tool with the provided input data",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, runId, toolId, registeredTools, requestContext, ...bodyParams }) => {
try {
if (!toolId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Tool ID is required" });
}
let tool;
if (registeredTools && Object.keys(registeredTools).length > 0) {
tool = Object.values(registeredTools).find((t) => t.id === toolId);
}
if (!tool) {
try {
tool = mastra.getToolById(toolId);
} catch {
}
}
if (!tool) {
tool = await findToolInAgents(mastra, toolId, requestContext);
}
if (!tool) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Tool not found" });
}
if (!tool?.execute) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Tool is not executable" });
}
const { data } = bodyParams;
chunkRVD3DGBZ_cjs.validateBody({ data });
let result;
if (tools.isVercelTool(tool)) {
result = await tool.execute(data);
} else {
result = await tool.execute(data, {
mastra,
requestContext,
// TODO: Pass proper tracing context when server API supports tracing
tracingContext: { currentSpan: void 0 },
...runId ? {
workflow: {
runId,
suspend: async () => {
}
}
} : {}
});
}
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error executing tool");
}
}
});
var GET_AGENT_TOOL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/agents/:agentId/tools/:toolId",
responseType: "json",
pathParamSchema: chunkQQCQV7ZF_cjs.agentToolPathParams,
responseSchema: chunkQQCQV7ZF_cjs.serializedToolSchema,
summary: "Get agent tool",
description: "Returns details for a specific tool assigned to the agent",
tags: ["Agents", "Tools"],
requiresAuth: true,
handler: async ({ mastra, agentId, toolId, requestContext }) => {
try {
if (!agentId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Agent ID is required" });
}
const agent = await chunkUNXPZBTJ_cjs.getAgentFromSystem({ mastra, agentId });
const agentTools = await agent.listTools({ requestContext });
const tool = Object.values(agentTools || {}).find((tool2) => tool2.id === toolId);
if (!tool) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Tool not found" });
}
return serializeTool(tool);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting agent tool");
}
}
});
var EXECUTE_AGENT_TOOL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/agents/:agentId/tools/:toolId/execute",
responseType: "json",
pathParamSchema: chunkQQCQV7ZF_cjs.agentToolPathParams,
bodySchema: chunkQQCQV7ZF_cjs.executeToolBodySchema,
responseSchema: chunkQQCQV7ZF_cjs.executeToolResponseSchema,
summary: "Execute agent tool",
description: "Executes a specific tool assigned to the agent with the provided input data",
tags: ["Agents", "Tools"],
requiresAuth: true,
handler: async ({ mastra, agentId, toolId, data, requestContext }) => {
try {
if (!agentId) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Agent ID is required" });
}
const agent = await chunkUNXPZBTJ_cjs.getAgentFromSystem({ mastra, agentId });
const agentTools = await agent.listTools({ requestContext });
const tool = Object.values(agentTools || {}).find((tool2) => tool2.id === toolId);
if (!tool) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Tool not found" });
}
if (!tool?.execute) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: "Tool is not executable" });
}
const result = await tool.execute(data, {
mastra,
requestContext,
// TODO: Pass proper tracing context when server API supports tracing
tracingContext: { currentSpan: void 0 }
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error executing agent tool");
}
}
});
exports.EXECUTE_AGENT_TOOL_ROUTE = EXECUTE_AGENT_TOOL_ROUTE;
exports.EXECUTE_TOOL_ROUTE = EXECUTE_TOOL_ROUTE;
exports.GET_AGENT_TOOL_ROUTE = GET_AGENT_TOOL_ROUTE;
exports.GET_TOOL_BY_ID_ROUTE = GET_TOOL_BY_ID_ROUTE;
exports.LIST_TOOLS_ROUTE = LIST_TOOLS_ROUTE;
exports.tools_exports = tools_exports;
//# sourceMappingURL=chunk-RWW6SPX2.cjs.map
//# sourceMappingURL=chunk-RWW6SPX2.cjs.map
{"version":3,"sources":["../src/server/handlers/tools.ts"],"names":["__export","standardSchemaToJSONSchema","toStandardSchema5","stringify","isProviderDefinedTool","createRoute","listToolsResponseSchema","MastraFGAPermissions","handleError","toolIdPathParams","serializedToolSchema","HTTPException","optionalRunIdSchema","executeToolContextBodySchema","executeToolResponseSchema","validateBody","isVercelTool","agentToolPathParams","getAgentFromSystem","tool","executeToolBodySchema"],"mappings":"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","file":"chunk-RWW6SPX2.cjs","sourcesContent":["import { isVercelTool, isProviderDefinedTool } from '@mastra/core/tools';\nimport { toStandardSchema, standardSchemaToJSONSchema } from '@mastra/schema-compat/schema';\nimport type { PublicSchema } from '@mastra/schema-compat/schema';\nimport { stringify } from 'superjson';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n executeToolContextBodySchema,\n executeToolResponseSchema,\n listToolsResponseSchema,\n serializedToolSchema,\n toolIdPathParams,\n agentToolPathParams,\n executeToolBodySchema,\n} from '../schemas/agents';\nimport { optionalRunIdSchema } from '../schemas/common';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { validateBody } from './utils';\n\n/**\n * Resolves a schema that may be a lazy function (e.g. AI SDK provider tools).\n * Recursively resolves until a non-function value is returned.\n * Skips functions that are themselves valid schemas (e.g. ArkType types are\n * callable but also implement StandardSchema via ~standard).\n */\nfunction resolveLazySchema(schema: unknown): unknown {\n if (typeof schema === 'function' && !('~standard' in schema)) {\n return resolveLazySchema(schema());\n }\n return schema;\n}\n\nfunction schemaToJsonSchema(schema: PublicSchema<unknown> | undefined) {\n if (!schema) {\n return undefined;\n }\n\n return standardSchemaToJSONSchema(toStandardSchema(schema), { target: 'draft-2020-12' });\n}\n\nfunction serializeSchema(schema: unknown): string | undefined {\n const jsonSchema = schemaToJsonSchema(resolveLazySchema(schema) as PublicSchema<unknown> | undefined);\n if (jsonSchema === undefined) return undefined;\n return stringify(jsonSchema);\n}\n\n/**\n * Searches dynamically-resolved agent tools (provided via `toolsResolver` /\n * function-based `tools`) for a tool with the given id. Used as a fallback\n * after the static tool registry (`registeredTools` + `mastra.getToolById`)\n * misses, so global tool routes can resolve tools that only exist on agents.\n *\n * Errors thrown by an individual agent's `listTools()` are logged and\n * skipped so a single broken resolver doesn't take down the whole lookup.\n */\nasync function findToolInAgents(mastra: any, toolId: string, requestContext: any): Promise<any | undefined> {\n const agents = mastra.listAgents() || {};\n for (const agent of Object.values(agents) as any[]) {\n try {\n const agentTools = await agent.listTools({ requestContext });\n const found = Object.values(agentTools || {}).find((t: any) => t.id === toolId);\n if (found) return found;\n } catch (error) {\n mastra.getLogger?.()?.warn?.('Failed to list tools for agent while resolving tool by id', {\n agentId: agent?.id,\n toolId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return undefined;\n}\n\n/**\n * Serializes a tool for API responses, handling both regular tools (with Zod schemas)\n * and provider-defined tools (with AI SDK lazy schemas).\n */\nfunction serializeTool(tool: any): any {\n // Provider-defined tools (e.g. google.tools.googleSearch(), openai.tools.webSearch())\n // have lazy inputSchema functions that return AI SDK Schema objects, not Zod schemas.\n // We resolve them and use the jsonSchema property directly.\n if (isProviderDefinedTool(tool)) {\n const resolvedInput = resolveLazySchema(tool.inputSchema);\n const resolvedOutput = resolveLazySchema(tool.outputSchema);\n return {\n ...tool,\n inputSchema:\n resolvedInput && typeof resolvedInput === 'object' && 'jsonSchema' in resolvedInput\n ? stringify(resolvedInput.jsonSchema)\n : undefined,\n outputSchema:\n resolvedOutput && typeof resolvedOutput === 'object' && 'jsonSchema' in resolvedOutput\n ? stringify(resolvedOutput.jsonSchema)\n : undefined,\n };\n }\n\n return {\n ...tool,\n inputSchema: serializeSchema(tool.inputSchema),\n outputSchema: serializeSchema(tool.outputSchema),\n requestContextSchema: serializeSchema(tool.requestContextSchema),\n };\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport const LIST_TOOLS_ROUTE = createRoute({\n method: 'GET',\n path: '/tools',\n responseType: 'json',\n responseSchema: listToolsResponseSchema,\n summary: 'List all tools',\n description: 'Returns a list of all available tools in the system',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, registeredTools, requestContext }) => {\n try {\n // Merge tools from two sources: mastra.listTools() includes dynamically created tools\n // (e.g. MCP tools, or agent tools registered by their intrinsic id), while registeredTools\n // includes tools discovered by the CLI bundler (keyed by export name).\n //\n // The same tool instance can appear in both maps under different keys (e.g. an agent\n // registers it by `tool.id` while the bundler registers it by export name). Dedupe by\n // `tool.id`, preferring the registeredTools (bundler) key, so each tool appears once.\n const registered = registeredTools && Object.keys(registeredTools).length > 0 ? registeredTools : {};\n\n const allTools: Record<string, any> = {};\n const seenToolIds = new Map<string, string>();\n\n // registeredTools first so their key wins for a given tool.id.\n for (const [key, tool] of Object.entries(registered)) {\n const toolId = typeof (tool as any)?.id === 'string' ? (tool as any).id : undefined;\n if (toolId !== undefined) seenToolIds.set(toolId, key);\n allTools[key] = tool;\n }\n\n for (const [key, tool] of Object.entries(mastra.listTools() ?? {})) {\n const toolId = typeof (tool as any)?.id === 'string' ? (tool as any).id : undefined;\n // Skip if this exact tool.id was already registered (under any key) by registeredTools.\n if (toolId !== undefined && seenToolIds.has(toolId)) continue;\n if (toolId !== undefined) seenToolIds.set(toolId, key);\n allTools[key] = tool;\n }\n\n const serializedTools = Object.entries(allTools).reduce(\n (acc, [id, _tool]) => {\n acc[id] = serializeTool(_tool);\n return acc;\n },\n {} as Record<string, any>,\n );\n\n // Filter tools by FGA if configured\n const fgaProvider = mastra.getServer?.()?.fga;\n const user = requestContext?.get('user');\n if (fgaProvider && user) {\n const toolList = Object.entries(serializedTools).map(([id, t]) => ({ id, ...t }));\n const accessible = await fgaProvider.filterAccessible(user, toolList, 'tool', MastraFGAPermissions.TOOLS_READ);\n const accessibleSet = new Set(accessible.map((t: any) => t.id));\n for (const id of Object.keys(serializedTools)) {\n if (!accessibleSet.has(id)) {\n delete serializedTools[id];\n }\n }\n }\n\n return serializedTools;\n } catch (error) {\n return handleError(error, 'Error getting tools');\n }\n },\n});\n\nexport const GET_TOOL_BY_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/tools/:toolId',\n responseType: 'json',\n pathParamSchema: toolIdPathParams,\n responseSchema: serializedToolSchema,\n summary: 'Get tool by ID',\n description: 'Returns details for a specific tool including its schema and configuration',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, registeredTools, toolId, requestContext }) => {\n try {\n let tool: any;\n\n // Try explicit registeredTools first, then fallback to mastra\n if (registeredTools && Object.keys(registeredTools).length > 0) {\n tool = Object.values(registeredTools).find((t: any) => t.id === toolId);\n }\n if (!tool) {\n try {\n tool = mastra.getToolById(toolId);\n } catch {\n // tool not found in global registry, continue to agent fallback\n }\n }\n\n // Fallback: search dynamically-resolved agent tools (toolsResolver)\n if (!tool) {\n tool = await findToolInAgents(mastra, toolId, requestContext);\n }\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n return serializeTool(tool);\n } catch (error) {\n return handleError(error, 'Error getting tool');\n }\n },\n});\n\nexport const EXECUTE_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: toolIdPathParams,\n queryParamSchema: optionalRunIdSchema,\n bodySchema: executeToolContextBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute tool',\n description: 'Executes a specific tool with the provided input data',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, runId, toolId, registeredTools, requestContext, ...bodyParams }) => {\n try {\n if (!toolId) {\n throw new HTTPException(400, { message: 'Tool ID is required' });\n }\n\n let tool: any;\n\n // Try explicit registeredTools first, then fallback to mastra\n if (registeredTools && Object.keys(registeredTools).length > 0) {\n tool = Object.values(registeredTools).find((t: any) => t.id === toolId);\n }\n if (!tool) {\n try {\n tool = mastra.getToolById(toolId);\n } catch {\n // tool not found in global registry, continue to agent fallback\n }\n }\n\n // Fallback: search dynamically-resolved agent tools (toolsResolver)\n if (!tool) {\n tool = await findToolInAgents(mastra, toolId, requestContext);\n }\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n if (!tool?.execute) {\n throw new HTTPException(400, { message: 'Tool is not executable' });\n }\n\n const { data } = bodyParams;\n\n validateBody({ data });\n\n let result;\n if (isVercelTool(tool)) {\n result = await (tool as any).execute(data);\n } else {\n result = await tool.execute(data!, {\n mastra,\n requestContext,\n // TODO: Pass proper tracing context when server API supports tracing\n tracingContext: { currentSpan: undefined },\n ...(runId\n ? {\n workflow: {\n runId,\n suspend: async () => {},\n },\n }\n : {}),\n });\n }\n\n return result;\n } catch (error) {\n return handleError(error, 'Error executing tool');\n }\n },\n});\n\n// ============================================================================\n// Agent Tool Routes\n// ============================================================================\n\nexport const GET_AGENT_TOOL_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/tools/:toolId',\n responseType: 'json',\n pathParamSchema: agentToolPathParams,\n responseSchema: serializedToolSchema,\n summary: 'Get agent tool',\n description: 'Returns details for a specific tool assigned to the agent',\n tags: ['Agents', 'Tools'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, toolId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const agentTools = await agent.listTools({ requestContext });\n\n const tool = Object.values(agentTools || {}).find((tool: any) => tool.id === toolId) as any;\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n return serializeTool(tool);\n } catch (error) {\n return handleError(error, 'Error getting agent tool');\n }\n },\n});\n\nexport const EXECUTE_AGENT_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: agentToolPathParams,\n bodySchema: executeToolBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute agent tool',\n description: 'Executes a specific tool assigned to the agent with the provided input data',\n tags: ['Agents', 'Tools'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, toolId, data, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const agentTools = await agent.listTools({ requestContext });\n\n const tool = Object.values(agentTools || {}).find((tool: any) => tool.id === toolId) as any;\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n if (!tool?.execute) {\n throw new HTTPException(400, { message: 'Tool is not executable' });\n }\n\n const result = await tool.execute(data, {\n mastra,\n requestContext,\n // TODO: Pass proper tracing context when server API supports tracing\n tracingContext: { currentSpan: undefined },\n });\n\n return result;\n } catch (error) {\n return handleError(error, 'Error executing agent tool');\n }\n },\n});\n"]}
'use strict';
var chunkT3C54LPX_cjs = require('./chunk-T3C54LPX.cjs');
var chunkO4O2EJF7_cjs = require('./chunk-O4O2EJF7.cjs');
var chunkTDMX66RN_cjs = require('./chunk-TDMX66RN.cjs');
var chunkKGUHJRHZ_cjs = require('./chunk-KGUHJRHZ.cjs');
var chunkGZ4HWZWE_cjs = require('./chunk-GZ4HWZWE.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
// src/server/handlers/stored-skill-favorites.ts
async function getFavoritesContext(mastra) {
const storage = mastra.getStorage();
if (!storage) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Storage is not configured" });
}
const skillStore = await storage.getStore("skills");
if (!skillStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Skills storage domain is not available" });
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Favorites storage domain is not available" });
}
return { skillStore, favoritesStore };
}
var FAVORITE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "PUT",
path: "/stored/skills/:storedSkillId/favorite",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
responseSchema: chunkO4O2EJF7_cjs.favoriteToggleResponseSchema,
summary: "Favorite a stored skill",
description: "Marks the stored skill as favorited by the calling user. Idempotent.",
tags: ["Stored Skills"],
requiresAuth: true,
requiresPermission: "stored-skills:read",
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
await chunkTDMX66RN_cjs.requireBuilderFeature(mastra, "favorites");
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!callerId) {
throw new chunk64ITUOXI_cjs.HTTPException(401, { message: "Authentication required" });
}
const { skillStore, favoritesStore } = await getFavoritesContext(mastra);
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(skill, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
const result = await favoritesStore.favorite({
userId: callerId,
entityType: "skill",
entityId: storedSkillId
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error favoriting stored skill");
}
}
});
var UNFAVORITE_STORED_SKILL_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/stored/skills/:storedSkillId/favorite",
responseType: "json",
pathParamSchema: chunkT3C54LPX_cjs.storedSkillIdPathParams,
responseSchema: chunkO4O2EJF7_cjs.favoriteToggleResponseSchema,
summary: "Unfavorite a stored skill",
description: "Removes the caller\u2019s favorite from the stored skill. Idempotent.",
tags: ["Stored Skills"],
requiresAuth: true,
requiresPermission: "stored-skills:read",
handler: async ({ mastra, requestContext, storedSkillId }) => {
try {
await chunkTDMX66RN_cjs.requireBuilderFeature(mastra, "favorites");
const callerId = chunkKGUHJRHZ_cjs.getCallerAuthorId(requestContext);
if (!callerId) {
throw new chunk64ITUOXI_cjs.HTTPException(401, { message: "Authentication required" });
}
const { skillStore, favoritesStore } = await getFavoritesContext(mastra);
const skill = await skillStore.getByIdResolved(storedSkillId);
if (!skill) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });
}
chunkGZ4HWZWE_cjs.assertStoredResourceScope(skill, await chunkGZ4HWZWE_cjs.getStoredResourceScope(mastra, requestContext));
chunkKGUHJRHZ_cjs.assertReadAccess({ requestContext, resource: "stored-skills", resourceId: storedSkillId, record: skill });
const result = await favoritesStore.unfavorite({
userId: callerId,
entityType: "skill",
entityId: storedSkillId
});
return result;
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error unfavoriting stored skill");
}
}
});
exports.FAVORITE_STORED_SKILL_ROUTE = FAVORITE_STORED_SKILL_ROUTE;
exports.UNFAVORITE_STORED_SKILL_ROUTE = UNFAVORITE_STORED_SKILL_ROUTE;
//# sourceMappingURL=chunk-SBAFNGQD.cjs.map
//# sourceMappingURL=chunk-SBAFNGQD.cjs.map
{"version":3,"sources":["../src/server/handlers/stored-skill-favorites.ts"],"names":["HTTPException","createRoute","storedSkillIdPathParams","favoriteToggleResponseSchema","requireBuilderFeature","getCallerAuthorId","assertStoredResourceScope","getStoredResourceScope","assertReadAccess","handleError"],"mappings":"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","file":"chunk-SBAFNGQD.cjs","sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedSkillIdPathParams } from '../schemas/stored-skills';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const skillStore = await storage.getStore('skills');\n if (!skillStore) {\n throw new HTTPException(500, { message: 'Skills storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { skillStore, favoritesStore };\n}\n\n/**\n * PUT /stored/skills/:storedSkillId/favorite\n */\nexport const FAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored skill',\n description: 'Marks the stored skill as favorited by the calling user. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the skill (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored skill');\n }\n },\n});\n\n/**\n * DELETE /stored/skills/:storedSkillId/favorite\n */\nexport const UNFAVORITE_STORED_SKILL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/skills/:storedSkillId/favorite',\n responseType: 'json',\n pathParamSchema: storedSkillIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored skill',\n description: 'Removes the caller’s favorite from the stored skill. Idempotent.',\n tags: ['Stored Skills'],\n requiresAuth: true,\n requiresPermission: 'stored-skills:read',\n handler: async ({ mastra, requestContext, storedSkillId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { skillStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const skill = await skillStore.getByIdResolved(storedSkillId);\n if (!skill) {\n throw new HTTPException(404, { message: `Stored skill with id ${storedSkillId} not found` });\n }\n assertStoredResourceScope(skill, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-skills', resourceId: storedSkillId, record: skill });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'skill',\n entityId: storedSkillId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored skill');\n }\n },\n});\n"]}
'use strict';
var chunkHTBC6CVX_cjs = require('./chunk-HTBC6CVX.cjs');
var chunkF3HP5HM6_cjs = require('./chunk-F3HP5HM6.cjs');
var chunkYLWKZ3VK_cjs = require('./chunk-YLWKZ3VK.cjs');
var chunkUNXPZBTJ_cjs = require('./chunk-UNXPZBTJ.cjs');
var chunkRVD3DGBZ_cjs = require('./chunk-RVD3DGBZ.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
var chunkO7I5CWRX_cjs = require('./chunk-O7I5CWRX.cjs');
var crypto = require('crypto');
// src/server/handlers/conversations.ts
var conversations_exports = {};
chunkO7I5CWRX_cjs.__export(conversations_exports, {
CREATE_CONVERSATION_ROUTE: () => CREATE_CONVERSATION_ROUTE,
DELETE_CONVERSATION_ROUTE: () => DELETE_CONVERSATION_ROUTE,
GET_CONVERSATION_ITEMS_ROUTE: () => GET_CONVERSATION_ITEMS_ROUTE,
GET_CONVERSATION_ROUTE: () => GET_CONVERSATION_ROUTE
});
function buildConversationObject({ thread }) {
return {
id: thread.id,
object: "conversation",
thread
};
}
function buildConversationItemsList(items) {
return {
object: "list",
data: items,
first_id: items[0]?.id ?? null,
last_id: items.at(-1)?.id ?? null,
has_more: false
};
}
function buildConversationDeleted(conversationId) {
return {
id: conversationId,
object: "conversation.deleted",
deleted: true
};
}
var CREATE_CONVERSATION_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "POST",
path: "/v1/conversations",
responseType: "json",
bodySchema: chunkHTBC6CVX_cjs.createConversationBodySchema,
responseSchema: chunkHTBC6CVX_cjs.conversationObjectSchema,
summary: "Create a conversation",
description: "Creates a new thread-backed conversation for agent-backed Responses API requests",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_CREATE,
handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {
try {
if (!mastra) {
throw new chunk64ITUOXI_cjs.HTTPException(500, { message: "Mastra instance is required for conversations" });
}
const agent = await chunkUNXPZBTJ_cjs.getAgentFromSystem({ mastra, agentId: agent_id });
const memory = await agent.getMemory({ requestContext });
if (!memory) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Agent "${agent.id}" does not have memory configured` });
}
if (!await chunkYLWKZ3VK_cjs.getAgentMemoryStore({ agent, requestContext })) {
throw new chunk64ITUOXI_cjs.HTTPException(400, { message: `Memory storage is not configured for agent "${agent.id}"` });
}
const threadId = conversation_id ?? crypto.randomUUID();
const resourceId = chunkRVD3DGBZ_cjs.getEffectiveResourceId(requestContext, resource_id) ?? threadId;
const thread = await memory.createThread({
threadId,
resourceId,
title,
metadata
});
return buildConversationObject({ thread });
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error creating conversation");
}
}
});
var GET_CONVERSATION_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/v1/conversations/:conversationId",
responseType: "json",
pathParamSchema: chunkHTBC6CVX_cjs.conversationIdPathParams,
responseSchema: chunkHTBC6CVX_cjs.conversationObjectSchema,
summary: "Retrieve a conversation",
description: "Returns a conversation object backed by a Mastra memory thread",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await chunkYLWKZ3VK_cjs.findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
return buildConversationObject({ thread: match.thread });
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error retrieving conversation");
}
}
});
var GET_CONVERSATION_ITEMS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/v1/conversations/:conversationId/items",
responseType: "json",
pathParamSchema: chunkHTBC6CVX_cjs.conversationIdPathParams,
responseSchema: chunkHTBC6CVX_cjs.conversationItemsListSchema,
summary: "List conversation items",
description: "Returns OpenAI-style conversation items derived from the stored thread messages",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_READ,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await chunkYLWKZ3VK_cjs.findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
const { messages } = await match.memoryStore.listMessages({
threadId: conversationId,
page: 0,
perPage: 1e3
});
return buildConversationItemsList(chunkF3HP5HM6_cjs.mapMastraMessagesToConversationItems(messages));
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error retrieving conversation");
}
}
});
var DELETE_CONVERSATION_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "DELETE",
path: "/v1/conversations/:conversationId",
responseType: "json",
pathParamSchema: chunkHTBC6CVX_cjs.conversationIdPathParams,
responseSchema: chunkHTBC6CVX_cjs.conversationDeletedSchema,
summary: "Delete a conversation",
description: "Deletes a thread-backed conversation and its stored items",
tags: ["Responses"],
requiresAuth: true,
requiresPermission: chunkRVD3DGBZ_cjs.MastraFGAPermissions.AGENTS_DELETE,
handler: async ({ mastra, requestContext, conversationId }) => {
try {
const match = await chunkYLWKZ3VK_cjs.findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });
if (!match) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Conversation ${conversationId} was not found` });
}
await match.memoryStore.deleteThread({ threadId: conversationId });
return buildConversationDeleted(conversationId);
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error deleting conversation");
}
}
});
exports.CREATE_CONVERSATION_ROUTE = CREATE_CONVERSATION_ROUTE;
exports.DELETE_CONVERSATION_ROUTE = DELETE_CONVERSATION_ROUTE;
exports.GET_CONVERSATION_ITEMS_ROUTE = GET_CONVERSATION_ITEMS_ROUTE;
exports.GET_CONVERSATION_ROUTE = GET_CONVERSATION_ROUTE;
exports.conversations_exports = conversations_exports;
//# sourceMappingURL=chunk-SPHAWZ5H.cjs.map
//# sourceMappingURL=chunk-SPHAWZ5H.cjs.map
{"version":3,"sources":["../src/server/handlers/conversations.ts"],"names":["__export","createRoute","createConversationBodySchema","conversationObjectSchema","MastraFGAPermissions","HTTPException","getAgentFromSystem","getAgentMemoryStore","randomUUID","getEffectiveResourceId","handleError","conversationIdPathParams","findConversationThreadAcrossAgents","conversationItemsListSchema","mapMastraMessagesToConversationItems","conversationDeletedSchema"],"mappings":"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","file":"chunk-SPHAWZ5H.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n conversationDeletedSchema,\n conversationIdPathParams,\n conversationItemsListSchema,\n conversationObjectSchema,\n createConversationBodySchema,\n} from '../schemas/conversations';\nimport type { ConversationDeleted, ConversationItemsList, ConversationObject } from '../schemas/conversations';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { mapMastraMessagesToConversationItems } from './responses.adapter';\nimport { findConversationThreadAcrossAgents, getAgentMemoryStore } from './responses.storage';\nimport { getEffectiveResourceId } from './utils';\n\nfunction buildConversationObject({ thread }: { thread: ConversationObject['thread'] }): ConversationObject {\n return {\n id: thread.id,\n object: 'conversation',\n thread,\n };\n}\n\nfunction buildConversationItemsList(items: ConversationItemsList['data']): ConversationItemsList {\n return {\n object: 'list',\n data: items,\n first_id: items[0]?.id ?? null,\n last_id: items.at(-1)?.id ?? null,\n has_more: false,\n };\n}\n\nfunction buildConversationDeleted(conversationId: string): ConversationDeleted {\n return {\n id: conversationId,\n object: 'conversation.deleted',\n deleted: true,\n };\n}\n\nexport const CREATE_CONVERSATION_ROUTE = createRoute({\n method: 'POST',\n path: '/v1/conversations',\n responseType: 'json',\n bodySchema: createConversationBodySchema,\n responseSchema: conversationObjectSchema,\n summary: 'Create a conversation',\n description: 'Creates a new thread-backed conversation for agent-backed Responses API requests',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_CREATE,\n handler: async ({ mastra, requestContext, agent_id, conversation_id, resource_id, title, metadata }) => {\n try {\n if (!mastra) {\n throw new HTTPException(500, { message: 'Mastra instance is required for conversations' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId: agent_id });\n const memory = await agent.getMemory({ requestContext });\n if (!memory) {\n throw new HTTPException(400, { message: `Agent \"${agent.id}\" does not have memory configured` });\n }\n if (!(await getAgentMemoryStore({ agent, requestContext }))) {\n throw new HTTPException(400, { message: `Memory storage is not configured for agent \"${agent.id}\"` });\n }\n\n const threadId = conversation_id ?? randomUUID();\n const resourceId = getEffectiveResourceId(requestContext, resource_id) ?? threadId;\n const thread = await memory.createThread({\n threadId,\n resourceId,\n title,\n metadata,\n });\n\n return buildConversationObject({ thread });\n } catch (error) {\n return handleError(error, 'Error creating conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationObjectSchema,\n summary: 'Retrieve a conversation',\n description: 'Returns a conversation object backed by a Mastra memory thread',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n return buildConversationObject({ thread: match.thread });\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const GET_CONVERSATION_ITEMS_ROUTE = createRoute({\n method: 'GET',\n path: '/v1/conversations/:conversationId/items',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationItemsListSchema,\n summary: 'List conversation items',\n description: 'Returns OpenAI-style conversation items derived from the stored thread messages',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_READ,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n const { messages } = await match.memoryStore.listMessages({\n threadId: conversationId,\n page: 0,\n perPage: 1000,\n });\n\n return buildConversationItemsList(mapMastraMessagesToConversationItems(messages));\n } catch (error) {\n return handleError(error, 'Error retrieving conversation');\n }\n },\n});\n\nexport const DELETE_CONVERSATION_ROUTE = createRoute({\n method: 'DELETE',\n path: '/v1/conversations/:conversationId',\n responseType: 'json',\n pathParamSchema: conversationIdPathParams,\n responseSchema: conversationDeletedSchema,\n summary: 'Delete a conversation',\n description: 'Deletes a thread-backed conversation and its stored items',\n tags: ['Responses'],\n requiresAuth: true,\n requiresPermission: MastraFGAPermissions.AGENTS_DELETE,\n handler: async ({ mastra, requestContext, conversationId }) => {\n try {\n const match = await findConversationThreadAcrossAgents({ mastra, conversationId, requestContext });\n if (!match) {\n throw new HTTPException(404, { message: `Conversation ${conversationId} was not found` });\n }\n\n await match.memoryStore.deleteThread({ threadId: conversationId });\n\n return buildConversationDeleted(conversationId);\n } catch (error) {\n return handleError(error, 'Error deleting conversation');\n }\n },\n});\n"]}
import { getAgentFromSystem } from './chunk-L6FOTAND.js';
import { listToolsResponseSchema, serializedToolSchema, toolIdPathParams, executeToolResponseSchema, executeToolContextBodySchema, agentToolPathParams, executeToolBodySchema } from './chunk-4JILES3G.js';
import { MastraFGAPermissions, validateBody } from './chunk-3ENQND57.js';
import { optionalRunIdSchema } from './chunk-2YY3EMMS.js';
import { stringify } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { standardSchemaToJSONSchema, toStandardSchema5 } from './chunk-JIL453ER.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
import { __export } from './chunk-PR4QN5HX.js';
import { isVercelTool, isProviderDefinedTool } from '@mastra/core/tools';
// src/server/handlers/tools.ts
var tools_exports = {};
__export(tools_exports, {
EXECUTE_AGENT_TOOL_ROUTE: () => EXECUTE_AGENT_TOOL_ROUTE,
EXECUTE_TOOL_ROUTE: () => EXECUTE_TOOL_ROUTE,
GET_AGENT_TOOL_ROUTE: () => GET_AGENT_TOOL_ROUTE,
GET_TOOL_BY_ID_ROUTE: () => GET_TOOL_BY_ID_ROUTE,
LIST_TOOLS_ROUTE: () => LIST_TOOLS_ROUTE
});
function resolveLazySchema(schema) {
if (typeof schema === "function" && !("~standard" in schema)) {
return resolveLazySchema(schema());
}
return schema;
}
function schemaToJsonSchema(schema) {
if (!schema) {
return void 0;
}
return standardSchemaToJSONSchema(toStandardSchema5(schema), { target: "draft-2020-12" });
}
function serializeSchema(schema) {
const jsonSchema = schemaToJsonSchema(resolveLazySchema(schema));
if (jsonSchema === void 0) return void 0;
return stringify(jsonSchema);
}
async function findToolInAgents(mastra, toolId, requestContext) {
const agents = mastra.listAgents() || {};
for (const agent of Object.values(agents)) {
try {
const agentTools = await agent.listTools({ requestContext });
const found = Object.values(agentTools || {}).find((t) => t.id === toolId);
if (found) return found;
} catch (error) {
mastra.getLogger?.()?.warn?.("Failed to list tools for agent while resolving tool by id", {
agentId: agent?.id,
toolId,
error: error instanceof Error ? error.message : String(error)
});
}
}
return void 0;
}
function serializeTool(tool) {
if (isProviderDefinedTool(tool)) {
const resolvedInput = resolveLazySchema(tool.inputSchema);
const resolvedOutput = resolveLazySchema(tool.outputSchema);
return {
...tool,
inputSchema: resolvedInput && typeof resolvedInput === "object" && "jsonSchema" in resolvedInput ? stringify(resolvedInput.jsonSchema) : void 0,
outputSchema: resolvedOutput && typeof resolvedOutput === "object" && "jsonSchema" in resolvedOutput ? stringify(resolvedOutput.jsonSchema) : void 0
};
}
return {
...tool,
inputSchema: serializeSchema(tool.inputSchema),
outputSchema: serializeSchema(tool.outputSchema),
requestContextSchema: serializeSchema(tool.requestContextSchema)
};
}
var LIST_TOOLS_ROUTE = createRoute({
method: "GET",
path: "/tools",
responseType: "json",
responseSchema: listToolsResponseSchema,
summary: "List all tools",
description: "Returns a list of all available tools in the system",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, registeredTools, requestContext }) => {
try {
const registered = registeredTools && Object.keys(registeredTools).length > 0 ? registeredTools : {};
const allTools = {};
const seenToolIds = /* @__PURE__ */ new Map();
for (const [key, tool] of Object.entries(registered)) {
const toolId = typeof tool?.id === "string" ? tool.id : void 0;
if (toolId !== void 0) seenToolIds.set(toolId, key);
allTools[key] = tool;
}
for (const [key, tool] of Object.entries(mastra.listTools() ?? {})) {
const toolId = typeof tool?.id === "string" ? tool.id : void 0;
if (toolId !== void 0 && seenToolIds.has(toolId)) continue;
if (toolId !== void 0) seenToolIds.set(toolId, key);
allTools[key] = tool;
}
const serializedTools = Object.entries(allTools).reduce(
(acc, [id, _tool]) => {
acc[id] = serializeTool(_tool);
return acc;
},
{}
);
const fgaProvider = mastra.getServer?.()?.fga;
const user = requestContext?.get("user");
if (fgaProvider && user) {
const toolList = Object.entries(serializedTools).map(([id, t]) => ({ id, ...t }));
const accessible = await fgaProvider.filterAccessible(user, toolList, "tool", MastraFGAPermissions.TOOLS_READ);
const accessibleSet = new Set(accessible.map((t) => t.id));
for (const id of Object.keys(serializedTools)) {
if (!accessibleSet.has(id)) {
delete serializedTools[id];
}
}
}
return serializedTools;
} catch (error) {
return handleError(error, "Error getting tools");
}
}
});
var GET_TOOL_BY_ID_ROUTE = createRoute({
method: "GET",
path: "/tools/:toolId",
responseType: "json",
pathParamSchema: toolIdPathParams,
responseSchema: serializedToolSchema,
summary: "Get tool by ID",
description: "Returns details for a specific tool including its schema and configuration",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, registeredTools, toolId, requestContext }) => {
try {
let tool;
if (registeredTools && Object.keys(registeredTools).length > 0) {
tool = Object.values(registeredTools).find((t) => t.id === toolId);
}
if (!tool) {
try {
tool = mastra.getToolById(toolId);
} catch {
}
}
if (!tool) {
tool = await findToolInAgents(mastra, toolId, requestContext);
}
if (!tool) {
throw new HTTPException(404, { message: "Tool not found" });
}
return serializeTool(tool);
} catch (error) {
return handleError(error, "Error getting tool");
}
}
});
var EXECUTE_TOOL_ROUTE = createRoute({
method: "POST",
path: "/tools/:toolId/execute",
responseType: "json",
pathParamSchema: toolIdPathParams,
queryParamSchema: optionalRunIdSchema,
bodySchema: executeToolContextBodySchema,
responseSchema: executeToolResponseSchema,
summary: "Execute tool",
description: "Executes a specific tool with the provided input data",
tags: ["Tools"],
requiresAuth: true,
handler: async ({ mastra, runId, toolId, registeredTools, requestContext, ...bodyParams }) => {
try {
if (!toolId) {
throw new HTTPException(400, { message: "Tool ID is required" });
}
let tool;
if (registeredTools && Object.keys(registeredTools).length > 0) {
tool = Object.values(registeredTools).find((t) => t.id === toolId);
}
if (!tool) {
try {
tool = mastra.getToolById(toolId);
} catch {
}
}
if (!tool) {
tool = await findToolInAgents(mastra, toolId, requestContext);
}
if (!tool) {
throw new HTTPException(404, { message: "Tool not found" });
}
if (!tool?.execute) {
throw new HTTPException(400, { message: "Tool is not executable" });
}
const { data } = bodyParams;
validateBody({ data });
let result;
if (isVercelTool(tool)) {
result = await tool.execute(data);
} else {
result = await tool.execute(data, {
mastra,
requestContext,
// TODO: Pass proper tracing context when server API supports tracing
tracingContext: { currentSpan: void 0 },
...runId ? {
workflow: {
runId,
suspend: async () => {
}
}
} : {}
});
}
return result;
} catch (error) {
return handleError(error, "Error executing tool");
}
}
});
var GET_AGENT_TOOL_ROUTE = createRoute({
method: "GET",
path: "/agents/:agentId/tools/:toolId",
responseType: "json",
pathParamSchema: agentToolPathParams,
responseSchema: serializedToolSchema,
summary: "Get agent tool",
description: "Returns details for a specific tool assigned to the agent",
tags: ["Agents", "Tools"],
requiresAuth: true,
handler: async ({ mastra, agentId, toolId, requestContext }) => {
try {
if (!agentId) {
throw new HTTPException(400, { message: "Agent ID is required" });
}
const agent = await getAgentFromSystem({ mastra, agentId });
const agentTools = await agent.listTools({ requestContext });
const tool = Object.values(agentTools || {}).find((tool2) => tool2.id === toolId);
if (!tool) {
throw new HTTPException(404, { message: "Tool not found" });
}
return serializeTool(tool);
} catch (error) {
return handleError(error, "Error getting agent tool");
}
}
});
var EXECUTE_AGENT_TOOL_ROUTE = createRoute({
method: "POST",
path: "/agents/:agentId/tools/:toolId/execute",
responseType: "json",
pathParamSchema: agentToolPathParams,
bodySchema: executeToolBodySchema,
responseSchema: executeToolResponseSchema,
summary: "Execute agent tool",
description: "Executes a specific tool assigned to the agent with the provided input data",
tags: ["Agents", "Tools"],
requiresAuth: true,
handler: async ({ mastra, agentId, toolId, data, requestContext }) => {
try {
if (!agentId) {
throw new HTTPException(400, { message: "Agent ID is required" });
}
const agent = await getAgentFromSystem({ mastra, agentId });
const agentTools = await agent.listTools({ requestContext });
const tool = Object.values(agentTools || {}).find((tool2) => tool2.id === toolId);
if (!tool) {
throw new HTTPException(404, { message: "Tool not found" });
}
if (!tool?.execute) {
throw new HTTPException(400, { message: "Tool is not executable" });
}
const result = await tool.execute(data, {
mastra,
requestContext,
// TODO: Pass proper tracing context when server API supports tracing
tracingContext: { currentSpan: void 0 }
});
return result;
} catch (error) {
return handleError(error, "Error executing agent tool");
}
}
});
export { EXECUTE_AGENT_TOOL_ROUTE, EXECUTE_TOOL_ROUTE, GET_AGENT_TOOL_ROUTE, GET_TOOL_BY_ID_ROUTE, LIST_TOOLS_ROUTE, tools_exports };
//# sourceMappingURL=chunk-T3T23PHF.js.map
//# sourceMappingURL=chunk-T3T23PHF.js.map
{"version":3,"sources":["../src/server/handlers/tools.ts"],"names":["tool"],"mappings":"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","file":"chunk-T3T23PHF.js","sourcesContent":["import { isVercelTool, isProviderDefinedTool } from '@mastra/core/tools';\nimport { toStandardSchema, standardSchemaToJSONSchema } from '@mastra/schema-compat/schema';\nimport type { PublicSchema } from '@mastra/schema-compat/schema';\nimport { stringify } from 'superjson';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\nimport {\n executeToolContextBodySchema,\n executeToolResponseSchema,\n listToolsResponseSchema,\n serializedToolSchema,\n toolIdPathParams,\n agentToolPathParams,\n executeToolBodySchema,\n} from '../schemas/agents';\nimport { optionalRunIdSchema } from '../schemas/common';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { validateBody } from './utils';\n\n/**\n * Resolves a schema that may be a lazy function (e.g. AI SDK provider tools).\n * Recursively resolves until a non-function value is returned.\n * Skips functions that are themselves valid schemas (e.g. ArkType types are\n * callable but also implement StandardSchema via ~standard).\n */\nfunction resolveLazySchema(schema: unknown): unknown {\n if (typeof schema === 'function' && !('~standard' in schema)) {\n return resolveLazySchema(schema());\n }\n return schema;\n}\n\nfunction schemaToJsonSchema(schema: PublicSchema<unknown> | undefined) {\n if (!schema) {\n return undefined;\n }\n\n return standardSchemaToJSONSchema(toStandardSchema(schema), { target: 'draft-2020-12' });\n}\n\nfunction serializeSchema(schema: unknown): string | undefined {\n const jsonSchema = schemaToJsonSchema(resolveLazySchema(schema) as PublicSchema<unknown> | undefined);\n if (jsonSchema === undefined) return undefined;\n return stringify(jsonSchema);\n}\n\n/**\n * Searches dynamically-resolved agent tools (provided via `toolsResolver` /\n * function-based `tools`) for a tool with the given id. Used as a fallback\n * after the static tool registry (`registeredTools` + `mastra.getToolById`)\n * misses, so global tool routes can resolve tools that only exist on agents.\n *\n * Errors thrown by an individual agent's `listTools()` are logged and\n * skipped so a single broken resolver doesn't take down the whole lookup.\n */\nasync function findToolInAgents(mastra: any, toolId: string, requestContext: any): Promise<any | undefined> {\n const agents = mastra.listAgents() || {};\n for (const agent of Object.values(agents) as any[]) {\n try {\n const agentTools = await agent.listTools({ requestContext });\n const found = Object.values(agentTools || {}).find((t: any) => t.id === toolId);\n if (found) return found;\n } catch (error) {\n mastra.getLogger?.()?.warn?.('Failed to list tools for agent while resolving tool by id', {\n agentId: agent?.id,\n toolId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return undefined;\n}\n\n/**\n * Serializes a tool for API responses, handling both regular tools (with Zod schemas)\n * and provider-defined tools (with AI SDK lazy schemas).\n */\nfunction serializeTool(tool: any): any {\n // Provider-defined tools (e.g. google.tools.googleSearch(), openai.tools.webSearch())\n // have lazy inputSchema functions that return AI SDK Schema objects, not Zod schemas.\n // We resolve them and use the jsonSchema property directly.\n if (isProviderDefinedTool(tool)) {\n const resolvedInput = resolveLazySchema(tool.inputSchema);\n const resolvedOutput = resolveLazySchema(tool.outputSchema);\n return {\n ...tool,\n inputSchema:\n resolvedInput && typeof resolvedInput === 'object' && 'jsonSchema' in resolvedInput\n ? stringify(resolvedInput.jsonSchema)\n : undefined,\n outputSchema:\n resolvedOutput && typeof resolvedOutput === 'object' && 'jsonSchema' in resolvedOutput\n ? stringify(resolvedOutput.jsonSchema)\n : undefined,\n };\n }\n\n return {\n ...tool,\n inputSchema: serializeSchema(tool.inputSchema),\n outputSchema: serializeSchema(tool.outputSchema),\n requestContextSchema: serializeSchema(tool.requestContextSchema),\n };\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport const LIST_TOOLS_ROUTE = createRoute({\n method: 'GET',\n path: '/tools',\n responseType: 'json',\n responseSchema: listToolsResponseSchema,\n summary: 'List all tools',\n description: 'Returns a list of all available tools in the system',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, registeredTools, requestContext }) => {\n try {\n // Merge tools from two sources: mastra.listTools() includes dynamically created tools\n // (e.g. MCP tools, or agent tools registered by their intrinsic id), while registeredTools\n // includes tools discovered by the CLI bundler (keyed by export name).\n //\n // The same tool instance can appear in both maps under different keys (e.g. an agent\n // registers it by `tool.id` while the bundler registers it by export name). Dedupe by\n // `tool.id`, preferring the registeredTools (bundler) key, so each tool appears once.\n const registered = registeredTools && Object.keys(registeredTools).length > 0 ? registeredTools : {};\n\n const allTools: Record<string, any> = {};\n const seenToolIds = new Map<string, string>();\n\n // registeredTools first so their key wins for a given tool.id.\n for (const [key, tool] of Object.entries(registered)) {\n const toolId = typeof (tool as any)?.id === 'string' ? (tool as any).id : undefined;\n if (toolId !== undefined) seenToolIds.set(toolId, key);\n allTools[key] = tool;\n }\n\n for (const [key, tool] of Object.entries(mastra.listTools() ?? {})) {\n const toolId = typeof (tool as any)?.id === 'string' ? (tool as any).id : undefined;\n // Skip if this exact tool.id was already registered (under any key) by registeredTools.\n if (toolId !== undefined && seenToolIds.has(toolId)) continue;\n if (toolId !== undefined) seenToolIds.set(toolId, key);\n allTools[key] = tool;\n }\n\n const serializedTools = Object.entries(allTools).reduce(\n (acc, [id, _tool]) => {\n acc[id] = serializeTool(_tool);\n return acc;\n },\n {} as Record<string, any>,\n );\n\n // Filter tools by FGA if configured\n const fgaProvider = mastra.getServer?.()?.fga;\n const user = requestContext?.get('user');\n if (fgaProvider && user) {\n const toolList = Object.entries(serializedTools).map(([id, t]) => ({ id, ...t }));\n const accessible = await fgaProvider.filterAccessible(user, toolList, 'tool', MastraFGAPermissions.TOOLS_READ);\n const accessibleSet = new Set(accessible.map((t: any) => t.id));\n for (const id of Object.keys(serializedTools)) {\n if (!accessibleSet.has(id)) {\n delete serializedTools[id];\n }\n }\n }\n\n return serializedTools;\n } catch (error) {\n return handleError(error, 'Error getting tools');\n }\n },\n});\n\nexport const GET_TOOL_BY_ID_ROUTE = createRoute({\n method: 'GET',\n path: '/tools/:toolId',\n responseType: 'json',\n pathParamSchema: toolIdPathParams,\n responseSchema: serializedToolSchema,\n summary: 'Get tool by ID',\n description: 'Returns details for a specific tool including its schema and configuration',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, registeredTools, toolId, requestContext }) => {\n try {\n let tool: any;\n\n // Try explicit registeredTools first, then fallback to mastra\n if (registeredTools && Object.keys(registeredTools).length > 0) {\n tool = Object.values(registeredTools).find((t: any) => t.id === toolId);\n }\n if (!tool) {\n try {\n tool = mastra.getToolById(toolId);\n } catch {\n // tool not found in global registry, continue to agent fallback\n }\n }\n\n // Fallback: search dynamically-resolved agent tools (toolsResolver)\n if (!tool) {\n tool = await findToolInAgents(mastra, toolId, requestContext);\n }\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n return serializeTool(tool);\n } catch (error) {\n return handleError(error, 'Error getting tool');\n }\n },\n});\n\nexport const EXECUTE_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: toolIdPathParams,\n queryParamSchema: optionalRunIdSchema,\n bodySchema: executeToolContextBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute tool',\n description: 'Executes a specific tool with the provided input data',\n tags: ['Tools'],\n requiresAuth: true,\n handler: async ({ mastra, runId, toolId, registeredTools, requestContext, ...bodyParams }) => {\n try {\n if (!toolId) {\n throw new HTTPException(400, { message: 'Tool ID is required' });\n }\n\n let tool: any;\n\n // Try explicit registeredTools first, then fallback to mastra\n if (registeredTools && Object.keys(registeredTools).length > 0) {\n tool = Object.values(registeredTools).find((t: any) => t.id === toolId);\n }\n if (!tool) {\n try {\n tool = mastra.getToolById(toolId);\n } catch {\n // tool not found in global registry, continue to agent fallback\n }\n }\n\n // Fallback: search dynamically-resolved agent tools (toolsResolver)\n if (!tool) {\n tool = await findToolInAgents(mastra, toolId, requestContext);\n }\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n if (!tool?.execute) {\n throw new HTTPException(400, { message: 'Tool is not executable' });\n }\n\n const { data } = bodyParams;\n\n validateBody({ data });\n\n let result;\n if (isVercelTool(tool)) {\n result = await (tool as any).execute(data);\n } else {\n result = await tool.execute(data!, {\n mastra,\n requestContext,\n // TODO: Pass proper tracing context when server API supports tracing\n tracingContext: { currentSpan: undefined },\n ...(runId\n ? {\n workflow: {\n runId,\n suspend: async () => {},\n },\n }\n : {}),\n });\n }\n\n return result;\n } catch (error) {\n return handleError(error, 'Error executing tool');\n }\n },\n});\n\n// ============================================================================\n// Agent Tool Routes\n// ============================================================================\n\nexport const GET_AGENT_TOOL_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/tools/:toolId',\n responseType: 'json',\n pathParamSchema: agentToolPathParams,\n responseSchema: serializedToolSchema,\n summary: 'Get agent tool',\n description: 'Returns details for a specific tool assigned to the agent',\n tags: ['Agents', 'Tools'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, toolId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const agentTools = await agent.listTools({ requestContext });\n\n const tool = Object.values(agentTools || {}).find((tool: any) => tool.id === toolId) as any;\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n return serializeTool(tool);\n } catch (error) {\n return handleError(error, 'Error getting agent tool');\n }\n },\n});\n\nexport const EXECUTE_AGENT_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: agentToolPathParams,\n bodySchema: executeToolBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute agent tool',\n description: 'Executes a specific tool assigned to the agent with the provided input data',\n tags: ['Agents', 'Tools'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, toolId, data, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const agentTools = await agent.listTools({ requestContext });\n\n const tool = Object.values(agentTools || {}).find((tool: any) => tool.id === toolId) as any;\n\n if (!tool) {\n throw new HTTPException(404, { message: 'Tool not found' });\n }\n\n if (!tool?.execute) {\n throw new HTTPException(400, { message: 'Tool is not executable' });\n }\n\n const result = await tool.execute(data, {\n mastra,\n requestContext,\n // TODO: Pass proper tracing context when server API supports tracing\n tracingContext: { currentSpan: undefined },\n });\n\n return result;\n } catch (error) {\n return handleError(error, 'Error executing agent tool');\n }\n },\n});\n"]}
'use strict';
var chunkV23ANIEC_cjs = require('./chunk-V23ANIEC.cjs');
var chunkUNXPZBTJ_cjs = require('./chunk-UNXPZBTJ.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
// src/server/utils/resolve-builder-model-policy.ts
async function resolveBuilderModelPolicy(editor) {
if (!editor) return { active: false };
if (typeof editor.resolveBuilder !== "function") return { active: false };
if (typeof editor.hasEnabledBuilderConfig === "function" && !editor.hasEnabledBuilderConfig()) {
return { active: false };
}
try {
const builder = await editor.resolveBuilder();
const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');
return builderToModelPolicy(builder);
} catch {
return { active: false };
}
}
// src/server/handlers/editor-builder.ts
async function resolveBuilderFeatures(mastra) {
const editor = mastra.getEditor();
if (!editor || typeof editor.resolveBuilder !== "function") return null;
if (!editor.hasEnabledBuilderConfig?.()) return null;
const builder = await editor.resolveBuilder();
if (!builder || !builder.enabled) return null;
const features = builder.getFeatures?.()?.agent;
if (!features) return null;
const parsed = chunkV23ANIEC_cjs.agentFeaturesSchema.safeParse(features);
return parsed.success ? parsed.data : null;
}
async function isBuilderFeatureEnabled(mastra, feature) {
const features = await resolveBuilderFeatures(mastra);
return features?.[feature] === true;
}
async function requireBuilderFeature(mastra, feature) {
if (!await isBuilderFeatureEnabled(mastra, feature)) {
throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Not Found" });
}
}
var GET_EDITOR_BUILDER_SETTINGS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/editor/builder/settings",
responseType: "json",
responseSchema: chunkV23ANIEC_cjs.builderSettingsResponseSchema,
summary: "Get agent builder settings",
description: "Returns the agent builder feature flags and configuration for UI gating",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra }) => {
try {
const editor = mastra.getEditor();
if (!editor) {
return { enabled: false, modelPolicy: { active: false } };
}
if (typeof editor.resolveBuilder !== "function") {
return { enabled: false, modelPolicy: { active: false } };
}
if (!editor.hasEnabledBuilderConfig?.()) {
return { enabled: false, modelPolicy: { active: false } };
}
const builder = await editor.resolveBuilder();
if (!builder || !builder.enabled) {
return { enabled: false, modelPolicy: { active: false } };
}
const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];
const configuration = builder.getConfiguration();
const collectAliases = (registry) => Object.entries(registry).map(([key, entity]) => ({
id: entity.id || key,
key
}));
const toolAliases = collectAliases(mastra.listTools() ?? {});
const agentAliases = collectAliases(mastra.listAgents() ?? {});
const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});
const toResponseKey = (aliases, byId) => {
const map = /* @__PURE__ */ new Map();
for (const a of aliases) {
map.set(a.id, byId === "id" ? a.id : a.key);
map.set(a.key, byId === "id" ? a.id : a.key);
}
return map;
};
const toolKeyMap = toResponseKey(toolAliases, "key");
const agentKeyMap = toResponseKey(agentAliases, "id");
const workflowKeyMap = toResponseKey(workflowAliases, "key");
const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');
const picker = resolvePickerVisibility({
config: configuration?.agent,
registeredToolIds: toolAliases.flatMap((a) => [a.id, a.key]),
registeredAgentIds: agentAliases.flatMap((a) => [a.id, a.key]),
registeredWorkflowIds: workflowAliases.flatMap((a) => [a.id, a.key])
});
const normalize = (visible, map) => {
if (visible === null) return null;
const out = [];
const seen = /* @__PURE__ */ new Set();
for (const id of visible) {
const mapped = map.get(id);
if (mapped && !seen.has(mapped)) {
seen.add(mapped);
out.push(mapped);
}
}
return out;
};
const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];
return {
enabled: true,
features: builder.getFeatures(),
configuration,
modelPolicy: builderToModelPolicy(builder),
picker: {
visibleTools: normalize(picker.visibleTools, toolKeyMap),
visibleAgents: normalize(picker.visibleAgents, agentKeyMap),
visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap)
},
...modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting builder settings");
}
}
});
var GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/editor/builder/models/available",
responseType: "json",
responseSchema: chunkV23ANIEC_cjs.builderAvailableModelsResponseSchema,
summary: "List builder-available AI models",
description: "Returns AI providers/models filtered by the active agent-builder model policy.",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra }) => {
try {
const providers = (await chunkUNXPZBTJ_cjs.buildProvidersList(mastra)).filter((provider) => provider.connected);
const policy = await resolveBuilderModelPolicy(mastra.getEditor());
if (!policy.active || !policy.allowed || policy.allowed.length === 0) {
return { providers };
}
const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');
const filtered = providers.map((provider) => ({
...provider,
models: provider.models.filter((modelId) => isModelAllowed(policy.allowed, { provider: provider.id, modelId }))
})).filter((provider) => provider.models.length > 0);
return { providers: filtered };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error fetching available models");
}
}
});
var GET_INFRASTRUCTURE_STATUS_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/editor/builder/infrastructure",
responseType: "json",
responseSchema: chunkV23ANIEC_cjs.infrastructureStatusResponseSchema,
summary: "Get infrastructure status",
description: "Agent Builder infrastructure configuration and lightweight runtime status.",
tags: ["Editor"],
requiresAuth: true,
requiresPermission: "infrastructure:read",
handler: async ({ mastra }) => {
try {
const formatConfigValue = (value) => {
if (value === null || value === void 0) return "not set";
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? "" : "s"}`;
return value.constructor?.name && value.constructor.name !== "Object" ? value.constructor.name : "configured";
};
const getProviderName = (value) => {
if (!value) return null;
if (typeof value === "object" && "provider" in value && typeof value.provider === "string")
return value.provider;
if (typeof value === "object" && "constructor" in value) {
const name = value.constructor?.name;
return name && name !== "Object" ? name : "configured";
}
return null;
};
const getConfigEntries = (config, omittedKeys = []) => Object.entries(config).filter(([key, value]) => !omittedKeys.includes(key) && value !== void 0 && value !== null).map(([key, value]) => ({ key, value: formatConfigValue(value) }));
const channelProviders = mastra.getChannelProviders() ?? {};
const channels = {
providers: Object.entries(channelProviders).map(([id, provider]) => {
const info = provider.getInfo?.();
const routes = provider.getRoutes?.() ?? [];
return {
id: info?.id ?? id,
name: info?.name ?? id,
isConfigured: info?.isConfigured ?? false,
routeCount: routes.length
};
}).filter((provider) => provider.isConfigured)
};
const editor = mastra.getEditor();
let browser = {
type: null,
provider: null,
env: null,
registered: false,
availableProviders: [],
config: []
};
let workspace = {
type: null,
workspaceId: null,
name: null,
source: null,
registered: false,
hasFilesystem: false,
hasSandbox: false,
filesystemProvider: null,
sandboxProvider: null,
config: []
};
let registries = {
skillsSh: { enabled: false }
};
if (editor?.resolveBuilder) {
const browsers = editor.__browsers;
const builder = await editor.resolveBuilder();
const builderRegistries = builder?.getRegistries?.();
registries = {
skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true }
};
const configuration = builder?.getConfiguration?.()?.agent;
const browserRef = configuration?.browser;
const browserConfig = browserRef?.config ?? {};
const providerId = browserConfig.provider ?? null;
browser = {
type: browserRef?.type ?? null,
provider: providerId,
env: browserConfig.env ?? null,
registered: providerId ? !!browsers?.has(providerId) : false,
availableProviders: browsers ? Array.from(browsers.keys()) : [],
config: getConfigEntries(browserConfig, ["provider", "env"])
};
const workspaceRef = configuration?.workspace;
const workspaceConfig = workspaceRef?.config ?? {};
const registeredWorkspaces = mastra.listWorkspaces();
const registeredWorkspace = workspaceRef?.workspaceId ? registeredWorkspaces[workspaceRef.workspaceId] : void 0;
const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;
const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;
const filesystemConfig = typeof workspaceConfig.filesystem === "object" && workspaceConfig.filesystem && "config" in workspaceConfig.filesystem ? workspaceConfig.filesystem.config : {};
const sandboxConfig = typeof workspaceConfig.sandbox === "object" && workspaceConfig.sandbox && "config" in workspaceConfig.sandbox ? workspaceConfig.sandbox.config : {};
workspace = {
type: workspaceRef?.type ?? null,
workspaceId: workspaceRef?.workspaceId ?? null,
name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,
source: registeredWorkspace?.source ?? null,
registered: !!registeredWorkspace,
hasFilesystem: !!filesystem,
hasSandbox: !!sandbox,
filesystemProvider: getProviderName(filesystem),
sandboxProvider: getProviderName(sandbox),
config: [
...getConfigEntries(filesystemConfig).map((entry) => ({ ...entry, key: `filesystem.${entry.key}` })),
...getConfigEntries(sandboxConfig).map((entry) => ({ ...entry, key: `sandbox.${entry.key}` }))
]
};
}
return { channels, browser, workspace, registries };
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting infrastructure status");
}
}
});
exports.GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE;
exports.GET_EDITOR_BUILDER_SETTINGS_ROUTE = GET_EDITOR_BUILDER_SETTINGS_ROUTE;
exports.GET_INFRASTRUCTURE_STATUS_ROUTE = GET_INFRASTRUCTURE_STATUS_ROUTE;
exports.isBuilderFeatureEnabled = isBuilderFeatureEnabled;
exports.requireBuilderFeature = requireBuilderFeature;
//# sourceMappingURL=chunk-TDMX66RN.cjs.map
//# sourceMappingURL=chunk-TDMX66RN.cjs.map
{"version":3,"sources":["../src/server/utils/resolve-builder-model-policy.ts","../src/server/handlers/editor-builder.ts"],"names":["agentFeaturesSchema","HTTPException","createRoute","builderSettingsResponseSchema","handleError","builderAvailableModelsResponseSchema","buildProvidersList","infrastructureStatusResponseSchema"],"mappings":"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","file":"chunk-TDMX66RN.cjs","sourcesContent":["import type { BuilderModelPolicy } from '@mastra/core/agent-builder/ee';\nimport type { IMastraEditor } from '@mastra/core/editor';\n\n/**\n * Server-side wrapper around `builderToModelPolicy`.\n *\n * Handles the optional `IMastraEditor` builder API surface (older / OSS editors\n * may not implement `hasEnabledBuilderConfig` / `resolveBuilder`) and returns\n * a uniform `BuilderModelPolicy` to every call site.\n *\n * Returns `{ active: false }` whenever:\n * - no editor is configured,\n * - the editor doesn't expose builder methods,\n * - the builder config is disabled, or\n * - resolving the builder fails / yields nothing.\n *\n * The `@mastra/core/agent-builder/ee` subpath is loaded lazily so this module\n * remains importable on `@mastra/core` versions that pre-date the subpath\n * (the subpath was added in core 1.34.0). The dynamic import is only reached\n * once an editor is actually configured, by which point a compatible core is\n * guaranteed.\n */\nexport async function resolveBuilderModelPolicy(editor: IMastraEditor | undefined): Promise<BuilderModelPolicy> {\n if (!editor) return { active: false };\n if (typeof editor.resolveBuilder !== 'function') return { active: false };\n if (typeof editor.hasEnabledBuilderConfig === 'function' && !editor.hasEnabledBuilderConfig()) {\n return { active: false };\n }\n\n // Degrade to inactive on builder-resolution failure rather than letting the\n // rejection escape: agent execution routes seed this on every request, so a\n // transient failure must not 500 the entire route.\n try {\n const builder = await editor.resolveBuilder();\n const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');\n return builderToModelPolicy(builder);\n } catch {\n return { active: false };\n }\n}\n","import type { Mastra } from '@mastra/core';\n\nimport { HTTPException } from '../http-exception';\nimport {\n agentFeaturesSchema,\n builderAvailableModelsResponseSchema,\n builderSettingsResponseSchema,\n infrastructureStatusResponseSchema,\n} from '../schemas/editor-builder';\nimport type { AgentFeatures, InfrastructureStatus } from '../schemas/editor-builder';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { resolveBuilderModelPolicy } from '../utils/resolve-builder-model-policy';\nimport { buildProvidersList } from './agents';\nimport { handleError } from './error';\n\n/**\n * Resolve the active builder feature flags. Returns `null` when the editor is\n * absent, the builder is disabled, or no features are configured.\n */\nasync function resolveBuilderFeatures(mastra: Mastra): Promise<AgentFeatures | null> {\n const editor = mastra.getEditor();\n if (!editor || typeof editor.resolveBuilder !== 'function') return null;\n if (!editor.hasEnabledBuilderConfig?.()) return null;\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) return null;\n const features = builder.getFeatures?.()?.agent;\n if (!features) return null;\n // Validate the shape so unknown keys cannot smuggle through.\n const parsed = agentFeaturesSchema.safeParse(features);\n return parsed.success ? parsed.data : null;\n}\n\n/**\n * Returns whether a given agent-builder feature is enabled. Used by list /\n * get-by-id handlers to soft-gate response enrichment (omit fields, ignore\n * favoritedOnly / pinFavoritedFor params) when the feature is off.\n */\nexport async function isBuilderFeatureEnabled(mastra: Mastra, feature: keyof AgentFeatures): Promise<boolean> {\n const features = await resolveBuilderFeatures(mastra);\n return features?.[feature] === true;\n}\n\n/**\n * Hard-gate helper for mutation routes that must not exist when the feature\n * is off. Throws `HTTPException(404)` so we don't leak the existence of the\n * feature surface (matches behavior of unregistered routes).\n */\nexport async function requireBuilderFeature(mastra: Mastra, feature: keyof AgentFeatures): Promise<void> {\n if (!(await isBuilderFeatureEnabled(mastra, feature))) {\n throw new HTTPException(404, { message: 'Not Found' });\n }\n}\n\n/**\n * GET /editor/builder/settings\n *\n * Returns the agent builder settings configured by the admin.\n * Used by frontend to determine which features to display.\n */\nexport const GET_EDITOR_BUILDER_SETTINGS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/settings',\n responseType: 'json',\n responseSchema: builderSettingsResponseSchema,\n summary: 'Get agent builder settings',\n description: 'Returns the agent builder feature flags and configuration for UI gating',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n const editor = mastra.getEditor();\n\n // No editor configured\n if (!editor) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Editor doesn't support builder (older version or OSS)\n if (typeof editor.resolveBuilder !== 'function') {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Check if builder is enabled in config\n if (!editor.hasEnabledBuilderConfig?.()) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Resolve the builder instance\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];\n const configuration = builder.getConfiguration();\n\n // Picker allowlists are written against entity `.id` (what users see in\n // the UI, URLs, traces). The client filters list responses by their\n // response keys, which are not always `.id`:\n // - GET /agents keys by `agent.id`\n // - GET /tools keys by registration key (values include `id`)\n // - GET /workflows keys by registration key (values omit `id`)\n // To keep the client filter simple, we accept `.id` (fallback to\n // registration key) for matching, but emit visible IDs as response keys\n // so `Object.keys(data)` lines up.\n type AliasPair = { id: string; key: string };\n const collectAliases = (registry: Record<string, unknown>): AliasPair[] =>\n Object.entries(registry).map(([key, entity]) => ({\n id: (entity as { id?: string }).id || key,\n key,\n }));\n\n const toolAliases = collectAliases(mastra.listTools() ?? {});\n const agentAliases = collectAliases(mastra.listAgents() ?? {});\n const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});\n\n // Tools/workflows responses are keyed by registration key. Agents\n // response is keyed by `.id`.\n const toResponseKey = (aliases: AliasPair[], byId: 'id' | 'key') => {\n const map = new Map<string, string>();\n for (const a of aliases) {\n map.set(a.id, byId === 'id' ? a.id : a.key);\n map.set(a.key, byId === 'id' ? a.id : a.key);\n }\n return map;\n };\n const toolKeyMap = toResponseKey(toolAliases, 'key');\n const agentKeyMap = toResponseKey(agentAliases, 'id');\n const workflowKeyMap = toResponseKey(workflowAliases, 'key');\n\n // Lazy-load the EE subpath so this module remains importable on\n // `@mastra/core` versions that pre-date it (added in core 1.34.0).\n // We only reach here after `builder.enabled` is true, which guarantees\n // a compatible core.\n const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');\n\n const picker = resolvePickerVisibility({\n config: configuration?.agent,\n registeredToolIds: toolAliases.flatMap(a => [a.id, a.key]),\n registeredAgentIds: agentAliases.flatMap(a => [a.id, a.key]),\n registeredWorkflowIds: workflowAliases.flatMap(a => [a.id, a.key]),\n });\n\n const normalize = (visible: string[] | null, map: Map<string, string>): string[] | null => {\n if (visible === null) return null;\n const out: string[] = [];\n const seen = new Set<string>();\n for (const id of visible) {\n const mapped = map.get(id);\n if (mapped && !seen.has(mapped)) {\n seen.add(mapped);\n out.push(mapped);\n }\n }\n return out;\n };\n\n const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];\n\n return {\n enabled: true,\n features: builder.getFeatures(),\n configuration,\n modelPolicy: builderToModelPolicy(builder),\n picker: {\n visibleTools: normalize(picker.visibleTools, toolKeyMap),\n visibleAgents: normalize(picker.visibleAgents, agentKeyMap),\n visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap),\n },\n ...(modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}),\n };\n } catch (error) {\n return handleError(error, 'Error getting builder settings');\n }\n },\n});\n\n/**\n * GET /editor/builder/models/available\n *\n * Returns the configured AI providers/models the agent builder may use. The\n * server is the single authority: it scopes the list to providers with a\n * configured API key (`connected`) and applies the active builder model\n * policy via `isModelAllowed`, so the Studio surfaces can render the response\n * verbatim without importing any EE matcher into the browser.\n *\n * - Providers without a configured API key are always omitted — the builder\n * decides the agent's model from this list, so an unconnected provider would\n * produce an agent that can never run.\n * - Policy inactive (or no allowlist) ⇒ all connected providers are returned.\n * - Policy active with an allowlist ⇒ each connected provider's models are\n * filtered, and providers left with no allowed models are omitted entirely.\n */\nexport const GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/models/available',\n responseType: 'json',\n responseSchema: builderAvailableModelsResponseSchema,\n summary: 'List builder-available AI models',\n description: 'Returns AI providers/models filtered by the active agent-builder model policy.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n // Only surface providers whose API key is configured (`connected`). The\n // agent builder decides the agent's model from this list, so including\n // providers without a key lets it pick a model that can never run. We\n // scope to connected providers so every choice is actually usable.\n const providers = (await buildProvidersList(mastra)).filter(provider => provider.connected);\n const policy = await resolveBuilderModelPolicy(mastra.getEditor());\n\n // Inactive policy (or no allowlist) ⇒ no allowlist filtering to apply.\n if (!policy.active || !policy.allowed || policy.allowed.length === 0) {\n return { providers };\n }\n\n // Lazy-load the EE matcher (server-only); mirrors the convention used by\n // resolve-builder-model-policy and the settings handler.\n const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');\n\n const filtered = providers\n .map(provider => ({\n ...provider,\n models: provider.models.filter(modelId => isModelAllowed(policy.allowed, { provider: provider.id, modelId })),\n }))\n .filter(provider => provider.models.length > 0);\n\n return { providers: filtered };\n } catch (error) {\n return handleError(error, 'Error fetching available models');\n }\n },\n});\n\n/**\n * GET /editor/builder/infrastructure\n *\n * Returns the runtime status of Mastra-opinionated primitives (channels,\n * browser providers, workspaces). Admin-only; surfaced in Studio Settings so\n * admins can sanity-check what's wired up to the running server.\n */\nexport const GET_INFRASTRUCTURE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/infrastructure',\n responseType: 'json',\n responseSchema: infrastructureStatusResponseSchema,\n summary: 'Get infrastructure status',\n description: 'Agent Builder infrastructure configuration and lightweight runtime status.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'infrastructure:read',\n handler: async ({ mastra }) => {\n try {\n const formatConfigValue = (value: unknown): string => {\n if (value === null || value === undefined) return 'not set';\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? '' : 's'}`;\n return value.constructor?.name && value.constructor.name !== 'Object' ? value.constructor.name : 'configured';\n };\n\n const getProviderName = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'object' && 'provider' in value && typeof value.provider === 'string')\n return value.provider;\n if (typeof value === 'object' && 'constructor' in value) {\n const name = (value as { constructor?: { name?: string } }).constructor?.name;\n return name && name !== 'Object' ? name : 'configured';\n }\n return null;\n };\n\n const getConfigEntries = (config: Record<string, unknown>, omittedKeys: string[] = []) =>\n Object.entries(config)\n .filter(([key, value]) => !omittedKeys.includes(key) && value !== undefined && value !== null)\n .map(([key, value]) => ({ key, value: formatConfigValue(value) }));\n\n const channelProviders = mastra.getChannelProviders() ?? {};\n const channels: InfrastructureStatus['channels'] = {\n providers: Object.entries(channelProviders)\n .map(([id, provider]) => {\n const info = provider.getInfo?.();\n const routes = provider.getRoutes?.() ?? [];\n return {\n id: info?.id ?? id,\n name: info?.name ?? id,\n isConfigured: info?.isConfigured ?? false,\n routeCount: routes.length,\n };\n })\n .filter(provider => provider.isConfigured),\n };\n\n const editor = mastra.getEditor();\n let browser: InfrastructureStatus['browser'] = {\n type: null,\n provider: null,\n env: null,\n registered: false,\n availableProviders: [],\n config: [],\n };\n let workspace: InfrastructureStatus['workspace'] = {\n type: null,\n workspaceId: null,\n name: null,\n source: null,\n registered: false,\n hasFilesystem: false,\n hasSandbox: false,\n filesystemProvider: null,\n sandboxProvider: null,\n config: [],\n };\n let registries: InfrastructureStatus['registries'] = {\n skillsSh: { enabled: false },\n };\n\n if (editor?.resolveBuilder) {\n const browsers = (editor as unknown as { __browsers?: Map<string, unknown> }).__browsers;\n const builder = await editor.resolveBuilder();\n const builderRegistries = builder?.getRegistries?.();\n registries = {\n skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true },\n };\n const configuration = builder?.getConfiguration?.()?.agent as\n | {\n browser?: { type?: string; config?: { provider?: string; env?: string } };\n workspace?: {\n type?: string;\n workspaceId?: string;\n config?: { name?: string; filesystem?: unknown; sandbox?: unknown };\n };\n }\n | undefined;\n\n const browserRef = configuration?.browser;\n const browserConfig = browserRef?.config ?? {};\n const providerId = browserConfig.provider ?? null;\n browser = {\n type: browserRef?.type ?? null,\n provider: providerId,\n env: browserConfig.env ?? null,\n registered: providerId ? !!browsers?.has(providerId) : false,\n availableProviders: browsers ? Array.from(browsers.keys()) : [],\n config: getConfigEntries(browserConfig, ['provider', 'env']),\n };\n\n const workspaceRef = configuration?.workspace;\n const workspaceConfig = workspaceRef?.config ?? {};\n const registeredWorkspaces = mastra.listWorkspaces();\n const registeredWorkspace = workspaceRef?.workspaceId\n ? registeredWorkspaces[workspaceRef.workspaceId]\n : undefined;\n const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;\n const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;\n const filesystemConfig =\n typeof workspaceConfig.filesystem === 'object' &&\n workspaceConfig.filesystem &&\n 'config' in workspaceConfig.filesystem\n ? (workspaceConfig.filesystem.config as Record<string, unknown>)\n : {};\n const sandboxConfig =\n typeof workspaceConfig.sandbox === 'object' && workspaceConfig.sandbox && 'config' in workspaceConfig.sandbox\n ? (workspaceConfig.sandbox.config as Record<string, unknown>)\n : {};\n workspace = {\n type: workspaceRef?.type ?? null,\n workspaceId: workspaceRef?.workspaceId ?? null,\n name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,\n source: registeredWorkspace?.source ?? null,\n registered: !!registeredWorkspace,\n hasFilesystem: !!filesystem,\n hasSandbox: !!sandbox,\n filesystemProvider: getProviderName(filesystem),\n sandboxProvider: getProviderName(sandbox),\n config: [\n ...getConfigEntries(filesystemConfig).map(entry => ({ ...entry, key: `filesystem.${entry.key}` })),\n ...getConfigEntries(sandboxConfig).map(entry => ({ ...entry, key: `sandbox.${entry.key}` })),\n ],\n };\n }\n\n return { channels, browser, workspace, registries };\n } catch (error) {\n return handleError(error, 'Error getting infrastructure status');\n }\n },\n});\n"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

import { favoriteToggleResponseSchema } from './chunk-SFPN7SHZ.js';
import { requireBuilderFeature } from './chunk-N3D3A56J.js';
import { getCallerAuthorId, assertReadAccess } from './chunk-56AYHXOU.js';
import { storedAgentIdPathParams } from './chunk-SPVKRK56.js';
import { assertStoredResourceScope, getStoredResourceScope } from './chunk-IBUJJIRW.js';
import { handleError } from './chunk-7ZWJX3AN.js';
import { createRoute } from './chunk-BRC4XSFG.js';
import { HTTPException } from './chunk-6QWQZI4Q.js';
// src/server/handlers/stored-agent-favorites.ts
async function getFavoritesContext(mastra) {
const storage = mastra.getStorage();
if (!storage) {
throw new HTTPException(500, { message: "Storage is not configured" });
}
const agentStore = await storage.getStore("agents");
if (!agentStore) {
throw new HTTPException(500, { message: "Agents storage domain is not available" });
}
const favoritesStore = await storage.getStore("favorites");
if (!favoritesStore) {
throw new HTTPException(500, { message: "Favorites storage domain is not available" });
}
return { agentStore, favoritesStore };
}
var FAVORITE_STORED_AGENT_ROUTE = createRoute({
method: "PUT",
path: "/stored/agents/:storedAgentId/favorite",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
responseSchema: favoriteToggleResponseSchema,
summary: "Favorite a stored agent",
description: "Marks the stored agent as favorited by the calling user. Idempotent.",
tags: ["Stored Agents"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
await requireBuilderFeature(mastra, "favorites");
const callerId = getCallerAuthorId(requestContext);
if (!callerId) {
throw new HTTPException(401, { message: "Authentication required" });
}
const { agentStore, favoritesStore } = await getFavoritesContext(mastra);
const agent = await agentStore.getById(storedAgentId);
if (!agent) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const result = await favoritesStore.favorite({
userId: callerId,
entityType: "agent",
entityId: storedAgentId
});
return result;
} catch (error) {
return handleError(error, "Error favoriting stored agent");
}
}
});
var UNFAVORITE_STORED_AGENT_ROUTE = createRoute({
method: "DELETE",
path: "/stored/agents/:storedAgentId/favorite",
responseType: "json",
pathParamSchema: storedAgentIdPathParams,
responseSchema: favoriteToggleResponseSchema,
summary: "Unfavorite a stored agent",
description: "Removes the caller\u2019s favorite from the stored agent. Idempotent.",
tags: ["Stored Agents"],
requiresAuth: true,
requiresPermission: "stored-agents:read",
handler: async ({ mastra, requestContext, storedAgentId }) => {
try {
await requireBuilderFeature(mastra, "favorites");
const callerId = getCallerAuthorId(requestContext);
if (!callerId) {
throw new HTTPException(401, { message: "Authentication required" });
}
const { agentStore, favoritesStore } = await getFavoritesContext(mastra);
const agent = await agentStore.getById(storedAgentId);
if (!agent) {
throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });
}
assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));
assertReadAccess({ requestContext, resource: "stored-agents", resourceId: storedAgentId, record: agent });
const result = await favoritesStore.unfavorite({
userId: callerId,
entityType: "agent",
entityId: storedAgentId
});
return result;
} catch (error) {
return handleError(error, "Error unfavoriting stored agent");
}
}
});
export { FAVORITE_STORED_AGENT_ROUTE, UNFAVORITE_STORED_AGENT_ROUTE };
//# sourceMappingURL=chunk-XCTWO6W3.js.map
//# sourceMappingURL=chunk-XCTWO6W3.js.map
{"version":3,"sources":["../src/server/handlers/stored-agent-favorites.ts"],"names":[],"mappings":"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","file":"chunk-XCTWO6W3.js","sourcesContent":["import { HTTPException } from '../http-exception';\nimport { favoriteToggleResponseSchema } from '../schemas/favorites';\nimport { storedAgentIdPathParams } from '../schemas/stored-agents';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { assertStoredResourceScope, getStoredResourceScope } from '../utils';\n\nimport { assertReadAccess, getCallerAuthorId } from './authorship';\nimport { requireBuilderFeature } from './editor-builder';\nimport { handleError } from './error';\n\n/**\n * Resolves the storage and favorites domains, throwing 500 if unavailable.\n */\nasync function getFavoritesContext(mastra: Parameters<typeof requireBuilderFeature>[0]) {\n const storage = mastra.getStorage();\n if (!storage) {\n throw new HTTPException(500, { message: 'Storage is not configured' });\n }\n const agentStore = await storage.getStore('agents');\n if (!agentStore) {\n throw new HTTPException(500, { message: 'Agents storage domain is not available' });\n }\n const favoritesStore = await storage.getStore('favorites');\n if (!favoritesStore) {\n throw new HTTPException(500, { message: 'Favorites storage domain is not available' });\n }\n return { agentStore, favoritesStore };\n}\n\n/**\n * PUT /stored/agents/:storedAgentId/favorite\n */\nexport const FAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'PUT',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Favorite a stored agent',\n description: 'Marks the stored agent as favorited by the calling user. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n // Throws 404 if the caller cannot read the agent (private + not owner/admin).\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.favorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error favoriting stored agent');\n }\n },\n});\n\n/**\n * DELETE /stored/agents/:storedAgentId/favorite\n */\nexport const UNFAVORITE_STORED_AGENT_ROUTE = createRoute({\n method: 'DELETE',\n path: '/stored/agents/:storedAgentId/favorite',\n responseType: 'json',\n pathParamSchema: storedAgentIdPathParams,\n responseSchema: favoriteToggleResponseSchema,\n summary: 'Unfavorite a stored agent',\n description: 'Removes the caller’s favorite from the stored agent. Idempotent.',\n tags: ['Stored Agents'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra, requestContext, storedAgentId }) => {\n try {\n await requireBuilderFeature(mastra, 'favorites');\n\n const callerId = getCallerAuthorId(requestContext);\n if (!callerId) {\n throw new HTTPException(401, { message: 'Authentication required' });\n }\n\n const { agentStore, favoritesStore } = await getFavoritesContext(mastra);\n\n const agent = await agentStore.getById(storedAgentId);\n if (!agent) {\n throw new HTTPException(404, { message: `Stored agent with id ${storedAgentId} not found` });\n }\n assertStoredResourceScope(agent, await getStoredResourceScope(mastra, requestContext));\n\n assertReadAccess({ requestContext, resource: 'stored-agents', resourceId: storedAgentId, record: agent });\n\n const result = await favoritesStore.unfavorite({\n userId: callerId,\n entityType: 'agent',\n entityId: storedAgentId,\n });\n return result;\n } catch (error) {\n return handleError(error, 'Error unfavoriting stored agent');\n }\n },\n});\n"]}
'use strict';
var chunkAKJAQVZ3_cjs = require('./chunk-AKJAQVZ3.cjs');
var chunkZ7LCIYK7_cjs = require('./chunk-Z7LCIYK7.cjs');
var chunkG54X6VE6_cjs = require('./chunk-G54X6VE6.cjs');
var fs = require('fs');
var SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3e3;
async function getSourceProviderCapabilities(getCapabilities) {
let timeout;
try {
return await Promise.race([
getCapabilities(),
new Promise((_, reject) => {
timeout = setTimeout(
() => reject(new Error("Source provider capabilities timed out")),
SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS
);
})
]);
} finally {
if (timeout) clearTimeout(timeout);
}
}
async function getEditorSourceCapabilities(editor) {
const editorSource = editor.getSource?.();
if (!editorSource) return void 0;
if (editorSource === "db") {
return {
source: editorSource,
storage: "database",
canSave: true,
canOpenChangeRequest: false
};
}
const configuredProvider = editor.getSourceControlProvider?.();
if (configuredProvider) {
const provider = {
id: configuredProvider.id,
displayName: configuredProvider.displayName
};
try {
const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());
return {
source: editorSource,
storage: "source-provider",
provider,
canSave: capabilities.canWrite,
canOpenChangeRequest: capabilities.canOpenChangeRequest,
unavailableReason: capabilities.canWrite ? void 0 : capabilities.reason
};
} catch {
return {
source: editorSource,
storage: "source-provider",
provider,
canSave: false,
canOpenChangeRequest: false,
unavailableReason: "Unable to load source provider capabilities."
};
}
}
const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;
if (sourceProvider) {
return {
source: editorSource,
storage: "source-provider",
provider: {
id: sourceProvider,
displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider
},
canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== "false",
canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === "true"
};
}
const isHosted = process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;
if (isHosted) {
return {
source: editorSource,
storage: "unavailable",
canSave: false,
canOpenChangeRequest: false,
unavailableReason: "Code-source editing requires a source provider in hosted Studio."
};
}
return {
source: editorSource,
storage: "filesystem",
canSave: true,
canOpenChangeRequest: false
};
}
var GET_API_SCHEMA_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/system/api-schema",
responseType: "json",
responseSchema: chunkAKJAQVZ3_cjs.apiSchemaManifestResponseSchema,
summary: "Get API schema manifest",
description: "Returns the route-contract-derived API schema manifest for the machine-readable CLI",
tags: ["System"],
requiresAuth: true,
handler: async () => {
const { buildApiSchemaManifest } = await import('./api-schema-manifest-3PMRQVN5.cjs');
return buildApiSchemaManifest();
}
});
var GET_SYSTEM_PACKAGES_ROUTE = chunkG54X6VE6_cjs.createRoute({
method: "GET",
path: "/system/packages",
responseType: "json",
responseSchema: chunkAKJAQVZ3_cjs.systemPackagesResponseSchema,
summary: "Get installed Mastra packages",
description: "Returns a list of all installed Mastra packages and their versions from the project",
tags: ["System"],
requiresAuth: true,
handler: async ({ mastra }) => {
try {
const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;
let packages = [];
if (packagesFilePath) {
try {
const fileContent = fs.readFileSync(packagesFilePath, "utf-8");
packages = JSON.parse(fileContent);
} catch {
packages = [];
}
}
const storage = mastra.getStorage();
const storageType = storage?.name;
const observabilityStorage = storage?.stores?.observability;
const observabilityStorageType = observabilityStorage?.constructor.name;
const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;
const observabilityEnabled = !!mastra.observability.getDefaultInstance();
const editor = mastra.getEditor();
const editorSource = editor?.getSource?.();
const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : void 0;
return {
packages,
isDev: process.env.MASTRA_DEV === "true",
cmsEnabled: !!editor,
editorSource,
editorSourceCapabilities,
observabilityEnabled,
storageType,
observabilityStorageType,
observabilityRuntimeStrategy
};
} catch (error) {
return chunkZ7LCIYK7_cjs.handleError(error, "Error getting system packages");
}
}
});
exports.GET_API_SCHEMA_ROUTE = GET_API_SCHEMA_ROUTE;
exports.GET_SYSTEM_PACKAGES_ROUTE = GET_SYSTEM_PACKAGES_ROUTE;
//# sourceMappingURL=chunk-XLQY5MPS.cjs.map
//# sourceMappingURL=chunk-XLQY5MPS.cjs.map
{"version":3,"sources":["../src/server/handlers/system.ts"],"names":["createRoute","apiSchemaManifestResponseSchema","systemPackagesResponseSchema","readFileSync","handleError"],"mappings":"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","file":"chunk-XLQY5MPS.cjs","sourcesContent":["import { readFileSync } from 'node:fs';\n\nimport type { MastraPackage } from '../schemas/system';\nimport { apiSchemaManifestResponseSchema, systemPackagesResponseSchema } from '../schemas/system';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\nconst SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS = 3000;\n\nasync function getSourceProviderCapabilities(\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n getCapabilities(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error('Source provider capabilities timed out')),\n SOURCE_PROVIDER_CAPABILITIES_TIMEOUT_MS,\n );\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nasync function getEditorSourceCapabilities(editor: {\n getSource?: () => 'code' | 'db' | undefined;\n getSourceControlProvider?: () =>\n | {\n id: string;\n displayName: string;\n getCapabilities: () => Promise<{\n canWrite: boolean;\n canOpenChangeRequest: boolean;\n reason?: string;\n }>;\n }\n | undefined;\n}) {\n const editorSource = editor.getSource?.();\n if (!editorSource) return undefined;\n\n if (editorSource === 'db') {\n return {\n source: editorSource,\n storage: 'database' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n }\n\n const configuredProvider = editor.getSourceControlProvider?.();\n if (configuredProvider) {\n const provider = {\n id: configuredProvider.id,\n displayName: configuredProvider.displayName,\n };\n try {\n const capabilities = await getSourceProviderCapabilities(() => configuredProvider.getCapabilities());\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: capabilities.canWrite,\n canOpenChangeRequest: capabilities.canOpenChangeRequest,\n unavailableReason: capabilities.canWrite ? undefined : capabilities.reason,\n };\n } catch {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Unable to load source provider capabilities.',\n };\n }\n }\n\n const sourceProvider = process.env.MASTRA_SOURCE_PROVIDER;\n\n if (sourceProvider) {\n return {\n source: editorSource,\n storage: 'source-provider' as const,\n provider: {\n id: sourceProvider,\n displayName: process.env.MASTRA_SOURCE_PROVIDER_NAME || sourceProvider,\n },\n canSave: process.env.MASTRA_SOURCE_STORAGE_CAN_WRITE !== 'false',\n canOpenChangeRequest: process.env.MASTRA_SOURCE_STORAGE_CAN_OPEN_CHANGE_REQUEST === 'true',\n };\n }\n\n const isHosted =\n process.env.MASTRA_DEPLOYMENT_ID || process.env.MASTRA_CLOUD_API_ENDPOINT || process.env.MASTRA_PLATFORM_PROJECT_ID;\n\n if (isHosted) {\n return {\n source: editorSource,\n storage: 'unavailable' as const,\n canSave: false,\n canOpenChangeRequest: false,\n unavailableReason: 'Code-source editing requires a source provider in hosted Studio.',\n };\n }\n\n return {\n source: editorSource,\n storage: 'filesystem' as const,\n canSave: true,\n canOpenChangeRequest: false,\n };\n}\n\nexport const GET_API_SCHEMA_ROUTE = createRoute({\n method: 'GET',\n path: '/system/api-schema',\n responseType: 'json',\n responseSchema: apiSchemaManifestResponseSchema,\n summary: 'Get API schema manifest',\n description: 'Returns the route-contract-derived API schema manifest for the machine-readable CLI',\n tags: ['System'],\n requiresAuth: true,\n handler: async () => {\n // Dynamic import to avoid circular dependency issues\n const { buildApiSchemaManifest } = await import('../server-adapter/api-schema-manifest');\n return buildApiSchemaManifest();\n },\n});\n\nexport const GET_SYSTEM_PACKAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/system/packages',\n responseType: 'json',\n responseSchema: systemPackagesResponseSchema,\n summary: 'Get installed Mastra packages',\n description: 'Returns a list of all installed Mastra packages and their versions from the project',\n tags: ['System'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n try {\n const packagesFilePath = process.env.MASTRA_PACKAGES_FILE;\n\n let packages: MastraPackage[] = [];\n\n if (packagesFilePath) {\n try {\n const fileContent = readFileSync(packagesFilePath, 'utf-8');\n packages = JSON.parse(fileContent);\n } catch {\n packages = [];\n }\n }\n\n const storage = mastra.getStorage();\n const storageType = storage?.name;\n const observabilityStorage = storage?.stores?.observability;\n const observabilityStorageType = observabilityStorage?.constructor.name;\n const observabilityRuntimeStrategy = observabilityStorage?.runtimeTracingStrategy;\n const observabilityEnabled = !!mastra.observability.getDefaultInstance();\n\n const editor = mastra.getEditor();\n const editorSource = editor?.getSource?.();\n const editorSourceCapabilities = editor ? await getEditorSourceCapabilities(editor) : undefined;\n\n return {\n packages,\n isDev: process.env.MASTRA_DEV === 'true',\n cmsEnabled: !!editor,\n editorSource,\n editorSourceCapabilities,\n observabilityEnabled,\n storageType,\n observabilityStorageType,\n observabilityRuntimeStrategy,\n };\n } catch (error) {\n return handleError(error, 'Error getting system packages');\n }\n },\n});\n"]}
import { FAVORITE_STORED_SKILL_ROUTE, UNFAVORITE_STORED_SKILL_ROUTE } from './chunk-CGXMRNFE.js';
import { LIST_STORED_SKILLS_ROUTE, GET_STORED_SKILL_ROUTE, CREATE_STORED_SKILL_ROUTE, UPDATE_STORED_SKILL_ROUTE, DELETE_STORED_SKILL_ROUTE, PUBLISH_STORED_SKILL_ROUTE } from './chunk-PC73QIVI.js';
import { LIST_STORED_WORKSPACES_ROUTE, GET_STORED_WORKSPACE_ROUTE, CREATE_STORED_WORKSPACE_ROUTE, UPDATE_STORED_WORKSPACE_ROUTE, DELETE_STORED_WORKSPACE_ROUTE } from './chunk-M25LVAUH.js';
import { GET_SYSTEM_PACKAGES_ROUTE, GET_API_SCHEMA_ROUTE } from './chunk-Q5RXMLH2.js';
import { LIST_TOOL_PROVIDERS_ROUTE, LIST_TOOL_PROVIDER_TOOLKITS_ROUTE, LIST_TOOL_PROVIDER_TOOLS_ROUTE, GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE, AUTHORIZE_TOOL_PROVIDER_ROUTE, GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE, TOOL_PROVIDER_CONNECTION_STATUS_ROUTE, LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE, LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE, DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE, UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE, GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE, GET_TOOL_PROVIDER_HEALTH_ROUTE } from './chunk-2Z3TLC4L.js';
import { LIST_SCORER_VERSIONS_ROUTE, CREATE_SCORER_VERSION_ROUTE, COMPARE_SCORER_VERSIONS_ROUTE, GET_SCORER_VERSION_ROUTE, ACTIVATE_SCORER_VERSION_ROUTE, RESTORE_SCORER_VERSION_ROUTE, DELETE_SCORER_VERSION_ROUTE } from './chunk-46Y4Y2RB.js';
import { FAVORITE_STORED_AGENT_ROUTE, UNFAVORITE_STORED_AGENT_ROUTE } from './chunk-XCTWO6W3.js';
import { LIST_STORED_AGENTS_ROUTE, PREVIEW_INSTRUCTIONS_ROUTE, GET_STORED_AGENT_DEPENDENTS_ROUTE, EXPORT_STORED_AGENT_ROUTE, OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE, GET_STORED_AGENT_ROUTE, CREATE_STORED_AGENT_ROUTE, UPDATE_STORED_AGENT_ROUTE, DELETE_STORED_AGENT_ROUTE } from './chunk-KXYFKA7K.js';
import { LIST_STORED_MCP_CLIENTS_ROUTE, GET_STORED_MCP_CLIENT_ROUTE, CREATE_STORED_MCP_CLIENT_ROUTE, UPDATE_STORED_MCP_CLIENT_ROUTE, DELETE_STORED_MCP_CLIENT_ROUTE } from './chunk-KBOC52HT.js';
import { LIST_STORED_PROMPT_BLOCKS_ROUTE, GET_STORED_PROMPT_BLOCK_ROUTE, CREATE_STORED_PROMPT_BLOCK_ROUTE, UPDATE_STORED_PROMPT_BLOCK_ROUTE, DELETE_STORED_PROMPT_BLOCK_ROUTE } from './chunk-SJPWXUKZ.js';
import { LIST_STORED_SCORERS_ROUTE, GET_STORED_SCORER_ROUTE, CREATE_STORED_SCORER_ROUTE, UPDATE_STORED_SCORER_ROUTE, DELETE_STORED_SCORER_ROUTE } from './chunk-E2JNW3QM.js';
import { LIST_PROCESSOR_PROVIDERS_ROUTE, GET_PROCESSOR_PROVIDER_ROUTE } from './chunk-IDCRGQOI.js';
import { LIST_PROCESSORS_ROUTE, GET_PROCESSOR_BY_ID_ROUTE, EXECUTE_PROCESSOR_ROUTE } from './chunk-MQMPNMZH.js';
import { LIST_PROMPT_BLOCK_VERSIONS_ROUTE, CREATE_PROMPT_BLOCK_VERSION_ROUTE, COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE, GET_PROMPT_BLOCK_VERSION_ROUTE, ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE, RESTORE_PROMPT_BLOCK_VERSION_ROUTE, DELETE_PROMPT_BLOCK_VERSION_ROUTE } from './chunk-BB6RVOJY.js';
import { LIST_SCHEDULES_ROUTE, GET_SCHEDULE_ROUTE, LIST_SCHEDULE_TRIGGERS_ROUTE, PAUSE_SCHEDULE_ROUTE, RESUME_SCHEDULE_ROUTE } from './chunk-WAIWLM6T.js';
import { LIST_MCP_CLIENT_VERSIONS_ROUTE, CREATE_MCP_CLIENT_VERSION_ROUTE, COMPARE_MCP_CLIENT_VERSIONS_ROUTE, GET_MCP_CLIENT_VERSION_ROUTE, ACTIVATE_MCP_CLIENT_VERSION_ROUTE, RESTORE_MCP_CLIENT_VERSION_ROUTE, DELETE_MCP_CLIENT_VERSION_ROUTE } from './chunk-MMY24AC4.js';
import { LIST_DATASETS_ROUTE, CREATE_DATASET_ROUTE, GET_DATASET_ROUTE, UPDATE_DATASET_ROUTE, DELETE_DATASET_ROUTE, LIST_ITEMS_ROUTE, ADD_ITEM_ROUTE, BATCH_INSERT_ITEMS_ROUTE, BATCH_DELETE_ITEMS_ROUTE, GET_ITEM_ROUTE, UPDATE_ITEM_ROUTE, DELETE_ITEM_ROUTE, LIST_DATASET_VERSIONS_ROUTE, LIST_ITEM_VERSIONS_ROUTE, GET_ITEM_VERSION_ROUTE, LIST_ALL_EXPERIMENTS_ROUTE, EXPERIMENT_REVIEW_SUMMARY_ROUTE, LIST_EXPERIMENTS_ROUTE, TRIGGER_EXPERIMENT_ROUTE, GET_EXPERIMENT_ROUTE, LIST_EXPERIMENT_RESULTS_ROUTE, UPDATE_EXPERIMENT_RESULT_ROUTE, COMPARE_EXPERIMENTS_ROUTE, GENERATE_ITEMS_ROUTE, CLUSTER_FAILURES_ROUTE } from './chunk-GADWAAGI.js';
import { GET_EDITOR_BUILDER_SETTINGS_ROUTE, GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE, GET_INFRASTRUCTURE_STATUS_ROUTE } from './chunk-N3D3A56J.js';
import { LIST_HARNESSES_ROUTE, LIST_HARNESS_MODES_ROUTE, LIST_HARNESS_MODELS_ROUTE, CREATE_HARNESS_SESSION_ROUTE, GET_HARNESS_SESSION_STATE_ROUTE, LIST_HARNESS_THREADS_ROUTE, CREATE_HARNESS_THREAD_ROUTE, DELETE_HARNESS_THREAD_ROUTE, RENAME_HARNESS_THREAD_ROUTE, CLONE_HARNESS_THREAD_ROUTE, LIST_HARNESS_THREAD_MESSAGES_ROUTE, STREAM_HARNESS_SESSION_ROUTE, SEND_HARNESS_MESSAGE_ROUTE, STEER_HARNESS_SESSION_ROUTE, FOLLOW_UP_HARNESS_SESSION_ROUTE, ABORT_HARNESS_SESSION_ROUTE, HARNESS_TOOL_APPROVAL_ROUTE, HARNESS_TOOL_SUSPENSION_ROUTE, SWITCH_HARNESS_MODE_ROUTE, SWITCH_HARNESS_MODEL_ROUTE, SWITCH_HARNESS_THREAD_ROUTE, SEND_HARNESS_NOTIFICATION_ROUTE, GET_HARNESS_WORKSPACE_STATUS_ROUTE, GET_HARNESS_OM_RECORD_ROUTE, SET_HARNESS_RESOURCE_ID_ROUTE, GET_HARNESS_RESOURCE_IDS_ROUTE, GET_HARNESS_GOAL_ROUTE, SET_HARNESS_GOAL_ROUTE, UPDATE_HARNESS_GOAL_ROUTE, CLEAR_HARNESS_GOAL_ROUTE, GET_HARNESS_PERMISSIONS_ROUTE, SET_HARNESS_CATEGORY_PERMISSION_ROUTE, SET_HARNESS_TOOL_PERMISSION_ROUTE, SET_HARNESS_SESSION_STATE_ROUTE } from './chunk-MYNSU6B4.js';
import { LIST_AGENT_VERSIONS_ROUTE, CREATE_AGENT_VERSION_ROUTE, COMPARE_AGENT_VERSIONS_ROUTE, GET_AGENT_VERSION_ROUTE, ACTIVATE_AGENT_VERSION_ROUTE, RESTORE_AGENT_VERSION_ROUTE, DELETE_AGENT_VERSION_ROUTE } from './chunk-56TEDJND.js';
import { BACKGROUND_TASK_STREAM_ROUTE, LIST_BACKGROUND_TASKS_ROUTE, GET_BACKGROUND_TASK_ROUTE } from './chunk-JUORD32P.js';
import { LIST_BUILDER_REGISTRIES_ROUTE, BUILDER_REGISTRY_SEARCH_ROUTE, BUILDER_REGISTRY_POPULAR_ROUTE, BUILDER_REGISTRY_PREVIEW_ROUTE, BUILDER_REGISTRY_INSTALL_ROUTE } from './chunk-C2A2BZFY.js';
import { LIST_CHANNEL_PLATFORMS_ROUTE, LIST_CHANNEL_INSTALLATIONS_ROUTE, CONNECT_CHANNEL_ROUTE, DISCONNECT_CHANNEL_ROUTE } from './chunk-VRERZRJQ.js';
import { UPSERT_VECTORS_ROUTE, CREATE_INDEX_ROUTE, QUERY_VECTORS_ROUTE, LIST_INDEXES_ROUTE, DESCRIBE_INDEX_ROUTE, DELETE_INDEX_ROUTE, LIST_VECTORS_ROUTE, LIST_EMBEDDERS_ROUTE } from './chunk-MMZL6I4C.js';
import { GET_SPEAKERS_ROUTE, GET_SPEAKERS_DEPRECATED_ROUTE, GENERATE_SPEECH_ROUTE, GENERATE_SPEECH_DEPRECATED_ROUTE, TRANSCRIBE_SPEECH_ROUTE, TRANSCRIBE_SPEECH_DEPRECATED_ROUTE, GET_LISTENER_ROUTE } from './chunk-LQZHT5U7.js';
import { LIST_WORKSPACES_ROUTE, GET_WORKSPACE_ROUTE, WORKSPACE_FS_ROUTES, WORKSPACE_SEARCH_ROUTES, WORKSPACE_SKILLS_ROUTES, WORKSPACE_SKILLS_SH_ROUTES } from './chunk-WF6VLJGR.js';
import { EXECUTE_AGENT_TOOL_ROUTE, GET_AGENT_TOOL_ROUTE, LIST_TOOLS_ROUTE, GET_TOOL_BY_ID_ROUTE, EXECUTE_TOOL_ROUTE } from './chunk-T3T23PHF.js';
import { LIST_SCORERS_ROUTE, GET_SCORER_ROUTE, LIST_SCORES_BY_RUN_ID_ROUTE, LIST_SCORES_BY_SCORER_ID_ROUTE, LIST_SCORES_BY_ENTITY_ID_ROUTE, SAVE_SCORE_ROUTE } from './chunk-5LOPQPIH.js';
import { CREATE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE } from './chunk-BSUXHFFY.js';
import { LIST_MCP_SERVERS_ROUTE, GET_MCP_SERVER_DETAIL_ROUTE, LIST_MCP_SERVER_TOOLS_ROUTE, GET_MCP_SERVER_TOOL_DETAIL_ROUTE, EXECUTE_MCP_SERVER_TOOL_ROUTE, LIST_MCP_SERVER_RESOURCES_ROUTE, READ_MCP_SERVER_RESOURCE_ROUTE, MCP_HTTP_TRANSPORT_ROUTE, MCP_SSE_TRANSPORT_ROUTE, MCP_SSE_MESSAGES_ROUTE } from './chunk-RQGQAYCL.js';
import { GET_MEMORY_STATUS_ROUTE, GET_MEMORY_CONFIG_ROUTE, GET_OBSERVATIONAL_MEMORY_ROUTE, AWAIT_BUFFER_STATUS_ROUTE, LIST_THREADS_ROUTE, GET_THREAD_BY_ID_ROUTE, LIST_MESSAGES_ROUTE, GET_WORKING_MEMORY_ROUTE, SAVE_MESSAGES_ROUTE, CREATE_THREAD_ROUTE, UPDATE_THREAD_ROUTE, DELETE_THREAD_ROUTE, CLONE_THREAD_ROUTE, UPDATE_WORKING_MEMORY_ROUTE, DELETE_MESSAGES_ROUTE, SEARCH_MEMORY_ROUTE, GET_MEMORY_STATUS_NETWORK_ROUTE, LIST_THREADS_NETWORK_ROUTE, GET_THREAD_BY_ID_NETWORK_ROUTE, LIST_MESSAGES_NETWORK_ROUTE, SAVE_MESSAGES_NETWORK_ROUTE, CREATE_THREAD_NETWORK_ROUTE, UPDATE_THREAD_NETWORK_ROUTE, DELETE_THREAD_NETWORK_ROUTE, DELETE_MESSAGES_NETWORK_ROUTE } from './chunk-CQHYURGT.js';
import { LIST_TRACES_ROUTE, LIST_TRACES_LIGHT_ROUTE, LIST_BRANCHES_ROUTE, GET_BRANCH_ROUTE, GET_TRACE_ROUTE, GET_TRACE_LIGHT_ROUTE, GET_SPAN_ROUTE, GET_TRACE_TRAJECTORY_ROUTE, SCORE_TRACES_ROUTE, LIST_SCORES_BY_SPAN_ROUTE } from './chunk-TIXNAAKQ.js';
import { LIST_METRICS, LIST_LOGS, LIST_SCORES, CREATE_SCORE, GET_SCORE, GET_SCORE_AGGREGATE, GET_SCORE_BREAKDOWN, GET_SCORE_TIME_SERIES, GET_SCORE_PERCENTILES, LIST_FEEDBACK, CREATE_FEEDBACK, GET_FEEDBACK_AGGREGATE, GET_FEEDBACK_BREAKDOWN, GET_FEEDBACK_TIME_SERIES, GET_FEEDBACK_PERCENTILES, GET_METRIC_AGGREGATE, GET_METRIC_BREAKDOWN, GET_METRIC_TIME_SERIES, GET_METRIC_PERCENTILES, GET_METRIC_NAMES, GET_METRIC_LABEL_KEYS, GET_METRIC_LABEL_VALUES, GET_ENTITY_TYPES, GET_ENTITY_NAMES, GET_SERVICE_NAMES, GET_ENVIRONMENTS, GET_TAGS } from './chunk-5FFEBJ3X.js';
import { CREATE_CONVERSATION_ROUTE, GET_CONVERSATION_ROUTE, GET_CONVERSATION_ITEMS_ROUTE, DELETE_CONVERSATION_ROUTE } from './chunk-BJPP22F6.js';
import { LIST_LOG_TRANSPORTS_ROUTE, LIST_LOGS_ROUTE, LIST_LOGS_BY_RUN_ID_ROUTE } from './chunk-OHWAEEZJ.js';
import { GET_AGENT_CARD_ROUTE, AGENT_EXECUTION_ROUTE } from './chunk-L5JZZ7PX.js';
import { LIST_AGENTS_ROUTE, GET_PROVIDERS_ROUTE, GET_AGENT_BY_ID_ROUTE, CLONE_AGENT_ROUTE, GENERATE_AGENT_ROUTE, GENERATE_AGENT_VNEXT_ROUTE, STREAM_GENERATE_ROUTE, STREAM_UNTIL_IDLE_GENERATE_ROUTE, STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE, OBSERVE_AGENT_STREAM_ROUTE, SEND_AGENT_MESSAGE_ROUTE, QUEUE_AGENT_MESSAGE_ROUTE, SEND_AGENT_SIGNAL_ROUTE, ABORT_AGENT_THREAD_ROUTE, SUBSCRIBE_AGENT_THREAD_ROUTE, APPROVE_TOOL_CALL_ROUTE, SEND_TOOL_APPROVAL_ROUTE, DECLINE_TOOL_CALL_ROUTE, RESUME_STREAM_ROUTE, APPROVE_TOOL_CALL_GENERATE_ROUTE, DECLINE_TOOL_CALL_GENERATE_ROUTE, APPROVE_NETWORK_TOOL_CALL_ROUTE, DECLINE_NETWORK_TOOL_CALL_ROUTE, RESUME_STREAM_UNTIL_IDLE_ROUTE, STREAM_NETWORK_ROUTE, UPDATE_AGENT_MODEL_ROUTE, RESET_AGENT_MODEL_ROUTE, REORDER_AGENT_MODEL_LIST_ROUTE, UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE, ENHANCE_INSTRUCTIONS_ROUTE, GET_AGENT_SKILL_ROUTE, STREAM_VNEXT_DEPRECATED_ROUTE, STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE, STREAM_UI_MESSAGE_DEPRECATED_ROUTE, GENERATE_LEGACY_ROUTE, STREAM_GENERATE_LEGACY_ROUTE } from './chunk-L6FOTAND.js';
import { AUTH_ROUTES } from './chunk-R4O5HVDI.js';
import { LIST_AGENT_BUILDER_ACTIONS_ROUTE, GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE, LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE, GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE, CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE, STREAM_AGENT_BUILDER_ACTION_ROUTE, STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE, START_ASYNC_AGENT_BUILDER_ACTION_ROUTE, START_AGENT_BUILDER_ACTION_RUN_ROUTE, OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE, OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE, RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE, RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE, RESUME_AGENT_BUILDER_ACTION_ROUTE, RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE, CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE } from './chunk-ILVGJFCT.js';
import { LIST_WORKFLOWS_ROUTE, GET_WORKFLOW_BY_ID_ROUTE, LIST_WORKFLOW_RUNS_ROUTE, GET_WORKFLOW_RUN_BY_ID_ROUTE, DELETE_WORKFLOW_RUN_BY_ID_ROUTE, CREATE_WORKFLOW_RUN_ROUTE, STREAM_WORKFLOW_ROUTE, RESUME_STREAM_WORKFLOW_ROUTE, START_ASYNC_WORKFLOW_ROUTE, START_WORKFLOW_RUN_ROUTE, OBSERVE_STREAM_WORKFLOW_ROUTE, RESUME_ASYNC_WORKFLOW_ROUTE, RESUME_NO_WAIT_WORKFLOW_ROUTE, RESUME_WORKFLOW_ROUTE, CANCEL_WORKFLOW_RUN_ROUTE, TIME_TRAVEL_WORKFLOW_ROUTE, TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE, TIME_TRAVEL_STREAM_WORKFLOW_ROUTE, RESTART_WORKFLOW_ROUTE, RESTART_ASYNC_WORKFLOW_ROUTE, RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE, RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE, EXECUTE_WORKFLOW_STEP_ROUTE, RECEIVE_WORKFLOW_EVENT_ROUTE, STREAM_LEGACY_WORKFLOW_ROUTE, OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE } from './chunk-R7624SPL.js';
// src/server/server-adapter/routes/permissions.ts
var METHOD_TO_ACTION = {
GET: "read",
POST: "write",
// Default for POST, may be overridden to 'execute'
PUT: "write",
PATCH: "write",
DELETE: "delete"
};
var EXECUTE_PATTERNS = [
"/generate",
"/stream",
"/execute",
"/start",
"/resume",
"/restart",
"/cancel",
"/approve",
"/decline",
"/speak",
"/listen",
"/query",
"/search",
"/observe",
"/time-travel",
"/enhance",
"/clone"
];
var PUBLISH_PATTERNS = ["/publish", "/activate", "/restore"];
var STORED_RESOURCE_SEGMENTS = {
agents: "stored-agents",
"mcp-clients": "stored-mcp-clients",
"prompt-blocks": "stored-prompt-blocks",
scorers: "stored-scorers",
skills: "stored-skills",
workspaces: "stored-workspaces"
};
function extractResource(path) {
const segments = path.replace(/^\//, "").split("/");
if (segments.length === 0) {
return null;
}
const firstSegment = segments[0];
if (firstSegment === "stored" && segments[1]) {
return STORED_RESOURCE_SEGMENTS[segments[1]] ?? null;
}
if (firstSegment === ".well-known") {
return "a2a";
}
return firstSegment || null;
}
function deriveAction(method, path) {
const upperMethod = method.toUpperCase();
if (upperMethod === "POST") {
if (path.startsWith("/stored/")) {
const isPublishOperation = PUBLISH_PATTERNS.some((pattern) => path.endsWith(pattern));
if (isPublishOperation) {
return "publish";
}
}
const isExecuteOperation = EXECUTE_PATTERNS.some((pattern) => path.includes(pattern));
return isExecuteOperation ? "execute" : "write";
}
return METHOD_TO_ACTION[upperMethod] || "read";
}
function derivePermission(route) {
if (route.method === "ALL") {
return null;
}
const resource = extractResource(route.path);
if (!resource) {
return null;
}
const action = deriveAction(route.method, route.path);
return `${resource}:${action}`;
}
function getEffectivePermission(route) {
if (route.requiresAuth === false) {
return null;
}
if (route.requiresPermission) {
return route.requiresPermission;
}
return derivePermission(route);
}
// src/server/server-adapter/routes/a2a.ts
var A2A_ROUTES = [GET_AGENT_CARD_ROUTE, AGENT_EXECUTION_ROUTE];
// src/server/server-adapter/routes/agent-builder.ts
var AGENT_BUILDER_ROUTES = [
LIST_AGENT_BUILDER_ACTIONS_ROUTE,
GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE,
LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE,
GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE,
CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE,
STREAM_AGENT_BUILDER_ACTION_ROUTE,
STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,
START_ASYNC_AGENT_BUILDER_ACTION_ROUTE,
START_AGENT_BUILDER_ACTION_RUN_ROUTE,
OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE,
OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,
RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE,
RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE,
RESUME_AGENT_BUILDER_ACTION_ROUTE,
RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE,
CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE
];
// src/server/server-adapter/routes/agents.ts
var AGENTS_ROUTES = [
// ============================================================================
// Agent Core Routes
// ============================================================================
LIST_AGENTS_ROUTE,
GET_PROVIDERS_ROUTE,
GET_AGENT_BY_ID_ROUTE,
CLONE_AGENT_ROUTE,
// ============================================================================
// Voice Routes
// ============================================================================
GET_SPEAKERS_ROUTE,
GET_SPEAKERS_DEPRECATED_ROUTE,
// ============================================================================
// Agent Execution Routes
// ============================================================================
GENERATE_AGENT_ROUTE,
GENERATE_AGENT_VNEXT_ROUTE,
STREAM_GENERATE_ROUTE,
STREAM_UNTIL_IDLE_GENERATE_ROUTE,
STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,
// ============================================================================
// Resumable Stream Routes
// ============================================================================
OBSERVE_AGENT_STREAM_ROUTE,
SEND_AGENT_MESSAGE_ROUTE,
QUEUE_AGENT_MESSAGE_ROUTE,
SEND_AGENT_SIGNAL_ROUTE,
ABORT_AGENT_THREAD_ROUTE,
SUBSCRIBE_AGENT_THREAD_ROUTE,
// ============================================================================
// Tool Routes
// ============================================================================
EXECUTE_AGENT_TOOL_ROUTE,
APPROVE_TOOL_CALL_ROUTE,
SEND_TOOL_APPROVAL_ROUTE,
DECLINE_TOOL_CALL_ROUTE,
RESUME_STREAM_ROUTE,
APPROVE_TOOL_CALL_GENERATE_ROUTE,
DECLINE_TOOL_CALL_GENERATE_ROUTE,
APPROVE_NETWORK_TOOL_CALL_ROUTE,
DECLINE_NETWORK_TOOL_CALL_ROUTE,
RESUME_STREAM_UNTIL_IDLE_ROUTE,
// ============================================================================
// Network Routes
// ============================================================================
STREAM_NETWORK_ROUTE,
// ============================================================================
// Model Management Routes
// ============================================================================
UPDATE_AGENT_MODEL_ROUTE,
RESET_AGENT_MODEL_ROUTE,
REORDER_AGENT_MODEL_LIST_ROUTE,
UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,
// ============================================================================
// Instruction Enhancement Routes
// ============================================================================
ENHANCE_INSTRUCTIONS_ROUTE,
// ============================================================================
// Agent Tool Routes
// ============================================================================
GET_AGENT_TOOL_ROUTE,
// ============================================================================
// Agent Skill Routes
// ============================================================================
GET_AGENT_SKILL_ROUTE,
// ============================================================================
// Voice/Speech Routes
// ============================================================================
GENERATE_SPEECH_ROUTE,
GENERATE_SPEECH_DEPRECATED_ROUTE,
TRANSCRIBE_SPEECH_ROUTE,
TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,
GET_LISTENER_ROUTE,
// ============================================================================
// Deprecated Routes
// ============================================================================
STREAM_VNEXT_DEPRECATED_ROUTE,
STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,
STREAM_UI_MESSAGE_DEPRECATED_ROUTE
];
// src/server/server-adapter/routes/background-tasks.ts
var BACKGROUND_TASK_ROUTES = [
BACKGROUND_TASK_STREAM_ROUTE,
LIST_BACKGROUND_TASKS_ROUTE,
GET_BACKGROUND_TASK_ROUTE
];
// src/server/server-adapter/routes/channels.ts
var CHANNELS_ROUTES = [
LIST_CHANNEL_PLATFORMS_ROUTE,
LIST_CHANNEL_INSTALLATIONS_ROUTE,
CONNECT_CHANNEL_ROUTE,
DISCONNECT_CHANNEL_ROUTE
];
// src/server/server-adapter/routes/conversations.ts
var CONVERSATIONS_ROUTES = [
CREATE_CONVERSATION_ROUTE,
GET_CONVERSATION_ROUTE,
GET_CONVERSATION_ITEMS_ROUTE,
DELETE_CONVERSATION_ROUTE
];
// src/server/server-adapter/routes/datasets.ts
var DATASETS_ROUTES = [
// Dataset CRUD
LIST_DATASETS_ROUTE,
CREATE_DATASET_ROUTE,
GET_DATASET_ROUTE,
UPDATE_DATASET_ROUTE,
DELETE_DATASET_ROUTE,
// Item list and add
LIST_ITEMS_ROUTE,
ADD_ITEM_ROUTE,
// Batch operations - MUST come before item-specific routes to avoid /items/batch matching /items/:itemId
BATCH_INSERT_ITEMS_ROUTE,
BATCH_DELETE_ITEMS_ROUTE,
// Item-specific CRUD (uses :itemId param)
GET_ITEM_ROUTE,
UPDATE_ITEM_ROUTE,
DELETE_ITEM_ROUTE,
// Version operations
LIST_DATASET_VERSIONS_ROUTE,
LIST_ITEM_VERSIONS_ROUTE,
GET_ITEM_VERSION_ROUTE,
// All experiments (cross-dataset) - MUST come before dataset-scoped experiments
LIST_ALL_EXPERIMENTS_ROUTE,
// Experiment review summary (cross-dataset) - MUST come before dataset-scoped experiments
EXPERIMENT_REVIEW_SUMMARY_ROUTE,
// Experiment operations (dataset-scoped)
LIST_EXPERIMENTS_ROUTE,
TRIGGER_EXPERIMENT_ROUTE,
GET_EXPERIMENT_ROUTE,
LIST_EXPERIMENT_RESULTS_ROUTE,
UPDATE_EXPERIMENT_RESULT_ROUTE,
// Analytics
COMPARE_EXPERIMENTS_ROUTE,
// AI generation
GENERATE_ITEMS_ROUTE,
// Failure analysis
CLUSTER_FAILURES_ROUTE
];
// src/server/server-adapter/routes/editor-builder.ts
var EDITOR_BUILDER_ROUTES = [
GET_EDITOR_BUILDER_SETTINGS_ROUTE,
GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE,
GET_INFRASTRUCTURE_STATUS_ROUTE,
LIST_BUILDER_REGISTRIES_ROUTE,
BUILDER_REGISTRY_SEARCH_ROUTE,
BUILDER_REGISTRY_POPULAR_ROUTE,
BUILDER_REGISTRY_PREVIEW_ROUTE,
BUILDER_REGISTRY_INSTALL_ROUTE
];
// src/server/server-adapter/routes/harness.ts
var HARNESS_ROUTES = [
LIST_HARNESSES_ROUTE,
LIST_HARNESS_MODES_ROUTE,
LIST_HARNESS_MODELS_ROUTE,
CREATE_HARNESS_SESSION_ROUTE,
GET_HARNESS_SESSION_STATE_ROUTE,
LIST_HARNESS_THREADS_ROUTE,
CREATE_HARNESS_THREAD_ROUTE,
DELETE_HARNESS_THREAD_ROUTE,
RENAME_HARNESS_THREAD_ROUTE,
CLONE_HARNESS_THREAD_ROUTE,
LIST_HARNESS_THREAD_MESSAGES_ROUTE,
STREAM_HARNESS_SESSION_ROUTE,
SEND_HARNESS_MESSAGE_ROUTE,
STEER_HARNESS_SESSION_ROUTE,
FOLLOW_UP_HARNESS_SESSION_ROUTE,
ABORT_HARNESS_SESSION_ROUTE,
HARNESS_TOOL_APPROVAL_ROUTE,
HARNESS_TOOL_SUSPENSION_ROUTE,
SWITCH_HARNESS_MODE_ROUTE,
SWITCH_HARNESS_MODEL_ROUTE,
SWITCH_HARNESS_THREAD_ROUTE,
SEND_HARNESS_NOTIFICATION_ROUTE,
GET_HARNESS_WORKSPACE_STATUS_ROUTE,
GET_HARNESS_OM_RECORD_ROUTE,
SET_HARNESS_RESOURCE_ID_ROUTE,
GET_HARNESS_RESOURCE_IDS_ROUTE,
GET_HARNESS_GOAL_ROUTE,
SET_HARNESS_GOAL_ROUTE,
UPDATE_HARNESS_GOAL_ROUTE,
CLEAR_HARNESS_GOAL_ROUTE,
GET_HARNESS_PERMISSIONS_ROUTE,
SET_HARNESS_CATEGORY_PERMISSION_ROUTE,
SET_HARNESS_TOOL_PERMISSION_ROUTE,
SET_HARNESS_SESSION_STATE_ROUTE
];
// src/server/server-adapter/routes/legacy.ts
var LEGACY_ROUTES = [
// ============================================================================
// Legacy Agent Routes
// ============================================================================
GENERATE_LEGACY_ROUTE,
STREAM_GENERATE_LEGACY_ROUTE,
// ============================================================================
// Legacy Workflow Routes
// ============================================================================
STREAM_LEGACY_WORKFLOW_ROUTE,
OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE
];
// src/server/server-adapter/routes/logs.ts
var LOGS_ROUTES = [LIST_LOG_TRANSPORTS_ROUTE, LIST_LOGS_ROUTE, LIST_LOGS_BY_RUN_ID_ROUTE];
// src/server/server-adapter/routes/mcp.ts
var MCP_ROUTES = [
// ============================================================================
// MCP Server Registry Routes
// ============================================================================
LIST_MCP_SERVERS_ROUTE,
GET_MCP_SERVER_DETAIL_ROUTE,
// ============================================================================
// MCP Server Tool Routes
// ============================================================================
LIST_MCP_SERVER_TOOLS_ROUTE,
GET_MCP_SERVER_TOOL_DETAIL_ROUTE,
EXECUTE_MCP_SERVER_TOOL_ROUTE,
// ============================================================================
// MCP Server Resource Routes
// ============================================================================
LIST_MCP_SERVER_RESOURCES_ROUTE,
READ_MCP_SERVER_RESOURCE_ROUTE,
// ============================================================================
// MCP Transport Routes (handled by adapters)
// ============================================================================
MCP_HTTP_TRANSPORT_ROUTE,
MCP_SSE_TRANSPORT_ROUTE,
MCP_SSE_MESSAGES_ROUTE
];
// src/server/server-adapter/routes/memory.ts
var MEMORY_ROUTES = [
GET_MEMORY_STATUS_ROUTE,
GET_MEMORY_CONFIG_ROUTE,
GET_OBSERVATIONAL_MEMORY_ROUTE,
AWAIT_BUFFER_STATUS_ROUTE,
LIST_THREADS_ROUTE,
GET_THREAD_BY_ID_ROUTE,
LIST_MESSAGES_ROUTE,
GET_WORKING_MEMORY_ROUTE,
SAVE_MESSAGES_ROUTE,
CREATE_THREAD_ROUTE,
UPDATE_THREAD_ROUTE,
DELETE_THREAD_ROUTE,
CLONE_THREAD_ROUTE,
UPDATE_WORKING_MEMORY_ROUTE,
DELETE_MESSAGES_ROUTE,
SEARCH_MEMORY_ROUTE,
GET_MEMORY_STATUS_NETWORK_ROUTE,
LIST_THREADS_NETWORK_ROUTE,
GET_THREAD_BY_ID_NETWORK_ROUTE,
LIST_MESSAGES_NETWORK_ROUTE,
SAVE_MESSAGES_NETWORK_ROUTE,
CREATE_THREAD_NETWORK_ROUTE,
UPDATE_THREAD_NETWORK_ROUTE,
DELETE_THREAD_NETWORK_ROUTE,
DELETE_MESSAGES_NETWORK_ROUTE
];
// src/server/server-adapter/routes/observability.ts
var OBSERVABILITY_ROUTES = [
// Legacy
LIST_TRACES_ROUTE,
LIST_TRACES_LIGHT_ROUTE,
LIST_BRANCHES_ROUTE,
GET_BRANCH_ROUTE,
GET_TRACE_ROUTE,
GET_TRACE_LIGHT_ROUTE,
GET_SPAN_ROUTE,
GET_TRACE_TRAJECTORY_ROUTE,
SCORE_TRACES_ROUTE,
LIST_SCORES_BY_SPAN_ROUTE,
// New observability routes
LIST_METRICS,
LIST_LOGS,
LIST_SCORES,
CREATE_SCORE,
GET_SCORE,
GET_SCORE_AGGREGATE,
GET_SCORE_BREAKDOWN,
GET_SCORE_TIME_SERIES,
GET_SCORE_PERCENTILES,
LIST_FEEDBACK,
CREATE_FEEDBACK,
GET_FEEDBACK_AGGREGATE,
GET_FEEDBACK_BREAKDOWN,
GET_FEEDBACK_TIME_SERIES,
GET_FEEDBACK_PERCENTILES,
GET_METRIC_AGGREGATE,
GET_METRIC_BREAKDOWN,
GET_METRIC_TIME_SERIES,
GET_METRIC_PERCENTILES,
GET_METRIC_NAMES,
GET_METRIC_LABEL_KEYS,
GET_METRIC_LABEL_VALUES,
GET_ENTITY_TYPES,
GET_ENTITY_NAMES,
GET_SERVICE_NAMES,
GET_ENVIRONMENTS,
GET_TAGS
];
// src/server/server-adapter/routes/processor-providers.ts
var PROCESSOR_PROVIDER_ROUTES = [LIST_PROCESSOR_PROVIDERS_ROUTE, GET_PROCESSOR_PROVIDER_ROUTE];
// src/server/server-adapter/routes/processors.ts
var PROCESSORS_ROUTES = [LIST_PROCESSORS_ROUTE, GET_PROCESSOR_BY_ID_ROUTE, EXECUTE_PROCESSOR_ROUTE];
// src/server/server-adapter/routes/responses.ts
var RESPONSES_ROUTES = [CREATE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE];
// src/server/server-adapter/routes/schedules.ts
var SCHEDULES_ROUTES = [
LIST_SCHEDULES_ROUTE,
GET_SCHEDULE_ROUTE,
LIST_SCHEDULE_TRIGGERS_ROUTE,
PAUSE_SCHEDULE_ROUTE,
RESUME_SCHEDULE_ROUTE
];
// src/server/server-adapter/routes/scorers.ts
var SCORES_ROUTES = [
LIST_SCORERS_ROUTE,
GET_SCORER_ROUTE,
LIST_SCORES_BY_RUN_ID_ROUTE,
LIST_SCORES_BY_SCORER_ID_ROUTE,
LIST_SCORES_BY_ENTITY_ID_ROUTE,
SAVE_SCORE_ROUTE
];
// src/server/server-adapter/routes/stored-agents.ts
var STORED_AGENTS_ROUTES = [
// ============================================================================
// Stored Agents CRUD Routes
// IMPORTANT: Routes with literal paths (e.g., /preview-instructions) must come
// BEFORE routes with path parameters (e.g., /:storedAgentId) to ensure correct matching.
// ============================================================================
LIST_STORED_AGENTS_ROUTE,
PREVIEW_INSTRUCTIONS_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
GET_STORED_AGENT_DEPENDENTS_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE (longer literal)
EXPORT_STORED_AGENT_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE,
// Must be before GET_STORED_AGENT_ROUTE
GET_STORED_AGENT_ROUTE,
CREATE_STORED_AGENT_ROUTE,
UPDATE_STORED_AGENT_ROUTE,
DELETE_STORED_AGENT_ROUTE,
// ============================================================================
// Agent Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
// ============================================================================
LIST_AGENT_VERSIONS_ROUTE,
CREATE_AGENT_VERSION_ROUTE,
COMPARE_AGENT_VERSIONS_ROUTE,
// Must be before GET_AGENT_VERSION_ROUTE
GET_AGENT_VERSION_ROUTE,
ACTIVATE_AGENT_VERSION_ROUTE,
RESTORE_AGENT_VERSION_ROUTE,
DELETE_AGENT_VERSION_ROUTE,
// ============================================================================
// Favorites (EE)
// ============================================================================
FAVORITE_STORED_AGENT_ROUTE,
UNFAVORITE_STORED_AGENT_ROUTE
];
// src/server/server-adapter/routes/stored-mcp-clients.ts
var STORED_MCP_CLIENTS_ROUTES = [
// Stored MCP Clients CRUD Routes
LIST_STORED_MCP_CLIENTS_ROUTE,
GET_STORED_MCP_CLIENT_ROUTE,
CREATE_STORED_MCP_CLIENT_ROUTE,
UPDATE_STORED_MCP_CLIENT_ROUTE,
DELETE_STORED_MCP_CLIENT_ROUTE,
// MCP Client Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
LIST_MCP_CLIENT_VERSIONS_ROUTE,
CREATE_MCP_CLIENT_VERSION_ROUTE,
COMPARE_MCP_CLIENT_VERSIONS_ROUTE,
GET_MCP_CLIENT_VERSION_ROUTE,
ACTIVATE_MCP_CLIENT_VERSION_ROUTE,
RESTORE_MCP_CLIENT_VERSION_ROUTE,
DELETE_MCP_CLIENT_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-prompt-blocks.ts
var STORED_PROMPT_BLOCKS_ROUTES = [
// Stored Prompt Blocks CRUD Routes
LIST_STORED_PROMPT_BLOCKS_ROUTE,
GET_STORED_PROMPT_BLOCK_ROUTE,
CREATE_STORED_PROMPT_BLOCK_ROUTE,
UPDATE_STORED_PROMPT_BLOCK_ROUTE,
DELETE_STORED_PROMPT_BLOCK_ROUTE,
// Prompt Block Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
LIST_PROMPT_BLOCK_VERSIONS_ROUTE,
CREATE_PROMPT_BLOCK_VERSION_ROUTE,
COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE,
GET_PROMPT_BLOCK_VERSION_ROUTE,
ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE,
RESTORE_PROMPT_BLOCK_VERSION_ROUTE,
DELETE_PROMPT_BLOCK_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-scorers.ts
var STORED_SCORERS_ROUTES = [
// Stored Scorers CRUD Routes
LIST_STORED_SCORERS_ROUTE,
GET_STORED_SCORER_ROUTE,
CREATE_STORED_SCORER_ROUTE,
UPDATE_STORED_SCORER_ROUTE,
DELETE_STORED_SCORER_ROUTE,
// Scorer Versions Routes
// IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE
// routes with path parameters (e.g., /:versionId) to ensure correct matching.
LIST_SCORER_VERSIONS_ROUTE,
CREATE_SCORER_VERSION_ROUTE,
COMPARE_SCORER_VERSIONS_ROUTE,
GET_SCORER_VERSION_ROUTE,
ACTIVATE_SCORER_VERSION_ROUTE,
RESTORE_SCORER_VERSION_ROUTE,
DELETE_SCORER_VERSION_ROUTE
];
// src/server/server-adapter/routes/stored-skills.ts
var STORED_SKILLS_ROUTES = [
// Stored Skills CRUD Routes
LIST_STORED_SKILLS_ROUTE,
GET_STORED_SKILL_ROUTE,
CREATE_STORED_SKILL_ROUTE,
UPDATE_STORED_SKILL_ROUTE,
DELETE_STORED_SKILL_ROUTE,
// Publish
PUBLISH_STORED_SKILL_ROUTE,
// Favorites (EE)
FAVORITE_STORED_SKILL_ROUTE,
UNFAVORITE_STORED_SKILL_ROUTE
];
// src/server/server-adapter/routes/stored-workspaces.ts
var STORED_WORKSPACES_ROUTES = [
// Stored Workspaces CRUD Routes
LIST_STORED_WORKSPACES_ROUTE,
GET_STORED_WORKSPACE_ROUTE,
CREATE_STORED_WORKSPACE_ROUTE,
UPDATE_STORED_WORKSPACE_ROUTE,
DELETE_STORED_WORKSPACE_ROUTE
];
// src/server/server-adapter/routes/system.ts
var SYSTEM_ROUTES = [GET_SYSTEM_PACKAGES_ROUTE, GET_API_SCHEMA_ROUTE];
// src/server/server-adapter/routes/tool-providers.ts
var TOOL_PROVIDER_ROUTES = [
LIST_TOOL_PROVIDERS_ROUTE,
LIST_TOOL_PROVIDER_TOOLKITS_ROUTE,
LIST_TOOL_PROVIDER_TOOLS_ROUTE,
GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE,
AUTHORIZE_TOOL_PROVIDER_ROUTE,
GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE,
TOOL_PROVIDER_CONNECTION_STATUS_ROUTE,
LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE,
LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE,
DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE,
UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE,
GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE,
GET_TOOL_PROVIDER_HEALTH_ROUTE
];
// src/server/server-adapter/routes/tools.ts
var TOOLS_ROUTES = [LIST_TOOLS_ROUTE, GET_TOOL_BY_ID_ROUTE, EXECUTE_TOOL_ROUTE];
// src/server/server-adapter/routes/vectors.ts
var VECTORS_ROUTES = [
UPSERT_VECTORS_ROUTE,
CREATE_INDEX_ROUTE,
QUERY_VECTORS_ROUTE,
LIST_INDEXES_ROUTE,
DESCRIBE_INDEX_ROUTE,
DELETE_INDEX_ROUTE,
LIST_VECTORS_ROUTE,
LIST_EMBEDDERS_ROUTE
];
// src/server/server-adapter/routes/workflows.ts
var WORKFLOWS_ROUTES = [
LIST_WORKFLOWS_ROUTE,
GET_WORKFLOW_BY_ID_ROUTE,
LIST_WORKFLOW_RUNS_ROUTE,
GET_WORKFLOW_RUN_BY_ID_ROUTE,
DELETE_WORKFLOW_RUN_BY_ID_ROUTE,
CREATE_WORKFLOW_RUN_ROUTE,
STREAM_WORKFLOW_ROUTE,
RESUME_STREAM_WORKFLOW_ROUTE,
START_ASYNC_WORKFLOW_ROUTE,
START_WORKFLOW_RUN_ROUTE,
OBSERVE_STREAM_WORKFLOW_ROUTE,
RESUME_ASYNC_WORKFLOW_ROUTE,
RESUME_NO_WAIT_WORKFLOW_ROUTE,
RESUME_WORKFLOW_ROUTE,
CANCEL_WORKFLOW_RUN_ROUTE,
TIME_TRAVEL_WORKFLOW_ROUTE,
TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,
TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,
RESTART_WORKFLOW_ROUTE,
RESTART_ASYNC_WORKFLOW_ROUTE,
RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE,
RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE,
EXECUTE_WORKFLOW_STEP_ROUTE,
RECEIVE_WORKFLOW_EVENT_ROUTE
];
// src/server/server-adapter/routes/workspace.ts
var WORKSPACE_ROUTES = [
// List all workspaces route (at /api/workspaces)
LIST_WORKSPACES_ROUTE,
// Get workspace route (at /api/workspaces/:workspaceId)
GET_WORKSPACE_ROUTE,
// Filesystem routes (at /api/workspaces/:workspaceId/fs/*)
...WORKSPACE_FS_ROUTES,
// Search routes (at /api/workspaces/:workspaceId/search, /api/workspaces/:workspaceId/index)
...WORKSPACE_SEARCH_ROUTES,
// Skills routes (search must come before parameterized routes)
...WORKSPACE_SKILLS_ROUTES,
// skills.sh proxy routes (at /api/workspaces/:workspaceId/skills-sh/*)
...WORKSPACE_SKILLS_SH_ROUTES
];
// src/server/server-adapter/routes/index.ts
var SERVER_ROUTES = [
...AGENTS_ROUTES,
...AUTH_ROUTES,
...WORKFLOWS_ROUTES,
...TOOLS_ROUTES,
...PROCESSORS_ROUTES,
...RESPONSES_ROUTES,
...CONVERSATIONS_ROUTES,
...MEMORY_ROUTES,
...SCORES_ROUTES,
...OBSERVABILITY_ROUTES,
...LOGS_ROUTES,
...VECTORS_ROUTES,
...A2A_ROUTES,
...WORKSPACE_ROUTES,
...LEGACY_ROUTES,
...MCP_ROUTES,
...STORED_AGENTS_ROUTES,
...STORED_MCP_CLIENTS_ROUTES,
...STORED_PROMPT_BLOCKS_ROUTES,
...STORED_SCORERS_ROUTES,
...STORED_WORKSPACES_ROUTES,
...STORED_SKILLS_ROUTES,
...TOOL_PROVIDER_ROUTES,
...PROCESSOR_PROVIDER_ROUTES,
...SYSTEM_ROUTES,
...DATASETS_ROUTES,
...BACKGROUND_TASK_ROUTES,
...EDITOR_BUILDER_ROUTES,
...AGENT_BUILDER_ROUTES,
...SCHEDULES_ROUTES,
...CHANNELS_ROUTES,
...HARNESS_ROUTES
];
export { SERVER_ROUTES, deriveAction, derivePermission, extractResource, getEffectivePermission };
//# sourceMappingURL=chunk-YI5CKY7A.js.map
//# sourceMappingURL=chunk-YI5CKY7A.js.map
{"version":3,"sources":["../src/server/server-adapter/routes/permissions.ts","../src/server/server-adapter/routes/a2a.ts","../src/server/server-adapter/routes/agent-builder.ts","../src/server/server-adapter/routes/agents.ts","../src/server/server-adapter/routes/background-tasks.ts","../src/server/server-adapter/routes/channels.ts","../src/server/server-adapter/routes/conversations.ts","../src/server/server-adapter/routes/datasets.ts","../src/server/server-adapter/routes/editor-builder.ts","../src/server/server-adapter/routes/harness.ts","../src/server/server-adapter/routes/legacy.ts","../src/server/server-adapter/routes/logs.ts","../src/server/server-adapter/routes/mcp.ts","../src/server/server-adapter/routes/memory.ts","../src/server/server-adapter/routes/observability.ts","../src/server/server-adapter/routes/processor-providers.ts","../src/server/server-adapter/routes/processors.ts","../src/server/server-adapter/routes/responses.ts","../src/server/server-adapter/routes/schedules.ts","../src/server/server-adapter/routes/scorers.ts","../src/server/server-adapter/routes/stored-agents.ts","../src/server/server-adapter/routes/stored-mcp-clients.ts","../src/server/server-adapter/routes/stored-prompt-blocks.ts","../src/server/server-adapter/routes/stored-scorers.ts","../src/server/server-adapter/routes/stored-skills.ts","../src/server/server-adapter/routes/stored-workspaces.ts","../src/server/server-adapter/routes/system.ts","../src/server/server-adapter/routes/tool-providers.ts","../src/server/server-adapter/routes/tools.ts","../src/server/server-adapter/routes/vectors.ts","../src/server/server-adapter/routes/workflows.ts","../src/server/server-adapter/routes/workspace.ts","../src/server/server-adapter/routes/index.ts"],"names":[],"mappings":"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","file":"chunk-YI5CKY7A.js","sourcesContent":["/**\n * Permission derivation utilities for automatic route permission assignment.\n *\n * This module provides convention-based permission derivation from route paths and methods,\n * reducing the need to manually specify permissions on each route.\n *\n * Convention: `{resource}:{action}`\n * - resource: First path segment after common prefixes (e.g., 'agents', 'workflows', 'memory')\n * - action: Derived from HTTP method (GET→read, POST→write/execute, DELETE→delete, etc.)\n */\n\nimport type { ServerRoute } from './index';\n\n/**\n * Map HTTP methods to permission actions.\n * POST is context-dependent (write for data, execute for operations).\n */\nconst METHOD_TO_ACTION: Record<string, string> = {\n GET: 'read',\n POST: 'write', // Default for POST, may be overridden to 'execute'\n PUT: 'write',\n PATCH: 'write',\n DELETE: 'delete',\n};\n\n/**\n * Path patterns that indicate an \"execute\" action rather than \"write\" for POST requests.\n * These are typically operation endpoints rather than data creation endpoints.\n */\nconst EXECUTE_PATTERNS = [\n '/generate',\n '/stream',\n '/execute',\n '/start',\n '/resume',\n '/restart',\n '/cancel',\n '/approve',\n '/decline',\n '/speak',\n '/listen',\n '/query',\n '/search',\n '/observe',\n '/time-travel',\n '/enhance',\n '/clone',\n];\n\nconst PUBLISH_PATTERNS = ['/publish', '/activate', '/restore'];\n\n/**\n * Maps `/stored/<family>` URL segments to canonical permission resource slugs.\n */\nconst STORED_RESOURCE_SEGMENTS: Record<string, string> = {\n agents: 'stored-agents',\n 'mcp-clients': 'stored-mcp-clients',\n 'prompt-blocks': 'stored-prompt-blocks',\n scorers: 'stored-scorers',\n skills: 'stored-skills',\n workspaces: 'stored-workspaces',\n};\n\n/**\n * Extracts the primary resource name from a route path.\n *\n * The resource is derived from the first path segment, with special handling\n * for compound resources and well-known paths.\n *\n * Note: The canonical list of resources is generated in permissions.generated.ts\n * from SERVER_ROUTES via `pnpm generate:permissions`.\n *\n * @param path - The route path (e.g., '/agents/:agentId/generate')\n * @returns The resource name (e.g., 'agents') or null if not identifiable\n *\n * @example\n * extractResource('/agents/:agentId') // → 'agents'\n * extractResource('/memory/threads/:threadId') // → 'memory'\n * extractResource('/stored/agents/:agentId') // → 'stored-agents'\n * extractResource('/stored/skills/:skillId') // → 'stored-skills'\n */\nexport function extractResource(path: string): string | null {\n // Remove leading slash and split by segments\n const segments = path.replace(/^\\//, '').split('/');\n\n if (segments.length === 0) {\n return null;\n }\n\n const firstSegment = segments[0];\n\n // Handle special case: /stored/<family> → 'stored-<family>' (or mapped slug).\n // Uses exact segment match (not startsWith) so paths like /stored/skills-archive\n // don't incorrectly collapse into a stored family.\n if (firstSegment === 'stored' && segments[1]) {\n return STORED_RESOURCE_SEGMENTS[segments[1]] ?? null;\n }\n\n // Handle .well-known paths (A2A protocol)\n if (firstSegment === '.well-known') {\n return 'a2a';\n }\n\n return firstSegment || null;\n}\n\n/**\n * Determines the action based on HTTP method and path context.\n *\n * @param method - HTTP method (GET, POST, PUT, DELETE, etc.)\n * @param path - The route path for context\n * @returns The action string (read, write, execute, delete)\n */\nexport function deriveAction(method: string, path: string): string {\n const upperMethod = method.toUpperCase();\n\n // For POST requests, check if it's a publish, execute, or write operation.\n // Publish takes precedence over execute since these suffixes are distinct\n // version-lifecycle operations on stored resources. Restrict publish-suffix\n // matching to /stored/* paths so unrelated routes that happen to end with\n // /activate or /restore aren't accidentally classified as publish.\n if (upperMethod === 'POST') {\n // Restrict publish-suffix matching to /stored/* paths so unrelated routes\n // that happen to end with /activate or /restore aren't accidentally\n // classified as publish.\n if (path.startsWith('/stored/')) {\n const isPublishOperation = PUBLISH_PATTERNS.some(pattern => path.endsWith(pattern));\n if (isPublishOperation) {\n return 'publish';\n }\n }\n const isExecuteOperation = EXECUTE_PATTERNS.some(pattern => path.includes(pattern));\n return isExecuteOperation ? 'execute' : 'write';\n }\n\n return METHOD_TO_ACTION[upperMethod] || 'read';\n}\n\n/**\n * Derives a permission string from a route's path and method.\n *\n * Uses convention: `{resource}:{action}`\n *\n * @param route - The server route to derive permission for\n * @returns The derived permission string, or null if cannot be derived\n *\n * @example\n * derivePermission({ path: '/agents', method: 'GET' }) // → 'agents:read'\n * derivePermission({ path: '/agents/:id/generate', method: 'POST' }) // → 'agents:execute'\n * derivePermission({ path: '/workflows/:id', method: 'DELETE' }) // → 'workflows:delete'\n */\nexport function derivePermission(route: Pick<ServerRoute, 'path' | 'method'>): string | null {\n // Skip for ALL method (typically MCP transports)\n if (route.method === 'ALL') {\n return null;\n }\n\n const resource = extractResource(route.path);\n if (!resource) {\n return null;\n }\n\n const action = deriveAction(route.method, route.path);\n\n return `${resource}:${action}`;\n}\n\n/**\n * Gets the effective permission for a route.\n *\n * Priority:\n * 1. Explicit requiresPermission on the route (string or string[])\n * 2. Derived permission from path/method convention\n * 3. null (no permission required - should only happen for public routes)\n *\n * When the route specifies an array of permissions, the user needs ANY ONE\n * of them (logical OR). This is useful for routes that serve multiple\n * resource types.\n *\n * @param route - The server route\n * @returns The permission string, array of alternative permissions, or null\n */\nexport function getEffectivePermission(route: ServerRoute): string | string[] | null {\n // If route is explicitly public, no permission needed\n if (route.requiresAuth === false) {\n return null;\n }\n\n // Use explicit permission if set\n if (route.requiresPermission) {\n return route.requiresPermission;\n }\n\n // Derive permission from convention\n return derivePermission(route);\n}\n","import { GET_AGENT_CARD_ROUTE, AGENT_EXECUTION_ROUTE } from '../../handlers/a2a';\n\nexport const A2A_ROUTES = [GET_AGENT_CARD_ROUTE, AGENT_EXECUTION_ROUTE] as const;\n","import {\n LIST_AGENT_BUILDER_ACTIONS_ROUTE,\n GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE,\n LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE,\n GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE,\n CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE,\n STREAM_AGENT_BUILDER_ACTION_ROUTE,\n STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,\n START_ASYNC_AGENT_BUILDER_ACTION_ROUTE,\n START_AGENT_BUILDER_ACTION_RUN_ROUTE,\n OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE,\n OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE,\n CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE,\n} from '../../handlers/agent-builder';\n\nexport const AGENT_BUILDER_ROUTES = [\n LIST_AGENT_BUILDER_ACTIONS_ROUTE,\n GET_AGENT_BUILDER_ACTION_BY_ID_ROUTE,\n LIST_AGENT_BUILDER_ACTION_RUNS_ROUTE,\n GET_AGENT_BUILDER_ACTION_RUN_BY_ID_ROUTE,\n CREATE_AGENT_BUILDER_ACTION_RUN_ROUTE,\n STREAM_AGENT_BUILDER_ACTION_ROUTE,\n STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,\n START_ASYNC_AGENT_BUILDER_ACTION_ROUTE,\n START_AGENT_BUILDER_ACTION_RUN_ROUTE,\n OBSERVE_STREAM_AGENT_BUILDER_ACTION_ROUTE,\n OBSERVE_STREAM_LEGACY_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_ASYNC_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_NO_WAIT_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_AGENT_BUILDER_ACTION_ROUTE,\n RESUME_STREAM_AGENT_BUILDER_ACTION_ROUTE,\n CANCEL_AGENT_BUILDER_ACTION_RUN_ROUTE,\n] as const;\n","import {\n // Agent route objects\n LIST_AGENTS_ROUTE,\n GET_AGENT_BY_ID_ROUTE,\n CLONE_AGENT_ROUTE,\n GENERATE_AGENT_ROUTE,\n GENERATE_AGENT_VNEXT_ROUTE,\n STREAM_GENERATE_ROUTE,\n STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,\n OBSERVE_AGENT_STREAM_ROUTE,\n SEND_AGENT_MESSAGE_ROUTE,\n QUEUE_AGENT_MESSAGE_ROUTE,\n SEND_AGENT_SIGNAL_ROUTE,\n ABORT_AGENT_THREAD_ROUTE,\n SUBSCRIBE_AGENT_THREAD_ROUTE,\n GET_PROVIDERS_ROUTE,\n APPROVE_TOOL_CALL_ROUTE,\n SEND_TOOL_APPROVAL_ROUTE,\n DECLINE_TOOL_CALL_ROUTE,\n RESUME_STREAM_ROUTE,\n APPROVE_TOOL_CALL_GENERATE_ROUTE,\n DECLINE_TOOL_CALL_GENERATE_ROUTE,\n STREAM_NETWORK_ROUTE,\n UPDATE_AGENT_MODEL_ROUTE,\n RESET_AGENT_MODEL_ROUTE,\n REORDER_AGENT_MODEL_LIST_ROUTE,\n UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,\n ENHANCE_INSTRUCTIONS_ROUTE,\n STREAM_VNEXT_DEPRECATED_ROUTE,\n STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,\n STREAM_UI_MESSAGE_DEPRECATED_ROUTE,\n APPROVE_NETWORK_TOOL_CALL_ROUTE,\n DECLINE_NETWORK_TOOL_CALL_ROUTE,\n GET_AGENT_SKILL_ROUTE,\n STREAM_UNTIL_IDLE_GENERATE_ROUTE,\n RESUME_STREAM_UNTIL_IDLE_ROUTE,\n} from '../../handlers/agents';\nimport { GET_AGENT_TOOL_ROUTE, EXECUTE_AGENT_TOOL_ROUTE } from '../../handlers/tools';\nimport {\n GET_SPEAKERS_ROUTE,\n GET_SPEAKERS_DEPRECATED_ROUTE,\n GENERATE_SPEECH_ROUTE,\n GENERATE_SPEECH_DEPRECATED_ROUTE,\n TRANSCRIBE_SPEECH_ROUTE,\n TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,\n GET_LISTENER_ROUTE,\n} from '../../handlers/voice';\nimport type { ServerRoute } from '.';\n\nexport const AGENTS_ROUTES: readonly ServerRoute[] = [\n // ============================================================================\n // Agent Core Routes\n // ============================================================================\n LIST_AGENTS_ROUTE,\n GET_PROVIDERS_ROUTE,\n GET_AGENT_BY_ID_ROUTE,\n CLONE_AGENT_ROUTE,\n\n // ============================================================================\n // Voice Routes\n // ============================================================================\n GET_SPEAKERS_ROUTE,\n GET_SPEAKERS_DEPRECATED_ROUTE,\n\n // ============================================================================\n // Agent Execution Routes\n // ============================================================================\n GENERATE_AGENT_ROUTE,\n GENERATE_AGENT_VNEXT_ROUTE,\n STREAM_GENERATE_ROUTE,\n STREAM_UNTIL_IDLE_GENERATE_ROUTE,\n STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,\n\n // ============================================================================\n // Resumable Stream Routes\n // ============================================================================\n OBSERVE_AGENT_STREAM_ROUTE,\n SEND_AGENT_MESSAGE_ROUTE,\n QUEUE_AGENT_MESSAGE_ROUTE,\n SEND_AGENT_SIGNAL_ROUTE,\n ABORT_AGENT_THREAD_ROUTE,\n SUBSCRIBE_AGENT_THREAD_ROUTE,\n\n // ============================================================================\n // Tool Routes\n // ============================================================================\n EXECUTE_AGENT_TOOL_ROUTE,\n APPROVE_TOOL_CALL_ROUTE,\n SEND_TOOL_APPROVAL_ROUTE,\n DECLINE_TOOL_CALL_ROUTE,\n RESUME_STREAM_ROUTE,\n APPROVE_TOOL_CALL_GENERATE_ROUTE,\n DECLINE_TOOL_CALL_GENERATE_ROUTE,\n APPROVE_NETWORK_TOOL_CALL_ROUTE,\n DECLINE_NETWORK_TOOL_CALL_ROUTE,\n RESUME_STREAM_UNTIL_IDLE_ROUTE,\n\n // ============================================================================\n // Network Routes\n // ============================================================================\n STREAM_NETWORK_ROUTE,\n\n // ============================================================================\n // Model Management Routes\n // ============================================================================\n UPDATE_AGENT_MODEL_ROUTE,\n RESET_AGENT_MODEL_ROUTE,\n REORDER_AGENT_MODEL_LIST_ROUTE,\n UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,\n\n // ============================================================================\n // Instruction Enhancement Routes\n // ============================================================================\n ENHANCE_INSTRUCTIONS_ROUTE,\n\n // ============================================================================\n // Agent Tool Routes\n // ============================================================================\n GET_AGENT_TOOL_ROUTE,\n\n // ============================================================================\n // Agent Skill Routes\n // ============================================================================\n GET_AGENT_SKILL_ROUTE,\n\n // ============================================================================\n // Voice/Speech Routes\n // ============================================================================\n GENERATE_SPEECH_ROUTE,\n GENERATE_SPEECH_DEPRECATED_ROUTE,\n TRANSCRIBE_SPEECH_ROUTE,\n TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,\n GET_LISTENER_ROUTE,\n\n // ============================================================================\n // Deprecated Routes\n // ============================================================================\n STREAM_VNEXT_DEPRECATED_ROUTE,\n STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,\n STREAM_UI_MESSAGE_DEPRECATED_ROUTE,\n];\n\n/**\n * Type-level tuple preserving each agent route's specific schema types.\n * Used by ServerRoutes to build the type-level route map.\n */\nexport type AgentRoutes = readonly [\n typeof LIST_AGENTS_ROUTE,\n typeof GET_PROVIDERS_ROUTE,\n typeof GET_AGENT_BY_ID_ROUTE,\n typeof CLONE_AGENT_ROUTE,\n typeof GET_SPEAKERS_ROUTE,\n typeof GET_SPEAKERS_DEPRECATED_ROUTE,\n typeof GENERATE_AGENT_ROUTE,\n typeof GENERATE_AGENT_VNEXT_ROUTE,\n typeof STREAM_GENERATE_ROUTE,\n typeof STREAM_UNTIL_IDLE_GENERATE_ROUTE,\n typeof STREAM_GENERATE_VNEXT_DEPRECATED_ROUTE,\n typeof SEND_AGENT_MESSAGE_ROUTE,\n typeof QUEUE_AGENT_MESSAGE_ROUTE,\n typeof SEND_AGENT_SIGNAL_ROUTE,\n typeof ABORT_AGENT_THREAD_ROUTE,\n typeof SUBSCRIBE_AGENT_THREAD_ROUTE,\n typeof EXECUTE_AGENT_TOOL_ROUTE,\n typeof APPROVE_TOOL_CALL_ROUTE,\n typeof SEND_TOOL_APPROVAL_ROUTE,\n typeof DECLINE_TOOL_CALL_ROUTE,\n typeof RESUME_STREAM_ROUTE,\n typeof RESUME_STREAM_UNTIL_IDLE_ROUTE,\n typeof APPROVE_TOOL_CALL_GENERATE_ROUTE,\n typeof DECLINE_TOOL_CALL_GENERATE_ROUTE,\n typeof APPROVE_NETWORK_TOOL_CALL_ROUTE,\n typeof DECLINE_NETWORK_TOOL_CALL_ROUTE,\n typeof STREAM_NETWORK_ROUTE,\n typeof UPDATE_AGENT_MODEL_ROUTE,\n typeof RESET_AGENT_MODEL_ROUTE,\n typeof REORDER_AGENT_MODEL_LIST_ROUTE,\n typeof UPDATE_AGENT_MODEL_IN_MODEL_LIST_ROUTE,\n typeof ENHANCE_INSTRUCTIONS_ROUTE,\n typeof GET_AGENT_TOOL_ROUTE,\n typeof GET_AGENT_SKILL_ROUTE,\n typeof GENERATE_SPEECH_ROUTE,\n typeof GENERATE_SPEECH_DEPRECATED_ROUTE,\n typeof TRANSCRIBE_SPEECH_ROUTE,\n typeof TRANSCRIBE_SPEECH_DEPRECATED_ROUTE,\n typeof GET_LISTENER_ROUTE,\n typeof STREAM_VNEXT_DEPRECATED_ROUTE,\n typeof STREAM_UI_MESSAGE_VNEXT_DEPRECATED_ROUTE,\n typeof STREAM_UI_MESSAGE_DEPRECATED_ROUTE,\n];\n","import {\n BACKGROUND_TASK_STREAM_ROUTE,\n GET_BACKGROUND_TASK_ROUTE,\n LIST_BACKGROUND_TASKS_ROUTE,\n} from '../../handlers/background-tasks';\nimport type { ServerRoute } from '.';\n\nexport const BACKGROUND_TASK_ROUTES: ServerRoute<any, any, any>[] = [\n BACKGROUND_TASK_STREAM_ROUTE,\n LIST_BACKGROUND_TASKS_ROUTE,\n GET_BACKGROUND_TASK_ROUTE,\n];\n","import {\n LIST_CHANNEL_PLATFORMS_ROUTE,\n LIST_CHANNEL_INSTALLATIONS_ROUTE,\n CONNECT_CHANNEL_ROUTE,\n DISCONNECT_CHANNEL_ROUTE,\n} from '../../handlers/channels';\n\nexport const CHANNELS_ROUTES = [\n LIST_CHANNEL_PLATFORMS_ROUTE,\n LIST_CHANNEL_INSTALLATIONS_ROUTE,\n CONNECT_CHANNEL_ROUTE,\n DISCONNECT_CHANNEL_ROUTE,\n] as const;\n","import {\n CREATE_CONVERSATION_ROUTE,\n DELETE_CONVERSATION_ROUTE,\n GET_CONVERSATION_ITEMS_ROUTE,\n GET_CONVERSATION_ROUTE,\n} from '../../handlers/conversations';\n\nexport const CONVERSATIONS_ROUTES = [\n CREATE_CONVERSATION_ROUTE,\n GET_CONVERSATION_ROUTE,\n GET_CONVERSATION_ITEMS_ROUTE,\n DELETE_CONVERSATION_ROUTE,\n] as const;\n","import {\n LIST_DATASETS_ROUTE,\n CREATE_DATASET_ROUTE,\n GET_DATASET_ROUTE,\n UPDATE_DATASET_ROUTE,\n DELETE_DATASET_ROUTE,\n LIST_ITEMS_ROUTE,\n ADD_ITEM_ROUTE,\n GET_ITEM_ROUTE,\n UPDATE_ITEM_ROUTE,\n DELETE_ITEM_ROUTE,\n LIST_ALL_EXPERIMENTS_ROUTE,\n EXPERIMENT_REVIEW_SUMMARY_ROUTE,\n LIST_EXPERIMENTS_ROUTE,\n TRIGGER_EXPERIMENT_ROUTE,\n GET_EXPERIMENT_ROUTE,\n LIST_EXPERIMENT_RESULTS_ROUTE,\n UPDATE_EXPERIMENT_RESULT_ROUTE,\n COMPARE_EXPERIMENTS_ROUTE,\n LIST_DATASET_VERSIONS_ROUTE,\n LIST_ITEM_VERSIONS_ROUTE,\n GET_ITEM_VERSION_ROUTE,\n BATCH_INSERT_ITEMS_ROUTE,\n BATCH_DELETE_ITEMS_ROUTE,\n GENERATE_ITEMS_ROUTE,\n CLUSTER_FAILURES_ROUTE,\n} from '../../handlers/datasets';\n\nexport const DATASETS_ROUTES = [\n // Dataset CRUD\n LIST_DATASETS_ROUTE,\n CREATE_DATASET_ROUTE,\n GET_DATASET_ROUTE,\n UPDATE_DATASET_ROUTE,\n DELETE_DATASET_ROUTE,\n // Item list and add\n LIST_ITEMS_ROUTE,\n ADD_ITEM_ROUTE,\n // Batch operations - MUST come before item-specific routes to avoid /items/batch matching /items/:itemId\n BATCH_INSERT_ITEMS_ROUTE,\n BATCH_DELETE_ITEMS_ROUTE,\n // Item-specific CRUD (uses :itemId param)\n GET_ITEM_ROUTE,\n UPDATE_ITEM_ROUTE,\n DELETE_ITEM_ROUTE,\n // Version operations\n LIST_DATASET_VERSIONS_ROUTE,\n LIST_ITEM_VERSIONS_ROUTE,\n GET_ITEM_VERSION_ROUTE,\n // All experiments (cross-dataset) - MUST come before dataset-scoped experiments\n LIST_ALL_EXPERIMENTS_ROUTE,\n // Experiment review summary (cross-dataset) - MUST come before dataset-scoped experiments\n EXPERIMENT_REVIEW_SUMMARY_ROUTE,\n // Experiment operations (dataset-scoped)\n LIST_EXPERIMENTS_ROUTE,\n TRIGGER_EXPERIMENT_ROUTE,\n GET_EXPERIMENT_ROUTE,\n LIST_EXPERIMENT_RESULTS_ROUTE,\n UPDATE_EXPERIMENT_RESULT_ROUTE,\n // Analytics\n COMPARE_EXPERIMENTS_ROUTE,\n // AI generation\n GENERATE_ITEMS_ROUTE,\n // Failure analysis\n CLUSTER_FAILURES_ROUTE,\n] as const;\n","import {\n BUILDER_REGISTRY_INSTALL_ROUTE,\n BUILDER_REGISTRY_POPULAR_ROUTE,\n BUILDER_REGISTRY_PREVIEW_ROUTE,\n BUILDER_REGISTRY_SEARCH_ROUTE,\n LIST_BUILDER_REGISTRIES_ROUTE,\n} from '../../handlers/builder-registry';\nimport {\n GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE,\n GET_EDITOR_BUILDER_SETTINGS_ROUTE,\n GET_INFRASTRUCTURE_STATUS_ROUTE,\n} from '../../handlers/editor-builder';\n\n/**\n * Editor Builder Routes\n *\n * Routes for agent builder settings, infrastructure status, and external\n * skill registries.\n */\nexport const EDITOR_BUILDER_ROUTES = [\n GET_EDITOR_BUILDER_SETTINGS_ROUTE,\n GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE,\n GET_INFRASTRUCTURE_STATUS_ROUTE,\n LIST_BUILDER_REGISTRIES_ROUTE,\n BUILDER_REGISTRY_SEARCH_ROUTE,\n BUILDER_REGISTRY_POPULAR_ROUTE,\n BUILDER_REGISTRY_PREVIEW_ROUTE,\n BUILDER_REGISTRY_INSTALL_ROUTE,\n] as const;\n","import {\n LIST_HARNESSES_ROUTE,\n CREATE_HARNESS_SESSION_ROUTE,\n GET_HARNESS_SESSION_STATE_ROUTE,\n STREAM_HARNESS_SESSION_ROUTE,\n SEND_HARNESS_MESSAGE_ROUTE,\n STEER_HARNESS_SESSION_ROUTE,\n ABORT_HARNESS_SESSION_ROUTE,\n HARNESS_TOOL_APPROVAL_ROUTE,\n HARNESS_TOOL_SUSPENSION_ROUTE,\n SWITCH_HARNESS_MODE_ROUTE,\n SWITCH_HARNESS_MODEL_ROUTE,\n SWITCH_HARNESS_THREAD_ROUTE,\n LIST_HARNESS_MODES_ROUTE,\n LIST_HARNESS_THREADS_ROUTE,\n SEND_HARNESS_NOTIFICATION_ROUTE,\n CREATE_HARNESS_THREAD_ROUTE,\n DELETE_HARNESS_THREAD_ROUTE,\n RENAME_HARNESS_THREAD_ROUTE,\n CLONE_HARNESS_THREAD_ROUTE,\n LIST_HARNESS_THREAD_MESSAGES_ROUTE,\n FOLLOW_UP_HARNESS_SESSION_ROUTE,\n LIST_HARNESS_MODELS_ROUTE,\n GET_HARNESS_WORKSPACE_STATUS_ROUTE,\n GET_HARNESS_OM_RECORD_ROUTE,\n SET_HARNESS_RESOURCE_ID_ROUTE,\n GET_HARNESS_RESOURCE_IDS_ROUTE,\n GET_HARNESS_GOAL_ROUTE,\n SET_HARNESS_GOAL_ROUTE,\n UPDATE_HARNESS_GOAL_ROUTE,\n CLEAR_HARNESS_GOAL_ROUTE,\n GET_HARNESS_PERMISSIONS_ROUTE,\n SET_HARNESS_CATEGORY_PERMISSION_ROUTE,\n SET_HARNESS_TOOL_PERMISSION_ROUTE,\n SET_HARNESS_SESSION_STATE_ROUTE,\n} from '../../handlers/harness';\nimport type { ServerRoute } from '.';\n\nexport const HARNESS_ROUTES: readonly ServerRoute[] = [\n LIST_HARNESSES_ROUTE,\n LIST_HARNESS_MODES_ROUTE,\n LIST_HARNESS_MODELS_ROUTE,\n CREATE_HARNESS_SESSION_ROUTE,\n GET_HARNESS_SESSION_STATE_ROUTE,\n LIST_HARNESS_THREADS_ROUTE,\n CREATE_HARNESS_THREAD_ROUTE,\n DELETE_HARNESS_THREAD_ROUTE,\n RENAME_HARNESS_THREAD_ROUTE,\n CLONE_HARNESS_THREAD_ROUTE,\n LIST_HARNESS_THREAD_MESSAGES_ROUTE,\n STREAM_HARNESS_SESSION_ROUTE,\n SEND_HARNESS_MESSAGE_ROUTE,\n STEER_HARNESS_SESSION_ROUTE,\n FOLLOW_UP_HARNESS_SESSION_ROUTE,\n ABORT_HARNESS_SESSION_ROUTE,\n HARNESS_TOOL_APPROVAL_ROUTE,\n HARNESS_TOOL_SUSPENSION_ROUTE,\n SWITCH_HARNESS_MODE_ROUTE,\n SWITCH_HARNESS_MODEL_ROUTE,\n SWITCH_HARNESS_THREAD_ROUTE,\n SEND_HARNESS_NOTIFICATION_ROUTE,\n GET_HARNESS_WORKSPACE_STATUS_ROUTE,\n GET_HARNESS_OM_RECORD_ROUTE,\n SET_HARNESS_RESOURCE_ID_ROUTE,\n GET_HARNESS_RESOURCE_IDS_ROUTE,\n GET_HARNESS_GOAL_ROUTE,\n SET_HARNESS_GOAL_ROUTE,\n UPDATE_HARNESS_GOAL_ROUTE,\n CLEAR_HARNESS_GOAL_ROUTE,\n GET_HARNESS_PERMISSIONS_ROUTE,\n SET_HARNESS_CATEGORY_PERMISSION_ROUTE,\n SET_HARNESS_TOOL_PERMISSION_ROUTE,\n SET_HARNESS_SESSION_STATE_ROUTE,\n];\n","/**\n * Legacy routes that are deprecated but still exist in deployer for backward compatibility.\n * These routes should not be used in new code and will be removed in a future version.\n */\n\nimport { GENERATE_LEGACY_ROUTE, STREAM_GENERATE_LEGACY_ROUTE } from '../../handlers/agents';\nimport { STREAM_LEGACY_WORKFLOW_ROUTE, OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE } from '../../handlers/workflows';\n\nexport const LEGACY_ROUTES = [\n // ============================================================================\n // Legacy Agent Routes\n // ============================================================================\n GENERATE_LEGACY_ROUTE,\n STREAM_GENERATE_LEGACY_ROUTE,\n\n // ============================================================================\n // Legacy Workflow Routes\n // ============================================================================\n STREAM_LEGACY_WORKFLOW_ROUTE,\n OBSERVE_STREAM_LEGACY_WORKFLOW_ROUTE,\n] as const;\n","import { LIST_LOG_TRANSPORTS_ROUTE, LIST_LOGS_ROUTE, LIST_LOGS_BY_RUN_ID_ROUTE } from '../../handlers/logs';\n\nexport const LOGS_ROUTES = [LIST_LOG_TRANSPORTS_ROUTE, LIST_LOGS_ROUTE, LIST_LOGS_BY_RUN_ID_ROUTE] as const;\n","import {\n LIST_MCP_SERVERS_ROUTE,\n GET_MCP_SERVER_DETAIL_ROUTE,\n LIST_MCP_SERVER_TOOLS_ROUTE,\n GET_MCP_SERVER_TOOL_DETAIL_ROUTE,\n EXECUTE_MCP_SERVER_TOOL_ROUTE,\n LIST_MCP_SERVER_RESOURCES_ROUTE,\n READ_MCP_SERVER_RESOURCE_ROUTE,\n MCP_HTTP_TRANSPORT_ROUTE,\n MCP_SSE_TRANSPORT_ROUTE,\n MCP_SSE_MESSAGES_ROUTE,\n} from '../../handlers/mcp';\n\n/**\n * MCP Routes\n *\n * Registry routes provide access to the MCP server registry and tools.\n * Transport routes handle the MCP protocol communication (HTTP and SSE).\n */\nexport const MCP_ROUTES = [\n // ============================================================================\n // MCP Server Registry Routes\n // ============================================================================\n LIST_MCP_SERVERS_ROUTE,\n GET_MCP_SERVER_DETAIL_ROUTE,\n\n // ============================================================================\n // MCP Server Tool Routes\n // ============================================================================\n LIST_MCP_SERVER_TOOLS_ROUTE,\n GET_MCP_SERVER_TOOL_DETAIL_ROUTE,\n EXECUTE_MCP_SERVER_TOOL_ROUTE,\n\n // ============================================================================\n // MCP Server Resource Routes\n // ============================================================================\n LIST_MCP_SERVER_RESOURCES_ROUTE,\n READ_MCP_SERVER_RESOURCE_ROUTE,\n\n // ============================================================================\n // MCP Transport Routes (handled by adapters)\n // ============================================================================\n MCP_HTTP_TRANSPORT_ROUTE,\n MCP_SSE_TRANSPORT_ROUTE,\n MCP_SSE_MESSAGES_ROUTE,\n] as const;\n","import {\n GET_MEMORY_STATUS_ROUTE,\n GET_MEMORY_CONFIG_ROUTE,\n GET_OBSERVATIONAL_MEMORY_ROUTE,\n AWAIT_BUFFER_STATUS_ROUTE,\n LIST_THREADS_ROUTE,\n GET_THREAD_BY_ID_ROUTE,\n LIST_MESSAGES_ROUTE,\n GET_WORKING_MEMORY_ROUTE,\n SAVE_MESSAGES_ROUTE,\n CREATE_THREAD_ROUTE,\n UPDATE_THREAD_ROUTE,\n DELETE_THREAD_ROUTE,\n CLONE_THREAD_ROUTE,\n UPDATE_WORKING_MEMORY_ROUTE,\n DELETE_MESSAGES_ROUTE,\n SEARCH_MEMORY_ROUTE,\n GET_MEMORY_STATUS_NETWORK_ROUTE,\n LIST_THREADS_NETWORK_ROUTE,\n GET_THREAD_BY_ID_NETWORK_ROUTE,\n LIST_MESSAGES_NETWORK_ROUTE,\n SAVE_MESSAGES_NETWORK_ROUTE,\n CREATE_THREAD_NETWORK_ROUTE,\n UPDATE_THREAD_NETWORK_ROUTE,\n DELETE_THREAD_NETWORK_ROUTE,\n DELETE_MESSAGES_NETWORK_ROUTE,\n} from '../../handlers/memory';\n\nexport const MEMORY_ROUTES = [\n GET_MEMORY_STATUS_ROUTE,\n GET_MEMORY_CONFIG_ROUTE,\n GET_OBSERVATIONAL_MEMORY_ROUTE,\n AWAIT_BUFFER_STATUS_ROUTE,\n LIST_THREADS_ROUTE,\n GET_THREAD_BY_ID_ROUTE,\n LIST_MESSAGES_ROUTE,\n GET_WORKING_MEMORY_ROUTE,\n SAVE_MESSAGES_ROUTE,\n CREATE_THREAD_ROUTE,\n UPDATE_THREAD_ROUTE,\n DELETE_THREAD_ROUTE,\n CLONE_THREAD_ROUTE,\n UPDATE_WORKING_MEMORY_ROUTE,\n DELETE_MESSAGES_ROUTE,\n SEARCH_MEMORY_ROUTE,\n GET_MEMORY_STATUS_NETWORK_ROUTE,\n LIST_THREADS_NETWORK_ROUTE,\n GET_THREAD_BY_ID_NETWORK_ROUTE,\n LIST_MESSAGES_NETWORK_ROUTE,\n SAVE_MESSAGES_NETWORK_ROUTE,\n CREATE_THREAD_NETWORK_ROUTE,\n UPDATE_THREAD_NETWORK_ROUTE,\n DELETE_THREAD_NETWORK_ROUTE,\n DELETE_MESSAGES_NETWORK_ROUTE,\n] as const;\n","import {\n LIST_TRACES_ROUTE,\n LIST_TRACES_LIGHT_ROUTE,\n LIST_BRANCHES_ROUTE,\n GET_BRANCH_ROUTE,\n GET_TRACE_ROUTE,\n GET_TRACE_LIGHT_ROUTE,\n GET_SPAN_ROUTE,\n GET_TRACE_TRAJECTORY_ROUTE,\n SCORE_TRACES_ROUTE,\n LIST_SCORES_BY_SPAN_ROUTE,\n} from '../../handlers/observability';\nimport {\n LIST_METRICS,\n LIST_LOGS,\n LIST_SCORES,\n CREATE_SCORE,\n GET_SCORE,\n GET_SCORE_AGGREGATE,\n GET_SCORE_BREAKDOWN,\n GET_SCORE_TIME_SERIES,\n GET_SCORE_PERCENTILES,\n LIST_FEEDBACK,\n CREATE_FEEDBACK,\n GET_FEEDBACK_AGGREGATE,\n GET_FEEDBACK_BREAKDOWN,\n GET_FEEDBACK_TIME_SERIES,\n GET_FEEDBACK_PERCENTILES,\n GET_METRIC_AGGREGATE,\n GET_METRIC_BREAKDOWN,\n GET_METRIC_TIME_SERIES,\n GET_METRIC_PERCENTILES,\n GET_METRIC_NAMES,\n GET_METRIC_LABEL_KEYS,\n GET_METRIC_LABEL_VALUES,\n GET_ENTITY_TYPES,\n GET_ENTITY_NAMES,\n GET_SERVICE_NAMES,\n GET_ENVIRONMENTS,\n GET_TAGS,\n} from '../../handlers/observability-new-endpoints';\n\nexport const OBSERVABILITY_ROUTES = [\n // Legacy\n LIST_TRACES_ROUTE,\n LIST_TRACES_LIGHT_ROUTE,\n LIST_BRANCHES_ROUTE,\n GET_BRANCH_ROUTE,\n GET_TRACE_ROUTE,\n GET_TRACE_LIGHT_ROUTE,\n GET_SPAN_ROUTE,\n GET_TRACE_TRAJECTORY_ROUTE,\n SCORE_TRACES_ROUTE,\n LIST_SCORES_BY_SPAN_ROUTE,\n // New observability routes\n LIST_METRICS,\n LIST_LOGS,\n LIST_SCORES,\n CREATE_SCORE,\n GET_SCORE,\n GET_SCORE_AGGREGATE,\n GET_SCORE_BREAKDOWN,\n GET_SCORE_TIME_SERIES,\n GET_SCORE_PERCENTILES,\n LIST_FEEDBACK,\n CREATE_FEEDBACK,\n GET_FEEDBACK_AGGREGATE,\n GET_FEEDBACK_BREAKDOWN,\n GET_FEEDBACK_TIME_SERIES,\n GET_FEEDBACK_PERCENTILES,\n GET_METRIC_AGGREGATE,\n GET_METRIC_BREAKDOWN,\n GET_METRIC_TIME_SERIES,\n GET_METRIC_PERCENTILES,\n GET_METRIC_NAMES,\n GET_METRIC_LABEL_KEYS,\n GET_METRIC_LABEL_VALUES,\n GET_ENTITY_TYPES,\n GET_ENTITY_NAMES,\n GET_SERVICE_NAMES,\n GET_ENVIRONMENTS,\n GET_TAGS,\n] as const;\n","import { LIST_PROCESSOR_PROVIDERS_ROUTE, GET_PROCESSOR_PROVIDER_ROUTE } from '../../handlers/processor-providers';\n\nexport const PROCESSOR_PROVIDER_ROUTES = [LIST_PROCESSOR_PROVIDERS_ROUTE, GET_PROCESSOR_PROVIDER_ROUTE] as const;\n","import { LIST_PROCESSORS_ROUTE, GET_PROCESSOR_BY_ID_ROUTE, EXECUTE_PROCESSOR_ROUTE } from '../../handlers/processors';\n\nexport const PROCESSORS_ROUTES = [LIST_PROCESSORS_ROUTE, GET_PROCESSOR_BY_ID_ROUTE, EXECUTE_PROCESSOR_ROUTE] as const;\n","import { CREATE_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE } from '../../handlers/responses';\n\nexport const RESPONSES_ROUTES = [CREATE_RESPONSE_ROUTE, GET_RESPONSE_ROUTE, DELETE_RESPONSE_ROUTE] as const;\n","import {\n GET_SCHEDULE_ROUTE,\n LIST_SCHEDULES_ROUTE,\n LIST_SCHEDULE_TRIGGERS_ROUTE,\n PAUSE_SCHEDULE_ROUTE,\n RESUME_SCHEDULE_ROUTE,\n} from '../../handlers/schedules';\nimport type { ServerRoute } from '.';\n\nexport const SCHEDULES_ROUTES: ServerRoute<any, any, any>[] = [\n LIST_SCHEDULES_ROUTE,\n GET_SCHEDULE_ROUTE,\n LIST_SCHEDULE_TRIGGERS_ROUTE,\n PAUSE_SCHEDULE_ROUTE,\n RESUME_SCHEDULE_ROUTE,\n];\n","import {\n LIST_SCORERS_ROUTE,\n GET_SCORER_ROUTE,\n LIST_SCORES_BY_RUN_ID_ROUTE,\n LIST_SCORES_BY_SCORER_ID_ROUTE,\n LIST_SCORES_BY_ENTITY_ID_ROUTE,\n SAVE_SCORE_ROUTE,\n} from '../../handlers/scores';\n\nexport const SCORES_ROUTES = [\n LIST_SCORERS_ROUTE,\n GET_SCORER_ROUTE,\n LIST_SCORES_BY_RUN_ID_ROUTE,\n LIST_SCORES_BY_SCORER_ID_ROUTE,\n LIST_SCORES_BY_ENTITY_ID_ROUTE,\n SAVE_SCORE_ROUTE,\n] as const;\n","import {\n LIST_AGENT_VERSIONS_ROUTE,\n CREATE_AGENT_VERSION_ROUTE,\n GET_AGENT_VERSION_ROUTE,\n ACTIVATE_AGENT_VERSION_ROUTE,\n RESTORE_AGENT_VERSION_ROUTE,\n DELETE_AGENT_VERSION_ROUTE,\n COMPARE_AGENT_VERSIONS_ROUTE,\n} from '../../handlers/agent-versions';\nimport { FAVORITE_STORED_AGENT_ROUTE, UNFAVORITE_STORED_AGENT_ROUTE } from '../../handlers/stored-agent-favorites';\nimport {\n LIST_STORED_AGENTS_ROUTE,\n GET_STORED_AGENT_ROUTE,\n GET_STORED_AGENT_DEPENDENTS_ROUTE,\n CREATE_STORED_AGENT_ROUTE,\n UPDATE_STORED_AGENT_ROUTE,\n DELETE_STORED_AGENT_ROUTE,\n PREVIEW_INSTRUCTIONS_ROUTE,\n EXPORT_STORED_AGENT_ROUTE,\n OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE,\n} from '../../handlers/stored-agents';\nimport type { ServerRoute } from '.';\n\n/**\n * Routes for stored agents CRUD operations and version management.\n * These routes provide API access to agent configurations stored in the database,\n * enabling dynamic creation and management of agents via Mastra Studio.\n */\nexport const STORED_AGENTS_ROUTES: readonly ServerRoute[] = [\n // ============================================================================\n // Stored Agents CRUD Routes\n // IMPORTANT: Routes with literal paths (e.g., /preview-instructions) must come\n // BEFORE routes with path parameters (e.g., /:storedAgentId) to ensure correct matching.\n // ============================================================================\n LIST_STORED_AGENTS_ROUTE,\n PREVIEW_INSTRUCTIONS_ROUTE, // Must be before GET_STORED_AGENT_ROUTE\n GET_STORED_AGENT_DEPENDENTS_ROUTE, // Must be before GET_STORED_AGENT_ROUTE (longer literal)\n EXPORT_STORED_AGENT_ROUTE, // Must be before GET_STORED_AGENT_ROUTE\n OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE, // Must be before GET_STORED_AGENT_ROUTE\n GET_STORED_AGENT_ROUTE,\n CREATE_STORED_AGENT_ROUTE,\n UPDATE_STORED_AGENT_ROUTE,\n DELETE_STORED_AGENT_ROUTE,\n\n // ============================================================================\n // Agent Versions Routes\n // IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE\n // routes with path parameters (e.g., /:versionId) to ensure correct matching.\n // ============================================================================\n LIST_AGENT_VERSIONS_ROUTE,\n CREATE_AGENT_VERSION_ROUTE,\n COMPARE_AGENT_VERSIONS_ROUTE, // Must be before GET_AGENT_VERSION_ROUTE\n GET_AGENT_VERSION_ROUTE,\n ACTIVATE_AGENT_VERSION_ROUTE,\n RESTORE_AGENT_VERSION_ROUTE,\n DELETE_AGENT_VERSION_ROUTE,\n\n // ============================================================================\n // Favorites (EE)\n // ============================================================================\n FAVORITE_STORED_AGENT_ROUTE,\n UNFAVORITE_STORED_AGENT_ROUTE,\n];\n\n/**\n * Type-level tuple preserving each stored agent route's specific schema types.\n * Used by ServerRoutes to build the type-level route map.\n */\nexport type StoredAgentRoutes = readonly [\n typeof LIST_STORED_AGENTS_ROUTE,\n typeof PREVIEW_INSTRUCTIONS_ROUTE,\n typeof GET_STORED_AGENT_DEPENDENTS_ROUTE,\n typeof EXPORT_STORED_AGENT_ROUTE,\n typeof OPEN_STORED_AGENT_CHANGE_REQUEST_ROUTE,\n typeof GET_STORED_AGENT_ROUTE,\n typeof CREATE_STORED_AGENT_ROUTE,\n typeof UPDATE_STORED_AGENT_ROUTE,\n typeof DELETE_STORED_AGENT_ROUTE,\n typeof LIST_AGENT_VERSIONS_ROUTE,\n typeof CREATE_AGENT_VERSION_ROUTE,\n typeof COMPARE_AGENT_VERSIONS_ROUTE,\n typeof GET_AGENT_VERSION_ROUTE,\n typeof ACTIVATE_AGENT_VERSION_ROUTE,\n typeof RESTORE_AGENT_VERSION_ROUTE,\n typeof DELETE_AGENT_VERSION_ROUTE,\n typeof FAVORITE_STORED_AGENT_ROUTE,\n typeof UNFAVORITE_STORED_AGENT_ROUTE,\n];\n","import {\n LIST_MCP_CLIENT_VERSIONS_ROUTE,\n CREATE_MCP_CLIENT_VERSION_ROUTE,\n GET_MCP_CLIENT_VERSION_ROUTE,\n ACTIVATE_MCP_CLIENT_VERSION_ROUTE,\n RESTORE_MCP_CLIENT_VERSION_ROUTE,\n DELETE_MCP_CLIENT_VERSION_ROUTE,\n COMPARE_MCP_CLIENT_VERSIONS_ROUTE,\n} from '../../handlers/mcp-client-versions';\nimport {\n LIST_STORED_MCP_CLIENTS_ROUTE,\n GET_STORED_MCP_CLIENT_ROUTE,\n CREATE_STORED_MCP_CLIENT_ROUTE,\n UPDATE_STORED_MCP_CLIENT_ROUTE,\n DELETE_STORED_MCP_CLIENT_ROUTE,\n} from '../../handlers/stored-mcp-clients';\n\nexport const STORED_MCP_CLIENTS_ROUTES = [\n // Stored MCP Clients CRUD Routes\n LIST_STORED_MCP_CLIENTS_ROUTE,\n GET_STORED_MCP_CLIENT_ROUTE,\n CREATE_STORED_MCP_CLIENT_ROUTE,\n UPDATE_STORED_MCP_CLIENT_ROUTE,\n DELETE_STORED_MCP_CLIENT_ROUTE,\n\n // MCP Client Versions Routes\n // IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE\n // routes with path parameters (e.g., /:versionId) to ensure correct matching.\n LIST_MCP_CLIENT_VERSIONS_ROUTE,\n CREATE_MCP_CLIENT_VERSION_ROUTE,\n COMPARE_MCP_CLIENT_VERSIONS_ROUTE,\n GET_MCP_CLIENT_VERSION_ROUTE,\n ACTIVATE_MCP_CLIENT_VERSION_ROUTE,\n RESTORE_MCP_CLIENT_VERSION_ROUTE,\n DELETE_MCP_CLIENT_VERSION_ROUTE,\n] as const;\n","import {\n LIST_PROMPT_BLOCK_VERSIONS_ROUTE,\n CREATE_PROMPT_BLOCK_VERSION_ROUTE,\n GET_PROMPT_BLOCK_VERSION_ROUTE,\n ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE,\n RESTORE_PROMPT_BLOCK_VERSION_ROUTE,\n DELETE_PROMPT_BLOCK_VERSION_ROUTE,\n COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE,\n} from '../../handlers/prompt-block-versions';\nimport {\n LIST_STORED_PROMPT_BLOCKS_ROUTE,\n GET_STORED_PROMPT_BLOCK_ROUTE,\n CREATE_STORED_PROMPT_BLOCK_ROUTE,\n UPDATE_STORED_PROMPT_BLOCK_ROUTE,\n DELETE_STORED_PROMPT_BLOCK_ROUTE,\n} from '../../handlers/stored-prompt-blocks';\n\nexport const STORED_PROMPT_BLOCKS_ROUTES = [\n // Stored Prompt Blocks CRUD Routes\n LIST_STORED_PROMPT_BLOCKS_ROUTE,\n GET_STORED_PROMPT_BLOCK_ROUTE,\n CREATE_STORED_PROMPT_BLOCK_ROUTE,\n UPDATE_STORED_PROMPT_BLOCK_ROUTE,\n DELETE_STORED_PROMPT_BLOCK_ROUTE,\n\n // Prompt Block Versions Routes\n // IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE\n // routes with path parameters (e.g., /:versionId) to ensure correct matching.\n LIST_PROMPT_BLOCK_VERSIONS_ROUTE,\n CREATE_PROMPT_BLOCK_VERSION_ROUTE,\n COMPARE_PROMPT_BLOCK_VERSIONS_ROUTE,\n GET_PROMPT_BLOCK_VERSION_ROUTE,\n ACTIVATE_PROMPT_BLOCK_VERSION_ROUTE,\n RESTORE_PROMPT_BLOCK_VERSION_ROUTE,\n DELETE_PROMPT_BLOCK_VERSION_ROUTE,\n] as const;\n","import {\n LIST_SCORER_VERSIONS_ROUTE,\n CREATE_SCORER_VERSION_ROUTE,\n GET_SCORER_VERSION_ROUTE,\n ACTIVATE_SCORER_VERSION_ROUTE,\n RESTORE_SCORER_VERSION_ROUTE,\n DELETE_SCORER_VERSION_ROUTE,\n COMPARE_SCORER_VERSIONS_ROUTE,\n} from '../../handlers/scorer-versions';\nimport {\n LIST_STORED_SCORERS_ROUTE,\n GET_STORED_SCORER_ROUTE,\n CREATE_STORED_SCORER_ROUTE,\n UPDATE_STORED_SCORER_ROUTE,\n DELETE_STORED_SCORER_ROUTE,\n} from '../../handlers/stored-scorers';\n\nexport const STORED_SCORERS_ROUTES = [\n // Stored Scorers CRUD Routes\n LIST_STORED_SCORERS_ROUTE,\n GET_STORED_SCORER_ROUTE,\n CREATE_STORED_SCORER_ROUTE,\n UPDATE_STORED_SCORER_ROUTE,\n DELETE_STORED_SCORER_ROUTE,\n\n // Scorer Versions Routes\n // IMPORTANT: Routes with literal paths (e.g., /compare) must come BEFORE\n // routes with path parameters (e.g., /:versionId) to ensure correct matching.\n LIST_SCORER_VERSIONS_ROUTE,\n CREATE_SCORER_VERSION_ROUTE,\n COMPARE_SCORER_VERSIONS_ROUTE,\n GET_SCORER_VERSION_ROUTE,\n ACTIVATE_SCORER_VERSION_ROUTE,\n RESTORE_SCORER_VERSION_ROUTE,\n DELETE_SCORER_VERSION_ROUTE,\n] as const;\n","import { FAVORITE_STORED_SKILL_ROUTE, UNFAVORITE_STORED_SKILL_ROUTE } from '../../handlers/stored-skill-favorites';\nimport {\n LIST_STORED_SKILLS_ROUTE,\n GET_STORED_SKILL_ROUTE,\n CREATE_STORED_SKILL_ROUTE,\n UPDATE_STORED_SKILL_ROUTE,\n DELETE_STORED_SKILL_ROUTE,\n PUBLISH_STORED_SKILL_ROUTE,\n} from '../../handlers/stored-skills';\n\nexport const STORED_SKILLS_ROUTES = [\n // Stored Skills CRUD Routes\n LIST_STORED_SKILLS_ROUTE,\n GET_STORED_SKILL_ROUTE,\n CREATE_STORED_SKILL_ROUTE,\n UPDATE_STORED_SKILL_ROUTE,\n DELETE_STORED_SKILL_ROUTE,\n // Publish\n PUBLISH_STORED_SKILL_ROUTE,\n // Favorites (EE)\n FAVORITE_STORED_SKILL_ROUTE,\n UNFAVORITE_STORED_SKILL_ROUTE,\n] as const;\n","import {\n LIST_STORED_WORKSPACES_ROUTE,\n GET_STORED_WORKSPACE_ROUTE,\n CREATE_STORED_WORKSPACE_ROUTE,\n UPDATE_STORED_WORKSPACE_ROUTE,\n DELETE_STORED_WORKSPACE_ROUTE,\n} from '../../handlers/stored-workspaces';\n\nexport const STORED_WORKSPACES_ROUTES = [\n // Stored Workspaces CRUD Routes\n LIST_STORED_WORKSPACES_ROUTE,\n GET_STORED_WORKSPACE_ROUTE,\n CREATE_STORED_WORKSPACE_ROUTE,\n UPDATE_STORED_WORKSPACE_ROUTE,\n DELETE_STORED_WORKSPACE_ROUTE,\n] as const;\n","import { GET_API_SCHEMA_ROUTE, GET_SYSTEM_PACKAGES_ROUTE } from '../../handlers/system';\n\n/**\n * System Routes\n *\n * Routes for system information and diagnostics.\n */\nexport const SYSTEM_ROUTES = [GET_SYSTEM_PACKAGES_ROUTE, GET_API_SCHEMA_ROUTE] as const;\n","import {\n AUTHORIZE_TOOL_PROVIDER_ROUTE,\n DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE,\n GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE,\n GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE,\n GET_TOOL_PROVIDER_HEALTH_ROUTE,\n GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE,\n LIST_TOOL_PROVIDERS_ROUTE,\n LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE,\n LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE,\n LIST_TOOL_PROVIDER_TOOLKITS_ROUTE,\n LIST_TOOL_PROVIDER_TOOLS_ROUTE,\n TOOL_PROVIDER_CONNECTION_STATUS_ROUTE,\n UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE,\n} from '../../handlers/tool-providers';\n\nexport const TOOL_PROVIDER_ROUTES = [\n LIST_TOOL_PROVIDERS_ROUTE,\n LIST_TOOL_PROVIDER_TOOLKITS_ROUTE,\n LIST_TOOL_PROVIDER_TOOLS_ROUTE,\n GET_TOOL_PROVIDER_TOOL_SCHEMA_ROUTE,\n AUTHORIZE_TOOL_PROVIDER_ROUTE,\n GET_TOOL_PROVIDER_AUTH_STATUS_ROUTE,\n TOOL_PROVIDER_CONNECTION_STATUS_ROUTE,\n LIST_TOOL_PROVIDER_CONNECTIONS_ROUTE,\n LIST_TOOL_PROVIDER_CONNECTION_FIELDS_ROUTE,\n DISCONNECT_TOOL_PROVIDER_CONNECTION_ROUTE,\n UPDATE_TOOL_PROVIDER_CONNECTION_ROUTE,\n GET_TOOL_PROVIDER_CONNECTION_USAGE_ROUTE,\n GET_TOOL_PROVIDER_HEALTH_ROUTE,\n] as const;\n","import { LIST_TOOLS_ROUTE, GET_TOOL_BY_ID_ROUTE, EXECUTE_TOOL_ROUTE } from '../../handlers/tools';\n\nexport const TOOLS_ROUTES = [LIST_TOOLS_ROUTE, GET_TOOL_BY_ID_ROUTE, EXECUTE_TOOL_ROUTE] as const;\n","import {\n UPSERT_VECTORS_ROUTE,\n CREATE_INDEX_ROUTE,\n QUERY_VECTORS_ROUTE,\n LIST_INDEXES_ROUTE,\n DESCRIBE_INDEX_ROUTE,\n DELETE_INDEX_ROUTE,\n LIST_VECTORS_ROUTE,\n LIST_EMBEDDERS_ROUTE,\n} from '../../handlers/vector';\n\nexport const VECTORS_ROUTES = [\n UPSERT_VECTORS_ROUTE,\n CREATE_INDEX_ROUTE,\n QUERY_VECTORS_ROUTE,\n LIST_INDEXES_ROUTE,\n DESCRIBE_INDEX_ROUTE,\n DELETE_INDEX_ROUTE,\n LIST_VECTORS_ROUTE,\n LIST_EMBEDDERS_ROUTE,\n] as const;\n","import {\n LIST_WORKFLOWS_ROUTE,\n GET_WORKFLOW_BY_ID_ROUTE,\n LIST_WORKFLOW_RUNS_ROUTE,\n GET_WORKFLOW_RUN_BY_ID_ROUTE,\n CREATE_WORKFLOW_RUN_ROUTE,\n STREAM_WORKFLOW_ROUTE,\n RESUME_STREAM_WORKFLOW_ROUTE,\n START_ASYNC_WORKFLOW_ROUTE,\n START_WORKFLOW_RUN_ROUTE,\n OBSERVE_STREAM_WORKFLOW_ROUTE,\n RESUME_ASYNC_WORKFLOW_ROUTE,\n RESUME_NO_WAIT_WORKFLOW_ROUTE,\n RESUME_WORKFLOW_ROUTE,\n CANCEL_WORKFLOW_RUN_ROUTE,\n TIME_TRAVEL_WORKFLOW_ROUTE,\n TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,\n RESTART_WORKFLOW_ROUTE,\n RESTART_ASYNC_WORKFLOW_ROUTE,\n RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE,\n RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE,\n TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,\n DELETE_WORKFLOW_RUN_BY_ID_ROUTE,\n EXECUTE_WORKFLOW_STEP_ROUTE,\n RECEIVE_WORKFLOW_EVENT_ROUTE,\n} from '../../handlers/workflows';\n\nexport const WORKFLOWS_ROUTES = [\n LIST_WORKFLOWS_ROUTE,\n GET_WORKFLOW_BY_ID_ROUTE,\n LIST_WORKFLOW_RUNS_ROUTE,\n GET_WORKFLOW_RUN_BY_ID_ROUTE,\n DELETE_WORKFLOW_RUN_BY_ID_ROUTE,\n CREATE_WORKFLOW_RUN_ROUTE,\n STREAM_WORKFLOW_ROUTE,\n RESUME_STREAM_WORKFLOW_ROUTE,\n START_ASYNC_WORKFLOW_ROUTE,\n START_WORKFLOW_RUN_ROUTE,\n OBSERVE_STREAM_WORKFLOW_ROUTE,\n RESUME_ASYNC_WORKFLOW_ROUTE,\n RESUME_NO_WAIT_WORKFLOW_ROUTE,\n RESUME_WORKFLOW_ROUTE,\n CANCEL_WORKFLOW_RUN_ROUTE,\n TIME_TRAVEL_WORKFLOW_ROUTE,\n TIME_TRAVEL_ASYNC_WORKFLOW_ROUTE,\n TIME_TRAVEL_STREAM_WORKFLOW_ROUTE,\n RESTART_WORKFLOW_ROUTE,\n RESTART_ASYNC_WORKFLOW_ROUTE,\n RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ROUTE,\n RESTART_ALL_ACTIVE_WORKFLOW_RUNS_ASYNC_ROUTE,\n EXECUTE_WORKFLOW_STEP_ROUTE,\n RECEIVE_WORKFLOW_EVENT_ROUTE,\n] as const;\n","/**\n * Workspace Routes\n *\n * All routes for workspace operations under /api/workspaces/*\n */\n\nimport {\n LIST_WORKSPACES_ROUTE,\n GET_WORKSPACE_ROUTE,\n WORKSPACE_FS_ROUTES,\n WORKSPACE_SEARCH_ROUTES,\n WORKSPACE_SKILLS_ROUTES,\n WORKSPACE_SKILLS_SH_ROUTES,\n} from '../../handlers/workspace';\n\nexport const WORKSPACE_ROUTES = [\n // List all workspaces route (at /api/workspaces)\n LIST_WORKSPACES_ROUTE,\n\n // Get workspace route (at /api/workspaces/:workspaceId)\n GET_WORKSPACE_ROUTE,\n\n // Filesystem routes (at /api/workspaces/:workspaceId/fs/*)\n ...WORKSPACE_FS_ROUTES,\n\n // Search routes (at /api/workspaces/:workspaceId/search, /api/workspaces/:workspaceId/index)\n ...WORKSPACE_SEARCH_ROUTES,\n\n // Skills routes (search must come before parameterized routes)\n ...WORKSPACE_SKILLS_ROUTES,\n\n // skills.sh proxy routes (at /api/workspaces/:workspaceId/skills-sh/*)\n ...WORKSPACE_SKILLS_SH_ROUTES,\n] as const;\n","import type { Mastra } from '@mastra/core';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport type { FGARouteConfig, MastraFGAPermissionInput } from '@mastra/core/auth/ee';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { ApiRoute, ValidationErrorHook } from '@mastra/core/server';\nimport type * as z from 'zod/v4';\nimport type { InMemoryTaskStore } from '../../a2a/store';\nimport type { OpenAPIRoute } from '../openapi-utils';\nimport { A2A_ROUTES } from './a2a';\nimport { AGENT_BUILDER_ROUTES } from './agent-builder';\nimport { AGENTS_ROUTES } from './agents';\nimport type { AgentRoutes } from './agents';\nimport { AUTH_ROUTES } from './auth';\nimport { BACKGROUND_TASK_ROUTES } from './background-tasks';\nimport { CHANNELS_ROUTES } from './channels';\nimport { CONVERSATIONS_ROUTES } from './conversations';\nimport { DATASETS_ROUTES } from './datasets';\nimport { EDITOR_BUILDER_ROUTES } from './editor-builder';\nimport { HARNESS_ROUTES } from './harness';\nimport { LEGACY_ROUTES } from './legacy';\nimport { LOGS_ROUTES } from './logs';\nimport { MCP_ROUTES } from './mcp';\nimport { MEMORY_ROUTES } from './memory';\nimport { OBSERVABILITY_ROUTES } from './observability';\nimport { PROCESSOR_PROVIDER_ROUTES } from './processor-providers';\nimport { PROCESSORS_ROUTES } from './processors';\nimport { RESPONSES_ROUTES } from './responses';\nimport { SCHEDULES_ROUTES } from './schedules';\nimport { SCORES_ROUTES } from './scorers';\nimport { STORED_AGENTS_ROUTES } from './stored-agents';\nimport type { StoredAgentRoutes } from './stored-agents';\nimport { STORED_MCP_CLIENTS_ROUTES } from './stored-mcp-clients';\nimport { STORED_PROMPT_BLOCKS_ROUTES } from './stored-prompt-blocks';\nimport { STORED_SCORERS_ROUTES } from './stored-scorers';\nimport { STORED_SKILLS_ROUTES } from './stored-skills';\nimport { STORED_WORKSPACES_ROUTES } from './stored-workspaces';\nimport type { MastraStreamReturn } from './stream-types';\nimport { SYSTEM_ROUTES } from './system';\nimport { TOOL_PROVIDER_ROUTES } from './tool-providers';\nimport { TOOLS_ROUTES } from './tools';\nimport { VECTORS_ROUTES } from './vectors';\nimport { WORKFLOWS_ROUTES } from './workflows';\nimport { WORKSPACE_ROUTES } from './workspace';\n\n/**\n * Server context fields that are available to route handlers.\n * These are injected by the server adapters (Express, Hono, etc.)\n * Fields other than `mastra` are optional to allow direct handler testing.\n */\nexport type ServerContext = {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools?: ToolsInput;\n taskStore?: InMemoryTaskStore;\n abortSignal: AbortSignal;\n /** The route prefix configured for the server (e.g., '/api') */\n routePrefix?: string;\n /** The web-standard Request object for accessing headers, cookies, etc. */\n request?: Request;\n};\n\n/**\n * Utility type to infer parameters from Zod schemas.\n * Merges path params, query params, and body params into a single type.\n */\nexport type InferParams<\n TPathSchema extends z.ZodTypeAny | undefined,\n TQuerySchema extends z.ZodTypeAny | undefined,\n TBodySchema extends z.ZodTypeAny | undefined,\n> = (TPathSchema extends z.ZodTypeAny ? z.infer<TPathSchema> : {}) &\n (TQuerySchema extends z.ZodTypeAny ? z.infer<TQuerySchema> : {}) &\n (TBodySchema extends z.ZodTypeAny ? z.infer<TBodySchema> : {});\n\n/**\n * All supported response types for server routes.\n * - 'json': Standard JSON response\n * - 'stream': Streaming response (SSE or raw stream)\n * - 'datastream-response': Pre-built Response object for data streams\n * - 'mcp-http': MCP Streamable HTTP transport (handled by adapter)\n * - 'mcp-sse': MCP SSE transport (handled by adapter)\n */\nexport type ResponseType = 'stream' | 'json' | 'datastream-response' | 'mcp-http' | 'mcp-sse';\n\nexport type ServerRouteHandler<\n TParams = Record<string, unknown>,\n TResponse = unknown,\n TResponseType extends ResponseType = 'json',\n> = (\n params: TParams & ServerContext,\n) => Promise<\n TResponseType extends 'stream'\n ? MastraStreamReturn\n : TResponseType extends 'datastream-response'\n ? Response\n : TResponse\n>;\n\n/**\n * Phantom type for preserving Zod schema types on routes.\n * Not present at runtime — used only for type-level inference via RouteMap.\n */\nexport interface RouteSchemas<\n TPathSchema = unknown,\n TQuerySchema = unknown,\n TBodySchema = unknown,\n TResponseSchema = unknown,\n> {\n readonly pathParams: TPathSchema;\n readonly queryParams: TQuerySchema;\n readonly body: TBodySchema;\n readonly response: TResponseSchema;\n}\n\nexport type ServerRoute<\n TParams = Record<string, unknown>,\n TResponse = unknown,\n TResponseType extends ResponseType = ResponseType,\n TSchemas extends RouteSchemas = RouteSchemas,\n TMethod extends string = string,\n TPath extends string = string,\n> = Omit<ApiRoute, 'handler' | 'createHandler' | 'method' | 'path' | 'openapi'> & {\n method: TMethod;\n path: TPath;\n responseType: TResponseType;\n streamFormat?: 'sse' | 'stream'; // Only used when responseType is 'stream', defaults to 'stream'\n sseFlushOnConnect?: boolean;\n // Method signature is bivariant in params, allowing heterogeneous route arrays\n // while still preserving specific param types on individual routes.\n handler(params: TParams & ServerContext): ReturnType<ServerRouteHandler<TParams, TResponse, TResponseType>>;\n pathParamSchema?: z.ZodSchema;\n queryParamSchema?: z.ZodSchema;\n bodySchema?: z.ZodSchema;\n responseSchema?: z.ZodSchema;\n openapi?: OpenAPIRoute; // Auto-generated OpenAPI spec for this route\n maxBodySize?: number; // Optional route-specific body size limit in bytes\n deprecated?: boolean; // Flag for deprecated routes (used for route parity, skipped in tests)\n /**\n * Permission required to access this route (EE feature).\n * If set, the user must have this permission to access the route.\n * Uses the format: `resource:action` or `resource:action:resourceId`\n *\n * When an array is provided, the user needs ANY ONE of the listed permissions\n * (logical OR). This is useful for routes that serve multiple resource types,\n * e.g. a streaming endpoint used by both runtime and stored agents.\n *\n * @example\n * requiresPermission: MastraFGAPermissions.AGENTS_READ\n * requiresPermission: MastraFGAPermissions.WORKFLOWS_EXECUTE\n */\n requiresPermission?: MastraFGAPermissionInput | MastraFGAPermissionInput[];\n /**\n * FGA authorization config for this route (EE feature).\n * If set, the user must have the specified permission on the resource.\n *\n * @example\n * fga: { resourceType: 'agent', resourceIdParam: 'agentId', permission: MastraFGAPermissions.AGENTS_EXECUTE }\n */\n fga?: FGARouteConfig;\n onValidationError?: ValidationErrorHook;\n /** @internal Phantom type — not present at runtime. Used for type-level schema inference. */\n readonly __schemas?: TSchemas;\n};\n\nexport const SERVER_ROUTES: readonly ServerRoute[] = [\n ...AGENTS_ROUTES,\n ...AUTH_ROUTES,\n ...WORKFLOWS_ROUTES,\n ...TOOLS_ROUTES,\n ...PROCESSORS_ROUTES,\n ...RESPONSES_ROUTES,\n ...CONVERSATIONS_ROUTES,\n ...MEMORY_ROUTES,\n ...SCORES_ROUTES,\n ...OBSERVABILITY_ROUTES,\n ...LOGS_ROUTES,\n ...VECTORS_ROUTES,\n ...A2A_ROUTES,\n ...WORKSPACE_ROUTES,\n ...LEGACY_ROUTES,\n ...MCP_ROUTES,\n ...STORED_AGENTS_ROUTES,\n ...STORED_MCP_CLIENTS_ROUTES,\n ...STORED_PROMPT_BLOCKS_ROUTES,\n ...STORED_SCORERS_ROUTES,\n ...STORED_WORKSPACES_ROUTES,\n ...STORED_SKILLS_ROUTES,\n ...TOOL_PROVIDER_ROUTES,\n ...PROCESSOR_PROVIDER_ROUTES,\n ...SYSTEM_ROUTES,\n ...DATASETS_ROUTES,\n ...BACKGROUND_TASK_ROUTES,\n ...EDITOR_BUILDER_ROUTES,\n ...AGENT_BUILDER_ROUTES,\n ...SCHEDULES_ROUTES,\n ...CHANNELS_ROUTES,\n ...HARNESS_ROUTES,\n];\n\n/**\n * Union type of all individual route arrays.\n * Built from the per-domain `as const` tuples to preserve each route's specific schema types.\n */\nexport type ServerRoutes = readonly [\n ...AgentRoutes,\n ...typeof AUTH_ROUTES,\n ...typeof WORKFLOWS_ROUTES,\n ...typeof TOOLS_ROUTES,\n ...typeof PROCESSORS_ROUTES,\n ...typeof RESPONSES_ROUTES,\n ...typeof CONVERSATIONS_ROUTES,\n ...typeof MEMORY_ROUTES,\n ...typeof SCORES_ROUTES,\n ...typeof OBSERVABILITY_ROUTES,\n ...typeof LOGS_ROUTES,\n ...typeof VECTORS_ROUTES,\n ...typeof A2A_ROUTES,\n ...typeof AGENT_BUILDER_ROUTES,\n ...typeof WORKSPACE_ROUTES,\n ...typeof LEGACY_ROUTES,\n ...typeof MCP_ROUTES,\n ...StoredAgentRoutes,\n ...typeof STORED_MCP_CLIENTS_ROUTES,\n ...typeof STORED_PROMPT_BLOCKS_ROUTES,\n ...typeof STORED_SCORERS_ROUTES,\n ...typeof STORED_WORKSPACES_ROUTES,\n ...typeof STORED_SKILLS_ROUTES,\n ...typeof TOOL_PROVIDER_ROUTES,\n ...typeof PROCESSOR_PROVIDER_ROUTES,\n ...typeof SYSTEM_ROUTES,\n ...typeof DATASETS_ROUTES,\n ...typeof EDITOR_BUILDER_ROUTES,\n ...typeof CHANNELS_ROUTES,\n];\n\n// Export route builder and OpenAPI utilities\nexport { createRoute, createPublicRoute, pickParams, jsonQueryParam, wrapSchemaForQueryParams } from './route-builder';\nexport { generateOpenAPIDocument } from '../openapi-utils';\n\n// Export permission utilities\nexport { derivePermission, extractResource, deriveAction, getEffectivePermission } from './permissions';\n"]}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display