@athenaintel/react 0.43.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (746) hide show
  1. package/README.md +258 -8
  2. package/dist/agent-runtime/src/answer-label.cjs +137 -0
  3. package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
  4. package/dist/agent-runtime/src/answer-label.d.ts +104 -0
  5. package/dist/agent-runtime/src/answer-label.js +137 -0
  6. package/dist/agent-runtime/src/answer-label.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-rows.cjs +180 -0
  8. package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
  9. package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
  10. package/dist/agent-runtime/src/answer-rows.js +180 -0
  11. package/dist/agent-runtime/src/answer-rows.js.map +1 -0
  12. package/dist/agent-runtime/src/call-recap.cjs +319 -0
  13. package/dist/agent-runtime/src/call-recap.cjs.map +1 -0
  14. package/dist/agent-runtime/src/call-recap.d.ts +142 -0
  15. package/dist/agent-runtime/src/call-recap.js +319 -0
  16. package/dist/agent-runtime/src/call-recap.js.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-store.cjs +1 -0
  18. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -1
  19. package/dist/agent-runtime/src/chat-outbox-store.d.ts +7 -0
  20. package/dist/agent-runtime/src/chat-outbox-store.js +1 -0
  21. package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -1
  22. package/dist/agent-runtime/src/chat-outbox.cjs +46 -5
  23. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
  24. package/dist/agent-runtime/src/chat-outbox.d.ts +29 -0
  25. package/dist/agent-runtime/src/chat-outbox.js +46 -5
  26. package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
  27. package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
  28. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  29. package/dist/agent-runtime/src/conversation-index.cjs +8 -8
  30. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
  31. package/dist/agent-runtime/src/conversation-index.d.ts +7 -0
  32. package/dist/agent-runtime/src/conversation-index.js.map +1 -1
  33. package/dist/agent-runtime/src/conversation-list.cjs +2 -1
  34. package/dist/agent-runtime/src/conversation-list.cjs.map +1 -1
  35. package/dist/agent-runtime/src/conversation-list.d.ts +19 -3
  36. package/dist/agent-runtime/src/conversation-list.js +2 -1
  37. package/dist/agent-runtime/src/conversation-list.js.map +1 -1
  38. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  39. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  40. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  41. package/dist/agent-runtime/src/decision-checks.js +207 -0
  42. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  43. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  44. package/dist/agent-runtime/src/errors.cjs +18 -0
  45. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  46. package/dist/agent-runtime/src/errors.d.ts +7 -0
  47. package/dist/agent-runtime/src/errors.js +18 -0
  48. package/dist/agent-runtime/src/errors.js.map +1 -1
  49. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  50. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  51. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  52. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  53. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  54. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  55. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  56. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  57. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  58. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  59. package/dist/agent-runtime/src/index.d.ts +16 -9
  60. package/dist/agent-runtime/src/interrupts.cjs +71 -19
  61. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  62. package/dist/agent-runtime/src/interrupts.d.ts +40 -3
  63. package/dist/agent-runtime/src/interrupts.js +56 -4
  64. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  65. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  66. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  67. package/dist/agent-runtime/src/messages.cjs +43 -8
  68. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  69. package/dist/agent-runtime/src/messages.d.ts +25 -3
  70. package/dist/agent-runtime/src/messages.js +43 -8
  71. package/dist/agent-runtime/src/messages.js.map +1 -1
  72. package/dist/agent-runtime/src/model-context.cjs +3 -2
  73. package/dist/agent-runtime/src/model-context.cjs.map +1 -1
  74. package/dist/agent-runtime/src/model-context.d.ts +6 -1
  75. package/dist/agent-runtime/src/model-context.js +3 -2
  76. package/dist/agent-runtime/src/model-context.js.map +1 -1
  77. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  78. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  79. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  80. package/dist/agent-runtime/src/offline-status.js +36 -0
  81. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  82. package/dist/agent-runtime/src/queue.cjs +0 -9
  83. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  84. package/dist/agent-runtime/src/queue.js +0 -9
  85. package/dist/agent-runtime/src/queue.js.map +1 -1
  86. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  87. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  88. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  89. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  90. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  91. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  92. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  93. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  94. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  95. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  96. package/dist/agent-runtime/src/runtime.d.ts +41 -0
  97. package/dist/agent-runtime/src/send-recovery.cjs +37 -3
  98. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  99. package/dist/agent-runtime/src/send-recovery.d.ts +19 -0
  100. package/dist/agent-runtime/src/send-recovery.js +37 -3
  101. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  102. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  103. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  104. package/dist/agent-runtime/src/subagents.cjs +32 -2
  105. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  106. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  107. package/dist/agent-runtime/src/subagents.js +30 -0
  108. package/dist/agent-runtime/src/subagents.js.map +1 -1
  109. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  110. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  111. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  112. package/dist/agent-runtime/src/thread-driver.js +67 -0
  113. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  114. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  115. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +868 -0
  116. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  117. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  118. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  119. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  120. package/dist/agent-runtime/src/tool-metadata.cjs +210 -25
  121. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  122. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  123. package/dist/agent-runtime/src/tool-metadata.js +210 -25
  124. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  125. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  126. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  127. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  128. package/dist/agent-runtime/src/tool-names.js +2 -0
  129. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  130. package/dist/agent-runtime/src/types.d.ts +10 -2
  131. package/dist/agent-runtime/src/use-conversation-list.cjs +14 -13
  132. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  133. package/dist/agent-runtime/src/use-conversation-list.d.ts +6 -0
  134. package/dist/agent-runtime/src/use-conversation-list.js +3 -2
  135. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  136. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +45 -20
  137. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  138. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +10 -3
  139. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +27 -2
  140. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  141. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  142. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  143. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  144. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  145. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +40 -22
  146. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  147. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +17 -0
  148. package/dist/agent-runtime/src/use-deep-agent-runtime.js +24 -6
  149. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  150. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  151. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  152. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +588 -130
  153. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  154. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +162 -10
  155. package/dist/agent-runtime/src/use-deep-agent-voice.js +529 -71
  156. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  157. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  158. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  159. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  160. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  161. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +34 -26
  162. package/dist/agent-runtime/src/voice-earcon.cjs +139 -0
  163. package/dist/agent-runtime/src/voice-earcon.cjs.map +1 -0
  164. package/dist/agent-runtime/src/voice-earcon.d.ts +38 -0
  165. package/dist/agent-runtime/src/voice-earcon.js +139 -0
  166. package/dist/agent-runtime/src/voice-earcon.js.map +1 -0
  167. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  168. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  169. package/dist/agent-runtime/src/voice-media.d.ts +63 -0
  170. package/dist/agent-runtime/src/voice-media.js +117 -0
  171. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  172. package/dist/agent-runtime/src/voice-presentation.cjs +2 -0
  173. package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -1
  174. package/dist/agent-runtime/src/voice-presentation.js +2 -0
  175. package/dist/agent-runtime/src/voice-presentation.js.map +1 -1
  176. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  177. package/dist/assets/AssetPanel.cjs +11 -11
  178. package/dist/assets/AssetPanel.cjs.map +1 -1
  179. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  180. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  181. package/dist/assets/AthenaAssetEmbed.d.ts +18 -5
  182. package/dist/assets/AthenaAssetEmbed.js +4 -2
  183. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  184. package/dist/assets/AthenaLayout.cjs +16 -16
  185. package/dist/assets/AthenaLayout.cjs.map +1 -1
  186. package/dist/assets/use-asset-content.cjs +4 -4
  187. package/dist/assets/use-asset-content.cjs.map +1 -1
  188. package/dist/assets/use-asset-embed.cjs +14 -7
  189. package/dist/assets/use-asset-embed.cjs.map +1 -1
  190. package/dist/assets/use-asset-embed.d.ts +23 -6
  191. package/dist/assets/use-asset-embed.js +10 -3
  192. package/dist/assets/use-asset-embed.js.map +1 -1
  193. package/dist/auth/AthenaAuthContext.cjs +3 -3
  194. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  195. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  196. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  197. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  198. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  199. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  200. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  201. package/dist/auth/credential-source.cjs +26 -13
  202. package/dist/auth/credential-source.cjs.map +1 -1
  203. package/dist/auth/credential-source.d.ts +8 -0
  204. package/dist/auth/credential-source.js +26 -13
  205. package/dist/auth/credential-source.js.map +1 -1
  206. package/dist/catalog/agent-model-options.cjs +25 -17
  207. package/dist/catalog/agent-model-options.cjs.map +1 -1
  208. package/dist/catalog/agent-model-options.d.ts +38 -5
  209. package/dist/catalog/agent-model-options.js +25 -17
  210. package/dist/catalog/agent-model-options.js.map +1 -1
  211. package/dist/catalog/channel-refusal.cjs +36 -0
  212. package/dist/catalog/channel-refusal.cjs.map +1 -0
  213. package/dist/catalog/channel-refusal.d.ts +29 -0
  214. package/dist/catalog/channel-refusal.js +36 -0
  215. package/dist/catalog/channel-refusal.js.map +1 -0
  216. package/dist/catalog/chat-pickers.cjs +60 -24
  217. package/dist/catalog/chat-pickers.cjs.map +1 -1
  218. package/dist/catalog/chat-pickers.d.ts +12 -2
  219. package/dist/catalog/chat-pickers.js +56 -20
  220. package/dist/catalog/chat-pickers.js.map +1 -1
  221. package/dist/catalog/runtime-catalog.cjs +89 -23
  222. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  223. package/dist/catalog/runtime-catalog.d.ts +8 -2
  224. package/dist/catalog/runtime-catalog.js +83 -17
  225. package/dist/catalog/runtime-catalog.js.map +1 -1
  226. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  227. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  228. package/dist/chat/AthenaChat.cjs +155 -67
  229. package/dist/chat/AthenaChat.cjs.map +1 -1
  230. package/dist/chat/AthenaChat.d.ts +42 -2
  231. package/dist/chat/AthenaChat.js +106 -18
  232. package/dist/chat/AthenaChat.js.map +1 -1
  233. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  234. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  235. package/dist/chat/DrivingOnChip.cjs +23 -0
  236. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  237. package/dist/chat/DrivingOnChip.d.ts +17 -0
  238. package/dist/chat/DrivingOnChip.js +23 -0
  239. package/dist/chat/DrivingOnChip.js.map +1 -0
  240. package/dist/chat/StatewireApprovalCard.cjs +166 -37
  241. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  242. package/dist/chat/StatewireApprovalCard.d.ts +91 -2
  243. package/dist/chat/StatewireApprovalCard.js +156 -27
  244. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  245. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  246. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  247. package/dist/chat/StatewireQueuedMessages.cjs +81 -69
  248. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.d.ts +25 -13
  250. package/dist/chat/StatewireQueuedMessages.js +73 -61
  251. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  252. package/dist/chat/WaitingOnYouBanner.cjs +9 -5
  253. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  254. package/dist/chat/WaitingOnYouBanner.js +7 -3
  255. package/dist/chat/WaitingOnYouBanner.js.map +1 -1
  256. package/dist/chat/athena-chat-welcome.cjs +2 -2
  257. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  258. package/dist/chat/athena-citation-links.cjs +5 -5
  259. package/dist/chat/athena-citation-links.cjs.map +1 -1
  260. package/dist/chat/athena-composer-controls.cjs +26 -16
  261. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  262. package/dist/chat/athena-composer-controls.d.ts +6 -0
  263. package/dist/chat/athena-composer-controls.js +26 -16
  264. package/dist/chat/athena-composer-controls.js.map +1 -1
  265. package/dist/chat/athena-turn-end-status.cjs +42 -0
  266. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  267. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  268. package/dist/chat/athena-turn-end-status.js +42 -0
  269. package/dist/chat/athena-turn-end-status.js.map +1 -0
  270. package/dist/chat/browser-decision-check.cjs +131 -0
  271. package/dist/chat/browser-decision-check.cjs.map +1 -0
  272. package/dist/chat/browser-decision-check.d.ts +61 -0
  273. package/dist/chat/browser-decision-check.js +131 -0
  274. package/dist/chat/browser-decision-check.js.map +1 -0
  275. package/dist/chat/chat-outbox-rows.cjs +3 -3
  276. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  277. package/dist/chat/chat-voice-controls.cjs +96 -29
  278. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  279. package/dist/chat/chat-voice-controls.d.ts +42 -3
  280. package/dist/chat/chat-voice-controls.js +92 -25
  281. package/dist/chat/chat-voice-controls.js.map +1 -1
  282. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  283. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  284. package/dist/chat/device-operation.cjs +29 -0
  285. package/dist/chat/device-operation.cjs.map +1 -0
  286. package/dist/chat/device-operation.d.ts +34 -0
  287. package/dist/chat/device-operation.js +29 -0
  288. package/dist/chat/device-operation.js.map +1 -0
  289. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  290. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  291. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  292. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  293. package/dist/chat/super-grouping/SuperGroupingCard.cjs +52 -36
  294. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  295. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
  296. package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
  297. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  298. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  299. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  300. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  301. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  302. package/dist/chat/super-grouping/ToolTimeline.cjs +73 -40
  303. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  304. package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
  305. package/dist/chat/super-grouping/ToolTimeline.js +69 -36
  306. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  307. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  308. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  309. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  310. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  311. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  312. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  313. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  314. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  315. package/dist/chat/super-grouping/grouping-function.js +5 -1
  316. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  317. package/dist/chat/super-grouping/index.cjs +6 -0
  318. package/dist/chat/super-grouping/index.cjs.map +1 -1
  319. package/dist/chat/super-grouping/index.d.ts +5 -2
  320. package/dist/chat/super-grouping/index.js +7 -1
  321. package/dist/chat/super-grouping/index.js.map +1 -1
  322. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  323. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  324. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  325. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  326. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  327. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  328. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  329. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  330. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  331. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  332. package/dist/chat/tooltip-icon-button.cjs +2 -2
  333. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  334. package/dist/chat/use-athena-voice-live.cjs +11 -0
  335. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  336. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  337. package/dist/chat/use-athena-voice-live.js +11 -0
  338. package/dist/chat/use-athena-voice-live.js.map +1 -0
  339. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  340. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  341. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  342. package/dist/chat/use-statewire-approval-request.js +41 -9
  343. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  344. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  345. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  346. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  347. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  348. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  349. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  350. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  351. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  352. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  353. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  354. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  355. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  356. package/dist/chat-ui/index.cjs +21 -0
  357. package/dist/chat-ui/index.cjs.map +1 -1
  358. package/dist/chat-ui/index.d.ts +8 -1
  359. package/dist/chat-ui/index.js +21 -0
  360. package/dist/chat-ui/index.js.map +1 -1
  361. package/dist/chat-ui/mentions/mention-chip.cjs +4 -4
  362. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  363. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  364. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  365. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  366. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  367. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  368. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  369. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  370. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  371. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  372. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  373. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  374. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  375. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  376. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  377. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  378. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  379. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  380. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  381. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  382. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  383. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  384. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  385. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  386. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  387. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  388. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  389. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  391. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  393. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  394. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  395. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  396. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  397. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  398. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  399. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  400. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  401. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  402. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  403. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  404. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  405. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  406. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  407. package/dist/chat-ui/mentions/use-mention-asset.cjs +3 -3
  408. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
  409. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  410. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  411. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  412. package/dist/chat-ui/messages/answer-label.js +42 -0
  413. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  414. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  415. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  416. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  417. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  418. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  419. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  420. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  421. package/dist/chat-ui/messages/from-the-call-card.cjs +124 -0
  422. package/dist/chat-ui/messages/from-the-call-card.cjs.map +1 -0
  423. package/dist/chat-ui/messages/from-the-call-card.d.ts +17 -0
  424. package/dist/chat-ui/messages/from-the-call-card.js +124 -0
  425. package/dist/chat-ui/messages/from-the-call-card.js.map +1 -0
  426. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  427. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  428. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  429. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  430. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  431. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  432. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  433. package/dist/chat-ui/messages/message-components.cjs +8 -4
  434. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  435. package/dist/chat-ui/messages/message-components.js +5 -1
  436. package/dist/chat-ui/messages/message-components.js.map +1 -1
  437. package/dist/chat-ui/messages/message-images.cjs +66 -0
  438. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  439. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  440. package/dist/chat-ui/messages/message-images.js +66 -0
  441. package/dist/chat-ui/messages/message-images.js.map +1 -0
  442. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  443. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  444. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  445. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  446. package/dist/chat-ui/rich-text/chat-link.cjs +3 -2
  447. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  448. package/dist/chat-ui/rich-text/chat-link.d.ts +4 -0
  449. package/dist/chat-ui/rich-text/chat-link.js +4 -3
  450. package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
  451. package/dist/chat-ui/rich-text/chat-message-body.cjs +9 -8
  452. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  453. package/dist/chat-ui/rich-text/chat-message-body.d.ts +12 -0
  454. package/dist/chat-ui/rich-text/chat-message-body.js +2 -1
  455. package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
  456. package/dist/chat-ui/rich-text/chat-node-views.cjs +6 -6
  457. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  458. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  459. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  460. package/dist/chat-ui/statewire.cjs +3 -0
  461. package/dist/chat-ui/statewire.cjs.map +1 -1
  462. package/dist/chat-ui/statewire.d.ts +2 -1
  463. package/dist/chat-ui/statewire.js +3 -0
  464. package/dist/chat-ui/statewire.js.map +1 -1
  465. package/dist/chat-ui/thread/chat-thread-shell.cjs +45 -14
  466. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  467. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  468. package/dist/chat-ui/thread/chat-thread-shell.js +37 -6
  469. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  470. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  471. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  472. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  473. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  474. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  475. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  476. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  477. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  478. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  479. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  480. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  481. package/dist/collab/client.cjs +52 -3
  482. package/dist/collab/client.cjs.map +1 -1
  483. package/dist/collab/client.d.ts +27 -0
  484. package/dist/collab/client.js +52 -3
  485. package/dist/collab/client.js.map +1 -1
  486. package/dist/collab/document-status.cjs +150 -0
  487. package/dist/collab/document-status.cjs.map +1 -0
  488. package/dist/collab/document-status.d.ts +68 -0
  489. package/dist/collab/document-status.js +150 -0
  490. package/dist/collab/document-status.js.map +1 -0
  491. package/dist/collab/index.cjs +7 -0
  492. package/dist/collab/index.cjs.map +1 -1
  493. package/dist/collab/index.d.ts +6 -1
  494. package/dist/collab/index.js +7 -0
  495. package/dist/collab/index.js.map +1 -1
  496. package/dist/collab/presence-react.cjs +11 -11
  497. package/dist/collab/presence-react.cjs.map +1 -1
  498. package/dist/collab/react.cjs +6 -6
  499. package/dist/collab/react.cjs.map +1 -1
  500. package/dist/composer/AttachmentContext.cjs +24 -11
  501. package/dist/composer/AttachmentContext.cjs.map +1 -1
  502. package/dist/composer/AttachmentContext.js +18 -5
  503. package/dist/composer/AttachmentContext.js.map +1 -1
  504. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  505. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  506. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  507. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  508. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  509. package/dist/composer/ComposerDropZone.cjs +7 -7
  510. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  511. package/dist/composer/FileUploadButton.cjs +37 -22
  512. package/dist/composer/FileUploadButton.cjs.map +1 -1
  513. package/dist/composer/FileUploadButton.d.ts +6 -0
  514. package/dist/composer/FileUploadButton.js +34 -19
  515. package/dist/composer/FileUploadButton.js.map +1 -1
  516. package/dist/composer/QuoteContext.cjs +8 -8
  517. package/dist/composer/QuoteContext.cjs.map +1 -1
  518. package/dist/composer/composer-handoff.cjs +4 -4
  519. package/dist/composer/composer-handoff.cjs.map +1 -1
  520. package/dist/composer/index.d.ts +1 -1
  521. package/dist/composer/useAppendToComposer.cjs +4 -4
  522. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  523. package/dist/composer/useAttachFiles.cjs +23 -6
  524. package/dist/composer/useAttachFiles.cjs.map +1 -1
  525. package/dist/composer/useAttachFiles.d.ts +15 -7
  526. package/dist/composer/useAttachFiles.js +22 -5
  527. package/dist/composer/useAttachFiles.js.map +1 -1
  528. package/dist/composer/useComposerAttachment.cjs +4 -4
  529. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  530. package/dist/composer/useFileUpload.cjs +21 -16
  531. package/dist/composer/useFileUpload.cjs.map +1 -1
  532. package/dist/composer/useFileUpload.d.ts +12 -0
  533. package/dist/composer/useFileUpload.js +12 -7
  534. package/dist/composer/useFileUpload.js.map +1 -1
  535. package/dist/composer/useReadComposerDraft.cjs +27 -8
  536. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  537. package/dist/composer/useReadComposerDraft.d.ts +23 -1
  538. package/dist/composer/useReadComposerDraft.js +27 -8
  539. package/dist/composer/useReadComposerDraft.js.map +1 -1
  540. package/dist/composer/useSendMessage.cjs +4 -4
  541. package/dist/composer/useSendMessage.cjs.map +1 -1
  542. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  543. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  544. package/dist/dictation/audio-level-history.cjs +3 -3
  545. package/dist/dictation/audio-level-history.cjs.map +1 -1
  546. package/dist/dictation/dictation-controls.cjs +24 -20
  547. package/dist/dictation/dictation-controls.cjs.map +1 -1
  548. package/dist/dictation/dictation-controls.d.ts +6 -1
  549. package/dist/dictation/dictation-controls.js +24 -20
  550. package/dist/dictation/dictation-controls.js.map +1 -1
  551. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  552. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  553. package/dist/dictation/use-dictation.cjs +22 -22
  554. package/dist/dictation/use-dictation.cjs.map +1 -1
  555. package/dist/index.cjs +29 -2
  556. package/dist/index.cjs.map +1 -1
  557. package/dist/index.d.ts +18 -4
  558. package/dist/index.js +30 -3
  559. package/dist/index.js.map +1 -1
  560. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  561. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  562. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  563. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  564. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  565. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs +190 -0
  566. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs.map +1 -0
  567. package/dist/keryx-http/src/unconfirmed-update-attributions.d.ts +132 -0
  568. package/dist/keryx-http/src/unconfirmed-update-attributions.js +190 -0
  569. package/dist/keryx-http/src/unconfirmed-update-attributions.js.map +1 -0
  570. package/dist/keryx-http/src/update-attributions.cjs +141 -0
  571. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  572. package/dist/keryx-http/src/update-attributions.d.ts +107 -0
  573. package/dist/keryx-http/src/update-attributions.js +141 -0
  574. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  575. package/dist/lib/owner-document.cjs +6 -6
  576. package/dist/lib/owner-document.cjs.map +1 -1
  577. package/dist/lib/use-athena-rest-query.cjs +4 -4
  578. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  579. package/dist/lib/use-document-active.cjs +4 -4
  580. package/dist/lib/use-document-active.cjs.map +1 -1
  581. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  582. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  583. package/dist/offline/offline-history.cjs +7 -7
  584. package/dist/offline/offline-history.cjs.map +1 -1
  585. package/dist/provider/AthenaContext.cjs +3 -3
  586. package/dist/provider/AthenaContext.cjs.map +1 -1
  587. package/dist/provider/AthenaProvider.cjs +120 -79
  588. package/dist/provider/AthenaProvider.cjs.map +1 -1
  589. package/dist/provider/AthenaProvider.d.ts +11 -1
  590. package/dist/provider/AthenaProvider.js +44 -3
  591. package/dist/provider/AthenaProvider.js.map +1 -1
  592. package/dist/provider/PostHogProvider.cjs +2 -2
  593. package/dist/provider/PostHogProvider.cjs.map +1 -1
  594. package/dist/provider/agent-selection-context.cjs +2 -2
  595. package/dist/provider/agent-selection-context.cjs.map +1 -1
  596. package/dist/provider/chat-mode-context.cjs +2 -2
  597. package/dist/provider/chat-mode-context.cjs.map +1 -1
  598. package/dist/provider/session-persistence-context.cjs +10 -0
  599. package/dist/provider/session-persistence-context.cjs.map +1 -0
  600. package/dist/provider/session-persistence-context.d.ts +15 -0
  601. package/dist/provider/session-persistence-context.js +10 -0
  602. package/dist/provider/session-persistence-context.js.map +1 -0
  603. package/dist/provider/statewire-history-context.cjs +4 -4
  604. package/dist/provider/statewire-history-context.cjs.map +1 -1
  605. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  606. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  607. package/dist/provider/statewire-window-context.cjs +3 -3
  608. package/dist/provider/statewire-window-context.cjs.map +1 -1
  609. package/dist/provider/theme-style-context.cjs +3 -3
  610. package/dist/provider/theme-style-context.cjs.map +1 -1
  611. package/dist/react/package.json.cjs +1 -1
  612. package/dist/react/package.json.js +1 -1
  613. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  614. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  615. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  616. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  617. package/dist/runtime/auth.cjs +13 -13
  618. package/dist/runtime/auth.cjs.map +1 -1
  619. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  620. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  621. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  622. package/dist/runtime/statewire-lifecycle.js +2 -1
  623. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  624. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  625. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  626. package/dist/runtime/statewire-session-lane.cjs +4 -4
  627. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  628. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  629. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  630. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  631. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  632. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  633. package/dist/styles.css +1 -1
  634. package/dist/threads/Inbox.cjs +8 -8
  635. package/dist/threads/Inbox.cjs.map +1 -1
  636. package/dist/threads/SessionList.cjs +9 -9
  637. package/dist/threads/SessionList.cjs.map +1 -1
  638. package/dist/threads/SessionsPage.cjs +11 -11
  639. package/dist/threads/SessionsPage.cjs.map +1 -1
  640. package/dist/threads/api.cjs.map +1 -1
  641. package/dist/threads/api.d.ts +15 -0
  642. package/dist/threads/api.js.map +1 -1
  643. package/dist/threads/conversation-list-fetcher.cjs +13 -5
  644. package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
  645. package/dist/threads/conversation-list-fetcher.d.ts +4 -1
  646. package/dist/threads/conversation-list-fetcher.js +13 -5
  647. package/dist/threads/conversation-list-fetcher.js.map +1 -1
  648. package/dist/threads/index-triggered-refresh.cjs +10 -10
  649. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  650. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  651. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  652. package/dist/threads/offline-session-list.cjs +3 -3
  653. package/dist/threads/offline-session-list.cjs.map +1 -1
  654. package/dist/threads/session-list-tab-share.cjs +5 -5
  655. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  656. package/dist/threads/statewire-thread-list.cjs +79 -57
  657. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  658. package/dist/threads/statewire-thread-list.d.ts +20 -8
  659. package/dist/threads/statewire-thread-list.js +28 -6
  660. package/dist/threads/statewire-thread-list.js.map +1 -1
  661. package/dist/threads/thread-id-context.cjs +5 -5
  662. package/dist/threads/thread-id-context.cjs.map +1 -1
  663. package/dist/threads/use-athena-session-attention.cjs +2 -2
  664. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  665. package/dist/threads/use-athena-sessions.cjs +37 -15
  666. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  667. package/dist/threads/use-athena-sessions.d.ts +10 -5
  668. package/dist/threads/use-athena-sessions.js +28 -6
  669. package/dist/threads/use-athena-sessions.js.map +1 -1
  670. package/dist/threads/use-athena-thread-model.cjs +3 -3
  671. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  672. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  673. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  674. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  675. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  676. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  677. package/dist/threads/use-thread-archive.cjs +9 -9
  678. package/dist/threads/use-thread-archive.cjs.map +1 -1
  679. package/dist/threads/use-thread-favorite.cjs +2 -2
  680. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  681. package/dist/threads/use-thread-field-override.cjs +20 -20
  682. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  683. package/dist/threads/use-thread-read-state.cjs +4 -4
  684. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  685. package/dist/threads/use-thread-rename.cjs +2 -2
  686. package/dist/threads/use-thread-rename.cjs.map +1 -1
  687. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  688. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  689. package/dist/tools/NestedPtcMessages.cjs +6 -6
  690. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  691. package/dist/tools/append-document-tool-ui.cjs +7 -7
  692. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  693. package/dist/tools/file-tool-uis.cjs +2 -2
  694. package/dist/tools/file-tool-uis.cjs.map +1 -1
  695. package/dist/tools/misc-tool-uis.cjs +2 -2
  696. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  697. package/dist/tools/primitives.cjs +6 -6
  698. package/dist/tools/primitives.cjs.map +1 -1
  699. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  700. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  701. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  702. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  703. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  704. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  705. package/dist/tools/todo-plan-store.cjs +4 -4
  706. package/dist/tools/todo-plan-store.cjs.map +1 -1
  707. package/dist/tools/tool-appearance.cjs +3 -3
  708. package/dist/tools/tool-appearance.cjs.map +1 -1
  709. package/dist/tools/tool-fallback.cjs +14 -14
  710. package/dist/tools/tool-fallback.cjs.map +1 -1
  711. package/dist/tools/tool-uis.cjs +74 -74
  712. package/dist/tools/tool-uis.cjs.map +1 -1
  713. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  714. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  715. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  716. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  717. package/dist/ui/image-viewer.cjs +382 -0
  718. package/dist/ui/image-viewer.cjs.map +1 -0
  719. package/dist/ui/image-viewer.d.ts +50 -0
  720. package/dist/ui/image-viewer.js +382 -0
  721. package/dist/ui/image-viewer.js.map +1 -0
  722. package/dist/voice/chat.cjs +6 -0
  723. package/dist/voice/chat.cjs.map +1 -1
  724. package/dist/voice/chat.d.ts +1 -1
  725. package/dist/voice/chat.js +8 -2
  726. package/dist/voice/livekit-join.cjs +52 -101
  727. package/dist/voice/livekit-join.cjs.map +1 -1
  728. package/dist/voice/livekit-join.d.ts +1 -6
  729. package/dist/voice/livekit-join.js +52 -101
  730. package/dist/voice/livekit-join.js.map +1 -1
  731. package/dist/voice/livekit.cjs.map +1 -1
  732. package/dist/voice/livekit.d.ts +11 -1
  733. package/dist/voice/livekit.js.map +1 -1
  734. package/dist/voice/use-athena-voice-session.cjs +34 -34
  735. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  736. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  737. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  738. package/dist/workbench/SessionWorkbench.cjs +22 -22
  739. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  740. package/dist/workbench/session-workbench-context.cjs +3 -3
  741. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  742. package/dist/workbench/session-workbench-panes.cjs +8 -8
  743. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  744. package/dist/workbench/workbench-layout-context.cjs +3 -3
  745. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  746. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-history-panel.cjs","sources":["../../../src/chat-ui/header/conversation-history-panel.tsx"],"sourcesContent":["import type { ConversationSummary } from \"@athenaintel/agent-runtime\";\nimport {\n ArchiveIcon,\n BotIcon,\n LoaderCircleIcon,\n MessageSquareIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport {\n type ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { conversationDisplayTitle } from \"../../threads/use-rest-conversation-history\";\nimport { assetTypeToThumb } from \"../mentions/suggestions/data/sources/asset-type-icons\";\n\nexport type ConversationActivityFilter = \"all\" | \"chat\" | \"automated\";\nexport type ConversationTimeGroup =\n | \"Today\"\n | \"Yesterday\"\n | \"This Week\"\n | \"This Month\"\n | \"Older\";\n\nconst TIME_GROUPS: readonly ConversationTimeGroup[] = [\n \"Today\",\n \"Yesterday\",\n \"This Week\",\n \"This Month\",\n \"Older\",\n];\n\nconst AUTOMATED_SOURCE_CHANNELS = new Set([\n \"api\",\n \"email\",\n \"orchestration\",\n \"slack\",\n \"sms\",\n \"task\",\n \"teams\",\n]);\n\n/** Mirrors Agora's persisted background-run classification for list metadata. */\nexport function isAutomatedConversation(\n conversation: Pick<ConversationSummary, \"sourceChannel\" | \"triggerType\">,\n): boolean {\n const sourceChannel = conversation.sourceChannel?.trim().toLowerCase();\n if (sourceChannel && AUTOMATED_SOURCE_CHANNELS.has(sourceChannel))\n return true;\n const triggerType = conversation.triggerType?.trim().toLowerCase();\n return Boolean(triggerType && triggerType !== \"manual\");\n}\n\nexport function conversationTimeGroup(\n value: string,\n now: Date = new Date(),\n): ConversationTimeGroup {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Older\";\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfYesterday = new Date(startOfToday.getTime() - 86_400_000);\n const startOfWeek = new Date(\n startOfToday.getTime() - startOfToday.getDay() * 86_400_000,\n );\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n if (date >= startOfToday) return \"Today\";\n if (date >= startOfYesterday) return \"Yesterday\";\n if (date >= startOfWeek) return \"This Week\";\n if (date >= startOfMonth) return \"This Month\";\n return \"Older\";\n}\n\nexport interface ConversationHistoryPanelProps {\n conversations: readonly ConversationSummary[];\n activeThreadId: string;\n search: string;\n onSearchChange: (search: string) => void;\n activityFilter: ConversationActivityFilter;\n onActivityFilterChange: (filter: ConversationActivityFilter) => void;\n originFilter: string;\n onOriginFilterChange: (origin: string) => void;\n onSelect: (threadId: string) => void;\n onNewChat: () => void;\n onRefresh: () => void;\n onArchive: (threadId: string) => void;\n onSetReadState: (threadId: string, isUnread: boolean) => void;\n isLoading?: boolean;\n isRefreshing?: boolean;\n hasNextPage?: boolean;\n isFetchingNextPage?: boolean;\n onLoadMore?: () => void;\n /**\n * The pointer has rested on a conversation row for `hoverIntentDelayMs`:\n * the user is likely to open it next. Hosts wake and pre-dial the thread\n * here so the click lands on a warm instance with its hello in hand.\n */\n onHoverIntent?: (threadId: string) => void;\n /** The pointer left a row whose intent had fired. */\n onHoverIntentEnd?: (threadId: string) => void;\n /** Dwell before a hover counts as intent; a pass-through never fires. */\n hoverIntentDelayMs?: number;\n}\n\nfunction originKey(conversation: ConversationSummary): string {\n return conversation.appId ?? conversation.sourceChannel ?? \"unknown\";\n}\n\nfunction originLabel(value: string): string {\n const normalized = value.toLowerCase();\n if (normalized.includes(\"chrome\")) return \"Chrome\";\n if (normalized.includes(\"powerpoint\")) return \"PowerPoint\";\n if (normalized.includes(\"word\")) return \"Word\";\n if (normalized.includes(\"excel\")) return \"Excel\";\n if (normalized.includes(\"office\")) return \"Office\";\n if (normalized === \"web\" || normalized.includes(\"olympus\")) return \"Athena\";\n if (normalized.includes(\"mobile\")) return \"Mobile\";\n if (value === \"unknown\") return \"Legacy\";\n return value.replace(/^athena[-_]/, \"\").replaceAll(\"_\", \" \");\n}\n\nfunction relativeTime(value: string): string {\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return \"\";\n const elapsed = Math.max(0, Date.now() - timestamp);\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 1) return \"<1m ago\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m ago`;\n const days = Math.floor(hours / 24);\n return days < 7 ? `${days}d ago` : new Date(timestamp).toLocaleDateString();\n}\n\nfunction ConversationTypeIcon({\n conversation,\n automated,\n}: {\n conversation: ConversationSummary;\n automated: boolean;\n}) {\n if (conversation.state === \"running\") {\n return (\n <LoaderCircleIcon\n aria-label=\"Conversation running\"\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n const thumbnail = assetTypeToThumb(conversation.assetType ?? \"session\");\n if (thumbnail) {\n return <img src={thumbnail} alt=\"\" className=\"mt-0.5 size-4 shrink-0\" />;\n }\n return automated ? (\n <BotIcon className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n ) : (\n <MessageSquareIcon className=\"mt-0.5 size-4 shrink-0 text-emerald-500\" />\n );\n}\n\nexport function ConversationHistoryPanel({\n conversations,\n activeThreadId,\n search,\n onSearchChange,\n activityFilter,\n onActivityFilterChange,\n originFilter,\n onOriginFilterChange,\n onSelect,\n onNewChat,\n onRefresh,\n onArchive,\n onSetReadState,\n isLoading = false,\n isRefreshing = false,\n hasNextPage = false,\n isFetchingNextPage = false,\n onLoadMore,\n onHoverIntent,\n onHoverIntentEnd,\n hoverIntentDelayMs = 150,\n}: ConversationHistoryPanelProps) {\n // Hover intent: one dwell timer for the row under the pointer; a row the\n // pointer merely crosses never fires. The id whose intent fired is kept so\n // its end is reported exactly once — on leave, when the row disappears\n // (filter, archive, refresh) or when the panel closes under the pointer.\n // The callbacks are read through refs so an inline handler's identity\n // changing on a parent re-render neither re-arms nor ends anything.\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverIntentThreadId = useRef<string | null>(null);\n const onHoverIntentRef = useRef(onHoverIntent);\n onHoverIntentRef.current = onHoverIntent;\n const onHoverIntentEndRef = useRef(onHoverIntentEnd);\n onHoverIntentEndRef.current = onHoverIntentEnd;\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimer.current === null) return;\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }, []);\n const endHoverIntent = useCallback(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n hoverIntentThreadId.current = null;\n onHoverIntentEndRef.current?.(threadId);\n }, []);\n useEffect(\n () => () => {\n cancelHoverTimer();\n endHoverIntent();\n },\n [cancelHoverTimer, endHoverIntent],\n );\n const handleRowEnter = (threadId: string) => {\n if (!onHoverIntentRef.current) return;\n cancelHoverTimer();\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n hoverIntentThreadId.current = threadId;\n onHoverIntentRef.current?.(threadId);\n }, hoverIntentDelayMs);\n };\n const handleRowLeave = (threadId: string) => {\n cancelHoverTimer();\n if (hoverIntentThreadId.current !== threadId) return;\n endHoverIntent();\n };\n const origins = useMemo(\n () => [...new Set(conversations.map(originKey))].sort(),\n [conversations],\n );\n const grouped = useMemo(() => {\n const visible = conversations.filter((conversation) => {\n const automated = isAutomatedConversation(conversation);\n if (activityFilter === \"chat\" && automated) return false;\n if (activityFilter === \"automated\" && !automated) return false;\n return originFilter === \"all\" || originKey(conversation) === originFilter;\n });\n const byGroup = new Map<ConversationTimeGroup, ConversationSummary[]>();\n for (const conversation of visible) {\n const group = conversationTimeGroup(conversation.updatedAt);\n const items = byGroup.get(group) ?? [];\n items.push(conversation);\n byGroup.set(group, items);\n }\n return TIME_GROUPS.flatMap((group) => {\n const items = byGroup.get(group);\n return items ? [{ group, items }] : [];\n });\n }, [activityFilter, conversations, originFilter]);\n // The hovered row left the list (filter, archive, refresh): no leave event\n // will come for it, so its intent ends here.\n useEffect(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n const stillVisible = grouped.some(({ items }) =>\n items.some((conversation) => conversation.threadId === threadId),\n );\n if (!stillVisible) endHoverIntent();\n }, [grouped, endHoverIntent]);\n const visibleCount = grouped.reduce(\n (count, group) => count + group.items.length,\n 0,\n );\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n onSearchChange(event.target.value);\n\n return (\n <section\n aria-label=\"Conversation history\"\n className=\"border-b border-border bg-background px-2 pb-2\"\n data-testid=\"conversation-history-panel\"\n >\n <div className=\"flex h-10 items-center gap-1.5 px-1\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n Sessions\n </h2>\n <button\n type=\"button\"\n aria-label=\"Refresh sessions\"\n title=\"Refresh sessions\"\n disabled={isRefreshing}\n onClick={onRefresh}\n className=\"ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50\"\n >\n <RefreshCwIcon\n className={cn(\"size-3.5\", isRefreshing && \"animate-spin\")}\n />\n </button>\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-md bg-primary px-2 text-[11px] font-medium text-primary-foreground\"\n >\n <PlusIcon className=\"size-3\" /> New\n </button>\n </div>\n <label className=\"relative block min-w-0 px-1 pb-2\">\n <SearchIcon className=\"pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-[calc(50%+0.25rem)] text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n value={search}\n onChange={handleSearch}\n placeholder=\"Search sessions...\"\n className=\"h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n <div className=\"flex gap-1 overflow-x-auto px-1 pb-2 text-[11px]\">\n {([\"all\", \"chat\", \"automated\"] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => onActivityFilterChange(filter)}\n className={cn(\n \"rounded-full border px-2 py-1 capitalize\",\n activityFilter === filter\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\",\n )}\n >\n {filter === \"chat\"\n ? \"Chats\"\n : filter === \"automated\"\n ? \"Automations\"\n : \"All\"}\n </button>\n ))}\n <select\n aria-label=\"Filter by origin\"\n value={originFilter}\n onChange={(event) => onOriginFilterChange(event.target.value)}\n className=\"ml-auto rounded-full border border-border bg-background px-2 text-[11px] text-muted-foreground\"\n >\n <option value=\"all\">All origins</option>\n {origins.map((origin) => (\n <option key={origin} value={origin}>\n {originLabel(origin)}\n </option>\n ))}\n </select>\n </div>\n <div className=\"max-h-[min(60vh,28rem)] overflow-y-auto px-0.5\">\n {isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading\n sessions…\n </div>\n ) : visibleCount === 0 ? (\n <p className=\"px-2 py-4 text-xs text-muted-foreground\">\n No matching sessions.\n </p>\n ) : (\n grouped.map(({ group, items }) => (\n <div key={group}>\n <h3 className=\"px-2 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/75\">\n {group}\n </h3>\n {items.map((conversation) => {\n const automated = isAutomatedConversation(conversation);\n return (\n <div\n key={conversation.threadId}\n className={cn(\n \"group flex items-start gap-2 rounded-md px-2 py-2 hover:bg-accent\",\n conversation.threadId === activeThreadId &&\n \"bg-primary/10 text-primary\",\n )}\n onMouseEnter={() => handleRowEnter(conversation.threadId)}\n onMouseLeave={() => handleRowLeave(conversation.threadId)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelect(conversation.threadId);\n if (conversation.isUnread) {\n onSetReadState(conversation.threadId, false);\n }\n }}\n className=\"flex min-w-0 flex-1 items-start gap-2 text-left\"\n >\n <ConversationTypeIcon\n conversation={conversation}\n automated={automated}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start gap-1\">\n <span className=\"line-clamp-2 flex-1 text-xs font-medium leading-snug\">\n {conversationDisplayTitle(conversation)}\n </span>\n {conversation.isUnread ? (\n <span\n aria-label=\"Unread\"\n className=\"mt-1 size-1.5 shrink-0 rounded-full bg-primary\"\n />\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <span>{relativeTime(conversation.updatedAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"truncate\">\n {originLabel(originKey(conversation))}\n </span>\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={`Archive ${conversationDisplayTitle(conversation)}`}\n title=\"Archive conversation\"\n onClick={() => onArchive(conversation.threadId)}\n className=\"invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible\"\n >\n <ArchiveIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n ))\n )}\n {hasNextPage ? (\n <button\n type=\"button\"\n disabled={isFetchingNextPage}\n onClick={onLoadMore}\n className=\"mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50\"\n >\n {isFetchingNextPage ? \"Loading…\" : \"Load older sessions\"}\n </button>\n ) : visibleCount > 0 ? (\n <p className=\"py-2 text-center text-[10px] text-muted-foreground/70\">\n No more sessions\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n"],"names":["jsx","LoaderCircleIcon","assetTypeToThumb","BotIcon","MessageSquareIcon","useRef","useCallback","useEffect","useMemo","jsxs","RefreshCwIcon","cn","PlusIcon","SearchIcon","conversationDisplayTitle","ArchiveIcon"],"mappings":"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"}
