@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
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const lucideReact = require("lucide-react");
5
5
  const reactQuery = require("@tanstack/react-query");
6
- const react = require("react");
6
+ const require$$0 = require("react");
7
7
  const useAthenaRestQuery = require("../lib/use-athena-rest-query.cjs");
8
8
  const credentialRenewal = require("../runtime/credential-renewal.cjs");
9
9
  const popover = require("../ui/popover.cjs");
@@ -30,9 +30,9 @@ function useAthenaInboxUnreadCount() {
30
30
  };
31
31
  }
32
32
  function useInboxDismiss(refresh) {
33
- const live = react.useContext(statewireThreadList.AthenaSessionsLiveContext);
33
+ const live = require$$0.useContext(statewireThreadList.AthenaSessionsLiveContext);
34
34
  const queryClient = useAthenaRestQuery.useAthenaQueryClient();
35
- const [hidden, setHidden] = react.useState(() => /* @__PURE__ */ new Set());
35
+ const [hidden, setHidden] = require$$0.useState(() => /* @__PURE__ */ new Set());
36
36
  const mutation = reactQuery.useMutation(
37
37
  {
38
38
  mutationKey: ["athena-sdk", "inbox-dismiss", (live == null ? void 0 : live.backendUrl) ?? "", (live == null ? void 0 : live.principal) ?? ""],
@@ -136,7 +136,7 @@ function InboxBody({
136
136
  list
137
137
  }) {
138
138
  var _a;
139
- const [tab, setTab] = react.useState(defaultTab);
139
+ const [tab, setTab] = require$$0.useState(defaultTab);
140
140
  const all = useAthenaSessions.useAthenaSessions({ query: INBOX_QUERY, pageSize: INBOX_PAGE_SIZE });
141
141
  const unread = useAthenaSessions.useAthenaSessions({ query: INBOX_UNREAD_QUERY, pageSize: INBOX_PAGE_SIZE });
142
142
  const shown = tab === "unread" ? unread : all;
@@ -145,7 +145,7 @@ function InboxBody({
145
145
  };
146
146
  const dismissal = useInboxDismiss(refreshBoth);
147
147
  const canDismiss = ((_a = shown.supportedFilters) == null ? void 0 : _a.has("exclude_dismissed")) ?? false;
148
- const rows = react.useMemo(
148
+ const rows = require$$0.useMemo(
149
149
  () => shown.rows.filter((row) => !dismissal.hidden.has(row.id)),
150
150
  [shown.rows, dismissal.hidden]
151
151
  );
@@ -235,12 +235,12 @@ function InboxBody({
235
235
  }
236
236
  function Inbox(props) {
237
237
  const list = statewireThreadList.useAthenaStatewireThreadList();
238
- const live = react.useContext(statewireThreadList.AthenaSessionsLiveContext);
238
+ const live = require$$0.useContext(statewireThreadList.AthenaSessionsLiveContext);
239
239
  if (!list || !live) return null;
240
240
  return /* @__PURE__ */ jsxRuntime.jsx(InboxBody, { ...props, list });
241
241
  }
242
242
  function InboxButtonBody({ className, panelClassName, align = "end", onOpenSession, ...inboxProps }) {
243
- const [open, setOpen] = react.useState(false);
243
+ const [open, setOpen] = require$$0.useState(false);
244
244
  const unread = useAthenaInboxUnreadCount();
245
245
  return /* @__PURE__ */ jsxRuntime.jsxs(popover.Popover, { open, onOpenChange: setOpen, children: [
246
246
  /* @__PURE__ */ jsxRuntime.jsx(popover.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
@@ -280,7 +280,7 @@ function InboxButtonBody({ className, panelClassName, align = "end", onOpenSessi
280
280
  ] });
281
281
  }
282
282
  function InboxButton(props) {
283
- const live = react.useContext(statewireThreadList.AthenaSessionsLiveContext);
283
+ const live = require$$0.useContext(statewireThreadList.AthenaSessionsLiveContext);
284
284
  if (!live) return null;
285
285
  return /* @__PURE__ */ jsxRuntime.jsx(InboxButtonBody, { ...props });
286
286
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Inbox.cjs","sources":["../../src/threads/Inbox.tsx"],"sourcesContent":["/**\n * `Inbox` and `InboxButton` — the Devin-style notifications inbox over the\n * session list, with no endpoint of its own:\n *\n * - **What is in it.** The viewer's own sessions, newest activity first, minus\n * the ones dismissed from the inbox — the same set Athena's inbox shows —\n * read through `POST /api/conversations/threads/list` with\n * `created_by_me` + `exclude_dismissed` (+ `unread_only` for the Unread\n * tab). Each row is the session's title, its latest message, a state chip\n * (Needs you / Working / PR merged / Answered …) and an unread dot.\n * - **Live.** The rows fold the per-user conversation index like every other\n * list under the provider, so a session flipping to \"needs you\" or getting\n * a new message moves in place.\n * - **Writes.** Opening a row (or \"Mark read\") stores the read receipt through\n * `POST /api/conversations/threads/read-state`; \"Dismiss\" uses\n * `POST /api/conversations/threads/notifications/dismiss` (EDIT on the\n * session — a dismissed session comes back with its next message).\n * - **Counts.** The unread badge counts the unread page (50 rows); past that\n * it reads `50+`.\n *\n * Renders nothing outside `<AthenaProvider enableThreadList>`.\n */\nimport { BellIcon, CheckCheckIcon, MailIcon, MailOpenIcon, XIcon } from 'lucide-react';\nimport { useMutation } from '@tanstack/react-query';\nimport type { FC } from 'react';\nimport { useContext, useMemo, useState } from 'react';\nimport { cn } from '../lib/utils';\nimport { useAthenaQueryClient } from '../lib/use-athena-rest-query';\nimport { withCredentialRenewal } from '../runtime/credential-renewal';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { dismissThreadFromInbox } from './api';\nimport { SessionListSkeleton, type SessionOpenTarget } from './SessionList';\nimport { relativeTime } from './session-list-model';\nimport { FOCUS_RING_CLASS, RowIconButton, StatusChip } from './session-row-parts';\nimport { inboxStateChip, plainExcerpt } from './sessions-page-model';\nimport type { AthenaSessionsQuery } from './sessions-query';\nimport {\n AthenaSessionsLiveContext,\n type AthenaStatewireThreadListState,\n type AthenaStatewireThreadSummary,\n useAthenaStatewireThreadList,\n} from './statewire-thread-list';\nimport { type AthenaSessionsList, useAthenaSessions } from './use-athena-sessions';\n\n/** The inbox's sessions: the viewer's own, not dismissed, newest activity first. */\nexport const INBOX_QUERY: AthenaSessionsQuery = { createdByMe: true, excludeDismissed: true };\n/** The Unread tab, and what the badge counts. */\nexport const INBOX_UNREAD_QUERY: AthenaSessionsQuery = { ...INBOX_QUERY, unreadOnly: true };\n\n/** Rows per inbox page — and the badge's ceiling before it reads `50+`. */\nexport const INBOX_PAGE_SIZE = 50;\n\nexport type InboxTab = 'all' | 'unread';\n\nexport interface AthenaInboxUnreadCount {\n /** Unread sessions loaded (at most one page). */\n count: number;\n /** More unread sessions exist beyond `count`. */\n hasMore: boolean;\n /** `count` with `+` when there are more, `''` for none. */\n label: string;\n isAvailable: boolean;\n}\n\n/** The unread count the inbox badge shows; shares the Unread tab's cache. */\nexport function useAthenaInboxUnreadCount(): AthenaInboxUnreadCount {\n const unread = useAthenaSessions({ query: INBOX_UNREAD_QUERY, pageSize: INBOX_PAGE_SIZE });\n const count = unread.rows.length;\n const hasMore = unread.hasNextPage;\n return {\n count,\n hasMore,\n label: count === 0 ? '' : `${count}${hasMore ? '+' : ''}`,\n isAvailable: unread.isAvailable,\n };\n}\n\n/** Dismiss from the inbox: hidden at once, back on failure, the inbox lists refreshed after. */\nfunction useInboxDismiss(refresh: () => Promise<void>) {\n const live = useContext(AthenaSessionsLiveContext);\n const queryClient = useAthenaQueryClient();\n const [hidden, setHidden] = useState<ReadonlySet<string>>(() => new Set());\n const mutation = useMutation(\n {\n mutationKey: ['athena-sdk', 'inbox-dismiss', live?.backendUrl ?? '', live?.principal ?? ''],\n mutationFn: async (threadId: string) => {\n if (!live) throw new Error('[AthenaSDK] The inbox needs enableThreadList.');\n return withCredentialRenewal(live.getAuth, (auth) =>\n dismissThreadFromInbox(live.backendUrl, auth, { threadId, dismissed: true }),\n );\n },\n onMutate: (threadId) => setHidden((current) => new Set(current).add(threadId)),\n // The local hide only bridges the write and the refresh after it: once\n // the inbox has re-read, the server decides — a dismissed session comes\n // back with its next message, and a failed dismiss shows it again.\n onSettled: async (_result, _error, threadId) => {\n try {\n await refresh();\n } finally {\n setHidden((current) => {\n if (!current.has(threadId)) return current;\n const next = new Set(current);\n next.delete(threadId);\n return next;\n });\n }\n },\n },\n queryClient,\n );\n return { hidden, dismiss: mutation.mutate, pending: mutation.isPending };\n}\n\nconst InboxRow: FC<{\n row: AthenaStatewireThreadSummary;\n isActive: boolean;\n list: AthenaStatewireThreadListState;\n onOpen: (row: AthenaStatewireThreadSummary) => void;\n onDismiss: ((threadId: string) => void) | null;\n}> = ({ row, isActive, list, onOpen, onDismiss }) => {\n const chip = inboxStateChip(row);\n const excerpt = plainExcerpt(row.preview);\n return (\n <li\n data-thread-id={row.id}\n data-unread={row.isUnread || undefined}\n className={cn(\n 'group relative flex items-start gap-2 rounded-lg transition-colors hover:bg-muted/40',\n isActive && 'bg-muted',\n )}\n >\n <button\n type=\"button\"\n onClick={() => onOpen(row)}\n className={cn('flex min-w-0 flex-1 items-start gap-2 rounded-lg p-2 pl-2.5 text-left', FOCUS_RING_CLASS)}\n >\n <span\n role={row.isUnread ? 'img' : undefined}\n aria-label={row.isUnread ? 'Unread' : undefined}\n aria-hidden={row.isUnread ? undefined : true}\n className={cn('mt-1.5 size-2 shrink-0 rounded-full', row.isUnread ? 'bg-primary' : 'bg-transparent')}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-2\">\n <span\n data-title\n className={cn('min-w-0 flex-1 truncate text-foreground text-sm', row.isUnread ? 'font-semibold' : 'font-medium')}\n >\n {row.title ?? 'Untitled'}\n </span>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{relativeTime(row.updatedAt)}</span>\n </span>\n {excerpt ? (\n <span data-excerpt className=\"mt-0.5 line-clamp-2 break-words text-muted-foreground text-xs\">\n {excerpt}\n </span>\n ) : null}\n <span className=\"mt-1 flex\">\n <StatusChip label={chip.label} tone={chip.tone} detail={row.nextAction} />\n </span>\n </span>\n </button>\n <div data-row-actions className=\"flex shrink-0 items-center gap-0.5 py-2 pr-2\">\n <RowIconButton\n label={row.isUnread ? 'Mark read' : 'Mark unread'}\n action=\"read-state\"\n pending={list.readStatePendingThreadIds.has(row.id)}\n onClick={() =>\n list.setReadState({ threadId: row.id, isUnread: !row.isUnread, updatedAt: row.updatedAt })\n }\n >\n {row.isUnread ? <MailOpenIcon className=\"size-3.5\" aria-hidden /> : <MailIcon className=\"size-3.5\" aria-hidden />}\n </RowIconButton>\n {onDismiss ? (\n <RowIconButton label=\"Dismiss from inbox\" action=\"dismiss\" onClick={() => onDismiss(row.id)}>\n <XIcon className=\"size-3.5\" aria-hidden />\n </RowIconButton>\n ) : null}\n </div>\n </li>\n );\n};\n\nexport interface InboxProps {\n className?: string;\n /** Heading (default \"Inbox\"). */\n title?: string;\n /** The tab it opens on (default `all`). */\n defaultTab?: InboxTab;\n /** Called after a row is opened (selected and marked read), so a host can show its chat. */\n onOpenSession?: (target: SessionOpenTarget) => void;\n}\n\nfunction InboxBody({\n className,\n title = 'Inbox',\n defaultTab = 'all',\n onOpenSession,\n list,\n}: InboxProps & { list: AthenaStatewireThreadListState }) {\n const [tab, setTab] = useState<InboxTab>(defaultTab);\n const all = useAthenaSessions({ query: INBOX_QUERY, pageSize: INBOX_PAGE_SIZE });\n const unread = useAthenaSessions({ query: INBOX_UNREAD_QUERY, pageSize: INBOX_PAGE_SIZE });\n const shown: AthenaSessionsList = tab === 'unread' ? unread : all;\n const refreshBoth = async () => {\n await Promise.all([all.refresh(), unread.refresh()]);\n };\n const dismissal = useInboxDismiss(refreshBoth);\n // Dismissal is only offered where the server can leave dismissed sessions\n // out of the inbox; elsewhere a dismissed row would stay in the list.\n const canDismiss = shown.supportedFilters?.has('exclude_dismissed') ?? false;\n const rows = useMemo(\n () => shown.rows.filter((row) => !dismissal.hidden.has(row.id)),\n [shown.rows, dismissal.hidden],\n );\n const unreadRows = unread.rows.filter((row) => !dismissal.hidden.has(row.id));\n // A tab shows its count only once its list has answered: until then its\n // rows are empty because nothing has been read, not because there are none.\n const tabCount = ({ tabList, count }: { tabList: AthenaSessionsList; count: number }) =>\n tabList.hasResolvedFirstPage ? `${count}${tabList.hasNextPage ? '+' : ''}` : '';\n const unreadLabel = tabCount({ tabList: unread, count: unreadRows.length });\n const allLabel = tabCount({\n tabList: all,\n count: all.rows.filter((row) => !dismissal.hidden.has(row.id)).length,\n });\n\n const open = (row: AthenaStatewireThreadSummary) => {\n list.selectThread(row.id);\n if (row.isUnread) {\n list.setReadState({ threadId: row.id, isUnread: false, updatedAt: row.updatedAt });\n }\n onOpenSession?.({ threadId: row.id, title: row.title });\n };\n const markAllRead = () => {\n for (const row of unreadRows) {\n list.setReadState({ threadId: row.id, isUnread: false, updatedAt: row.updatedAt });\n }\n };\n const showSkeleton = rows.length === 0 && (!shown.hasResolvedFirstPage || shown.isFetching);\n const notice =\n shown.unavailableFields.length > 0\n ? 'This Athena server cannot narrow the inbox to your own, undismissed sessions yet, so it lists every session you can see.'\n : null;\n\n const tabClass = (active: boolean) =>\n cn(\n 'inline-flex h-7 items-center gap-1.5 rounded-md px-2.5 font-medium text-xs transition-colors',\n active ? 'bg-muted text-foreground' : 'text-muted-foreground hover:text-foreground',\n FOCUS_RING_CLASS,\n );\n\n return (\n <div data-testid=\"inbox\" className={cn('athena-sdk-chrome flex min-h-0 flex-col gap-2', className)}>\n <div className=\"flex items-center gap-2 px-1\">\n <h2 className=\"font-semibold text-foreground text-sm\">{title}</h2>\n <div role=\"tablist\" aria-label=\"Inbox\" className=\"flex items-center gap-0.5\">\n <button type=\"button\" role=\"tab\" aria-selected={tab === 'all'} onClick={() => setTab('all')} className={tabClass(tab === 'all')}>\n All\n <span data-testid=\"inbox-all-count\" className=\"text-muted-foreground\">\n {allLabel}\n </span>\n </button>\n <button type=\"button\" role=\"tab\" aria-selected={tab === 'unread'} onClick={() => setTab('unread')} className={tabClass(tab === 'unread')}>\n Unread\n <span data-testid=\"inbox-unread-count\" className=\"text-muted-foreground\">\n {unreadLabel}\n </span>\n </button>\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={markAllRead}\n disabled={unreadRows.length === 0}\n className={cn(\n 'inline-flex h-7 items-center gap-1 rounded-md px-2 text-muted-foreground text-xs transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n title=\"Mark the loaded unread sessions read\"\n >\n <CheckCheckIcon className=\"size-3.5\" aria-hidden />\n Mark all read\n </button>\n </div>\n {notice ? (\n <p role=\"status\" data-testid=\"inbox-degraded\" className=\"mx-1 rounded-md border border-amber-200 bg-amber-50 px-2.5 py-1.5 text-[11px] text-amber-900\">\n {notice}\n </p>\n ) : null}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {showSkeleton ? (\n <SessionListSkeleton rows={4} />\n ) : rows.length === 0 ? (\n <p data-testid=\"inbox-empty\" className=\"px-3 py-8 text-center text-muted-foreground text-xs\">\n {tab === 'unread' ? 'You are all caught up.' : 'Nothing in your inbox.'}\n </p>\n ) : (\n <ul className=\"flex flex-col gap-0.5\" aria-busy={shown.isFetching || undefined}>\n {rows.map((row) => (\n <InboxRow\n key={row.id}\n row={row}\n isActive={row.id === list.activeThreadId}\n list={list}\n onOpen={open}\n onDismiss={canDismiss ? dismissal.dismiss : null}\n />\n ))}\n </ul>\n )}\n {shown.hasNextPage && !showSkeleton ? (\n <button\n type=\"button\"\n onClick={shown.fetchNextPage}\n disabled={shown.isFetchingNextPage}\n className={cn('mt-1 w-full rounded-md py-2 text-muted-foreground text-xs transition-colors hover:bg-muted disabled:opacity-50', FOCUS_RING_CLASS)}\n >\n {shown.isFetchingNextPage ? 'Loading…' : 'Load more'}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\n/**\n * The notifications inbox: All / Unread tabs with counts, rows of title,\n * latest message, state chip and unread dot, mark read / mark all read and\n * dismiss. Renders nothing outside `<AthenaProvider enableThreadList>`.\n */\nexport function Inbox(props: InboxProps) {\n const list = useAthenaStatewireThreadList();\n const live = useContext(AthenaSessionsLiveContext);\n if (!list || !live) return null;\n return <InboxBody {...props} list={list} />;\n}\n\nexport interface InboxButtonProps extends Omit<InboxProps, 'className'> {\n className?: string;\n /** Classes for the popover panel. */\n panelClassName?: string;\n align?: 'start' | 'center' | 'end';\n}\n\nfunction InboxButtonBody({ className, panelClassName, align = 'end', onOpenSession, ...inboxProps }: InboxButtonProps) {\n const [open, setOpen] = useState(false);\n const unread = useAthenaInboxUnreadCount();\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={unread.count > 0 ? `Inbox, ${unread.label} unread` : 'Inbox'}\n data-testid=\"inbox-button\"\n className={cn(\n 'relative inline-flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground',\n FOCUS_RING_CLASS,\n className,\n )}\n >\n <BellIcon className=\"size-4\" aria-hidden />\n {unread.count > 0 ? (\n <span\n data-testid=\"inbox-badge\"\n className=\"absolute -top-0.5 -right-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-primary px-1 font-semibold text-[10px] text-primary-foreground leading-none\"\n >\n {unread.label}\n </span>\n ) : null}\n </button>\n </PopoverTrigger>\n <PopoverContent align={align} className={cn('flex max-h-[70vh] w-96 flex-col p-2', panelClassName)}>\n <Inbox\n {...inboxProps}\n onOpenSession={(target) => {\n setOpen(false);\n onOpenSession?.(target);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\n/**\n * A bell with the unread count that opens `Inbox` in a popover. Renders\n * nothing outside `<AthenaProvider enableThreadList>`.\n */\nexport function InboxButton(props: InboxButtonProps) {\n const live = useContext(AthenaSessionsLiveContext);\n if (!live) return null;\n return <InboxButtonBody {...props} />;\n}\n"],"names":["useAthenaSessions","useContext","AthenaSessionsLiveContext","useAthenaQueryClient","useState","useMutation","withCredentialRenewal","dismissThreadFromInbox","inboxStateChip","plainExcerpt","jsxs","cn","FOCUS_RING_CLASS","jsx","relativeTime","StatusChip","RowIconButton","MailOpenIcon","MailIcon","XIcon","useMemo","CheckCheckIcon","SessionListSkeleton","useAthenaStatewireThreadList","Popover","PopoverTrigger","BellIcon","PopoverContent"],"mappings":"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"}
1
+ {"version":3,"file":"Inbox.cjs","sources":["../../src/threads/Inbox.tsx"],"sourcesContent":["/**\n * `Inbox` and `InboxButton` — the Devin-style notifications inbox over the\n * session list, with no endpoint of its own:\n *\n * - **What is in it.** The viewer's own sessions, newest activity first, minus\n * the ones dismissed from the inbox — the same set Athena's inbox shows —\n * read through `POST /api/conversations/threads/list` with\n * `created_by_me` + `exclude_dismissed` (+ `unread_only` for the Unread\n * tab). Each row is the session's title, its latest message, a state chip\n * (Needs you / Working / PR merged / Answered …) and an unread dot.\n * - **Live.** The rows fold the per-user conversation index like every other\n * list under the provider, so a session flipping to \"needs you\" or getting\n * a new message moves in place.\n * - **Writes.** Opening a row (or \"Mark read\") stores the read receipt through\n * `POST /api/conversations/threads/read-state`; \"Dismiss\" uses\n * `POST /api/conversations/threads/notifications/dismiss` (EDIT on the\n * session — a dismissed session comes back with its next message).\n * - **Counts.** The unread badge counts the unread page (50 rows); past that\n * it reads `50+`.\n *\n * Renders nothing outside `<AthenaProvider enableThreadList>`.\n */\nimport { BellIcon, CheckCheckIcon, MailIcon, MailOpenIcon, XIcon } from 'lucide-react';\nimport { useMutation } from '@tanstack/react-query';\nimport type { FC } from 'react';\nimport { useContext, useMemo, useState } from 'react';\nimport { cn } from '../lib/utils';\nimport { useAthenaQueryClient } from '../lib/use-athena-rest-query';\nimport { withCredentialRenewal } from '../runtime/credential-renewal';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { dismissThreadFromInbox } from './api';\nimport { SessionListSkeleton, type SessionOpenTarget } from './SessionList';\nimport { relativeTime } from './session-list-model';\nimport { FOCUS_RING_CLASS, RowIconButton, StatusChip } from './session-row-parts';\nimport { inboxStateChip, plainExcerpt } from './sessions-page-model';\nimport type { AthenaSessionsQuery } from './sessions-query';\nimport {\n AthenaSessionsLiveContext,\n type AthenaStatewireThreadListState,\n type AthenaStatewireThreadSummary,\n useAthenaStatewireThreadList,\n} from './statewire-thread-list';\nimport { type AthenaSessionsList, useAthenaSessions } from './use-athena-sessions';\n\n/** The inbox's sessions: the viewer's own, not dismissed, newest activity first. */\nexport const INBOX_QUERY: AthenaSessionsQuery = { createdByMe: true, excludeDismissed: true };\n/** The Unread tab, and what the badge counts. */\nexport const INBOX_UNREAD_QUERY: AthenaSessionsQuery = { ...INBOX_QUERY, unreadOnly: true };\n\n/** Rows per inbox page — and the badge's ceiling before it reads `50+`. */\nexport const INBOX_PAGE_SIZE = 50;\n\nexport type InboxTab = 'all' | 'unread';\n\nexport interface AthenaInboxUnreadCount {\n /** Unread sessions loaded (at most one page). */\n count: number;\n /** More unread sessions exist beyond `count`. */\n hasMore: boolean;\n /** `count` with `+` when there are more, `''` for none. */\n label: string;\n isAvailable: boolean;\n}\n\n/** The unread count the inbox badge shows; shares the Unread tab's cache. */\nexport function useAthenaInboxUnreadCount(): AthenaInboxUnreadCount {\n const unread = useAthenaSessions({ query: INBOX_UNREAD_QUERY, pageSize: INBOX_PAGE_SIZE });\n const count = unread.rows.length;\n const hasMore = unread.hasNextPage;\n return {\n count,\n hasMore,\n label: count === 0 ? '' : `${count}${hasMore ? '+' : ''}`,\n isAvailable: unread.isAvailable,\n };\n}\n\n/** Dismiss from the inbox: hidden at once, back on failure, the inbox lists refreshed after. */\nfunction useInboxDismiss(refresh: () => Promise<void>) {\n const live = useContext(AthenaSessionsLiveContext);\n const queryClient = useAthenaQueryClient();\n const [hidden, setHidden] = useState<ReadonlySet<string>>(() => new Set());\n const mutation = useMutation(\n {\n mutationKey: ['athena-sdk', 'inbox-dismiss', live?.backendUrl ?? '', live?.principal ?? ''],\n mutationFn: async (threadId: string) => {\n if (!live) throw new Error('[AthenaSDK] The inbox needs enableThreadList.');\n return withCredentialRenewal(live.getAuth, (auth) =>\n dismissThreadFromInbox(live.backendUrl, auth, { threadId, dismissed: true }),\n );\n },\n onMutate: (threadId) => setHidden((current) => new Set(current).add(threadId)),\n // The local hide only bridges the write and the refresh after it: once\n // the inbox has re-read, the server decides — a dismissed session comes\n // back with its next message, and a failed dismiss shows it again.\n onSettled: async (_result, _error, threadId) => {\n try {\n await refresh();\n } finally {\n setHidden((current) => {\n if (!current.has(threadId)) return current;\n const next = new Set(current);\n next.delete(threadId);\n return next;\n });\n }\n },\n },\n queryClient,\n );\n return { hidden, dismiss: mutation.mutate, pending: mutation.isPending };\n}\n\nconst InboxRow: FC<{\n row: AthenaStatewireThreadSummary;\n isActive: boolean;\n list: AthenaStatewireThreadListState;\n onOpen: (row: AthenaStatewireThreadSummary) => void;\n onDismiss: ((threadId: string) => void) | null;\n}> = ({ row, isActive, list, onOpen, onDismiss }) => {\n const chip = inboxStateChip(row);\n const excerpt = plainExcerpt(row.preview);\n return (\n <li\n data-thread-id={row.id}\n data-unread={row.isUnread || undefined}\n className={cn(\n 'group relative flex items-start gap-2 rounded-lg transition-colors hover:bg-muted/40',\n isActive && 'bg-muted',\n )}\n >\n <button\n type=\"button\"\n onClick={() => onOpen(row)}\n className={cn('flex min-w-0 flex-1 items-start gap-2 rounded-lg p-2 pl-2.5 text-left', FOCUS_RING_CLASS)}\n >\n <span\n role={row.isUnread ? 'img' : undefined}\n aria-label={row.isUnread ? 'Unread' : undefined}\n aria-hidden={row.isUnread ? undefined : true}\n className={cn('mt-1.5 size-2 shrink-0 rounded-full', row.isUnread ? 'bg-primary' : 'bg-transparent')}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-2\">\n <span\n data-title\n className={cn('min-w-0 flex-1 truncate text-foreground text-sm', row.isUnread ? 'font-semibold' : 'font-medium')}\n >\n {row.title ?? 'Untitled'}\n </span>\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">{relativeTime(row.updatedAt)}</span>\n </span>\n {excerpt ? (\n <span data-excerpt className=\"mt-0.5 line-clamp-2 break-words text-muted-foreground text-xs\">\n {excerpt}\n </span>\n ) : null}\n <span className=\"mt-1 flex\">\n <StatusChip label={chip.label} tone={chip.tone} detail={row.nextAction} />\n </span>\n </span>\n </button>\n <div data-row-actions className=\"flex shrink-0 items-center gap-0.5 py-2 pr-2\">\n <RowIconButton\n label={row.isUnread ? 'Mark read' : 'Mark unread'}\n action=\"read-state\"\n pending={list.readStatePendingThreadIds.has(row.id)}\n onClick={() =>\n list.setReadState({ threadId: row.id, isUnread: !row.isUnread, updatedAt: row.updatedAt })\n }\n >\n {row.isUnread ? <MailOpenIcon className=\"size-3.5\" aria-hidden /> : <MailIcon className=\"size-3.5\" aria-hidden />}\n </RowIconButton>\n {onDismiss ? (\n <RowIconButton label=\"Dismiss from inbox\" action=\"dismiss\" onClick={() => onDismiss(row.id)}>\n <XIcon className=\"size-3.5\" aria-hidden />\n </RowIconButton>\n ) : null}\n </div>\n </li>\n );\n};\n\nexport interface InboxProps {\n className?: string;\n /** Heading (default \"Inbox\"). */\n title?: string;\n /** The tab it opens on (default `all`). */\n defaultTab?: InboxTab;\n /** Called after a row is opened (selected and marked read), so a host can show its chat. */\n onOpenSession?: (target: SessionOpenTarget) => void;\n}\n\nfunction InboxBody({\n className,\n title = 'Inbox',\n defaultTab = 'all',\n onOpenSession,\n list,\n}: InboxProps & { list: AthenaStatewireThreadListState }) {\n const [tab, setTab] = useState<InboxTab>(defaultTab);\n const all = useAthenaSessions({ query: INBOX_QUERY, pageSize: INBOX_PAGE_SIZE });\n const unread = useAthenaSessions({ query: INBOX_UNREAD_QUERY, pageSize: INBOX_PAGE_SIZE });\n const shown: AthenaSessionsList = tab === 'unread' ? unread : all;\n const refreshBoth = async () => {\n await Promise.all([all.refresh(), unread.refresh()]);\n };\n const dismissal = useInboxDismiss(refreshBoth);\n // Dismissal is only offered where the server can leave dismissed sessions\n // out of the inbox; elsewhere a dismissed row would stay in the list.\n const canDismiss = shown.supportedFilters?.has('exclude_dismissed') ?? false;\n const rows = useMemo(\n () => shown.rows.filter((row) => !dismissal.hidden.has(row.id)),\n [shown.rows, dismissal.hidden],\n );\n const unreadRows = unread.rows.filter((row) => !dismissal.hidden.has(row.id));\n // A tab shows its count only once its list has answered: until then its\n // rows are empty because nothing has been read, not because there are none.\n const tabCount = ({ tabList, count }: { tabList: AthenaSessionsList; count: number }) =>\n tabList.hasResolvedFirstPage ? `${count}${tabList.hasNextPage ? '+' : ''}` : '';\n const unreadLabel = tabCount({ tabList: unread, count: unreadRows.length });\n const allLabel = tabCount({\n tabList: all,\n count: all.rows.filter((row) => !dismissal.hidden.has(row.id)).length,\n });\n\n const open = (row: AthenaStatewireThreadSummary) => {\n list.selectThread(row.id);\n if (row.isUnread) {\n list.setReadState({ threadId: row.id, isUnread: false, updatedAt: row.updatedAt });\n }\n onOpenSession?.({ threadId: row.id, title: row.title });\n };\n const markAllRead = () => {\n for (const row of unreadRows) {\n list.setReadState({ threadId: row.id, isUnread: false, updatedAt: row.updatedAt });\n }\n };\n const showSkeleton = rows.length === 0 && (!shown.hasResolvedFirstPage || shown.isFetching);\n const notice =\n shown.unavailableFields.length > 0\n ? 'This Athena server cannot narrow the inbox to your own, undismissed sessions yet, so it lists every session you can see.'\n : null;\n\n const tabClass = (active: boolean) =>\n cn(\n 'inline-flex h-7 items-center gap-1.5 rounded-md px-2.5 font-medium text-xs transition-colors',\n active ? 'bg-muted text-foreground' : 'text-muted-foreground hover:text-foreground',\n FOCUS_RING_CLASS,\n );\n\n return (\n <div data-testid=\"inbox\" className={cn('athena-sdk-chrome flex min-h-0 flex-col gap-2', className)}>\n <div className=\"flex items-center gap-2 px-1\">\n <h2 className=\"font-semibold text-foreground text-sm\">{title}</h2>\n <div role=\"tablist\" aria-label=\"Inbox\" className=\"flex items-center gap-0.5\">\n <button type=\"button\" role=\"tab\" aria-selected={tab === 'all'} onClick={() => setTab('all')} className={tabClass(tab === 'all')}>\n All\n <span data-testid=\"inbox-all-count\" className=\"text-muted-foreground\">\n {allLabel}\n </span>\n </button>\n <button type=\"button\" role=\"tab\" aria-selected={tab === 'unread'} onClick={() => setTab('unread')} className={tabClass(tab === 'unread')}>\n Unread\n <span data-testid=\"inbox-unread-count\" className=\"text-muted-foreground\">\n {unreadLabel}\n </span>\n </button>\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={markAllRead}\n disabled={unreadRows.length === 0}\n className={cn(\n 'inline-flex h-7 items-center gap-1 rounded-md px-2 text-muted-foreground text-xs transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n title=\"Mark the loaded unread sessions read\"\n >\n <CheckCheckIcon className=\"size-3.5\" aria-hidden />\n Mark all read\n </button>\n </div>\n {notice ? (\n <p role=\"status\" data-testid=\"inbox-degraded\" className=\"mx-1 rounded-md border border-amber-200 bg-amber-50 px-2.5 py-1.5 text-[11px] text-amber-900\">\n {notice}\n </p>\n ) : null}\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {showSkeleton ? (\n <SessionListSkeleton rows={4} />\n ) : rows.length === 0 ? (\n <p data-testid=\"inbox-empty\" className=\"px-3 py-8 text-center text-muted-foreground text-xs\">\n {tab === 'unread' ? 'You are all caught up.' : 'Nothing in your inbox.'}\n </p>\n ) : (\n <ul className=\"flex flex-col gap-0.5\" aria-busy={shown.isFetching || undefined}>\n {rows.map((row) => (\n <InboxRow\n key={row.id}\n row={row}\n isActive={row.id === list.activeThreadId}\n list={list}\n onOpen={open}\n onDismiss={canDismiss ? dismissal.dismiss : null}\n />\n ))}\n </ul>\n )}\n {shown.hasNextPage && !showSkeleton ? (\n <button\n type=\"button\"\n onClick={shown.fetchNextPage}\n disabled={shown.isFetchingNextPage}\n className={cn('mt-1 w-full rounded-md py-2 text-muted-foreground text-xs transition-colors hover:bg-muted disabled:opacity-50', FOCUS_RING_CLASS)}\n >\n {shown.isFetchingNextPage ? 'Loading…' : 'Load more'}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\n/**\n * The notifications inbox: All / Unread tabs with counts, rows of title,\n * latest message, state chip and unread dot, mark read / mark all read and\n * dismiss. Renders nothing outside `<AthenaProvider enableThreadList>`.\n */\nexport function Inbox(props: InboxProps) {\n const list = useAthenaStatewireThreadList();\n const live = useContext(AthenaSessionsLiveContext);\n if (!list || !live) return null;\n return <InboxBody {...props} list={list} />;\n}\n\nexport interface InboxButtonProps extends Omit<InboxProps, 'className'> {\n className?: string;\n /** Classes for the popover panel. */\n panelClassName?: string;\n align?: 'start' | 'center' | 'end';\n}\n\nfunction InboxButtonBody({ className, panelClassName, align = 'end', onOpenSession, ...inboxProps }: InboxButtonProps) {\n const [open, setOpen] = useState(false);\n const unread = useAthenaInboxUnreadCount();\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={unread.count > 0 ? `Inbox, ${unread.label} unread` : 'Inbox'}\n data-testid=\"inbox-button\"\n className={cn(\n 'relative inline-flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground',\n FOCUS_RING_CLASS,\n className,\n )}\n >\n <BellIcon className=\"size-4\" aria-hidden />\n {unread.count > 0 ? (\n <span\n data-testid=\"inbox-badge\"\n className=\"absolute -top-0.5 -right-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-primary px-1 font-semibold text-[10px] text-primary-foreground leading-none\"\n >\n {unread.label}\n </span>\n ) : null}\n </button>\n </PopoverTrigger>\n <PopoverContent align={align} className={cn('flex max-h-[70vh] w-96 flex-col p-2', panelClassName)}>\n <Inbox\n {...inboxProps}\n onOpenSession={(target) => {\n setOpen(false);\n onOpenSession?.(target);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\n/**\n * A bell with the unread count that opens `Inbox` in a popover. Renders\n * nothing outside `<AthenaProvider enableThreadList>`.\n */\nexport function InboxButton(props: InboxButtonProps) {\n const live = useContext(AthenaSessionsLiveContext);\n if (!live) return null;\n return <InboxButtonBody {...props} />;\n}\n"],"names":["useAthenaSessions","useContext","AthenaSessionsLiveContext","useAthenaQueryClient","useState","useMutation","withCredentialRenewal","dismissThreadFromInbox","inboxStateChip","plainExcerpt","jsxs","cn","FOCUS_RING_CLASS","jsx","relativeTime","StatusChip","RowIconButton","MailOpenIcon","MailIcon","XIcon","useMemo","CheckCheckIcon","SessionListSkeleton","useAthenaStatewireThreadList","Popover","PopoverTrigger","BellIcon","PopoverContent"],"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 api = require("./api.cjs");
7
7
  const sessionListModel = require("./session-list-model.cjs");
8
8
  const sessionRowParts = require("./session-row-parts.cjs");
@@ -150,13 +150,13 @@ const SessionRow = ({
150
150
  const chip = sessionListModel.pullRequestChip(thread.pullRequests);
151
151
  const origin = sessionListModel.sessionOriginBadge(thread, originBadges);
152
152
  const title = thread.title ?? "Untitled";
153
- const hoverTimerRef = react.useRef(null);
154
- const cancelHover = react.useCallback(() => {
153
+ const hoverTimerRef = require$$0.useRef(null);
154
+ const cancelHover = require$$0.useCallback(() => {
155
155
  if (hoverTimerRef.current === null) return;
156
156
  clearTimeout(hoverTimerRef.current);
157
157
  hoverTimerRef.current = null;
158
158
  }, []);
159
- react.useEffect(() => cancelHover, [cancelHover]);
159
+ require$$0.useEffect(() => cancelHover, [cancelHover]);
160
160
  const handlePointerEnter = () => {
161
161
  if (!onPrefetch) return;
162
162
  cancelHover();
@@ -169,11 +169,11 @@ const SessionRow = ({
169
169
  cancelHover();
170
170
  onPrefetch == null ? void 0 : onPrefetch(thread.id);
171
171
  };
172
- const [editing, setEditing] = react.useState(false);
173
- const [draft, setDraft] = react.useState("");
174
- const settledRef = react.useRef(false);
175
- const inputRef = react.useRef(null);
176
- react.useEffect(() => {
172
+ const [editing, setEditing] = require$$0.useState(false);
173
+ const [draft, setDraft] = require$$0.useState("");
174
+ const settledRef = require$$0.useRef(false);
175
+ const inputRef = require$$0.useRef(null);
176
+ require$$0.useEffect(() => {
177
177
  var _a, _b;
178
178
  if (!editing) return;
179
179
  (_a = inputRef.current) == null ? void 0 : _a.focus();
@@ -1 +1 @@
1
- {"version":3,"file":"SessionList.cjs","sources":["../../src/threads/SessionList.tsx"],"sourcesContent":["import {\n ArchiveIcon,\n ClockIcon,\n LoaderCircleIcon,\n PencilIcon,\n PinIcon,\n PlusIcon,\n SquareArrowOutUpRightIcon,\n RefreshCwIcon,\n SearchIcon,\n} from 'lucide-react';\nimport type { ChangeEvent, FC, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { cn } from '../lib/utils';\nimport { THREAD_TITLE_MAX_LENGTH } from './api';\nimport {\n groupSessions,\n pullRequestChip,\n type SessionIndicator as SessionIndicatorKind,\n type SessionLineTone,\n type SessionOriginBadges,\n sessionIndicator,\n sessionOriginBadge,\n sessionSecondaryLine,\n} from './session-list-model';\nimport { FOCUS_RING_CLASS, PullRequestChip, stopPropagation } from './session-row-parts';\nimport {\n type AthenaStatewireThreadSummary,\n useAthenaStatewireThreadList,\n} from './statewire-thread-list';\nimport { THREAD_PREFETCH_HOVER_DELAY_MS } from './thread-prefetcher';\nimport type { ThreadFavoriteTarget } from './use-thread-favorite';\nimport type { ThreadRenameTarget } from './use-thread-rename';\n\nexport interface SessionListProps {\n className?: string;\n /**\n * Group rows under \"Needs you\" / \"Working\" / \"Pinned\" / \"Recent\" (default\n * `true`); a session appears once, in the first group that applies. `false`\n * renders one newest-first list.\n */\n grouped?: boolean;\n /** Show the title search box, wired to the server-side `search` (default `true`). */\n showSearch?: boolean;\n /**\n * Show the \"New Chat\" and refresh buttons above the rows (default `true`).\n * `false` for a host that places its own new-session control.\n */\n showNewChat?: boolean;\n /**\n * Which rows carry an origin badge (Athena, Slack, GitHub, Chrome …):\n * `all` (default); `external`, every origin but the web app, so sessions\n * started in a browser tab of the app carry none; or `none`.\n */\n originBadges?: SessionOriginBadges;\n /**\n * Offer the pin toggle on each row (default `true`). `false` — or a backend\n * without the favorite route — shows a pinned row's pin read-only instead.\n */\n showPinToggle?: boolean;\n /**\n * Offer the inline rename on each row (default `true`). Withdrawn on a\n * backend without the rename route (`renameAvailable`).\n */\n showRename?: boolean;\n /**\n * Offer the archive action on each row (default `true`). Withdrawn on a\n * backend without the archive route (`archiveAvailable`).\n */\n showArchive?: boolean;\n /**\n * Warm the provider's snapshot cache for a row after a 120 ms hover dwell\n * and on row focus (default `true`), so selecting it paints at once.\n */\n prefetchOnHover?: boolean;\n /**\n * Open a session somewhere other than the provider's chat (a host showing\n * several chats side by side): each row offers \"Open in new tab\", and a\n * ⌘-click (Ctrl-click) or middle-click on it opens it there instead of\n * selecting it. Absent, rows only select.\n */\n onOpenInNewTab?: (target: SessionOpenTarget) => void;\n}\n\n/** The session a row hands `SessionListProps.onOpenInNewTab`. */\nexport interface SessionOpenTarget {\n threadId: string;\n /** The row's title, `null` while the session has none. */\n title: string | null;\n}\n\nconst INDICATOR_LABEL: Record<NonNullable<SessionIndicatorKind>, string> = {\n needs_you: 'Needs you',\n working: 'Working',\n unread: 'Unread',\n watching: 'Watching',\n};\n\n/**\n * The row's status indicator; an empty spacer keeps titles aligned when a\n * row has none.\n */\nconst SessionStatusIndicator: FC<{ kind: SessionIndicatorKind }> = ({ kind }) => {\n if (kind === null) return <span aria-hidden=\"true\" className=\"mt-0.5 size-4 shrink-0\" />;\n const label = INDICATOR_LABEL[kind];\n if (kind === 'working') {\n return (\n <LoaderCircleIcon\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n if (kind === 'watching') {\n return (\n <ClockIcon\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\"\n />\n );\n }\n return (\n <span\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 flex size-4 shrink-0 items-center justify-center\"\n >\n <span\n className={cn(\n 'size-2 rounded-full',\n kind === 'needs_you' ? 'bg-orange-500' : 'bg-primary',\n )}\n />\n </span>\n );\n};\n\nconst LINE_TONE_CLASS: Record<SessionLineTone, string> = {\n needs_you: 'text-orange-600',\n ready: 'text-green-600',\n error: 'text-red-600',\n muted: 'text-muted-foreground',\n};\n\n/**\n * One action in the row's trailing cluster: a sibling of the row control\n * (never nested in it — a click must not select the row), labelled for\n * assistive technology, revealed on hover or focus unless `alwaysVisible`,\n * and disabled while its write is in flight so one row never has two writes\n * racing.\n */\nconst RowActionButton: FC<{\n label: string;\n onClick: (event: MouseEvent<HTMLButtonElement>) => void;\n pending: boolean;\n alwaysVisible: boolean;\n action: string;\n pressed?: boolean;\n children: ReactNode;\n}> = ({ label, onClick, pending, alwaysVisible, action, pressed, children }) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={pending}\n aria-busy={pending || undefined}\n aria-pressed={pressed}\n aria-label={label}\n title={label}\n data-action={action}\n data-pending={pending || undefined}\n className={cn(\n 'rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:cursor-wait disabled:opacity-60',\n FOCUS_RING_CLASS,\n !alwaysVisible &&\n !pending &&\n 'opacity-0 focus-visible:opacity-100 group-focus-within:opacity-100 group-hover:opacity-100',\n )}\n >\n {children}\n </button>\n);\n\n/**\n * The pin toggle: pressed while the session is pinned (and then always\n * visible); otherwise an outline pin revealed on hover or focus so an\n * unpinned row stays quiet.\n */\nconst PinToggle: FC<{\n thread: Pick<AthenaStatewireThreadSummary, 'id' | 'isFavorited'>;\n pending: boolean;\n onToggle: (target: ThreadFavoriteTarget) => void;\n}> = ({ thread, pending, onToggle }) => {\n const label = thread.isFavorited ? 'Unpin session' : 'Pin session';\n const handleClick = (event: MouseEvent) => {\n event.stopPropagation();\n if (pending) return;\n onToggle({ threadId: thread.id, isFavorited: !thread.isFavorited });\n };\n return (\n <span data-pin-toggle={thread.isFavorited ? 'pinned' : 'unpinned'} className=\"contents\">\n <RowActionButton\n label={label}\n onClick={handleClick}\n pending={pending}\n alwaysVisible={thread.isFavorited}\n action=\"pin\"\n pressed={thread.isFavorited}\n >\n <PinIcon className={cn('size-3.5', thread.isFavorited && 'fill-current')} aria-hidden />\n </RowActionButton>\n </span>\n );\n};\n\nconst SKELETON_TITLE_WIDTHS = ['w-3/5', 'w-4/5', 'w-1/2', 'w-2/3'] as const;\n\n/**\n * Placeholder rows shaped like session rows (indicator, title line, meta\n * line) for the first page and for a refresh that has no rows to keep yet.\n */\nexport const SessionListSkeleton: FC<{ rows?: number }> = ({ rows = 4 }) => (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading sessions\"\n data-testid=\"session-list-skeleton\"\n className=\"flex flex-col gap-0.5\"\n >\n {Array.from({ length: rows }, (_, index) => (\n <div key={index} aria-hidden=\"true\" className=\"flex items-start gap-2 px-3 py-2\">\n <span className=\"mt-0.5 size-4 shrink-0 animate-pulse rounded-full bg-muted\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex h-5 items-center\">\n <span\n className={cn(\n 'h-3.5 animate-pulse rounded bg-muted',\n SKELETON_TITLE_WIDTHS[index % SKELETON_TITLE_WIDTHS.length],\n )}\n />\n </span>\n <span className=\"mt-0.5 flex h-4 items-center\">\n <span className=\"h-3 w-1/3 animate-pulse rounded bg-muted/70\" />\n </span>\n </span>\n </div>\n ))}\n </div>\n);\n\nconst SessionRow: FC<{\n thread: AthenaStatewireThreadSummary;\n isActive: boolean;\n onSelect: (threadId: string) => void;\n /** Absent when hover prefetching is off or the provider has no snapshot cache to warm. */\n onPrefetch: ((threadId: string) => void) | undefined;\n /** Absent when the toggle is not offered: a pinned row then shows a read-only pin. */\n onToggleFavorite: ((target: ThreadFavoriteTarget) => void) | undefined;\n /** True while this session's pin write is in flight. */\n favoritePending: boolean;\n /** Absent when the rename is not offered (host opt-out, or a backend without the route). */\n onRename: ((target: ThreadRenameTarget) => void) | undefined;\n renamePending: boolean;\n /** Absent when the archive is not offered (host opt-out, or a backend without the route). */\n onArchive: ((threadId: string) => void) | undefined;\n archivePending: boolean;\n /** Absent when the host offers no other place to open a session. */\n onOpenInNewTab: ((target: SessionOpenTarget) => void) | undefined;\n originBadges: SessionOriginBadges;\n}> = ({\n thread,\n isActive,\n onSelect,\n onPrefetch,\n onToggleFavorite,\n favoritePending,\n onRename,\n renamePending,\n onArchive,\n archivePending,\n onOpenInNewTab,\n originBadges,\n}) => {\n const indicator = sessionIndicator(thread);\n const line = sessionSecondaryLine(thread);\n const chip = pullRequestChip(thread.pullRequests);\n const origin = sessionOriginBadge(thread, originBadges);\n const title = thread.title ?? 'Untitled';\n\n // Hover prefetch: the pointer must rest on the row for the dwell before\n // the fetch starts, so sweeping the pointer down the list fetches nothing.\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelHover = useCallback(() => {\n if (hoverTimerRef.current === null) return;\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }, []);\n useEffect(() => cancelHover, [cancelHover]);\n const handlePointerEnter = () => {\n if (!onPrefetch) return;\n cancelHover();\n hoverTimerRef.current = setTimeout(() => {\n hoverTimerRef.current = null;\n onPrefetch(thread.id);\n }, THREAD_PREFETCH_HOVER_DELAY_MS);\n };\n const handleFocus = () => {\n cancelHover();\n onPrefetch?.(thread.id);\n };\n\n // Inline rename: the title becomes an input; Enter commits, Escape cancels,\n // blur commits. An Enter or Escape settles the edit before the blur its\n // unmount may raise, so the blur never commits a second time.\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n const settledRef = useRef(false);\n const inputRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n if (!editing) return;\n inputRef.current?.focus();\n inputRef.current?.select();\n }, [editing]);\n const beginRename = (event: MouseEvent) => {\n event.stopPropagation();\n if (renamePending) return;\n settledRef.current = false;\n setDraft(thread.title ?? '');\n setEditing(true);\n };\n const commitRename = () => {\n if (settledRef.current) return;\n settledRef.current = true;\n setEditing(false);\n const next = draft.trim();\n if (!next || next === (thread.title ?? '').trim()) return;\n onRename?.({ threadId: thread.id, title: next });\n };\n const cancelRename = () => {\n settledRef.current = true;\n setEditing(false);\n };\n const handleEditorKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commitRename();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n cancelRename();\n }\n };\n\n const handleArchive = (event: MouseEvent) => {\n event.stopPropagation();\n if (archivePending) return;\n onArchive?.(thread.id);\n };\n\n const openInNewTab = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onOpenInNewTab?.({ threadId: thread.id, title: thread.title });\n };\n // A ⌘-click (Ctrl-click) opens the row elsewhere, as a browser opens a link in a new tab.\n const handleRowClick = (event: MouseEvent) => {\n if (onOpenInNewTab && (event.metaKey || event.ctrlKey)) {\n openInNewTab(event);\n return;\n }\n onSelect(thread.id);\n };\n const handleRowAuxClick = (event: MouseEvent) => {\n if (onOpenInNewTab && event.button === 1) openInNewTab(event);\n };\n\n const hasActions = Boolean(onRename || onToggleFavorite || onArchive || onOpenInNewTab);\n const body = (\n <>\n <SessionStatusIndicator kind={indicator} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex h-5 items-center gap-1.5\">\n {editing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={draft}\n maxLength={THREAD_TITLE_MAX_LENGTH}\n aria-label=\"Session title\"\n data-rename-input\n onChange={(event: ChangeEvent<HTMLInputElement>) => setDraft(event.target.value)}\n onKeyDown={handleEditorKeyDown}\n onBlur={commitRename}\n onClick={stopPropagation}\n className={cn(\n 'h-5 min-w-0 flex-1 rounded border border-primary/60 bg-background px-1 font-medium text-foreground text-sm',\n FOCUS_RING_CLASS,\n )}\n />\n ) : (\n <span data-title className=\"min-w-0 truncate font-medium text-sm\">\n {title}\n </span>\n )}\n {thread.isFavorited && !onToggleFavorite ? (\n <PinIcon\n role=\"img\"\n aria-label=\"Pinned\"\n className=\"size-3 shrink-0 fill-current text-muted-foreground\"\n />\n ) : null}\n {origin ? (\n <span\n data-origin={origin}\n className=\"shrink-0 rounded-full border border-border/60 px-1.5 py-px text-[10px] text-muted-foreground\"\n >\n {origin}\n </span>\n ) : null}\n </span>\n <span\n data-line={line.kind}\n className={cn('mt-0.5 block h-4 truncate font-normal text-xs leading-4', LINE_TONE_CLASS[line.tone])}\n >\n {line.text}\n </span>\n </span>\n </>\n );\n\n return (\n <li\n data-active={isActive || undefined}\n data-thread-id={thread.id}\n data-editing={editing || undefined}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={cancelHover}\n className={cn(\n 'group relative flex items-start gap-1 rounded-lg text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground',\n isActive && 'bg-muted text-foreground',\n )}\n >\n {isActive ? (\n <span\n aria-hidden=\"true\"\n data-active-accent\n className=\"absolute inset-y-2 left-0 w-0.5 rounded-full bg-primary\"\n />\n ) : null}\n {editing ? (\n <div className=\"flex min-w-0 flex-1 items-start gap-2 p-2 pl-3 text-left\">{body}</div>\n ) : (\n <button\n type=\"button\"\n onClick={handleRowClick}\n onAuxClick={handleRowAuxClick}\n onFocus={handleFocus}\n className={cn(\n 'flex min-w-0 flex-1 cursor-pointer items-start gap-2 rounded-lg p-2 pl-3 text-left',\n FOCUS_RING_CLASS,\n )}\n >\n {body}\n </button>\n )}\n {chip || hasActions ? (\n <div className=\"flex shrink-0 flex-col items-end justify-between gap-0.5 py-2 pr-2\">\n {hasActions ? (\n <div data-row-actions className=\"flex h-5 items-center gap-0.5\">\n {onOpenInNewTab ? (\n <RowActionButton\n label=\"Open in new tab\"\n onClick={openInNewTab}\n pending={false}\n alwaysVisible={false}\n action=\"open-in-new-tab\"\n >\n <SquareArrowOutUpRightIcon className=\"size-3.5\" aria-hidden />\n </RowActionButton>\n ) : null}\n {onRename ? (\n <RowActionButton\n label=\"Rename session\"\n onClick={beginRename}\n pending={renamePending}\n alwaysVisible={false}\n action=\"rename\"\n >\n <PencilIcon className=\"size-3.5\" aria-hidden />\n </RowActionButton>\n ) : null}\n {onToggleFavorite ? (\n <PinToggle thread={thread} pending={favoritePending} onToggle={onToggleFavorite} />\n ) : null}\n {onArchive ? (\n <RowActionButton\n label=\"Archive session\"\n onClick={handleArchive}\n pending={archivePending}\n alwaysVisible={false}\n action=\"archive\"\n >\n <ArchiveIcon className=\"size-3.5\" aria-hidden />\n </RowActionButton>\n ) : null}\n </div>\n ) : (\n <span aria-hidden=\"true\" className=\"h-5\" />\n )}\n {chip ? <PullRequestChip chip={chip} pullRequests={thread.pullRequests ?? []} /> : null}\n </div>\n ) : null}\n </li>\n );\n};\n\n/**\n * Devin-style session list: the `ThreadList` rows with an attention\n * indicator, the server's next action, pull-request chips, an origin badge\n * and a trailing action cluster (rename inline, pin, archive) revealed on\n * hover or focus, grouped by what each session asks of the viewer. Reads the\n * thread-list state that `<AthenaProvider enableThreadList>` provides and\n * renders nothing outside that mode.\n *\n * Every write is optimistic and rolls back on failure: the pin flips the row\n * and moves it between `Pinned` and `Recent`; the rename shows the new title\n * on commit; the archive removes the row. On a backend that predates a route\n * the matching action is withdrawn (`favoriteToggleAvailable` falls back to a\n * read-only pin; `renameAvailable` / `archiveAvailable` hide the action).\n *\n * Rows warm the provider's snapshot cache after a 120 ms hover dwell (and on\n * focus) so a selection paints its transcript at once. Skeleton rows stand in\n * while the first page loads or a refresh has nothing to keep; the empty\n * state appears only after a settled empty answer, and a background refresh\n * never blanks the rows it already has.\n */\nexport function SessionList({\n className,\n grouped = true,\n showSearch = true,\n showNewChat = true,\n originBadges = 'all',\n showPinToggle = true,\n showRename = true,\n showArchive = true,\n prefetchOnHover = true,\n onOpenInNewTab,\n}: SessionListProps) {\n const list = useAthenaStatewireThreadList();\n if (!list) return null;\n\n const sections = groupSessions(list.threads, grouped);\n const hasSearch = list.search.trim().length > 0;\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n list.setSearch(event.target.value);\n const onToggleFavorite =\n showPinToggle && list.favoriteToggleAvailable ? list.setFavorited : undefined;\n const onRename = showRename && list.renameAvailable ? list.renameThread : undefined;\n const onArchive = showArchive && list.archiveAvailable ? list.archiveThread : undefined;\n const onPrefetch = prefetchOnHover ? list.prefetchThread : undefined;\n // Skeleton until the first page has answered (no credential yet, or the\n // page in flight) and for a refresh with no rows to keep; a refresh that\n // has rows keeps showing them.\n const showSkeleton =\n !list.hasResolvedFirstPage || (list.isFetching && list.threads.length === 0);\n\n return (\n <div\n className={cn('athena-sdk-chrome flex flex-col gap-2', className)}\n data-testid=\"session-list\"\n >\n {showNewChat ? (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={list.newThread}\n className={cn(\n 'flex h-9 flex-1 items-center gap-2 rounded-lg border border-border/60 px-3 font-medium text-muted-foreground text-sm transition-colors hover:bg-muted hover:text-foreground',\n FOCUS_RING_CLASS,\n )}\n >\n <PlusIcon className=\"size-4\" />\n New Chat\n </button>\n <button\n type=\"button\"\n onClick={list.refresh}\n disabled={list.isFetching}\n className={cn(\n 'flex size-9 items-center justify-center rounded-lg border border-border/60 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n title=\"Refresh sessions\"\n aria-label=\"Refresh sessions\"\n >\n <RefreshCwIcon className={cn('size-4', list.isFetching && 'animate-spin')} />\n </button>\n </div>\n ) : null}\n\n {showSearch ? (\n <label className=\"relative block\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n type=\"search\"\n value={list.search}\n onChange={handleSearch}\n placeholder=\"Search sessions…\"\n className=\"h-8 w-full rounded-lg border border-border/60 bg-muted/40 pr-2 pl-8 text-sm outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n ) : null}\n\n {showSkeleton ? (\n <SessionListSkeleton />\n ) : sections.length === 0 ? (\n <p data-testid=\"session-list-empty\" className=\"px-3 py-4 text-muted-foreground text-xs\">\n {hasSearch ? 'No matching sessions.' : 'No sessions yet.'}\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\" aria-busy={list.isFetching || undefined}>\n {sections.map(({ group, items }) => (\n <section\n key={group ?? 'all'}\n aria-label={group ?? 'Sessions'}\n data-group={group ?? undefined}\n >\n {group ? (\n <h3 className=\"px-3 pb-1 font-medium text-[11px] text-muted-foreground/70 uppercase tracking-wide\">\n {group}\n </h3>\n ) : null}\n <ul className=\"flex flex-col gap-0.5\">\n {items.map((thread) => (\n <SessionRow\n key={thread.id}\n thread={thread}\n isActive={thread.id === list.activeThreadId}\n onSelect={list.selectThread}\n onPrefetch={onPrefetch}\n onToggleFavorite={onToggleFavorite}\n favoritePending={list.favoritePendingThreadIds.has(thread.id)}\n onRename={onRename}\n renamePending={list.renamePendingThreadIds.has(thread.id)}\n onArchive={onArchive}\n archivePending={list.archivePendingThreadIds.has(thread.id)}\n onOpenInNewTab={onOpenInNewTab}\n originBadges={originBadges}\n />\n ))}\n </ul>\n </section>\n ))}\n </div>\n )}\n\n {list.hasNextPage && !showSkeleton ? (\n <button\n type=\"button\"\n disabled={list.isFetchingNextPage}\n onClick={list.fetchNextPage}\n className={cn(\n 'w-full rounded-lg py-2 text-muted-foreground text-xs transition-colors hover:bg-muted disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n >\n {list.isFetchingNextPage ? 'Loading…' : 'Load more'}\n </button>\n ) : null}\n </div>\n );\n}\n"],"names":["jsx","LoaderCircleIcon","ClockIcon","cn","FOCUS_RING_CLASS","PinIcon","jsxs","sessionIndicator","sessionSecondaryLine","pullRequestChip","sessionOriginBadge","useRef","useCallback","useEffect","THREAD_PREFETCH_HOVER_DELAY_MS","useState","Fragment","THREAD_TITLE_MAX_LENGTH","stopPropagation","SquareArrowOutUpRightIcon","PencilIcon","ArchiveIcon","PullRequestChip","useAthenaStatewireThreadList","groupSessions","PlusIcon","RefreshCwIcon","SearchIcon"],"mappings":"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"}
1
+ {"version":3,"file":"SessionList.cjs","sources":["../../src/threads/SessionList.tsx"],"sourcesContent":["import {\n ArchiveIcon,\n ClockIcon,\n LoaderCircleIcon,\n PencilIcon,\n PinIcon,\n PlusIcon,\n SquareArrowOutUpRightIcon,\n RefreshCwIcon,\n SearchIcon,\n} from 'lucide-react';\nimport type { ChangeEvent, FC, KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { cn } from '../lib/utils';\nimport { THREAD_TITLE_MAX_LENGTH } from './api';\nimport {\n groupSessions,\n pullRequestChip,\n type SessionIndicator as SessionIndicatorKind,\n type SessionLineTone,\n type SessionOriginBadges,\n sessionIndicator,\n sessionOriginBadge,\n sessionSecondaryLine,\n} from './session-list-model';\nimport { FOCUS_RING_CLASS, PullRequestChip, stopPropagation } from './session-row-parts';\nimport {\n type AthenaStatewireThreadSummary,\n useAthenaStatewireThreadList,\n} from './statewire-thread-list';\nimport { THREAD_PREFETCH_HOVER_DELAY_MS } from './thread-prefetcher';\nimport type { ThreadFavoriteTarget } from './use-thread-favorite';\nimport type { ThreadRenameTarget } from './use-thread-rename';\n\nexport interface SessionListProps {\n className?: string;\n /**\n * Group rows under \"Needs you\" / \"Working\" / \"Pinned\" / \"Recent\" (default\n * `true`); a session appears once, in the first group that applies. `false`\n * renders one newest-first list.\n */\n grouped?: boolean;\n /** Show the title search box, wired to the server-side `search` (default `true`). */\n showSearch?: boolean;\n /**\n * Show the \"New Chat\" and refresh buttons above the rows (default `true`).\n * `false` for a host that places its own new-session control.\n */\n showNewChat?: boolean;\n /**\n * Which rows carry an origin badge (Athena, Slack, GitHub, Chrome …):\n * `all` (default); `external`, every origin but the web app, so sessions\n * started in a browser tab of the app carry none; or `none`.\n */\n originBadges?: SessionOriginBadges;\n /**\n * Offer the pin toggle on each row (default `true`). `false` — or a backend\n * without the favorite route — shows a pinned row's pin read-only instead.\n */\n showPinToggle?: boolean;\n /**\n * Offer the inline rename on each row (default `true`). Withdrawn on a\n * backend without the rename route (`renameAvailable`).\n */\n showRename?: boolean;\n /**\n * Offer the archive action on each row (default `true`). Withdrawn on a\n * backend without the archive route (`archiveAvailable`).\n */\n showArchive?: boolean;\n /**\n * Warm the provider's snapshot cache for a row after a 120 ms hover dwell\n * and on row focus (default `true`), so selecting it paints at once.\n */\n prefetchOnHover?: boolean;\n /**\n * Open a session somewhere other than the provider's chat (a host showing\n * several chats side by side): each row offers \"Open in new tab\", and a\n * ⌘-click (Ctrl-click) or middle-click on it opens it there instead of\n * selecting it. Absent, rows only select.\n */\n onOpenInNewTab?: (target: SessionOpenTarget) => void;\n}\n\n/** The session a row hands `SessionListProps.onOpenInNewTab`. */\nexport interface SessionOpenTarget {\n threadId: string;\n /** The row's title, `null` while the session has none. */\n title: string | null;\n}\n\nconst INDICATOR_LABEL: Record<NonNullable<SessionIndicatorKind>, string> = {\n needs_you: 'Needs you',\n working: 'Working',\n unread: 'Unread',\n watching: 'Watching',\n};\n\n/**\n * The row's status indicator; an empty spacer keeps titles aligned when a\n * row has none.\n */\nconst SessionStatusIndicator: FC<{ kind: SessionIndicatorKind }> = ({ kind }) => {\n if (kind === null) return <span aria-hidden=\"true\" className=\"mt-0.5 size-4 shrink-0\" />;\n const label = INDICATOR_LABEL[kind];\n if (kind === 'working') {\n return (\n <LoaderCircleIcon\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 size-4 shrink-0 animate-spin text-primary\"\n />\n );\n }\n if (kind === 'watching') {\n return (\n <ClockIcon\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\"\n />\n );\n }\n return (\n <span\n role=\"img\"\n aria-label={label}\n data-indicator={kind}\n className=\"mt-0.5 flex size-4 shrink-0 items-center justify-center\"\n >\n <span\n className={cn(\n 'size-2 rounded-full',\n kind === 'needs_you' ? 'bg-orange-500' : 'bg-primary',\n )}\n />\n </span>\n );\n};\n\nconst LINE_TONE_CLASS: Record<SessionLineTone, string> = {\n needs_you: 'text-orange-600',\n ready: 'text-green-600',\n error: 'text-red-600',\n muted: 'text-muted-foreground',\n};\n\n/**\n * One action in the row's trailing cluster: a sibling of the row control\n * (never nested in it — a click must not select the row), labelled for\n * assistive technology, revealed on hover or focus unless `alwaysVisible`,\n * and disabled while its write is in flight so one row never has two writes\n * racing.\n */\nconst RowActionButton: FC<{\n label: string;\n onClick: (event: MouseEvent<HTMLButtonElement>) => void;\n pending: boolean;\n alwaysVisible: boolean;\n action: string;\n pressed?: boolean;\n children: ReactNode;\n}> = ({ label, onClick, pending, alwaysVisible, action, pressed, children }) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={pending}\n aria-busy={pending || undefined}\n aria-pressed={pressed}\n aria-label={label}\n title={label}\n data-action={action}\n data-pending={pending || undefined}\n className={cn(\n 'rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:cursor-wait disabled:opacity-60',\n FOCUS_RING_CLASS,\n !alwaysVisible &&\n !pending &&\n 'opacity-0 focus-visible:opacity-100 group-focus-within:opacity-100 group-hover:opacity-100',\n )}\n >\n {children}\n </button>\n);\n\n/**\n * The pin toggle: pressed while the session is pinned (and then always\n * visible); otherwise an outline pin revealed on hover or focus so an\n * unpinned row stays quiet.\n */\nconst PinToggle: FC<{\n thread: Pick<AthenaStatewireThreadSummary, 'id' | 'isFavorited'>;\n pending: boolean;\n onToggle: (target: ThreadFavoriteTarget) => void;\n}> = ({ thread, pending, onToggle }) => {\n const label = thread.isFavorited ? 'Unpin session' : 'Pin session';\n const handleClick = (event: MouseEvent) => {\n event.stopPropagation();\n if (pending) return;\n onToggle({ threadId: thread.id, isFavorited: !thread.isFavorited });\n };\n return (\n <span data-pin-toggle={thread.isFavorited ? 'pinned' : 'unpinned'} className=\"contents\">\n <RowActionButton\n label={label}\n onClick={handleClick}\n pending={pending}\n alwaysVisible={thread.isFavorited}\n action=\"pin\"\n pressed={thread.isFavorited}\n >\n <PinIcon className={cn('size-3.5', thread.isFavorited && 'fill-current')} aria-hidden />\n </RowActionButton>\n </span>\n );\n};\n\nconst SKELETON_TITLE_WIDTHS = ['w-3/5', 'w-4/5', 'w-1/2', 'w-2/3'] as const;\n\n/**\n * Placeholder rows shaped like session rows (indicator, title line, meta\n * line) for the first page and for a refresh that has no rows to keep yet.\n */\nexport const SessionListSkeleton: FC<{ rows?: number }> = ({ rows = 4 }) => (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading sessions\"\n data-testid=\"session-list-skeleton\"\n className=\"flex flex-col gap-0.5\"\n >\n {Array.from({ length: rows }, (_, index) => (\n <div key={index} aria-hidden=\"true\" className=\"flex items-start gap-2 px-3 py-2\">\n <span className=\"mt-0.5 size-4 shrink-0 animate-pulse rounded-full bg-muted\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex h-5 items-center\">\n <span\n className={cn(\n 'h-3.5 animate-pulse rounded bg-muted',\n SKELETON_TITLE_WIDTHS[index % SKELETON_TITLE_WIDTHS.length],\n )}\n />\n </span>\n <span className=\"mt-0.5 flex h-4 items-center\">\n <span className=\"h-3 w-1/3 animate-pulse rounded bg-muted/70\" />\n </span>\n </span>\n </div>\n ))}\n </div>\n);\n\nconst SessionRow: FC<{\n thread: AthenaStatewireThreadSummary;\n isActive: boolean;\n onSelect: (threadId: string) => void;\n /** Absent when hover prefetching is off or the provider has no snapshot cache to warm. */\n onPrefetch: ((threadId: string) => void) | undefined;\n /** Absent when the toggle is not offered: a pinned row then shows a read-only pin. */\n onToggleFavorite: ((target: ThreadFavoriteTarget) => void) | undefined;\n /** True while this session's pin write is in flight. */\n favoritePending: boolean;\n /** Absent when the rename is not offered (host opt-out, or a backend without the route). */\n onRename: ((target: ThreadRenameTarget) => void) | undefined;\n renamePending: boolean;\n /** Absent when the archive is not offered (host opt-out, or a backend without the route). */\n onArchive: ((threadId: string) => void) | undefined;\n archivePending: boolean;\n /** Absent when the host offers no other place to open a session. */\n onOpenInNewTab: ((target: SessionOpenTarget) => void) | undefined;\n originBadges: SessionOriginBadges;\n}> = ({\n thread,\n isActive,\n onSelect,\n onPrefetch,\n onToggleFavorite,\n favoritePending,\n onRename,\n renamePending,\n onArchive,\n archivePending,\n onOpenInNewTab,\n originBadges,\n}) => {\n const indicator = sessionIndicator(thread);\n const line = sessionSecondaryLine(thread);\n const chip = pullRequestChip(thread.pullRequests);\n const origin = sessionOriginBadge(thread, originBadges);\n const title = thread.title ?? 'Untitled';\n\n // Hover prefetch: the pointer must rest on the row for the dwell before\n // the fetch starts, so sweeping the pointer down the list fetches nothing.\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelHover = useCallback(() => {\n if (hoverTimerRef.current === null) return;\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }, []);\n useEffect(() => cancelHover, [cancelHover]);\n const handlePointerEnter = () => {\n if (!onPrefetch) return;\n cancelHover();\n hoverTimerRef.current = setTimeout(() => {\n hoverTimerRef.current = null;\n onPrefetch(thread.id);\n }, THREAD_PREFETCH_HOVER_DELAY_MS);\n };\n const handleFocus = () => {\n cancelHover();\n onPrefetch?.(thread.id);\n };\n\n // Inline rename: the title becomes an input; Enter commits, Escape cancels,\n // blur commits. An Enter or Escape settles the edit before the blur its\n // unmount may raise, so the blur never commits a second time.\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState('');\n const settledRef = useRef(false);\n const inputRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n if (!editing) return;\n inputRef.current?.focus();\n inputRef.current?.select();\n }, [editing]);\n const beginRename = (event: MouseEvent) => {\n event.stopPropagation();\n if (renamePending) return;\n settledRef.current = false;\n setDraft(thread.title ?? '');\n setEditing(true);\n };\n const commitRename = () => {\n if (settledRef.current) return;\n settledRef.current = true;\n setEditing(false);\n const next = draft.trim();\n if (!next || next === (thread.title ?? '').trim()) return;\n onRename?.({ threadId: thread.id, title: next });\n };\n const cancelRename = () => {\n settledRef.current = true;\n setEditing(false);\n };\n const handleEditorKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commitRename();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n cancelRename();\n }\n };\n\n const handleArchive = (event: MouseEvent) => {\n event.stopPropagation();\n if (archivePending) return;\n onArchive?.(thread.id);\n };\n\n const openInNewTab = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onOpenInNewTab?.({ threadId: thread.id, title: thread.title });\n };\n // A ⌘-click (Ctrl-click) opens the row elsewhere, as a browser opens a link in a new tab.\n const handleRowClick = (event: MouseEvent) => {\n if (onOpenInNewTab && (event.metaKey || event.ctrlKey)) {\n openInNewTab(event);\n return;\n }\n onSelect(thread.id);\n };\n const handleRowAuxClick = (event: MouseEvent) => {\n if (onOpenInNewTab && event.button === 1) openInNewTab(event);\n };\n\n const hasActions = Boolean(onRename || onToggleFavorite || onArchive || onOpenInNewTab);\n const body = (\n <>\n <SessionStatusIndicator kind={indicator} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex h-5 items-center gap-1.5\">\n {editing ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={draft}\n maxLength={THREAD_TITLE_MAX_LENGTH}\n aria-label=\"Session title\"\n data-rename-input\n onChange={(event: ChangeEvent<HTMLInputElement>) => setDraft(event.target.value)}\n onKeyDown={handleEditorKeyDown}\n onBlur={commitRename}\n onClick={stopPropagation}\n className={cn(\n 'h-5 min-w-0 flex-1 rounded border border-primary/60 bg-background px-1 font-medium text-foreground text-sm',\n FOCUS_RING_CLASS,\n )}\n />\n ) : (\n <span data-title className=\"min-w-0 truncate font-medium text-sm\">\n {title}\n </span>\n )}\n {thread.isFavorited && !onToggleFavorite ? (\n <PinIcon\n role=\"img\"\n aria-label=\"Pinned\"\n className=\"size-3 shrink-0 fill-current text-muted-foreground\"\n />\n ) : null}\n {origin ? (\n <span\n data-origin={origin}\n className=\"shrink-0 rounded-full border border-border/60 px-1.5 py-px text-[10px] text-muted-foreground\"\n >\n {origin}\n </span>\n ) : null}\n </span>\n <span\n data-line={line.kind}\n className={cn('mt-0.5 block h-4 truncate font-normal text-xs leading-4', LINE_TONE_CLASS[line.tone])}\n >\n {line.text}\n </span>\n </span>\n </>\n );\n\n return (\n <li\n data-active={isActive || undefined}\n data-thread-id={thread.id}\n data-editing={editing || undefined}\n onPointerEnter={handlePointerEnter}\n onPointerLeave={cancelHover}\n className={cn(\n 'group relative flex items-start gap-1 rounded-lg text-muted-foreground transition-colors hover:bg-muted/40 hover:text-foreground',\n isActive && 'bg-muted text-foreground',\n )}\n >\n {isActive ? (\n <span\n aria-hidden=\"true\"\n data-active-accent\n className=\"absolute inset-y-2 left-0 w-0.5 rounded-full bg-primary\"\n />\n ) : null}\n {editing ? (\n <div className=\"flex min-w-0 flex-1 items-start gap-2 p-2 pl-3 text-left\">{body}</div>\n ) : (\n <button\n type=\"button\"\n onClick={handleRowClick}\n onAuxClick={handleRowAuxClick}\n onFocus={handleFocus}\n className={cn(\n 'flex min-w-0 flex-1 cursor-pointer items-start gap-2 rounded-lg p-2 pl-3 text-left',\n FOCUS_RING_CLASS,\n )}\n >\n {body}\n </button>\n )}\n {chip || hasActions ? (\n <div className=\"flex shrink-0 flex-col items-end justify-between gap-0.5 py-2 pr-2\">\n {hasActions ? (\n <div data-row-actions className=\"flex h-5 items-center gap-0.5\">\n {onOpenInNewTab ? (\n <RowActionButton\n label=\"Open in new tab\"\n onClick={openInNewTab}\n pending={false}\n alwaysVisible={false}\n action=\"open-in-new-tab\"\n >\n <SquareArrowOutUpRightIcon className=\"size-3.5\" aria-hidden />\n </RowActionButton>\n ) : null}\n {onRename ? (\n <RowActionButton\n label=\"Rename session\"\n onClick={beginRename}\n pending={renamePending}\n alwaysVisible={false}\n action=\"rename\"\n >\n <PencilIcon className=\"size-3.5\" aria-hidden />\n </RowActionButton>\n ) : null}\n {onToggleFavorite ? (\n <PinToggle thread={thread} pending={favoritePending} onToggle={onToggleFavorite} />\n ) : null}\n {onArchive ? (\n <RowActionButton\n label=\"Archive session\"\n onClick={handleArchive}\n pending={archivePending}\n alwaysVisible={false}\n action=\"archive\"\n >\n <ArchiveIcon className=\"size-3.5\" aria-hidden />\n </RowActionButton>\n ) : null}\n </div>\n ) : (\n <span aria-hidden=\"true\" className=\"h-5\" />\n )}\n {chip ? <PullRequestChip chip={chip} pullRequests={thread.pullRequests ?? []} /> : null}\n </div>\n ) : null}\n </li>\n );\n};\n\n/**\n * Devin-style session list: the `ThreadList` rows with an attention\n * indicator, the server's next action, pull-request chips, an origin badge\n * and a trailing action cluster (rename inline, pin, archive) revealed on\n * hover or focus, grouped by what each session asks of the viewer. Reads the\n * thread-list state that `<AthenaProvider enableThreadList>` provides and\n * renders nothing outside that mode.\n *\n * Every write is optimistic and rolls back on failure: the pin flips the row\n * and moves it between `Pinned` and `Recent`; the rename shows the new title\n * on commit; the archive removes the row. On a backend that predates a route\n * the matching action is withdrawn (`favoriteToggleAvailable` falls back to a\n * read-only pin; `renameAvailable` / `archiveAvailable` hide the action).\n *\n * Rows warm the provider's snapshot cache after a 120 ms hover dwell (and on\n * focus) so a selection paints its transcript at once. Skeleton rows stand in\n * while the first page loads or a refresh has nothing to keep; the empty\n * state appears only after a settled empty answer, and a background refresh\n * never blanks the rows it already has.\n */\nexport function SessionList({\n className,\n grouped = true,\n showSearch = true,\n showNewChat = true,\n originBadges = 'all',\n showPinToggle = true,\n showRename = true,\n showArchive = true,\n prefetchOnHover = true,\n onOpenInNewTab,\n}: SessionListProps) {\n const list = useAthenaStatewireThreadList();\n if (!list) return null;\n\n const sections = groupSessions(list.threads, grouped);\n const hasSearch = list.search.trim().length > 0;\n const handleSearch = (event: ChangeEvent<HTMLInputElement>) =>\n list.setSearch(event.target.value);\n const onToggleFavorite =\n showPinToggle && list.favoriteToggleAvailable ? list.setFavorited : undefined;\n const onRename = showRename && list.renameAvailable ? list.renameThread : undefined;\n const onArchive = showArchive && list.archiveAvailable ? list.archiveThread : undefined;\n const onPrefetch = prefetchOnHover ? list.prefetchThread : undefined;\n // Skeleton until the first page has answered (no credential yet, or the\n // page in flight) and for a refresh with no rows to keep; a refresh that\n // has rows keeps showing them.\n const showSkeleton =\n !list.hasResolvedFirstPage || (list.isFetching && list.threads.length === 0);\n\n return (\n <div\n className={cn('athena-sdk-chrome flex flex-col gap-2', className)}\n data-testid=\"session-list\"\n >\n {showNewChat ? (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={list.newThread}\n className={cn(\n 'flex h-9 flex-1 items-center gap-2 rounded-lg border border-border/60 px-3 font-medium text-muted-foreground text-sm transition-colors hover:bg-muted hover:text-foreground',\n FOCUS_RING_CLASS,\n )}\n >\n <PlusIcon className=\"size-4\" />\n New Chat\n </button>\n <button\n type=\"button\"\n onClick={list.refresh}\n disabled={list.isFetching}\n className={cn(\n 'flex size-9 items-center justify-center rounded-lg border border-border/60 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n title=\"Refresh sessions\"\n aria-label=\"Refresh sessions\"\n >\n <RefreshCwIcon className={cn('size-4', list.isFetching && 'animate-spin')} />\n </button>\n </div>\n ) : null}\n\n {showSearch ? (\n <label className=\"relative block\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <span className=\"sr-only\">Search sessions</span>\n <input\n type=\"search\"\n value={list.search}\n onChange={handleSearch}\n placeholder=\"Search sessions…\"\n className=\"h-8 w-full rounded-lg border border-border/60 bg-muted/40 pr-2 pl-8 text-sm outline-none focus:border-primary focus:bg-background\"\n />\n </label>\n ) : null}\n\n {showSkeleton ? (\n <SessionListSkeleton />\n ) : sections.length === 0 ? (\n <p data-testid=\"session-list-empty\" className=\"px-3 py-4 text-muted-foreground text-xs\">\n {hasSearch ? 'No matching sessions.' : 'No sessions yet.'}\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\" aria-busy={list.isFetching || undefined}>\n {sections.map(({ group, items }) => (\n <section\n key={group ?? 'all'}\n aria-label={group ?? 'Sessions'}\n data-group={group ?? undefined}\n >\n {group ? (\n <h3 className=\"px-3 pb-1 font-medium text-[11px] text-muted-foreground/70 uppercase tracking-wide\">\n {group}\n </h3>\n ) : null}\n <ul className=\"flex flex-col gap-0.5\">\n {items.map((thread) => (\n <SessionRow\n key={thread.id}\n thread={thread}\n isActive={thread.id === list.activeThreadId}\n onSelect={list.selectThread}\n onPrefetch={onPrefetch}\n onToggleFavorite={onToggleFavorite}\n favoritePending={list.favoritePendingThreadIds.has(thread.id)}\n onRename={onRename}\n renamePending={list.renamePendingThreadIds.has(thread.id)}\n onArchive={onArchive}\n archivePending={list.archivePendingThreadIds.has(thread.id)}\n onOpenInNewTab={onOpenInNewTab}\n originBadges={originBadges}\n />\n ))}\n </ul>\n </section>\n ))}\n </div>\n )}\n\n {list.hasNextPage && !showSkeleton ? (\n <button\n type=\"button\"\n disabled={list.isFetchingNextPage}\n onClick={list.fetchNextPage}\n className={cn(\n 'w-full rounded-lg py-2 text-muted-foreground text-xs transition-colors hover:bg-muted disabled:opacity-50',\n FOCUS_RING_CLASS,\n )}\n >\n {list.isFetchingNextPage ? 'Loading…' : 'Load more'}\n </button>\n ) : null}\n </div>\n );\n}\n"],"names":["jsx","LoaderCircleIcon","ClockIcon","cn","FOCUS_RING_CLASS","PinIcon","jsxs","sessionIndicator","sessionSecondaryLine","pullRequestChip","sessionOriginBadge","useRef","useCallback","useEffect","THREAD_PREFETCH_HOVER_DELAY_MS","useState","Fragment","THREAD_TITLE_MAX_LENGTH","stopPropagation","SquareArrowOutUpRightIcon","PencilIcon","ArchiveIcon","PullRequestChip","useAthenaStatewireThreadList","groupSessions","PlusIcon","RefreshCwIcon","SearchIcon"],"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 popover = require("../ui/popover.cjs");
7
7
  const SessionList = require("./SessionList.cjs");
8
8
  const sessionListModel = require("./session-list-model.cjs");
@@ -120,7 +120,7 @@ const FilterMenu = ({
120
120
  labels
121
121
  }) => {
122
122
  var _a;
123
- const [presetBounds] = react.useState(
123
+ const [presetBounds] = require$$0.useState(
124
124
  () => Object.fromEntries(
125
125
  sessionsPageModel.SESSIONS_DATE_PRESETS.map((preset) => [preset.id, sessionsPageModel.datePresetBounds(preset.id)])
126
126
  )
@@ -470,20 +470,20 @@ function SessionsPageBody({
470
470
  onNewSession,
471
471
  list
472
472
  }) {
473
- const [initial] = react.useState(() => sessionsPageStorage.readSessionsPageSettings(storageKey));
474
- const [savedDefault, setSavedDefault] = react.useState(initial.defaultQuery);
475
- const [query, setQueryState] = react.useState(
473
+ const [initial] = require$$0.useState(() => sessionsPageStorage.readSessionsPageSettings(storageKey));
474
+ const [savedDefault, setSavedDefault] = require$$0.useState(initial.defaultQuery);
475
+ const [query, setQueryState] = require$$0.useState(
476
476
  () => initial.defaultQuery ?? sessionsQuery.normalizeSessionsQuery(defaultQuery ?? {})
477
477
  );
478
- const [display, setDisplayState] = react.useState(initial.display);
479
- const [searchInput, setSearchInput] = react.useState(query.search ?? "");
478
+ const [display, setDisplayState] = require$$0.useState(initial.display);
479
+ const [searchInput, setSearchInput] = require$$0.useState(query.search ?? "");
480
480
  const setQuery = (update) => setQueryState((current) => sessionsQuery.normalizeSessionsQuery(update(current)));
481
481
  const setDisplay = (update) => setDisplayState((current) => {
482
482
  const next = update(current);
483
483
  sessionsPageStorage.writeSessionsPageSettings(storageKey, { defaultQuery: savedDefault, display: next });
484
484
  return next;
485
485
  });
486
- react.useEffect(() => {
486
+ require$$0.useEffect(() => {
487
487
  const handle = setTimeout(() => {
488
488
  setQueryState((current) => {
489
489
  const search = searchInput.trim();
@@ -494,11 +494,11 @@ function SessionsPageBody({
494
494
  return () => clearTimeout(handle);
495
495
  }, [searchInput]);
496
496
  const sessions = useAthenaSessions.useAthenaSessions({ query, ...pageSize ? { pageSize } : {} });
497
- const unavailable = react.useMemo(
497
+ const unavailable = require$$0.useMemo(
498
498
  () => /* @__PURE__ */ new Set([...sessions.unsupportedFields, ...sessions.unavailableFields]),
499
499
  [sessions.unsupportedFields, sessions.unavailableFields]
500
500
  );
501
- const seenRef = react.useRef({ agents: /* @__PURE__ */ new Set(), channels: /* @__PURE__ */ new Set(), origins: /* @__PURE__ */ new Set() });
501
+ const seenRef = require$$0.useRef({ agents: /* @__PURE__ */ new Set(), channels: /* @__PURE__ */ new Set(), origins: /* @__PURE__ */ new Set() });
502
502
  for (const row of sessions.rows) {
503
503
  if (row.collabAgentId) {
504
504
  seenRef.current.agents.add(row.collabAgentId);
@@ -745,7 +745,7 @@ function SessionsPageBody({
745
745
  }
746
746
  function SessionsPage(props) {
747
747
  const list = statewireThreadList.useAthenaStatewireThreadList();
748
- const live = react.useContext(statewireThreadList.AthenaSessionsLiveContext);
748
+ const live = require$$0.useContext(statewireThreadList.AthenaSessionsLiveContext);
749
749
  if (!list || !live) return null;
750
750
  return /* @__PURE__ */ jsxRuntime.jsx(SessionsPageBody, { ...props, list });
751
751
  }