@athenaintel/react 0.42.2 → 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 (685) hide show
  1. package/README.md +225 -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/conversation-list-groups.d.ts +74 -0
  17. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  18. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  19. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  20. package/dist/agent-runtime/src/decision-checks.js +207 -0
  21. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  22. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  23. package/dist/agent-runtime/src/errors.cjs +18 -0
  24. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  25. package/dist/agent-runtime/src/errors.d.ts +7 -0
  26. package/dist/agent-runtime/src/errors.js +18 -0
  27. package/dist/agent-runtime/src/errors.js.map +1 -1
  28. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  29. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  30. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  31. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  32. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  33. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  34. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  35. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  36. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  37. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  38. package/dist/agent-runtime/src/index.d.ts +15 -8
  39. package/dist/agent-runtime/src/interrupts.cjs +43 -18
  40. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  41. package/dist/agent-runtime/src/interrupts.d.ts +19 -2
  42. package/dist/agent-runtime/src/interrupts.js +28 -3
  43. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  44. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  45. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  46. package/dist/agent-runtime/src/messages.cjs +43 -8
  47. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  48. package/dist/agent-runtime/src/messages.d.ts +25 -3
  49. package/dist/agent-runtime/src/messages.js +43 -8
  50. package/dist/agent-runtime/src/messages.js.map +1 -1
  51. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  52. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  53. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  54. package/dist/agent-runtime/src/offline-status.js +36 -0
  55. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  56. package/dist/agent-runtime/src/queue.cjs +0 -9
  57. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  58. package/dist/agent-runtime/src/queue.js +0 -9
  59. package/dist/agent-runtime/src/queue.js.map +1 -1
  60. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  61. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  62. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  63. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  64. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  65. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  66. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  67. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  68. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  69. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  70. package/dist/agent-runtime/src/runtime.d.ts +40 -0
  71. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  72. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  73. package/dist/agent-runtime/src/subagents.cjs +32 -2
  74. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  75. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  76. package/dist/agent-runtime/src/subagents.js +30 -0
  77. package/dist/agent-runtime/src/subagents.js.map +1 -1
  78. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  79. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  80. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  81. package/dist/agent-runtime/src/thread-driver.js +67 -0
  82. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  83. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  84. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +756 -0
  85. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  86. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  87. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  88. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  89. package/dist/agent-runtime/src/tool-metadata.cjs +210 -33
  90. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  91. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  92. package/dist/agent-runtime/src/tool-metadata.js +210 -33
  93. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  94. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  95. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  96. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  97. package/dist/agent-runtime/src/tool-names.js +2 -0
  98. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  99. package/dist/agent-runtime/src/types.d.ts +10 -2
  100. package/dist/agent-runtime/src/use-conversation-list.cjs +11 -11
  101. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  102. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +24 -19
  103. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  104. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +2 -1
  105. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +6 -1
  106. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  107. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  108. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  109. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  110. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  111. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +16 -16
  112. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  113. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  114. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  115. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +572 -134
  116. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  117. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +137 -10
  118. package/dist/agent-runtime/src/use-deep-agent-voice.js +514 -76
  119. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  120. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  121. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  122. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  123. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  124. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +28 -26
  125. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  126. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  127. package/dist/agent-runtime/src/voice-media.d.ts +49 -0
  128. package/dist/agent-runtime/src/voice-media.js +117 -0
  129. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  130. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  131. package/dist/assets/AssetPanel.cjs +11 -11
  132. package/dist/assets/AssetPanel.cjs.map +1 -1
  133. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  134. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  135. package/dist/assets/AthenaAssetEmbed.d.ts +7 -0
  136. package/dist/assets/AthenaAssetEmbed.js +4 -2
  137. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  138. package/dist/assets/AthenaLayout.cjs +16 -16
  139. package/dist/assets/AthenaLayout.cjs.map +1 -1
  140. package/dist/assets/use-asset-content.cjs +4 -4
  141. package/dist/assets/use-asset-content.cjs.map +1 -1
  142. package/dist/assets/use-asset-embed.cjs +14 -7
  143. package/dist/assets/use-asset-embed.cjs.map +1 -1
  144. package/dist/assets/use-asset-embed.d.ts +11 -1
  145. package/dist/assets/use-asset-embed.js +10 -3
  146. package/dist/assets/use-asset-embed.js.map +1 -1
  147. package/dist/auth/AthenaAuthContext.cjs +3 -3
  148. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  149. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  150. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  151. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  152. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  153. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  154. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  155. package/dist/auth/credential-source.cjs +26 -13
  156. package/dist/auth/credential-source.cjs.map +1 -1
  157. package/dist/auth/credential-source.d.ts +8 -0
  158. package/dist/auth/credential-source.js +26 -13
  159. package/dist/auth/credential-source.js.map +1 -1
  160. package/dist/catalog/agent-model-options.cjs +25 -17
  161. package/dist/catalog/agent-model-options.cjs.map +1 -1
  162. package/dist/catalog/agent-model-options.d.ts +38 -5
  163. package/dist/catalog/agent-model-options.js +25 -17
  164. package/dist/catalog/agent-model-options.js.map +1 -1
  165. package/dist/catalog/channel-refusal.cjs +36 -0
  166. package/dist/catalog/channel-refusal.cjs.map +1 -0
  167. package/dist/catalog/channel-refusal.d.ts +29 -0
  168. package/dist/catalog/channel-refusal.js +36 -0
  169. package/dist/catalog/channel-refusal.js.map +1 -0
  170. package/dist/catalog/chat-pickers.cjs +60 -24
  171. package/dist/catalog/chat-pickers.cjs.map +1 -1
  172. package/dist/catalog/chat-pickers.d.ts +12 -2
  173. package/dist/catalog/chat-pickers.js +56 -20
  174. package/dist/catalog/chat-pickers.js.map +1 -1
  175. package/dist/catalog/runtime-catalog.cjs +89 -23
  176. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  177. package/dist/catalog/runtime-catalog.d.ts +8 -2
  178. package/dist/catalog/runtime-catalog.js +83 -17
  179. package/dist/catalog/runtime-catalog.js.map +1 -1
  180. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  181. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  182. package/dist/chat/AthenaChat.cjs +155 -67
  183. package/dist/chat/AthenaChat.cjs.map +1 -1
  184. package/dist/chat/AthenaChat.d.ts +42 -2
  185. package/dist/chat/AthenaChat.js +106 -18
  186. package/dist/chat/AthenaChat.js.map +1 -1
  187. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  188. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  189. package/dist/chat/DrivingOnChip.cjs +23 -0
  190. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  191. package/dist/chat/DrivingOnChip.d.ts +17 -0
  192. package/dist/chat/DrivingOnChip.js +23 -0
  193. package/dist/chat/DrivingOnChip.js.map +1 -0
  194. package/dist/chat/StatewireApprovalCard.cjs +125 -31
  195. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  196. package/dist/chat/StatewireApprovalCard.d.ts +73 -1
  197. package/dist/chat/StatewireApprovalCard.js +115 -21
  198. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  199. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  200. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  201. package/dist/chat/StatewireQueuedMessages.cjs +25 -63
  202. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  203. package/dist/chat/StatewireQueuedMessages.d.ts +11 -13
  204. package/dist/chat/StatewireQueuedMessages.js +16 -54
  205. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  206. package/dist/chat/WaitingOnYouBanner.cjs +3 -3
  207. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  208. package/dist/chat/athena-chat-welcome.cjs +2 -2
  209. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  210. package/dist/chat/athena-citation-links.cjs +5 -5
  211. package/dist/chat/athena-citation-links.cjs.map +1 -1
  212. package/dist/chat/athena-composer-controls.cjs +26 -16
  213. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  214. package/dist/chat/athena-composer-controls.d.ts +6 -0
  215. package/dist/chat/athena-composer-controls.js +26 -16
  216. package/dist/chat/athena-composer-controls.js.map +1 -1
  217. package/dist/chat/athena-turn-end-status.cjs +42 -0
  218. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  219. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  220. package/dist/chat/athena-turn-end-status.js +42 -0
  221. package/dist/chat/athena-turn-end-status.js.map +1 -0
  222. package/dist/chat/browser-decision-check.cjs +131 -0
  223. package/dist/chat/browser-decision-check.cjs.map +1 -0
  224. package/dist/chat/browser-decision-check.d.ts +61 -0
  225. package/dist/chat/browser-decision-check.js +131 -0
  226. package/dist/chat/browser-decision-check.js.map +1 -0
  227. package/dist/chat/chat-outbox-rows.cjs +3 -3
  228. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  229. package/dist/chat/chat-voice-controls.cjs +93 -28
  230. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  231. package/dist/chat/chat-voice-controls.d.ts +36 -2
  232. package/dist/chat/chat-voice-controls.js +89 -24
  233. package/dist/chat/chat-voice-controls.js.map +1 -1
  234. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  235. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  236. package/dist/chat/device-operation.cjs +29 -0
  237. package/dist/chat/device-operation.cjs.map +1 -0
  238. package/dist/chat/device-operation.d.ts +34 -0
  239. package/dist/chat/device-operation.js +29 -0
  240. package/dist/chat/device-operation.js.map +1 -0
  241. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  242. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  243. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  244. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  245. package/dist/chat/super-grouping/SuperGroupingCard.cjs +60 -38
  246. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  247. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +24 -4
  248. package/dist/chat/super-grouping/SuperGroupingCard.js +37 -15
  249. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  250. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  251. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  252. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  253. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  254. package/dist/chat/super-grouping/ToolTimeline.cjs +97 -37
  255. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  256. package/dist/chat/super-grouping/ToolTimeline.d.ts +14 -2
  257. package/dist/chat/super-grouping/ToolTimeline.js +94 -34
  258. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  259. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  260. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  261. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  262. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  263. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  264. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  265. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  266. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  267. package/dist/chat/super-grouping/grouping-function.js +5 -1
  268. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  269. package/dist/chat/super-grouping/index.cjs +6 -0
  270. package/dist/chat/super-grouping/index.cjs.map +1 -1
  271. package/dist/chat/super-grouping/index.d.ts +6 -2
  272. package/dist/chat/super-grouping/index.js +7 -1
  273. package/dist/chat/super-grouping/index.js.map +1 -1
  274. package/dist/chat/super-grouping/timeline-step.cjs +61 -2
  275. package/dist/chat/super-grouping/timeline-step.cjs.map +1 -1
  276. package/dist/chat/super-grouping/timeline-step.d.ts +13 -1
  277. package/dist/chat/super-grouping/timeline-step.js +61 -2
  278. package/dist/chat/super-grouping/timeline-step.js.map +1 -1
  279. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  280. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  281. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  282. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  283. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  284. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  285. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  286. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  287. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  288. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  289. package/dist/chat/tooltip-icon-button.cjs +2 -2
  290. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  291. package/dist/chat/use-athena-voice-live.cjs +11 -0
  292. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  293. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  294. package/dist/chat/use-athena-voice-live.js +11 -0
  295. package/dist/chat/use-athena-voice-live.js.map +1 -0
  296. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  297. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  298. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  299. package/dist/chat/use-statewire-approval-request.js +41 -9
  300. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  301. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  302. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  303. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  304. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  305. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  306. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  307. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  308. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  309. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  310. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  311. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  312. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  313. package/dist/chat-ui/index.cjs +18 -0
  314. package/dist/chat-ui/index.cjs.map +1 -1
  315. package/dist/chat-ui/index.d.ts +7 -1
  316. package/dist/chat-ui/index.js +18 -0
  317. package/dist/chat-ui/index.js.map +1 -1
  318. package/dist/chat-ui/mentions/mention-chip.cjs +147 -38
  319. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  320. package/dist/chat-ui/mentions/mention-chip.d.ts +17 -1
  321. package/dist/chat-ui/mentions/mention-chip.js +146 -37
  322. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  323. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  324. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  325. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  326. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  327. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  328. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  329. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  330. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  331. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  332. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  333. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  334. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  335. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  336. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  337. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  338. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  339. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  340. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  341. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  342. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  343. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  344. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  345. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  346. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  347. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  348. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  349. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  350. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  351. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  352. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  353. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  354. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  355. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  356. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  357. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  358. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  359. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  360. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  361. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  362. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  363. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  364. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  365. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  366. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  367. package/dist/chat-ui/mentions/use-mention-asset.cjs +140 -0
  368. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -0
  369. package/dist/chat-ui/mentions/use-mention-asset.d.ts +16 -0
  370. package/dist/chat-ui/mentions/use-mention-asset.js +140 -0
  371. package/dist/chat-ui/mentions/use-mention-asset.js.map +1 -0
  372. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  373. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  374. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  375. package/dist/chat-ui/messages/answer-label.js +42 -0
  376. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  377. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  378. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  379. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  380. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  381. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  382. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  383. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  384. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  385. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  386. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  387. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  388. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  389. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  390. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  391. package/dist/chat-ui/messages/message-components.cjs +8 -4
  392. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  393. package/dist/chat-ui/messages/message-components.js +5 -1
  394. package/dist/chat-ui/messages/message-components.js.map +1 -1
  395. package/dist/chat-ui/messages/message-images.cjs +66 -0
  396. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  397. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  398. package/dist/chat-ui/messages/message-images.js +66 -0
  399. package/dist/chat-ui/messages/message-images.js.map +1 -0
  400. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  401. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  402. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  403. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  404. package/dist/chat-ui/rich-text/chat-link.cjs +7 -6
  405. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  406. package/dist/chat-ui/rich-text/chat-link.d.ts +2 -3
  407. package/dist/chat-ui/rich-text/chat-link.js +6 -5
  408. package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
  409. package/dist/chat-ui/rich-text/chat-message-body.cjs +8 -8
  410. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  411. package/dist/chat-ui/rich-text/chat-node-views.cjs +7 -6
  412. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  413. package/dist/chat-ui/rich-text/chat-node-views.js +1 -0
  414. package/dist/chat-ui/rich-text/chat-node-views.js.map +1 -1
  415. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  416. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  417. package/dist/chat-ui/statewire.cjs +3 -0
  418. package/dist/chat-ui/statewire.cjs.map +1 -1
  419. package/dist/chat-ui/statewire.d.ts +2 -1
  420. package/dist/chat-ui/statewire.js +3 -0
  421. package/dist/chat-ui/statewire.js.map +1 -1
  422. package/dist/chat-ui/thread/chat-thread-shell.cjs +43 -14
  423. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  424. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  425. package/dist/chat-ui/thread/chat-thread-shell.js +35 -6
  426. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  427. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  428. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  429. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  430. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  431. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  432. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  433. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  434. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  435. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  436. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  437. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  438. package/dist/collab/client.cjs +40 -3
  439. package/dist/collab/client.cjs.map +1 -1
  440. package/dist/collab/client.d.ts +25 -0
  441. package/dist/collab/client.js +40 -3
  442. package/dist/collab/client.js.map +1 -1
  443. package/dist/collab/document-status.cjs +150 -0
  444. package/dist/collab/document-status.cjs.map +1 -0
  445. package/dist/collab/document-status.d.ts +68 -0
  446. package/dist/collab/document-status.js +150 -0
  447. package/dist/collab/document-status.js.map +1 -0
  448. package/dist/collab/index.cjs +7 -0
  449. package/dist/collab/index.cjs.map +1 -1
  450. package/dist/collab/index.d.ts +6 -1
  451. package/dist/collab/index.js +7 -0
  452. package/dist/collab/index.js.map +1 -1
  453. package/dist/collab/presence-react.cjs +11 -11
  454. package/dist/collab/presence-react.cjs.map +1 -1
  455. package/dist/collab/react.cjs +6 -6
  456. package/dist/collab/react.cjs.map +1 -1
  457. package/dist/composer/AttachmentContext.cjs +24 -11
  458. package/dist/composer/AttachmentContext.cjs.map +1 -1
  459. package/dist/composer/AttachmentContext.js +18 -5
  460. package/dist/composer/AttachmentContext.js.map +1 -1
  461. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  462. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  463. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  464. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  465. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  466. package/dist/composer/ComposerDropZone.cjs +7 -7
  467. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  468. package/dist/composer/FileUploadButton.cjs +37 -22
  469. package/dist/composer/FileUploadButton.cjs.map +1 -1
  470. package/dist/composer/FileUploadButton.d.ts +6 -0
  471. package/dist/composer/FileUploadButton.js +34 -19
  472. package/dist/composer/FileUploadButton.js.map +1 -1
  473. package/dist/composer/QuoteContext.cjs +8 -8
  474. package/dist/composer/QuoteContext.cjs.map +1 -1
  475. package/dist/composer/composer-handoff.cjs +4 -4
  476. package/dist/composer/composer-handoff.cjs.map +1 -1
  477. package/dist/composer/useAppendToComposer.cjs +4 -4
  478. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  479. package/dist/composer/useAttachFiles.cjs +23 -6
  480. package/dist/composer/useAttachFiles.cjs.map +1 -1
  481. package/dist/composer/useAttachFiles.d.ts +15 -7
  482. package/dist/composer/useAttachFiles.js +22 -5
  483. package/dist/composer/useAttachFiles.js.map +1 -1
  484. package/dist/composer/useComposerAttachment.cjs +4 -4
  485. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  486. package/dist/composer/useFileUpload.cjs +21 -16
  487. package/dist/composer/useFileUpload.cjs.map +1 -1
  488. package/dist/composer/useFileUpload.d.ts +12 -0
  489. package/dist/composer/useFileUpload.js +12 -7
  490. package/dist/composer/useFileUpload.js.map +1 -1
  491. package/dist/composer/useReadComposerDraft.cjs +2 -2
  492. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  493. package/dist/composer/useSendMessage.cjs +4 -4
  494. package/dist/composer/useSendMessage.cjs.map +1 -1
  495. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  496. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  497. package/dist/dictation/audio-level-history.cjs +3 -3
  498. package/dist/dictation/audio-level-history.cjs.map +1 -1
  499. package/dist/dictation/dictation-controls.cjs +24 -20
  500. package/dist/dictation/dictation-controls.cjs.map +1 -1
  501. package/dist/dictation/dictation-controls.d.ts +6 -1
  502. package/dist/dictation/dictation-controls.js +24 -20
  503. package/dist/dictation/dictation-controls.js.map +1 -1
  504. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  505. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  506. package/dist/dictation/use-dictation.cjs +22 -22
  507. package/dist/dictation/use-dictation.cjs.map +1 -1
  508. package/dist/index.cjs +26 -2
  509. package/dist/index.cjs.map +1 -1
  510. package/dist/index.d.ts +15 -3
  511. package/dist/index.js +26 -2
  512. package/dist/index.js.map +1 -1
  513. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  514. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  515. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  516. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  517. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  518. package/dist/keryx-http/src/update-attributions.cjs +111 -0
  519. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  520. package/dist/keryx-http/src/update-attributions.d.ts +75 -0
  521. package/dist/keryx-http/src/update-attributions.js +111 -0
  522. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  523. package/dist/lib/owner-document.cjs +6 -6
  524. package/dist/lib/owner-document.cjs.map +1 -1
  525. package/dist/lib/use-athena-rest-query.cjs +4 -4
  526. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  527. package/dist/lib/use-document-active.cjs +4 -4
  528. package/dist/lib/use-document-active.cjs.map +1 -1
  529. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  530. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  531. package/dist/offline/offline-history.cjs +7 -7
  532. package/dist/offline/offline-history.cjs.map +1 -1
  533. package/dist/provider/AthenaContext.cjs +3 -3
  534. package/dist/provider/AthenaContext.cjs.map +1 -1
  535. package/dist/provider/AthenaProvider.cjs +116 -79
  536. package/dist/provider/AthenaProvider.cjs.map +1 -1
  537. package/dist/provider/AthenaProvider.js +40 -3
  538. package/dist/provider/AthenaProvider.js.map +1 -1
  539. package/dist/provider/PostHogProvider.cjs +2 -2
  540. package/dist/provider/PostHogProvider.cjs.map +1 -1
  541. package/dist/provider/agent-selection-context.cjs +2 -2
  542. package/dist/provider/agent-selection-context.cjs.map +1 -1
  543. package/dist/provider/chat-mode-context.cjs +2 -2
  544. package/dist/provider/chat-mode-context.cjs.map +1 -1
  545. package/dist/provider/session-persistence-context.cjs +10 -0
  546. package/dist/provider/session-persistence-context.cjs.map +1 -0
  547. package/dist/provider/session-persistence-context.d.ts +15 -0
  548. package/dist/provider/session-persistence-context.js +10 -0
  549. package/dist/provider/session-persistence-context.js.map +1 -0
  550. package/dist/provider/statewire-history-context.cjs +4 -4
  551. package/dist/provider/statewire-history-context.cjs.map +1 -1
  552. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  553. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  554. package/dist/provider/statewire-window-context.cjs +3 -3
  555. package/dist/provider/statewire-window-context.cjs.map +1 -1
  556. package/dist/provider/theme-style-context.cjs +3 -3
  557. package/dist/provider/theme-style-context.cjs.map +1 -1
  558. package/dist/react/package.json.cjs +1 -1
  559. package/dist/react/package.json.js +1 -1
  560. package/dist/references/src/tool-option-schemas.d.ts +0 -34
  561. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  562. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  563. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  564. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  565. package/dist/runtime/auth.cjs +13 -13
  566. package/dist/runtime/auth.cjs.map +1 -1
  567. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  568. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  569. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  570. package/dist/runtime/statewire-lifecycle.js +2 -1
  571. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  572. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  573. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  574. package/dist/runtime/statewire-session-lane.cjs +4 -4
  575. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  576. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  577. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  578. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  579. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  580. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  581. package/dist/styles.css +1 -1
  582. package/dist/threads/Inbox.cjs +8 -8
  583. package/dist/threads/Inbox.cjs.map +1 -1
  584. package/dist/threads/SessionList.cjs +9 -9
  585. package/dist/threads/SessionList.cjs.map +1 -1
  586. package/dist/threads/SessionsPage.cjs +11 -11
  587. package/dist/threads/SessionsPage.cjs.map +1 -1
  588. package/dist/threads/index-triggered-refresh.cjs +10 -10
  589. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  590. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  591. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  592. package/dist/threads/offline-session-list.cjs +3 -3
  593. package/dist/threads/offline-session-list.cjs.map +1 -1
  594. package/dist/threads/session-list-tab-share.cjs +5 -5
  595. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  596. package/dist/threads/statewire-thread-list.cjs +55 -51
  597. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  598. package/dist/threads/statewire-thread-list.js +6 -2
  599. package/dist/threads/statewire-thread-list.js.map +1 -1
  600. package/dist/threads/thread-id-context.cjs +5 -5
  601. package/dist/threads/thread-id-context.cjs.map +1 -1
  602. package/dist/threads/use-athena-session-attention.cjs +2 -2
  603. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  604. package/dist/threads/use-athena-sessions.cjs +10 -10
  605. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  606. package/dist/threads/use-athena-thread-model.cjs +3 -3
  607. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  608. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  609. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  610. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  611. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  612. package/dist/threads/use-thread-archive.cjs +9 -9
  613. package/dist/threads/use-thread-archive.cjs.map +1 -1
  614. package/dist/threads/use-thread-favorite.cjs +2 -2
  615. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  616. package/dist/threads/use-thread-field-override.cjs +20 -20
  617. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  618. package/dist/threads/use-thread-read-state.cjs +4 -4
  619. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  620. package/dist/threads/use-thread-rename.cjs +2 -2
  621. package/dist/threads/use-thread-rename.cjs.map +1 -1
  622. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  623. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  624. package/dist/tools/NestedPtcMessages.cjs +6 -6
  625. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  626. package/dist/tools/append-document-tool-ui.cjs +7 -7
  627. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  628. package/dist/tools/file-tool-uis.cjs +2 -2
  629. package/dist/tools/file-tool-uis.cjs.map +1 -1
  630. package/dist/tools/misc-tool-uis.cjs +2 -2
  631. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  632. package/dist/tools/primitives.cjs +6 -6
  633. package/dist/tools/primitives.cjs.map +1 -1
  634. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  635. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  636. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  637. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  638. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  639. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  640. package/dist/tools/todo-plan-store.cjs +4 -4
  641. package/dist/tools/todo-plan-store.cjs.map +1 -1
  642. package/dist/tools/tool-appearance.cjs +3 -3
  643. package/dist/tools/tool-appearance.cjs.map +1 -1
  644. package/dist/tools/tool-fallback.cjs +14 -14
  645. package/dist/tools/tool-fallback.cjs.map +1 -1
  646. package/dist/tools/tool-summary.cjs +0 -2
  647. package/dist/tools/tool-summary.cjs.map +1 -1
  648. package/dist/tools/tool-summary.js +0 -2
  649. package/dist/tools/tool-summary.js.map +1 -1
  650. package/dist/tools/tool-uis.cjs +74 -74
  651. package/dist/tools/tool-uis.cjs.map +1 -1
  652. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  653. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  654. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  655. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  656. package/dist/ui/image-viewer.cjs +382 -0
  657. package/dist/ui/image-viewer.cjs.map +1 -0
  658. package/dist/ui/image-viewer.d.ts +50 -0
  659. package/dist/ui/image-viewer.js +382 -0
  660. package/dist/ui/image-viewer.js.map +1 -0
  661. package/dist/voice/chat.cjs +6 -0
  662. package/dist/voice/chat.cjs.map +1 -1
  663. package/dist/voice/chat.d.ts +1 -1
  664. package/dist/voice/chat.js +8 -2
  665. package/dist/voice/livekit-join.cjs +52 -101
  666. package/dist/voice/livekit-join.cjs.map +1 -1
  667. package/dist/voice/livekit-join.d.ts +1 -6
  668. package/dist/voice/livekit-join.js +52 -101
  669. package/dist/voice/livekit-join.js.map +1 -1
  670. package/dist/voice/livekit.cjs.map +1 -1
  671. package/dist/voice/livekit.d.ts +11 -1
  672. package/dist/voice/livekit.js.map +1 -1
  673. package/dist/voice/use-athena-voice-session.cjs +34 -34
  674. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  675. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  676. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  677. package/dist/workbench/SessionWorkbench.cjs +22 -22
  678. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  679. package/dist/workbench/session-workbench-context.cjs +3 -3
  680. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  681. package/dist/workbench/session-workbench-panes.cjs +8 -8
  682. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  683. package/dist/workbench/workbench-layout-context.cjs +3 -3
  684. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  685. package/package.json +2 -1