1
+ {"version":3,"file":"conversation-history-panel.cjs","sources":["../../../src/chat-ui/header/conversation-history-panel.tsx"],"sourcesContent":["import type { ConversationSummary } from \"@athenaintel/agent-runtime\";\nimport type { LabelCopy } from \"@athenaintel/agent-runtime/offline-status\";\nimport {\n ArchiveIcon,\n BotIcon,\n LoaderCircleIcon,\n MessageSquareIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport {\n type ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { conversationDisplayTitle } from \"../../threads/use-rest-conversation-history\";\nimport { assetTypeToThumb } from \"../mentions/suggestions/data/sources/asset-type-icons\";\n\nexport type ConversationActivityFilter = \"all\" | \"chat\" | \"automated\";\nexport type ConversationTimeGroup =\n | \"Today\"\n | \"Yesterday\"\n | \"This Week\"\n | \"This Month\"\n | \"Older\";\n\nconst TIME_GROUPS: readonly ConversationTimeGroup[] = [\n \"Today\",\n \"Yesterday\",\n \"This Week\",\n \"This Month\",\n \"Older\",\n];\n\nconst AUTOMATED_SOURCE_CHANNELS = new Set([\n \"api\",\n \"email\",\n \"orchestration\",\n \"slack\",\n \"sms\",\n \"task\",\n \"teams\",\n]);\n\n/** Mirrors Agora's persisted background-run classification for list metadata. */\nexport function isAutomatedConversation(\n conversation: Pick<ConversationSummary, \"sourceChannel\" | \"triggerType\">,\n): boolean {\n const sourceChannel = conversation.sourceChannel?.trim().toLowerCase();\n if (sourceChannel && AUTOMATED_SOURCE_CHANNELS.has(sourceChannel))\n return true;\n const triggerType = conversation.triggerType?.trim().toLowerCase();\n return Boolean(triggerType && triggerType !== \"manual\");\n}\n\nexport function conversationTimeGroup(\n value: string,\n now: Date = new Date(),\n): ConversationTimeGroup {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Older\";\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfYesterday = new Date(startOfToday.getTime() - 86_400_000);\n const startOfWeek = new Date(\n startOfToday.getTime() - startOfToday.getDay() * 86_400_000,\n );\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n if (date >= startOfToday) return \"Today\";\n if (date >= startOfYesterday) return \"Yesterday\";\n if (date >= startOfWeek) return \"This Week\";\n if (date >= startOfMonth) return \"This Month\";\n return \"Older\";\n}\n\nexport interface ConversationHistoryPanelProps {\n conversations: readonly ConversationSummary[];\n activeThreadId: string;\n search: string;\n onSearchChange: (search: string) => void;\n activityFilter: ConversationActivityFilter;\n onActivityFilterChange: (filter: ConversationActivityFilter) => void;\n originFilter: string;\n onOriginFilterChange: (origin: string) => void;\n onSelect: (threadId: string) => void;\n onNewChat: () => void;\n onRefresh: () => void;\n onArchive: (threadId: string) => void;\n onSetReadState: (threadId: string, isUnread: boolean) => void;\n isLoading?: boolean;\n isRefreshing?: boolean;\n hasNextPage?: boolean;\n isFetchingNextPage?: boolean;\n onLoadMore?: () => void;\n /**\n * The pointer has rested on a conversation row for `hoverIntentDelayMs`:\n * the user is likely to open it next. Hosts wake and pre-dial the thread\n * here so the click lands on a warm instance with its hello in hand.\n */\n onHoverIntent?: (threadId: string) => void;\n /** The pointer left a row whose intent had fired. */\n onHoverIntentEnd?: (threadId: string) => void;\n /** Dwell before a hover counts as intent; a pass-through never fires. */\n hoverIntentDelayMs?: number;\n /**\n * Why what needs Athena waits, or `null` while Athena answers: a host that\n * keeps nothing while Athena can't be reached passes `NEEDS_CONNECTION`\n * (`@athenaintel/agent-runtime/offline-status`). Refresh, the search box\n * (a search asks Athena), Archive and loading older sessions are then\n * disabled with it as their tooltip, and a list or a search that can't load\n * says it instead of spinning. The rows already loaded, the filters and New\n * stay as they are.\n */\n actionsUnavailable?: LabelCopy | null;\n}\n\n/** A disabled control's tooltip: the reason's label, then its line. */\nfunction unavailableTitle(reason: LabelCopy): string {\n return `${reason.label} — ${reason.detail}`;\n}\n\nfunction originKey(conversation: ConversationSummary): string {\n return conversation.appId ?? conversation.sourceChannel ?? \"unknown\";\n}\n\nfunction originLabel(value: string): string {\n const normalized = value.toLowerCase();\n if (normalized.includes(\"chrome\")) return \"Chrome\";\n if (normalized.includes(\"powerpoint\")) return \"PowerPoint\";\n if (normalized.includes(\"word\")) return \"Word\";\n if (normalized.includes(\"excel\")) return \"Excel\";\n if (normalized.includes(\"office\")) return \"Office\";\n if (normalized === \"web\" || normalized.includes(\"olympus\")) return \"Athena\";\n if (normalized.includes(\"mobile\")) return \"Mobile\";\n if (value === \"unknown\") return \"Legacy\";\n return value.replace(/^athena[-_]/, \"\").replaceAll(\"_\", \" \");\n}\n\nfunction relativeTime(value: string): string {\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return \"\";\n const elapsed = Math.max(0, Date.now() - timestamp);\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 1) return \"<1m ago\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m ago`;\n const days = Math.floor(hours / 24);\n return days < 7 ? `${days}d ago` : new Date(timestamp).toLocaleDateString();\n}\n\nfunction ConversationTypeIcon({\n conversation,\n automated,\n}: {\n conversation: ConversationSummary;\n automated: boolean;\n}) {\n if (conversation.state === \"running\") {\n return (\n <LoaderCircleIcon\n aria-label=\"Conversation running\"\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n const thumbnail = assetTypeToThumb(conversation.assetType ?? \"session\");\n if (thumbnail) {\n return <img src={thumbnail} alt=\"\" className=\"mt-0.5 size-4 shrink-0\" />;\n }\n return automated ? (\n <BotIcon className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n ) : (\n <MessageSquareIcon className=\"mt-0.5 size-4 shrink-0 text-emerald-500\" />\n );\n}\n\nexport function ConversationHistoryPanel({\n conversations,\n activeThreadId,\n search,\n onSearchChange,\n activityFilter,\n onActivityFilterChange,\n originFilter,\n onOriginFilterChange,\n onSelect,\n onNewChat,\n onRefresh,\n onArchive,\n onSetReadState,\n isLoading = false,\n isRefreshing = false,\n hasNextPage = false,\n isFetchingNextPage = false,\n onLoadMore,\n onHoverIntent,\n onHoverIntentEnd,\n hoverIntentDelayMs = 150,\n actionsUnavailable = null,\n}: ConversationHistoryPanelProps) {\n const unavailable = actionsUnavailable\n ? unavailableTitle(actionsUnavailable)\n : null;\n // Hover intent: one dwell timer for the row under the pointer; a row the\n // pointer merely crosses never fires. The id whose intent fired is kept so\n // its end is reported exactly once — on leave, when the row disappears\n // (filter, archive, refresh) or when the panel closes under the pointer.\n // The callbacks are read through refs so an inline handler's identity\n // changing on a parent re-render neither re-arms nor ends anything.\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverIntentThreadId = useRef<string | null>(null);\n const onHoverIntentRef = useRef(onHoverIntent);\n onHoverIntentRef.current = onHoverIntent;\n const onHoverIntentEndRef = useRef(onHoverIntentEnd);\n onHoverIntentEndRef.current = onHoverIntentEnd;\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimer.current === null) return;\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }, []);\n const endHoverIntent = useCallback(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n hoverIntentThreadId.current = null;\n onHoverIntentEndRef.current?.(threadId);\n }, []);\n useEffect(\n () => () => {\n cancelHoverTimer();\n endHoverIntent();\n },\n [cancelHoverTimer, endHoverIntent],\n );\n const handleRowEnter = (threadId: string) => {\n if (!onHoverIntentRef.current) return;\n cancelHoverTimer();\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n hoverIntentThreadId.current = threadId;\n onHoverIntentRef.current?.(threadId);\n }, hoverIntentDelayMs);\n };\n const handleRowLeave = (threadId: string) => {\n cancelHoverTimer();\n if (hoverIntentThreadId.current !== threadId) return;\n endHoverIntent();\n };\n const origins = useMemo(\n () => [...new Set(conversations.map(originKey))].sort(),\n [conversations],\n );\n const grouped = useMemo(() => {\n const visible = conversations.filter((conversation) => {\n const automated = isAutomatedConversation(conversation);\n if (activityFilter === \"chat\" && automated) return false;\n if (activityFilter === \"automated\" && !automated) return false;\n return originFilter === \"all\" || originKey(conversation) === originFilter;\n });\n const byGroup = new Map<ConversationTimeGroup, ConversationSummary[]>();\n for (const conversation of visible) {\n const group = conversationTimeGroup(conversation.updatedAt);\n const items = byGroup.get(group) ?? [];\n items.push(conversation);\n byGroup.set(group, items);\n }\n return TIME_GROUPS.flatMap((group) => {\n const items = byGroup.get(group);\n return items ? [{ group, items }] : [];\n });\n }, [activityFilter, conversations, originFilter]);\n // The hovered row left the list (filter, archive, refresh): no leave event\n // will come for it, so its intent ends here.\n useEffect(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n const stillVisible = grouped.some(({ items }) =>\n items.some((conversation) => conversation.threadId === threadId),\n );\n if (!stillVisible) endHoverIntent();\n }, [grouped, endHoverIntent]);\n const visibleCount = grouped.reduce(\n (count, group) => count + group.items.length,\n 0,\n );\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n onSearchChange(event.target.value);\n // A list that never loaded, or a search with nothing to show, waits on\n // Athena while it can't be reached: say so instead of spinning, or of\n // \"No matching sessions\" for a search that never ran.\n const listWaitsOnAthena =\n actionsUnavailable !== null &&\n (isLoading || (visibleCount === 0 && search.trim().length > 0));\n\n return (\n <section\n aria-label=\"Conversation history\"\n className=\"border-b border-border bg-background px-2 pb-2\"\n data-testid=\"conversation-history-panel\"\n >\n <div className=\"flex h-10 items-center gap-1.5 px-1\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n Sessions\n </h2>\n <button\n type=\"button\"\n aria-label=\"Refresh sessions\"\n title={unavailable ?? \"Refresh sessions\"}\n disabled={isRefreshing || unavailable !== null}\n onClick={onRefresh}\n className=\"ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <RefreshCwIcon\n className={cn(\n \"size-3.5\",\n isRefreshing && unavailable === null && \"animate-spin\",\n )}\n />\n </button>\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-md bg-primary px-2 text-[11px] font-medium text-primary-foreground\"\n >\n <PlusIcon className=\"size-3\" /> New\n </button>\n </div>\n <label className=\"relative block min-w-0 px-1 pb-2\">\n <SearchIcon className=\"pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-[calc(50%+0.25rem)] text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n value={search}\n onChange={handleSearch}\n placeholder=\"Search sessions...\"\n // Read-only rather than disabled: no search can start, and the focus of\n // someone typing when Athena went away stays where it was.\n readOnly={unavailable !== null}\n aria-disabled={unavailable !== null || undefined}\n title={unavailable ?? undefined}\n className=\"h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background aria-disabled:cursor-not-allowed aria-disabled:opacity-60\"\n />\n </label>\n <div className=\"flex gap-1 overflow-x-auto px-1 pb-2 text-[11px]\">\n {([\"all\", \"chat\", \"automated\"] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => onActivityFilterChange(filter)}\n className={cn(\n \"rounded-full border px-2 py-1 capitalize\",\n activityFilter === filter\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\",\n )}\n >\n {filter === \"chat\"\n ? \"Chats\"\n : filter === \"automated\"\n ? \"Automations\"\n : \"All\"}\n </button>\n ))}\n <select\n aria-label=\"Filter by origin\"\n value={originFilter}\n onChange={(event) => onOriginFilterChange(event.target.value)}\n className=\"ml-auto rounded-full border border-border bg-background px-2 text-[11px] text-muted-foreground\"\n >\n <option value=\"all\">All origins</option>\n {origins.map((origin) => (\n <option key={origin} value={origin}>\n {originLabel(origin)}\n </option>\n ))}\n </select>\n </div>\n <div className=\"max-h-[min(60vh,28rem)] overflow-y-auto px-0.5\">\n {listWaitsOnAthena && actionsUnavailable ? (\n <p\n role=\"status\"\n data-testid=\"conversation-history-unavailable\"\n className=\"px-2 py-4 text-xs text-muted-foreground\"\n >\n <span className=\"font-medium text-foreground\">\n {actionsUnavailable.label}\n </span>{\" \"}\n {actionsUnavailable.detail}\n </p>\n ) : isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading\n sessions…\n </div>\n ) : visibleCount === 0 ? (\n <p className=\"px-2 py-4 text-xs text-muted-foreground\">\n No matching sessions.\n </p>\n ) : (\n grouped.map(({ group, items }) => (\n <div key={group}>\n <h3 className=\"px-2 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/75\">\n {group}\n </h3>\n {items.map((conversation) => {\n const automated = isAutomatedConversation(conversation);\n return (\n <div\n key={conversation.threadId}\n className={cn(\n \"group flex items-start gap-2 rounded-md px-2 py-2 hover:bg-accent\",\n conversation.threadId === activeThreadId &&\n \"bg-primary/10 text-primary\",\n )}\n onMouseEnter={() => handleRowEnter(conversation.threadId)}\n onMouseLeave={() => handleRowLeave(conversation.threadId)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelect(conversation.threadId);\n if (conversation.isUnread) {\n onSetReadState(conversation.threadId, false);\n }\n }}\n className=\"flex min-w-0 flex-1 items-start gap-2 text-left\"\n >\n <ConversationTypeIcon\n conversation={conversation}\n automated={automated}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start gap-1\">\n <span className=\"line-clamp-2 flex-1 text-xs font-medium leading-snug\">\n {conversationDisplayTitle(conversation)}\n </span>\n {conversation.isUnread ? (\n <span\n aria-label=\"Unread\"\n className=\"mt-1 size-1.5 shrink-0 rounded-full bg-primary\"\n />\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <span>{relativeTime(conversation.updatedAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"truncate\">\n {originLabel(originKey(conversation))}\n </span>\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={`Archive ${conversationDisplayTitle(conversation)}`}\n title={unavailable ?? \"Archive conversation\"}\n disabled={unavailable !== null}\n onClick={() => onArchive(conversation.threadId)}\n className=\"invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ArchiveIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n ))\n )}\n {listWaitsOnAthena ? null : hasNextPage ? (\n <button\n type=\"button\"\n title={unavailable ?? undefined}\n disabled={isFetchingNextPage || unavailable !== null}\n onClick={onLoadMore}\n className=\"mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isFetchingNextPage ? \"Loading…\" : \"Load older sessions\"}\n </button>\n ) : visibleCount > 0 ? (\n <p className=\"py-2 text-center text-[10px] text-muted-foreground/70\">\n No more sessions\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n"],"names":["jsx","LoaderCircleIcon","assetTypeToThumb","BotIcon","MessageSquareIcon","useRef","useCallback","useEffect","useMemo","jsxs","RefreshCwIcon","cn","PlusIcon","SearchIcon","conversationDisplayTitle","ArchiveIcon"],"mappings":";;;;;;;;AA8BA,MAAM,cAAgD;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,gDAAgC,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,SAAS,wBACd,cACS;;AACT,QAAM,iBAAgB,kBAAa,kBAAb,mBAA4B,OAAO;AACzD,MAAI,iBAAiB,0BAA0B,IAAI,aAAa;AAC9D,WAAO;AACT,QAAM,eAAc,kBAAa,gBAAb,mBAA0B,OAAO;AACrD,SAAO,QAAQ,eAAe,gBAAgB,QAAQ;AACxD;AAEO,SAAS,sBACd,OACA,MAAY,oBAAI,QACO;AACvB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAA,CAAS,EAAG,QAAO;AACzC,QAAM,eAAe,IAAI;AAAA,IACvB,IAAI,YAAA;AAAA,IACJ,IAAI,SAAA;AAAA,IACJ,IAAI,QAAA;AAAA,EAAQ;AAEd,QAAM,mBAAmB,IAAI,KAAK,aAAa,QAAA,IAAY,KAAU;AACrE,QAAM,cAAc,IAAI;AAAA,IACtB,aAAa,QAAA,IAAY,aAAa,WAAW;AAAA,EAAA;AAEnD,QAAM,eAAe,IAAI,KAAK,IAAI,eAAe,IAAI,SAAA,GAAY,CAAC;AAClE,MAAI,QAAQ,aAAc,QAAO;AACjC,MAAI,QAAQ,iBAAkB,QAAO;AACrC,MAAI,QAAQ,YAAa,QAAO;AAChC,MAAI,QAAQ,aAAc,QAAO;AACjC,SAAO;AACT;AA4CA,SAAS,iBAAiB,QAA2B;AACnD,SAAO,GAAG,OAAO,KAAK,MAAM,OAAO,MAAM;AAC3C;AAEA,SAAS,UAAU,cAA2C;AAC5D,SAAO,aAAa,SAAS,aAAa,iBAAiB;AAC7D;AAEA,SAAS,YAAY,OAAuB;AAC1C,QAAM,aAAa,MAAM,YAAA;AACzB,MAAI,WAAW,SAAS,QAAQ,EAAG,QAAO;AAC1C,MAAI,WAAW,SAAS,YAAY,EAAG,QAAO;AAC9C,MAAI,WAAW,SAAS,MAAM,EAAG,QAAO;AACxC,MAAI,WAAW,SAAS,OAAO,EAAG,QAAO;AACzC,MAAI,WAAW,SAAS,QAAQ,EAAG,QAAO;AAC1C,MAAI,eAAe,SAAS,WAAW,SAAS,SAAS,EAAG,QAAO;AACnE,MAAI,WAAW,SAAS,QAAQ,EAAG,QAAO;AAC1C,MAAI,UAAU,UAAW,QAAO;AAChC,SAAO,MAAM,QAAQ,eAAe,EAAE,EAAE,WAAW,KAAK,GAAG;AAC7D;AAEA,SAAS,aAAa,OAAuB;AAC3C,QAAM,YAAY,KAAK,MAAM,KAAK;AAClC,MAAI,CAAC,OAAO,SAAS,SAAS,EAAG,QAAO;AACxC,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAA,IAAQ,SAAS;AAClD,QAAM,UAAU,KAAK,MAAM,UAAU,GAAM;AAC3C,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK,KAAK,UAAU,EAAE;AAChD,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,SAAO,OAAO,IAAI,GAAG,IAAI,UAAU,IAAI,KAAK,SAAS,EAAE,mBAAA;AACzD;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AACF,GAGG;AACD,MAAI,aAAa,UAAU,WAAW;AACpC,WACEA,2BAAAA;AAAAA,MAACC,YAAAA;AAAAA,MAAA;AAAA,QACC,cAAW;AAAA,QACX,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AACA,QAAM,YAAYC,eAAAA,iBAAiB,aAAa,aAAa,SAAS;AACtE,MAAI,WAAW;AACb,0CAAQ,OAAA,EAAI,KAAK,WAAW,KAAI,IAAG,WAAU,0BAAyB;AAAA,EACxE;AACA,SAAO,2CACJC,YAAAA,SAAA,EAAQ,WAAU,uCAAsC,IAEzDH,2BAAAA,IAACI,YAAAA,mBAAA,EAAkB,WAAU,0CAAA,CAA0C;AAE3E;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,qBAAqB;AACvB,GAAkC;AAChC,QAAM,cAAc,qBAChB,iBAAiB,kBAAkB,IACnC;AAOJ,QAAM,aAAaC,WAAAA,OAA6C,IAAI;AACpE,QAAM,sBAAsBA,WAAAA,OAAsB,IAAI;AACtD,QAAM,mBAAmBA,WAAAA,OAAO,aAAa;AAC7C,mBAAiB,UAAU;AAC3B,QAAM,sBAAsBA,WAAAA,OAAO,gBAAgB;AACnD,sBAAoB,UAAU;AAC9B,QAAM,mBAAmBC,WAAAA,YAAY,MAAM;AACzC,QAAI,WAAW,YAAY,KAAM;AACjC,iBAAa,WAAW,OAAO;AAC/B,eAAW,UAAU;AAAA,EACvB,GAAG,CAAA,CAAE;AACL,QAAM,iBAAiBA,WAAAA,YAAY,MAAM;;AACvC,UAAM,WAAW,oBAAoB;AACrC,QAAI,aAAa,KAAM;AACvB,wBAAoB,UAAU;AAC9B,8BAAoB,YAApB,6CAA8B;AAAA,EAChC,GAAG,CAAA,CAAE;AACLC,aAAAA;AAAAA,IACE,MAAM,MAAM;AACV,uBAAA;AACA,qBAAA;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,cAAc;AAAA,EAAA;AAEnC,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,QAAI,CAAC,iBAAiB,QAAS;AAC/B,qBAAA;AACA,eAAW,UAAU,WAAW,MAAM;;AACpC,iBAAW,UAAU;AACrB,0BAAoB,UAAU;AAC9B,6BAAiB,YAAjB,0CAA2B;AAAA,IAC7B,GAAG,kBAAkB;AAAA,EACvB;AACA,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,qBAAA;AACA,QAAI,oBAAoB,YAAY,SAAU;AAC9C,mBAAA;AAAA,EACF;AACA,QAAM,UAAUC,WAAAA;AAAAA,IACd,MAAM,CAAC,GAAG,IAAI,IAAI,cAAc,IAAI,SAAS,CAAC,CAAC,EAAE,KAAA;AAAA,IACjD,CAAC,aAAa;AAAA,EAAA;AAEhB,QAAM,UAAUA,WAAAA,QAAQ,MAAM;AAC5B,UAAM,UAAU,cAAc,OAAO,CAAC,iBAAiB;AACrD,YAAM,YAAY,wBAAwB,YAAY;AACtD,UAAI,mBAAmB,UAAU,UAAW,QAAO;AACnD,UAAI,mBAAmB,eAAe,CAAC,UAAW,QAAO;AACzD,aAAO,iBAAiB,SAAS,UAAU,YAAY,MAAM;AAAA,IAC/D,CAAC;AACD,UAAM,8BAAc,IAAA;AACpB,eAAW,gBAAgB,SAAS;AAClC,YAAM,QAAQ,sBAAsB,aAAa,SAAS;AAC1D,YAAM,QAAQ,QAAQ,IAAI,KAAK,KAAK,CAAA;AACpC,YAAM,KAAK,YAAY;AACvB,cAAQ,IAAI,OAAO,KAAK;AAAA,IAC1B;AACA,WAAO,YAAY,QAAQ,CAAC,UAAU;AACpC,YAAM,QAAQ,QAAQ,IAAI,KAAK;AAC/B,aAAO,QAAQ,CAAC,EAAE,OAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IACtC,CAAC;AAAA,EACH,GAAG,CAAC,gBAAgB,eAAe,YAAY,CAAC;AAGhDD,aAAAA,UAAU,MAAM;AACd,UAAM,WAAW,oBAAoB;AACrC,QAAI,aAAa,KAAM;AACvB,UAAM,eAAe,QAAQ;AAAA,MAAK,CAAC,EAAE,MAAA,MACnC,MAAM,KAAK,CAAC,iBAAiB,aAAa,aAAa,QAAQ;AAAA,IAAA;AAEjE,QAAI,CAAC,aAAc,gBAAA;AAAA,EACrB,GAAG,CAAC,SAAS,cAAc,CAAC;AAC5B,QAAM,eAAe,QAAQ;AAAA,IAC3B,CAAC,OAAO,UAAU,QAAQ,MAAM,MAAM;AAAA,IACtC;AAAA,EAAA;AAEF,QAAM,eAAe,CAAC,UACpB,eAAe,MAAM,OAAO,KAAK;AAInC,QAAM,oBACJ,uBAAuB,SACtB,aAAc,iBAAiB,KAAK,OAAO,OAAO,SAAS;AAE9D,SACEE,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,cAAW;AAAA,MACX,WAAU;AAAA,MACV,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,UAAAT,2BAAAA,IAAC,MAAA,EAAG,WAAU,+EAA8E,UAAA,YAE5F;AAAA,UACAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,OAAO,eAAe;AAAA,cACtB,UAAU,gBAAgB,gBAAgB;AAAA,cAC1C,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,UAAAA,2BAAAA;AAAAA,gBAACU,YAAAA;AAAAA,gBAAA;AAAA,kBACC,WAAWC,OAAAA;AAAAA,oBACT;AAAA,oBACA,gBAAgB,gBAAgB,QAAQ;AAAA,kBAAA;AAAA,gBAC1C;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,UAEFF,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAAT,2BAAAA,IAACY,YAAAA,UAAA,EAAS,WAAU,SAAA,CAAS;AAAA,gBAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACjC,GACF;AAAA,QACAH,2BAAAA,KAAC,SAAA,EAAM,WAAU,oCACf,UAAA;AAAA,UAAAT,2BAAAA,IAACa,YAAAA,YAAA,EAAW,WAAU,8GAAA,CAA8G;AAAA,UACpIb,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAU,UAAA,mBAAe;AAAA,UACzCA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU;AAAA,cACV,aAAY;AAAA,cAGZ,UAAU,gBAAgB;AAAA,cAC1B,iBAAe,gBAAgB,QAAQ;AAAA,cACvC,OAAO,eAAe;AAAA,cACtB,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QACAS,2BAAAA,KAAC,OAAA,EAAI,WAAU,oDACX,UAAA;AAAA,UAAA,CAAC,OAAO,QAAQ,WAAW,EAAY,IAAI,CAAC,WAC5CT,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAM,uBAAuB,MAAM;AAAA,cAC5C,WAAWW,OAAAA;AAAAA,gBACT;AAAA,gBACA,mBAAmB,SACf,8CACA;AAAA,cAAA;AAAA,cAGL,UAAA,WAAW,SACR,UACA,WAAW,cACT,gBACA;AAAA,YAAA;AAAA,YAdD;AAAA,UAAA,CAgBR;AAAA,UACDF,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,cAAW;AAAA,cACX,OAAO;AAAA,cACP,UAAU,CAAC,UAAU,qBAAqB,MAAM,OAAO,KAAK;AAAA,cAC5D,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAAT,2BAAAA,IAAC,UAAA,EAAO,OAAM,OAAM,UAAA,eAAW;AAAA,gBAC9B,QAAQ,IAAI,CAAC,WACZA,2BAAAA,IAAC,UAAA,EAAoB,OAAO,QACzB,UAAA,YAAY,MAAM,EAAA,GADR,MAEb,CACD;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,GACF;AAAA,QACAS,2BAAAA,KAAC,OAAA,EAAI,WAAU,kDACZ,UAAA;AAAA,UAAA,qBAAqB,qBACpBA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,eAAY;AAAA,cACZ,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAAT,2BAAAA,IAAC,QAAA,EAAK,WAAU,+BACb,UAAA,mBAAmB,OACtB;AAAA,gBAAQ;AAAA,gBACP,mBAAmB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAEpB,YACFS,2BAAAA,KAAC,OAAA,EAAI,WAAU,mEACb,UAAA;AAAA,YAAAT,2BAAAA,IAACC,YAAAA,kBAAA,EAAiB,WAAU,wBAAA,CAAwB;AAAA,YAAE;AAAA,UAAA,GAExD,IACE,iBAAiB,IACnBD,2BAAAA,IAAC,KAAA,EAAE,WAAU,2CAA0C,UAAA,wBAAA,CAEvD,IAEA,QAAQ,IAAI,CAAC,EAAE,OAAO,MAAA,sCACnB,OAAA,EACC,UAAA;AAAA,YAAAA,2BAAAA,IAAC,MAAA,EAAG,WAAU,iGACX,UAAA,OACH;AAAA,YACC,MAAM,IAAI,CAAC,iBAAiB;AAC3B,oBAAM,YAAY,wBAAwB,YAAY;AACtD,qBACES,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAWE,OAAAA;AAAAA,oBACT;AAAA,oBACA,aAAa,aAAa,kBACxB;AAAA,kBAAA;AAAA,kBAEJ,cAAc,MAAM,eAAe,aAAa,QAAQ;AAAA,kBACxD,cAAc,MAAM,eAAe,aAAa,QAAQ;AAAA,kBAExD,UAAA;AAAA,oBAAAF,2BAAAA;AAAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM;AACb,mCAAS,aAAa,QAAQ;AAC9B,8BAAI,aAAa,UAAU;AACzB,2CAAe,aAAa,UAAU,KAAK;AAAA,0BAC7C;AAAA,wBACF;AAAA,wBACA,WAAU;AAAA,wBAEV,UAAA;AAAA,0BAAAT,2BAAAA;AAAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC;AAAA,8BACA;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAEFS,2BAAAA,KAAC,QAAA,EAAK,WAAU,kBACd,UAAA;AAAA,4BAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,0BACd,UAAA;AAAA,8BAAAT,+BAAC,QAAA,EAAK,WAAU,wDACb,UAAAc,2BAAAA,yBAAyB,YAAY,GACxC;AAAA,8BACC,aAAa,WACZd,2BAAAA;AAAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,cAAW;AAAA,kCACX,WAAU;AAAA,gCAAA;AAAA,8BAAA,IAEV;AAAA,4BAAA,GACN;AAAA,4BACAS,2BAAAA,KAAC,QAAA,EAAK,WAAU,sEACd,UAAA;AAAA,8BAAAT,2BAAAA,IAAC,QAAA,EAAM,UAAA,aAAa,aAAa,SAAS,GAAE;AAAA,8BAC5CA,2BAAAA,IAAC,QAAA,EAAK,eAAY,QAAO,UAAA,KAAC;AAAA,8BAC1BA,+BAAC,UAAK,WAAU,YACb,sBAAY,UAAU,YAAY,CAAC,EAAA,CACtC;AAAA,4BAAA,EAAA,CACF;AAAA,0BAAA,EAAA,CACF;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAEFA,2BAAAA;AAAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,cAAY,WAAWc,oDAAyB,YAAY,CAAC;AAAA,wBAC7D,OAAO,eAAe;AAAA,wBACtB,UAAU,gBAAgB;AAAA,wBAC1B,SAAS,MAAM,UAAU,aAAa,QAAQ;AAAA,wBAC9C,WAAU;AAAA,wBAEV,UAAAd,2BAAAA,IAACe,YAAAA,aAAA,EAAY,WAAU,WAAA,CAAW;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACpC;AAAA,gBAAA;AAAA,gBArDK,aAAa;AAAA,cAAA;AAAA,YAwDxB,CAAC;AAAA,UAAA,EAAA,GAhEO,KAiEV,CACD;AAAA,UAEF,oBAAoB,OAAO,cAC1Bf,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO,eAAe;AAAA,cACtB,UAAU,sBAAsB,gBAAgB;AAAA,cAChD,SAAS;AAAA,cACT,WAAU;AAAA,cAET,+BAAqB,aAAa;AAAA,YAAA;AAAA,UAAA,IAEnC,eAAe,IACjBA,2BAAAA,IAAC,OAAE,WAAU,yDAAwD,8BAErE,IACE;AAAA,QAAA,EAAA,CACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;;;;"}
@@ -1,4 +1,5 @@
1
1
  import type { ConversationSummary } from "../../agent-runtime/src/index";
