@athenaintel/react 0.43.0 → 0.48.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 (661) hide show
  1. package/README.md +215 -3
  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/client-tool-bridge.cjs +15 -15
  13. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  14. package/dist/agent-runtime/src/conversation-index.cjs +8 -8
  15. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
  16. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  17. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  18. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  19. package/dist/agent-runtime/src/decision-checks.js +207 -0
  20. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  21. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  22. package/dist/agent-runtime/src/errors.cjs +18 -0
  23. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  24. package/dist/agent-runtime/src/errors.d.ts +7 -0
  25. package/dist/agent-runtime/src/errors.js +18 -0
  26. package/dist/agent-runtime/src/errors.js.map +1 -1
  27. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  28. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  29. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  30. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  31. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  32. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  33. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  34. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  35. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  36. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  37. package/dist/agent-runtime/src/index.d.ts +14 -8
  38. package/dist/agent-runtime/src/interrupts.cjs +43 -18
  39. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  40. package/dist/agent-runtime/src/interrupts.d.ts +19 -2
  41. package/dist/agent-runtime/src/interrupts.js +28 -3
  42. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  43. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  44. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  45. package/dist/agent-runtime/src/messages.cjs +43 -8
  46. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  47. package/dist/agent-runtime/src/messages.d.ts +25 -3
  48. package/dist/agent-runtime/src/messages.js +43 -8
  49. package/dist/agent-runtime/src/messages.js.map +1 -1
  50. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  51. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  52. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  53. package/dist/agent-runtime/src/offline-status.js +36 -0
  54. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  55. package/dist/agent-runtime/src/queue.cjs +0 -9
  56. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  57. package/dist/agent-runtime/src/queue.js +0 -9
  58. package/dist/agent-runtime/src/queue.js.map +1 -1
  59. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  60. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  61. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  62. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  63. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  64. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  65. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  66. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  67. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  68. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  69. package/dist/agent-runtime/src/runtime.d.ts +40 -0
  70. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  71. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  72. package/dist/agent-runtime/src/subagents.cjs +32 -2
  73. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  74. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  75. package/dist/agent-runtime/src/subagents.js +30 -0
  76. package/dist/agent-runtime/src/subagents.js.map +1 -1
  77. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  78. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  79. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  80. package/dist/agent-runtime/src/thread-driver.js +67 -0
  81. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  82. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  83. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +756 -0
  84. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  85. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  86. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  87. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  88. package/dist/agent-runtime/src/tool-metadata.cjs +210 -25
  89. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  90. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  91. package/dist/agent-runtime/src/tool-metadata.js +210 -25
  92. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  93. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  94. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  95. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  96. package/dist/agent-runtime/src/tool-names.js +2 -0
  97. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  98. package/dist/agent-runtime/src/types.d.ts +10 -2
  99. package/dist/agent-runtime/src/use-conversation-list.cjs +11 -11
  100. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  101. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +24 -19
  102. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  103. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +2 -1
  104. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +6 -1
  105. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  106. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  107. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  108. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  109. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  110. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +16 -16
  111. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  112. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  113. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  114. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +547 -124
  115. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  116. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +129 -10
  117. package/dist/agent-runtime/src/use-deep-agent-voice.js +487 -64
  118. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  119. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  120. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  121. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  122. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  123. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +28 -26
  124. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  125. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  126. package/dist/agent-runtime/src/voice-media.d.ts +49 -0
  127. package/dist/agent-runtime/src/voice-media.js +117 -0
  128. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  129. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  130. package/dist/assets/AssetPanel.cjs +11 -11
  131. package/dist/assets/AssetPanel.cjs.map +1 -1
  132. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  133. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  134. package/dist/assets/AthenaAssetEmbed.d.ts +7 -0
  135. package/dist/assets/AthenaAssetEmbed.js +4 -2
  136. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  137. package/dist/assets/AthenaLayout.cjs +16 -16
  138. package/dist/assets/AthenaLayout.cjs.map +1 -1
  139. package/dist/assets/use-asset-content.cjs +4 -4
  140. package/dist/assets/use-asset-content.cjs.map +1 -1
  141. package/dist/assets/use-asset-embed.cjs +14 -7
  142. package/dist/assets/use-asset-embed.cjs.map +1 -1
  143. package/dist/assets/use-asset-embed.d.ts +11 -1
  144. package/dist/assets/use-asset-embed.js +10 -3
  145. package/dist/assets/use-asset-embed.js.map +1 -1
  146. package/dist/auth/AthenaAuthContext.cjs +3 -3
  147. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  148. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  149. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  150. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  151. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  152. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  153. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  154. package/dist/auth/credential-source.cjs +26 -13
  155. package/dist/auth/credential-source.cjs.map +1 -1
  156. package/dist/auth/credential-source.d.ts +8 -0
  157. package/dist/auth/credential-source.js +26 -13
  158. package/dist/auth/credential-source.js.map +1 -1
  159. package/dist/catalog/agent-model-options.cjs +25 -17
  160. package/dist/catalog/agent-model-options.cjs.map +1 -1
  161. package/dist/catalog/agent-model-options.d.ts +38 -5
  162. package/dist/catalog/agent-model-options.js +25 -17
  163. package/dist/catalog/agent-model-options.js.map +1 -1
  164. package/dist/catalog/channel-refusal.cjs +36 -0
  165. package/dist/catalog/channel-refusal.cjs.map +1 -0
  166. package/dist/catalog/channel-refusal.d.ts +29 -0
  167. package/dist/catalog/channel-refusal.js +36 -0
  168. package/dist/catalog/channel-refusal.js.map +1 -0
  169. package/dist/catalog/chat-pickers.cjs +60 -24
  170. package/dist/catalog/chat-pickers.cjs.map +1 -1
  171. package/dist/catalog/chat-pickers.d.ts +12 -2
  172. package/dist/catalog/chat-pickers.js +56 -20
  173. package/dist/catalog/chat-pickers.js.map +1 -1
  174. package/dist/catalog/runtime-catalog.cjs +89 -23
  175. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  176. package/dist/catalog/runtime-catalog.d.ts +8 -2
  177. package/dist/catalog/runtime-catalog.js +83 -17
  178. package/dist/catalog/runtime-catalog.js.map +1 -1
  179. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  180. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  181. package/dist/chat/AthenaChat.cjs +155 -67
  182. package/dist/chat/AthenaChat.cjs.map +1 -1
  183. package/dist/chat/AthenaChat.d.ts +42 -2
  184. package/dist/chat/AthenaChat.js +106 -18
  185. package/dist/chat/AthenaChat.js.map +1 -1
  186. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  187. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  188. package/dist/chat/DrivingOnChip.cjs +23 -0
  189. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  190. package/dist/chat/DrivingOnChip.d.ts +17 -0
  191. package/dist/chat/DrivingOnChip.js +23 -0
  192. package/dist/chat/DrivingOnChip.js.map +1 -0
  193. package/dist/chat/StatewireApprovalCard.cjs +125 -31
  194. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  195. package/dist/chat/StatewireApprovalCard.d.ts +73 -1
  196. package/dist/chat/StatewireApprovalCard.js +115 -21
  197. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  198. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  199. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  200. package/dist/chat/StatewireQueuedMessages.cjs +25 -63
  201. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  202. package/dist/chat/StatewireQueuedMessages.d.ts +11 -13
  203. package/dist/chat/StatewireQueuedMessages.js +16 -54
  204. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  205. package/dist/chat/WaitingOnYouBanner.cjs +3 -3
  206. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  207. package/dist/chat/athena-chat-welcome.cjs +2 -2
  208. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  209. package/dist/chat/athena-citation-links.cjs +5 -5
  210. package/dist/chat/athena-citation-links.cjs.map +1 -1
  211. package/dist/chat/athena-composer-controls.cjs +26 -16
  212. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  213. package/dist/chat/athena-composer-controls.d.ts +6 -0
  214. package/dist/chat/athena-composer-controls.js +26 -16
  215. package/dist/chat/athena-composer-controls.js.map +1 -1
  216. package/dist/chat/athena-turn-end-status.cjs +42 -0
  217. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  218. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  219. package/dist/chat/athena-turn-end-status.js +42 -0
  220. package/dist/chat/athena-turn-end-status.js.map +1 -0
  221. package/dist/chat/browser-decision-check.cjs +131 -0
  222. package/dist/chat/browser-decision-check.cjs.map +1 -0
  223. package/dist/chat/browser-decision-check.d.ts +61 -0
  224. package/dist/chat/browser-decision-check.js +131 -0
  225. package/dist/chat/browser-decision-check.js.map +1 -0
  226. package/dist/chat/chat-outbox-rows.cjs +3 -3
  227. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  228. package/dist/chat/chat-voice-controls.cjs +93 -28
  229. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  230. package/dist/chat/chat-voice-controls.d.ts +36 -2
  231. package/dist/chat/chat-voice-controls.js +89 -24
  232. package/dist/chat/chat-voice-controls.js.map +1 -1
  233. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  234. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  235. package/dist/chat/device-operation.cjs +29 -0
  236. package/dist/chat/device-operation.cjs.map +1 -0
  237. package/dist/chat/device-operation.d.ts +34 -0
  238. package/dist/chat/device-operation.js +29 -0
  239. package/dist/chat/device-operation.js.map +1 -0
  240. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  241. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  242. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  243. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  244. package/dist/chat/super-grouping/SuperGroupingCard.cjs +52 -36
  245. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  246. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
  247. package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
  248. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  249. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  250. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  251. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  252. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  253. package/dist/chat/super-grouping/ToolTimeline.cjs +73 -40
  254. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  255. package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
  256. package/dist/chat/super-grouping/ToolTimeline.js +69 -36
  257. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  258. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  259. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  260. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  261. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  262. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  263. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  264. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  265. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  266. package/dist/chat/super-grouping/grouping-function.js +5 -1
  267. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  268. package/dist/chat/super-grouping/index.cjs +6 -0
  269. package/dist/chat/super-grouping/index.cjs.map +1 -1
  270. package/dist/chat/super-grouping/index.d.ts +5 -2
  271. package/dist/chat/super-grouping/index.js +7 -1
  272. package/dist/chat/super-grouping/index.js.map +1 -1
  273. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  274. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  275. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  276. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  277. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  278. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  279. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  280. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  281. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  282. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  283. package/dist/chat/tooltip-icon-button.cjs +2 -2
  284. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  285. package/dist/chat/use-athena-voice-live.cjs +11 -0
  286. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  287. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  288. package/dist/chat/use-athena-voice-live.js +11 -0
  289. package/dist/chat/use-athena-voice-live.js.map +1 -0
  290. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  291. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  292. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  293. package/dist/chat/use-statewire-approval-request.js +41 -9
  294. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  295. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  296. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  297. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  298. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  299. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  300. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  301. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  302. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  303. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  304. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  305. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  306. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  307. package/dist/chat-ui/index.cjs +18 -0
  308. package/dist/chat-ui/index.cjs.map +1 -1
  309. package/dist/chat-ui/index.d.ts +7 -1
  310. package/dist/chat-ui/index.js +18 -0
  311. package/dist/chat-ui/index.js.map +1 -1
  312. package/dist/chat-ui/mentions/mention-chip.cjs +4 -4
  313. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  314. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  315. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  316. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  317. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  318. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  319. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  320. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  321. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  322. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  323. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  324. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  325. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  326. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  327. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  328. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  329. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  330. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  331. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  332. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  333. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  334. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  335. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  336. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  337. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  338. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  339. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  340. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  341. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  342. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  343. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  344. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  345. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  346. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  347. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  348. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  349. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  350. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  351. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  352. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  353. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  354. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  355. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  356. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  357. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  358. package/dist/chat-ui/mentions/use-mention-asset.cjs +3 -3
  359. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
  360. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  361. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  362. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  363. package/dist/chat-ui/messages/answer-label.js +42 -0
  364. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  365. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  366. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  367. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  368. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  369. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  370. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  371. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  372. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  373. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  374. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  375. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  376. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  377. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  378. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  379. package/dist/chat-ui/messages/message-components.cjs +8 -4
  380. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  381. package/dist/chat-ui/messages/message-components.js +5 -1
  382. package/dist/chat-ui/messages/message-components.js.map +1 -1
  383. package/dist/chat-ui/messages/message-images.cjs +66 -0
  384. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  385. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  386. package/dist/chat-ui/messages/message-images.js +66 -0
  387. package/dist/chat-ui/messages/message-images.js.map +1 -0
  388. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  389. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  390. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  391. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  392. package/dist/chat-ui/rich-text/chat-link.cjs +2 -2
  393. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  394. package/dist/chat-ui/rich-text/chat-message-body.cjs +8 -8
  395. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  396. package/dist/chat-ui/rich-text/chat-node-views.cjs +6 -6
  397. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  398. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  399. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  400. package/dist/chat-ui/statewire.cjs +3 -0
  401. package/dist/chat-ui/statewire.cjs.map +1 -1
  402. package/dist/chat-ui/statewire.d.ts +2 -1
  403. package/dist/chat-ui/statewire.js +3 -0
  404. package/dist/chat-ui/statewire.js.map +1 -1
  405. package/dist/chat-ui/thread/chat-thread-shell.cjs +43 -14
  406. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  407. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  408. package/dist/chat-ui/thread/chat-thread-shell.js +35 -6
  409. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  410. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  411. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  412. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  413. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  414. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  415. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  416. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  417. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  418. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  419. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  420. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  421. package/dist/collab/client.cjs +40 -3
  422. package/dist/collab/client.cjs.map +1 -1
  423. package/dist/collab/client.d.ts +25 -0
  424. package/dist/collab/client.js +40 -3
  425. package/dist/collab/client.js.map +1 -1
  426. package/dist/collab/document-status.cjs +150 -0
  427. package/dist/collab/document-status.cjs.map +1 -0
  428. package/dist/collab/document-status.d.ts +68 -0
  429. package/dist/collab/document-status.js +150 -0
  430. package/dist/collab/document-status.js.map +1 -0
  431. package/dist/collab/index.cjs +7 -0
  432. package/dist/collab/index.cjs.map +1 -1
  433. package/dist/collab/index.d.ts +6 -1
  434. package/dist/collab/index.js +7 -0
  435. package/dist/collab/index.js.map +1 -1
  436. package/dist/collab/presence-react.cjs +11 -11
  437. package/dist/collab/presence-react.cjs.map +1 -1
  438. package/dist/collab/react.cjs +6 -6
  439. package/dist/collab/react.cjs.map +1 -1
  440. package/dist/composer/AttachmentContext.cjs +24 -11
  441. package/dist/composer/AttachmentContext.cjs.map +1 -1
  442. package/dist/composer/AttachmentContext.js +18 -5
  443. package/dist/composer/AttachmentContext.js.map +1 -1
  444. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  445. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  446. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  447. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  448. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  449. package/dist/composer/ComposerDropZone.cjs +7 -7
  450. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  451. package/dist/composer/FileUploadButton.cjs +37 -22
  452. package/dist/composer/FileUploadButton.cjs.map +1 -1
  453. package/dist/composer/FileUploadButton.d.ts +6 -0
  454. package/dist/composer/FileUploadButton.js +34 -19
  455. package/dist/composer/FileUploadButton.js.map +1 -1
  456. package/dist/composer/QuoteContext.cjs +8 -8
  457. package/dist/composer/QuoteContext.cjs.map +1 -1
  458. package/dist/composer/composer-handoff.cjs +4 -4
  459. package/dist/composer/composer-handoff.cjs.map +1 -1
  460. package/dist/composer/useAppendToComposer.cjs +4 -4
  461. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  462. package/dist/composer/useAttachFiles.cjs +23 -6
  463. package/dist/composer/useAttachFiles.cjs.map +1 -1
  464. package/dist/composer/useAttachFiles.d.ts +15 -7
  465. package/dist/composer/useAttachFiles.js +22 -5
  466. package/dist/composer/useAttachFiles.js.map +1 -1
  467. package/dist/composer/useComposerAttachment.cjs +4 -4
  468. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  469. package/dist/composer/useFileUpload.cjs +21 -16
  470. package/dist/composer/useFileUpload.cjs.map +1 -1
  471. package/dist/composer/useFileUpload.d.ts +12 -0
  472. package/dist/composer/useFileUpload.js +12 -7
  473. package/dist/composer/useFileUpload.js.map +1 -1
  474. package/dist/composer/useReadComposerDraft.cjs +2 -2
  475. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  476. package/dist/composer/useSendMessage.cjs +4 -4
  477. package/dist/composer/useSendMessage.cjs.map +1 -1
  478. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  479. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  480. package/dist/dictation/audio-level-history.cjs +3 -3
  481. package/dist/dictation/audio-level-history.cjs.map +1 -1
  482. package/dist/dictation/dictation-controls.cjs +24 -20
  483. package/dist/dictation/dictation-controls.cjs.map +1 -1
  484. package/dist/dictation/dictation-controls.d.ts +6 -1
  485. package/dist/dictation/dictation-controls.js +24 -20
  486. package/dist/dictation/dictation-controls.js.map +1 -1
  487. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  488. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  489. package/dist/dictation/use-dictation.cjs +22 -22
  490. package/dist/dictation/use-dictation.cjs.map +1 -1
  491. package/dist/index.cjs +26 -2
  492. package/dist/index.cjs.map +1 -1
  493. package/dist/index.d.ts +15 -3
  494. package/dist/index.js +26 -2
  495. package/dist/index.js.map +1 -1
  496. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  497. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  498. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  499. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  500. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  501. package/dist/keryx-http/src/update-attributions.cjs +111 -0
  502. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  503. package/dist/keryx-http/src/update-attributions.d.ts +75 -0
  504. package/dist/keryx-http/src/update-attributions.js +111 -0
  505. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  506. package/dist/lib/owner-document.cjs +6 -6
  507. package/dist/lib/owner-document.cjs.map +1 -1
  508. package/dist/lib/use-athena-rest-query.cjs +4 -4
  509. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  510. package/dist/lib/use-document-active.cjs +4 -4
  511. package/dist/lib/use-document-active.cjs.map +1 -1
  512. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  513. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  514. package/dist/offline/offline-history.cjs +7 -7
  515. package/dist/offline/offline-history.cjs.map +1 -1
  516. package/dist/provider/AthenaContext.cjs +3 -3
  517. package/dist/provider/AthenaContext.cjs.map +1 -1
  518. package/dist/provider/AthenaProvider.cjs +116 -79
  519. package/dist/provider/AthenaProvider.cjs.map +1 -1
  520. package/dist/provider/AthenaProvider.js +40 -3
  521. package/dist/provider/AthenaProvider.js.map +1 -1
  522. package/dist/provider/PostHogProvider.cjs +2 -2
  523. package/dist/provider/PostHogProvider.cjs.map +1 -1
  524. package/dist/provider/agent-selection-context.cjs +2 -2
  525. package/dist/provider/agent-selection-context.cjs.map +1 -1
  526. package/dist/provider/chat-mode-context.cjs +2 -2
  527. package/dist/provider/chat-mode-context.cjs.map +1 -1
  528. package/dist/provider/session-persistence-context.cjs +10 -0
  529. package/dist/provider/session-persistence-context.cjs.map +1 -0
  530. package/dist/provider/session-persistence-context.d.ts +15 -0
  531. package/dist/provider/session-persistence-context.js +10 -0
  532. package/dist/provider/session-persistence-context.js.map +1 -0
  533. package/dist/provider/statewire-history-context.cjs +4 -4
  534. package/dist/provider/statewire-history-context.cjs.map +1 -1
  535. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  536. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  537. package/dist/provider/statewire-window-context.cjs +3 -3
  538. package/dist/provider/statewire-window-context.cjs.map +1 -1
  539. package/dist/provider/theme-style-context.cjs +3 -3
  540. package/dist/provider/theme-style-context.cjs.map +1 -1
  541. package/dist/react/package.json.cjs +1 -1
  542. package/dist/react/package.json.js +1 -1
  543. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  544. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  545. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  546. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  547. package/dist/runtime/auth.cjs +13 -13
  548. package/dist/runtime/auth.cjs.map +1 -1
  549. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  550. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  551. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  552. package/dist/runtime/statewire-lifecycle.js +2 -1
  553. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  554. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  555. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  556. package/dist/runtime/statewire-session-lane.cjs +4 -4
  557. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  558. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  559. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  560. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  561. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  562. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  563. package/dist/styles.css +1 -1
  564. package/dist/threads/Inbox.cjs +8 -8
  565. package/dist/threads/Inbox.cjs.map +1 -1
  566. package/dist/threads/SessionList.cjs +9 -9
  567. package/dist/threads/SessionList.cjs.map +1 -1
  568. package/dist/threads/SessionsPage.cjs +11 -11
  569. package/dist/threads/SessionsPage.cjs.map +1 -1
  570. package/dist/threads/index-triggered-refresh.cjs +10 -10
  571. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  572. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  573. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  574. package/dist/threads/offline-session-list.cjs +3 -3
  575. package/dist/threads/offline-session-list.cjs.map +1 -1
  576. package/dist/threads/session-list-tab-share.cjs +5 -5
  577. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  578. package/dist/threads/statewire-thread-list.cjs +51 -51
  579. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  580. package/dist/threads/thread-id-context.cjs +5 -5
  581. package/dist/threads/thread-id-context.cjs.map +1 -1
  582. package/dist/threads/use-athena-session-attention.cjs +2 -2
  583. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  584. package/dist/threads/use-athena-sessions.cjs +10 -10
  585. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  586. package/dist/threads/use-athena-thread-model.cjs +3 -3
  587. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  588. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  589. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  590. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  591. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  592. package/dist/threads/use-thread-archive.cjs +9 -9
  593. package/dist/threads/use-thread-archive.cjs.map +1 -1
  594. package/dist/threads/use-thread-favorite.cjs +2 -2
  595. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  596. package/dist/threads/use-thread-field-override.cjs +20 -20
  597. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  598. package/dist/threads/use-thread-read-state.cjs +4 -4
  599. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  600. package/dist/threads/use-thread-rename.cjs +2 -2
  601. package/dist/threads/use-thread-rename.cjs.map +1 -1
  602. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  603. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  604. package/dist/tools/NestedPtcMessages.cjs +6 -6
  605. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  606. package/dist/tools/append-document-tool-ui.cjs +7 -7
  607. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  608. package/dist/tools/file-tool-uis.cjs +2 -2
  609. package/dist/tools/file-tool-uis.cjs.map +1 -1
  610. package/dist/tools/misc-tool-uis.cjs +2 -2
  611. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  612. package/dist/tools/primitives.cjs +6 -6
  613. package/dist/tools/primitives.cjs.map +1 -1
  614. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  615. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  616. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  617. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  618. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  619. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  620. package/dist/tools/todo-plan-store.cjs +4 -4
  621. package/dist/tools/todo-plan-store.cjs.map +1 -1
  622. package/dist/tools/tool-appearance.cjs +3 -3
  623. package/dist/tools/tool-appearance.cjs.map +1 -1
  624. package/dist/tools/tool-fallback.cjs +14 -14
  625. package/dist/tools/tool-fallback.cjs.map +1 -1
  626. package/dist/tools/tool-uis.cjs +74 -74
  627. package/dist/tools/tool-uis.cjs.map +1 -1
  628. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  629. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  630. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  631. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  632. package/dist/ui/image-viewer.cjs +382 -0
  633. package/dist/ui/image-viewer.cjs.map +1 -0
  634. package/dist/ui/image-viewer.d.ts +50 -0
  635. package/dist/ui/image-viewer.js +382 -0
  636. package/dist/ui/image-viewer.js.map +1 -0
  637. package/dist/voice/chat.cjs +6 -0
  638. package/dist/voice/chat.cjs.map +1 -1
  639. package/dist/voice/chat.d.ts +1 -1
  640. package/dist/voice/chat.js +8 -2
  641. package/dist/voice/livekit-join.cjs +52 -101
  642. package/dist/voice/livekit-join.cjs.map +1 -1
  643. package/dist/voice/livekit-join.d.ts +1 -6
  644. package/dist/voice/livekit-join.js +52 -101
  645. package/dist/voice/livekit-join.js.map +1 -1
  646. package/dist/voice/livekit.cjs.map +1 -1
  647. package/dist/voice/livekit.d.ts +11 -1
  648. package/dist/voice/livekit.js.map +1 -1
  649. package/dist/voice/use-athena-voice-session.cjs +34 -34
  650. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  651. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  652. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  653. package/dist/workbench/SessionWorkbench.cjs +22 -22
  654. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  655. package/dist/workbench/session-workbench-context.cjs +3 -3
  656. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  657. package/dist/workbench/session-workbench-panes.cjs +8 -8
  658. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  659. package/dist/workbench/workbench-layout-context.cjs +3 -3
  660. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  661. package/package.json +2 -1
