@athenaintel/react 0.41.3 → 0.42.2

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 (479) hide show
  1. package/README.md +132 -10
  2. package/dist/agent-runtime/src/asset-attachment.d.ts +98 -0
  3. package/dist/agent-runtime/src/athena-asset-drag.d.ts +32 -0
  4. package/dist/agent-runtime/src/auth-denial.d.ts +29 -0
  5. package/dist/agent-runtime/src/chat-outbox-attachments.cjs +41 -0
  6. package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -0
  7. package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +38 -0
  8. package/dist/agent-runtime/src/chat-outbox-attachments.js +41 -0
  9. package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -0
  10. package/dist/agent-runtime/src/chat-outbox-signals.cjs +63 -0
  11. package/dist/agent-runtime/src/chat-outbox-signals.cjs.map +1 -0
  12. package/dist/agent-runtime/src/chat-outbox-signals.d.ts +12 -0
  13. package/dist/agent-runtime/src/chat-outbox-signals.js +63 -0
  14. package/dist/agent-runtime/src/chat-outbox-signals.js.map +1 -0
  15. package/dist/agent-runtime/src/chat-outbox-store.cjs +509 -0
  16. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-store.d.ts +203 -0
  18. package/dist/agent-runtime/src/chat-outbox-store.js +509 -0
  19. package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -0
  20. package/dist/agent-runtime/src/chat-outbox-thread.cjs +136 -0
  21. package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -0
  22. package/dist/agent-runtime/src/chat-outbox-thread.d.ts +118 -0
  23. package/dist/agent-runtime/src/chat-outbox-thread.js +136 -0
  24. package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -0
  25. package/dist/agent-runtime/src/chat-outbox.cjs +696 -0
  26. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -0
  27. package/dist/agent-runtime/src/chat-outbox.d.ts +285 -0
  28. package/dist/agent-runtime/src/chat-outbox.js +696 -0
  29. package/dist/agent-runtime/src/chat-outbox.js.map +1 -0
  30. package/dist/agent-runtime/src/chat-socket-reachability.d.ts +45 -0
  31. package/dist/agent-runtime/src/client-tool-bridge.d.ts +152 -0
  32. package/dist/agent-runtime/src/client-tools.d.ts +133 -0
  33. package/dist/agent-runtime/src/composer-markdown.cjs +10 -0
  34. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  35. package/dist/agent-runtime/src/composer-markdown.d.ts +108 -0
  36. package/dist/agent-runtime/src/composer-markdown.js +10 -0
  37. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  38. package/dist/agent-runtime/src/config-mutations.d.ts +51 -0
  39. package/dist/agent-runtime/src/conversation-index.d.ts +110 -0
  40. package/dist/agent-runtime/src/conversation-list.d.ts +343 -0
  41. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -2
  42. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  43. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +166 -0
  44. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -2
  45. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  46. package/dist/agent-runtime/src/desktop-handoff.d.ts +139 -0
  47. package/dist/agent-runtime/src/durable-thread-snapshot-cache.d.ts +60 -0
  48. package/dist/agent-runtime/src/edit-command.d.ts +156 -0
  49. package/dist/agent-runtime/src/errors.d.ts +174 -0
  50. package/dist/agent-runtime/src/execute-output.d.ts +31 -0
  51. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +16 -2
  52. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  53. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +202 -0
  54. package/dist/agent-runtime/src/generated/runconfig-contract.js +16 -2
  55. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  56. package/dist/agent-runtime/src/github-wake-event.d.ts +77 -0
  57. package/dist/agent-runtime/src/index.d.ts +74 -0
  58. package/dist/agent-runtime/src/interrupts.cjs +17 -0
  59. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  60. package/dist/agent-runtime/src/interrupts.d.ts +348 -0
  61. package/dist/agent-runtime/src/interrupts.js +17 -0
  62. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  63. package/dist/agent-runtime/src/lane-follow.d.ts +121 -0
  64. package/dist/agent-runtime/src/lane-history.cjs +209 -0
  65. package/dist/agent-runtime/src/lane-history.cjs.map +1 -0
  66. package/dist/agent-runtime/src/lane-history.d.ts +175 -0
  67. package/dist/agent-runtime/src/lane-history.js +209 -0
  68. package/dist/agent-runtime/src/lane-history.js.map +1 -0
  69. package/dist/agent-runtime/src/lane-images.d.ts +184 -0
  70. package/dist/agent-runtime/src/message-author.d.ts +43 -0
  71. package/dist/agent-runtime/src/message-text.cjs +15 -0
  72. package/dist/agent-runtime/src/message-text.cjs.map +1 -0
  73. package/dist/agent-runtime/src/message-text.d.ts +47 -0
  74. package/dist/agent-runtime/src/message-text.js +15 -0
  75. package/dist/agent-runtime/src/message-text.js.map +1 -0
  76. package/dist/agent-runtime/src/message-window.cjs +15 -1
  77. package/dist/agent-runtime/src/message-window.cjs.map +1 -1
  78. package/dist/agent-runtime/src/message-window.d.ts +159 -0
  79. package/dist/agent-runtime/src/message-window.js +16 -2
  80. package/dist/agent-runtime/src/message-window.js.map +1 -1
  81. package/dist/agent-runtime/src/messages.cjs +123 -8
  82. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  83. package/dist/agent-runtime/src/messages.d.ts +621 -0
  84. package/dist/agent-runtime/src/messages.js +123 -8
  85. package/dist/agent-runtime/src/messages.js.map +1 -1
  86. package/dist/agent-runtime/src/model-context.d.ts +22 -0
  87. package/dist/agent-runtime/src/offline-status.d.ts +157 -0
  88. package/dist/agent-runtime/src/optimistic-content.d.ts +21 -0
  89. package/dist/agent-runtime/src/protocol.cjs +12 -4
  90. package/dist/agent-runtime/src/protocol.cjs.map +1 -1
  91. package/dist/agent-runtime/src/protocol.d.ts +119 -0
  92. package/dist/agent-runtime/src/protocol.js +13 -5
  93. package/dist/agent-runtime/src/protocol.js.map +1 -1
  94. package/dist/agent-runtime/src/ptc-subcalls.d.ts +51 -0
  95. package/dist/agent-runtime/src/queue.d.ts +138 -0
  96. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +10 -0
  97. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  98. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +161 -0
  99. package/dist/agent-runtime/src/quota-safe-local-storage-session.js +10 -0
  100. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  101. package/dist/agent-runtime/src/running-tool-placeholder.cjs +11 -0
  102. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -0
  103. package/dist/agent-runtime/src/running-tool-placeholder.d.ts +25 -0
  104. package/dist/agent-runtime/src/running-tool-placeholder.js +11 -0
  105. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -0
  106. package/dist/agent-runtime/src/runtime-messages.d.ts +104 -0
  107. package/dist/agent-runtime/src/screen-point.d.ts +151 -0
  108. package/dist/agent-runtime/src/sealed-idb.cjs +112 -0
  109. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -0
  110. package/dist/agent-runtime/src/sealed-idb.d.ts +106 -0
  111. package/dist/agent-runtime/src/sealed-idb.js +112 -0
  112. package/dist/agent-runtime/src/sealed-idb.js.map +1 -0
  113. package/dist/agent-runtime/src/send-recovery.d.ts +40 -0
  114. package/dist/agent-runtime/src/session-lane-scope.cjs +25 -0
  115. package/dist/agent-runtime/src/session-lane-scope.cjs.map +1 -0
  116. package/dist/agent-runtime/src/session-lane-scope.d.ts +59 -0
  117. package/dist/agent-runtime/src/session-lane-scope.js +25 -0
  118. package/dist/agent-runtime/src/session-lane-scope.js.map +1 -0
  119. package/dist/agent-runtime/src/statewire-attach-observer.d.ts +194 -0
  120. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +74 -0
  121. package/dist/agent-runtime/src/statewire-state.d.ts +29 -0
  122. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  123. package/dist/agent-runtime/src/statewire-suspended.d.ts +27 -0
  124. package/dist/agent-runtime/src/statewire-suspended.js.map +1 -1
  125. package/dist/agent-runtime/src/statewire-transport.d.ts +40 -0
  126. package/dist/agent-runtime/src/streaming-markdown.d.ts +46 -0
  127. package/dist/agent-runtime/src/subagent-transcripts.cjs +209 -0
  128. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -0
  129. package/dist/agent-runtime/src/subagent-transcripts.d.ts +71 -0
  130. package/dist/agent-runtime/src/subagent-transcripts.js +209 -0
  131. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -0
  132. package/dist/agent-runtime/src/subagents.cjs +253 -0
  133. package/dist/agent-runtime/src/subagents.cjs.map +1 -0
  134. package/dist/agent-runtime/src/subagents.d.ts +311 -0
  135. package/dist/agent-runtime/src/subagents.js +253 -0
  136. package/dist/agent-runtime/src/subagents.js.map +1 -0
  137. package/dist/agent-runtime/src/subscription-wake-event.d.ts +111 -0
  138. package/dist/agent-runtime/src/thread-extras.d.ts +43 -0
  139. package/dist/agent-runtime/src/thread-handoff.d.ts +364 -0
  140. package/dist/agent-runtime/src/thread-prewarm-controller.d.ts +76 -0
  141. package/dist/agent-runtime/src/thread-prewarm.d.ts +118 -0
  142. package/dist/agent-runtime/src/thread-snapshot-cache.d.ts +99 -0
  143. package/dist/agent-runtime/src/thread-snapshot-mirror.cjs +46 -117
  144. package/dist/agent-runtime/src/thread-snapshot-mirror.cjs.map +1 -1
  145. package/dist/agent-runtime/src/thread-snapshot-mirror.d.ts +101 -0
  146. package/dist/agent-runtime/src/thread-snapshot-mirror.js +17 -88
  147. package/dist/agent-runtime/src/thread-snapshot-mirror.js.map +1 -1
  148. package/dist/agent-runtime/src/thread-status.d.ts +53 -0
  149. package/dist/agent-runtime/src/tool-metadata.d.ts +146 -0
  150. package/dist/agent-runtime/src/tool-names.cjs +71 -0
  151. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  152. package/dist/agent-runtime/src/tool-names.d.ts +67 -0
  153. package/dist/agent-runtime/src/tool-names.js +72 -1
  154. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  155. package/dist/agent-runtime/src/tool-outputs.d.ts +35 -0
  156. package/dist/agent-runtime/src/tool-result.cjs +1 -0
  157. package/dist/agent-runtime/src/tool-result.cjs.map +1 -1
  158. package/dist/agent-runtime/src/tool-result.d.ts +126 -0
  159. package/dist/agent-runtime/src/tool-result.js +1 -0
  160. package/dist/agent-runtime/src/tool-result.js.map +1 -1
  161. package/dist/agent-runtime/src/types.d.ts +159 -0
  162. package/dist/agent-runtime/src/use-conversation-list.d.ts +76 -0
  163. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +136 -0
  164. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -0
  165. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +64 -0
  166. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +136 -0
  167. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -0
  168. package/dist/agent-runtime/src/use-deep-agent-config.d.ts +169 -0
  169. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +13 -0
  170. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  171. package/dist/agent-runtime/src/use-deep-agent-edit-submit.d.ts +22 -0
  172. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js +13 -0
  173. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -1
  174. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +37 -2
  175. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  176. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +177 -0
  177. package/dist/agent-runtime/src/use-deep-agent-runtime.js +38 -3
  178. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  179. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +39 -13
  180. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  181. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +352 -0
  182. package/dist/agent-runtime/src/use-deep-agent-thread.js +39 -13
  183. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  184. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +1019 -0
  185. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -0
  186. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +409 -0
  187. package/dist/agent-runtime/src/use-deep-agent-voice.js +1019 -0
  188. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -0
  189. package/dist/agent-runtime/src/use-deep-agent-window-sync.d.ts +102 -0
  190. package/dist/agent-runtime/src/use-historical-edit-attachments.d.ts +2 -0
  191. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +84 -0
  192. package/dist/agent-runtime/src/voice-presentation.cjs +2 -0
  193. package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -1
  194. package/dist/agent-runtime/src/voice-presentation.d.ts +80 -0
  195. package/dist/agent-runtime/src/voice-presentation.js +2 -0
  196. package/dist/agent-runtime/src/voice-presentation.js.map +1 -1
  197. package/dist/agent-runtime/src/voice-turn-grouping.d.ts +28 -0
  198. package/dist/agent-runtime/src/voice-wire-types.d.ts +15 -0
  199. package/dist/agent-runtime/src/withdrawn-turns.d.ts +97 -0
  200. package/dist/catalog/runtime-catalog.js +1 -1
  201. package/dist/chat/AthenaChat.cjs +192 -103
  202. package/dist/chat/AthenaChat.cjs.map +1 -1
  203. package/dist/chat/AthenaChat.d.ts +9 -0
  204. package/dist/chat/AthenaChat.js +194 -105
  205. package/dist/chat/AthenaChat.js.map +1 -1
  206. package/dist/chat/StatewireApprovalCard.d.ts +1 -1
  207. package/dist/chat/StatewireClientToolBridge.d.ts +1 -1
  208. package/dist/chat/StatewireQueuedMessages.cjs +11 -4
  209. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  210. package/dist/chat/StatewireQueuedMessages.d.ts +1 -1
  211. package/dist/chat/StatewireQueuedMessages.js +11 -4
  212. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  213. package/dist/chat/chat-outbox-rows.cjs +223 -0
  214. package/dist/chat/chat-outbox-rows.cjs.map +1 -0
  215. package/dist/chat/chat-outbox-rows.d.ts +29 -0
  216. package/dist/chat/chat-outbox-rows.js +223 -0
  217. package/dist/chat/chat-outbox-rows.js.map +1 -0
  218. package/dist/chat/chat-voice-controls.cjs +128 -0
  219. package/dist/chat/chat-voice-controls.cjs.map +1 -0
  220. package/dist/chat/chat-voice-controls.d.ts +19 -0
  221. package/dist/chat/chat-voice-controls.js +128 -0
  222. package/dist/chat/chat-voice-controls.js.map +1 -0
  223. package/dist/chat/statewire-approval.d.ts +1 -1
  224. package/dist/chat/statewire-client-tools.d.ts +1 -1
  225. package/dist/chat/super-grouping/SuperGroupingCard.cjs +3 -1
  226. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  227. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +7 -1
  228. package/dist/chat/super-grouping/SuperGroupingCard.js +3 -1
  229. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  230. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +7 -2
  231. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  232. package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +2 -2
  233. package/dist/chat/super-grouping/SuperGroupingTranscript.js +7 -2
  234. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  235. package/dist/chat/super-grouping/activity-timeline.cjs +15 -8
  236. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  237. package/dist/chat/super-grouping/activity-timeline.d.ts +18 -8
  238. package/dist/chat/super-grouping/activity-timeline.js +15 -8
  239. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  240. package/dist/chat/use-statewire-approval-request.cjs +36 -0
  241. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  242. package/dist/chat/use-statewire-approval-request.d.ts +49 -1
  243. package/dist/chat/use-statewire-approval-request.js +39 -3
  244. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  245. package/dist/chat-ui/composer/tiptap-composer.cjs +133 -14
  246. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  247. package/dist/chat-ui/composer/tiptap-composer.d.ts +33 -1
  248. package/dist/chat-ui/composer/tiptap-composer.js +135 -16
  249. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  250. package/dist/chat-ui/header/conversation-history-panel.d.ts +1 -1
  251. package/dist/chat-ui/index.d.ts +1 -1
  252. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +2 -1
  253. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  254. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +3 -1
  255. package/dist/chat-ui/mentions/suggestions/data/api-client.js +2 -1
  256. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  257. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +29 -51
  258. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  259. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +2 -2
  260. package/dist/chat-ui/mentions/use-account-workspace-id.js +30 -52
  261. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  262. package/dist/chat-ui/messages/message-components.cjs +15 -0
  263. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  264. package/dist/chat-ui/messages/message-components.js +15 -0
  265. package/dist/chat-ui/messages/message-components.js.map +1 -1
  266. package/dist/chat-ui/messages/runtime-message.d.ts +1 -1
  267. package/dist/chat-ui/messages/statewire-continue-run.d.ts +1 -1
  268. package/dist/chat-ui/messages/user-edit-composer.cjs +15 -2
  269. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  270. package/dist/chat-ui/messages/user-edit-composer.d.ts +4 -2
  271. package/dist/chat-ui/messages/user-edit-composer.js +15 -2
  272. package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
  273. package/dist/chat-ui/messages/wake-marker.d.ts +1 -1
  274. package/dist/chat-ui/rich-text/chat-text-schema.cjs +1 -0
  275. package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -1
  276. package/dist/chat-ui/rich-text/chat-text-schema.d.ts +3 -0
  277. package/dist/chat-ui/rich-text/chat-text-schema.js +1 -0
  278. package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -1
  279. package/dist/chat-ui/statewire.cjs +1 -0
  280. package/dist/chat-ui/statewire.cjs.map +1 -1
  281. package/dist/chat-ui/statewire.d.ts +2 -2
  282. package/dist/chat-ui/statewire.js +2 -1
  283. package/dist/chat-ui/thread/composer-send-or-stop.cjs +2 -1
  284. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  285. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +2 -0
  286. package/dist/chat-ui/thread/composer-send-or-stop.js +2 -1
  287. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  288. package/dist/chat-ui/thread/statewire-history-edge.d.ts +1 -1
  289. package/dist/composer/AttachmentContext.cjs +8 -4
  290. package/dist/composer/AttachmentContext.cjs.map +1 -1
  291. package/dist/composer/AttachmentContext.d.ts +7 -0
  292. package/dist/composer/AttachmentContext.js +8 -4
  293. package/dist/composer/AttachmentContext.js.map +1 -1
  294. package/dist/composer/build-composed-message.cjs +34 -0
  295. package/dist/composer/build-composed-message.cjs.map +1 -1
  296. package/dist/composer/build-composed-message.d.ts +20 -0
  297. package/dist/composer/build-composed-message.js +35 -1
  298. package/dist/composer/build-composed-message.js.map +1 -1
  299. package/dist/composer/composer-handoff.cjs +39 -2
  300. package/dist/composer/composer-handoff.cjs.map +1 -1
  301. package/dist/composer/composer-handoff.d.ts +28 -3
  302. package/dist/composer/composer-handoff.js +39 -2
  303. package/dist/composer/composer-handoff.js.map +1 -1
  304. package/dist/composer/useAttachFiles.cjs +15 -2
  305. package/dist/composer/useAttachFiles.cjs.map +1 -1
  306. package/dist/composer/useAttachFiles.d.ts +11 -0
  307. package/dist/composer/useAttachFiles.js +15 -2
  308. package/dist/composer/useAttachFiles.js.map +1 -1
  309. package/dist/composer/useSendMessage.cjs.map +1 -1
  310. package/dist/composer/useSendMessage.d.ts +4 -3
  311. package/dist/composer/useSendMessage.js.map +1 -1
  312. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  313. package/dist/diagnostics/athena-diagnostics.d.ts +3 -1
  314. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  315. package/dist/index.cjs +13 -0
  316. package/dist/index.cjs.map +1 -1
  317. package/dist/index.d.ts +14 -7
  318. package/dist/index.js +14 -1
  319. package/dist/index.js.map +1 -1
  320. package/dist/offline/chat-outbox.cjs +57 -0
  321. package/dist/offline/chat-outbox.cjs.map +1 -0
  322. package/dist/offline/chat-outbox.d.ts +80 -0
  323. package/dist/offline/chat-outbox.js +57 -0
  324. package/dist/offline/chat-outbox.js.map +1 -0
  325. package/dist/offline/offline-history.d.ts +1 -1
  326. package/dist/provider/AthenaProvider.cjs +162 -8
  327. package/dist/provider/AthenaProvider.cjs.map +1 -1
  328. package/dist/provider/AthenaProvider.d.ts +15 -1
  329. package/dist/provider/AthenaProvider.js +163 -9
  330. package/dist/provider/AthenaProvider.js.map +1 -1
  331. package/dist/provider/statewire-window-context.d.ts +1 -1
  332. package/dist/react/package.json.cjs +1 -1
  333. package/dist/react/package.json.js +1 -1
  334. package/dist/references/src/anchors/file-line-range.d.ts +58 -0
  335. package/dist/references/src/anchors/format.d.ts +21 -0
  336. package/dist/references/src/anchors/message-anchors.d.ts +71 -0
  337. package/dist/references/src/anchors/parse.d.ts +8 -0
  338. package/dist/references/src/anchors/registry-contract.d.ts +24 -0
  339. package/dist/references/src/anchors/registry.d.ts +19 -0
  340. package/dist/references/src/anchors/schemas.d.ts +194 -0
  341. package/dist/references/src/anchors/serialize.d.ts +8 -0
  342. package/dist/references/src/anchors/time.d.ts +78 -0
  343. package/dist/references/src/anchors/types.d.ts +474 -0
  344. package/dist/references/src/asset-bounds.d.ts +27 -0
  345. package/dist/references/src/asset-links.d.ts +23 -0
  346. package/dist/references/src/asset-reference.d.ts +16 -0
  347. package/dist/references/src/formats/format-catalog.d.ts +79 -0
  348. package/dist/references/src/formats/markdown/parse-reference-markdown.d.ts +28 -0
  349. package/dist/references/src/formats/markdown/reference-display-name.d.ts +6 -0
  350. package/dist/references/src/formats/object/asset-object.d.ts +9 -0
  351. package/dist/references/src/formats/object/callable-object.d.ts +6 -0
  352. package/dist/references/src/formats/object/decode-reference-object-payload.d.ts +3 -0
  353. package/dist/references/src/formats/object/external-url-object.d.ts +9 -0
  354. package/dist/references/src/formats/object/group-object.d.ts +9 -0
  355. package/dist/references/src/formats/object/navigation-object.d.ts +9 -0
  356. package/dist/references/src/formats/object/parse-reference-object.d.ts +11 -0
  357. package/dist/references/src/formats/object/person-object.d.ts +9 -0
  358. package/dist/references/src/formats/uri/asset-mention-uri.d.ts +9 -0
  359. package/dist/references/src/formats/uri/asset-spaces-url.d.ts +9 -0
  360. package/dist/references/src/formats/uri/callable-mention-uris.d.ts +9 -0
  361. package/dist/references/src/formats/uri/detect-uri-wire.d.ts +9 -0
  362. package/dist/references/src/formats/uri/group-mention-uri.d.ts +12 -0
  363. package/dist/references/src/formats/uri/navigation-spaces-url.d.ts +14 -0
  364. package/dist/references/src/formats/uri/parse-reference-uri.d.ts +20 -0
  365. package/dist/references/src/formats/uri/person-mention-uri.d.ts +9 -0
  366. package/dist/references/src/formats/uri/template-placeholder.d.ts +12 -0
  367. package/dist/references/src/index.d.ts +47 -0
  368. package/dist/references/src/legacy/index.d.ts +14 -0
  369. package/dist/references/src/legacy/pre-reference-asset-url.d.ts +57 -0
  370. package/dist/references/src/legacy/pre-reference-citation-bridge.d.ts +22 -0
  371. package/dist/references/src/legacy/pre-reference-citation.d.ts +138 -0
  372. package/dist/references/src/legacy/pre-reference-external-url.d.ts +31 -0
  373. package/dist/references/src/legacy/pre-reference-format.d.ts +8 -0
  374. package/dist/references/src/legacy/pre-reference-mention.d.ts +27 -0
  375. package/dist/references/src/legacy/pre-reference-object.d.ts +8 -0
  376. package/dist/references/src/legacy/pre-reference-uri.d.ts +12 -0
  377. package/dist/references/src/legacy.d.ts +2 -0
  378. package/dist/references/src/mention-href-patterns.d.ts +19 -0
  379. package/dist/references/src/mention-node/index.d.ts +5 -0
  380. package/dist/references/src/mention-node/mention-node.d.ts +31 -0
  381. package/dist/references/src/mention-node/resolve-node-attrs.d.ts +27 -0
  382. package/dist/references/src/parse-reference.d.ts +23 -0
  383. package/dist/references/src/schemas.d.ts +463 -0
  384. package/dist/references/src/serialize-reference.d.ts +50 -0
  385. package/dist/references/src/sheet-name.d.ts +10 -0
  386. package/dist/references/src/tool-option-schemas.d.ts +597 -0
  387. package/dist/references/src/types.d.ts +125 -0
  388. package/dist/references/src/version-ref.d.ts +30 -0
  389. package/dist/runtime/statewire-lifecycle.d.ts +1 -1
  390. package/dist/runtime/statewire-model-lane.d.ts +1 -1
  391. package/dist/runtime/statewire-server-lane-context.d.ts +1 -1
  392. package/dist/runtime/statewire-session-key.cjs +7 -0
  393. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  394. package/dist/runtime/statewire-session-key.d.ts +19 -0
  395. package/dist/runtime/statewire-session-key.js +8 -1
  396. package/dist/runtime/statewire-session-key.js.map +1 -1
  397. package/dist/runtime/statewire-session-lane.cjs +48 -0
  398. package/dist/runtime/statewire-session-lane.cjs.map +1 -0
  399. package/dist/runtime/statewire-session-lane.d.ts +29 -0
  400. package/dist/runtime/statewire-session-lane.js +48 -0
  401. package/dist/runtime/statewire-session-lane.js.map +1 -0
  402. package/dist/runtime/statewire-thread-config-lane.d.ts +1 -1
  403. package/dist/runtime/useAthenaStatewireRuntime.cjs +19 -5
  404. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  405. package/dist/runtime/useAthenaStatewireRuntime.d.ts +15 -1
  406. package/dist/runtime/useAthenaStatewireRuntime.js +20 -6
  407. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  408. package/dist/styles.css +1 -1
  409. package/dist/threads/api.d.ts +1 -1
  410. package/dist/threads/conversation-list-fetcher.d.ts +1 -1
  411. package/dist/threads/index-triggered-refresh.cjs +164 -0
  412. package/dist/threads/index-triggered-refresh.cjs.map +1 -0
  413. package/dist/threads/index-triggered-refresh.d.ts +70 -0
  414. package/dist/threads/index-triggered-refresh.js +164 -0
  415. package/dist/threads/index-triggered-refresh.js.map +1 -0
  416. package/dist/threads/offline-session-list.d.ts +1 -1
  417. package/dist/threads/pull-request-display.d.ts +1 -1
  418. package/dist/threads/session-list-model.d.ts +1 -1
  419. package/dist/threads/session-list-tab-share.cjs +150 -0
  420. package/dist/threads/session-list-tab-share.cjs.map +1 -0
  421. package/dist/threads/session-list-tab-share.d.ts +73 -0
  422. package/dist/threads/session-list-tab-share.js +150 -0
  423. package/dist/threads/session-list-tab-share.js.map +1 -0
  424. package/dist/threads/session-row-parts.d.ts +1 -1
  425. package/dist/threads/sessions-query.d.ts +1 -1
  426. package/dist/threads/statewire-thread-list.cjs +42 -16
  427. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  428. package/dist/threads/statewire-thread-list.d.ts +11 -2
  429. package/dist/threads/statewire-thread-list.js +43 -17
  430. package/dist/threads/statewire-thread-list.js.map +1 -1
  431. package/dist/threads/thread-prefetcher.d.ts +1 -1
  432. package/dist/threads/use-athena-session-attention.d.ts +1 -1
  433. package/dist/threads/use-athena-sessions.cjs +32 -22
  434. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  435. package/dist/threads/use-athena-sessions.js +33 -23
  436. package/dist/threads/use-athena-sessions.js.map +1 -1
  437. package/dist/threads/use-rest-conversation-history.d.ts +1 -1
  438. package/dist/threads/use-statewire-conversation-history.d.ts +5 -5
  439. package/dist/tiptap-markdown-table/src/markdown-table-serializer.d.ts +56 -0
  440. package/dist/tools/NestedPtcMessages.cjs +14 -9
  441. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  442. package/dist/tools/NestedPtcMessages.d.ts +9 -0
  443. package/dist/tools/NestedPtcMessages.js +6 -1
  444. package/dist/tools/NestedPtcMessages.js.map +1 -1
  445. package/dist/tools/index.d.ts +1 -1
  446. package/dist/tools/primitives.d.ts +1 -1
  447. package/dist/tools/subagent-task-tool-ui.cjs +494 -0
  448. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -0
  449. package/dist/tools/subagent-task-tool-ui.d.ts +109 -0
  450. package/dist/tools/subagent-task-tool-ui.js +494 -0
  451. package/dist/tools/subagent-task-tool-ui.js.map +1 -0
  452. package/dist/tools/tool-fallback.d.ts +1 -1
  453. package/dist/tools/tool-icons.d.ts +1 -1
  454. package/dist/tools/tool-summary.d.ts +1 -1
  455. package/dist/tools/tool-uis.cjs +4 -0
  456. package/dist/tools/tool-uis.cjs.map +1 -1
  457. package/dist/tools/tool-uis.js +4 -0
  458. package/dist/tools/tool-uis.js.map +1 -1
  459. package/dist/voice/chat.cjs +6 -0
  460. package/dist/voice/chat.cjs.map +1 -0
  461. package/dist/voice/chat.d.ts +2 -0
  462. package/dist/voice/chat.js +6 -0
  463. package/dist/voice/chat.js.map +1 -0
  464. package/dist/voice/livekit-join.cjs +119 -0
  465. package/dist/voice/livekit-join.cjs.map +1 -0
  466. package/dist/voice/livekit-join.d.ts +8 -0
  467. package/dist/voice/livekit-join.js +119 -0
  468. package/dist/voice/livekit-join.js.map +1 -0
  469. package/dist/voice/livekit.cjs +32 -0
  470. package/dist/voice/livekit.cjs.map +1 -0
  471. package/dist/voice/livekit.d.ts +80 -0
  472. package/dist/voice/livekit.js +32 -0
  473. package/dist/voice/livekit.js.map +1 -0
  474. package/dist/voice/use-chat-voice-enabled.cjs +43 -0
  475. package/dist/voice/use-chat-voice-enabled.cjs.map +1 -0
  476. package/dist/voice/use-chat-voice-enabled.d.ts +9 -0
  477. package/dist/voice/use-chat-voice-enabled.js +43 -0
  478. package/dist/voice/use-chat-voice-enabled.js.map +1 -0
  479. package/package.json +22 -16
