@mastra/server 1.26.0 → 1.27.0-alpha.1

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 (76) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{chunk-WBIDSMXY.cjs → chunk-2FRRIWFC.cjs} +5 -5
  3. package/dist/{chunk-WBIDSMXY.cjs.map → chunk-2FRRIWFC.cjs.map} +1 -1
  4. package/dist/{chunk-2JL7H77C.js → chunk-3AL5MHJ4.js} +3 -3
  5. package/dist/{chunk-2JL7H77C.js.map → chunk-3AL5MHJ4.js.map} +1 -1
  6. package/dist/{chunk-DNLWB5BA.js → chunk-3OZRSJHT.js} +3 -3
  7. package/dist/{chunk-DNLWB5BA.js.map → chunk-3OZRSJHT.js.map} +1 -1
  8. package/dist/{chunk-EUQCJ3SN.cjs → chunk-4CB2E34E.cjs} +4 -4
  9. package/dist/{chunk-EUQCJ3SN.cjs.map → chunk-4CB2E34E.cjs.map} +1 -1
  10. package/dist/{chunk-2Q5WIJZV.js → chunk-BXJTD5TI.js} +201 -11
  11. package/dist/chunk-BXJTD5TI.js.map +1 -0
  12. package/dist/{chunk-7SKSYK2D.js → chunk-H7HGHJU4.js} +3 -3
  13. package/dist/{chunk-7SKSYK2D.js.map → chunk-H7HGHJU4.js.map} +1 -1
  14. package/dist/{chunk-ONL7ZWVI.cjs → chunk-HIK5MY74.cjs} +201 -11
  15. package/dist/chunk-HIK5MY74.cjs.map +1 -0
  16. package/dist/{chunk-QGGP3WXK.cjs → chunk-IR7QQFOC.cjs} +6 -6
  17. package/dist/{chunk-QGGP3WXK.cjs.map → chunk-IR7QQFOC.cjs.map} +1 -1
  18. package/dist/{chunk-FCNSMQDH.js → chunk-KSWDXGTC.js} +6 -2
  19. package/dist/chunk-KSWDXGTC.js.map +1 -0
  20. package/dist/{chunk-BBHXK342.js → chunk-LQUP63RF.js} +3 -3
  21. package/dist/{chunk-BBHXK342.js.map → chunk-LQUP63RF.js.map} +1 -1
  22. package/dist/{chunk-TIHDZ3XY.cjs → chunk-RNDA7UHX.cjs} +4 -4
  23. package/dist/{chunk-TIHDZ3XY.cjs.map → chunk-RNDA7UHX.cjs.map} +1 -1
  24. package/dist/{chunk-4L5A2EPP.js → chunk-RQLXTIT5.js} +3 -3
  25. package/dist/{chunk-4L5A2EPP.js.map → chunk-RQLXTIT5.js.map} +1 -1
  26. package/dist/{chunk-SXYK7TWT.js → chunk-SIYOW7VK.js} +9 -7
  27. package/dist/chunk-SIYOW7VK.js.map +1 -0
  28. package/dist/{chunk-G2D6TV3C.cjs → chunk-SYYT53RO.cjs} +24 -22
  29. package/dist/chunk-SYYT53RO.cjs.map +1 -0
  30. package/dist/{chunk-TJFU7MXY.js → chunk-TOPWYUTB.js} +3 -3
  31. package/dist/{chunk-TJFU7MXY.js.map → chunk-TOPWYUTB.js.map} +1 -1
  32. package/dist/{chunk-PGBLWTTF.cjs → chunk-WEUZO2Q3.cjs} +6 -6
  33. package/dist/{chunk-PGBLWTTF.cjs.map → chunk-WEUZO2Q3.cjs.map} +1 -1
  34. package/dist/{chunk-SFCUH22R.cjs → chunk-XDXODSOG.cjs} +4 -4
  35. package/dist/{chunk-SFCUH22R.cjs.map → chunk-XDXODSOG.cjs.map} +1 -1
  36. package/dist/{chunk-T5CMQEZP.cjs → chunk-Z4UBBY2E.cjs} +6 -2
  37. package/dist/chunk-Z4UBBY2E.cjs.map +1 -0
  38. package/dist/docs/SKILL.md +1 -1
  39. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  40. package/dist/{observational-memory-CIGODMXV-RX4J6TAC.js → observational-memory-7YYZIIX4-CK67BQOD.js} +3 -3
  41. package/dist/{observational-memory-CIGODMXV-RX4J6TAC.js.map → observational-memory-7YYZIIX4-CK67BQOD.js.map} +1 -1
  42. package/dist/{observational-memory-CIGODMXV-5QVHS6GP.cjs → observational-memory-7YYZIIX4-IPHEIYJP.cjs} +26 -26
  43. package/dist/{observational-memory-CIGODMXV-5QVHS6GP.cjs.map → observational-memory-7YYZIIX4-IPHEIYJP.cjs.map} +1 -1
  44. package/dist/server/browser-stream/index.cjs +5 -0
  45. package/dist/server/browser-stream/index.cjs.map +1 -1
  46. package/dist/server/browser-stream/index.js +5 -0
  47. package/dist/server/browser-stream/index.js.map +1 -1
  48. package/dist/server/browser-stream/viewer-registry.d.ts.map +1 -1
  49. package/dist/server/handlers/a2a.cjs +9 -9
  50. package/dist/server/handlers/a2a.js +1 -1
  51. package/dist/server/handlers/agent-builder.cjs +16 -16
  52. package/dist/server/handlers/agent-builder.js +1 -1
  53. package/dist/server/handlers/agents.cjs +35 -35
  54. package/dist/server/handlers/agents.d.ts.map +1 -1
  55. package/dist/server/handlers/agents.js +1 -1
  56. package/dist/server/handlers/conversations.cjs +5 -5
  57. package/dist/server/handlers/conversations.js +1 -1
  58. package/dist/server/handlers/responses.cjs +4 -4
  59. package/dist/server/handlers/responses.js +1 -1
  60. package/dist/server/handlers/scores.cjs +7 -7
  61. package/dist/server/handlers/scores.js +1 -1
  62. package/dist/server/handlers/tools.cjs +6 -6
  63. package/dist/server/handlers/tools.js +1 -1
  64. package/dist/server/handlers/voice.cjs +8 -8
  65. package/dist/server/handlers/voice.js +1 -1
  66. package/dist/server/handlers.cjs +16 -16
  67. package/dist/server/handlers.js +8 -8
  68. package/dist/server/server-adapter/index.cjs +71 -71
  69. package/dist/server/server-adapter/index.js +8 -8
  70. package/package.json +5 -5
  71. package/dist/chunk-2Q5WIJZV.js.map +0 -1
  72. package/dist/chunk-FCNSMQDH.js.map +0 -1
  73. package/dist/chunk-G2D6TV3C.cjs.map +0 -1
  74. package/dist/chunk-ONL7ZWVI.cjs.map +0 -1
  75. package/dist/chunk-SXYK7TWT.js.map +0 -1
  76. package/dist/chunk-T5CMQEZP.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { getAgentFromSystem } from './chunk-FCNSMQDH.js';
