@mastra/server 1.26.1-alpha.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 (174) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/{chunk-PIF6BJCN.cjs → chunk-2FRRIWFC.cjs} +9 -9
  3. package/dist/{chunk-PIF6BJCN.cjs.map → chunk-2FRRIWFC.cjs.map} +1 -1
  4. package/dist/{chunk-TEE45LZB.js → chunk-2GVTUHUO.js} +4 -4
  5. package/dist/{chunk-TEE45LZB.js.map → chunk-2GVTUHUO.js.map} +1 -1
  6. package/dist/{chunk-YRTZGGKQ.cjs → chunk-2THJ6ADC.cjs} +49 -49
  7. package/dist/{chunk-YRTZGGKQ.cjs.map → chunk-2THJ6ADC.cjs.map} +1 -1
  8. package/dist/{chunk-VX2KJFOW.js → chunk-3AL5MHJ4.js} +4 -4
  9. package/dist/{chunk-VX2KJFOW.js.map → chunk-3AL5MHJ4.js.map} +1 -1
  10. package/dist/{chunk-3ACZ2AKY.js → chunk-3OZRSJHT.js} +6 -6
  11. package/dist/{chunk-3ACZ2AKY.js.map → chunk-3OZRSJHT.js.map} +1 -1
  12. package/dist/{chunk-H3SXVQYW.cjs → chunk-44HBA2O4.cjs} +3 -3
  13. package/dist/{chunk-H3SXVQYW.cjs.map → chunk-44HBA2O4.cjs.map} +1 -1
  14. package/dist/{chunk-XH2V4AVS.js → chunk-4B22X3FH.js} +5 -5
  15. package/dist/{chunk-XH2V4AVS.js.map → chunk-4B22X3FH.js.map} +1 -1
  16. package/dist/{chunk-UM72OD3E.cjs → chunk-4CB2E34E.cjs} +5 -5
  17. package/dist/{chunk-UM72OD3E.cjs.map → chunk-4CB2E34E.cjs.map} +1 -1
  18. package/dist/{chunk-KSARJEHH.cjs → chunk-4LVIBP3H.cjs} +4 -4
  19. package/dist/{chunk-KSARJEHH.cjs.map → chunk-4LVIBP3H.cjs.map} +1 -1
  20. package/dist/{chunk-D7P775NV.cjs → chunk-6CI3CSK4.cjs} +3 -3
  21. package/dist/{chunk-D7P775NV.cjs.map → chunk-6CI3CSK4.cjs.map} +1 -1
  22. package/dist/{chunk-FFSD7OV7.cjs → chunk-6CJWWTVS.cjs} +8 -8
  23. package/dist/{chunk-FFSD7OV7.cjs.map → chunk-6CJWWTVS.cjs.map} +1 -1
  24. package/dist/{chunk-WBHTWSW7.js → chunk-6P6HIITF.js} +4 -4
  25. package/dist/{chunk-WBHTWSW7.js.map → chunk-6P6HIITF.js.map} +1 -1
  26. package/dist/{chunk-BLYICPLO.cjs → chunk-75W2MUNS.cjs} +38 -38
  27. package/dist/{chunk-BLYICPLO.cjs.map → chunk-75W2MUNS.cjs.map} +1 -1
  28. package/dist/{chunk-PDEIYN7Y.cjs → chunk-7KKKNNRH.cjs} +3 -3
  29. package/dist/{chunk-PDEIYN7Y.cjs.map → chunk-7KKKNNRH.cjs.map} +1 -1
  30. package/dist/{chunk-TTZI2Z25.js → chunk-7LVLRIR6.js} +5 -5
  31. package/dist/{chunk-TTZI2Z25.js.map → chunk-7LVLRIR6.js.map} +1 -1
  32. package/dist/{chunk-V3HMHVKU.js → chunk-7UQ6VG3C.js} +3 -3
  33. package/dist/{chunk-V3HMHVKU.js.map → chunk-7UQ6VG3C.js.map} +1 -1
  34. package/dist/{chunk-24SW3KB3.js → chunk-B5VM3A53.js} +3 -3
  35. package/dist/{chunk-24SW3KB3.js.map → chunk-B5VM3A53.js.map} +1 -1
  36. package/dist/{chunk-O5XIJDN3.cjs → chunk-B65LZWBE.cjs} +3 -3
  37. package/dist/{chunk-O5XIJDN3.cjs.map → chunk-B65LZWBE.cjs.map} +1 -1
  38. package/dist/{chunk-2Q4IAQP6.cjs → chunk-B7SBAXEP.cjs} +7 -7
  39. package/dist/{chunk-2Q4IAQP6.cjs.map → chunk-B7SBAXEP.cjs.map} +1 -1
  40. package/dist/{chunk-GELMHP5G.js → chunk-BUDY5TFR.js} +3 -3
  41. package/dist/{chunk-GELMHP5G.js.map → chunk-BUDY5TFR.js.map} +1 -1
  42. package/dist/{chunk-2Q5WIJZV.js → chunk-BXJTD5TI.js} +201 -11
  43. package/dist/chunk-BXJTD5TI.js.map +1 -0
  44. package/dist/{chunk-KBJI2ZGO.js → chunk-C4NU6EHX.js} +3 -3
  45. package/dist/{chunk-KBJI2ZGO.js.map → chunk-C4NU6EHX.js.map} +1 -1
  46. package/dist/{chunk-O4TXCSGQ.cjs → chunk-CDSA5YUY.cjs} +4 -4
  47. package/dist/{chunk-O4TXCSGQ.cjs.map → chunk-CDSA5YUY.cjs.map} +1 -1
  48. package/dist/{chunk-2DNSABMG.cjs → chunk-DNY4PR4R.cjs} +3 -3
  49. package/dist/{chunk-2DNSABMG.cjs.map → chunk-DNY4PR4R.cjs.map} +1 -1
  50. package/dist/{chunk-LCGUC3UL.cjs → chunk-FTQRGT3E.cjs} +3 -3
  51. package/dist/{chunk-LCGUC3UL.cjs.map → chunk-FTQRGT3E.cjs.map} +1 -1
  52. package/dist/{chunk-7I34BNA3.js → chunk-H7HGHJU4.js} +5 -5
  53. package/dist/{chunk-7I34BNA3.js.map → chunk-H7HGHJU4.js.map} +1 -1
  54. package/dist/{chunk-ONL7ZWVI.cjs → chunk-HIK5MY74.cjs} +201 -11
  55. package/dist/chunk-HIK5MY74.cjs.map +1 -0
  56. package/dist/{chunk-TB5T5EIJ.cjs → chunk-IR7QQFOC.cjs} +7 -7
  57. package/dist/{chunk-TB5T5EIJ.cjs.map → chunk-IR7QQFOC.cjs.map} +1 -1
  58. package/dist/{chunk-IBK77L63.js → chunk-IT6MRNKH.js} +3 -3
  59. package/dist/{chunk-IBK77L63.js.map → chunk-IT6MRNKH.js.map} +1 -1
  60. package/dist/{chunk-MLJVCFJQ.js → chunk-KSWDXGTC.js} +11 -7
  61. package/dist/chunk-KSWDXGTC.js.map +1 -0
  62. package/dist/{chunk-TZF2SAX5.js → chunk-LQUP63RF.js} +6 -6
  63. package/dist/{chunk-TZF2SAX5.js.map → chunk-LQUP63RF.js.map} +1 -1
  64. package/dist/{chunk-4WDBN7FE.cjs → chunk-LWK57QIA.cjs} +3 -3
  65. package/dist/{chunk-4WDBN7FE.cjs.map → chunk-LWK57QIA.cjs.map} +1 -1
  66. package/dist/{chunk-7SPUHOHW.cjs → chunk-MPMM5D3U.cjs} +4 -4
  67. package/dist/{chunk-7SPUHOHW.cjs.map → chunk-MPMM5D3U.cjs.map} +1 -1
  68. package/dist/{chunk-DG6MQPBR.js → chunk-N32V7VSV.js} +4 -4
  69. package/dist/{chunk-DG6MQPBR.js.map → chunk-N32V7VSV.js.map} +1 -1
  70. package/dist/{chunk-M6GSAOAD.js → chunk-NVH5GGIR.js} +4 -4
  71. package/dist/{chunk-M6GSAOAD.js.map → chunk-NVH5GGIR.js.map} +1 -1
  72. package/dist/{chunk-ZCXN7QWI.js → chunk-OF6LR77W.js} +3 -3
  73. package/dist/{chunk-ZCXN7QWI.js.map → chunk-OF6LR77W.js.map} +1 -1
  74. package/dist/{chunk-5Y75OYZM.cjs → chunk-PYPOKT4J.cjs} +3 -3
  75. package/dist/{chunk-5Y75OYZM.cjs.map → chunk-PYPOKT4J.cjs.map} +1 -1
  76. package/dist/{chunk-SSJSTNMZ.cjs → chunk-RNDA7UHX.cjs} +18 -18
  77. package/dist/{chunk-SSJSTNMZ.cjs.map → chunk-RNDA7UHX.cjs.map} +1 -1
  78. package/dist/{chunk-JDC7A4YV.js → chunk-RQLXTIT5.js} +4 -4
  79. package/dist/{chunk-JDC7A4YV.js.map → chunk-RQLXTIT5.js.map} +1 -1
  80. package/dist/{chunk-KDIGKXA3.js → chunk-SIYOW7VK.js} +11 -9
  81. package/dist/chunk-SIYOW7VK.js.map +1 -0
  82. package/dist/{chunk-VQPGGT32.cjs → chunk-SYYT53RO.cjs} +41 -39
  83. package/dist/chunk-SYYT53RO.cjs.map +1 -0
  84. package/dist/{chunk-MWFVMI3T.js → chunk-TOPWYUTB.js} +6 -6
  85. package/dist/{chunk-MWFVMI3T.js.map → chunk-TOPWYUTB.js.map} +1 -1
  86. package/dist/{chunk-CT2AKZPZ.js → chunk-VLNRGJEM.js} +3 -3
  87. package/dist/{chunk-CT2AKZPZ.js.map → chunk-VLNRGJEM.js.map} +1 -1
  88. package/dist/{chunk-INGHVKDO.js → chunk-WC4RIS4D.js} +3 -3
  89. package/dist/{chunk-INGHVKDO.js.map → chunk-WC4RIS4D.js.map} +1 -1
  90. package/dist/{chunk-WKRZS674.cjs → chunk-WEUZO2Q3.cjs} +9 -9
  91. package/dist/{chunk-WKRZS674.cjs.map → chunk-WEUZO2Q3.cjs.map} +1 -1
  92. package/dist/{chunk-VO2PCVXW.cjs → chunk-WF6X4HFH.cjs} +5 -5
  93. package/dist/{chunk-VO2PCVXW.cjs.map → chunk-WF6X4HFH.cjs.map} +1 -1
  94. package/dist/{chunk-XQARPKHD.cjs → chunk-XDXODSOG.cjs} +12 -12
  95. package/dist/{chunk-XQARPKHD.cjs.map → chunk-XDXODSOG.cjs.map} +1 -1
  96. package/dist/{chunk-JV2ZLLVN.js → chunk-YF6GPVGV.js} +4 -4
  97. package/dist/{chunk-JV2ZLLVN.js.map → chunk-YF6GPVGV.js.map} +1 -1
  98. package/dist/{chunk-ZUUD6FN5.js → chunk-YV25CDYJ.js} +3 -3
  99. package/dist/{chunk-ZUUD6FN5.js.map → chunk-YV25CDYJ.js.map} +1 -1
  100. package/dist/{chunk-5BD65C6R.cjs → chunk-Z4UBBY2E.cjs} +39 -35
  101. package/dist/chunk-Z4UBBY2E.cjs.map +1 -0
  102. package/dist/docs/SKILL.md +1 -1
  103. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  104. package/dist/{observational-memory-CIGODMXV-RX4J6TAC.js → observational-memory-7YYZIIX4-CK67BQOD.js} +3 -3
  105. package/dist/{observational-memory-CIGODMXV-RX4J6TAC.js.map → observational-memory-7YYZIIX4-CK67BQOD.js.map} +1 -1
  106. package/dist/{observational-memory-CIGODMXV-5QVHS6GP.cjs → observational-memory-7YYZIIX4-IPHEIYJP.cjs} +26 -26
  107. package/dist/{observational-memory-CIGODMXV-5QVHS6GP.cjs.map → observational-memory-7YYZIIX4-IPHEIYJP.cjs.map} +1 -1
  108. package/dist/server/browser-stream/index.cjs +5 -0
  109. package/dist/server/browser-stream/index.cjs.map +1 -1
  110. package/dist/server/browser-stream/index.js +5 -0
  111. package/dist/server/browser-stream/index.js.map +1 -1
  112. package/dist/server/browser-stream/viewer-registry.d.ts.map +1 -1
  113. package/dist/server/handlers/a2a.cjs +9 -9
  114. package/dist/server/handlers/a2a.js +1 -1
  115. package/dist/server/handlers/agent-builder.cjs +16 -16
  116. package/dist/server/handlers/agent-builder.js +1 -1
  117. package/dist/server/handlers/agent-versions.cjs +8 -8
  118. package/dist/server/handlers/agent-versions.js +1 -1
  119. package/dist/server/handlers/agents.cjs +35 -35
  120. package/dist/server/handlers/agents.d.ts.map +1 -1
  121. package/dist/server/handlers/agents.js +1 -1
  122. package/dist/server/handlers/conversations.cjs +5 -5
  123. package/dist/server/handlers/conversations.js +1 -1
  124. package/dist/server/handlers/datasets.cjs +26 -26
  125. package/dist/server/handlers/datasets.js +1 -1
  126. package/dist/server/handlers/logs.cjs +4 -4
  127. package/dist/server/handlers/logs.js +1 -1
  128. package/dist/server/handlers/mcp-client-versions.cjs +8 -8
  129. package/dist/server/handlers/mcp-client-versions.js +1 -1
  130. package/dist/server/handlers/memory.cjs +27 -27
  131. package/dist/server/handlers/memory.js +1 -1
  132. package/dist/server/handlers/prompt-block-versions.cjs +8 -8
  133. package/dist/server/handlers/prompt-block-versions.js +1 -1
  134. package/dist/server/handlers/responses.cjs +4 -4
  135. package/dist/server/handlers/responses.js +1 -1
  136. package/dist/server/handlers/responses.storage.cjs +8 -8
  137. package/dist/server/handlers/responses.storage.js +1 -1
  138. package/dist/server/handlers/scorer-versions.cjs +8 -8
  139. package/dist/server/handlers/scorer-versions.js +1 -1
  140. package/dist/server/handlers/scores.cjs +7 -7
  141. package/dist/server/handlers/scores.js +1 -1
  142. package/dist/server/handlers/stored-agents.cjs +7 -7
  143. package/dist/server/handlers/stored-agents.js +1 -1
  144. package/dist/server/handlers/stored-mcp-clients.cjs +6 -6
  145. package/dist/server/handlers/stored-mcp-clients.js +1 -1
  146. package/dist/server/handlers/stored-prompt-blocks.cjs +6 -6
  147. package/dist/server/handlers/stored-prompt-blocks.js +1 -1
  148. package/dist/server/handlers/stored-scorers.cjs +6 -6
  149. package/dist/server/handlers/stored-scorers.js +1 -1
  150. package/dist/server/handlers/stored-workspaces.cjs +6 -6
  151. package/dist/server/handlers/stored-workspaces.js +1 -1
  152. package/dist/server/handlers/tools.cjs +6 -6
  153. package/dist/server/handlers/tools.js +1 -1
  154. package/dist/server/handlers/utils.cjs +9 -9
  155. package/dist/server/handlers/utils.js +1 -1
  156. package/dist/server/handlers/voice.cjs +8 -8
  157. package/dist/server/handlers/voice.js +1 -1
  158. package/dist/server/handlers/workflows.cjs +24 -24
  159. package/dist/server/handlers/workflows.js +1 -1
  160. package/dist/server/handlers/workspace.cjs +26 -26
  161. package/dist/server/handlers/workspace.js +1 -1
  162. package/dist/server/handlers.cjs +35 -35
  163. package/dist/server/handlers.js +12 -12
  164. package/dist/server/schemas/index.cjs +227 -227
  165. package/dist/server/schemas/index.js +9 -9
  166. package/dist/server/server-adapter/index.cjs +221 -221
  167. package/dist/server/server-adapter/index.js +24 -24
  168. package/package.json +4 -4
  169. package/dist/chunk-2Q5WIJZV.js.map +0 -1
  170. package/dist/chunk-5BD65C6R.cjs.map +0 -1
  171. package/dist/chunk-KDIGKXA3.js.map +0 -1
  172. package/dist/chunk-MLJVCFJQ.js.map +0 -1
  173. package/dist/chunk-ONL7ZWVI.cjs.map +0 -1
  174. package/dist/chunk-VQPGGT32.cjs.map +0 -1
