@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.
- package/CHANGELOG.md +20 -0
- package/dist/{chunk-WBIDSMXY.cjs → chunk-2FRRIWFC.cjs} +5 -5
- package/dist/{chunk-WBIDSMXY.cjs.map → chunk-2FRRIWFC.cjs.map} +1 -1
- package/dist/{chunk-2JL7H77C.js → chunk-3AL5MHJ4.js} +3 -3
- package/dist/{chunk-2JL7H77C.js.map → chunk-3AL5MHJ4.js.map} +1 -1
- package/dist/{chunk-DNLWB5BA.js → chunk-3OZRSJHT.js} +3 -3
- package/dist/{chunk-DNLWB5BA.js.map → chunk-3OZRSJHT.js.map} +1 -1
- package/dist/{chunk-EUQCJ3SN.cjs → chunk-4CB2E34E.cjs} +4 -4
- package/dist/{chunk-EUQCJ3SN.cjs.map → chunk-4CB2E34E.cjs.map} +1 -1
- package/dist/{chunk-2Q5WIJZV.js → chunk-BXJTD5TI.js} +201 -11
- package/dist/chunk-BXJTD5TI.js.map +1 -0
- package/dist/{chunk-7SKSYK2D.js → chunk-H7HGHJU4.js} +3 -3
- package/dist/{chunk-7SKSYK2D.js.map → chunk-H7HGHJU4.js.map} +1 -1
- package/dist/{chunk-ONL7ZWVI.cjs → chunk-HIK5MY74.cjs} +201 -11
- package/dist/chunk-HIK5MY74.cjs.map +1 -0
- package/dist/{chunk-QGGP3WXK.cjs → chunk-IR7QQFOC.cjs} +6 -6
- package/dist/{chunk-QGGP3WXK.cjs.map → chunk-IR7QQFOC.cjs.map} +1 -1
- package/dist/{chunk-FCNSMQDH.js → chunk-KSWDXGTC.js} +6 -2
- package/dist/chunk-KSWDXGTC.js.map +1 -0
- package/dist/{chunk-BBHXK342.js → chunk-LQUP63RF.js} +3 -3
- package/dist/{chunk-BBHXK342.js.map → chunk-LQUP63RF.js.map} +1 -1
- package/dist/{chunk-TIHDZ3XY.cjs → chunk-RNDA7UHX.cjs} +4 -4
- package/dist/{chunk-TIHDZ3XY.cjs.map → chunk-RNDA7UHX.cjs.map} +1 -1
- package/dist/{chunk-4L5A2EPP.js → chunk-RQLXTIT5.js} +3 -3
- package/dist/{chunk-4L5A2EPP.js.map → chunk-RQLXTIT5.js.map} +1 -1
- package/dist/{chunk-SXYK7TWT.js → chunk-SIYOW7VK.js} +9 -7
- package/dist/chunk-SIYOW7VK.js.map +1 -0
- package/dist/{chunk-G2D6TV3C.cjs → chunk-SYYT53RO.cjs} +24 -22
- package/dist/chunk-SYYT53RO.cjs.map +1 -0
- package/dist/{chunk-TJFU7MXY.js → chunk-TOPWYUTB.js} +3 -3
- package/dist/{chunk-TJFU7MXY.js.map → chunk-TOPWYUTB.js.map} +1 -1
- package/dist/{chunk-PGBLWTTF.cjs → chunk-WEUZO2Q3.cjs} +6 -6
- package/dist/{chunk-PGBLWTTF.cjs.map → chunk-WEUZO2Q3.cjs.map} +1 -1
- package/dist/{chunk-SFCUH22R.cjs → chunk-XDXODSOG.cjs} +4 -4
- package/dist/{chunk-SFCUH22R.cjs.map → chunk-XDXODSOG.cjs.map} +1 -1
- package/dist/{chunk-T5CMQEZP.cjs → chunk-Z4UBBY2E.cjs} +6 -2
- package/dist/chunk-Z4UBBY2E.cjs.map +1 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/{observational-memory-CIGODMXV-RX4J6TAC.js → observational-memory-7YYZIIX4-CK67BQOD.js} +3 -3
- package/dist/{observational-memory-CIGODMXV-RX4J6TAC.js.map → observational-memory-7YYZIIX4-CK67BQOD.js.map} +1 -1
- package/dist/{observational-memory-CIGODMXV-5QVHS6GP.cjs → observational-memory-7YYZIIX4-IPHEIYJP.cjs} +26 -26
- package/dist/{observational-memory-CIGODMXV-5QVHS6GP.cjs.map → observational-memory-7YYZIIX4-IPHEIYJP.cjs.map} +1 -1
- package/dist/server/browser-stream/index.cjs +5 -0
- package/dist/server/browser-stream/index.cjs.map +1 -1
- package/dist/server/browser-stream/index.js +5 -0
- package/dist/server/browser-stream/index.js.map +1 -1
- package/dist/server/browser-stream/viewer-registry.d.ts.map +1 -1
- package/dist/server/handlers/a2a.cjs +9 -9
- package/dist/server/handlers/a2a.js +1 -1
- package/dist/server/handlers/agent-builder.cjs +16 -16
- package/dist/server/handlers/agent-builder.js +1 -1
- package/dist/server/handlers/agents.cjs +35 -35
- package/dist/server/handlers/agents.d.ts.map +1 -1
- package/dist/server/handlers/agents.js +1 -1
- package/dist/server/handlers/conversations.cjs +5 -5
- package/dist/server/handlers/conversations.js +1 -1
- package/dist/server/handlers/responses.cjs +4 -4
- package/dist/server/handlers/responses.js +1 -1
- package/dist/server/handlers/scores.cjs +7 -7
- package/dist/server/handlers/scores.js +1 -1
- package/dist/server/handlers/tools.cjs +6 -6
- package/dist/server/handlers/tools.js +1 -1
- package/dist/server/handlers/voice.cjs +8 -8
- package/dist/server/handlers/voice.js +1 -1
- package/dist/server/handlers.cjs +16 -16
- package/dist/server/handlers.js +8 -8
- package/dist/server/server-adapter/index.cjs +71 -71
- package/dist/server/server-adapter/index.js +8 -8
- package/package.json +5 -5
- package/dist/chunk-2Q5WIJZV.js.map +0 -1
- package/dist/chunk-FCNSMQDH.js.map +0 -1
- package/dist/chunk-G2D6TV3C.cjs.map +0 -1
- package/dist/chunk-ONL7ZWVI.cjs.map +0 -1
- package/dist/chunk-SXYK7TWT.js.map +0 -1
- package/dist/chunk-T5CMQEZP.cjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getAgentFromSystem } from './chunk-
|
|
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-
|
|
195
|
-
//# sourceMappingURL=chunk-
|
|
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":"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","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-
|
|
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
|
|
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 ? `
|
|
4058
|
-
|
|
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 (
|
|
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
|
|
4215
|
-
const remaining = str.length -
|
|
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]
|
|
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-
|
|
10100
|
-
//# sourceMappingURL=chunk-
|
|
10289
|
+
//# sourceMappingURL=chunk-HIK5MY74.cjs.map
|
|
10290
|
+
//# sourceMappingURL=chunk-HIK5MY74.cjs.map
|