1
+ import { getAgentFromSystem } from './chunk-KSWDXGTC.js';
2
2
  import { voiceSpeakersResponseSchema, agentIdPathParams, speakResponseSchema, generateSpeechBodySchema, transcribeSpeechResponseSchema, transcribeSpeechBodySchema, getListenerResponseSchema } from './chunk-CB5KNGCV.js';
3
3
  import { validateBody } from './chunk-VLNRGJEM.js';
4
4
  import { createRoute } from './chunk-KEFOJ6EP.js';
@@ -191,5 +191,5 @@ var GET_LISTENER_ROUTE = createRoute({
191
191
  });
192
192
 
193
193
  export { GENERATE_SPEECH_DEPRECATED_ROUTE, GENERATE_SPEECH_ROUTE, GET_LISTENER_ROUTE, GET_SPEAKERS_DEPRECATED_ROUTE, GET_SPEAKERS_ROUTE, TRANSCRIBE_SPEECH_DEPRECATED_ROUTE, TRANSCRIBE_SPEECH_ROUTE, voice_exports };
194
- //# sourceMappingURL=chunk-7SKSYK2D.js.map
195
- //# sourceMappingURL=chunk-7SKSYK2D.js.map
194
+ //# sourceMappingURL=chunk-H7HGHJU4.js.map
195
+ //# sourceMappingURL=chunk-H7HGHJU4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/handlers/voice.ts"],"names":[],"mappings":"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","file":"chunk-7SKSYK2D.js","sourcesContent":["import { Readable } from 'node:stream';\nimport { MastraError } from '@mastra/core/error';\nimport { HTTPException } from '../http-exception';\nimport {\n agentIdPathParams,\n voiceSpeakersResponseSchema,\n generateSpeechBodySchema,\n speakResponseSchema,\n transcribeSpeechBodySchema,\n transcribeSpeechResponseSchema,\n getListenerResponseSchema,\n} from '../schemas/agents';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { validateBody } from './utils';\n\n// ============================================================================\n// Route Objects\n// ============================================================================\n\nexport const GET_SPEAKERS_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/voice/speakers',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n responseSchema: voiceSpeakersResponseSchema,\n summary: 'Get voice speakers',\n description: 'Returns available voice speakers for the specified agent',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const voice = await agent.getVoice({ requestContext });\n\n const speakers = await Promise.resolve()\n .then(() => voice.getSpeakers())\n .catch(err => {\n if (err instanceof MastraError) {\n // No voice provider configured, return empty array\n return [];\n }\n throw err;\n });\n\n return speakers;\n } catch (error) {\n return handleError(error, 'Error getting speakers');\n }\n },\n});\n\nexport const GET_SPEAKERS_DEPRECATED_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/speakers',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n responseSchema: voiceSpeakersResponseSchema,\n summary: 'Get available speakers for an agent',\n description: '[DEPRECATED] Use /agents/:agentId/voice/speakers instead. Get available speakers for an agent',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: GET_SPEAKERS_ROUTE.handler,\n});\n\nexport const GENERATE_SPEECH_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/voice/speak',\n responseType: 'stream',\n pathParamSchema: agentIdPathParams,\n bodySchema: generateSpeechBodySchema,\n responseSchema: speakResponseSchema,\n summary: 'Generate speech',\n description: 'Generates speech audio from text using the agent voice configuration',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, text, speakerId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n\n validateBody({ text });\n\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const voice = await agent.getVoice({ requestContext });\n\n if (!voice) {\n throw new HTTPException(400, { message: 'Agent does not have voice capabilities' });\n }\n\n const audioStream = await Promise.resolve()\n .then(() => voice.speak(text!, { speaker: speakerId! }))\n .catch(err => {\n if (err instanceof MastraError) {\n throw new HTTPException(400, { message: err.message });\n }\n\n throw err;\n });\n\n if (!audioStream) {\n throw new HTTPException(500, { message: 'Failed to generate speech' });\n }\n\n return audioStream as unknown as ReadableStream<any>;\n } catch (error) {\n return handleError(error, 'Error generating speech');\n }\n },\n});\n\nexport const GENERATE_SPEECH_DEPRECATED_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/speak',\n responseType: 'stream',\n pathParamSchema: agentIdPathParams,\n bodySchema: generateSpeechBodySchema,\n responseSchema: speakResponseSchema,\n summary: 'Convert text to speech',\n description:\n \"[DEPRECATED] Use /agents/:agentId/voice/speak instead. Convert text to speech using the agent's voice provider\",\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: GENERATE_SPEECH_ROUTE.handler,\n});\n\nexport const TRANSCRIBE_SPEECH_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/voice/listen',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n bodySchema: transcribeSpeechBodySchema,\n responseSchema: transcribeSpeechResponseSchema,\n summary: 'Transcribe speech',\n description: 'Transcribes speech audio to text using the agent voice configuration',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, audio, options, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n\n if (!audio) {\n throw new HTTPException(400, { message: 'Audio data is required' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const voice = await agent.getVoice({ requestContext });\n\n if (!voice) {\n throw new HTTPException(400, { message: 'Agent does not have voice capabilities' });\n }\n\n const audioStream = new Readable();\n audioStream.push(audio);\n audioStream.push(null);\n\n const text = await voice.listen(audioStream, options);\n return { text: text as string };\n } catch (error) {\n return handleError(error, 'Error transcribing speech');\n }\n },\n});\n\nexport const TRANSCRIBE_SPEECH_DEPRECATED_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/listen',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n bodySchema: transcribeSpeechBodySchema,\n responseSchema: transcribeSpeechResponseSchema,\n summary: 'Convert speech to text',\n description:\n \"[DEPRECATED] Use /agents/:agentId/voice/listen instead. Convert speech to text using the agent's voice provider. Additional provider-specific options can be passed as query parameters.\",\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: TRANSCRIBE_SPEECH_ROUTE.handler,\n});\n\nexport const GET_LISTENER_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/voice/listener',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n responseSchema: getListenerResponseSchema,\n summary: 'Get voice listener',\n description: 'Returns the voice listener configuration for the agent',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n\n const agent = mastra.getAgentById(agentId);\n\n if (!agent) {\n throw new HTTPException(404, { message: 'Agent not found' });\n }\n\n const voice = await agent.getVoice({ requestContext });\n\n const listeners = await Promise.resolve()\n .then(() => voice.getListener())\n .catch(err => {\n if (err instanceof MastraError) {\n // No voice provider configured\n return { enabled: false };\n }\n throw err;\n });\n\n return listeners;\n } catch (error) {\n return handleError(error, 'Error getting listeners');\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/server/handlers/voice.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,IAAA,aAAA,GAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,gCAAA,EAAA,MAAA,gCAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,kCAAA,EAAA,MAAA,kCAAA;AAAA,EAAA,uBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAsBO,IAAM,qBAAqB,WAAA,CAAY;AAAA,EAC5C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,iCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,cAAA,EAAgB,2BAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,WAAA,EAAa,0DAAA;AAAA,EACb,IAAA,EAAM,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA,EACxB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,gBAAe,KAAM;AACtD,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,wBAAwB,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,QAAQ,MAAM,kBAAA,CAAmB,EAAE,MAAA,EAAQ,SAAS,CAAA;AAE1D,MAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,QAAA,CAAS,EAAE,gBAAgB,CAAA;AAErD,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,OAAA,EAAQ,CACpC,IAAA,CAAK,MAAM,KAAA,CAAM,WAAA,EAAa,CAAA,CAC9B,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,QAAA,IAAI,eAAe,WAAA,EAAa;AAE9B,UAAA,OAAO,EAAC;AAAA,QACV;AACA,QAAA,MAAM,GAAA;AAAA,MACR,CAAC,CAAA;AAEH,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,wBAAwB,CAAA;AAAA,IACpD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,gCAAgC,WAAA,CAAY;AAAA,EACvD,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,2BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,cAAA,EAAgB,2BAAA;AAAA,EAChB,OAAA,EAAS,qCAAA;AAAA,EACT,WAAA,EAAa,+FAAA;AAAA,EACb,IAAA,EAAM,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA,EACxB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,kBAAA,CAAmB;AAC9B,CAAC;AAEM,IAAM,wBAAwB,WAAA,CAAY;AAAA,EAC/C,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,8BAAA;AAAA,EACN,YAAA,EAAc,QAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,UAAA,EAAY,wBAAA;AAAA,EACZ,cAAA,EAAgB,mBAAA;AAAA,EAChB,OAAA,EAAS,iBAAA;AAAA,EACT,WAAA,EAAa,sEAAA;AAAA,EACb,IAAA,EAAM,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA,EACxB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,SAAA,EAAW,gBAAe,KAAM;AACvE,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,wBAAwB,CAAA;AAAA,MAClE;AAEA,MAAA,YAAA,CAAa,EAAE,MAAM,CAAA;AAErB,MAAA,MAAM,QAAQ,MAAM,kBAAA,CAAmB,EAAE,MAAA,EAAQ,SAAS,CAAA;AAE1D,MAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,QAAA,CAAS,EAAE,gBAAgB,CAAA;AAErD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,0CAA0C,CAAA;AAAA,MACpF;AAEA,MAAA,MAAM,cAAc,MAAM,OAAA,CAAQ,OAAA,EAAQ,CACvC,KAAK,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,EAAO,EAAE,OAAA,EAAS,SAAA,EAAY,CAAC,CAAA,CACtD,MAAM,CAAA,GAAA,KAAO;AACZ,QAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,UAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA;AAAA,QACvD;AAEA,QAAA,MAAM,GAAA;AAAA,MACR,CAAC,CAAA;AAEH,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,6BAA6B,CAAA;AAAA,MACvE;AAEA,MAAA,OAAO,WAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,yBAAyB,CAAA;AAAA,IACrD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,mCAAmC,WAAA,CAAY;AAAA,EAC1D,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,wBAAA;AAAA,EACN,YAAA,EAAc,QAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,UAAA,EAAY,wBAAA;AAAA,EACZ,cAAA,EAAgB,mBAAA;AAAA,EAChB,OAAA,EAAS,wBAAA;AAAA,EACT,WAAA,EACE,gHAAA;AAAA,EACF,IAAA,EAAM,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA,EACxB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,qBAAA,CAAsB;AACjC,CAAC;AAEM,IAAM,0BAA0B,WAAA,CAAY;AAAA,EACjD,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,+BAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,UAAA,EAAY,0BAAA;AAAA,EACZ,cAAA,EAAgB,8BAAA;AAAA,EAChB,OAAA,EAAS,mBAAA;AAAA,EACT,WAAA,EAAa,sEAAA;AAAA,EACb,IAAA,EAAM,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA,EACxB,YAAA,EAAc,IAAA;AAAA,EACd,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,SAAS,KAAA,EAAO,OAAA,EAAS,gBAAe,KAAM;AACtE,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,wBAAwB,CAAA;AAAA,MAClE;AAEA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,0BAA0B,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,QAAQ,MAAM,kBAAA,CAAmB,EAAE,MAAA,EAAQ,SAAS,CAAA;AAE1D,MAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,QAAA,CAAS,EAAE,gBAAgB,CAAA;AAErD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,0CAA0C,CAAA;AAAA,MACpF;AAEA,MAAA,MAAM,WAAA,GAAc,IAAI,QAAA,EAAS;AACjC,MAAA,WAAA,CAAY,KAAK,KAAK,CAAA;AACtB,MAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAErB,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,MAAA,CAAO,aAAa,OAAO,CAAA;AACpD,MAAA,OAAO,EAAE,IAAA,EAAqB;AAAA,IAChC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,2BAA2B,CAAA;AAAA,IACvD;AAAA,EACF;AACF,CAAC;AAEM,IAAM,qCAAqC,WAAA,CAAY;AAAA,EAC5D,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,yBAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,UAAA,EAAY,0BAAA;AAAA,EACZ,cAAA,EAAgB,8BAAA;AAAA,EAChB,OAAA,EAAS,wBAAA;AAAA,EACT,WAAA,EACE,0LAAA;AAAA,EACF,IAAA,EAAM,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA,EACxB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,uBAAA,CAAwB;AACnC,CAAC;AAEM,IAAM,qBAAqB,WAAA,CAAY;AAAA,EAC5C,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,iCAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,cAAA,EAAgB,yBAAA;AAAA,EAChB,OAAA,EAAS,oBAAA;AAAA,EACT,WAAA,EAAa,wDAAA;AAAA,EACb,IAAA,EAAM,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA,EACxB,YAAA,EAAc,IAAA;AAAA,EACd,SAAS,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,gBAAe,KAAM;AACtD,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,wBAAwB,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA;AAEzC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,OAAA,EAAS,mBAAmB,CAAA;AAAA,MAC7D;AAEA,MAAA,MAAM,QAAQ,MAAM,KAAA,CAAM,QAAA,CAAS,EAAE,gBAAgB,CAAA;AAErD,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,OAAA,EAAQ,CACrC,IAAA,CAAK,MAAM,KAAA,CAAM,WAAA,EAAa,CAAA,CAC9B,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,QAAA,IAAI,eAAe,WAAA,EAAa;AAE9B,UAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,QAC1B;AACA,QAAA,MAAM,GAAA;AAAA,MACR,CAAC,CAAA;AAEH,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,WAAA,CAAY,OAAO,yBAAyB,CAAA;AAAA,IACrD;AAAA,EACF;AACF,CAAC","file":"chunk-H7HGHJU4.js","sourcesContent":["import { Readable } from 'node:stream';\nimport { MastraError } from '@mastra/core/error';\nimport { HTTPException } from '../http-exception';\nimport {\n agentIdPathParams,\n voiceSpeakersResponseSchema,\n generateSpeechBodySchema,\n speakResponseSchema,\n transcribeSpeechBodySchema,\n transcribeSpeechResponseSchema,\n getListenerResponseSchema,\n} from '../schemas/agents';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { getAgentFromSystem } from './agents';\nimport { handleError } from './error';\nimport { validateBody } from './utils';\n\n// ============================================================================\n// Route Objects\n// ============================================================================\n\nexport const GET_SPEAKERS_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/voice/speakers',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n responseSchema: voiceSpeakersResponseSchema,\n summary: 'Get voice speakers',\n description: 'Returns available voice speakers for the specified agent',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const voice = await agent.getVoice({ requestContext });\n\n const speakers = await Promise.resolve()\n .then(() => voice.getSpeakers())\n .catch(err => {\n if (err instanceof MastraError) {\n // No voice provider configured, return empty array\n return [];\n }\n throw err;\n });\n\n return speakers;\n } catch (error) {\n return handleError(error, 'Error getting speakers');\n }\n },\n});\n\nexport const GET_SPEAKERS_DEPRECATED_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/speakers',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n responseSchema: voiceSpeakersResponseSchema,\n summary: 'Get available speakers for an agent',\n description: '[DEPRECATED] Use /agents/:agentId/voice/speakers instead. Get available speakers for an agent',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: GET_SPEAKERS_ROUTE.handler,\n});\n\nexport const GENERATE_SPEECH_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/voice/speak',\n responseType: 'stream',\n pathParamSchema: agentIdPathParams,\n bodySchema: generateSpeechBodySchema,\n responseSchema: speakResponseSchema,\n summary: 'Generate speech',\n description: 'Generates speech audio from text using the agent voice configuration',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, text, speakerId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n\n validateBody({ text });\n\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const voice = await agent.getVoice({ requestContext });\n\n if (!voice) {\n throw new HTTPException(400, { message: 'Agent does not have voice capabilities' });\n }\n\n const audioStream = await Promise.resolve()\n .then(() => voice.speak(text!, { speaker: speakerId! }))\n .catch(err => {\n if (err instanceof MastraError) {\n throw new HTTPException(400, { message: err.message });\n }\n\n throw err;\n });\n\n if (!audioStream) {\n throw new HTTPException(500, { message: 'Failed to generate speech' });\n }\n\n return audioStream as unknown as ReadableStream<any>;\n } catch (error) {\n return handleError(error, 'Error generating speech');\n }\n },\n});\n\nexport const GENERATE_SPEECH_DEPRECATED_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/speak',\n responseType: 'stream',\n pathParamSchema: agentIdPathParams,\n bodySchema: generateSpeechBodySchema,\n responseSchema: speakResponseSchema,\n summary: 'Convert text to speech',\n description:\n \"[DEPRECATED] Use /agents/:agentId/voice/speak instead. Convert text to speech using the agent's voice provider\",\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: GENERATE_SPEECH_ROUTE.handler,\n});\n\nexport const TRANSCRIBE_SPEECH_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/voice/listen',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n bodySchema: transcribeSpeechBodySchema,\n responseSchema: transcribeSpeechResponseSchema,\n summary: 'Transcribe speech',\n description: 'Transcribes speech audio to text using the agent voice configuration',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, audio, options, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n\n if (!audio) {\n throw new HTTPException(400, { message: 'Audio data is required' });\n }\n\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const voice = await agent.getVoice({ requestContext });\n\n if (!voice) {\n throw new HTTPException(400, { message: 'Agent does not have voice capabilities' });\n }\n\n const audioStream = new Readable();\n audioStream.push(audio);\n audioStream.push(null);\n\n const text = await voice.listen(audioStream, options);\n return { text: text as string };\n } catch (error) {\n return handleError(error, 'Error transcribing speech');\n }\n },\n});\n\nexport const TRANSCRIBE_SPEECH_DEPRECATED_ROUTE = createRoute({\n method: 'POST',\n path: '/agents/:agentId/listen',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n bodySchema: transcribeSpeechBodySchema,\n responseSchema: transcribeSpeechResponseSchema,\n summary: 'Convert speech to text',\n description:\n \"[DEPRECATED] Use /agents/:agentId/voice/listen instead. Convert speech to text using the agent's voice provider. Additional provider-specific options can be passed as query parameters.\",\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: TRANSCRIBE_SPEECH_ROUTE.handler,\n});\n\nexport const GET_LISTENER_ROUTE = createRoute({\n method: 'GET',\n path: '/agents/:agentId/voice/listener',\n responseType: 'json',\n pathParamSchema: agentIdPathParams,\n responseSchema: getListenerResponseSchema,\n summary: 'Get voice listener',\n description: 'Returns the voice listener configuration for the agent',\n tags: ['Agents', 'Voice'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, requestContext }) => {\n try {\n if (!agentId) {\n throw new HTTPException(400, { message: 'Agent ID is required' });\n }\n\n const agent = mastra.getAgentById(agentId);\n\n if (!agent) {\n throw new HTTPException(404, { message: 'Agent not found' });\n }\n\n const voice = await agent.getVoice({ requestContext });\n\n const listeners = await Promise.resolve()\n .then(() => voice.getListener())\n .catch(err => {\n if (err instanceof MastraError) {\n // No voice provider configured\n return { enabled: false };\n }\n throw err;\n });\n\n return listeners;\n } catch (error) {\n return handleError(error, 'Error getting listeners');\n }\n },\n});\n"]}
@@ -1042,7 +1042,7 @@ function imageSize(input) {
1042
1042
  throw new TypeError(`unsupported file type: ${type}`);
1043
1043
  }
