@mastra/server 1.50.0-alpha.2 → 1.50.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/{api-schema-manifest-EW55OSKH.js → api-schema-manifest-DOPBJPOJ.js} +3 -3
  3. package/dist/{api-schema-manifest-EW55OSKH.js.map → api-schema-manifest-DOPBJPOJ.js.map} +1 -1
  4. package/dist/{api-schema-manifest-YT3AMGZD.cjs → api-schema-manifest-QEW2UYFB.cjs} +4 -4
  5. package/dist/{api-schema-manifest-YT3AMGZD.cjs.map → api-schema-manifest-QEW2UYFB.cjs.map} +1 -1
  6. package/dist/{chunk-ZAK4IF2O.js → chunk-5HOECS3M.js} +15 -25
  7. package/dist/chunk-5HOECS3M.js.map +1 -0
  8. package/dist/{chunk-6QZTZ5F3.cjs → chunk-5RAMEYIX.cjs} +3 -3
  9. package/dist/{chunk-6QZTZ5F3.cjs.map → chunk-5RAMEYIX.cjs.map} +1 -1
  10. package/dist/{chunk-57BKC4ZW.cjs → chunk-F32IDQGW.cjs} +12 -12
  11. package/dist/chunk-F32IDQGW.cjs.map +1 -0
  12. package/dist/{chunk-4D4HXQZQ.cjs → chunk-F6N7265F.cjs} +3 -3
  13. package/dist/{chunk-4D4HXQZQ.cjs.map → chunk-F6N7265F.cjs.map} +1 -1
  14. package/dist/{chunk-WUUYTMMN.js → chunk-FRVPBGNR.js} +3 -3
  15. package/dist/{chunk-WUUYTMMN.js.map → chunk-FRVPBGNR.js.map} +1 -1
  16. package/dist/{chunk-3PX4QNTY.js → chunk-L755XTYQ.js} +5 -5
  17. package/dist/{chunk-3PX4QNTY.js.map → chunk-L755XTYQ.js.map} +1 -1
  18. package/dist/{chunk-VFTKZ5NN.js → chunk-LXZQ3FLD.js} +3 -3
  19. package/dist/{chunk-VFTKZ5NN.js.map → chunk-LXZQ3FLD.js.map} +1 -1
  20. package/dist/chunk-NNZX6L34.cjs +479 -0
  21. package/dist/chunk-NNZX6L34.cjs.map +1 -0
  22. package/dist/chunk-TMK7RPZE.js +469 -0
  23. package/dist/chunk-TMK7RPZE.js.map +1 -0
  24. package/dist/{chunk-EVRBOCDD.cjs → chunk-TWAGLLIX.cjs} +5 -5
  25. package/dist/{chunk-EVRBOCDD.cjs.map → chunk-TWAGLLIX.cjs.map} +1 -1
  26. package/dist/{chunk-HK4SJHYT.js → chunk-UGL754UC.js} +12 -12
  27. package/dist/chunk-UGL754UC.js.map +1 -0
  28. package/dist/{chunk-5NLRYTA7.cjs → chunk-YF52OTQK.cjs} +70 -80
  29. package/dist/chunk-YF52OTQK.cjs.map +1 -0
  30. package/dist/{dist-GT5SXQBU.cjs → dist-5EULF33F.cjs} +4 -4
  31. package/dist/{dist-GT5SXQBU.cjs.map → dist-5EULF33F.cjs.map} +1 -1
  32. package/dist/{dist-OPQ753KD.js → dist-RCCUYXJR.js} +3 -3
  33. package/dist/{dist-OPQ753KD.js.map → dist-RCCUYXJR.js.map} +1 -1
  34. package/dist/docs/SKILL.md +1 -1
  35. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  36. package/dist/{observational-memory-BTXNITBN-USQTBIPQ.cjs → observational-memory-QL6BKIQX-KHRHK3MH.cjs} +28 -28
  37. package/dist/{observational-memory-BTXNITBN-USQTBIPQ.cjs.map → observational-memory-QL6BKIQX-KHRHK3MH.cjs.map} +1 -1
  38. package/dist/{observational-memory-BTXNITBN-GBTCKQX5.js → observational-memory-QL6BKIQX-XL77IBYW.js} +3 -3
  39. package/dist/{observational-memory-BTXNITBN-GBTCKQX5.js.map → observational-memory-QL6BKIQX-XL77IBYW.js.map} +1 -1
  40. package/dist/server/handlers/agent-builder.cjs +17 -17
  41. package/dist/server/handlers/agent-builder.js +1 -1
  42. package/dist/server/handlers/agent-controller.cjs +35 -35
  43. package/dist/server/handlers/agent-controller.d.ts.map +1 -1
  44. package/dist/server/handlers/agent-controller.js +1 -1
  45. package/dist/server/handlers/schedules-workflows-shim.cjs +32 -7
  46. package/dist/server/handlers/schedules-workflows-shim.cjs.map +1 -1
  47. package/dist/server/handlers/schedules-workflows-shim.js +16 -1
  48. package/dist/server/handlers/schedules-workflows-shim.js.map +1 -1
  49. package/dist/server/handlers/schedules.cjs +22 -6
  50. package/dist/server/handlers/schedules.d.ts +963 -361
  51. package/dist/server/handlers/schedules.d.ts.map +1 -1
  52. package/dist/server/handlers/schedules.js +1 -1
  53. package/dist/server/handlers/system.cjs +3 -3
  54. package/dist/server/handlers/system.js +1 -1
  55. package/dist/server/handlers.cjs +2 -2
  56. package/dist/server/handlers.js +1 -1
  57. package/dist/server/schemas/index.cjs +152 -152
  58. package/dist/server/schemas/index.js +4 -4
  59. package/dist/server/schemas/schedules.d.ts +337 -116
  60. package/dist/server/schemas/schedules.d.ts.map +1 -1
  61. package/dist/server/server-adapter/index.cjs +13 -13
  62. package/dist/server/server-adapter/index.js +2 -2
  63. package/dist/server/server-adapter/routes/index.d.ts.map +1 -1
  64. package/dist/server/server-adapter/routes/schedules.d.ts.map +1 -1
  65. package/package.json +5 -5
  66. package/dist/chunk-4DVFBBKV.js +0 -281
  67. package/dist/chunk-4DVFBBKV.js.map +0 -1
  68. package/dist/chunk-4HFIGLPA.js +0 -142
  69. package/dist/chunk-4HFIGLPA.js.map +0 -1
  70. package/dist/chunk-4WZMR4IW.cjs +0 -150
  71. package/dist/chunk-4WZMR4IW.cjs.map +0 -1
  72. package/dist/chunk-57BKC4ZW.cjs.map +0 -1
  73. package/dist/chunk-5NLRYTA7.cjs.map +0 -1
  74. package/dist/chunk-5XRZSGVP.cjs +0 -42
  75. package/dist/chunk-5XRZSGVP.cjs.map +0 -1
  76. package/dist/chunk-7XZQUQEO.cjs +0 -187
  77. package/dist/chunk-7XZQUQEO.cjs.map +0 -1
  78. package/dist/chunk-HK4SJHYT.js.map +0 -1
  79. package/dist/chunk-RCXVCPAD.js +0 -181
  80. package/dist/chunk-RCXVCPAD.js.map +0 -1
  81. package/dist/chunk-XEXUQSKG.js +0 -19
  82. package/dist/chunk-XEXUQSKG.js.map +0 -1
  83. package/dist/chunk-XTB6XXHH.cjs +0 -290
  84. package/dist/chunk-XTB6XXHH.cjs.map +0 -1
  85. package/dist/chunk-ZAK4IF2O.js.map +0 -1
  86. package/dist/server/handlers/heartbeats.cjs +0 -40
  87. package/dist/server/handlers/heartbeats.cjs.map +0 -1
  88. package/dist/server/handlers/heartbeats.d.ts +0 -769
  89. package/dist/server/handlers/heartbeats.d.ts.map +0 -1
  90. package/dist/server/handlers/heartbeats.js +0 -3
  91. package/dist/server/handlers/heartbeats.js.map +0 -1
  92. package/dist/server/schemas/heartbeats.d.ts +0 -227
  93. package/dist/server/schemas/heartbeats.d.ts.map +0 -1
  94. package/dist/server/server-adapter/routes/heartbeats.d.ts +0 -3
  95. package/dist/server/server-adapter/routes/heartbeats.d.ts.map +0 -1