2
+ import type { LabelCopy } from "../../agent-runtime/src/offline-status";
2
3
  export type ConversationActivityFilter = "all" | "chat" | "automated";
3
4
  export type ConversationTimeGroup = "Today" | "Yesterday" | "This Week" | "This Month" | "Older";
4
5
  /** Mirrors Agora's persisted background-run classification for list metadata. */
@@ -33,5 +34,15 @@ export interface ConversationHistoryPanelProps {
33
34
  onHoverIntentEnd?: (threadId: string) => void;
34
35
  /** Dwell before a hover counts as intent; a pass-through never fires. */
35
36
  hoverIntentDelayMs?: number;
37
+ /**
38
+ * Why what needs Athena waits, or `null` while Athena answers: a host that
39
+ * keeps nothing while Athena can't be reached passes `NEEDS_CONNECTION`
40
+ * (`@athenaintel/agent-runtime/offline-status`). Refresh, the search box
41
+ * (a search asks Athena), Archive and loading older sessions are then
42
+ * disabled with it as their tooltip, and a list or a search that can't load
43
+ * says it instead of spinning. The rows already loaded, the filters and New
44
+ * stay as they are.
45
+ */
46
+ actionsUnavailable?: LabelCopy | null;
36
47
  }
37
- export declare function ConversationHistoryPanel({ conversations, activeThreadId, search, onSearchChange, activityFilter, onActivityFilterChange, originFilter, onOriginFilterChange, onSelect, onNewChat, onRefresh, onArchive, onSetReadState, isLoading, isRefreshing, hasNextPage, isFetchingNextPage, onLoadMore, onHoverIntent, onHoverIntentEnd, hoverIntentDelayMs, }: ConversationHistoryPanelProps): import("react").JSX.Element;
48
+ export declare function ConversationHistoryPanel({ conversations, activeThreadId, search, onSearchChange, activityFilter, onActivityFilterChange, originFilter, onOriginFilterChange, onSelect, onNewChat, onRefresh, onArchive, onSetReadState, isLoading, isRefreshing, hasNextPage, isFetchingNextPage, onLoadMore, onHoverIntent, onHoverIntentEnd, hoverIntentDelayMs, actionsUnavailable, }: ConversationHistoryPanelProps): import("react").JSX.Element;
@@ -47,6 +47,9 @@ function conversationTimeGroup(value, now = /* @__PURE__ */ new Date()) {
47
47
  if (date >= startOfMonth) return "This Month";
48
48
  return "Older";
49
49
  }
