@athenaintel/react 0.43.0 → 0.50.0

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 (746) hide show
  1. package/README.md +258 -8
  2. package/dist/agent-runtime/src/answer-label.cjs +137 -0
  3. package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
  4. package/dist/agent-runtime/src/answer-label.d.ts +104 -0
  5. package/dist/agent-runtime/src/answer-label.js +137 -0
  6. package/dist/agent-runtime/src/answer-label.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-rows.cjs +180 -0
  8. package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
  9. package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
  10. package/dist/agent-runtime/src/answer-rows.js +180 -0
  11. package/dist/agent-runtime/src/answer-rows.js.map +1 -0
  12. package/dist/agent-runtime/src/call-recap.cjs +319 -0
  13. package/dist/agent-runtime/src/call-recap.cjs.map +1 -0
  14. package/dist/agent-runtime/src/call-recap.d.ts +142 -0
  15. package/dist/agent-runtime/src/call-recap.js +319 -0
  16. package/dist/agent-runtime/src/call-recap.js.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-store.cjs +1 -0
  18. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -1
  19. package/dist/agent-runtime/src/chat-outbox-store.d.ts +7 -0
  20. package/dist/agent-runtime/src/chat-outbox-store.js +1 -0
  21. package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -1
  22. package/dist/agent-runtime/src/chat-outbox.cjs +46 -5
  23. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
  24. package/dist/agent-runtime/src/chat-outbox.d.ts +29 -0
  25. package/dist/agent-runtime/src/chat-outbox.js +46 -5
  26. package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
  27. package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
  28. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  29. package/dist/agent-runtime/src/conversation-index.cjs +8 -8
  30. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
  31. package/dist/agent-runtime/src/conversation-index.d.ts +7 -0
  32. package/dist/agent-runtime/src/conversation-index.js.map +1 -1
  33. package/dist/agent-runtime/src/conversation-list.cjs +2 -1
  34. package/dist/agent-runtime/src/conversation-list.cjs.map +1 -1
  35. package/dist/agent-runtime/src/conversation-list.d.ts +19 -3
  36. package/dist/agent-runtime/src/conversation-list.js +2 -1
  37. package/dist/agent-runtime/src/conversation-list.js.map +1 -1
  38. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  39. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  40. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  41. package/dist/agent-runtime/src/decision-checks.js +207 -0
  42. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  43. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  44. package/dist/agent-runtime/src/errors.cjs +18 -0
  45. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  46. package/dist/agent-runtime/src/errors.d.ts +7 -0
  47. package/dist/agent-runtime/src/errors.js +18 -0
  48. package/dist/agent-runtime/src/errors.js.map +1 -1
  49. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  50. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  51. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  52. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  53. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  54. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  55. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  56. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  57. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  58. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  59. package/dist/agent-runtime/src/index.d.ts +16 -9
  60. package/dist/agent-runtime/src/interrupts.cjs +71 -19
  61. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  62. package/dist/agent-runtime/src/interrupts.d.ts +40 -3
  63. package/dist/agent-runtime/src/interrupts.js +56 -4
  64. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  65. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  66. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  67. package/dist/agent-runtime/src/messages.cjs +43 -8
  68. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  69. package/dist/agent-runtime/src/messages.d.ts +25 -3
  70. package/dist/agent-runtime/src/messages.js +43 -8
  71. package/dist/agent-runtime/src/messages.js.map +1 -1
  72. package/dist/agent-runtime/src/model-context.cjs +3 -2
  73. package/dist/agent-runtime/src/model-context.cjs.map +1 -1
  74. package/dist/agent-runtime/src/model-context.d.ts +6 -1
  75. package/dist/agent-runtime/src/model-context.js +3 -2
  76. package/dist/agent-runtime/src/model-context.js.map +1 -1
  77. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  78. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  79. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  80. package/dist/agent-runtime/src/offline-status.js +36 -0
  81. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  82. package/dist/agent-runtime/src/queue.cjs +0 -9
  83. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  84. package/dist/agent-runtime/src/queue.js +0 -9
  85. package/dist/agent-runtime/src/queue.js.map +1 -1
  86. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  87. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  88. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  89. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  90. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  91. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  92. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  93. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  94. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  95. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  96. package/dist/agent-runtime/src/runtime.d.ts +41 -0
  97. package/dist/agent-runtime/src/send-recovery.cjs +37 -3
  98. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  99. package/dist/agent-runtime/src/send-recovery.d.ts +19 -0
  100. package/dist/agent-runtime/src/send-recovery.js +37 -3
  101. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  102. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  103. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  104. package/dist/agent-runtime/src/subagents.cjs +32 -2
  105. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  106. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  107. package/dist/agent-runtime/src/subagents.js +30 -0
  108. package/dist/agent-runtime/src/subagents.js.map +1 -1
  109. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  110. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  111. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  112. package/dist/agent-runtime/src/thread-driver.js +67 -0
  113. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  114. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  115. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +868 -0
  116. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  117. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  118. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  119. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  120. package/dist/agent-runtime/src/tool-metadata.cjs +210 -25
  121. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  122. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  123. package/dist/agent-runtime/src/tool-metadata.js +210 -25
  124. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  125. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  126. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  127. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  128. package/dist/agent-runtime/src/tool-names.js +2 -0
  129. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  130. package/dist/agent-runtime/src/types.d.ts +10 -2
  131. package/dist/agent-runtime/src/use-conversation-list.cjs +14 -13
  132. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  133. package/dist/agent-runtime/src/use-conversation-list.d.ts +6 -0
  134. package/dist/agent-runtime/src/use-conversation-list.js +3 -2
  135. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  136. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +45 -20
  137. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  138. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +10 -3
  139. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +27 -2
  140. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  141. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  142. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  143. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  144. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  145. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +40 -22
  146. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  147. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +17 -0
  148. package/dist/agent-runtime/src/use-deep-agent-runtime.js +24 -6
  149. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  150. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  151. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  152. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +588 -130
  153. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  154. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +162 -10
  155. package/dist/agent-runtime/src/use-deep-agent-voice.js +529 -71
  156. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  157. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  158. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  159. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  160. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  161. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +34 -26
  162. package/dist/agent-runtime/src/voice-earcon.cjs +139 -0
  163. package/dist/agent-runtime/src/voice-earcon.cjs.map +1 -0
  164. package/dist/agent-runtime/src/voice-earcon.d.ts +38 -0
  165. package/dist/agent-runtime/src/voice-earcon.js +139 -0
  166. package/dist/agent-runtime/src/voice-earcon.js.map +1 -0
  167. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  168. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  169. package/dist/agent-runtime/src/voice-media.d.ts +63 -0
  170. package/dist/agent-runtime/src/voice-media.js +117 -0
  171. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  172. package/dist/agent-runtime/src/voice-presentation.cjs +2 -0
  173. package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -1
  174. package/dist/agent-runtime/src/voice-presentation.js +2 -0
  175. package/dist/agent-runtime/src/voice-presentation.js.map +1 -1
  176. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  177. package/dist/assets/AssetPanel.cjs +11 -11
  178. package/dist/assets/AssetPanel.cjs.map +1 -1
  179. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  180. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  181. package/dist/assets/AthenaAssetEmbed.d.ts +18 -5
  182. package/dist/assets/AthenaAssetEmbed.js +4 -2
  183. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  184. package/dist/assets/AthenaLayout.cjs +16 -16
  185. package/dist/assets/AthenaLayout.cjs.map +1 -1
  186. package/dist/assets/use-asset-content.cjs +4 -4
  187. package/dist/assets/use-asset-content.cjs.map +1 -1
  188. package/dist/assets/use-asset-embed.cjs +14 -7
  189. package/dist/assets/use-asset-embed.cjs.map +1 -1
  190. package/dist/assets/use-asset-embed.d.ts +23 -6
  191. package/dist/assets/use-asset-embed.js +10 -3
  192. package/dist/assets/use-asset-embed.js.map +1 -1
  193. package/dist/auth/AthenaAuthContext.cjs +3 -3
  194. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  195. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  196. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  197. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  198. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  199. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  200. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  201. package/dist/auth/credential-source.cjs +26 -13
  202. package/dist/auth/credential-source.cjs.map +1 -1
  203. package/dist/auth/credential-source.d.ts +8 -0
  204. package/dist/auth/credential-source.js +26 -13
  205. package/dist/auth/credential-source.js.map +1 -1
  206. package/dist/catalog/agent-model-options.cjs +25 -17
  207. package/dist/catalog/agent-model-options.cjs.map +1 -1
  208. package/dist/catalog/agent-model-options.d.ts +38 -5
  209. package/dist/catalog/agent-model-options.js +25 -17
  210. package/dist/catalog/agent-model-options.js.map +1 -1
  211. package/dist/catalog/channel-refusal.cjs +36 -0
  212. package/dist/catalog/channel-refusal.cjs.map +1 -0
  213. package/dist/catalog/channel-refusal.d.ts +29 -0
  214. package/dist/catalog/channel-refusal.js +36 -0
  215. package/dist/catalog/channel-refusal.js.map +1 -0
  216. package/dist/catalog/chat-pickers.cjs +60 -24
  217. package/dist/catalog/chat-pickers.cjs.map +1 -1
  218. package/dist/catalog/chat-pickers.d.ts +12 -2
  219. package/dist/catalog/chat-pickers.js +56 -20
  220. package/dist/catalog/chat-pickers.js.map +1 -1
  221. package/dist/catalog/runtime-catalog.cjs +89 -23
  222. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  223. package/dist/catalog/runtime-catalog.d.ts +8 -2
  224. package/dist/catalog/runtime-catalog.js +83 -17
  225. package/dist/catalog/runtime-catalog.js.map +1 -1
  226. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  227. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  228. package/dist/chat/AthenaChat.cjs +155 -67
  229. package/dist/chat/AthenaChat.cjs.map +1 -1
  230. package/dist/chat/AthenaChat.d.ts +42 -2
  231. package/dist/chat/AthenaChat.js +106 -18
  232. package/dist/chat/AthenaChat.js.map +1 -1
  233. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  234. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  235. package/dist/chat/DrivingOnChip.cjs +23 -0
  236. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  237. package/dist/chat/DrivingOnChip.d.ts +17 -0
  238. package/dist/chat/DrivingOnChip.js +23 -0
  239. package/dist/chat/DrivingOnChip.js.map +1 -0
  240. package/dist/chat/StatewireApprovalCard.cjs +166 -37
  241. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  242. package/dist/chat/StatewireApprovalCard.d.ts +91 -2
  243. package/dist/chat/StatewireApprovalCard.js +156 -27
  244. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  245. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  246. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  247. package/dist/chat/StatewireQueuedMessages.cjs +81 -69
  248. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.d.ts +25 -13
  250. package/dist/chat/StatewireQueuedMessages.js +73 -61
  251. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  252. package/dist/chat/WaitingOnYouBanner.cjs +9 -5
  253. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  254. package/dist/chat/WaitingOnYouBanner.js +7 -3
  255. package/dist/chat/WaitingOnYouBanner.js.map +1 -1
  256. package/dist/chat/athena-chat-welcome.cjs +2 -2
  257. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  258. package/dist/chat/athena-citation-links.cjs +5 -5
  259. package/dist/chat/athena-citation-links.cjs.map +1 -1
  260. package/dist/chat/athena-composer-controls.cjs +26 -16
  261. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  262. package/dist/chat/athena-composer-controls.d.ts +6 -0
  263. package/dist/chat/athena-composer-controls.js +26 -16
  264. package/dist/chat/athena-composer-controls.js.map +1 -1
  265. package/dist/chat/athena-turn-end-status.cjs +42 -0
  266. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  267. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  268. package/dist/chat/athena-turn-end-status.js +42 -0
  269. package/dist/chat/athena-turn-end-status.js.map +1 -0
  270. package/dist/chat/browser-decision-check.cjs +131 -0
  271. package/dist/chat/browser-decision-check.cjs.map +1 -0
  272. package/dist/chat/browser-decision-check.d.ts +61 -0
  273. package/dist/chat/browser-decision-check.js +131 -0
  274. package/dist/chat/browser-decision-check.js.map +1 -0
  275. package/dist/chat/chat-outbox-rows.cjs +3 -3
  276. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  277. package/dist/chat/chat-voice-controls.cjs +96 -29
  278. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  279. package/dist/chat/chat-voice-controls.d.ts +42 -3
  280. package/dist/chat/chat-voice-controls.js +92 -25
  281. package/dist/chat/chat-voice-controls.js.map +1 -1
  282. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  283. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  284. package/dist/chat/device-operation.cjs +29 -0
  285. package/dist/chat/device-operation.cjs.map +1 -0
  286. package/dist/chat/device-operation.d.ts +34 -0
  287. package/dist/chat/device-operation.js +29 -0
  288. package/dist/chat/device-operation.js.map +1 -0
  289. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  290. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  291. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  292. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  293. package/dist/chat/super-grouping/SuperGroupingCard.cjs +52 -36
  294. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  295. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
  296. package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
  297. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  298. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  299. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  300. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  301. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  302. package/dist/chat/super-grouping/ToolTimeline.cjs +73 -40
  303. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  304. package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
  305. package/dist/chat/super-grouping/ToolTimeline.js +69 -36
  306. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  307. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  308. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  309. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  310. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  311. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  312. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  313. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  314. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  315. package/dist/chat/super-grouping/grouping-function.js +5 -1
  316. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  317. package/dist/chat/super-grouping/index.cjs +6 -0
  318. package/dist/chat/super-grouping/index.cjs.map +1 -1
  319. package/dist/chat/super-grouping/index.d.ts +5 -2
  320. package/dist/chat/super-grouping/index.js +7 -1
  321. package/dist/chat/super-grouping/index.js.map +1 -1
  322. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  323. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  324. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  325. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  326. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  327. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  328. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  329. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  330. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  331. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  332. package/dist/chat/tooltip-icon-button.cjs +2 -2
  333. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  334. package/dist/chat/use-athena-voice-live.cjs +11 -0
  335. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  336. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  337. package/dist/chat/use-athena-voice-live.js +11 -0
  338. package/dist/chat/use-athena-voice-live.js.map +1 -0
  339. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  340. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  341. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  342. package/dist/chat/use-statewire-approval-request.js +41 -9
  343. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  344. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  345. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  346. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  347. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  348. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  349. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  350. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  351. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  352. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  353. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  354. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  355. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  356. package/dist/chat-ui/index.cjs +21 -0
  357. package/dist/chat-ui/index.cjs.map +1 -1
  358. package/dist/chat-ui/index.d.ts +8 -1
  359. package/dist/chat-ui/index.js +21 -0
  360. package/dist/chat-ui/index.js.map +1 -1
  361. package/dist/chat-ui/mentions/mention-chip.cjs +4 -4
  362. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  363. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  364. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  365. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  366. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  367. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  368. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  369. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  370. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  371. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  372. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  373. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  374. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  375. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  376. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  377. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  378. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  379. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  380. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  381. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  382. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  383. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  384. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  385. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  386. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  387. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  388. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  389. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  391. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  393. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  394. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  395. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  396. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  397. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  398. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  399. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  400. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  401. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  402. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  403. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  404. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  405. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  406. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  407. package/dist/chat-ui/mentions/use-mention-asset.cjs +3 -3
  408. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
  409. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  410. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  411. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  412. package/dist/chat-ui/messages/answer-label.js +42 -0
  413. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  414. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  415. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  416. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  417. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  418. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  419. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  420. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  421. package/dist/chat-ui/messages/from-the-call-card.cjs +124 -0
  422. package/dist/chat-ui/messages/from-the-call-card.cjs.map +1 -0
  423. package/dist/chat-ui/messages/from-the-call-card.d.ts +17 -0
  424. package/dist/chat-ui/messages/from-the-call-card.js +124 -0
  425. package/dist/chat-ui/messages/from-the-call-card.js.map +1 -0
  426. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  427. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  428. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  429. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  430. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  431. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  432. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  433. package/dist/chat-ui/messages/message-components.cjs +8 -4
  434. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  435. package/dist/chat-ui/messages/message-components.js +5 -1
  436. package/dist/chat-ui/messages/message-components.js.map +1 -1
  437. package/dist/chat-ui/messages/message-images.cjs +66 -0
  438. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  439. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  440. package/dist/chat-ui/messages/message-images.js +66 -0
  441. package/dist/chat-ui/messages/message-images.js.map +1 -0
  442. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  443. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  444. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  445. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  446. package/dist/chat-ui/rich-text/chat-link.cjs +3 -2
  447. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  448. package/dist/chat-ui/rich-text/chat-link.d.ts +4 -0
  449. package/dist/chat-ui/rich-text/chat-link.js +4 -3
  450. package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
  451. package/dist/chat-ui/rich-text/chat-message-body.cjs +9 -8
  452. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  453. package/dist/chat-ui/rich-text/chat-message-body.d.ts +12 -0
  454. package/dist/chat-ui/rich-text/chat-message-body.js +2 -1
  455. package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
  456. package/dist/chat-ui/rich-text/chat-node-views.cjs +6 -6
  457. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  458. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  459. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  460. package/dist/chat-ui/statewire.cjs +3 -0
  461. package/dist/chat-ui/statewire.cjs.map +1 -1
  462. package/dist/chat-ui/statewire.d.ts +2 -1
  463. package/dist/chat-ui/statewire.js +3 -0
  464. package/dist/chat-ui/statewire.js.map +1 -1
  465. package/dist/chat-ui/thread/chat-thread-shell.cjs +45 -14
  466. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  467. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  468. package/dist/chat-ui/thread/chat-thread-shell.js +37 -6
  469. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  470. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  471. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  472. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  473. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  474. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  475. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  476. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  477. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  478. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  479. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  480. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  481. package/dist/collab/client.cjs +52 -3
  482. package/dist/collab/client.cjs.map +1 -1
  483. package/dist/collab/client.d.ts +27 -0
  484. package/dist/collab/client.js +52 -3
  485. package/dist/collab/client.js.map +1 -1
  486. package/dist/collab/document-status.cjs +150 -0
  487. package/dist/collab/document-status.cjs.map +1 -0
  488. package/dist/collab/document-status.d.ts +68 -0
  489. package/dist/collab/document-status.js +150 -0
  490. package/dist/collab/document-status.js.map +1 -0
  491. package/dist/collab/index.cjs +7 -0
  492. package/dist/collab/index.cjs.map +1 -1
  493. package/dist/collab/index.d.ts +6 -1
  494. package/dist/collab/index.js +7 -0
  495. package/dist/collab/index.js.map +1 -1
  496. package/dist/collab/presence-react.cjs +11 -11
  497. package/dist/collab/presence-react.cjs.map +1 -1
  498. package/dist/collab/react.cjs +6 -6
  499. package/dist/collab/react.cjs.map +1 -1
  500. package/dist/composer/AttachmentContext.cjs +24 -11
  501. package/dist/composer/AttachmentContext.cjs.map +1 -1
  502. package/dist/composer/AttachmentContext.js +18 -5
  503. package/dist/composer/AttachmentContext.js.map +1 -1
  504. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  505. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  506. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  507. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  508. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  509. package/dist/composer/ComposerDropZone.cjs +7 -7
  510. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  511. package/dist/composer/FileUploadButton.cjs +37 -22
  512. package/dist/composer/FileUploadButton.cjs.map +1 -1
  513. package/dist/composer/FileUploadButton.d.ts +6 -0
  514. package/dist/composer/FileUploadButton.js +34 -19
  515. package/dist/composer/FileUploadButton.js.map +1 -1
  516. package/dist/composer/QuoteContext.cjs +8 -8
  517. package/dist/composer/QuoteContext.cjs.map +1 -1
  518. package/dist/composer/composer-handoff.cjs +4 -4
  519. package/dist/composer/composer-handoff.cjs.map +1 -1
  520. package/dist/composer/index.d.ts +1 -1
  521. package/dist/composer/useAppendToComposer.cjs +4 -4
  522. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  523. package/dist/composer/useAttachFiles.cjs +23 -6
  524. package/dist/composer/useAttachFiles.cjs.map +1 -1
  525. package/dist/composer/useAttachFiles.d.ts +15 -7
  526. package/dist/composer/useAttachFiles.js +22 -5
  527. package/dist/composer/useAttachFiles.js.map +1 -1
  528. package/dist/composer/useComposerAttachment.cjs +4 -4
  529. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  530. package/dist/composer/useFileUpload.cjs +21 -16
  531. package/dist/composer/useFileUpload.cjs.map +1 -1
  532. package/dist/composer/useFileUpload.d.ts +12 -0
  533. package/dist/composer/useFileUpload.js +12 -7
  534. package/dist/composer/useFileUpload.js.map +1 -1
  535. package/dist/composer/useReadComposerDraft.cjs +27 -8
  536. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  537. package/dist/composer/useReadComposerDraft.d.ts +23 -1
  538. package/dist/composer/useReadComposerDraft.js +27 -8
  539. package/dist/composer/useReadComposerDraft.js.map +1 -1
  540. package/dist/composer/useSendMessage.cjs +4 -4
  541. package/dist/composer/useSendMessage.cjs.map +1 -1
  542. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  543. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  544. package/dist/dictation/audio-level-history.cjs +3 -3
  545. package/dist/dictation/audio-level-history.cjs.map +1 -1
  546. package/dist/dictation/dictation-controls.cjs +24 -20
  547. package/dist/dictation/dictation-controls.cjs.map +1 -1
  548. package/dist/dictation/dictation-controls.d.ts +6 -1
  549. package/dist/dictation/dictation-controls.js +24 -20
  550. package/dist/dictation/dictation-controls.js.map +1 -1
  551. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  552. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  553. package/dist/dictation/use-dictation.cjs +22 -22
  554. package/dist/dictation/use-dictation.cjs.map +1 -1
  555. package/dist/index.cjs +29 -2
  556. package/dist/index.cjs.map +1 -1
  557. package/dist/index.d.ts +18 -4
  558. package/dist/index.js +30 -3
  559. package/dist/index.js.map +1 -1
  560. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  561. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  562. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  563. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  564. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  565. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs +190 -0
  566. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs.map +1 -0
  567. package/dist/keryx-http/src/unconfirmed-update-attributions.d.ts +132 -0
  568. package/dist/keryx-http/src/unconfirmed-update-attributions.js +190 -0
  569. package/dist/keryx-http/src/unconfirmed-update-attributions.js.map +1 -0
  570. package/dist/keryx-http/src/update-attributions.cjs +141 -0
  571. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  572. package/dist/keryx-http/src/update-attributions.d.ts +107 -0
  573. package/dist/keryx-http/src/update-attributions.js +141 -0
  574. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  575. package/dist/lib/owner-document.cjs +6 -6
  576. package/dist/lib/owner-document.cjs.map +1 -1
  577. package/dist/lib/use-athena-rest-query.cjs +4 -4
  578. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  579. package/dist/lib/use-document-active.cjs +4 -4
  580. package/dist/lib/use-document-active.cjs.map +1 -1
  581. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  582. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  583. package/dist/offline/offline-history.cjs +7 -7
  584. package/dist/offline/offline-history.cjs.map +1 -1
  585. package/dist/provider/AthenaContext.cjs +3 -3
  586. package/dist/provider/AthenaContext.cjs.map +1 -1
  587. package/dist/provider/AthenaProvider.cjs +120 -79
  588. package/dist/provider/AthenaProvider.cjs.map +1 -1
  589. package/dist/provider/AthenaProvider.d.ts +11 -1
  590. package/dist/provider/AthenaProvider.js +44 -3
  591. package/dist/provider/AthenaProvider.js.map +1 -1
  592. package/dist/provider/PostHogProvider.cjs +2 -2
  593. package/dist/provider/PostHogProvider.cjs.map +1 -1
  594. package/dist/provider/agent-selection-context.cjs +2 -2
  595. package/dist/provider/agent-selection-context.cjs.map +1 -1
  596. package/dist/provider/chat-mode-context.cjs +2 -2
  597. package/dist/provider/chat-mode-context.cjs.map +1 -1
  598. package/dist/provider/session-persistence-context.cjs +10 -0
  599. package/dist/provider/session-persistence-context.cjs.map +1 -0
  600. package/dist/provider/session-persistence-context.d.ts +15 -0
  601. package/dist/provider/session-persistence-context.js +10 -0
  602. package/dist/provider/session-persistence-context.js.map +1 -0
  603. package/dist/provider/statewire-history-context.cjs +4 -4
  604. package/dist/provider/statewire-history-context.cjs.map +1 -1
  605. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  606. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  607. package/dist/provider/statewire-window-context.cjs +3 -3
  608. package/dist/provider/statewire-window-context.cjs.map +1 -1
  609. package/dist/provider/theme-style-context.cjs +3 -3
  610. package/dist/provider/theme-style-context.cjs.map +1 -1
  611. package/dist/react/package.json.cjs +1 -1
  612. package/dist/react/package.json.js +1 -1
  613. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  614. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  615. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  616. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  617. package/dist/runtime/auth.cjs +13 -13
  618. package/dist/runtime/auth.cjs.map +1 -1
  619. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  620. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  621. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  622. package/dist/runtime/statewire-lifecycle.js +2 -1
  623. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  624. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  625. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  626. package/dist/runtime/statewire-session-lane.cjs +4 -4
  627. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  628. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  629. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  630. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  631. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  632. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  633. package/dist/styles.css +1 -1
  634. package/dist/threads/Inbox.cjs +8 -8
  635. package/dist/threads/Inbox.cjs.map +1 -1
  636. package/dist/threads/SessionList.cjs +9 -9
  637. package/dist/threads/SessionList.cjs.map +1 -1
  638. package/dist/threads/SessionsPage.cjs +11 -11
  639. package/dist/threads/SessionsPage.cjs.map +1 -1
  640. package/dist/threads/api.cjs.map +1 -1
  641. package/dist/threads/api.d.ts +15 -0
  642. package/dist/threads/api.js.map +1 -1
  643. package/dist/threads/conversation-list-fetcher.cjs +13 -5
  644. package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
  645. package/dist/threads/conversation-list-fetcher.d.ts +4 -1
  646. package/dist/threads/conversation-list-fetcher.js +13 -5
  647. package/dist/threads/conversation-list-fetcher.js.map +1 -1
  648. package/dist/threads/index-triggered-refresh.cjs +10 -10
  649. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  650. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  651. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  652. package/dist/threads/offline-session-list.cjs +3 -3
  653. package/dist/threads/offline-session-list.cjs.map +1 -1
  654. package/dist/threads/session-list-tab-share.cjs +5 -5
  655. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  656. package/dist/threads/statewire-thread-list.cjs +79 -57
  657. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  658. package/dist/threads/statewire-thread-list.d.ts +20 -8
  659. package/dist/threads/statewire-thread-list.js +28 -6
  660. package/dist/threads/statewire-thread-list.js.map +1 -1
  661. package/dist/threads/thread-id-context.cjs +5 -5
  662. package/dist/threads/thread-id-context.cjs.map +1 -1
  663. package/dist/threads/use-athena-session-attention.cjs +2 -2
  664. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  665. package/dist/threads/use-athena-sessions.cjs +37 -15
  666. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  667. package/dist/threads/use-athena-sessions.d.ts +10 -5
  668. package/dist/threads/use-athena-sessions.js +28 -6
  669. package/dist/threads/use-athena-sessions.js.map +1 -1
  670. package/dist/threads/use-athena-thread-model.cjs +3 -3
  671. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  672. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  673. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  674. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  675. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  676. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  677. package/dist/threads/use-thread-archive.cjs +9 -9
  678. package/dist/threads/use-thread-archive.cjs.map +1 -1
  679. package/dist/threads/use-thread-favorite.cjs +2 -2
  680. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  681. package/dist/threads/use-thread-field-override.cjs +20 -20
  682. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  683. package/dist/threads/use-thread-read-state.cjs +4 -4
  684. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  685. package/dist/threads/use-thread-rename.cjs +2 -2
  686. package/dist/threads/use-thread-rename.cjs.map +1 -1
  687. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  688. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  689. package/dist/tools/NestedPtcMessages.cjs +6 -6
  690. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  691. package/dist/tools/append-document-tool-ui.cjs +7 -7
  692. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  693. package/dist/tools/file-tool-uis.cjs +2 -2
  694. package/dist/tools/file-tool-uis.cjs.map +1 -1
  695. package/dist/tools/misc-tool-uis.cjs +2 -2
  696. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  697. package/dist/tools/primitives.cjs +6 -6
  698. package/dist/tools/primitives.cjs.map +1 -1
  699. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  700. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  701. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  702. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  703. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  704. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  705. package/dist/tools/todo-plan-store.cjs +4 -4
  706. package/dist/tools/todo-plan-store.cjs.map +1 -1
  707. package/dist/tools/tool-appearance.cjs +3 -3
  708. package/dist/tools/tool-appearance.cjs.map +1 -1
  709. package/dist/tools/tool-fallback.cjs +14 -14
  710. package/dist/tools/tool-fallback.cjs.map +1 -1
  711. package/dist/tools/tool-uis.cjs +74 -74
  712. package/dist/tools/tool-uis.cjs.map +1 -1
  713. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  714. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  715. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  716. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  717. package/dist/ui/image-viewer.cjs +382 -0
  718. package/dist/ui/image-viewer.cjs.map +1 -0
  719. package/dist/ui/image-viewer.d.ts +50 -0
  720. package/dist/ui/image-viewer.js +382 -0
  721. package/dist/ui/image-viewer.js.map +1 -0
  722. package/dist/voice/chat.cjs +6 -0
  723. package/dist/voice/chat.cjs.map +1 -1
  724. package/dist/voice/chat.d.ts +1 -1
  725. package/dist/voice/chat.js +8 -2
  726. package/dist/voice/livekit-join.cjs +52 -101
  727. package/dist/voice/livekit-join.cjs.map +1 -1
  728. package/dist/voice/livekit-join.d.ts +1 -6
  729. package/dist/voice/livekit-join.js +52 -101
  730. package/dist/voice/livekit-join.js.map +1 -1
  731. package/dist/voice/livekit.cjs.map +1 -1
  732. package/dist/voice/livekit.d.ts +11 -1
  733. package/dist/voice/livekit.js.map +1 -1
  734. package/dist/voice/use-athena-voice-session.cjs +34 -34
  735. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  736. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  737. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  738. package/dist/workbench/SessionWorkbench.cjs +22 -22
  739. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  740. package/dist/workbench/session-workbench-context.cjs +3 -3
  741. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  742. package/dist/workbench/session-workbench-panes.cjs +8 -8
  743. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  744. package/dist/workbench/workbench-layout-context.cjs +3 -3
  745. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  746. package/package.json +2 -1
