@mastra/server 1.67.0 → 1.68.0-alpha.5

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 (448) hide show
  1. package/dist/_types/@internal_core/dist/storage/index.d.ts +3 -3
  2. package/dist/_types/@internal_core/package.json +1 -0
  3. package/dist/_types/@internal_voice/dist/_types/@internal_core/dist/routes/index.d.ts +1 -1
  4. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/checks.d.ts +1 -1
  5. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/compat.d.ts +9 -11
  6. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/deep-partial.d.ts +14 -0
  7. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/errors.d.ts +3 -4
  8. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/external.d.ts +5 -2
  9. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/in-out.d.ts +8 -0
  10. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/index.d.ts +1 -2
  11. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/iso.d.ts +2 -17
  12. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/parse.d.ts +17 -4
  13. package/dist/_types/@internal_voice/dist/_types/zod/v4/classic/schemas.d.ts +68 -19
  14. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/api.d.ts +22 -12
  15. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/checks.d.ts +29 -13
  16. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/compile.d.ts +65 -0
  17. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/core.d.ts +16 -4
  18. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/doc.d.ts +3 -1
  19. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/errors.d.ts +4 -0
  20. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/index.d.ts +3 -0
  21. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/json-schema-generator.d.ts +2 -2
  22. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/json-schema-processors.d.ts +16 -0
  23. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/json-schema.d.ts +2 -1
  24. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/memoizer.d.ts +15 -0
  25. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/parse.d.ts +14 -11
  26. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/regexes.d.ts +5 -0
  27. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/schemas.d.ts +123 -34
  28. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/to-json-schema.d.ts +45 -5
  29. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/util.d.ts +79 -1
  30. package/dist/_types/@internal_voice/dist/_types/zod/v4/core/versions.d.ts +1 -1
  31. package/dist/_types/@internal_voice/dist/_types/zod/v4/index.d.cts +2 -2
  32. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/bn.d.ts +4 -0
  33. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/ckb.d.ts +4 -0
  34. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/gu.d.ts +4 -0
  35. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/hi.d.ts +4 -0
  36. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/index.d.ts +11 -0
  37. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/kn.d.ts +4 -0
  38. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/ne.d.ts +4 -0
  39. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/nn.d.ts +4 -0
  40. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/pt-BR.d.ts +4 -0
  41. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/sk.d.ts +4 -0
  42. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/tg.d.ts +4 -0
  43. package/dist/_types/@internal_voice/dist/_types/zod/v4/locales/tk.d.ts +4 -0
  44. package/dist/_types/@internal_voice/dist/routes/index.d.ts +15 -15
  45. package/dist/_types/@internal_voice/package.json +1 -0
  46. package/dist/_types/@mastra_schema-compat/dist/_types/@internal_ai-sdk-v4/dist/index.d.ts +1 -1
  47. package/dist/_types/@mastra_schema-compat/dist/_types/@internal_ai-sdk-v5/dist/index.d.ts +1 -1
  48. package/dist/_types/@mastra_schema-compat/dist/_types/@internal_ai-v6/dist/index.d.ts +1 -1
  49. package/dist/_types/@mastra_schema-compat/dist/provider-compats/anthropic.d.ts +2 -2
  50. package/dist/_types/@mastra_schema-compat/dist/provider-compats/deepseek.d.ts +2 -2
  51. package/dist/_types/@mastra_schema-compat/dist/provider-compats/google.d.ts +1 -1
  52. package/dist/_types/@mastra_schema-compat/dist/provider-compats/meta.d.ts +2 -2
  53. package/dist/_types/@mastra_schema-compat/dist/provider-compats/openai.d.ts +1 -1
  54. package/dist/_types/@mastra_schema-compat/dist/schema.types.d.ts +4 -4
  55. package/dist/_types/@mastra_schema-compat/dist/standard-schema/standard-schema.d.ts +2 -2
  56. package/dist/_types/@mastra_schema-compat/dist/standard-schema/standard-schema.types.d.ts +1 -1
  57. package/dist/_types/@mastra_schema-compat/dist/zod-to-json.d.ts +1 -1
  58. package/dist/_types/@mastra_schema-compat/package.json +1 -0
  59. package/dist/{a2a-8C4O2dVJ.js → a2a-BS0gTQk3.js} +94 -14
  60. package/dist/a2a-BS0gTQk3.js.map +1 -0
  61. package/dist/{a2a-MPoM5lzS.cjs → a2a-CBl-c-lm.cjs} +105 -13
  62. package/dist/a2a-CBl-c-lm.cjs.map +1 -0
  63. package/dist/{a2a-DQ8GeDz4.cjs → a2a-Cr-pxMJm.cjs} +151 -47
  64. package/dist/a2a-Cr-pxMJm.cjs.map +1 -0
  65. package/dist/{a2a-DUBjstWk.js → a2a-D2AP2MGB.js} +151 -47
  66. package/dist/a2a-D2AP2MGB.js.map +1 -0
  67. package/dist/{agent-versions-D99q4Gos.cjs → agent-versions-DisdqzzB.cjs} +2 -2
  68. package/dist/{agent-versions-D99q4Gos.cjs.map → agent-versions-DisdqzzB.cjs.map} +1 -1
  69. package/dist/{agent-versions-NGajm4l5.js → agent-versions-f5zi5A-V.js} +2 -2
  70. package/dist/{agent-versions-NGajm4l5.js.map → agent-versions-f5zi5A-V.js.map} +1 -1
  71. package/dist/{agents-CZE_MSQE.cjs → agents-B9H0fBkm.cjs} +24 -6
  72. package/dist/agents-B9H0fBkm.cjs.map +1 -0
  73. package/dist/{agents-ssoMemNs.js → agents-Bic13NAO.js} +24 -6
  74. package/dist/agents-Bic13NAO.js.map +1 -0
  75. package/dist/{api-schema-manifest-CeREx1dB.js → api-schema-manifest-DDpGD3_2.js} +3 -3
  76. package/dist/{api-schema-manifest-CeREx1dB.js.map → api-schema-manifest-DDpGD3_2.js.map} +1 -1
  77. package/dist/{api-schema-manifest-DzWP4nLu.cjs → api-schema-manifest-Wh8dZzaC.cjs} +3 -3
  78. package/dist/{api-schema-manifest-DzWP4nLu.cjs.map → api-schema-manifest-Wh8dZzaC.cjs.map} +1 -1
  79. package/dist/{background-tasks-kXPoCvgG.js → background-tasks-D7X7M0TU.js} +2 -2
  80. package/dist/{background-tasks-kXPoCvgG.js.map → background-tasks-D7X7M0TU.js.map} +1 -1
  81. package/dist/{background-tasks-CFJ0vNgp.cjs → background-tasks-NjqWJcUw.cjs} +2 -2
  82. package/dist/{background-tasks-CFJ0vNgp.cjs.map → background-tasks-NjqWJcUw.cjs.map} +1 -1
  83. package/dist/{builder-registry-DI3Ysclf.js → builder-registry-D6MI5ZLX.js} +3 -3
  84. package/dist/{builder-registry-DI3Ysclf.js.map → builder-registry-D6MI5ZLX.js.map} +1 -1
  85. package/dist/{builder-registry-r71f11_E.cjs → builder-registry-DYGJZJTi.cjs} +3 -3
  86. package/dist/{builder-registry-r71f11_E.cjs.map → builder-registry-DYGJZJTi.cjs.map} +1 -1
  87. package/dist/{channels-CGDo0Prv.cjs → channels-pCkdvG0z.cjs} +2 -2
  88. package/dist/{channels-CGDo0Prv.cjs.map → channels-pCkdvG0z.cjs.map} +1 -1
  89. package/dist/{channels-B_K1oJ7S.js → channels-uSO1ySnT.js} +2 -2
  90. package/dist/{channels-B_K1oJ7S.js.map → channels-uSO1ySnT.js.map} +1 -1
  91. package/dist/{conversations-DstENx2x.cjs → conversations-DHgZXodJ.cjs} +2 -2
  92. package/dist/{conversations-DstENx2x.cjs.map → conversations-DHgZXodJ.cjs.map} +1 -1
  93. package/dist/{conversations-b3vJRHF3.js → conversations-DzzjfNa9.js} +2 -2
  94. package/dist/{conversations-b3vJRHF3.js.map → conversations-DzzjfNa9.js.map} +1 -1
  95. package/dist/{dist-BKxbtiJd.cjs → dist-B4HiqHgK.cjs} +874 -192
  96. package/dist/dist-B4HiqHgK.cjs.map +1 -0
  97. package/dist/{dist-D6F_HzDS.cjs → dist-BAojQuHp.cjs} +4 -4
  98. package/dist/{dist-D6F_HzDS.cjs.map → dist-BAojQuHp.cjs.map} +1 -1
  99. package/dist/{dist-k6UeNFHu.js → dist-BMjWLpRz.js} +3 -3
  100. package/dist/{dist-k6UeNFHu.js.map → dist-BMjWLpRz.js.map} +1 -1
  101. package/dist/{dist-C76EmJsT.cjs → dist-BNvS3nzI.cjs} +3 -3
  102. package/dist/{dist-C76EmJsT.cjs.map → dist-BNvS3nzI.cjs.map} +1 -1
  103. package/dist/{dist-C9yKk16g.cjs → dist-BoTiXJuB.cjs} +3 -3
  104. package/dist/{dist-C9yKk16g.cjs.map → dist-BoTiXJuB.cjs.map} +1 -1
  105. package/dist/{dist-Da8AufS5.js → dist-ByqJiZWY.js} +4 -4
  106. package/dist/{dist-Da8AufS5.js.map → dist-ByqJiZWY.js.map} +1 -1
  107. package/dist/{dist-Wjq6PT76.js → dist-C0MIGUJb.js} +3 -3
  108. package/dist/{dist-Wjq6PT76.js.map → dist-C0MIGUJb.js.map} +1 -1
  109. package/dist/{dist-DOpm-tIl.js → dist-C3lMsO1Z.js} +871 -189
  110. package/dist/dist-C3lMsO1Z.js.map +1 -0
  111. package/dist/{dist-CLQt62Pi.cjs → dist-CAeHwEQg.cjs} +3 -3
  112. package/dist/{dist-CLQt62Pi.cjs.map → dist-CAeHwEQg.cjs.map} +1 -1
  113. package/dist/{dist-DoTDZ7wF.js → dist-Cdj_Yiml.js} +3 -3
  114. package/dist/{dist-DoTDZ7wF.js.map → dist-Cdj_Yiml.js.map} +1 -1
  115. package/dist/{dist-Chgswf37.js → dist-DANO75MK.js} +2 -2
  116. package/dist/{dist-Chgswf37.js.map → dist-DANO75MK.js.map} +1 -1
  117. package/dist/{dist-XnA2Lowr.js → dist-DazAtske.js} +3 -3
  118. package/dist/{dist-XnA2Lowr.js.map → dist-DazAtske.js.map} +1 -1
  119. package/dist/{dist-B6qmZNb0.cjs → dist-Diq8iAfv.cjs} +2 -2
  120. package/dist/{dist-B6qmZNb0.cjs.map → dist-Diq8iAfv.cjs.map} +1 -1
  121. package/dist/{dist-DpM-6UBk.cjs → dist-DrjjAvjG.cjs} +3 -3
  122. package/dist/{dist-DpM-6UBk.cjs.map → dist-DrjjAvjG.cjs.map} +1 -1
  123. package/dist/docs/SKILL.md +2 -2
  124. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  125. package/dist/docs/references/docs-connections-a2a.md +4 -3
  126. package/dist/docs/references/docs-server-custom-adapters.md +43 -0
  127. package/dist/docs/references/reference-observability-tracing-trace-query.md +219 -46
  128. package/dist/{dynamic-workflows-DeUG3lA2.cjs → dynamic-workflows-BiX72mRA.cjs} +2 -2
  129. package/dist/{dynamic-workflows-DeUG3lA2.cjs.map → dynamic-workflows-BiX72mRA.cjs.map} +1 -1
  130. package/dist/{dynamic-workflows-C3DXgmSP.js → dynamic-workflows-CVrxi8y7.js} +2 -2
  131. package/dist/{dynamic-workflows-C3DXgmSP.js.map → dynamic-workflows-CVrxi8y7.js.map} +1 -1
  132. package/dist/{editor-builder-BI5yHrbT.js → editor-builder-BRRYGWMU.js} +3 -3
  133. package/dist/{editor-builder-BI5yHrbT.js.map → editor-builder-BRRYGWMU.js.map} +1 -1
  134. package/dist/{editor-builder-D6P_hq7c.js → editor-builder-D2gMZkny.js} +2 -2
  135. package/dist/{editor-builder-D6P_hq7c.js.map → editor-builder-D2gMZkny.js.map} +1 -1
  136. package/dist/{editor-builder-CKAeON9r.cjs → editor-builder-DZAS7tNU.cjs} +3 -3
  137. package/dist/{editor-builder-CKAeON9r.cjs.map → editor-builder-DZAS7tNU.cjs.map} +1 -1
  138. package/dist/{editor-builder-BHf-g7q9.cjs → editor-builder-ITPZxpzq.cjs} +2 -2
  139. package/dist/{editor-builder-BHf-g7q9.cjs.map → editor-builder-ITPZxpzq.cjs.map} +1 -1
  140. package/dist/{mcp-BPmrXX9r.cjs → mcp-CdZzch5c.cjs} +11 -3
  141. package/dist/mcp-CdZzch5c.cjs.map +1 -0
  142. package/dist/{mcp-B_OMG3Ol.js → mcp-ea7f_n2D.js} +11 -3
  143. package/dist/mcp-ea7f_n2D.js.map +1 -0
  144. package/dist/{memory-CDYtqQnE.cjs → memory-BNvFGYtR.cjs} +4 -2
  145. package/dist/memory-BNvFGYtR.cjs.map +1 -0
  146. package/dist/{memory-BvKPIpyH.js → memory-CxfzZmoW.js} +4 -2
  147. package/dist/memory-CxfzZmoW.js.map +1 -0
  148. package/dist/message-history-CkUYxSaS.cjs +22 -0
  149. package/dist/message-history-CkUYxSaS.cjs.map +1 -0
  150. package/dist/message-history-_kbQlA4r.js +11 -0
  151. package/dist/message-history-_kbQlA4r.js.map +1 -0
  152. package/dist/{observability-new-endpoints-I2OxQzfY.cjs → observability-new-endpoints-BUC8-mAb.cjs} +230 -6
  153. package/dist/observability-new-endpoints-BUC8-mAb.cjs.map +1 -0
  154. package/dist/{observability-new-endpoints-pIq_OWa8.js → observability-new-endpoints-CZyppvEy.js} +214 -8
  155. package/dist/observability-new-endpoints-CZyppvEy.js.map +1 -0
  156. package/dist/{route-builder-DupY8fkI.cjs → route-builder-CbCx1upL.cjs} +5 -5
  157. package/dist/{route-builder-DupY8fkI.cjs.map → route-builder-CbCx1upL.cjs.map} +1 -1
  158. package/dist/{route-builder-BukcT_Kp.js → route-builder-DDOjv0sM.js} +3 -3
  159. package/dist/{route-builder-BukcT_Kp.js.map → route-builder-DDOjv0sM.js.map} +1 -1
  160. package/dist/{routes-PJ3eKHbs.cjs → routes-7alDuT9Q.cjs} +14 -11
  161. package/dist/routes-7alDuT9Q.cjs.map +1 -0
  162. package/dist/{routes-BJZtqLVx.js → routes-gccKFI1D.js} +14 -11
  163. package/dist/routes-gccKFI1D.js.map +1 -0
  164. package/dist/{schedules-DaEv0Usj.cjs → schedules-ByXP9Fgm.cjs} +15 -9
  165. package/dist/schedules-ByXP9Fgm.cjs.map +1 -0
  166. package/dist/{schedules-BzymFGR_.js → schedules-Cy6FhkZX.js} +15 -9
  167. package/dist/schedules-Cy6FhkZX.js.map +1 -0
  168. package/dist/{schema-D_ikovK6-DQrOVw5N.cjs → schema-BwlBcZRB-BLwYP0BY.cjs} +6 -6
  169. package/dist/{schema-D_ikovK6-DQrOVw5N.cjs.map → schema-BwlBcZRB-BLwYP0BY.cjs.map} +1 -1
  170. package/dist/{schema-D_ikovK6-BzTeMhWf.js → schema-BwlBcZRB-DUSSQ9TD.js} +6 -6
  171. package/dist/{schema-D_ikovK6-BzTeMhWf.js.map → schema-BwlBcZRB-DUSSQ9TD.js.map} +1 -1
  172. package/dist/schema-DM4T8wfR.cjs +1 -0
  173. package/dist/schema-Fa9iirVJ.js +2 -0
  174. package/dist/{scorer-versions-B6U7batJ.cjs → scorer-versions-C8xZh_o9.cjs} +2 -2
  175. package/dist/{scorer-versions-B6U7batJ.cjs.map → scorer-versions-C8xZh_o9.cjs.map} +1 -1
  176. package/dist/{scorer-versions-Dh2iaz4Y.js → scorer-versions-hHzTJTa-.js} +2 -2
  177. package/dist/{scorer-versions-Dh2iaz4Y.js.map → scorer-versions-hHzTJTa-.js.map} +1 -1
  178. package/dist/server/a2a/agent-card-signing.d.ts +8 -4
  179. package/dist/server/a2a/agent-card-signing.d.ts.map +1 -1
  180. package/dist/server/a2a/agent-card-v1.d.ts +6 -0
  181. package/dist/server/a2a/agent-card-v1.d.ts.map +1 -0
  182. package/dist/server/handlers/a2a.cjs +1 -1
  183. package/dist/server/handlers/a2a.d.ts +205 -61
  184. package/dist/server/handlers/a2a.d.ts.map +1 -1
  185. package/dist/server/handlers/a2a.js +1 -1
  186. package/dist/server/handlers/agent-builder.cjs +4 -4
  187. package/dist/server/handlers/agent-builder.d.ts +64 -64
  188. package/dist/server/handlers/agent-builder.js +4 -4
  189. package/dist/server/handlers/agent-controller.cjs +4 -5
  190. package/dist/server/handlers/agent-controller.cjs.map +1 -1
  191. package/dist/server/handlers/agent-controller.d.ts +145 -145
  192. package/dist/server/handlers/agent-controller.d.ts.map +1 -1
  193. package/dist/server/handlers/agent-controller.js +4 -5
  194. package/dist/server/handlers/agent-controller.js.map +1 -1
  195. package/dist/server/handlers/agent-versions.cjs +3 -3
  196. package/dist/server/handlers/agent-versions.d.ts +88 -24
  197. package/dist/server/handlers/agent-versions.d.ts.map +1 -1
  198. package/dist/server/handlers/agent-versions.js +3 -3
  199. package/dist/server/handlers/agents.cjs +7 -7
  200. package/dist/server/handlers/agents.d.ts +224 -148
  201. package/dist/server/handlers/agents.d.ts.map +1 -1
  202. package/dist/server/handlers/agents.js +6 -6
  203. package/dist/server/handlers/auth.cjs +1 -1
  204. package/dist/server/handlers/auth.d.ts +80 -80
  205. package/dist/server/handlers/auth.js +1 -1
  206. package/dist/server/handlers/background-tasks.cjs +1 -1
  207. package/dist/server/handlers/background-tasks.d.ts +12 -12
  208. package/dist/server/handlers/background-tasks.js +1 -1
  209. package/dist/server/handlers/builder-registry.cjs +1 -1
  210. package/dist/server/handlers/builder-registry.d.ts +20 -20
  211. package/dist/server/handlers/builder-registry.js +1 -1
  212. package/dist/server/handlers/channels.cjs +1 -1
  213. package/dist/server/handlers/channels.d.ts +16 -16
  214. package/dist/server/handlers/channels.js +1 -1
  215. package/dist/server/handlers/conversations.cjs +2 -2
  216. package/dist/server/handlers/conversations.d.ts +16 -16
  217. package/dist/server/handlers/conversations.js +2 -2
  218. package/dist/server/handlers/datasets.cjs +3 -3
  219. package/dist/server/handlers/datasets.cjs.map +1 -1
  220. package/dist/server/handlers/datasets.d.ts +142 -142
  221. package/dist/server/handlers/datasets.js +3 -3
  222. package/dist/server/handlers/datasets.js.map +1 -1
  223. package/dist/server/handlers/dynamic-workflows.cjs +1 -1
  224. package/dist/server/handlers/dynamic-workflows.d.ts +76 -76
  225. package/dist/server/handlers/dynamic-workflows.js +1 -1
  226. package/dist/server/handlers/editor-builder.cjs +1 -1
  227. package/dist/server/handlers/editor-builder.d.ts +12 -12
  228. package/dist/server/handlers/editor-builder.js +1 -1
  229. package/dist/server/handlers/favorites-enrichment.cjs +1 -1
  230. package/dist/server/handlers/favorites-enrichment.js +1 -1
  231. package/dist/server/handlers/logs.cjs +1 -1
  232. package/dist/server/handlers/logs.d.ts +12 -12
  233. package/dist/server/handlers/logs.js +1 -1
  234. package/dist/server/handlers/mcp-client-versions.cjs +2 -2
  235. package/dist/server/handlers/mcp-client-versions.d.ts +28 -28
  236. package/dist/server/handlers/mcp-client-versions.js +2 -2
  237. package/dist/server/handlers/mcp.cjs +24 -3
  238. package/dist/server/handlers/mcp.cjs.map +1 -1
  239. package/dist/server/handlers/mcp.d.ts +55 -42
  240. package/dist/server/handlers/mcp.d.ts.map +1 -1
  241. package/dist/server/handlers/mcp.js +24 -3
  242. package/dist/server/handlers/mcp.js.map +1 -1
  243. package/dist/server/handlers/memory.cjs +3 -4
  244. package/dist/server/handlers/memory.cjs.map +1 -1
  245. package/dist/server/handlers/memory.d.ts +160 -152
  246. package/dist/server/handlers/memory.d.ts.map +1 -1
  247. package/dist/server/handlers/memory.js +3 -4
  248. package/dist/server/handlers/memory.js.map +1 -1
  249. package/dist/server/handlers/observability-new-endpoints.cjs +4 -1
  250. package/dist/server/handlers/observability-new-endpoints.d.ts +974 -518
  251. package/dist/server/handlers/observability-new-endpoints.d.ts.map +1 -1
  252. package/dist/server/handlers/observability-new-endpoints.js +2 -2
  253. package/dist/server/handlers/observability-shared.cjs +41 -2
  254. package/dist/server/handlers/observability-shared.cjs.map +1 -1
  255. package/dist/server/handlers/observability-shared.d.ts +24 -0
  256. package/dist/server/handlers/observability-shared.d.ts.map +1 -1
  257. package/dist/server/handlers/observability-shared.js +37 -2
  258. package/dist/server/handlers/observability-shared.js.map +1 -1
  259. package/dist/server/handlers/observability.cjs +8 -2
  260. package/dist/server/handlers/observability.cjs.map +1 -1
  261. package/dist/server/handlers/observability.d.ts +33 -27
  262. package/dist/server/handlers/observability.d.ts.map +1 -1
  263. package/dist/server/handlers/observability.js +6 -3
  264. package/dist/server/handlers/observability.js.map +1 -1
  265. package/dist/server/handlers/plans.cjs +2 -2
  266. package/dist/server/handlers/plans.d.ts +4 -4
  267. package/dist/server/handlers/plans.js +2 -2
  268. package/dist/server/handlers/processor-providers.cjs +1 -1
  269. package/dist/server/handlers/processor-providers.d.ts +8 -8
  270. package/dist/server/handlers/processor-providers.js +1 -1
  271. package/dist/server/handlers/processors.cjs +1 -1
  272. package/dist/server/handlers/processors.d.ts +12 -12
  273. package/dist/server/handlers/processors.js +1 -1
  274. package/dist/server/handlers/prompt-block-versions.cjs +2 -2
  275. package/dist/server/handlers/prompt-block-versions.d.ts +28 -28
  276. package/dist/server/handlers/prompt-block-versions.js +2 -2
  277. package/dist/server/handlers/responses.cjs +1 -1
  278. package/dist/server/handlers/responses.d.ts +23 -23
  279. package/dist/server/handlers/responses.js +1 -1
  280. package/dist/server/handlers/schedules.cjs +1 -1
  281. package/dist/server/handlers/schedules.d.ts +52 -36
  282. package/dist/server/handlers/schedules.d.ts.map +1 -1
  283. package/dist/server/handlers/schedules.js +1 -1
  284. package/dist/server/handlers/scorer-versions.cjs +3 -3
  285. package/dist/server/handlers/scorer-versions.d.ts +28 -28
  286. package/dist/server/handlers/scorer-versions.js +3 -3
  287. package/dist/server/handlers/scores.cjs +1 -1
  288. package/dist/server/handlers/scores.d.ts +24 -24
  289. package/dist/server/handlers/scores.js +1 -1
  290. package/dist/server/handlers/stored-agent-favorites.cjs +4 -4
  291. package/dist/server/handlers/stored-agent-favorites.d.ts +8 -8
  292. package/dist/server/handlers/stored-agent-favorites.js +4 -4
  293. package/dist/server/handlers/stored-agents.cjs +4 -4
  294. package/dist/server/handlers/stored-agents.d.ts +92 -28
  295. package/dist/server/handlers/stored-agents.d.ts.map +1 -1
  296. package/dist/server/handlers/stored-agents.js +4 -4
  297. package/dist/server/handlers/stored-mcp-clients.cjs +2 -2
  298. package/dist/server/handlers/stored-mcp-clients.d.ts +20 -20
  299. package/dist/server/handlers/stored-mcp-clients.js +2 -2
  300. package/dist/server/handlers/stored-prompt-blocks.cjs +2 -2
  301. package/dist/server/handlers/stored-prompt-blocks.d.ts +20 -20
  302. package/dist/server/handlers/stored-prompt-blocks.js +2 -2
  303. package/dist/server/handlers/stored-scorers.cjs +3 -3
  304. package/dist/server/handlers/stored-scorers.d.ts +20 -20
  305. package/dist/server/handlers/stored-scorers.js +3 -3
  306. package/dist/server/handlers/stored-skill-favorites.cjs +3 -3
  307. package/dist/server/handlers/stored-skill-favorites.d.ts +8 -8
  308. package/dist/server/handlers/stored-skill-favorites.js +3 -3
  309. package/dist/server/handlers/stored-skills.cjs +3 -3
  310. package/dist/server/handlers/stored-skills.d.ts +24 -24
  311. package/dist/server/handlers/stored-skills.js +3 -3
  312. package/dist/server/handlers/stored-workspaces.cjs +2 -2
  313. package/dist/server/handlers/stored-workspaces.d.ts +20 -20
  314. package/dist/server/handlers/stored-workspaces.js +2 -2
  315. package/dist/server/handlers/system.cjs +7 -5
  316. package/dist/server/handlers/system.cjs.map +1 -1
  317. package/dist/server/handlers/system.d.ts +10 -8
  318. package/dist/server/handlers/system.d.ts.map +1 -1
  319. package/dist/server/handlers/system.js +7 -5
  320. package/dist/server/handlers/system.js.map +1 -1
  321. package/dist/server/handlers/tool-providers.cjs +1 -1
  322. package/dist/server/handlers/tool-providers.d.ts +52 -52
  323. package/dist/server/handlers/tool-providers.js +1 -1
  324. package/dist/server/handlers/tools.cjs +6 -6
  325. package/dist/server/handlers/tools.d.ts +26 -20
  326. package/dist/server/handlers/tools.d.ts.map +1 -1
  327. package/dist/server/handlers/tools.js +5 -5
  328. package/dist/server/handlers/validate-agent-instructions.cjs +1 -1
  329. package/dist/server/handlers/validate-agent-instructions.js +1 -1
  330. package/dist/server/handlers/vector.cjs +1 -1
  331. package/dist/server/handlers/vector.d.ts +32 -32
  332. package/dist/server/handlers/vector.js +1 -1
  333. package/dist/server/handlers/workflow-builder.cjs +1 -1
  334. package/dist/server/handlers/workflow-builder.d.ts +8 -8
  335. package/dist/server/handlers/workflow-builder.js +1 -1
  336. package/dist/server/handlers/workflows.cjs +3 -3
  337. package/dist/server/handlers/workflows.d.ts +108 -108
  338. package/dist/server/handlers/workflows.js +3 -3
  339. package/dist/server/handlers/workspace.cjs +1 -1
  340. package/dist/server/handlers/workspace.d.ts +160 -160
  341. package/dist/server/handlers/workspace.js +1 -1
  342. package/dist/server/handlers.cjs +2 -2
  343. package/dist/server/handlers.js +2 -2
  344. package/dist/server/schemas/a2a.d.ts +165 -9
  345. package/dist/server/schemas/a2a.d.ts.map +1 -1
  346. package/dist/server/schemas/agent-versions.d.ts +40 -0
  347. package/dist/server/schemas/agent-versions.d.ts.map +1 -1
  348. package/dist/server/schemas/agents.d.ts +48 -1
  349. package/dist/server/schemas/agents.d.ts.map +1 -1
  350. package/dist/server/schemas/datasets.d.ts +4 -4
  351. package/dist/server/schemas/feedback.d.ts +3 -3
  352. package/dist/server/schemas/index.cjs +11 -11
  353. package/dist/server/schemas/index.js +11 -11
  354. package/dist/server/schemas/mcp.d.ts +8 -2
  355. package/dist/server/schemas/mcp.d.ts.map +1 -1
  356. package/dist/server/schemas/memory-config.d.ts +4 -0
  357. package/dist/server/schemas/memory-config.d.ts.map +1 -1
  358. package/dist/server/schemas/memory.d.ts +32 -28
  359. package/dist/server/schemas/memory.d.ts.map +1 -1
  360. package/dist/server/schemas/message-history.d.ts +7 -0
  361. package/dist/server/schemas/message-history.d.ts.map +1 -0
  362. package/dist/server/schemas/schedules.d.ts +9 -3
  363. package/dist/server/schemas/schedules.d.ts.map +1 -1
  364. package/dist/server/schemas/stored-agents.d.ts +80 -0
  365. package/dist/server/schemas/stored-agents.d.ts.map +1 -1
  366. package/dist/server/schemas/system.d.ts +2 -0
  367. package/dist/server/schemas/system.d.ts.map +1 -1
  368. package/dist/server/server-adapter/api-schema-manifest.d.ts +1 -1
  369. package/dist/server/server-adapter/index.cjs +3 -3
  370. package/dist/server/server-adapter/index.js +3 -3
  371. package/dist/server/server-adapter/openapi-utils.d.ts +1 -1
  372. package/dist/server/server-adapter/routes/a2a.d.ts +193 -59
  373. package/dist/server/server-adapter/routes/a2a.d.ts.map +1 -1
  374. package/dist/server/server-adapter/routes/agent-builder.d.ts +64 -64
  375. package/dist/server/server-adapter/routes/channels.d.ts +16 -16
  376. package/dist/server/server-adapter/routes/conversations.d.ts +19 -19
  377. package/dist/server/server-adapter/routes/datasets.d.ts +142 -142
  378. package/dist/server/server-adapter/routes/editor-builder.d.ts +40 -40
  379. package/dist/server/server-adapter/routes/legacy.d.ts +16 -16
  380. package/dist/server/server-adapter/routes/logs.d.ts +12 -12
  381. package/dist/server/server-adapter/routes/mcp.d.ts +54 -42
  382. package/dist/server/server-adapter/routes/mcp.d.ts.map +1 -1
  383. package/dist/server/server-adapter/routes/memory.d.ts +160 -152
  384. package/dist/server/server-adapter/routes/memory.d.ts.map +1 -1
  385. package/dist/server/server-adapter/routes/observability.d.ts +593 -286
  386. package/dist/server/server-adapter/routes/observability.d.ts.map +1 -1
  387. package/dist/server/server-adapter/routes/processor-providers.d.ts +8 -8
  388. package/dist/server/server-adapter/routes/processors.d.ts +12 -12
  389. package/dist/server/server-adapter/routes/responses.d.ts +12 -12
  390. package/dist/server/server-adapter/routes/scorers.d.ts +24 -24
  391. package/dist/server/server-adapter/routes/stored-mcp-clients.d.ts +48 -48
  392. package/dist/server/server-adapter/routes/stored-prompt-blocks.d.ts +48 -48
  393. package/dist/server/server-adapter/routes/stored-scorers.d.ts +48 -48
  394. package/dist/server/server-adapter/routes/stored-skills.d.ts +32 -32
  395. package/dist/server/server-adapter/routes/stored-workspaces.d.ts +20 -20
  396. package/dist/server/server-adapter/routes/system.d.ts +10 -8
  397. package/dist/server/server-adapter/routes/system.d.ts.map +1 -1
  398. package/dist/server/server-adapter/routes/tool-providers.d.ts +52 -52
  399. package/dist/server/server-adapter/routes/tools.d.ts +16 -12
  400. package/dist/server/server-adapter/routes/tools.d.ts.map +1 -1
  401. package/dist/server/server-adapter/routes/vectors.d.ts +32 -32
  402. package/dist/server/server-adapter/routes/workflows.d.ts +100 -100
  403. package/dist/server/server-adapter/routes/workspace.d.ts +107 -107
  404. package/dist/{stored-agents-AC0najKd.js → stored-agents-Bp76o0XY.js} +4 -2
  405. package/dist/stored-agents-Bp76o0XY.js.map +1 -0
  406. package/dist/{stored-agents-BJMM5f9A.cjs → stored-agents-CN9E52bJ.cjs} +4 -2
  407. package/dist/stored-agents-CN9E52bJ.cjs.map +1 -0
  408. package/dist/{stored-scorers-CWxW1_mY.cjs → stored-scorers-DSZRCvM3.cjs} +2 -2
  409. package/dist/{stored-scorers-CWxW1_mY.cjs.map → stored-scorers-DSZRCvM3.cjs.map} +1 -1
  410. package/dist/{stored-scorers-B8QVQCCs.js → stored-scorers-vssJQZiO.js} +2 -2
  411. package/dist/{stored-scorers-B8QVQCCs.js.map → stored-scorers-vssJQZiO.js.map} +1 -1
  412. package/dist/{system-Cfo5a63a.cjs → system-D85p7-oz.cjs} +3 -2
  413. package/dist/system-D85p7-oz.cjs.map +1 -0
  414. package/dist/{system-DT2JfUun.js → system-DMAG21IT.js} +3 -2
  415. package/dist/system-DMAG21IT.js.map +1 -0
  416. package/dist/{utils-WcR0QSUB.cjs → utils-DbHFc3hG.cjs} +5 -5
  417. package/dist/{utils-WcR0QSUB.cjs.map → utils-DbHFc3hG.cjs.map} +1 -1
  418. package/dist/{utils-Duk4hfT_.js → utils-mRt04Bqa.js} +3 -3
  419. package/dist/{utils-Duk4hfT_.js.map → utils-mRt04Bqa.js.map} +1 -1
  420. package/dist/{workflow-builder-D5dPsrog.cjs → workflow-builder-B6FVVlj_.cjs} +4 -4
  421. package/dist/{workflow-builder-D5dPsrog.cjs.map → workflow-builder-B6FVVlj_.cjs.map} +1 -1
  422. package/dist/{workflow-builder-Eape8SyU.js → workflow-builder-Cu0uWpzj.js} +4 -4
  423. package/dist/{workflow-builder-Eape8SyU.js.map → workflow-builder-Cu0uWpzj.js.map} +1 -1
  424. package/package.json +12 -12
  425. package/dist/a2a-8C4O2dVJ.js.map +0 -1
  426. package/dist/a2a-DQ8GeDz4.cjs.map +0 -1
  427. package/dist/a2a-DUBjstWk.js.map +0 -1
  428. package/dist/a2a-MPoM5lzS.cjs.map +0 -1
  429. package/dist/agents-CZE_MSQE.cjs.map +0 -1
  430. package/dist/agents-ssoMemNs.js.map +0 -1
  431. package/dist/dist-BKxbtiJd.cjs.map +0 -1
  432. package/dist/dist-DOpm-tIl.js.map +0 -1
  433. package/dist/mcp-BPmrXX9r.cjs.map +0 -1
  434. package/dist/mcp-B_OMG3Ol.js.map +0 -1
  435. package/dist/memory-BvKPIpyH.js.map +0 -1
  436. package/dist/memory-CDYtqQnE.cjs.map +0 -1
  437. package/dist/observability-new-endpoints-I2OxQzfY.cjs.map +0 -1
  438. package/dist/observability-new-endpoints-pIq_OWa8.js.map +0 -1
  439. package/dist/routes-BJZtqLVx.js.map +0 -1
  440. package/dist/routes-PJ3eKHbs.cjs.map +0 -1
  441. package/dist/schedules-BzymFGR_.js.map +0 -1
  442. package/dist/schedules-DaEv0Usj.cjs.map +0 -1
  443. package/dist/schema-BF_cZG0Y.js +0 -2
  444. package/dist/schema-C7CvwM1d.cjs +0 -1
  445. package/dist/stored-agents-AC0najKd.js.map +0 -1
  446. package/dist/stored-agents-BJMM5f9A.cjs.map +0 -1
  447. package/dist/system-Cfo5a63a.cjs.map +0 -1
  448. package/dist/system-DT2JfUun.js.map +0 -1