@@ -0,0 +1,137 @@
1
+ import { getExternalStoreMessages } from "@assistant-ui/core";
2
+ const ATHENA_ANSWERED_BY_KEY = "answered_by";
3
+ const ATHENA_ASSISTANT_NAME = "Athena";
4
+ const ASSISTANT_AGENT_PREFIX = "assistant:";
5
+ const PERSON_PRINCIPAL_PREFIX = "user_";
6
+ const UNNAMED_AGENT_NAME = "Agent";
7
+ const LABEL_SEPARATOR = " · ";
8
+ const NO_ANSWERS = Object.freeze([]);
9
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
10
+ const optionalId = (value) => typeof value === "string" && value.length > 0 ? value : null;
11
+ const optionalName = (value) => {
12
+ if (typeof value !== "string") return null;
13
+ const trimmed = value.trim();
14
+ return trimmed.length > 0 ? trimmed : null;
15
+ };
16
+ function readAnsweredBy(value) {
17
+ if (!isRecord(value)) return null;
18
+ const agent = optionalId(value.agent);
19
+ if (agent === null) return null;
20
+ return {
21
+ agent,
22
+ agent_name: optionalName(value.agent_name),
23
+ for_id: optionalId(value.for_id),
24
+ for_name: optionalName(value.for_name)
25
+ };
26
+ }
27
+ const ANSWER_ROW_RUN_ID_PREFIX = "answered_by:";
28
+ function answerRowRunId(agent, forId) {
29
+ return `${ANSWER_ROW_RUN_ID_PREFIX}${agent}|${forId ?? ""}`;
30
+ }
31
+ function isSplitAnswerRow(message) {
32
+ var _a;
33
+ const runId = message.role === "assistant" ? (_a = message.metadata) == null ? void 0 : _a.runId : void 0;
34
+ return typeof runId === "string" && runId.startsWith(ANSWER_ROW_RUN_ID_PREFIX);
35
+ }
36
+ const isSameAnswerer = (a, b) => a.agent === b.agent && a.for_id === b.for_id;
37
+ const isPersonPrincipal = (id) => id !== null && id.startsWith(PERSON_PRINCIPAL_PREFIX);
38
+ function readLangChainAnswer(source) {
39
+ var _a;
40
+ if ((source == null ? void 0 : source.type) !== "ai") return null;
41
+ const bag = (_a = source.additional_kwargs) == null ? void 0 : _a.metadata;
42
+ return isRecord(bag) ? readAnsweredBy(bag[ATHENA_ANSWERED_BY_KEY]) : null;
43
+ }
44
+ function collectMessageAnswers(message) {
45
+ var _a, _b;
46
+ if (message.role !== "assistant") return NO_ANSWERS;
47
+ const sources = getExternalStoreMessages(message);
48
+ if (sources.length === 0) {
49
+ const joined = readAnsweredBy((_b = (_a = message.metadata) == null ? void 0 : _a.custom) == null ? void 0 : _b[ATHENA_ANSWERED_BY_KEY]);
50
+ return joined === null ? NO_ANSWERS : [joined];
51
+ }
52
+ let answers = null;
53
+ for (const source of sources) {
54
+ const answer = readLangChainAnswer(source);
55
+ if (answer === null || (answers == null ? void 0 : answers.some((seen) => isSameAnswerer(seen, answer)))) continue;
56
+ answers ?? (answers = []);
57
+ answers.push(answer);
58
+ }
59
+ return answers ?? NO_ANSWERS;
60
+ }
61
+ const answersByMessage = /* @__PURE__ */ new WeakMap();
62
+ function readMessageAnswers(message) {
63
+ const cached = answersByMessage.get(message);
64
+ if (cached !== void 0) return cached;
65
+ const answers = collectMessageAnswers(message);
66
+ answersByMessage.set(message, answers);
67
+ return answers;
68
+ }
69
+ function threadShowsAnswerLabels(messages) {
70
+ let first = null;
71
+ for (const message of messages) {
72
+ if (isSplitAnswerRow(message)) return true;
73
+ for (const answer of readMessageAnswers(message)) {
74
+ if (first === null) {
75
+ first = answer;
76
+ } else if (!isSameAnswerer(first, answer)) {
77
+ return true;
78
+ }
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+ function showsAnswerLabel({
84
+ answers,
85
+ threadShowsLabels,
86
+ viewerId
87
+ }) {
88
+ if (answers.length === 0) return false;
89
+ if (threadShowsLabels) return true;
90
+ return viewerId !== null && answers.some((answer) => isPersonPrincipal(answer.for_id) && answer.for_id !== viewerId);
91
+ }
92
+ function answererName(answer) {
93
+ if (answer.agent_name !== null) return answer.agent_name;
94
+ return answer.agent.startsWith(ASSISTANT_AGENT_PREFIX) ? ATHENA_ASSISTANT_NAME : UNNAMED_AGENT_NAME;
95
+ }
96
+ function forWhomName(answer, viewerId) {
97
+ if (answer.for_id !== null && answer.for_id === viewerId) return "you";
98
+ if (answer.for_name !== null && isPersonPrincipal(answer.for_id)) return answer.for_name;
99
+ return null;
100
+ }
101
+ function joinNames(names) {
102
+ if (names.length <= 1) return names[0] ?? "";
103
+ return `${names.slice(0, -1).join(", ")} and ${names[names.length - 1]}`;
104
+ }
105
+ function answerLabelText({
106
+ answers,
107
+ viewerId
108
+ }) {
109
+ if (answers.length === 0) return null;
110
+ const groups = [];
111
+ for (const answer of answers) {
112
+ const name = answererName(answer);
113
+ const forWhom = forWhomName(answer, viewerId);
114
+ const group = groups.find((candidate) => candidate.forId === answer.for_id);
115
+ if (group === void 0) {
116
+ groups.push({ forId: answer.for_id, names: [name], forWhom });
117
+ continue;
118
+ }
119
+ if (!group.names.includes(name)) group.names.push(name);
120
+ group.forWhom ?? (group.forWhom = forWhom);
121
+ }
122
+ return groups.map(
123
+ ({ names, forWhom }) => forWhom === null ? joinNames(names) : `${joinNames(names)}${LABEL_SEPARATOR}for ${forWhom}`
124
+ ).join(", ");
125
+ }
126
+ export {
127
+ ATHENA_ANSWERED_BY_KEY,
128
+ ATHENA_ASSISTANT_NAME,
129
+ answerLabelText,
130
+ answerRowRunId,
131
+ readAnsweredBy,
132
+ readLangChainAnswer,
133
+ readMessageAnswers,
134
+ showsAnswerLabel,
135
+ threadShowsAnswerLabels
136
+ };
137
+ //# sourceMappingURL=answer-label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-label.js","sources":["../../../../agent-runtime/src/answer-label.ts"],"sourcesContent":["import { getExternalStoreMessages, type ThreadMessage } from '@assistant-ui/core';\nimport type { LangChainMessage } from '@assistant-ui/react-langgraph';\n\n/**\n * `metadata.custom` key naming the agent that answered an AI message and whom\n * its run worked for (identity v7 D13: \"each answer is labelled with its\n * agent, 'for <author>'\").\n *\n * The backend stamps it on every answer a deep-agent run's model produces\n * (`agora/.../conversation_agents/answer_label.py`), under the\n * `additional_kwargs.metadata` bag the converter exposes as\n * `message.metadata.custom`, and mirrors it onto the live wire once the\n * model's turn lands. Only the server writes it. Answers written before the\n * stamp existed carry none, and get no label.\n */\nexport const ATHENA_ANSWERED_BY_KEY = 'answered_by';\n\n/** The agent that answered and whom its run worked for, as the backend stamps them. */\nexport interface DeepAgentAnsweredBy {\n /** `collab_agent:<asset id>` for a team agent, `assistant:<principal id>` for someone's own assistant. */\n agent: string;\n /** The collab agent's name when it answered; `null` for an assistant, which clients name. */\n agent_name: string | null;\n /** Whom the run worked for: a person (`user_…`), an agent's or automation's own run, or nobody (`null`). */\n for_id: string | null;\n /** That person's display name when it answered, else `null`. */\n for_name: string | null;\n}\n\n/** What a label calls someone's own assistant: the managed default agent's product name. */\nexport const ATHENA_ASSISTANT_NAME = 'Athena';\n\nconst ASSISTANT_AGENT_PREFIX = 'assistant:';\nconst PERSON_PRINCIPAL_PREFIX = 'user_';\nconst UNNAMED_AGENT_NAME = 'Agent';\nconst LABEL_SEPARATOR = ' · ';\nconst NO_ANSWERS: readonly DeepAgentAnsweredBy[] = Object.freeze([]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst optionalId = (value: unknown): string | null =>\n typeof value === 'string' && value.length > 0 ? value : null;\n\nconst optionalName = (value: unknown): string | null => {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n};\n\n/**\n * Parse an `answered_by` stamp off a wire value.\n *\n * A stamp without a string `agent` is no stamp at all; absent or malformed\n * optional fields read as `null`, so a partly malformed stamp still names its\n * agent and never names a person it can't.\n */\nexport function readAnsweredBy(value: unknown): DeepAgentAnsweredBy | null {\n if (!isRecord(value)) return null;\n const agent = optionalId(value.agent);\n if (agent === null) return null;\n return {\n agent,\n agent_name: optionalName(value.agent_name),\n for_id: optionalId(value.for_id),\n for_name: optionalName(value.for_name),\n };\n}\n\n/**\n * The run id an answer's row carries when the deep-agent conversion split a\n * turn several answerers wrote into one row per answerer (`answer-rows.ts`):\n * one per agent and principal.\n */\nconst ANSWER_ROW_RUN_ID_PREFIX = 'answered_by:';\n\n/** The row run id of an answer by `agent` for `forId` (see `withAnswerRows`). */\nexport function answerRowRunId(agent: string, forId: string | null): string {\n return `${ANSWER_ROW_RUN_ID_PREFIX}${agent}|${forId ?? ''}`;\n}\n\n/**\n * Whether a converted row is one of a turn the conversion split by answerer.\n * Reads `metadata` optionally, as `collectMessageAnswers` does: a message\n * another runtime (or a test) builds may carry none.\n */\nfunction isSplitAnswerRow(message: ThreadMessage): boolean {\n const runId = message.role === 'assistant' ? message.metadata?.runId : undefined;\n return typeof runId === 'string' && runId.startsWith(ANSWER_ROW_RUN_ID_PREFIX);\n}\n\nconst isSameAnswerer = (a: DeepAgentAnsweredBy, b: DeepAgentAnsweredBy): boolean =>\n a.agent === b.agent && a.for_id === b.for_id;\n\nconst isPersonPrincipal = (id: string | null): id is string =>\n id !== null && id.startsWith(PERSON_PRINCIPAL_PREFIX);\n\n/** The `answered_by` stamp an AI message as the wire carries it holds; `null` for any other message. */\nexport function readLangChainAnswer(\n source: LangChainMessage | undefined\n): DeepAgentAnsweredBy | null {\n if (source?.type !== 'ai') return null;\n const bag = source.additional_kwargs?.metadata;\n return isRecord(bag) ? readAnsweredBy(bag[ATHENA_ANSWERED_BY_KEY]) : null;\n}\n\nfunction collectMessageAnswers(message: ThreadMessage): readonly DeepAgentAnsweredBy[] {\n if (message.role !== 'assistant') return NO_ANSWERS;\n const sources = getExternalStoreMessages<LangChainMessage>(message);\n if (sources.length === 0) {\n const joined = readAnsweredBy(message.metadata?.custom?.[ATHENA_ANSWERED_BY_KEY]);\n return joined === null ? NO_ANSWERS : [joined];\n }\n let answers: DeepAgentAnsweredBy[] | null = null;\n for (const source of sources) {\n const answer = readLangChainAnswer(source);\n if (answer === null || answers?.some((seen) => isSameAnswerer(seen, answer))) continue;\n answers ??= [];\n answers.push(answer);\n }\n return answers ?? NO_ANSWERS;\n}\n\nconst answersByMessage = new WeakMap<ThreadMessage, readonly DeepAgentAnsweredBy[]>();\n\n/**\n * The answers one thread message holds: each agent that answered in it and\n * whom it worked for, in the order they answered, one entry per agent and\n * principal.\n *\n * Read off the message's bound source messages, not its joined\n * `metadata.custom`: assistant-ui joins consecutive AI messages into one\n * turn, and its joined metadata keeps only the last stamp. The deep-agent\n * conversion gives each agent that answers one message in turn (D13 several\n * agents, one message) a row of its own (`answer-rows.ts`), so a row\n * normally holds one answer; a conversion without that split (another\n * pipeline, a stamp that never landed) still names every agent of the row.\n * A message with no bound sources (another runtime) falls back to the joined\n * value. Cached per message object: a settled message keeps its object\n * across a streamed token, so a thread-wide scan per token reads only the\n * message that changed.\n */\nexport function readMessageAnswers(message: ThreadMessage): readonly DeepAgentAnsweredBy[] {\n const cached = answersByMessage.get(message);\n if (cached !== undefined) return cached;\n const answers = collectMessageAnswers(message);\n answersByMessage.set(message, answers);\n return answers;\n}\n\n/**\n * The thread-wide half of the label decision: whether the transcript's\n * answers name two or more agents, or two or more principals they worked\n * for. Then every answer is labelled; a 1:1 chat with one agent working for\n * one person looks as it did before labels. Unstamped answers count for\n * nothing.\n *\n * It decides over the messages the client holds (on a windowed wire, the\n * pages loaded so far), as the human-author avatars do: a page of older\n * history that brings another agent or person turns the labels on. Each\n * label still names its own answer's stamp, so loading history never changes\n * what an answer is attributed to, only whether the line shows.\n *\n * A turn the conversion split into one row per answerer turns the labels on\n * too, before the next agent's stamp lands: while several agents answer one\n * message, the host's record already says a second agent is answering, so\n * the first agent's answer is labelled from the moment the second one's row\n * appears.\n */\nexport function threadShowsAnswerLabels(messages: readonly ThreadMessage[]): boolean {\n let first: DeepAgentAnsweredBy | null = null;\n for (const message of messages) {\n if (isSplitAnswerRow(message)) return true;\n for (const answer of readMessageAnswers(message)) {\n if (first === null) {\n first = answer;\n } else if (!isSameAnswerer(first, answer)) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Whether a message's answers are labelled: always once the thread's answers\n * name several agents or principals (`threadShowsLabels`), and otherwise when\n * one of them worked for a person other than the viewer. Without a known\n * viewer that last rule is off, so a 1:1 chat never flashes labels while the\n * viewer loads.\n */\nexport function showsAnswerLabel({\n answers,\n threadShowsLabels,\n viewerId,\n}: {\n answers: readonly DeepAgentAnsweredBy[];\n threadShowsLabels: boolean;\n viewerId: string | null;\n}): boolean {\n if (answers.length === 0) return false;\n if (threadShowsLabels) return true;\n return (\n viewerId !== null &&\n answers.some((answer) => isPersonPrincipal(answer.for_id) && answer.for_id !== viewerId)\n );\n}\n\nfunction answererName(answer: DeepAgentAnsweredBy): string {\n if (answer.agent_name !== null) return answer.agent_name;\n return answer.agent.startsWith(ASSISTANT_AGENT_PREFIX)\n ? ATHENA_ASSISTANT_NAME\n : UNNAMED_AGENT_NAME;\n}\n\nfunction forWhomName(answer: DeepAgentAnsweredBy, viewerId: string | null): string | null {\n if (answer.for_id !== null && answer.for_id === viewerId) return 'you';\n if (answer.for_name !== null && isPersonPrincipal(answer.for_id)) return answer.for_name;\n return null;\n}\n\nfunction joinNames(names: readonly string[]): string {\n if (names.length <= 1) return names[0] ?? '';\n return `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`;\n}\n\n/**\n * The label's words: who answered, then whom for. \"Finance · for you\",\n * \"Athena · for Priya Shah\", \"Finance\" (a run that worked for nobody, or for\n * an agent's own run). The agent is the collab agent's name, else\n * {@link ATHENA_ASSISTANT_NAME} for someone's own assistant, else \"Agent\".\n * Several agents answering for the same principal read \"Finance and Legal ·\n * for you\"; answers for different principals are listed apart, even when the\n * people share a name (\"Finance · for Alex, Legal · for Alex\"). `null` when\n * the message holds no answers.\n */\nexport function answerLabelText({\n answers,\n viewerId,\n}: {\n answers: readonly DeepAgentAnsweredBy[];\n viewerId: string | null;\n}): string | null {\n if (answers.length === 0) return null;\n // One group per principal (nobody is one too), never per displayed name: two\n // people who share a name stay two recipients.\n const groups: { forId: string | null; names: string[]; forWhom: string | null }[] = [];\n for (const answer of answers) {\n const name = answererName(answer);\n const forWhom = forWhomName(answer, viewerId);\n const group = groups.find((candidate) => candidate.forId === answer.for_id);\n if (group === undefined) {\n groups.push({ forId: answer.for_id, names: [name], forWhom });\n continue;\n }\n if (!group.names.includes(name)) group.names.push(name);\n // A recipient one answer left unnamed takes the name a later answer for\n // the same principal carries. The first name found wins: answers stamped\n // under two names for one id (a rename between runs) read as the first.\n group.forWhom ??= forWhom;\n }\n return groups\n .map(({ names, forWhom }) =>\n forWhom === null ? joinNames(names) : `${joinNames(names)}${LABEL_SEPARATOR}for ${forWhom}`\n )\n .join(', ');\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const answerLabel = require("./answer-label.cjs");
4
+ const ADDRESSED_TURN_STATE_KEY = "addressedTurn";
5
+ const ADDRESSED_TURN_RECORD_VERSION = 1;
6
+ const MAX_ADDRESSED_AGENTS = 8;
7
+ const AGENT_KEY_PATTERN = /^(collab_agent|assistant):\S+$/;
8
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
9
+ const isAgentKey = (value) => typeof value === "string" && AGENT_KEY_PATTERN.test(value);
10
+ function readOutcome(value) {
11
+ if (!isRecord(value)) return null;
12
+ const { outcome } = value;
13
+ return {
14
+ agent: String(value.agent),
15
+ outcome: outcome === "answered" || outcome === "refused" ? outcome : "failed",
16
+ code: typeof value.code === "string" && value.code.length > 0 ? value.code : null
17
+ };
18
+ }
19
+ function readDeepAgentAddressedTurn(value) {
20
+ if (!isRecord(value) || value.v !== ADDRESSED_TURN_RECORD_VERSION) return null;
21
+ const { author, author_id: authorId, agents, position, anchor, outcomes, started } = value;
22
+ if (typeof author !== "string" || author.length === 0) return null;
23
+ if (typeof authorId !== "string" || authorId.length === 0) return null;
24
+ if (started !== void 0 && typeof started !== "boolean") return null;
25
+ if (!Array.isArray(agents) || agents.length < 2 || agents.length > MAX_ADDRESSED_AGENTS || !agents.every(isAgentKey)) {
26
+ return null;
27
+ }
28
+ if (typeof position !== "number" || !Number.isInteger(position)) return null;
29
+ if (position < 0 || position >= agents.length) return null;
30
+ if (anchor !== null && anchor !== void 0 && (typeof anchor !== "string" || !anchor)) {
31
+ return null;
32
+ }
33
+ if (!Array.isArray(outcomes)) return null;
34
+ const finished = outcomes.map(readOutcome);
35
+ if (finished.some((outcome) => outcome === null)) return null;
36
+ return {
37
+ authorId,
38
+ agents,
39
+ position,
40
+ anchor: anchor ?? null,
41
+ outcomes: finished.filter((outcome) => outcome !== null)
42
+ };
43
+ }
44
+ const ANSWER_ROW_KEY = Symbol.for("@athenaintel/agent-runtime/answer-row");
45
+ function readAnswerRowKey(message) {
46
+ const key = Reflect.get(message, ANSWER_ROW_KEY);
47
+ return typeof key === "string" ? key : void 0;
48
+ }
49
+ const keyedMessages = /* @__PURE__ */ new WeakMap();
50
+ function withAnswerRowKey(message, key) {
51
+ const cached = keyedMessages.get(message);
52
+ if ((cached == null ? void 0 : cached.key) === key) return cached.message;
53
+ const keyed = { ...message };
54
+ Reflect.set(keyed, ANSWER_ROW_KEY, key);
55
+ keyedMessages.set(message, { key, message: keyed });
56
+ return keyed;
57
+ }
58
+ const stampKeys = /* @__PURE__ */ new WeakMap();
59
+ function stampedAnswererKey(message) {
60
+ const cached = stampKeys.get(message);
61
+ if (cached !== void 0) return cached;
62
+ const answer = answerLabel.readLangChainAnswer(message);
63
+ const key = answer === null ? null : answerLabel.answerRowRunId(answer.agent, answer.for_id);
64
+ stampKeys.set(message, key);
65
+ return key;
66
+ }
67
+ const NEXT_AGENT_PENDING_MESSAGE_ID = "__athena_deep_agent_pending_next_agent__";
68
+ const nextAgentPlaceholders = /* @__PURE__ */ new Map();
69
+ function nextAgentPlaceholder(key) {
70
+ const cached = nextAgentPlaceholders.get(key);
71
+ if (cached !== void 0) return cached;
72
+ const placeholder = {
73
+ type: "ai",
74
+ content: [],
75
+ id: NEXT_AGENT_PENDING_MESSAGE_ID,
76
+ status: { type: "running" }
77
+ };
78
+ Reflect.set(placeholder, ANSWER_ROW_KEY, key);
79
+ Object.freeze(placeholder);
80
+ if (nextAgentPlaceholders.size >= 64) nextAgentPlaceholders.clear();
81
+ nextAgentPlaceholders.set(key, placeholder);
82
+ return placeholder;
83
+ }
84
+ const isTurnBoundary = (message) => message.type === "human" || message.type === "system";
85
+ function answeringAgent({
86
+ messages,
87
+ addressedTurn
88
+ }) {
89
+ if (addressedTurn === null || addressedTurn.position === 0 || addressedTurn.anchor === null) {
90
+ return null;
91
+ }
92
+ const agent = addressedTurn.agents[addressedTurn.position];
93
+ if (agent === void 0) return null;
94
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
95
+ const message = messages[index];
96
+ if (message === void 0) continue;
97
+ if (message.id === addressedTurn.anchor) {
98
+ return { key: answerLabel.answerRowRunId(agent, addressedTurn.authorId), anchorIndex: index };
99
+ }
100
+ if (isTurnBoundary(message)) return null;
101
+ }
102
+ return null;
103
+ }
104
+ function turnKeys({
105
+ messages,
106
+ start,
107
+ end,
108
+ answering
109
+ }) {
110
+ var _a, _b;
111
+ const keys = [];
112
+ let first = null;
113
+ let several = false;
114
+ let answeringStamp = null;
115
+ for (let index = start; index < end; index += 1) {
116
+ const message = messages[index];
117
+ if ((message == null ? void 0 : message.type) !== "ai") {
118
+ keys.push(null);
119
+ continue;
120
+ }
121
+ const answeringKey = answering !== null && index > answering.anchorIndex ? answering.key : null;
122
+ let key = stampedAnswererKey(message);
123
+ if (key !== null && answeringKey !== null) answeringStamp = key;
124
+ else if (key === null && answeringKey !== null) key = answeringStamp ?? answeringKey;
125
+ keys.push(key);
126
+ if (key === null) continue;
127
+ if (first === null) first = key;
128
+ else if (key !== first) several = true;
129
+ }
130
+ if (!several) return null;
131
+ let previous = null;
132
+ for (let offset = 0; offset < keys.length; offset += 1) {
133
+ if (((_a = messages[start + offset]) == null ? void 0 : _a.type) !== "ai") continue;
134
+ const key = keys[offset] ?? null;
135
+ if (key === null) keys[offset] = previous;
136
+ else previous = key;
137
+ }
138
+ let next = null;
139
+ for (let offset = keys.length - 1; offset >= 0; offset -= 1) {
140
+ if (((_b = messages[start + offset]) == null ? void 0 : _b.type) !== "ai") continue;
141
+ const key = keys[offset] ?? null;
142
+ if (key === null) keys[offset] = next;
143
+ else next = key;
144
+ }
145
+ return keys;
146
+ }
147
+ function withAnswerRows({
148
+ messages,
149
+ addressedTurn,
150
+ isRunning
151
+ }) {
152
+ const answering = answeringAgent({ messages, addressedTurn });
153
+ const pending = answering !== null && isRunning && !messages.slice(answering.anchorIndex + 1).some((message) => message.type === "ai");
154
+ const sources = pending ? [...messages, nextAgentPlaceholder(answering.key)] : messages;
155
+ let keyed = null;
156
+ let start = 0;
157
+ for (let index = 0; index <= sources.length; index += 1) {
158
+ const message = sources[index];
159
+ if (message !== void 0 && !isTurnBoundary(message)) continue;
160
+ if (index - start > 1) {
161
+ const keys = turnKeys({ messages: sources, start, end: index, answering });
162
+ if (keys !== null) {
163
+ for (const [offset, key] of keys.entries()) {
164
+ const source = sources[start + offset];
165
+ if (key === null || source === void 0 || readAnswerRowKey(source) === key) continue;
166
+ keyed ?? (keyed = [...sources]);
167
+ keyed[start + offset] = withAnswerRowKey(source, key);
168
+ }
169
+ }
170
+ }
171
+ start = index + 1;
172
+ }
173
+ return keyed ?? sources;
174
+ }
175
+ exports.ADDRESSED_TURN_STATE_KEY = ADDRESSED_TURN_STATE_KEY;
176
+ exports.NEXT_AGENT_PENDING_MESSAGE_ID = NEXT_AGENT_PENDING_MESSAGE_ID;
177
+ exports.readAnswerRowKey = readAnswerRowKey;
178
+ exports.readDeepAgentAddressedTurn = readDeepAgentAddressedTurn;
179
+ exports.withAnswerRows = withAnswerRows;
180
+ //# sourceMappingURL=answer-rows.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-rows.cjs","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":["readLangChainAnswer","answerRowRunId"],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { LangChainMessage } from '@assistant-ui/react-langgraph';
2
+ /**
3
+ * One row per answering agent (identity v7 D13: several agents answer one
4
+ * message, each in its own turn for its author).
5
+ *
6
+ * assistant-ui joins consecutive assistant messages into one row unless their
7
+ * `metadata.runId` differs (`chunkExternalMessages` in `@assistant-ui/core`).
8
+ * The agents that answer one message answer in turn, with nothing between
9
+ * them, so without a run id per answer every agent's answer lands in one row.
10
+ * This module gives each AI message the answerer it belongs to, which the
11
+ * converter turns into `metadata.runId` (`convertDeepAgentLangChainMessage`):
12
+ *
13
+ * - a stamped answer: its `answered_by` stamp (agent and principal), written by
14
+ * agora when its model turn lands;
15
+ * - an answer still streaming while several agents answer: the agent the
16
+ * host's record says is answering (`addressedTurn`, replicated statewire
17
+ * state), for every message after the message its turn began after. The
18
+ * stamp lands only once a model turn finishes, so reading the record is what
19
+ * keeps a next agent's answer in its own row from its first token instead of
20
+ * joining the previous agent's row and jumping out when its stamp lands;
21
+ * - anything else (an answer written before the stamp existed, a reused one,
22
+ * a run marker): the answerer of the AI message before it in the same turn,
23
+ * else of the first one after it.
24
+ *
25
+ * Only a turn (the messages between two people's messages) whose answers come
26
+ * from two or more answerers is given run ids: a 1:1 chat, a turn one agent
27
+ * answered and every transcript written before the stamp keep their messages'
28
+ * identity and convert exactly as before.
29
+ */
30
+ /** Statewire state key of the message several agents are answering (agora `several_agents.ADDRESSED_TURN_STATE_KEY`). */
31
+ export declare const ADDRESSED_TURN_STATE_KEY = "addressedTurn";
32
+ /** How one agent's turn of a message several agents answer ended. */
33
+ export interface DeepAgentAddressedOutcome {
34
+ /** The agent's key (`collab_agent:<asset id>`, `assistant:<principal id>`). */
35
+ agent: string;
36
+ outcome: 'answered' | 'failed' | 'refused';
37
+ /** A refusal's code (e.g. `conversation_history_recheck_required`); `null` otherwise. */
38
+ code: string | null;
39
+ }
40
+ /** The message several agents are answering, as the host's replicated record holds it. */
41
+ export interface DeepAgentAddressedTurn {
42
+ /** Whom every agent of the message answers for: the author's principal id. */
43
+ authorId: string;
44
+ /** The named agents' keys, in the order they answer. */
45
+ agents: readonly string[];
46
+ /** The index in {@link agents} of the agent answering now. */
47
+ position: number;
48
+ /** The message the answering agent's turn began after; `null` for the first agent. */
49
+ anchor: string | null;
50
+ /** Each finished agent's outcome, in order. */
51
+ outcomes: readonly DeepAgentAddressedOutcome[];
52
+ }
53
+ /**
54
+ * The record of the message several agents are answering, off the replicated
55
+ * state value (`state.addressedTurn`); `null` while none is (agora clears it
56
+ * once the last agent settled) and for anything this reader can't trust,
57
+ * mirroring agora's own `read_record`: another version, a malformed field, an
58
+ * agent key it can't read, a position outside the list.
59
+ */
60
+ export declare function readDeepAgentAddressedTurn(value: unknown): DeepAgentAddressedTurn | null;
61
+ /**
62
+ * The answerer an AI message's row is keyed by, as {@link withAnswerRows} put
63
+ * it on the message; `undefined` for a message it left alone. The converter
64
+ * passes it on as the row's `metadata.runId`.
65
+ */
66
+ export declare function readAnswerRowKey(message: LangChainMessage): string | undefined;
67
+ /** The id of the row a next agent of a message several agents answer shows before its first token. */
68
+ export declare const NEXT_AGENT_PENDING_MESSAGE_ID = "__athena_deep_agent_pending_next_agent__";
69
+ /**
70
+ * The messages with every answer of a turn several agents answered keyed by
71
+ * its answerer (see the module comment), so each agent's answer converts into
72
+ * a row of its own; the same array when no turn needs it.
73
+ *
74
+ * While a next agent is answering (`addressedTurn` past its first agent) and
75
+ * the run is live but the agent hasn't sent its first token, its row shows as
76
+ * pending (a running placeholder, {@link NEXT_AGENT_PENDING_MESSAGE_ID}), as the
77
+ * first agent's does.
78
+ *
79
+ * O(the messages) per pass, with no allocation for a transcript nobody but one
80
+ * answerer per turn wrote.
81
+ */
82
+ export declare function withAnswerRows({ messages, addressedTurn, isRunning, }: {
83
+ messages: LangChainMessage[];
84
+ addressedTurn: DeepAgentAddressedTurn | null;
85
+ isRunning: boolean;
86
+ }): LangChainMessage[];
@@ -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