@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":"ComposerAttachmentPreview.cjs","sources":["../../src/composer/ComposerAttachmentPreview.tsx"],"sourcesContent":["import { Loader2Icon, PaperclipIcon, XIcon } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useAttachments } from './AttachmentContext';\nimport { cn } from '../lib/utils';\n\nexport interface ComposerAttachmentPreviewProps {\n className?: string;\n}\n\n/**\n * Renders uploaded file pills above the composer.\n * Each pill shows the file name and a dismiss button.\n */\nexport const ComposerAttachmentPreview: FC<ComposerAttachmentPreviewProps> = ({ className }) => {\n const { attachments, isUploading, removeAttachment } = useAttachments();\n\n if (attachments.length === 0 && !isUploading) return null;\n\n return (\n <div className={cn('aui-attachment-preview mx-3 mt-2 flex flex-wrap gap-1.5', className)}>\n {attachments.map((asset) => (\n <div\n key={asset.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs\"\n >\n <PaperclipIcon className=\"size-3 shrink-0 text-muted-foreground/60\" />\n <span className=\"max-w-[180px] truncate text-foreground/80\">{asset.title}</span>\n <button\n type=\"button\"\n onClick={() => removeAttachment(asset.id)}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground transition-colors\"\n aria-label={`Remove ${asset.title}`}\n >\n <XIcon className=\"size-3\" />\n </button>\n </div>\n ))}\n {isUploading ? (\n <div className=\"flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs text-muted-foreground\">\n <Loader2Icon className=\"size-3 shrink-0 animate-spin\" />\n <span>Uploading...</span>\n </div>\n ) : null}\n </div>\n );\n};\n"],"names":["useAttachments","cn","jsxs","jsx","PaperclipIcon","XIcon","Loader2Icon"],"mappings":";;;;;;AAaO,MAAM,4BAAgE,CAAC,EAAE,gBAAgB;AAC9F,QAAM,EAAE,aAAa,aAAa,iBAAA,IAAqBA,kBAAAA,eAAA;AAEvD,MAAI,YAAY,WAAW,KAAK,CAAC,YAAa,QAAO;AAErD,yCACG,OAAA,EAAI,WAAWC,OAAAA,GAAG,2DAA2D,SAAS,GACpF,UAAA;AAAA,IAAA,YAAY,IAAI,CAAC,UAChBC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAEV,UAAA;AAAA,UAAAC,2BAAAA,IAACC,YAAAA,eAAA,EAAc,WAAU,2CAAA,CAA2C;AAAA,UACpED,2BAAAA,IAAC,QAAA,EAAK,WAAU,6CAA6C,gBAAM,OAAM;AAAA,UACzEA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,iBAAiB,MAAM,EAAE;AAAA,cACxC,WAAU;AAAA,cACV,cAAY,UAAU,MAAM,KAAK;AAAA,cAEjC,UAAAA,2BAAAA,IAACE,YAAAA,OAAA,EAAM,WAAU,SAAA,CAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAC5B;AAAA,MAAA;AAAA,MAZK,MAAM;AAAA,IAAA,CAcd;AAAA,IACA,cACCH,2BAAAA,KAAC,OAAA,EAAI,WAAU,wHACb,UAAA;AAAA,MAAAC,2BAAAA,IAACG,YAAAA,aAAA,EAAY,WAAU,+BAAA,CAA+B;AAAA,MACtDH,2BAAAA,IAAC,UAAK,UAAA,eAAA,CAAY;AAAA,IAAA,EAAA,CACpB,IACE;AAAA,EAAA,GACN;AAEJ;;"}
1
+ {"version":3,"file":"ComposerAttachmentPreview.cjs","sources":["../../src/composer/ComposerAttachmentPreview.tsx"],"sourcesContent":["import { Loader2Icon, PaperclipIcon, XIcon } from 'lucide-react';\nimport { type FC, useMemo, useState } from 'react';\nimport { ImageViewer, type ImageViewerImage } from '../ui/image-viewer';\nimport { useAttachments } from './AttachmentContext';\nimport type { UploadedAsset } from './useFileUpload';\nimport { cn } from '../lib/utils';\n\nexport interface ComposerAttachmentPreviewProps {\n className?: string;\n}\n\n/** A staged picture: the attachment, with the local preview it shows. */\ntype PictureAttachment = UploadedAsset & { previewUrl: string };\n\nconst isPicture = (asset: UploadedAsset): asset is PictureAttachment => Boolean(asset.previewUrl);\n\nconst REMOVE_BUTTON_CLASS =\n 'shrink-0 rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground transition-colors';\n\n/**\n * Renders the draft's attachments above the composer. A picture shows as a\n * thumbnail that opens full screen, as Devin's composer does (← → page through\n * the draft's pictures, Esc closes); any other file shows as a pill with its\n * name. Each has a dismiss button.\n */\nexport const ComposerAttachmentPreview: FC<ComposerAttachmentPreviewProps> = ({ className }) => {\n const { attachments, isUploading, removeAttachment } = useAttachments();\n const pictures = useMemo(() => attachments.filter(isPicture), [attachments]);\n const images = useMemo<ImageViewerImage[]>(\n () => pictures.map((picture) => ({ src: picture.previewUrl, name: picture.title })),\n [pictures],\n );\n // The picture open in the viewer, by attachment id: removing another one\n // never moves the viewer to a different picture.\n const [viewingId, setViewingId] = useState<string | null>(null);\n const viewingIndex = pictures.findIndex((picture) => picture.id === viewingId);\n\n if (attachments.length === 0 && !isUploading) return null;\n\n return (\n <div className={cn('aui-attachment-preview mx-3 mt-2 flex flex-wrap items-end gap-1.5', className)}>\n {attachments.map((asset) =>\n isPicture(asset) ? (\n <div\n key={asset.id}\n className=\"group relative h-14 w-[72px] shrink-0 overflow-hidden rounded-lg border border-border/60 bg-muted/40\"\n data-slot=\"attachment-picture\"\n >\n <button\n type=\"button\"\n onClick={() => setViewingId(asset.id)}\n className=\"block size-full cursor-zoom-in focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n aria-label={`View ${asset.title}`}\n title={asset.title}\n >\n <img src={asset.previewUrl} alt={asset.title} draggable={false} className=\"size-full object-cover\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeAttachment(asset.id)}\n className=\"absolute right-0.5 top-0.5 inline-flex size-5 items-center justify-center rounded-full bg-black/65 text-white opacity-80 transition-opacity hover:bg-black/80 hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white\"\n aria-label={`Remove ${asset.title}`}\n title=\"Remove\"\n >\n <XIcon className=\"size-3\" />\n </button>\n </div>\n ) : (\n <div\n key={asset.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs\"\n >\n <PaperclipIcon className=\"size-3 shrink-0 text-muted-foreground/60\" />\n <span className=\"max-w-[180px] truncate text-foreground/80\">{asset.title}</span>\n <button\n type=\"button\"\n onClick={() => removeAttachment(asset.id)}\n className={REMOVE_BUTTON_CLASS}\n aria-label={`Remove ${asset.title}`}\n >\n <XIcon className=\"size-3\" />\n </button>\n </div>\n ),\n )}\n {isUploading ? (\n <div className=\"flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs text-muted-foreground\">\n <Loader2Icon className=\"size-3 shrink-0 animate-spin\" />\n <span>Uploading...</span>\n </div>\n ) : null}\n <ImageViewer\n images={images}\n index={viewingIndex === -1 ? null : viewingIndex}\n onIndexChange={(index) => setViewingId(index === null ? null : (pictures[index]?.id ?? null))}\n />\n </div>\n );\n};\n"],"names":["useAttachments","useMemo","useState","cn","jsxs","jsx","XIcon","PaperclipIcon","Loader2Icon","ImageViewer"],"mappings":";;;;;;;;AAcA,MAAM,YAAY,CAAC,UAAqD,QAAQ,MAAM,UAAU;AAEhG,MAAM,sBACJ;AAQK,MAAM,4BAAgE,CAAC,EAAE,gBAAgB;AAC9F,QAAM,EAAE,aAAa,aAAa,iBAAA,IAAqBA,kBAAAA,eAAA;AACvD,QAAM,WAAWC,WAAAA,QAAQ,MAAM,YAAY,OAAO,SAAS,GAAG,CAAC,WAAW,CAAC;AAC3E,QAAM,SAASA,WAAAA;AAAAA,IACb,MAAM,SAAS,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,YAAY,MAAM,QAAQ,MAAA,EAAQ;AAAA,IAClF,CAAC,QAAQ;AAAA,EAAA;AAIX,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAAA,SAAwB,IAAI;AAC9D,QAAM,eAAe,SAAS,UAAU,CAAC,YAAY,QAAQ,OAAO,SAAS;AAE7E,MAAI,YAAY,WAAW,KAAK,CAAC,YAAa,QAAO;AAErD,yCACG,OAAA,EAAI,WAAWC,OAAAA,GAAG,qEAAqE,SAAS,GAC9F,UAAA;AAAA,IAAA,YAAY;AAAA,MAAI,CAAC,UAChB,UAAU,KAAK,IACbC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UACV,aAAU;AAAA,UAEV,UAAA;AAAA,YAAAC,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,aAAa,MAAM,EAAE;AAAA,gBACpC,WAAU;AAAA,gBACV,cAAY,QAAQ,MAAM,KAAK;AAAA,gBAC/B,OAAO,MAAM;AAAA,gBAEb,UAAAA,2BAAAA,IAAC,OAAA,EAAI,KAAK,MAAM,YAAY,KAAK,MAAM,OAAO,WAAW,OAAO,WAAU,yBAAA,CAAyB;AAAA,cAAA;AAAA,YAAA;AAAA,YAErGA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,iBAAiB,MAAM,EAAE;AAAA,gBACxC,WAAU;AAAA,gBACV,cAAY,UAAU,MAAM,KAAK;AAAA,gBACjC,OAAM;AAAA,gBAEN,UAAAA,2BAAAA,IAACC,YAAAA,OAAA,EAAM,WAAU,SAAA,CAAS;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5B;AAAA,QAAA;AAAA,QArBK,MAAM;AAAA,MAAA,IAwBbF,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAEV,UAAA;AAAA,YAAAC,2BAAAA,IAACE,YAAAA,eAAA,EAAc,WAAU,2CAAA,CAA2C;AAAA,YACpEF,2BAAAA,IAAC,QAAA,EAAK,WAAU,6CAA6C,gBAAM,OAAM;AAAA,YACzEA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,iBAAiB,MAAM,EAAE;AAAA,gBACxC,WAAW;AAAA,gBACX,cAAY,UAAU,MAAM,KAAK;AAAA,gBAEjC,UAAAA,2BAAAA,IAACC,YAAAA,OAAA,EAAM,WAAU,SAAA,CAAS;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5B;AAAA,QAAA;AAAA,QAZK,MAAM;AAAA,MAAA;AAAA,IAab;AAAA,IAGH,cACCF,2BAAAA,KAAC,OAAA,EAAI,WAAU,wHACb,UAAA;AAAA,MAAAC,2BAAAA,IAACG,YAAAA,aAAA,EAAY,WAAU,+BAAA,CAA+B;AAAA,MACtDH,2BAAAA,IAAC,UAAK,UAAA,eAAA,CAAY;AAAA,IAAA,EAAA,CACpB,IACE;AAAA,IACJA,2BAAAA;AAAAA,MAACI,YAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA,OAAO,iBAAiB,KAAK,OAAO;AAAA,QACpC,eAAe,CAAC;;AAAU,8BAAa,UAAU,OAAO,SAAQ,cAAS,KAAK,MAAd,mBAAiB,OAAM,IAAK;AAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAC9F,GACF;AAEJ;;"}
@@ -1,9 +1,11 @@
1
- import type { FC } from 'react';
1
+ import { type FC } from 'react';
2
2
  export interface ComposerAttachmentPreviewProps {
3
3
  className?: string;
4
4
  }
5
5
  /**
6
- * Renders uploaded file pills above the composer.
7
- * Each pill shows the file name and a dismiss button.
6
+ * Renders the draft's attachments above the composer. A picture shows as a
7
+ * thumbnail that opens full screen, as Devin's composer does (← → page through
8
+ * the draft's pictures, Esc closes); any other file shows as a pill with its
9
+ * name. Each has a dismiss button.
8
10
  */
9
11
  export declare const ComposerAttachmentPreview: FC<ComposerAttachmentPreviewProps>;
@@ -1,36 +1,91 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
- import { PaperclipIcon, XIcon, Loader2Icon } from "lucide-react";
2
+ import { XIcon, PaperclipIcon, Loader2Icon } from "lucide-react";
3
+ import { useMemo, useState } from "react";
4
+ import { ImageViewer } from "../ui/image-viewer.js";
3
5
  import { useAttachments } from "./AttachmentContext.js";
4
6
  import { cn } from "cnfast";
7
+ const isPicture = (asset) => Boolean(asset.previewUrl);
8
+ const REMOVE_BUTTON_CLASS = "shrink-0 rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground transition-colors";
5
9
  const ComposerAttachmentPreview = ({ className }) => {
6
10
  const { attachments, isUploading, removeAttachment } = useAttachments();
11
+ const pictures = useMemo(() => attachments.filter(isPicture), [attachments]);
12
+ const images = useMemo(
13
+ () => pictures.map((picture) => ({ src: picture.previewUrl, name: picture.title })),
14
+ [pictures]
15
+ );
16
+ const [viewingId, setViewingId] = useState(null);
17
+ const viewingIndex = pictures.findIndex((picture) => picture.id === viewingId);
7
18
  if (attachments.length === 0 && !isUploading) return null;
8
- return /* @__PURE__ */ jsxs("div", { className: cn("aui-attachment-preview mx-3 mt-2 flex flex-wrap gap-1.5", className), children: [
9
- attachments.map((asset) => /* @__PURE__ */ jsxs(
10
- "div",
11
- {
12
- className: "flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs",
13
- children: [
14
- /* @__PURE__ */ jsx(PaperclipIcon, { className: "size-3 shrink-0 text-muted-foreground/60" }),
15
- /* @__PURE__ */ jsx("span", { className: "max-w-[180px] truncate text-foreground/80", children: asset.title }),
16
- /* @__PURE__ */ jsx(
17
- "button",
18
- {
19
- type: "button",
20
- onClick: () => removeAttachment(asset.id),
21
- className: "shrink-0 rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground transition-colors",
22
- "aria-label": `Remove ${asset.title}`,
23
- children: /* @__PURE__ */ jsx(XIcon, { className: "size-3" })
24
- }
25
- )
26
- ]
27
- },
28
- asset.id
29
- )),
19
+ return /* @__PURE__ */ jsxs("div", { className: cn("aui-attachment-preview mx-3 mt-2 flex flex-wrap items-end gap-1.5", className), children: [
20
+ attachments.map(
21
+ (asset) => isPicture(asset) ? /* @__PURE__ */ jsxs(
22
+ "div",
23
+ {
24
+ className: "group relative h-14 w-[72px] shrink-0 overflow-hidden rounded-lg border border-border/60 bg-muted/40",
25
+ "data-slot": "attachment-picture",
26
+ children: [
27
+ /* @__PURE__ */ jsx(
28
+ "button",
29
+ {
30
+ type: "button",
31
+ onClick: () => setViewingId(asset.id),
32
+ className: "block size-full cursor-zoom-in focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring",
33
+ "aria-label": `View ${asset.title}`,
34
+ title: asset.title,
35
+ children: /* @__PURE__ */ jsx("img", { src: asset.previewUrl, alt: asset.title, draggable: false, className: "size-full object-cover" })
36
+ }
37
+ ),
38
+ /* @__PURE__ */ jsx(
39
+ "button",
40
+ {
41
+ type: "button",
42
+ onClick: () => removeAttachment(asset.id),
43
+ className: "absolute right-0.5 top-0.5 inline-flex size-5 items-center justify-center rounded-full bg-black/65 text-white opacity-80 transition-opacity hover:bg-black/80 hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white",
44
+ "aria-label": `Remove ${asset.title}`,
45
+ title: "Remove",
46
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-3" })
47
+ }
48
+ )
49
+ ]
50
+ },
51
+ asset.id
52
+ ) : /* @__PURE__ */ jsxs(
53
+ "div",
54
+ {
55
+ className: "flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs",
56
+ children: [
57
+ /* @__PURE__ */ jsx(PaperclipIcon, { className: "size-3 shrink-0 text-muted-foreground/60" }),
58
+ /* @__PURE__ */ jsx("span", { className: "max-w-[180px] truncate text-foreground/80", children: asset.title }),
59
+ /* @__PURE__ */ jsx(
60
+ "button",
61
+ {
62
+ type: "button",
63
+ onClick: () => removeAttachment(asset.id),
64
+ className: REMOVE_BUTTON_CLASS,
65
+ "aria-label": `Remove ${asset.title}`,
66
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-3" })
67
+ }
68
+ )
69
+ ]
70
+ },
71
+ asset.id
72
+ )
73
+ ),
30
74
  isUploading ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs text-muted-foreground", children: [
31
75
  /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3 shrink-0 animate-spin" }),
32
76
  /* @__PURE__ */ jsx("span", { children: "Uploading..." })
33
- ] }) : null
77
+ ] }) : null,
78
+ /* @__PURE__ */ jsx(
79
+ ImageViewer,
80
+ {
81
+ images,
82
+ index: viewingIndex === -1 ? null : viewingIndex,
83
+ onIndexChange: (index) => {
84
+ var _a;
85
+ return setViewingId(index === null ? null : ((_a = pictures[index]) == null ? void 0 : _a.id) ?? null);
86
+ }
87
+ }
88
+ )
34
89
  ] });
35
90
  };
36
91
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerAttachmentPreview.js","sources":["../../src/composer/ComposerAttachmentPreview.tsx"],"sourcesContent":["import { Loader2Icon, PaperclipIcon, XIcon } from 'lucide-react';\nimport type { FC } from 'react';\nimport { useAttachments } from './AttachmentContext';\nimport { cn } from '../lib/utils';\n\nexport interface ComposerAttachmentPreviewProps {\n className?: string;\n}\n\n/**\n * Renders uploaded file pills above the composer.\n * Each pill shows the file name and a dismiss button.\n */\nexport const ComposerAttachmentPreview: FC<ComposerAttachmentPreviewProps> = ({ className }) => {\n const { attachments, isUploading, removeAttachment } = useAttachments();\n\n if (attachments.length === 0 && !isUploading) return null;\n\n return (\n <div className={cn('aui-attachment-preview mx-3 mt-2 flex flex-wrap gap-1.5', className)}>\n {attachments.map((asset) => (\n <div\n key={asset.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs\"\n >\n <PaperclipIcon className=\"size-3 shrink-0 text-muted-foreground/60\" />\n <span className=\"max-w-[180px] truncate text-foreground/80\">{asset.title}</span>\n <button\n type=\"button\"\n onClick={() => removeAttachment(asset.id)}\n className=\"shrink-0 rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground transition-colors\"\n aria-label={`Remove ${asset.title}`}\n >\n <XIcon className=\"size-3\" />\n </button>\n </div>\n ))}\n {isUploading ? (\n <div className=\"flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs text-muted-foreground\">\n <Loader2Icon className=\"size-3 shrink-0 animate-spin\" />\n <span>Uploading...</span>\n </div>\n ) : null}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;AAaO,MAAM,4BAAgE,CAAC,EAAE,gBAAgB;AAC9F,QAAM,EAAE,aAAa,aAAa,iBAAA,IAAqB,eAAA;AAEvD,MAAI,YAAY,WAAW,KAAK,CAAC,YAAa,QAAO;AAErD,8BACG,OAAA,EAAI,WAAW,GAAG,2DAA2D,SAAS,GACpF,UAAA;AAAA,IAAA,YAAY,IAAI,CAAC,UAChB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,oBAAC,eAAA,EAAc,WAAU,2CAAA,CAA2C;AAAA,UACpE,oBAAC,QAAA,EAAK,WAAU,6CAA6C,gBAAM,OAAM;AAAA,UACzE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,iBAAiB,MAAM,EAAE;AAAA,cACxC,WAAU;AAAA,cACV,cAAY,UAAU,MAAM,KAAK;AAAA,cAEjC,UAAA,oBAAC,OAAA,EAAM,WAAU,SAAA,CAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QAC5B;AAAA,MAAA;AAAA,MAZK,MAAM;AAAA,IAAA,CAcd;AAAA,IACA,cACC,qBAAC,OAAA,EAAI,WAAU,wHACb,UAAA;AAAA,MAAA,oBAAC,aAAA,EAAY,WAAU,+BAAA,CAA+B;AAAA,MACtD,oBAAC,UAAK,UAAA,eAAA,CAAY;AAAA,IAAA,EAAA,CACpB,IACE;AAAA,EAAA,GACN;AAEJ;"}
1
+ {"version":3,"file":"ComposerAttachmentPreview.js","sources":["../../src/composer/ComposerAttachmentPreview.tsx"],"sourcesContent":["import { Loader2Icon, PaperclipIcon, XIcon } from 'lucide-react';\nimport { type FC, useMemo, useState } from 'react';\nimport { ImageViewer, type ImageViewerImage } from '../ui/image-viewer';\nimport { useAttachments } from './AttachmentContext';\nimport type { UploadedAsset } from './useFileUpload';\nimport { cn } from '../lib/utils';\n\nexport interface ComposerAttachmentPreviewProps {\n className?: string;\n}\n\n/** A staged picture: the attachment, with the local preview it shows. */\ntype PictureAttachment = UploadedAsset & { previewUrl: string };\n\nconst isPicture = (asset: UploadedAsset): asset is PictureAttachment => Boolean(asset.previewUrl);\n\nconst REMOVE_BUTTON_CLASS =\n 'shrink-0 rounded p-0.5 text-muted-foreground hover:bg-muted hover:text-foreground transition-colors';\n\n/**\n * Renders the draft's attachments above the composer. A picture shows as a\n * thumbnail that opens full screen, as Devin's composer does (← → page through\n * the draft's pictures, Esc closes); any other file shows as a pill with its\n * name. Each has a dismiss button.\n */\nexport const ComposerAttachmentPreview: FC<ComposerAttachmentPreviewProps> = ({ className }) => {\n const { attachments, isUploading, removeAttachment } = useAttachments();\n const pictures = useMemo(() => attachments.filter(isPicture), [attachments]);\n const images = useMemo<ImageViewerImage[]>(\n () => pictures.map((picture) => ({ src: picture.previewUrl, name: picture.title })),\n [pictures],\n );\n // The picture open in the viewer, by attachment id: removing another one\n // never moves the viewer to a different picture.\n const [viewingId, setViewingId] = useState<string | null>(null);\n const viewingIndex = pictures.findIndex((picture) => picture.id === viewingId);\n\n if (attachments.length === 0 && !isUploading) return null;\n\n return (\n <div className={cn('aui-attachment-preview mx-3 mt-2 flex flex-wrap items-end gap-1.5', className)}>\n {attachments.map((asset) =>\n isPicture(asset) ? (\n <div\n key={asset.id}\n className=\"group relative h-14 w-[72px] shrink-0 overflow-hidden rounded-lg border border-border/60 bg-muted/40\"\n data-slot=\"attachment-picture\"\n >\n <button\n type=\"button\"\n onClick={() => setViewingId(asset.id)}\n className=\"block size-full cursor-zoom-in focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n aria-label={`View ${asset.title}`}\n title={asset.title}\n >\n <img src={asset.previewUrl} alt={asset.title} draggable={false} className=\"size-full object-cover\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeAttachment(asset.id)}\n className=\"absolute right-0.5 top-0.5 inline-flex size-5 items-center justify-center rounded-full bg-black/65 text-white opacity-80 transition-opacity hover:bg-black/80 hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white\"\n aria-label={`Remove ${asset.title}`}\n title=\"Remove\"\n >\n <XIcon className=\"size-3\" />\n </button>\n </div>\n ) : (\n <div\n key={asset.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs\"\n >\n <PaperclipIcon className=\"size-3 shrink-0 text-muted-foreground/60\" />\n <span className=\"max-w-[180px] truncate text-foreground/80\">{asset.title}</span>\n <button\n type=\"button\"\n onClick={() => removeAttachment(asset.id)}\n className={REMOVE_BUTTON_CLASS}\n aria-label={`Remove ${asset.title}`}\n >\n <XIcon className=\"size-3\" />\n </button>\n </div>\n ),\n )}\n {isUploading ? (\n <div className=\"flex items-center gap-1.5 rounded-lg border border-border/60 bg-muted/40 px-2.5 py-1.5 text-xs text-muted-foreground\">\n <Loader2Icon className=\"size-3 shrink-0 animate-spin\" />\n <span>Uploading...</span>\n </div>\n ) : null}\n <ImageViewer\n images={images}\n index={viewingIndex === -1 ? null : viewingIndex}\n onIndexChange={(index) => setViewingId(index === null ? null : (pictures[index]?.id ?? null))}\n />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;AAcA,MAAM,YAAY,CAAC,UAAqD,QAAQ,MAAM,UAAU;AAEhG,MAAM,sBACJ;AAQK,MAAM,4BAAgE,CAAC,EAAE,gBAAgB;AAC9F,QAAM,EAAE,aAAa,aAAa,iBAAA,IAAqB,eAAA;AACvD,QAAM,WAAW,QAAQ,MAAM,YAAY,OAAO,SAAS,GAAG,CAAC,WAAW,CAAC;AAC3E,QAAM,SAAS;AAAA,IACb,MAAM,SAAS,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,YAAY,MAAM,QAAQ,MAAA,EAAQ;AAAA,IAClF,CAAC,QAAQ;AAAA,EAAA;AAIX,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAC9D,QAAM,eAAe,SAAS,UAAU,CAAC,YAAY,QAAQ,OAAO,SAAS;AAE7E,MAAI,YAAY,WAAW,KAAK,CAAC,YAAa,QAAO;AAErD,8BACG,OAAA,EAAI,WAAW,GAAG,qEAAqE,SAAS,GAC9F,UAAA;AAAA,IAAA,YAAY;AAAA,MAAI,CAAC,UAChB,UAAU,KAAK,IACb;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UACV,aAAU;AAAA,UAEV,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,aAAa,MAAM,EAAE;AAAA,gBACpC,WAAU;AAAA,gBACV,cAAY,QAAQ,MAAM,KAAK;AAAA,gBAC/B,OAAO,MAAM;AAAA,gBAEb,UAAA,oBAAC,OAAA,EAAI,KAAK,MAAM,YAAY,KAAK,MAAM,OAAO,WAAW,OAAO,WAAU,yBAAA,CAAyB;AAAA,cAAA;AAAA,YAAA;AAAA,YAErG;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,iBAAiB,MAAM,EAAE;AAAA,gBACxC,WAAU;AAAA,gBACV,cAAY,UAAU,MAAM,KAAK;AAAA,gBACjC,OAAM;AAAA,gBAEN,UAAA,oBAAC,OAAA,EAAM,WAAU,SAAA,CAAS;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5B;AAAA,QAAA;AAAA,QArBK,MAAM;AAAA,MAAA,IAwBb;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,oBAAC,eAAA,EAAc,WAAU,2CAAA,CAA2C;AAAA,YACpE,oBAAC,QAAA,EAAK,WAAU,6CAA6C,gBAAM,OAAM;AAAA,YACzE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,iBAAiB,MAAM,EAAE;AAAA,gBACxC,WAAW;AAAA,gBACX,cAAY,UAAU,MAAM,KAAK;AAAA,gBAEjC,UAAA,oBAAC,OAAA,EAAM,WAAU,SAAA,CAAS;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5B;AAAA,QAAA;AAAA,QAZK,MAAM;AAAA,MAAA;AAAA,IAab;AAAA,IAGH,cACC,qBAAC,OAAA,EAAI,WAAU,wHACb,UAAA;AAAA,MAAA,oBAAC,aAAA,EAAY,WAAU,+BAAA,CAA+B;AAAA,MACtD,oBAAC,UAAK,UAAA,eAAA,CAAY;AAAA,IAAA,EAAA,CACpB,IACE;AAAA,IACJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,OAAO,iBAAiB,KAAK,OAAO;AAAA,QACpC,eAAe,CAAC;;AAAU,8BAAa,UAAU,OAAO,SAAQ,cAAS,KAAK,MAAd,mBAAiB,OAAM,IAAK;AAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAC9F,GACF;AAEJ;"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react = require("react");
4
+ const require$$0 = require("react");
5
5
  const AttachmentContext = require("./AttachmentContext.cjs");
6
6
  const useAttachFiles = require("./useAttachFiles.cjs");
7
7
  const cnfast = require("cnfast");
@@ -11,23 +11,23 @@ const ComposerDropZone = ({
11
11
  onUpload,
12
12
  onDragActiveChange
13
13
  }) => {
14
- const [isDragOver, setIsDragOver] = react.useState(false);
14
+ const [isDragOver, setIsDragOver] = require$$0.useState(false);
15
15
  const { attachFiles } = useAttachFiles.useAttachFiles();
16
16
  const { isUploading } = AttachmentContext.useAttachments();
17
- const onDragActiveChangeRef = react.useRef(onDragActiveChange);
17
+ const onDragActiveChangeRef = require$$0.useRef(onDragActiveChange);
18
18
  onDragActiveChangeRef.current = onDragActiveChange;
19
- react.useEffect(() => {
19
+ require$$0.useEffect(() => {
20
20
  var _a;
21
21
  (_a = onDragActiveChangeRef.current) == null ? void 0 : _a.call(onDragActiveChangeRef, isDragOver);
22
22
  }, [isDragOver]);
23
- const handleDragOver = react.useCallback((e) => {
23
+ const handleDragOver = require$$0.useCallback((e) => {
24
24
  e.preventDefault();
25
25
  e.stopPropagation();
26
26
  if (e.dataTransfer.types.includes("Files")) {
27
27
  setIsDragOver(true);
28
28
  }
29
29
  }, []);
30
- const handleDragLeave = react.useCallback((e) => {
30
+ const handleDragLeave = require$$0.useCallback((e) => {
31
31
  e.preventDefault();
32
32
  e.stopPropagation();
33
33
  const rect = e.currentTarget.getBoundingClientRect();
@@ -36,7 +36,7 @@ const ComposerDropZone = ({
36
36
  setIsDragOver(false);
37
37
  }
38
38
  }, []);
39
- const handleDrop = react.useCallback(
39
+ const handleDrop = require$$0.useCallback(
40
40
  async (e) => {
41
41
  e.preventDefault();
42
42
  e.stopPropagation();
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerDropZone.cjs","sources":["../../src/composer/ComposerDropZone.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type FC,\n type ReactNode,\n} from 'react';\nimport { useAttachments } from './AttachmentContext';\nimport { useAttachFiles } from './useAttachFiles';\nimport type { UploadedAsset } from './useFileUpload';\nimport { cn } from '../lib/utils';\n\nexport interface ComposerDropZoneProps {\n children: ReactNode;\n className?: string;\n /** Called after files are uploaded via drag-and-drop. */\n onUpload?: (assets: UploadedAsset[]) => void;\n /**\n * Reports whether files are being dragged over the zone, so the composer\n * surface inside can tint itself (`ChatComposerDock dragActive`). Called\n * with `false` on mount and again on every change.\n */\n onDragActiveChange?: (active: boolean) => void;\n}\n\n/**\n * Wraps the composer area with drag-and-drop file upload support.\n * Shows a visual drop indicator when files are dragged over.\n */\nexport const ComposerDropZone: FC<ComposerDropZoneProps> = ({\n children,\n className,\n onUpload,\n onDragActiveChange,\n}) => {\n const [isDragOver, setIsDragOver] = useState(false);\n const { attachFiles } = useAttachFiles();\n const { isUploading } = useAttachments();\n\n const onDragActiveChangeRef = useRef(onDragActiveChange);\n onDragActiveChangeRef.current = onDragActiveChange;\n useEffect(() => {\n onDragActiveChangeRef.current?.(isDragOver);\n }, [isDragOver]);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer.types.includes('Files')) {\n setIsDragOver(true);\n }\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const { clientX, clientY } = e;\n if (\n clientX < rect.left ||\n clientX > rect.right ||\n clientY < rect.top ||\n clientY > rect.bottom\n ) {\n setIsDragOver(false);\n }\n }, []);\n\n const handleDrop = useCallback(\n async (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length === 0) return;\n\n const assets = await attachFiles(files, 'drop');\n if (assets.length > 0) {\n onUpload?.(assets);\n }\n },\n [attachFiles, onUpload],\n );\n\n return (\n <div\n className={cn('relative', className)}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {children}\n {isDragOver && !isUploading && (\n <div className=\"aui-drop-overlay pointer-events-none absolute inset-0 z-20 flex items-center justify-center rounded-2xl border-2 border-dashed border-primary/50 bg-primary/5\">\n <span className=\"text-sm font-medium text-primary\">Drop files to upload</span>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useState","useAttachFiles","useAttachments","useRef","useEffect","useCallback","jsxs","cn","jsx"],"mappings":";;;;;;;AA+BO,MAAM,mBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,IAAIA,MAAAA,SAAS,KAAK;AAClD,QAAM,EAAE,YAAA,IAAgBC,8BAAA;AACxB,QAAM,EAAE,YAAA,IAAgBC,iCAAA;AAExB,QAAM,wBAAwBC,MAAAA,OAAO,kBAAkB;AACvD,wBAAsB,UAAU;AAChCC,QAAAA,UAAU,MAAM;;AACd,gCAAsB,YAAtB,+CAAgC;AAAA,EAClC,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,iBAAiBC,kBAAY,CAAC,MAAiB;AACnD,MAAE,eAAA;AACF,MAAE,gBAAA;AACF,QAAI,EAAE,aAAa,MAAM,SAAS,OAAO,GAAG;AAC1C,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,kBAAkBA,kBAAY,CAAC,MAAiB;AACpD,MAAE,eAAA;AACF,MAAE,gBAAA;AACF,UAAM,OAAQ,EAAE,cAA8B,sBAAA;AAC9C,UAAM,EAAE,SAAS,QAAA,IAAY;AAC7B,QACE,UAAU,KAAK,QACf,UAAU,KAAK,SACf,UAAU,KAAK,OACf,UAAU,KAAK,QACf;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,aAAaA,MAAAA;AAAAA,IACjB,OAAO,MAAiB;AACtB,QAAE,eAAA;AACF,QAAE,gBAAA;AACF,oBAAc,KAAK;AAEnB,YAAM,QAAQ,MAAM,KAAK,EAAE,aAAa,KAAK;AAC7C,UAAI,MAAM,WAAW,EAAG;AAExB,YAAM,SAAS,MAAM,YAAY,OAAO,MAAM;AAC9C,UAAI,OAAO,SAAS,GAAG;AACrB,6CAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,EAAA;AAGxB,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,OAAAA,GAAG,YAAY,SAAS;AAAA,MACnC,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,QAAQ;AAAA,MAEP,UAAA;AAAA,QAAA;AAAA,QACA,cAAc,CAAC,eACdC,2BAAAA,IAAC,OAAA,EAAI,WAAU,iKACb,UAAAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,oCAAmC,UAAA,uBAAA,CAAoB,EAAA,CACzE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
1
+ {"version":3,"file":"ComposerDropZone.cjs","sources":["../../src/composer/ComposerDropZone.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type DragEvent,\n type FC,\n type ReactNode,\n} from 'react';\nimport { useAttachments } from './AttachmentContext';\nimport { useAttachFiles } from './useAttachFiles';\nimport type { UploadedAsset } from './useFileUpload';\nimport { cn } from '../lib/utils';\n\nexport interface ComposerDropZoneProps {\n children: ReactNode;\n className?: string;\n /** Called after files are uploaded via drag-and-drop. */\n onUpload?: (assets: UploadedAsset[]) => void;\n /**\n * Reports whether files are being dragged over the zone, so the composer\n * surface inside can tint itself (`ChatComposerDock dragActive`). Called\n * with `false` on mount and again on every change.\n */\n onDragActiveChange?: (active: boolean) => void;\n}\n\n/**\n * Wraps the composer area with drag-and-drop file upload support.\n * Shows a visual drop indicator when files are dragged over.\n */\nexport const ComposerDropZone: FC<ComposerDropZoneProps> = ({\n children,\n className,\n onUpload,\n onDragActiveChange,\n}) => {\n const [isDragOver, setIsDragOver] = useState(false);\n const { attachFiles } = useAttachFiles();\n const { isUploading } = useAttachments();\n\n const onDragActiveChangeRef = useRef(onDragActiveChange);\n onDragActiveChangeRef.current = onDragActiveChange;\n useEffect(() => {\n onDragActiveChangeRef.current?.(isDragOver);\n }, [isDragOver]);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer.types.includes('Files')) {\n setIsDragOver(true);\n }\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const { clientX, clientY } = e;\n if (\n clientX < rect.left ||\n clientX > rect.right ||\n clientY < rect.top ||\n clientY > rect.bottom\n ) {\n setIsDragOver(false);\n }\n }, []);\n\n const handleDrop = useCallback(\n async (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length === 0) return;\n\n const assets = await attachFiles(files, 'drop');\n if (assets.length > 0) {\n onUpload?.(assets);\n }\n },\n [attachFiles, onUpload],\n );\n\n return (\n <div\n className={cn('relative', className)}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {children}\n {isDragOver && !isUploading && (\n <div className=\"aui-drop-overlay pointer-events-none absolute inset-0 z-20 flex items-center justify-center rounded-2xl border-2 border-dashed border-primary/50 bg-primary/5\">\n <span className=\"text-sm font-medium text-primary\">Drop files to upload</span>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useState","useAttachFiles","useAttachments","useRef","useEffect","useCallback","jsxs","cn","jsx"],"mappings":";;;;;;;AA+BO,MAAM,mBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAAA,SAAS,KAAK;AAClD,QAAM,EAAE,YAAA,IAAgBC,8BAAA;AACxB,QAAM,EAAE,YAAA,IAAgBC,iCAAA;AAExB,QAAM,wBAAwBC,WAAAA,OAAO,kBAAkB;AACvD,wBAAsB,UAAU;AAChCC,aAAAA,UAAU,MAAM;;AACd,gCAAsB,YAAtB,+CAAgC;AAAA,EAClC,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,iBAAiBC,uBAAY,CAAC,MAAiB;AACnD,MAAE,eAAA;AACF,MAAE,gBAAA;AACF,QAAI,EAAE,aAAa,MAAM,SAAS,OAAO,GAAG;AAC1C,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,kBAAkBA,uBAAY,CAAC,MAAiB;AACpD,MAAE,eAAA;AACF,MAAE,gBAAA;AACF,UAAM,OAAQ,EAAE,cAA8B,sBAAA;AAC9C,UAAM,EAAE,SAAS,QAAA,IAAY;AAC7B,QACE,UAAU,KAAK,QACf,UAAU,KAAK,SACf,UAAU,KAAK,OACf,UAAU,KAAK,QACf;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,aAAaA,WAAAA;AAAAA,IACjB,OAAO,MAAiB;AACtB,QAAE,eAAA;AACF,QAAE,gBAAA;AACF,oBAAc,KAAK;AAEnB,YAAM,QAAQ,MAAM,KAAK,EAAE,aAAa,KAAK;AAC7C,UAAI,MAAM,WAAW,EAAG;AAExB,YAAM,SAAS,MAAM,YAAY,OAAO,MAAM;AAC9C,UAAI,OAAO,SAAS,GAAG;AACrB,6CAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,EAAA;AAGxB,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,OAAAA,GAAG,YAAY,SAAS;AAAA,MACnC,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,QAAQ;AAAA,MAEP,UAAA;AAAA,QAAA;AAAA,QACA,cAAc,CAAC,eACdC,2BAAAA,IAAC,OAAA,EAAI,WAAU,iKACb,UAAAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,oCAAmC,UAAA,uBAAA,CAAoB,EAAA,CACzE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
@@ -2,22 +2,26 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const lucideReact = require("lucide-react");
5
- const react = require("react");
5
+ const require$$0 = require("react");
6
6
  const useAttachFiles = require("./useAttachFiles.cjs");
7
+ const tooltip = require("../ui/tooltip.cjs");
7
8
  const cnfast = require("cnfast");
8
9
  const FileUploadButton = ({
9
10
  className,
10
11
  onUpload,
11
- accept
12
+ accept,
13
+ disabledReason = null
12
14
  }) => {
13
- const inputRef = react.useRef(null);
15
+ const inputRef = require$$0.useRef(null);
14
16
  const { attachFiles, isUploading, error, clearError } = useAttachFiles.useAttachFiles();
15
- const handleClick = react.useCallback(() => {
17
+ const unavailable = Boolean(disabledReason);
18
+ const handleClick = require$$0.useCallback(() => {
16
19
  var _a;
20
+ if (unavailable) return;
17
21
  clearError();
18
22
  (_a = inputRef.current) == null ? void 0 : _a.click();
19
- }, [clearError]);
20
- const handleFiles = react.useCallback(
23
+ }, [clearError, unavailable]);
24
+ const handleFiles = require$$0.useCallback(
21
25
  async (files) => {
22
26
  if (!files || files.length === 0) return;
23
27
  const assets = await attachFiles(Array.from(files), "paperclip");
@@ -30,6 +34,25 @@ const FileUploadButton = ({
30
34
  },
31
35
  [attachFiles, onUpload]
32
36
  );
37
+ const button = /* @__PURE__ */ jsxRuntime.jsx(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ onClick: handleClick,
42
+ disabled: isUploading,
43
+ "aria-disabled": unavailable || void 0,
44
+ "data-unavailable": unavailable || void 0,
45
+ className: cnfast.cn(
46
+ "aui-file-upload-btn flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:pointer-events-none",
47
+ error && "text-destructive",
48
+ className,
49
+ unavailable && "cursor-not-allowed opacity-30 hover:bg-transparent hover:text-muted-foreground"
50
+ ),
51
+ title: unavailable ? void 0 : error ?? (isUploading ? "Uploading..." : "Attach files"),
52
+ "aria-label": isUploading ? "Uploading files" : "Attach files",
53
+ children: isUploading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2Icon, { className: "size-4 animate-spin" }) : error ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircleIcon, { className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PaperclipIcon, { className: "size-4" })
54
+ }
55
+ );
33
56
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
34
57
  /* @__PURE__ */ jsxRuntime.jsx(
35
58
  "input",
@@ -43,22 +66,14 @@ const FileUploadButton = ({
43
66
  "aria-label": "Upload files"
44
67
  }
45
68
  ),
46
- /* @__PURE__ */ jsxRuntime.jsx(
47
- "button",
48
- {
49
- type: "button",
50
- onClick: handleClick,
51
- disabled: isUploading,
52
- className: cnfast.cn(
53
- "aui-file-upload-btn flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:pointer-events-none",
54
- error && "text-destructive",
55
- className
56
- ),
57
- title: error ?? (isUploading ? "Uploading..." : "Attach files"),
58
- "aria-label": isUploading ? "Uploading files" : "Attach files",
59
- children: isUploading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2Icon, { className: "size-4 animate-spin" }) : error ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircleIcon, { className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PaperclipIcon, { className: "size-4" })
60
- }
61
- )
69
+ unavailable ? (
70
+ // The reason in the SDK's tooltip, which opens on keyboard focus as well as on hover (a
71
+ // native title shows only to a pointer).
72
+ /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { children: [
73
+ /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: button }),
74
+ /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { side: "bottom", children: disabledReason })
75
+ ] })
76
+ ) : button
62
77
  ] });
63
78
  };
64
79
  exports.FileUploadButton = FileUploadButton;
@@ -1 +1 @@
1
- {"version":3,"file":"FileUploadButton.cjs","sources":["../../src/composer/FileUploadButton.tsx"],"sourcesContent":["import { PaperclipIcon, Loader2Icon, AlertCircleIcon } from 'lucide-react';\nimport { useCallback, useRef, type FC } from 'react';\nimport { useAttachFiles } from './useAttachFiles';\nimport type { UploadedAsset } from './useFileUpload';\nimport { cn } from '../lib/utils';\n\nexport interface FileUploadButtonProps {\n className?: string;\n /** Called after files are uploaded successfully. Receives the created assets. */\n onUpload?: (assets: UploadedAsset[]) => void;\n /** Accepted file types (MIME pattern). Defaults to all files. */\n accept?: string;\n}\n\n/**\n * Paperclip button that opens a file picker and uploads selected files to Athena.\n * After upload, adds files to the attachment context so they appear as pills\n * above the composer and get included when the message is sent.\n */\nexport const FileUploadButton: FC<FileUploadButtonProps> = ({\n className,\n onUpload,\n accept,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { attachFiles, isUploading, error, clearError } = useAttachFiles();\n\n const handleClick = useCallback(() => {\n clearError();\n inputRef.current?.click();\n }, [clearError]);\n\n const handleFiles = useCallback(\n async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n\n const assets = await attachFiles(Array.from(files), 'paperclip');\n if (assets.length > 0) {\n onUpload?.(assets);\n }\n\n // Reset input so the same file can be re-selected\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [attachFiles, onUpload],\n );\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n className=\"hidden\"\n onChange={(e) => handleFiles(e.target.files)}\n aria-label=\"Upload files\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isUploading}\n className={cn(\n 'aui-file-upload-btn flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:pointer-events-none',\n error && 'text-destructive',\n className,\n )}\n title={error ?? (isUploading ? 'Uploading...' : 'Attach files')}\n aria-label={isUploading ? 'Uploading files' : 'Attach files'}\n >\n {isUploading ? (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ) : error ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <PaperclipIcon className=\"size-4\" />\n )}\n </button>\n </>\n );\n};\n"],"names":["useRef","useAttachFiles","useCallback","jsxs","Fragment","jsx","cn","Loader2Icon","AlertCircleIcon","PaperclipIcon"],"mappings":";;;;;;;AAmBO,MAAM,mBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,WAAWA,MAAAA,OAAyB,IAAI;AAC9C,QAAM,EAAE,aAAa,aAAa,OAAO,WAAA,IAAeC,eAAAA,eAAA;AAExD,QAAM,cAAcC,MAAAA,YAAY,MAAM;;AACpC,eAAA;AACA,mBAAS,YAAT,mBAAkB;AAAA,EACpB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,cAAcA,MAAAA;AAAAA,IAClB,OAAO,UAA2B;AAChC,UAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAElC,YAAM,SAAS,MAAM,YAAY,MAAM,KAAK,KAAK,GAAG,WAAW;AAC/D,UAAI,OAAO,SAAS,GAAG;AACrB,6CAAW;AAAA,MACb;AAGA,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,EAAA;AAGxB,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAQ;AAAA,QACR;AAAA,QACA,WAAU;AAAA,QACV,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,QAC3C,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEbA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAWC,OAAAA;AAAAA,UACT;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAAA,QAEF,OAAO,UAAU,cAAc,iBAAiB;AAAA,QAChD,cAAY,cAAc,oBAAoB;AAAA,QAE7C,UAAA,cACCD,2BAAAA,IAACE,YAAAA,aAAA,EAAY,WAAU,uBAAsB,IAC3C,QACFF,2BAAAA,IAACG,YAAAA,iBAAA,EAAgB,WAAU,UAAS,IAEpCH,2BAAAA,IAACI,2BAAA,EAAc,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAEtC,GACF;AAEJ;;"}
1
+ {"version":3,"file":"FileUploadButton.cjs","sources":["../../src/composer/FileUploadButton.tsx"],"sourcesContent":["import { PaperclipIcon, Loader2Icon, AlertCircleIcon } from 'lucide-react';\nimport { useCallback, useRef, type FC } from 'react';\nimport { useAttachFiles } from './useAttachFiles';\nimport type { UploadedAsset } from './useFileUpload';\nimport { cn } from '../lib/utils';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\nexport interface FileUploadButtonProps {\n className?: string;\n /** Called after files are uploaded successfully. Receives the created assets. */\n onUpload?: (assets: UploadedAsset[]) => void;\n /** Accepted file types (MIME pattern). Defaults to all files. */\n accept?: string;\n /**\n * Why attaching is off right now, e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached: the button shows disabled with this in its tooltip and the file picker does not open.\n * It stays focusable, and the tooltip opens on keyboard focus as on hover. `null` or absent: on.\n */\n disabledReason?: string | null;\n}\n\n/**\n * Paperclip button that opens a file picker and uploads selected files to Athena.\n * After upload, adds files to the attachment context so they appear as pills\n * above the composer and get included when the message is sent.\n */\nexport const FileUploadButton: FC<FileUploadButtonProps> = ({\n className,\n onUpload,\n accept,\n disabledReason = null,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { attachFiles, isUploading, error, clearError } = useAttachFiles();\n const unavailable = Boolean(disabledReason);\n\n const handleClick = useCallback(() => {\n if (unavailable) return;\n clearError();\n inputRef.current?.click();\n }, [clearError, unavailable]);\n\n const handleFiles = useCallback(\n async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n\n const assets = await attachFiles(Array.from(files), 'paperclip');\n if (assets.length > 0) {\n onUpload?.(assets);\n }\n\n // Reset input so the same file can be re-selected\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [attachFiles, onUpload],\n );\n\n const button = (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isUploading}\n // Off with a reason, it keeps its pointer and its focus: the reason has to be readable.\n aria-disabled={unavailable || undefined}\n data-unavailable={unavailable || undefined}\n className={cn(\n 'aui-file-upload-btn flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:pointer-events-none',\n error && 'text-destructive',\n className,\n unavailable &&\n 'cursor-not-allowed opacity-30 hover:bg-transparent hover:text-muted-foreground',\n )}\n title={unavailable ? undefined : (error ?? (isUploading ? 'Uploading...' : 'Attach files'))}\n aria-label={isUploading ? 'Uploading files' : 'Attach files'}\n >\n {isUploading ? (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ) : error ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <PaperclipIcon className=\"size-4\" />\n )}\n </button>\n );\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n className=\"hidden\"\n onChange={(e) => handleFiles(e.target.files)}\n aria-label=\"Upload files\"\n />\n {unavailable ? (\n // The reason in the SDK's tooltip, which opens on keyboard focus as well as on hover (a\n // native title shows only to a pointer).\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{disabledReason}</TooltipContent>\n </Tooltip>\n ) : (\n button\n )}\n </>\n );\n};\n"],"names":["useRef","useAttachFiles","useCallback","jsx","cn","Loader2Icon","AlertCircleIcon","PaperclipIcon","jsxs","Fragment","Tooltip","TooltipTrigger","TooltipContent"],"mappings":";;;;;;;;AA0BO,MAAM,mBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,MAAM;AACJ,QAAM,WAAWA,WAAAA,OAAyB,IAAI;AAC9C,QAAM,EAAE,aAAa,aAAa,OAAO,WAAA,IAAeC,eAAAA,eAAA;AACxD,QAAM,cAAc,QAAQ,cAAc;AAE1C,QAAM,cAAcC,WAAAA,YAAY,MAAM;;AACpC,QAAI,YAAa;AACjB,eAAA;AACA,mBAAS,YAAT,mBAAkB;AAAA,EACpB,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,cAAcA,WAAAA;AAAAA,IAClB,OAAO,UAA2B;AAChC,UAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAElC,YAAM,SAAS,MAAM,YAAY,MAAM,KAAK,KAAK,GAAG,WAAW;AAC/D,UAAI,OAAO,SAAS,GAAG;AACrB,6CAAW;AAAA,MACb;AAGA,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,EAAA;AAGxB,QAAM,SACJC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MAEV,iBAAe,eAAe;AAAA,MAC9B,oBAAkB,eAAe;AAAA,MACjC,WAAWC,OAAAA;AAAAA,QACT;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,eACE;AAAA,MAAA;AAAA,MAEJ,OAAO,cAAc,SAAa,UAAU,cAAc,iBAAiB;AAAA,MAC3E,cAAY,cAAc,oBAAoB;AAAA,MAE7C,UAAA,cACCD,2BAAAA,IAACE,YAAAA,aAAA,EAAY,WAAU,uBAAsB,IAC3C,QACFF,2BAAAA,IAACG,YAAAA,iBAAA,EAAgB,WAAU,UAAS,IAEpCH,2BAAAA,IAACI,2BAAA,EAAc,WAAU,SAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAKxC,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAN,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAQ;AAAA,QACR;AAAA,QACA,WAAU;AAAA,QACV,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,QAC3C,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEZ;AAAA;AAAA;AAAA,sCAGEO,QAAAA,SAAA,EACC,UAAA;AAAA,QAAAP,2BAAAA,IAACQ,QAAAA,gBAAA,EAAe,SAAO,MAAE,UAAA,QAAO;AAAA,QAChCR,2BAAAA,IAACS,QAAAA,gBAAA,EAAe,MAAK,UAAU,UAAA,eAAA,CAAe;AAAA,MAAA,EAAA,CAChD;AAAA,QAEA;AAAA,EAAA,GAEJ;AAEJ;;"}
@@ -6,6 +6,12 @@ export interface FileUploadButtonProps {
6
6
  onUpload?: (assets: UploadedAsset[]) => void;
7
7
  /** Accepted file types (MIME pattern). Defaults to all files. */
8
8
  accept?: string;
9
+ /**
10
+ * Why attaching is off right now, e.g. "Needs a connection…" while the host knows Athena can't be
11
+ * reached: the button shows disabled with this in its tooltip and the file picker does not open.
12
+ * It stays focusable, and the tooltip opens on keyboard focus as on hover. `null` or absent: on.
13
+ */
14
+ disabledReason?: string | null;
9
15
  }
10
16
  /**
11
17
  * Paperclip button that opens a file picker and uploads selected files to Athena.
@@ -1,20 +1,24 @@
1
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { Loader2Icon, AlertCircleIcon, PaperclipIcon } from "lucide-react";
3
3
  import { useRef, useCallback } from "react";
4
4
  import { useAttachFiles } from "./useAttachFiles.js";
5
+ import { Tooltip, TooltipTrigger, TooltipContent } from "../ui/tooltip.js";
5
6
  import { cn } from "cnfast";
6
7
  const FileUploadButton = ({
7
8
  className,
8
9
  onUpload,
9
- accept
10
+ accept,
11
+ disabledReason = null
10
12
  }) => {
11
13
  const inputRef = useRef(null);
12
14
  const { attachFiles, isUploading, error, clearError } = useAttachFiles();
15
+ const unavailable = Boolean(disabledReason);
13
16
  const handleClick = useCallback(() => {
14
17
  var _a;
18
+ if (unavailable) return;
15
19
  clearError();
16
20
  (_a = inputRef.current) == null ? void 0 : _a.click();
17
- }, [clearError]);
21
+ }, [clearError, unavailable]);
18
22
  const handleFiles = useCallback(
19
23
  async (files) => {
20
24
  if (!files || files.length === 0) return;
@@ -28,6 +32,25 @@ const FileUploadButton = ({
28
32
  },
29
33
  [attachFiles, onUpload]
30
34
  );
35
+ const button = /* @__PURE__ */ jsx(
36
+ "button",
37
+ {
38
+ type: "button",
39
+ onClick: handleClick,
40
+ disabled: isUploading,
41
+ "aria-disabled": unavailable || void 0,
42
+ "data-unavailable": unavailable || void 0,
43
+ className: cn(
44
+ "aui-file-upload-btn flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:pointer-events-none",
45
+ error && "text-destructive",
46
+ className,
47
+ unavailable && "cursor-not-allowed opacity-30 hover:bg-transparent hover:text-muted-foreground"
48
+ ),
49
+ title: unavailable ? void 0 : error ?? (isUploading ? "Uploading..." : "Attach files"),
50
+ "aria-label": isUploading ? "Uploading files" : "Attach files",
51
+ children: isUploading ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin" }) : error ? /* @__PURE__ */ jsx(AlertCircleIcon, { className: "size-4" }) : /* @__PURE__ */ jsx(PaperclipIcon, { className: "size-4" })
52
+ }
53
+ );
31
54
  return /* @__PURE__ */ jsxs(Fragment, { children: [
32
55
  /* @__PURE__ */ jsx(
33
56
  "input",
@@ -41,22 +64,14 @@ const FileUploadButton = ({
41
64
  "aria-label": "Upload files"
42
65
  }
43
66
  ),
44
- /* @__PURE__ */ jsx(
45
- "button",
46
- {
47
- type: "button",
48
- onClick: handleClick,
49
- disabled: isUploading,
50
- className: cn(
51
- "aui-file-upload-btn flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:pointer-events-none",
52
- error && "text-destructive",
53
- className
54
- ),
55
- title: error ?? (isUploading ? "Uploading..." : "Attach files"),
56
- "aria-label": isUploading ? "Uploading files" : "Attach files",
57
- children: isUploading ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin" }) : error ? /* @__PURE__ */ jsx(AlertCircleIcon, { className: "size-4" }) : /* @__PURE__ */ jsx(PaperclipIcon, { className: "size-4" })
58
- }
59
- )
67
+ unavailable ? (
68
+ // The reason in the SDK's tooltip, which opens on keyboard focus as well as on hover (a
69
+ // native title shows only to a pointer).
70
+ /* @__PURE__ */ jsxs(Tooltip, { children: [
71
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }),
72
+ /* @__PURE__ */ jsx(TooltipContent, { side: "bottom", children: disabledReason })
73
+ ] })
74
+ ) : button
60
75
  ] });
61
76
  };
62
77
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"FileUploadButton.js","sources":["../../src/composer/FileUploadButton.tsx"],"sourcesContent":["import { PaperclipIcon, Loader2Icon, AlertCircleIcon } from 'lucide-react';\nimport { useCallback, useRef, type FC } from 'react';\nimport { useAttachFiles } from './useAttachFiles';\nimport type { UploadedAsset } from './useFileUpload';\nimport { cn } from '../lib/utils';\n\nexport interface FileUploadButtonProps {\n className?: string;\n /** Called after files are uploaded successfully. Receives the created assets. */\n onUpload?: (assets: UploadedAsset[]) => void;\n /** Accepted file types (MIME pattern). Defaults to all files. */\n accept?: string;\n}\n\n/**\n * Paperclip button that opens a file picker and uploads selected files to Athena.\n * After upload, adds files to the attachment context so they appear as pills\n * above the composer and get included when the message is sent.\n */\nexport const FileUploadButton: FC<FileUploadButtonProps> = ({\n className,\n onUpload,\n accept,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { attachFiles, isUploading, error, clearError } = useAttachFiles();\n\n const handleClick = useCallback(() => {\n clearError();\n inputRef.current?.click();\n }, [clearError]);\n\n const handleFiles = useCallback(\n async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n\n const assets = await attachFiles(Array.from(files), 'paperclip');\n if (assets.length > 0) {\n onUpload?.(assets);\n }\n\n // Reset input so the same file can be re-selected\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [attachFiles, onUpload],\n );\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n className=\"hidden\"\n onChange={(e) => handleFiles(e.target.files)}\n aria-label=\"Upload files\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isUploading}\n className={cn(\n 'aui-file-upload-btn flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:pointer-events-none',\n error && 'text-destructive',\n className,\n )}\n title={error ?? (isUploading ? 'Uploading...' : 'Attach files')}\n aria-label={isUploading ? 'Uploading files' : 'Attach files'}\n >\n {isUploading ? (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ) : error ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <PaperclipIcon className=\"size-4\" />\n )}\n </button>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAmBO,MAAM,mBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,EAAE,aAAa,aAAa,OAAO,WAAA,IAAe,eAAA;AAExD,QAAM,cAAc,YAAY,MAAM;;AACpC,eAAA;AACA,mBAAS,YAAT,mBAAkB;AAAA,EACpB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,cAAc;AAAA,IAClB,OAAO,UAA2B;AAChC,UAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAElC,YAAM,SAAS,MAAM,YAAY,MAAM,KAAK,KAAK,GAAG,WAAW;AAC/D,UAAI,OAAO,SAAS,GAAG;AACrB,6CAAW;AAAA,MACb;AAGA,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,EAAA;AAGxB,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAQ;AAAA,QACR;AAAA,QACA,WAAU;AAAA,QACV,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,QAC3C,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEb;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAAA,QAEF,OAAO,UAAU,cAAc,iBAAiB;AAAA,QAChD,cAAY,cAAc,oBAAoB;AAAA,QAE7C,UAAA,cACC,oBAAC,aAAA,EAAY,WAAU,uBAAsB,IAC3C,QACF,oBAAC,iBAAA,EAAgB,WAAU,UAAS,IAEpC,oBAAC,eAAA,EAAc,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAEtC,GACF;AAEJ;"}
1
+ {"version":3,"file":"FileUploadButton.js","sources":["../../src/composer/FileUploadButton.tsx"],"sourcesContent":["import { PaperclipIcon, Loader2Icon, AlertCircleIcon } from 'lucide-react';\nimport { useCallback, useRef, type FC } from 'react';\nimport { useAttachFiles } from './useAttachFiles';\nimport type { UploadedAsset } from './useFileUpload';\nimport { cn } from '../lib/utils';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip';\n\nexport interface FileUploadButtonProps {\n className?: string;\n /** Called after files are uploaded successfully. Receives the created assets. */\n onUpload?: (assets: UploadedAsset[]) => void;\n /** Accepted file types (MIME pattern). Defaults to all files. */\n accept?: string;\n /**\n * Why attaching is off right now, e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached: the button shows disabled with this in its tooltip and the file picker does not open.\n * It stays focusable, and the tooltip opens on keyboard focus as on hover. `null` or absent: on.\n */\n disabledReason?: string | null;\n}\n\n/**\n * Paperclip button that opens a file picker and uploads selected files to Athena.\n * After upload, adds files to the attachment context so they appear as pills\n * above the composer and get included when the message is sent.\n */\nexport const FileUploadButton: FC<FileUploadButtonProps> = ({\n className,\n onUpload,\n accept,\n disabledReason = null,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { attachFiles, isUploading, error, clearError } = useAttachFiles();\n const unavailable = Boolean(disabledReason);\n\n const handleClick = useCallback(() => {\n if (unavailable) return;\n clearError();\n inputRef.current?.click();\n }, [clearError, unavailable]);\n\n const handleFiles = useCallback(\n async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n\n const assets = await attachFiles(Array.from(files), 'paperclip');\n if (assets.length > 0) {\n onUpload?.(assets);\n }\n\n // Reset input so the same file can be re-selected\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [attachFiles, onUpload],\n );\n\n const button = (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isUploading}\n // Off with a reason, it keeps its pointer and its focus: the reason has to be readable.\n aria-disabled={unavailable || undefined}\n data-unavailable={unavailable || undefined}\n className={cn(\n 'aui-file-upload-btn flex items-center justify-center rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50 disabled:pointer-events-none',\n error && 'text-destructive',\n className,\n unavailable &&\n 'cursor-not-allowed opacity-30 hover:bg-transparent hover:text-muted-foreground',\n )}\n title={unavailable ? undefined : (error ?? (isUploading ? 'Uploading...' : 'Attach files'))}\n aria-label={isUploading ? 'Uploading files' : 'Attach files'}\n >\n {isUploading ? (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ) : error ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <PaperclipIcon className=\"size-4\" />\n )}\n </button>\n );\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={accept}\n className=\"hidden\"\n onChange={(e) => handleFiles(e.target.files)}\n aria-label=\"Upload files\"\n />\n {unavailable ? (\n // The reason in the SDK's tooltip, which opens on keyboard focus as well as on hover (a\n // native title shows only to a pointer).\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{disabledReason}</TooltipContent>\n </Tooltip>\n ) : (\n button\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;AA0BO,MAAM,mBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,MAAM;AACJ,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,EAAE,aAAa,aAAa,OAAO,WAAA,IAAe,eAAA;AACxD,QAAM,cAAc,QAAQ,cAAc;AAE1C,QAAM,cAAc,YAAY,MAAM;;AACpC,QAAI,YAAa;AACjB,eAAA;AACA,mBAAS,YAAT,mBAAkB;AAAA,EACpB,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,cAAc;AAAA,IAClB,OAAO,UAA2B;AAChC,UAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAElC,YAAM,SAAS,MAAM,YAAY,MAAM,KAAK,KAAK,GAAG,WAAW;AAC/D,UAAI,OAAO,SAAS,GAAG;AACrB,6CAAW;AAAA,MACb;AAGA,UAAI,SAAS,SAAS;AACpB,iBAAS,QAAQ,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,EAAA;AAGxB,QAAM,SACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MAEV,iBAAe,eAAe;AAAA,MAC9B,oBAAkB,eAAe;AAAA,MACjC,WAAW;AAAA,QACT;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,eACE;AAAA,MAAA;AAAA,MAEJ,OAAO,cAAc,SAAa,UAAU,cAAc,iBAAiB;AAAA,MAC3E,cAAY,cAAc,oBAAoB;AAAA,MAE7C,UAAA,cACC,oBAAC,aAAA,EAAY,WAAU,uBAAsB,IAC3C,QACF,oBAAC,iBAAA,EAAgB,WAAU,UAAS,IAEpC,oBAAC,eAAA,EAAc,WAAU,SAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAKxC,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAQ;AAAA,QACR;AAAA,QACA,WAAU;AAAA,QACV,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,QAC3C,cAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEZ;AAAA;AAAA;AAAA,2BAGE,SAAA,EACC,UAAA;AAAA,QAAA,oBAAC,gBAAA,EAAe,SAAO,MAAE,UAAA,QAAO;AAAA,QAChC,oBAAC,gBAAA,EAAe,MAAK,UAAU,UAAA,eAAA,CAAe;AAAA,MAAA,EAAA,CAChD;AAAA,QAEA;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -1,37 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react = require("react");
4
+ const require$$0 = require("react");
5
5
  const zustand = require("zustand");
6
6
  const vanilla = require("zustand/vanilla");
7
- const QuoteCtx = react.createContext(null);
7
+ const QuoteCtx = require$$0.createContext(null);
8
8
  function createQuoteStore() {
9
9
  return vanilla.createStore(() => ({ quote: null }));
10
10
  }
11
11
  function QuoteProvider({ children, store }) {
12
- const outer = react.useContext(QuoteCtx);
12
+ const outer = require$$0.useContext(QuoteCtx);
13
13
  if (store) return /* @__PURE__ */ jsxRuntime.jsx(StoreQuoteProvider, { store, children });
14
14
  if (outer) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
15
15
  return /* @__PURE__ */ jsxRuntime.jsx(OwnQuoteProvider, { children });
16
16
  }
17
17
  function OwnQuoteProvider({ children }) {
18
- const [store] = react.useState(createQuoteStore);
18
+ const [store] = require$$0.useState(createQuoteStore);
19
19
  return /* @__PURE__ */ jsxRuntime.jsx(StoreQuoteProvider, { store, children });
20
20
  }
21
21
  function StoreQuoteProvider({ children, store }) {
22
22
  const quote = zustand.useStore(store, (state) => state.quote);
23
- const actions = react.useMemo(
23
+ const actions = require$$0.useMemo(
24
24
  () => ({
25
25
  setQuote: (next) => store.setState({ quote: next }),
26
26
  clearQuote: () => store.setState({ quote: null })
27
27
  }),
28
28
  [store]
29
29
  );
30
- const value = react.useMemo(() => ({ quote, ...actions }), [quote, actions]);
30
+ const value = require$$0.useMemo(() => ({ quote, ...actions }), [quote, actions]);
31
31
  return /* @__PURE__ */ jsxRuntime.jsx(QuoteCtx.Provider, { value, children });
32
32
  }
33
33
  function useQuote() {
34
- const ctx = react.useContext(QuoteCtx);
34
+ const ctx = require$$0.useContext(QuoteCtx);
35
35
  if (!ctx) {
36
36
  throw new Error("[AthenaSDK] useQuote must be used within <QuoteProvider>");
37
37
  }
@@ -56,7 +56,7 @@ function elementOf(node) {
56
56
  }
57
57
  function useQuoteFromPostMessage({ scope } = {}) {
58
58
  const { setQuote } = useQuote();
59
- react.useEffect(() => {
59
+ require$$0.useEffect(() => {
60
60
  var _a;
61
61
  const doc = ((_a = scope == null ? void 0 : scope.current) == null ? void 0 : _a.ownerDocument) ?? document;
62
62
  const win = doc.defaultView ?? window;