@@ -1,18 +1,18 @@
1
1
  import { o as __toESM$1, t as __commonJSMin$1 } from "./rolldown-runtime-maW3aOIk.js";
2
- import { n as standardSchemaToJSONSchema, r as toStandardSchema$1, t as isStandardSchemaWithJSON$1 } from "./schema-D_ikovK6-BzTeMhWf.js";
3
- import "./schema-BF_cZG0Y.js";
2
+ import { n as standardSchemaToJSONSchema, r as toStandardSchema$1, t as isStandardSchemaWithJSON$1 } from "./schema-BwlBcZRB-DUSSQ9TD.js";
3
+ import "./schema-Fa9iirVJ.js";
4
4
  import { t as require_sync } from "./sync-BG15Yae1.js";
5
- import { openai } from "./dist-DoTDZ7wF.js";
5
+ import { openai } from "./dist-Cdj_Yiml.js";
6
6
  import { createRequire } from "module";
7
7
  import * as z4 from "zod/v4";
8
8
  import { z } from "zod/v4";
9
9
  import { isStandardSchemaWithJSON, toStandardSchema } from "@mastra/core/schema";
10
10
  import { ZodFirstPartyTypeKind } from "zod/v3";
11
11
  import { z as z$2 } from "zod";
12
- import { MastraMemory, getThreadOMMetadata, parseMemoryRequestContext, setThreadOMMetadata } from "@mastra/core/memory";
12
+ import { MastraMemory, getMemoryTokenBoundary, getThreadOMMetadata, isAfterMemoryTokenBoundary, isThreadTitlePinned, loadMessageHistory, normalizeMessageHistoryConfig, parseMemoryRequestContext, setThreadOMMetadata } from "@mastra/core/memory";
13
13
  import { Agent, MessageList, isSupportedLanguageModel, tryGenerateWithJsonFallback, tryStreamWithJsonFallback } from "@mastra/core/agent";