50
+ function unavailableTitle(reason) {
51
+ return `${reason.label} — ${reason.detail}`;
52
+ }
50
53
  function originKey(conversation) {
51
54
  return conversation.appId ?? conversation.sourceChannel ?? "unknown";
52
55
  }
@@ -114,8 +117,10 @@ function ConversationHistoryPanel({
114
117
  onLoadMore,
115
118
  onHoverIntent,
116
119
  onHoverIntentEnd,
117
- hoverIntentDelayMs = 150
120
+ hoverIntentDelayMs = 150,
121
+ actionsUnavailable = null
118
122
  }) {
123
+ const unavailable = actionsUnavailable ? unavailableTitle(actionsUnavailable) : null;
119
124
  const hoverTimer = useRef(null);
120
125
  const hoverIntentThreadId = useRef(null);
121
126
  const onHoverIntentRef = useRef(onHoverIntent);
@@ -192,6 +197,7 @@ function ConversationHistoryPanel({
192
197
  0
193
198
  );
194
199
  const handleSearch = (event) => onSearchChange(event.target.value);
200
+ const listWaitsOnAthena = actionsUnavailable !== null && (isLoading || visibleCount === 0 && search.trim().length > 0);
195
201
  return /* @__PURE__ */ jsxs(
196
202
  "section",
197
203
  {
@@ -206,14 +212,17 @@ function ConversationHistoryPanel({
206
212
  {
207
213
  type: "button",
208
214
  "aria-label": "Refresh sessions",
209
- title: "Refresh sessions",
210
- disabled: isRefreshing,
215
+ title: unavailable ?? "Refresh sessions",
216
+ disabled: isRefreshing || unavailable !== null,
211
217
  onClick: onRefresh,
212
- className: "ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50",
218
+ className: "ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",
213
219
  children: /* @__PURE__ */ jsx(
214
220
  RefreshCwIcon,
215
221
  {
216
- className: cn("size-3.5", isRefreshing && "animate-spin")
222
+ className: cn(
223
+ "size-3.5",
224
+ isRefreshing && unavailable === null && "animate-spin"
225
+ )
217
226
  }
218
227
  )
219
228
  }
@@ -240,7 +249,10 @@ function ConversationHistoryPanel({
240
249
  value: search,
241
250
  onChange: handleSearch,
242
251
  placeholder: "Search sessions...",
243
- className: "h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background"
252
+ readOnly: unavailable !== null,
253
+ "aria-disabled": unavailable !== null || void 0,
254
+ title: unavailable ?? void 0,
255
+ className: "h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background aria-disabled:cursor-not-allowed aria-disabled:opacity-60"
244
256
  }
245
257
  )
246
258
  ] }),
@@ -273,7 +285,19 @@ function ConversationHistoryPanel({
273
285
  )
274
286
  ] }),
275
287
  /* @__PURE__ */ jsxs("div", { className: "max-h-[min(60vh,28rem)] overflow-y-auto px-0.5", children: [
276
- isLoading ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground", children: [
288
+ listWaitsOnAthena && actionsUnavailable ? /* @__PURE__ */ jsxs(
289
+ "p",
290
+ {
291
+ role: "status",
292
+ "data-testid": "conversation-history-unavailable",
293
+ className: "px-2 py-4 text-xs text-muted-foreground",
294
+ children: [
295
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: actionsUnavailable.label }),
296
+ " ",
297
+ actionsUnavailable.detail
298
+ ]
299
+ }
300
+ ) : isLoading ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground", children: [
277
301
  /* @__PURE__ */ jsx(LoaderCircleIcon, { className: "size-3.5 animate-spin" }),
278
302
  " Loading sessions…"
279
303
  ] }) : visibleCount === 0 ? /* @__PURE__ */ jsx("p", { className: "px-2 py-4 text-xs text-muted-foreground", children: "No matching sessions." }) : grouped.map(({ group, items }) => /* @__PURE__ */ jsxs("div", { children: [
@@ -334,9 +358,10 @@ function ConversationHistoryPanel({
334
358
  {
335
359
  type: "button",
336
360
  "aria-label": `Archive ${conversationDisplayTitle(conversation)}`,
337
- title: "Archive conversation",
361
+ title: unavailable ?? "Archive conversation",
362
+ disabled: unavailable !== null,
338
363
  onClick: () => onArchive(conversation.threadId),
339
- className: "invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible",
364
+ className: "invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible disabled:cursor-not-allowed disabled:opacity-50",
340
365
  children: /* @__PURE__ */ jsx(ArchiveIcon, { className: "size-3.5" })
341
366
  }
342
367
  )
@@ -346,13 +371,14 @@ function ConversationHistoryPanel({
346
371
  );
347
372
  })
348
373
  ] }, group)),