@@ -1 +1 @@
1
- {"version":3,"file":"message-window.cjs","sources":["../../../../agent-runtime/src/message-window.ts"],"sourcesContent":["import type { LangChainMessage } from '@assistant-ui/react-langgraph';\nimport type { StatewireDocuments } from 'statewire';\nimport {\n DEEP_AGENT_DEFAULT_MESSAGE_WINDOW,\n DEEP_AGENT_HISTORY_MESSAGE_COMMAND,\n DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND,\n DEEP_AGENT_INTEREST_PROTOCOL,\n DEEP_AGENT_MAIN_NS,\n DEEP_AGENT_MAX_INTERESTS,\n DEEP_AGENT_MAX_MESSAGE_WINDOW,\n DEEP_AGENT_MESSAGE_WINDOW_HEADER,\n DEEP_AGENT_MIN_MESSAGE_WINDOW,\n DEEP_AGENT_TRUNCATED_CONTENT_KEY,\n} from './generated/runconfig-contract';\nimport { DEEP_AGENT_STATEWIRE_PROTOCOL } from './statewire-transport';\n\n/**\n * The interest window — the client half of agora's\n * `agora/graphs/athena_deep_agent/message_window.py`.\n *\n * The wire main document carries no `messages`. A client states its interests\n * on the `athena/interest` lane as one array (`set(requests)`): the first is\n * the head (the newest `before` messages of the `main` namespace), the rest\n * are pages anchored `at` the first message of the window they extend. The\n * host holds one ephemeral main document per attach, `{ windows }`, one\n * resolution per request in order (the request echoed plus the covered\n * `chain` and `more` flags; an anchor that vanished leaves an empty window in\n * place), and one shared `athena` document per covered message, keyed\n * `[threadId, \"main\", messageId]`. {@link readDeepAgentMessageWindow} joins\n * them into the transcript the converter renders.\n *\n * Two host rules shape the client half. The head window never drops below\n * the oldest message it has carried on an attach (a run's appends grow the\n * view, nothing loaded slides out), so a page stays anchored at the head's\n * first message while the transcript grows; and the host remembers a client\n * id's interests across its attaches, so a reconnect's hello carries the\n * view the client held. A fresh client's hello carries the head it declared\n * on the attach headers ({@link withDeclaredMessageWindow}) — a statement\n * cannot ride the first attach, the hello negotiates the lanes.\n *\n * Pages are appended one per load until the host's interest cap, then the\n * loaded range is restated in as few maximal requests as it takes\n * ({@link pageInterestRequests}); the whole transcript stays reachable up to\n * `MAX_INTERESTS × MAX_MESSAGE_WINDOW` messages. A truncated tool output\n * comes back whole through `history/tool_output` ({@link buildToolOutputCommand});\n * a message's stored form — provenance blobs and all — through\n * `history/message` ({@link buildHistoryMessageCommand}).\n */\n\nconst isIndex = (value: unknown): value is number =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0;\n\n/** What a surface declares for its window: the interest size (the host clamps to its bounds). */\nexport interface DeepAgentMessageWindowDeclaration {\n size?: number;\n}\n\nexport function clampMessageWindowSize(size?: number): number {\n if (size === undefined || !Number.isFinite(size)) return DEEP_AGENT_DEFAULT_MESSAGE_WINDOW;\n return Math.max(\n DEEP_AGENT_MIN_MESSAGE_WINDOW,\n Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, Math.trunc(size))\n );\n}\n\n/** An `athena/interest` request over the linear transcript. */\nexport interface DeepAgentInterestRequest {\n readonly ns: typeof DEEP_AGENT_MAIN_NS;\n /** Messages ending at the anchor (the tail without `at`). */\n readonly before: number;\n /** Anchor message id; a page's is the first message of the window it extends. */\n readonly at?: string;\n /** Messages past the anchor (requires `at`). */\n readonly after?: number;\n}\n\nexport function headInterestRequest(size?: number): DeepAgentInterestRequest {\n return { ns: DEEP_AGENT_MAIN_NS, before: clampMessageWindowSize(size) };\n}\n\nexport function pageInterestRequest(at: string, size?: number): DeepAgentInterestRequest {\n return { ns: DEEP_AGENT_MAIN_NS, before: clampMessageWindowSize(size), at };\n}\n\n/**\n * Attach headers with the head window declared (`x-athena-deep-agent-window`):\n * the hello of a client the host does not remember carries the newest `size`\n * messages. Part of the one attach recipe, so a pooled dial asks for the shape\n * the thread's own attach would. An explicit entry (tests, overrides) wins.\n */\nexport function withDeclaredMessageWindow(\n headers: Record<string, string>,\n declaration: DeepAgentMessageWindowDeclaration = {}\n): Record<string, string> {\n if (DEEP_AGENT_MESSAGE_WINDOW_HEADER in headers) return headers;\n return {\n ...headers,\n [DEEP_AGENT_MESSAGE_WINDOW_HEADER]: String(clampMessageWindowSize(declaration.size)),\n };\n}\n\nexport interface DeepAgentInterestChainEntry {\n id: string;\n siblings: string[];\n}\n\n/** The host's resolution document of one interest: the request echoed plus its coverage. */\nexport interface DeepAgentInterestResolution extends DeepAgentInterestRequest {\n /** Covered message ids, oldest first (a page ends at its anchor). */\n chain: DeepAgentInterestChainEntry[];\n more: { before: boolean; after: boolean };\n}\n\nexport function readDeepAgentInterestResolution(value: unknown): DeepAgentInterestResolution | null {\n if (typeof value !== 'object' || value === null) return null;\n const { ns, before, at, after, chain, more } = value as Record<string, unknown>;\n if (ns !== DEEP_AGENT_MAIN_NS || !isIndex(before) || !Array.isArray(chain)) return null;\n if (at !== undefined && typeof at !== 'string') return null;\n if (after !== undefined && !isIndex(after)) return null;\n if (typeof more !== 'object' || more === null) return null;\n const { before: moreBefore, after: moreAfter } = more as Record<string, unknown>;\n if (typeof moreBefore !== 'boolean' || typeof moreAfter !== 'boolean') return null;\n const entries: DeepAgentInterestChainEntry[] = [];\n for (const entry of chain) {\n const { id, siblings } = (entry ?? {}) as Record<string, unknown>;\n if (typeof id !== 'string') return null;\n entries.push({\n id,\n siblings: Array.isArray(siblings) ? siblings.filter((s) => typeof s === 'string') : [id],\n });\n }\n return {\n ns: DEEP_AGENT_MAIN_NS,\n before,\n ...(at !== undefined && { at }),\n ...(after !== undefined && { after }),\n chain: entries,\n more: { before: moreBefore, after: moreAfter },\n };\n}\n\n/** The attach's interest document: one resolution per stated request, in order. */\nexport interface DeepAgentInterestDocument {\n windows: DeepAgentInterestResolution[];\n}\n\nexport function readDeepAgentInterestDocument(value: unknown): DeepAgentInterestDocument | null {\n if (typeof value !== 'object' || value === null) return null;\n const { windows } = value as Record<string, unknown>;\n if (!Array.isArray(windows)) return null;\n const resolutions: DeepAgentInterestResolution[] = [];\n for (const window of windows) {\n const resolution = readDeepAgentInterestResolution(window);\n if (resolution === null) return null;\n resolutions.push(resolution);\n }\n return { windows: resolutions };\n}\n\nconst interestRequest = ({ ns, before, at, after }: DeepAgentInterestRequest): DeepAgentInterestRequest => ({\n ns,\n before,\n ...(at !== undefined && { at }),\n ...(after !== undefined && { after }),\n});\n\n/** The loaded transcript window, joined from the head interest and its anchored pages. */\nexport interface DeepAgentMessageWindow {\n /** The requests the joined view stands on, in order (the head first): what a `set` restates. A stale page (its anchor gone) or one the head already covers is left out. */\n requests: DeepAgentInterestRequest[];\n /** Covered chain, oldest first. */\n chain: DeepAgentInterestChainEntry[];\n /** The chain's message documents, in chain order (an unmounted one is skipped). */\n messages: LangChainMessage[];\n /** Whether the host holds messages older than the window. */\n hasOlder: boolean;\n /** Pages joined onto the head. */\n pages: number;\n}\n\n/**\n * The loaded chain plus `grow` older messages, restated in as few requests as\n * it takes: a maximal head, then maximal pages each anchored at the first\n * message of the window above it. `null` once even that exceeds the host's\n * interest cap — the reachable depth is `MAX_INTERESTS × MAX_MESSAGE_WINDOW`.\n */\nfunction coalescedInterestRequests(\n chain: readonly DeepAgentInterestChainEntry[],\n grow: number\n): DeepAgentInterestRequest[] | null {\n const loaded = chain.length;\n const requests: DeepAgentInterestRequest[] = [\n { ns: DEEP_AGENT_MAIN_NS, before: Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, loaded) },\n ];\n // `low` is the chain index of the lowest message the plan covers so far.\n let low = loaded - (requests[0] as DeepAgentInterestRequest).before;\n while (low > 0) {\n const before = Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, low + 1);\n requests.push({\n ns: DEEP_AGENT_MAIN_NS,\n before,\n at: (chain[low] as DeepAgentInterestChainEntry).id,\n });\n low = low + 1 - before;\n }\n // The plan covers the chain; the new messages extend its lowest request\n // when that stays within one window, else they are a page of their own.\n const last = requests[requests.length - 1] as DeepAgentInterestRequest;\n if (last.before + grow <= DEEP_AGENT_MAX_MESSAGE_WINDOW) {\n requests[requests.length - 1] = { ...last, before: last.before + grow };\n } else {\n requests.push({\n ns: DEEP_AGENT_MAIN_NS,\n before: grow + 1,\n at: (chain[0] as DeepAgentInterestChainEntry).id,\n });\n }\n return requests.length > DEEP_AGENT_MAX_INTERESTS ? null : requests;\n}\n\n/**\n * The requests to state for one more page of older history, or `null` when\n * there is nothing to load (no anchor, the beginning reached) or the host's\n * interest cap is spent. One page is appended, anchored at the window's first\n * message, while the cap allows; at the cap the loaded range is coalesced\n * into maximal requests first (see {@link coalescedInterestRequests}).\n */\nexport function pageInterestRequests(\n window: DeepAgentMessageWindow,\n size?: number\n): DeepAgentInterestRequest[] | null {\n const anchor = window.chain[0]?.id;\n if (anchor === undefined || !window.hasOlder) return null;\n const page = pageInterestRequest(anchor, size);\n const appended = [...window.requests, page];\n if (appended.length <= DEEP_AGENT_MAX_INTERESTS) return appended;\n // A page's `before` counts its anchor: it adds `before - 1` older messages.\n return coalescedInterestRequests(window.chain, page.before - 1);\n}\n\n/**\n * Whether every `stated` request is carried by `carried` (the same anchor, at\n * least as wide): a reconnect's hello that carries what the client last\n * stated — the host remembers a client id's interests — needs no restatement.\n */\nexport function interestsCovered(\n carried: readonly DeepAgentInterestRequest[],\n stated: readonly DeepAgentInterestRequest[]\n): boolean {\n return stated.every((request) =>\n carried.some((have) => have.at === request.at && have.before >= request.before)\n );\n}\n\n/**\n * The window off the mounted documents, or `null` while the head interest has\n * not resolved (pre-attach, before the first `set` answer, a wire without\n * documents). A page joins wherever its anchor sits in the chain so far — at\n * the first message it extends the view, inside the head (the head widened\n * past it) it adds nothing and is left out of `requests`; a page whose anchor\n * left the transcript (a rewind emptied it in place) is left out too. A\n * malformed document reads as absent.\n */\nexport function readDeepAgentMessageWindow(\n mounted: ReadonlyMap<number, StatewireDocuments.Document> | undefined\n): DeepAgentMessageWindow | null {\n if (mounted === undefined) return null;\n let windows: DeepAgentInterestResolution[] | undefined;\n const documents = new Map<string, LangChainMessage>();\n for (const document of mounted.values()) {\n const key = document.key;\n if (document.protocol === DEEP_AGENT_INTEREST_PROTOCOL && document.main === true) {\n windows = readDeepAgentInterestDocument(document.value)?.windows;\n } else if (\n document.protocol === DEEP_AGENT_STATEWIRE_PROTOCOL &&\n key !== null &&\n key.length === 3 &&\n key[1] === DEEP_AGENT_MAIN_NS\n ) {\n documents.set(key[2] as string, document.value as LangChainMessage);\n }\n }\n const head = windows?.[0];\n if (windows === undefined || head === undefined) return null;\n let chain = head.chain;\n let hasOlder = head.more.before;\n const requests = [interestRequest(head)];\n const loaded = new Set(chain.map((entry) => entry.id));\n let pages = 0;\n for (const page of windows.slice(1)) {\n if (page.at === undefined || !loaded.has(page.at)) continue;\n const anchorAt = page.chain.findIndex((entry) => entry.id === page.at);\n if (anchorAt < 0) continue;\n // Both windows are ranges of one linear transcript sharing the anchor:\n // what the page holds below it and the chain does not is a prefix.\n const fresh = page.chain.slice(0, anchorAt).filter((entry) => !loaded.has(entry.id));\n if (fresh.length === 0) {\n // Nothing new, but a page that starts where the loaded chain starts\n // has looked below it: its `more.before` is the answer for the edge.\n if (page.chain[0]?.id === chain[0]?.id) hasOlder = page.more.before;\n continue;\n }\n chain = [...fresh, ...chain];\n for (const entry of fresh) loaded.add(entry.id);\n hasOlder = page.more.before;\n requests.push(interestRequest(page));\n pages += 1;\n }\n const messages: LangChainMessage[] = [];\n for (const entry of chain) {\n const message = documents.get(entry.id);\n if (message !== undefined) messages.push(message);\n }\n return { requests, chain, messages, hasOlder, pages };\n}\n\n/**\n * The windowed wire's read command on the statewire command union, so\n * `sendCommand({ type: 'history/tool_output', … })` typechecks wherever the\n * deep-agent host is driven (`DeepAgentThread.history_tool_output`, an\n * attach-ACL read).\n */\ndeclare module '@assistant-ui/core' {\n namespace Assistant {\n interface Commands {\n /** A tool output the windowed wire carried cut, whole. */\n historyToolOutput: ToolOutputCommand;\n /** One stored message whole — the per-client shape, by command. */\n historyMessage: HistoryMessageCommand;\n }\n }\n}\n\n/** The `history/tool_output` command: a truncated tool output, whole. */\nexport interface ToolOutputCommand {\n readonly type: typeof DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND;\n readonly messageId: string;\n}\n\nexport function buildToolOutputCommand({ messageId }: { messageId: string }): ToolOutputCommand {\n return { type: DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND, messageId };\n}\n\nexport interface ToolOutputResult {\n messageId: string;\n content: unknown;\n}\n\nexport function readToolOutputResult(payload: unknown): ToolOutputResult | null {\n if (typeof payload !== 'object' || payload === null) return null;\n const { messageId, content } = payload as Record<string, unknown>;\n if (typeof messageId !== 'string' || !messageId) return null;\n return { messageId, content };\n}\n\n/**\n * The `history/message` command: a message as the host stores it — the\n * model-provenance blobs the wire strips and an untruncated tool output\n * included. Every client receives one projected wire form; this is the one\n * per-client shape, fetched on demand like `history/tool_output`.\n */\nexport interface HistoryMessageCommand {\n readonly type: typeof DEEP_AGENT_HISTORY_MESSAGE_COMMAND;\n readonly messageId: string;\n}\n\nexport function buildHistoryMessageCommand({\n messageId,\n}: {\n messageId: string;\n}): HistoryMessageCommand {\n return { type: DEEP_AGENT_HISTORY_MESSAGE_COMMAND, messageId };\n}\n\nexport interface HistoryMessageResult {\n messageId: string;\n message: LangChainMessage;\n}\n\nexport function readHistoryMessageResult(payload: unknown): HistoryMessageResult | null {\n if (typeof payload !== 'object' || payload === null) return null;\n const { messageId, message } = payload as Record<string, unknown>;\n if (typeof messageId !== 'string' || !messageId) return null;\n if (typeof message !== 'object' || message === null) return null;\n return { messageId, message: message as LangChainMessage };\n}\n\n/** The wire marker on a tool message whose content the host cut. */\nexport interface TruncatedToolContent {\n /** Length of the full output, in characters. */\n chars: number;\n}\n\n/**\n * The truncation marker off a raw wire message, or `null` when the message's\n * content is whole. Pure and selector-safe on the marker object.\n */\nexport function readTruncatedToolContent(message: unknown): TruncatedToolContent | null {\n if (typeof message !== 'object' || message === null) return null;\n const marker = (message as Record<string, unknown>)[DEEP_AGENT_TRUNCATED_CONTENT_KEY];\n if (typeof marker !== 'object' || marker === null) return null;\n const chars = (marker as Record<string, unknown>).chars;\n return isIndex(chars) ? { chars } : null;\n}\n\n/**\n * `artifact` key the shared converter lifts a truncated tool output's marker\n * into (with the tool message id), so a tool card can ask for the full output\n * — the converter joins the ToolMessage into its tool-call part and would\n * otherwise drop the wire marker.\n */\nexport const ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY = '_athena_content_truncated';\n\nexport interface TruncatedToolOutputArtifact extends TruncatedToolContent {\n /** The tool message to name in `history/tool_output`. */\n messageId: string;\n}\n\n/**\n * The lifted truncation marker off a tool-call part's `artifact`, or `null`.\n */\nexport function readTruncatedToolOutputArtifact(\n artifact: unknown\n): TruncatedToolOutputArtifact | null {\n if (typeof artifact !== 'object' || artifact === null) return null;\n const lifted = (artifact as Record<string, unknown>)[ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY];\n if (typeof lifted !== 'object' || lifted === null) return null;\n const { chars, messageId } = lifted as Record<string, unknown>;\n if (!isIndex(chars) || typeof messageId !== 'string' || !messageId) return null;\n return { chars, messageId };\n}\n"],"names":["DEEP_AGENT_DEFAULT_MESSAGE_WINDOW","DEEP_AGENT_MIN_MESSAGE_WINDOW","DEEP_AGENT_MAX_MESSAGE_WINDOW","DEEP_AGENT_MAIN_NS","DEEP_AGENT_MESSAGE_WINDOW_HEADER","DEEP_AGENT_MAX_INTERESTS","DEEP_AGENT_INTEREST_PROTOCOL","DEEP_AGENT_STATEWIRE_PROTOCOL","DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND","DEEP_AGENT_TRUNCATED_CONTENT_KEY"],"mappings":"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"}
1
+ {"version":3,"file":"message-window.cjs","sources":["../../../../agent-runtime/src/message-window.ts"],"sourcesContent":["import type { LangChainMessage } from '@assistant-ui/react-langgraph';\nimport type { StatewireDocuments } from 'statewire';\nimport {\n DEEP_AGENT_CUT_LANE_DOCUMENT,\n DEEP_AGENT_DEFAULT_MESSAGE_WINDOW,\n DEEP_AGENT_HISTORY_MESSAGE_COMMAND,\n DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND,\n DEEP_AGENT_INTEREST_PROTOCOL,\n DEEP_AGENT_MAIN_NS,\n DEEP_AGENT_MAX_INTERESTS,\n DEEP_AGENT_MAX_MESSAGE_WINDOW,\n DEEP_AGENT_MESSAGE_WINDOW_HEADER,\n DEEP_AGENT_MIN_MESSAGE_WINDOW,\n DEEP_AGENT_TRUNCATED_CONTENT_KEY,\n} from './generated/runconfig-contract';\nimport { DEEP_AGENT_STATEWIRE_PROTOCOL } from './statewire-transport';\n\n/**\n * The interest window — the client half of agora's\n * `agora/graphs/athena_deep_agent/message_window.py`.\n *\n * The wire main document carries no `messages`. A client states its interests\n * on the `athena/interest` lane as one array (`set(requests)`): the first is\n * the head (the newest `before` messages of the `main` namespace), the rest\n * are pages anchored `at` the first message of the window they extend. The\n * host holds one ephemeral main document per attach, `{ windows }`, one\n * resolution per request in order (the request echoed plus the covered\n * `chain` and `more` flags; an anchor that vanished leaves an empty window in\n * place), and one shared `athena` document per covered message, keyed\n * `[threadId, \"main\", messageId]` — or `[threadId, \"main\", messageId, \"cut\"]`\n * for a finished card a version-2 view carries cut to its newest steps (its\n * whole lane pages in through `history/lane`, see `lane-history.ts`).\n * {@link readDeepAgentMessageWindow} joins them into the transcript the\n * converter renders.\n *\n * Two host rules shape the client half. The head window never drops below\n * the oldest message it has carried on an attach (a run's appends grow the\n * view, nothing loaded slides out), so a page stays anchored at the head's\n * first message while the transcript grows; and the host remembers a client\n * id's interests across its attaches, so a reconnect's hello carries the\n * view the client held. A fresh client's hello carries the head it declared\n * on the attach headers ({@link withDeclaredMessageWindow}) — a statement\n * cannot ride the first attach, the hello negotiates the lanes.\n *\n * Pages are appended one per load until the host's interest cap, then the\n * loaded range is restated in as few maximal requests as it takes\n * ({@link pageInterestRequests}); the whole transcript stays reachable up to\n * `MAX_INTERESTS × MAX_MESSAGE_WINDOW` messages. A truncated tool output\n * comes back whole through `history/tool_output` ({@link buildToolOutputCommand});\n * a message's stored form — provenance blobs and all — through\n * `history/message` ({@link buildHistoryMessageCommand}).\n */\n\nconst isIndex = (value: unknown): value is number =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0;\n\n/** What a surface declares for its window: the interest size (the host clamps to its bounds). */\nexport interface DeepAgentMessageWindowDeclaration {\n size?: number;\n}\n\nexport function clampMessageWindowSize(size?: number): number {\n if (size === undefined || !Number.isFinite(size)) return DEEP_AGENT_DEFAULT_MESSAGE_WINDOW;\n return Math.max(\n DEEP_AGENT_MIN_MESSAGE_WINDOW,\n Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, Math.trunc(size))\n );\n}\n\n/** An `athena/interest` request over the linear transcript. */\nexport interface DeepAgentInterestRequest {\n readonly ns: typeof DEEP_AGENT_MAIN_NS;\n /** Messages ending at the anchor (the tail without `at`). */\n readonly before: number;\n /** Anchor message id; a page's is the first message of the window it extends. */\n readonly at?: string;\n /** Messages past the anchor (requires `at`). */\n readonly after?: number;\n /** The newest steps of every subagent lane a covered card names (see `lane-follow.ts`). */\n readonly follow?: { readonly before: number };\n}\n\nexport function headInterestRequest(size?: number): DeepAgentInterestRequest {\n return { ns: DEEP_AGENT_MAIN_NS, before: clampMessageWindowSize(size) };\n}\n\nexport function pageInterestRequest(at: string, size?: number): DeepAgentInterestRequest {\n return { ns: DEEP_AGENT_MAIN_NS, before: clampMessageWindowSize(size), at };\n}\n\n/**\n * Attach headers with the head window declared (`x-athena-deep-agent-window`):\n * the hello of a client the host does not remember carries the newest `size`\n * messages. Part of the one attach recipe, so a pooled dial asks for the shape\n * the thread's own attach would. An explicit entry (tests, overrides) wins.\n */\nexport function withDeclaredMessageWindow(\n headers: Record<string, string>,\n declaration: DeepAgentMessageWindowDeclaration = {}\n): Record<string, string> {\n if (DEEP_AGENT_MESSAGE_WINDOW_HEADER in headers) return headers;\n return {\n ...headers,\n [DEEP_AGENT_MESSAGE_WINDOW_HEADER]: String(clampMessageWindowSize(declaration.size)),\n };\n}\n\nexport interface DeepAgentInterestChainEntry {\n id: string;\n siblings: string[];\n}\n\n/** The host's resolution document of one interest: the request echoed plus its coverage. */\nexport interface DeepAgentInterestResolution extends DeepAgentInterestRequest {\n /** Covered message ids, oldest first (a page ends at its anchor). */\n chain: DeepAgentInterestChainEntry[];\n more: { before: boolean; after: boolean };\n}\n\nexport function readDeepAgentInterestResolution(value: unknown): DeepAgentInterestResolution | null {\n if (typeof value !== 'object' || value === null) return null;\n const { ns, before, at, after, chain, more } = value as Record<string, unknown>;\n if (ns !== DEEP_AGENT_MAIN_NS || !isIndex(before) || !Array.isArray(chain)) return null;\n if (at !== undefined && typeof at !== 'string') return null;\n if (after !== undefined && !isIndex(after)) return null;\n if (typeof more !== 'object' || more === null) return null;\n const { before: moreBefore, after: moreAfter } = more as Record<string, unknown>;\n if (typeof moreBefore !== 'boolean' || typeof moreAfter !== 'boolean') return null;\n const entries: DeepAgentInterestChainEntry[] = [];\n for (const entry of chain) {\n const { id, siblings } = (entry ?? {}) as Record<string, unknown>;\n if (typeof id !== 'string') return null;\n entries.push({\n id,\n siblings: Array.isArray(siblings) ? siblings.filter((s) => typeof s === 'string') : [id],\n });\n }\n return {\n ns: DEEP_AGENT_MAIN_NS,\n before,\n ...(at !== undefined && { at }),\n ...(after !== undefined && { after }),\n chain: entries,\n more: { before: moreBefore, after: moreAfter },\n };\n}\n\n/** The attach's interest document: one resolution per stated request, in order. */\nexport interface DeepAgentInterestDocument {\n windows: DeepAgentInterestResolution[];\n}\n\nexport function readDeepAgentInterestDocument(value: unknown): DeepAgentInterestDocument | null {\n if (typeof value !== 'object' || value === null) return null;\n const { windows } = value as Record<string, unknown>;\n if (!Array.isArray(windows)) return null;\n const resolutions: DeepAgentInterestResolution[] = [];\n for (const window of windows) {\n const resolution = readDeepAgentInterestResolution(window);\n if (resolution === null) return null;\n resolutions.push(resolution);\n }\n return { windows: resolutions };\n}\n\nconst interestRequest = ({ ns, before, at, after }: DeepAgentInterestRequest): DeepAgentInterestRequest => ({\n ns,\n before,\n ...(at !== undefined && { at }),\n ...(after !== undefined && { after }),\n});\n\n/** The loaded transcript window, joined from the head interest and its anchored pages. */\nexport interface DeepAgentMessageWindow {\n /** The requests the joined view stands on, in order (the head first): what a `set` restates. A stale page (its anchor gone) or one the head already covers is left out. */\n requests: DeepAgentInterestRequest[];\n /** Covered chain, oldest first. */\n chain: DeepAgentInterestChainEntry[];\n /** The chain's message documents, in chain order (an unmounted one is skipped). */\n messages: LangChainMessage[];\n /** Whether the host holds messages older than the window. */\n hasOlder: boolean;\n /** Pages joined onto the head. */\n pages: number;\n}\n\n/**\n * The loaded chain plus `grow` older messages, restated in as few requests as\n * it takes: a maximal head, then maximal pages each anchored at the first\n * message of the window above it. `null` once even that exceeds the host's\n * interest cap — the reachable depth is `MAX_INTERESTS × MAX_MESSAGE_WINDOW`.\n */\nfunction coalescedInterestRequests(\n chain: readonly DeepAgentInterestChainEntry[],\n grow: number\n): DeepAgentInterestRequest[] | null {\n const loaded = chain.length;\n const requests: DeepAgentInterestRequest[] = [\n { ns: DEEP_AGENT_MAIN_NS, before: Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, loaded) },\n ];\n // `low` is the chain index of the lowest message the plan covers so far.\n let low = loaded - (requests[0] as DeepAgentInterestRequest).before;\n while (low > 0) {\n const before = Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, low + 1);\n requests.push({\n ns: DEEP_AGENT_MAIN_NS,\n before,\n at: (chain[low] as DeepAgentInterestChainEntry).id,\n });\n low = low + 1 - before;\n }\n // The plan covers the chain; the new messages extend its lowest request\n // when that stays within one window, else they are a page of their own.\n const last = requests[requests.length - 1] as DeepAgentInterestRequest;\n if (last.before + grow <= DEEP_AGENT_MAX_MESSAGE_WINDOW) {\n requests[requests.length - 1] = { ...last, before: last.before + grow };\n } else {\n requests.push({\n ns: DEEP_AGENT_MAIN_NS,\n before: grow + 1,\n at: (chain[0] as DeepAgentInterestChainEntry).id,\n });\n }\n return requests.length > DEEP_AGENT_MAX_INTERESTS ? null : requests;\n}\n\n/**\n * The requests to state for one more page of older history, or `null` when\n * there is nothing to load (no anchor, the beginning reached) or the host's\n * interest cap is spent. One page is appended, anchored at the window's first\n * message, while the cap allows; at the cap the loaded range is coalesced\n * into maximal requests first (see {@link coalescedInterestRequests}).\n */\nexport function pageInterestRequests(\n window: DeepAgentMessageWindow,\n size?: number\n): DeepAgentInterestRequest[] | null {\n const anchor = window.chain[0]?.id;\n if (anchor === undefined || !window.hasOlder) return null;\n const page = pageInterestRequest(anchor, size);\n const appended = [...window.requests, page];\n if (appended.length <= DEEP_AGENT_MAX_INTERESTS) return appended;\n // A page's `before` counts its anchor: it adds `before - 1` older messages.\n return coalescedInterestRequests(window.chain, page.before - 1);\n}\n\n/**\n * Whether every `stated` request is carried by `carried` (the same anchor, at\n * least as wide): a reconnect's hello that carries what the client last\n * stated — the host remembers a client id's interests — needs no restatement.\n */\nexport function interestsCovered(\n carried: readonly DeepAgentInterestRequest[],\n stated: readonly DeepAgentInterestRequest[]\n): boolean {\n return stated.every((request) =>\n carried.some((have) => have.at === request.at && have.before >= request.before)\n );\n}\n\n/**\n * The window off the mounted documents, or `null` while the head interest has\n * not resolved (pre-attach, before the first `set` answer, a wire without\n * documents). A page joins wherever its anchor sits in the chain so far — at\n * the first message it extends the view, inside the head (the head widened\n * past it) it adds nothing and is left out of `requests`; a page whose anchor\n * left the transcript (a rewind emptied it in place) is left out too. A\n * malformed document reads as absent.\n */\nexport function readDeepAgentMessageWindow(\n mounted: ReadonlyMap<number, StatewireDocuments.Document> | undefined\n): DeepAgentMessageWindow | null {\n if (mounted === undefined) return null;\n let windows: DeepAgentInterestResolution[] | undefined;\n const documents = new Map<string, LangChainMessage>();\n for (const document of mounted.values()) {\n const key = document.key;\n if (document.protocol === DEEP_AGENT_INTEREST_PROTOCOL && document.main === true) {\n windows = readDeepAgentInterestDocument(document.value)?.windows;\n } else if (\n document.protocol === DEEP_AGENT_STATEWIRE_PROTOCOL &&\n key !== null &&\n key[1] === DEEP_AGENT_MAIN_NS &&\n (key.length === 3 || (key.length === 4 && key[3] === DEEP_AGENT_CUT_LANE_DOCUMENT))\n ) {\n documents.set(key[2] as string, document.value as LangChainMessage);\n }\n }\n const head = windows?.[0];\n if (windows === undefined || head === undefined) return null;\n let chain = head.chain;\n let hasOlder = head.more.before;\n const requests = [interestRequest(head)];\n const loaded = new Set(chain.map((entry) => entry.id));\n let pages = 0;\n for (const page of windows.slice(1)) {\n if (page.at === undefined || !loaded.has(page.at)) continue;\n const anchorAt = page.chain.findIndex((entry) => entry.id === page.at);\n if (anchorAt < 0) continue;\n // Both windows are ranges of one linear transcript sharing the anchor:\n // what the page holds below it and the chain does not is a prefix.\n const fresh = page.chain.slice(0, anchorAt).filter((entry) => !loaded.has(entry.id));\n if (fresh.length === 0) {\n // Nothing new, but a page that starts where the loaded chain starts\n // has looked below it: its `more.before` is the answer for the edge.\n if (page.chain[0]?.id === chain[0]?.id) hasOlder = page.more.before;\n continue;\n }\n chain = [...fresh, ...chain];\n for (const entry of fresh) loaded.add(entry.id);\n hasOlder = page.more.before;\n requests.push(interestRequest(page));\n pages += 1;\n }\n const messages: LangChainMessage[] = [];\n for (const entry of chain) {\n const message = documents.get(entry.id);\n if (message !== undefined) messages.push(message);\n }\n return { requests, chain, messages, hasOlder, pages };\n}\n\n/**\n * The windowed wire's read command on the statewire command union, so\n * `sendCommand({ type: 'history/tool_output', … })` typechecks wherever the\n * deep-agent host is driven (`DeepAgentThread.history_tool_output`, an\n * attach-ACL read).\n */\ndeclare module '@assistant-ui/core' {\n namespace Assistant {\n interface Commands {\n /** A tool output the windowed wire carried cut, whole. */\n historyToolOutput: ToolOutputCommand;\n /** One stored message whole — the per-client shape, by command. */\n historyMessage: HistoryMessageCommand;\n }\n }\n}\n\n/** The `history/tool_output` command: a truncated tool output, whole. */\nexport interface ToolOutputCommand {\n readonly type: typeof DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND;\n readonly messageId: string;\n}\n\nexport function buildToolOutputCommand({ messageId }: { messageId: string }): ToolOutputCommand {\n return { type: DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND, messageId };\n}\n\nexport interface ToolOutputResult {\n messageId: string;\n content: unknown;\n}\n\nexport function readToolOutputResult(payload: unknown): ToolOutputResult | null {\n if (typeof payload !== 'object' || payload === null) return null;\n const { messageId, content } = payload as Record<string, unknown>;\n if (typeof messageId !== 'string' || !messageId) return null;\n return { messageId, content };\n}\n\n/**\n * The `history/message` command: a message as the host stores it — the\n * model-provenance blobs the wire strips and an untruncated tool output\n * included. Every client receives one projected wire form; this is the one\n * per-client shape, fetched on demand like `history/tool_output`.\n */\nexport interface HistoryMessageCommand {\n readonly type: typeof DEEP_AGENT_HISTORY_MESSAGE_COMMAND;\n readonly messageId: string;\n}\n\nexport function buildHistoryMessageCommand({\n messageId,\n}: {\n messageId: string;\n}): HistoryMessageCommand {\n return { type: DEEP_AGENT_HISTORY_MESSAGE_COMMAND, messageId };\n}\n\nexport interface HistoryMessageResult {\n messageId: string;\n message: LangChainMessage;\n}\n\nexport function readHistoryMessageResult(payload: unknown): HistoryMessageResult | null {\n if (typeof payload !== 'object' || payload === null) return null;\n const { messageId, message } = payload as Record<string, unknown>;\n if (typeof messageId !== 'string' || !messageId) return null;\n if (typeof message !== 'object' || message === null) return null;\n return { messageId, message: message as LangChainMessage };\n}\n\n/** The wire marker on a tool message whose content the host cut. */\nexport interface TruncatedToolContent {\n /** Length of the full output, in characters. */\n chars: number;\n}\n\n/**\n * The truncation marker off a raw wire message, or `null` when the message's\n * content is whole. Pure and selector-safe on the marker object.\n */\nexport function readTruncatedToolContent(message: unknown): TruncatedToolContent | null {\n if (typeof message !== 'object' || message === null) return null;\n const marker = (message as Record<string, unknown>)[DEEP_AGENT_TRUNCATED_CONTENT_KEY];\n if (typeof marker !== 'object' || marker === null) return null;\n const chars = (marker as Record<string, unknown>).chars;\n return isIndex(chars) ? { chars } : null;\n}\n\n/**\n * `artifact` key the shared converter lifts a truncated tool output's marker\n * into (with the tool message id), so a tool card can ask for the full output\n * — the converter joins the ToolMessage into its tool-call part and would\n * otherwise drop the wire marker.\n */\nexport const ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY = '_athena_content_truncated';\n\nexport interface TruncatedToolOutputArtifact extends TruncatedToolContent {\n /** The tool message to name in `history/tool_output`. */\n messageId: string;\n}\n\n/**\n * The lifted truncation marker off a tool-call part's `artifact`, or `null`.\n */\nexport function readTruncatedToolOutputArtifact(\n artifact: unknown\n): TruncatedToolOutputArtifact | null {\n if (typeof artifact !== 'object' || artifact === null) return null;\n const lifted = (artifact as Record<string, unknown>)[ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY];\n if (typeof lifted !== 'object' || lifted === null) return null;\n const { chars, messageId } = lifted as Record<string, unknown>;\n if (!isIndex(chars) || typeof messageId !== 'string' || !messageId) return null;\n return { chars, messageId };\n}\n"],"names":["DEEP_AGENT_DEFAULT_MESSAGE_WINDOW","DEEP_AGENT_MIN_MESSAGE_WINDOW","DEEP_AGENT_MAX_MESSAGE_WINDOW","DEEP_AGENT_MAIN_NS","DEEP_AGENT_MESSAGE_WINDOW_HEADER","DEEP_AGENT_MAX_INTERESTS","DEEP_AGENT_INTEREST_PROTOCOL","DEEP_AGENT_STATEWIRE_PROTOCOL","DEEP_AGENT_CUT_LANE_DOCUMENT","DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND","DEEP_AGENT_HISTORY_MESSAGE_COMMAND","DEEP_AGENT_TRUNCATED_CONTENT_KEY"],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import type { LangChainMessage } from '@assistant-ui/react-langgraph';
2
+ import type { StatewireDocuments } from 'statewire';
3
+ import { DEEP_AGENT_HISTORY_MESSAGE_COMMAND, DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND, DEEP_AGENT_MAIN_NS } from './generated/runconfig-contract';
4
+ /** What a surface declares for its window: the interest size (the host clamps to its bounds). */
5
+ export interface DeepAgentMessageWindowDeclaration {
6
+ size?: number;
7
+ }
8
+ export declare function clampMessageWindowSize(size?: number): number;
9
+ /** An `athena/interest` request over the linear transcript. */
10
+ export interface DeepAgentInterestRequest {
11
+ readonly ns: typeof DEEP_AGENT_MAIN_NS;
12
+ /** Messages ending at the anchor (the tail without `at`). */
13
+ readonly before: number;
14
+ /** Anchor message id; a page's is the first message of the window it extends. */
15
+ readonly at?: string;
16
+ /** Messages past the anchor (requires `at`). */
17
+ readonly after?: number;
18
+ /** The newest steps of every subagent lane a covered card names (see `lane-follow.ts`). */
19
+ readonly follow?: {
20
+ readonly before: number;
21
+ };
22
+ }
23
+ export declare function headInterestRequest(size?: number): DeepAgentInterestRequest;
24
+ export declare function pageInterestRequest(at: string, size?: number): DeepAgentInterestRequest;
25
+ /**
26
+ * Attach headers with the head window declared (`x-athena-deep-agent-window`):
27
+ * the hello of a client the host does not remember carries the newest `size`
28
+ * messages. Part of the one attach recipe, so a pooled dial asks for the shape
29
+ * the thread's own attach would. An explicit entry (tests, overrides) wins.
30
+ */
31
+ export declare function withDeclaredMessageWindow(headers: Record<string, string>, declaration?: DeepAgentMessageWindowDeclaration): Record<string, string>;
32
+ export interface DeepAgentInterestChainEntry {
33
+ id: string;
34
+ siblings: string[];
35
+ }
36
+ /** The host's resolution document of one interest: the request echoed plus its coverage. */
37
+ export interface DeepAgentInterestResolution extends DeepAgentInterestRequest {
38
+ /** Covered message ids, oldest first (a page ends at its anchor). */
39
+ chain: DeepAgentInterestChainEntry[];
40
+ more: {
41
+ before: boolean;
42
+ after: boolean;
43
+ };
44
+ }
45
+ export declare function readDeepAgentInterestResolution(value: unknown): DeepAgentInterestResolution | null;
46
+ /** The attach's interest document: one resolution per stated request, in order. */
47
+ export interface DeepAgentInterestDocument {
48
+ windows: DeepAgentInterestResolution[];
49
+ }
50
+ export declare function readDeepAgentInterestDocument(value: unknown): DeepAgentInterestDocument | null;
51
+ /** The loaded transcript window, joined from the head interest and its anchored pages. */
52
+ export interface DeepAgentMessageWindow {
53
+ /** The requests the joined view stands on, in order (the head first): what a `set` restates. A stale page (its anchor gone) or one the head already covers is left out. */
54
+ requests: DeepAgentInterestRequest[];
55
+ /** Covered chain, oldest first. */
56
+ chain: DeepAgentInterestChainEntry[];
57
+ /** The chain's message documents, in chain order (an unmounted one is skipped). */
58
+ messages: LangChainMessage[];
59
+ /** Whether the host holds messages older than the window. */
60
+ hasOlder: boolean;
61
+ /** Pages joined onto the head. */
62
+ pages: number;
63
+ }
64
+ /**
65
+ * The requests to state for one more page of older history, or `null` when
66
+ * there is nothing to load (no anchor, the beginning reached) or the host's
67
+ * interest cap is spent. One page is appended, anchored at the window's first
68
+ * message, while the cap allows; at the cap the loaded range is coalesced
69
+ * into maximal requests first (see {@link coalescedInterestRequests}).
70
+ */
71
+ export declare function pageInterestRequests(window: DeepAgentMessageWindow, size?: number): DeepAgentInterestRequest[] | null;
72
+ /**
73
+ * Whether every `stated` request is carried by `carried` (the same anchor, at
74
+ * least as wide): a reconnect's hello that carries what the client last
75
+ * stated — the host remembers a client id's interests — needs no restatement.
76
+ */
77
+ export declare function interestsCovered(carried: readonly DeepAgentInterestRequest[], stated: readonly DeepAgentInterestRequest[]): boolean;
78
+ /**
79
+ * The window off the mounted documents, or `null` while the head interest has
80
+ * not resolved (pre-attach, before the first `set` answer, a wire without
81
+ * documents). A page joins wherever its anchor sits in the chain so far — at
82
+ * the first message it extends the view, inside the head (the head widened
83
+ * past it) it adds nothing and is left out of `requests`; a page whose anchor
84
+ * left the transcript (a rewind emptied it in place) is left out too. A
85
+ * malformed document reads as absent.
86
+ */
87
+ export declare function readDeepAgentMessageWindow(mounted: ReadonlyMap<number, StatewireDocuments.Document> | undefined): DeepAgentMessageWindow | null;
88
+ /**
89
+ * The windowed wire's read command on the statewire command union, so
90
+ * `sendCommand({ type: 'history/tool_output', … })` typechecks wherever the
91
+ * deep-agent host is driven (`DeepAgentThread.history_tool_output`, an
92
+ * attach-ACL read).
93
+ */
94
+ declare module '@assistant-ui/core' {
95
+ namespace Assistant {
96
+ interface Commands {
97
+ /** A tool output the windowed wire carried cut, whole. */
98
+ historyToolOutput: ToolOutputCommand;
99
+ /** One stored message whole — the per-client shape, by command. */
100
+ historyMessage: HistoryMessageCommand;
101
+ }
102
+ }
103
+ }
104
+ /** The `history/tool_output` command: a truncated tool output, whole. */
105
+ export interface ToolOutputCommand {
106
+ readonly type: typeof DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND;
107
+ readonly messageId: string;
108
+ }
109
+ export declare function buildToolOutputCommand({ messageId }: {
110
+ messageId: string;
111
+ }): ToolOutputCommand;
112
+ export interface ToolOutputResult {
113
+ messageId: string;
114
+ content: unknown;
115
+ }
116
+ export declare function readToolOutputResult(payload: unknown): ToolOutputResult | null;
117
+ /**
118
+ * The `history/message` command: a message as the host stores it — the
119
+ * model-provenance blobs the wire strips and an untruncated tool output
120
+ * included. Every client receives one projected wire form; this is the one
121
+ * per-client shape, fetched on demand like `history/tool_output`.
122
+ */
123
+ export interface HistoryMessageCommand {
124
+ readonly type: typeof DEEP_AGENT_HISTORY_MESSAGE_COMMAND;
125
+ readonly messageId: string;
126
+ }
127
+ export declare function buildHistoryMessageCommand({ messageId, }: {
128
+ messageId: string;
129
+ }): HistoryMessageCommand;
130
+ export interface HistoryMessageResult {
131
+ messageId: string;
132
+ message: LangChainMessage;
133
+ }
134
+ export declare function readHistoryMessageResult(payload: unknown): HistoryMessageResult | null;
135
+ /** The wire marker on a tool message whose content the host cut. */
136
+ export interface TruncatedToolContent {
137
+ /** Length of the full output, in characters. */
138
+ chars: number;
139
+ }
140
+ /**
141
+ * The truncation marker off a raw wire message, or `null` when the message's
142
+ * content is whole. Pure and selector-safe on the marker object.
143
+ */
144
+ export declare function readTruncatedToolContent(message: unknown): TruncatedToolContent | null;
145
+ /**
146
+ * `artifact` key the shared converter lifts a truncated tool output's marker
147
+ * into (with the tool message id), so a tool card can ask for the full output
148
+ * — the converter joins the ToolMessage into its tool-call part and would
149
+ * otherwise drop the wire marker.
150
+ */
151
+ export declare const ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY = "_athena_content_truncated";
152
+ export interface TruncatedToolOutputArtifact extends TruncatedToolContent {
153
+ /** The tool message to name in `history/tool_output`. */
154
+ messageId: string;
155
+ }
156
+ /**
157
+ * The lifted truncation marker off a tool-call part's `artifact`, or `null`.
158
+ */
159
+ export declare function readTruncatedToolOutputArtifact(artifact: unknown): TruncatedToolOutputArtifact | null;
@@ -1,4 +1,4 @@
1
- import { DEEP_AGENT_MAX_INTERESTS, DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND, DEEP_AGENT_INTEREST_PROTOCOL, DEEP_AGENT_MAIN_NS, DEEP_AGENT_MAX_MESSAGE_WINDOW, DEEP_AGENT_DEFAULT_MESSAGE_WINDOW, DEEP_AGENT_MIN_MESSAGE_WINDOW, DEEP_AGENT_MESSAGE_WINDOW_HEADER, DEEP_AGENT_TRUNCATED_CONTENT_KEY } from "./generated/runconfig-contract.js";
1
+ import { DEEP_AGENT_MAX_INTERESTS, DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND, DEEP_AGENT_INTEREST_PROTOCOL, DEEP_AGENT_MAIN_NS, DEEP_AGENT_CUT_LANE_DOCUMENT, DEEP_AGENT_MAX_MESSAGE_WINDOW, DEEP_AGENT_DEFAULT_MESSAGE_WINDOW, DEEP_AGENT_MIN_MESSAGE_WINDOW, DEEP_AGENT_MESSAGE_WINDOW_HEADER, DEEP_AGENT_HISTORY_MESSAGE_COMMAND, DEEP_AGENT_TRUNCATED_CONTENT_KEY } from "./generated/runconfig-contract.js";
2
2
  import { DEEP_AGENT_STATEWIRE_PROTOCOL } from "./statewire-transport.js";
3
3
  const isIndex = (value) => typeof value === "number" && Number.isInteger(value) && value >= 0;
4
4
  function clampMessageWindowSize(size) {
@@ -116,7 +116,7 @@ function readDeepAgentMessageWindow(mounted) {
116
116
  const key = document.key;
117
117
  if (document.protocol === DEEP_AGENT_INTEREST_PROTOCOL && document.main === true) {
118
118
  windows = (_a = readDeepAgentInterestDocument(document.value)) == null ? void 0 : _a.windows;
119
- } else if (document.protocol === DEEP_AGENT_STATEWIRE_PROTOCOL && key !== null && key.length === 3 && key[1] === DEEP_AGENT_MAIN_NS) {
119
+ } else if (document.protocol === DEEP_AGENT_STATEWIRE_PROTOCOL && key !== null && key[1] === DEEP_AGENT_MAIN_NS && (key.length === 3 || key.length === 4 && key[3] === DEEP_AGENT_CUT_LANE_DOCUMENT)) {
120
120
  documents.set(key[2], document.value);
121
121
  }
122
122
  }
@@ -158,6 +158,18 @@ function readToolOutputResult(payload) {
158
158
  if (typeof messageId !== "string" || !messageId) return null;
159
159
  return { messageId, content };
160
160
  }
161
+ function buildHistoryMessageCommand({
162
+ messageId
163
+ }) {
164
+ return { type: DEEP_AGENT_HISTORY_MESSAGE_COMMAND, messageId };
165
+ }
166
+ function readHistoryMessageResult(payload) {
167
+ if (typeof payload !== "object" || payload === null) return null;
168
+ const { messageId, message } = payload;
169
+ if (typeof messageId !== "string" || !messageId) return null;
170
+ if (typeof message !== "object" || message === null) return null;
171
+ return { messageId, message };
172
+ }
161
173
  function readTruncatedToolContent(message) {
162
174
  if (typeof message !== "object" || message === null) return null;
163
175
  const marker = message[DEEP_AGENT_TRUNCATED_CONTENT_KEY];
@@ -176,6 +188,7 @@ function readTruncatedToolOutputArtifact(artifact) {
176
188
  }
177
189
  export {
178
190
  ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY,
191
+ buildHistoryMessageCommand,
179
192
  buildToolOutputCommand,
180
193
  clampMessageWindowSize,
181
194
  headInterestRequest,
@@ -185,6 +198,7 @@ export {
185
198
  readDeepAgentInterestDocument,
186
199
  readDeepAgentInterestResolution,
187
200
  readDeepAgentMessageWindow,
201
+ readHistoryMessageResult,
188
202
  readToolOutputResult,
189
203
  readTruncatedToolContent,
190
204
  readTruncatedToolOutputArtifact,
@@ -1 +1 @@
1
- {"version":3,"file":"message-window.js","sources":["../../../../agent-runtime/src/message-window.ts"],"sourcesContent":["import type { LangChainMessage } from '@assistant-ui/react-langgraph';\nimport type { StatewireDocuments } from 'statewire';\nimport {\n DEEP_AGENT_DEFAULT_MESSAGE_WINDOW,\n DEEP_AGENT_HISTORY_MESSAGE_COMMAND,\n DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND,\n DEEP_AGENT_INTEREST_PROTOCOL,\n DEEP_AGENT_MAIN_NS,\n DEEP_AGENT_MAX_INTERESTS,\n DEEP_AGENT_MAX_MESSAGE_WINDOW,\n DEEP_AGENT_MESSAGE_WINDOW_HEADER,\n DEEP_AGENT_MIN_MESSAGE_WINDOW,\n DEEP_AGENT_TRUNCATED_CONTENT_KEY,\n} from './generated/runconfig-contract';\nimport { DEEP_AGENT_STATEWIRE_PROTOCOL } from './statewire-transport';\n\n/**\n * The interest window — the client half of agora's\n * `agora/graphs/athena_deep_agent/message_window.py`.\n *\n * The wire main document carries no `messages`. A client states its interests\n * on the `athena/interest` lane as one array (`set(requests)`): the first is\n * the head (the newest `before` messages of the `main` namespace), the rest\n * are pages anchored `at` the first message of the window they extend. The\n * host holds one ephemeral main document per attach, `{ windows }`, one\n * resolution per request in order (the request echoed plus the covered\n * `chain` and `more` flags; an anchor that vanished leaves an empty window in\n * place), and one shared `athena` document per covered message, keyed\n * `[threadId, \"main\", messageId]`. {@link readDeepAgentMessageWindow} joins\n * them into the transcript the converter renders.\n *\n * Two host rules shape the client half. The head window never drops below\n * the oldest message it has carried on an attach (a run's appends grow the\n * view, nothing loaded slides out), so a page stays anchored at the head's\n * first message while the transcript grows; and the host remembers a client\n * id's interests across its attaches, so a reconnect's hello carries the\n * view the client held. A fresh client's hello carries the head it declared\n * on the attach headers ({@link withDeclaredMessageWindow}) — a statement\n * cannot ride the first attach, the hello negotiates the lanes.\n *\n * Pages are appended one per load until the host's interest cap, then the\n * loaded range is restated in as few maximal requests as it takes\n * ({@link pageInterestRequests}); the whole transcript stays reachable up to\n * `MAX_INTERESTS × MAX_MESSAGE_WINDOW` messages. A truncated tool output\n * comes back whole through `history/tool_output` ({@link buildToolOutputCommand});\n * a message's stored form — provenance blobs and all — through\n * `history/message` ({@link buildHistoryMessageCommand}).\n */\n\nconst isIndex = (value: unknown): value is number =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0;\n\n/** What a surface declares for its window: the interest size (the host clamps to its bounds). */\nexport interface DeepAgentMessageWindowDeclaration {\n size?: number;\n}\n\nexport function clampMessageWindowSize(size?: number): number {\n if (size === undefined || !Number.isFinite(size)) return DEEP_AGENT_DEFAULT_MESSAGE_WINDOW;\n return Math.max(\n DEEP_AGENT_MIN_MESSAGE_WINDOW,\n Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, Math.trunc(size))\n );\n}\n\n/** An `athena/interest` request over the linear transcript. */\nexport interface DeepAgentInterestRequest {\n readonly ns: typeof DEEP_AGENT_MAIN_NS;\n /** Messages ending at the anchor (the tail without `at`). */\n readonly before: number;\n /** Anchor message id; a page's is the first message of the window it extends. */\n readonly at?: string;\n /** Messages past the anchor (requires `at`). */\n readonly after?: number;\n}\n\nexport function headInterestRequest(size?: number): DeepAgentInterestRequest {\n return { ns: DEEP_AGENT_MAIN_NS, before: clampMessageWindowSize(size) };\n}\n\nexport function pageInterestRequest(at: string, size?: number): DeepAgentInterestRequest {\n return { ns: DEEP_AGENT_MAIN_NS, before: clampMessageWindowSize(size), at };\n}\n\n/**\n * Attach headers with the head window declared (`x-athena-deep-agent-window`):\n * the hello of a client the host does not remember carries the newest `size`\n * messages. Part of the one attach recipe, so a pooled dial asks for the shape\n * the thread's own attach would. An explicit entry (tests, overrides) wins.\n */\nexport function withDeclaredMessageWindow(\n headers: Record<string, string>,\n declaration: DeepAgentMessageWindowDeclaration = {}\n): Record<string, string> {\n if (DEEP_AGENT_MESSAGE_WINDOW_HEADER in headers) return headers;\n return {\n ...headers,\n [DEEP_AGENT_MESSAGE_WINDOW_HEADER]: String(clampMessageWindowSize(declaration.size)),\n };\n}\n\nexport interface DeepAgentInterestChainEntry {\n id: string;\n siblings: string[];\n}\n\n/** The host's resolution document of one interest: the request echoed plus its coverage. */\nexport interface DeepAgentInterestResolution extends DeepAgentInterestRequest {\n /** Covered message ids, oldest first (a page ends at its anchor). */\n chain: DeepAgentInterestChainEntry[];\n more: { before: boolean; after: boolean };\n}\n\nexport function readDeepAgentInterestResolution(value: unknown): DeepAgentInterestResolution | null {\n if (typeof value !== 'object' || value === null) return null;\n const { ns, before, at, after, chain, more } = value as Record<string, unknown>;\n if (ns !== DEEP_AGENT_MAIN_NS || !isIndex(before) || !Array.isArray(chain)) return null;\n if (at !== undefined && typeof at !== 'string') return null;\n if (after !== undefined && !isIndex(after)) return null;\n if (typeof more !== 'object' || more === null) return null;\n const { before: moreBefore, after: moreAfter } = more as Record<string, unknown>;\n if (typeof moreBefore !== 'boolean' || typeof moreAfter !== 'boolean') return null;\n const entries: DeepAgentInterestChainEntry[] = [];\n for (const entry of chain) {\n const { id, siblings } = (entry ?? {}) as Record<string, unknown>;\n if (typeof id !== 'string') return null;\n entries.push({\n id,\n siblings: Array.isArray(siblings) ? siblings.filter((s) => typeof s === 'string') : [id],\n });\n }\n return {\n ns: DEEP_AGENT_MAIN_NS,\n before,\n ...(at !== undefined && { at }),\n ...(after !== undefined && { after }),\n chain: entries,\n more: { before: moreBefore, after: moreAfter },\n };\n}\n\n/** The attach's interest document: one resolution per stated request, in order. */\nexport interface DeepAgentInterestDocument {\n windows: DeepAgentInterestResolution[];\n}\n\nexport function readDeepAgentInterestDocument(value: unknown): DeepAgentInterestDocument | null {\n if (typeof value !== 'object' || value === null) return null;\n const { windows } = value as Record<string, unknown>;\n if (!Array.isArray(windows)) return null;\n const resolutions: DeepAgentInterestResolution[] = [];\n for (const window of windows) {\n const resolution = readDeepAgentInterestResolution(window);\n if (resolution === null) return null;\n resolutions.push(resolution);\n }\n return { windows: resolutions };\n}\n\nconst interestRequest = ({ ns, before, at, after }: DeepAgentInterestRequest): DeepAgentInterestRequest => ({\n ns,\n before,\n ...(at !== undefined && { at }),\n ...(after !== undefined && { after }),\n});\n\n/** The loaded transcript window, joined from the head interest and its anchored pages. */\nexport interface DeepAgentMessageWindow {\n /** The requests the joined view stands on, in order (the head first): what a `set` restates. A stale page (its anchor gone) or one the head already covers is left out. */\n requests: DeepAgentInterestRequest[];\n /** Covered chain, oldest first. */\n chain: DeepAgentInterestChainEntry[];\n /** The chain's message documents, in chain order (an unmounted one is skipped). */\n messages: LangChainMessage[];\n /** Whether the host holds messages older than the window. */\n hasOlder: boolean;\n /** Pages joined onto the head. */\n pages: number;\n}\n\n/**\n * The loaded chain plus `grow` older messages, restated in as few requests as\n * it takes: a maximal head, then maximal pages each anchored at the first\n * message of the window above it. `null` once even that exceeds the host's\n * interest cap — the reachable depth is `MAX_INTERESTS × MAX_MESSAGE_WINDOW`.\n */\nfunction coalescedInterestRequests(\n chain: readonly DeepAgentInterestChainEntry[],\n grow: number\n): DeepAgentInterestRequest[] | null {\n const loaded = chain.length;\n const requests: DeepAgentInterestRequest[] = [\n { ns: DEEP_AGENT_MAIN_NS, before: Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, loaded) },\n ];\n // `low` is the chain index of the lowest message the plan covers so far.\n let low = loaded - (requests[0] as DeepAgentInterestRequest).before;\n while (low > 0) {\n const before = Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, low + 1);\n requests.push({\n ns: DEEP_AGENT_MAIN_NS,\n before,\n at: (chain[low] as DeepAgentInterestChainEntry).id,\n });\n low = low + 1 - before;\n }\n // The plan covers the chain; the new messages extend its lowest request\n // when that stays within one window, else they are a page of their own.\n const last = requests[requests.length - 1] as DeepAgentInterestRequest;\n if (last.before + grow <= DEEP_AGENT_MAX_MESSAGE_WINDOW) {\n requests[requests.length - 1] = { ...last, before: last.before + grow };\n } else {\n requests.push({\n ns: DEEP_AGENT_MAIN_NS,\n before: grow + 1,\n at: (chain[0] as DeepAgentInterestChainEntry).id,\n });\n }\n return requests.length > DEEP_AGENT_MAX_INTERESTS ? null : requests;\n}\n\n/**\n * The requests to state for one more page of older history, or `null` when\n * there is nothing to load (no anchor, the beginning reached) or the host's\n * interest cap is spent. One page is appended, anchored at the window's first\n * message, while the cap allows; at the cap the loaded range is coalesced\n * into maximal requests first (see {@link coalescedInterestRequests}).\n */\nexport function pageInterestRequests(\n window: DeepAgentMessageWindow,\n size?: number\n): DeepAgentInterestRequest[] | null {\n const anchor = window.chain[0]?.id;\n if (anchor === undefined || !window.hasOlder) return null;\n const page = pageInterestRequest(anchor, size);\n const appended = [...window.requests, page];\n if (appended.length <= DEEP_AGENT_MAX_INTERESTS) return appended;\n // A page's `before` counts its anchor: it adds `before - 1` older messages.\n return coalescedInterestRequests(window.chain, page.before - 1);\n}\n\n/**\n * Whether every `stated` request is carried by `carried` (the same anchor, at\n * least as wide): a reconnect's hello that carries what the client last\n * stated — the host remembers a client id's interests — needs no restatement.\n */\nexport function interestsCovered(\n carried: readonly DeepAgentInterestRequest[],\n stated: readonly DeepAgentInterestRequest[]\n): boolean {\n return stated.every((request) =>\n carried.some((have) => have.at === request.at && have.before >= request.before)\n );\n}\n\n/**\n * The window off the mounted documents, or `null` while the head interest has\n * not resolved (pre-attach, before the first `set` answer, a wire without\n * documents). A page joins wherever its anchor sits in the chain so far — at\n * the first message it extends the view, inside the head (the head widened\n * past it) it adds nothing and is left out of `requests`; a page whose anchor\n * left the transcript (a rewind emptied it in place) is left out too. A\n * malformed document reads as absent.\n */\nexport function readDeepAgentMessageWindow(\n mounted: ReadonlyMap<number, StatewireDocuments.Document> | undefined\n): DeepAgentMessageWindow | null {\n if (mounted === undefined) return null;\n let windows: DeepAgentInterestResolution[] | undefined;\n const documents = new Map<string, LangChainMessage>();\n for (const document of mounted.values()) {\n const key = document.key;\n if (document.protocol === DEEP_AGENT_INTEREST_PROTOCOL && document.main === true) {\n windows = readDeepAgentInterestDocument(document.value)?.windows;\n } else if (\n document.protocol === DEEP_AGENT_STATEWIRE_PROTOCOL &&\n key !== null &&\n key.length === 3 &&\n key[1] === DEEP_AGENT_MAIN_NS\n ) {\n documents.set(key[2] as string, document.value as LangChainMessage);\n }\n }\n const head = windows?.[0];\n if (windows === undefined || head === undefined) return null;\n let chain = head.chain;\n let hasOlder = head.more.before;\n const requests = [interestRequest(head)];\n const loaded = new Set(chain.map((entry) => entry.id));\n let pages = 0;\n for (const page of windows.slice(1)) {\n if (page.at === undefined || !loaded.has(page.at)) continue;\n const anchorAt = page.chain.findIndex((entry) => entry.id === page.at);\n if (anchorAt < 0) continue;\n // Both windows are ranges of one linear transcript sharing the anchor:\n // what the page holds below it and the chain does not is a prefix.\n const fresh = page.chain.slice(0, anchorAt).filter((entry) => !loaded.has(entry.id));\n if (fresh.length === 0) {\n // Nothing new, but a page that starts where the loaded chain starts\n // has looked below it: its `more.before` is the answer for the edge.\n if (page.chain[0]?.id === chain[0]?.id) hasOlder = page.more.before;\n continue;\n }\n chain = [...fresh, ...chain];\n for (const entry of fresh) loaded.add(entry.id);\n hasOlder = page.more.before;\n requests.push(interestRequest(page));\n pages += 1;\n }\n const messages: LangChainMessage[] = [];\n for (const entry of chain) {\n const message = documents.get(entry.id);\n if (message !== undefined) messages.push(message);\n }\n return { requests, chain, messages, hasOlder, pages };\n}\n\n/**\n * The windowed wire's read command on the statewire command union, so\n * `sendCommand({ type: 'history/tool_output', … })` typechecks wherever the\n * deep-agent host is driven (`DeepAgentThread.history_tool_output`, an\n * attach-ACL read).\n */\ndeclare module '@assistant-ui/core' {\n namespace Assistant {\n interface Commands {\n /** A tool output the windowed wire carried cut, whole. */\n historyToolOutput: ToolOutputCommand;\n /** One stored message whole — the per-client shape, by command. */\n historyMessage: HistoryMessageCommand;\n }\n }\n}\n\n/** The `history/tool_output` command: a truncated tool output, whole. */\nexport interface ToolOutputCommand {\n readonly type: typeof DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND;\n readonly messageId: string;\n}\n\nexport function buildToolOutputCommand({ messageId }: { messageId: string }): ToolOutputCommand {\n return { type: DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND, messageId };\n}\n\nexport interface ToolOutputResult {\n messageId: string;\n content: unknown;\n}\n\nexport function readToolOutputResult(payload: unknown): ToolOutputResult | null {\n if (typeof payload !== 'object' || payload === null) return null;\n const { messageId, content } = payload as Record<string, unknown>;\n if (typeof messageId !== 'string' || !messageId) return null;\n return { messageId, content };\n}\n\n/**\n * The `history/message` command: a message as the host stores it — the\n * model-provenance blobs the wire strips and an untruncated tool output\n * included. Every client receives one projected wire form; this is the one\n * per-client shape, fetched on demand like `history/tool_output`.\n */\nexport interface HistoryMessageCommand {\n readonly type: typeof DEEP_AGENT_HISTORY_MESSAGE_COMMAND;\n readonly messageId: string;\n}\n\nexport function buildHistoryMessageCommand({\n messageId,\n}: {\n messageId: string;\n}): HistoryMessageCommand {\n return { type: DEEP_AGENT_HISTORY_MESSAGE_COMMAND, messageId };\n}\n\nexport interface HistoryMessageResult {\n messageId: string;\n message: LangChainMessage;\n}\n\nexport function readHistoryMessageResult(payload: unknown): HistoryMessageResult | null {\n if (typeof payload !== 'object' || payload === null) return null;\n const { messageId, message } = payload as Record<string, unknown>;\n if (typeof messageId !== 'string' || !messageId) return null;\n if (typeof message !== 'object' || message === null) return null;\n return { messageId, message: message as LangChainMessage };\n}\n\n/** The wire marker on a tool message whose content the host cut. */\nexport interface TruncatedToolContent {\n /** Length of the full output, in characters. */\n chars: number;\n}\n\n/**\n * The truncation marker off a raw wire message, or `null` when the message's\n * content is whole. Pure and selector-safe on the marker object.\n */\nexport function readTruncatedToolContent(message: unknown): TruncatedToolContent | null {\n if (typeof message !== 'object' || message === null) return null;\n const marker = (message as Record<string, unknown>)[DEEP_AGENT_TRUNCATED_CONTENT_KEY];\n if (typeof marker !== 'object' || marker === null) return null;\n const chars = (marker as Record<string, unknown>).chars;\n return isIndex(chars) ? { chars } : null;\n}\n\n/**\n * `artifact` key the shared converter lifts a truncated tool output's marker\n * into (with the tool message id), so a tool card can ask for the full output\n * — the converter joins the ToolMessage into its tool-call part and would\n * otherwise drop the wire marker.\n */\nexport const ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY = '_athena_content_truncated';\n\nexport interface TruncatedToolOutputArtifact extends TruncatedToolContent {\n /** The tool message to name in `history/tool_output`. */\n messageId: string;\n}\n\n/**\n * The lifted truncation marker off a tool-call part's `artifact`, or `null`.\n */\nexport function readTruncatedToolOutputArtifact(\n artifact: unknown\n): TruncatedToolOutputArtifact | null {\n if (typeof artifact !== 'object' || artifact === null) return null;\n const lifted = (artifact as Record<string, unknown>)[ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY];\n if (typeof lifted !== 'object' || lifted === null) return null;\n const { chars, messageId } = lifted as Record<string, unknown>;\n if (!isIndex(chars) || typeof messageId !== 'string' || !messageId) return null;\n return { chars, messageId };\n}\n"],"names":[],"mappings":";;AAiDA,MAAM,UAAU,CAAC,UACf,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS;AAO5D,SAAS,uBAAuB,MAAuB;AAC5D,MAAI,SAAS,UAAa,CAAC,OAAO,SAAS,IAAI,EAAG,QAAO;AACzD,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,IAAI,+BAA+B,KAAK,MAAM,IAAI,CAAC;AAAA,EAAA;AAE5D;AAaO,SAAS,oBAAoB,MAAyC;AAC3E,SAAO,EAAE,IAAI,oBAAoB,QAAQ,uBAAuB,IAAI,EAAA;AACtE;AAEO,SAAS,oBAAoB,IAAY,MAAyC;AACvF,SAAO,EAAE,IAAI,oBAAoB,QAAQ,uBAAuB,IAAI,GAAG,GAAA;AACzE;AAQO,SAAS,0BACd,SACA,cAAiD,IACzB;AACxB,MAAI,oCAAoC,QAAS,QAAO;AACxD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,CAAC,gCAAgC,GAAG,OAAO,uBAAuB,YAAY,IAAI,CAAC;AAAA,EAAA;AAEvF;AAcO,SAAS,gCAAgC,OAAoD;AAClG,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,EAAE,IAAI,QAAQ,IAAI,OAAO,OAAO,SAAS;AAC/C,MAAI,OAAO,sBAAsB,CAAC,QAAQ,MAAM,KAAK,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AACnF,MAAI,OAAO,UAAa,OAAO,OAAO,SAAU,QAAO;AACvD,MAAI,UAAU,UAAa,CAAC,QAAQ,KAAK,EAAG,QAAO;AACnD,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,EAAE,QAAQ,YAAY,OAAO,cAAc;AACjD,MAAI,OAAO,eAAe,aAAa,OAAO,cAAc,UAAW,QAAO;AAC9E,QAAM,UAAyC,CAAA;AAC/C,aAAW,SAAS,OAAO;AACzB,UAAM,EAAE,IAAI,SAAA,IAAc,SAAS,CAAA;AACnC,QAAI,OAAO,OAAO,SAAU,QAAO;AACnC,YAAQ,KAAK;AAAA,MACX;AAAA,MACA,UAAU,MAAM,QAAQ,QAAQ,IAAI,SAAS,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ,IAAI,CAAC,EAAE;AAAA,IAAA,CACxF;AAAA,EACH;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,GAAI,OAAO,UAAa,EAAE,GAAA;AAAA,IAC1B,GAAI,UAAU,UAAa,EAAE,MAAA;AAAA,IAC7B,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,YAAY,OAAO,UAAA;AAAA,EAAU;AAEjD;AAOO,SAAS,8BAA8B,OAAkD;AAC9F,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,EAAE,YAAY;AACpB,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,QAAM,cAA6C,CAAA;AACnD,aAAW,UAAU,SAAS;AAC5B,UAAM,aAAa,gCAAgC,MAAM;AACzD,QAAI,eAAe,KAAM,QAAO;AAChC,gBAAY,KAAK,UAAU;AAAA,EAC7B;AACA,SAAO,EAAE,SAAS,YAAA;AACpB;AAEA,MAAM,kBAAkB,CAAC,EAAE,IAAI,QAAQ,IAAI,aAAiE;AAAA,EAC1G;AAAA,EACA;AAAA,EACA,GAAI,OAAO,UAAa,EAAE,GAAA;AAAA,EAC1B,GAAI,UAAU,UAAa,EAAE,MAAA;AAC/B;AAsBA,SAAS,0BACP,OACA,MACmC;AACnC,QAAM,SAAS,MAAM;AACrB,QAAM,WAAuC;AAAA,IAC3C,EAAE,IAAI,oBAAoB,QAAQ,KAAK,IAAI,+BAA+B,MAAM,EAAA;AAAA,EAAE;AAGpF,MAAI,MAAM,SAAU,SAAS,CAAC,EAA+B;AAC7D,SAAO,MAAM,GAAG;AACd,UAAM,SAAS,KAAK,IAAI,+BAA+B,MAAM,CAAC;AAC9D,aAAS,KAAK;AAAA,MACZ,IAAI;AAAA,MACJ;AAAA,MACA,IAAK,MAAM,GAAG,EAAkC;AAAA,IAAA,CACjD;AACD,UAAM,MAAM,IAAI;AAAA,EAClB;AAGA,QAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,MAAI,KAAK,SAAS,QAAQ,+BAA+B;AACvD,aAAS,SAAS,SAAS,CAAC,IAAI,EAAE,GAAG,MAAM,QAAQ,KAAK,SAAS,KAAA;AAAA,EACnE,OAAO;AACL,aAAS,KAAK;AAAA,MACZ,IAAI;AAAA,MACJ,QAAQ,OAAO;AAAA,MACf,IAAK,MAAM,CAAC,EAAkC;AAAA,IAAA,CAC/C;AAAA,EACH;AACA,SAAO,SAAS,SAAS,2BAA2B,OAAO;AAC7D;AASO,SAAS,qBACd,QACA,MACmC;;AACnC,QAAM,UAAS,YAAO,MAAM,CAAC,MAAd,mBAAiB;AAChC,MAAI,WAAW,UAAa,CAAC,OAAO,SAAU,QAAO;AACrD,QAAM,OAAO,oBAAoB,QAAQ,IAAI;AAC7C,QAAM,WAAW,CAAC,GAAG,OAAO,UAAU,IAAI;AAC1C,MAAI,SAAS,UAAU,yBAA0B,QAAO;AAExD,SAAO,0BAA0B,OAAO,OAAO,KAAK,SAAS,CAAC;AAChE;AAOO,SAAS,iBACd,SACA,QACS;AACT,SAAO,OAAO;AAAA,IAAM,CAAC,YACnB,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM;AAAA,EAAA;AAElF;AAWO,SAAS,2BACd,SAC+B;;AAC/B,MAAI,YAAY,OAAW,QAAO;AAClC,MAAI;AACJ,QAAM,gCAAgB,IAAA;AACtB,aAAW,YAAY,QAAQ,UAAU;AACvC,UAAM,MAAM,SAAS;AACrB,QAAI,SAAS,aAAa,gCAAgC,SAAS,SAAS,MAAM;AAChF,iBAAU,mCAA8B,SAAS,KAAK,MAA5C,mBAA+C;AAAA,IAC3D,WACE,SAAS,aAAa,iCACtB,QAAQ,QACR,IAAI,WAAW,KACf,IAAI,CAAC,MAAM,oBACX;AACA,gBAAU,IAAI,IAAI,CAAC,GAAa,SAAS,KAAyB;AAAA,IACpE;AAAA,EACF;AACA,QAAM,OAAO,mCAAU;AACvB,MAAI,YAAY,UAAa,SAAS,OAAW,QAAO;AACxD,MAAI,QAAQ,KAAK;AACjB,MAAI,WAAW,KAAK,KAAK;AACzB,QAAM,WAAW,CAAC,gBAAgB,IAAI,CAAC;AACvC,QAAM,SAAS,IAAI,IAAI,MAAM,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AACrD,MAAI,QAAQ;AACZ,aAAW,QAAQ,QAAQ,MAAM,CAAC,GAAG;AACnC,QAAI,KAAK,OAAO,UAAa,CAAC,OAAO,IAAI,KAAK,EAAE,EAAG;AACnD,UAAM,WAAW,KAAK,MAAM,UAAU,CAAC,UAAU,MAAM,OAAO,KAAK,EAAE;AACrE,QAAI,WAAW,EAAG;AAGlB,UAAM,QAAQ,KAAK,MAAM,MAAM,GAAG,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;AACnF,QAAI,MAAM,WAAW,GAAG;AAGtB,YAAI,UAAK,MAAM,CAAC,MAAZ,mBAAe,UAAO,WAAM,CAAC,MAAP,mBAAU,IAAI,YAAW,KAAK,KAAK;AAC7D;AAAA,IACF;AACA,YAAQ,CAAC,GAAG,OAAO,GAAG,KAAK;AAC3B,eAAW,SAAS,MAAO,QAAO,IAAI,MAAM,EAAE;AAC9C,eAAW,KAAK,KAAK;AACrB,aAAS,KAAK,gBAAgB,IAAI,CAAC;AACnC,aAAS;AAAA,EACX;AACA,QAAM,WAA+B,CAAA;AACrC,aAAW,SAAS,OAAO;AACzB,UAAM,UAAU,UAAU,IAAI,MAAM,EAAE;AACtC,QAAI,YAAY,OAAW,UAAS,KAAK,OAAO;AAAA,EAClD;AACA,SAAO,EAAE,UAAU,OAAO,UAAU,UAAU,MAAA;AAChD;AAyBO,SAAS,uBAAuB,EAAE,aAAuD;AAC9F,SAAO,EAAE,MAAM,wCAAwC,UAAA;AACzD;AAOO,SAAS,qBAAqB,SAA2C;AAC9E,MAAI,OAAO,YAAY,YAAY,YAAY,KAAM,QAAO;AAC5D,QAAM,EAAE,WAAW,QAAA,IAAY;AAC/B,MAAI,OAAO,cAAc,YAAY,CAAC,UAAW,QAAO;AACxD,SAAO,EAAE,WAAW,QAAA;AACtB;AA4CO,SAAS,yBAAyB,SAA+C;AACtF,MAAI,OAAO,YAAY,YAAY,YAAY,KAAM,QAAO;AAC5D,QAAM,SAAU,QAAoC,gCAAgC;AACpF,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,QAAS,OAAmC;AAClD,SAAO,QAAQ,KAAK,IAAI,EAAE,UAAU;AACtC;AAQO,MAAM,4CAA4C;AAUlD,SAAS,gCACd,UACoC;AACpC,MAAI,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO;AAC9D,QAAM,SAAU,SAAqC,yCAAyC;AAC9F,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,EAAE,OAAO,UAAA,IAAc;AAC7B,MAAI,CAAC,QAAQ,KAAK,KAAK,OAAO,cAAc,YAAY,CAAC,UAAW,QAAO;AAC3E,SAAO,EAAE,OAAO,UAAA;AAClB;"}
1
+ {"version":3,"file":"message-window.js","sources":["../../../../agent-runtime/src/message-window.ts"],"sourcesContent":["import type { LangChainMessage } from '@assistant-ui/react-langgraph';\nimport type { StatewireDocuments } from 'statewire';\nimport {\n DEEP_AGENT_CUT_LANE_DOCUMENT,\n DEEP_AGENT_DEFAULT_MESSAGE_WINDOW,\n DEEP_AGENT_HISTORY_MESSAGE_COMMAND,\n DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND,\n DEEP_AGENT_INTEREST_PROTOCOL,\n DEEP_AGENT_MAIN_NS,\n DEEP_AGENT_MAX_INTERESTS,\n DEEP_AGENT_MAX_MESSAGE_WINDOW,\n DEEP_AGENT_MESSAGE_WINDOW_HEADER,\n DEEP_AGENT_MIN_MESSAGE_WINDOW,\n DEEP_AGENT_TRUNCATED_CONTENT_KEY,\n} from './generated/runconfig-contract';\nimport { DEEP_AGENT_STATEWIRE_PROTOCOL } from './statewire-transport';\n\n/**\n * The interest window — the client half of agora's\n * `agora/graphs/athena_deep_agent/message_window.py`.\n *\n * The wire main document carries no `messages`. A client states its interests\n * on the `athena/interest` lane as one array (`set(requests)`): the first is\n * the head (the newest `before` messages of the `main` namespace), the rest\n * are pages anchored `at` the first message of the window they extend. The\n * host holds one ephemeral main document per attach, `{ windows }`, one\n * resolution per request in order (the request echoed plus the covered\n * `chain` and `more` flags; an anchor that vanished leaves an empty window in\n * place), and one shared `athena` document per covered message, keyed\n * `[threadId, \"main\", messageId]` — or `[threadId, \"main\", messageId, \"cut\"]`\n * for a finished card a version-2 view carries cut to its newest steps (its\n * whole lane pages in through `history/lane`, see `lane-history.ts`).\n * {@link readDeepAgentMessageWindow} joins them into the transcript the\n * converter renders.\n *\n * Two host rules shape the client half. The head window never drops below\n * the oldest message it has carried on an attach (a run's appends grow the\n * view, nothing loaded slides out), so a page stays anchored at the head's\n * first message while the transcript grows; and the host remembers a client\n * id's interests across its attaches, so a reconnect's hello carries the\n * view the client held. A fresh client's hello carries the head it declared\n * on the attach headers ({@link withDeclaredMessageWindow}) — a statement\n * cannot ride the first attach, the hello negotiates the lanes.\n *\n * Pages are appended one per load until the host's interest cap, then the\n * loaded range is restated in as few maximal requests as it takes\n * ({@link pageInterestRequests}); the whole transcript stays reachable up to\n * `MAX_INTERESTS × MAX_MESSAGE_WINDOW` messages. A truncated tool output\n * comes back whole through `history/tool_output` ({@link buildToolOutputCommand});\n * a message's stored form — provenance blobs and all — through\n * `history/message` ({@link buildHistoryMessageCommand}).\n */\n\nconst isIndex = (value: unknown): value is number =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0;\n\n/** What a surface declares for its window: the interest size (the host clamps to its bounds). */\nexport interface DeepAgentMessageWindowDeclaration {\n size?: number;\n}\n\nexport function clampMessageWindowSize(size?: number): number {\n if (size === undefined || !Number.isFinite(size)) return DEEP_AGENT_DEFAULT_MESSAGE_WINDOW;\n return Math.max(\n DEEP_AGENT_MIN_MESSAGE_WINDOW,\n Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, Math.trunc(size))\n );\n}\n\n/** An `athena/interest` request over the linear transcript. */\nexport interface DeepAgentInterestRequest {\n readonly ns: typeof DEEP_AGENT_MAIN_NS;\n /** Messages ending at the anchor (the tail without `at`). */\n readonly before: number;\n /** Anchor message id; a page's is the first message of the window it extends. */\n readonly at?: string;\n /** Messages past the anchor (requires `at`). */\n readonly after?: number;\n /** The newest steps of every subagent lane a covered card names (see `lane-follow.ts`). */\n readonly follow?: { readonly before: number };\n}\n\nexport function headInterestRequest(size?: number): DeepAgentInterestRequest {\n return { ns: DEEP_AGENT_MAIN_NS, before: clampMessageWindowSize(size) };\n}\n\nexport function pageInterestRequest(at: string, size?: number): DeepAgentInterestRequest {\n return { ns: DEEP_AGENT_MAIN_NS, before: clampMessageWindowSize(size), at };\n}\n\n/**\n * Attach headers with the head window declared (`x-athena-deep-agent-window`):\n * the hello of a client the host does not remember carries the newest `size`\n * messages. Part of the one attach recipe, so a pooled dial asks for the shape\n * the thread's own attach would. An explicit entry (tests, overrides) wins.\n */\nexport function withDeclaredMessageWindow(\n headers: Record<string, string>,\n declaration: DeepAgentMessageWindowDeclaration = {}\n): Record<string, string> {\n if (DEEP_AGENT_MESSAGE_WINDOW_HEADER in headers) return headers;\n return {\n ...headers,\n [DEEP_AGENT_MESSAGE_WINDOW_HEADER]: String(clampMessageWindowSize(declaration.size)),\n };\n}\n\nexport interface DeepAgentInterestChainEntry {\n id: string;\n siblings: string[];\n}\n\n/** The host's resolution document of one interest: the request echoed plus its coverage. */\nexport interface DeepAgentInterestResolution extends DeepAgentInterestRequest {\n /** Covered message ids, oldest first (a page ends at its anchor). */\n chain: DeepAgentInterestChainEntry[];\n more: { before: boolean; after: boolean };\n}\n\nexport function readDeepAgentInterestResolution(value: unknown): DeepAgentInterestResolution | null {\n if (typeof value !== 'object' || value === null) return null;\n const { ns, before, at, after, chain, more } = value as Record<string, unknown>;\n if (ns !== DEEP_AGENT_MAIN_NS || !isIndex(before) || !Array.isArray(chain)) return null;\n if (at !== undefined && typeof at !== 'string') return null;\n if (after !== undefined && !isIndex(after)) return null;\n if (typeof more !== 'object' || more === null) return null;\n const { before: moreBefore, after: moreAfter } = more as Record<string, unknown>;\n if (typeof moreBefore !== 'boolean' || typeof moreAfter !== 'boolean') return null;\n const entries: DeepAgentInterestChainEntry[] = [];\n for (const entry of chain) {\n const { id, siblings } = (entry ?? {}) as Record<string, unknown>;\n if (typeof id !== 'string') return null;\n entries.push({\n id,\n siblings: Array.isArray(siblings) ? siblings.filter((s) => typeof s === 'string') : [id],\n });\n }\n return {\n ns: DEEP_AGENT_MAIN_NS,\n before,\n ...(at !== undefined && { at }),\n ...(after !== undefined && { after }),\n chain: entries,\n more: { before: moreBefore, after: moreAfter },\n };\n}\n\n/** The attach's interest document: one resolution per stated request, in order. */\nexport interface DeepAgentInterestDocument {\n windows: DeepAgentInterestResolution[];\n}\n\nexport function readDeepAgentInterestDocument(value: unknown): DeepAgentInterestDocument | null {\n if (typeof value !== 'object' || value === null) return null;\n const { windows } = value as Record<string, unknown>;\n if (!Array.isArray(windows)) return null;\n const resolutions: DeepAgentInterestResolution[] = [];\n for (const window of windows) {\n const resolution = readDeepAgentInterestResolution(window);\n if (resolution === null) return null;\n resolutions.push(resolution);\n }\n return { windows: resolutions };\n}\n\nconst interestRequest = ({ ns, before, at, after }: DeepAgentInterestRequest): DeepAgentInterestRequest => ({\n ns,\n before,\n ...(at !== undefined && { at }),\n ...(after !== undefined && { after }),\n});\n\n/** The loaded transcript window, joined from the head interest and its anchored pages. */\nexport interface DeepAgentMessageWindow {\n /** The requests the joined view stands on, in order (the head first): what a `set` restates. A stale page (its anchor gone) or one the head already covers is left out. */\n requests: DeepAgentInterestRequest[];\n /** Covered chain, oldest first. */\n chain: DeepAgentInterestChainEntry[];\n /** The chain's message documents, in chain order (an unmounted one is skipped). */\n messages: LangChainMessage[];\n /** Whether the host holds messages older than the window. */\n hasOlder: boolean;\n /** Pages joined onto the head. */\n pages: number;\n}\n\n/**\n * The loaded chain plus `grow` older messages, restated in as few requests as\n * it takes: a maximal head, then maximal pages each anchored at the first\n * message of the window above it. `null` once even that exceeds the host's\n * interest cap — the reachable depth is `MAX_INTERESTS × MAX_MESSAGE_WINDOW`.\n */\nfunction coalescedInterestRequests(\n chain: readonly DeepAgentInterestChainEntry[],\n grow: number\n): DeepAgentInterestRequest[] | null {\n const loaded = chain.length;\n const requests: DeepAgentInterestRequest[] = [\n { ns: DEEP_AGENT_MAIN_NS, before: Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, loaded) },\n ];\n // `low` is the chain index of the lowest message the plan covers so far.\n let low = loaded - (requests[0] as DeepAgentInterestRequest).before;\n while (low > 0) {\n const before = Math.min(DEEP_AGENT_MAX_MESSAGE_WINDOW, low + 1);\n requests.push({\n ns: DEEP_AGENT_MAIN_NS,\n before,\n at: (chain[low] as DeepAgentInterestChainEntry).id,\n });\n low = low + 1 - before;\n }\n // The plan covers the chain; the new messages extend its lowest request\n // when that stays within one window, else they are a page of their own.\n const last = requests[requests.length - 1] as DeepAgentInterestRequest;\n if (last.before + grow <= DEEP_AGENT_MAX_MESSAGE_WINDOW) {\n requests[requests.length - 1] = { ...last, before: last.before + grow };\n } else {\n requests.push({\n ns: DEEP_AGENT_MAIN_NS,\n before: grow + 1,\n at: (chain[0] as DeepAgentInterestChainEntry).id,\n });\n }\n return requests.length > DEEP_AGENT_MAX_INTERESTS ? null : requests;\n}\n\n/**\n * The requests to state for one more page of older history, or `null` when\n * there is nothing to load (no anchor, the beginning reached) or the host's\n * interest cap is spent. One page is appended, anchored at the window's first\n * message, while the cap allows; at the cap the loaded range is coalesced\n * into maximal requests first (see {@link coalescedInterestRequests}).\n */\nexport function pageInterestRequests(\n window: DeepAgentMessageWindow,\n size?: number\n): DeepAgentInterestRequest[] | null {\n const anchor = window.chain[0]?.id;\n if (anchor === undefined || !window.hasOlder) return null;\n const page = pageInterestRequest(anchor, size);\n const appended = [...window.requests, page];\n if (appended.length <= DEEP_AGENT_MAX_INTERESTS) return appended;\n // A page's `before` counts its anchor: it adds `before - 1` older messages.\n return coalescedInterestRequests(window.chain, page.before - 1);\n}\n\n/**\n * Whether every `stated` request is carried by `carried` (the same anchor, at\n * least as wide): a reconnect's hello that carries what the client last\n * stated — the host remembers a client id's interests — needs no restatement.\n */\nexport function interestsCovered(\n carried: readonly DeepAgentInterestRequest[],\n stated: readonly DeepAgentInterestRequest[]\n): boolean {\n return stated.every((request) =>\n carried.some((have) => have.at === request.at && have.before >= request.before)\n );\n}\n\n/**\n * The window off the mounted documents, or `null` while the head interest has\n * not resolved (pre-attach, before the first `set` answer, a wire without\n * documents). A page joins wherever its anchor sits in the chain so far — at\n * the first message it extends the view, inside the head (the head widened\n * past it) it adds nothing and is left out of `requests`; a page whose anchor\n * left the transcript (a rewind emptied it in place) is left out too. A\n * malformed document reads as absent.\n */\nexport function readDeepAgentMessageWindow(\n mounted: ReadonlyMap<number, StatewireDocuments.Document> | undefined\n): DeepAgentMessageWindow | null {\n if (mounted === undefined) return null;\n let windows: DeepAgentInterestResolution[] | undefined;\n const documents = new Map<string, LangChainMessage>();\n for (const document of mounted.values()) {\n const key = document.key;\n if (document.protocol === DEEP_AGENT_INTEREST_PROTOCOL && document.main === true) {\n windows = readDeepAgentInterestDocument(document.value)?.windows;\n } else if (\n document.protocol === DEEP_AGENT_STATEWIRE_PROTOCOL &&\n key !== null &&\n key[1] === DEEP_AGENT_MAIN_NS &&\n (key.length === 3 || (key.length === 4 && key[3] === DEEP_AGENT_CUT_LANE_DOCUMENT))\n ) {\n documents.set(key[2] as string, document.value as LangChainMessage);\n }\n }\n const head = windows?.[0];\n if (windows === undefined || head === undefined) return null;\n let chain = head.chain;\n let hasOlder = head.more.before;\n const requests = [interestRequest(head)];\n const loaded = new Set(chain.map((entry) => entry.id));\n let pages = 0;\n for (const page of windows.slice(1)) {\n if (page.at === undefined || !loaded.has(page.at)) continue;\n const anchorAt = page.chain.findIndex((entry) => entry.id === page.at);\n if (anchorAt < 0) continue;\n // Both windows are ranges of one linear transcript sharing the anchor:\n // what the page holds below it and the chain does not is a prefix.\n const fresh = page.chain.slice(0, anchorAt).filter((entry) => !loaded.has(entry.id));\n if (fresh.length === 0) {\n // Nothing new, but a page that starts where the loaded chain starts\n // has looked below it: its `more.before` is the answer for the edge.\n if (page.chain[0]?.id === chain[0]?.id) hasOlder = page.more.before;\n continue;\n }\n chain = [...fresh, ...chain];\n for (const entry of fresh) loaded.add(entry.id);\n hasOlder = page.more.before;\n requests.push(interestRequest(page));\n pages += 1;\n }\n const messages: LangChainMessage[] = [];\n for (const entry of chain) {\n const message = documents.get(entry.id);\n if (message !== undefined) messages.push(message);\n }\n return { requests, chain, messages, hasOlder, pages };\n}\n\n/**\n * The windowed wire's read command on the statewire command union, so\n * `sendCommand({ type: 'history/tool_output', … })` typechecks wherever the\n * deep-agent host is driven (`DeepAgentThread.history_tool_output`, an\n * attach-ACL read).\n */\ndeclare module '@assistant-ui/core' {\n namespace Assistant {\n interface Commands {\n /** A tool output the windowed wire carried cut, whole. */\n historyToolOutput: ToolOutputCommand;\n /** One stored message whole — the per-client shape, by command. */\n historyMessage: HistoryMessageCommand;\n }\n }\n}\n\n/** The `history/tool_output` command: a truncated tool output, whole. */\nexport interface ToolOutputCommand {\n readonly type: typeof DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND;\n readonly messageId: string;\n}\n\nexport function buildToolOutputCommand({ messageId }: { messageId: string }): ToolOutputCommand {\n return { type: DEEP_AGENT_HISTORY_TOOL_OUTPUT_COMMAND, messageId };\n}\n\nexport interface ToolOutputResult {\n messageId: string;\n content: unknown;\n}\n\nexport function readToolOutputResult(payload: unknown): ToolOutputResult | null {\n if (typeof payload !== 'object' || payload === null) return null;\n const { messageId, content } = payload as Record<string, unknown>;\n if (typeof messageId !== 'string' || !messageId) return null;\n return { messageId, content };\n}\n\n/**\n * The `history/message` command: a message as the host stores it — the\n * model-provenance blobs the wire strips and an untruncated tool output\n * included. Every client receives one projected wire form; this is the one\n * per-client shape, fetched on demand like `history/tool_output`.\n */\nexport interface HistoryMessageCommand {\n readonly type: typeof DEEP_AGENT_HISTORY_MESSAGE_COMMAND;\n readonly messageId: string;\n}\n\nexport function buildHistoryMessageCommand({\n messageId,\n}: {\n messageId: string;\n}): HistoryMessageCommand {\n return { type: DEEP_AGENT_HISTORY_MESSAGE_COMMAND, messageId };\n}\n\nexport interface HistoryMessageResult {\n messageId: string;\n message: LangChainMessage;\n}\n\nexport function readHistoryMessageResult(payload: unknown): HistoryMessageResult | null {\n if (typeof payload !== 'object' || payload === null) return null;\n const { messageId, message } = payload as Record<string, unknown>;\n if (typeof messageId !== 'string' || !messageId) return null;\n if (typeof message !== 'object' || message === null) return null;\n return { messageId, message: message as LangChainMessage };\n}\n\n/** The wire marker on a tool message whose content the host cut. */\nexport interface TruncatedToolContent {\n /** Length of the full output, in characters. */\n chars: number;\n}\n\n/**\n * The truncation marker off a raw wire message, or `null` when the message's\n * content is whole. Pure and selector-safe on the marker object.\n */\nexport function readTruncatedToolContent(message: unknown): TruncatedToolContent | null {\n if (typeof message !== 'object' || message === null) return null;\n const marker = (message as Record<string, unknown>)[DEEP_AGENT_TRUNCATED_CONTENT_KEY];\n if (typeof marker !== 'object' || marker === null) return null;\n const chars = (marker as Record<string, unknown>).chars;\n return isIndex(chars) ? { chars } : null;\n}\n\n/**\n * `artifact` key the shared converter lifts a truncated tool output's marker\n * into (with the tool message id), so a tool card can ask for the full output\n * — the converter joins the ToolMessage into its tool-call part and would\n * otherwise drop the wire marker.\n */\nexport const ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY = '_athena_content_truncated';\n\nexport interface TruncatedToolOutputArtifact extends TruncatedToolContent {\n /** The tool message to name in `history/tool_output`. */\n messageId: string;\n}\n\n/**\n * The lifted truncation marker off a tool-call part's `artifact`, or `null`.\n */\nexport function readTruncatedToolOutputArtifact(\n artifact: unknown\n): TruncatedToolOutputArtifact | null {\n if (typeof artifact !== 'object' || artifact === null) return null;\n const lifted = (artifact as Record<string, unknown>)[ATHENA_TRUNCATED_TOOL_OUTPUT_ARTIFACT_KEY];\n if (typeof lifted !== 'object' || lifted === null) return null;\n const { chars, messageId } = lifted as Record<string, unknown>;\n if (!isIndex(chars) || typeof messageId !== 'string' || !messageId) return null;\n return { chars, messageId };\n}\n"],"names":[],"mappings":"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"}
@@ -12,11 +12,119 @@ const composerMarkdown = require("./composer-markdown.cjs");
12
12
  const runconfigContract = require("./generated/runconfig-contract.cjs");
13
13
  const messageWindow = require("./message-window.cjs");
14
14
  const optimisticContent = require("./optimistic-content.cjs");
15
+ const runningToolPlaceholder = require("./running-tool-placeholder.cjs");
15
16
  const statewireState = require("./statewire-state.cjs");
17
+ const toolNames = require("./tool-names.cjs");
16
18
  const voiceTurnGrouping = require("./voice-turn-grouping.cjs");
17
- const messageConverter = react.createMessageConverter(reactLanggraph.convertLangChainMessages);
19
+ const CACHE_EXCLUSIVE_ADAPTERS = /* @__PURE__ */ new Set([
20
+ "amazon_bedrock",
21
+ "aws_bedrock",
22
+ "bedrock"
23
+ ]);
24
+ const tokens = (value, fallback = 0) => typeof value === "number" && Number.isFinite(value) ? Math.trunc(value) : typeof value === "string" && /^\d+$/.test(value) ? Number(value) : fallback;
25
+ const CACHE_READ_KEYS = ["cache_read", "cached", "cached_tokens", "cache_read_tokens"];
26
+ const CACHE_CREATION_KEYS = [
27
+ "cache_creation",
28
+ "cache_creation_tokens",
29
+ "cache_write",
30
+ "cache_write_tokens"
31
+ ];
32
+ const cacheCount = (details, keys) => {
33
+ for (const key of keys) {
34
+ if (details[key] != null) return tokens(details[key]);
35
+ }
36
+ return 0;
37
+ };
38
+ function nativeStepUsage(message) {
39
+ const { usage_metadata: usage, response_metadata: response } = message;
40
+ if (typeof usage !== "object" || usage === null) return void 0;
41
+ const input = tokens(usage.input_tokens);
42
+ const output = tokens(usage.output_tokens);
43
+ const total = tokens(usage.total_tokens, input + output);
44
+ const details = typeof usage.input_token_details === "object" && usage.input_token_details !== null ? usage.input_token_details : {};
45
+ const cached = cacheCount(details, CACHE_READ_KEYS) + cacheCount(details, CACHE_CREATION_KEYS);
46
+ const adapter = response == null ? void 0 : response.model_provider;
47
+ const excluded = cached !== 0 && (typeof adapter === "string" && CACHE_EXCLUSIVE_ADAPTERS.has(adapter.trim().toLowerCase().replace(/-/g, "_")) || total < cached + output);
48
+ return { inputTokens: excluded ? input + cached : input, outputTokens: output };
49
+ }
50
+ function nativeTurnTiming(message) {
51
+ var _a;
52
+ if (message.type !== "ai") return void 0;
53
+ const kwargs = message.additional_kwargs;
54
+ const start = kwargs == null ? void 0 : kwargs.agent_start_time;
55
+ const duration = kwargs == null ? void 0 : kwargs.agent_duration_seconds;
56
+ if (typeof start !== "number" || typeof duration !== "number" || !(start > 0 && duration >= 0)) {
57
+ return void 0;
58
+ }
59
+ return {
60
+ streamStartTime: start * 1e3,
61
+ totalStreamTime: duration * 1e3,
62
+ totalChunks: 0,
63
+ toolCallCount: ((_a = message.tool_calls) == null ? void 0 : _a.length) ?? 0
64
+ };
65
+ }
66
+ const convertDeepAgentLangChainMessage = (message, metadata) => {
67
+ const converted = reactLanggraph.convertLangChainMessages(message, metadata);
68
+ if (message.type !== "ai" || Array.isArray(converted) || converted.role !== "assistant") {
69
+ return converted;
70
+ }
71
+ const usage = nativeStepUsage(message);
72
+ const timing = nativeTurnTiming(message);
73
+ if (usage === void 0 && timing === void 0) return converted;
74
+ return {
75
+ ...converted,
76
+ metadata: {
77
+ ...converted.metadata,
78
+ ...usage !== void 0 && { steps: [{ messageId: message.id, usage }] },
79
+ ...timing !== void 0 && { timing }
80
+ }
81
+ };
82
+ };
83
+ function withoutQuietToolCalls(message) {
84
+ const calls = message.tool_calls ?? [];
85
+ const quietIds = new Set(
86
+ calls.filter((call) => toolNames.QUIET_TOOL_NAMES.has(call.name)).map((call) => call.id)
87
+ );
88
+ const chunks = message.tool_call_chunks ?? [];
89
+ const quietChunk = (chunk) => toolNames.QUIET_TOOL_NAMES.has(chunk.name) || quietIds.has(chunk.id);
90
+ if (quietIds.size === 0 && !chunks.some(quietChunk)) return message;
91
+ return {
92
+ ...message,
93
+ ...message.tool_calls && {
94
+ tool_calls: calls.filter((call) => !quietIds.has(call.id))
95
+ },
96
+ ...message.tool_call_chunks && {
97
+ tool_call_chunks: chunks.filter((chunk) => !quietChunk(chunk))
98
+ }
99
+ };
100
+ }
101
+ const convertDeepAgentMessage = (message, metadata) => {
102
+ if (message.type === "tool" && toolNames.QUIET_TOOL_NAMES.has(message.name)) return [];
103
+ if (message.type === "ai") {
104
+ return convertDeepAgentLangChainMessage(withoutQuietToolCalls(message), metadata);
105
+ }
106
+ return convertDeepAgentLangChainMessage(message, metadata);
107
+ };
108
+ const messageConverter = react.createMessageConverter(convertDeepAgentMessage);
109
+ const messageConverterShowingQuietTools = react.createMessageConverter(convertDeepAgentLangChainMessage);
110
+ const preliminaryMarkedTurns = /* @__PURE__ */ new WeakMap();
111
+ function markPreliminaryToolResults(message) {
112
+ if (message.role !== "assistant") return message;
113
+ const cached = preliminaryMarkedTurns.get(message);
114
+ if (cached !== void 0) return cached;
115
+ let content = null;
116
+ for (const [index, part] of message.content.entries()) {
117
+ if (part.type !== "tool-call" || part.isPreliminary === true) continue;
118
+ if (!runningToolPlaceholder.isRunningToolPlaceholderArtifact(part.artifact)) continue;
119
+ content ?? (content = [...message.content]);
120
+ content[index] = { ...part, isPreliminary: true };
121
+ }
122
+ const marked = content === null ? message : { ...message, content };
123
+ preliminaryMarkedTurns.set(message, marked);
124
+ return marked;
125
+ }
18
126
  class DeepAgentMessageConversionCache {
19
- constructor() {
127
+ constructor({ showQuietTools = false } = {}) {
20
128
  __publicField(this, "cache", react.createExternalMessageConversionCache());
21
129
  /**
22
130
  * Every cached entry is rebuilt when the metadata object changes identity,
@@ -29,6 +137,8 @@ class DeepAgentMessageConversionCache {
29
137
  __publicField(this, "previous", null);
30
138
  /** `convertExternalMessages`' own rows for the previous pass, before parts were kept. */
31
139
  __publicField(this, "previousConverted", null);
140
+ __publicField(this, "callback");
141
+ this.callback = showQuietTools ? convertDeepAgentLangChainMessage : convertDeepAgentMessage;
32
142
  }
33
143
  /**
34
144
  * Convert one pass's LangChain messages. Returns the previous pass's array
@@ -41,11 +151,11 @@ class DeepAgentMessageConversionCache {
41
151
  convert(messages, isRunning) {
42
152
  const converted = react.convertExternalMessages(
43
153
  messages,
44
- reactLanggraph.convertLangChainMessages,
154
+ this.callback,
45
155
  isRunning,
46
156
  this.metadata,
47
157
  this.cache
48
- );
158
+ ).map(markPreliminaryToolResults);
49
159
  const next = this.previous !== null && this.previousConverted !== null ? keepUnchangedParts({
50
160
  previous: this.previous,
51
161
  previousConverted: this.previousConverted,
@@ -160,8 +270,8 @@ function withUnchangedParts({
160
270
  });
161
271
  return kept === 0 ? message : { ...message, content };
162
272
  }
163
- function createDeepAgentMessageConversionCache() {
164
- return new DeepAgentMessageConversionCache();
273
+ function createDeepAgentMessageConversionCache(options = {}) {
274
+ return new DeepAgentMessageConversionCache(options);
165
275
  }
166
276
  function isSameMessageList(a, b) {
167
277
  return a.length === b.length && a.every((message, index) => message === b[index]);
@@ -613,7 +723,8 @@ function convertDeepAgentState(state, {
613
723
  selfAuthor = null,
614
724
  toolOutputs,
615
725
  withdrawnTurns,
616
- conversionCache
726
+ conversionCache,
727
+ showQuietTools = false
617
728
  } = {}) {
618
729
  var _a, _b;
619
730
  const values = statewireState.readDeepAgentStreamValues(state);
@@ -633,7 +744,7 @@ function convertDeepAgentState(state, {
633
744
  ...laneTail
634
745
  ];
635
746
  return {
636
- messages: conversionCache ? conversionCache.convert(sources, isRunning) : messageConverter.toThreadMessages(sources, isRunning),
747
+ messages: conversionCache ? conversionCache.convert(sources, isRunning) : (showQuietTools ? messageConverterShowingQuietTools : messageConverter).toThreadMessages(sources, isRunning).map(markPreliminaryToolResults),
637
748
  isRunning
638
749
  };
639
750
  }
@@ -650,6 +761,8 @@ exports.ATHENA_STOP_SOURCE_SEND_NOW = ATHENA_STOP_SOURCE_SEND_NOW;
650
761
  exports.ATHENA_TERMINATION_REASON_KEY = ATHENA_TERMINATION_REASON_KEY;
651
762
  exports.DeepAgentMessageConversionCache = DeepAgentMessageConversionCache;
652
763
  exports.PENDING_ASSISTANT_MESSAGE_ID = PENDING_ASSISTANT_MESSAGE_ID;
764
+ exports.convertDeepAgentLangChainMessage = convertDeepAgentLangChainMessage;
765
+ exports.convertDeepAgentMessage = convertDeepAgentMessage;
653
766
  exports.convertDeepAgentState = convertDeepAgentState;
654
767
  exports.createDeepAgentMaterialize = createDeepAgentMaterialize;
655
768
  exports.createDeepAgentMessageConversionCache = createDeepAgentMessageConversionCache;
@@ -670,7 +783,9 @@ exports.liftRunMarkerIntoMetadata = liftRunMarkerIntoMetadata;
670
783
  exports.liftTerminationIntoMetadata = liftTerminationIntoMetadata;
671
784
  exports.liftToolMessageMetadataIntoArtifact = liftToolMessageMetadataIntoArtifact;
672
785
  exports.liftTruncatedToolOutputIntoArtifact = liftTruncatedToolOutputIntoArtifact;
786
+ exports.markPreliminaryToolResults = markPreliminaryToolResults;
673
787
  exports.messageConverter = messageConverter;
788
+ exports.nativeStepUsage = nativeStepUsage;
674
789
  exports.normalizeStringContentParts = normalizeStringContentParts;
675
790
  exports.readRunMarkerFromSourceMessages = readRunMarkerFromSourceMessages;
676
791
  exports.sanitizeLangChainMessages = sanitizeLangChainMessages;