14
14
  import { ErrorCategory, ErrorDomain, MastraError } from "@mastra/core/error";
15
- import { ModelRouterLanguageModel, modelSupportsAttachments, resolveModelConfig } from "@mastra/core/llm";
15
+ import { ModelRouterLanguageModel, modelSupportsAttachments, modelSupportsTemperature, resolveModelConfig } from "@mastra/core/llm";
16
16
  import { createTool } from "@mastra/core/tools";
17
17
  import { inspect, promisify } from "util";
18
18
  import crypto$1, { createHash, randomBytes, randomUUID } from "crypto";
@@ -21,7 +21,7 @@ import { generateEmptyFromSchema } from "@mastra/core/utils";
21
21
  import { InMemoryStore, MAX_KNOWLEDGE_NODE_DESCRIPTION_LENGTH, assertKnowledgeScopeWithinCeiling, canonicalizeKnowledgeScope, createKnowledgeNodeCursor, expandKnowledgeScope, isKnowledgeScopeVisible, knowledgeScopeKey } from "@mastra/core/storage";
22
22
  import { coreFeatures } from "@mastra/core/features";
23
23
  import { EntityType, SpanType, createObservabilityContext, getOrCreateSpan } from "@mastra/core/observability";
24
- import { MessageHistory } from "@mastra/core/processors";
24
+ import { MessageHistory, TokenLimiterProcessor } from "@mastra/core/processors";
25
25
  import { createStep, createWorkflow } from "@mastra/core/workflows";
26
26
  import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
27
27
  import { tmpdir } from "os";
@@ -4028,62 +4028,6 @@ async function e() {
4028
4028
  }((await WebAssembly.instantiate(t)).instance);
4029
4029
  }
4030
4030
  //#endregion