349
- hasNextPage ? /* @__PURE__ */ jsx(
374
+ listWaitsOnAthena ? null : hasNextPage ? /* @__PURE__ */ jsx(
350
375
  "button",
351
376
  {
352
377
  type: "button",
353
- disabled: isFetchingNextPage,
378
+ title: unavailable ?? void 0,
379
+ disabled: isFetchingNextPage || unavailable !== null,
354
380
  onClick: onLoadMore,
355
- className: "mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50",
381
+ className: "mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50",
356
382
  children: isFetchingNextPage ? "Loading…" : "Load older sessions"
357
383
  }
358
384
  ) : visibleCount > 0 ? /* @__PURE__ */ jsx("p", { className: "py-2 text-center text-[10px] text-muted-foreground/70", children: "No more sessions" }) : null
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-history-panel.js","sources":["../../../src/chat-ui/header/conversation-history-panel.tsx"],"sourcesContent":["import type { ConversationSummary } from \"@athenaintel/agent-runtime\";\nimport {\n ArchiveIcon,\n BotIcon,\n LoaderCircleIcon,\n MessageSquareIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport {\n type ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { conversationDisplayTitle } from \"../../threads/use-rest-conversation-history\";\nimport { assetTypeToThumb } from \"../mentions/suggestions/data/sources/asset-type-icons\";\n\nexport type ConversationActivityFilter = \"all\" | \"chat\" | \"automated\";\nexport type ConversationTimeGroup =\n | \"Today\"\n | \"Yesterday\"\n | \"This Week\"\n | \"This Month\"\n | \"Older\";\n\nconst TIME_GROUPS: readonly ConversationTimeGroup[] = [\n \"Today\",\n \"Yesterday\",\n \"This Week\",\n \"This Month\",\n \"Older\",\n];\n\nconst AUTOMATED_SOURCE_CHANNELS = new Set([\n \"api\",\n \"email\",\n \"orchestration\",\n \"slack\",\n \"sms\",\n \"task\",\n \"teams\",\n]);\n\n/** Mirrors Agora's persisted background-run classification for list metadata. */\nexport function isAutomatedConversation(\n conversation: Pick<ConversationSummary, \"sourceChannel\" | \"triggerType\">,\n): boolean {\n const sourceChannel = conversation.sourceChannel?.trim().toLowerCase();\n if (sourceChannel && AUTOMATED_SOURCE_CHANNELS.has(sourceChannel))\n return true;\n const triggerType = conversation.triggerType?.trim().toLowerCase();\n return Boolean(triggerType && triggerType !== \"manual\");\n}\n\nexport function conversationTimeGroup(\n value: string,\n now: Date = new Date(),\n): ConversationTimeGroup {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Older\";\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfYesterday = new Date(startOfToday.getTime() - 86_400_000);\n const startOfWeek = new Date(\n startOfToday.getTime() - startOfToday.getDay() * 86_400_000,\n );\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n if (date >= startOfToday) return \"Today\";\n if (date >= startOfYesterday) return \"Yesterday\";\n if (date >= startOfWeek) return \"This Week\";\n if (date >= startOfMonth) return \"This Month\";\n return \"Older\";\n}\n\nexport interface ConversationHistoryPanelProps {\n conversations: readonly ConversationSummary[];\n activeThreadId: string;\n search: string;\n onSearchChange: (search: string) => void;\n activityFilter: ConversationActivityFilter;\n onActivityFilterChange: (filter: ConversationActivityFilter) => void;\n originFilter: string;\n onOriginFilterChange: (origin: string) => void;\n onSelect: (threadId: string) => void;\n onNewChat: () => void;\n onRefresh: () => void;\n onArchive: (threadId: string) => void;\n onSetReadState: (threadId: string, isUnread: boolean) => void;\n isLoading?: boolean;\n isRefreshing?: boolean;\n hasNextPage?: boolean;\n isFetchingNextPage?: boolean;\n onLoadMore?: () => void;\n /**\n * The pointer has rested on a conversation row for `hoverIntentDelayMs`:\n * the user is likely to open it next. Hosts wake and pre-dial the thread\n * here so the click lands on a warm instance with its hello in hand.\n */\n onHoverIntent?: (threadId: string) => void;\n /** The pointer left a row whose intent had fired. */\n onHoverIntentEnd?: (threadId: string) => void;\n /** Dwell before a hover counts as intent; a pass-through never fires. */\n hoverIntentDelayMs?: number;\n}\n\nfunction originKey(conversation: ConversationSummary): string {\n return conversation.appId ?? conversation.sourceChannel ?? \"unknown\";\n}\n\nfunction originLabel(value: string): string {\n const normalized = value.toLowerCase();\n if (normalized.includes(\"chrome\")) return \"Chrome\";\n if (normalized.includes(\"powerpoint\")) return \"PowerPoint\";\n if (normalized.includes(\"word\")) return \"Word\";\n if (normalized.includes(\"excel\")) return \"Excel\";\n if (normalized.includes(\"office\")) return \"Office\";\n if (normalized === \"web\" || normalized.includes(\"olympus\")) return \"Athena\";\n if (normalized.includes(\"mobile\")) return \"Mobile\";\n if (value === \"unknown\") return \"Legacy\";\n return value.replace(/^athena[-_]/, \"\").replaceAll(\"_\", \" \");\n}\n\nfunction relativeTime(value: string): string {\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return \"\";\n const elapsed = Math.max(0, Date.now() - timestamp);\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 1) return \"<1m ago\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m ago`;\n const days = Math.floor(hours / 24);\n return days < 7 ? `${days}d ago` : new Date(timestamp).toLocaleDateString();\n}\n\nfunction ConversationTypeIcon({\n conversation,\n automated,\n}: {\n conversation: ConversationSummary;\n automated: boolean;\n}) {\n if (conversation.state === \"running\") {\n return (\n <LoaderCircleIcon\n aria-label=\"Conversation running\"\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n const thumbnail = assetTypeToThumb(conversation.assetType ?? \"session\");\n if (thumbnail) {\n return <img src={thumbnail} alt=\"\" className=\"mt-0.5 size-4 shrink-0\" />;\n }\n return automated ? (\n <BotIcon className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n ) : (\n <MessageSquareIcon className=\"mt-0.5 size-4 shrink-0 text-emerald-500\" />\n );\n}\n\nexport function ConversationHistoryPanel({\n conversations,\n activeThreadId,\n search,\n onSearchChange,\n activityFilter,\n onActivityFilterChange,\n originFilter,\n onOriginFilterChange,\n onSelect,\n onNewChat,\n onRefresh,\n onArchive,\n onSetReadState,\n isLoading = false,\n isRefreshing = false,\n hasNextPage = false,\n isFetchingNextPage = false,\n onLoadMore,\n onHoverIntent,\n onHoverIntentEnd,\n hoverIntentDelayMs = 150,\n}: ConversationHistoryPanelProps) {\n // Hover intent: one dwell timer for the row under the pointer; a row the\n // pointer merely crosses never fires. The id whose intent fired is kept so\n // its end is reported exactly once — on leave, when the row disappears\n // (filter, archive, refresh) or when the panel closes under the pointer.\n // The callbacks are read through refs so an inline handler's identity\n // changing on a parent re-render neither re-arms nor ends anything.\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverIntentThreadId = useRef<string | null>(null);\n const onHoverIntentRef = useRef(onHoverIntent);\n onHoverIntentRef.current = onHoverIntent;\n const onHoverIntentEndRef = useRef(onHoverIntentEnd);\n onHoverIntentEndRef.current = onHoverIntentEnd;\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimer.current === null) return;\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }, []);\n const endHoverIntent = useCallback(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n hoverIntentThreadId.current = null;\n onHoverIntentEndRef.current?.(threadId);\n }, []);\n useEffect(\n () => () => {\n cancelHoverTimer();\n endHoverIntent();\n },\n [cancelHoverTimer, endHoverIntent],\n );\n const handleRowEnter = (threadId: string) => {\n if (!onHoverIntentRef.current) return;\n cancelHoverTimer();\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n hoverIntentThreadId.current = threadId;\n onHoverIntentRef.current?.(threadId);\n }, hoverIntentDelayMs);\n };\n const handleRowLeave = (threadId: string) => {\n cancelHoverTimer();\n if (hoverIntentThreadId.current !== threadId) return;\n endHoverIntent();\n };\n const origins = useMemo(\n () => [...new Set(conversations.map(originKey))].sort(),\n [conversations],\n );\n const grouped = useMemo(() => {\n const visible = conversations.filter((conversation) => {\n const automated = isAutomatedConversation(conversation);\n if (activityFilter === \"chat\" && automated) return false;\n if (activityFilter === \"automated\" && !automated) return false;\n return originFilter === \"all\" || originKey(conversation) === originFilter;\n });\n const byGroup = new Map<ConversationTimeGroup, ConversationSummary[]>();\n for (const conversation of visible) {\n const group = conversationTimeGroup(conversation.updatedAt);\n const items = byGroup.get(group) ?? [];\n items.push(conversation);\n byGroup.set(group, items);\n }\n return TIME_GROUPS.flatMap((group) => {\n const items = byGroup.get(group);\n return items ? [{ group, items }] : [];\n });\n }, [activityFilter, conversations, originFilter]);\n // The hovered row left the list (filter, archive, refresh): no leave event\n // will come for it, so its intent ends here.\n useEffect(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n const stillVisible = grouped.some(({ items }) =>\n items.some((conversation) => conversation.threadId === threadId),\n );\n if (!stillVisible) endHoverIntent();\n }, [grouped, endHoverIntent]);\n const visibleCount = grouped.reduce(\n (count, group) => count + group.items.length,\n 0,\n );\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n onSearchChange(event.target.value);\n\n return (\n <section\n aria-label=\"Conversation history\"\n className=\"border-b border-border bg-background px-2 pb-2\"\n data-testid=\"conversation-history-panel\"\n >\n <div className=\"flex h-10 items-center gap-1.5 px-1\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n Sessions\n </h2>\n <button\n type=\"button\"\n aria-label=\"Refresh sessions\"\n title=\"Refresh sessions\"\n disabled={isRefreshing}\n onClick={onRefresh}\n className=\"ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50\"\n >\n <RefreshCwIcon\n className={cn(\"size-3.5\", isRefreshing && \"animate-spin\")}\n />\n </button>\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-md bg-primary px-2 text-[11px] font-medium text-primary-foreground\"\n >\n <PlusIcon className=\"size-3\" /> New\n </button>\n </div>\n <label className=\"relative block min-w-0 px-1 pb-2\">\n <SearchIcon className=\"pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-[calc(50%+0.25rem)] text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n value={search}\n onChange={handleSearch}\n placeholder=\"Search sessions...\"\n className=\"h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n <div className=\"flex gap-1 overflow-x-auto px-1 pb-2 text-[11px]\">\n {([\"all\", \"chat\", \"automated\"] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => onActivityFilterChange(filter)}\n className={cn(\n \"rounded-full border px-2 py-1 capitalize\",\n activityFilter === filter\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\",\n )}\n >\n {filter === \"chat\"\n ? \"Chats\"\n : filter === \"automated\"\n ? \"Automations\"\n : \"All\"}\n </button>\n ))}\n <select\n aria-label=\"Filter by origin\"\n value={originFilter}\n onChange={(event) => onOriginFilterChange(event.target.value)}\n className=\"ml-auto rounded-full border border-border bg-background px-2 text-[11px] text-muted-foreground\"\n >\n <option value=\"all\">All origins</option>\n {origins.map((origin) => (\n <option key={origin} value={origin}>\n {originLabel(origin)}\n </option>\n ))}\n </select>\n </div>\n <div className=\"max-h-[min(60vh,28rem)] overflow-y-auto px-0.5\">\n {isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading\n sessions…\n </div>\n ) : visibleCount === 0 ? (\n <p className=\"px-2 py-4 text-xs text-muted-foreground\">\n No matching sessions.\n </p>\n ) : (\n grouped.map(({ group, items }) => (\n <div key={group}>\n <h3 className=\"px-2 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/75\">\n {group}\n </h3>\n {items.map((conversation) => {\n const automated = isAutomatedConversation(conversation);\n return (\n <div\n key={conversation.threadId}\n className={cn(\n \"group flex items-start gap-2 rounded-md px-2 py-2 hover:bg-accent\",\n conversation.threadId === activeThreadId &&\n \"bg-primary/10 text-primary\",\n )}\n onMouseEnter={() => handleRowEnter(conversation.threadId)}\n onMouseLeave={() => handleRowLeave(conversation.threadId)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelect(conversation.threadId);\n if (conversation.isUnread) {\n onSetReadState(conversation.threadId, false);\n }\n }}\n className=\"flex min-w-0 flex-1 items-start gap-2 text-left\"\n >\n <ConversationTypeIcon\n conversation={conversation}\n automated={automated}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start gap-1\">\n <span className=\"line-clamp-2 flex-1 text-xs font-medium leading-snug\">\n {conversationDisplayTitle(conversation)}\n </span>\n {conversation.isUnread ? (\n <span\n aria-label=\"Unread\"\n className=\"mt-1 size-1.5 shrink-0 rounded-full bg-primary\"\n />\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <span>{relativeTime(conversation.updatedAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"truncate\">\n {originLabel(originKey(conversation))}\n </span>\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={`Archive ${conversationDisplayTitle(conversation)}`}\n title=\"Archive conversation\"\n onClick={() => onArchive(conversation.threadId)}\n className=\"invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible\"\n >\n <ArchiveIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n ))\n )}\n {hasNextPage ? (\n <button\n type=\"button\"\n disabled={isFetchingNextPage}\n onClick={onLoadMore}\n className=\"mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50\"\n >\n {isFetchingNextPage ? \"Loading…\" : \"Load older sessions\"}\n </button>\n ) : visibleCount > 0 ? (\n <p className=\"py-2 text-center text-[10px] text-muted-foreground/70\">\n No more sessions\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-history-panel.js","sources":["../../../src/chat-ui/header/conversation-history-panel.tsx"],"sourcesContent":["import type { ConversationSummary } from \"@athenaintel/agent-runtime\";\nimport type { LabelCopy } from \"@athenaintel/agent-runtime/offline-status\";\nimport {\n ArchiveIcon,\n BotIcon,\n LoaderCircleIcon,\n MessageSquareIcon,\n PlusIcon,\n RefreshCwIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport {\n type ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { conversationDisplayTitle } from \"../../threads/use-rest-conversation-history\";\nimport { assetTypeToThumb } from \"../mentions/suggestions/data/sources/asset-type-icons\";\n\nexport type ConversationActivityFilter = \"all\" | \"chat\" | \"automated\";\nexport type ConversationTimeGroup =\n | \"Today\"\n | \"Yesterday\"\n | \"This Week\"\n | \"This Month\"\n | \"Older\";\n\nconst TIME_GROUPS: readonly ConversationTimeGroup[] = [\n \"Today\",\n \"Yesterday\",\n \"This Week\",\n \"This Month\",\n \"Older\",\n];\n\nconst AUTOMATED_SOURCE_CHANNELS = new Set([\n \"api\",\n \"email\",\n \"orchestration\",\n \"slack\",\n \"sms\",\n \"task\",\n \"teams\",\n]);\n\n/** Mirrors Agora's persisted background-run classification for list metadata. */\nexport function isAutomatedConversation(\n conversation: Pick<ConversationSummary, \"sourceChannel\" | \"triggerType\">,\n): boolean {\n const sourceChannel = conversation.sourceChannel?.trim().toLowerCase();\n if (sourceChannel && AUTOMATED_SOURCE_CHANNELS.has(sourceChannel))\n return true;\n const triggerType = conversation.triggerType?.trim().toLowerCase();\n return Boolean(triggerType && triggerType !== \"manual\");\n}\n\nexport function conversationTimeGroup(\n value: string,\n now: Date = new Date(),\n): ConversationTimeGroup {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"Older\";\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfYesterday = new Date(startOfToday.getTime() - 86_400_000);\n const startOfWeek = new Date(\n startOfToday.getTime() - startOfToday.getDay() * 86_400_000,\n );\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n if (date >= startOfToday) return \"Today\";\n if (date >= startOfYesterday) return \"Yesterday\";\n if (date >= startOfWeek) return \"This Week\";\n if (date >= startOfMonth) return \"This Month\";\n return \"Older\";\n}\n\nexport interface ConversationHistoryPanelProps {\n conversations: readonly ConversationSummary[];\n activeThreadId: string;\n search: string;\n onSearchChange: (search: string) => void;\n activityFilter: ConversationActivityFilter;\n onActivityFilterChange: (filter: ConversationActivityFilter) => void;\n originFilter: string;\n onOriginFilterChange: (origin: string) => void;\n onSelect: (threadId: string) => void;\n onNewChat: () => void;\n onRefresh: () => void;\n onArchive: (threadId: string) => void;\n onSetReadState: (threadId: string, isUnread: boolean) => void;\n isLoading?: boolean;\n isRefreshing?: boolean;\n hasNextPage?: boolean;\n isFetchingNextPage?: boolean;\n onLoadMore?: () => void;\n /**\n * The pointer has rested on a conversation row for `hoverIntentDelayMs`:\n * the user is likely to open it next. Hosts wake and pre-dial the thread\n * here so the click lands on a warm instance with its hello in hand.\n */\n onHoverIntent?: (threadId: string) => void;\n /** The pointer left a row whose intent had fired. */\n onHoverIntentEnd?: (threadId: string) => void;\n /** Dwell before a hover counts as intent; a pass-through never fires. */\n hoverIntentDelayMs?: number;\n /**\n * Why what needs Athena waits, or `null` while Athena answers: a host that\n * keeps nothing while Athena can't be reached passes `NEEDS_CONNECTION`\n * (`@athenaintel/agent-runtime/offline-status`). Refresh, the search box\n * (a search asks Athena), Archive and loading older sessions are then\n * disabled with it as their tooltip, and a list or a search that can't load\n * says it instead of spinning. The rows already loaded, the filters and New\n * stay as they are.\n */\n actionsUnavailable?: LabelCopy | null;\n}\n\n/** A disabled control's tooltip: the reason's label, then its line. */\nfunction unavailableTitle(reason: LabelCopy): string {\n return `${reason.label} — ${reason.detail}`;\n}\n\nfunction originKey(conversation: ConversationSummary): string {\n return conversation.appId ?? conversation.sourceChannel ?? \"unknown\";\n}\n\nfunction originLabel(value: string): string {\n const normalized = value.toLowerCase();\n if (normalized.includes(\"chrome\")) return \"Chrome\";\n if (normalized.includes(\"powerpoint\")) return \"PowerPoint\";\n if (normalized.includes(\"word\")) return \"Word\";\n if (normalized.includes(\"excel\")) return \"Excel\";\n if (normalized.includes(\"office\")) return \"Office\";\n if (normalized === \"web\" || normalized.includes(\"olympus\")) return \"Athena\";\n if (normalized.includes(\"mobile\")) return \"Mobile\";\n if (value === \"unknown\") return \"Legacy\";\n return value.replace(/^athena[-_]/, \"\").replaceAll(\"_\", \" \");\n}\n\nfunction relativeTime(value: string): string {\n const timestamp = Date.parse(value);\n if (!Number.isFinite(timestamp)) return \"\";\n const elapsed = Math.max(0, Date.now() - timestamp);\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 1) return \"<1m ago\";\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m ago`;\n const days = Math.floor(hours / 24);\n return days < 7 ? `${days}d ago` : new Date(timestamp).toLocaleDateString();\n}\n\nfunction ConversationTypeIcon({\n conversation,\n automated,\n}: {\n conversation: ConversationSummary;\n automated: boolean;\n}) {\n if (conversation.state === \"running\") {\n return (\n <LoaderCircleIcon\n aria-label=\"Conversation running\"\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n const thumbnail = assetTypeToThumb(conversation.assetType ?? \"session\");\n if (thumbnail) {\n return <img src={thumbnail} alt=\"\" className=\"mt-0.5 size-4 shrink-0\" />;\n }\n return automated ? (\n <BotIcon className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n ) : (\n <MessageSquareIcon className=\"mt-0.5 size-4 shrink-0 text-emerald-500\" />\n );\n}\n\nexport function ConversationHistoryPanel({\n conversations,\n activeThreadId,\n search,\n onSearchChange,\n activityFilter,\n onActivityFilterChange,\n originFilter,\n onOriginFilterChange,\n onSelect,\n onNewChat,\n onRefresh,\n onArchive,\n onSetReadState,\n isLoading = false,\n isRefreshing = false,\n hasNextPage = false,\n isFetchingNextPage = false,\n onLoadMore,\n onHoverIntent,\n onHoverIntentEnd,\n hoverIntentDelayMs = 150,\n actionsUnavailable = null,\n}: ConversationHistoryPanelProps) {\n const unavailable = actionsUnavailable\n ? unavailableTitle(actionsUnavailable)\n : null;\n // Hover intent: one dwell timer for the row under the pointer; a row the\n // pointer merely crosses never fires. The id whose intent fired is kept so\n // its end is reported exactly once — on leave, when the row disappears\n // (filter, archive, refresh) or when the panel closes under the pointer.\n // The callbacks are read through refs so an inline handler's identity\n // changing on a parent re-render neither re-arms nor ends anything.\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hoverIntentThreadId = useRef<string | null>(null);\n const onHoverIntentRef = useRef(onHoverIntent);\n onHoverIntentRef.current = onHoverIntent;\n const onHoverIntentEndRef = useRef(onHoverIntentEnd);\n onHoverIntentEndRef.current = onHoverIntentEnd;\n const cancelHoverTimer = useCallback(() => {\n if (hoverTimer.current === null) return;\n clearTimeout(hoverTimer.current);\n hoverTimer.current = null;\n }, []);\n const endHoverIntent = useCallback(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n hoverIntentThreadId.current = null;\n onHoverIntentEndRef.current?.(threadId);\n }, []);\n useEffect(\n () => () => {\n cancelHoverTimer();\n endHoverIntent();\n },\n [cancelHoverTimer, endHoverIntent],\n );\n const handleRowEnter = (threadId: string) => {\n if (!onHoverIntentRef.current) return;\n cancelHoverTimer();\n hoverTimer.current = setTimeout(() => {\n hoverTimer.current = null;\n hoverIntentThreadId.current = threadId;\n onHoverIntentRef.current?.(threadId);\n }, hoverIntentDelayMs);\n };\n const handleRowLeave = (threadId: string) => {\n cancelHoverTimer();\n if (hoverIntentThreadId.current !== threadId) return;\n endHoverIntent();\n };\n const origins = useMemo(\n () => [...new Set(conversations.map(originKey))].sort(),\n [conversations],\n );\n const grouped = useMemo(() => {\n const visible = conversations.filter((conversation) => {\n const automated = isAutomatedConversation(conversation);\n if (activityFilter === \"chat\" && automated) return false;\n if (activityFilter === \"automated\" && !automated) return false;\n return originFilter === \"all\" || originKey(conversation) === originFilter;\n });\n const byGroup = new Map<ConversationTimeGroup, ConversationSummary[]>();\n for (const conversation of visible) {\n const group = conversationTimeGroup(conversation.updatedAt);\n const items = byGroup.get(group) ?? [];\n items.push(conversation);\n byGroup.set(group, items);\n }\n return TIME_GROUPS.flatMap((group) => {\n const items = byGroup.get(group);\n return items ? [{ group, items }] : [];\n });\n }, [activityFilter, conversations, originFilter]);\n // The hovered row left the list (filter, archive, refresh): no leave event\n // will come for it, so its intent ends here.\n useEffect(() => {\n const threadId = hoverIntentThreadId.current;\n if (threadId === null) return;\n const stillVisible = grouped.some(({ items }) =>\n items.some((conversation) => conversation.threadId === threadId),\n );\n if (!stillVisible) endHoverIntent();\n }, [grouped, endHoverIntent]);\n const visibleCount = grouped.reduce(\n (count, group) => count + group.items.length,\n 0,\n );\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n onSearchChange(event.target.value);\n // A list that never loaded, or a search with nothing to show, waits on\n // Athena while it can't be reached: say so instead of spinning, or of\n // \"No matching sessions\" for a search that never ran.\n const listWaitsOnAthena =\n actionsUnavailable !== null &&\n (isLoading || (visibleCount === 0 && search.trim().length > 0));\n\n return (\n <section\n aria-label=\"Conversation history\"\n className=\"border-b border-border bg-background px-2 pb-2\"\n data-testid=\"conversation-history-panel\"\n >\n <div className=\"flex h-10 items-center gap-1.5 px-1\">\n <h2 className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n Sessions\n </h2>\n <button\n type=\"button\"\n aria-label=\"Refresh sessions\"\n title={unavailable ?? \"Refresh sessions\"}\n disabled={isRefreshing || unavailable !== null}\n onClick={onRefresh}\n className=\"ml-auto rounded-md p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <RefreshCwIcon\n className={cn(\n \"size-3.5\",\n isRefreshing && unavailable === null && \"animate-spin\",\n )}\n />\n </button>\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-md bg-primary px-2 text-[11px] font-medium text-primary-foreground\"\n >\n <PlusIcon className=\"size-3\" /> New\n </button>\n </div>\n <label className=\"relative block min-w-0 px-1 pb-2\">\n <SearchIcon className=\"pointer-events-none absolute left-3 top-1/2 size-3.5 -translate-y-[calc(50%+0.25rem)] text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n value={search}\n onChange={handleSearch}\n placeholder=\"Search sessions...\"\n // Read-only rather than disabled: no search can start, and the focus of\n // someone typing when Athena went away stays where it was.\n readOnly={unavailable !== null}\n aria-disabled={unavailable !== null || undefined}\n title={unavailable ?? undefined}\n className=\"h-8 w-full rounded-md border border-border bg-muted/40 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background aria-disabled:cursor-not-allowed aria-disabled:opacity-60\"\n />\n </label>\n <div className=\"flex gap-1 overflow-x-auto px-1 pb-2 text-[11px]\">\n {([\"all\", \"chat\", \"automated\"] as const).map((filter) => (\n <button\n key={filter}\n type=\"button\"\n onClick={() => onActivityFilterChange(filter)}\n className={cn(\n \"rounded-full border px-2 py-1 capitalize\",\n activityFilter === filter\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border text-muted-foreground\",\n )}\n >\n {filter === \"chat\"\n ? \"Chats\"\n : filter === \"automated\"\n ? \"Automations\"\n : \"All\"}\n </button>\n ))}\n <select\n aria-label=\"Filter by origin\"\n value={originFilter}\n onChange={(event) => onOriginFilterChange(event.target.value)}\n className=\"ml-auto rounded-full border border-border bg-background px-2 text-[11px] text-muted-foreground\"\n >\n <option value=\"all\">All origins</option>\n {origins.map((origin) => (\n <option key={origin} value={origin}>\n {originLabel(origin)}\n </option>\n ))}\n </select>\n </div>\n <div className=\"max-h-[min(60vh,28rem)] overflow-y-auto px-0.5\">\n {listWaitsOnAthena && actionsUnavailable ? (\n <p\n role=\"status\"\n data-testid=\"conversation-history-unavailable\"\n className=\"px-2 py-4 text-xs text-muted-foreground\"\n >\n <span className=\"font-medium text-foreground\">\n {actionsUnavailable.label}\n </span>{\" \"}\n {actionsUnavailable.detail}\n </p>\n ) : isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-4 text-xs text-muted-foreground\">\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" /> Loading\n sessions…\n </div>\n ) : visibleCount === 0 ? (\n <p className=\"px-2 py-4 text-xs text-muted-foreground\">\n No matching sessions.\n </p>\n ) : (\n grouped.map(({ group, items }) => (\n <div key={group}>\n <h3 className=\"px-2 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-[0.08em] text-muted-foreground/75\">\n {group}\n </h3>\n {items.map((conversation) => {\n const automated = isAutomatedConversation(conversation);\n return (\n <div\n key={conversation.threadId}\n className={cn(\n \"group flex items-start gap-2 rounded-md px-2 py-2 hover:bg-accent\",\n conversation.threadId === activeThreadId &&\n \"bg-primary/10 text-primary\",\n )}\n onMouseEnter={() => handleRowEnter(conversation.threadId)}\n onMouseLeave={() => handleRowLeave(conversation.threadId)}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelect(conversation.threadId);\n if (conversation.isUnread) {\n onSetReadState(conversation.threadId, false);\n }\n }}\n className=\"flex min-w-0 flex-1 items-start gap-2 text-left\"\n >\n <ConversationTypeIcon\n conversation={conversation}\n automated={automated}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-start gap-1\">\n <span className=\"line-clamp-2 flex-1 text-xs font-medium leading-snug\">\n {conversationDisplayTitle(conversation)}\n </span>\n {conversation.isUnread ? (\n <span\n aria-label=\"Unread\"\n className=\"mt-1 size-1.5 shrink-0 rounded-full bg-primary\"\n />\n ) : null}\n </span>\n <span className=\"mt-0.5 flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <span>{relativeTime(conversation.updatedAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"truncate\">\n {originLabel(originKey(conversation))}\n </span>\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n aria-label={`Archive ${conversationDisplayTitle(conversation)}`}\n title={unavailable ?? \"Archive conversation\"}\n disabled={unavailable !== null}\n onClick={() => onArchive(conversation.threadId)}\n className=\"invisible rounded p-1 text-muted-foreground hover:bg-background hover:text-foreground group-hover:visible focus:visible disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ArchiveIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n ))\n )}\n {listWaitsOnAthena ? null : hasNextPage ? (\n <button\n type=\"button\"\n title={unavailable ?? undefined}\n disabled={isFetchingNextPage || unavailable !== null}\n onClick={onLoadMore}\n className=\"mt-1 w-full rounded-lg py-2 text-xs text-muted-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isFetchingNextPage ? \"Loading…\" : \"Load older sessions\"}\n </button>\n ) : visibleCount > 0 ? (\n <p className=\"py-2 text-center text-[10px] text-muted-foreground/70\">\n No more sessions\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -26,6 +26,8 @@ const assetTypeIcons = require("./mentions/suggestions/data/sources/asset-type-i
26
26
  const types = require("./mentions/suggestions/data/types.cjs");
27
27
  const assetUrls = require("./lib/asset-urls.cjs");
28
28
  const messageComponents = require("./messages/message-components.cjs");
29
+ const messageImages = require("./messages/message-images.cjs");
30
+ const arrivalAnimation = require("./messages/arrival-animation.cjs");
29
31
  const threadChrome = require("./messages/thread-chrome.cjs");
30
32
  const userEditComposer = require("./messages/user-edit-composer.cjs");
31
33
  const messageActionsConfig = require("./messages/message-actions-config.cjs");
@@ -33,12 +35,17 @@ const runningIndicator = require("./messages/running-indicator.cjs");
33
35
  const signInCard = require("./auth/sign-in-card.cjs");
34
36
  const runtimeMessage = require("./messages/runtime-message.cjs");
35
37
  const wakeMarker = require("./messages/wake-marker.cjs");
38
+ const handoffArrivalDivider = require("./messages/handoff-arrival-divider.cjs");
39
+ const answerLabel = require("./messages/answer-label.cjs");
36
40
  const voiceDelegationCard = require("./messages/voice-delegation-card.cjs");
41
+ const fromTheCallCard = require("./messages/from-the-call-card.cjs");
37
42
  const continuePill = require("./messages/continue-pill.cjs");
38
43
  const statewireContinueRun = require("./messages/statewire-continue-run.cjs");
39
44
  const StatewireApprovalCard = require("../chat/StatewireApprovalCard.cjs");
45
+ const browserDecisionCheck = require("../chat/browser-decision-check.cjs");
40
46
  const useStatewireApprovalRequest = require("../chat/use-statewire-approval-request.cjs");
41
47
  const StatewireQueuedMessages = require("../chat/StatewireQueuedMessages.cjs");
48
+ const DrivingOnChip = require("../chat/DrivingOnChip.cjs");
42
49
  const WaitingOnYouBanner = require("../chat/WaitingOnYouBanner.cjs");
43
50
  const interrupts = require("../agent-runtime/src/interrupts.cjs");
44
51
  exports.ChatThreadShell = chatThreadShell.ChatThreadShell;
@@ -107,6 +114,10 @@ exports.THREAD_SCROLL_TO_BOTTOM_CLASS = messageComponents.THREAD_SCROLL_TO_BOTTO
107
114
  exports.UserMessage = messageComponents.UserMessage;
108
115
  exports.UserMessageText = messageComponents.UserMessageText;
109
116
  exports.createAssistantMessage = messageComponents.createAssistantMessage;
117
+ exports.MessageImageGallery = messageImages.MessageImageGallery;
118
+ exports.MessageImagePart = messageImages.MessageImagePart;
119
+ exports.MESSAGE_ARRIVAL_ANIMATION_CLASS = arrivalAnimation.MESSAGE_ARRIVAL_ANIMATION_CLASS;
120
+ exports.useMessageArrivalAnimation = arrivalAnimation.useMessageArrivalAnimation;
110
121
  exports.IconButton = threadChrome.IconButton;
111
122
  exports.SmallIconButton = threadChrome.SmallIconButton;
112
123
  exports.THREAD_HEADER_ACTIONS_CLASS = threadChrome.THREAD_HEADER_ACTIONS_CLASS;
@@ -128,15 +139,25 @@ exports.SignInTextField = signInCard.SignInTextField;
128
139
  exports.RuntimeMessageCard = runtimeMessage.RuntimeMessageCard;
129
140
  exports.WakeMarkerCard = wakeMarker.WakeMarkerCard;
130
141
  exports.WakeMarkerMessage = wakeMarker.WakeMarkerMessage;
142
+ exports.HandoffArrivalAfterMessage = handoffArrivalDivider.HandoffArrivalAfterMessage;
143
+ exports.HandoffArrivalDivider = handoffArrivalDivider.HandoffArrivalDivider;
144
+ exports.HandoffArrivalScope = handoffArrivalDivider.HandoffArrivalScope;
145
+ exports.AnswerLabel = answerLabel.AnswerLabel;
146
+ exports.AnswerLabelScope = answerLabel.AnswerLabelScope;
131
147
  exports.VoiceDelegationCard = voiceDelegationCard.VoiceDelegationCard;
132
148
  exports.VoiceDelegationMessage = voiceDelegationCard.VoiceDelegationMessage;
149
+ exports.FromTheCallAfterMessage = fromTheCallCard.FromTheCallAfterMessage;
150
+ exports.FromTheCallCard = fromTheCallCard.FromTheCallCard;
133
151
  exports.ContinuePill = continuePill.ContinuePill;
134
152
  exports.StatewireContinueRunAffordance = statewireContinueRun.StatewireContinueRunAffordance;
135
153
  exports.StatewireContinueRunButton = statewireContinueRun.StatewireContinueRunButton;
136
154
  exports.StatewireRunEndedFooter = statewireContinueRun.StatewireRunEndedFooter;
137
155
  exports.StatewireApprovalCard = StatewireApprovalCard.StatewireApprovalCard;
156
+ exports.useAthenaBrowserDecisionConfirmer = browserDecisionCheck.useAthenaBrowserDecisionConfirmer;
157
+ exports.useBrowserDecisionConfirmer = browserDecisionCheck.useBrowserDecisionConfirmer;
138
158
  exports.useStatewireApprovalRequest = useStatewireApprovalRequest.useStatewireApprovalRequest;
139
159
  exports.StatewireQueuedMessages = StatewireQueuedMessages.StatewireQueuedMessages;
160
+ exports.DrivingOnChip = DrivingOnChip.DrivingOnChip;
140
161
  exports.WaitingOnYouBanner = WaitingOnYouBanner.WaitingOnYouBanner;
141
162
  exports.WaitingOnYouBannerView = WaitingOnYouBanner.WaitingOnYouBannerView;
142
163
  exports.HITL_PENDING_RESUME_GRACE_MS = interrupts.HITL_PENDING_RESUME_GRACE_MS;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -36,6 +36,8 @@ export { assetTypeToIcon, assetTypeToThumb, configureAssetIconBasePath, } from "
36
36
  export { MentionMenuSection, type MentionTool, type MenuItem, type MenuScope, type WebpageMention, type WebpageMentionScope, } from "./mentions/suggestions/data/types";
37
37
  export { createOlympusAssetUrl } from "./lib/asset-urls";
38
38
  export { COMPOSER_DOCK_CLASS, COMPOSER_EDITOR_ROW_CLASS, COMPOSER_PAPER_DOCK_CLASS, COMPOSER_PAPER_EDITOR_ROW_CLASS, COMPOSER_PAPER_SURFACE_CLASS, COMPOSER_PAPER_TOOLBAR_CLASS, COMPOSER_SURFACE_CLASS, COMPOSER_TOOLBAR_CLASS, BranchPicker, ComposerSendButton, ComposerStopButton, type ComposerSendButtonProps, type ComposerStopButtonProps, MarkdownText, THREAD_SCROLL_TO_BOTTOM_CLASS, UserMessage, UserMessageText, createAssistantMessage, type CreateAssistantMessageOptions, } from "./messages/message-components";
39
+ export { MessageImageGallery, MessageImagePart } from "./messages/message-images";
40
+ export { MESSAGE_ARRIVAL_ANIMATION_CLASS, useMessageArrivalAnimation, } from "./messages/arrival-animation";
39
41
  export { IconButton, SmallIconButton, THREAD_HEADER_ACTIONS_CLASS, THREAD_HEADER_CLASS, THREAD_HEADER_ICON_CLASS, THREAD_HEADER_PILL_CLASS, THREAD_PANEL_CLASS, } from "./messages/thread-chrome";
40
42
  export { UserEditComposer } from "./messages/user-edit-composer";
41
43
  export { MessageActionsReadOnlyProvider, useMessageActionsReadOnly, } from "./messages/message-actions-config";
@@ -43,11 +45,16 @@ export { TextShimmerLoader, ThreadRunningIndicator, } from "./messages/running-i
43
45
  export { SignInCard, SignInConsent, SignInFallbackSection, SignInSecondaryButton, SignInSelect, SignInTextField, } from "./auth/sign-in-card";
44
46
  export { RuntimeMessageCard, type RuntimeMessageCardProps } from "./messages/runtime-message";
45
47
  export { WakeMarkerCard, type WakeMarkerCardProps, WakeMarkerMessage, } from "./messages/wake-marker";
48
+ export { HandoffArrivalAfterMessage, HandoffArrivalDivider, type HandoffArrivalDividerProps, HandoffArrivalScope, } from "./messages/handoff-arrival-divider";
49
+ export { AnswerLabel, type AnswerLabelProps, AnswerLabelScope, type AnswerLabelScopeProps, } from "./messages/answer-label";
46
50
  export { VoiceDelegationCard, type VoiceDelegationCardProps, VoiceDelegationMessage, } from "./messages/voice-delegation-card";
51
+ export { FromTheCallAfterMessage, FromTheCallCard, type FromTheCallCardProps, } from "./messages/from-the-call-card";
47
52
  export { ContinuePill } from "./messages/continue-pill";
48
53
  export { type ReadStatewireTailEnding, StatewireContinueRunAffordance, StatewireContinueRunButton, type StatewireContinueRunButtonProps, StatewireRunEndedFooter, type StatewireRunEndedFooterActionsContext, type StatewireRunEndedFooterProps, type StatewireTailEnding, } from "./messages/statewire-continue-run";
49
- export { StatewireApprovalCard, type StatewireApprovalCardProps, type StatewireApprovalEditorContext, type StatewireApprovalRequestContext, } from "../chat/StatewireApprovalCard";
54
+ export { StatewireApprovalCard, type StatewireApprovalCardProps, type StatewireApprovalEditorContext, type StatewireApprovalRequestContext, type StatewireDecisionAnswer, type StatewireDecisionConfirmer, } from "../chat/StatewireApprovalCard";
55
+ export { type AthenaBrowserDecisionConfirmerOptions, type BrowserDecisionConfirmerOptions, type PendingBrowserDecisionConfirm, useAthenaBrowserDecisionConfirmer, useBrowserDecisionConfirmer, } from "../chat/browser-decision-check";
50
56
  export { type StatewireApprovalRequest, type StatewireInterruptPredicate, type UseStatewireApprovalRequestOptions, useStatewireApprovalRequest, } from "../chat/use-statewire-approval-request";
51
57
  export { StatewireQueuedMessages, type StatewireQueueEditorContext, type StatewireQueueEvent, type StatewireQueueRowContentContext, type StatewireQueueRowMarkerContext, type StatewireQueuedMessagesProps, } from "../chat/StatewireQueuedMessages";
58
+ export { DrivingOnChip, type DrivingOnChipProps } from "../chat/DrivingOnChip";
52
59
  export { WaitingOnYouBanner, type WaitingOnYouBannerProps, WaitingOnYouBannerView, type WaitingOnYouBannerViewProps, } from "../chat/WaitingOnYouBanner";
53
60
  export { HITL_PENDING_RESUME_GRACE_MS } from "../agent-runtime/src/index";
@@ -24,6 +24,8 @@ import { assetTypeToIcon, assetTypeToThumb, configureAssetIconBasePath } from ".
24
24
  import { MentionMenuSection } from "./mentions/suggestions/data/types.js";
25
25
  import { createOlympusAssetUrl } from "./lib/asset-urls.js";
26
26
  import { BranchPicker, COMPOSER_DOCK_CLASS, COMPOSER_EDITOR_ROW_CLASS, COMPOSER_PAPER_DOCK_CLASS, COMPOSER_PAPER_EDITOR_ROW_CLASS, COMPOSER_PAPER_SURFACE_CLASS, COMPOSER_PAPER_TOOLBAR_CLASS, COMPOSER_SURFACE_CLASS, COMPOSER_TOOLBAR_CLASS, ComposerSendButton, ComposerStopButton, MarkdownText, THREAD_SCROLL_TO_BOTTOM_CLASS, UserMessage, UserMessageText, createAssistantMessage } from "./messages/message-components.js";
27
+ import { MessageImageGallery, MessageImagePart } from "./messages/message-images.js";
28
+ import { MESSAGE_ARRIVAL_ANIMATION_CLASS, useMessageArrivalAnimation } from "./messages/arrival-animation.js";
27
29
  import { IconButton, SmallIconButton, THREAD_HEADER_ACTIONS_CLASS, THREAD_HEADER_CLASS, THREAD_HEADER_ICON_CLASS, THREAD_HEADER_PILL_CLASS, THREAD_PANEL_CLASS } from "./messages/thread-chrome.js";
28
30
  import { UserEditComposer } from "./messages/user-edit-composer.js";
29
31
  import { MessageActionsReadOnlyProvider, useMessageActionsReadOnly } from "./messages/message-actions-config.js";
@@ -31,15 +33,22 @@ import { TextShimmerLoader, ThreadRunningIndicator } from "./messages/running-in
31
33
  import { SignInCard, SignInConsent, SignInFallbackSection, SignInSecondaryButton, SignInSelect, SignInTextField } from "./auth/sign-in-card.js";
32
34
  import { RuntimeMessageCard } from "./messages/runtime-message.js";
33
35
  import { WakeMarkerCard, WakeMarkerMessage } from "./messages/wake-marker.js";
36
+ import { HandoffArrivalAfterMessage, HandoffArrivalDivider, HandoffArrivalScope } from "./messages/handoff-arrival-divider.js";
37
+ import { AnswerLabel, AnswerLabelScope } from "./messages/answer-label.js";
34
38
  import { VoiceDelegationCard, VoiceDelegationMessage } from "./messages/voice-delegation-card.js";
39
+ import { FromTheCallAfterMessage, FromTheCallCard } from "./messages/from-the-call-card.js";
35
40
  import { ContinuePill } from "./messages/continue-pill.js";
36
41
  import { StatewireContinueRunAffordance, StatewireContinueRunButton, StatewireRunEndedFooter } from "./messages/statewire-continue-run.js";
37
42
  import { StatewireApprovalCard } from "../chat/StatewireApprovalCard.js";
43
+ import { useAthenaBrowserDecisionConfirmer, useBrowserDecisionConfirmer } from "../chat/browser-decision-check.js";
38
44
  import { useStatewireApprovalRequest } from "../chat/use-statewire-approval-request.js";
39
45
  import { StatewireQueuedMessages } from "../chat/StatewireQueuedMessages.js";
46
+ import { DrivingOnChip } from "../chat/DrivingOnChip.js";
40
47
  import { WaitingOnYouBanner, WaitingOnYouBannerView } from "../chat/WaitingOnYouBanner.js";
41
48
  import { HITL_PENDING_RESUME_GRACE_MS } from "../agent-runtime/src/interrupts.js";
42
49
  export {
50
+ AnswerLabel,
51
+ AnswerLabelScope,
43
52
  AthenaGraphQLError,
44
53
  BranchPicker,
45
54
  COMPOSER_DOCK_CLASS,
@@ -61,10 +70,17 @@ export {
61
70
  ComposerStopButton,
62
71
  ContinuePill,
63
72
  ConversationHistoryPanel,
73
+ DrivingOnChip,
74
+ FromTheCallAfterMessage,
75
+ FromTheCallCard,
64
76
  HISTORY_EDGE_NEAR_MARGIN_PX,
65
77
  HITL_PENDING_RESUME_GRACE_MS,
78
+ HandoffArrivalAfterMessage,
79
+ HandoffArrivalDivider,
80
+ HandoffArrivalScope,
66
81
  HistoryEdgeRow,
67
82
  IconButton,
83
+ MESSAGE_ARRIVAL_ANIMATION_CLASS,
68
84
  MarkdownText,
69
85
  MentionAuthCtx,
70
86
  MentionChip,
@@ -77,6 +93,8 @@ export {
77
93
  MentionSuggestionsExtension,
78
94
  MenuList,
79
95
  MessageActionsReadOnlyProvider,
96
+ MessageImageGallery,
97
+ MessageImagePart,
80
98
  PendingAttachmentUploads,
81
99
  ROOT_MENTION_CATEGORIES,
82
100
  RuntimeMessageCard,
@@ -133,9 +151,12 @@ export {
133
151
  resolveComposerAction,
134
152
  serializeDraft,
135
153
  serializeMention,
154
+ useAthenaBrowserDecisionConfirmer,
155
+ useBrowserDecisionConfirmer,
136
156
  useMentionAuth,
137
157
  useMentionSuggestions,
138
158
  useMessageActionsReadOnly,
159
+ useMessageArrivalAnimation,
139
160
  useStatewireApprovalRequest,
140
161
  useStatewireToolOutputs,
141
162
  webpageMentionFingerprint
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}