1044
1044
 
1045
- // ../memory/dist/chunk-OOA4C7IX.js
1045
+ // ../memory/dist/chunk-MPBMHIAQ.js
1046
1046
  var OM_DEBUG_LOG = process.env.OM_DEBUG ? path.join(process.cwd(), "om-debug.log") : null;
1047
1047
  function omDebug(msg) {
1048
1048
  if (!OM_DEBUG_LOG) return;
@@ -1399,6 +1399,67 @@ ${gap}
1399
1399
  result += withInlineDates.slice(lastIndex);
1400
1400
  return result;
1401
1401
  }
1402
+ var MIN_TEMPORAL_GAP_MS = 10 * 60 * 1e3;
1403
+ function formatTemporalGap(diffMs) {
1404
+ if (diffMs < MIN_TEMPORAL_GAP_MS) return null;
1405
+ const minute = 60 * 1e3;
1406
+ const hour = 60 * minute;
1407
+ const day = 24 * hour;
1408
+ const week = 7 * day;
1409
+ const month = 30 * day;
1410
+ const year = 365 * day;
1411
+ const formatUnit = (value, unit) => `${value} ${unit}${value === 1 ? "" : "s"}`;
1412
+ if (diffMs < hour) {
1413
+ const minutes = Math.max(1, Math.round(diffMs / minute));
1414
+ return `${formatUnit(minutes, "minute")} later`;
1415
+ }
1416
+ const formatTwoUnits = (primaryMs, primaryUnit, secondaryMs, secondaryUnit) => {
1417
+ const primary = Math.floor(diffMs / primaryMs);
1418
+ const remainder = diffMs - primary * primaryMs;
1419
+ const secondary = Math.floor(remainder / secondaryMs);
1420
+ const parts = [formatUnit(primary, primaryUnit)];
1421
+ if (secondary > 0) {
1422
+ parts.push(formatUnit(secondary, secondaryUnit));
1423
+ }
1424
+ return `${parts.join(" ")} later`;
1425
+ };
1426
+ if (diffMs < day) {
1427
+ return formatTwoUnits(hour, "hour", minute, "minute");
1428
+ }
1429
+ if (diffMs < week) {
1430
+ return formatTwoUnits(day, "day", hour, "hour");
1431
+ }
1432
+ if (diffMs < month) {
1433
+ return formatTwoUnits(week, "week", day, "day");
1434
+ }
1435
+ if (diffMs < year) {
1436
+ return formatTwoUnits(month, "month", week, "week");
1437
+ }
1438
+ return formatTwoUnits(year, "year", month, "month");
1439
+ }
1440
+ function formatTemporalTimestamp(date) {
1441
+ return date.toLocaleString("en-US", {
1442
+ year: "numeric",
1443
+ month: "2-digit",
1444
+ day: "2-digit",
1445
+ hour: "numeric",
1446
+ minute: "2-digit",
1447
+ hour12: true,
1448
+ timeZoneName: "short"
1449
+ });
1450
+ }
1451
+ function getMessagePartTimestamp(msg, position) {
1452
+ const timestamps = msg.content?.parts?.map((part) => "createdAt" in part ? part.createdAt : void 0).filter((timestamp) => typeof timestamp === "number");
1453
+ if (timestamps && timestamps.length > 0) {
1454
+ const index = position === "first" ? 0 : timestamps.length - 1;
1455
+ const timestamp = timestamps[index];
1456
+ if (timestamp !== void 0) return timestamp;
1457
+ }
1458
+ return new Date(msg.createdAt).getTime();
1459
+ }
1460
+ function isTemporalGapMarker(msg) {
1461
+ return msg.id.startsWith("__temporal_");
1462
+ }
1402
1463
  function createObservationStartMarker(params) {
1403
1464
  return {
1404
1465
  type: "data-om-observation-start",
@@ -3437,6 +3498,13 @@ function stripEphemeralAnchorIds(observations) {
3437
3498
  }
3438
3499
  return observations.replace(/(^|\n)([^\S\n]*)\[(O\d+(?:-N\d+)?)\][^\S\n]*/g, "$1$2");
3439
3500
  }
3501
+ function safeSlice(str, end) {
3502
+ if (end <= 0) return "";
3503
+ if (end >= str.length) return str;
3504
+ const code = str.charCodeAt(end - 1);
3505
+ const safeEnd = code >= 55296 && code <= 56319 ? end - 1 : end;
3506
+ return str.slice(0, safeEnd);
3507
+ }
3440
3508
  var ENCRYPTED_CONTENT_KEY = "encryptedContent";
3441
3509
  var ENCRYPTED_CONTENT_REDACTION_THRESHOLD = 256;
3442
3510
  var DEFAULT_OBSERVER_TOOL_RESULT_MAX_TOKENS = 1e4;
@@ -3502,7 +3570,7 @@ function truncateStringByTokens(text, maxTokens) {
3502
3570
  return text;
3503
3571
  }
3504
3572
  const buildCandidate = (sliceEnd) => {
3505
- const visible = text.slice(0, sliceEnd);
3573
+ const visible = safeSlice(text, sliceEnd);
3506
3574
  return `${visible}
3507
3575
  ... [truncated ~${totalTokens - estimateTokenCount(visible)} tokens]`;
3508
3576
  };
@@ -4054,8 +4122,11 @@ function formatObserverAttachmentPlaceholder(part, counter) {
4054
4122
  return label ? `[${attachmentType} #${attachmentId}: ${label}]` : `[${attachmentType} #${attachmentId}]`;
4055
4123
  }
4056
4124
  function formatObserverPartLine(title, body, time, previousTime) {
4057
- const timeLabel = time && time !== previousTime ? ` (${time})` : "";
4058
- return `${title}${timeLabel}: ${body}`;
4125
+ const timeLabel = time && time !== previousTime ? `(${time})` : "";
4126
+ if (!title) {
4127
+ return timeLabel ? `${timeLabel}: ${body}` : body;
4128
+ }
4129
+ return `${title}${timeLabel ? ` ${timeLabel}` : ""}: ${body}`;
4059
4130
  }
4060
4131
  function normalizeObserverCreatedAt(createdAt) {
4061
4132
  if (createdAt instanceof Date) {
@@ -4091,6 +4162,16 @@ function formatObserverLines(lines, context = {}) {
4091
4162
  context: { previousDate, previousTime }
4092
4163
  };
4093
4164
  }
4165
+ function getTemporalGapMarkerText(msg) {
4166
+ const metadata = typeof msg.content === "object" && msg.content && "metadata" in msg.content ? msg.content.metadata : void 0;
4167
+ if (metadata?.reminderType === "temporal-gap" && typeof metadata.gapText === "string") {
4168
+ return metadata.gapText;
4169
+ }
4170
+ if (typeof metadata?.systemReminder === "object" && metadata.systemReminder && "type" in metadata.systemReminder && metadata.systemReminder.type === "temporal-gap" && "gapText" in metadata.systemReminder && typeof metadata.systemReminder.gapText === "string") {
4171
+ return metadata.systemReminder.gapText;
4172
+ }
4173
+ return void 0;
4174
+ }
4094
4175
  function formatObserverMessage(msg, counter, options) {
4095
4176
  const maxLen = options?.maxPartLength;
4096
4177
  const maxToolResultTokens = options?.maxToolResultTokens ?? DEFAULT_OBSERVER_TOOL_RESULT_MAX_TOKENS;
@@ -4098,6 +4179,7 @@ function formatObserverMessage(msg, counter, options) {
4098
4179
  const attachments = [];
4099
4180
  const messageCreatedAt = normalizeObserverCreatedAt(msg.createdAt);
4100
4181
  let lines = [];
4182
+ const temporalGapText = isTemporalGapMarker(msg) ? getTemporalGapMarkerText(msg) : void 0;
4101
4183
  const pushLine = (title, body, createdAt) => {
4102
4184
  if (!body) {
4103
4185
  return;
@@ -4110,7 +4192,9 @@ function formatObserverMessage(msg, counter, options) {
4110
4192
  body
4111
4193
  });
4112
4194
  };
4113
- if (typeof msg.content === "string") {
4195
+ if (temporalGapText) {
4196
+ pushLine("", temporalGapText, messageCreatedAt);
4197
+ } else if (typeof msg.content === "string") {
4114
4198
  pushLine(role, maybeTruncate(msg.content, maxLen), messageCreatedAt);
4115
4199
  } else if (msg.content?.parts && Array.isArray(msg.content.parts) && msg.content.parts.length > 0) {
4116
4200
  msg.content.parts.forEach((part) => {
@@ -4211,8 +4295,8 @@ function buildObserverHistoryMessage(messages, options) {
4211
4295
  }
4212
4296
  function maybeTruncate(str, maxLen) {
4213
4297
  if (!maxLen || str.length <= maxLen) return str;
4214
- const truncated = str.slice(0, maxLen);
4215
- const remaining = str.length - maxLen;
4298
+ const truncated = safeSlice(str, maxLen);
4299
+ const remaining = str.length - truncated.length;
4216
4300
  return `${truncated}
4217
4301
  ... [truncated ${remaining} characters]`;
4218
4302
  }
@@ -4516,7 +4600,7 @@ function sanitizeObservationLines(observations) {
4516
4600
  let changed = false;
4517
4601
  for (let i = 0; i < lines.length; i++) {
4518
4602
  if (lines[i].length > MAX_OBSERVATION_LINE_CHARS) {
4519
- lines[i] = lines[i].slice(0, MAX_OBSERVATION_LINE_CHARS) + " \u2026 [truncated]";
4603
+ lines[i] = safeSlice(lines[i], MAX_OBSERVATION_LINE_CHARS) + " \u2026 [truncated]";
4520
4604
  changed = true;
4521
4605
  }
4522
4606
  }
@@ -9847,6 +9931,106 @@ ${grouped}` : grouped;
9847
9931
  });
9848
9932
  }
9849
9933
  };
9934
+ var TEMPORAL_GAP_REMINDER_TYPE = "temporal-gap";
9935
+ function getTemporalGapReminderText(gapText, timestamp) {
9936
+ return `${gapText} \u2014 ${formatTemporalTimestamp(new Date(timestamp))}`;
9937
+ }
9938
+ function getTemporalGapReminderMetadata(message, gapText, gapMs, timestamp) {
9939
+ const formattedTimestamp = formatTemporalTimestamp(new Date(timestamp));
9940
+ return {
9941
+ reminderType: TEMPORAL_GAP_REMINDER_TYPE,
9942
+ gapText,
9943
+ gapMs,
9944
+ timestamp: formattedTimestamp,
9945
+ timestampMs: timestamp,
9946
+ precedesMessageId: message.id,
9947
+ systemReminder: {
9948
+ type: TEMPORAL_GAP_REMINDER_TYPE,
9949
+ message: getTemporalGapReminderText(gapText, timestamp),
9950
+ gapText,
9951
+ gapMs,
9952
+ timestamp: formattedTimestamp,
9953
+ timestampMs: timestamp,
9954
+ precedesMessageId: message.id
9955
+ }
9956
+ };
9957
+ }
9958
+ function isTemporalGapMarkerForMessage(message, targetMessageId) {
9959
+ if (!isTemporalGapMarker(message)) {
9960
+ return false;
9961
+ }
9962
+ const metadata = message.content.metadata;
9963
+ if (metadata?.precedesMessageId === targetMessageId) {
9964
+ return true;
9965
+ }
9966
+ return metadata?.systemReminder?.type === TEMPORAL_GAP_REMINDER_TYPE && metadata.systemReminder.precedesMessageId === targetMessageId;
9967
+ }
9968
+ function createTemporalGapMarker(message, gapText, gapMs, timestamp) {
9969
+ const metadata = getTemporalGapReminderMetadata(message, gapText, gapMs, timestamp);
9970
+ return {
9971
+ id: `__temporal_gap_${crypto.randomUUID()}`,
9972
+ role: "user",
9973
+ createdAt: new Date(timestamp - 1),
9974
+ threadId: message.threadId,
9975
+ resourceId: message.resourceId,
9976
+ content: {
9977
+ format: 2,
9978
+ parts: [
9979
+ {
9980
+ type: "text",
9981
+ text: `<system-reminder type="${TEMPORAL_GAP_REMINDER_TYPE}" precedesMessageId="${message.id}">${getTemporalGapReminderText(gapText, timestamp)}</system-reminder>`
9982
+ }
9983
+ ],
9984
+ metadata
9985
+ }
9986
+ };
9987
+ }
9988
+ async function insertTemporalGapMarkers({
9989
+ messageList,
9990
+ writer
9991
+ }) {
9992
+ const inputMessages = messageList.get.input.db().filter((message) => Boolean(message));
9993
+ const latestInputMessage = inputMessages.at(-1);
9994
+ if (!latestInputMessage || isTemporalGapMarker(latestInputMessage)) {
9995
+ return;
9996
+ }
9997
+ const allMessages = messageList.get.all.db().filter((message) => Boolean(message));
9998
+ const latestInputIndex = allMessages.findIndex((message) => message.id === latestInputMessage.id);
9999
+ if (latestInputIndex <= 0) {
10000
+ return;
10001
+ }
10002
+ if (allMessages.some((message) => isTemporalGapMarkerForMessage(message, latestInputMessage.id))) {
10003
+ return;
10004
+ }
10005
+ let previousNonMarker;
10006
+ for (let index = latestInputIndex - 1; index >= 0; index--) {
10007
+ const candidate = allMessages[index];
10008
+ if (candidate && !isTemporalGapMarker(candidate)) {
10009
+ previousNonMarker = candidate;
10010
+ break;
10011
+ }
10012
+ }
10013
+ if (!previousNonMarker) {
10014
+ return;
10015
+ }
10016
+ const timestamp = getMessagePartTimestamp(latestInputMessage, "first");
10017
+ const gapMs = timestamp - getMessagePartTimestamp(previousNonMarker, "last");
10018
+ const gapText = formatTemporalGap(gapMs);
10019
+ if (!gapText) {
10020
+ return;
10021
+ }
10022
+ const reminderMetadata = getTemporalGapReminderMetadata(latestInputMessage, gapText, gapMs, timestamp);
10023
+ await writer?.custom({
10024
+ type: "data-system-reminder",
10025
+ data: {
10026
+ message: getTemporalGapReminderText(gapText, timestamp),
10027
+ ...reminderMetadata
10028
+ },
10029
+ transient: true
10030
+ });
10031
+ const marker = createTemporalGapMarker(latestInputMessage, gapText, gapMs, timestamp);
10032
+ messageList.add(marker, "input");
10033
+ }
9850
10034
  function getOmObservabilityContext(args) {
9851
10035
  if (!args.tracing || !args.tracingContext || !args.loggerVNext || !args.metrics) {
9852
10036
  return void 0;
@@ -9869,11 +10053,14 @@ var ObservationalMemoryProcessor = class {
9869
10053
  engine;
9870
10054
  /** Memory instance for loading context. */
9871
10055
  memory;
10056
+ /** Whether temporal-gap reminder markers should be inserted. */
10057
+ temporalMarkers;
9872
10058
  /** Active turn — created on first processInputStep, ended on processOutputResult. */
9873
10059
  turn;
9874
- constructor(engine, memory) {
10060
+ constructor(engine, memory, options) {
9875
10061
  this.engine = engine;
9876
10062
  this.memory = memory;
10063
+ this.temporalMarkers = options?.temporalMarkers ?? false;
9877
10064
  }
9878
10065
  // ─── Processor lifecycle hooks ──────────────────────────────────────────
9879
10066
  async processInputStep(args) {
@@ -9932,6 +10119,9 @@ var ObservationalMemoryProcessor = class {
9932
10119
  this.turn.writer = writer;
9933
10120
  this.turn.requestContext = requestContext;
9934
10121
  await this.turn.start(this.memory);
10122
+ if (stepNumber === 0 && this.temporalMarkers) {
10123
+ await insertTemporalGapMarkers({ messageList, writer });
10124
+ }
9935
10125
  state.__omTurn = this.turn;
9936
10126
  }
9937
10127
  const observabilityContext = getOmObservabilityContext(args);
@@ -10096,5 +10286,5 @@ exports.stripEphemeralAnchorIds = stripEphemeralAnchorIds;
10096
10286
  exports.stripObservationGroups = stripObservationGroups;
10097
10287
  exports.truncateStringByTokens = truncateStringByTokens;
10098
10288
  exports.wrapInObservationGroup = wrapInObservationGroup;
10099
- //# sourceMappingURL=chunk-ONL7ZWVI.cjs.map
10100
- //# sourceMappingURL=chunk-ONL7ZWVI.cjs.map
10289
+ //# sourceMappingURL=chunk-HIK5MY74.cjs.map
10290
+ //# sourceMappingURL=chunk-HIK5MY74.cjs.map