4031
- //#region ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/tokenx/1.3.0/09093cdaeebfe25c39ba9052d6277b45fc99abf5e14e859f60f338f5c5160afd/node_modules/tokenx/dist/index.mjs
4032
- const PATTERNS = {
4033
- whitespace: /^\s+$/,
4034
- cjk: /[\u4E00-\u9FFF\u3400-\u4DBF\u3000-\u303F\uFF00-\uFFEF\u30A0-\u30FF\u2E80-\u2EFF\u31C0-\u31EF\u3200-\u32FF\u3300-\u33FF\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F\uA960-\uA97F\uD7B0-\uD7FF]/,
4035
- numeric: /^\d+(?:[.,]\d+)*$/,
4036
- punctuation: /[.,!?;(){}[\]<>:/\\|@#$%^&*+=`~_-]/,
4037
- alphanumeric: /^[a-zA-Z0-9\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]+$/
4038
- };
4039
- const TOKEN_SPLIT_PATTERN = /* @__PURE__ */ new RegExp(`(\\s+|${PATTERNS.punctuation.source}+)`);
4040
- const DEFAULT_CHARS_PER_TOKEN = 6;
4041
- const SHORT_TOKEN_THRESHOLD = 3;
4042
- const DEFAULT_LANGUAGE_CONFIGS = [
4043
- {
4044
- pattern: /[äöüßẞ]/i,
4045
- averageCharsPerToken: 3
4046
- },
4047
- {
4048
- pattern: /[éèêëàâîïôûùüÿçœæáíóúñ]/i,
4049
- averageCharsPerToken: 3
4050
- },
4051
- {
4052
- pattern: /[ąćęłńóśźżěščřžýůúďťň]/i,
4053
- averageCharsPerToken: 3.5
4054
- }
4055
- ];
4056
- /**
4057
- * Estimates the number of tokens in a text string using heuristic rules.
4058
- */
4059
- function estimateTokenCount(text, options = {}) {
4060
- if (!text) return 0;
4061
- const { defaultCharsPerToken = DEFAULT_CHARS_PER_TOKEN, languageConfigs = DEFAULT_LANGUAGE_CONFIGS } = options;
4062
- const segments = text.split(TOKEN_SPLIT_PATTERN).filter(Boolean);
4063
- let tokenCount = 0;
4064
- for (const segment of segments) tokenCount += estimateSegmentTokens(segment, languageConfigs, defaultCharsPerToken);
4065
- return tokenCount;
4066
- }
4067
- function estimateSegmentTokens(segment, languageConfigs, defaultCharsPerToken) {
4068
- if (PATTERNS.whitespace.test(segment)) return 0;
4069
- if (PATTERNS.cjk.test(segment)) return getCharacterCount(segment);
4070
- if (PATTERNS.numeric.test(segment)) return 1;
4071
- if (segment.length <= SHORT_TOKEN_THRESHOLD) return 1;
4072
- if (PATTERNS.punctuation.test(segment)) return segment.length > 1 ? Math.ceil(segment.length / 2) : 1;
4073
- if (PATTERNS.alphanumeric.test(segment)) {
4074
- const charsPerToken$1 = getLanguageSpecificCharsPerToken(segment, languageConfigs) ?? defaultCharsPerToken;
4075
- return Math.ceil(segment.length / charsPerToken$1);
4076
- }
4077
- const charsPerToken = getLanguageSpecificCharsPerToken(segment, languageConfigs) ?? defaultCharsPerToken;
4078
- return Math.ceil(segment.length / charsPerToken);
4079
- }
4080
- function getLanguageSpecificCharsPerToken(segment, languageConfigs) {
4081
- for (const config of languageConfigs) if (config.pattern.test(segment)) return config.averageCharsPerToken;
4082
- }
4083
- function getCharacterCount(text) {
4084
- return Array.from(text).length;
4085
- }
4086
- //#endregion
4087
4031
  //#region ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/diff/8.0.4/6781cdda9837821c30a1f4c4db1d9286b838fe139b78d9658b2471e961b45953/node_modules/diff/libesm/diff/base.js
4088
4032
  var import_sync = /* @__PURE__ */ __toESM$1(require_sync(), 1);
4089
4033
  var Diff = class {
@@ -4693,7 +4637,7 @@ function splitLines(text) {
4693
4637
  return result;
4694
4638
  }
4695
4639
  //#endregion
4696
- //#region ../memory/dist/src-Dt8oPiQN.js
4640
+ //#region ../memory/dist/src-CSVmHSng.js
4697
4641
  var __defProp$3 = Object.defineProperty;
4698
4642
  var __exportAll = (all, no_symbols) => {
4699
4643
  let target = {};
@@ -22876,6 +22820,410 @@ function safeSlice(str, end) {
22876
22820
  const safeEnd = code >= 55296 && code <= 56319 ? end - 1 : end;
22877
22821
  return str.slice(0, safeEnd);
22878
22822
  }
22823
+ const PATTERNS = {
22824
+ whitespace: /^\s+$/,
22825
+ cjk: /[\u4E00-\u9FFF\u3400-\u4DBF\u3000-\u303F\uFF00-\uFFEF\u30A0-\u30FF\u2E80-\u2EFF\u31C0-\u31EF\u3200-\u32FF\u3300-\u33FF\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F\uA960-\uA97F\uD7B0-\uD7FF]/,
22826
+ numeric: /^\d+(?:[.,]\d+)*$/,
22827
+ punctuation: /[.,!?;(){}[\]<>:/\\|@#$%^&*+=`~_-]/,
22828
+ alphanumeric: /^[a-zA-Z0-9\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]+$/
22829
+ };
22830
+ const TOKEN_SPLIT_PATTERN = /* @__PURE__ */ new RegExp(`(\\s+|${PATTERNS.punctuation.source}+)`);
22831
+ const DEFAULT_CHARS_PER_TOKEN = 6;
22832
+ const SHORT_TOKEN_THRESHOLD = 3;
22833
+ const DEFAULT_LANGUAGE_CONFIGS = [
22834
+ {
22835
+ pattern: /[äöüßẞ]/i,
22836
+ averageCharsPerToken: 3
22837
+ },
22838
+ {
22839
+ pattern: /[éèêëàâîïôûùüÿçœæáíóúñ]/i,
22840
+ averageCharsPerToken: 3
22841
+ },
22842
+ {
22843
+ pattern: /[ąćęłńóśźżěščřžýůúďťň]/i,
22844
+ averageCharsPerToken: 3.5
22845
+ }
22846
+ ];
22847
+ /**
22848
+ * Estimates the number of tokens in a text string using heuristic rules.
22849
+ */
22850
+ function estimateTokenCount(text, options = {}) {
22851
+ if (!text) return 0;
22852
+ const { defaultCharsPerToken = DEFAULT_CHARS_PER_TOKEN, languageConfigs = DEFAULT_LANGUAGE_CONFIGS } = options;
22853
+ const segments = text.split(TOKEN_SPLIT_PATTERN).filter(Boolean);
22854
+ let tokenCount = 0;
22855
+ for (const segment of segments) tokenCount += estimateSegmentTokens(segment, languageConfigs, defaultCharsPerToken);
22856
+ return tokenCount;
22857
+ }
22858
+ function estimateSegmentTokens(segment, languageConfigs, defaultCharsPerToken) {
22859
+ if (PATTERNS.whitespace.test(segment)) return 0;
22860
+ if (PATTERNS.cjk.test(segment)) return getCharacterCount(segment);
22861
+ if (PATTERNS.numeric.test(segment)) return 1;
22862
+ if (segment.length <= SHORT_TOKEN_THRESHOLD) return 1;
22863
+ if (PATTERNS.punctuation.test(segment)) return segment.length > 1 ? Math.ceil(segment.length / 2) : 1;
22864
+ if (PATTERNS.alphanumeric.test(segment)) {
22865
+ const charsPerToken$1 = getLanguageSpecificCharsPerToken(segment, languageConfigs) ?? defaultCharsPerToken;
22866
+ return Math.ceil(segment.length / charsPerToken$1);
22867
+ }
22868
+ const charsPerToken = getLanguageSpecificCharsPerToken(segment, languageConfigs) ?? defaultCharsPerToken;
22869
+ return Math.ceil(segment.length / charsPerToken);
22870
+ }
22871
+ function getLanguageSpecificCharsPerToken(segment, languageConfigs) {
22872
+ for (const config of languageConfigs) if (config.pattern.test(segment)) return config.averageCharsPerToken;
22873
+ }
22874
+ function getCharacterCount(text) {
22875
+ return Array.from(text).length;
22876
+ }
22877
+ const DEFAULT_OBSERVER_TOOL_ARGUMENT_MAX_TOKENS = 2e3;
22878
+ const OBSERVER_TOOL_ARGUMENT_INLINE_STRING_MAX_CHARS = 160;
22879
+ const OBSERVER_TOOL_ARGUMENT_MAX_DEPTH = 5;
22880
+ const OBSERVER_TOOL_ARGUMENT_MAX_ENTRIES_PER_CONTAINER = 20;
22881
+ const OBSERVER_TOOL_ARGUMENT_MAX_OUTLINE_ENTRIES = 100;
22882
+ const OBSERVER_TOOL_ARGUMENT_MAX_PATH_CHARS = 160;
22883
+ function isObjectLike$1(value) {
22884
+ return typeof value === "object" && value !== null;
22885
+ }
22886
+ function sanitizeSurrogates(value) {
22887
+ let sanitized = "";
22888
+ for (let index = 0; index < value.length; index++) {
22889
+ const code = value.charCodeAt(index);
22890
+ if (code >= 55296 && code <= 56319) {
22891
+ const next = value.charCodeAt(index + 1);
22892
+ if (next >= 56320 && next <= 57343) {
22893
+ sanitized += value.charAt(index) + value.charAt(index + 1);
22894
+ index++;
22895
+ } else sanitized += "�";
22896
+ continue;
22897
+ }
22898
+ sanitized += code >= 56320 && code <= 57343 ? "�" : value[index];
22899
+ }
22900
+ return sanitized;
22901
+ }
22902
+ function stablePathDigest(value) {
22903
+ let hash = 2166136261;
22904
+ for (let index = 0; index < value.length; index++) hash = Math.imul(hash ^ value.charCodeAt(index), 16777619);
22905
+ return (hash >>> 0).toString(16).padStart(8, "0");
22906
+ }
22907
+ function safeTail(value, length) {
22908
+ let start = Math.max(0, value.length - length);
22909
+ if (start > 0) {
22910
+ const code = value.charCodeAt(start);
22911
+ if (code >= 56320 && code <= 57343) start++;
22912
+ }
22913
+ return value.slice(start);
22914
+ }
22915
+ function truncatePath(path) {
22916
+ if (path.length <= OBSERVER_TOOL_ARGUMENT_MAX_PATH_CHARS) return path;
22917
+ const headLength = 50;
22918
+ const tailLength = 60;
22919
+ const omitted = path.length - headLength - tailLength;
22920
+ return `${safeSlice(path, headLength)}…[${omitted} chars; ${stablePathDigest(path)}]…${safeTail(path, tailLength)}`;
22921
+ }
22922
+ function formatPath(parent, key, isArray) {
22923
+ if (isArray) return truncatePath(`${parent}[${key}]`);
22924
+ const stringKey = String(key);
22925
+ const segment = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(stringKey) ? stringKey : `[${JSON.stringify(stringKey)}]`;
22926
+ return truncatePath(parent ? `${parent}.${segment}` : segment);
22927
+ }
22928
+ function formatPrimitive(value) {
22929
+ if (typeof value === "string") return JSON.stringify(value);
22930
+ if (typeof value === "bigint") return `<bigint> ${value}`;
22931
+ if (typeof value === "symbol" || typeof value === "function") return JSON.stringify(String(value));
22932
+ if (value === void 0) return "<undefined>";
22933
+ if (typeof value === "number" && Object.is(value, -0)) return "-0";
22934
+ return String(value);
22935
+ }
22936
+ function containerSummary(value) {
22937
+ if (!Array.isArray(value)) return "<object>";
22938
+ try {
22939
+ return `<array, ${value.length} ${value.length === 1 ? "item" : "items"}>`;
22940
+ } catch {
22941
+ return "<array, unknown length>";
22942
+ }
22943
+ }
22944
+ function readEntries(value) {
22945
+ const entries = [];
22946
+ try {
22947
+ if (Array.isArray(value)) {
22948
+ const length = value.length;
22949
+ const visibleLength = Math.min(length, OBSERVER_TOOL_ARGUMENT_MAX_ENTRIES_PER_CONTAINER);
22950
+ for (let index = 0; index < visibleLength; index++) {
22951
+ if (!(index in value)) {
22952
+ entries.push({
22953
+ key: index,
22954
+ unavailable: "hole"
22955
+ });
22956
+ continue;
22957
+ }
22958
+ try {
22959
+ entries.push({
22960
+ key: index,
22961
+ value: value[index]
22962
+ });
22963
+ } catch {
22964
+ entries.push({
22965
+ key: index,
22966
+ unavailable: "unreadable"
22967
+ });
22968
+ }
22969
+ }
22970
+ return {
22971
+ entries,
22972
+ hasMore: length > visibleLength,
22973
+ unavailable: false
22974
+ };
22975
+ }
22976
+ let hasMore = false;
22977
+ for (const key in value) {
22978
+ if (!Object.prototype.hasOwnProperty.call(value, key)) continue;
22979
+ if (entries.length >= OBSERVER_TOOL_ARGUMENT_MAX_ENTRIES_PER_CONTAINER) {
22980
+ hasMore = true;
22981
+ break;
22982
+ }
22983
+ try {
22984
+ entries.push({
22985
+ key,
22986
+ value: value[key]
22987
+ });
22988
+ } catch {
22989
+ entries.push({
22990
+ key,
22991
+ unavailable: "unreadable"
22992
+ });
22993
+ }
22994
+ }
22995
+ return {
22996
+ entries,
22997
+ hasMore,
22998
+ unavailable: false
22999
+ };
23000
+ } catch {
23001
+ return {
23002
+ entries,
23003
+ hasMore: false,
23004
+ unavailable: true
23005
+ };
23006
+ }
23007
+ }
23008
+ function fits(text, limits) {
23009
+ return text.length <= limits.maxCharacters && estimateTokenCount(text) <= limits.maxTokens;
23010
+ }
23011
+ function joinEntries(entries, marker) {
23012
+ const lines = [...entries].sort((a, b) => a.order - b.order).map((entry) => entry.text);
23013
+ if (marker) lines.push(marker);
23014
+ return lines.join("\n");
23015
+ }
23016
+ function selectOutlineEntries(entries, limits) {
23017
+ const all = joinEntries(entries);
23018
+ if (fits(all, limits)) return all;
23019
+ const marker = "... [additional argument fields omitted by size limit]";
23020
+ const selected = [];
23021
+ const candidates = [...entries].sort((a, b) => {
23022
+ if (a.depth !== b.depth) return a.depth - b.depth;
23023
+ return estimateTokenCount(a.text) - estimateTokenCount(b.text) || a.text.length - b.text.length || a.order - b.order;
23024
+ });
23025
+ for (const candidate of candidates) if (fits(joinEntries([...selected, candidate], marker), limits)) selected.push(candidate);
23026
+ const rendered = joinEntries(selected, marker);
23027
+ if (fits(rendered, limits)) return rendered;
23028
+ if (fits(marker, limits)) return marker;
23029
+ return fits("…", limits) ? "…" : "";
23030
+ }
23031
+ function indentPreview(value) {
23032
+ return value.split("\n").map((line) => ` | ${line}`).join("\n");
23033
+ }
23034
+ function formatPreview(path, value, limits, prefix = "") {
23035
+ const sanitizedValue = sanitizeSurrogates(value);
23036
+ const marker = (visible) => {
23037
+ const omitted = sanitizedValue.length - visible.length;
23038
+ return `${path}:\n${indentPreview(visible)}${omitted > 0 ? `\n | ... [${omitted} characters omitted]` : ""}`;
23039
+ };
23040
+ let low = 0;
23041
+ let high = sanitizedValue.length;
23042
+ let best = "";
23043
+ while (low <= high) {
23044
+ const mid = Math.floor((low + high) / 2);
23045
+ const candidate = marker(safeSlice(sanitizedValue, mid));
23046
+ if (fits(prefix ? `${prefix}\n${candidate}` : candidate, limits)) {
23047
+ best = candidate;
23048
+ low = mid + 1;
23049
+ } else high = mid - 1;
23050
+ }
23051
+ return best;
23052
+ }
23053
+ function appendWithinBudget(base, addition, limits) {
23054
+ if (!addition) return;
23055
+ const candidate = base ? `${base}\n${addition}` : addition;
23056
+ return fits(candidate, limits) ? candidate : void 0;
23057
+ }
23058
+ /**
23059
+ * Formats tool arguments for the Observer without allowing a large early value
23060
+ * to hide concise sibling fields. A breadth-first structural outline is selected
23061
+ * before bounded previews of large strings are added.
23062
+ */
23063
+ function formatToolArgumentsForObserver(value, options) {
23064
+ const limits = {
23065
+ maxTokens: options?.maxTokens ?? DEFAULT_OBSERVER_TOOL_ARGUMENT_MAX_TOKENS,
23066
+ maxCharacters: options?.maxCharacters ?? Number.POSITIVE_INFINITY
23067
+ };
23068
+ if (limits.maxTokens <= 0 || limits.maxCharacters <= 0) return "";
23069
+ if (!isObjectLike$1(value)) {
23070
+ if (typeof value !== "string" || value.length <= OBSERVER_TOOL_ARGUMENT_INLINE_STRING_MAX_CHARS) {
23071
+ const primitive = formatPrimitive(value);
23072
+ return fits(primitive, limits) ? primitive : fits("…", limits) ? "…" : "";
23073
+ }
23074
+ const summary = `<string, ${value.length} characters; preview size-limited>`;
23075
+ const rendered = appendWithinBudget(summary, formatPreview("preview", value, limits, summary), limits);
23076
+ if (rendered) return rendered;
23077
+ if (fits(summary, limits)) return summary;
23078
+ return fits("…", limits) ? "…" : "";
23079
+ }
23080
+ const outline = [];
23081
+ const previews = [];
23082
+ const pending = [{
23083
+ path: "",
23084
+ value,
23085
+ depth: 0,
23086
+ ancestors: /* @__PURE__ */ new Set([value])
23087
+ }];
23088
+ let outlineEntries = 0;
23089
+ let order = 0;
23090
+ let structuralLimitReached = false;
23091
+ while (pending.length > 0 && outlineEntries < OBSERVER_TOOL_ARGUMENT_MAX_OUTLINE_ENTRIES) {
23092
+ const current = pending.shift();
23093
+ const read = readEntries(current.value);
23094
+ if (read.unavailable) {
23095
+ outline.push({
23096
+ text: `${current.path || "arguments"}: [unavailable container]`,
23097
+ depth: current.depth,
23098
+ order: order++
23099
+ });
23100
+ outlineEntries++;
23101
+ continue;
23102
+ }
23103
+ if (read.entries.length === 0 && !read.hasMore) {
23104
+ outline.push({
23105
+ text: `${current.path || "arguments"}: [empty ${Array.isArray(current.value) ? "array" : "object"}]`,
23106
+ depth: current.depth,
23107
+ order: order++
23108
+ });
23109
+ outlineEntries++;
23110
+ continue;
23111
+ }
23112
+ if (read.hasMore) {
23113
+ outline.push({
23114
+ text: `${current.path || (Array.isArray(current.value) ? "items" : "fields")}: ... [additional entries omitted]`,
23115
+ depth: current.depth,
23116
+ order: order++
23117
+ });
23118
+ outlineEntries++;
23119
+ }
23120
+ for (const entry of read.entries) {
23121
+ if (outlineEntries >= OBSERVER_TOOL_ARGUMENT_MAX_OUTLINE_ENTRIES) {
23122
+ structuralLimitReached = true;
23123
+ break;
23124
+ }
23125
+ const path = formatPath(current.path, entry.key, Array.isArray(current.value));
23126
+ outlineEntries++;
23127
+ if (entry.unavailable) {
23128
+ outline.push({
23129
+ text: `${path}: [${entry.unavailable}]`,
23130
+ depth: current.depth,
23131
+ order: order++
23132
+ });
23133
+ continue;
23134
+ }
23135
+ const entryValue = entry.value;
23136
+ if (typeof entryValue === "string" && entryValue.length > OBSERVER_TOOL_ARGUMENT_INLINE_STRING_MAX_CHARS) {
23137
+ outline.push({
23138
+ text: `${path}: <string, ${entryValue.length} characters; preview size-limited>`,
23139
+ depth: current.depth,
23140
+ order: order++
23141
+ });
23142
+ previews.push({
23143
+ path,
23144
+ value: entryValue
23145
+ });
23146
+ continue;
23147
+ }
23148
+ if (!isObjectLike$1(entryValue)) {
23149
+ outline.push({
23150
+ text: `${path}: ${formatPrimitive(entryValue)}`,
23151
+ depth: current.depth,
23152
+ order: order++
23153
+ });
23154
+ continue;
23155
+ }
23156
+ if (current.ancestors.has(entryValue)) {
23157
+ outline.push({
23158
+ text: `${path}: [circular]`,
23159
+ depth: current.depth,
23160
+ order: order++
23161
+ });
23162
+ continue;
23163
+ }
23164
+ const summary = containerSummary(entryValue);
23165
+ if (current.depth >= OBSERVER_TOOL_ARGUMENT_MAX_DEPTH) {
23166
+ outline.push({
23167
+ text: `${path}: ${summary} [max depth reached]`,
23168
+ depth: current.depth,
23169
+ order: order++
23170
+ });
23171
+ continue;
23172
+ }
23173
+ outline.push({
23174
+ text: `${path}: ${summary}`,
23175
+ depth: current.depth,
23176
+ order: order++
23177
+ });
23178
+ pending.push({
23179
+ path,
23180
+ value: entryValue,
23181
+ depth: current.depth + 1,
23182
+ ancestors: /* @__PURE__ */ new Set([...current.ancestors, entryValue])
23183
+ });
23184
+ }
23185
+ }
23186
+ if (pending.length > 0 || structuralLimitReached) outline.push({
23187
+ text: "... [additional nested entries omitted by structure limit]",
23188
+ depth: Number.POSITIVE_INFINITY,
23189
+ order: order++
23190
+ });
23191
+ if (previews.length === 0) return selectOutlineEntries(outline, limits);
23192
+ const previewHeader = "Large string previews (size-limited):";
23193
+ const renderedOutline = selectOutlineEntries(outline, limits);
23194
+ const withPreviewHeader = appendWithinBudget(renderedOutline, previewHeader, limits);
23195
+ if (!withPreviewHeader) return renderedOutline;
23196
+ let rendered = withPreviewHeader;
23197
+ let renderedPreviews = 0;
23198
+ let omittedPreviews = 0;
23199
+ for (let index = 0; index < previews.length; index++) {
23200
+ const remainingCount = previews.length - index;
23201
+ const remainingTokens = Math.max(0, limits.maxTokens - estimateTokenCount(rendered));
23202
+ const remainingCharacters = Math.max(0, limits.maxCharacters - rendered.length - 1);
23203
+ const previewLimits = {
23204
+ maxTokens: estimateTokenCount(rendered) + Math.floor(remainingTokens / remainingCount),
23205
+ maxCharacters: rendered.length + 1 + Math.floor(remainingCharacters / remainingCount)
23206
+ };
23207
+ const preview = formatPreview(previews[index].path, previews[index].value, previewLimits, rendered);
23208
+ if (!preview) {
23209
+ omittedPreviews++;
23210
+ continue;
23211
+ }
23212
+ const withPreview = appendWithinBudget(rendered, preview, limits);
23213
+ if (!withPreview) {
23214
+ omittedPreviews++;
23215
+ continue;
23216
+ }
23217
+ rendered = withPreview;
23218
+ renderedPreviews++;
23219
+ }
23220
+ if (renderedPreviews === 0) return renderedOutline;
23221
+ if (omittedPreviews > 0) {
23222
+ const marker = `... [${omittedPreviews} large string ${omittedPreviews === 1 ? "preview" : "previews"} omitted]`;
23223
+ rendered = appendWithinBudget(rendered, marker, limits) ?? rendered;
23224
+ }
23225
+ return rendered;
23226
+ }
22879
23227
  const ENCRYPTED_CONTENT_KEY = "encryptedContent";
22880
23228
  const ENCRYPTED_CONTENT_REDACTION_THRESHOLD = 256;
22881
23229
  function isObjectLike(value) {
@@ -22953,7 +23301,7 @@ function truncateStringByTokens(text, maxTokens) {
22953
23301
  return best;
22954
23302
  }
22955
23303
  function formatToolResultForObserver(value, options) {
22956
- return truncateStringByTokens(stringifyToolResult(value), options?.maxTokens ?? 1e4);
23304
+ return truncateStringByTokens(stringifyToolResult(value), options?.maxTokens ?? 5e3);
22957
23305
  }
22958
23306
  /**
22959
23307
  * The core extraction instructions for the Observer.
@@ -23638,9 +23986,52 @@ function getTemporalGapMarkerText(msg) {
23638
23986
  if (metadata?.reminderType === "temporal-gap" && typeof metadata.gapText === "string") return metadata.gapText;
23639
23987
  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") return metadata.systemReminder.gapText;
23640
23988
  }
23641
- function formatObserverMessage(msg, counter, options) {
23989
+ function isCallLikeToolInvocation(invocation) {
23990
+ return invocation.state === "call" || invocation.state === "partial-call" || invocation.state === "approval-requested" || invocation.state === "approval-responded";
23991
+ }
23992
+ function isTerminalToolInvocation(invocation) {
23993
+ return invocation.state === "result" || invocation.state === "output-error" || invocation.state === "output-denied";
23994
+ }
23995
+ function createObserverToolFormattingState(messages) {
23996
+ const exchanges = /* @__PURE__ */ new Map();
23997
+ const occurrences = /* @__PURE__ */ new Map();
23998
+ let occurrence = 0;
23999
+ for (const message of messages) {
24000
+ if (typeof message.content === "string" || !Array.isArray(message.content?.parts)) continue;
24001
+ for (const part of message.content.parts) {
24002
+ if (part.type !== "tool-invocation") continue;
24003
+ const invocation = part.toolInvocation;
24004
+ occurrences.set(part, occurrence);
24005
+ if (!isCallLikeToolInvocation(invocation) && !isTerminalToolInvocation(invocation)) {
24006
+ occurrence++;
24007
+ continue;
24008
+ }
24009
+ const exchange = exchanges.get(invocation.toolCallId) ?? { firstOccurrence: occurrence };
24010
+ if (isCallLikeToolInvocation(invocation) && (invocation.args !== void 0 || exchange.signature === void 0)) exchange.signature = invocation;
24011
+ if (isTerminalToolInvocation(invocation)) exchange.terminal = {
24012
+ ...invocation,
24013
+ occurrence
24014
+ };
24015
+ exchanges.set(invocation.toolCallId, exchange);
24016
+ occurrence++;
24017
+ }
24018
+ }
24019
+ for (const exchange of exchanges.values()) if (exchange.terminal?.args !== void 0) exchange.signature = exchange.terminal;
24020
+ else if (!exchange.signature && exchange.terminal) exchange.signature = exchange.terminal;
24021
+ return {
24022
+ exchanges,
24023
+ occurrences,
24024
+ emittedCalls: /* @__PURE__ */ new Set(),
24025
+ emittedOutcomes: /* @__PURE__ */ new Set()
24026
+ };
24027
+ }
24028
+ function formatObserverToolArguments(args, maxCharacters) {
24029
+ if (args === void 0) return maybeTruncate("[arguments unavailable]", maxCharacters);
24030
+ return formatToolArgumentsForObserver(args, { maxCharacters: maxCharacters || void 0 });
24031
+ }
24032
+ function formatObserverMessage(msg, counter, toolFormatting, options) {
23642
24033
  const maxLen = options?.maxPartLength;
23643
- const maxToolResultTokens = options?.maxToolResultTokens ?? 1e4;
24034
+ const maxToolResultTokens = options?.maxToolResultTokens ?? 5e3;
23644
24035
  const attachmentFilter = options?.attachmentFilter;
23645
24036
  const role = msg.role.charAt(0).toUpperCase() + msg.role.slice(1);
23646
24037
  const attachments = [];
@@ -23667,14 +24058,31 @@ function formatObserverMessage(msg, counter, options) {
23667
24058
  }
23668
24059
  if (part.type === "tool-invocation") {
23669
24060
  const inv = part.toolInvocation;
24061
+ const occurrence = toolFormatting.occurrences.get(part);
24062
+ const exchange = toolFormatting.exchanges.get(inv.toolCallId);
24063
+ if (exchange && occurrence === exchange.firstOccurrence && exchange.signature && !toolFormatting.emittedCalls.has(inv.toolCallId)) {
24064
+ toolFormatting.emittedCalls.add(inv.toolCallId);
24065
+ pushLine(`Tool Call ${exchange.signature.toolName}`, formatObserverToolArguments(exchange.signature.args, maxLen), partCreatedAt);
24066
+ }
23670
24067
  if (inv.state === "result") {
23671
24068
  const { value: resultForObserver } = resolveToolResultValue(part, inv.result);
23672
24069
  const { resultWithoutAttachments, attachments: extractedAttachments } = extractToolResultAttachments(resultForObserver, counter, attachmentFilter);
23673
24070
  if (extractedAttachments.length > 0) attachments.push(...extractedAttachments);
23674
- pushLine(`Tool Result ${inv.toolName}`, maybeTruncate(formatToolResultForObserver(resultWithoutAttachments, { maxTokens: maxToolResultTokens }), maxLen), partCreatedAt);
24071
+ if (exchange?.terminal?.occurrence === occurrence && !toolFormatting.emittedOutcomes.has(inv.toolCallId)) {
24072
+ toolFormatting.emittedOutcomes.add(inv.toolCallId);
24073
+ const hasResult = resultWithoutAttachments !== void 0 && (typeof resultWithoutAttachments !== "string" || resultWithoutAttachments.trim().length > 0);
24074
+ const body = inv.isError ? hasResult ? formatToolResultForObserver(resultWithoutAttachments, { maxTokens: maxToolResultTokens }) : inv.errorText?.trim() ? inv.errorText : "Tool execution failed" : hasResult ? formatToolResultForObserver(resultWithoutAttachments, { maxTokens: maxToolResultTokens }) : "[empty result]";
24075
+ pushLine(`${inv.isError ? "Tool Error" : "Tool Result"} ${inv.toolName}`, maybeTruncate(body, maxLen), partCreatedAt);
24076
+ }
24077
+ return;
24078
+ }
24079
+ if (exchange?.terminal?.occurrence === occurrence && !toolFormatting.emittedOutcomes.has(inv.toolCallId)) {
24080
+ toolFormatting.emittedOutcomes.add(inv.toolCallId);
24081
+ if (inv.state === "output-error") pushLine(`Tool Error ${inv.toolName}`, maybeTruncate(inv.errorText?.trim() ? inv.errorText : "Tool execution failed", maxLen), partCreatedAt);
24082
+ else if (inv.state === "output-denied") pushLine(`Tool Denied ${inv.toolName}`, maybeTruncate(inv.approval?.reason?.trim() ? inv.approval.reason : "Tool call was not approved by the user", maxLen), partCreatedAt);
23675
24083
  return;
23676
24084
  }
23677
- pushLine(`Tool Call ${inv.toolName}`, maybeTruncate(JSON.stringify(inv.args, null, 2), maxLen), partCreatedAt);
24085
+ if (!exchange) pushLine(`Tool Call ${inv.toolName}`, formatObserverToolArguments(inv.args, maxLen), partCreatedAt);
23678
24086
  return;
23679
24087
  }
23680
24088
  const partType = part.type;
@@ -23708,10 +24116,11 @@ function formatMessagesForObserver(messages, options) {
23708
24116
  nextImageId: 1,
23709
24117
  nextFileId: 1
23710
24118
  };
24119
+ const toolFormatting = createObserverToolFormattingState(messages);
23711
24120
  const sections = [];
23712
24121
  let context = {};
23713
24122
  for (const message of messages) {
23714
- const formatted = formatObserverMessage(message, counter, options);
24123
+ const formatted = formatObserverMessage(message, counter, toolFormatting, options);
23715
24124
  if (formatted.lines.length === 0) continue;
23716
24125
  const rendered = formatObserverLines(formatted.lines, context);
23717
24126
  if (!rendered.text) continue;
@@ -23734,13 +24143,14 @@ function buildObserverHistoryMessage(messages, options) {
23734
24143
  nextImageId: 1,
23735
24144
  nextFileId: 1
23736
24145
  };
24146
+ const toolFormatting = createObserverToolFormattingState(messages);
23737
24147
  const content = [{
23738
24148
  type: "text",
23739
24149
  text: "## New Message History to Observe\n\n"
23740
24150
  }];
23741
24151
  let context = {};
23742
24152
  messages.forEach((message) => {
23743
- const formatted = formatObserverMessage(message, counter, options);
24153
+ const formatted = formatObserverMessage(message, counter, toolFormatting, options);
23744
24154
  if (formatted.lines.length === 0 && formatted.attachments.length === 0) return;
23745
24155
  context = appendFormattedObserverMessage(content, formatted, context);
23746
24156
  });
@@ -23768,10 +24178,11 @@ function buildMultiThreadObserverHistoryMessage(messagesByThread, threadOrder, o
23768
24178
  const messages = messagesByThread.get(threadId);
23769
24179
  if (!messages || messages.length === 0) return;
23770
24180
  const threadContent = [];
24181
+ const toolFormatting = createObserverToolFormattingState(messages);
23771
24182
  let context = {};
23772
24183
  let hasVisibleContent = false;
23773
24184
  messages.forEach((message) => {
23774
- const formatted = formatObserverMessage(message, counter, options);
24185
+ const formatted = formatObserverMessage(message, counter, toolFormatting, options);
23775
24186
  if (formatted.lines.length === 0 && formatted.attachments.length === 0) return;
23776
24187
  context = appendFormattedObserverMessage(threadContent, formatted, context);
23777
24188
  hasVisibleContent = true;
@@ -24457,15 +24868,14 @@ var ObserverRunner = class {
24457
24868
  this.mastra = mastra;
24458
24869
  }
24459
24870
  createAgent(model, isMultiThread = false, memory, extractors = this.observationConfig.extractors ?? []) {
24460
- const agent = new Agent({
24871
+ return new Agent({
24461
24872
  id: isMultiThread ? "multi-thread-observer" : "observational-memory-observer",
24462
24873
  name: isMultiThread ? "multi-thread-observer" : "Observer",
24463
24874
  instructions: buildObserverSystemPrompt(isMultiThread, this.observationConfig.instruction, this.observationConfig.threadTitle, extractors),
24464
24875
  model,
24465
- ...memory ? { memory } : {}
24876
+ ...memory ? { memory } : {},
24877
+ ...this.mastra ? { mastra: this.mastra } : {}
24466
24878
  });
24467
- if (this.mastra) agent.__registerMastra(this.mastra);
24468
- return agent;
24469
24879
  }
24470
24880
  /**
24471
24881
  * Extract a router-style model ID (`provider/model`) from a model config.
@@ -26107,7 +26517,7 @@ var TokenCounter = class TokenCounter {
26107
26517
  let tokens = 0;
26108
26518
  let overheadDelta = 0;
26109
26519
  if (invocation.toolName) tokens += this.readOrPersistPartEstimate(part, "tool-call-name", invocation.toolName);
26110
- if (invocation.args) if (typeof invocation.args === "string") tokens += this.readOrPersistPartEstimate(part, "tool-call-args", invocation.args);
26520
+ if (invocation.args !== void 0) if (typeof invocation.args === "string") tokens += this.readOrPersistPartEstimate(part, "tool-call-args", invocation.args);
26111
26521
  else {
26112
26522
  const argsJson = JSON.stringify(invocation.args);
26113
26523
  tokens += this.readOrPersistPartEstimate(part, "tool-call-args-json", argsJson);
@@ -26153,8 +26563,11 @@ var TokenCounter = class TokenCounter {
26153
26563
  }
26154
26564
  if (state === "result") {
26155
26565
  extraMessageDelta++;
26566
+ const signature = this.countToolCallSignature(part, invocation);
26567
+ tokens += signature.tokens;
26568
+ overheadDelta += signature.overheadDelta;
26156
26569
  const { value: resultForCounting, usingStoredModelOutput } = this.resolveToolResultForTokenCounting(part, invocation.result);
26157
- if (resultForCounting !== void 0) {
26570
+ if (resultForCounting !== void 0 && (typeof resultForCounting !== "string" || resultForCounting.trim().length > 0)) {
26158
26571
  const contentTokens = this.countMultimodalToolResultContent(part, resultForCounting);
26159
26572
  if (contentTokens !== void 0) tokens += contentTokens;
26160
26573
  else {
@@ -26162,6 +26575,9 @@ var TokenCounter = class TokenCounter {
26162
26575
  tokens += this.readOrPersistPartEstimate(part, usingStoredModelOutput ? "tool-result-model-output-json" : "tool-result-json", formattedResult);
26163
26576
  }
26164
26577
  if (typeof resultForCounting !== "string") overheadDelta -= 12;
26578
+ } else {
26579
+ const fallback = invocation.isError ? invocation.errorText?.trim() ? invocation.errorText : "Tool execution failed" : "[empty result]";
26580
+ tokens += this.readOrPersistPartEstimate(part, invocation.isError ? "tool-result-error" : "tool-result-json", fallback);
26165
26581
  }
26166
26582
  return {
26167
26583
  tokens,
@@ -26171,7 +26587,10 @@ var TokenCounter = class TokenCounter {
26171
26587
  }
26172
26588
  if (state === "output-denied") {
26173
26589
  extraMessageDelta++;
26174
- const reason = invocation.approval?.reason ?? "Tool call was not approved by the user";
26590
+ const signature = this.countToolCallSignature(part, invocation);
26591
+ tokens += signature.tokens;
26592
+ overheadDelta += signature.overheadDelta;
26593
+ const reason = invocation.approval?.reason?.trim() ? invocation.approval.reason : "Tool call was not approved by the user";
26175
26594
  tokens += this.readOrPersistPartEstimate(part, "tool-result-denied", reason);
26176
26595
  return {
26177
26596
  tokens,
@@ -26181,7 +26600,10 @@ var TokenCounter = class TokenCounter {
26181
26600
  }
26182
26601
  if (state === "output-error") {
26183
26602
  extraMessageDelta++;
26184
- const errorMessage = typeof invocation.errorText === "string" ? invocation.errorText : "Tool execution failed";
26603
+ const signature = this.countToolCallSignature(part, invocation);
26604
+ tokens += signature.tokens;
26605
+ overheadDelta += signature.overheadDelta;
26606
+ const errorMessage = invocation.errorText?.trim() ? invocation.errorText : "Tool execution failed";
26185
26607
  tokens += this.readOrPersistPartEstimate(part, "tool-result-error", errorMessage);
26186
26608
  return {
26187
26609
  tokens,
@@ -26208,7 +26630,12 @@ var TokenCounter = class TokenCounter {
26208
26630
  };
26209
26631
  }
26210
26632
  /**
26211
- * Count tokens in a single message
26633
+ * Count tokens in a single message.
26634
+ *
26635
+ * Canonical terminal invocations carry their call signature and outcome in one part. Legacy or
26636
+ * foreign histories may instead repeat the same signature across separate call and result
26637
+ * messages; those signatures are intentionally counted once per message because this API has no
26638
+ * sequence context. The conservative overcount can activate observation earlier, never later.
26212
26639
  */
26213
26640
  countMessage(message) {
26214
26641
  let payloadTokens = this.countString(message.role);
@@ -26896,13 +27323,13 @@ function renderFormattedParts(parts, timestamps, options) {
26896
27323
  tokenOffset: expandedTokens - options.maxTokens
26897
27324
  };
26898
27325
  }
26899
- async function recallPart({ memory, threadId, resourceId, cursor, partIndex, charOffset, threadScope, maxTokens = DEFAULT_MAX_RESULT_TOKENS }) {
27326
+ async function recallPart({ memory, threadId, resourceId, cursor, partIndex, charOffset, threadScope, retrievalScope = "thread", maxTokens = DEFAULT_MAX_RESULT_TOKENS }) {
26900
27327
  if (!memory || typeof memory.getMemoryStore !== "function") throw new Error("Memory instance is required for recall");
26901
27328
  if (!threadId) throw new Error("Thread ID is required for recall");
26902
27329
  const resolved = await resolveCursorMessage(memory, cursor, {
26903
27330
  resourceId,
26904
27331
  threadScope,
26905
- enforceThreadScope: false
27332
+ enforceThreadScope: retrievalScope !== "resource"
26906
27333
  });
26907
27334
  if ("hint" in resolved) throw new Error(resolved.hint);
26908
27335
  const allParts = formatMessageParts(resolved, "high");
@@ -26913,7 +27340,7 @@ async function recallPart({ memory, threadId, resourceId, cursor, partIndex, cha
26913
27340
  if (partIndex > Math.max(...allParts.map((p) => p.partIndex))) {
26914
27341
  const nextMessage = await getNextVisibleMessage({
26915
27342
  memory,
26916
- threadId,
27343
+ threadId: resolved.threadId ?? threadId,
26917
27344
  resourceId,
26918
27345
  after: resolved.createdAt
26919
27346
  });
@@ -26952,7 +27379,7 @@ async function recallPart({ memory, threadId, resourceId, cursor, partIndex, cha
26952
27379
  note
26953
27380
  };
26954
27381
  }
26955
- async function recallMessages({ memory, threadId, resourceId, cursor, page = 1, limit = 20, detail = "low", partType, toolName, threadScope, maxTokens = DEFAULT_MAX_RESULT_TOKENS }) {
27382
+ async function recallMessages({ memory, threadId, resourceId, cursor, page = 1, limit = 20, detail = "low", partType, toolName, threadScope, retrievalScope = "thread", maxTokens = DEFAULT_MAX_RESULT_TOKENS }) {
26956
27383
  if (!memory) throw new Error("Memory instance is required for recall");
26957
27384
  if (!threadId) throw new Error("Thread ID is required for recall");
26958
27385
  if (typeof memory.getMemoryStore !== "function") throw new Error("recall requires a Memory instance with storage access");
@@ -26963,7 +27390,7 @@ async function recallMessages({ memory, threadId, resourceId, cursor, page = 1,
26963
27390
  const resolved = await resolveCursorMessage(memory, cursor, {
26964
27391
  resourceId,
26965
27392
  threadScope,
26966
- enforceThreadScope: false
27393
+ enforceThreadScope: retrievalScope === "thread"
26967
27394
  });
26968
27395
  if ("hint" in resolved) return {
26969
27396
  messages: resolved.hint,
@@ -26980,7 +27407,7 @@ async function recallMessages({ memory, threadId, resourceId, cursor, page = 1,
26980
27407
  const anchor = resolved;
26981
27408
  const crossThreadId = anchor.threadId && anchor.threadId !== threadId ? anchor.threadId : void 0;
26982
27409
  if (crossThreadId && threadScope) return {
26983
- messages: `Cursor does not belong to the active thread. Expected thread "${threadId}" but cursor "${cursor}" belongs to "${anchor.threadId}". Pass threadId="${anchor.threadId}" to browse that thread, or omit threadId and use this cursor directly in resource scope.`,
27410
+ messages: `Cursor does not belong to the active thread. Expected thread "${threadId}" but cursor "${cursor}" belongs to "${anchor.threadId}". Pass threadId="${anchor.threadId}" to browse that thread.`,
26984
27411
  count: 0,
26985
27412
  cursor,
26986
27413
  page: normalizedPage,
@@ -27139,7 +27566,8 @@ async function recallThreadFromStart({ memory, threadId, resourceId, page = 1, l
27139
27566
  };
27140
27567
  }
27141
27568
  const recallTool = (_memoryConfig, options) => {
27142
- const isResourceScope = (options?.retrievalScope ?? "thread") === "resource";
27569
+ const retrievalScope = options?.retrievalScope ?? "thread";
27570
+ const isResourceScope = retrievalScope === "resource";
27143
27571
  const searchEnabled = options?.searchEnabled ?? true;
27144
27572
  const description = isResourceScope ? `Browse conversation history. Use mode="threads" to list all threads for the current user. Use mode="messages" (default) to browse messages in the current thread or pass threadId to browse another thread in the active resource. When mode="messages" has no cursor or threadId, it defaults to the current thread and says so at the top of the result. If you pass only a cursor, it must belong to the current thread.${searchEnabled ? " Use mode=\"search\" to find messages by content across all threads." : ""}` : `Browse conversation history in the current thread. Use mode="messages" (default) to page through messages near a cursor.${searchEnabled ? " Use mode=\"search\" to find messages by content in this thread." : ""} Use mode="threads" to get the current thread's ID and title.`;
27145
27573
  const modeEnum = searchEnabled ? [
@@ -27350,23 +27778,25 @@ const recallTool = (_memoryConfig, options) => {
27350
27778
  if (partIndex !== void 0 && partIndex !== null) return recallPart({
27351
27779
  memory,
27352
27780
  threadId: targetThreadId,
27353
- resourceId: isResourceScope ? resourceId : void 0,
27781
+ resourceId,
27354
27782
  cursor,
27355
27783
  partIndex,
27356
27784
  charOffset,
27357
- threadScope
27785
+ threadScope,
27786
+ retrievalScope
27358
27787
  });
27359
27788
  return recallMessages({
27360
27789
  memory,
27361
27790
  threadId: targetThreadId,
27362
- resourceId: isResourceScope ? resourceId : void 0,
27791
+ resourceId,
27363
27792
  cursor,
27364
27793
  page,
27365
27794
  limit,
27366
27795
  detail: detail ?? "low",
27367
27796
  partType,
27368
27797
  toolName,
27369
- threadScope
27798
+ threadScope,
27799
+ retrievalScope
27370
27800
  });
27371
27801
  }
27372
27802
  });
@@ -28452,7 +28882,8 @@ function sortThreadsByOldestMessage(messagesByThread) {
28452
28882
  function stripThreadTags(observations) {
28453
28883
  return observations.replace(/<\/?thread\b[^>]{0,1024}>/gi, "").trim();
28454
28884
  }
28455
- const OBSERVATION_GROUP_PATTERN = /<observation-group\s([^>]*)>([\s\S]*?)<\/observation-group>/g;
28885
+ const OBSERVATION_GROUP_OPEN = "<observation-group";
28886
+ const OBSERVATION_GROUP_CLOSE = "</observation-group>";
28456
28887
  const ATTRIBUTE_PATTERN = /([\w][\w-]*)="([^"]*)"/g;
28457
28888
  const REFLECTION_GROUP_SPLIT_PATTERN = /^##\s+Group\s+/m;
28458
28889
  function parseObservationGroupAttributes(attributeString) {
@@ -28463,6 +28894,81 @@ function parseObservationGroupAttributes(attributeString) {
28463
28894
  }
28464
28895
  return attributes;
28465
28896
  }
28897
+ function isLineStart(observations, index) {
28898
+ return index === 0 || observations[index - 1] === "\n";
28899
+ }
28900
+ function scanObservationGroupTags(observations) {
28901
+ const tags = [];
28902
+ const incompleteOpenings = [];
28903
+ let cursor = 0;
28904
+ let closeFloor = 0;
28905
+ while (cursor < observations.length) {
28906
+ const start = observations.indexOf(OBSERVATION_GROUP_OPEN, cursor);
28907
+ if (start === -1) break;
28908
+ const attributesStart = start + 18;
28909
+ if (!/\s/.test(observations[attributesStart] ?? "")) {
28910
+ cursor = attributesStart;
28911
+ continue;
28912
+ }
28913
+ const openEnd = observations.indexOf(">", attributesStart);
28914
+ if (openEnd === -1) break;
28915
+ const closeStart = observations.indexOf(OBSERVATION_GROUP_CLOSE, Math.max(openEnd + 1, closeFloor));
28916
+ if (closeStart === -1) {
28917
+ if (isLineStart(observations, start)) incompleteOpenings.push({
28918
+ start,
28919
+ end: openEnd + 1
28920
+ });
28921
+ closeFloor = observations.length;
28922
+ cursor = openEnd + 1;
28923
+ continue;
28924
+ }
28925
+ const nestedStart = observations.indexOf(OBSERVATION_GROUP_OPEN, openEnd + 1);
28926
+ if (nestedStart !== -1 && nestedStart < closeStart && isLineStart(observations, nestedStart)) {
28927
+ incompleteOpenings.push({
28928
+ start,
28929
+ end: openEnd + 1
28930
+ });
28931
+ closeFloor = closeStart;
28932
+ cursor = nestedStart;
28933
+ continue;
28934
+ }
28935
+ tags.push({
28936
+ start,
28937
+ end: closeStart + 20,
28938
+ attributeString: observations.slice(attributesStart, openEnd),
28939
+ content: observations.slice(openEnd + 1, closeStart)
28940
+ });
28941
+ closeFloor = closeStart;
28942
+ cursor = closeStart + 20;
28943
+ }
28944
+ return {
28945
+ tags,
28946
+ incompleteOpenings
28947
+ };
28948
+ }
28949
+ function replaceObservationGroupTags(observations, replace) {
28950
+ const { tags, incompleteOpenings } = scanObservationGroupTags(observations);
28951
+ const parts = [];
28952
+ let cursor = 0;
28953
+ let openingIndex = 0;
28954
+ const skipIncompleteOpeningsBefore = (limit) => {
28955
+ while (openingIndex < incompleteOpenings.length && incompleteOpenings[openingIndex].start < limit) {
28956
+ const opening = incompleteOpenings[openingIndex];
28957
+ openingIndex++;
28958
+ if (opening.start < cursor) continue;
28959
+ parts.push(observations.slice(cursor, opening.start));
28960
+ cursor = opening.end;
28961
+ }
28962
+ };
28963
+ for (const tag of tags) {
28964
+ skipIncompleteOpeningsBefore(tag.start);
28965
+ parts.push(observations.slice(cursor, tag.start), replace(tag));
28966
+ cursor = tag.end;
28967
+ }
28968
+ skipIncompleteOpeningsBefore(Number.POSITIVE_INFINITY);
28969
+ parts.push(observations.slice(cursor));
28970
+ return parts.join("");
28971
+ }
28466
28972
  function parseReflectionObservationGroupSections(content) {
28467
28973
  const normalizedContent = content.trim();
28468
28974
  if (!normalizedContent || !REFLECTION_GROUP_SPLIT_PATTERN.test(normalizedContent)) return [];
@@ -28487,9 +28993,8 @@ function wrapInObservationGroup(observations, range, id = generateAnchorId(), _s
28487
28993
  function parseObservationGroups(observations) {
28488
28994
  if (!observations) return [];
28489
28995
  const groups = [];
28490
- let match;
28491
- while ((match = OBSERVATION_GROUP_PATTERN.exec(observations)) !== null) {
28492
- const attributes = parseObservationGroupAttributes(match[1] ?? "");
28996
+ for (const tag of scanObservationGroupTags(observations).tags) {
28997
+ const attributes = parseObservationGroupAttributes(tag.attributeString);
28493
28998
  const id = attributes.id;
28494
28999
  const range = attributes.range;
28495
29000
  if (!id || !range) continue;
@@ -28497,54 +29002,96 @@ function parseObservationGroups(observations) {
28497
29002
  id,
28498
29003
  range,
28499
29004
  kind: attributes.kind,
28500
- content: match[2].trim()
29005
+ content: tag.content.trim()
28501
29006
  });
28502
29007
  }
28503
29008
  return groups;
28504
29009
  }
28505
29010
  function stripObservationGroups(observations) {
28506
29011
  if (!observations) return observations;
28507
- return observations.replace(OBSERVATION_GROUP_PATTERN, (_match, _attributes, content) => content.trim()).replace(/\n{3,}/g, "\n\n").trim();
29012
+ return replaceObservationGroupTags(observations, (tag) => tag.content.trim()).replace(/\n{3,}/g, "\n\n").trim();
28508
29013
  }
28509
29014
  function getRangeSegments(range) {
28510
29015
  return range.split(",").map((segment) => segment.trim()).filter(Boolean);
28511
29016
  }
29017
+ function getRangeEndpoints(segment) {
29018
+ const parts = segment.split(":").map((part) => part.trim());
29019
+ if (parts.length !== 2 || !parts[0] || !parts[1]) return null;
29020
+ return {
29021
+ start: parts[0],
29022
+ end: parts[1]
29023
+ };
29024
+ }
29025
+ /**
29026
+ * `buildMessageRange` produces opaque UUID endpoints, so those segments cannot be ordered by value.
29027
+ * Spanning from the first start to the last end keeps reflected metadata bounded — the full segment
29028
+ * list is deliberately not preserved (#14791). Segments that are not `start:end` pairs are left as
29029
+ * they are rather than being joined into a fabricated span.
29030
+ */
29031
+ function spanRangeSegments(segments) {
29032
+ const endpoints = segments.map(getRangeEndpoints);
29033
+ if (endpoints.some((endpoint) => endpoint === null)) return segments.join(",");
29034
+ const first = endpoints[0];
29035
+ const last = endpoints.at(-1);
29036
+ return `${first.start}:${last.end}`;
29037
+ }
28512
29038
  function combineObservationGroupRanges(groups) {
28513
- const segments = groups.flatMap((group) => getRangeSegments(group.range));
29039
+ const segments = Array.from(new Set(groups.flatMap((group) => getRangeSegments(group.range))));
28514
29040
  if (segments.length === 0) return "";
28515
- const firstSegment = segments[0];
28516
- const lastSegment = segments[segments.length - 1];
28517
- const firstStart = firstSegment?.split(":")[0]?.trim();
28518
- const lastEnd = lastSegment?.split(":").at(-1)?.trim();
28519
- if (firstStart && lastEnd) return `${firstStart}:${lastEnd}`;
28520
- return Array.from(new Set(segments)).join(",");
29041
+ const numericEndpoints = [];
29042
+ if (!segments.every((segment) => {
29043
+ const endpoints = getRangeEndpoints(segment);
29044
+ if (!endpoints || !/^\d+$/.test(endpoints.start) || !/^\d+$/.test(endpoints.end)) return false;
29045
+ const start = {
29046
+ label: endpoints.start,
29047
+ value: Number(endpoints.start)
29048
+ };
29049
+ const end = {
29050
+ label: endpoints.end,
29051
+ value: Number(endpoints.end)
29052
+ };
29053
+ if (!Number.isSafeInteger(start.value) || !Number.isSafeInteger(end.value)) return false;
29054
+ numericEndpoints.push(start.value <= end.value ? {
29055
+ start,
29056
+ end
29057
+ } : {
29058
+ start: end,
29059
+ end: start
29060
+ });
29061
+ return true;
29062
+ })) return spanRangeSegments(segments);
29063
+ const first = numericEndpoints.reduce((lowest, pair) => pair.start.value < lowest.start.value ? pair : lowest);
29064
+ const last = numericEndpoints.reduce((highest, pair) => pair.end.value > highest.end.value ? pair : highest);
29065
+ return `${first.start.label}:${last.end.label}`;
28521
29066
  }
28522
29067
  function renderObservationGroupsForReflection(observations) {
28523
- const groups = parseObservationGroups(observations);
28524
- if (groups.length === 0) return null;
28525
- const groupsByContent = new Map(groups.map((g) => [g.content.trim(), g]));
28526
- return observations.replace(OBSERVATION_GROUP_PATTERN, (_match, _attrs, content) => {
28527
- const group = groupsByContent.get(content.trim());
28528
- if (!group) return content.trim();
28529
- return `## Group \`${group.id}\`\n_range: \`${group.range}\`_\n\n${group.content}`;
29068
+ if (parseObservationGroups(observations).length === 0) return null;
29069
+ return replaceObservationGroupTags(observations, (tag) => {
29070
+ const attributes = parseObservationGroupAttributes(tag.attributeString);
29071
+ if (!attributes.id || !attributes.range) return tag.content.trim();
29072
+ return `## Group \`${attributes.id}\`\n_range: \`${attributes.range}\`_\n\n${tag.content.trim()}`;
28530
29073
  }).replace(/\n{3,}/g, "\n\n").trim();
28531
29074
  }
28532
29075
  function getCanonicalGroupId(sectionHeading, fallbackIndex) {
28533
29076
  return sectionHeading.match(/`([^`]+)`/)?.[1]?.trim() || `derived-group-${fallbackIndex + 1}`;
28534
29077
  }
29078
+ function getContentLines(content) {
29079
+ return content.split("\n").map((line) => line.trim()).filter(Boolean);
29080
+ }
28535
29081
  function deriveObservationGroupProvenance(content, groups) {
28536
29082
  const sections = parseReflectionObservationGroupSections(content);
28537
29083
  if (sections.length === 0 || groups.length === 0) return [];
28538
29084
  return sections.map((section, index) => {
28539
- const bodyLines = new Set(section.body.split("\n").map((line) => line.trim()).filter(Boolean));
28540
- const matchingGroups = groups.filter((group) => {
28541
- return group.content.split("\n").map((line) => line.trim()).filter(Boolean).some((line) => bodyLines.has(line));
28542
- });
29085
+ const canonicalGroupId = getCanonicalGroupId(section.heading, index);
29086
+ const identifiedGroup = groups.find((group) => group.id === canonicalGroupId);
29087
+ const bodyLines = new Set(getContentLines(section.body));
29088
+ const matchingGroups = groups.filter((group) => getContentLines(group.content).some((line) => bodyLines.has(line)));
28543
29089
  const fallbackGroup = groups[Math.min(index, groups.length - 1)];
28544
- const resolvedGroups = matchingGroups.length > 0 ? matchingGroups : fallbackGroup ? [fallbackGroup] : [];
29090
+ const identifiedLines = new Set(getContentLines(identifiedGroup?.content ?? ""));
29091
+ const contributingGroups = identifiedGroup ? matchingGroups.filter((group) => group.id !== identifiedGroup.id && getContentLines(group.content).some((line) => bodyLines.has(line) && !identifiedLines.has(line))) : [];
28545
29092
  return {
28546
- id: getCanonicalGroupId(section.heading, index),
28547
- range: combineObservationGroupRanges(resolvedGroups),
29093
+ id: canonicalGroupId,
29094
+ range: combineObservationGroupRanges(identifiedGroup ? groups.filter((group) => group === identifiedGroup || contributingGroups.includes(group)) : matchingGroups.length > 0 ? matchingGroups : fallbackGroup ? [fallbackGroup] : []),
28548
29095
  kind: "reflection",
28549
29096
  content: section.body
28550
29097
  };
@@ -28967,6 +29514,21 @@ var ObservationStrategy = class ObservationStrategy {
28967
29514
  return false;
28968
29515
  }
28969
29516
  };
29517
+ /**
29518
+ * Resolve the thread title an Observational Memory cycle should persist.
29519
+ *
29520
+ * Returns the trimmed candidate when it is a new, long-enough title, or
29521
+ * `undefined` when the current title must stay — including when the user
29522
+ * pinned it via `session.thread.rename()`, which sets the
29523
+ * `titlePinned` thread metadata flag.
29524
+ */
29525
+ function resolveThreadTitleUpdate(thread, generatedTitle) {
29526
+ const candidate = generatedTitle?.trim();
29527
+ if (!candidate || candidate.length < 3) return void 0;
29528
+ if (isThreadTitlePinned(thread?.metadata)) return void 0;
29529
+ if (candidate === thread?.title?.trim()) return void 0;
29530
+ return candidate;
29531
+ }
28970
29532
  var SyncObservationStrategy = class extends ObservationStrategy {
28971
29533
  startedAt = (/* @__PURE__ */ new Date()).toISOString();
28972
29534
  lastMessage;
@@ -29115,11 +29677,15 @@ var SyncObservationStrategy = class extends ObservationStrategy {
29115
29677
  async persist(processed) {
29116
29678
  const { record, threadId, resourceId, messages } = this.opts;
29117
29679
  const thread = await this.storage.getThreadById({ threadId });
29680
+ if (!await this.storage.getObservationalMemory(record.threadId, record.resourceId)) {
29681
+ omDebug(`[OM:sync-obs] skipping persist for thread ${threadId}: observational memory record is gone`);
29682
+ return;
29683
+ }
29118
29684
  let threadUpdateMarker;
29119
29685
  if (thread) {
29120
29686
  const oldTitle = thread.title?.trim();
29121
- const newTitle = processed.threadTitle?.trim();
29122
- const shouldUpdateThreadTitle = !!newTitle && newTitle.length >= 3 && newTitle !== oldTitle;
29687
+ const newTitle = resolveThreadTitleUpdate(thread, processed.threadTitle);
29688
+ const shouldUpdateThreadTitle = newTitle !== void 0;
29123
29689
  const previousOmMetadata = getThreadOMMetadata(thread.metadata);
29124
29690
  const metadataUpdate = buildThreadMetadataFromExtractedValues(processed.extractors ?? this.observationConfig.extractors, processed.extractedValues);
29125
29691
  const newMetadata = setThreadOMMetadata(thread.metadata, {
@@ -29294,6 +29860,10 @@ var AsyncBufferObservationStrategy = class extends ObservationStrategy {
29294
29860
  async persist(processed) {
29295
29861
  if (!processed.observations) return;
29296
29862
  const { record, threadId, resourceId, messages } = this.opts;
29863
+ if (!await this.storage.getObservationalMemory(record.threadId, record.resourceId)) {
29864
+ omDebug(`[OM:asyncBuffer] skipping persist for thread ${threadId}: observational memory record is gone`);
29865
+ return;
29866
+ }
29297
29867
  const messageTokens = await this.tokenCounter.countMessagesAsync(messages);
29298
29868
  await withRetry(() => this.storage.updateBufferedObservations({
29299
29869
  id: record.id,
@@ -29316,13 +29886,14 @@ var AsyncBufferObservationStrategy = class extends ObservationStrategy {
29316
29886
  abortSignal: this.opts.abortSignal
29317
29887
  });
29318
29888
  await this.indexObservationGroups(processed.observations, threadId, resourceId, processed.lastObservedAt);
29319
- const newTitle = processed.threadTitle?.trim();
29320
- const hasValidThreadTitle = !!newTitle && newTitle.length >= 3;
29889
+ const candidateTitle = processed.threadTitle?.trim();
29890
+ const hasValidThreadTitle = !!candidateTitle && candidateTitle.length >= 3;
29321
29891
  if (hasValidThreadTitle || processed.extractedValues) {
29322
29892
  const thread = await this.storage.getThreadById({ threadId });
29323
29893
  if (thread) {
29324
29894
  const oldTitle = thread.title?.trim();
29325
- const shouldUpdateThreadTitle = hasValidThreadTitle && newTitle !== oldTitle;
29895
+ const newTitle = resolveThreadTitleUpdate(thread, candidateTitle);
29896
+ const shouldUpdateThreadTitle = newTitle !== void 0;
29326
29897
  const previousOmMetadata = getThreadOMMetadata(thread.metadata);
29327
29898
  const metadataUpdate = buildThreadMetadataFromExtractedValues(processed.extractors ?? this.observationConfig.extractors, processed.extractedValues);
29328
29899
  const newMetadata = setThreadOMMetadata(thread.metadata, {
@@ -29677,8 +30248,8 @@ var ResourceScopedObservationStrategy = class extends ObservationStrategy {
29677
30248
  const thread = await this.storage.getThreadById({ threadId: update.threadId });
29678
30249
  if (thread) {
29679
30250
  const oldTitle = thread.title?.trim();
29680
- const newTitle = update.threadTitle?.trim();
29681
- const shouldUpdateThreadTitle = !!newTitle && newTitle.length >= 3 && newTitle !== oldTitle;
30251
+ const newTitle = resolveThreadTitleUpdate(thread, update.threadTitle);
30252
+ const shouldUpdateThreadTitle = newTitle !== void 0;
29682
30253
  const previousOmMetadata = getThreadOMMetadata(thread.metadata);
29683
30254
  const metadataUpdate = buildThreadMetadataFromExtractedValues(update.extractors ?? this.observationConfig.extractors, update.extracted);
29684
30255
  const newMetadata = setThreadOMMetadata(thread.metadata, {
@@ -30274,6 +30845,10 @@ var ObservationTurn = class {
30274
30845
  if (!this._context) throw new Error("Turn not started — call start() first");
30275
30846
  return this._context;
30276
30847
  }
30848
+ /** Whether the turn has been ended and can no longer accept steps. */
30849
+ get ended() {
30850
+ return this._ended;
30851
+ }
30277
30852
  /** The current step, if one exists. */
30278
30853
  get currentStep() {
30279
30854
  return this._currentStep;
@@ -30814,15 +31389,14 @@ var ReflectorRunner = class {
30814
31389
  this.mastra = mastra;
30815
31390
  }
30816
31391
  createAgent(model, memory, extractors = this.reflectionConfig.extractors) {
30817
- const agent = new Agent({
31392
+ return new Agent({
30818
31393
  id: "observational-memory-reflector",
30819
31394
  name: "Reflector",
30820
31395
  instructions: buildReflectorSystemPrompt(this.reflectionConfig.instruction, extractors),
30821
31396
  model,
30822
- ...memory ? { memory } : {}
31397
+ ...memory ? { memory } : {},
31398
+ ...this.mastra ? { mastra: this.mastra } : {}
30823
31399
  });
30824
- if (this.mastra) agent.__registerMastra(this.mastra);
30825
- return agent;
30826
31400
  }
30827
31401
  getObservationMarkerConfig(record) {
30828
31402
  return {
@@ -32094,11 +32668,19 @@ var ObservationalMemory = class ObservationalMemory {
32094
32668
  const messageTokens = config.observation?.messageTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.messageTokens;
32095
32669
  const observationTokens = config.reflection?.observationTokens ?? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.observationTokens;
32096
32670
  const isSharedBudget = config.shareTokenBudget ?? false;
32097
- const isDefaultModelSelection = (model) => model === void 0 || model === "default" || model instanceof ModelByInputTokens;
32671
+ const supportsDefaultTemperature = (model) => {
32672
+ if (model instanceof ModelByInputTokens || typeof model === "function") return false;
32673
+ if (typeof model === "string") return modelSupportsTemperature(model) === true;
32674
+ if (model && typeof model === "object" && "provider" in model && "modelId" in model && typeof model.provider === "string" && typeof model.modelId === "string") return modelSupportsTemperature(`${model.provider.split(".")[0]}/${model.modelId}`) === true;
32675
+ return false;
32676
+ };
32677
+ const usesDefaultOutputTokenBudget = (model) => model === void 0 || model === "default" || model instanceof ModelByInputTokens;
32098
32678
  const observationSelectedModel = topLevelModel ?? observationConfigModel ?? reflectionConfigModel;
32099
32679
  const reflectionSelectedModel = topLevelModel ?? reflectionConfigModel ?? observationConfigModel;
32100
- const observationDefaultMaxOutputTokens = config.observation?.modelSettings?.maxOutputTokens ?? (isDefaultModelSelection(observationSelectedModel) ? OBSERVATIONAL_MEMORY_DEFAULTS.observation.modelSettings.maxOutputTokens : void 0);
32101
- const reflectionDefaultMaxOutputTokens = config.reflection?.modelSettings?.maxOutputTokens ?? (isDefaultModelSelection(reflectionSelectedModel) ? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.modelSettings.maxOutputTokens : void 0);
32680
+ const observationTemperature = config.observation?.modelSettings?.temperature ?? (supportsDefaultTemperature(observationModel) ? OBSERVATIONAL_MEMORY_DEFAULTS.observation.modelSettings.temperature : void 0);
32681
+ const observationDefaultMaxOutputTokens = config.observation?.modelSettings?.maxOutputTokens ?? (usesDefaultOutputTokenBudget(observationSelectedModel) ? OBSERVATIONAL_MEMORY_DEFAULTS.observation.modelSettings.maxOutputTokens : void 0);
32682
+ const reflectionTemperature = config.reflection?.modelSettings?.temperature ?? (supportsDefaultTemperature(reflectionModel) ? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.modelSettings.temperature : void 0);
32683
+ const reflectionDefaultMaxOutputTokens = config.reflection?.modelSettings?.maxOutputTokens ?? (usesDefaultOutputTokenBudget(reflectionSelectedModel) ? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.modelSettings.maxOutputTokens : void 0);
32102
32684
  const totalBudget = messageTokens + observationTokens;
32103
32685
  const userExplicitlyConfiguredAsync = config.observation?.bufferTokens !== void 0 || config.observation?.bufferActivation !== void 0 || config.reflection?.bufferActivation !== void 0;
32104
32686
  const asyncBufferingDisabled = config.observation?.bufferTokens === false || config.scope === "resource" && !userExplicitlyConfiguredAsync;
@@ -32114,7 +32696,7 @@ var ObservationalMemory = class ObservationalMemory {
32114
32696
  } : messageTokens,
32115
32697
  shareTokenBudget: isSharedBudget,
32116
32698
  modelSettings: {
32117
- temperature: config.observation?.modelSettings?.temperature ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.modelSettings.temperature,
32699
+ ...observationTemperature !== void 0 ? { temperature: observationTemperature } : {},
32118
32700
  ...observationDefaultMaxOutputTokens !== void 0 ? { maxOutputTokens: observationDefaultMaxOutputTokens } : {}
32119
32701
  },
32120
32702
  providerOptions: config.observation?.providerOptions ?? OBSERVATIONAL_MEMORY_DEFAULTS.observation.providerOptions,
@@ -32140,7 +32722,7 @@ var ObservationalMemory = class ObservationalMemory {
32140
32722
  observationTokens,
32141
32723
  shareTokenBudget: isSharedBudget,
32142
32724
  modelSettings: {
32143
- temperature: config.reflection?.modelSettings?.temperature ?? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.modelSettings.temperature,
32725
+ ...reflectionTemperature !== void 0 ? { temperature: reflectionTemperature } : {},
32144
32726
  ...reflectionDefaultMaxOutputTokens !== void 0 ? { maxOutputTokens: reflectionDefaultMaxOutputTokens } : {}
32145
32727
  },
32146
32728
  providerOptions: config.reflection?.providerOptions ?? OBSERVATIONAL_MEMORY_DEFAULTS.reflection.providerOptions,
@@ -33864,9 +34446,8 @@ ${formattedMessages}
33864
34446
  currentTask: lastActivated.currentTask,
33865
34447
  threadTitle: chunkThreadTitle
33866
34448
  });
33867
- const oldTitle = thread.title?.trim();
33868
- const newTitle = chunkThreadTitle?.trim();
33869
- const shouldUpdateThreadTitle = !!newTitle && newTitle.length >= 3 && newTitle !== oldTitle;
34449
+ const newTitle = resolveThreadTitleUpdate(thread, chunkThreadTitle);
34450
+ const shouldUpdateThreadTitle = newTitle !== void 0;
33870
34451
  await this.storage.patchThread({
33871
34452
  id: threadId,
33872
34453
  ...shouldUpdateThreadTitle ? { title: newTitle } : {},
@@ -33996,9 +34577,11 @@ ${formattedMessages}
33996
34577
  let lifecycleError;
33997
34578
  let observationStarted = false;
33998
34579
  let generationBefore = -1;
34580
+ let recordInsideLock;
33999
34581
  try {
34000
34582
  await this.withLock(lockKey, async () => {
34001
34583
  const freshRecord = await this.getOrCreateRecord(threadId, resourceId);
34584
+ recordInsideLock = freshRecord;
34002
34585
  generationBefore = freshRecord.generationCount;
34003
34586
  const unobservedMessages = messages ? this.getUnobservedMessages(messages, freshRecord) : await this.loadMessagesFromStorage(threadId, resourceId, freshRecord.lastObservedAt ? new Date(freshRecord.lastObservedAt) : void 0);
34004
34587
  if (!this.meetsObservationThreshold({
@@ -34041,7 +34624,7 @@ ${formattedMessages}
34041
34624
  omDebug(`[OM:hooks] onObservationEnd hook failed after cycle failure: ${endHookError instanceof Error ? endHookError.message : String(endHookError)}`);
34042
34625
  }
34043
34626
  if (lifecycleError !== void 0) throw lifecycleError;
34044
- const record = await this.getOrCreateRecord(threadId, resourceId);
34627
+ const record = await this.getRecord(threadId, resourceId) ?? recordInsideLock;
34045
34628
  const reflected = record.generationCount > generationBefore && generationBefore >= 0;
34046
34629
  return {
34047
34630
  observed,
@@ -34518,6 +35101,10 @@ var ObservationalMemoryProcessor = class {
34518
35101
  if (this.turn === activeTurn) this.turn = void 0;
34519
35102
  state.__omTurn = void 0;
34520
35103
  }
35104
+ if (activeTurn?.ended || this.turn?.ended) {
35105
+ if (this.turn?.ended) this.turn = void 0;
35106
+ state.__omTurn = void 0;
35107
+ }
34521
35108
  if (!this.turn || !state.__omTurn) {
34522
35109
  if (this.turn && !state.__omTurn) await this.turn.end().catch(() => {});
34523
35110
  this.turn = this.engine.beginTurn({
@@ -34618,11 +35205,11 @@ var ObservationalMemoryProcessor = class {
34618
35205
  return this.engine.getTokenCounter().runWithModelContext(state.__omActorModelContext, async () => {
34619
35206
  if (parseMemoryRequestContext(requestContext)?.memoryConfig?.readOnly) return messageList;
34620
35207
  const turn = asLiveTurn(state.__omTurn) ?? this.turn;
34621
- if (turn) {
34622
- await turn.end();
34623
- this.turn = void 0;
34624
- state.__omTurn = void 0;
34625
- } else {
35208
+ const liveTurn = turn && !turn.ended ? turn : void 0;
35209
+ if (liveTurn) await liveTurn.end();
35210
+ this.turn = void 0;
35211
+ state.__omTurn = void 0;
35212
+ if (!liveTurn) {
34626
35213
  const newOutput = messageList.get.response.db();
34627
35214
  const messagesToSave = [...messageList.get.input.db(), ...newOutput];
34628
35215
  if (messagesToSave.length > 0 && context.threadId) await this.engine.persistMessages(messagesToSave, context.threadId, context.resourceId);
@@ -34811,6 +35398,7 @@ const DEFAULT_MESSAGE_RANGE = {
34811
35398
  };
34812
35399
  const DEFAULT_TOP_K = 4;
34813
35400
  const VECTOR_DELETE_BATCH_SIZE = 100;
35401
+ const OM_DELETE_DRAIN_TIMEOUT_MS = 1e4;
34814
35402
  const DEFAULT_EMBEDDING_CACHE_MAX_SIZE = 1e3;
34815
35403
  /**
34816
35404
  * Gives Mastra agents conversation history, with optional working memory,
@@ -34844,6 +35432,9 @@ const DEFAULT_EMBEDDING_CACHE_MAX_SIZE = 1e3;
34844
35432
  * if packaged docs are unavailable.
34845
35433
  */
34846
35434
  var Memory = class Memory extends MastraMemory {
35435
+ createMemoryTokenCounter() {
35436
+ return new TokenCounter();
35437
+ }
34847
35438
  _omEngine;
34848
35439
  _omEngineInstance;
34849
35440
  _mastraInstance;
@@ -35014,6 +35605,7 @@ var Memory = class Memory extends MastraMemory {
35014
35605
  const thread = await this.getThreadById({ threadId });
35015
35606
  if (!thread && !resourceScope) throw new Error(`No thread found with id ${threadId}`);
35016
35607
  if (thread && thread.resourceId !== resourceId) throw new Error(`Thread with id ${threadId} is for resource with id ${thread.resourceId} but resource ${resourceId} was queried.`);
35608
+ return thread;
35017
35609
  }
35018
35610
  createMemorySpan(operationType, observabilityContext, input, attributes) {
35019
35611
  const currentSpan = observabilityContext?.tracingContext?.currentSpan;
@@ -35034,6 +35626,9 @@ var Memory = class Memory extends MastraMemory {
35034
35626
  const { threadId, resourceId, perPage: perPageArg, page, orderBy, threadConfig, vectorSearchString, includeSystemReminders, hideSignals, filter, includeTotal } = args;
35035
35627
  const config = this.getMergedThreadConfig(threadConfig || {});
35036
35628
  const semanticRecallEnabled = Boolean(config.semanticRecall);
35629
+ const history = normalizeMessageHistoryConfig(config.lastMessages, config.messageHistory);
35630
+ const historyDisabledByConfig = !history.enabled && perPageArg === void 0;
35631
+ const shouldUseTokenLoader = perPageArg === void 0 && history.enabled && history.maxTokens !== void 0;
35037
35632
  const span = this.createMemorySpan("recall", args.observabilityContext, {
35038
35633
  threadId,
35039
35634
  resourceId,
@@ -35043,9 +35638,23 @@ var Memory = class Memory extends MastraMemory {
35043
35638
  lastMessages: config.lastMessages
35044
35639
  });
35045
35640
  try {
35046
- if (resourceId) await this.validateThreadIsOwnedByResource(threadId, resourceId, config);
35047
- const perPage = perPageArg !== void 0 ? perPageArg : config.lastMessages;
35048
- const historyDisabledByConfig = config.lastMessages === false && perPageArg === void 0;
35641
+ if (historyDisabledByConfig && (!config.semanticRecall || !vectorSearchString || !this.vector)) {
35642
+ const result = {
35643
+ messages: [],
35644
+ usage: void 0,
35645
+ total: 0,
35646
+ page: page ?? 0,
35647
+ perPage: 0,
35648
+ hasMore: false
35649
+ };
35650
+ span?.end({
35651
+ output: { success: true },
35652
+ attributes: { messageCount: 0 }
35653
+ });
35654
+ return result;
35655
+ }
35656
+ const validatedThread = resourceId ? await this.validateThreadIsOwnedByResource(threadId, resourceId, config) : void 0;
35657
+ const perPage = perPageArg !== void 0 ? perPageArg : history.maxMessages ?? 0;
35049
35658
  const shouldGetNewestAndReverse = !orderBy && perPage !== false;
35050
35659
  const effectiveOrderBy = shouldGetNewestAndReverse ? {
35051
35660
  field: "createdAt",
@@ -35074,21 +35683,6 @@ var Memory = class Memory extends MastraMemory {
35074
35683
  const resourceScope = typeof config?.semanticRecall === "object" && config?.semanticRecall?.scope !== `thread` || config.semanticRecall === true;
35075
35684
  if (resourceScope && !resourceId && config?.semanticRecall && vectorSearchString) throw new Error("Memory error: Resource-scoped semantic recall is enabled but no resourceId was provided. Either provide a resourceId or explicitly set semanticRecall.scope to 'thread'.");
35076
35685
  let usage;
35077
- if (historyDisabledByConfig && (!config.semanticRecall || !vectorSearchString || !this.vector)) {
35078
- const result = {
35079
- messages: [],
35080
- usage: void 0,
35081
- total: 0,
35082
- page: page ?? 0,
35083
- perPage: 0,
35084
- hasMore: false
35085
- };
35086
- span?.end({
35087
- output: { success: true },
35088
- attributes: { messageCount: 0 }
35089
- });
35090
- return result;
35091
- }
35092
35686
  if (config?.semanticRecall && vectorSearchString && this.vector) {
35093
35687
  const result = await this.embedMessageContent(vectorSearchString);
35094
35688
  usage = result.usage;
@@ -35110,28 +35704,71 @@ var Memory = class Memory extends MastraMemory {
35110
35704
  const threshold = (typeof config.semanticRecall === "object" ? config.semanticRecall : void 0)?.threshold;
35111
35705
  const filteredVectorResults = threshold !== void 0 ? vectorResults.filter((r) => r.score >= threshold) : vectorResults;
35112
35706
  const memoryStore = await this.getMemoryStore();
35113
- const effectivePerPage = historyDisabledByConfig ? 0 : perPage;
35114
- const paginatedResult = await memoryStore.listMessages({
35115
- threadId,
35116
- resourceId,
35117
- perPage: effectivePerPage,
35118
- page,
35119
- orderBy: effectiveOrderBy,
35120
- filter,
35121
- ...includeTotal !== void 0 ? { includeTotal } : {},
35122
- ...filteredVectorResults?.length ? { include: filteredVectorResults.map((r) => ({
35123
- id: r.metadata?.message_id,
35124
- threadId: r.metadata?.thread_id,
35125
- withNextMessages: typeof vectorConfig.messageRange === "number" ? vectorConfig.messageRange : vectorConfig.messageRange.after,
35126
- withPreviousMessages: typeof vectorConfig.messageRange === "number" ? vectorConfig.messageRange : vectorConfig.messageRange.before
35127
- })) } : {}
35128
- });
35129
- const rawMessages = shouldGetNewestAndReverse ? paginatedResult.messages.reverse() : paginatedResult.messages;
35707
+ const include = filteredVectorResults.map((r) => ({
35708
+ id: r.metadata?.message_id,
35709
+ threadId: r.metadata?.thread_id,
35710
+ withNextMessages: typeof vectorConfig.messageRange === "number" ? vectorConfig.messageRange : vectorConfig.messageRange.after,
35711
+ withPreviousMessages: typeof vectorConfig.messageRange === "number" ? vectorConfig.messageRange : vectorConfig.messageRange.before
35712
+ }));
35713
+ let rawMessages;
35714
+ let resultPage;
35715
+ let resultPerPage;
35716
+ let total;
35717
+ let hasMore;
35718
+ if (shouldUseTokenLoader) {
35719
+ const storedBoundary = getMemoryTokenBoundary(validatedThread ?? await memoryStore.getThreadById({
35720
+ threadId,
35721
+ resourceId
35722
+ }));
35723
+ const boundary = storedBoundary !== void 0 && storedBoundary.maxTokens === history.maxTokens && storedBoundary.atMaxRemoveTokens === history.atMaxRemoveTokens ? storedBoundary : void 0;
35724
+ rawMessages = (await loadMessageHistory({
35725
+ storage: memoryStore,
35726
+ threadId,
35727
+ resourceId,
35728
+ boundary,
35729
+ filter,
35730
+ maxMessages: history.maxMessages,
35731
+ maxTokens: history.maxTokens,
35732
+ atMaxRemoveTokens: history.atMaxRemoveTokens,
35733
+ tokenCounter: new TokenCounter(),
35734
+ initialTokens: 24
35735
+ })).messages;
35736
+ if (include.length) {
35737
+ const semanticMessages = await memoryStore.listMessages({
35738
+ threadId,
35739
+ resourceId,
35740
+ perPage: 0,
35741
+ include,
35742
+ includeTotal: false
35743
+ });
35744
+ rawMessages = new MessageList({
35745
+ threadId,
35746
+ resourceId
35747
+ }).add(rawMessages, "memory").add(semanticMessages.messages.filter((message) => !boundary || isAfterMemoryTokenBoundary(message, boundary)), "memory").get.all.db();
35748
+ }
35749
+ resultPage = 0;
35750
+ resultPerPage = history.maxMessages ?? false;
35751
+ total = rawMessages.length;
35752
+ hasMore = false;
35753
+ } else {
35754
+ const effectivePerPage = historyDisabledByConfig ? 0 : perPage;
35755
+ const paginatedResult = await memoryStore.listMessages({
35756
+ threadId,
35757
+ resourceId,
35758
+ perPage: effectivePerPage,
35759
+ page,
35760
+ orderBy: effectiveOrderBy,
35761
+ filter,
35762
+ ...includeTotal !== void 0 ? { includeTotal } : {},
35763
+ ...include.length ? { include } : {}
35764
+ });
35765
+ rawMessages = shouldGetNewestAndReverse ? paginatedResult.messages.reverse() : paginatedResult.messages;
35766
+ ({total, page: resultPage, perPage: resultPerPage, hasMore} = paginatedResult);
35767
+ }
35130
35768
  const messages = filterSystemReminderMessages(new MessageList({
35131
35769
  threadId,
35132
35770
  resourceId
35133
35771
  }).add(rawMessages, "memory").get.all.db(), includeSystemReminders, hideSignals);
35134
- const { total, page: resultPage, perPage: resultPerPage, hasMore } = paginatedResult;
35135
35772
  const recallResult = {
35136
35773
  messages,
35137
35774
  usage,
@@ -35184,6 +35821,13 @@ var Memory = class Memory extends MastraMemory {
35184
35821
  });
35185
35822
  return savedThread;
35186
35823
  }
35824
+ /**
35825
+ * Update a thread's title or metadata.
35826
+ *
35827
+ * Unlike `session.thread.rename()`, this does not pin the title, so
35828
+ * Observational Memory may still replace it with an extracted title. To
35829
+ * protect a manual rename, set `metadata.titlePinned` to `true`.
35830
+ */
35187
35831
  async updateThread({ id, title, metadata, memoryConfig }) {
35188
35832
  const updatedThread = await (await this.getMemoryStore()).patchThread({
35189
35833
  id,
@@ -35206,6 +35850,8 @@ var Memory = class Memory extends MastraMemory {
35206
35850
  await this.deleteStoredThread(memoryStore, threadId, thread?.resourceId);
35207
35851
  }
35208
35852
  async deleteStoredThread(memoryStore, threadId, resourceId) {
35853
+ const engine = this._omEngine ? await this._omEngine : this._omEngineInstance;
35854
+ if (engine && resourceId) await engine.waitForBuffering(threadId, resourceId, OM_DELETE_DRAIN_TIMEOUT_MS);
35209
35855
  await memoryStore.deleteThread({ threadId });
35210
35856
  if (resourceId && memoryStore.supportsObservationalMemory) await memoryStore.clearObservationalMemory(threadId, resourceId);
35211
35857
  if (this.vector) this.trackVectorCleanup(this.deleteThreadVectors(threadId));
@@ -35752,16 +36398,52 @@ ${workingMemory}`;
35752
36398
  messages = runState ? await runState.load(`observational-memory:messages:thread:${threadId}:${boundary}`, loadMessages) : await loadMessages();
35753
36399
  }
35754
36400
  } else {
35755
- const lastMessages = config.lastMessages;
35756
- if (lastMessages === false) messages = [];
35757
- else messages = (await memoryStore.listMessages({
36401
+ const lastMessages = normalizeMessageHistoryConfig(config.lastMessages, config.messageHistory);
36402
+ if (!lastMessages.enabled) messages = [];
36403
+ else if (lastMessages.maxTokens !== void 0) {
36404
+ const storedBoundary = getMemoryTokenBoundary(await memoryStore.getThreadById({
36405
+ threadId,
36406
+ resourceId
36407
+ }));
36408
+ const boundary = storedBoundary?.maxTokens === lastMessages.maxTokens && storedBoundary.atMaxRemoveTokens === lastMessages.atMaxRemoveTokens ? storedBoundary : void 0;
36409
+ const tokenCounter = this.createMemoryTokenCounter();
36410
+ const loaded = await loadMessageHistory({
36411
+ storage: memoryStore,
36412
+ threadId,
36413
+ resourceId,
36414
+ boundary,
36415
+ maxMessages: lastMessages.maxMessages,
36416
+ maxTokens: lastMessages.maxTokens,
36417
+ tokenCounter,
36418
+ initialTokens: 24
36419
+ });
36420
+ const messageList = new MessageList();
36421
+ messageList.add(loaded.messages, "memory");
36422
+ if (systemParts.length) messageList.addSystem(systemParts.join("\n\n"));
36423
+ await new TokenLimiterProcessor({
36424
+ limit: lastMessages.maxTokens,
36425
+ atMaxRemoveTokens: lastMessages.atMaxRemoveTokens,
36426
+ trimMode: "memory-only",
36427
+ tokenCounter
36428
+ }).processInput({
36429
+ messageList,
36430
+ messages: messageList.get.all.db(),
36431
+ systemMessages: messageList.getAllSystemMessages(),
36432
+ state: {},
36433
+ retryCount: 0,
36434
+ abort: (reason) => {
36435
+ throw new Error(reason);
36436
+ }
36437
+ });
36438
+ messages = messageList.get.all.db();
36439
+ } else messages = (await memoryStore.listMessages({
35758
36440
  threadId,
35759
36441
  resourceId,
35760
36442
  orderBy: {
35761
36443
  field: "createdAt",
35762
36444
  direction: "DESC"
35763
36445
  },
35764
- perPage: typeof lastMessages === "number" ? lastMessages : void 0,
36446
+ perPage: lastMessages.maxMessages,
35765
36447
  includeTotal: false
35766
36448
  })).messages.reverse();
35767
36449
  }
@@ -37688,23 +38370,23 @@ const createModelInstance = async (provider, modelId, version = "v2") => {
37688
38370
  try {
37689
38371
  const providerFn = version === `v1` ? { v1: {
37690
38372
  openai: async () => {
37691
- const { openai } = await import("./dist-DoTDZ7wF.js");
38373
+ const { openai } = await import("./dist-Cdj_Yiml.js");
37692
38374
  return openai(modelId);
37693
38375
  },
37694
38376
  anthropic: async () => {
37695
- const { anthropic } = await import("./dist-k6UeNFHu.js");
38377
+ const { anthropic } = await import("./dist-BMjWLpRz.js");
37696
38378
  return anthropic(modelId);
37697
38379
  },
37698
38380
  groq: async () => {
37699
- const { groq } = await import("./dist-XnA2Lowr.js");
38381
+ const { groq } = await import("./dist-DazAtske.js");
37700
38382
  return groq(modelId);
37701
38383
  },
37702
38384
  xai: async () => {
37703
- const { xai } = await import("./dist-Da8AufS5.js");
38385
+ const { xai } = await import("./dist-ByqJiZWY.js");
37704
38386
  return xai(modelId);
37705
38387
  },
37706
38388
  google: async () => {
37707
- const { google } = await import("./dist-Wjq6PT76.js");
38389
+ const { google } = await import("./dist-C0MIGUJb.js");
37708
38390
  return google(modelId);
37709
38391
  }
37710
38392
  } }[version][provider] : () => new ModelRouterLanguageModel(`${provider}/${modelId}`);
@@ -47283,4 +47965,4 @@ const agentBuilderWorkflows = {
47283
47965
  //#endregion
47284
47966
  export { agentBuilderWorkflows };
47285
47967
 
47286
- //# sourceMappingURL=dist-DOpm-tIl.js.map
47968
+ //# sourceMappingURL=dist-C3lMsO1Z.js.map