@@ -0,0 +1,180 @@
1
+ import { answerRowRunId, readLangChainAnswer } from "./answer-label.js";
2
+ const ADDRESSED_TURN_STATE_KEY = "addressedTurn";
3
+ const ADDRESSED_TURN_RECORD_VERSION = 1;
4
+ const MAX_ADDRESSED_AGENTS = 8;
5
+ const AGENT_KEY_PATTERN = /^(collab_agent|assistant):\S+$/;
6
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
7
+ const isAgentKey = (value) => typeof value === "string" && AGENT_KEY_PATTERN.test(value);
8
+ function readOutcome(value) {
9
+ if (!isRecord(value)) return null;
10
+ const { outcome } = value;
11
+ return {
12
+ agent: String(value.agent),
13
+ outcome: outcome === "answered" || outcome === "refused" ? outcome : "failed",
14
+ code: typeof value.code === "string" && value.code.length > 0 ? value.code : null
15
+ };
16
+ }
17
+ function readDeepAgentAddressedTurn(value) {
18
+ if (!isRecord(value) || value.v !== ADDRESSED_TURN_RECORD_VERSION) return null;
19
+ const { author, author_id: authorId, agents, position, anchor, outcomes, started } = value;
20
+ if (typeof author !== "string" || author.length === 0) return null;
21
+ if (typeof authorId !== "string" || authorId.length === 0) return null;
22
+ if (started !== void 0 && typeof started !== "boolean") return null;
23
+ if (!Array.isArray(agents) || agents.length < 2 || agents.length > MAX_ADDRESSED_AGENTS || !agents.every(isAgentKey)) {
24
+ return null;
25
+ }
26
+ if (typeof position !== "number" || !Number.isInteger(position)) return null;
27
+ if (position < 0 || position >= agents.length) return null;
28
+ if (anchor !== null && anchor !== void 0 && (typeof anchor !== "string" || !anchor)) {
29
+ return null;
30
+ }
31
+ if (!Array.isArray(outcomes)) return null;
32
+ const finished = outcomes.map(readOutcome);
33
+ if (finished.some((outcome) => outcome === null)) return null;
34
+ return {
35
+ authorId,
36
+ agents,
37
+ position,
38
+ anchor: anchor ?? null,
39
+ outcomes: finished.filter((outcome) => outcome !== null)
40
+ };
41
+ }
42
+ const ANSWER_ROW_KEY = Symbol.for("@athenaintel/agent-runtime/answer-row");
43
+ function readAnswerRowKey(message) {
44
+ const key = Reflect.get(message, ANSWER_ROW_KEY);
45
+ return typeof key === "string" ? key : void 0;
46
+ }
47
+ const keyedMessages = /* @__PURE__ */ new WeakMap();
48
+ function withAnswerRowKey(message, key) {
49
+ const cached = keyedMessages.get(message);
50
+ if ((cached == null ? void 0 : cached.key) === key) return cached.message;
51
+ const keyed = { ...message };
52
+ Reflect.set(keyed, ANSWER_ROW_KEY, key);
53
+ keyedMessages.set(message, { key, message: keyed });
54
+ return keyed;
55
+ }
56
+ const stampKeys = /* @__PURE__ */ new WeakMap();
57
+ function stampedAnswererKey(message) {
58
+ const cached = stampKeys.get(message);
59
+ if (cached !== void 0) return cached;
60
+ const answer = readLangChainAnswer(message);
61
+ const key = answer === null ? null : answerRowRunId(answer.agent, answer.for_id);
62
+ stampKeys.set(message, key);
63
+ return key;
64
+ }
65
+ const NEXT_AGENT_PENDING_MESSAGE_ID = "__athena_deep_agent_pending_next_agent__";
66
+ const nextAgentPlaceholders = /* @__PURE__ */ new Map();
67
+ function nextAgentPlaceholder(key) {
68
+ const cached = nextAgentPlaceholders.get(key);
69
+ if (cached !== void 0) return cached;
70
+ const placeholder = {
71
+ type: "ai",
72
+ content: [],
73
+ id: NEXT_AGENT_PENDING_MESSAGE_ID,
74
+ status: { type: "running" }
75
+ };
76
+ Reflect.set(placeholder, ANSWER_ROW_KEY, key);
77
+ Object.freeze(placeholder);
78
+ if (nextAgentPlaceholders.size >= 64) nextAgentPlaceholders.clear();
79
+ nextAgentPlaceholders.set(key, placeholder);
80
+ return placeholder;
81
+ }
82
+ const isTurnBoundary = (message) => message.type === "human" || message.type === "system";
83
+ function answeringAgent({
84
+ messages,
85
+ addressedTurn
86
+ }) {
87
+ if (addressedTurn === null || addressedTurn.position === 0 || addressedTurn.anchor === null) {
88
+ return null;
89
+ }
90
+ const agent = addressedTurn.agents[addressedTurn.position];
91
+ if (agent === void 0) return null;
92
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
93
+ const message = messages[index];
94
+ if (message === void 0) continue;
95
+ if (message.id === addressedTurn.anchor) {
96
+ return { key: answerRowRunId(agent, addressedTurn.authorId), anchorIndex: index };
97
+ }
98
+ if (isTurnBoundary(message)) return null;
99
+ }
100
+ return null;
101
+ }
102
+ function turnKeys({
103
+ messages,
104
+ start,
105
+ end,
106
+ answering
107
+ }) {
108
+ var _a, _b;
109
+ const keys = [];
110
+ let first = null;
111
+ let several = false;
112
+ let answeringStamp = null;
113
+ for (let index = start; index < end; index += 1) {
114
+ const message = messages[index];
115
+ if ((message == null ? void 0 : message.type) !== "ai") {
116
+ keys.push(null);
117
+ continue;
118
+ }
119
+ const answeringKey = answering !== null && index > answering.anchorIndex ? answering.key : null;
120
+ let key = stampedAnswererKey(message);
121
+ if (key !== null && answeringKey !== null) answeringStamp = key;
122
+ else if (key === null && answeringKey !== null) key = answeringStamp ?? answeringKey;
123
+ keys.push(key);
124
+ if (key === null) continue;
125
+ if (first === null) first = key;
126
+ else if (key !== first) several = true;
127
+ }
128
+ if (!several) return null;
129
+ let previous = null;
130
+ for (let offset = 0; offset < keys.length; offset += 1) {
131
+ if (((_a = messages[start + offset]) == null ? void 0 : _a.type) !== "ai") continue;
132
+ const key = keys[offset] ?? null;
133
+ if (key === null) keys[offset] = previous;
134
+ else previous = key;
135
+ }
136
+ let next = null;
137
+ for (let offset = keys.length - 1; offset >= 0; offset -= 1) {
138
+ if (((_b = messages[start + offset]) == null ? void 0 : _b.type) !== "ai") continue;
139
+ const key = keys[offset] ?? null;
140
+ if (key === null) keys[offset] = next;
141
+ else next = key;
142
+ }
143
+ return keys;
144
+ }
145
+ function withAnswerRows({
146
+ messages,
147
+ addressedTurn,
148
+ isRunning
149
+ }) {
150
+ const answering = answeringAgent({ messages, addressedTurn });
151
+ const pending = answering !== null && isRunning && !messages.slice(answering.anchorIndex + 1).some((message) => message.type === "ai");
152
+ const sources = pending ? [...messages, nextAgentPlaceholder(answering.key)] : messages;
153
+ let keyed = null;
154
+ let start = 0;
155
+ for (let index = 0; index <= sources.length; index += 1) {
156
+ const message = sources[index];
157
+ if (message !== void 0 && !isTurnBoundary(message)) continue;
158
+ if (index - start > 1) {
159
+ const keys = turnKeys({ messages: sources, start, end: index, answering });
160
+ if (keys !== null) {
161
+ for (const [offset, key] of keys.entries()) {
162
+ const source = sources[start + offset];
163
+ if (key === null || source === void 0 || readAnswerRowKey(source) === key) continue;
164
+ keyed ?? (keyed = [...sources]);
165
+ keyed[start + offset] = withAnswerRowKey(source, key);
166
+ }
167
+ }
168
+ }
169
+ start = index + 1;
170
+ }
171
+ return keyed ?? sources;
172
+ }
173
+ export {
174
+ ADDRESSED_TURN_STATE_KEY,
175
+ NEXT_AGENT_PENDING_MESSAGE_ID,
176
+ readAnswerRowKey,
177
+ readDeepAgentAddressedTurn,
178
+ withAnswerRows
179
+ };
180
+ //# sourceMappingURL=answer-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-rows.js","sources":["../../../../agent-runtime/src/answer-rows.ts"],"sourcesContent":["import type { LangChainMessage } from '@assistant-ui/react-langgraph';\nimport { answerRowRunId, readLangChainAnswer } from './answer-label';\n\n/**\n * One row per answering agent (identity v7 D13: several agents answer one\n * message, each in its own turn for its author).\n *\n * assistant-ui joins consecutive assistant messages into one row unless their\n * `metadata.runId` differs (`chunkExternalMessages` in `@assistant-ui/core`).\n * The agents that answer one message answer in turn, with nothing between\n * them, so without a run id per answer every agent's answer lands in one row.\n * This module gives each AI message the answerer it belongs to, which the\n * converter turns into `metadata.runId` (`convertDeepAgentLangChainMessage`):\n *\n * - a stamped answer: its `answered_by` stamp (agent and principal), written by\n * agora when its model turn lands;\n * - an answer still streaming while several agents answer: the agent the\n * host's record says is answering (`addressedTurn`, replicated statewire\n * state), for every message after the message its turn began after. The\n * stamp lands only once a model turn finishes, so reading the record is what\n * keeps a next agent's answer in its own row from its first token instead of\n * joining the previous agent's row and jumping out when its stamp lands;\n * - anything else (an answer written before the stamp existed, a reused one,\n * a run marker): the answerer of the AI message before it in the same turn,\n * else of the first one after it.\n *\n * Only a turn (the messages between two people's messages) whose answers come\n * from two or more answerers is given run ids: a 1:1 chat, a turn one agent\n * answered and every transcript written before the stamp keep their messages'\n * identity and convert exactly as before.\n */\n\n/** Statewire state key of the message several agents are answering (agora `several_agents.ADDRESSED_TURN_STATE_KEY`). */\nexport const ADDRESSED_TURN_STATE_KEY = 'addressedTurn';\n\n/** The record version this reader understands (agora `several_agents.RECORD_VERSION`). */\nconst ADDRESSED_TURN_RECORD_VERSION = 1;\n\n/** At most this many agents answer one message (agora `agent_refs.MAX_ADDRESSED_AGENTS`). */\nconst MAX_ADDRESSED_AGENTS = 8;\n\nconst AGENT_KEY_PATTERN = /^(collab_agent|assistant):\\S+$/;\n\n/** How one agent's turn of a message several agents answer ended. */\nexport interface DeepAgentAddressedOutcome {\n /** The agent's key (`collab_agent:<asset id>`, `assistant:<principal id>`). */\n agent: string;\n outcome: 'answered' | 'failed' | 'refused';\n /** A refusal's code (e.g. `conversation_history_recheck_required`); `null` otherwise. */\n code: string | null;\n}\n\n/** The message several agents are answering, as the host's replicated record holds it. */\nexport interface DeepAgentAddressedTurn {\n /** Whom every agent of the message answers for: the author's principal id. */\n authorId: string;\n /** The named agents' keys, in the order they answer. */\n agents: readonly string[];\n /** The index in {@link agents} of the agent answering now. */\n position: number;\n /** The message the answering agent's turn began after; `null` for the first agent. */\n anchor: string | null;\n /** Each finished agent's outcome, in order. */\n outcomes: readonly DeepAgentAddressedOutcome[];\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isAgentKey = (value: unknown): value is string =>\n typeof value === 'string' && AGENT_KEY_PATTERN.test(value);\n\n/** One finished agent's outcome, read as agora reads it: an outcome it doesn't know is a failure. */\nfunction readOutcome(value: unknown): DeepAgentAddressedOutcome | null {\n if (!isRecord(value)) return null;\n const { outcome } = value;\n return {\n agent: String(value.agent),\n outcome: outcome === 'answered' || outcome === 'refused' ? outcome : 'failed',\n code: typeof value.code === 'string' && value.code.length > 0 ? value.code : null,\n };\n}\n\n/**\n * The record of the message several agents are answering, off the replicated\n * state value (`state.addressedTurn`); `null` while none is (agora clears it\n * once the last agent settled) and for anything this reader can't trust,\n * mirroring agora's own `read_record`: another version, a malformed field, an\n * agent key it can't read, a position outside the list.\n */\nexport function readDeepAgentAddressedTurn(value: unknown): DeepAgentAddressedTurn | null {\n if (!isRecord(value) || value.v !== ADDRESSED_TURN_RECORD_VERSION) return null;\n const { author, author_id: authorId, agents, position, anchor, outcomes, started } = value;\n if (typeof author !== 'string' || author.length === 0) return null;\n if (typeof authorId !== 'string' || authorId.length === 0) return null;\n if (started !== undefined && typeof started !== 'boolean') return null;\n if (\n !Array.isArray(agents) ||\n agents.length < 2 ||\n agents.length > MAX_ADDRESSED_AGENTS ||\n !agents.every(isAgentKey)\n ) {\n return null;\n }\n if (typeof position !== 'number' || !Number.isInteger(position)) return null;\n if (position < 0 || position >= agents.length) return null;\n if (anchor !== null && anchor !== undefined && (typeof anchor !== 'string' || !anchor)) {\n return null;\n }\n if (!Array.isArray(outcomes)) return null;\n const finished = outcomes.map(readOutcome);\n if (finished.some((outcome) => outcome === null)) return null;\n return {\n authorId,\n agents,\n position,\n anchor: anchor ?? null,\n outcomes: finished.filter((outcome): outcome is DeepAgentAddressedOutcome => outcome !== null),\n };\n}\n\n/** Where an AI message carries the answerer its row is keyed by (see {@link readAnswerRowKey}). */\nconst ANSWER_ROW_KEY = Symbol.for('@athenaintel/agent-runtime/answer-row');\n\n/**\n * The answerer an AI message's row is keyed by, as {@link withAnswerRows} put\n * it on the message; `undefined` for a message it left alone. The converter\n * passes it on as the row's `metadata.runId`.\n */\nexport function readAnswerRowKey(message: LangChainMessage): string | undefined {\n const key: unknown = Reflect.get(message, ANSWER_ROW_KEY);\n return typeof key === 'string' ? key : undefined;\n}\n\n/**\n * The keyed copy of each message, one per message and key: the conversion\n * caches by message identity, so an unchanged message must yield the same\n * keyed object on every pass, and a message whose key changed must yield a\n * new one (it converts again with its new run id).\n */\nconst keyedMessages = new WeakMap<LangChainMessage, { key: string; message: LangChainMessage }>();\n\nfunction withAnswerRowKey(message: LangChainMessage, key: string): LangChainMessage {\n const cached = keyedMessages.get(message);\n if (cached?.key === key) return cached.message;\n const keyed: LangChainMessage = { ...message };\n // A symbol never reaches JSON, so a keyed message sent back to agora (a\n // branch, an edit) carries nothing it didn't receive.\n Reflect.set(keyed, ANSWER_ROW_KEY, key);\n keyedMessages.set(message, { key, message: keyed });\n return keyed;\n}\n\n/**\n * Each AI message's stamped answerer key (`null` when unstamped), cached by\n * message object: the messages handed to {@link withAnswerRows} keep their\n * object while unchanged, so a streamed token reads only the stamp of the\n * message it changed.\n */\nconst stampKeys = new WeakMap<LangChainMessage, string | null>();\n\nfunction stampedAnswererKey(message: LangChainMessage): string | null {\n const cached = stampKeys.get(message);\n if (cached !== undefined) return cached;\n const answer = readLangChainAnswer(message);\n const key = answer === null ? null : answerRowRunId(answer.agent, answer.for_id);\n stampKeys.set(message, key);\n return key;\n}\n\n/** The id of the row a next agent of a message several agents answer shows before its first token. */\nexport const NEXT_AGENT_PENDING_MESSAGE_ID = '__athena_deep_agent_pending_next_agent__';\n\n/** The pending row for each answerer key: one object per key, so the row keeps its identity. */\nconst nextAgentPlaceholders = new Map<string, LangChainMessage>();\n\nfunction nextAgentPlaceholder(key: string): LangChainMessage {\n const cached = nextAgentPlaceholders.get(key);\n if (cached !== undefined) return cached;\n // Empty content with an explicit running status: the thread's thinking\n // status keys on a running assistant row with no parts, as the first\n // agent's pending row does (`withPendingAssistantMessage`).\n const placeholder: LangChainMessage = {\n type: 'ai',\n content: [],\n id: NEXT_AGENT_PENDING_MESSAGE_ID,\n status: { type: 'running' },\n };\n Reflect.set(placeholder, ANSWER_ROW_KEY, key);\n Object.freeze(placeholder);\n // Bounded by the answerers a client meets; each entry is a few strings.\n if (nextAgentPlaceholders.size >= 64) nextAgentPlaceholders.clear();\n nextAgentPlaceholders.set(key, placeholder);\n return placeholder;\n}\n\nconst isTurnBoundary = (message: LangChainMessage): boolean =>\n message.type === 'human' || message.type === 'system';\n\n/** The agent answering now, from the message its turn began after on. */\ninterface AnsweringAgent {\n key: string;\n anchorIndex: number;\n}\n\nfunction answeringAgent({\n messages,\n addressedTurn,\n}: {\n messages: readonly LangChainMessage[];\n addressedTurn: DeepAgentAddressedTurn | null;\n}): AnsweringAgent | null {\n // The first agent answers the message itself: its run brings the message as\n // input, so its answer starts its own row anyway.\n if (addressedTurn === null || addressedTurn.position === 0 || addressedTurn.anchor === null) {\n return null;\n }\n const agent = addressedTurn.agents[addressedTurn.position];\n if (agent === undefined) return null;\n // The anchor is the transcript's last message when the agent's turn began:\n // read from the tail.\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message === undefined) continue;\n if (message.id === addressedTurn.anchor) {\n return { key: answerRowRunId(agent, addressedTurn.authorId), anchorIndex: index };\n }\n // A person's message after the anchor means the record is stale.\n if (isTurnBoundary(message)) return null;\n }\n return null;\n}\n\n/**\n * Key one turn's AI messages (`messages[start..end)`) by their answerer when\n * two or more answerers wrote them; `null` otherwise.\n */\nfunction turnKeys({\n messages,\n start,\n end,\n answering,\n}: {\n messages: readonly LangChainMessage[];\n start: number;\n end: number;\n answering: AnsweringAgent | null;\n}): (string | null)[] | null {\n const keys: (string | null)[] = [];\n let first: string | null = null;\n let several = false;\n // The answering agent's own stamp, once one of its answers carries it: its\n // later messages follow that stamp, so a record and a stamp spelling the\n // author apart never split one agent's answer in two.\n let answeringStamp: string | null = null;\n for (let index = start; index < end; index += 1) {\n const message = messages[index];\n if (message?.type !== 'ai') {\n keys.push(null);\n continue;\n }\n const answeringKey =\n answering !== null && index > answering.anchorIndex ? answering.key : null;\n let key = stampedAnswererKey(message);\n if (key !== null && answeringKey !== null) answeringStamp = key;\n else if (key === null && answeringKey !== null) key = answeringStamp ?? answeringKey;\n keys.push(key);\n if (key === null) continue;\n if (first === null) first = key;\n else if (key !== first) several = true;\n }\n if (!several) return null;\n // An AI message nobody stamped joins the answerer before it in the turn,\n // else the first one after it.\n let previous: string | null = null;\n for (let offset = 0; offset < keys.length; offset += 1) {\n if (messages[start + offset]?.type !== 'ai') continue;\n const key = keys[offset] ?? null;\n if (key === null) keys[offset] = previous;\n else previous = key;\n }\n let next: string | null = null;\n for (let offset = keys.length - 1; offset >= 0; offset -= 1) {\n if (messages[start + offset]?.type !== 'ai') continue;\n const key = keys[offset] ?? null;\n if (key === null) keys[offset] = next;\n else next = key;\n }\n return keys;\n}\n\n/**\n * The messages with every answer of a turn several agents answered keyed by\n * its answerer (see the module comment), so each agent's answer converts into\n * a row of its own; the same array when no turn needs it.\n *\n * While a next agent is answering (`addressedTurn` past its first agent) and\n * the run is live but the agent hasn't sent its first token, its row shows as\n * pending (a running placeholder, {@link NEXT_AGENT_PENDING_MESSAGE_ID}), as the\n * first agent's does.\n *\n * O(the messages) per pass, with no allocation for a transcript nobody but one\n * answerer per turn wrote.\n */\nexport function withAnswerRows({\n messages,\n addressedTurn,\n isRunning,\n}: {\n messages: LangChainMessage[];\n addressedTurn: DeepAgentAddressedTurn | null;\n isRunning: boolean;\n}): LangChainMessage[] {\n const answering = answeringAgent({ messages, addressedTurn });\n const pending =\n answering !== null &&\n isRunning &&\n !messages.slice(answering.anchorIndex + 1).some((message) => message.type === 'ai');\n const sources = pending ? [...messages, nextAgentPlaceholder(answering.key)] : messages;\n let keyed: LangChainMessage[] | null = null;\n let start = 0;\n for (let index = 0; index <= sources.length; index += 1) {\n const message = sources[index];\n if (message !== undefined && !isTurnBoundary(message)) continue;\n if (index - start > 1) {\n const keys = turnKeys({ messages: sources, start, end: index, answering });\n if (keys !== null) {\n for (const [offset, key] of keys.entries()) {\n const source = sources[start + offset];\n if (key === null || source === undefined || readAnswerRowKey(source) === key) continue;\n keyed ??= [...sources];\n keyed[start + offset] = withAnswerRowKey(source, key);\n }\n }\n }\n start = index + 1;\n }\n return keyed ?? sources;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,319 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const core = require("@assistant-ui/core");
4
+ const statewireState = require("./statewire-state.cjs");
5
+ const toolResult = require("./tool-result.cjs");
6
+ const voicePresentation = require("./voice-presentation.cjs");
7
+ const VOICE_TYPED_ID_PREFIX = "voicetext_";
8
+ const CALL_SOURCES = /* @__PURE__ */ new Set([
9
+ voicePresentation.VOICE_SOURCE_SPOKEN,
10
+ voicePresentation.VOICE_SOURCE_TYPED,
11
+ voicePresentation.VOICE_SOURCE_DELEGATION
12
+ ]);
13
+ function isCallUserMessage(message) {
14
+ var _a, _b;
15
+ if (message.role !== "user") return false;
16
+ if (CALL_SOURCES.has((_b = (_a = message.metadata) == null ? void 0 : _a.custom) == null ? void 0 : _b.source)) return true;
17
+ return message.id.startsWith(voicePresentation.VOICE_DELEGATION_ID_PREFIX) || message.id.startsWith(VOICE_TYPED_ID_PREFIX);
18
+ }
19
+ function mayHaveLiveCall(state) {
20
+ if (!statewireState.isDeepAgentStateHydrated(state)) return true;
21
+ const voice = statewireState.readDeepAgentStreamValues(state).voice;
22
+ return voice !== null && voice !== void 0;
23
+ }
24
+ const NO_ENTRIES = Object.freeze([]);
25
+ const MARKDOWN_LINK = /\[((?:[^[\]\n]|\[[^[\]\n]*\])*)\]\(\s*<?((?:[^()\s<>]|\([^()\s]*\))+)>?(?:\s+"[^"\n]*")?\s*\)/g;
26
+ const BARE_URL = /\bhttps?:\/\/[^\s<>()[\]"'`]+/g;
27
+ const TRAILING_PUNCTUATION = /[.,;:!?'"*_]+$/;
28
+ const SPACES_PATH = /\/dashboard\/spaces\/?$/;
29
+ const MAX_TOOL_RESULT_CHARS = 2e4;
30
+ function assetEntry(asset) {
31
+ return {
32
+ kind: "asset",
33
+ asset: { kind: "asset", key: `asset:${asset.assetId}`, ...asset }
34
+ };
35
+ }
36
+ function normalizeAssetType(value) {
37
+ if (!value) return null;
38
+ return value === "sheet" ? "spreadsheet" : value;
39
+ }
40
+ function labelOf(raw) {
41
+ return raw.trim().replace(/^@/, "").trim();
42
+ }
43
+ function displayUrl(url) {
44
+ const host = url.hostname.replace(/^www\./, "");
45
+ const path = url.pathname === "/" ? "" : url.pathname.replace(/\/$/, "");
46
+ return `${host}${path}`;
47
+ }
48
+ const RELATIVE_LINK_BASE = "https://app.athenaintel.com";
49
+ function entriesOfHref(href, rawLabel) {
50
+ const label = labelOf(rawLabel);
51
+ let url;
52
+ try {
53
+ url = new URL(href, href.startsWith("/") ? RELATIVE_LINK_BASE : void 0);
54
+ } catch {
55
+ return [];
56
+ }
57
+ if (url.protocol === "mention:") {
58
+ if (url.hostname !== "asset") return [];
59
+ const assetId = url.searchParams.get("id") ?? url.searchParams.get("asset_id");
60
+ if (!(assetId == null ? void 0 : assetId.startsWith("asset_"))) return [];
61
+ return [
62
+ assetEntry({
63
+ assetId,
64
+ title: label || (url.searchParams.get("name") ?? ""),
65
+ assetType: normalizeAssetType(
66
+ url.searchParams.get("asset_type") ?? url.searchParams.get("type")
67
+ ),
68
+ href
69
+ })
70
+ ];
71
+ }
72
+ if (url.protocol !== "https:" && url.protocol !== "http:") return [];
73
+ const assetIds = url.searchParams.get("asset_ids");
74
+ if (assetIds && SPACES_PATH.test(url.pathname)) {
75
+ const ids = [
76
+ ...new Set(
77
+ assetIds.split(",").map((id) => id.trim()).filter((id) => id.startsWith("asset_"))
78
+ )
79
+ ];
80
+ const assetType = normalizeAssetType(
81
+ url.searchParams.get("type") ?? url.searchParams.get("assetType") ?? url.searchParams.get("asset_type")
82
+ );
83
+ return ids.map((assetId) => {
84
+ if (ids.length === 1) return assetEntry({ assetId, title: label, assetType, href });
85
+ const single = new URL(url.toString());
86
+ single.searchParams.set("asset_ids", assetId);
87
+ return assetEntry({
88
+ assetId,
89
+ title: label,
90
+ assetType,
91
+ href: href.startsWith("/") ? `${single.pathname}${single.search}` : single.toString()
92
+ });
93
+ });
94
+ }
95
+ if (href.startsWith("/")) return [];
96
+ const shown = label && label !== href ? label : displayUrl(url);
97
+ const key = `${url.origin}${url.pathname.replace(/\/$/, "")}${url.search}`;
98
+ return [
99
+ {
100
+ kind: "link",
101
+ link: { kind: "link", key: `link:${key}`, url: url.toString(), label: shown }
102
+ }
103
+ ];
104
+ }
105
+ const CODE = /```[\s\S]*?(?:```|$)|`[^`\n]*`/g;
106
+ function textEntries(raw) {
107
+ if (!raw.includes("://") && !raw.includes("](/")) return NO_ENTRIES;
108
+ const text = raw.includes("`") ? raw.replace(CODE, (code) => " ".repeat(code.length)) : raw;
109
+ const found = [];
110
+ const covered = [];
111
+ for (const match of text.matchAll(MARKDOWN_LINK)) {
112
+ const [whole, label = "", href = ""] = match;
113
+ covered.push([match.index, match.index + whole.length]);
114
+ if (text[match.index - 1] === "!") continue;
115
+ for (const entry of entriesOfHref(href, label)) found.push({ index: match.index, entry });
116
+ }
117
+ for (const match of text.matchAll(BARE_URL)) {
118
+ const start = match.index;
119
+ if (covered.some(([from, to]) => start >= from && start < to)) continue;
120
+ const href = match[0].replace(TRAILING_PUNCTUATION, "");
121
+ for (const entry of entriesOfHref(href, "")) found.push({ index: start, entry });
122
+ }
123
+ if (found.length === 0) return NO_ENTRIES;
124
+ found.sort((a, b) => a.index - b.index);
125
+ return Object.freeze(found.map(({ entry }) => entry));
126
+ }
127
+ function toolCallEntries(part) {
128
+ const toolCallId = part.toolCallId;
129
+ const toolName = part.toolName ?? "tool";
130
+ if (!toolCallId) return NO_ENTRIES;
131
+ if (part.result === void 0) {
132
+ return Object.freeze([{ kind: "open-call", call: { toolCallId, toolName } }]);
133
+ }
134
+ if (part.isPreliminary === true) return NO_ENTRIES;
135
+ if (typeof part.result === "string" && part.result.length > MAX_TOOL_RESULT_CHARS)
136
+ return NO_ENTRIES;
137
+ const record = toolResult.resultRecord(part.result);
138
+ if (!record) return NO_ENTRIES;
139
+ const assetId = toolResult.stringField(record, ["asset_id", "assetId"]);
140
+ const title = toolResult.stringField(record, ["title", "asset_title", "name"]);
141
+ if (!(assetId == null ? void 0 : assetId.startsWith("asset_")) || !title) return NO_ENTRIES;
142
+ const outcome = toolResult.classifyToolResult({
143
+ status: { type: "complete" },
144
+ result: part.result,
145
+ isError: part.isError
146
+ });
147
+ if (outcome.state !== "complete") return NO_ENTRIES;
148
+ return Object.freeze([
149
+ assetEntry({
150
+ assetId,
151
+ title: title.trim(),
152
+ assetType: normalizeAssetType(toolResult.stringField(record, ["asset_type", "assetType"])),
153
+ href: null
154
+ })
155
+ ]);
156
+ }
157
+ const partEntriesCache = /* @__PURE__ */ new WeakMap();
158
+ function partEntries(part) {
159
+ const cached = partEntriesCache.get(part);
160
+ if (cached !== void 0) return cached;
161
+ const entries = part.type === "text" && typeof part.text === "string" ? textEntries(part.text) : part.type === "tool-call" ? toolCallEntries(part) : NO_ENTRIES;
162
+ partEntriesCache.set(part, entries);
163
+ return entries;
164
+ }
165
+ const factsCache = /* @__PURE__ */ new WeakMap();
166
+ function isBoundPart(part) {
167
+ return core.getExternalStoreMessages(part).length > 0;
168
+ }
169
+ function messageFacts(message) {
170
+ var _a, _b;
171
+ const cached = factsCache.get(message);
172
+ if (cached !== void 0) return cached;
173
+ let facts;
174
+ if (message.role === "user") {
175
+ const call = isCallUserMessage(message);
176
+ facts = { breaksCall: !call, callFrom: call ? 0 : -1 };
177
+ } else if (message.role === "assistant") {
178
+ let callFrom = message.content.findIndex(
179
+ (part) => part.type === "text" && voicePresentation.isSpokenTurnTextPart(part) || part.type === "tool-call" && part.toolName === voicePresentation.VOICE_UPDATE_TOOL_NAME
180
+ );
181
+ if (callFrom < 0 && ((_b = (_a = message.metadata) == null ? void 0 : _a.custom) == null ? void 0 : _b.source) === voicePresentation.VOICE_SOURCE_SPOKEN && !message.content.some(isBoundPart)) {
182
+ callFrom = 0;
183
+ }
184
+ facts = { breaksCall: false, callFrom };
185
+ } else {
186
+ facts = { breaksCall: false, callFrom: -1 };
187
+ }
188
+ factsCache.set(message, facts);
189
+ return facts;
190
+ }
191
+ const recapMemo = /* @__PURE__ */ new WeakMap();
192
+ const internedRecaps = /* @__PURE__ */ new Map();
193
+ const MAX_INTERNED_RECAPS = 200;
194
+ function recapSignature(recap) {
195
+ return JSON.stringify([
196
+ recap.endMessageId,
197
+ recap.trailing,
198
+ recap.assets.map((asset) => [asset.assetId, asset.title, asset.assetType, asset.href]),
199
+ recap.links.map((link) => [link.url, link.label]),
200
+ recap.openToolCalls.map((call) => [call.toolCallId, call.toolName])
201
+ ]);
202
+ }
203
+ function intern(recap) {
204
+ const signature = recapSignature(recap);
205
+ const existing = internedRecaps.get(signature);
206
+ if (existing !== void 0) {
207
+ internedRecaps.delete(signature);
208
+ internedRecaps.set(signature, existing);
209
+ return existing;
210
+ }
211
+ const frozen = Object.freeze({
212
+ ...recap,
213
+ assets: Object.freeze([...recap.assets]),
214
+ links: Object.freeze([...recap.links]),
215
+ openToolCalls: Object.freeze([...recap.openToolCalls])
216
+ });
217
+ internedRecaps.set(signature, frozen);
218
+ if (internedRecaps.size > MAX_INTERNED_RECAPS) {
219
+ const oldest = internedRecaps.keys().next().value;
220
+ if (oldest !== void 0) internedRecaps.delete(oldest);
221
+ }
222
+ return frozen;
223
+ }
224
+ function sameSpan(a, b) {
225
+ if (a.length !== b.length) return false;
226
+ for (let index = 0; index < a.length; index += 1) {
227
+ if (a[index] !== b[index]) return false;
228
+ }
229
+ return true;
230
+ }
231
+ function buildRecap({
232
+ span,
233
+ startPart,
234
+ trailing
235
+ }) {
236
+ const assets = /* @__PURE__ */ new Map();
237
+ const links = /* @__PURE__ */ new Map();
238
+ const openToolCalls = /* @__PURE__ */ new Map();
239
+ span.forEach((message, position) => {
240
+ const parts = position === 0 ? message.content.slice(startPart) : message.content;
241
+ for (const part of parts) {
242
+ for (const entry of partEntries(part)) {
243
+ if (entry.kind === "asset") {
244
+ const known = assets.get(entry.asset.assetId);
245
+ if (!known) {
246
+ assets.set(entry.asset.assetId, entry.asset);
247
+ } else if (!known.title && entry.asset.title || !known.assetType && entry.asset.assetType) {
248
+ assets.set(entry.asset.assetId, {
249
+ ...known,
250
+ title: known.title || entry.asset.title,
251
+ assetType: known.assetType ?? entry.asset.assetType,
252
+ href: known.href ?? entry.asset.href
253
+ });
254
+ }
255
+ } else if (entry.kind === "link") {
256
+ if (!links.has(entry.link.key)) links.set(entry.link.key, entry.link);
257
+ } else if (!openToolCalls.has(entry.call.toolCallId)) {
258
+ openToolCalls.set(entry.call.toolCallId, entry.call);
259
+ }
260
+ }
261
+ }
262
+ });
263
+ const end = span[span.length - 1];
264
+ return {
265
+ endMessageId: (end == null ? void 0 : end.id) ?? "",
266
+ trailing,
267
+ assets: [...assets.values()],
268
+ links: [...links.values()],
269
+ openToolCalls: [...openToolCalls.values()]
270
+ };
271
+ }
272
+ function callRecapAfter(messages, index) {
273
+ const message = messages[index];
274
+ if (message === void 0) return null;
275
+ const next = messages[index + 1];
276
+ if (next !== void 0 && (next.role !== "user" || isCallUserMessage(next))) return null;
277
+ let start = -1;
278
+ let startPart = -1;
279
+ for (let position = index; position >= 0; position -= 1) {
280
+ const candidate = messages[position];
281
+ if (candidate === void 0) break;
282
+ const facts = messageFacts(candidate);
283
+ if (facts.breaksCall) break;
284
+ if (facts.callFrom >= 0) {
285
+ start = position;
286
+ startPart = facts.callFrom;
287
+ }
288
+ }
289
+ if (start < 0) return null;
290
+ const span = messages.slice(start, index + 1);
291
+ const trailing = next === void 0;
292
+ const memo = recapMemo.get(message);
293
+ if (memo !== void 0 && memo.startPart === startPart && memo.trailing === trailing && sameSpan(memo.span, span)) {
294
+ return memo.recap;
295
+ }
296
+ const recap = intern(buildRecap({ span, startPart, trailing }));
297
+ recapMemo.set(message, { span, startPart, trailing, recap });
298
+ return recap;
299
+ }
300
+ const EMPTY_IDS = /* @__PURE__ */ new Set();
301
+ function callRecapItems(recap, awaitingApprovalToolCallIds = EMPTY_IDS) {
302
+ const approvals = recap.openToolCalls.filter((call) => awaitingApprovalToolCallIds.has(call.toolCallId)).map((call) => ({
303
+ kind: "approval",
304
+ key: `approval:${call.toolCallId}`,
305
+ toolCallId: call.toolCallId,
306
+ toolName: call.toolName
307
+ }));
308
+ return [...approvals, ...recap.assets, ...recap.links];
309
+ }
310
+ const CALL_RECAP_TITLE = "From the call";
311
+ const CALL_RECAP_APPROVAL_LABEL = "Waiting for your approval";
312
+ exports.CALL_RECAP_APPROVAL_LABEL = CALL_RECAP_APPROVAL_LABEL;
313
+ exports.CALL_RECAP_TITLE = CALL_RECAP_TITLE;
314
+ exports.VOICE_TYPED_ID_PREFIX = VOICE_TYPED_ID_PREFIX;
315
+ exports.callRecapAfter = callRecapAfter;
316
+ exports.callRecapItems = callRecapItems;
317
+ exports.isCallUserMessage = isCallUserMessage;
318
+ exports.mayHaveLiveCall = mayHaveLiveCall;
319
+ //# sourceMappingURL=call-recap.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-recap.cjs","sources":["../../../../agent-runtime/src/call-recap.ts"],"sourcesContent":["/**\n * \"From the call\": what a voice call produced or mentioned, gathered where the\n * call's stretch of the transcript ends, so a person who talked to the agent\n * and later reads the conversation as text (on the same app or another) finds\n * the call's assets, links and open approvals in one place.\n *\n * Everything here is read from the transcript every app already renders, and\n * nothing is invented: an asset item is an asset link or `@`-mention in a\n * message, or a tool result that names the asset it made or read (`asset_id`\n * with a `title`); a link item is a web link in a message; an approval item is\n * a tool call of the call's that has no result yet, shown only while the\n * host's live approval request still names it (the presenter's\n * {@link callRecapItems}).\n *\n * **Where a call is in the transcript.** The host marks every turn a call\n * commits (`metadata.custom.source`, see `voice-presentation.ts`): spoken turns\n * (`voice`), messages typed into the call (`text`, id `voicetext_…`) and the\n * tasks the live model handed the thread (`voice_delegation`, id\n * `voicetask_…`). A typed message sent outside a call carries none of these. So\n * a call's stretch starts at its first marked turn and runs, through the\n * assistant work in between (the delegated runs), up to the next user message\n * that is not a call turn, or the end of the transcript. A spoken assistant\n * turn the converter joined onto the end of an earlier run's message starts\n * the stretch at that part, so the earlier run's artifacts stay out. A\n * delegated run's `send_voice_update` call (a tool only voice-delegated runs\n * get) marks the call too, so a windowed transcript whose loaded tail starts\n * inside a long delegated run still finds it.\n *\n * Two calls with no typed message between them read as one stretch: the\n * transcript does not say where one ended and the next began (the host keeps\n * no per-call marker), so their card collects both. A stretch that ends the\n * transcript may still be live; the presenter shows it once the host reports\n * no voice session (`state.voice` is null), see {@link mayHaveLiveCall}.\n *\n * **Cost.** Every message row asks {@link callRecapAfter} on every transcript\n * update. A row that does not end a stretch answers after looking at the next\n * message; a row that does walks back over its own stretch only. What a message\n * and each of its parts contribute is memoized per object (statewire replaces a\n * changed message and assistant-ui keeps every unchanged part), and an equal\n * recap is the same frozen object, so a row selecting it re-renders only when\n * the card's contents change. The transcript is never re-scanned per delta.\n */\n\nimport { getExternalStoreMessages, type ThreadMessage } from '@assistant-ui/core';\nimport { isDeepAgentStateHydrated, readDeepAgentStreamValues } from './statewire-state';\nimport {\n classifyToolResult,\n resultRecord,\n stringField,\n type ToolCallStatusLike,\n} from './tool-result';\nimport {\n isSpokenTurnTextPart,\n VOICE_DELEGATION_ID_PREFIX,\n VOICE_UPDATE_TOOL_NAME,\n VOICE_SOURCE_DELEGATION,\n VOICE_SOURCE_SPOKEN,\n VOICE_SOURCE_TYPED,\n} from './voice-presentation';\n\n/** Id prefix of a message typed into a live call (`voice/user-text`). */\nexport const VOICE_TYPED_ID_PREFIX = 'voicetext_';\n\n/** An asset the call created, read or linked. */\nexport interface CallRecapAsset {\n readonly kind: 'asset';\n /** Unique within a recap. */\n readonly key: string;\n readonly assetId: string;\n /** What the transcript calls it (the link's label, or the tool result's title); may be empty. */\n readonly title: string;\n /** The asset type the link or tool named (`document`, `spreadsheet`, …), when it named one. */\n readonly assetType: string | null;\n /** The link the transcript carried for it, when it came from a link. */\n readonly href: string | null;\n}\n\n/** A web page the call linked. */\nexport interface CallRecapLink {\n readonly kind: 'link';\n readonly key: string;\n readonly url: string;\n /** The link's own label, else the page's host and path. */\n readonly label: string;\n}\n\n/** A tool call of the call's that is waiting for the person's approval. */\nexport interface CallRecapApproval {\n readonly kind: 'approval';\n readonly key: string;\n readonly toolCallId: string;\n readonly toolName: string;\n}\n\nexport type CallRecapItem = CallRecapAsset | CallRecapLink | CallRecapApproval;\n\n/** A tool call in the stretch with no result yet: an approval while the host's request names it. */\nexport interface CallRecapOpenToolCall {\n readonly toolCallId: string;\n readonly toolName: string;\n}\n\nexport interface CallRecap {\n /** The message the stretch ends at; the card renders right after it. */\n readonly endMessageId: string;\n /** The stretch ends the transcript, so the call may still be live. */\n readonly trailing: boolean;\n /** Assets, in the order the stretch first mentioned them. */\n readonly assets: readonly CallRecapAsset[];\n /** Web links, in the order the stretch first mentioned them. */\n readonly links: readonly CallRecapLink[];\n /** Result-less tool calls, in transcript order. */\n readonly openToolCalls: readonly CallRecapOpenToolCall[];\n}\n\n/** The fields of an assistant-ui thread message this reads (structural, so any runtime's message fits). */\nexport interface CallRecapMessage {\n readonly id: string;\n readonly role: string;\n readonly content: readonly CallRecapPart[];\n readonly metadata?: { readonly custom?: Record<string, unknown> } | undefined;\n}\n\n/** The fields of a message part this reads. */\nexport interface CallRecapPart {\n readonly type: string;\n readonly text?: string;\n readonly toolCallId?: string;\n readonly toolName?: string;\n readonly result?: unknown;\n readonly isError?: boolean;\n /** An interim result a running tool published (`markPreliminaryToolResults`); the real one has not arrived. */\n readonly isPreliminary?: boolean;\n readonly status?: unknown;\n}\n\nconst CALL_SOURCES: ReadonlySet<unknown> = new Set([\n VOICE_SOURCE_SPOKEN,\n VOICE_SOURCE_TYPED,\n VOICE_SOURCE_DELEGATION,\n]);\n\n/**\n * Whether a user message is one of a call's turns: spoken, typed into the call,\n * or a task the live model delegated (by source, or by id on hosts that drop\n * the command's metadata).\n */\nexport function isCallUserMessage(\n message: Pick<CallRecapMessage, 'id' | 'role' | 'metadata'>,\n): boolean {\n if (message.role !== 'user') return false;\n if (CALL_SOURCES.has(message.metadata?.custom?.source)) return true;\n return (\n message.id.startsWith(VOICE_DELEGATION_ID_PREFIX) ||\n message.id.startsWith(VOICE_TYPED_ID_PREFIX)\n );\n}\n\n/**\n * Whether a stretch that ends the transcript may still be a live call: the\n * host reports a voice session (`state.voice`), or its state has not loaded\n * yet. A primitive read of the raw statewire state, safe as a selector.\n */\nexport function mayHaveLiveCall(state: unknown): boolean {\n if (!isDeepAgentStateHydrated(state)) return true;\n const voice: unknown = readDeepAgentStreamValues(state).voice;\n return voice !== null && voice !== undefined;\n}\n\n// ── Per-part entries ─────────────────────────────────────────────────────────\n\ntype Entry =\n | { readonly kind: 'asset'; readonly asset: CallRecapAsset }\n | { readonly kind: 'link'; readonly link: CallRecapLink }\n | { readonly kind: 'open-call'; readonly call: CallRecapOpenToolCall };\n\nconst NO_ENTRIES: readonly Entry[] = Object.freeze([]);\n\n/** `[label](href)` with an optional `\"title\"`; one level of brackets in the label, one of parens in the href. */\nconst MARKDOWN_LINK =\n /\\[((?:[^[\\]\\n]|\\[[^[\\]\\n]*\\])*)\\]\\(\\s*<?((?:[^()\\s<>]|\\([^()\\s]*\\))+)>?(?:\\s+\"[^\"\\n]*\")?\\s*\\)/g;\n/** A bare web address in prose. */\nconst BARE_URL = /\\bhttps?:\\/\\/[^\\s<>()[\\]\"'`]+/g;\n/** Sentence punctuation that follows an address rather than belonging to it. */\nconst TRAILING_PUNCTUATION = /[.,;:!?'\"*_]+$/;\n/** The Spaces route an asset link opens (`/dashboard/spaces?asset_ids=…`). */\nconst SPACES_PATH = /\\/dashboard\\/spaces\\/?$/;\n/** Past this a tool result is not read for an asset: a created asset's answer is small. */\nconst MAX_TOOL_RESULT_CHARS = 20_000;\n\nfunction assetEntry(asset: Omit<CallRecapAsset, 'kind' | 'key'>): Entry {\n return {\n kind: 'asset',\n asset: { kind: 'asset', key: `asset:${asset.assetId}`, ...asset },\n };\n}\n\n/** `sheet` is the old spelling of `spreadsheet` in Spaces links. */\nfunction normalizeAssetType(value: string | null): string | null {\n if (!value) return null;\n return value === 'sheet' ? 'spreadsheet' : value;\n}\n\nfunction labelOf(raw: string): string {\n return raw.trim().replace(/^@/, '').trim();\n}\n\n/** The page's host and path, for a link that carries no label of its own. */\nfunction displayUrl(url: URL): string {\n const host = url.hostname.replace(/^www\\./, '');\n const path = url.pathname === '/' ? '' : url.pathname.replace(/\\/$/, '');\n return `${host}${path}`;\n}\n\n/** The base a relative Spaces link (`/dashboard/spaces?asset_ids=…`) resolves against; only its query is read. */\nconst RELATIVE_LINK_BASE = 'https://app.athenaintel.com';\n\n/** The assets an Athena link names, the web page a link names, or nothing. */\nfunction entriesOfHref(href: string, rawLabel: string): readonly Entry[] {\n const label = labelOf(rawLabel);\n let url: URL;\n try {\n url = new URL(href, href.startsWith('/') ? RELATIVE_LINK_BASE : undefined);\n } catch {\n return [];\n }\n if (url.protocol === 'mention:') {\n if (url.hostname !== 'asset') return [];\n const assetId = url.searchParams.get('id') ?? url.searchParams.get('asset_id');\n if (!assetId?.startsWith('asset_')) return [];\n return [\n assetEntry({\n assetId,\n title: label || (url.searchParams.get('name') ?? ''),\n assetType: normalizeAssetType(\n url.searchParams.get('asset_type') ?? url.searchParams.get('type'),\n ),\n href,\n }),\n ];\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') return [];\n const assetIds = url.searchParams.get('asset_ids');\n if (assetIds && SPACES_PATH.test(url.pathname)) {\n const ids = [\n ...new Set(\n assetIds\n .split(',')\n .map((id) => id.trim())\n .filter((id) => id.startsWith('asset_')),\n ),\n ];\n const assetType = normalizeAssetType(\n url.searchParams.get('type') ??\n url.searchParams.get('assetType') ??\n url.searchParams.get('asset_type'),\n );\n // A link that opens several assets side by side names each of them: one\n // item per asset, each opening only its own asset.\n return ids.map((assetId) => {\n if (ids.length === 1) return assetEntry({ assetId, title: label, assetType, href });\n const single = new URL(url.toString());\n single.searchParams.set('asset_ids', assetId);\n return assetEntry({\n assetId,\n title: label,\n assetType,\n href: href.startsWith('/') ? `${single.pathname}${single.search}` : single.toString(),\n });\n });\n }\n // Any other relative link is a route inside the app, not a page the call named.\n if (href.startsWith('/')) return [];\n const shown = label && label !== href ? label : displayUrl(url);\n const key = `${url.origin}${url.pathname.replace(/\\/$/, '')}${url.search}`;\n return [\n {\n kind: 'link',\n link: { kind: 'link', key: `link:${key}`, url: url.toString(), label: shown },\n },\n ];\n}\n\n/** Fenced code blocks and inline code spans: an address shown as code is not a link the message names. */\nconst CODE = /```[\\s\\S]*?(?:```|$)|`[^`\\n]*`/g;\n\n/** The asset and web links a text part carries, in the order it carries them. */\nfunction textEntries(raw: string): readonly Entry[] {\n // An address (`https://`, `mention://`) or a relative Spaces link (`](/dashboard/…`).\n if (!raw.includes('://') && !raw.includes('](/')) return NO_ENTRIES;\n // Blanked to the same length, so the rest keeps its offsets (the order the part names things in).\n const text = raw.includes('`') ? raw.replace(CODE, (code) => ' '.repeat(code.length)) : raw;\n const found: { index: number; entry: Entry }[] = [];\n const covered: [number, number][] = [];\n for (const match of text.matchAll(MARKDOWN_LINK)) {\n const [whole, label = '', href = ''] = match;\n covered.push([match.index, match.index + whole.length]);\n // `![alt](src)` is an image the message shows, not a link it names.\n if (text[match.index - 1] === '!') continue;\n for (const entry of entriesOfHref(href, label)) found.push({ index: match.index, entry });\n }\n for (const match of text.matchAll(BARE_URL)) {\n const start = match.index;\n if (covered.some(([from, to]) => start >= from && start < to)) continue;\n const href = match[0].replace(TRAILING_PUNCTUATION, '');\n for (const entry of entriesOfHref(href, '')) found.push({ index: start, entry });\n }\n if (found.length === 0) return NO_ENTRIES;\n found.sort((a, b) => a.index - b.index);\n return Object.freeze(found.map(({ entry }) => entry));\n}\n\n/** The asset a finished tool call reports (`asset_id` with a `title`), the open call, or nothing. */\nfunction toolCallEntries(part: CallRecapPart): readonly Entry[] {\n const toolCallId = part.toolCallId;\n const toolName = part.toolName ?? 'tool';\n if (!toolCallId) return NO_ENTRIES;\n if (part.result === undefined) {\n return Object.freeze([{ kind: 'open-call', call: { toolCallId, toolName } }]);\n }\n // A running tool's interim payload is not its outcome: the asset counts once the tool finished.\n if (part.isPreliminary === true) return NO_ENTRIES;\n if (typeof part.result === 'string' && part.result.length > MAX_TOOL_RESULT_CHARS)\n return NO_ENTRIES;\n const record = resultRecord(part.result);\n if (!record) return NO_ENTRIES;\n const assetId = stringField(record, ['asset_id', 'assetId']);\n const title = stringField(record, ['title', 'asset_title', 'name']);\n if (!assetId?.startsWith('asset_') || !title) return NO_ENTRIES;\n const outcome = classifyToolResult({\n status: { type: 'complete' } satisfies ToolCallStatusLike,\n result: part.result,\n isError: part.isError,\n });\n if (outcome.state !== 'complete') return NO_ENTRIES;\n return Object.freeze([\n assetEntry({\n assetId,\n title: title.trim(),\n assetType: normalizeAssetType(stringField(record, ['asset_type', 'assetType'])),\n href: null,\n }),\n ]);\n}\n\nconst partEntriesCache = new WeakMap<object, readonly Entry[]>();\n\nfunction partEntries(part: CallRecapPart): readonly Entry[] {\n const cached = partEntriesCache.get(part);\n if (cached !== undefined) return cached;\n const entries =\n part.type === 'text' && typeof part.text === 'string'\n ? textEntries(part.text)\n : part.type === 'tool-call'\n ? toolCallEntries(part)\n : NO_ENTRIES;\n partEntriesCache.set(part, entries);\n return entries;\n}\n\n// ── Per-message facts ────────────────────────────────────────────────────────\n\ninterface MessageFacts {\n /** A user message outside any call: it ends the stretch before it. */\n readonly breaksCall: boolean;\n /** The first part that belongs to a call (a call turn's first part, a spoken assistant part, a voice update), or -1. */\n readonly callFrom: number;\n}\n\nconst factsCache = new WeakMap<object, MessageFacts>();\n\n/** Whether the converter bound a part to its wire entry (`isSpokenTurnTextPart` reads that entry). */\nfunction isBoundPart(part: CallRecapPart): boolean {\n return getExternalStoreMessages<unknown>(part as ThreadMessage['content'][number]).length > 0;\n}\n\nfunction messageFacts(message: CallRecapMessage): MessageFacts {\n const cached = factsCache.get(message);\n if (cached !== undefined) return cached;\n let facts: MessageFacts;\n if (message.role === 'user') {\n const call = isCallUserMessage(message);\n facts = { breaksCall: !call, callFrom: call ? 0 : -1 };\n } else if (message.role === 'assistant') {\n // A spoken turn, or the interim-update tool only a run the live model\n // delegated is given (`send_voice_update`): a delegated run still marks its\n // call when a windowed transcript has not loaded the turns before it.\n let callFrom = message.content.findIndex(\n (part) =>\n (part.type === 'text' && isSpokenTurnTextPart(part)) ||\n (part.type === 'tool-call' && part.toolName === VOICE_UPDATE_TOOL_NAME),\n );\n // A message no converter bound reads by its own source (one spoken turn).\n if (\n callFrom < 0 &&\n message.metadata?.custom?.source === VOICE_SOURCE_SPOKEN &&\n !message.content.some(isBoundPart)\n ) {\n callFrom = 0;\n }\n facts = { breaksCall: false, callFrom };\n } else {\n facts = { breaksCall: false, callFrom: -1 };\n }\n factsCache.set(message, facts);\n return facts;\n}\n\n// ── The recap at a row ───────────────────────────────────────────────────────\n\ninterface RecapMemo {\n /** The stretch's messages, start first, as last read. */\n readonly span: readonly CallRecapMessage[];\n readonly startPart: number;\n readonly trailing: boolean;\n readonly recap: CallRecap;\n}\n\n/** Keyed by the stretch's last message: a settled stretch answers from here without rebuilding. */\nconst recapMemo = new WeakMap<object, RecapMemo>();\n\n/** Equal recaps share one frozen object (bounded; a miss only costs a rebuild). */\nconst internedRecaps = new Map<string, CallRecap>();\nconst MAX_INTERNED_RECAPS = 200;\n\nfunction recapSignature(recap: CallRecap): string {\n return JSON.stringify([\n recap.endMessageId,\n recap.trailing,\n recap.assets.map((asset) => [asset.assetId, asset.title, asset.assetType, asset.href]),\n recap.links.map((link) => [link.url, link.label]),\n recap.openToolCalls.map((call) => [call.toolCallId, call.toolName]),\n ]);\n}\n\nfunction intern(recap: CallRecap): CallRecap {\n const signature = recapSignature(recap);\n const existing = internedRecaps.get(signature);\n if (existing !== undefined) {\n // Most recently used last, so the bound evicts the stalest.\n internedRecaps.delete(signature);\n internedRecaps.set(signature, existing);\n return existing;\n }\n const frozen: CallRecap = Object.freeze({\n ...recap,\n assets: Object.freeze([...recap.assets]),\n links: Object.freeze([...recap.links]),\n openToolCalls: Object.freeze([...recap.openToolCalls]),\n });\n internedRecaps.set(signature, frozen);\n if (internedRecaps.size > MAX_INTERNED_RECAPS) {\n const oldest = internedRecaps.keys().next().value;\n if (oldest !== undefined) internedRecaps.delete(oldest);\n }\n return frozen;\n}\n\nfunction sameSpan(a: readonly CallRecapMessage[], b: readonly CallRecapMessage[]): boolean {\n if (a.length !== b.length) return false;\n for (let index = 0; index < a.length; index += 1) {\n if (a[index] !== b[index]) return false;\n }\n return true;\n}\n\nfunction buildRecap({\n span,\n startPart,\n trailing,\n}: {\n span: readonly CallRecapMessage[];\n startPart: number;\n trailing: boolean;\n}): CallRecap {\n const assets = new Map<string, CallRecapAsset>();\n const links = new Map<string, CallRecapLink>();\n const openToolCalls = new Map<string, CallRecapOpenToolCall>();\n span.forEach((message, position) => {\n const parts = position === 0 ? message.content.slice(startPart) : message.content;\n for (const part of parts) {\n for (const entry of partEntries(part)) {\n if (entry.kind === 'asset') {\n const known = assets.get(entry.asset.assetId);\n if (!known) {\n assets.set(entry.asset.assetId, entry.asset);\n } else if (\n (!known.title && entry.asset.title) ||\n (!known.assetType && entry.asset.assetType)\n ) {\n // A later mention fills what the first one left out; the first keeps its place.\n assets.set(entry.asset.assetId, {\n ...known,\n title: known.title || entry.asset.title,\n assetType: known.assetType ?? entry.asset.assetType,\n href: known.href ?? entry.asset.href,\n });\n }\n } else if (entry.kind === 'link') {\n if (!links.has(entry.link.key)) links.set(entry.link.key, entry.link);\n } else if (!openToolCalls.has(entry.call.toolCallId)) {\n openToolCalls.set(entry.call.toolCallId, entry.call);\n }\n }\n }\n });\n const end = span[span.length - 1];\n return {\n endMessageId: end?.id ?? '',\n trailing,\n assets: [...assets.values()],\n links: [...links.values()],\n openToolCalls: [...openToolCalls.values()],\n };\n}\n\n/**\n * The recap of the call stretch that ends at `messages[index]`, or `null` when\n * no call stretch ends there. Cheap for every other row (it looks at the next\n * message only); the same frozen object while the recap is unchanged, so it is\n * safe as a `useAuiState` selector result.\n */\nexport function callRecapAfter(\n messages: readonly CallRecapMessage[],\n index: number,\n): CallRecap | null {\n const message = messages[index];\n if (message === undefined) return null;\n const next = messages[index + 1];\n // Only a user message outside a call ends a stretch; an assistant message never does.\n if (next !== undefined && (next.role !== 'user' || isCallUserMessage(next))) return null;\n\n // Walk back over this stretch only: to the user message outside a call that opened it.\n let start = -1;\n let startPart = -1;\n for (let position = index; position >= 0; position -= 1) {\n const candidate = messages[position];\n if (candidate === undefined) break;\n const facts = messageFacts(candidate);\n if (facts.breaksCall) break;\n if (facts.callFrom >= 0) {\n start = position;\n startPart = facts.callFrom;\n }\n }\n if (start < 0) return null;\n\n const span = messages.slice(start, index + 1);\n const trailing = next === undefined;\n const memo = recapMemo.get(message);\n if (\n memo !== undefined &&\n memo.startPart === startPart &&\n memo.trailing === trailing &&\n sameSpan(memo.span, span)\n ) {\n return memo.recap;\n }\n const recap = intern(buildRecap({ span, startPart, trailing }));\n recapMemo.set(message, { span, startPart, trailing, recap });\n return recap;\n}\n\n/** Whether a recap has anything to show once approvals are matched (see {@link callRecapItems}). */\nexport function callRecapHasItems(\n recap: CallRecap,\n awaitingApprovalToolCallIds: ReadonlySet<string> = EMPTY_IDS,\n): boolean {\n return (\n recap.assets.length > 0 ||\n recap.links.length > 0 ||\n recap.openToolCalls.some((call) => awaitingApprovalToolCallIds.has(call.toolCallId))\n );\n}\n\nconst EMPTY_IDS: ReadonlySet<string> = new Set();\n\n/**\n * The card's items: the call's tool calls still waiting for the person's\n * approval (the host's live request names them), then its assets, then its\n * web links. Pure; hosts memoize it on the recap and the id set.\n */\nexport function callRecapItems(\n recap: CallRecap,\n awaitingApprovalToolCallIds: ReadonlySet<string> = EMPTY_IDS,\n): CallRecapItem[] {\n const approvals: CallRecapApproval[] = recap.openToolCalls\n .filter((call) => awaitingApprovalToolCallIds.has(call.toolCallId))\n .map((call) => ({\n kind: 'approval',\n key: `approval:${call.toolCallId}`,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n }));\n return [...approvals, ...recap.assets, ...recap.links];\n}\n\n/** The card's heading, worded once for every app. */\nexport const CALL_RECAP_TITLE = 'From the call';\n\n/** An approval item's copy, worded once for every app. */\nexport const CALL_RECAP_APPROVAL_LABEL = 'Waiting for your approval';\n"],"names":["VOICE_SOURCE_SPOKEN","VOICE_SOURCE_TYPED","VOICE_SOURCE_DELEGATION","VOICE_DELEGATION_ID_PREFIX","isDeepAgentStateHydrated","readDeepAgentStreamValues","resultRecord","stringField","classifyToolResult","getExternalStoreMessages","isSpokenTurnTextPart","VOICE_UPDATE_TOOL_NAME"],"mappings":"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"}