@@ -1,19 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react$1 = require("@assistant-ui/react");
4
+ const react = require("@assistant-ui/react");
5
5
  const lucideReact = require("lucide-react");
6
- const react = require("react");
6
+ const require$$0 = require("react");
7
7
  const messageComponents = require("../messages/message-components.cjs");
8
+ const answerLabel = require("../messages/answer-label.cjs");
8
9
  const messageActionsConfig = require("../messages/message-actions-config.cjs");
9
10
  const userEditComposer = require("../messages/user-edit-composer.cjs");
10
11
  const runningIndicator = require("../messages/running-indicator.cjs");
12
+ const handoffArrivalDivider = require("../messages/handoff-arrival-divider.cjs");
11
13
  const threadChrome = require("../messages/thread-chrome.cjs");
14
+ const messages = require("../../agent-runtime/src/messages.cjs");
15
+ const withArrivalDivider = /* @__PURE__ */ (() => {
16
+ const wrapped = /* @__PURE__ */ new WeakMap();
17
+ return (Message) => {
18
+ const existing = wrapped.get(Message);
19
+ if (existing) return existing;
20
+ const WithArrivalDivider = () => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
21
+ /* @__PURE__ */ jsxRuntime.jsx(Message, {}),
22
+ /* @__PURE__ */ jsxRuntime.jsx(handoffArrivalDivider.HandoffArrivalAfterMessage, {})
23
+ ] });
24
+ wrapped.set(Message, WithArrivalDivider);
25
+ return WithArrivalDivider;
26
+ };
27
+ })();
28
+ const ROW_KEY_SEPARATOR = "\0";
29
+ const ThreadRows = ({ components }) => {
30
+ const joinedKeys = react.useAuiState(
31
+ (s) => s.thread.messages.map((message) => messages.deepAgentRowKey(message)).join(ROW_KEY_SEPARATOR)
32
+ );
33
+ const rowKeys = require$$0.useMemo(
34
+ () => joinedKeys === "" ? [] : joinedKeys.split(ROW_KEY_SEPARATOR),
35
+ [joinedKeys]
36
+ );
37
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: rowKeys.map((key, index) => /* @__PURE__ */ jsxRuntime.jsx(react.ThreadPrimitive.MessageByIndex, { index, components }, key)) });
38
+ };
12
39
  const DEFAULT_VIEWPORT_CLASS = "relative flex flex-1 flex-col overflow-y-auto scroll-smooth";
13
40
  const DEFAULT_CONTENT_CLASS = "w-full flex-1 px-3 pt-3";
14
41
  const DEFAULT_VIEWPORT_FOOTER_CLASS = "sticky bottom-0";