@@ -1,181 +0,0 @@
1
- import { computeNextFireAt } from './chunk-XEXUQSKG.js';
2
- import { listSchedulesResponseSchema, listSchedulesQuerySchema, scheduleResponseSchema, scheduleIdPathParams, listScheduleTriggersResponseSchema, listScheduleTriggersQuerySchema } from './chunk-4HFIGLPA.js';
3
- import { createRoute } from './chunk-PIKPS6Q6.js';
4
- import { HTTPException } from './chunk-6QWQZI4Q.js';
5
-
6
- // src/server/handlers/schedules.ts
7
- function snapshotToRunSummary(run) {
8
- const snapshot = typeof run.snapshot === "string" ? null : run.snapshot;
9
- if (!snapshot) return void 0;
10
- const startedAt = run.createdAt instanceof Date ? run.createdAt.getTime() : void 0;
11
- const isTerminal = snapshot.status === "success" || snapshot.status === "failed" || snapshot.status === "canceled" || snapshot.status === "bailed" || snapshot.status === "tripwire";
12
- const completedAt = isTerminal ? run.updatedAt instanceof Date ? run.updatedAt.getTime() : void 0 : void 0;
13
- const durationMs = startedAt !== void 0 && completedAt !== void 0 ? completedAt - startedAt : void 0;
14
- return {
15
- status: snapshot.status,
16
- startedAt,
17
- completedAt,
18
- durationMs,
19
- error: snapshot.error?.message
20
- };
21
- }
22
- async function fetchRunSummary(mastra, workflowName, runId) {
23
- try {
24
- const workflowsStore = await mastra.getStorage()?.getStore("workflows");
25
- const run = await workflowsStore?.getWorkflowRunById({ runId, workflowName });
26
- if (!run) return void 0;
27
- return snapshotToRunSummary(run);
28
- } catch {
29
- return void 0;
30
- }
31
- }
32
- async function hydrateScheduleResponse(mastra, schedule) {
33
- if (!schedule.lastRunId || schedule.target.type !== "workflow" || !schedule.target.workflowId) {
34
- return schedule;
35
- }
36
- const lastRun = await fetchRunSummary(mastra, schedule.target.workflowId, schedule.lastRunId);
37
- return lastRun ? { ...schedule, lastRun } : schedule;
38
- }
39
- var LIST_SCHEDULES_ROUTE = createRoute({
40
- method: "GET",
41
- path: "/schedules",
42
- responseType: "json",
43
- queryParamSchema: listSchedulesQuerySchema,
44
- responseSchema: listSchedulesResponseSchema,
45
- summary: "List workflow schedules",
46
- description: "Returns the configured schedules, optionally filtered by workflowId or status.",
47
- tags: ["Schedules"],
48
- requiresAuth: true,
49
- handler: async ({ mastra, workflowId, status, ownerType, ownerId }) => {
50
- const schedulesStore = await mastra.getStorage()?.getStore("schedules");
51
- if (!schedulesStore) {
52
- return { schedules: [] };
53
- }
54
- const schedules = await schedulesStore.listSchedules({ workflowId, status, ownerType, ownerId });
55
- const visible = ownerType !== void 0 || ownerId !== void 0 ? schedules : schedules.filter((s) => s.ownerType == null);
56
- const hydrated = await Promise.all(
57
- visible.map(async (schedule) => {
58
- if (!schedule.lastRunId || schedule.target.type !== "workflow") {
59
- return schedule;
60
- }
61
- const lastRun = await fetchRunSummary(mastra, schedule.target.workflowId, schedule.lastRunId);
62
- return lastRun ? { ...schedule, lastRun } : schedule;
63
- })
64
- );
65
- return { schedules: hydrated };
66
- }
67
- });
68
- var GET_SCHEDULE_ROUTE = createRoute({
69
- method: "GET",
70
- path: "/schedules/:scheduleId",
71
- responseType: "json",
72
- pathParamSchema: scheduleIdPathParams,
73
- responseSchema: scheduleResponseSchema,
74
- summary: "Get a workflow schedule by ID",
75
- description: "Returns a single schedule row by its storage id.",
76
- tags: ["Schedules"],
77
- requiresAuth: true,
78
- handler: async ({ mastra, scheduleId }) => {
79
- const schedulesStore = await mastra.getStorage()?.getStore("schedules");
80
- if (!schedulesStore) {
81
- throw new HTTPException(404, { message: "Schedule not found" });
82
- }
83
- const schedule = await schedulesStore.getSchedule(scheduleId);
84
- if (!schedule) {
85
- throw new HTTPException(404, { message: "Schedule not found" });
86
- }
87
- return hydrateScheduleResponse(mastra, schedule);
88
- }
89
- });
90
- var LIST_SCHEDULE_TRIGGERS_ROUTE = createRoute({
91
- method: "GET",
92
- path: "/schedules/:scheduleId/triggers",
93
- responseType: "json",
94
- pathParamSchema: scheduleIdPathParams,
95
- queryParamSchema: listScheduleTriggersQuerySchema,
96
- responseSchema: listScheduleTriggersResponseSchema,
97
- summary: "List trigger history for a schedule",
98
- description: "Returns the audit trail of trigger attempts for a schedule, ordered by actualFireAt descending.",
99
- tags: ["Schedules"],
100
- requiresAuth: true,
101
- handler: async ({ mastra, scheduleId, limit, fromActualFireAt, toActualFireAt }) => {
102
- const schedulesStore = await mastra.getStorage()?.getStore("schedules");
103
- if (!schedulesStore) {
104
- return { triggers: [] };
105
- }
106
- const schedule = await schedulesStore.getSchedule(scheduleId);
107
- const triggers = await schedulesStore.listTriggers(scheduleId, { limit, fromActualFireAt, toActualFireAt });
108
- if (!schedule || schedule.target.type !== "workflow") {
109
- return { triggers };
110
- }
111
- const workflowName = schedule.target.workflowId;
112
- const hydrated = await Promise.all(
113
- triggers.map(async (trigger) => {
114
- if (trigger.outcome !== "published" || !trigger.runId) return trigger;
115
- const run = await fetchRunSummary(mastra, workflowName, trigger.runId);
116
- return run ? { ...trigger, run } : trigger;
117
- })
118
- );
119
- return { triggers: hydrated };
120
- }
121
- });
122
- var PAUSE_SCHEDULE_ROUTE = createRoute({
123
- method: "POST",
124
- path: "/schedules/:scheduleId/pause",
125
- responseType: "json",
126
- pathParamSchema: scheduleIdPathParams,
127
- responseSchema: scheduleResponseSchema,
128
- summary: "Pause a workflow schedule",
129
- description: "Marks the schedule as paused. The scheduler tick loop will skip paused schedules. Idempotent \u2014 pausing an already-paused schedule returns the current state unchanged. Pause status survives redeploys.",
130
- tags: ["Schedules"],
131
- requiresAuth: true,
132
- handler: async ({ mastra, scheduleId }) => {
133
- const schedulesStore = await mastra.getStorage()?.getStore("schedules");
134
- if (!schedulesStore) {
135
- throw new HTTPException(404, { message: "Schedule not found" });
136
- }
137
- const existing = await schedulesStore.getSchedule(scheduleId);
138
- if (!existing) {
139
- throw new HTTPException(404, { message: "Schedule not found" });
140
- }
141
- if (existing.status === "paused") {
142
- return hydrateScheduleResponse(mastra, existing);
143
- }
144
- const updated = await schedulesStore.updateSchedule(scheduleId, { status: "paused" });
145
- return hydrateScheduleResponse(mastra, updated);
146
- }
147
- });
148
- var RESUME_SCHEDULE_ROUTE = createRoute({
149
- method: "POST",
150
- path: "/schedules/:scheduleId/resume",
151
- responseType: "json",
152
- pathParamSchema: scheduleIdPathParams,
153
- responseSchema: scheduleResponseSchema,
154
- summary: "Resume a paused workflow schedule",
155
- description: 'Marks the schedule as active and recomputes nextFireAt from "now" so a long-paused schedule does not fire a backlog. Idempotent \u2014 resuming an already-active schedule returns the current state unchanged.',
156
- tags: ["Schedules"],
157
- requiresAuth: true,
158
- handler: async ({ mastra, scheduleId }) => {
159
- const schedulesStore = await mastra.getStorage()?.getStore("schedules");
160
- if (!schedulesStore) {
161
- throw new HTTPException(404, { message: "Schedule not found" });
162
- }
163
- const existing = await schedulesStore.getSchedule(scheduleId);
164
- if (!existing) {
165
- throw new HTTPException(404, { message: "Schedule not found" });
166
- }
167
- if (existing.status === "active") {
168
- return hydrateScheduleResponse(mastra, existing);
169
- }
170
- const nextFireAt = computeNextFireAt(existing.cron, {
171
- timezone: existing.timezone,
172
- after: Date.now()
173
- });
174
- const updated = await schedulesStore.updateSchedule(scheduleId, { status: "active", nextFireAt });
175
- return hydrateScheduleResponse(mastra, updated);
176
- }
177
- });
178
-
179
- export { GET_SCHEDULE_ROUTE, LIST_SCHEDULES_ROUTE, LIST_SCHEDULE_TRIGGERS_ROUTE, PAUSE_SCHEDULE_ROUTE, RESUME_SCHEDULE_ROUTE };
180
- //# sourceMappingURL=chunk-RCXVCPAD.js.map
181
- //# sourceMappingURL=chunk-RCXVCPAD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/handlers/schedules.ts"],"names":[],"mappings":"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","file":"chunk-RCXVCPAD.js","sourcesContent":["import type { Mastra } from '@mastra/core';\nimport type { WorkflowRunState } from '@mastra/core/workflows';\n// `computeNextFireAt` is new in @mastra/core@1.32.0; route it through a shim\n// that tolerates older cores (see ./schedules-workflows-shim.ts).\nimport { HTTPException } from '../http-exception';\nimport {\n listSchedulesQuerySchema,\n listSchedulesResponseSchema,\n scheduleIdPathParams,\n scheduleResponseSchema,\n listScheduleTriggersQuerySchema,\n listScheduleTriggersResponseSchema,\n} from '../schemas/schedules';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { computeNextFireAt } from './schedules-workflows-shim';\n\ntype RunSummary = {\n status: WorkflowRunState['status'];\n startedAt?: number;\n completedAt?: number;\n durationMs?: number;\n error?: string;\n};\n\nfunction snapshotToRunSummary(run: {\n snapshot: WorkflowRunState | string;\n createdAt: Date;\n updatedAt: Date;\n}): RunSummary | undefined {\n const snapshot = typeof run.snapshot === 'string' ? null : run.snapshot;\n if (!snapshot) return undefined;\n const startedAt = run.createdAt instanceof Date ? run.createdAt.getTime() : undefined;\n const isTerminal =\n snapshot.status === 'success' ||\n snapshot.status === 'failed' ||\n snapshot.status === 'canceled' ||\n snapshot.status === 'bailed' ||\n snapshot.status === 'tripwire';\n const completedAt = isTerminal ? (run.updatedAt instanceof Date ? run.updatedAt.getTime() : undefined) : undefined;\n const durationMs = startedAt !== undefined && completedAt !== undefined ? completedAt - startedAt : undefined;\n return {\n status: snapshot.status,\n startedAt,\n completedAt,\n durationMs,\n error: snapshot.error?.message,\n };\n}\n\nasync function fetchRunSummary(mastra: Mastra, workflowName: string, runId: string): Promise<RunSummary | undefined> {\n try {\n const workflowsStore = await mastra.getStorage()?.getStore('workflows');\n const run = await workflowsStore?.getWorkflowRunById({ runId, workflowName });\n if (!run) return undefined;\n return snapshotToRunSummary(run);\n } catch {\n return undefined;\n }\n}\n\nasync function hydrateScheduleResponse<T extends { lastRunId?: string; target: { type: string; workflowId?: string } }>(\n mastra: Mastra,\n schedule: T,\n): Promise<T & { lastRun?: RunSummary }> {\n if (!schedule.lastRunId || schedule.target.type !== 'workflow' || !schedule.target.workflowId) {\n return schedule;\n }\n const lastRun = await fetchRunSummary(mastra, schedule.target.workflowId, schedule.lastRunId);\n return lastRun ? { ...schedule, lastRun } : schedule;\n}\n\nexport const LIST_SCHEDULES_ROUTE = createRoute({\n method: 'GET',\n path: '/schedules',\n responseType: 'json' as const,\n queryParamSchema: listSchedulesQuerySchema,\n responseSchema: listSchedulesResponseSchema,\n summary: 'List workflow schedules',\n description: 'Returns the configured schedules, optionally filtered by workflowId or status.',\n tags: ['Schedules'],\n requiresAuth: true,\n handler: async ({ mastra, workflowId, status, ownerType, ownerId }) => {\n const schedulesStore = await mastra.getStorage()?.getStore('schedules');\n if (!schedulesStore) {\n // Schedules domain not configured — there are no schedules to return.\n return { schedules: [] };\n }\n const schedules = await schedulesStore.listSchedules({ workflowId, status, ownerType, ownerId });\n // Filter out owned schedules (e.g. heartbeats) unless caller explicitly\n // asks for them via ownerType/ownerId. The /schedules surface is for\n // workflow schedules; owned schedules have dedicated UIs.\n const visible =\n ownerType !== undefined || ownerId !== undefined ? schedules : schedules.filter(s => s.ownerType == null);\n const hydrated = await Promise.all(\n visible.map(async schedule => {\n if (!schedule.lastRunId || schedule.target.type !== 'workflow') {\n return schedule;\n }\n const lastRun = await fetchRunSummary(mastra, schedule.target.workflowId, schedule.lastRunId);\n return lastRun ? { ...schedule, lastRun } : schedule;\n }),\n );\n return { schedules: hydrated };\n },\n});\n\nexport const GET_SCHEDULE_ROUTE = createRoute({\n method: 'GET',\n path: '/schedules/:scheduleId',\n responseType: 'json' as const,\n pathParamSchema: scheduleIdPathParams,\n responseSchema: scheduleResponseSchema,\n summary: 'Get a workflow schedule by ID',\n description: 'Returns a single schedule row by its storage id.',\n tags: ['Schedules'],\n requiresAuth: true,\n handler: async ({ mastra, scheduleId }) => {\n const schedulesStore = await mastra.getStorage()?.getStore('schedules');\n if (!schedulesStore) {\n throw new HTTPException(404, { message: 'Schedule not found' });\n }\n const schedule = await schedulesStore.getSchedule(scheduleId);\n if (!schedule) {\n throw new HTTPException(404, { message: 'Schedule not found' });\n }\n return hydrateScheduleResponse(mastra, schedule);\n },\n});\n\nexport const LIST_SCHEDULE_TRIGGERS_ROUTE = createRoute({\n method: 'GET',\n path: '/schedules/:scheduleId/triggers',\n responseType: 'json' as const,\n pathParamSchema: scheduleIdPathParams,\n queryParamSchema: listScheduleTriggersQuerySchema,\n responseSchema: listScheduleTriggersResponseSchema,\n summary: 'List trigger history for a schedule',\n description: 'Returns the audit trail of trigger attempts for a schedule, ordered by actualFireAt descending.',\n tags: ['Schedules'],\n requiresAuth: true,\n handler: async ({ mastra, scheduleId, limit, fromActualFireAt, toActualFireAt }) => {\n const schedulesStore = await mastra.getStorage()?.getStore('schedules');\n if (!schedulesStore) {\n return { triggers: [] };\n }\n const schedule = await schedulesStore.getSchedule(scheduleId);\n const triggers = await schedulesStore.listTriggers(scheduleId, { limit, fromActualFireAt, toActualFireAt });\n if (!schedule || schedule.target.type !== 'workflow') {\n return { triggers };\n }\n const workflowName = schedule.target.workflowId;\n const hydrated = await Promise.all(\n triggers.map(async trigger => {\n if (trigger.outcome !== 'published' || !trigger.runId) return trigger;\n const run = await fetchRunSummary(mastra, workflowName, trigger.runId);\n return run ? { ...trigger, run } : trigger;\n }),\n );\n return { triggers: hydrated };\n },\n});\n\nexport const PAUSE_SCHEDULE_ROUTE = createRoute({\n method: 'POST',\n path: '/schedules/:scheduleId/pause',\n responseType: 'json' as const,\n pathParamSchema: scheduleIdPathParams,\n responseSchema: scheduleResponseSchema,\n summary: 'Pause a workflow schedule',\n description:\n 'Marks the schedule as paused. The scheduler tick loop will skip paused schedules. Idempotent — pausing an already-paused schedule returns the current state unchanged. Pause status survives redeploys.',\n tags: ['Schedules'],\n requiresAuth: true,\n handler: async ({ mastra, scheduleId }) => {\n const schedulesStore = await mastra.getStorage()?.getStore('schedules');\n if (!schedulesStore) {\n throw new HTTPException(404, { message: 'Schedule not found' });\n }\n const existing = await schedulesStore.getSchedule(scheduleId);\n if (!existing) {\n throw new HTTPException(404, { message: 'Schedule not found' });\n }\n if (existing.status === 'paused') {\n return hydrateScheduleResponse(mastra, existing);\n }\n const updated = await schedulesStore.updateSchedule(scheduleId, { status: 'paused' });\n return hydrateScheduleResponse(mastra, updated);\n },\n});\n\nexport const RESUME_SCHEDULE_ROUTE = createRoute({\n method: 'POST',\n path: '/schedules/:scheduleId/resume',\n responseType: 'json' as const,\n pathParamSchema: scheduleIdPathParams,\n responseSchema: scheduleResponseSchema,\n summary: 'Resume a paused workflow schedule',\n description:\n 'Marks the schedule as active and recomputes nextFireAt from \"now\" so a long-paused schedule does not fire a backlog. Idempotent — resuming an already-active schedule returns the current state unchanged.',\n tags: ['Schedules'],\n requiresAuth: true,\n handler: async ({ mastra, scheduleId }) => {\n const schedulesStore = await mastra.getStorage()?.getStore('schedules');\n if (!schedulesStore) {\n throw new HTTPException(404, { message: 'Schedule not found' });\n }\n const existing = await schedulesStore.getSchedule(scheduleId);\n if (!existing) {\n throw new HTTPException(404, { message: 'Schedule not found' });\n }\n if (existing.status === 'active') {\n return hydrateScheduleResponse(mastra, existing);\n }\n const nextFireAt = computeNextFireAt(existing.cron, {\n timezone: existing.timezone,\n after: Date.now(),\n });\n const updated = await schedulesStore.updateSchedule(scheduleId, { status: 'active', nextFireAt });\n return hydrateScheduleResponse(mastra, updated);\n },\n});\n"]}
@@ -1,19 +0,0 @@
1
- import * as coreWorkflows from '@mastra/core/workflows';
2
-
3
- // src/server/handlers/schedules-workflows-shim.ts
4
- var exportedNext = coreWorkflows.computeNextFireAt;
5
- var exportedValidate = coreWorkflows.validateCron;
6
- var computeNextFireAt2 = exportedNext ?? (() => {
7
- throw new Error(
8
- "`computeNextFireAt` is not available in this version of @mastra/core. Schedules require @mastra/core >= 1.32.0."
9
- );
10
- });
11
- var validateCron2 = exportedValidate ?? (() => {
12
- throw new Error(
13
- "`validateCron` is not available in this version of @mastra/core. Schedules require @mastra/core >= 1.32.0."
14
- );
15
- });
16
-
17
- export { computeNextFireAt2 as computeNextFireAt, validateCron2 as validateCron };
18
- //# sourceMappingURL=chunk-XEXUQSKG.js.map
19
- //# sourceMappingURL=chunk-XEXUQSKG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/handlers/schedules-workflows-shim.ts"],"names":["computeNextFireAt","validateCron"],"mappings":";;;AAsBA,IAAM,YAAA,GAA0D,aAAA,CAAA,iBAAA;AAChE,IAAM,gBAAA,GAA8D,aAAA,CAAA,YAAA;AAE7D,IAAMA,kBAAAA,GACX,iBACC,MAAM;AACL,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GAEF;AACF,CAAA;AAEK,IAAMC,aAAAA,GACX,qBACC,MAAM;AACL,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF,CAAA","file":"chunk-XEXUQSKG.js","sourcesContent":["/**\n * Safe re-export of `computeNextFireAt` from `@mastra/core/workflows`.\n *\n * Why this shim exists:\n * `computeNextFireAt` was introduced in `@mastra/core@1.32.0`. Earlier\n * versions of `@mastra/core` ship `@mastra/core/workflows` but do not export\n * this function. A direct named import fails at ESM link time when this\n * version of `@mastra/server` is paired with `@mastra/core < 1.32.0`, taking\n * the entire user bundle down before any code runs.\n *\n * A namespace import tolerates missing names. We expose the real function\n * when available and fall back to a function that throws a clear error\n * otherwise — schedules require new-core support anyway, so loud failure at\n * the call site is far better than silent corruption.\n *\n * Typed as `any` on purpose (see ./observability-storage-schemas.ts for\n * the same rationale): keeps the emitted `.d.ts` free of names that don't\n * exist in older cores.\n */\n\nimport * as coreWorkflows from '@mastra/core/workflows';\n\nconst exportedNext = (coreWorkflows as Record<string, unknown>).computeNextFireAt;\nconst exportedValidate = (coreWorkflows as Record<string, unknown>).validateCron;\n\nexport const computeNextFireAt: any =\n exportedNext ??\n (() => {\n throw new Error(\n '`computeNextFireAt` is not available in this version of @mastra/core. ' +\n 'Schedules require @mastra/core >= 1.32.0.',\n );\n });\n\nexport const validateCron: any =\n exportedValidate ??\n (() => {\n throw new Error(\n '`validateCron` is not available in this version of @mastra/core. ' + 'Schedules require @mastra/core >= 1.32.0.',\n );\n });\n"]}
@@ -1,290 +0,0 @@
1
- 'use strict';
2
-
3
- var chunk4WZMR4IW_cjs = require('./chunk-4WZMR4IW.cjs');
4
- var chunkN54Q3AQR_cjs = require('./chunk-N54Q3AQR.cjs');
5
- var chunk64ITUOXI_cjs = require('./chunk-64ITUOXI.cjs');
6
- var zod = require('zod');
7
-
8
- var signalAttributesSchema = zod.z.record(
9
- zod.z.string(),
10
- zod.z.union([zod.z.string(), zod.z.number(), zod.z.boolean(), zod.z.null()]).optional()
11
- );
12
- var ifActiveSchema = zod.z.object({
13
- behavior: zod.z.enum(["deliver", "persist", "discard"]).optional(),
14
- attributes: signalAttributesSchema.optional()
15
- });
16
- var ifIdleSchema = zod.z.object({
17
- behavior: zod.z.enum(["wake", "persist", "discard"]).optional(),
18
- attributes: signalAttributesSchema.optional(),
19
- streamOptions: zod.z.object({
20
- requestContext: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
21
- }).optional()
22
- });
23
- var heartbeatSchema = zod.z.object({
24
- id: zod.z.string(),
25
- agentId: zod.z.string(),
26
- name: zod.z.string().optional(),
27
- threadId: zod.z.string().optional(),
28
- resourceId: zod.z.string().optional(),
29
- prompt: zod.z.string(),
30
- cron: zod.z.string(),
31
- timezone: zod.z.string().optional(),
32
- status: zod.z.enum(["active", "paused"]),
33
- nextFireAt: zod.z.number(),
34
- lastFireAt: zod.z.number().optional(),
35
- lastRunId: zod.z.string().optional(),
36
- lastRun: chunk4WZMR4IW_cjs.scheduleRunSummarySchema.optional(),
37
- signalType: zod.z.string().optional(),
38
- tagName: zod.z.string().optional(),
39
- attributes: signalAttributesSchema.optional(),
40
- ifActive: ifActiveSchema.optional(),
41
- ifIdle: ifIdleSchema.optional(),
42
- providerOptions: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
43
- metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
44
- createdAt: zod.z.number(),
45
- updatedAt: zod.z.number()
46
- });
47
- var listHeartbeatsResponseSchema = zod.z.object({
48
- heartbeats: zod.z.array(heartbeatSchema)
49
- });
50
- var listHeartbeatsQuerySchema = zod.z.object({
51
- agentId: zod.z.string().optional(),
52
- threadId: zod.z.string().optional(),
53
- resourceId: zod.z.string().optional(),
54
- name: zod.z.string().optional()
55
- });
56
- var heartbeatPathParams = zod.z.object({
57
- heartbeatId: zod.z.string()
58
- });
59
- var createHeartbeatBodySchema = zod.z.object({
60
- /** Optional stable id; normalized to `hb_<slug>`. A random id is generated when omitted. */
61
- id: zod.z.string().optional(),
62
- agentId: zod.z.string(),
63
- cron: zod.z.string(),
64
- timezone: zod.z.string().optional(),
65
- prompt: zod.z.string(),
66
- name: zod.z.string().optional(),
67
- threadId: zod.z.string().optional(),
68
- resourceId: zod.z.string().optional(),
69
- signalType: zod.z.string().optional(),
70
- tagName: zod.z.string().optional(),
71
- attributes: signalAttributesSchema.optional(),
72
- ifActive: ifActiveSchema.optional(),
73
- ifIdle: ifIdleSchema.optional(),
74
- providerOptions: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
75
- metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
76
- });
77
- var updateHeartbeatBodySchema = zod.z.object({
78
- cron: zod.z.string().optional(),
79
- timezone: zod.z.string().optional(),
80
- prompt: zod.z.string().optional(),
81
- name: zod.z.string().optional(),
82
- signalType: zod.z.string().optional(),
83
- tagName: zod.z.string().optional(),
84
- attributes: signalAttributesSchema.optional(),
85
- ifActive: ifActiveSchema.optional(),
86
- ifIdle: ifIdleSchema.optional(),
87
- providerOptions: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
88
- metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
89
- });
90
- var deleteHeartbeatResponseSchema = zod.z.object({
91
- message: zod.z.string()
92
- });
93
- var runHeartbeatResponseSchema = zod.z.object({
94
- scheduleId: zod.z.string(),
95
- claimId: zod.z.string(),
96
- scheduledFireAt: zod.z.number()
97
- });
98
-
99
- // src/server/handlers/heartbeats.ts
100
- function getHeartbeats(mastra) {
101
- const svc = mastra.heartbeats;
102
- if (!svc) {
103
- throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Heartbeats not supported by this server" });
104
- }
105
- return svc;
106
- }
107
- async function loadHeartbeat(mastra, heartbeatId) {
108
- const heartbeats = getHeartbeats(mastra);
109
- const heartbeat = await heartbeats.get(heartbeatId);
110
- if (!heartbeat) {
111
- throw new chunk64ITUOXI_cjs.HTTPException(404, { message: "Heartbeat not found" });
112
- }
113
- return heartbeat;
114
- }
115
- var LIST_HEARTBEATS_ROUTE = chunkN54Q3AQR_cjs.createRoute({
116
- method: "GET",
117
- path: "/heartbeats",
118
- responseType: "json",
119
- queryParamSchema: listHeartbeatsQuerySchema,
120
- responseSchema: listHeartbeatsResponseSchema,
121
- summary: "List heartbeats across all agents",
122
- description: "Returns the configured heartbeats, optionally filtered by agentId/threadId/resourceId/name.",
123
- tags: ["Heartbeats"],
124
- requiresAuth: true,
125
- handler: async ({ mastra, agentId, threadId, resourceId, name }) => {
126
- const heartbeats = getHeartbeats(mastra);
127
- const filter = {};
128
- if (agentId) filter.agentId = agentId;
129
- if (threadId) filter.threadId = threadId;
130
- if (resourceId) filter.resourceId = resourceId;
131
- if (name) filter.name = name;
132
- const rows = await heartbeats.list(filter);
133
- return { heartbeats: rows };
134
- }
135
- });
136
- var GET_HEARTBEAT_ROUTE = chunkN54Q3AQR_cjs.createRoute({
137
- method: "GET",
138
- path: "/heartbeats/:heartbeatId",
139
- responseType: "json",
140
- pathParamSchema: heartbeatPathParams,
141
- responseSchema: heartbeatSchema,
142
- summary: "Get a heartbeat by ID",
143
- description: "Returns a single heartbeat by its id.",
144
- tags: ["Heartbeats"],
145
- requiresAuth: true,
146
- handler: async ({ mastra, heartbeatId }) => {
147
- return await loadHeartbeat(mastra, heartbeatId);
148
- }
149
- });
150
- var CREATE_HEARTBEAT_ROUTE = chunkN54Q3AQR_cjs.createRoute({
151
- method: "POST",
152
- path: "/heartbeats",
153
- responseType: "json",
154
- bodySchema: createHeartbeatBodySchema,
155
- responseSchema: heartbeatSchema,
156
- summary: "Create a heartbeat",
157
- description: "Creates a new heartbeat owned by the agent named in `agentId`. Multiple heartbeats per agent/thread are supported; each gets a random `hb_<uuid>` id. Use `name` to label distinct heartbeats on the same agent/thread.",
158
- tags: ["Heartbeats"],
159
- requiresAuth: true,
160
- handler: async ({ mastra, agentId, ...body }) => {
161
- try {
162
- mastra.getAgentById(agentId);
163
- } catch {
164
- throw new chunk64ITUOXI_cjs.HTTPException(404, { message: `Agent "${agentId}" not found` });
165
- }
166
- const heartbeats = getHeartbeats(mastra);
167
- return await heartbeats.create({
168
- agentId,
169
- cron: body.cron,
170
- prompt: body.prompt,
171
- ...body.id ? { id: body.id } : {},
172
- ...body.name ? { name: body.name } : {},
173
- ...body.timezone ? { timezone: body.timezone } : {},
174
- ...body.threadId ? { threadId: body.threadId } : {},
175
- ...body.resourceId ? { resourceId: body.resourceId } : {},
176
- ...body.signalType ? { signalType: body.signalType } : {},
177
- ...body.tagName ? { tagName: body.tagName } : {},
178
- ...body.attributes ? { attributes: body.attributes } : {},
179
- ...body.ifActive ? { ifActive: body.ifActive } : {},
180
- ...body.ifIdle ? { ifIdle: body.ifIdle } : {},
181
- ...body.providerOptions ? { providerOptions: body.providerOptions } : {},
182
- ...body.metadata ? { metadata: body.metadata } : {}
183
- });
184
- }
185
- });
186
- var UPDATE_HEARTBEAT_ROUTE = chunkN54Q3AQR_cjs.createRoute({
187
- method: "PATCH",
188
- path: "/heartbeats/:heartbeatId",
189
- responseType: "json",
190
- pathParamSchema: heartbeatPathParams,
191
- bodySchema: updateHeartbeatBodySchema,
192
- responseSchema: heartbeatSchema,
193
- summary: "Update a heartbeat",
194
- description: "Partial update of a heartbeat. `threadId` and `resourceId` are part of the heartbeat identity and cannot be changed \u2014 to re-target, delete and recreate. Editing `cron` (or `timezone`) recomputes `nextFireAt`.",
195
- tags: ["Heartbeats"],
196
- requiresAuth: true,
197
- handler: async ({ mastra, heartbeatId, ...body }) => {
198
- await loadHeartbeat(mastra, heartbeatId);
199
- const heartbeats = getHeartbeats(mastra);
200
- return await heartbeats.update(heartbeatId, {
201
- ...body.cron !== void 0 ? { cron: body.cron } : {},
202
- ...body.timezone !== void 0 ? { timezone: body.timezone } : {},
203
- ...body.prompt !== void 0 ? { prompt: body.prompt } : {},
204
- ...body.name !== void 0 ? { name: body.name } : {},
205
- ...body.signalType !== void 0 ? { signalType: body.signalType } : {},
206
- ...body.tagName !== void 0 ? { tagName: body.tagName } : {},
207
- ...body.attributes !== void 0 ? { attributes: body.attributes } : {},
208
- ...body.ifActive !== void 0 ? { ifActive: body.ifActive } : {},
209
- ...body.ifIdle !== void 0 ? { ifIdle: body.ifIdle } : {},
210
- ...body.providerOptions !== void 0 ? { providerOptions: body.providerOptions } : {},
211
- ...body.metadata !== void 0 ? { metadata: body.metadata } : {}
212
- });
213
- }
214
- });
215
- var DELETE_HEARTBEAT_ROUTE = chunkN54Q3AQR_cjs.createRoute({
216
- method: "DELETE",
217
- path: "/heartbeats/:heartbeatId",
218
- responseType: "json",
219
- pathParamSchema: heartbeatPathParams,
220
- responseSchema: deleteHeartbeatResponseSchema,
221
- summary: "Delete a heartbeat",
222
- description: "Permanently deletes the heartbeat. 404 when the heartbeat does not exist.",
223
- tags: ["Heartbeats"],
224
- requiresAuth: true,
225
- handler: async ({ mastra, heartbeatId }) => {
226
- await loadHeartbeat(mastra, heartbeatId);
227
- const heartbeats = getHeartbeats(mastra);
228
- await heartbeats.delete(heartbeatId);
229
- return { message: "Heartbeat deleted" };
230
- }
231
- });
232
- var PAUSE_HEARTBEAT_ROUTE = chunkN54Q3AQR_cjs.createRoute({
233
- method: "POST",
234
- path: "/heartbeats/:heartbeatId/pause",
235
- responseType: "json",
236
- pathParamSchema: heartbeatPathParams,
237
- responseSchema: heartbeatSchema,
238
- summary: "Pause a heartbeat",
239
- description: "Marks the heartbeat as paused. The scheduler tick loop will skip paused heartbeats. Idempotent.",
240
- tags: ["Heartbeats"],
241
- requiresAuth: true,
242
- handler: async ({ mastra, heartbeatId }) => {
243
- await loadHeartbeat(mastra, heartbeatId);
244
- const heartbeats = getHeartbeats(mastra);
245
- return await heartbeats.pause(heartbeatId);
246
- }
247
- });
248
- var RESUME_HEARTBEAT_ROUTE = chunkN54Q3AQR_cjs.createRoute({
249
- method: "POST",
250
- path: "/heartbeats/:heartbeatId/resume",
251
- responseType: "json",
252
- pathParamSchema: heartbeatPathParams,
253
- responseSchema: heartbeatSchema,
254
- summary: "Resume a paused heartbeat",
255
- description: 'Marks the heartbeat as active and recomputes nextFireAt from "now" so a long-paused heartbeat does not fire a backlog. Idempotent.',
256
- tags: ["Heartbeats"],
257
- requiresAuth: true,
258
- handler: async ({ mastra, heartbeatId }) => {
259
- await loadHeartbeat(mastra, heartbeatId);
260
- const heartbeats = getHeartbeats(mastra);
261
- return await heartbeats.resume(heartbeatId);
262
- }
263
- });
264
- var RUN_HEARTBEAT_ROUTE = chunkN54Q3AQR_cjs.createRoute({
265
- method: "POST",
266
- path: "/heartbeats/:heartbeatId/run",
267
- responseType: "json",
268
- pathParamSchema: heartbeatPathParams,
269
- responseSchema: runHeartbeatResponseSchema,
270
- summary: "Fire a heartbeat now",
271
- description: 'Manually triggers a single heartbeat run out-of-band from the cron schedule. Records a trigger row with `triggerKind: "manual"`. Does not advance `nextFireAt`.',
272
- tags: ["Heartbeats"],
273
- requiresAuth: true,
274
- handler: async ({ mastra, heartbeatId }) => {
275
- await loadHeartbeat(mastra, heartbeatId);
276
- const heartbeats = getHeartbeats(mastra);
277
- return await heartbeats.run(heartbeatId);
278
- }
279
- });
280
-
281
- exports.CREATE_HEARTBEAT_ROUTE = CREATE_HEARTBEAT_ROUTE;
282
- exports.DELETE_HEARTBEAT_ROUTE = DELETE_HEARTBEAT_ROUTE;
283
- exports.GET_HEARTBEAT_ROUTE = GET_HEARTBEAT_ROUTE;
284
- exports.LIST_HEARTBEATS_ROUTE = LIST_HEARTBEATS_ROUTE;
285
- exports.PAUSE_HEARTBEAT_ROUTE = PAUSE_HEARTBEAT_ROUTE;
286
- exports.RESUME_HEARTBEAT_ROUTE = RESUME_HEARTBEAT_ROUTE;
287
- exports.RUN_HEARTBEAT_ROUTE = RUN_HEARTBEAT_ROUTE;
288
- exports.UPDATE_HEARTBEAT_ROUTE = UPDATE_HEARTBEAT_ROUTE;
289
- //# sourceMappingURL=chunk-XTB6XXHH.cjs.map
290
- //# sourceMappingURL=chunk-XTB6XXHH.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/schemas/heartbeats.ts","../src/server/handlers/heartbeats.ts"],"names":["z","scheduleRunSummarySchema","HTTPException","createRoute"],"mappings":";;;;;;;AAIA,IAAM,yBAAyBA,KAAA,CAAE,MAAA;AAAA,EAC/BA,MAAE,MAAA,EAAO;AAAA,EACTA,MAAE,KAAA,CAAM,CAACA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,MAAA,EAAO,EAAGA,KAAA,CAAE,SAAQ,EAAGA,KAAA,CAAE,MAAM,CAAC,EAAE,QAAA;AAC3D,CAAA;AAGA,IAAM,cAAA,GAAiBA,MAAE,MAAA,CAAO;AAAA,EAC9B,QAAA,EAAUA,MAAE,IAAA,CAAK,CAAC,WAAW,SAAA,EAAW,SAAS,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC7D,UAAA,EAAY,uBAAuB,QAAA;AACrC,CAAC,CAAA;AAMD,IAAM,YAAA,GAAeA,MAAE,MAAA,CAAO;AAAA,EAC5B,QAAA,EAAUA,MAAE,IAAA,CAAK,CAAC,QAAQ,SAAA,EAAW,SAAS,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC1D,UAAA,EAAY,uBAAuB,QAAA,EAAS;AAAA,EAC5C,aAAA,EAAeA,MACZ,MAAA,CAAO;AAAA,IACN,cAAA,EAAgBA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAAS,GAC5D,EACA,QAAA;AACL,CAAC,CAAA;AAWM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAQA,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,EACnC,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,EACrB,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,OAAA,EAASC,2CAAyB,QAAA,EAAS;AAAA,EAC3C,UAAA,EAAYD,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,UAAA,EAAY,uBAAuB,QAAA,EAAS;AAAA,EAC5C,QAAA,EAAU,eAAe,QAAA,EAAS;AAAA,EAClC,MAAA,EAAQ,aAAa,QAAA,EAAS;AAAA,EAC9B,eAAA,EAAiBA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EAC5D,QAAA,EAAUA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACrD,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,MAAE,MAAA;AACf,CAAC,CAAA;AAEM,IAAM,4BAAA,GAA+BA,MAAE,MAAA,CAAO;AAAA,EACnD,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAM,eAAe;AACrC,CAAC,CAAA;AAEM,IAAM,yBAAA,GAA4BA,MAAE,MAAA,CAAO;AAAA,EAChD,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACnB,CAAC,CAAA;AAEM,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,WAAA,EAAaA,MAAE,MAAA;AACjB,CAAC,CAAA;AAGM,IAAM,yBAAA,GAA4BA,MAAE,MAAA,CAAO;AAAA;AAAA,EAEhD,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACxB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,UAAA,EAAY,uBAAuB,QAAA,EAAS;AAAA,EAC5C,QAAA,EAAU,eAAe,QAAA,EAAS;AAAA,EAClC,MAAA,EAAQ,aAAa,QAAA,EAAS;AAAA,EAC9B,eAAA,EAAiBA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EAC5D,QAAA,EAAUA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC9C,CAAC,CAAA;AAQM,IAAM,yBAAA,GAA4BA,MAAE,MAAA,CAAO;AAAA,EAChD,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,UAAA,EAAY,uBAAuB,QAAA,EAAS;AAAA,EAC5C,QAAA,EAAU,eAAe,QAAA,EAAS;AAAA,EAClC,MAAA,EAAQ,aAAa,QAAA,EAAS;AAAA,EAC9B,eAAA,EAAiBA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EAC5D,QAAA,EAAUA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC9C,CAAC,CAAA;AAEM,IAAM,6BAAA,GAAgCA,MAAE,MAAA,CAAO;AAAA,EACpD,OAAA,EAASA,MAAE,MAAA;AACb,CAAC,CAAA;AAGM,IAAM,0BAAA,GAA6BA,MAAE,MAAA,CAAO;AAAA,EACjD,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,EACrB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,eAAA,EAAiBA,MAAE,MAAA;AACrB,CAAC,CAAA;;;AC5GD,SAAS,cAAc,MAAA,EAAqB;AAC1C,EAAA,MAAM,MAAO,MAAA,CAA+C,UAAA;AAC5D,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAIE,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,2CAA2C,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,GAAA;AACT;AAOA,eAAe,aAAA,CAAc,QAAgB,WAAA,EAAqB;AAChE,EAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,MAAM,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AAClD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAIA,+BAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,uBAAuB,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,SAAA;AACT;AAEO,IAAM,wBAAwBC,6BAAA,CAAY;AAAA,EAC/C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,aAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,gBAAA,EAAkB,yBAAA;AAAA,EAClB,cAAA,EAAgB,4BAAA;AAAA,EAChB,OAAA,EAAS,mCAAA;AAAA,EACT,WAAA,EAAa,6FAAA;AAAA,EACb,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,SAAS,QAAA,EAAU,UAAA,EAAY,MAAK,KAAM;AAClE,IAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,IAAI,OAAA,SAAgB,OAAA,GAAU,OAAA;AAC9B,IAAA,IAAI,QAAA,SAAiB,QAAA,GAAW,QAAA;AAChC,IAAA,IAAI,UAAA,SAAmB,UAAA,GAAa,UAAA;AACpC,IAAA,IAAI,IAAA,SAAa,IAAA,GAAO,IAAA;AACxB,IAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,OAAO,EAAE,YAAY,IAAA,EAAK;AAAA,EAC5B;AACF,CAAC;AAEM,IAAM,sBAAsBA,6BAAA,CAAY;AAAA,EAC7C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,0BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,uBAAA;AAAA,EACT,WAAA,EAAa,uCAAA;AAAA,EACb,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,aAAY,KAAM;AAC1C,IAAA,OAAO,MAAM,aAAA,CAAc,MAAA,EAAQ,WAAW,CAAA;AAAA,EAChD;AACF,CAAC;AAEM,IAAM,yBAAyBA,6BAAA,CAAY;AAAA,EAChD,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,aAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,UAAA,EAAY,yBAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,WAAA,EACE,yNAAA;AAAA,EACF,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,OAAA,EAAS,GAAG,MAAK,KAAM;AAG/C,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,aAAa,OAAO,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAID,gCAAc,GAAA,EAAK,EAAE,SAAS,CAAA,OAAA,EAAU,OAAO,eAAe,CAAA;AAAA,IAC1E;AACA,IAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,IAAA,OAAO,MAAM,WAAW,MAAA,CAAO;AAAA,MAC7B,OAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,GAAI,KAAK,EAAA,GAAK,EAAE,IAAI,IAAA,CAAK,EAAA,KAAO,EAAC;AAAA,MACjC,GAAI,KAAK,IAAA,GAAO,EAAE,MAAM,IAAA,CAAK,IAAA,KAAS,EAAC;AAAA,MACvC,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,MACnD,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,MACnD,GAAI,KAAK,UAAA,GAAa,EAAE,YAAY,IAAA,CAAK,UAAA,KAAe,EAAC;AAAA,MACzD,GAAI,KAAK,UAAA,GAAa,EAAE,YAAY,IAAA,CAAK,UAAA,KAAe,EAAC;AAAA,MACzD,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY,EAAC;AAAA,MAChD,GAAI,KAAK,UAAA,GAAa,EAAE,YAAY,IAAA,CAAK,UAAA,KAAe,EAAC;AAAA,MACzD,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,MACnD,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW,EAAC;AAAA,MAC7C,GAAI,KAAK,eAAA,GAAkB,EAAE,iBAAiB,IAAA,CAAK,eAAA,KAAoB,EAAC;AAAA,MACxE,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa;AAAC,KACpD,CAAA;AAAA,EACH;AACF,CAAC;AAEM,IAAM,yBAAyBC,6BAAA,CAAY;AAAA,EAChD,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM,0BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,mBAAA;AAAA,EACjB,UAAA,EAAY,yBAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,WAAA,EACE,uNAAA;AAAA,EACF,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,QAAQ,WAAA,EAAa,GAAG,MAAK,KAAM;AACnD,IAAA,MAAM,aAAA,CAAc,QAAQ,WAAW,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,IAAA,OAAO,MAAM,UAAA,CAAW,MAAA,CAAO,WAAA,EAAa;AAAA,MAC1C,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,MACrD,GAAI,KAAK,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS,GAAI,EAAC;AAAA,MACjE,GAAI,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,EAAC;AAAA,MAC3D,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,MACrD,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC;AAAA,MACvE,GAAI,KAAK,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ,GAAI,EAAC;AAAA,MAC9D,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC;AAAA,MACvE,GAAI,KAAK,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS,GAAI,EAAC;AAAA,MACjE,GAAI,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,EAAC;AAAA,MAC3D,GAAI,KAAK,eAAA,KAAoB,MAAA,GAAY,EAAE,eAAA,EAAiB,IAAA,CAAK,eAAA,EAAgB,GAAI,EAAC;AAAA,MACtF,GAAI,KAAK,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS,GAAI;AAAC,KAClE,CAAA;AAAA,EACH;AACF,CAAC;AAEM,IAAM,yBAAyBA,6BAAA,CAAY;AAAA,EAChD,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,0BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,6BAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,WAAA,EAAa,2EAAA;AAAA,EACb,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,aAAY,KAAM;AAC1C,IAAA,MAAM,aAAA,CAAc,QAAQ,WAAW,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,IAAA,MAAM,UAAA,CAAW,OAAO,WAAW,CAAA;AACnC,IAAA,OAAO,EAAE,SAAS,mBAAA,EAAoB;AAAA,EACxC;AACF,CAAC;AAEM,IAAM,wBAAwBA,6BAAA,CAAY;AAAA,EAC/C,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,gCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,mBAAA;AAAA,EACT,WAAA,EAAa,iGAAA;AAAA,EACb,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,aAAY,KAAM;AAC1C,IAAA,MAAM,aAAA,CAAc,QAAQ,WAAW,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,IAAA,OAAO,MAAM,UAAA,CAAW,KAAA,CAAM,WAAW,CAAA;AAAA,EAC3C;AACF,CAAC;AAEM,IAAM,yBAAyBA,6BAAA,CAAY;AAAA,EAChD,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,iCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,2BAAA;AAAA,EACT,WAAA,EACE,oIAAA;AAAA,EACF,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,aAAY,KAAM;AAC1C,IAAA,MAAM,aAAA,CAAc,QAAQ,WAAW,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,IAAA,OAAO,MAAM,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA;AAAA,EAC5C;AACF,CAAC;AAEM,IAAM,sBAAsBA,6BAAA,CAAY;AAAA,EAC7C,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,8BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,0BAAA;AAAA,EAChB,OAAA,EAAS,sBAAA;AAAA,EACT,WAAA,EACE,iKAAA;AAAA,EACF,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,EACnB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,aAAY,KAAM;AAC1C,IAAA,MAAM,aAAA,CAAc,QAAQ,WAAW,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,IAAA,OAAO,MAAM,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AAAA,EACzC;AACF,CAAC","file":"chunk-XTB6XXHH.cjs","sourcesContent":["import { z } from 'zod';\nimport { scheduleRunSummarySchema } from './schedules';\n\n/** Attributes rendered onto the signal's XML tag. */\nconst signalAttributesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),\n);\n\n/** Behavior + attributes applied when the thread is already streaming. */\nconst ifActiveSchema = z.object({\n behavior: z.enum(['deliver', 'persist', 'discard']).optional(),\n attributes: signalAttributesSchema.optional(),\n});\n\n/**\n * Behavior + attributes applied when the thread is idle, plus a serializable\n * subset of stream options forwarded to the woken run.\n */\nconst ifIdleSchema = z.object({\n behavior: z.enum(['wake', 'persist', 'discard']).optional(),\n attributes: signalAttributesSchema.optional(),\n streamOptions: z\n .object({\n requestContext: z.record(z.string(), z.unknown()).optional(),\n })\n .optional(),\n});\n\n/**\n * Public Heartbeat view model.\n *\n * Heartbeats are persisted as `Schedule` rows with a dedicated\n * `target.type === 'heartbeat'` variant. The HTTP surface flattens that\n * representation to the fields a user cares about (cron, prompt, threading,\n * status, lifecycle) without exposing the schedule plumbing or internal\n * identifier prefix.\n */\nexport const heartbeatSchema = z.object({\n id: z.string(),\n agentId: z.string(),\n name: z.string().optional(),\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n prompt: z.string(),\n cron: z.string(),\n timezone: z.string().optional(),\n status: z.enum(['active', 'paused']),\n nextFireAt: z.number(),\n lastFireAt: z.number().optional(),\n lastRunId: z.string().optional(),\n lastRun: scheduleRunSummarySchema.optional(),\n signalType: z.string().optional(),\n tagName: z.string().optional(),\n attributes: signalAttributesSchema.optional(),\n ifActive: ifActiveSchema.optional(),\n ifIdle: ifIdleSchema.optional(),\n providerOptions: z.record(z.string(), z.unknown()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\n\nexport const listHeartbeatsResponseSchema = z.object({\n heartbeats: z.array(heartbeatSchema),\n});\n\nexport const listHeartbeatsQuerySchema = z.object({\n agentId: z.string().optional(),\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n name: z.string().optional(),\n});\n\nexport const heartbeatPathParams = z.object({\n heartbeatId: z.string(),\n});\n\n/** Body for POST /heartbeats — creates a heartbeat. */\nexport const createHeartbeatBodySchema = z.object({\n /** Optional stable id; normalized to `hb_<slug>`. A random id is generated when omitted. */\n id: z.string().optional(),\n agentId: z.string(),\n cron: z.string(),\n timezone: z.string().optional(),\n prompt: z.string(),\n name: z.string().optional(),\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n signalType: z.string().optional(),\n tagName: z.string().optional(),\n attributes: signalAttributesSchema.optional(),\n ifActive: ifActiveSchema.optional(),\n ifIdle: ifIdleSchema.optional(),\n providerOptions: z.record(z.string(), z.unknown()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Body for PATCH /heartbeats/:heartbeatId — partial update.\n *\n * `threadId` / `resourceId` are intentionally not editable; they are part of\n * the heartbeat's identity. To re-target, delete and recreate.\n */\nexport const updateHeartbeatBodySchema = z.object({\n cron: z.string().optional(),\n timezone: z.string().optional(),\n prompt: z.string().optional(),\n name: z.string().optional(),\n signalType: z.string().optional(),\n tagName: z.string().optional(),\n attributes: signalAttributesSchema.optional(),\n ifActive: ifActiveSchema.optional(),\n ifIdle: ifIdleSchema.optional(),\n providerOptions: z.record(z.string(), z.unknown()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const deleteHeartbeatResponseSchema = z.object({\n message: z.string(),\n});\n\n/** Response for POST /heartbeats/:heartbeatId/run. */\nexport const runHeartbeatResponseSchema = z.object({\n scheduleId: z.string(),\n claimId: z.string(),\n scheduledFireAt: z.number(),\n});\n\nexport type HeartbeatResponse = z.infer<typeof heartbeatSchema>;\n","import type { Mastra } from '@mastra/core';\nimport { HTTPException } from '../http-exception';\nimport {\n createHeartbeatBodySchema,\n deleteHeartbeatResponseSchema,\n heartbeatPathParams,\n heartbeatSchema,\n listHeartbeatsQuerySchema,\n listHeartbeatsResponseSchema,\n runHeartbeatResponseSchema,\n updateHeartbeatBodySchema,\n} from '../schemas/heartbeats';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\n/**\n * Lazily access `mastra.heartbeats`. The Heartbeats service may not exist on\n * older `@mastra/core` versions; in that case the handler returns 404 so\n * older cores degrade gracefully when paired with this `@mastra/server`.\n */\nfunction getHeartbeats(mastra: Mastra): any {\n const svc = (mastra as unknown as { heartbeats?: unknown }).heartbeats;\n if (!svc) {\n throw new HTTPException(404, { message: 'Heartbeats not supported by this server' });\n }\n return svc;\n}\n\n/**\n * Resolve a heartbeat by its globally-unique `hb_<uuid>` id. Returns 404 for\n * missing rows. Heartbeats are addressed by id (consistent with\n * `/schedules/:scheduleId`); the owning `agentId` is a property, not a key.\n */\nasync function loadHeartbeat(mastra: Mastra, heartbeatId: string) {\n const heartbeats = getHeartbeats(mastra);\n const heartbeat = await heartbeats.get(heartbeatId);\n if (!heartbeat) {\n throw new HTTPException(404, { message: 'Heartbeat not found' });\n }\n return heartbeat;\n}\n\nexport const LIST_HEARTBEATS_ROUTE = createRoute({\n method: 'GET',\n path: '/heartbeats',\n responseType: 'json' as const,\n queryParamSchema: listHeartbeatsQuerySchema,\n responseSchema: listHeartbeatsResponseSchema,\n summary: 'List heartbeats across all agents',\n description: 'Returns the configured heartbeats, optionally filtered by agentId/threadId/resourceId/name.',\n tags: ['Heartbeats'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, threadId, resourceId, name }) => {\n const heartbeats = getHeartbeats(mastra);\n const filter: Record<string, string> = {};\n if (agentId) filter.agentId = agentId;\n if (threadId) filter.threadId = threadId;\n if (resourceId) filter.resourceId = resourceId;\n if (name) filter.name = name;\n const rows = await heartbeats.list(filter);\n return { heartbeats: rows };\n },\n});\n\nexport const GET_HEARTBEAT_ROUTE = createRoute({\n method: 'GET',\n path: '/heartbeats/:heartbeatId',\n responseType: 'json' as const,\n pathParamSchema: heartbeatPathParams,\n responseSchema: heartbeatSchema,\n summary: 'Get a heartbeat by ID',\n description: 'Returns a single heartbeat by its id.',\n tags: ['Heartbeats'],\n requiresAuth: true,\n handler: async ({ mastra, heartbeatId }) => {\n return await loadHeartbeat(mastra, heartbeatId);\n },\n});\n\nexport const CREATE_HEARTBEAT_ROUTE = createRoute({\n method: 'POST',\n path: '/heartbeats',\n responseType: 'json' as const,\n bodySchema: createHeartbeatBodySchema,\n responseSchema: heartbeatSchema,\n summary: 'Create a heartbeat',\n description:\n 'Creates a new heartbeat owned by the agent named in `agentId`. Multiple heartbeats per agent/thread are supported; each gets a random `hb_<uuid>` id. Use `name` to label distinct heartbeats on the same agent/thread.',\n tags: ['Heartbeats'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, ...body }) => {\n // getAgentById throws a MastraError (status 404) when the agent is unknown;\n // translate that into a clean HTTP 404 instead of letting it surface as 500.\n try {\n mastra.getAgentById(agentId);\n } catch {\n throw new HTTPException(404, { message: `Agent \"${agentId}\" not found` });\n }\n const heartbeats = getHeartbeats(mastra);\n return await heartbeats.create({\n agentId,\n cron: body.cron,\n prompt: body.prompt,\n ...(body.id ? { id: body.id } : {}),\n ...(body.name ? { name: body.name } : {}),\n ...(body.timezone ? { timezone: body.timezone } : {}),\n ...(body.threadId ? { threadId: body.threadId } : {}),\n ...(body.resourceId ? { resourceId: body.resourceId } : {}),\n ...(body.signalType ? { signalType: body.signalType } : {}),\n ...(body.tagName ? { tagName: body.tagName } : {}),\n ...(body.attributes ? { attributes: body.attributes } : {}),\n ...(body.ifActive ? { ifActive: body.ifActive } : {}),\n ...(body.ifIdle ? { ifIdle: body.ifIdle } : {}),\n ...(body.providerOptions ? { providerOptions: body.providerOptions } : {}),\n ...(body.metadata ? { metadata: body.metadata } : {}),\n });\n },\n});\n\nexport const UPDATE_HEARTBEAT_ROUTE = createRoute({\n method: 'PATCH',\n path: '/heartbeats/:heartbeatId',\n responseType: 'json' as const,\n pathParamSchema: heartbeatPathParams,\n bodySchema: updateHeartbeatBodySchema,\n responseSchema: heartbeatSchema,\n summary: 'Update a heartbeat',\n description:\n 'Partial update of a heartbeat. `threadId` and `resourceId` are part of the heartbeat identity and cannot be changed — to re-target, delete and recreate. Editing `cron` (or `timezone`) recomputes `nextFireAt`.',\n tags: ['Heartbeats'],\n requiresAuth: true,\n handler: async ({ mastra, heartbeatId, ...body }) => {\n await loadHeartbeat(mastra, heartbeatId);\n const heartbeats = getHeartbeats(mastra);\n return await heartbeats.update(heartbeatId, {\n ...(body.cron !== undefined ? { cron: body.cron } : {}),\n ...(body.timezone !== undefined ? { timezone: body.timezone } : {}),\n ...(body.prompt !== undefined ? { prompt: body.prompt } : {}),\n ...(body.name !== undefined ? { name: body.name } : {}),\n ...(body.signalType !== undefined ? { signalType: body.signalType } : {}),\n ...(body.tagName !== undefined ? { tagName: body.tagName } : {}),\n ...(body.attributes !== undefined ? { attributes: body.attributes } : {}),\n ...(body.ifActive !== undefined ? { ifActive: body.ifActive } : {}),\n ...(body.ifIdle !== undefined ? { ifIdle: body.ifIdle } : {}),\n ...(body.providerOptions !== undefined ? { providerOptions: body.providerOptions } : {}),\n ...(body.metadata !== undefined ? { metadata: body.metadata } : {}),\n });\n },\n});\n\nexport const DELETE_HEARTBEAT_ROUTE = createRoute({\n method: 'DELETE',\n path: '/heartbeats/:heartbeatId',\n responseType: 'json' as const,\n pathParamSchema: heartbeatPathParams,\n responseSchema: deleteHeartbeatResponseSchema,\n summary: 'Delete a heartbeat',\n description: 'Permanently deletes the heartbeat. 404 when the heartbeat does not exist.',\n tags: ['Heartbeats'],\n requiresAuth: true,\n handler: async ({ mastra, heartbeatId }) => {\n await loadHeartbeat(mastra, heartbeatId);\n const heartbeats = getHeartbeats(mastra);\n await heartbeats.delete(heartbeatId);\n return { message: 'Heartbeat deleted' };\n },\n});\n\nexport const PAUSE_HEARTBEAT_ROUTE = createRoute({\n method: 'POST',\n path: '/heartbeats/:heartbeatId/pause',\n responseType: 'json' as const,\n pathParamSchema: heartbeatPathParams,\n responseSchema: heartbeatSchema,\n summary: 'Pause a heartbeat',\n description: 'Marks the heartbeat as paused. The scheduler tick loop will skip paused heartbeats. Idempotent.',\n tags: ['Heartbeats'],\n requiresAuth: true,\n handler: async ({ mastra, heartbeatId }) => {\n await loadHeartbeat(mastra, heartbeatId);\n const heartbeats = getHeartbeats(mastra);\n return await heartbeats.pause(heartbeatId);\n },\n});\n\nexport const RESUME_HEARTBEAT_ROUTE = createRoute({\n method: 'POST',\n path: '/heartbeats/:heartbeatId/resume',\n responseType: 'json' as const,\n pathParamSchema: heartbeatPathParams,\n responseSchema: heartbeatSchema,\n summary: 'Resume a paused heartbeat',\n description:\n 'Marks the heartbeat as active and recomputes nextFireAt from \"now\" so a long-paused heartbeat does not fire a backlog. Idempotent.',\n tags: ['Heartbeats'],\n requiresAuth: true,\n handler: async ({ mastra, heartbeatId }) => {\n await loadHeartbeat(mastra, heartbeatId);\n const heartbeats = getHeartbeats(mastra);\n return await heartbeats.resume(heartbeatId);\n },\n});\n\nexport const RUN_HEARTBEAT_ROUTE = createRoute({\n method: 'POST',\n path: '/heartbeats/:heartbeatId/run',\n responseType: 'json' as const,\n pathParamSchema: heartbeatPathParams,\n responseSchema: runHeartbeatResponseSchema,\n summary: 'Fire a heartbeat now',\n description:\n 'Manually triggers a single heartbeat run out-of-band from the cron schedule. Records a trigger row with `triggerKind: \"manual\"`. Does not advance `nextFireAt`.',\n tags: ['Heartbeats'],\n requiresAuth: true,\n handler: async ({ mastra, heartbeatId }) => {\n await loadHeartbeat(mastra, heartbeatId);\n const heartbeats = getHeartbeats(mastra);\n return await heartbeats.run(heartbeatId);\n },\n});\n"]}