@mastra/server 1.81.0-alpha.0 → 1.81.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_types/@internal_core/dist/storage/index.d.ts +11 -0
- package/dist/{a2a-CSz0rw8E.js → a2a-UYs7rzN2.js} +2 -2
- package/dist/{a2a-CSz0rw8E.js.map → a2a-UYs7rzN2.js.map} +1 -1
- package/dist/{a2a-CmMIWPuz.cjs → a2a-eUB3oDRN.cjs} +2 -2
- package/dist/{a2a-CmMIWPuz.cjs.map → a2a-eUB3oDRN.cjs.map} +1 -1
- package/dist/{agent-builder-XhBB0Svr.js → agent-builder-5dpawFJf.js} +2 -2
- package/dist/{agent-builder-XhBB0Svr.js.map → agent-builder-5dpawFJf.js.map} +1 -1
- package/dist/{agent-builder-DIEX-as5.cjs → agent-builder-DwfHzUnt.cjs} +2 -2
- package/dist/{agent-builder-DIEX-as5.cjs.map → agent-builder-DwfHzUnt.cjs.map} +1 -1
- package/dist/{agents-D36tukip.cjs → agents-BjdRPzyV.cjs} +3 -2
- package/dist/agents-BjdRPzyV.cjs.map +1 -0
- package/dist/{agents-BVjnYswL.js → agents-BuI0JjjX.js} +3 -2
- package/dist/agents-BuI0JjjX.js.map +1 -0
- package/dist/{api-schema-manifest-BVPhF1ZS.js → api-schema-manifest-DafznVYs.js} +2 -2
- package/dist/{api-schema-manifest-BVPhF1ZS.js.map → api-schema-manifest-DafznVYs.js.map} +1 -1
- package/dist/{api-schema-manifest-BWId44SV.cjs → api-schema-manifest-GgyfF4dw.cjs} +2 -2
- package/dist/{api-schema-manifest-BWId44SV.cjs.map → api-schema-manifest-GgyfF4dw.cjs.map} +1 -1
- package/dist/{builder-registry-DWusXgse.cjs → builder-registry-CamBJItc.cjs} +2 -2
- package/dist/{builder-registry-DWusXgse.cjs.map → builder-registry-CamBJItc.cjs.map} +1 -1
- package/dist/{builder-registry-CtGv0Gj6.js → builder-registry-DHVK50Ba.js} +2 -2
- package/dist/{builder-registry-CtGv0Gj6.js.map → builder-registry-DHVK50Ba.js.map} +1 -1
- package/dist/{conversations-CJn0ioOZ.cjs → conversations-ORTpTqBg.cjs} +2 -2
- package/dist/{conversations-CJn0ioOZ.cjs.map → conversations-ORTpTqBg.cjs.map} +1 -1
- package/dist/{conversations-CABVTBQY.js → conversations-fdXV9K0J.js} +2 -2
- package/dist/{conversations-CABVTBQY.js.map → conversations-fdXV9K0J.js.map} +1 -1
- package/dist/{dist-BK1fCE4z.cjs → dist-BEtxPxkM.cjs} +1 -1
- package/dist/dist-BQ1uFC_1.js +1 -0
- package/dist/{dist-OpNBTIST.cjs → dist-CR3PolEz.cjs} +5 -4
- package/dist/{dist-OpNBTIST.cjs.map → dist-CR3PolEz.cjs.map} +1 -1
- package/dist/{dist-BLjE21MA.js → dist-CmG4sN60.js} +5 -4
- package/dist/{dist-BLjE21MA.js.map → dist-CmG4sN60.js.map} +1 -1
- package/dist/docs/SKILL.md +2 -2
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/reference-observability-tracing-advanced-queries.md +226 -86
- package/dist/docs/references/reference-server-routes.md +18 -14
- package/dist/{editor-builder-CeiISBIO.cjs → editor-builder-6l27BFzD.cjs} +2 -2
- package/dist/{editor-builder-CeiISBIO.cjs.map → editor-builder-6l27BFzD.cjs.map} +1 -1
- package/dist/{editor-builder-DeD6EVm8.js → editor-builder-DxGZ7IN5.js} +2 -2
- package/dist/{editor-builder-DeD6EVm8.js.map → editor-builder-DxGZ7IN5.js.map} +1 -1
- package/dist/{mcp-Bt3h1lO7.cjs → mcp-B7Q8qwjn.cjs} +118 -3
- package/dist/mcp-B7Q8qwjn.cjs.map +1 -0
- package/dist/{mcp-mpYrlkUA.cjs → mcp-CMw0sq0y.cjs} +177 -4
- package/dist/mcp-CMw0sq0y.cjs.map +1 -0
- package/dist/{mcp-D4Cprr8R.js → mcp-CQ_pR-JC.js} +77 -4
- package/dist/mcp-CQ_pR-JC.js.map +1 -0
- package/dist/{mcp-D3F3iYew.js → mcp-DN9mT9q4.js} +154 -5
- package/dist/mcp-DN9mT9q4.js.map +1 -0
- package/dist/{observability-DHuljMXO.cjs → observability-DRbDeN1X.cjs} +2 -2
- package/dist/{observability-DHuljMXO.cjs.map → observability-DRbDeN1X.cjs.map} +1 -1
- package/dist/{observability-new-endpoints-CaTskbSh.cjs → observability-new-endpoints-BrB2CKix.cjs} +15 -4
- package/dist/observability-new-endpoints-BrB2CKix.cjs.map +1 -0
- package/dist/{observability-new-endpoints-CsUP8y2j.js → observability-new-endpoints-CQNVjYYq.js} +16 -5
- package/dist/observability-new-endpoints-CQNVjYYq.js.map +1 -0
- package/dist/{observability-BgIU0otL.js → observability-pX3wmG8T.js} +2 -2
- package/dist/{observability-BgIU0otL.js.map → observability-pX3wmG8T.js.map} +1 -1
- package/dist/{plans-Dydti0sT.cjs → plans-BHQFsFRU.cjs} +2 -2
- package/dist/{plans-Dydti0sT.cjs.map → plans-BHQFsFRU.cjs.map} +1 -1
- package/dist/{plans-B5GgYqx-.js → plans-D9BGMVkL.js} +2 -2
- package/dist/{plans-B5GgYqx-.js.map → plans-D9BGMVkL.js.map} +1 -1
- package/dist/{probe-image-size-BqH96zcz.js → probe-image-size-BjNoJxWf.js} +2 -2
- package/dist/{probe-image-size-BqH96zcz.js.map → probe-image-size-BjNoJxWf.js.map} +1 -1
- package/dist/{probe-image-size-BIZUe8Bp.cjs → probe-image-size-jS0ECSlc.cjs} +2 -2
- package/dist/{probe-image-size-BIZUe8Bp.cjs.map → probe-image-size-jS0ECSlc.cjs.map} +1 -1
- package/dist/{responses-CxvSoOLt.cjs → responses-4_RCBNJB.cjs} +2 -2
- package/dist/{responses-CxvSoOLt.cjs.map → responses-4_RCBNJB.cjs.map} +1 -1
- package/dist/{responses-DbiqhxP3.js → responses-Cb-9JV9A.js} +2 -2
- package/dist/{responses-DbiqhxP3.js.map → responses-Cb-9JV9A.js.map} +1 -1
- package/dist/{routes-CBrxFxzL.js → routes-4X2kSYEG.js} +19 -15
- package/dist/{routes-CBrxFxzL.js.map → routes-4X2kSYEG.js.map} +1 -1
- package/dist/{routes-By3cLbPV.cjs → routes-BqWcvAcz.cjs} +19 -15
- package/dist/routes-BqWcvAcz.cjs.map +1 -0
- package/dist/{scores-CnozEyM4.cjs → scores-DnEcBe2i.cjs} +2 -2
- package/dist/{scores-CnozEyM4.cjs.map → scores-DnEcBe2i.cjs.map} +1 -1
- package/dist/{scores-BjclMqFa.js → scores-DqImg-o-.js} +2 -2
- package/dist/{scores-BjclMqFa.js.map → scores-DqImg-o-.js.map} +1 -1
- package/dist/server/handlers/a2a.cjs +1 -1
- package/dist/server/handlers/a2a.js +1 -1
- package/dist/server/handlers/agent-builder.cjs +1 -1
- package/dist/server/handlers/agent-builder.js +1 -1
- package/dist/server/handlers/agents.cjs +1 -1
- package/dist/server/handlers/agents.d.ts.map +1 -1
- package/dist/server/handlers/agents.js +1 -1
- package/dist/server/handlers/builder-registry.cjs +1 -1
- package/dist/server/handlers/builder-registry.js +1 -1
- package/dist/server/handlers/conversations.cjs +1 -1
- package/dist/server/handlers/conversations.js +1 -1
- package/dist/server/handlers/editor-builder.cjs +1 -1
- package/dist/server/handlers/editor-builder.js +1 -1
- package/dist/server/handlers/error.cjs +5 -4
- package/dist/server/handlers/error.cjs.map +1 -1
- package/dist/server/handlers/error.d.ts.map +1 -1
- package/dist/server/handlers/error.js +5 -4
- package/dist/server/handlers/error.js.map +1 -1
- package/dist/server/handlers/favorites-enrichment.cjs +1 -1
- package/dist/server/handlers/favorites-enrichment.js +1 -1
- package/dist/server/handlers/mcp.cjs +5 -1
- package/dist/server/handlers/mcp.d.ts +507 -245
- package/dist/server/handlers/mcp.d.ts.map +1 -1
- package/dist/server/handlers/mcp.js +1 -1
- package/dist/server/handlers/observability-new-endpoints.cjs +1 -1
- package/dist/server/handlers/observability-new-endpoints.d.ts +80 -16
- package/dist/server/handlers/observability-new-endpoints.d.ts.map +1 -1
- package/dist/server/handlers/observability-new-endpoints.js +1 -1
- package/dist/server/handlers/observability-shared.cjs +56 -0
- package/dist/server/handlers/observability-shared.cjs.map +1 -1
- package/dist/server/handlers/observability-shared.d.ts +29 -0
- package/dist/server/handlers/observability-shared.d.ts.map +1 -1
- package/dist/server/handlers/observability-shared.js +50 -1
- package/dist/server/handlers/observability-shared.js.map +1 -1
- package/dist/server/handlers/observability.cjs +2 -2
- package/dist/server/handlers/observability.js +2 -2
- package/dist/server/handlers/plans.cjs +1 -1
- package/dist/server/handlers/plans.js +1 -1
- package/dist/server/handlers/responses.cjs +1 -1
- package/dist/server/handlers/responses.js +1 -1
- package/dist/server/handlers/scores.cjs +1 -1
- package/dist/server/handlers/scores.js +1 -1
- package/dist/server/handlers/stored-agent-favorites.cjs +1 -1
- package/dist/server/handlers/stored-agent-favorites.js +1 -1
- package/dist/server/handlers/stored-agents.cjs +1 -1
- package/dist/server/handlers/stored-agents.js +1 -1
- package/dist/server/handlers/stored-skill-favorites.cjs +1 -1
- package/dist/server/handlers/stored-skill-favorites.js +1 -1
- package/dist/server/handlers/stored-skills.cjs +1 -1
- package/dist/server/handlers/stored-skills.js +1 -1
- package/dist/server/handlers/system.cjs +2 -2
- package/dist/server/handlers/system.d.ts +8 -0
- package/dist/server/handlers/system.d.ts.map +1 -1
- package/dist/server/handlers/system.js +2 -2
- package/dist/server/handlers/tools.cjs +1 -1
- package/dist/server/handlers/tools.js +1 -1
- package/dist/server/handlers/workspace.cjs +1 -1
- package/dist/server/handlers/workspace.d.ts +4 -0
- package/dist/server/handlers/workspace.d.ts.map +1 -1
- package/dist/server/handlers/workspace.js +1 -1
- package/dist/server/handlers.cjs +11 -11
- package/dist/server/handlers.js +11 -11
- package/dist/server/schemas/index.cjs +3 -3
- package/dist/server/schemas/index.js +3 -3
- package/dist/server/schemas/mcp.d.ts +141 -0
- package/dist/server/schemas/mcp.d.ts.map +1 -1
- package/dist/server/schemas/system.d.ts +8 -0
- package/dist/server/schemas/system.d.ts.map +1 -1
- package/dist/server/schemas/workspace.d.ts +2 -0
- package/dist/server/schemas/workspace.d.ts.map +1 -1
- package/dist/server/server-adapter/index.cjs +1 -1
- package/dist/server/server-adapter/index.js +1 -1
- package/dist/server/server-adapter/routes/mcp.d.ts +256 -0
- package/dist/server/server-adapter/routes/mcp.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/observability.d.ts +42 -10
- package/dist/server/server-adapter/routes/observability.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/system.d.ts +8 -0
- package/dist/server/server-adapter/routes/system.d.ts.map +1 -1
- package/dist/server/server-adapter/routes/workspace.d.ts +4 -0
- package/dist/server/server-adapter/routes/workspace.d.ts.map +1 -1
- package/dist/{system-BxHpBJiq.cjs → system-CHCn8IQ3.cjs} +5 -1
- package/dist/system-CHCn8IQ3.cjs.map +1 -0
- package/dist/{system-CxwzIMsy.js → system-DOwo7OGf.js} +5 -1
- package/dist/system-DOwo7OGf.js.map +1 -0
- package/dist/{tools-Ck35EVD7.js → tools-BFpuzQsz.js} +2 -2
- package/dist/{tools-Ck35EVD7.js.map → tools-BFpuzQsz.js.map} +1 -1
- package/dist/{tools-CeJrnYDf.cjs → tools-Dy_j6URC.cjs} +2 -2
- package/dist/{tools-CeJrnYDf.cjs.map → tools-Dy_j6URC.cjs.map} +1 -1
- package/dist/{workspace-CyH_iu8w.cjs → workspace-BU6sQpbV.cjs} +14 -10
- package/dist/{workspace-C9dE6D1U.js.map → workspace-BU6sQpbV.cjs.map} +1 -1
- package/dist/{workspace-KeHGZvNV.cjs → workspace-C5BBUatQ.cjs} +3 -1
- package/dist/workspace-C5BBUatQ.cjs.map +1 -0
- package/dist/{workspace-C9dE6D1U.js → workspace-CS-GYTve.js} +14 -10
- package/dist/workspace-CS-GYTve.js.map +1 -0
- package/dist/{workspace-muaSMxVS.js → workspace-DBDA3UQl.js} +3 -1
- package/dist/workspace-DBDA3UQl.js.map +1 -0
- package/package.json +4 -4
- package/dist/agents-BVjnYswL.js.map +0 -1
- package/dist/agents-D36tukip.cjs.map +0 -1
- package/dist/dist-_M1jEPcL.js +0 -1
- package/dist/mcp-Bt3h1lO7.cjs.map +0 -1
- package/dist/mcp-D3F3iYew.js.map +0 -1
- package/dist/mcp-D4Cprr8R.js.map +0 -1
- package/dist/mcp-mpYrlkUA.cjs.map +0 -1
- package/dist/observability-new-endpoints-CaTskbSh.cjs.map +0 -1
- package/dist/observability-new-endpoints-CsUP8y2j.js.map +0 -1
- package/dist/routes-By3cLbPV.cjs.map +0 -1
- package/dist/system-BxHpBJiq.cjs.map +0 -1
- package/dist/system-CxwzIMsy.js.map +0 -1
- package/dist/workspace-CyH_iu8w.cjs.map +0 -1
- package/dist/workspace-KeHGZvNV.cjs.map +0 -1
- package/dist/workspace-muaSMxVS.js.map +0 -1
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import { r as __exportAll } from "./rolldown-runtime-CQI-hT2b.js";
|
|
2
2
|
import { t as HTTPException } from "./http-exception-CzaWkxMl.js";
|
|
3
3
|
import { n as createRoute } from "./route-builder-BxPrwNog.js";
|
|
4
|
-
import {
|
|
4
|
+
import { r as getContextResourceId } from "./utils-DHxjw4Tn.js";
|
|
5
|
+
import { A as serverDetailSchema, C as mcpServerTaskPathParams, D as pollMcpServerEventResponseSchema, E as pollMcpServerEventBodySchema, M as streamMcpServerEventBodySchema, O as readResourceBodySchema, S as mcpServerTaskActionResponseSchema, T as mcpToolInfoSchema, _ as mcpServerDetailPathParams, a as executeToolResponseSchema, b as mcpServerIdPathParams, c as getMcpServerDetailQuerySchema, d as listMcpServerTasksQuerySchema, f as listMcpServerTasksResponseSchema, g as listResourcesResponseSchema, h as listMcpServersResponseSchema, i as executeToolBodySchema, k as readResourceResponseSchema, m as listMcpServersQuerySchema, n as emitMcpServerEventBodySchema, o as findMcpServerTaskBodySchema, p as listMcpServerToolsResponseSchema, r as emitMcpServerEventResponseSchema, s as findMcpServerTaskResponseSchema, t as answerMcpServerTaskBodySchema, u as listMcpServerEventsResponseSchema, v as mcpServerEventPathParams, w as mcpServerToolPathParams, x as mcpServerResourcePathParams, y as mcpServerEventStreamFrameSchema } from "./mcp-CQ_pR-JC.js";
|
|
5
6
|
import { MastraError } from "@mastra/core/error";
|
|
6
7
|
// src/server/handlers/mcp.ts
|
|
7
8
|
var mcp_exports = /* @__PURE__ */ __exportAll({
|
|
9
|
+
ANSWER_MCP_SERVER_TASK_ROUTE: () => ANSWER_MCP_SERVER_TASK_ROUTE,
|
|
10
|
+
CANCEL_MCP_SERVER_TASK_ROUTE: () => CANCEL_MCP_SERVER_TASK_ROUTE,
|
|
8
11
|
EMIT_MCP_SERVER_EVENT_ROUTE: () => EMIT_MCP_SERVER_EVENT_ROUTE,
|
|
9
12
|
EXECUTE_MCP_SERVER_TOOL_ROUTE: () => EXECUTE_MCP_SERVER_TOOL_ROUTE,
|
|
13
|
+
FIND_MCP_SERVER_TASK_ROUTE: () => FIND_MCP_SERVER_TASK_ROUTE,
|
|
10
14
|
GET_MCP_SERVER_DETAIL_ROUTE: () => GET_MCP_SERVER_DETAIL_ROUTE,
|
|
11
15
|
GET_MCP_SERVER_TOOL_DETAIL_ROUTE: () => GET_MCP_SERVER_TOOL_DETAIL_ROUTE,
|
|
12
16
|
LIST_MCP_SERVERS_ROUTE: () => LIST_MCP_SERVERS_ROUTE,
|
|
13
17
|
LIST_MCP_SERVER_EVENTS_ROUTE: () => LIST_MCP_SERVER_EVENTS_ROUTE,
|
|
14
18
|
LIST_MCP_SERVER_RESOURCES_ROUTE: () => LIST_MCP_SERVER_RESOURCES_ROUTE,
|
|
19
|
+
LIST_MCP_SERVER_TASKS_ROUTE: () => LIST_MCP_SERVER_TASKS_ROUTE,
|
|
15
20
|
LIST_MCP_SERVER_TOOLS_ROUTE: () => LIST_MCP_SERVER_TOOLS_ROUTE,
|
|
16
21
|
MCP_HTTP_TRANSPORT_ROUTE: () => MCP_HTTP_TRANSPORT_ROUTE,
|
|
17
22
|
MCP_SSE_MESSAGES_ROUTE: () => MCP_SSE_MESSAGES_ROUTE,
|
|
@@ -70,7 +75,8 @@ const LIST_MCP_SERVERS_ROUTE = createRoute({
|
|
|
70
75
|
servers: paginatedServers.map((server) => ({
|
|
71
76
|
...server.getServerInfo(),
|
|
72
77
|
transports: transportsOf(server),
|
|
73
|
-
...eventsCapabilityOf(server)
|
|
78
|
+
...eventsCapabilityOf(server),
|
|
79
|
+
...tasksCapabilityOf(server)
|
|
74
80
|
})),
|
|
75
81
|
total_count: totalCount,
|
|
76
82
|
next: nextUrl
|
|
@@ -95,7 +101,8 @@ const GET_MCP_SERVER_DETAIL_ROUTE = createRoute({
|
|
|
95
101
|
const serverDetail = {
|
|
96
102
|
...server.getServerDetail(),
|
|
97
103
|
transports: transportsOf(server),
|
|
98
|
-
...eventsCapabilityOf(server)
|
|
104
|
+
...eventsCapabilityOf(server),
|
|
105
|
+
...tasksCapabilityOf(server)
|
|
99
106
|
};
|
|
100
107
|
if (version && serverDetail.version_detail.version !== version) throw new HTTPException(404, { message: `MCP server with ID '${id}' found, but not version '${version}'. Available version: ${serverDetail.version_detail.version}` });
|
|
101
108
|
return serverDetail;
|
|
@@ -417,6 +424,148 @@ const EMIT_MCP_SERVER_EVENT_ROUTE = createRoute({
|
|
|
417
424
|
}
|
|
418
425
|
}
|
|
419
426
|
});
|
|
427
|
+
/** Present only for servers that run something as an MCP task, so older responses stay unchanged. */
|
|
428
|
+
function tasksCapabilityOf(server) {
|
|
429
|
+
return (typeof server.getTasksInfo === "function" ? server.getTasksInfo() : void 0)?.enabled ? { tasks_capability: true } : {};
|
|
430
|
+
}
|
|
431
|
+
const TASK_NOT_FOUND = "Task not found";
|
|
432
|
+
/**
|
|
433
|
+
* Tasks belong to MCP principals, which have no mapping to Mastra resources, so a
|
|
434
|
+
* resource-scoped caller can't be shown or act on any of them. Only an unscoped caller
|
|
435
|
+
* (no resource in the request context) gets the inspector.
|
|
436
|
+
*/
|
|
437
|
+
function getTasksInspector(server, requestContext) {
|
|
438
|
+
if (getContextResourceId(requestContext) !== void 0) return void 0;
|
|
439
|
+
return typeof server.getTasksInspector === "function" ? server.getTasksInspector() : void 0;
|
|
440
|
+
}
|
|
441
|
+
function toTasksHttpError(error, mastra, context) {
|
|
442
|
+
if (error instanceof HTTPException) return error;
|
|
443
|
+
mastra?.getLogger()?.error(`MCP task request failed: ${context}`, { error });
|
|
444
|
+
return new HTTPException(500, { message: "Task request failed" });
|
|
445
|
+
}
|
|
446
|
+
const LIST_MCP_SERVER_TASKS_ROUTE = createRoute({
|
|
447
|
+
method: "GET",
|
|
448
|
+
path: "/mcp/:serverId/tasks",
|
|
449
|
+
responseType: "json",
|
|
450
|
+
pathParamSchema: mcpServerIdPathParams,
|
|
451
|
+
queryParamSchema: listMcpServerTasksQuerySchema,
|
|
452
|
+
responseSchema: listMcpServerTasksResponseSchema,
|
|
453
|
+
summary: "List MCP server tasks",
|
|
454
|
+
description: "Returns which tools run as MCP tasks and the server's recent tasks across principals, identified by task key; never task ids or principals (experimental)",
|
|
455
|
+
tags: ["MCP"],
|
|
456
|
+
requiresAuth: true,
|
|
457
|
+
handler: async ({ mastra, serverId, limit, cursor, status, surface, client, key, requestContext }) => {
|
|
458
|
+
const server = getEventsServer(mastra, serverId);
|
|
459
|
+
const info = typeof server.getTasksInfo === "function" ? server.getTasksInfo() : void 0;
|
|
460
|
+
if (!info?.enabled) return {
|
|
461
|
+
surfaces: [],
|
|
462
|
+
tasks: []
|
|
463
|
+
};
|
|
464
|
+
const base = { surfaces: info.surfaces };
|
|
465
|
+
if (getContextResourceId(requestContext) !== void 0) return {
|
|
466
|
+
...base,
|
|
467
|
+
unavailable: "resource_scoped",
|
|
468
|
+
tasks: []
|
|
469
|
+
};
|
|
470
|
+
const inspector = getTasksInspector(server, requestContext);
|
|
471
|
+
if (!inspector) return {
|
|
472
|
+
...base,
|
|
473
|
+
unavailable: "not_listable",
|
|
474
|
+
tasks: []
|
|
475
|
+
};
|
|
476
|
+
try {
|
|
477
|
+
const { tasks, nextCursor } = await inspector.list({
|
|
478
|
+
limit: limit ?? 50,
|
|
479
|
+
cursor,
|
|
480
|
+
status,
|
|
481
|
+
surface,
|
|
482
|
+
principalKey: client,
|
|
483
|
+
taskKey: key
|
|
484
|
+
});
|
|
485
|
+
return {
|
|
486
|
+
...base,
|
|
487
|
+
tasks,
|
|
488
|
+
...nextCursor && { nextCursor }
|
|
489
|
+
};
|
|
490
|
+
} catch (error) {
|
|
491
|
+
throw toTasksHttpError(error, mastra, `list ${serverId}`);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
const FIND_MCP_SERVER_TASK_ROUTE = createRoute({
|
|
496
|
+
method: "POST",
|
|
497
|
+
path: "/mcp/:serverId/tasks/find",
|
|
498
|
+
responseType: "json",
|
|
499
|
+
pathParamSchema: mcpServerIdPathParams,
|
|
500
|
+
bodySchema: findMcpServerTaskBodySchema,
|
|
501
|
+
responseSchema: findMcpServerTaskResponseSchema,
|
|
502
|
+
summary: "Find an MCP server task by task id",
|
|
503
|
+
description: "Finds a task by its MCP task id, as a client sees it. The id is hashed before the lookup and is not kept or returned (experimental)",
|
|
504
|
+
tags: ["MCP"],
|
|
505
|
+
requiresAuth: true,
|
|
506
|
+
requiresPermission: "mcp:read",
|
|
507
|
+
handler: async ({ mastra, serverId, taskId, requestContext }) => {
|
|
508
|
+
const inspector = getTasksInspector(getEventsServer(mastra, serverId), requestContext);
|
|
509
|
+
if (!inspector) throw new HTTPException(404, { message: TASK_NOT_FOUND });
|
|
510
|
+
let task;
|
|
511
|
+
try {
|
|
512
|
+
task = await inspector.find(taskId);
|
|
513
|
+
} catch (error) {
|
|
514
|
+
throw toTasksHttpError(error, mastra, `find ${serverId}`);
|
|
515
|
+
}
|
|
516
|
+
if (!task) throw new HTTPException(404, { message: TASK_NOT_FOUND });
|
|
517
|
+
return { task };
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
const CANCEL_MCP_SERVER_TASK_ROUTE = createRoute({
|
|
521
|
+
method: "POST",
|
|
522
|
+
path: "/mcp/:serverId/tasks/:taskKey/cancel",
|
|
523
|
+
responseType: "json",
|
|
524
|
+
pathParamSchema: mcpServerTaskPathParams,
|
|
525
|
+
responseSchema: mcpServerTaskActionResponseSchema,
|
|
526
|
+
summary: "Cancel an MCP server task",
|
|
527
|
+
description: "Cancels a running task by key, like the tasks/cancel MCP request (experimental)",
|
|
528
|
+
tags: ["MCP"],
|
|
529
|
+
requiresAuth: true,
|
|
530
|
+
requiresPermission: "mcp:write",
|
|
531
|
+
handler: async ({ mastra, serverId, taskKey, requestContext }) => {
|
|
532
|
+
const inspector = getTasksInspector(getEventsServer(mastra, serverId), requestContext);
|
|
533
|
+
if (!inspector) throw new HTTPException(404, { message: TASK_NOT_FOUND });
|
|
534
|
+
let cancelled;
|
|
535
|
+
try {
|
|
536
|
+
cancelled = await inspector.cancel(taskKey);
|
|
537
|
+
} catch (error) {
|
|
538
|
+
throw toTasksHttpError(error, mastra, `cancel ${serverId}`);
|
|
539
|
+
}
|
|
540
|
+
if (!cancelled) throw new HTTPException(404, { message: TASK_NOT_FOUND });
|
|
541
|
+
return { success: true };
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
const ANSWER_MCP_SERVER_TASK_ROUTE = createRoute({
|
|
545
|
+
method: "POST",
|
|
546
|
+
path: "/mcp/:serverId/tasks/:taskKey/input",
|
|
547
|
+
responseType: "json",
|
|
548
|
+
pathParamSchema: mcpServerTaskPathParams,
|
|
549
|
+
bodySchema: answerMcpServerTaskBodySchema,
|
|
550
|
+
responseSchema: mcpServerTaskActionResponseSchema,
|
|
551
|
+
summary: "Answer an MCP server task input request",
|
|
552
|
+
description: "Answers a task's open input requests by key, like the tasks/update MCP request; 404 unless the task is waiting for one of them (experimental)",
|
|
553
|
+
tags: ["MCP"],
|
|
554
|
+
requiresAuth: true,
|
|
555
|
+
requiresPermission: "mcp:write",
|
|
556
|
+
handler: async ({ mastra, serverId, taskKey, inputResponses, requestContext }) => {
|
|
557
|
+
const inspector = getTasksInspector(getEventsServer(mastra, serverId), requestContext);
|
|
558
|
+
if (!inspector) throw new HTTPException(404, { message: TASK_NOT_FOUND });
|
|
559
|
+
let answered;
|
|
560
|
+
try {
|
|
561
|
+
answered = await inspector.answer(taskKey, inputResponses);
|
|
562
|
+
} catch (error) {
|
|
563
|
+
throw toTasksHttpError(error, mastra, `answer ${serverId}`);
|
|
564
|
+
}
|
|
565
|
+
if (!answered) throw new HTTPException(404, { message: TASK_NOT_FOUND });
|
|
566
|
+
return { success: true };
|
|
567
|
+
}
|
|
568
|
+
});
|
|
420
569
|
const MCP_HTTP_TRANSPORT_ROUTE = createRoute({
|
|
421
570
|
method: "ALL",
|
|
422
571
|
path: "/mcp/:serverId/mcp",
|
|
@@ -468,6 +617,6 @@ const MCP_SSE_MESSAGES_ROUTE = createRoute({
|
|
|
468
617
|
requiresAuth: true,
|
|
469
618
|
handler: MCP_SSE_TRANSPORT_ROUTE.handler
|
|
470
619
|
});
|
|
471
|
-
export {
|
|
620
|
+
export { READ_MCP_SERVER_RESOURCE_ROUTE as _, FIND_MCP_SERVER_TASK_ROUTE as a, LIST_MCP_SERVERS_ROUTE as c, LIST_MCP_SERVER_TASKS_ROUTE as d, LIST_MCP_SERVER_TOOLS_ROUTE as f, POLL_MCP_SERVER_EVENT_ROUTE as g, MCP_SSE_TRANSPORT_ROUTE as h, EXECUTE_MCP_SERVER_TOOL_ROUTE as i, LIST_MCP_SERVER_EVENTS_ROUTE as l, MCP_SSE_MESSAGES_ROUTE as m, CANCEL_MCP_SERVER_TASK_ROUTE as n, GET_MCP_SERVER_DETAIL_ROUTE as o, MCP_HTTP_TRANSPORT_ROUTE as p, EMIT_MCP_SERVER_EVENT_ROUTE as r, GET_MCP_SERVER_TOOL_DETAIL_ROUTE as s, ANSWER_MCP_SERVER_TASK_ROUTE as t, LIST_MCP_SERVER_RESOURCES_ROUTE as u, STREAM_MCP_SERVER_EVENT_ROUTE as v, mcp_exports as y };
|
|
472
621
|
|
|
473
|
-
//# sourceMappingURL=mcp-
|
|
622
|
+
//# sourceMappingURL=mcp-DN9mT9q4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-DN9mT9q4.js","names":[],"sources":["../src/server/handlers/mcp.ts"],"sourcesContent":["import { MastraError } from '@mastra/core/error';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type {\n MCP_SERVER_EVENT_ERROR_IDS,\n MCPServerBase as MastraMCPServerImplementation,\n MCPServerEventStreamFrame,\n MCPServerEventsInspector,\n MCPServerTasksInspector,\n MCPToolExecutionResultV2,\n ServerInfo,\n} from '@mastra/core/mcp';\nimport type { z } from 'zod';\nimport { HTTPException } from '../http-exception';\nimport {\n mcpServerDetailPathParams,\n mcpServerToolPathParams,\n executeToolBodySchema,\n listMcpServersQuerySchema,\n getMcpServerDetailQuerySchema,\n listMcpServersResponseSchema,\n serverDetailSchema,\n mcpServerIdPathParams,\n listMcpServerToolsResponseSchema,\n mcpToolInfoSchema,\n executeToolResponseSchema,\n mcpServerResourcePathParams,\n readResourceBodySchema,\n readResourceResponseSchema,\n listResourcesResponseSchema,\n mcpServerEventPathParams,\n listMcpServerEventsResponseSchema,\n pollMcpServerEventBodySchema,\n pollMcpServerEventResponseSchema,\n streamMcpServerEventBodySchema,\n mcpServerEventStreamFrameSchema,\n emitMcpServerEventBodySchema,\n emitMcpServerEventResponseSchema,\n mcpServerTaskPathParams,\n DEFAULT_MCP_SERVER_TASKS_LIMIT,\n listMcpServerTasksQuerySchema,\n listMcpServerTasksResponseSchema,\n findMcpServerTaskBodySchema,\n findMcpServerTaskResponseSchema,\n answerMcpServerTaskBodySchema,\n mcpServerTaskActionResponseSchema,\n} from '../schemas/mcp';\nimport type { MCPServerTransport } from '../schemas/mcp';\nimport type { ServerContext } from '../server-adapter';\nimport type { SetMcpRequestAuth } from '../server-adapter/mcp-auth';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { getContextResourceId } from './utils';\n\n// ============================================================================\n// Route Definitions (createRoute pattern for server adapters)\n// ============================================================================\n\n/**\n * Only `@mastra/mcp` 1.x servers implement the standalone HTTP+SSE transport; on a\n * 2026-07-28 server the inherited `startSSE`/`startHonoSSE` throw.\n */\nfunction hasSSETransport(server: MastraMCPServerImplementation): boolean {\n return server.mcpVersion !== 2;\n}\n\nexport interface MCPServerInfoResponse extends ServerInfo {\n /** Endpoints served under `/mcp/:serverId`; 2026-07-28 servers speak Streamable HTTP only. */\n transports: MCPServerTransport[];\n events_capability?: boolean;\n tasks_capability?: boolean;\n}\n\nfunction transportsOf(server: MastraMCPServerImplementation): MCPServerTransport[] {\n return hasSSETransport(server) ? ['streamable-http', 'sse'] : ['streamable-http'];\n}\n\nexport const LIST_MCP_SERVERS_ROUTE = createRoute({\n method: 'GET',\n path: '/mcp/v0/servers',\n responseType: 'json',\n queryParamSchema: listMcpServersQuerySchema,\n responseSchema: listMcpServersResponseSchema,\n summary: 'List MCP servers',\n description: 'Returns a list of registered MCP servers with pagination support',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({\n mastra,\n routePrefix,\n page,\n perPage,\n limit,\n offset,\n }: ServerContext & { page?: number; perPage?: number; limit?: number; offset?: number }) => {\n if (!mastra || typeof mastra.listMCPServers !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or listMCPServers method not available' });\n }\n\n const servers = mastra.listMCPServers();\n\n if (!servers) {\n return { servers: [], total_count: 0, next: null };\n }\n\n const serverList = Object.values(servers);\n const totalCount = serverList.length;\n\n // Support both page/perPage and limit/offset for backwards compatibility\n // Detect which format user is using - prefer page/perPage if both provided\n const useLegacyFormat =\n (limit !== undefined || offset !== undefined) && page === undefined && perPage === undefined;\n\n // If perPage provided, use it; otherwise fall back to limit\n const finalPerPage = perPage ?? limit;\n // If page provided, use it; otherwise convert from offset\n let finalPage = page;\n if (finalPage === undefined && offset !== undefined && finalPerPage !== undefined && finalPerPage > 0) {\n finalPage = Math.floor(offset / finalPerPage);\n }\n\n // Calculate offset from page/perPage\n const actualOffset = finalPage !== undefined && finalPerPage !== undefined ? finalPage * finalPerPage : 0;\n\n // Apply pagination\n let paginatedServers = serverList;\n let nextUrl: string | null = null;\n\n if (finalPerPage !== undefined) {\n paginatedServers = serverList.slice(actualOffset, actualOffset + finalPerPage);\n\n // Calculate next URL if there are more results\n if (actualOffset + finalPerPage < totalCount) {\n const nextPage = (finalPage ?? 0) + 1;\n // Return next URL in same format as request (legacy limit/offset or page/perPage)\n const prefix = routePrefix ?? '';\n if (useLegacyFormat) {\n const nextOffset = actualOffset + finalPerPage;\n nextUrl = `${prefix}/mcp/v0/servers?limit=${finalPerPage}&offset=${nextOffset}`;\n } else {\n nextUrl = `${prefix}/mcp/v0/servers?perPage=${finalPerPage}&page=${nextPage}`;\n }\n }\n }\n\n // Get server info for each server\n const serverInfoList: MCPServerInfoResponse[] = paginatedServers.map(server => ({\n ...server.getServerInfo(),\n transports: transportsOf(server),\n ...eventsCapabilityOf(server),\n ...tasksCapabilityOf(server),\n }));\n\n return {\n servers: serverInfoList,\n total_count: totalCount,\n next: nextUrl,\n };\n },\n});\n\nexport const GET_MCP_SERVER_DETAIL_ROUTE = createRoute({\n method: 'GET',\n path: '/mcp/v0/servers/:id',\n responseType: 'json',\n pathParamSchema: mcpServerDetailPathParams,\n queryParamSchema: getMcpServerDetailQuerySchema,\n responseSchema: serverDetailSchema,\n summary: 'Get MCP server details',\n description: 'Returns detailed information about a specific MCP server',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({ mastra, id, version }: ServerContext & { id: string; version?: string }) => {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n\n const server = mastra.getMCPServerById(id);\n\n if (!server) {\n throw new HTTPException(404, { message: `MCP server with ID '${id}' not found` });\n }\n\n const serverDetail = {\n ...server.getServerDetail(),\n transports: transportsOf(server),\n ...eventsCapabilityOf(server),\n ...tasksCapabilityOf(server),\n };\n\n // If a specific version was requested, check if it matches\n if (version && serverDetail.version_detail.version !== version) {\n throw new HTTPException(404, {\n message: `MCP server with ID '${id}' found, but not version '${version}'. Available version: ${serverDetail.version_detail.version}`,\n });\n }\n\n return serverDetail;\n },\n});\n\nexport const LIST_MCP_SERVER_TOOLS_ROUTE = createRoute({\n method: 'GET',\n path: '/mcp/:serverId/tools',\n responseType: 'json',\n pathParamSchema: mcpServerIdPathParams,\n responseSchema: listMcpServerToolsResponseSchema,\n summary: 'List MCP server tools',\n description: 'Returns a list of tools available on the specified MCP server',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({ mastra, serverId, requestContext }: ServerContext & { serverId: string }) => {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n\n const server = mastra.getMCPServerById(serverId);\n\n if (!server) {\n throw new HTTPException(404, { message: `MCP server with ID '${serverId}' not found` });\n }\n\n if (typeof server.getToolListInfo !== 'function') {\n throw new HTTPException(501, { message: `Server '${serverId}' cannot list tools in this way.` });\n }\n\n return await server.getToolListInfo(requestContext);\n },\n});\n\nexport const GET_MCP_SERVER_TOOL_DETAIL_ROUTE = createRoute({\n method: 'GET',\n path: '/mcp/:serverId/tools/:toolId',\n responseType: 'json',\n pathParamSchema: mcpServerToolPathParams,\n responseSchema: mcpToolInfoSchema,\n summary: 'Get MCP server tool details',\n description: 'Returns detailed information about a specific tool on the MCP server',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({ mastra, serverId, toolId }: ServerContext & { serverId: string; toolId: string }) => {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n\n const server = mastra.getMCPServerById(serverId);\n\n if (!server) {\n throw new HTTPException(404, { message: `MCP server with ID '${serverId}' not found` });\n }\n\n if (typeof server.getToolInfo !== 'function') {\n throw new HTTPException(501, { message: `Server '${serverId}' cannot provide tool details in this way.` });\n }\n\n const toolInfo = await server.getToolInfo(toolId);\n if (!toolInfo) {\n throw new HTTPException(404, { message: `Tool with ID '${toolId}' not found on MCP server '${serverId}'` });\n }\n\n return toolInfo;\n },\n});\n\nexport const EXECUTE_MCP_SERVER_TOOL_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/tools/:toolId/execute',\n responseType: 'json',\n pathParamSchema: mcpServerToolPathParams,\n bodySchema: executeToolBodySchema,\n responseSchema: executeToolResponseSchema,\n summary: 'Execute MCP server tool',\n description: 'Executes a tool on the specified MCP server with the provided arguments',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({\n mastra,\n serverId,\n toolId,\n data,\n resumeData,\n suspendPayload,\n requestContext,\n }: ServerContext & {\n serverId: string;\n toolId: string;\n data?: unknown;\n resumeData?: unknown;\n suspendPayload?: unknown;\n }) => {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n\n const server = mastra.getMCPServerById(serverId);\n\n if (!server) {\n throw new HTTPException(404, { message: `MCP server with ID '${serverId}' not found` });\n }\n\n if (typeof server.executeTool !== 'function') {\n throw new HTTPException(501, { message: `Server '${serverId}' cannot execute tools in this way.` });\n }\n\n if (server.mcpVersion === 2) {\n // A 2026-07-28 server runs the tool with no protocol client attached: a tool\n // that suspends for input is reported as such instead of pretending it finished, and\n // the caller answers by sending the same args with `resumeData` and `suspendPayload`.\n let execution: MCPToolExecutionResultV2;\n try {\n execution = await server.executeTool(toolId, data, { requestContext, resumeData, suspendPayload });\n } catch (error) {\n if (error instanceof MastraError && error.id === 'MCP_SERVER_TOOL_INVALID_INPUT') {\n throw new HTTPException(400, { message: error.message, cause: error });\n }\n throw error;\n }\n if (execution.status === 'suspended') {\n return {\n status: 'suspended' as const,\n suspendPayload: execution.suspendPayload,\n resumeSchema: execution.resumeSchema,\n };\n }\n return { result: execution.output };\n }\n\n const result = await server.executeTool(toolId, data, { requestContext });\n return { result };\n },\n});\n\n// ============================================================================\n// MCP Resource Routes\n// ============================================================================\n\nexport const LIST_MCP_SERVER_RESOURCES_ROUTE = createRoute({\n method: 'GET',\n path: '/mcp/:serverId/resources',\n responseType: 'json',\n pathParamSchema: mcpServerResourcePathParams,\n responseSchema: listResourcesResponseSchema,\n summary: 'List MCP server resources',\n description: 'Returns a list of resources available on the MCP server, including ui:// app resources',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({ mastra, serverId }: ServerContext & { serverId: string }) => {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n\n const server = mastra.getMCPServerById(serverId);\n\n if (!server) {\n throw new HTTPException(404, { message: `MCP server with ID '${serverId}' not found` });\n }\n\n if (typeof server.listResources !== 'function') {\n return { resources: [] };\n }\n\n return server.listResources();\n },\n});\n\nexport const READ_MCP_SERVER_RESOURCE_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/resources/read',\n responseType: 'json',\n pathParamSchema: mcpServerResourcePathParams,\n bodySchema: readResourceBodySchema,\n responseSchema: readResourceResponseSchema,\n summary: 'Read MCP server resource content',\n description: 'Reads the content of a resource by URI, used for rendering MCP App ui:// resources',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({ mastra, serverId, uri }: ServerContext & { serverId: string; uri: string }) => {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n\n const server = mastra.getMCPServerById(serverId);\n\n if (!server) {\n throw new HTTPException(404, { message: `MCP server with ID '${serverId}' not found` });\n }\n\n if (typeof server.readResource !== 'function') {\n throw new HTTPException(501, { message: `Server '${serverId}' does not support reading resources` });\n }\n\n try {\n return await server.readResource(uri);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('not found') || message.includes('not configured')) {\n throw new HTTPException(404, { message: `Resource '${uri}' not found on server '${serverId}'` });\n }\n throw error;\n }\n },\n});\n\n// ============================================================================\n// MCP Event Routes (experimental; used by Studio)\n// ============================================================================\n\n/** Present only for servers that declare event types, so older responses stay unchanged. */\nfunction eventsCapabilityOf(server: MastraMCPServerImplementation): { events_capability?: true } {\n const events = typeof server.getEventsInfo === 'function' ? server.getEventsInfo()?.events : undefined;\n return events && events.length > 0 ? { events_capability: true } : {};\n}\n\nfunction isTestEmitEnabled(): boolean {\n return process.env.MASTRA_DEV === 'true';\n}\n\nfunction getEventsServer(mastra: Mastra | undefined, serverId: string): MastraMCPServerImplementation {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n const server = mastra.getMCPServerById(serverId);\n if (!server) {\n throw new HTTPException(404, { message: `MCP server with ID '${serverId}' not found` });\n }\n return server;\n}\n\nfunction getEventsInspector(server: MastraMCPServerImplementation): MCPServerEventsInspector {\n const inspector = typeof server.getEventsInspector === 'function' ? server.getEventsInspector() : undefined;\n if (!inspector) throw new HTTPException(404, { message: 'Event not found' });\n return inspector;\n}\n\ntype EventErrorId = (typeof MCP_SERVER_EVENT_ERROR_IDS)[keyof typeof MCP_SERVER_EVENT_ERROR_IDS];\n\n// Keyed by the literal ids rather than the core constant, so @mastra/server still\n// runs against a @mastra/core release that doesn't export MCP_SERVER_EVENT_ERROR_IDS.\n// The record type keeps the ids in sync with core at compile time.\nconst EVENT_ERROR_RESPONSES: Record<EventErrorId, { status: 400 | 403 | 404 | 429; message: string }> = {\n MCP_SERVER_UNKNOWN_EVENT: { status: 404, message: 'Event not found' },\n MCP_SERVER_EVENT_UNSUPPORTED_DELIVERY: {\n status: 400,\n message: 'This event does not support streaming; poll it instead',\n },\n MCP_SERVER_EVENT_INVALID_ARGUMENTS: { status: 400, message: 'Invalid event arguments' },\n MCP_SERVER_EVENT_NOT_EMITTABLE: {\n status: 400,\n message: 'This event is fed by a poll source and cannot be emitted',\n },\n MCP_SERVER_EVENT_INVALID_PAYLOAD: { status: 400, message: 'Invalid event data' },\n MCP_SERVER_EVENT_FORBIDDEN: { status: 403, message: 'Not allowed to use this event' },\n MCP_SERVER_EVENT_TOO_MANY_STREAMS: { status: 429, message: 'Too many open event streams' },\n};\n\n/**\n * Maps event errors to generic HTTP errors. The details (which can come from a poll\n * source or an upstream API) are only logged, never returned.\n */\nfunction toEventsHttpError(error: unknown, mastra: Mastra | undefined, context: string): HTTPException {\n if (error instanceof HTTPException) return error;\n const known = error instanceof MastraError ? EVENT_ERROR_RESPONSES[error.id as EventErrorId] : undefined;\n if (known) return new HTTPException(known.status, { message: known.message });\n mastra?.getLogger()?.error(`MCP event request failed: ${context}`, { error });\n return new HTTPException(500, { message: 'Event request failed' });\n}\n\nexport const LIST_MCP_SERVER_EVENTS_ROUTE = createRoute({\n method: 'GET',\n path: '/mcp/:serverId/events',\n responseType: 'json',\n pathParamSchema: mcpServerIdPathParams,\n responseSchema: listMcpServerEventsResponseSchema,\n summary: 'List MCP server events',\n description: 'Returns the event types the MCP server declares (experimental)',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({ mastra, serverId }: ServerContext & { serverId: string }) => {\n const server = getEventsServer(mastra, serverId);\n const events = typeof server.getEventsInfo === 'function' ? (server.getEventsInfo()?.events ?? []) : [];\n return { events, testEmit: isTestEmitEnabled() };\n },\n});\n\nexport const POLL_MCP_SERVER_EVENT_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/events/:eventName/poll',\n responseType: 'json',\n pathParamSchema: mcpServerEventPathParams,\n bodySchema: pollMcpServerEventBodySchema,\n responseSchema: pollMcpServerEventResponseSchema,\n summary: 'Poll an MCP server event',\n description: 'Reads occurrences of an event type, like the events/poll MCP request (experimental)',\n tags: ['MCP'],\n requiresAuth: true,\n // Same permission as streaming: both read occurrences through the event's source.\n requiresPermission: 'mcp:execute',\n handler: async ({\n mastra,\n serverId,\n eventName,\n arguments: args,\n cursor,\n maxEvents,\n requestContext,\n abortSignal,\n }: ServerContext & {\n serverId: string;\n eventName: string;\n arguments?: Record<string, unknown>;\n cursor?: string | null;\n maxEvents?: number;\n }) => {\n const inspector = getEventsInspector(getEventsServer(mastra, serverId));\n try {\n return await inspector.poll(\n eventName,\n { arguments: args, cursor, maxEvents },\n { requestContext, signal: abortSignal },\n );\n } catch (error) {\n throw toEventsHttpError(error, mastra, `poll ${serverId}/${eventName}`);\n }\n },\n});\n\nexport const STREAM_MCP_SERVER_EVENT_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/events/:eventName/stream',\n responseType: 'stream' as const,\n streamFormat: 'sse' as const,\n sseFlushOnConnect: true,\n pathParamSchema: mcpServerEventPathParams,\n bodySchema: streamMcpServerEventBodySchema,\n responseSchema: mcpServerEventStreamFrameSchema,\n summary: 'Stream an MCP server event',\n description:\n 'Streams occurrences of an event type as server-sent events, like the events/stream MCP request (experimental)',\n tags: ['MCP', 'Streaming'],\n requiresAuth: true,\n handler: async ({\n mastra,\n serverId,\n eventName,\n arguments: args,\n cursor,\n requestContext,\n abortSignal,\n }: ServerContext & {\n serverId: string;\n eventName: string;\n arguments?: Record<string, unknown>;\n cursor?: string | null;\n }) => {\n const inspector = getEventsInspector(getEventsServer(mastra, serverId));\n const controller = new AbortController();\n const abort = () => controller.abort();\n if (abortSignal?.aborted) abort();\n else abortSignal?.addEventListener('abort', abort, { once: true });\n\n // Frames sent before the stream's `start` runs are buffered here.\n const buffered: MCPServerEventStreamFrame[] = [];\n let sink: ReadableStreamDefaultController<MCPServerEventStreamFrame> | undefined;\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n abortSignal?.removeEventListener('abort', abort);\n abort();\n try {\n sink?.close();\n } catch {\n // Already closed or cancelled by the client.\n }\n };\n\n let closed: Promise<void>;\n try {\n ({ closed } = await inspector.stream(\n eventName,\n { arguments: args, cursor },\n {\n signal: controller.signal,\n requestContext,\n onFrame: frame => {\n if (done) return;\n if (sink) sink.enqueue(frame);\n else buffered.push(frame);\n if (frame.type === 'terminated') finish();\n },\n },\n ));\n } catch (error) {\n finish();\n throw toEventsHttpError(error, mastra, `stream ${serverId}/${eventName}`);\n }\n void closed.then(finish);\n\n return new ReadableStream<MCPServerEventStreamFrame>({\n start(streamController) {\n if (done) {\n for (const frame of buffered.splice(0)) streamController.enqueue(frame);\n streamController.close();\n return;\n }\n sink = streamController;\n for (const frame of buffered.splice(0)) streamController.enqueue(frame);\n },\n cancel() {\n finish();\n },\n });\n },\n});\n\nexport const EMIT_MCP_SERVER_EVENT_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/events/:eventName/emit',\n responseType: 'json',\n pathParamSchema: mcpServerEventPathParams,\n bodySchema: emitMcpServerEventBodySchema,\n responseSchema: emitMcpServerEventResponseSchema,\n summary: 'Send a test MCP server event',\n description:\n 'Emits a test occurrence of an emit-fed event type. Only served under `mastra dev`; otherwise 404 (experimental)',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({\n mastra,\n serverId,\n eventName,\n data,\n }: ServerContext & { serverId: string; eventName: string; data: Record<string, unknown> }) => {\n if (!isTestEmitEnabled()) throw new HTTPException(404, { message: 'Not Found' });\n const inspector = getEventsInspector(getEventsServer(mastra, serverId));\n try {\n return { occurrence: await inspector.emit(eventName, data) };\n } catch (error) {\n throw toEventsHttpError(error, mastra, `emit ${serverId}/${eventName}`);\n }\n },\n});\n\n// ============================================================================\n// MCP Task Routes (experimental; Studio admin view)\n// ============================================================================\n\n/** Present only for servers that run something as an MCP task, so older responses stay unchanged. */\nfunction tasksCapabilityOf(server: MastraMCPServerImplementation): { tasks_capability?: true } {\n const info = typeof server.getTasksInfo === 'function' ? server.getTasksInfo() : undefined;\n return info?.enabled ? { tasks_capability: true } : {};\n}\n\nconst TASK_NOT_FOUND = 'Task not found';\n\n/**\n * Tasks belong to MCP principals, which have no mapping to Mastra resources, so a\n * resource-scoped caller can't be shown or act on any of them. Only an unscoped caller\n * (no resource in the request context) gets the inspector.\n */\nfunction getTasksInspector(\n server: MastraMCPServerImplementation,\n requestContext: ServerContext['requestContext'],\n): MCPServerTasksInspector | undefined {\n if (getContextResourceId(requestContext) !== undefined) return undefined;\n return typeof server.getTasksInspector === 'function' ? server.getTasksInspector() : undefined;\n}\n\nfunction toTasksHttpError(error: unknown, mastra: Mastra | undefined, context: string): HTTPException {\n if (error instanceof HTTPException) return error;\n mastra?.getLogger()?.error(`MCP task request failed: ${context}`, { error });\n return new HTTPException(500, { message: 'Task request failed' });\n}\n\nexport const LIST_MCP_SERVER_TASKS_ROUTE = createRoute({\n method: 'GET',\n path: '/mcp/:serverId/tasks',\n responseType: 'json',\n pathParamSchema: mcpServerIdPathParams,\n queryParamSchema: listMcpServerTasksQuerySchema,\n responseSchema: listMcpServerTasksResponseSchema,\n summary: 'List MCP server tasks',\n description:\n \"Returns which tools run as MCP tasks and the server's recent tasks across principals, identified by task key; never task ids or principals (experimental)\",\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({\n mastra,\n serverId,\n limit,\n cursor,\n status,\n surface,\n client,\n key,\n requestContext,\n }: ServerContext & { serverId: string } & z.infer<typeof listMcpServerTasksQuerySchema>) => {\n const server = getEventsServer(mastra, serverId);\n const info = typeof server.getTasksInfo === 'function' ? server.getTasksInfo() : undefined;\n if (!info?.enabled) return { surfaces: [], tasks: [] };\n const base = { surfaces: info.surfaces };\n if (getContextResourceId(requestContext) !== undefined) {\n return { ...base, unavailable: 'resource_scoped' as const, tasks: [] };\n }\n const inspector = getTasksInspector(server, requestContext);\n if (!inspector) return { ...base, unavailable: 'not_listable' as const, tasks: [] };\n try {\n const { tasks, nextCursor } = await inspector.list({\n limit: limit ?? DEFAULT_MCP_SERVER_TASKS_LIMIT,\n cursor,\n status,\n surface,\n principalKey: client,\n taskKey: key,\n });\n return { ...base, tasks, ...(nextCursor && { nextCursor }) };\n } catch (error) {\n throw toTasksHttpError(error, mastra, `list ${serverId}`);\n }\n },\n});\n\nexport const FIND_MCP_SERVER_TASK_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/tasks/find',\n responseType: 'json',\n pathParamSchema: mcpServerIdPathParams,\n bodySchema: findMcpServerTaskBodySchema,\n responseSchema: findMcpServerTaskResponseSchema,\n summary: 'Find an MCP server task by task id',\n description:\n 'Finds a task by its MCP task id, as a client sees it. The id is hashed before the lookup and is not kept or returned (experimental)',\n tags: ['MCP'],\n requiresAuth: true,\n // A lookup, not a change: POST only keeps the raw id out of URLs, so it needs read like the list.\n requiresPermission: 'mcp:read',\n handler: async ({\n mastra,\n serverId,\n taskId,\n requestContext,\n }: ServerContext & { serverId: string; taskId: string }) => {\n const inspector = getTasksInspector(getEventsServer(mastra, serverId), requestContext);\n if (!inspector) throw new HTTPException(404, { message: TASK_NOT_FOUND });\n let task: Awaited<ReturnType<MCPServerTasksInspector['find']>>;\n try {\n task = await inspector.find(taskId);\n } catch (error) {\n throw toTasksHttpError(error, mastra, `find ${serverId}`);\n }\n if (!task) throw new HTTPException(404, { message: TASK_NOT_FOUND });\n return { task };\n },\n});\n\nexport const CANCEL_MCP_SERVER_TASK_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/tasks/:taskKey/cancel',\n responseType: 'json',\n pathParamSchema: mcpServerTaskPathParams,\n responseSchema: mcpServerTaskActionResponseSchema,\n summary: 'Cancel an MCP server task',\n description: 'Cancels a running task by key, like the tasks/cancel MCP request (experimental)',\n tags: ['MCP'],\n requiresAuth: true,\n requiresPermission: 'mcp:write',\n handler: async ({\n mastra,\n serverId,\n taskKey,\n requestContext,\n }: ServerContext & { serverId: string; taskKey: string }) => {\n const inspector = getTasksInspector(getEventsServer(mastra, serverId), requestContext);\n if (!inspector) throw new HTTPException(404, { message: TASK_NOT_FOUND });\n let cancelled: boolean;\n try {\n cancelled = await inspector.cancel(taskKey);\n } catch (error) {\n throw toTasksHttpError(error, mastra, `cancel ${serverId}`);\n }\n if (!cancelled) throw new HTTPException(404, { message: TASK_NOT_FOUND });\n return { success: true as const };\n },\n});\n\nexport const ANSWER_MCP_SERVER_TASK_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/tasks/:taskKey/input',\n responseType: 'json',\n pathParamSchema: mcpServerTaskPathParams,\n bodySchema: answerMcpServerTaskBodySchema,\n responseSchema: mcpServerTaskActionResponseSchema,\n summary: 'Answer an MCP server task input request',\n description:\n \"Answers a task's open input requests by key, like the tasks/update MCP request; 404 unless the task is waiting for one of them (experimental)\",\n tags: ['MCP'],\n requiresAuth: true,\n requiresPermission: 'mcp:write',\n handler: async ({\n mastra,\n serverId,\n taskKey,\n inputResponses,\n requestContext,\n }: ServerContext & {\n serverId: string;\n taskKey: string;\n inputResponses: Record<string, Record<string, unknown>>;\n }) => {\n const inspector = getTasksInspector(getEventsServer(mastra, serverId), requestContext);\n if (!inspector) throw new HTTPException(404, { message: TASK_NOT_FOUND });\n let answered: boolean;\n try {\n answered = await inspector.answer(taskKey, inputResponses);\n } catch (error) {\n throw toTasksHttpError(error, mastra, `answer ${serverId}`);\n }\n if (!answered) throw new HTTPException(404, { message: TASK_NOT_FOUND });\n return { success: true as const };\n },\n});\n\n// ============================================================================\n// MCP Transport Routes (Streamable HTTP and SSE)\n// ============================================================================\n\n/**\n * MCP transport options that can be passed to startHTTP() or startSSE().\n * Includes serverless mode for running in stateless environments like Cloudflare Workers or Vercel Edge.\n */\nexport interface MCPTransportOptions {\n /**\n * When true, runs in stateless mode without session management.\n * Ideal for serverless environments where you can't maintain persistent connections.\n */\n serverless?: boolean;\n /**\n * Custom session ID generator function.\n */\n sessionIdGenerator?: () => string;\n /**\n * Sets `req.auth` before the MCP transport reads it. Overrides the default\n * bridge that forwards the principal resolved by `server.auth`.\n */\n setRequestAuth?: SetMcpRequestAuth;\n}\n\n/**\n * MCP HTTP Transport response type.\n * Adapters use this to set up the HTTP transport via MCPServer.startHTTP()\n */\nexport interface MCPHttpTransportResult {\n server: MastraMCPServerImplementation;\n httpPath: string;\n /**\n * Optional MCP transport options for this specific route.\n * These override any class-level mcpOptions configured on the adapter.\n */\n mcpOptions?: MCPTransportOptions;\n}\n\n/**\n * MCP SSE Transport response type.\n * Adapters use this to set up the SSE transport via MCPServer.startSSE() or startHonoSSE()\n *\n * Note: SSE transport is inherently stateful and doesn't support serverless mode.\n */\nexport interface MCPSseTransportResult {\n /** A 1.x server: the SSE route only resolves servers that still implement the transport. */\n server: MastraMCPServerImplementation;\n ssePath: string;\n messagePath: string;\n}\n\nexport const MCP_HTTP_TRANSPORT_ROUTE = createRoute({\n method: 'ALL',\n path: '/mcp/:serverId/mcp',\n responseType: 'mcp-http',\n pathParamSchema: mcpServerIdPathParams,\n summary: 'MCP HTTP Transport',\n description: 'Streamable HTTP transport endpoint for MCP protocol communication',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({ mastra, serverId }: ServerContext & { serverId: string }): Promise<MCPHttpTransportResult> => {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n\n const server = mastra.getMCPServerById(serverId);\n\n if (!server) {\n throw new HTTPException(404, { message: `MCP server '${serverId}' not found` });\n }\n\n return {\n server,\n httpPath: `/mcp/${serverId}/mcp`,\n };\n },\n});\n\nexport const MCP_SSE_TRANSPORT_ROUTE = createRoute({\n method: 'ALL',\n path: '/mcp/:serverId/sse',\n responseType: 'mcp-sse',\n pathParamSchema: mcpServerIdPathParams,\n summary: 'MCP SSE Transport',\n description: 'SSE transport endpoint for MCP protocol communication',\n tags: ['MCP'],\n requiresAuth: true,\n handler: async ({ mastra, serverId }: ServerContext & { serverId: string }): Promise<MCPSseTransportResult> => {\n if (!mastra || typeof mastra.getMCPServerById !== 'function') {\n throw new HTTPException(500, { message: 'Mastra instance or getMCPServerById method not available' });\n }\n\n const server = mastra.getMCPServerById(serverId);\n\n if (!server) {\n throw new HTTPException(404, { message: `MCP server '${serverId}' not found` });\n }\n\n if (!hasSSETransport(server)) {\n throw new HTTPException(404, { message: 'Legacy SSE transport is unavailable for MCP v2 servers' });\n }\n\n return {\n server,\n ssePath: `/mcp/${serverId}/sse`,\n messagePath: `/mcp/${serverId}/messages`,\n };\n },\n});\n\nexport const MCP_SSE_MESSAGES_ROUTE = createRoute({\n method: 'POST',\n path: '/mcp/:serverId/messages',\n responseType: 'mcp-sse',\n pathParamSchema: mcpServerIdPathParams,\n summary: 'MCP SSE Messages',\n description: 'Message endpoint for SSE transport (posts messages to active SSE streams)',\n tags: ['MCP'],\n requiresAuth: true,\n handler: MCP_SSE_TRANSPORT_ROUTE.handler,\n});\n"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ const require_server_handlers_error = require("./server/handlers/error.cjs");
|
|
|
5
5
|
const require_server_handlers_observability_list_query_schemas = require("./server/handlers/observability-list-query-schemas.cjs");
|
|
6
6
|
const require_server_handlers_observability_shared = require("./server/handlers/observability-shared.cjs");
|
|
7
7
|
const require_server_handlers_observability_storage_schemas = require("./server/handlers/observability-storage-schemas.cjs");
|
|
8
|
-
const require_observability_new_endpoints = require("./observability-new-endpoints-
|
|
8
|
+
const require_observability_new_endpoints = require("./observability-new-endpoints-BrB2CKix.cjs");
|
|
9
9
|
let zod_v4 = require("zod/v4");
|
|
10
10
|
let _mastra_core_evals = require("@mastra/core/evals");
|
|
11
11
|
let _mastra_core_evals_scoreTraces = require("@mastra/core/evals/scoreTraces");
|
|
@@ -499,4 +499,4 @@ Object.defineProperty(exports, "observability_exports", {
|
|
|
499
499
|
}
|
|
500
500
|
});
|
|
501
501
|
|
|
502
|
-
//# sourceMappingURL=observability-
|
|
502
|
+
//# sourceMappingURL=observability-DRbDeN1X.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observability-DHuljMXO.cjs","names":["z","dateRangeSchema","tracesFilterSchema","createObservabilityListQuerySchema","tracesOrderBySchema","createRoute","listTracesResponseSchema","pickParams","getObservabilityStore","OBSERVABILITY_LIST_ENDPOINTS","paginationArgsSchema","handleError","listTracesLightResponseSchema","store","branchesFilterSchema","branchesOrderBySchema","listBranchesResponseSchema","getBranchArgsSchema","wrapSchemaForQueryParams","getBranchResponseSchema","HTTPException","getTraceArgsSchema","getTraceResponseSchema","traceSpanSchema","toTraceSpans","getTraceLightResponseSchema","getSpanArgsSchema","getSpanResponseSchema","extractTrajectoryFromTrace","batchDeleteTracesArgsSchema","batchDeleteTracesResponseSchema","scoreTracesRequestSchema","scoreTracesResponseSchema","spanIdsSchema","listScoresResponseSchema","getScoresStore"],"sources":["../src/server/handlers/observability.ts"],"sourcesContent":["import { extractTrajectoryFromTrace, listScoresResponseSchema } from '@mastra/core/evals';\nimport { scoreTraces } from '@mastra/core/evals/scoreTraces';\nimport {\n tracesFilterSchema,\n tracesOrderBySchema,\n spanIdsSchema,\n listTracesResponseSchema,\n scoreTracesRequestSchema,\n scoreTracesResponseSchema,\n getTraceArgsSchema,\n getTraceResponseSchema,\n getTraceLightResponseSchema,\n getSpanArgsSchema,\n getSpanResponseSchema,\n dateRangeSchema,\n toTraceSpans,\n traceSpanSchema,\n} from '@mastra/core/storage';\n// `branches*`, `listBranches*`, and `getBranch*` schemas are new in\n// @mastra/core@1.32.0; route them through a shim that tolerates older cores\n// (see ./observability-storage-schemas.ts for full rationale).\nimport { z } from 'zod/v4';\nimport { HTTPException } from '../http-exception';\nimport type { ServerRoute } from '../server-adapter/routes';\nimport { createRoute, pickParams, wrapSchemaForQueryParams } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\nimport { paginationArgsSchema } from './observability-list-query-schemas';\nimport {\n assertObservabilityDeltaSupported,\n createObservabilityListQuerySchema,\n getObservabilityStore,\n getScoresStore,\n getStorage,\n OBSERVABILITY_LIST_ENDPOINTS,\n} from './observability-shared';\nimport {\n branchesFilterSchema,\n branchesOrderBySchema,\n listBranchesResponseSchema,\n getBranchArgsSchema,\n getBranchResponseSchema,\n listTracesLightResponseSchema,\n batchDeleteTracesArgsSchema,\n batchDeleteTracesResponseSchema,\n} from './observability-storage-schemas';\n\nexport * from './observability-new-endpoints';\n\n// ============================================================================\n// Legacy Parameter Support (backward compatibility with main branch API)\n// ============================================================================\n\n/**\n * Legacy query parameters from the old API (main branch).\n * These are accepted for backward compatibility and transformed to new format.\n */\nconst legacyQueryParamsSchema = z.object({\n // Old: dateRange was in pagination, now it's startedAt in filters\n dateRange: dateRangeSchema.optional(),\n // Old: name matched span names like \"agent run: 'myAgent'\"\n name: z.string().optional(),\n // entityType needs preprocessing to handle legacy 'workflow' value\n entityType: z.preprocess(val => (val === 'workflow' ? 'workflow_run' : val), z.string().optional()),\n});\n\n/**\n * Transforms legacy query parameters to the new format.\n * - dateRange -> startedAt (if startedAt not already set)\n * - name=\"agent run: 'x'\" -> entityId='x', entityType='agent'\n * - name=\"workflow run: 'x'\" -> entityId='x', entityType='workflow_run'\n * - entityType='workflow' -> entityType='workflow_run' (enum value fix)\n */\nfunction transformLegacyParams(params: Record<string, unknown>): Record<string, unknown> {\n const result = { ...params };\n\n // Transform old entityType='workflow' -> 'workflow_run' to support direct handler usage in tests\n if (result.entityType === 'workflow') {\n result.entityType = 'workflow_run';\n }\n\n // Transform old dateRange -> new startedAt\n if (params.dateRange && !params.startedAt) {\n result.startedAt = params.dateRange;\n delete result.dateRange;\n }\n\n // Transform old name -> entityId + entityType\n // Old format: name matched span names like \"agent run: 'myAgent'\" or \"workflow run: 'myWorkflow'\"\n if (typeof params.name === 'string' && !params.entityId) {\n const agentMatch = params.name.match(/^agent run: '([^']+)'$/);\n const workflowMatch = params.name.match(/^workflow run: '([^']+)'$/);\n\n if (agentMatch) {\n result.entityId = agentMatch[1];\n result.entityType = 'agent';\n } else if (workflowMatch) {\n result.entityId = workflowMatch[1];\n result.entityType = 'workflow_run';\n }\n delete result.name;\n }\n\n return result;\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\n/** Filter shape shared by the full and lightweight trace list routes. */\nconst tracesListFilterSchema = tracesFilterSchema.extend({\n ...legacyQueryParamsSchema.shape, // Accept legacy params for backward compatibility\n entityType: z.preprocess(\n value => (value === 'workflow' ? 'workflow_run' : value),\n tracesFilterSchema.shape.entityType,\n ),\n});\n\nconst listTracesQueryParamSchema = createObservabilityListQuerySchema(tracesListFilterSchema, tracesOrderBySchema);\n\n/** Route: GET /observability/traces - paginated trace listing with filtering and sorting. */\nexport const LIST_TRACES_ROUTE: ServerRoute = createRoute({\n method: 'GET',\n path: '/observability/traces',\n responseType: 'json',\n queryParamSchema: listTracesQueryParamSchema,\n responseSchema: listTracesResponseSchema,\n summary: 'List traces',\n description:\n 'Returns a paginated list of traces with optional filtering and sorting. In delta mode, returns only newly listed traces matching the filters.',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, mode, after, limit, ...params }) => {\n try {\n // Transform legacy params to new format before processing\n const transformedParams = transformLegacyParams(params);\n\n const filters = pickParams(tracesFilterSchema, transformedParams);\n const observabilityStore = await getObservabilityStore(mastra);\n if (mode === 'delta') {\n assertObservabilityDeltaSupported(observabilityStore, OBSERVABILITY_LIST_ENDPOINTS.traces);\n return await observabilityStore.listTraces({\n mode,\n filters,\n after: typeof after === 'string' ? after : undefined,\n limit,\n });\n }\n\n const pagination = pickParams(paginationArgsSchema, transformedParams);\n const orderBy = pickParams(tracesOrderBySchema, transformedParams);\n return await observabilityStore.listTraces({ filters, pagination, orderBy });\n } catch (error) {\n return handleError(error, 'Error listing traces');\n }\n },\n});\n\n/** Route: GET /observability/traces/light - paginated lightweight trace listing with filtering and sorting. */\nexport const LIST_TRACES_LIGHT_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/traces/light',\n responseType: 'json',\n queryParamSchema: listTracesQueryParamSchema,\n responseSchema: listTracesLightResponseSchema,\n summary: 'List lightweight traces',\n description:\n 'Returns a paginated list of lightweight traces with optional filtering and sorting. In delta mode, returns only newly listed traces matching the filters.',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, mode, after, limit, ...params }) => {\n try {\n const transformedParams = transformLegacyParams(params);\n\n const filters = pickParams(tracesFilterSchema, transformedParams);\n const observabilityStore = await getObservabilityStore(mastra);\n\n // Every current store answers `listTracesLight` — stores without a dedicated\n // implementation inherit the base class's projection fallback. This guard is\n // only for an older `@mastra/core` whose base class predates the method, where\n // calling it would throw `TypeError: ... is not a function`; there we fall back\n // to `listTraces` so consumers still get a response.\n const store = observabilityStore as { listTracesLight?: unknown };\n const supportsLight = typeof store.listTracesLight === 'function';\n\n if (mode === 'delta') {\n assertObservabilityDeltaSupported(observabilityStore, OBSERVABILITY_LIST_ENDPOINTS.traces);\n const deltaArgs = {\n mode,\n filters,\n after: typeof after === 'string' ? after : undefined,\n limit,\n } as const;\n return supportsLight\n ? await observabilityStore.listTracesLight(deltaArgs)\n : await observabilityStore.listTraces(deltaArgs);\n }\n\n const pagination = pickParams(paginationArgsSchema, transformedParams);\n const orderBy = pickParams(tracesOrderBySchema, transformedParams);\n\n if (!supportsLight) {\n return await observabilityStore.listTraces({ filters, pagination, orderBy });\n }\n return await observabilityStore.listTracesLight({ filters, pagination, orderBy });\n } catch (error) {\n return handleError(error, 'Error listing lightweight traces');\n }\n },\n});\n\n/** Route: GET /observability/branches - paginated branch-anchor span listing across all traces. */\nexport const LIST_BRANCHES_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/branches',\n responseType: 'json',\n queryParamSchema: createObservabilityListQuerySchema(branchesFilterSchema, branchesOrderBySchema),\n responseSchema: listBranchesResponseSchema,\n summary: 'List trace branches',\n description:\n 'Returns a paginated list of branch-anchor spans (e.g., AGENT_RUN, WORKFLOW_RUN, TOOL_CALL) across all traces. Unlike listTraces (one row per root-rooted trace), each row here is a single anchor span -- including ones nested under a different root entity. In delta mode, returns only newly listed branch rows matching the filters.',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, mode, after, limit, ...params }) => {\n try {\n const filters = pickParams(branchesFilterSchema, params);\n const observabilityStore = await getObservabilityStore(mastra);\n if (mode === 'delta') {\n assertObservabilityDeltaSupported(observabilityStore, OBSERVABILITY_LIST_ENDPOINTS.branches);\n return await observabilityStore.listBranches({\n mode,\n filters,\n after: typeof after === 'string' ? after : undefined,\n limit,\n });\n }\n\n const pagination = pickParams(paginationArgsSchema, params);\n const orderBy = pickParams(branchesOrderBySchema, params);\n return await observabilityStore.listBranches({ filters, pagination, orderBy });\n } catch (error) {\n return handleError(error, 'Error listing branches');\n }\n },\n});\n\n/** Route: GET /observability/traces/:traceId/branches/:spanId - retrieve the subtree rooted at a span. */\nexport const GET_BRANCH_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/branches/:spanId',\n responseType: 'json',\n pathParamSchema: getBranchArgsSchema.pick({ traceId: true, spanId: true }),\n queryParamSchema: wrapSchemaForQueryParams(getBranchArgsSchema.pick({ depth: true })),\n responseSchema: getBranchResponseSchema,\n summary: 'Get trace branch by span ID',\n description:\n 'Returns the subtree of spans rooted at the given span. The optional `depth` query param bounds descendant levels below the anchor (0 = anchor only; omitted = full subtree).',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId, spanId, depth }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const branch = await observabilityStore.getBranch({ traceId, spanId, depth });\n\n if (!branch) {\n throw new HTTPException(404, { message: `Branch not found for span '${spanId}' in trace '${traceId}'` });\n }\n\n return branch;\n } catch (error) {\n return handleError(error, 'Error getting branch');\n }\n },\n});\n/** Route: GET /observability/traces/:traceId - retrieve a single trace with all spans. */\nexport const GET_TRACE_ROUTE: ServerRoute = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId',\n responseType: 'json',\n pathParamSchema: getTraceArgsSchema,\n responseSchema: getTraceResponseSchema.extend({ spans: z.array(traceSpanSchema) }),\n summary: 'Get AI trace by ID',\n description: 'Returns a complete AI trace with all spans by trace ID',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const trace = await observabilityStore.getTrace({ traceId });\n\n if (!trace) {\n throw new HTTPException(404, { message: `Trace with ID '${traceId}' not found` });\n }\n\n // Stored SpanRecords carry no status field; derive it from error/endedAt so\n // trace-detail spans match the status shown in trace list rows.\n return { ...trace, spans: toTraceSpans(trace.spans) };\n } catch (error) {\n return handleError(error, 'Error getting trace');\n }\n },\n});\n\n/** Route: GET /observability/traces/:traceId/light - lightweight trace for timeline rendering. */\nexport const GET_TRACE_LIGHT_ROUTE: ServerRoute = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/light',\n responseType: 'json',\n pathParamSchema: getTraceArgsSchema,\n responseSchema: getTraceLightResponseSchema,\n summary: 'Get lightweight AI trace by ID',\n description:\n 'Returns a trace with lightweight span data (timeline fields only, excludes input/output/attributes/metadata/tags/links)',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const trace = await observabilityStore.getTraceLight({ traceId });\n\n if (!trace) {\n throw new HTTPException(404, { message: `Trace with ID '${traceId}' not found` });\n }\n\n return trace;\n } catch (error) {\n return handleError(error, 'Error getting lightweight trace');\n }\n },\n});\n\n/** Route: GET /observability/traces/:traceId/spans/:spanId - get a single span with full details. */\nexport const GET_SPAN_ROUTE: ServerRoute = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/spans/:spanId',\n responseType: 'json',\n pathParamSchema: getSpanArgsSchema,\n responseSchema: getSpanResponseSchema,\n summary: 'Get a single span by ID',\n description: 'Returns a complete span record with all details by trace ID and span ID',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId, spanId }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const span = await observabilityStore.getSpan({ traceId, spanId });\n\n if (!span) {\n throw new HTTPException(404, { message: `Span not found` });\n }\n\n return span;\n } catch (error) {\n return handleError(error, 'Error getting span');\n }\n },\n});\n\n/** Route: GET /observability/traces/:traceId/trajectory - extract trajectory from a trace. */\nexport const GET_TRACE_TRAJECTORY_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/trajectory',\n responseType: 'json',\n pathParamSchema: getTraceArgsSchema,\n responseSchema: z.object({\n steps: z.array(z.unknown()),\n totalDurationMs: z.number().optional(),\n rawOutput: z.unknown().optional(),\n rawWorkflowResult: z.unknown().optional(),\n }),\n summary: 'Extract trajectory from trace',\n description: 'Extracts a structured trajectory (ordered steps) from a trace by analyzing its spans',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const trace = await observabilityStore.getTrace({ traceId });\n\n if (!trace) {\n throw new HTTPException(404, { message: `Trace with ID '${traceId}' not found` });\n }\n\n const trajectory = extractTrajectoryFromTrace(trace.spans);\n return trajectory;\n } catch (error) {\n return handleError(error, 'Error extracting trajectory from trace');\n }\n },\n});\n\n/** Route: POST /observability/traces/delete - batch delete traces with cross-signal cascade. */\nexport const DELETE_TRACES_ROUTE: ServerRoute = createRoute({\n method: 'POST',\n path: '/observability/traces/delete',\n responseType: 'json',\n bodySchema: batchDeleteTracesArgsSchema.pick({ traceIds: true }),\n responseSchema: batchDeleteTracesResponseSchema,\n maxBodySize: 256 * 1024,\n summary: 'Delete traces',\n description:\n 'Deletes traces by ID, cascading to all associated data: spans, trace roots/branches, and signal events (scores, feedback, metrics, logs) that reference the deleted traces. Signals without a trace ID are untouched. Experiment traces are deleted like any other trace. On ClickHouse-backed stores, deletes are lightweight and reads may briefly return deleted rows until the delete is fully applied.',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceIds }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n await observabilityStore.batchDeleteTraces({ traceIds });\n return { success: true as const };\n } catch (error) {\n return handleError(error, 'Error deleting traces');\n }\n },\n});\n\n/** Route: POST /observability/traces/score - score traces using a specified scorer (fire-and-forget). */\nexport const SCORE_TRACES_ROUTE = createRoute({\n method: 'POST',\n path: '/observability/traces/score',\n responseType: 'json',\n bodySchema: scoreTracesRequestSchema,\n responseSchema: scoreTracesResponseSchema,\n summary: 'Score traces',\n description: 'Scores one or more traces using a specified scorer (fire-and-forget)',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n try {\n // Validate storage exists before starting background task\n getStorage(mastra);\n\n const { scorerName, targets } = params;\n\n const scorer = mastra.getScorerById(scorerName);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer '${scorerName}' not found` });\n }\n\n scoreTraces({\n scorerId: scorer.config.id || scorer.config.name,\n targets,\n mastra,\n }).catch(error => {\n const logger = mastra.getLogger();\n logger?.error(`Background trace scoring failed: ${error.message}`, error);\n });\n\n return {\n status: 'success',\n message: `Scoring started for ${targets.length} ${targets.length === 1 ? 'trace' : 'traces'}`,\n traceCount: targets.length,\n };\n } catch (error) {\n return handleError(error, 'Error processing trace scoring');\n }\n },\n});\n\nexport const LIST_SCORES_BY_SPAN_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/:spanId/scores',\n responseType: 'json',\n pathParamSchema: spanIdsSchema,\n // List endpoints accept optional query params; use partial() to allow empty queries.\n queryParamSchema: wrapSchemaForQueryParams(paginationArgsSchema.partial()),\n responseSchema: listScoresResponseSchema,\n summary: 'List scores by span',\n description: 'Returns all scores for a specific span within a trace',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n try {\n const pagination = pickParams(paginationArgsSchema, params);\n const spanIds = pickParams(spanIdsSchema, params);\n\n const scoresStore = await getScoresStore(mastra);\n\n return await scoresStore.listScoresBySpan({\n ...spanIds,\n pagination,\n });\n } catch (error) {\n return handleError(error, 'Error getting scores by span');\n }\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"observability-DRbDeN1X.cjs","names":["z","dateRangeSchema","tracesFilterSchema","createObservabilityListQuerySchema","tracesOrderBySchema","createRoute","listTracesResponseSchema","pickParams","getObservabilityStore","OBSERVABILITY_LIST_ENDPOINTS","paginationArgsSchema","handleError","listTracesLightResponseSchema","store","branchesFilterSchema","branchesOrderBySchema","listBranchesResponseSchema","getBranchArgsSchema","wrapSchemaForQueryParams","getBranchResponseSchema","HTTPException","getTraceArgsSchema","getTraceResponseSchema","traceSpanSchema","toTraceSpans","getTraceLightResponseSchema","getSpanArgsSchema","getSpanResponseSchema","extractTrajectoryFromTrace","batchDeleteTracesArgsSchema","batchDeleteTracesResponseSchema","scoreTracesRequestSchema","scoreTracesResponseSchema","spanIdsSchema","listScoresResponseSchema","getScoresStore"],"sources":["../src/server/handlers/observability.ts"],"sourcesContent":["import { extractTrajectoryFromTrace, listScoresResponseSchema } from '@mastra/core/evals';\nimport { scoreTraces } from '@mastra/core/evals/scoreTraces';\nimport {\n tracesFilterSchema,\n tracesOrderBySchema,\n spanIdsSchema,\n listTracesResponseSchema,\n scoreTracesRequestSchema,\n scoreTracesResponseSchema,\n getTraceArgsSchema,\n getTraceResponseSchema,\n getTraceLightResponseSchema,\n getSpanArgsSchema,\n getSpanResponseSchema,\n dateRangeSchema,\n toTraceSpans,\n traceSpanSchema,\n} from '@mastra/core/storage';\n// `branches*`, `listBranches*`, and `getBranch*` schemas are new in\n// @mastra/core@1.32.0; route them through a shim that tolerates older cores\n// (see ./observability-storage-schemas.ts for full rationale).\nimport { z } from 'zod/v4';\nimport { HTTPException } from '../http-exception';\nimport type { ServerRoute } from '../server-adapter/routes';\nimport { createRoute, pickParams, wrapSchemaForQueryParams } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\nimport { paginationArgsSchema } from './observability-list-query-schemas';\nimport {\n assertObservabilityDeltaSupported,\n createObservabilityListQuerySchema,\n getObservabilityStore,\n getScoresStore,\n getStorage,\n OBSERVABILITY_LIST_ENDPOINTS,\n} from './observability-shared';\nimport {\n branchesFilterSchema,\n branchesOrderBySchema,\n listBranchesResponseSchema,\n getBranchArgsSchema,\n getBranchResponseSchema,\n listTracesLightResponseSchema,\n batchDeleteTracesArgsSchema,\n batchDeleteTracesResponseSchema,\n} from './observability-storage-schemas';\n\nexport * from './observability-new-endpoints';\n\n// ============================================================================\n// Legacy Parameter Support (backward compatibility with main branch API)\n// ============================================================================\n\n/**\n * Legacy query parameters from the old API (main branch).\n * These are accepted for backward compatibility and transformed to new format.\n */\nconst legacyQueryParamsSchema = z.object({\n // Old: dateRange was in pagination, now it's startedAt in filters\n dateRange: dateRangeSchema.optional(),\n // Old: name matched span names like \"agent run: 'myAgent'\"\n name: z.string().optional(),\n // entityType needs preprocessing to handle legacy 'workflow' value\n entityType: z.preprocess(val => (val === 'workflow' ? 'workflow_run' : val), z.string().optional()),\n});\n\n/**\n * Transforms legacy query parameters to the new format.\n * - dateRange -> startedAt (if startedAt not already set)\n * - name=\"agent run: 'x'\" -> entityId='x', entityType='agent'\n * - name=\"workflow run: 'x'\" -> entityId='x', entityType='workflow_run'\n * - entityType='workflow' -> entityType='workflow_run' (enum value fix)\n */\nfunction transformLegacyParams(params: Record<string, unknown>): Record<string, unknown> {\n const result = { ...params };\n\n // Transform old entityType='workflow' -> 'workflow_run' to support direct handler usage in tests\n if (result.entityType === 'workflow') {\n result.entityType = 'workflow_run';\n }\n\n // Transform old dateRange -> new startedAt\n if (params.dateRange && !params.startedAt) {\n result.startedAt = params.dateRange;\n delete result.dateRange;\n }\n\n // Transform old name -> entityId + entityType\n // Old format: name matched span names like \"agent run: 'myAgent'\" or \"workflow run: 'myWorkflow'\"\n if (typeof params.name === 'string' && !params.entityId) {\n const agentMatch = params.name.match(/^agent run: '([^']+)'$/);\n const workflowMatch = params.name.match(/^workflow run: '([^']+)'$/);\n\n if (agentMatch) {\n result.entityId = agentMatch[1];\n result.entityType = 'agent';\n } else if (workflowMatch) {\n result.entityId = workflowMatch[1];\n result.entityType = 'workflow_run';\n }\n delete result.name;\n }\n\n return result;\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\n/** Filter shape shared by the full and lightweight trace list routes. */\nconst tracesListFilterSchema = tracesFilterSchema.extend({\n ...legacyQueryParamsSchema.shape, // Accept legacy params for backward compatibility\n entityType: z.preprocess(\n value => (value === 'workflow' ? 'workflow_run' : value),\n tracesFilterSchema.shape.entityType,\n ),\n});\n\nconst listTracesQueryParamSchema = createObservabilityListQuerySchema(tracesListFilterSchema, tracesOrderBySchema);\n\n/** Route: GET /observability/traces - paginated trace listing with filtering and sorting. */\nexport const LIST_TRACES_ROUTE: ServerRoute = createRoute({\n method: 'GET',\n path: '/observability/traces',\n responseType: 'json',\n queryParamSchema: listTracesQueryParamSchema,\n responseSchema: listTracesResponseSchema,\n summary: 'List traces',\n description:\n 'Returns a paginated list of traces with optional filtering and sorting. In delta mode, returns only newly listed traces matching the filters.',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, mode, after, limit, ...params }) => {\n try {\n // Transform legacy params to new format before processing\n const transformedParams = transformLegacyParams(params);\n\n const filters = pickParams(tracesFilterSchema, transformedParams);\n const observabilityStore = await getObservabilityStore(mastra);\n if (mode === 'delta') {\n assertObservabilityDeltaSupported(observabilityStore, OBSERVABILITY_LIST_ENDPOINTS.traces);\n return await observabilityStore.listTraces({\n mode,\n filters,\n after: typeof after === 'string' ? after : undefined,\n limit,\n });\n }\n\n const pagination = pickParams(paginationArgsSchema, transformedParams);\n const orderBy = pickParams(tracesOrderBySchema, transformedParams);\n return await observabilityStore.listTraces({ filters, pagination, orderBy });\n } catch (error) {\n return handleError(error, 'Error listing traces');\n }\n },\n});\n\n/** Route: GET /observability/traces/light - paginated lightweight trace listing with filtering and sorting. */\nexport const LIST_TRACES_LIGHT_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/traces/light',\n responseType: 'json',\n queryParamSchema: listTracesQueryParamSchema,\n responseSchema: listTracesLightResponseSchema,\n summary: 'List lightweight traces',\n description:\n 'Returns a paginated list of lightweight traces with optional filtering and sorting. In delta mode, returns only newly listed traces matching the filters.',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, mode, after, limit, ...params }) => {\n try {\n const transformedParams = transformLegacyParams(params);\n\n const filters = pickParams(tracesFilterSchema, transformedParams);\n const observabilityStore = await getObservabilityStore(mastra);\n\n // Every current store answers `listTracesLight` — stores without a dedicated\n // implementation inherit the base class's projection fallback. This guard is\n // only for an older `@mastra/core` whose base class predates the method, where\n // calling it would throw `TypeError: ... is not a function`; there we fall back\n // to `listTraces` so consumers still get a response.\n const store = observabilityStore as { listTracesLight?: unknown };\n const supportsLight = typeof store.listTracesLight === 'function';\n\n if (mode === 'delta') {\n assertObservabilityDeltaSupported(observabilityStore, OBSERVABILITY_LIST_ENDPOINTS.traces);\n const deltaArgs = {\n mode,\n filters,\n after: typeof after === 'string' ? after : undefined,\n limit,\n } as const;\n return supportsLight\n ? await observabilityStore.listTracesLight(deltaArgs)\n : await observabilityStore.listTraces(deltaArgs);\n }\n\n const pagination = pickParams(paginationArgsSchema, transformedParams);\n const orderBy = pickParams(tracesOrderBySchema, transformedParams);\n\n if (!supportsLight) {\n return await observabilityStore.listTraces({ filters, pagination, orderBy });\n }\n return await observabilityStore.listTracesLight({ filters, pagination, orderBy });\n } catch (error) {\n return handleError(error, 'Error listing lightweight traces');\n }\n },\n});\n\n/** Route: GET /observability/branches - paginated branch-anchor span listing across all traces. */\nexport const LIST_BRANCHES_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/branches',\n responseType: 'json',\n queryParamSchema: createObservabilityListQuerySchema(branchesFilterSchema, branchesOrderBySchema),\n responseSchema: listBranchesResponseSchema,\n summary: 'List trace branches',\n description:\n 'Returns a paginated list of branch-anchor spans (e.g., AGENT_RUN, WORKFLOW_RUN, TOOL_CALL) across all traces. Unlike listTraces (one row per root-rooted trace), each row here is a single anchor span -- including ones nested under a different root entity. In delta mode, returns only newly listed branch rows matching the filters.',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, mode, after, limit, ...params }) => {\n try {\n const filters = pickParams(branchesFilterSchema, params);\n const observabilityStore = await getObservabilityStore(mastra);\n if (mode === 'delta') {\n assertObservabilityDeltaSupported(observabilityStore, OBSERVABILITY_LIST_ENDPOINTS.branches);\n return await observabilityStore.listBranches({\n mode,\n filters,\n after: typeof after === 'string' ? after : undefined,\n limit,\n });\n }\n\n const pagination = pickParams(paginationArgsSchema, params);\n const orderBy = pickParams(branchesOrderBySchema, params);\n return await observabilityStore.listBranches({ filters, pagination, orderBy });\n } catch (error) {\n return handleError(error, 'Error listing branches');\n }\n },\n});\n\n/** Route: GET /observability/traces/:traceId/branches/:spanId - retrieve the subtree rooted at a span. */\nexport const GET_BRANCH_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/branches/:spanId',\n responseType: 'json',\n pathParamSchema: getBranchArgsSchema.pick({ traceId: true, spanId: true }),\n queryParamSchema: wrapSchemaForQueryParams(getBranchArgsSchema.pick({ depth: true })),\n responseSchema: getBranchResponseSchema,\n summary: 'Get trace branch by span ID',\n description:\n 'Returns the subtree of spans rooted at the given span. The optional `depth` query param bounds descendant levels below the anchor (0 = anchor only; omitted = full subtree).',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId, spanId, depth }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const branch = await observabilityStore.getBranch({ traceId, spanId, depth });\n\n if (!branch) {\n throw new HTTPException(404, { message: `Branch not found for span '${spanId}' in trace '${traceId}'` });\n }\n\n return branch;\n } catch (error) {\n return handleError(error, 'Error getting branch');\n }\n },\n});\n/** Route: GET /observability/traces/:traceId - retrieve a single trace with all spans. */\nexport const GET_TRACE_ROUTE: ServerRoute = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId',\n responseType: 'json',\n pathParamSchema: getTraceArgsSchema,\n responseSchema: getTraceResponseSchema.extend({ spans: z.array(traceSpanSchema) }),\n summary: 'Get AI trace by ID',\n description: 'Returns a complete AI trace with all spans by trace ID',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const trace = await observabilityStore.getTrace({ traceId });\n\n if (!trace) {\n throw new HTTPException(404, { message: `Trace with ID '${traceId}' not found` });\n }\n\n // Stored SpanRecords carry no status field; derive it from error/endedAt so\n // trace-detail spans match the status shown in trace list rows.\n return { ...trace, spans: toTraceSpans(trace.spans) };\n } catch (error) {\n return handleError(error, 'Error getting trace');\n }\n },\n});\n\n/** Route: GET /observability/traces/:traceId/light - lightweight trace for timeline rendering. */\nexport const GET_TRACE_LIGHT_ROUTE: ServerRoute = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/light',\n responseType: 'json',\n pathParamSchema: getTraceArgsSchema,\n responseSchema: getTraceLightResponseSchema,\n summary: 'Get lightweight AI trace by ID',\n description:\n 'Returns a trace with lightweight span data (timeline fields only, excludes input/output/attributes/metadata/tags/links)',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const trace = await observabilityStore.getTraceLight({ traceId });\n\n if (!trace) {\n throw new HTTPException(404, { message: `Trace with ID '${traceId}' not found` });\n }\n\n return trace;\n } catch (error) {\n return handleError(error, 'Error getting lightweight trace');\n }\n },\n});\n\n/** Route: GET /observability/traces/:traceId/spans/:spanId - get a single span with full details. */\nexport const GET_SPAN_ROUTE: ServerRoute = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/spans/:spanId',\n responseType: 'json',\n pathParamSchema: getSpanArgsSchema,\n responseSchema: getSpanResponseSchema,\n summary: 'Get a single span by ID',\n description: 'Returns a complete span record with all details by trace ID and span ID',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId, spanId }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const span = await observabilityStore.getSpan({ traceId, spanId });\n\n if (!span) {\n throw new HTTPException(404, { message: `Span not found` });\n }\n\n return span;\n } catch (error) {\n return handleError(error, 'Error getting span');\n }\n },\n});\n\n/** Route: GET /observability/traces/:traceId/trajectory - extract trajectory from a trace. */\nexport const GET_TRACE_TRAJECTORY_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/trajectory',\n responseType: 'json',\n pathParamSchema: getTraceArgsSchema,\n responseSchema: z.object({\n steps: z.array(z.unknown()),\n totalDurationMs: z.number().optional(),\n rawOutput: z.unknown().optional(),\n rawWorkflowResult: z.unknown().optional(),\n }),\n summary: 'Extract trajectory from trace',\n description: 'Extracts a structured trajectory (ordered steps) from a trace by analyzing its spans',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceId }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n const trace = await observabilityStore.getTrace({ traceId });\n\n if (!trace) {\n throw new HTTPException(404, { message: `Trace with ID '${traceId}' not found` });\n }\n\n const trajectory = extractTrajectoryFromTrace(trace.spans);\n return trajectory;\n } catch (error) {\n return handleError(error, 'Error extracting trajectory from trace');\n }\n },\n});\n\n/** Route: POST /observability/traces/delete - batch delete traces with cross-signal cascade. */\nexport const DELETE_TRACES_ROUTE: ServerRoute = createRoute({\n method: 'POST',\n path: '/observability/traces/delete',\n responseType: 'json',\n bodySchema: batchDeleteTracesArgsSchema.pick({ traceIds: true }),\n responseSchema: batchDeleteTracesResponseSchema,\n maxBodySize: 256 * 1024,\n summary: 'Delete traces',\n description:\n 'Deletes traces by ID, cascading to all associated data: spans, trace roots/branches, and signal events (scores, feedback, metrics, logs) that reference the deleted traces. Signals without a trace ID are untouched. Experiment traces are deleted like any other trace. On ClickHouse-backed stores, deletes are lightweight and reads may briefly return deleted rows until the delete is fully applied.',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, traceIds }) => {\n try {\n const observabilityStore = await getObservabilityStore(mastra);\n await observabilityStore.batchDeleteTraces({ traceIds });\n return { success: true as const };\n } catch (error) {\n return handleError(error, 'Error deleting traces');\n }\n },\n});\n\n/** Route: POST /observability/traces/score - score traces using a specified scorer (fire-and-forget). */\nexport const SCORE_TRACES_ROUTE = createRoute({\n method: 'POST',\n path: '/observability/traces/score',\n responseType: 'json',\n bodySchema: scoreTracesRequestSchema,\n responseSchema: scoreTracesResponseSchema,\n summary: 'Score traces',\n description: 'Scores one or more traces using a specified scorer (fire-and-forget)',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n try {\n // Validate storage exists before starting background task\n getStorage(mastra);\n\n const { scorerName, targets } = params;\n\n const scorer = mastra.getScorerById(scorerName);\n if (!scorer) {\n throw new HTTPException(404, { message: `Scorer '${scorerName}' not found` });\n }\n\n scoreTraces({\n scorerId: scorer.config.id || scorer.config.name,\n targets,\n mastra,\n }).catch(error => {\n const logger = mastra.getLogger();\n logger?.error(`Background trace scoring failed: ${error.message}`, error);\n });\n\n return {\n status: 'success',\n message: `Scoring started for ${targets.length} ${targets.length === 1 ? 'trace' : 'traces'}`,\n traceCount: targets.length,\n };\n } catch (error) {\n return handleError(error, 'Error processing trace scoring');\n }\n },\n});\n\nexport const LIST_SCORES_BY_SPAN_ROUTE = createRoute({\n method: 'GET',\n path: '/observability/traces/:traceId/:spanId/scores',\n responseType: 'json',\n pathParamSchema: spanIdsSchema,\n // List endpoints accept optional query params; use partial() to allow empty queries.\n queryParamSchema: wrapSchemaForQueryParams(paginationArgsSchema.partial()),\n responseSchema: listScoresResponseSchema,\n summary: 'List scores by span',\n description: 'Returns all scores for a specific span within a trace',\n tags: ['Observability'],\n requiresAuth: true,\n handler: async ({ mastra, ...params }) => {\n try {\n const pagination = pickParams(paginationArgsSchema, params);\n const spanIds = pickParams(spanIdsSchema, params);\n\n const scoresStore = await getScoresStore(mastra);\n\n return await scoresStore.listScoresBySpan({\n ...spanIds,\n pagination,\n });\n } catch (error) {\n return handleError(error, 'Error getting scores by span');\n }\n },\n});\n"],"mappings":"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"}
|
package/dist/{observability-new-endpoints-CaTskbSh.cjs → observability-new-endpoints-BrB2CKix.cjs}
RENAMED
|
@@ -5,7 +5,7 @@ const require_constants = require("./constants-Co1XjPjd.cjs");
|
|
|
5
5
|
const require_server_handlers_error = require("./server/handlers/error.cjs");
|
|
6
6
|
const require_server_handlers_observability_list_query_schemas = require("./server/handlers/observability-list-query-schemas.cjs");
|
|
7
7
|
const require_server_handlers_observability_shared = require("./server/handlers/observability-shared.cjs");
|
|
8
|
-
const require_system = require("./system-
|
|
8
|
+
const require_system = require("./system-CHCn8IQ3.cjs");
|
|
9
9
|
const require_server_handlers_author_enrichment = require("./server/handlers/author-enrichment.cjs");
|
|
10
10
|
const require_server_handlers_authorship = require("./server/handlers/authorship.cjs");
|
|
11
11
|
let zod_v4 = require("zod/v4");
|
|
@@ -777,6 +777,7 @@ const distinctColumnSchema = zod_v4.z.enum([
|
|
|
777
777
|
"threadId",
|
|
778
778
|
"resourceId"
|
|
779
779
|
]).optional().describe("Column to apply count_distinct over (required when aggregation is 'count_distinct'). Restricted to allowlisted metric dimensions.");
|
|
780
|
+
/** Shared by the metric args schemas and dashboard metric queries, which rebuild those objects. */
|
|
780
781
|
const requireDistinctColumnRefinement = {
|
|
781
782
|
check: (data) => data.aggregation !== "count_distinct" || data.distinctColumn !== void 0,
|
|
782
783
|
options: {
|
|
@@ -1034,6 +1035,7 @@ const QUERY_TRACES = createNewRoute(require_server_handlers_observability_shared
|
|
|
1034
1035
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstChunkSupported(observabilityStore, plan.where);
|
|
1035
1036
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstTokenSupported(observabilityStore, plan.where);
|
|
1036
1037
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryRootSpanFieldsSupported(observabilityStore, plan);
|
|
1038
|
+
require_server_handlers_observability_shared.assertObservabilityTraceQueryOutcomeFieldsSupported(observabilityStore, plan);
|
|
1037
1039
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstChunkSortSupported(observabilityStore, plan.orderBy);
|
|
1038
1040
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstTokenSortSupported(observabilityStore, plan.orderBy);
|
|
1039
1041
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTenantScopeSupported(observabilityStore, plan.scope);
|
|
@@ -1152,6 +1154,7 @@ const AGGREGATE_TRACES = createNewRoute(require_server_handlers_observability_sh
|
|
|
1152
1154
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstChunkSupported(observabilityStore, plan.where);
|
|
1153
1155
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstTokenSupported(observabilityStore, plan.where);
|
|
1154
1156
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryRootSpanFieldsSupported(observabilityStore, plan);
|
|
1157
|
+
require_server_handlers_observability_shared.assertObservabilityTraceQueryOutcomeFieldsSupported(observabilityStore, plan);
|
|
1155
1158
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTenantScopeSupported(observabilityStore, plan.scope);
|
|
1156
1159
|
} catch (error) {
|
|
1157
1160
|
if (error instanceof _mastra_core_storage.TraceQueryValidationError) throwTraceQueryError(422, {
|
|
@@ -1263,6 +1266,9 @@ const AGGREGATE_SPANS = createNewRoute(require_server_handlers_observability_sha
|
|
|
1263
1266
|
observabilityStore = await require_server_handlers_observability_shared.getObservabilityStore(mastra);
|
|
1264
1267
|
require_server_handlers_observability_shared.assertObservabilitySpanAggregateSupported(observabilityStore);
|
|
1265
1268
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstTokenSupported(observabilityStore, plan.where);
|
|
1269
|
+
require_server_handlers_observability_shared.assertObservabilitySpanQueryModelFieldsSupported(observabilityStore, plan.where);
|
|
1270
|
+
require_server_handlers_observability_shared.assertObservabilitySpanAggregateModelDimensionsSupported(observabilityStore, plan);
|
|
1271
|
+
require_server_handlers_observability_shared.assertObservabilitySpanQueryOutcomeFieldsSupported(observabilityStore, plan);
|
|
1266
1272
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTenantScopeSupported(observabilityStore, plan.scope);
|
|
1267
1273
|
} catch (error) {
|
|
1268
1274
|
if (error instanceof require_http_exception.HTTPException && error.status === 501) throwTraceQueryError(501, {
|
|
@@ -1365,6 +1371,8 @@ const QUERY_SPANS = createNewRoute(require_server_handlers_observability_shared.
|
|
|
1365
1371
|
observabilityStore = await require_server_handlers_observability_shared.getObservabilityStore(mastra);
|
|
1366
1372
|
require_server_handlers_observability_shared.assertObservabilitySpanQuerySupported(observabilityStore);
|
|
1367
1373
|
require_server_handlers_observability_shared.assertObservabilitySpanQueryFieldsSupported(observabilityStore, plan.where);
|
|
1374
|
+
require_server_handlers_observability_shared.assertObservabilitySpanQueryModelFieldsSupported(observabilityStore, plan.where);
|
|
1375
|
+
require_server_handlers_observability_shared.assertObservabilitySpanQueryOutcomeFieldsSupported(observabilityStore, plan);
|
|
1368
1376
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstChunkSupported(observabilityStore, plan.where);
|
|
1369
1377
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstTokenSupported(observabilityStore, plan.where);
|
|
1370
1378
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstChunkSortSupported(observabilityStore, plan.orderBy);
|
|
@@ -1461,13 +1469,13 @@ const GET_TRACE_QUERY_FIELDS = createNewRoute(require_server_handlers_observabil
|
|
|
1461
1469
|
}
|
|
1462
1470
|
try {
|
|
1463
1471
|
const observed = await observabilityStore.getTraceQueryObservedFields(plan);
|
|
1464
|
-
const canonicalFields = _mastra_core_storage.getTraceQueryCanonicalFieldDescriptors(predicateScope, search).filter((field) => predicateScope !== "trace" || field.path !== "durationMs" || require_server_handlers_observability_shared.supportsObservabilityTraceQueryRootDuration(observabilityStore)).filter((field) => !require_server_handlers_observability_shared.isTraceQueryContextIdField(field.path) || require_server_handlers_observability_shared.supportsObservabilityTraceQueryContextIds(observabilityStore)).filter((field) => field.path !== "timeToFirstChunkMs" || require_server_handlers_observability_shared.supportsObservabilityTraceQueryTimeToFirstChunk(observabilityStore)).filter((field) => field.path !== "timeToFirstTokenMs" || require_server_handlers_observability_shared.supportsObservabilityTraceQueryTimeToFirstToken(observabilityStore)).filter((field) => predicateScope !== "trace" || require_server_handlers_observability_shared.supportsObservabilityTraceQueryRootSpanField(observabilityStore, field.path));
|
|
1472
|
+
const canonicalFields = _mastra_core_storage.getTraceQueryCanonicalFieldDescriptors(predicateScope, search).filter((field) => predicateScope !== "trace" || field.path !== "durationMs" || require_server_handlers_observability_shared.supportsObservabilityTraceQueryRootDuration(observabilityStore)).filter((field) => !require_server_handlers_observability_shared.isTraceQueryContextIdField(field.path) || require_server_handlers_observability_shared.supportsObservabilityTraceQueryContextIds(observabilityStore)).filter((field) => field.path !== "timeToFirstChunkMs" || require_server_handlers_observability_shared.supportsObservabilityTraceQueryTimeToFirstChunk(observabilityStore)).filter((field) => field.path !== "timeToFirstTokenMs" || require_server_handlers_observability_shared.supportsObservabilityTraceQueryTimeToFirstToken(observabilityStore)).filter((field) => predicateScope !== "trace" || require_server_handlers_observability_shared.supportsObservabilityTraceQueryRootSpanField(observabilityStore, field.path)).filter((field) => !require_server_handlers_observability_shared.isObservabilityOutcomeField(field.path) || require_server_handlers_observability_shared.supportsObservabilityTraceQueryOutcomeFields(observabilityStore));
|
|
1465
1473
|
const describesAggregate = predicateScope === "trace" && require_server_handlers_observability_shared.supportsTraceAggregateCore() && _mastra_core_storage.traceAggregateDiscoverySchema !== void 0 && require_server_handlers_observability_shared.supportsObservabilityTraceAggregate(observabilityStore);
|
|
1466
1474
|
return {
|
|
1467
1475
|
canonicalFields,
|
|
1468
1476
|
...observed,
|
|
1469
1477
|
...describesAggregate && { aggregate: {
|
|
1470
|
-
dimensions: _mastra_core_storage.getTraceAggregateDimensionDescriptors().filter((dimension) => require_server_handlers_observability_shared.supportsObservabilityTraceQueryRootSpanField(observabilityStore, dimension.path)),
|
|
1478
|
+
dimensions: _mastra_core_storage.getTraceAggregateDimensionDescriptors().filter((dimension) => require_server_handlers_observability_shared.supportsObservabilityTraceQueryRootSpanField(observabilityStore, dimension.path)).filter((dimension) => !require_server_handlers_observability_shared.isObservabilityOutcomeField(dimension.path) || require_server_handlers_observability_shared.supportsObservabilityTraceQueryOutcomeFields(observabilityStore)),
|
|
1471
1479
|
measures: _mastra_core_storage.getTraceAggregateMeasureDescriptors()
|
|
1472
1480
|
} }
|
|
1473
1481
|
};
|
|
@@ -1506,6 +1514,7 @@ const GET_TRACE_QUERY_VALUES = createNewRoute(require_server_handlers_observabil
|
|
|
1506
1514
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryDiscoverySupported(observabilityStore);
|
|
1507
1515
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTenantScopeSupported(observabilityStore, plan.scope);
|
|
1508
1516
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryRootSpanValuesSupported(observabilityStore, plan);
|
|
1517
|
+
require_server_handlers_observability_shared.assertObservabilityTraceQueryOutcomeFieldsSupported(observabilityStore, plan);
|
|
1509
1518
|
} catch (error) {
|
|
1510
1519
|
if (error instanceof _mastra_core_storage.TraceQueryValidationError) throwTraceQueryError(422, {
|
|
1511
1520
|
code: error.code,
|
|
@@ -1619,6 +1628,8 @@ const QUERY_THREADS = createNewRoute(require_server_handlers_observability_share
|
|
|
1619
1628
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTimeToFirstTokenSupported(observabilityStore, plan.where);
|
|
1620
1629
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryRootSpanFieldsSupported(observabilityStore, plan.traces);
|
|
1621
1630
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryRootSpanFieldsSupported(observabilityStore, plan);
|
|
1631
|
+
require_server_handlers_observability_shared.assertObservabilityTraceQueryOutcomeFieldsSupported(observabilityStore, plan.traces);
|
|
1632
|
+
require_server_handlers_observability_shared.assertObservabilityTraceQueryOutcomeFieldsSupported(observabilityStore, plan);
|
|
1622
1633
|
}
|
|
1623
1634
|
require_server_handlers_observability_shared.assertObservabilityTraceQueryTenantScopeSupported(observabilityStore, plan.scope);
|
|
1624
1635
|
} catch (error) {
|
|
@@ -2327,4 +2338,4 @@ Object.defineProperty(exports, "UPDATE_FEEDBACK_REVIEW_STATUS", {
|
|
|
2327
2338
|
}
|
|
2328
2339
|
});
|
|
2329
2340
|
|
|
2330
|
-
//# sourceMappingURL=observability-new-endpoints-
|
|
2341
|
+
//# sourceMappingURL=observability-new-endpoints-BrB2CKix.cjs.map
|