@@ -1040,7 +1040,7 @@ function imageSize(input) {
1040
1040
  throw new TypeError(`unsupported file type: ${type}`);
1041
1041
  }
1042
1042
 
1043
- // ../memory/dist/chunk-OOA4C7IX.js
1043
+ // ../memory/dist/chunk-MPBMHIAQ.js
1044
1044
  var OM_DEBUG_LOG = process.env.OM_DEBUG ? join(process.cwd(), "om-debug.log") : null;
1045
1045
  function omDebug(msg) {
1046
1046
  if (!OM_DEBUG_LOG) return;
@@ -1397,6 +1397,67 @@ ${gap}
1397
1397
  result += withInlineDates.slice(lastIndex);
1398
1398
  return result;
1399
1399
  }
1400
+ var MIN_TEMPORAL_GAP_MS = 10 * 60 * 1e3;
1401
+ function formatTemporalGap(diffMs) {
1402
+ if (diffMs < MIN_TEMPORAL_GAP_MS) return null;
1403
+ const minute = 60 * 1e3;
1404
+ const hour = 60 * minute;
1405
+ const day = 24 * hour;
1406
+ const week = 7 * day;
1407
+ const month = 30 * day;
1408
+ const year = 365 * day;
1409
+ const formatUnit = (value, unit) => `${value} ${unit}${value === 1 ? "" : "s"}`;
1410
+ if (diffMs < hour) {
1411
+ const minutes = Math.max(1, Math.round(diffMs / minute));
1412
+ return `${formatUnit(minutes, "minute")} later`;
1413
+ }
1414
+ const formatTwoUnits = (primaryMs, primaryUnit, secondaryMs, secondaryUnit) => {
1415
+ const primary = Math.floor(diffMs / primaryMs);
1416
+ const remainder = diffMs - primary * primaryMs;
1417
+ const secondary = Math.floor(remainder / secondaryMs);
1418
+ const parts = [formatUnit(primary, primaryUnit)];
1419
+ if (secondary > 0) {
1420
+ parts.push(formatUnit(secondary, secondaryUnit));
1421
+ }
1422
+ return `${parts.join(" ")} later`;
1423
+ };
1424
+ if (diffMs < day) {
1425
+ return formatTwoUnits(hour, "hour", minute, "minute");
1426
+ }
1427
+ if (diffMs < week) {
1428
+ return formatTwoUnits(day, "day", hour, "hour");
1429
+ }
1430
+ if (diffMs < month) {
1431
+ return formatTwoUnits(week, "week", day, "day");
1432
+ }
1433
+ if (diffMs < year) {
1434
+ return formatTwoUnits(month, "month", week, "week");
1435
+ }
1436
+ return formatTwoUnits(year, "year", month, "month");
1437
+ }
1438
+ function formatTemporalTimestamp(date) {
1439
+ return date.toLocaleString("en-US", {
1440
+ year: "numeric",
1441
+ month: "2-digit",
1442
+ day: "2-digit",
1443
+ hour: "numeric",
1444
+ minute: "2-digit",
1445
+ hour12: true,
1446
+ timeZoneName: "short"
1447
+ });
1448
+ }
1449
+ function getMessagePartTimestamp(msg, position) {
1450
+ const timestamps = msg.content?.parts?.map((part) => "createdAt" in part ? part.createdAt : void 0).filter((timestamp) => typeof timestamp === "number");
1451
+ if (timestamps && timestamps.length > 0) {
1452
+ const index = position === "first" ? 0 : timestamps.length - 1;
1453
+ const timestamp = timestamps[index];
1454
+ if (timestamp !== void 0) return timestamp;
1455
+ }
1456
+ return new Date(msg.createdAt).getTime();
1457
+ }
1458
+ function isTemporalGapMarker(msg) {
1459
+ return msg.id.startsWith("__temporal_");
1460
+ }
1400
1461
  function createObservationStartMarker(params) {
1401
1462
  return {
1402
1463
  type: "data-om-observation-start",
@@ -3435,6 +3496,13 @@ function stripEphemeralAnchorIds(observations) {
3435
3496
  }
3436
3497
  return observations.replace(/(^|\n)([^\S\n]*)\[(O\d+(?:-N\d+)?)\][^\S\n]*/g, "$1$2");
3437
3498
  }
3499
+ function safeSlice(str, end) {
3500
+ if (end <= 0) return "";
3501
+ if (end >= str.length) return str;
3502
+ const code = str.charCodeAt(end - 1);
3503
+ const safeEnd = code >= 55296 && code <= 56319 ? end - 1 : end;
3504
+ return str.slice(0, safeEnd);
3505
+ }
3438
3506
  var ENCRYPTED_CONTENT_KEY = "encryptedContent";
3439
3507
  var ENCRYPTED_CONTENT_REDACTION_THRESHOLD = 256;
3440
3508
  var DEFAULT_OBSERVER_TOOL_RESULT_MAX_TOKENS = 1e4;
@@ -3500,7 +3568,7 @@ function truncateStringByTokens(text, maxTokens) {
3500
3568
  return text;
3501
3569
  }
3502
3570
  const buildCandidate = (sliceEnd) => {
3503
- const visible = text.slice(0, sliceEnd);
3571
+ const visible = safeSlice(text, sliceEnd);
3504
3572
  return `${visible}
3505
3573
  ... [truncated ~${totalTokens - estimateTokenCount(visible)} tokens]`;
3506
3574
  };
@@ -4052,8 +4120,11 @@ function formatObserverAttachmentPlaceholder(part, counter) {
4052
4120
  return label ? `[${attachmentType} #${attachmentId}: ${label}]` : `[${attachmentType} #${attachmentId}]`;
4053
4121
  }
4054
4122
  function formatObserverPartLine(title, body, time, previousTime) {
4055
- const timeLabel = time && time !== previousTime ? ` (${time})` : "";
4056
- return `${title}${timeLabel}: ${body}`;
4123
+ const timeLabel = time && time !== previousTime ? `(${time})` : "";
4124
+ if (!title) {
4125
+ return timeLabel ? `${timeLabel}: ${body}` : body;
4126
+ }
4127
+ return `${title}${timeLabel ? ` ${timeLabel}` : ""}: ${body}`;
4057
4128
  }
4058
4129
  function normalizeObserverCreatedAt(createdAt) {
4059
4130
  if (createdAt instanceof Date) {
@@ -4089,6 +4160,16 @@ function formatObserverLines(lines, context = {}) {
4089
4160
  context: { previousDate, previousTime }
4090
4161
  };
4091
4162
  }
4163
+ function getTemporalGapMarkerText(msg) {
4164
+ const metadata = typeof msg.content === "object" && msg.content && "metadata" in msg.content ? msg.content.metadata : void 0;
4165
+ if (metadata?.reminderType === "temporal-gap" && typeof metadata.gapText === "string") {
4166
+ return metadata.gapText;
4167
+ }
4168
+ 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") {
4169
+ return metadata.systemReminder.gapText;
4170
+ }
4171
+ return void 0;
4172
+ }
4092
4173
  function formatObserverMessage(msg, counter, options) {
4093
4174
  const maxLen = options?.maxPartLength;
4094
4175
  const maxToolResultTokens = options?.maxToolResultTokens ?? DEFAULT_OBSERVER_TOOL_RESULT_MAX_TOKENS;
@@ -4096,6 +4177,7 @@ function formatObserverMessage(msg, counter, options) {
4096
4177
  const attachments = [];
4097
4178
  const messageCreatedAt = normalizeObserverCreatedAt(msg.createdAt);
4098
4179
  let lines = [];
4180
+ const temporalGapText = isTemporalGapMarker(msg) ? getTemporalGapMarkerText(msg) : void 0;
4099
4181
  const pushLine = (title, body, createdAt) => {
4100
4182
  if (!body) {
4101
4183
  return;
@@ -4108,7 +4190,9 @@ function formatObserverMessage(msg, counter, options) {
4108
4190
  body
4109
4191
  });
4110
4192
  };
4111
- if (typeof msg.content === "string") {
4193
+ if (temporalGapText) {
4194
+ pushLine("", temporalGapText, messageCreatedAt);
4195
+ } else if (typeof msg.content === "string") {
4112
4196
  pushLine(role, maybeTruncate(msg.content, maxLen), messageCreatedAt);
4113
4197
  } else if (msg.content?.parts && Array.isArray(msg.content.parts) && msg.content.parts.length > 0) {
4114
4198
  msg.content.parts.forEach((part) => {
@@ -4209,8 +4293,8 @@ function buildObserverHistoryMessage(messages, options) {
4209
4293
  }
4210
4294
  function maybeTruncate(str, maxLen) {
4211
4295
  if (!maxLen || str.length <= maxLen) return str;
4212
- const truncated = str.slice(0, maxLen);
4213
- const remaining = str.length - maxLen;
4296
+ const truncated = safeSlice(str, maxLen);
4297
+ const remaining = str.length - truncated.length;
4214
4298
  return `${truncated}
4215
4299
  ... [truncated ${remaining} characters]`;
4216
4300
  }
@@ -4514,7 +4598,7 @@ function sanitizeObservationLines(observations) {
4514
4598
  let changed = false;
4515
4599
  for (let i = 0; i < lines.length; i++) {
4516
4600
  if (lines[i].length > MAX_OBSERVATION_LINE_CHARS) {
4517
- lines[i] = lines[i].slice(0, MAX_OBSERVATION_LINE_CHARS) + " \u2026 [truncated]";
4601
+ lines[i] = safeSlice(lines[i], MAX_OBSERVATION_LINE_CHARS) + " \u2026 [truncated]";
4518
4602
  changed = true;
4519
4603
  }
4520
4604
  }
@@ -9845,6 +9929,106 @@ ${grouped}` : grouped;
9845
9929
  });
9846
9930
  }
9847
9931
  };
9932
+ var TEMPORAL_GAP_REMINDER_TYPE = "temporal-gap";
9933
+ function getTemporalGapReminderText(gapText, timestamp) {
9934
+ return `${gapText} \u2014 ${formatTemporalTimestamp(new Date(timestamp))}`;
9935
+ }
9936
+ function getTemporalGapReminderMetadata(message, gapText, gapMs, timestamp) {
9937
+ const formattedTimestamp = formatTemporalTimestamp(new Date(timestamp));
9938
+ return {
9939
+ reminderType: TEMPORAL_GAP_REMINDER_TYPE,
9940
+ gapText,
9941
+ gapMs,
9942
+ timestamp: formattedTimestamp,
9943
+ timestampMs: timestamp,
9944
+ precedesMessageId: message.id,
9945
+ systemReminder: {
9946
+ type: TEMPORAL_GAP_REMINDER_TYPE,
9947
+ message: getTemporalGapReminderText(gapText, timestamp),
9948
+ gapText,
9949
+ gapMs,
9950
+ timestamp: formattedTimestamp,
9951
+ timestampMs: timestamp,
9952
+ precedesMessageId: message.id
9953
+ }
9954
+ };
9955
+ }
9956
+ function isTemporalGapMarkerForMessage(message, targetMessageId) {
9957
+ if (!isTemporalGapMarker(message)) {
9958
+ return false;
9959
+ }
9960
+ const metadata = message.content.metadata;
9961
+ if (metadata?.precedesMessageId === targetMessageId) {
9962
+ return true;
9963
+ }
9964
+ return metadata?.systemReminder?.type === TEMPORAL_GAP_REMINDER_TYPE && metadata.systemReminder.precedesMessageId === targetMessageId;
9965
+ }
9966
+ function createTemporalGapMarker(message, gapText, gapMs, timestamp) {
9967
+ const metadata = getTemporalGapReminderMetadata(message, gapText, gapMs, timestamp);
9968
+ return {
9969
+ id: `__temporal_gap_${crypto.randomUUID()}`,
9970
+ role: "user",
9971
+ createdAt: new Date(timestamp - 1),
9972
+ threadId: message.threadId,
9973
+ resourceId: message.resourceId,
9974
+ content: {
9975
+ format: 2,
9976
+ parts: [
9977
+ {
9978
+ type: "text",
9979
+ text: `<system-reminder type="${TEMPORAL_GAP_REMINDER_TYPE}" precedesMessageId="${message.id}">${getTemporalGapReminderText(gapText, timestamp)}</system-reminder>`
9980
+ }
9981
+ ],
9982
+ metadata
9983
+ }
9984
+ };
9985
+ }
9986
+ async function insertTemporalGapMarkers({
9987
+ messageList,
9988
+ writer
9989
+ }) {
9990
+ const inputMessages = messageList.get.input.db().filter((message) => Boolean(message));
9991
+ const latestInputMessage = inputMessages.at(-1);
9992
+ if (!latestInputMessage || isTemporalGapMarker(latestInputMessage)) {
9993
+ return;
9994
+ }
9995
+ const allMessages = messageList.get.all.db().filter((message) => Boolean(message));
9996
+ const latestInputIndex = allMessages.findIndex((message) => message.id === latestInputMessage.id);
9997
+ if (latestInputIndex <= 0) {
9998
+ return;
9999
+ }
10000
+ if (allMessages.some((message) => isTemporalGapMarkerForMessage(message, latestInputMessage.id))) {
10001
+ return;
10002
+ }
10003
+ let previousNonMarker;
10004
+ for (let index = latestInputIndex - 1; index >= 0; index--) {
10005
+ const candidate = allMessages[index];
10006
+ if (candidate && !isTemporalGapMarker(candidate)) {
10007
+ previousNonMarker = candidate;
10008
+ break;
10009
+ }
10010
+ }
10011
+ if (!previousNonMarker) {
10012
+ return;
10013
+ }
10014
+ const timestamp = getMessagePartTimestamp(latestInputMessage, "first");
10015
+ const gapMs = timestamp - getMessagePartTimestamp(previousNonMarker, "last");
10016
+ const gapText = formatTemporalGap(gapMs);
10017
+ if (!gapText) {
10018
+ return;
10019
+ }
10020
+ const reminderMetadata = getTemporalGapReminderMetadata(latestInputMessage, gapText, gapMs, timestamp);
10021
+ await writer?.custom({
10022
+ type: "data-system-reminder",
10023
+ data: {
10024
+ message: getTemporalGapReminderText(gapText, timestamp),
10025
+ ...reminderMetadata
10026
+ },
10027
+ transient: true
10028
+ });
10029
+ const marker = createTemporalGapMarker(latestInputMessage, gapText, gapMs, timestamp);
10030
+ messageList.add(marker, "input");
10031
+ }
9848
10032
  function getOmObservabilityContext(args) {
9849
10033
  if (!args.tracing || !args.tracingContext || !args.loggerVNext || !args.metrics) {
9850
10034
  return void 0;
@@ -9867,11 +10051,14 @@ var ObservationalMemoryProcessor = class {
9867
10051
  engine;
9868
10052
  /** Memory instance for loading context. */
9869
10053
  memory;
10054
+ /** Whether temporal-gap reminder markers should be inserted. */
10055
+ temporalMarkers;
9870
10056
  /** Active turn — created on first processInputStep, ended on processOutputResult. */
9871
10057
  turn;
9872
- constructor(engine, memory) {
10058
+ constructor(engine, memory, options) {
9873
10059
  this.engine = engine;
9874
10060
  this.memory = memory;
10061
+ this.temporalMarkers = options?.temporalMarkers ?? false;
9875
10062
  }
9876
10063
  // ─── Processor lifecycle hooks ──────────────────────────────────────────
9877
10064
  async processInputStep(args) {
@@ -9930,6 +10117,9 @@ var ObservationalMemoryProcessor = class {
9930
10117
  this.turn.writer = writer;
9931
10118
  this.turn.requestContext = requestContext;
9932
10119
  await this.turn.start(this.memory);
10120
+ if (stepNumber === 0 && this.temporalMarkers) {
10121
+ await insertTemporalGapMarkers({ messageList, writer });
10122
+ }
9933
10123
  state.__omTurn = this.turn;
9934
10124
  }
9935
10125
  const observabilityContext = getOmObservabilityContext(args);
@@ -10067,5 +10257,5 @@ function getObservationsAsOf(activeObservations, asOf) {
10067
10257
  }
10068
10258
 
10069
10259
  export { ModelByInputTokens, OBSERVER_SYSTEM_PROMPT, ObservationalMemory, ObservationalMemoryProcessor, TokenCounter, buildObserverPrompt, buildObserverSystemPrompt, combineObservationGroupRanges, deriveObservationGroupProvenance, e, estimateTokenCount, extractCurrentTask, formatMessagesForObserver, formatToolResultForObserver, getObservationsAsOf, hasCurrentTaskSection, injectAnchorIds, optimizeObservationsForContext, parseAnchorId, parseObservationGroups, parseObserverOutput, reconcileObservationGroupsFromReflection, renderObservationGroupsForReflection, resolveToolResultValue, stripEphemeralAnchorIds, stripObservationGroups, truncateStringByTokens, wrapInObservationGroup };
10070
- //# sourceMappingURL=chunk-2Q5WIJZV.js.map
10071
- //# sourceMappingURL=chunk-2Q5WIJZV.js.map
10260
+ //# sourceMappingURL=chunk-BXJTD5TI.js.map
10261
+ //# sourceMappingURL=chunk-BXJTD5TI.js.map