@athenaintel/react 0.43.0 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) hide show
  1. package/README.md +215 -3
  2. package/dist/agent-runtime/src/answer-label.cjs +137 -0
  3. package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
  4. package/dist/agent-runtime/src/answer-label.d.ts +104 -0
  5. package/dist/agent-runtime/src/answer-label.js +137 -0
  6. package/dist/agent-runtime/src/answer-label.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-rows.cjs +180 -0
  8. package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
  9. package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
  10. package/dist/agent-runtime/src/answer-rows.js +180 -0
  11. package/dist/agent-runtime/src/answer-rows.js.map +1 -0
  12. package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
  13. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  14. package/dist/agent-runtime/src/conversation-index.cjs +8 -8
  15. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
  16. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  17. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  18. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  19. package/dist/agent-runtime/src/decision-checks.js +207 -0
  20. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  21. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  22. package/dist/agent-runtime/src/errors.cjs +18 -0
  23. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  24. package/dist/agent-runtime/src/errors.d.ts +7 -0
  25. package/dist/agent-runtime/src/errors.js +18 -0
  26. package/dist/agent-runtime/src/errors.js.map +1 -1
  27. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  28. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  29. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  30. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  31. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  32. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  33. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  34. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  35. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  36. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  37. package/dist/agent-runtime/src/index.d.ts +14 -8
  38. package/dist/agent-runtime/src/interrupts.cjs +43 -18
  39. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  40. package/dist/agent-runtime/src/interrupts.d.ts +19 -2
  41. package/dist/agent-runtime/src/interrupts.js +28 -3
  42. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  43. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  44. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  45. package/dist/agent-runtime/src/messages.cjs +43 -8
  46. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  47. package/dist/agent-runtime/src/messages.d.ts +25 -3
  48. package/dist/agent-runtime/src/messages.js +43 -8
  49. package/dist/agent-runtime/src/messages.js.map +1 -1
  50. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  51. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  52. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  53. package/dist/agent-runtime/src/offline-status.js +36 -0
  54. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  55. package/dist/agent-runtime/src/queue.cjs +0 -9
  56. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  57. package/dist/agent-runtime/src/queue.js +0 -9
  58. package/dist/agent-runtime/src/queue.js.map +1 -1
  59. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  60. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  61. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  62. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  63. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  64. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  65. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  66. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  67. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  68. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  69. package/dist/agent-runtime/src/runtime.d.ts +40 -0
  70. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  71. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  72. package/dist/agent-runtime/src/subagents.cjs +32 -2
  73. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  74. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  75. package/dist/agent-runtime/src/subagents.js +30 -0
  76. package/dist/agent-runtime/src/subagents.js.map +1 -1
  77. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  78. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  79. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  80. package/dist/agent-runtime/src/thread-driver.js +67 -0
  81. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  82. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  83. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +756 -0
  84. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  85. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  86. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  87. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  88. package/dist/agent-runtime/src/tool-metadata.cjs +210 -25
  89. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  90. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  91. package/dist/agent-runtime/src/tool-metadata.js +210 -25
  92. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  93. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  94. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  95. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  96. package/dist/agent-runtime/src/tool-names.js +2 -0
  97. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  98. package/dist/agent-runtime/src/types.d.ts +10 -2
  99. package/dist/agent-runtime/src/use-conversation-list.cjs +11 -11
  100. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  101. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +24 -19
  102. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  103. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +2 -1
  104. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +6 -1
  105. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  106. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  107. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  108. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  109. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  110. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +16 -16
  111. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  112. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  113. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  114. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +547 -124
  115. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  116. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +129 -10
  117. package/dist/agent-runtime/src/use-deep-agent-voice.js +487 -64
  118. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  119. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  120. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  121. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  122. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  123. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +28 -26
  124. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  125. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  126. package/dist/agent-runtime/src/voice-media.d.ts +49 -0
  127. package/dist/agent-runtime/src/voice-media.js +117 -0
  128. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  129. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  130. package/dist/assets/AssetPanel.cjs +11 -11
  131. package/dist/assets/AssetPanel.cjs.map +1 -1
  132. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  133. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  134. package/dist/assets/AthenaAssetEmbed.d.ts +7 -0
  135. package/dist/assets/AthenaAssetEmbed.js +4 -2
  136. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  137. package/dist/assets/AthenaLayout.cjs +16 -16
  138. package/dist/assets/AthenaLayout.cjs.map +1 -1
  139. package/dist/assets/use-asset-content.cjs +4 -4
  140. package/dist/assets/use-asset-content.cjs.map +1 -1
  141. package/dist/assets/use-asset-embed.cjs +14 -7
  142. package/dist/assets/use-asset-embed.cjs.map +1 -1
  143. package/dist/assets/use-asset-embed.d.ts +11 -1
  144. package/dist/assets/use-asset-embed.js +10 -3
  145. package/dist/assets/use-asset-embed.js.map +1 -1
  146. package/dist/auth/AthenaAuthContext.cjs +3 -3
  147. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  148. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  149. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  150. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  151. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  152. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  153. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  154. package/dist/auth/credential-source.cjs +26 -13
  155. package/dist/auth/credential-source.cjs.map +1 -1
  156. package/dist/auth/credential-source.d.ts +8 -0
  157. package/dist/auth/credential-source.js +26 -13
  158. package/dist/auth/credential-source.js.map +1 -1
  159. package/dist/catalog/agent-model-options.cjs +25 -17
  160. package/dist/catalog/agent-model-options.cjs.map +1 -1
  161. package/dist/catalog/agent-model-options.d.ts +38 -5
  162. package/dist/catalog/agent-model-options.js +25 -17
  163. package/dist/catalog/agent-model-options.js.map +1 -1
  164. package/dist/catalog/channel-refusal.cjs +36 -0
  165. package/dist/catalog/channel-refusal.cjs.map +1 -0
  166. package/dist/catalog/channel-refusal.d.ts +29 -0
  167. package/dist/catalog/channel-refusal.js +36 -0
  168. package/dist/catalog/channel-refusal.js.map +1 -0
  169. package/dist/catalog/chat-pickers.cjs +60 -24
  170. package/dist/catalog/chat-pickers.cjs.map +1 -1
  171. package/dist/catalog/chat-pickers.d.ts +12 -2
  172. package/dist/catalog/chat-pickers.js +56 -20
  173. package/dist/catalog/chat-pickers.js.map +1 -1
  174. package/dist/catalog/runtime-catalog.cjs +89 -23
  175. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  176. package/dist/catalog/runtime-catalog.d.ts +8 -2
  177. package/dist/catalog/runtime-catalog.js +83 -17
  178. package/dist/catalog/runtime-catalog.js.map +1 -1
  179. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  180. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  181. package/dist/chat/AthenaChat.cjs +155 -67
  182. package/dist/chat/AthenaChat.cjs.map +1 -1
  183. package/dist/chat/AthenaChat.d.ts +42 -2
  184. package/dist/chat/AthenaChat.js +106 -18
  185. package/dist/chat/AthenaChat.js.map +1 -1
  186. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  187. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  188. package/dist/chat/DrivingOnChip.cjs +23 -0
  189. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  190. package/dist/chat/DrivingOnChip.d.ts +17 -0
  191. package/dist/chat/DrivingOnChip.js +23 -0
  192. package/dist/chat/DrivingOnChip.js.map +1 -0
  193. package/dist/chat/StatewireApprovalCard.cjs +125 -31
  194. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  195. package/dist/chat/StatewireApprovalCard.d.ts +73 -1
  196. package/dist/chat/StatewireApprovalCard.js +115 -21
  197. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  198. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  199. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  200. package/dist/chat/StatewireQueuedMessages.cjs +25 -63
  201. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  202. package/dist/chat/StatewireQueuedMessages.d.ts +11 -13
  203. package/dist/chat/StatewireQueuedMessages.js +16 -54
  204. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  205. package/dist/chat/WaitingOnYouBanner.cjs +3 -3
  206. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  207. package/dist/chat/athena-chat-welcome.cjs +2 -2
  208. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  209. package/dist/chat/athena-citation-links.cjs +5 -5
  210. package/dist/chat/athena-citation-links.cjs.map +1 -1
  211. package/dist/chat/athena-composer-controls.cjs +26 -16
  212. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  213. package/dist/chat/athena-composer-controls.d.ts +6 -0
  214. package/dist/chat/athena-composer-controls.js +26 -16
  215. package/dist/chat/athena-composer-controls.js.map +1 -1
  216. package/dist/chat/athena-turn-end-status.cjs +42 -0
  217. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  218. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  219. package/dist/chat/athena-turn-end-status.js +42 -0
  220. package/dist/chat/athena-turn-end-status.js.map +1 -0
  221. package/dist/chat/browser-decision-check.cjs +131 -0
  222. package/dist/chat/browser-decision-check.cjs.map +1 -0
  223. package/dist/chat/browser-decision-check.d.ts +61 -0
  224. package/dist/chat/browser-decision-check.js +131 -0
  225. package/dist/chat/browser-decision-check.js.map +1 -0
  226. package/dist/chat/chat-outbox-rows.cjs +3 -3
  227. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  228. package/dist/chat/chat-voice-controls.cjs +93 -28
  229. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  230. package/dist/chat/chat-voice-controls.d.ts +36 -2
  231. package/dist/chat/chat-voice-controls.js +89 -24
  232. package/dist/chat/chat-voice-controls.js.map +1 -1
  233. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  234. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  235. package/dist/chat/device-operation.cjs +29 -0
  236. package/dist/chat/device-operation.cjs.map +1 -0
  237. package/dist/chat/device-operation.d.ts +34 -0
  238. package/dist/chat/device-operation.js +29 -0
  239. package/dist/chat/device-operation.js.map +1 -0
  240. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  241. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  242. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  243. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  244. package/dist/chat/super-grouping/SuperGroupingCard.cjs +52 -36
  245. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  246. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
  247. package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
  248. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  249. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  250. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  251. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  252. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  253. package/dist/chat/super-grouping/ToolTimeline.cjs +73 -40
  254. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  255. package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
  256. package/dist/chat/super-grouping/ToolTimeline.js +69 -36
  257. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  258. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  259. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  260. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  261. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  262. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  263. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  264. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  265. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  266. package/dist/chat/super-grouping/grouping-function.js +5 -1
  267. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  268. package/dist/chat/super-grouping/index.cjs +6 -0
  269. package/dist/chat/super-grouping/index.cjs.map +1 -1
  270. package/dist/chat/super-grouping/index.d.ts +5 -2
  271. package/dist/chat/super-grouping/index.js +7 -1
  272. package/dist/chat/super-grouping/index.js.map +1 -1
  273. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  274. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  275. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  276. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  277. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  278. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  279. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  280. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  281. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  282. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  283. package/dist/chat/tooltip-icon-button.cjs +2 -2
  284. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  285. package/dist/chat/use-athena-voice-live.cjs +11 -0
  286. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  287. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  288. package/dist/chat/use-athena-voice-live.js +11 -0
  289. package/dist/chat/use-athena-voice-live.js.map +1 -0
  290. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  291. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  292. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  293. package/dist/chat/use-statewire-approval-request.js +41 -9
  294. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  295. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  296. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  297. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  298. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  299. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  300. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  301. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  302. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  303. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  304. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  305. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  306. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  307. package/dist/chat-ui/index.cjs +18 -0
  308. package/dist/chat-ui/index.cjs.map +1 -1
  309. package/dist/chat-ui/index.d.ts +7 -1
  310. package/dist/chat-ui/index.js +18 -0
  311. package/dist/chat-ui/index.js.map +1 -1
  312. package/dist/chat-ui/mentions/mention-chip.cjs +4 -4
  313. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  314. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  315. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  316. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  317. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  318. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  319. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  320. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  321. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  322. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  323. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  324. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  325. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  326. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  327. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  328. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  329. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  330. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  331. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  332. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  333. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  334. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  335. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  336. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  337. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  338. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  339. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  340. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  341. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  342. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  343. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  344. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  345. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  346. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  347. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  348. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  349. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  350. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  351. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  352. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  353. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  354. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  355. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  356. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  357. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  358. package/dist/chat-ui/mentions/use-mention-asset.cjs +3 -3
  359. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
  360. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  361. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  362. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  363. package/dist/chat-ui/messages/answer-label.js +42 -0
  364. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  365. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  366. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  367. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  368. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  369. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  370. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  371. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  372. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  373. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  374. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  375. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  376. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  377. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  378. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  379. package/dist/chat-ui/messages/message-components.cjs +8 -4
  380. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  381. package/dist/chat-ui/messages/message-components.js +5 -1
  382. package/dist/chat-ui/messages/message-components.js.map +1 -1
  383. package/dist/chat-ui/messages/message-images.cjs +66 -0
  384. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  385. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  386. package/dist/chat-ui/messages/message-images.js +66 -0
  387. package/dist/chat-ui/messages/message-images.js.map +1 -0
  388. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  389. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  390. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  391. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  392. package/dist/chat-ui/rich-text/chat-link.cjs +2 -2
  393. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  394. package/dist/chat-ui/rich-text/chat-message-body.cjs +8 -8
  395. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  396. package/dist/chat-ui/rich-text/chat-node-views.cjs +6 -6
  397. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  398. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  399. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  400. package/dist/chat-ui/statewire.cjs +3 -0
  401. package/dist/chat-ui/statewire.cjs.map +1 -1
  402. package/dist/chat-ui/statewire.d.ts +2 -1
  403. package/dist/chat-ui/statewire.js +3 -0
  404. package/dist/chat-ui/statewire.js.map +1 -1
  405. package/dist/chat-ui/thread/chat-thread-shell.cjs +43 -14
  406. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  407. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  408. package/dist/chat-ui/thread/chat-thread-shell.js +35 -6
  409. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  410. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  411. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  412. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  413. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  414. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  415. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  416. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  417. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  418. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  419. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  420. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  421. package/dist/collab/client.cjs +40 -3
  422. package/dist/collab/client.cjs.map +1 -1
  423. package/dist/collab/client.d.ts +25 -0
  424. package/dist/collab/client.js +40 -3
  425. package/dist/collab/client.js.map +1 -1
  426. package/dist/collab/document-status.cjs +150 -0
  427. package/dist/collab/document-status.cjs.map +1 -0
  428. package/dist/collab/document-status.d.ts +68 -0
  429. package/dist/collab/document-status.js +150 -0
  430. package/dist/collab/document-status.js.map +1 -0
  431. package/dist/collab/index.cjs +7 -0
  432. package/dist/collab/index.cjs.map +1 -1
  433. package/dist/collab/index.d.ts +6 -1
  434. package/dist/collab/index.js +7 -0
  435. package/dist/collab/index.js.map +1 -1
  436. package/dist/collab/presence-react.cjs +11 -11
  437. package/dist/collab/presence-react.cjs.map +1 -1
  438. package/dist/collab/react.cjs +6 -6
  439. package/dist/collab/react.cjs.map +1 -1
  440. package/dist/composer/AttachmentContext.cjs +24 -11
  441. package/dist/composer/AttachmentContext.cjs.map +1 -1
  442. package/dist/composer/AttachmentContext.js +18 -5
  443. package/dist/composer/AttachmentContext.js.map +1 -1
  444. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  445. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  446. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  447. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  448. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  449. package/dist/composer/ComposerDropZone.cjs +7 -7
  450. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  451. package/dist/composer/FileUploadButton.cjs +37 -22
  452. package/dist/composer/FileUploadButton.cjs.map +1 -1
  453. package/dist/composer/FileUploadButton.d.ts +6 -0
  454. package/dist/composer/FileUploadButton.js +34 -19
  455. package/dist/composer/FileUploadButton.js.map +1 -1
  456. package/dist/composer/QuoteContext.cjs +8 -8
  457. package/dist/composer/QuoteContext.cjs.map +1 -1
  458. package/dist/composer/composer-handoff.cjs +4 -4
  459. package/dist/composer/composer-handoff.cjs.map +1 -1
  460. package/dist/composer/useAppendToComposer.cjs +4 -4
  461. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  462. package/dist/composer/useAttachFiles.cjs +23 -6
  463. package/dist/composer/useAttachFiles.cjs.map +1 -1
  464. package/dist/composer/useAttachFiles.d.ts +15 -7
  465. package/dist/composer/useAttachFiles.js +22 -5
  466. package/dist/composer/useAttachFiles.js.map +1 -1
  467. package/dist/composer/useComposerAttachment.cjs +4 -4
  468. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  469. package/dist/composer/useFileUpload.cjs +21 -16
  470. package/dist/composer/useFileUpload.cjs.map +1 -1
  471. package/dist/composer/useFileUpload.d.ts +12 -0
  472. package/dist/composer/useFileUpload.js +12 -7
  473. package/dist/composer/useFileUpload.js.map +1 -1
  474. package/dist/composer/useReadComposerDraft.cjs +2 -2
  475. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  476. package/dist/composer/useSendMessage.cjs +4 -4
  477. package/dist/composer/useSendMessage.cjs.map +1 -1
  478. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  479. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  480. package/dist/dictation/audio-level-history.cjs +3 -3
  481. package/dist/dictation/audio-level-history.cjs.map +1 -1
  482. package/dist/dictation/dictation-controls.cjs +24 -20
  483. package/dist/dictation/dictation-controls.cjs.map +1 -1
  484. package/dist/dictation/dictation-controls.d.ts +6 -1
  485. package/dist/dictation/dictation-controls.js +24 -20
  486. package/dist/dictation/dictation-controls.js.map +1 -1
  487. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  488. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  489. package/dist/dictation/use-dictation.cjs +22 -22
  490. package/dist/dictation/use-dictation.cjs.map +1 -1
  491. package/dist/index.cjs +26 -2
  492. package/dist/index.cjs.map +1 -1
  493. package/dist/index.d.ts +15 -3
  494. package/dist/index.js +26 -2
  495. package/dist/index.js.map +1 -1
  496. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  497. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  498. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  499. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  500. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  501. package/dist/keryx-http/src/update-attributions.cjs +111 -0
  502. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  503. package/dist/keryx-http/src/update-attributions.d.ts +75 -0
  504. package/dist/keryx-http/src/update-attributions.js +111 -0
  505. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  506. package/dist/lib/owner-document.cjs +6 -6
  507. package/dist/lib/owner-document.cjs.map +1 -1
  508. package/dist/lib/use-athena-rest-query.cjs +4 -4
  509. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  510. package/dist/lib/use-document-active.cjs +4 -4
  511. package/dist/lib/use-document-active.cjs.map +1 -1
  512. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  513. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  514. package/dist/offline/offline-history.cjs +7 -7
  515. package/dist/offline/offline-history.cjs.map +1 -1
  516. package/dist/provider/AthenaContext.cjs +3 -3
  517. package/dist/provider/AthenaContext.cjs.map +1 -1
  518. package/dist/provider/AthenaProvider.cjs +116 -79
  519. package/dist/provider/AthenaProvider.cjs.map +1 -1
  520. package/dist/provider/AthenaProvider.js +40 -3
  521. package/dist/provider/AthenaProvider.js.map +1 -1
  522. package/dist/provider/PostHogProvider.cjs +2 -2
  523. package/dist/provider/PostHogProvider.cjs.map +1 -1
  524. package/dist/provider/agent-selection-context.cjs +2 -2
  525. package/dist/provider/agent-selection-context.cjs.map +1 -1
  526. package/dist/provider/chat-mode-context.cjs +2 -2
  527. package/dist/provider/chat-mode-context.cjs.map +1 -1
  528. package/dist/provider/session-persistence-context.cjs +10 -0
  529. package/dist/provider/session-persistence-context.cjs.map +1 -0
  530. package/dist/provider/session-persistence-context.d.ts +15 -0
  531. package/dist/provider/session-persistence-context.js +10 -0
  532. package/dist/provider/session-persistence-context.js.map +1 -0
  533. package/dist/provider/statewire-history-context.cjs +4 -4
  534. package/dist/provider/statewire-history-context.cjs.map +1 -1
  535. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  536. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  537. package/dist/provider/statewire-window-context.cjs +3 -3
  538. package/dist/provider/statewire-window-context.cjs.map +1 -1
  539. package/dist/provider/theme-style-context.cjs +3 -3
  540. package/dist/provider/theme-style-context.cjs.map +1 -1
  541. package/dist/react/package.json.cjs +1 -1
  542. package/dist/react/package.json.js +1 -1
  543. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  544. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  545. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  546. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  547. package/dist/runtime/auth.cjs +13 -13
  548. package/dist/runtime/auth.cjs.map +1 -1
  549. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  550. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  551. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  552. package/dist/runtime/statewire-lifecycle.js +2 -1
  553. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  554. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  555. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  556. package/dist/runtime/statewire-session-lane.cjs +4 -4
  557. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  558. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  559. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  560. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  561. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  562. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  563. package/dist/styles.css +1 -1
  564. package/dist/threads/Inbox.cjs +8 -8
  565. package/dist/threads/Inbox.cjs.map +1 -1
  566. package/dist/threads/SessionList.cjs +9 -9
  567. package/dist/threads/SessionList.cjs.map +1 -1
  568. package/dist/threads/SessionsPage.cjs +11 -11
  569. package/dist/threads/SessionsPage.cjs.map +1 -1
  570. package/dist/threads/index-triggered-refresh.cjs +10 -10
  571. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  572. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  573. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  574. package/dist/threads/offline-session-list.cjs +3 -3
  575. package/dist/threads/offline-session-list.cjs.map +1 -1
  576. package/dist/threads/session-list-tab-share.cjs +5 -5
  577. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  578. package/dist/threads/statewire-thread-list.cjs +51 -51
  579. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  580. package/dist/threads/thread-id-context.cjs +5 -5
  581. package/dist/threads/thread-id-context.cjs.map +1 -1
  582. package/dist/threads/use-athena-session-attention.cjs +2 -2
  583. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  584. package/dist/threads/use-athena-sessions.cjs +10 -10
  585. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  586. package/dist/threads/use-athena-thread-model.cjs +3 -3
  587. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  588. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  589. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  590. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  591. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  592. package/dist/threads/use-thread-archive.cjs +9 -9
  593. package/dist/threads/use-thread-archive.cjs.map +1 -1
  594. package/dist/threads/use-thread-favorite.cjs +2 -2
  595. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  596. package/dist/threads/use-thread-field-override.cjs +20 -20
  597. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  598. package/dist/threads/use-thread-read-state.cjs +4 -4
  599. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  600. package/dist/threads/use-thread-rename.cjs +2 -2
  601. package/dist/threads/use-thread-rename.cjs.map +1 -1
  602. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  603. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  604. package/dist/tools/NestedPtcMessages.cjs +6 -6
  605. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  606. package/dist/tools/append-document-tool-ui.cjs +7 -7
  607. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  608. package/dist/tools/file-tool-uis.cjs +2 -2
  609. package/dist/tools/file-tool-uis.cjs.map +1 -1
  610. package/dist/tools/misc-tool-uis.cjs +2 -2
  611. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  612. package/dist/tools/primitives.cjs +6 -6
  613. package/dist/tools/primitives.cjs.map +1 -1
  614. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  615. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  616. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  617. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  618. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  619. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  620. package/dist/tools/todo-plan-store.cjs +4 -4
  621. package/dist/tools/todo-plan-store.cjs.map +1 -1
  622. package/dist/tools/tool-appearance.cjs +3 -3
  623. package/dist/tools/tool-appearance.cjs.map +1 -1
  624. package/dist/tools/tool-fallback.cjs +14 -14
  625. package/dist/tools/tool-fallback.cjs.map +1 -1
  626. package/dist/tools/tool-uis.cjs +74 -74
  627. package/dist/tools/tool-uis.cjs.map +1 -1
  628. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  629. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  630. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  631. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  632. package/dist/ui/image-viewer.cjs +382 -0
  633. package/dist/ui/image-viewer.cjs.map +1 -0
  634. package/dist/ui/image-viewer.d.ts +50 -0
  635. package/dist/ui/image-viewer.js +382 -0
  636. package/dist/ui/image-viewer.js.map +1 -0
  637. package/dist/voice/chat.cjs +6 -0
  638. package/dist/voice/chat.cjs.map +1 -1
  639. package/dist/voice/chat.d.ts +1 -1
  640. package/dist/voice/chat.js +8 -2
  641. package/dist/voice/livekit-join.cjs +52 -101
  642. package/dist/voice/livekit-join.cjs.map +1 -1
  643. package/dist/voice/livekit-join.d.ts +1 -6
  644. package/dist/voice/livekit-join.js +52 -101
  645. package/dist/voice/livekit-join.js.map +1 -1
  646. package/dist/voice/livekit.cjs.map +1 -1
  647. package/dist/voice/livekit.d.ts +11 -1
  648. package/dist/voice/livekit.js.map +1 -1
  649. package/dist/voice/use-athena-voice-session.cjs +34 -34
  650. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  651. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  652. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  653. package/dist/workbench/SessionWorkbench.cjs +22 -22
  654. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  655. package/dist/workbench/session-workbench-context.cjs +3 -3
  656. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  657. package/dist/workbench/session-workbench-panes.cjs +8 -8
  658. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  659. package/dist/workbench/workbench-layout-context.cjs +3 -3
  660. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  661. package/package.json +2 -1
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const reactQuery = require("@tanstack/react-query");
4
+ const require$$0 = require("react");
5
+ const useAthenaRestQuery = require("../lib/use-athena-rest-query.cjs");
6
+ const AthenaContext = require("../provider/AthenaContext.cjs");
7
+ const statewireAuthHeaders = require("../runtime/statewire-auth-headers.cjs");
8
+ const threadIdContext = require("../threads/thread-id-context.cjs");
9
+ const decisionChecks = require("../agent-runtime/src/decision-checks.cjs");
10
+ function useBrowserDecisionConfirmer(options) {
11
+ const latest = require$$0.useRef(options);
12
+ latest.current = options;
13
+ const queryClient = useAthenaRestQuery.useAthenaQueryClient();
14
+ const { mutateAsync } = reactQuery.useMutation(
15
+ {
16
+ mutationKey: ["athena", "decision-check", "browser"],
17
+ mutationFn: ({ threadId: threadId2, answer }) => {
18
+ const controller = new AbortController();
19
+ return decisionChecks.runBrowserDecisionCheck({
20
+ decisions: decisionChecks.statewireAnswerDescriptors({ threadId: threadId2, answer }),
21
+ client: latest.current.client,
22
+ agoraFetch: (path, init) => latest.current.agoraFetch(path, init),
23
+ openUrl: (url) => latest.current.openUrl(url),
24
+ returnUrl: latest.current.returnUrl,
25
+ signal: controller.signal,
26
+ onPending: (pending) => {
27
+ var _a, _b;
28
+ return (_b = (_a = latest.current).onPending) == null ? void 0 : _b.call(
29
+ _a,
30
+ pending === null ? null : { ...pending, cancel: () => controller.abort() }
31
+ );
32
+ }
33
+ });
34
+ },
35
+ // A check is one person's act at one moment: never paused offline and
36
+ // replayed later, and never repeated.
37
+ networkMode: "always",
38
+ retry: false
39
+ },
40
+ queryClient
41
+ );
42
+ const { threadId } = options;
43
+ return require$$0.useMemo(() => {
44
+ if (!threadId) return void 0;
45
+ return async (answer) => {
46
+ var _a, _b;
47
+ let outcome;
48
+ try {
49
+ outcome = await mutateAsync({ threadId, answer });
50
+ } catch (error) {
51
+ outcome = {
52
+ status: "failed",
53
+ message: error instanceof Error ? error.message : String(error)
54
+ };
55
+ }
56
+ if (outcome.status !== "confirmed") {
57
+ console.info("[athena] decision sent without a passkey check:", outcome.status);
58
+ }
59
+ (_b = (_a = latest.current).onOutcome) == null ? void 0 : _b.call(_a, outcome);
60
+ return outcome.status === "confirmed" ? outcome.token : void 0;
61
+ };
62
+ }, [threadId, mutateAsync]);
63
+ }
64
+ function agoraApiRoot(backendUrl) {
65
+ return backendUrl.replace(/\/api\/assistant-ui\/?$/, "").replace(/\/+$/, "");
66
+ }
67
+ function openPlaceholderTab() {
68
+ if (typeof window === "undefined") return null;
69
+ const tab = window.open("", "_blank");
70
+ if (tab) tab.opener = null;
71
+ return tab;
72
+ }
73
+ function useAthenaBrowserDecisionConfirmer(options = {}) {
74
+ const config = AthenaContext.useAthenaConfig();
75
+ const threadId = require$$0.useContext(threadIdContext.AthenaStatewireThreadIdContext);
76
+ const configRef = require$$0.useRef(config);
77
+ configRef.current = config;
78
+ const agoraFetch = require$$0.useCallback(async (path, init) => {
79
+ const current = configRef.current;
80
+ const source = { apiKey: current.apiKey, token: current.token, getToken: current.getToken };
81
+ const send = async (staleAuth) => {
82
+ const authHeaders = await statewireAuthHeaders.resolveStatewireAuthHeaders(source, { staleAuth });
83
+ return fetch(`${agoraApiRoot(current.backendUrl)}${path}`, {
84
+ ...init,
85
+ // With neither a token nor a key, the host signs in with its session
86
+ // cookie, which a request to another origin carries only when asked.
87
+ ...Object.keys(authHeaders).length === 0 ? { credentials: "include" } : {},
88
+ headers: { ...Object.fromEntries(new Headers(init.headers).entries()), ...authHeaders }
89
+ });
90
+ };
91
+ const first = await send(false);
92
+ return first.status === 401 && current.getToken ? send(true) : first;
93
+ }, []);
94
+ const optionsRef = require$$0.useRef(options);
95
+ optionsRef.current = options;
96
+ const placeholderRef = require$$0.useRef(null);
97
+ const confirm = useBrowserDecisionConfirmer({
98
+ threadId,
99
+ client: options.client ?? { kind: "sdk" },
100
+ agoraFetch,
101
+ openUrl: (url) => {
102
+ const custom = optionsRef.current.openUrl;
103
+ if (custom) return custom(url);
104
+ const tab = placeholderRef.current;
105
+ placeholderRef.current = null;
106
+ if (tab && !tab.closed) tab.location.href = url;
107
+ },
108
+ returnUrl: options.returnUrl,
109
+ onPending: options.onPending,
110
+ onOutcome: options.onOutcome
111
+ });
112
+ return require$$0.useMemo(() => {
113
+ if (confirm === void 0) return void 0;
114
+ return async (answer) => {
115
+ if (optionsRef.current.openUrl) return confirm(answer);
116
+ const tab = openPlaceholderTab();
117
+ if (tab === null && !optionsRef.current.onPending) return void 0;
118
+ placeholderRef.current = tab;
119
+ try {
120
+ return await confirm(answer);
121
+ } finally {
122
+ if (placeholderRef.current === tab && tab && !tab.closed) tab.close();
123
+ placeholderRef.current = null;
124
+ }
125
+ };
126
+ }, [confirm]);
127
+ }
128
+ exports.agoraApiRoot = agoraApiRoot;
129
+ exports.useAthenaBrowserDecisionConfirmer = useAthenaBrowserDecisionConfirmer;
130
+ exports.useBrowserDecisionConfirmer = useBrowserDecisionConfirmer;
131
+ //# sourceMappingURL=browser-decision-check.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-decision-check.cjs","sources":["../../src/chat/browser-decision-check.ts"],"sourcesContent":["import {\n type AgoraFetch,\n type BrowserDecisionCheckOutcome,\n type DecisionCheckClient,\n type PendingBrowserDecisionCheck,\n runBrowserDecisionCheck,\n statewireAnswerDescriptors,\n} from '@athenaintel/agent-runtime';\nimport { useMutation } from '@tanstack/react-query';\nimport { useCallback, useContext, useMemo, useRef } from 'react';\nimport { useAthenaQueryClient } from '../lib/use-athena-rest-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport { resolveStatewireAuthHeaders } from '../runtime/statewire-auth-headers';\nimport { AthenaStatewireThreadIdContext } from '../threads/thread-id-context';\nimport type { StatewireDecisionAnswer, StatewireDecisionConfirmer } from './StatewireApprovalCard';\n\n/** The browser check in flight, as the host shows it: the code, the link, a way to stop. */\nexport interface PendingBrowserDecisionConfirm extends PendingBrowserDecisionCheck {\n /** Stop waiting: the answer goes without a check (report-only). */\n readonly cancel: () => void;\n}\n\nexport interface BrowserDecisionConfirmerOptions {\n /** The statewire thread the approval card answers; no confirmer without one. */\n readonly threadId: string | null | undefined;\n /** Which surface asks, as the check page shows it. */\n readonly client: DecisionCheckClient;\n /** An authenticated request to agora, as the person (or their device key). */\n readonly agoraFetch: AgoraFetch;\n /** Open the check page in a new tab or the system browser. */\n readonly openUrl: (url: string) => void | Promise<void>;\n /** An app link the page sends the person back to once they answered. */\n readonly returnUrl?: string;\n /** The check the person is finishing in the browser, and `null` once it settled. */\n readonly onPending?: (pending: PendingBrowserDecisionConfirm | null) => void;\n /** Every outcome: where a host nudges a person with no passkey to set one up. */\n readonly onOutcome?: (outcome: BrowserDecisionCheckOutcome) => void;\n}\n\ninterface CheckVariables {\n readonly threadId: string;\n readonly answer: StatewireDecisionAnswer;\n}\n\n/**\n * \"Confirm with your passkey\" for a host whose page can't run the passkey\n * prompt itself (identity row 0b.9, PR C): the Chrome extension, the Office\n * add-ins, Midas and SDK apps on another origin. Hand the confirmer this\n * returns to `StatewireApprovalCard` (or `AthenaChat`) as `confirmDecision`.\n *\n * An approving answer asks agora for a check, opens the web app's check page\n * through `openUrl`, and resolves the token once the person confirmed there;\n * the card sends it as `decisionCheck`. A reject never reaches here. While\n * checks are report-only the answer goes ahead without a token whenever there\n * is none (no passkey yet, the check skipped, cancelled, expired or\n * unavailable). Runs through TanStack Query, on the host's client.\n */\nexport function useBrowserDecisionConfirmer(\n options: BrowserDecisionConfirmerOptions,\n): StatewireDecisionConfirmer | undefined {\n const latest = useRef(options);\n latest.current = options;\n const queryClient = useAthenaQueryClient();\n const { mutateAsync } = useMutation(\n {\n mutationKey: ['athena', 'decision-check', 'browser'],\n mutationFn: ({ threadId, answer }: CheckVariables) => {\n const controller = new AbortController();\n return runBrowserDecisionCheck({\n decisions: statewireAnswerDescriptors({ threadId, answer }),\n client: latest.current.client,\n agoraFetch: (path, init) => latest.current.agoraFetch(path, init),\n openUrl: (url) => latest.current.openUrl(url),\n returnUrl: latest.current.returnUrl,\n signal: controller.signal,\n onPending: (pending) =>\n latest.current.onPending?.(\n pending === null ? null : { ...pending, cancel: () => controller.abort() },\n ),\n });\n },\n // A check is one person's act at one moment: never paused offline and\n // replayed later, and never repeated.\n networkMode: 'always',\n retry: false,\n },\n queryClient,\n );\n\n const { threadId } = options;\n return useMemo(() => {\n if (!threadId) return undefined;\n return async (answer: StatewireDecisionAnswer): Promise<string | undefined> => {\n let outcome: BrowserDecisionCheckOutcome;\n try {\n outcome = await mutateAsync({ threadId, answer });\n } catch (error) {\n outcome = {\n status: 'failed',\n message: error instanceof Error ? error.message : String(error),\n };\n }\n if (outcome.status !== 'confirmed') {\n // Report-only: the answer still goes; agora counts it as made\n // without a check.\n console.info('[athena] decision sent without a passkey check:', outcome.status);\n }\n latest.current.onOutcome?.(outcome);\n return outcome.status === 'confirmed' ? outcome.token : undefined;\n };\n }, [threadId, mutateAsync]);\n}\n\n/** agora's API root for `backendUrl` (which may name the assistant-ui endpoint). */\nexport function agoraApiRoot(backendUrl: string): string {\n return backendUrl.replace(/\\/api\\/assistant-ui\\/?$/, '').replace(/\\/+$/, '');\n}\n\n/**\n * A tab opened at the click, while the browser still counts it as the\n * person's act, and pointed at the check page once agora answered: a tab\n * opened only after that round trip is one a pop-up blocker may refuse. Its\n * opener is cut at once. `null` when the browser refused even that.\n */\nfunction openPlaceholderTab(): Window | null {\n if (typeof window === 'undefined') return null;\n const tab = window.open('', '_blank');\n if (tab) tab.opener = null;\n return tab;\n}\n\nexport interface AthenaBrowserDecisionConfirmerOptions {\n /** Which surface asks; defaults to an SDK app. */\n readonly client?: DecisionCheckClient;\n /** Defaults to a new browser tab. A host that can't open one passes its own. */\n readonly openUrl?: (url: string) => void | Promise<void>;\n readonly returnUrl?: string;\n /**\n * Show the code and a link to the check page while it is open. With the\n * default opener and no `onPending`, a browser that refuses the new tab\n * leaves the person no way to the page, so the answer goes at once without\n * a check (report-only) instead of waiting out the request.\n */\n readonly onPending?: (pending: PendingBrowserDecisionConfirm | null) => void;\n readonly onOutcome?: (outcome: BrowserDecisionCheckOutcome) => void;\n}\n\n/**\n * {@link useBrowserDecisionConfirmer} bound to the enclosing `<AthenaProvider>`:\n * its backend, its credential (renewed once after a 401) and the thread it\n * attached. For SDK apps on another origin and Midas: pass the result to\n * `<AthenaChat confirmDecision={…}>`.\n */\nexport function useAthenaBrowserDecisionConfirmer(\n options: AthenaBrowserDecisionConfirmerOptions = {},\n): StatewireDecisionConfirmer | undefined {\n const config = useAthenaConfig();\n const threadId = useContext(AthenaStatewireThreadIdContext);\n const configRef = useRef(config);\n configRef.current = config;\n const agoraFetch = useCallback<AgoraFetch>(async (path, init) => {\n const current = configRef.current;\n const source = { apiKey: current.apiKey, token: current.token, getToken: current.getToken };\n const send = async (staleAuth: boolean) => {\n const authHeaders = await resolveStatewireAuthHeaders(source, { staleAuth });\n return fetch(`${agoraApiRoot(current.backendUrl)}${path}`, {\n ...init,\n // With neither a token nor a key, the host signs in with its session\n // cookie, which a request to another origin carries only when asked.\n ...(Object.keys(authHeaders).length === 0 ? { credentials: 'include' as const } : {}),\n headers: { ...Object.fromEntries(new Headers(init.headers).entries()), ...authHeaders },\n });\n };\n const first = await send(false);\n return first.status === 401 && current.getToken ? send(true) : first;\n }, []);\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n // The default opener's tab, opened at the click (see `openPlaceholderTab`).\n const placeholderRef = useRef<Window | null>(null);\n const confirm = useBrowserDecisionConfirmer({\n threadId,\n client: options.client ?? { kind: 'sdk' },\n agoraFetch,\n openUrl: (url) => {\n const custom = optionsRef.current.openUrl;\n if (custom) return custom(url);\n const tab = placeholderRef.current;\n placeholderRef.current = null;\n if (tab && !tab.closed) tab.location.href = url;\n },\n returnUrl: options.returnUrl,\n onPending: options.onPending,\n onOutcome: options.onOutcome,\n });\n return useMemo(() => {\n if (confirm === undefined) return undefined;\n return async (answer: StatewireDecisionAnswer): Promise<string | undefined> => {\n if (optionsRef.current.openUrl) return confirm(answer);\n const tab = openPlaceholderTab();\n // No tab and nowhere to show a link: nothing could reach the check page.\n if (tab === null && !optionsRef.current.onPending) return undefined;\n placeholderRef.current = tab;\n try {\n return await confirm(answer);\n } finally {\n // A check that ended before opening the page leaves no blank tab behind.\n if (placeholderRef.current === tab && tab && !tab.closed) tab.close();\n placeholderRef.current = null;\n }\n };\n }, [confirm]);\n}\n"],"names":["useRef","useAthenaQueryClient","useMutation","threadId","runBrowserDecisionCheck","statewireAnswerDescriptors","useMemo","useAthenaConfig","useContext","AthenaStatewireThreadIdContext","useCallback","resolveStatewireAuthHeaders"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type AgoraFetch, type BrowserDecisionCheckOutcome, type DecisionCheckClient, type PendingBrowserDecisionCheck } from '../agent-runtime/src/index';
2
+ import type { StatewireDecisionConfirmer } from './StatewireApprovalCard';
3
+ /** The browser check in flight, as the host shows it: the code, the link, a way to stop. */
4
+ export interface PendingBrowserDecisionConfirm extends PendingBrowserDecisionCheck {
5
+ /** Stop waiting: the answer goes without a check (report-only). */
6
+ readonly cancel: () => void;
7
+ }
8
+ export interface BrowserDecisionConfirmerOptions {
9
+ /** The statewire thread the approval card answers; no confirmer without one. */
10
+ readonly threadId: string | null | undefined;
11
+ /** Which surface asks, as the check page shows it. */
12
+ readonly client: DecisionCheckClient;
13
+ /** An authenticated request to agora, as the person (or their device key). */
14
+ readonly agoraFetch: AgoraFetch;
15
+ /** Open the check page in a new tab or the system browser. */
16
+ readonly openUrl: (url: string) => void | Promise<void>;
17
+ /** An app link the page sends the person back to once they answered. */
18
+ readonly returnUrl?: string;
19
+ /** The check the person is finishing in the browser, and `null` once it settled. */
20
+ readonly onPending?: (pending: PendingBrowserDecisionConfirm | null) => void;
21
+ /** Every outcome: where a host nudges a person with no passkey to set one up. */
22
+ readonly onOutcome?: (outcome: BrowserDecisionCheckOutcome) => void;
23
+ }
24
+ /**
25
+ * "Confirm with your passkey" for a host whose page can't run the passkey
26
+ * prompt itself (identity row 0b.9, PR C): the Chrome extension, the Office
27
+ * add-ins, Midas and SDK apps on another origin. Hand the confirmer this
28
+ * returns to `StatewireApprovalCard` (or `AthenaChat`) as `confirmDecision`.
29
+ *
30
+ * An approving answer asks agora for a check, opens the web app's check page
31
+ * through `openUrl`, and resolves the token once the person confirmed there;
32
+ * the card sends it as `decisionCheck`. A reject never reaches here. While
33
+ * checks are report-only the answer goes ahead without a token whenever there
34
+ * is none (no passkey yet, the check skipped, cancelled, expired or
35
+ * unavailable). Runs through TanStack Query, on the host's client.
36
+ */
37
+ export declare function useBrowserDecisionConfirmer(options: BrowserDecisionConfirmerOptions): StatewireDecisionConfirmer | undefined;
38
+ /** agora's API root for `backendUrl` (which may name the assistant-ui endpoint). */
39
+ export declare function agoraApiRoot(backendUrl: string): string;
40
+ export interface AthenaBrowserDecisionConfirmerOptions {
41
+ /** Which surface asks; defaults to an SDK app. */
42
+ readonly client?: DecisionCheckClient;
43
+ /** Defaults to a new browser tab. A host that can't open one passes its own. */
44
+ readonly openUrl?: (url: string) => void | Promise<void>;
45
+ readonly returnUrl?: string;
46
+ /**
47
+ * Show the code and a link to the check page while it is open. With the
48
+ * default opener and no `onPending`, a browser that refuses the new tab
49
+ * leaves the person no way to the page, so the answer goes at once without
50
+ * a check (report-only) instead of waiting out the request.
51
+ */
52
+ readonly onPending?: (pending: PendingBrowserDecisionConfirm | null) => void;
53
+ readonly onOutcome?: (outcome: BrowserDecisionCheckOutcome) => void;
54
+ }
55
+ /**
56
+ * {@link useBrowserDecisionConfirmer} bound to the enclosing `<AthenaProvider>`:
57
+ * its backend, its credential (renewed once after a 401) and the thread it
58
+ * attached. For SDK apps on another origin and Midas: pass the result to
59
+ * `<AthenaChat confirmDecision={…}>`.
60
+ */
61
+ export declare function useAthenaBrowserDecisionConfirmer(options?: AthenaBrowserDecisionConfirmerOptions): StatewireDecisionConfirmer | undefined;
@@ -0,0 +1,131 @@
1
+ import { useMutation } from "@tanstack/react-query";
2
+ import { useContext, useRef, useCallback, useMemo } from "react";
3
+ import { useAthenaQueryClient } from "../lib/use-athena-rest-query.js";
4
+ import { useAthenaConfig } from "../provider/AthenaContext.js";
5
+ import { resolveStatewireAuthHeaders } from "../runtime/statewire-auth-headers.js";
6
+ import { AthenaStatewireThreadIdContext } from "../threads/thread-id-context.js";
7
+ import { runBrowserDecisionCheck, statewireAnswerDescriptors } from "../agent-runtime/src/decision-checks.js";
8
+ function useBrowserDecisionConfirmer(options) {
9
+ const latest = useRef(options);
10
+ latest.current = options;
11
+ const queryClient = useAthenaQueryClient();
12
+ const { mutateAsync } = useMutation(
13
+ {
14
+ mutationKey: ["athena", "decision-check", "browser"],
15
+ mutationFn: ({ threadId: threadId2, answer }) => {
16
+ const controller = new AbortController();
17
+ return runBrowserDecisionCheck({
18
+ decisions: statewireAnswerDescriptors({ threadId: threadId2, answer }),
19
+ client: latest.current.client,
20
+ agoraFetch: (path, init) => latest.current.agoraFetch(path, init),
21
+ openUrl: (url) => latest.current.openUrl(url),
22
+ returnUrl: latest.current.returnUrl,
23
+ signal: controller.signal,
24
+ onPending: (pending) => {
25
+ var _a, _b;
26
+ return (_b = (_a = latest.current).onPending) == null ? void 0 : _b.call(
27
+ _a,
28
+ pending === null ? null : { ...pending, cancel: () => controller.abort() }
29
+ );
30
+ }
31
+ });
32
+ },
33
+ // A check is one person's act at one moment: never paused offline and
34
+ // replayed later, and never repeated.
35
+ networkMode: "always",
36
+ retry: false
37
+ },
38
+ queryClient
39
+ );
40
+ const { threadId } = options;
41
+ return useMemo(() => {
42
+ if (!threadId) return void 0;
43
+ return async (answer) => {
44
+ var _a, _b;
45
+ let outcome;
46
+ try {
47
+ outcome = await mutateAsync({ threadId, answer });
48
+ } catch (error) {
49
+ outcome = {
50
+ status: "failed",
51
+ message: error instanceof Error ? error.message : String(error)
52
+ };
53
+ }
54
+ if (outcome.status !== "confirmed") {
55
+ console.info("[athena] decision sent without a passkey check:", outcome.status);
56
+ }
57
+ (_b = (_a = latest.current).onOutcome) == null ? void 0 : _b.call(_a, outcome);
58
+ return outcome.status === "confirmed" ? outcome.token : void 0;
59
+ };
60
+ }, [threadId, mutateAsync]);
61
+ }
62
+ function agoraApiRoot(backendUrl) {
63
+ return backendUrl.replace(/\/api\/assistant-ui\/?$/, "").replace(/\/+$/, "");
64
+ }
65
+ function openPlaceholderTab() {
66
+ if (typeof window === "undefined") return null;
67
+ const tab = window.open("", "_blank");
68
+ if (tab) tab.opener = null;
69
+ return tab;
70
+ }
71
+ function useAthenaBrowserDecisionConfirmer(options = {}) {
72
+ const config = useAthenaConfig();
73
+ const threadId = useContext(AthenaStatewireThreadIdContext);
74
+ const configRef = useRef(config);
75
+ configRef.current = config;
76
+ const agoraFetch = useCallback(async (path, init) => {
77
+ const current = configRef.current;
78
+ const source = { apiKey: current.apiKey, token: current.token, getToken: current.getToken };
79
+ const send = async (staleAuth) => {
80
+ const authHeaders = await resolveStatewireAuthHeaders(source, { staleAuth });
81
+ return fetch(`${agoraApiRoot(current.backendUrl)}${path}`, {
82
+ ...init,
83
+ // With neither a token nor a key, the host signs in with its session
84
+ // cookie, which a request to another origin carries only when asked.
85
+ ...Object.keys(authHeaders).length === 0 ? { credentials: "include" } : {},
86
+ headers: { ...Object.fromEntries(new Headers(init.headers).entries()), ...authHeaders }
87
+ });
88
+ };
89
+ const first = await send(false);
90
+ return first.status === 401 && current.getToken ? send(true) : first;
91
+ }, []);
92
+ const optionsRef = useRef(options);
93
+ optionsRef.current = options;
94
+ const placeholderRef = useRef(null);
95
+ const confirm = useBrowserDecisionConfirmer({
96
+ threadId,
97
+ client: options.client ?? { kind: "sdk" },
98
+ agoraFetch,
99
+ openUrl: (url) => {
100
+ const custom = optionsRef.current.openUrl;
101
+ if (custom) return custom(url);
102
+ const tab = placeholderRef.current;
103
+ placeholderRef.current = null;
104
+ if (tab && !tab.closed) tab.location.href = url;
105
+ },
106
+ returnUrl: options.returnUrl,
107
+ onPending: options.onPending,
108
+ onOutcome: options.onOutcome
109
+ });
110
+ return useMemo(() => {
111
+ if (confirm === void 0) return void 0;
112
+ return async (answer) => {
113
+ if (optionsRef.current.openUrl) return confirm(answer);
114
+ const tab = openPlaceholderTab();
115
+ if (tab === null && !optionsRef.current.onPending) return void 0;
116
+ placeholderRef.current = tab;
117
+ try {
118
+ return await confirm(answer);
119
+ } finally {
120
+ if (placeholderRef.current === tab && tab && !tab.closed) tab.close();
121
+ placeholderRef.current = null;
122
+ }
123
+ };
124
+ }, [confirm]);
125
+ }
126
+ export {
127
+ agoraApiRoot,
128
+ useAthenaBrowserDecisionConfirmer,
129
+ useBrowserDecisionConfirmer
130
+ };
131
+ //# sourceMappingURL=browser-decision-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-decision-check.js","sources":["../../src/chat/browser-decision-check.ts"],"sourcesContent":["import {\n type AgoraFetch,\n type BrowserDecisionCheckOutcome,\n type DecisionCheckClient,\n type PendingBrowserDecisionCheck,\n runBrowserDecisionCheck,\n statewireAnswerDescriptors,\n} from '@athenaintel/agent-runtime';\nimport { useMutation } from '@tanstack/react-query';\nimport { useCallback, useContext, useMemo, useRef } from 'react';\nimport { useAthenaQueryClient } from '../lib/use-athena-rest-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport { resolveStatewireAuthHeaders } from '../runtime/statewire-auth-headers';\nimport { AthenaStatewireThreadIdContext } from '../threads/thread-id-context';\nimport type { StatewireDecisionAnswer, StatewireDecisionConfirmer } from './StatewireApprovalCard';\n\n/** The browser check in flight, as the host shows it: the code, the link, a way to stop. */\nexport interface PendingBrowserDecisionConfirm extends PendingBrowserDecisionCheck {\n /** Stop waiting: the answer goes without a check (report-only). */\n readonly cancel: () => void;\n}\n\nexport interface BrowserDecisionConfirmerOptions {\n /** The statewire thread the approval card answers; no confirmer without one. */\n readonly threadId: string | null | undefined;\n /** Which surface asks, as the check page shows it. */\n readonly client: DecisionCheckClient;\n /** An authenticated request to agora, as the person (or their device key). */\n readonly agoraFetch: AgoraFetch;\n /** Open the check page in a new tab or the system browser. */\n readonly openUrl: (url: string) => void | Promise<void>;\n /** An app link the page sends the person back to once they answered. */\n readonly returnUrl?: string;\n /** The check the person is finishing in the browser, and `null` once it settled. */\n readonly onPending?: (pending: PendingBrowserDecisionConfirm | null) => void;\n /** Every outcome: where a host nudges a person with no passkey to set one up. */\n readonly onOutcome?: (outcome: BrowserDecisionCheckOutcome) => void;\n}\n\ninterface CheckVariables {\n readonly threadId: string;\n readonly answer: StatewireDecisionAnswer;\n}\n\n/**\n * \"Confirm with your passkey\" for a host whose page can't run the passkey\n * prompt itself (identity row 0b.9, PR C): the Chrome extension, the Office\n * add-ins, Midas and SDK apps on another origin. Hand the confirmer this\n * returns to `StatewireApprovalCard` (or `AthenaChat`) as `confirmDecision`.\n *\n * An approving answer asks agora for a check, opens the web app's check page\n * through `openUrl`, and resolves the token once the person confirmed there;\n * the card sends it as `decisionCheck`. A reject never reaches here. While\n * checks are report-only the answer goes ahead without a token whenever there\n * is none (no passkey yet, the check skipped, cancelled, expired or\n * unavailable). Runs through TanStack Query, on the host's client.\n */\nexport function useBrowserDecisionConfirmer(\n options: BrowserDecisionConfirmerOptions,\n): StatewireDecisionConfirmer | undefined {\n const latest = useRef(options);\n latest.current = options;\n const queryClient = useAthenaQueryClient();\n const { mutateAsync } = useMutation(\n {\n mutationKey: ['athena', 'decision-check', 'browser'],\n mutationFn: ({ threadId, answer }: CheckVariables) => {\n const controller = new AbortController();\n return runBrowserDecisionCheck({\n decisions: statewireAnswerDescriptors({ threadId, answer }),\n client: latest.current.client,\n agoraFetch: (path, init) => latest.current.agoraFetch(path, init),\n openUrl: (url) => latest.current.openUrl(url),\n returnUrl: latest.current.returnUrl,\n signal: controller.signal,\n onPending: (pending) =>\n latest.current.onPending?.(\n pending === null ? null : { ...pending, cancel: () => controller.abort() },\n ),\n });\n },\n // A check is one person's act at one moment: never paused offline and\n // replayed later, and never repeated.\n networkMode: 'always',\n retry: false,\n },\n queryClient,\n );\n\n const { threadId } = options;\n return useMemo(() => {\n if (!threadId) return undefined;\n return async (answer: StatewireDecisionAnswer): Promise<string | undefined> => {\n let outcome: BrowserDecisionCheckOutcome;\n try {\n outcome = await mutateAsync({ threadId, answer });\n } catch (error) {\n outcome = {\n status: 'failed',\n message: error instanceof Error ? error.message : String(error),\n };\n }\n if (outcome.status !== 'confirmed') {\n // Report-only: the answer still goes; agora counts it as made\n // without a check.\n console.info('[athena] decision sent without a passkey check:', outcome.status);\n }\n latest.current.onOutcome?.(outcome);\n return outcome.status === 'confirmed' ? outcome.token : undefined;\n };\n }, [threadId, mutateAsync]);\n}\n\n/** agora's API root for `backendUrl` (which may name the assistant-ui endpoint). */\nexport function agoraApiRoot(backendUrl: string): string {\n return backendUrl.replace(/\\/api\\/assistant-ui\\/?$/, '').replace(/\\/+$/, '');\n}\n\n/**\n * A tab opened at the click, while the browser still counts it as the\n * person's act, and pointed at the check page once agora answered: a tab\n * opened only after that round trip is one a pop-up blocker may refuse. Its\n * opener is cut at once. `null` when the browser refused even that.\n */\nfunction openPlaceholderTab(): Window | null {\n if (typeof window === 'undefined') return null;\n const tab = window.open('', '_blank');\n if (tab) tab.opener = null;\n return tab;\n}\n\nexport interface AthenaBrowserDecisionConfirmerOptions {\n /** Which surface asks; defaults to an SDK app. */\n readonly client?: DecisionCheckClient;\n /** Defaults to a new browser tab. A host that can't open one passes its own. */\n readonly openUrl?: (url: string) => void | Promise<void>;\n readonly returnUrl?: string;\n /**\n * Show the code and a link to the check page while it is open. With the\n * default opener and no `onPending`, a browser that refuses the new tab\n * leaves the person no way to the page, so the answer goes at once without\n * a check (report-only) instead of waiting out the request.\n */\n readonly onPending?: (pending: PendingBrowserDecisionConfirm | null) => void;\n readonly onOutcome?: (outcome: BrowserDecisionCheckOutcome) => void;\n}\n\n/**\n * {@link useBrowserDecisionConfirmer} bound to the enclosing `<AthenaProvider>`:\n * its backend, its credential (renewed once after a 401) and the thread it\n * attached. For SDK apps on another origin and Midas: pass the result to\n * `<AthenaChat confirmDecision={…}>`.\n */\nexport function useAthenaBrowserDecisionConfirmer(\n options: AthenaBrowserDecisionConfirmerOptions = {},\n): StatewireDecisionConfirmer | undefined {\n const config = useAthenaConfig();\n const threadId = useContext(AthenaStatewireThreadIdContext);\n const configRef = useRef(config);\n configRef.current = config;\n const agoraFetch = useCallback<AgoraFetch>(async (path, init) => {\n const current = configRef.current;\n const source = { apiKey: current.apiKey, token: current.token, getToken: current.getToken };\n const send = async (staleAuth: boolean) => {\n const authHeaders = await resolveStatewireAuthHeaders(source, { staleAuth });\n return fetch(`${agoraApiRoot(current.backendUrl)}${path}`, {\n ...init,\n // With neither a token nor a key, the host signs in with its session\n // cookie, which a request to another origin carries only when asked.\n ...(Object.keys(authHeaders).length === 0 ? { credentials: 'include' as const } : {}),\n headers: { ...Object.fromEntries(new Headers(init.headers).entries()), ...authHeaders },\n });\n };\n const first = await send(false);\n return first.status === 401 && current.getToken ? send(true) : first;\n }, []);\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n // The default opener's tab, opened at the click (see `openPlaceholderTab`).\n const placeholderRef = useRef<Window | null>(null);\n const confirm = useBrowserDecisionConfirmer({\n threadId,\n client: options.client ?? { kind: 'sdk' },\n agoraFetch,\n openUrl: (url) => {\n const custom = optionsRef.current.openUrl;\n if (custom) return custom(url);\n const tab = placeholderRef.current;\n placeholderRef.current = null;\n if (tab && !tab.closed) tab.location.href = url;\n },\n returnUrl: options.returnUrl,\n onPending: options.onPending,\n onOutcome: options.onOutcome,\n });\n return useMemo(() => {\n if (confirm === undefined) return undefined;\n return async (answer: StatewireDecisionAnswer): Promise<string | undefined> => {\n if (optionsRef.current.openUrl) return confirm(answer);\n const tab = openPlaceholderTab();\n // No tab and nowhere to show a link: nothing could reach the check page.\n if (tab === null && !optionsRef.current.onPending) return undefined;\n placeholderRef.current = tab;\n try {\n return await confirm(answer);\n } finally {\n // A check that ended before opening the page leaves no blank tab behind.\n if (placeholderRef.current === tab && tab && !tab.closed) tab.close();\n placeholderRef.current = null;\n }\n };\n }, [confirm]);\n}\n"],"names":["threadId"],"mappings":"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"}
@@ -2,7 +2,7 @@
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 cnfast = require("cnfast");
7
7
  function asQueueEntry(entry) {
8
8
  return {
@@ -13,8 +13,8 @@ function asQueueEntry(entry) {
13
13
  };
14
14
  }
15
15
  function useSecondsLeft(endsAt) {
16
- const [now, setNow] = react.useState(() => Date.now());
17
- react.useEffect(() => {
16
+ const [now, setNow] = require$$0.useState(() => Date.now());
17
+ require$$0.useEffect(() => {
18
18
  if (endsAt === null) return void 0;
19
19
  setNow(Date.now());
20
20
  const timer = setInterval(() => setNow(Date.now()), 250);
@@ -1 +1 @@
1
- {"version":3,"file":"chat-outbox-rows.cjs","sources":["../../src/chat/chat-outbox-rows.tsx"],"sourcesContent":["import type { StatewireThread } from '@assistant-ui/react-statewire';\nimport type {\n ChatOutbox,\n ChatOutboxElsewhere,\n ChatOutboxEntry,\n ChatOutboxRow,\n ChatOutboxSnapshot,\n} from '@athenaintel/agent-runtime';\nimport {\n AlertCircleIcon,\n ClockIcon,\n Loader2Icon,\n MessageSquareIcon,\n RotateCcwIcon,\n SendIcon,\n Trash2Icon,\n} from 'lucide-react';\nimport { type FC, type ReactNode, useEffect, useState } from 'react';\nimport { cn } from '../lib/utils';\n\n/**\n * The messages typed while Athena couldn't be reached, at the top of the queue tray\n * (`@athenaintel/agent-runtime`'s chat outbox): always shown, each marked as not sent, with what\n * happens next and what the person can do about it.\n *\n * - **Not sent yet — sends when Athena is back**, with Cancel (the text goes back to the composer).\n * - **Sending in N s** once Athena is back and the app is in front, with Cancel.\n * - **Waited more than a day**: Send, Edit (back to the composer) or Discard.\n * - **Sending…** while it is handed to the conversation (its attachments asked about first).\n * - **Couldn't send** (an attachment Athena refused, or the hand-off failed): Retry, Edit (back to\n * the composer, attachments and quote included) or Discard; never retried on its own.\n *\n * Below them, the person's other conversations with messages waiting (a chat that never started\n * has no other way back), each with Open where the host can switch conversations.\n */\n\nexport interface ChatOutboxRowsProps {\n outbox: ChatOutbox;\n snapshot: ChatOutboxSnapshot;\n /** The row body (the tray's own renderer, e.g. mention chips); defaults to the plain text. */\n renderContent: (context: { text: string; index: number; item: StatewireThread.RunsQueueEntry }) => ReactNode;\n}\n\n/** The waiting message in the shape the tray's row renderers read. */\nfunction asQueueEntry(entry: ChatOutboxEntry): StatewireThread.RunsQueueEntry {\n return {\n id: entry.id,\n role: 'user',\n parts: [{ type: 'text', text: entry.text }],\n ...(entry.metadata !== undefined && { metadata: entry.metadata }),\n };\n}\n\n/** Whole seconds left on the countdown, re-rendered while it runs (never shows 0 before it fires). */\nfunction useSecondsLeft(endsAt: number | null): number | null {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (endsAt === null) return undefined;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 250);\n return () => clearInterval(timer);\n }, [endsAt]);\n if (endsAt === null) return null;\n return Math.max(1, Math.ceil((endsAt - now) / 1000));\n}\n\nconst STATUS_COPY = {\n waiting: 'Not sent yet — sends when Athena is back',\n ask: 'Not sent for more than a day — send it now?',\n sending: 'Sending…',\n} as const;\n\nconst pillButton =\n 'inline-flex items-center gap-1 rounded-full border px-2 py-1 font-medium text-[10px] transition-colors';\n\nconst RowActions: FC<{ outbox: ChatOutbox; row: ChatOutboxRow }> = ({ outbox, row }) => {\n const { entry, state } = row;\n switch (state.kind) {\n case 'waiting':\n case 'countdown':\n return (\n <button\n type=\"button\"\n aria-label=\"Cancel sending and edit\"\n title=\"Don't send this — put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Cancel\n </button>\n );\n case 'ask':\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Send now\"\n onClick={() => outbox.send(entry.id)}\n className={cn(pillButton, 'border-primary/30 text-primary hover:bg-primary/5')}\n >\n <SendIcon className=\"size-2.5\" />\n Send\n </button>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n title=\"Put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Edit\n </button>\n <button\n type=\"button\"\n aria-label=\"Discard message\"\n onClick={() => outbox.discard(entry.id)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2Icon className=\"size-3\" />\n </button>\n </>\n );\n case 'failed':\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Retry sending\"\n onClick={() => outbox.send(entry.id)}\n className={cn(pillButton, 'border-primary/30 text-primary hover:bg-primary/5')}\n >\n <RotateCcwIcon className=\"size-2.5\" />\n Retry\n </button>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n title=\"Put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Edit\n </button>\n <button\n type=\"button\"\n aria-label=\"Discard message\"\n onClick={() => outbox.discard(entry.id)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2Icon className=\"size-3\" />\n </button>\n </>\n );\n case 'sending':\n return null;\n }\n};\n\nconst RowIcon: FC<{ row: ChatOutboxRow }> = ({ row }) => {\n switch (row.state.kind) {\n case 'sending':\n return <Loader2Icon className=\"mt-0.5 size-3.5 shrink-0 animate-spin text-muted-foreground/60\" />;\n case 'failed':\n return <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0 text-destructive\" />;\n case 'countdown':\n return <SendIcon className=\"mt-0.5 size-3.5 shrink-0 text-primary\" />;\n default:\n return <ClockIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" />;\n }\n};\n\n/** What a screen reader hears: the state of the outbox, never the ticking seconds. */\nfunction announcementOf(snapshot: ChatOutboxSnapshot): string {\n const kinds = new Set(snapshot.rows.map((row) => row.state.kind));\n if (kinds.has('countdown')) return 'Athena is back. Your unsent messages will be sent in a few seconds unless you cancel.';\n if (kinds.has('failed')) return \"A message couldn't be sent. Retry, edit or discard it.\";\n if (kinds.has('ask')) return 'A message waited more than a day. Send, edit or discard it.';\n if (kinds.has('sending')) return 'Sending your unsent messages.';\n return 'Not sent yet. Your messages will be sent when Athena is back.';\n}\n\n/**\n * Every other conversation with waiting messages, each with Open where the host can switch: a chat\n * that never started has no other way back, so none is left out (the list scrolls instead).\n */\nconst ElsewhereRows: FC<{ outbox: ChatOutbox; elsewhere: readonly ChatOutboxElsewhere[] }> = ({\n outbox,\n elsewhere,\n}) => {\n const { openThread } = outbox;\n return (\n <div data-testid=\"athena-chat-outbox-elsewhere\" className=\"px-1 py-1\">\n <p className=\"text-[10px] text-muted-foreground\">Not sent yet in other chats</p>\n <ul aria-label=\"Unsent messages in other chats\" className=\"max-h-24 overflow-y-auto\">\n {elsewhere.map((thread) => (\n <li key={thread.threadId} className=\"flex items-center gap-2 py-0.5\">\n <MessageSquareIcon className=\"size-3 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-foreground/80 text-xs\">{thread.first.text}</span>\n {thread.count > 1 ? (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{thread.count} messages</span>\n ) : null}\n {openThread ? (\n <button\n type=\"button\"\n aria-label=\"Open that chat\"\n onClick={() => openThread({ threadId: thread.threadId, newChat: thread.newChat })}\n className={cn(\n pillButton,\n 'shrink-0 border-border text-foreground/80 hover:bg-background hover:text-foreground',\n )}\n >\n Open\n </button>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport const ChatOutboxRows: FC<ChatOutboxRowsProps> = ({ outbox, snapshot, renderContent }) => {\n const secondsLeft = useSecondsLeft(snapshot.countdownEndsAt);\n if (snapshot.rows.length === 0 && snapshot.elsewhere.length === 0) return null;\n const statusOf = (row: ChatOutboxRow): string => {\n switch (row.state.kind) {\n case 'countdown':\n return `Athena is back — sending in ${secondsLeft ?? 1} s`;\n case 'failed':\n return `Couldn't send. ${row.state.message}`;\n default:\n return STATUS_COPY[row.state.kind];\n }\n };\n return (\n <div data-testid=\"athena-chat-outbox\" className=\"mb-1\">\n {snapshot.rows.length > 0 ? (\n <>\n <p aria-live=\"polite\" className=\"sr-only\">\n {announcementOf(snapshot)}\n </p>\n <ul aria-label=\"Messages not sent yet\" className=\"max-h-40 overflow-y-auto\">\n {snapshot.rows.map((row, index) => (\n <li\n key={row.entry.id}\n data-state={row.state.kind}\n className=\"group flex items-start gap-2 rounded-md px-1 py-1.5 hover:bg-background\"\n >\n <RowIcon row={row} />\n <div className=\"min-w-0 flex-1\">\n {renderContent({ text: row.entry.text, index, item: asQueueEntry(row.entry) })}\n <p\n className={cn(\n 'mt-0.5 text-[10px]',\n row.state.kind === 'failed' ? 'text-destructive' : 'text-muted-foreground',\n )}\n >\n {statusOf(row)}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\" data-testid=\"chat-outbox-row-actions\">\n <RowActions outbox={outbox} row={row} />\n </div>\n </li>\n ))}\n </ul>\n </>\n ) : null}\n {snapshot.durable ? null : (\n <p className=\"px-1 text-[10px] text-muted-foreground\">\n This device can't keep unsent messages — they're lost if you close this page.\n </p>\n )}\n {snapshot.elsewhere.length > 0 ? <ElsewhereRows outbox={outbox} elsewhere={snapshot.elsewhere} /> : null}\n </div>\n );\n};\n"],"names":["useState","useEffect","jsx","cn","jsxs","Fragment","SendIcon","Trash2Icon","RotateCcwIcon","Loader2Icon","AlertCircleIcon","ClockIcon","MessageSquareIcon"],"mappings":"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"}
1
+ {"version":3,"file":"chat-outbox-rows.cjs","sources":["../../src/chat/chat-outbox-rows.tsx"],"sourcesContent":["import type { StatewireThread } from '@assistant-ui/react-statewire';\nimport type {\n ChatOutbox,\n ChatOutboxElsewhere,\n ChatOutboxEntry,\n ChatOutboxRow,\n ChatOutboxSnapshot,\n} from '@athenaintel/agent-runtime';\nimport {\n AlertCircleIcon,\n ClockIcon,\n Loader2Icon,\n MessageSquareIcon,\n RotateCcwIcon,\n SendIcon,\n Trash2Icon,\n} from 'lucide-react';\nimport { type FC, type ReactNode, useEffect, useState } from 'react';\nimport { cn } from '../lib/utils';\n\n/**\n * The messages typed while Athena couldn't be reached, at the top of the queue tray\n * (`@athenaintel/agent-runtime`'s chat outbox): always shown, each marked as not sent, with what\n * happens next and what the person can do about it.\n *\n * - **Not sent yet — sends when Athena is back**, with Cancel (the text goes back to the composer).\n * - **Sending in N s** once Athena is back and the app is in front, with Cancel.\n * - **Waited more than a day**: Send, Edit (back to the composer) or Discard.\n * - **Sending…** while it is handed to the conversation (its attachments asked about first).\n * - **Couldn't send** (an attachment Athena refused, or the hand-off failed): Retry, Edit (back to\n * the composer, attachments and quote included) or Discard; never retried on its own.\n *\n * Below them, the person's other conversations with messages waiting (a chat that never started\n * has no other way back), each with Open where the host can switch conversations.\n */\n\nexport interface ChatOutboxRowsProps {\n outbox: ChatOutbox;\n snapshot: ChatOutboxSnapshot;\n /** The row body (the tray's own renderer, e.g. mention chips); defaults to the plain text. */\n renderContent: (context: { text: string; index: number; item: StatewireThread.RunsQueueEntry }) => ReactNode;\n}\n\n/** The waiting message in the shape the tray's row renderers read. */\nfunction asQueueEntry(entry: ChatOutboxEntry): StatewireThread.RunsQueueEntry {\n return {\n id: entry.id,\n role: 'user',\n parts: [{ type: 'text', text: entry.text }],\n ...(entry.metadata !== undefined && { metadata: entry.metadata }),\n };\n}\n\n/** Whole seconds left on the countdown, re-rendered while it runs (never shows 0 before it fires). */\nfunction useSecondsLeft(endsAt: number | null): number | null {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (endsAt === null) return undefined;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 250);\n return () => clearInterval(timer);\n }, [endsAt]);\n if (endsAt === null) return null;\n return Math.max(1, Math.ceil((endsAt - now) / 1000));\n}\n\nconst STATUS_COPY = {\n waiting: 'Not sent yet — sends when Athena is back',\n ask: 'Not sent for more than a day — send it now?',\n sending: 'Sending…',\n} as const;\n\nconst pillButton =\n 'inline-flex items-center gap-1 rounded-full border px-2 py-1 font-medium text-[10px] transition-colors';\n\nconst RowActions: FC<{ outbox: ChatOutbox; row: ChatOutboxRow }> = ({ outbox, row }) => {\n const { entry, state } = row;\n switch (state.kind) {\n case 'waiting':\n case 'countdown':\n return (\n <button\n type=\"button\"\n aria-label=\"Cancel sending and edit\"\n title=\"Don't send this — put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Cancel\n </button>\n );\n case 'ask':\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Send now\"\n onClick={() => outbox.send(entry.id)}\n className={cn(pillButton, 'border-primary/30 text-primary hover:bg-primary/5')}\n >\n <SendIcon className=\"size-2.5\" />\n Send\n </button>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n title=\"Put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Edit\n </button>\n <button\n type=\"button\"\n aria-label=\"Discard message\"\n onClick={() => outbox.discard(entry.id)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2Icon className=\"size-3\" />\n </button>\n </>\n );\n case 'failed':\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Retry sending\"\n onClick={() => outbox.send(entry.id)}\n className={cn(pillButton, 'border-primary/30 text-primary hover:bg-primary/5')}\n >\n <RotateCcwIcon className=\"size-2.5\" />\n Retry\n </button>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n title=\"Put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Edit\n </button>\n <button\n type=\"button\"\n aria-label=\"Discard message\"\n onClick={() => outbox.discard(entry.id)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2Icon className=\"size-3\" />\n </button>\n </>\n );\n case 'sending':\n return null;\n }\n};\n\nconst RowIcon: FC<{ row: ChatOutboxRow }> = ({ row }) => {\n switch (row.state.kind) {\n case 'sending':\n return <Loader2Icon className=\"mt-0.5 size-3.5 shrink-0 animate-spin text-muted-foreground/60\" />;\n case 'failed':\n return <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0 text-destructive\" />;\n case 'countdown':\n return <SendIcon className=\"mt-0.5 size-3.5 shrink-0 text-primary\" />;\n default:\n return <ClockIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" />;\n }\n};\n\n/** What a screen reader hears: the state of the outbox, never the ticking seconds. */\nfunction announcementOf(snapshot: ChatOutboxSnapshot): string {\n const kinds = new Set(snapshot.rows.map((row) => row.state.kind));\n if (kinds.has('countdown')) return 'Athena is back. Your unsent messages will be sent in a few seconds unless you cancel.';\n if (kinds.has('failed')) return \"A message couldn't be sent. Retry, edit or discard it.\";\n if (kinds.has('ask')) return 'A message waited more than a day. Send, edit or discard it.';\n if (kinds.has('sending')) return 'Sending your unsent messages.';\n return 'Not sent yet. Your messages will be sent when Athena is back.';\n}\n\n/**\n * Every other conversation with waiting messages, each with Open where the host can switch: a chat\n * that never started has no other way back, so none is left out (the list scrolls instead).\n */\nconst ElsewhereRows: FC<{ outbox: ChatOutbox; elsewhere: readonly ChatOutboxElsewhere[] }> = ({\n outbox,\n elsewhere,\n}) => {\n const { openThread } = outbox;\n return (\n <div data-testid=\"athena-chat-outbox-elsewhere\" className=\"px-1 py-1\">\n <p className=\"text-[10px] text-muted-foreground\">Not sent yet in other chats</p>\n <ul aria-label=\"Unsent messages in other chats\" className=\"max-h-24 overflow-y-auto\">\n {elsewhere.map((thread) => (\n <li key={thread.threadId} className=\"flex items-center gap-2 py-0.5\">\n <MessageSquareIcon className=\"size-3 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-foreground/80 text-xs\">{thread.first.text}</span>\n {thread.count > 1 ? (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{thread.count} messages</span>\n ) : null}\n {openThread ? (\n <button\n type=\"button\"\n aria-label=\"Open that chat\"\n onClick={() => openThread({ threadId: thread.threadId, newChat: thread.newChat })}\n className={cn(\n pillButton,\n 'shrink-0 border-border text-foreground/80 hover:bg-background hover:text-foreground',\n )}\n >\n Open\n </button>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport const ChatOutboxRows: FC<ChatOutboxRowsProps> = ({ outbox, snapshot, renderContent }) => {\n const secondsLeft = useSecondsLeft(snapshot.countdownEndsAt);\n if (snapshot.rows.length === 0 && snapshot.elsewhere.length === 0) return null;\n const statusOf = (row: ChatOutboxRow): string => {\n switch (row.state.kind) {\n case 'countdown':\n return `Athena is back — sending in ${secondsLeft ?? 1} s`;\n case 'failed':\n return `Couldn't send. ${row.state.message}`;\n default:\n return STATUS_COPY[row.state.kind];\n }\n };\n return (\n <div data-testid=\"athena-chat-outbox\" className=\"mb-1\">\n {snapshot.rows.length > 0 ? (\n <>\n <p aria-live=\"polite\" className=\"sr-only\">\n {announcementOf(snapshot)}\n </p>\n <ul aria-label=\"Messages not sent yet\" className=\"max-h-40 overflow-y-auto\">\n {snapshot.rows.map((row, index) => (\n <li\n key={row.entry.id}\n data-state={row.state.kind}\n className=\"group flex items-start gap-2 rounded-md px-1 py-1.5 hover:bg-background\"\n >\n <RowIcon row={row} />\n <div className=\"min-w-0 flex-1\">\n {renderContent({ text: row.entry.text, index, item: asQueueEntry(row.entry) })}\n <p\n className={cn(\n 'mt-0.5 text-[10px]',\n row.state.kind === 'failed' ? 'text-destructive' : 'text-muted-foreground',\n )}\n >\n {statusOf(row)}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\" data-testid=\"chat-outbox-row-actions\">\n <RowActions outbox={outbox} row={row} />\n </div>\n </li>\n ))}\n </ul>\n </>\n ) : null}\n {snapshot.durable ? null : (\n <p className=\"px-1 text-[10px] text-muted-foreground\">\n This device can't keep unsent messages — they're lost if you close this page.\n </p>\n )}\n {snapshot.elsewhere.length > 0 ? <ElsewhereRows outbox={outbox} elsewhere={snapshot.elsewhere} /> : null}\n </div>\n );\n};\n"],"names":["useState","useEffect","jsx","cn","jsxs","Fragment","SendIcon","Trash2Icon","RotateCcwIcon","Loader2Icon","AlertCircleIcon","ClockIcon","MessageSquareIcon"],"mappings":"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"}