15
- const DefaultScrollToBottom = () => /* @__PURE__ */ jsxRuntime.jsx(react$1.AuiIf, { condition: (state) => !state.thread.isEmpty, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center pb-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(
16
- react$1.ThreadPrimitive.ScrollToBottom,
42
+ const DefaultScrollToBottom = () => /* @__PURE__ */ jsxRuntime.jsx(react.AuiIf, { condition: (state) => !state.thread.isEmpty, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center pb-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(
43
+ react.ThreadPrimitive.ScrollToBottom,
17
44
  {
18
45
  "aria-label": "Scroll to bottom",
19
46
  title: "Scroll to bottom",
@@ -41,24 +68,26 @@ function ChatThreadShell({
41
68
  scrollToBottom = /* @__PURE__ */ jsxRuntime.jsx(DefaultScrollToBottom, {}),
42
69
  viewportFooter,
43
70
  viewportFooterClassName,
44
- readOnly = false
71
+ readOnly = false,
72
+ arrivalThreadId = null,
73
+ viewerUserId = null
45
74
  }) {
46
75
  const {
47
76
  UserMessage,
48
77
  AssistantMessage,
49
78
  UserEditComposer: UserEditComposerComponent = userEditComposer.UserEditComposer
50
79
  } = components;
51
- const messageComponents2 = react.useMemo(
80
+ const messageComponents2 = require$$0.useMemo(
52
81
  () => ({
53
- UserMessage,
54
- AssistantMessage,
82
+ UserMessage: withArrivalDivider(UserMessage),
83
+ AssistantMessage: withArrivalDivider(AssistantMessage),
55
84
  UserEditComposer: UserEditComposerComponent
56
85
  }),
57
86
  [UserMessage, AssistantMessage, UserEditComposerComponent]
58
87
  );
59
- const messages = /* @__PURE__ */ jsxRuntime.jsx(react$1.ThreadPrimitive.Messages, { components: messageComponents2 });
88
+ const messages2 = /* @__PURE__ */ jsxRuntime.jsx(handoffArrivalDivider.HandoffArrivalScope, { threadId: arrivalThreadId, children: /* @__PURE__ */ jsxRuntime.jsx(answerLabel.AnswerLabelScope, { viewerUserId, children: /* @__PURE__ */ jsxRuntime.jsx(ThreadRows, { components: messageComponents2 }) }) });
60
89
  return /* @__PURE__ */ jsxRuntime.jsx(messageActionsConfig.MessageActionsReadOnlyProvider, { readOnly, children: /* @__PURE__ */ jsxRuntime.jsxs(
61
- react$1.ThreadPrimitive.Root,
90
+ react.ThreadPrimitive.Root,
62
91
  {
63
92
  className: panelClassName ?? threadChrome.THREAD_PANEL_CLASS,
64
93
  style: { "--thread-max-width": maxWidth },
@@ -67,7 +96,7 @@ function ChatThreadShell({
67
96
  header,
68
97
  banners,
69
98
  /* @__PURE__ */ jsxRuntime.jsxs(
70
- react$1.ThreadPrimitive.Viewport,
99
+ react.ThreadPrimitive.Viewport,
71
100
  {
72
101
  turnAnchor,
73
102
  className: viewportClassName ?? DEFAULT_VIEWPORT_CLASS,
@@ -75,13 +104,13 @@ function ChatThreadShell({
75
104
  children: [
76
105
  viewportOverlay,
77
106
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 flex-col items-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: contentClassName ?? DEFAULT_CONTENT_CLASS, children: [
78
- welcome != null ? /* @__PURE__ */ jsxRuntime.jsx(react$1.ThreadPrimitive.Empty, { children: welcome }) : null,
107
+ welcome != null ? /* @__PURE__ */ jsxRuntime.jsx(react.ThreadPrimitive.Empty, { children: welcome }) : null,
79
108
  beforeMessages,
80
- renderMessages ? renderMessages(messages) : messages,
109
+ renderMessages ? renderMessages(messages2) : messages2,
81
110
  runningIndicator$1
82
111
  ] }) }),
83
112
  /* @__PURE__ */ jsxRuntime.jsxs(
84
- react$1.ThreadPrimitive.ViewportFooter,
113
+ react.ThreadPrimitive.ViewportFooter,
85
114
  {
86
115
  className: viewportFooterClassName ?? DEFAULT_VIEWPORT_FOOTER_CLASS,
87
116
  children: [
@@ -1 +1 @@
1
- {"version":3,"file":"chat-thread-shell.cjs","sources":["../../../src/chat-ui/thread/chat-thread-shell.tsx"],"sourcesContent":["import { AuiIf, ThreadPrimitive } from \"@assistant-ui/react\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { CSSProperties, FC, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport {\n THREAD_PANEL_CLASS,\n THREAD_SCROLL_TO_BOTTOM_CLASS,\n} from \"../messages/message-components\";\nimport { MessageActionsReadOnlyProvider } from \"../messages/message-actions-config\";\nimport { UserEditComposer } from \"../messages/user-edit-composer\";\nimport { ThreadRunningIndicator } from \"../messages/running-indicator\";\n\nexport interface ChatThreadMessageComponents {\n UserMessage: FC;\n AssistantMessage: FC;\n /**\n * Rendered in place of a user message while it is being edited (the action\n * bar's Edit control). Defaults to the shared UserEditComposer.\n */\n UserEditComposer?: FC;\n}\n\nconst DEFAULT_VIEWPORT_CLASS =\n \"relative flex flex-1 flex-col overflow-y-auto scroll-smooth\";\nconst DEFAULT_CONTENT_CLASS = \"w-full flex-1 px-3 pt-3\";\nconst DEFAULT_VIEWPORT_FOOTER_CLASS = \"sticky bottom-0\";\n\nconst DefaultScrollToBottom: FC = () => (\n <AuiIf condition={(state) => !state.thread.isEmpty}>\n <div className=\"flex justify-center pb-0.5\">\n <ThreadPrimitive.ScrollToBottom\n aria-label=\"Scroll to bottom\"\n title=\"Scroll to bottom\"\n className={THREAD_SCROLL_TO_BOTTOM_CLASS}\n >\n <ChevronDownIcon className=\"size-3.5\" />\n </ThreadPrimitive.ScrollToBottom>\n </div>\n </AuiIf>\n);\n\nexport interface ChatThreadShellProps {\n /**\n * Rendered as the first child of the panel — for absolutely-positioned\n * scrims that must cover the whole panel (AthenaChat's thread-loading\n * overlay). The shell does not force a positioning context; hosts include\n * `relative` in `panelClassName` when the scrim anchors to the panel.\n */\n overlay?: ReactNode;\n /**\n * Rendered above the viewport, inside the panel: header rows, slide-over\n * panels, and anything else the host docks at the top.\n */\n header?: ReactNode;\n /** Status/approval banners rendered between the header and the viewport. */\n banners?: ReactNode;\n /**\n * Nodes rendered inside the scroll viewport before the message column —\n * absolutely/sticky-positioned overlays (thread-switch skeletons,\n * scroll-to-top controls) and invisible observers (read receipts).\n */\n viewportOverlay?: ReactNode;\n /** Empty-thread state, rendered via ThreadPrimitive.Empty when provided. */\n welcome?: ReactNode;\n /**\n * Rendered inside the message column right above the messages — the\n * windowed wire's history edge (`StatewireHistoryEdge`): the \"N earlier\n * messages\" row that pages older history in and fetches cut tool outputs.\n */\n beforeMessages?: ReactNode;\n /** Message renderers for ThreadPrimitive.Messages. */\n components: ChatThreadMessageComponents;\n /**\n * Wraps the messages element — for hosts that provide message-scoped\n * context (e.g. activity-grouping providers). Must render its argument.\n */\n renderMessages?: (messages: ReactNode) => ReactNode;\n /**\n * Rendered between the viewport and the composer: connection banners,\n * queued-message trays.\n */\n belowViewport?: ReactNode;\n /** The composer dock (or a read-only notice replacing it). */\n composer?: ReactNode;\n /**\n * Replaces the docked-panel card chrome — for hosts that render a\n * full-page column (AthenaChat's `aui-*` surface) instead of the\n * side-panel/task-pane card.\n */\n panelClassName?: string;\n /**\n * Value of the `--thread-max-width` variable read by width-capped\n * message/welcome/footer columns. Panels fill their width (the default,\n * \"100%\"); full-page hosts cap the column (AthenaChat defaults to 44rem).\n */\n maxWidth?: string;\n /**\n * Anchors the latest turn to the top of the viewport instead of pinning\n * scroll to the bottom (AthenaChat). Omitted = the primitive's default.\n */\n turnAnchor?: \"top\" | \"bottom\";\n /** Replaces the scroll-viewport chrome (padding, overflow tuning). */\n viewportClassName?: string;\n /**\n * Replaces the message-column chrome. Hosts whose welcome screen centers\n * vertically make this a flex column so the welcome node can grow.\n */\n contentClassName?: string;\n /**\n * Thread-level \"Thinking...\" indicator rendered after the messages. Hosts\n * whose message components render their own per-message indicators pass\n * null so the two never double up.\n */\n runningIndicator?: ReactNode;\n /**\n * Replaces the default centered scroll-to-bottom pill inside the sticky\n * viewport footer (AthenaChat floats a circular button above its composer).\n */\n scrollToBottom?: ReactNode;\n /**\n * Content docked inside the sticky viewport footer, after the\n * scroll-to-bottom control — for hosts whose banners + composer float over\n * the scrolling messages (AthenaChat) instead of sitting below the\n * viewport via `belowViewport`/`composer`.\n */\n viewportFooter?: ReactNode;\n /** Replaces the sticky viewport-footer chrome. */\n viewportFooterClassName?: string;\n /**\n * Marks the transcript read-only: mutating message actions (Edit,\n * Regenerate) hide while Copy stays available. For threads whose server\n * rejects dispatch (e.g. legacy pre-cutover conversations) — the runtime's\n * static capability flags cannot express a per-thread fence.\n */\n readOnly?: boolean;\n}\n\n/**\n * The shared thread layout: panel chrome, scroll viewport with welcome +\n * messages + running indicator, the sticky scroll-to-bottom control, and the\n * host-supplied composer dock.\n *\n * Hosts express their genuine divergences through the slots above; the\n * layout, scroll behaviour, and empty/running states stay identical across\n * surfaces so fixes land once.\n */\nexport function ChatThreadShell({\n overlay,\n header,\n banners,\n viewportOverlay,\n welcome,\n beforeMessages,\n components,\n renderMessages,\n belowViewport,\n composer,\n panelClassName,\n maxWidth = \"100%\",\n turnAnchor,\n viewportClassName,\n contentClassName,\n runningIndicator = <ThreadRunningIndicator />,\n scrollToBottom = <DefaultScrollToBottom />,\n viewportFooter,\n viewportFooterClassName,\n readOnly = false,\n}: ChatThreadShellProps) {\n const {\n UserMessage,\n AssistantMessage,\n UserEditComposer: UserEditComposerComponent = UserEditComposer,\n } = components;\n // ThreadPrimitive.Messages resolves per-message renderers by component\n // identity, so keep the merged map referentially stable across renders.\n const messageComponents = useMemo(\n () => ({\n UserMessage,\n AssistantMessage,\n UserEditComposer: UserEditComposerComponent,\n }),\n [UserMessage, AssistantMessage, UserEditComposerComponent],\n );\n const messages = <ThreadPrimitive.Messages components={messageComponents} />;\n return (\n <MessageActionsReadOnlyProvider readOnly={readOnly}>\n <ThreadPrimitive.Root\n className={panelClassName ?? THREAD_PANEL_CLASS}\n style={{ \"--thread-max-width\": maxWidth } as CSSProperties}\n >\n {overlay}\n {header}\n {banners}\n <ThreadPrimitive.Viewport\n turnAnchor={turnAnchor}\n className={viewportClassName ?? DEFAULT_VIEWPORT_CLASS}\n data-aui-thread-viewport=\"\"\n >\n {viewportOverlay}\n {/* No min-h-0 here: the column's automatic minimum height is what\n lets it extend past one screen, keeping the sticky footer's flow\n position after the full message list. Capping it detaches the\n footer (scroll pill, docked composers) as soon as the thread\n scrolls — proven in a live-browser probe of both structures. */}\n <div className=\"flex flex-1 flex-col items-center\">\n <div className={contentClassName ?? DEFAULT_CONTENT_CLASS}>\n {welcome != null ? (\n <ThreadPrimitive.Empty>{welcome}</ThreadPrimitive.Empty>\n ) : null}\n {beforeMessages}\n {renderMessages ? renderMessages(messages) : messages}\n {runningIndicator}\n </div>\n </div>\n <ThreadPrimitive.ViewportFooter\n className={viewportFooterClassName ?? DEFAULT_VIEWPORT_FOOTER_CLASS}\n >\n {scrollToBottom}\n {viewportFooter}\n </ThreadPrimitive.ViewportFooter>\n </ThreadPrimitive.Viewport>\n {belowViewport}\n {composer}\n </ThreadPrimitive.Root>\n </MessageActionsReadOnlyProvider>\n );\n}\n"],"names":["jsx","AuiIf","ThreadPrimitive","THREAD_SCROLL_TO_BOTTOM_CLASS","ChevronDownIcon","runningIndicator","ThreadRunningIndicator","UserEditComposer","messageComponents","useMemo","MessageActionsReadOnlyProvider","jsxs","THREAD_PANEL_CLASS"],"mappings":";;;;;;;;;;;AAsBA,MAAM,yBACJ;AACF,MAAM,wBAAwB;AAC9B,MAAM,gCAAgC;AAEtC,MAAM,wBAA4B,MAChCA,2BAAAA,IAACC,QAAAA,OAAA,EAAM,WAAW,CAAC,UAAU,CAAC,MAAM,OAAO,SACzC,UAAAD,+BAAC,OAAA,EAAI,WAAU,8BACb,UAAAA,2BAAAA;AAAAA,EAACE,QAAAA,gBAAgB;AAAA,EAAhB;AAAA,IACC,cAAW;AAAA,IACX,OAAM;AAAA,IACN,WAAWC,kBAAAA;AAAAA,IAEX,UAAAH,2BAAAA,IAACI,YAAAA,iBAAA,EAAgB,WAAU,WAAA,CAAW;AAAA,EAAA;AACxC,EAAA,CACF,EAAA,CACF;AA4GK,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAAA,kBACAC,oDAAoBC,iBAAAA,wBAAA,EAAuB;AAAA,EAC3C,gDAAkB,uBAAA,EAAsB;AAAA,EACxC;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAyB;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,kBAAkB,4BAA4BC,iBAAAA;AAAAA,EAAA,IAC5C;AAGJ,QAAMC,qBAAoBC,MAAAA;AAAAA,IACxB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,IAAA;AAAA,IAEpB,CAAC,aAAa,kBAAkB,yBAAyB;AAAA,EAAA;AAE3D,QAAM,WAAWT,2BAAAA,IAACE,QAAAA,gBAAgB,UAAhB,EAAyB,YAAYM,oBAAmB;AAC1E,SACER,2BAAAA,IAACU,qBAAAA,kCAA+B,UAC9B,UAAAC,2BAAAA;AAAAA,IAACT,QAAAA,gBAAgB;AAAA,IAAhB;AAAA,MACC,WAAW,kBAAkBU,aAAAA;AAAAA,MAC7B,OAAO,EAAE,sBAAsB,SAAA;AAAA,MAE9B,UAAA;AAAA,QAAA;AAAA,QACA;AAAA,QACA;AAAA,QACDD,2BAAAA;AAAAA,UAACT,QAAAA,gBAAgB;AAAA,UAAhB;AAAA,YACC;AAAA,YACA,WAAW,qBAAqB;AAAA,YAChC,4BAAyB;AAAA,YAExB,UAAA;AAAA,cAAA;AAAA,cAMDF,2BAAAA,IAAC,SAAI,WAAU,qCACb,0CAAC,OAAA,EAAI,WAAW,oBAAoB,uBACjC,UAAA;AAAA,gBAAA,WAAW,OACVA,2BAAAA,IAACE,QAAAA,gBAAgB,OAAhB,EAAuB,mBAAQ,IAC9B;AAAA,gBACH;AAAA,gBACA,iBAAiB,eAAe,QAAQ,IAAI;AAAA,gBAC5CG;AAAAA,cAAA,EAAA,CACH,EAAA,CACF;AAAA,cACAM,2BAAAA;AAAAA,gBAACT,QAAAA,gBAAgB;AAAA,gBAAhB;AAAA,kBACC,WAAW,2BAA2B;AAAA,kBAErC,UAAA;AAAA,oBAAA;AAAA,oBACA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH;AAAA,UAAA;AAAA,QAAA;AAAA,QAED;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;;"}
1
+ {"version":3,"file":"chat-thread-shell.cjs","sources":["../../../src/chat-ui/thread/chat-thread-shell.tsx"],"sourcesContent":["import { AuiIf, ThreadPrimitive, useAuiState } from \"@assistant-ui/react\";\nimport { deepAgentRowKey } from \"@athenaintel/agent-runtime\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, CSSProperties, FC, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport {\n THREAD_PANEL_CLASS,\n THREAD_SCROLL_TO_BOTTOM_CLASS,\n} from \"../messages/message-components\";\nimport { AnswerLabelScope } from \"../messages/answer-label\";\nimport { MessageActionsReadOnlyProvider } from \"../messages/message-actions-config\";\nimport { UserEditComposer } from \"../messages/user-edit-composer\";\nimport { ThreadRunningIndicator } from \"../messages/running-indicator\";\nimport {\n HandoffArrivalAfterMessage,\n HandoffArrivalScope,\n} from \"../messages/handoff-arrival-divider\";\n\nexport interface ChatThreadMessageComponents {\n UserMessage: FC;\n AssistantMessage: FC;\n /**\n * Rendered in place of a user message while it is being edited (the action\n * bar's Edit control). Defaults to the shared UserEditComposer.\n */\n UserEditComposer?: FC;\n}\n\n// One wrapper per message renderer, so a renderer keeps its identity across\n// shells and renders: a row renders its message through the component it is\n// handed, and a new component identity would remount every row.\nconst withArrivalDivider = (() => {\n const wrapped = new WeakMap<FC, FC>();\n return (Message: FC): FC => {\n const existing = wrapped.get(Message);\n if (existing) return existing;\n const WithArrivalDivider: FC = () => (\n <>\n <Message />\n <HandoffArrivalAfterMessage />\n </>\n );\n wrapped.set(Message, WithArrivalDivider);\n return WithArrivalDivider;\n };\n})();\n\ntype ThreadRowComponents = ComponentProps<typeof ThreadPrimitive.MessageByIndex>[\"components\"];\n\nconst ROW_KEY_SEPARATOR = \"\\u0000\";\n\n/**\n * The thread's messages, one row each under its row key (`deepAgentRowKey`).\n *\n * `ThreadPrimitive.Messages` keys a row by its message id. A page of older\n * history that folds into the first loaded turn (a long run's earlier steps)\n * gives that turn a new id on every page, so keyed by id the turn's row\n * remounted once per page: it flashed through its entrance animation, closed\n * what the person had opened in it and took the browser's scroll anchor with\n * it. The row key stays with the row the turn continues, so the page lands in\n * the mounted row. A message from another runtime keys by its id, as before.\n */\nconst ThreadRows: FC<{ components: ThreadRowComponents }> = ({ components }) => {\n const joinedKeys = useAuiState((s) =>\n s.thread.messages.map((message) => deepAgentRowKey(message)).join(ROW_KEY_SEPARATOR),\n );\n const rowKeys = useMemo(\n () => (joinedKeys === \"\" ? [] : joinedKeys.split(ROW_KEY_SEPARATOR)),\n [joinedKeys],\n );\n return (\n <>\n {rowKeys.map((key, index) => (\n <ThreadPrimitive.MessageByIndex key={key} index={index} components={components} />\n ))}\n </>\n );\n};\n\nconst DEFAULT_VIEWPORT_CLASS =\n \"relative flex flex-1 flex-col overflow-y-auto scroll-smooth\";\nconst DEFAULT_CONTENT_CLASS = \"w-full flex-1 px-3 pt-3\";\nconst DEFAULT_VIEWPORT_FOOTER_CLASS = \"sticky bottom-0\";\n\nconst DefaultScrollToBottom: FC = () => (\n <AuiIf condition={(state) => !state.thread.isEmpty}>\n <div className=\"flex justify-center pb-0.5\">\n <ThreadPrimitive.ScrollToBottom\n aria-label=\"Scroll to bottom\"\n title=\"Scroll to bottom\"\n className={THREAD_SCROLL_TO_BOTTOM_CLASS}\n >\n <ChevronDownIcon className=\"size-3.5\" />\n </ThreadPrimitive.ScrollToBottom>\n </div>\n </AuiIf>\n);\n\nexport interface ChatThreadShellProps {\n /**\n * Rendered as the first child of the panel — for absolutely-positioned\n * scrims that must cover the whole panel (AthenaChat's thread-loading\n * overlay). The shell does not force a positioning context; hosts include\n * `relative` in `panelClassName` when the scrim anchors to the panel.\n */\n overlay?: ReactNode;\n /**\n * Rendered above the viewport, inside the panel: header rows, slide-over\n * panels, and anything else the host docks at the top.\n */\n header?: ReactNode;\n /** Status/approval banners rendered between the header and the viewport. */\n banners?: ReactNode;\n /**\n * Nodes rendered inside the scroll viewport before the message column —\n * absolutely/sticky-positioned overlays (thread-switch skeletons,\n * scroll-to-top controls) and invisible observers (read receipts).\n */\n viewportOverlay?: ReactNode;\n /** Empty-thread state, rendered via ThreadPrimitive.Empty when provided. */\n welcome?: ReactNode;\n /**\n * Rendered inside the message column right above the messages — the\n * windowed wire's history edge (`StatewireHistoryEdge`): the \"N earlier\n * messages\" row that pages older history in and fetches cut tool outputs.\n */\n beforeMessages?: ReactNode;\n /** Message renderers for the thread's rows. */\n components: ChatThreadMessageComponents;\n /**\n * Wraps the messages element — for hosts that provide message-scoped\n * context (e.g. activity-grouping providers). Must render its argument.\n */\n renderMessages?: (messages: ReactNode) => ReactNode;\n /**\n * Rendered between the viewport and the composer: connection banners,\n * queued-message trays.\n */\n belowViewport?: ReactNode;\n /** The composer dock (or a read-only notice replacing it). */\n composer?: ReactNode;\n /**\n * Replaces the docked-panel card chrome — for hosts that render a\n * full-page column (AthenaChat's `aui-*` surface) instead of the\n * side-panel/task-pane card.\n */\n panelClassName?: string;\n /**\n * Value of the `--thread-max-width` variable read by width-capped\n * message/welcome/footer columns. Panels fill their width (the default,\n * \"100%\"); full-page hosts cap the column (AthenaChat defaults to 44rem).\n */\n maxWidth?: string;\n /**\n * Anchors the latest turn to the top of the viewport instead of pinning\n * scroll to the bottom (AthenaChat). Omitted = the primitive's default.\n */\n turnAnchor?: \"top\" | \"bottom\";\n /** Replaces the scroll-viewport chrome (padding, overflow tuning). */\n viewportClassName?: string;\n /**\n * Replaces the message-column chrome. Hosts whose welcome screen centers\n * vertically make this a flex column so the welcome node can grow.\n */\n contentClassName?: string;\n /**\n * Thread-level \"Thinking...\" indicator rendered after the messages. Hosts\n * whose message components render their own per-message indicators pass\n * null so the two never double up.\n */\n runningIndicator?: ReactNode;\n /**\n * Replaces the default centered scroll-to-bottom pill inside the sticky\n * viewport footer (AthenaChat floats a circular button above its composer).\n */\n scrollToBottom?: ReactNode;\n /**\n * Content docked inside the sticky viewport footer, after the\n * scroll-to-bottom control — for hosts whose banners + composer float over\n * the scrolling messages (AthenaChat) instead of sitting below the\n * viewport via `belowViewport`/`composer`.\n */\n viewportFooter?: ReactNode;\n /** Replaces the sticky viewport-footer chrome. */\n viewportFooterClassName?: string;\n /**\n * Marks the transcript read-only: mutating message actions (Edit,\n * Regenerate) hide while Copy stays available. For threads whose server\n * rejects dispatch (e.g. legacy pre-cutover conversations) — the runtime's\n * static capability flags cannot express a per-thread fence.\n */\n readOnly?: boolean;\n /**\n * The backend id of the thread on screen. When this surface picked the\n * conversation up from another one (`recordHandoffArrival`), the transcript\n * shows \"Continued from …\" after the last message that was already there.\n */\n arrivalThreadId?: string | null;\n /**\n * The signed-in viewer's Athena user id (`user_…`), for the answer labels\n * (`AnswerLabel`): their own answers read \"for you\", and an answer for\n * another person is labelled even in a 1:1 chat. Omitted, answers name the\n * person by name and are labelled only once the thread holds several agents\n * or several people.\n */\n viewerUserId?: string | null;\n}\n\n/**\n * The shared thread layout: panel chrome, scroll viewport with welcome +\n * messages + running indicator, the sticky scroll-to-bottom control, and the\n * host-supplied composer dock.\n *\n * Hosts express their genuine divergences through the slots above; the\n * layout, scroll behaviour, and empty/running states stay identical across\n * surfaces so fixes land once.\n */\nexport function ChatThreadShell({\n overlay,\n header,\n banners,\n viewportOverlay,\n welcome,\n beforeMessages,\n components,\n renderMessages,\n belowViewport,\n composer,\n panelClassName,\n maxWidth = \"100%\",\n turnAnchor,\n viewportClassName,\n contentClassName,\n runningIndicator = <ThreadRunningIndicator />,\n scrollToBottom = <DefaultScrollToBottom />,\n viewportFooter,\n viewportFooterClassName,\n readOnly = false,\n arrivalThreadId = null,\n viewerUserId = null,\n}: ChatThreadShellProps) {\n const {\n UserMessage,\n AssistantMessage,\n UserEditComposer: UserEditComposerComponent = UserEditComposer,\n } = components;\n // A row resolves its renderer by component identity, so keep the merged map\n // referentially stable across renders.\n const messageComponents = useMemo(\n () => ({\n UserMessage: withArrivalDivider(UserMessage),\n AssistantMessage: withArrivalDivider(AssistantMessage),\n UserEditComposer: UserEditComposerComponent,\n }),\n [UserMessage, AssistantMessage, UserEditComposerComponent],\n );\n const messages = (\n <HandoffArrivalScope threadId={arrivalThreadId}>\n <AnswerLabelScope viewerUserId={viewerUserId}>\n <ThreadRows components={messageComponents} />\n </AnswerLabelScope>\n </HandoffArrivalScope>\n );\n return (\n <MessageActionsReadOnlyProvider readOnly={readOnly}>\n <ThreadPrimitive.Root\n className={panelClassName ?? THREAD_PANEL_CLASS}\n style={{ \"--thread-max-width\": maxWidth } as CSSProperties}\n >\n {overlay}\n {header}\n {banners}\n <ThreadPrimitive.Viewport\n turnAnchor={turnAnchor}\n className={viewportClassName ?? DEFAULT_VIEWPORT_CLASS}\n data-aui-thread-viewport=\"\"\n >\n {viewportOverlay}\n {/* No min-h-0 here: the column's automatic minimum height is what\n lets it extend past one screen, keeping the sticky footer's flow\n position after the full message list. Capping it detaches the\n footer (scroll pill, docked composers) as soon as the thread\n scrolls — proven in a live-browser probe of both structures. */}\n <div className=\"flex flex-1 flex-col items-center\">\n <div className={contentClassName ?? DEFAULT_CONTENT_CLASS}>\n {welcome != null ? (\n <ThreadPrimitive.Empty>{welcome}</ThreadPrimitive.Empty>\n ) : null}\n {beforeMessages}\n {renderMessages ? renderMessages(messages) : messages}\n {runningIndicator}\n </div>\n </div>\n <ThreadPrimitive.ViewportFooter\n className={viewportFooterClassName ?? DEFAULT_VIEWPORT_FOOTER_CLASS}\n >\n {scrollToBottom}\n {viewportFooter}\n </ThreadPrimitive.ViewportFooter>\n </ThreadPrimitive.Viewport>\n {belowViewport}\n {composer}\n </ThreadPrimitive.Root>\n </MessageActionsReadOnlyProvider>\n );\n}\n"],"names":["jsxs","Fragment","jsx","HandoffArrivalAfterMessage","useAuiState","deepAgentRowKey","useMemo","ThreadPrimitive","AuiIf","THREAD_SCROLL_TO_BOTTOM_CLASS","ChevronDownIcon","runningIndicator","ThreadRunningIndicator","UserEditComposer","messageComponents","messages","HandoffArrivalScope","AnswerLabelScope","MessageActionsReadOnlyProvider","THREAD_PANEL_CLASS"],"mappings":";;;;;;;;;;;;;;AA+BA,MAAM,qBAAsB,uBAAM;AAChC,QAAM,8BAAc,QAAA;AACpB,SAAO,CAAC,YAAoB;AAC1B,UAAM,WAAW,QAAQ,IAAI,OAAO;AACpC,QAAI,SAAU,QAAO;AACrB,UAAM,qBAAyB,MAC7BA,2BAAAA,KAAAC,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAC,2BAAAA,IAAC,SAAA,EAAQ;AAAA,qCACRC,sBAAAA,4BAAA,CAAA,CAA2B;AAAA,IAAA,GAC9B;AAEF,YAAQ,IAAI,SAAS,kBAAkB;AACvC,WAAO;AAAA,EACT;AACF,GAAA;AAIA,MAAM,oBAAoB;AAa1B,MAAM,aAAsD,CAAC,EAAE,iBAAiB;AAC9E,QAAM,aAAaC,MAAAA;AAAAA,IAAY,CAAC,MAC9B,EAAE,OAAO,SAAS,IAAI,CAAC,YAAYC,yBAAgB,OAAO,CAAC,EAAE,KAAK,iBAAiB;AAAA,EAAA;AAErF,QAAM,UAAUC,WAAAA;AAAAA,IACd,MAAO,eAAe,KAAK,CAAA,IAAK,WAAW,MAAM,iBAAiB;AAAA,IAClE,CAAC,UAAU;AAAA,EAAA;AAEb,SACEJ,2BAAAA,IAAAD,WAAAA,UAAA,EACG,UAAA,QAAQ,IAAI,CAAC,KAAK,UACjBC,2BAAAA,IAACK,MAAAA,gBAAgB,gBAAhB,EAAyC,OAAc,cAAnB,GAA2C,CACjF,GACH;AAEJ;AAEA,MAAM,yBACJ;AACF,MAAM,wBAAwB;AAC9B,MAAM,gCAAgC;AAEtC,MAAM,wBAA4B,MAChCL,2BAAAA,IAACM,MAAAA,OAAA,EAAM,WAAW,CAAC,UAAU,CAAC,MAAM,OAAO,SACzC,UAAAN,+BAAC,OAAA,EAAI,WAAU,8BACb,UAAAA,2BAAAA;AAAAA,EAACK,MAAAA,gBAAgB;AAAA,EAAhB;AAAA,IACC,cAAW;AAAA,IACX,OAAM;AAAA,IACN,WAAWE,kBAAAA;AAAAA,IAEX,UAAAP,2BAAAA,IAACQ,YAAAA,iBAAA,EAAgB,WAAU,WAAA,CAAW;AAAA,EAAA;AACxC,EAAA,CACF,EAAA,CACF;AA0HK,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAAA,kBACAC,oDAAoBC,iBAAAA,wBAAA,EAAuB;AAAA,EAC3C,gDAAkB,uBAAA,EAAsB;AAAA,EACxC;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,eAAe;AACjB,GAAyB;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,kBAAkB,4BAA4BC,iBAAAA;AAAAA,EAAA,IAC5C;AAGJ,QAAMC,qBAAoBR,WAAAA;AAAAA,IACxB,OAAO;AAAA,MACL,aAAa,mBAAmB,WAAW;AAAA,MAC3C,kBAAkB,mBAAmB,gBAAgB;AAAA,MACrD,kBAAkB;AAAA,IAAA;AAAA,IAEpB,CAAC,aAAa,kBAAkB,yBAAyB;AAAA,EAAA;AAE3D,QAAMS,YACJb,2BAAAA,IAACc,2CAAA,EAAoB,UAAU,iBAC7B,UAAAd,2BAAAA,IAACe,YAAAA,kBAAA,EAAiB,cAChB,UAAAf,2BAAAA,IAAC,YAAA,EAAW,YAAYY,mBAAA,CAAmB,GAC7C,GACF;AAEF,SACEZ,2BAAAA,IAACgB,qBAAAA,kCAA+B,UAC9B,UAAAlB,2BAAAA;AAAAA,IAACO,MAAAA,gBAAgB;AAAA,IAAhB;AAAA,MACC,WAAW,kBAAkBY,aAAAA;AAAAA,MAC7B,OAAO,EAAE,sBAAsB,SAAA;AAAA,MAE9B,UAAA;AAAA,QAAA;AAAA,QACA;AAAA,QACA;AAAA,QACDnB,2BAAAA;AAAAA,UAACO,MAAAA,gBAAgB;AAAA,UAAhB;AAAA,YACC;AAAA,YACA,WAAW,qBAAqB;AAAA,YAChC,4BAAyB;AAAA,YAExB,UAAA;AAAA,cAAA;AAAA,cAMDL,2BAAAA,IAAC,SAAI,WAAU,qCACb,0CAAC,OAAA,EAAI,WAAW,oBAAoB,uBACjC,UAAA;AAAA,gBAAA,WAAW,OACVA,2BAAAA,IAACK,MAAAA,gBAAgB,OAAhB,EAAuB,mBAAQ,IAC9B;AAAA,gBACH;AAAA,gBACA,iBAAiB,eAAeQ,SAAQ,IAAIA;AAAA,gBAC5CJ;AAAAA,cAAA,EAAA,CACH,EAAA,CACF;AAAA,cACAX,2BAAAA;AAAAA,gBAACO,MAAAA,gBAAgB;AAAA,gBAAhB;AAAA,kBACC,WAAW,2BAA2B;AAAA,kBAErC,UAAA;AAAA,oBAAA;AAAA,oBACA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH;AAAA,UAAA;AAAA,QAAA;AAAA,QAED;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;;"}
@@ -37,7 +37,7 @@ export interface ChatThreadShellProps {
37
37
  * messages" row that pages older history in and fetches cut tool outputs.
38
38
  */
39
39
  beforeMessages?: ReactNode;
40
- /** Message renderers for ThreadPrimitive.Messages. */
40
+ /** Message renderers for the thread's rows. */
41
41
  components: ChatThreadMessageComponents;
42
42
  /**
43
43
  * Wraps the messages element — for hosts that provide message-scoped
@@ -102,6 +102,20 @@ export interface ChatThreadShellProps {
102
102
  * static capability flags cannot express a per-thread fence.
103
103
  */
104
104
  readOnly?: boolean;
105
+ /**
106
+ * The backend id of the thread on screen. When this surface picked the
107
+ * conversation up from another one (`recordHandoffArrival`), the transcript
108
+ * shows "Continued from …" after the last message that was already there.
109
+ */
110
+ arrivalThreadId?: string | null;
111
+ /**
112
+ * The signed-in viewer's Athena user id (`user_…`), for the answer labels
113
+ * (`AnswerLabel`): their own answers read "for you", and an answer for
114
+ * another person is labelled even in a 1:1 chat. Omitted, answers name the
115
+ * person by name and are labelled only once the thread holds several agents
116
+ * or several people.
117
+ */
118
+ viewerUserId?: string | null;
105
119
  }
106
120
  /**
107
121
  * The shared thread layout: panel chrome, scroll viewport with welcome +
@@ -112,4 +126,4 @@ export interface ChatThreadShellProps {
112
126
  * layout, scroll behaviour, and empty/running states stay identical across
113
127
  * surfaces so fixes land once.
114
128
  */
115
- export declare function ChatThreadShell({ overlay, header, banners, viewportOverlay, welcome, beforeMessages, components, renderMessages, belowViewport, composer, panelClassName, maxWidth, turnAnchor, viewportClassName, contentClassName, runningIndicator, scrollToBottom, viewportFooter, viewportFooterClassName, readOnly, }: ChatThreadShellProps): import("react").JSX.Element;
129
+ export declare function ChatThreadShell({ overlay, header, banners, viewportOverlay, welcome, beforeMessages, components, renderMessages, belowViewport, composer, panelClassName, maxWidth, turnAnchor, viewportClassName, contentClassName, runningIndicator, scrollToBottom, viewportFooter, viewportFooterClassName, readOnly, arrivalThreadId, viewerUserId, }: ChatThreadShellProps): import("react").JSX.Element;
@@ -1,12 +1,39 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { ThreadPrimitive, AuiIf } from "@assistant-ui/react";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { ThreadPrimitive, AuiIf, useAuiState } from "@assistant-ui/react";
3
3
  import { ChevronDownIcon } from "lucide-react";
4
4
  import { useMemo } from "react";
5
5
  import { THREAD_SCROLL_TO_BOTTOM_CLASS } from "../messages/message-components.js";
6
+ import { AnswerLabelScope } from "../messages/answer-label.js";
6
7
  import { MessageActionsReadOnlyProvider } from "../messages/message-actions-config.js";
7
8
  import { UserEditComposer } from "../messages/user-edit-composer.js";
8
9
  import { ThreadRunningIndicator } from "../messages/running-indicator.js";
10
+ import { HandoffArrivalScope, HandoffArrivalAfterMessage } from "../messages/handoff-arrival-divider.js";
9
11
  import { THREAD_PANEL_CLASS } from "../messages/thread-chrome.js";
12
+ import { deepAgentRowKey } from "../../agent-runtime/src/messages.js";
13
+ const withArrivalDivider = /* @__PURE__ */ (() => {
14
+ const wrapped = /* @__PURE__ */ new WeakMap();
15
+ return (Message) => {
16
+ const existing = wrapped.get(Message);
17
+ if (existing) return existing;
18
+ const WithArrivalDivider = () => /* @__PURE__ */ jsxs(Fragment, { children: [
19
+ /* @__PURE__ */ jsx(Message, {}),
20
+ /* @__PURE__ */ jsx(HandoffArrivalAfterMessage, {})
21
+ ] });
22
+ wrapped.set(Message, WithArrivalDivider);
23
+ return WithArrivalDivider;
24
+ };
25
+ })();
26
+ const ROW_KEY_SEPARATOR = "\0";
27
+ const ThreadRows = ({ components }) => {
28
+ const joinedKeys = useAuiState(
29
+ (s) => s.thread.messages.map((message) => deepAgentRowKey(message)).join(ROW_KEY_SEPARATOR)
30
+ );
31
+ const rowKeys = useMemo(
32
+ () => joinedKeys === "" ? [] : joinedKeys.split(ROW_KEY_SEPARATOR),
33
+ [joinedKeys]
34
+ );
35
+ return /* @__PURE__ */ jsx(Fragment, { children: rowKeys.map((key, index) => /* @__PURE__ */ jsx(ThreadPrimitive.MessageByIndex, { index, components }, key)) });
36
+ };
10
37
  const DEFAULT_VIEWPORT_CLASS = "relative flex flex-1 flex-col overflow-y-auto scroll-smooth";
11
38
  const DEFAULT_CONTENT_CLASS = "w-full flex-1 px-3 pt-3";
12
39
  const DEFAULT_VIEWPORT_FOOTER_CLASS = "sticky bottom-0";
@@ -39,7 +66,9 @@ function ChatThreadShell({
39
66
  scrollToBottom = /* @__PURE__ */ jsx(DefaultScrollToBottom, {}),
40
67
  viewportFooter,
41
68
  viewportFooterClassName,
42
- readOnly = false
69
+ readOnly = false,
70
+ arrivalThreadId = null,
71
+ viewerUserId = null
43
72
  }) {
44
73
  const {
45
74
  UserMessage,
@@ -48,13 +77,13 @@ function ChatThreadShell({
48
77
  } = components;
49
78
  const messageComponents = useMemo(
50
79
  () => ({
51
- UserMessage,
52
- AssistantMessage,
80
+ UserMessage: withArrivalDivider(UserMessage),
81
+ AssistantMessage: withArrivalDivider(AssistantMessage),
53
82
  UserEditComposer: UserEditComposerComponent
54
83
  }),
55
84
  [UserMessage, AssistantMessage, UserEditComposerComponent]
56
85
  );
57
- const messages = /* @__PURE__ */ jsx(ThreadPrimitive.Messages, { components: messageComponents });
86
+ const messages = /* @__PURE__ */ jsx(HandoffArrivalScope, { threadId: arrivalThreadId, children: /* @__PURE__ */ jsx(AnswerLabelScope, { viewerUserId, children: /* @__PURE__ */ jsx(ThreadRows, { components: messageComponents }) }) });
58
87
  return /* @__PURE__ */ jsx(MessageActionsReadOnlyProvider, { readOnly, children: /* @__PURE__ */ jsxs(
59
88
  ThreadPrimitive.Root,
60
89
  {
@@ -1 +1 @@
1
- {"version":3,"file":"chat-thread-shell.js","sources":["../../../src/chat-ui/thread/chat-thread-shell.tsx"],"sourcesContent":["import { AuiIf, ThreadPrimitive } from \"@assistant-ui/react\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { CSSProperties, FC, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport {\n THREAD_PANEL_CLASS,\n THREAD_SCROLL_TO_BOTTOM_CLASS,\n} from \"../messages/message-components\";\nimport { MessageActionsReadOnlyProvider } from \"../messages/message-actions-config\";\nimport { UserEditComposer } from \"../messages/user-edit-composer\";\nimport { ThreadRunningIndicator } from \"../messages/running-indicator\";\n\nexport interface ChatThreadMessageComponents {\n UserMessage: FC;\n AssistantMessage: FC;\n /**\n * Rendered in place of a user message while it is being edited (the action\n * bar's Edit control). Defaults to the shared UserEditComposer.\n */\n UserEditComposer?: FC;\n}\n\nconst DEFAULT_VIEWPORT_CLASS =\n \"relative flex flex-1 flex-col overflow-y-auto scroll-smooth\";\nconst DEFAULT_CONTENT_CLASS = \"w-full flex-1 px-3 pt-3\";\nconst DEFAULT_VIEWPORT_FOOTER_CLASS = \"sticky bottom-0\";\n\nconst DefaultScrollToBottom: FC = () => (\n <AuiIf condition={(state) => !state.thread.isEmpty}>\n <div className=\"flex justify-center pb-0.5\">\n <ThreadPrimitive.ScrollToBottom\n aria-label=\"Scroll to bottom\"\n title=\"Scroll to bottom\"\n className={THREAD_SCROLL_TO_BOTTOM_CLASS}\n >\n <ChevronDownIcon className=\"size-3.5\" />\n </ThreadPrimitive.ScrollToBottom>\n </div>\n </AuiIf>\n);\n\nexport interface ChatThreadShellProps {\n /**\n * Rendered as the first child of the panel — for absolutely-positioned\n * scrims that must cover the whole panel (AthenaChat's thread-loading\n * overlay). The shell does not force a positioning context; hosts include\n * `relative` in `panelClassName` when the scrim anchors to the panel.\n */\n overlay?: ReactNode;\n /**\n * Rendered above the viewport, inside the panel: header rows, slide-over\n * panels, and anything else the host docks at the top.\n */\n header?: ReactNode;\n /** Status/approval banners rendered between the header and the viewport. */\n banners?: ReactNode;\n /**\n * Nodes rendered inside the scroll viewport before the message column —\n * absolutely/sticky-positioned overlays (thread-switch skeletons,\n * scroll-to-top controls) and invisible observers (read receipts).\n */\n viewportOverlay?: ReactNode;\n /** Empty-thread state, rendered via ThreadPrimitive.Empty when provided. */\n welcome?: ReactNode;\n /**\n * Rendered inside the message column right above the messages — the\n * windowed wire's history edge (`StatewireHistoryEdge`): the \"N earlier\n * messages\" row that pages older history in and fetches cut tool outputs.\n */\n beforeMessages?: ReactNode;\n /** Message renderers for ThreadPrimitive.Messages. */\n components: ChatThreadMessageComponents;\n /**\n * Wraps the messages element — for hosts that provide message-scoped\n * context (e.g. activity-grouping providers). Must render its argument.\n */\n renderMessages?: (messages: ReactNode) => ReactNode;\n /**\n * Rendered between the viewport and the composer: connection banners,\n * queued-message trays.\n */\n belowViewport?: ReactNode;\n /** The composer dock (or a read-only notice replacing it). */\n composer?: ReactNode;\n /**\n * Replaces the docked-panel card chrome — for hosts that render a\n * full-page column (AthenaChat's `aui-*` surface) instead of the\n * side-panel/task-pane card.\n */\n panelClassName?: string;\n /**\n * Value of the `--thread-max-width` variable read by width-capped\n * message/welcome/footer columns. Panels fill their width (the default,\n * \"100%\"); full-page hosts cap the column (AthenaChat defaults to 44rem).\n */\n maxWidth?: string;\n /**\n * Anchors the latest turn to the top of the viewport instead of pinning\n * scroll to the bottom (AthenaChat). Omitted = the primitive's default.\n */\n turnAnchor?: \"top\" | \"bottom\";\n /** Replaces the scroll-viewport chrome (padding, overflow tuning). */\n viewportClassName?: string;\n /**\n * Replaces the message-column chrome. Hosts whose welcome screen centers\n * vertically make this a flex column so the welcome node can grow.\n */\n contentClassName?: string;\n /**\n * Thread-level \"Thinking...\" indicator rendered after the messages. Hosts\n * whose message components render their own per-message indicators pass\n * null so the two never double up.\n */\n runningIndicator?: ReactNode;\n /**\n * Replaces the default centered scroll-to-bottom pill inside the sticky\n * viewport footer (AthenaChat floats a circular button above its composer).\n */\n scrollToBottom?: ReactNode;\n /**\n * Content docked inside the sticky viewport footer, after the\n * scroll-to-bottom control — for hosts whose banners + composer float over\n * the scrolling messages (AthenaChat) instead of sitting below the\n * viewport via `belowViewport`/`composer`.\n */\n viewportFooter?: ReactNode;\n /** Replaces the sticky viewport-footer chrome. */\n viewportFooterClassName?: string;\n /**\n * Marks the transcript read-only: mutating message actions (Edit,\n * Regenerate) hide while Copy stays available. For threads whose server\n * rejects dispatch (e.g. legacy pre-cutover conversations) — the runtime's\n * static capability flags cannot express a per-thread fence.\n */\n readOnly?: boolean;\n}\n\n/**\n * The shared thread layout: panel chrome, scroll viewport with welcome +\n * messages + running indicator, the sticky scroll-to-bottom control, and the\n * host-supplied composer dock.\n *\n * Hosts express their genuine divergences through the slots above; the\n * layout, scroll behaviour, and empty/running states stay identical across\n * surfaces so fixes land once.\n */\nexport function ChatThreadShell({\n overlay,\n header,\n banners,\n viewportOverlay,\n welcome,\n beforeMessages,\n components,\n renderMessages,\n belowViewport,\n composer,\n panelClassName,\n maxWidth = \"100%\",\n turnAnchor,\n viewportClassName,\n contentClassName,\n runningIndicator = <ThreadRunningIndicator />,\n scrollToBottom = <DefaultScrollToBottom />,\n viewportFooter,\n viewportFooterClassName,\n readOnly = false,\n}: ChatThreadShellProps) {\n const {\n UserMessage,\n AssistantMessage,\n UserEditComposer: UserEditComposerComponent = UserEditComposer,\n } = components;\n // ThreadPrimitive.Messages resolves per-message renderers by component\n // identity, so keep the merged map referentially stable across renders.\n const messageComponents = useMemo(\n () => ({\n UserMessage,\n AssistantMessage,\n UserEditComposer: UserEditComposerComponent,\n }),\n [UserMessage, AssistantMessage, UserEditComposerComponent],\n );\n const messages = <ThreadPrimitive.Messages components={messageComponents} />;\n return (\n <MessageActionsReadOnlyProvider readOnly={readOnly}>\n <ThreadPrimitive.Root\n className={panelClassName ?? THREAD_PANEL_CLASS}\n style={{ \"--thread-max-width\": maxWidth } as CSSProperties}\n >\n {overlay}\n {header}\n {banners}\n <ThreadPrimitive.Viewport\n turnAnchor={turnAnchor}\n className={viewportClassName ?? DEFAULT_VIEWPORT_CLASS}\n data-aui-thread-viewport=\"\"\n >\n {viewportOverlay}\n {/* No min-h-0 here: the column's automatic minimum height is what\n lets it extend past one screen, keeping the sticky footer's flow\n position after the full message list. Capping it detaches the\n footer (scroll pill, docked composers) as soon as the thread\n scrolls — proven in a live-browser probe of both structures. */}\n <div className=\"flex flex-1 flex-col items-center\">\n <div className={contentClassName ?? DEFAULT_CONTENT_CLASS}>\n {welcome != null ? (\n <ThreadPrimitive.Empty>{welcome}</ThreadPrimitive.Empty>\n ) : null}\n {beforeMessages}\n {renderMessages ? renderMessages(messages) : messages}\n {runningIndicator}\n </div>\n </div>\n <ThreadPrimitive.ViewportFooter\n className={viewportFooterClassName ?? DEFAULT_VIEWPORT_FOOTER_CLASS}\n >\n {scrollToBottom}\n {viewportFooter}\n </ThreadPrimitive.ViewportFooter>\n </ThreadPrimitive.Viewport>\n {belowViewport}\n {composer}\n </ThreadPrimitive.Root>\n </MessageActionsReadOnlyProvider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAsBA,MAAM,yBACJ;AACF,MAAM,wBAAwB;AAC9B,MAAM,gCAAgC;AAEtC,MAAM,wBAA4B,MAChC,oBAAC,OAAA,EAAM,WAAW,CAAC,UAAU,CAAC,MAAM,OAAO,SACzC,UAAA,oBAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,EAAC,gBAAgB;AAAA,EAAhB;AAAA,IACC,cAAW;AAAA,IACX,OAAM;AAAA,IACN,WAAW;AAAA,IAEX,UAAA,oBAAC,iBAAA,EAAgB,WAAU,WAAA,CAAW;AAAA,EAAA;AACxC,EAAA,CACF,EAAA,CACF;AA4GK,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,uCAAoB,wBAAA,EAAuB;AAAA,EAC3C,qCAAkB,uBAAA,EAAsB;AAAA,EACxC;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAyB;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,kBAAkB,4BAA4B;AAAA,EAAA,IAC5C;AAGJ,QAAM,oBAAoB;AAAA,IACxB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,IAAA;AAAA,IAEpB,CAAC,aAAa,kBAAkB,yBAAyB;AAAA,EAAA;AAE3D,QAAM,WAAW,oBAAC,gBAAgB,UAAhB,EAAyB,YAAY,mBAAmB;AAC1E,SACE,oBAAC,kCAA+B,UAC9B,UAAA;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,WAAW,kBAAkB;AAAA,MAC7B,OAAO,EAAE,sBAAsB,SAAA;AAAA,MAE9B,UAAA;AAAA,QAAA;AAAA,QACA;AAAA,QACA;AAAA,QACD;AAAA,UAAC,gBAAgB;AAAA,UAAhB;AAAA,YACC;AAAA,YACA,WAAW,qBAAqB;AAAA,YAChC,4BAAyB;AAAA,YAExB,UAAA;AAAA,cAAA;AAAA,cAMD,oBAAC,SAAI,WAAU,qCACb,+BAAC,OAAA,EAAI,WAAW,oBAAoB,uBACjC,UAAA;AAAA,gBAAA,WAAW,OACV,oBAAC,gBAAgB,OAAhB,EAAuB,mBAAQ,IAC9B;AAAA,gBACH;AAAA,gBACA,iBAAiB,eAAe,QAAQ,IAAI;AAAA,gBAC5C;AAAA,cAAA,EAAA,CACH,EAAA,CACF;AAAA,cACA;AAAA,gBAAC,gBAAgB;AAAA,gBAAhB;AAAA,kBACC,WAAW,2BAA2B;AAAA,kBAErC,UAAA;AAAA,oBAAA;AAAA,oBACA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH;AAAA,UAAA;AAAA,QAAA;AAAA,QAED;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;"}
1
+ {"version":3,"file":"chat-thread-shell.js","sources":["../../../src/chat-ui/thread/chat-thread-shell.tsx"],"sourcesContent":["import { AuiIf, ThreadPrimitive, useAuiState } from \"@assistant-ui/react\";\nimport { deepAgentRowKey } from \"@athenaintel/agent-runtime\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, CSSProperties, FC, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport {\n THREAD_PANEL_CLASS,\n THREAD_SCROLL_TO_BOTTOM_CLASS,\n} from \"../messages/message-components\";\nimport { AnswerLabelScope } from \"../messages/answer-label\";\nimport { MessageActionsReadOnlyProvider } from \"../messages/message-actions-config\";\nimport { UserEditComposer } from \"../messages/user-edit-composer\";\nimport { ThreadRunningIndicator } from \"../messages/running-indicator\";\nimport {\n HandoffArrivalAfterMessage,\n HandoffArrivalScope,\n} from \"../messages/handoff-arrival-divider\";\n\nexport interface ChatThreadMessageComponents {\n UserMessage: FC;\n AssistantMessage: FC;\n /**\n * Rendered in place of a user message while it is being edited (the action\n * bar's Edit control). Defaults to the shared UserEditComposer.\n */\n UserEditComposer?: FC;\n}\n\n// One wrapper per message renderer, so a renderer keeps its identity across\n// shells and renders: a row renders its message through the component it is\n// handed, and a new component identity would remount every row.\nconst withArrivalDivider = (() => {\n const wrapped = new WeakMap<FC, FC>();\n return (Message: FC): FC => {\n const existing = wrapped.get(Message);\n if (existing) return existing;\n const WithArrivalDivider: FC = () => (\n <>\n <Message />\n <HandoffArrivalAfterMessage />\n </>\n );\n wrapped.set(Message, WithArrivalDivider);\n return WithArrivalDivider;\n };\n})();\n\ntype ThreadRowComponents = ComponentProps<typeof ThreadPrimitive.MessageByIndex>[\"components\"];\n\nconst ROW_KEY_SEPARATOR = \"\\u0000\";\n\n/**\n * The thread's messages, one row each under its row key (`deepAgentRowKey`).\n *\n * `ThreadPrimitive.Messages` keys a row by its message id. A page of older\n * history that folds into the first loaded turn (a long run's earlier steps)\n * gives that turn a new id on every page, so keyed by id the turn's row\n * remounted once per page: it flashed through its entrance animation, closed\n * what the person had opened in it and took the browser's scroll anchor with\n * it. The row key stays with the row the turn continues, so the page lands in\n * the mounted row. A message from another runtime keys by its id, as before.\n */\nconst ThreadRows: FC<{ components: ThreadRowComponents }> = ({ components }) => {\n const joinedKeys = useAuiState((s) =>\n s.thread.messages.map((message) => deepAgentRowKey(message)).join(ROW_KEY_SEPARATOR),\n );\n const rowKeys = useMemo(\n () => (joinedKeys === \"\" ? [] : joinedKeys.split(ROW_KEY_SEPARATOR)),\n [joinedKeys],\n );\n return (\n <>\n {rowKeys.map((key, index) => (\n <ThreadPrimitive.MessageByIndex key={key} index={index} components={components} />\n ))}\n </>\n );\n};\n\nconst DEFAULT_VIEWPORT_CLASS =\n \"relative flex flex-1 flex-col overflow-y-auto scroll-smooth\";\nconst DEFAULT_CONTENT_CLASS = \"w-full flex-1 px-3 pt-3\";\nconst DEFAULT_VIEWPORT_FOOTER_CLASS = \"sticky bottom-0\";\n\nconst DefaultScrollToBottom: FC = () => (\n <AuiIf condition={(state) => !state.thread.isEmpty}>\n <div className=\"flex justify-center pb-0.5\">\n <ThreadPrimitive.ScrollToBottom\n aria-label=\"Scroll to bottom\"\n title=\"Scroll to bottom\"\n className={THREAD_SCROLL_TO_BOTTOM_CLASS}\n >\n <ChevronDownIcon className=\"size-3.5\" />\n </ThreadPrimitive.ScrollToBottom>\n </div>\n </AuiIf>\n);\n\nexport interface ChatThreadShellProps {\n /**\n * Rendered as the first child of the panel — for absolutely-positioned\n * scrims that must cover the whole panel (AthenaChat's thread-loading\n * overlay). The shell does not force a positioning context; hosts include\n * `relative` in `panelClassName` when the scrim anchors to the panel.\n */\n overlay?: ReactNode;\n /**\n * Rendered above the viewport, inside the panel: header rows, slide-over\n * panels, and anything else the host docks at the top.\n */\n header?: ReactNode;\n /** Status/approval banners rendered between the header and the viewport. */\n banners?: ReactNode;\n /**\n * Nodes rendered inside the scroll viewport before the message column —\n * absolutely/sticky-positioned overlays (thread-switch skeletons,\n * scroll-to-top controls) and invisible observers (read receipts).\n */\n viewportOverlay?: ReactNode;\n /** Empty-thread state, rendered via ThreadPrimitive.Empty when provided. */\n welcome?: ReactNode;\n /**\n * Rendered inside the message column right above the messages — the\n * windowed wire's history edge (`StatewireHistoryEdge`): the \"N earlier\n * messages\" row that pages older history in and fetches cut tool outputs.\n */\n beforeMessages?: ReactNode;\n /** Message renderers for the thread's rows. */\n components: ChatThreadMessageComponents;\n /**\n * Wraps the messages element — for hosts that provide message-scoped\n * context (e.g. activity-grouping providers). Must render its argument.\n */\n renderMessages?: (messages: ReactNode) => ReactNode;\n /**\n * Rendered between the viewport and the composer: connection banners,\n * queued-message trays.\n */\n belowViewport?: ReactNode;\n /** The composer dock (or a read-only notice replacing it). */\n composer?: ReactNode;\n /**\n * Replaces the docked-panel card chrome — for hosts that render a\n * full-page column (AthenaChat's `aui-*` surface) instead of the\n * side-panel/task-pane card.\n */\n panelClassName?: string;\n /**\n * Value of the `--thread-max-width` variable read by width-capped\n * message/welcome/footer columns. Panels fill their width (the default,\n * \"100%\"); full-page hosts cap the column (AthenaChat defaults to 44rem).\n */\n maxWidth?: string;\n /**\n * Anchors the latest turn to the top of the viewport instead of pinning\n * scroll to the bottom (AthenaChat). Omitted = the primitive's default.\n */\n turnAnchor?: \"top\" | \"bottom\";\n /** Replaces the scroll-viewport chrome (padding, overflow tuning). */\n viewportClassName?: string;\n /**\n * Replaces the message-column chrome. Hosts whose welcome screen centers\n * vertically make this a flex column so the welcome node can grow.\n */\n contentClassName?: string;\n /**\n * Thread-level \"Thinking...\" indicator rendered after the messages. Hosts\n * whose message components render their own per-message indicators pass\n * null so the two never double up.\n */\n runningIndicator?: ReactNode;\n /**\n * Replaces the default centered scroll-to-bottom pill inside the sticky\n * viewport footer (AthenaChat floats a circular button above its composer).\n */\n scrollToBottom?: ReactNode;\n /**\n * Content docked inside the sticky viewport footer, after the\n * scroll-to-bottom control — for hosts whose banners + composer float over\n * the scrolling messages (AthenaChat) instead of sitting below the\n * viewport via `belowViewport`/`composer`.\n */\n viewportFooter?: ReactNode;\n /** Replaces the sticky viewport-footer chrome. */\n viewportFooterClassName?: string;\n /**\n * Marks the transcript read-only: mutating message actions (Edit,\n * Regenerate) hide while Copy stays available. For threads whose server\n * rejects dispatch (e.g. legacy pre-cutover conversations) — the runtime's\n * static capability flags cannot express a per-thread fence.\n */\n readOnly?: boolean;\n /**\n * The backend id of the thread on screen. When this surface picked the\n * conversation up from another one (`recordHandoffArrival`), the transcript\n * shows \"Continued from …\" after the last message that was already there.\n */\n arrivalThreadId?: string | null;\n /**\n * The signed-in viewer's Athena user id (`user_…`), for the answer labels\n * (`AnswerLabel`): their own answers read \"for you\", and an answer for\n * another person is labelled even in a 1:1 chat. Omitted, answers name the\n * person by name and are labelled only once the thread holds several agents\n * or several people.\n */\n viewerUserId?: string | null;\n}\n\n/**\n * The shared thread layout: panel chrome, scroll viewport with welcome +\n * messages + running indicator, the sticky scroll-to-bottom control, and the\n * host-supplied composer dock.\n *\n * Hosts express their genuine divergences through the slots above; the\n * layout, scroll behaviour, and empty/running states stay identical across\n * surfaces so fixes land once.\n */\nexport function ChatThreadShell({\n overlay,\n header,\n banners,\n viewportOverlay,\n welcome,\n beforeMessages,\n components,\n renderMessages,\n belowViewport,\n composer,\n panelClassName,\n maxWidth = \"100%\",\n turnAnchor,\n viewportClassName,\n contentClassName,\n runningIndicator = <ThreadRunningIndicator />,\n scrollToBottom = <DefaultScrollToBottom />,\n viewportFooter,\n viewportFooterClassName,\n readOnly = false,\n arrivalThreadId = null,\n viewerUserId = null,\n}: ChatThreadShellProps) {\n const {\n UserMessage,\n AssistantMessage,\n UserEditComposer: UserEditComposerComponent = UserEditComposer,\n } = components;\n // A row resolves its renderer by component identity, so keep the merged map\n // referentially stable across renders.\n const messageComponents = useMemo(\n () => ({\n UserMessage: withArrivalDivider(UserMessage),\n AssistantMessage: withArrivalDivider(AssistantMessage),\n UserEditComposer: UserEditComposerComponent,\n }),\n [UserMessage, AssistantMessage, UserEditComposerComponent],\n );\n const messages = (\n <HandoffArrivalScope threadId={arrivalThreadId}>\n <AnswerLabelScope viewerUserId={viewerUserId}>\n <ThreadRows components={messageComponents} />\n </AnswerLabelScope>\n </HandoffArrivalScope>\n );\n return (\n <MessageActionsReadOnlyProvider readOnly={readOnly}>\n <ThreadPrimitive.Root\n className={panelClassName ?? THREAD_PANEL_CLASS}\n style={{ \"--thread-max-width\": maxWidth } as CSSProperties}\n >\n {overlay}\n {header}\n {banners}\n <ThreadPrimitive.Viewport\n turnAnchor={turnAnchor}\n className={viewportClassName ?? DEFAULT_VIEWPORT_CLASS}\n data-aui-thread-viewport=\"\"\n >\n {viewportOverlay}\n {/* No min-h-0 here: the column's automatic minimum height is what\n lets it extend past one screen, keeping the sticky footer's flow\n position after the full message list. Capping it detaches the\n footer (scroll pill, docked composers) as soon as the thread\n scrolls — proven in a live-browser probe of both structures. */}\n <div className=\"flex flex-1 flex-col items-center\">\n <div className={contentClassName ?? DEFAULT_CONTENT_CLASS}>\n {welcome != null ? (\n <ThreadPrimitive.Empty>{welcome}</ThreadPrimitive.Empty>\n ) : null}\n {beforeMessages}\n {renderMessages ? renderMessages(messages) : messages}\n {runningIndicator}\n </div>\n </div>\n <ThreadPrimitive.ViewportFooter\n className={viewportFooterClassName ?? DEFAULT_VIEWPORT_FOOTER_CLASS}\n >\n {scrollToBottom}\n {viewportFooter}\n </ThreadPrimitive.ViewportFooter>\n </ThreadPrimitive.Viewport>\n {belowViewport}\n {composer}\n </ThreadPrimitive.Root>\n </MessageActionsReadOnlyProvider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AA+BA,MAAM,qBAAsB,uBAAM;AAChC,QAAM,8BAAc,QAAA;AACpB,SAAO,CAAC,YAAoB;AAC1B,UAAM,WAAW,QAAQ,IAAI,OAAO;AACpC,QAAI,SAAU,QAAO;AACrB,UAAM,qBAAyB,MAC7B,qBAAA,UAAA,EACE,UAAA;AAAA,MAAA,oBAAC,SAAA,EAAQ;AAAA,0BACR,4BAAA,CAAA,CAA2B;AAAA,IAAA,GAC9B;AAEF,YAAQ,IAAI,SAAS,kBAAkB;AACvC,WAAO;AAAA,EACT;AACF,GAAA;AAIA,MAAM,oBAAoB;AAa1B,MAAM,aAAsD,CAAC,EAAE,iBAAiB;AAC9E,QAAM,aAAa;AAAA,IAAY,CAAC,MAC9B,EAAE,OAAO,SAAS,IAAI,CAAC,YAAY,gBAAgB,OAAO,CAAC,EAAE,KAAK,iBAAiB;AAAA,EAAA;AAErF,QAAM,UAAU;AAAA,IACd,MAAO,eAAe,KAAK,CAAA,IAAK,WAAW,MAAM,iBAAiB;AAAA,IAClE,CAAC,UAAU;AAAA,EAAA;AAEb,SACE,oBAAA,UAAA,EACG,UAAA,QAAQ,IAAI,CAAC,KAAK,UACjB,oBAAC,gBAAgB,gBAAhB,EAAyC,OAAc,cAAnB,GAA2C,CACjF,GACH;AAEJ;AAEA,MAAM,yBACJ;AACF,MAAM,wBAAwB;AAC9B,MAAM,gCAAgC;AAEtC,MAAM,wBAA4B,MAChC,oBAAC,OAAA,EAAM,WAAW,CAAC,UAAU,CAAC,MAAM,OAAO,SACzC,UAAA,oBAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,EAAC,gBAAgB;AAAA,EAAhB;AAAA,IACC,cAAW;AAAA,IACX,OAAM;AAAA,IACN,WAAW;AAAA,IAEX,UAAA,oBAAC,iBAAA,EAAgB,WAAU,WAAA,CAAW;AAAA,EAAA;AACxC,EAAA,CACF,EAAA,CACF;AA0HK,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,uCAAoB,wBAAA,EAAuB;AAAA,EAC3C,qCAAkB,uBAAA,EAAsB;AAAA,EACxC;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,eAAe;AACjB,GAAyB;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,kBAAkB,4BAA4B;AAAA,EAAA,IAC5C;AAGJ,QAAM,oBAAoB;AAAA,IACxB,OAAO;AAAA,MACL,aAAa,mBAAmB,WAAW;AAAA,MAC3C,kBAAkB,mBAAmB,gBAAgB;AAAA,MACrD,kBAAkB;AAAA,IAAA;AAAA,IAEpB,CAAC,aAAa,kBAAkB,yBAAyB;AAAA,EAAA;AAE3D,QAAM,WACJ,oBAAC,qBAAA,EAAoB,UAAU,iBAC7B,UAAA,oBAAC,kBAAA,EAAiB,cAChB,UAAA,oBAAC,YAAA,EAAW,YAAY,kBAAA,CAAmB,GAC7C,GACF;AAEF,SACE,oBAAC,kCAA+B,UAC9B,UAAA;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,WAAW,kBAAkB;AAAA,MAC7B,OAAO,EAAE,sBAAsB,SAAA;AAAA,MAE9B,UAAA;AAAA,QAAA;AAAA,QACA;AAAA,QACA;AAAA,QACD;AAAA,UAAC,gBAAgB;AAAA,UAAhB;AAAA,YACC;AAAA,YACA,WAAW,qBAAqB;AAAA,YAChC,4BAAyB;AAAA,YAExB,UAAA;AAAA,cAAA;AAAA,cAMD,oBAAC,SAAI,WAAU,qCACb,+BAAC,OAAA,EAAI,WAAW,oBAAoB,uBACjC,UAAA;AAAA,gBAAA,WAAW,OACV,oBAAC,gBAAgB,OAAhB,EAAuB,mBAAQ,IAC9B;AAAA,gBACH;AAAA,gBACA,iBAAiB,eAAe,QAAQ,IAAI;AAAA,gBAC5C;AAAA,cAAA,EAAA,CACH,EAAA,CACF;AAAA,cACA;AAAA,gBAAC,gBAAgB;AAAA,gBAAhB;AAAA,kBACC,WAAW,2BAA2B;AAAA,kBAErC,UAAA;AAAA,oBAAA;AAAA,oBACA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH;AAAA,UAAA;AAAA,QAAA;AAAA,QAED;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEL;AAEJ;"}
@@ -3,13 +3,14 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const athenaDiagnostics = require("../../diagnostics/athena-diagnostics.cjs");
5
5
  const react = require("@assistant-ui/react");
6
- const react$1 = require("react");
6
+ const require$$0 = require("react");
7
7
  const composerAction = require("../composer/composer-action.cjs");
8
8
  const messageComponents = require("../messages/message-components.cjs");
9
9
  const ComposerSendOrStop = ({
10
10
  composerRef,
11
11
  hasDraft,
12
12
  liveVoice = false,
13
+ liveSession = null,
13
14
  disabled = false,
14
15
  sendBlockedReason = null,
15
16
  sendDisabledTitle,
@@ -25,10 +26,10 @@ const ComposerSendOrStop = ({
25
26
  return ((_a = state.optional.thread) == null ? void 0 : _a.isRunning) ?? false;
26
27
  }
27
28
  );
28
- const action = liveVoice && hasDraft ? "send" : composerAction.resolveComposerAction({ hasDraft, isRunning });
29
+ const action = liveVoice && hasDraft ? "send" : !hasDraft && liveSession !== null ? "stop" : composerAction.resolveComposerAction({ hasDraft, isRunning });
29
30
  const SendButton = (components == null ? void 0 : components.SendButton) ?? messageComponents.ComposerSendButton;
30
31
  const StopButton = (components == null ? void 0 : components.StopButton) ?? messageComponents.ComposerStopButton;
31
- const cancelRun = react$1.useCallback(() => {
32
+ const cancelRun = require$$0.useCallback(() => {
32
33
  try {
33
34
  aui.thread.cancelRun();
34
35
  return true;
@@ -40,29 +41,31 @@ const ComposerSendOrStop = ({
40
41
  return false;
41
42
  }
42
43
  }, [aui]);
43
- if (action === "stop") {
44
- return /* @__PURE__ */ jsxRuntime.jsx(
45
- StopButton,
46
- {
47
- onStop: () => {
48
- if (onStop) {
49
- onStop({ cancelRun });
50
- } else {
51
- cancelRun();
52
- }
53
- },
54
- disabled,
55
- title: disabled && stopDisabledTitle ? stopDisabledTitle : void 0
56
- }
57
- );
58
- }
44
+ const stopRun = () => isRunning ? cancelRun() : true;
45
+ const stopEverything = () => {
46
+ liveSession == null ? void 0 : liveSession.end();
47
+ if (onStop) {
48
+ onStop({ cancelRun: stopRun });
49
+ } else {
50
+ stopRun();
51
+ }
52
+ };
53
+ const stopControl = /* @__PURE__ */ jsxRuntime.jsx(
54
+ StopButton,
55
+ {
56
+ onStop: stopEverything,
57
+ disabled,
58
+ title: disabled && stopDisabledTitle ? stopDisabledTitle : liveSession ? "Stop" : void 0
59
+ }
60
+ );
61
+ if (action === "stop") return stopControl;
59
62
  const handleSend = async () => {
60
63
  var _a;
61
64
  await (onBeforeSend == null ? void 0 : onBeforeSend({ action }));
62
65
  await ((_a = composerRef.current) == null ? void 0 : _a.submit());
63
66
  };
64
67
  const sendTitle = disabled && sendDisabledTitle ? sendDisabledTitle : sendBlockedReason ?? void 0;
65
- return /* @__PURE__ */ jsxRuntime.jsx(
68
+ const sendControl = /* @__PURE__ */ jsxRuntime.jsx(
66
69
  SendButton,
67
70
  {
68
71
  action,
@@ -71,6 +74,13 @@ const ComposerSendOrStop = ({
71
74
  title: sendTitle
72
75
  }
73
76
  );
77
+ if (liveSession !== null) {
78
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
79
+ stopControl,
80
+ sendControl
81
+ ] });
82
+ }
83
+ return sendControl;
74
84
  };
75
85
  exports.ComposerSendOrStop = ComposerSendOrStop;
76
86
  //# sourceMappingURL=composer-send-or-stop.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"composer-send-or-stop.cjs","sources":["../../../src/chat-ui/thread/composer-send-or-stop.tsx"],"sourcesContent":["import { athenaDiagnostics } from \"../../diagnostics/athena-diagnostics\";\nimport { useAui, useAuiState } from \"@assistant-ui/react\";\nimport type { FC, RefObject } from \"react\";\nimport { useCallback } from \"react\";\nimport {\n resolveComposerAction,\n type ComposerAction,\n} from \"../composer/composer-action\";\nimport {\n ComposerSendButton,\n ComposerStopButton,\n type ComposerSendButtonProps,\n type ComposerStopButtonProps,\n} from \"../messages/message-components\";\n\n/**\n * The slice of a composer handle this control needs: something whose draft\n * can be submitted. `TiptapComposerHandle` satisfies it; hosts with their own\n * editor plumbing (the SDK's AthenaChat) expose a compatible handle.\n */\nexport interface ComposerSubmitHandle {\n submit: () => void | Promise<void>;\n}\n\nexport interface ComposerStopControls {\n /**\n * Cancels the active run via the runtime. Returns false when cancellation\n * threw (e.g. the run already settled), so hosts can report whether their\n * own teardown still needs to stop backend work.\n */\n cancelRun: () => boolean;\n}\n\n/**\n * Control renderers, for hosts with their own published theming contract\n * (AthenaChat's `aui-*` class system). Defaults render the shared buttons.\n */\nexport interface ComposerSendOrStopComponents {\n SendButton?: FC<ComposerSendButtonProps>;\n StopButton?: FC<ComposerStopButtonProps>;\n}\n\nexport interface ComposerSendOrStopProps {\n composerRef: RefObject<ComposerSubmitHandle | null>;\n hasDraft: boolean;\n /** A plain draft enters the live voice conversation instead of the run queue. */\n liveVoice?: boolean;\n /** Disables both send and stop (e.g. while a conversation restores). */\n disabled?: boolean;\n /**\n * Blocks sending (not stopping) with this reason as the tooltip — e.g. a\n * broken host tunnel that would make tool calls silently fail.\n */\n sendBlockedReason?: string | null;\n /** Tooltip for the send/queue control while `disabled`. */\n sendDisabledTitle?: string;\n /** Tooltip for the stop control while `disabled`. */\n stopDisabledTitle?: string;\n /**\n * Host work to run before the draft submits (per-turn bookkeeping).\n * `action` distinguishes a fresh send from queueing into an active run.\n */\n onBeforeSend?: (context: {\n action: Extract<ComposerAction, \"send\" | \"queue\">;\n }) => void | Promise<void>;\n /**\n * Full custom stop sequence. Hosts that must tear down in-flight host-side\n * work sequence it around `controls.cancelRun()`. Default: cancel the run.\n */\n onStop?: (controls: ComposerStopControls) => void;\n components?: ComposerSendOrStopComponents;\n}\n\n/**\n * The shared send/queue/stop control: sends the composer draft, queues it as\n * a follow-up while a run is in flight, or stops the run when there is\n * nothing to queue.\n */\nexport const ComposerSendOrStop: FC<ComposerSendOrStopProps> = ({\n composerRef,\n hasDraft,\n liveVoice = false,\n disabled = false,\n sendBlockedReason = null,\n sendDisabledTitle,\n stopDisabledTitle,\n onBeforeSend,\n onStop,\n components,\n}) => {\n const aui = useAui();\n const isRunning = useAuiState(\n (state) => state.optional.thread?.isRunning ?? false,\n );\n const action = liveVoice && hasDraft ? 'send' : resolveComposerAction({ hasDraft, isRunning });\n const SendButton = components?.SendButton ?? ComposerSendButton;\n const StopButton = components?.StopButton ?? ComposerStopButton;\n\n const cancelRun = useCallback((): boolean => {\n try {\n aui.thread.cancelRun();\n return true;\n } catch (error) {\n athenaDiagnostics.emit(\"composer.cancel.error\", {\n level: \"warn\",\n data: { error: error instanceof Error ? error.message : String(error) },\n });\n return false;\n }\n }, [aui]);\n\n if (action === \"stop\") {\n return (\n <StopButton\n onStop={() => {\n if (onStop) {\n onStop({ cancelRun });\n } else {\n cancelRun();\n }\n }}\n disabled={disabled}\n title={disabled && stopDisabledTitle ? stopDisabledTitle : undefined}\n />\n );\n }\n\n const handleSend = async () => {\n await onBeforeSend?.({ action });\n await composerRef.current?.submit();\n };\n const sendTitle =\n disabled && sendDisabledTitle\n ? sendDisabledTitle\n : (sendBlockedReason ?? undefined);\n return (\n <SendButton\n action={action}\n onSend={() => void handleSend()}\n disabled={disabled || !hasDraft || sendBlockedReason != null}\n title={sendTitle}\n />\n );\n};\n"],"names":["useAui","useAuiState","resolveComposerAction","ComposerSendButton","ComposerStopButton","useCallback","athenaDiagnostics","jsx"],"mappings":";;;;;;;;AA8EO,MAAM,qBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,MAAMA,MAAAA,OAAA;AACZ,QAAM,YAAYC,MAAAA;AAAAA,IAChB,CAAC,UAAA;;AAAU,0BAAM,SAAS,WAAf,mBAAuB,cAAa;AAAA;AAAA,EAAA;AAEjD,QAAM,SAAS,aAAa,WAAW,SAASC,eAAAA,sBAAsB,EAAE,UAAU,WAAW;AAC7F,QAAM,cAAa,yCAAY,eAAcC,kBAAAA;AAC7C,QAAM,cAAa,yCAAY,eAAcC,kBAAAA;AAE7C,QAAM,YAAYC,QAAAA,YAAY,MAAe;AAC3C,QAAI;AACF,UAAI,OAAO,UAAA;AACX,aAAO;AAAA,IACT,SAAS,OAAO;AACdC,wBAAAA,kBAAkB,KAAK,yBAAyB;AAAA,QAC9C,OAAO;AAAA,QACP,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAA;AAAA,MAAE,CACvE;AACD,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,MAAI,WAAW,QAAQ;AACrB,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,MAAM;AACZ,cAAI,QAAQ;AACV,mBAAO,EAAE,WAAW;AAAA,UACtB,OAAO;AACL,sBAAA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,QACA,OAAO,YAAY,oBAAoB,oBAAoB;AAAA,MAAA;AAAA,IAAA;AAAA,EAGjE;AAEA,QAAM,aAAa,YAAY;;AAC7B,WAAM,6CAAe,EAAE;AACvB,YAAM,iBAAY,YAAZ,mBAAqB;AAAA,EAC7B;AACA,QAAM,YACJ,YAAY,oBACR,oBACC,qBAAqB;AAC5B,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,QAAQ,MAAM,KAAK,WAAA;AAAA,MACnB,UAAU,YAAY,CAAC,YAAY,qBAAqB;AAAA,MACxD,OAAO;AAAA,IAAA;AAAA,EAAA;AAGb;;"}
1
+ {"version":3,"file":"composer-send-or-stop.cjs","sources":["../../../src/chat-ui/thread/composer-send-or-stop.tsx"],"sourcesContent":["import { athenaDiagnostics } from \"../../diagnostics/athena-diagnostics\";\nimport { useAui, useAuiState } from \"@assistant-ui/react\";\nimport type { FC, RefObject } from \"react\";\nimport { useCallback } from \"react\";\nimport {\n resolveComposerAction,\n type ComposerAction,\n} from \"../composer/composer-action\";\nimport {\n ComposerSendButton,\n ComposerStopButton,\n type ComposerSendButtonProps,\n type ComposerStopButtonProps,\n} from \"../messages/message-components\";\n\n/**\n * The slice of a composer handle this control needs: something whose draft\n * can be submitted. `TiptapComposerHandle` satisfies it; hosts with their own\n * editor plumbing (the SDK's AthenaChat) expose a compatible handle.\n */\nexport interface ComposerSubmitHandle {\n submit: () => void | Promise<void>;\n}\n\nexport interface ComposerStopControls {\n /**\n * Cancels the active run via the runtime. Returns false when cancellation\n * threw (e.g. the run already settled), so hosts can report whether their\n * own teardown still needs to stop backend work.\n */\n cancelRun: () => boolean;\n}\n\n/**\n * Control renderers, for hosts with their own published theming contract\n * (AthenaChat's `aui-*` class system). Defaults render the shared buttons.\n */\nexport interface ComposerSendOrStopComponents {\n SendButton?: FC<ComposerSendButtonProps>;\n StopButton?: FC<ComposerStopButtonProps>;\n}\n\nexport interface ComposerSendOrStopProps {\n composerRef: RefObject<ComposerSubmitHandle | null>;\n hasDraft: boolean;\n /** A plain draft enters the live voice conversation instead of the run queue. */\n liveVoice?: boolean;\n /**\n * A live session (voice, connecting or live) the Stop control also ends.\n * With it, an empty draft shows Stop even when no run is in flight, and\n * Stop ends the session AND cancels any run: one control stops everything.\n */\n liveSession?: { end: () => void } | null;\n /** Disables both send and stop (e.g. while a conversation restores). */\n disabled?: boolean;\n /**\n * Blocks sending (not stopping) with this reason as the tooltip — e.g. a\n * broken host tunnel that would make tool calls silently fail.\n */\n sendBlockedReason?: string | null;\n /** Tooltip for the send/queue control while `disabled`. */\n sendDisabledTitle?: string;\n /** Tooltip for the stop control while `disabled`. */\n stopDisabledTitle?: string;\n /**\n * Host work to run before the draft submits (per-turn bookkeeping).\n * `action` distinguishes a fresh send from queueing into an active run.\n */\n onBeforeSend?: (context: {\n action: Extract<ComposerAction, \"send\" | \"queue\">;\n }) => void | Promise<void>;\n /**\n * Full custom stop sequence. Hosts that must tear down in-flight host-side\n * work sequence it around `controls.cancelRun()`. Default: cancel the run.\n */\n onStop?: (controls: ComposerStopControls) => void;\n components?: ComposerSendOrStopComponents;\n}\n\n/**\n * The shared send/queue/stop control: sends the composer draft, queues it as\n * a follow-up while a run is in flight, or stops the run when there is\n * nothing to queue.\n */\nexport const ComposerSendOrStop: FC<ComposerSendOrStopProps> = ({\n composerRef,\n hasDraft,\n liveVoice = false,\n liveSession = null,\n disabled = false,\n sendBlockedReason = null,\n sendDisabledTitle,\n stopDisabledTitle,\n onBeforeSend,\n onStop,\n components,\n}) => {\n const aui = useAui();\n const isRunning = useAuiState(\n (state) => state.optional.thread?.isRunning ?? false,\n );\n // A draft sends (into the live voice conversation, or as a run) or queues\n // behind a run; only an empty draft turns the control into Stop, and a\n // live session alone is enough for that.\n const action: ComposerAction =\n liveVoice && hasDraft\n ? \"send\"\n : !hasDraft && liveSession !== null\n ? \"stop\"\n : resolveComposerAction({ hasDraft, isRunning });\n const SendButton = components?.SendButton ?? ComposerSendButton;\n const StopButton = components?.StopButton ?? ComposerStopButton;\n\n const cancelRun = useCallback((): boolean => {\n try {\n aui.thread.cancelRun();\n return true;\n } catch (error) {\n athenaDiagnostics.emit(\"composer.cancel.error\", {\n level: \"warn\",\n data: { error: error instanceof Error ? error.message : String(error) },\n });\n return false;\n }\n }, [aui]);\n\n // With only a session to end, a cancel would find no run to stop.\n const stopRun = (): boolean => (isRunning ? cancelRun() : true);\n const stopEverything = () => {\n liveSession?.end();\n if (onStop) {\n onStop({ cancelRun: stopRun });\n } else {\n stopRun();\n }\n };\n const stopControl = (\n <StopButton\n onStop={stopEverything}\n disabled={disabled}\n title={\n disabled && stopDisabledTitle\n ? stopDisabledTitle\n : liveSession\n ? \"Stop\"\n : undefined\n }\n />\n );\n\n if (action === \"stop\") return stopControl;\n\n const handleSend = async () => {\n await onBeforeSend?.({ action });\n await composerRef.current?.submit();\n };\n const sendTitle =\n disabled && sendDisabledTitle\n ? sendDisabledTitle\n : (sendBlockedReason ?? undefined);\n const sendControl = (\n <SendButton\n action={action}\n onSend={() => void handleSend()}\n disabled={disabled || !hasDraft || sendBlockedReason != null}\n title={sendTitle}\n />\n );\n // A live session keeps its Stop beside Send while a draft is typed, so the\n // call (and any run) can end without sending or discarding the words; the\n // draft stays in the composer.\n if (liveSession !== null) {\n return (\n <>\n {stopControl}\n {sendControl}\n </>\n );\n }\n return sendControl;\n};\n"],"names":["useAui","useAuiState","resolveComposerAction","ComposerSendButton","ComposerStopButton","useCallback","athenaDiagnostics","jsx","jsxs","Fragment"],"mappings":";;;;;;;;AAoFO,MAAM,qBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,MAAMA,MAAAA,OAAA;AACZ,QAAM,YAAYC,MAAAA;AAAAA,IAChB,CAAC,UAAA;;AAAU,0BAAM,SAAS,WAAf,mBAAuB,cAAa;AAAA;AAAA,EAAA;AAKjD,QAAM,SACJ,aAAa,WACT,SACA,CAAC,YAAY,gBAAgB,OAC3B,SACAC,eAAAA,sBAAsB,EAAE,UAAU,WAAW;AACrD,QAAM,cAAa,yCAAY,eAAcC,kBAAAA;AAC7C,QAAM,cAAa,yCAAY,eAAcC,kBAAAA;AAE7C,QAAM,YAAYC,WAAAA,YAAY,MAAe;AAC3C,QAAI;AACF,UAAI,OAAO,UAAA;AACX,aAAO;AAAA,IACT,SAAS,OAAO;AACdC,wBAAAA,kBAAkB,KAAK,yBAAyB;AAAA,QAC9C,OAAO;AAAA,QACP,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAA;AAAA,MAAE,CACvE;AACD,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAGR,QAAM,UAAU,MAAgB,YAAY,UAAA,IAAc;AAC1D,QAAM,iBAAiB,MAAM;AAC3B,+CAAa;AACb,QAAI,QAAQ;AACV,aAAO,EAAE,WAAW,SAAS;AAAA,IAC/B,OAAO;AACL,cAAA;AAAA,IACF;AAAA,EACF;AACA,QAAM,cACJC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR;AAAA,MACA,OACE,YAAY,oBACR,oBACA,cACE,SACA;AAAA,IAAA;AAAA,EAAA;AAKZ,MAAI,WAAW,OAAQ,QAAO;AAE9B,QAAM,aAAa,YAAY;;AAC7B,WAAM,6CAAe,EAAE;AACvB,YAAM,iBAAY,YAAZ,mBAAqB;AAAA,EAC7B;AACA,QAAM,YACJ,YAAY,oBACR,oBACC,qBAAqB;AAC5B,QAAM,cACJA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,QAAQ,MAAM,KAAK,WAAA;AAAA,MACnB,UAAU,YAAY,CAAC,YAAY,qBAAqB;AAAA,MACxD,OAAO;AAAA,IAAA;AAAA,EAAA;AAMX,MAAI,gBAAgB,MAAM;AACxB,WACEC,2BAAAA,KAAAC,qBAAA,EACG,UAAA;AAAA,MAAA;AAAA,MACA;AAAA,IAAA,GACH;AAAA,EAEJ;AACA,SAAO;AACT;;"}
@@ -30,6 +30,14 @@ export interface ComposerSendOrStopProps {
30
30
  hasDraft: boolean;
31
31
  /** A plain draft enters the live voice conversation instead of the run queue. */
32
32
  liveVoice?: boolean;
33
+ /**
34
+ * A live session (voice, connecting or live) the Stop control also ends.
35
+ * With it, an empty draft shows Stop even when no run is in flight, and
36
+ * Stop ends the session AND cancels any run: one control stops everything.
37
+ */
38
+ liveSession?: {
39
+ end: () => void;
40
+ } | null;
33
41
  /** Disables both send and stop (e.g. while a conversation restores). */
34
42
  disabled?: boolean;
35
43
  /**
@@ -1,4 +1,4 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import { athenaDiagnostics } from "../../diagnostics/athena-diagnostics.js";
3
3
  import { useAui, useAuiState } from "@assistant-ui/react";
4
4
  import { useCallback } from "react";
@@ -8,6 +8,7 @@ const ComposerSendOrStop = ({
8
8
  composerRef,
9
9
  hasDraft,
10
10
  liveVoice = false,
11
+ liveSession = null,
11
12
  disabled = false,
12
13
  sendBlockedReason = null,
13
14
  sendDisabledTitle,
@@ -23,7 +24,7 @@ const ComposerSendOrStop = ({
23
24
  return ((_a = state.optional.thread) == null ? void 0 : _a.isRunning) ?? false;
24
25
  }
25
26
  );
26
- const action = liveVoice && hasDraft ? "send" : resolveComposerAction({ hasDraft, isRunning });
27
+ const action = liveVoice && hasDraft ? "send" : !hasDraft && liveSession !== null ? "stop" : resolveComposerAction({ hasDraft, isRunning });
27
28
  const SendButton = (components == null ? void 0 : components.SendButton) ?? ComposerSendButton;
28
29
  const StopButton = (components == null ? void 0 : components.StopButton) ?? ComposerStopButton;
29
30
  const cancelRun = useCallback(() => {
@@ -38,29 +39,31 @@ const ComposerSendOrStop = ({
38
39
  return false;
39
40
  }
40
41
  }, [aui]);
41
- if (action === "stop") {
42
- return /* @__PURE__ */ jsx(
43
- StopButton,
44
- {
45
- onStop: () => {
46
- if (onStop) {
47
- onStop({ cancelRun });
48
- } else {
49
- cancelRun();
50
- }
51
- },
52
- disabled,
53
- title: disabled && stopDisabledTitle ? stopDisabledTitle : void 0
54
- }
55
- );
56
- }
42
+ const stopRun = () => isRunning ? cancelRun() : true;
43
+ const stopEverything = () => {
44
+ liveSession == null ? void 0 : liveSession.end();
45
+ if (onStop) {
46
+ onStop({ cancelRun: stopRun });
47
+ } else {
48
+ stopRun();
49
+ }
50
+ };
51
+ const stopControl = /* @__PURE__ */ jsx(
52
+ StopButton,
53
+ {
54
+ onStop: stopEverything,
55
+ disabled,
56
+ title: disabled && stopDisabledTitle ? stopDisabledTitle : liveSession ? "Stop" : void 0
57
+ }
58
+ );
59
+ if (action === "stop") return stopControl;
57
60
  const handleSend = async () => {
58
61
  var _a;
59
62
  await (onBeforeSend == null ? void 0 : onBeforeSend({ action }));
60
63
  await ((_a = composerRef.current) == null ? void 0 : _a.submit());
61
64
  };
62
65
  const sendTitle = disabled && sendDisabledTitle ? sendDisabledTitle : sendBlockedReason ?? void 0;
63
- return /* @__PURE__ */ jsx(
66
+ const sendControl = /* @__PURE__ */ jsx(
64
67
  SendButton,
65
68
  {
66
69
  action,
@@ -69,6 +72,13 @@ const ComposerSendOrStop = ({
69
72
  title: sendTitle
70
73
  }
71
74
  );
75
+ if (liveSession !== null) {
76
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
77
+ stopControl,
78
+ sendControl
79
+ ] });
80
+ }
81
+ return sendControl;
72
82
  };
73
83
  export {
74
84
  ComposerSendOrStop
@@ -1 +1 @@
1
- {"version":3,"file":"composer-send-or-stop.js","sources":["../../../src/chat-ui/thread/composer-send-or-stop.tsx"],"sourcesContent":["import { athenaDiagnostics } from \"../../diagnostics/athena-diagnostics\";\nimport { useAui, useAuiState } from \"@assistant-ui/react\";\nimport type { FC, RefObject } from \"react\";\nimport { useCallback } from \"react\";\nimport {\n resolveComposerAction,\n type ComposerAction,\n} from \"../composer/composer-action\";\nimport {\n ComposerSendButton,\n ComposerStopButton,\n type ComposerSendButtonProps,\n type ComposerStopButtonProps,\n} from \"../messages/message-components\";\n\n/**\n * The slice of a composer handle this control needs: something whose draft\n * can be submitted. `TiptapComposerHandle` satisfies it; hosts with their own\n * editor plumbing (the SDK's AthenaChat) expose a compatible handle.\n */\nexport interface ComposerSubmitHandle {\n submit: () => void | Promise<void>;\n}\n\nexport interface ComposerStopControls {\n /**\n * Cancels the active run via the runtime. Returns false when cancellation\n * threw (e.g. the run already settled), so hosts can report whether their\n * own teardown still needs to stop backend work.\n */\n cancelRun: () => boolean;\n}\n\n/**\n * Control renderers, for hosts with their own published theming contract\n * (AthenaChat's `aui-*` class system). Defaults render the shared buttons.\n */\nexport interface ComposerSendOrStopComponents {\n SendButton?: FC<ComposerSendButtonProps>;\n StopButton?: FC<ComposerStopButtonProps>;\n}\n\nexport interface ComposerSendOrStopProps {\n composerRef: RefObject<ComposerSubmitHandle | null>;\n hasDraft: boolean;\n /** A plain draft enters the live voice conversation instead of the run queue. */\n liveVoice?: boolean;\n /** Disables both send and stop (e.g. while a conversation restores). */\n disabled?: boolean;\n /**\n * Blocks sending (not stopping) with this reason as the tooltip — e.g. a\n * broken host tunnel that would make tool calls silently fail.\n */\n sendBlockedReason?: string | null;\n /** Tooltip for the send/queue control while `disabled`. */\n sendDisabledTitle?: string;\n /** Tooltip for the stop control while `disabled`. */\n stopDisabledTitle?: string;\n /**\n * Host work to run before the draft submits (per-turn bookkeeping).\n * `action` distinguishes a fresh send from queueing into an active run.\n */\n onBeforeSend?: (context: {\n action: Extract<ComposerAction, \"send\" | \"queue\">;\n }) => void | Promise<void>;\n /**\n * Full custom stop sequence. Hosts that must tear down in-flight host-side\n * work sequence it around `controls.cancelRun()`. Default: cancel the run.\n */\n onStop?: (controls: ComposerStopControls) => void;\n components?: ComposerSendOrStopComponents;\n}\n\n/**\n * The shared send/queue/stop control: sends the composer draft, queues it as\n * a follow-up while a run is in flight, or stops the run when there is\n * nothing to queue.\n */\nexport const ComposerSendOrStop: FC<ComposerSendOrStopProps> = ({\n composerRef,\n hasDraft,\n liveVoice = false,\n disabled = false,\n sendBlockedReason = null,\n sendDisabledTitle,\n stopDisabledTitle,\n onBeforeSend,\n onStop,\n components,\n}) => {\n const aui = useAui();\n const isRunning = useAuiState(\n (state) => state.optional.thread?.isRunning ?? false,\n );\n const action = liveVoice && hasDraft ? 'send' : resolveComposerAction({ hasDraft, isRunning });\n const SendButton = components?.SendButton ?? ComposerSendButton;\n const StopButton = components?.StopButton ?? ComposerStopButton;\n\n const cancelRun = useCallback((): boolean => {\n try {\n aui.thread.cancelRun();\n return true;\n } catch (error) {\n athenaDiagnostics.emit(\"composer.cancel.error\", {\n level: \"warn\",\n data: { error: error instanceof Error ? error.message : String(error) },\n });\n return false;\n }\n }, [aui]);\n\n if (action === \"stop\") {\n return (\n <StopButton\n onStop={() => {\n if (onStop) {\n onStop({ cancelRun });\n } else {\n cancelRun();\n }\n }}\n disabled={disabled}\n title={disabled && stopDisabledTitle ? stopDisabledTitle : undefined}\n />\n );\n }\n\n const handleSend = async () => {\n await onBeforeSend?.({ action });\n await composerRef.current?.submit();\n };\n const sendTitle =\n disabled && sendDisabledTitle\n ? sendDisabledTitle\n : (sendBlockedReason ?? undefined);\n return (\n <SendButton\n action={action}\n onSend={() => void handleSend()}\n disabled={disabled || !hasDraft || sendBlockedReason != null}\n title={sendTitle}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AA8EO,MAAM,qBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,MAAM,OAAA;AACZ,QAAM,YAAY;AAAA,IAChB,CAAC,UAAA;;AAAU,0BAAM,SAAS,WAAf,mBAAuB,cAAa;AAAA;AAAA,EAAA;AAEjD,QAAM,SAAS,aAAa,WAAW,SAAS,sBAAsB,EAAE,UAAU,WAAW;AAC7F,QAAM,cAAa,yCAAY,eAAc;AAC7C,QAAM,cAAa,yCAAY,eAAc;AAE7C,QAAM,YAAY,YAAY,MAAe;AAC3C,QAAI;AACF,UAAI,OAAO,UAAA;AACX,aAAO;AAAA,IACT,SAAS,OAAO;AACd,wBAAkB,KAAK,yBAAyB;AAAA,QAC9C,OAAO;AAAA,QACP,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAA;AAAA,MAAE,CACvE;AACD,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,MAAI,WAAW,QAAQ;AACrB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,MAAM;AACZ,cAAI,QAAQ;AACV,mBAAO,EAAE,WAAW;AAAA,UACtB,OAAO;AACL,sBAAA;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,QACA,OAAO,YAAY,oBAAoB,oBAAoB;AAAA,MAAA;AAAA,IAAA;AAAA,EAGjE;AAEA,QAAM,aAAa,YAAY;;AAC7B,WAAM,6CAAe,EAAE;AACvB,YAAM,iBAAY,YAAZ,mBAAqB;AAAA,EAC7B;AACA,QAAM,YACJ,YAAY,oBACR,oBACC,qBAAqB;AAC5B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,QAAQ,MAAM,KAAK,WAAA;AAAA,MACnB,UAAU,YAAY,CAAC,YAAY,qBAAqB;AAAA,MACxD,OAAO;AAAA,IAAA;AAAA,EAAA;AAGb;"}
1
+ {"version":3,"file":"composer-send-or-stop.js","sources":["../../../src/chat-ui/thread/composer-send-or-stop.tsx"],"sourcesContent":["import { athenaDiagnostics } from \"../../diagnostics/athena-diagnostics\";\nimport { useAui, useAuiState } from \"@assistant-ui/react\";\nimport type { FC, RefObject } from \"react\";\nimport { useCallback } from \"react\";\nimport {\n resolveComposerAction,\n type ComposerAction,\n} from \"../composer/composer-action\";\nimport {\n ComposerSendButton,\n ComposerStopButton,\n type ComposerSendButtonProps,\n type ComposerStopButtonProps,\n} from \"../messages/message-components\";\n\n/**\n * The slice of a composer handle this control needs: something whose draft\n * can be submitted. `TiptapComposerHandle` satisfies it; hosts with their own\n * editor plumbing (the SDK's AthenaChat) expose a compatible handle.\n */\nexport interface ComposerSubmitHandle {\n submit: () => void | Promise<void>;\n}\n\nexport interface ComposerStopControls {\n /**\n * Cancels the active run via the runtime. Returns false when cancellation\n * threw (e.g. the run already settled), so hosts can report whether their\n * own teardown still needs to stop backend work.\n */\n cancelRun: () => boolean;\n}\n\n/**\n * Control renderers, for hosts with their own published theming contract\n * (AthenaChat's `aui-*` class system). Defaults render the shared buttons.\n */\nexport interface ComposerSendOrStopComponents {\n SendButton?: FC<ComposerSendButtonProps>;\n StopButton?: FC<ComposerStopButtonProps>;\n}\n\nexport interface ComposerSendOrStopProps {\n composerRef: RefObject<ComposerSubmitHandle | null>;\n hasDraft: boolean;\n /** A plain draft enters the live voice conversation instead of the run queue. */\n liveVoice?: boolean;\n /**\n * A live session (voice, connecting or live) the Stop control also ends.\n * With it, an empty draft shows Stop even when no run is in flight, and\n * Stop ends the session AND cancels any run: one control stops everything.\n */\n liveSession?: { end: () => void } | null;\n /** Disables both send and stop (e.g. while a conversation restores). */\n disabled?: boolean;\n /**\n * Blocks sending (not stopping) with this reason as the tooltip — e.g. a\n * broken host tunnel that would make tool calls silently fail.\n */\n sendBlockedReason?: string | null;\n /** Tooltip for the send/queue control while `disabled`. */\n sendDisabledTitle?: string;\n /** Tooltip for the stop control while `disabled`. */\n stopDisabledTitle?: string;\n /**\n * Host work to run before the draft submits (per-turn bookkeeping).\n * `action` distinguishes a fresh send from queueing into an active run.\n */\n onBeforeSend?: (context: {\n action: Extract<ComposerAction, \"send\" | \"queue\">;\n }) => void | Promise<void>;\n /**\n * Full custom stop sequence. Hosts that must tear down in-flight host-side\n * work sequence it around `controls.cancelRun()`. Default: cancel the run.\n */\n onStop?: (controls: ComposerStopControls) => void;\n components?: ComposerSendOrStopComponents;\n}\n\n/**\n * The shared send/queue/stop control: sends the composer draft, queues it as\n * a follow-up while a run is in flight, or stops the run when there is\n * nothing to queue.\n */\nexport const ComposerSendOrStop: FC<ComposerSendOrStopProps> = ({\n composerRef,\n hasDraft,\n liveVoice = false,\n liveSession = null,\n disabled = false,\n sendBlockedReason = null,\n sendDisabledTitle,\n stopDisabledTitle,\n onBeforeSend,\n onStop,\n components,\n}) => {\n const aui = useAui();\n const isRunning = useAuiState(\n (state) => state.optional.thread?.isRunning ?? false,\n );\n // A draft sends (into the live voice conversation, or as a run) or queues\n // behind a run; only an empty draft turns the control into Stop, and a\n // live session alone is enough for that.\n const action: ComposerAction =\n liveVoice && hasDraft\n ? \"send\"\n : !hasDraft && liveSession !== null\n ? \"stop\"\n : resolveComposerAction({ hasDraft, isRunning });\n const SendButton = components?.SendButton ?? ComposerSendButton;\n const StopButton = components?.StopButton ?? ComposerStopButton;\n\n const cancelRun = useCallback((): boolean => {\n try {\n aui.thread.cancelRun();\n return true;\n } catch (error) {\n athenaDiagnostics.emit(\"composer.cancel.error\", {\n level: \"warn\",\n data: { error: error instanceof Error ? error.message : String(error) },\n });\n return false;\n }\n }, [aui]);\n\n // With only a session to end, a cancel would find no run to stop.\n const stopRun = (): boolean => (isRunning ? cancelRun() : true);\n const stopEverything = () => {\n liveSession?.end();\n if (onStop) {\n onStop({ cancelRun: stopRun });\n } else {\n stopRun();\n }\n };\n const stopControl = (\n <StopButton\n onStop={stopEverything}\n disabled={disabled}\n title={\n disabled && stopDisabledTitle\n ? stopDisabledTitle\n : liveSession\n ? \"Stop\"\n : undefined\n }\n />\n );\n\n if (action === \"stop\") return stopControl;\n\n const handleSend = async () => {\n await onBeforeSend?.({ action });\n await composerRef.current?.submit();\n };\n const sendTitle =\n disabled && sendDisabledTitle\n ? sendDisabledTitle\n : (sendBlockedReason ?? undefined);\n const sendControl = (\n <SendButton\n action={action}\n onSend={() => void handleSend()}\n disabled={disabled || !hasDraft || sendBlockedReason != null}\n title={sendTitle}\n />\n );\n // A live session keeps its Stop beside Send while a draft is typed, so the\n // call (and any run) can end without sending or discarding the words; the\n // draft stays in the composer.\n if (liveSession !== null) {\n return (\n <>\n {stopControl}\n {sendControl}\n </>\n );\n }\n return sendControl;\n};\n"],"names":[],"mappings":";;;;;;AAoFO,MAAM,qBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,MAAM,OAAA;AACZ,QAAM,YAAY;AAAA,IAChB,CAAC,UAAA;;AAAU,0BAAM,SAAS,WAAf,mBAAuB,cAAa;AAAA;AAAA,EAAA;AAKjD,QAAM,SACJ,aAAa,WACT,SACA,CAAC,YAAY,gBAAgB,OAC3B,SACA,sBAAsB,EAAE,UAAU,WAAW;AACrD,QAAM,cAAa,yCAAY,eAAc;AAC7C,QAAM,cAAa,yCAAY,eAAc;AAE7C,QAAM,YAAY,YAAY,MAAe;AAC3C,QAAI;AACF,UAAI,OAAO,UAAA;AACX,aAAO;AAAA,IACT,SAAS,OAAO;AACd,wBAAkB,KAAK,yBAAyB;AAAA,QAC9C,OAAO;AAAA,QACP,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAA;AAAA,MAAE,CACvE;AACD,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAGR,QAAM,UAAU,MAAgB,YAAY,UAAA,IAAc;AAC1D,QAAM,iBAAiB,MAAM;AAC3B,+CAAa;AACb,QAAI,QAAQ;AACV,aAAO,EAAE,WAAW,SAAS;AAAA,IAC/B,OAAO;AACL,cAAA;AAAA,IACF;AAAA,EACF;AACA,QAAM,cACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR;AAAA,MACA,OACE,YAAY,oBACR,oBACA,cACE,SACA;AAAA,IAAA;AAAA,EAAA;AAKZ,MAAI,WAAW,OAAQ,QAAO;AAE9B,QAAM,aAAa,YAAY;;AAC7B,WAAM,6CAAe,EAAE;AACvB,YAAM,iBAAY,YAAZ,mBAAqB;AAAA,EAC7B;AACA,QAAM,YACJ,YAAY,oBACR,oBACC,qBAAqB;AAC5B,QAAM,cACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,QAAQ,MAAM,KAAK,WAAA;AAAA,MACnB,UAAU,YAAY,CAAC,YAAY,qBAAqB;AAAA,MACxD,OAAO;AAAA,IAAA;AAAA,EAAA;AAMX,MAAI,gBAAgB,MAAM;AACxB,WACE,qBAAA,UAAA,EACG,UAAA;AAAA,MAAA;AAAA,MACA;AAAA,IAAA,GACH;AAAA,EAEJ;AACA,SAAO;AACT;"}