@athenaintel/react 0.42.2 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/README.md +225 -3
  2. package/dist/agent-runtime/src/answer-label.cjs +137 -0
  3. package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
  4. package/dist/agent-runtime/src/answer-label.d.ts +104 -0
  5. package/dist/agent-runtime/src/answer-label.js +137 -0
  6. package/dist/agent-runtime/src/answer-label.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-rows.cjs +180 -0
  8. package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
  9. package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
  10. package/dist/agent-runtime/src/answer-rows.js +180 -0
  11. package/dist/agent-runtime/src/answer-rows.js.map +1 -0
  12. package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
  13. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  14. package/dist/agent-runtime/src/conversation-index.cjs +8 -8
  15. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
  16. package/dist/agent-runtime/src/conversation-list-groups.d.ts +74 -0
  17. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  18. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  19. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  20. package/dist/agent-runtime/src/decision-checks.js +207 -0
  21. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  22. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  23. package/dist/agent-runtime/src/errors.cjs +18 -0
  24. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  25. package/dist/agent-runtime/src/errors.d.ts +7 -0
  26. package/dist/agent-runtime/src/errors.js +18 -0
  27. package/dist/agent-runtime/src/errors.js.map +1 -1
  28. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  29. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  30. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  31. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  32. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  33. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  34. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  35. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  36. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  37. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  38. package/dist/agent-runtime/src/index.d.ts +15 -8
  39. package/dist/agent-runtime/src/interrupts.cjs +43 -18
  40. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  41. package/dist/agent-runtime/src/interrupts.d.ts +19 -2
  42. package/dist/agent-runtime/src/interrupts.js +28 -3
  43. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  44. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  45. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  46. package/dist/agent-runtime/src/messages.cjs +43 -8
  47. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  48. package/dist/agent-runtime/src/messages.d.ts +25 -3
  49. package/dist/agent-runtime/src/messages.js +43 -8
  50. package/dist/agent-runtime/src/messages.js.map +1 -1
  51. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  52. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  53. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  54. package/dist/agent-runtime/src/offline-status.js +36 -0
  55. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  56. package/dist/agent-runtime/src/queue.cjs +0 -9
  57. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  58. package/dist/agent-runtime/src/queue.js +0 -9
  59. package/dist/agent-runtime/src/queue.js.map +1 -1
  60. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  61. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  62. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  63. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  64. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  65. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  66. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  67. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  68. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  69. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  70. package/dist/agent-runtime/src/runtime.d.ts +40 -0
  71. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  72. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  73. package/dist/agent-runtime/src/subagents.cjs +32 -2
  74. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  75. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  76. package/dist/agent-runtime/src/subagents.js +30 -0
  77. package/dist/agent-runtime/src/subagents.js.map +1 -1
  78. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  79. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  80. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  81. package/dist/agent-runtime/src/thread-driver.js +67 -0
  82. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  83. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  84. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +756 -0
  85. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  86. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  87. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  88. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  89. package/dist/agent-runtime/src/tool-metadata.cjs +210 -33
  90. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  91. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  92. package/dist/agent-runtime/src/tool-metadata.js +210 -33
  93. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  94. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  95. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  96. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  97. package/dist/agent-runtime/src/tool-names.js +2 -0
  98. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  99. package/dist/agent-runtime/src/types.d.ts +10 -2
  100. package/dist/agent-runtime/src/use-conversation-list.cjs +11 -11
  101. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  102. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +24 -19
  103. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  104. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +2 -1
  105. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +6 -1
  106. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  107. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  108. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  109. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  110. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  111. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +16 -16
  112. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  113. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  114. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  115. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +572 -134
  116. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  117. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +137 -10
  118. package/dist/agent-runtime/src/use-deep-agent-voice.js +514 -76
  119. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  120. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  121. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  122. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  123. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  124. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +28 -26
  125. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  126. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  127. package/dist/agent-runtime/src/voice-media.d.ts +49 -0
  128. package/dist/agent-runtime/src/voice-media.js +117 -0
  129. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  130. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  131. package/dist/assets/AssetPanel.cjs +11 -11
  132. package/dist/assets/AssetPanel.cjs.map +1 -1
  133. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  134. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  135. package/dist/assets/AthenaAssetEmbed.d.ts +7 -0
  136. package/dist/assets/AthenaAssetEmbed.js +4 -2
  137. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  138. package/dist/assets/AthenaLayout.cjs +16 -16
  139. package/dist/assets/AthenaLayout.cjs.map +1 -1
  140. package/dist/assets/use-asset-content.cjs +4 -4
  141. package/dist/assets/use-asset-content.cjs.map +1 -1
  142. package/dist/assets/use-asset-embed.cjs +14 -7
  143. package/dist/assets/use-asset-embed.cjs.map +1 -1
  144. package/dist/assets/use-asset-embed.d.ts +11 -1
  145. package/dist/assets/use-asset-embed.js +10 -3
  146. package/dist/assets/use-asset-embed.js.map +1 -1
  147. package/dist/auth/AthenaAuthContext.cjs +3 -3
  148. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  149. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  150. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  151. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  152. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  153. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  154. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  155. package/dist/auth/credential-source.cjs +26 -13
  156. package/dist/auth/credential-source.cjs.map +1 -1
  157. package/dist/auth/credential-source.d.ts +8 -0
  158. package/dist/auth/credential-source.js +26 -13
  159. package/dist/auth/credential-source.js.map +1 -1
  160. package/dist/catalog/agent-model-options.cjs +25 -17
  161. package/dist/catalog/agent-model-options.cjs.map +1 -1
  162. package/dist/catalog/agent-model-options.d.ts +38 -5
  163. package/dist/catalog/agent-model-options.js +25 -17
  164. package/dist/catalog/agent-model-options.js.map +1 -1
  165. package/dist/catalog/channel-refusal.cjs +36 -0
  166. package/dist/catalog/channel-refusal.cjs.map +1 -0
  167. package/dist/catalog/channel-refusal.d.ts +29 -0
  168. package/dist/catalog/channel-refusal.js +36 -0
  169. package/dist/catalog/channel-refusal.js.map +1 -0
  170. package/dist/catalog/chat-pickers.cjs +60 -24
  171. package/dist/catalog/chat-pickers.cjs.map +1 -1
  172. package/dist/catalog/chat-pickers.d.ts +12 -2
  173. package/dist/catalog/chat-pickers.js +56 -20
  174. package/dist/catalog/chat-pickers.js.map +1 -1
  175. package/dist/catalog/runtime-catalog.cjs +89 -23
  176. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  177. package/dist/catalog/runtime-catalog.d.ts +8 -2
  178. package/dist/catalog/runtime-catalog.js +83 -17
  179. package/dist/catalog/runtime-catalog.js.map +1 -1
  180. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  181. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  182. package/dist/chat/AthenaChat.cjs +155 -67
  183. package/dist/chat/AthenaChat.cjs.map +1 -1
  184. package/dist/chat/AthenaChat.d.ts +42 -2
  185. package/dist/chat/AthenaChat.js +106 -18
  186. package/dist/chat/AthenaChat.js.map +1 -1
  187. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  188. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  189. package/dist/chat/DrivingOnChip.cjs +23 -0
  190. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  191. package/dist/chat/DrivingOnChip.d.ts +17 -0
  192. package/dist/chat/DrivingOnChip.js +23 -0
  193. package/dist/chat/DrivingOnChip.js.map +1 -0
  194. package/dist/chat/StatewireApprovalCard.cjs +125 -31
  195. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  196. package/dist/chat/StatewireApprovalCard.d.ts +73 -1
  197. package/dist/chat/StatewireApprovalCard.js +115 -21
  198. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  199. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  200. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  201. package/dist/chat/StatewireQueuedMessages.cjs +25 -63
  202. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  203. package/dist/chat/StatewireQueuedMessages.d.ts +11 -13
  204. package/dist/chat/StatewireQueuedMessages.js +16 -54
  205. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  206. package/dist/chat/WaitingOnYouBanner.cjs +3 -3
  207. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  208. package/dist/chat/athena-chat-welcome.cjs +2 -2
  209. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  210. package/dist/chat/athena-citation-links.cjs +5 -5
  211. package/dist/chat/athena-citation-links.cjs.map +1 -1
  212. package/dist/chat/athena-composer-controls.cjs +26 -16
  213. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  214. package/dist/chat/athena-composer-controls.d.ts +6 -0
  215. package/dist/chat/athena-composer-controls.js +26 -16
  216. package/dist/chat/athena-composer-controls.js.map +1 -1
  217. package/dist/chat/athena-turn-end-status.cjs +42 -0
  218. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  219. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  220. package/dist/chat/athena-turn-end-status.js +42 -0
  221. package/dist/chat/athena-turn-end-status.js.map +1 -0
  222. package/dist/chat/browser-decision-check.cjs +131 -0
  223. package/dist/chat/browser-decision-check.cjs.map +1 -0
  224. package/dist/chat/browser-decision-check.d.ts +61 -0
  225. package/dist/chat/browser-decision-check.js +131 -0
  226. package/dist/chat/browser-decision-check.js.map +1 -0
  227. package/dist/chat/chat-outbox-rows.cjs +3 -3
  228. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  229. package/dist/chat/chat-voice-controls.cjs +93 -28
  230. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  231. package/dist/chat/chat-voice-controls.d.ts +36 -2
  232. package/dist/chat/chat-voice-controls.js +89 -24
  233. package/dist/chat/chat-voice-controls.js.map +1 -1
  234. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  235. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  236. package/dist/chat/device-operation.cjs +29 -0
  237. package/dist/chat/device-operation.cjs.map +1 -0
  238. package/dist/chat/device-operation.d.ts +34 -0
  239. package/dist/chat/device-operation.js +29 -0
  240. package/dist/chat/device-operation.js.map +1 -0
  241. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  242. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  243. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  244. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  245. package/dist/chat/super-grouping/SuperGroupingCard.cjs +60 -38
  246. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  247. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +24 -4
  248. package/dist/chat/super-grouping/SuperGroupingCard.js +37 -15
  249. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  250. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  251. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  252. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  253. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  254. package/dist/chat/super-grouping/ToolTimeline.cjs +97 -37
  255. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  256. package/dist/chat/super-grouping/ToolTimeline.d.ts +14 -2
  257. package/dist/chat/super-grouping/ToolTimeline.js +94 -34
  258. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  259. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  260. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  261. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  262. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  263. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  264. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  265. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  266. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  267. package/dist/chat/super-grouping/grouping-function.js +5 -1
  268. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  269. package/dist/chat/super-grouping/index.cjs +6 -0
  270. package/dist/chat/super-grouping/index.cjs.map +1 -1
  271. package/dist/chat/super-grouping/index.d.ts +6 -2
  272. package/dist/chat/super-grouping/index.js +7 -1
  273. package/dist/chat/super-grouping/index.js.map +1 -1
  274. package/dist/chat/super-grouping/timeline-step.cjs +61 -2
  275. package/dist/chat/super-grouping/timeline-step.cjs.map +1 -1
  276. package/dist/chat/super-grouping/timeline-step.d.ts +13 -1
  277. package/dist/chat/super-grouping/timeline-step.js +61 -2
  278. package/dist/chat/super-grouping/timeline-step.js.map +1 -1
  279. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  280. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  281. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  282. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  283. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  284. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  285. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  286. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  287. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  288. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  289. package/dist/chat/tooltip-icon-button.cjs +2 -2
  290. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  291. package/dist/chat/use-athena-voice-live.cjs +11 -0
  292. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  293. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  294. package/dist/chat/use-athena-voice-live.js +11 -0
  295. package/dist/chat/use-athena-voice-live.js.map +1 -0
  296. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  297. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  298. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  299. package/dist/chat/use-statewire-approval-request.js +41 -9
  300. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  301. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  302. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  303. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  304. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  305. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  306. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  307. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  308. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  309. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  310. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  311. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  312. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  313. package/dist/chat-ui/index.cjs +18 -0
  314. package/dist/chat-ui/index.cjs.map +1 -1
  315. package/dist/chat-ui/index.d.ts +7 -1
  316. package/dist/chat-ui/index.js +18 -0
  317. package/dist/chat-ui/index.js.map +1 -1
  318. package/dist/chat-ui/mentions/mention-chip.cjs +147 -38
  319. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  320. package/dist/chat-ui/mentions/mention-chip.d.ts +17 -1
  321. package/dist/chat-ui/mentions/mention-chip.js +146 -37
  322. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  323. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  324. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  325. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  326. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  327. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  328. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  329. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  330. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  331. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  332. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  333. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  334. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  335. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  336. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  337. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  338. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  339. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  340. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  341. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  342. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  343. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  344. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  345. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  346. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  347. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  348. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  349. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  350. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  351. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  352. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  353. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  354. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  355. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  356. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  357. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  358. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  359. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  360. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  361. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  362. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  363. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  364. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  365. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  366. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  367. package/dist/chat-ui/mentions/use-mention-asset.cjs +140 -0
  368. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -0
  369. package/dist/chat-ui/mentions/use-mention-asset.d.ts +16 -0
  370. package/dist/chat-ui/mentions/use-mention-asset.js +140 -0
  371. package/dist/chat-ui/mentions/use-mention-asset.js.map +1 -0
  372. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  373. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  374. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  375. package/dist/chat-ui/messages/answer-label.js +42 -0
  376. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  377. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  378. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  379. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  380. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  381. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  382. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  383. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  384. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  385. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  386. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  387. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  388. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  389. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  390. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  391. package/dist/chat-ui/messages/message-components.cjs +8 -4
  392. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  393. package/dist/chat-ui/messages/message-components.js +5 -1
  394. package/dist/chat-ui/messages/message-components.js.map +1 -1
  395. package/dist/chat-ui/messages/message-images.cjs +66 -0
  396. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  397. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  398. package/dist/chat-ui/messages/message-images.js +66 -0
  399. package/dist/chat-ui/messages/message-images.js.map +1 -0
  400. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  401. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  402. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  403. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  404. package/dist/chat-ui/rich-text/chat-link.cjs +7 -6
  405. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  406. package/dist/chat-ui/rich-text/chat-link.d.ts +2 -3
  407. package/dist/chat-ui/rich-text/chat-link.js +6 -5
  408. package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
  409. package/dist/chat-ui/rich-text/chat-message-body.cjs +8 -8
  410. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  411. package/dist/chat-ui/rich-text/chat-node-views.cjs +7 -6
  412. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  413. package/dist/chat-ui/rich-text/chat-node-views.js +1 -0
  414. package/dist/chat-ui/rich-text/chat-node-views.js.map +1 -1
  415. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  416. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  417. package/dist/chat-ui/statewire.cjs +3 -0
  418. package/dist/chat-ui/statewire.cjs.map +1 -1
  419. package/dist/chat-ui/statewire.d.ts +2 -1
  420. package/dist/chat-ui/statewire.js +3 -0
  421. package/dist/chat-ui/statewire.js.map +1 -1
  422. package/dist/chat-ui/thread/chat-thread-shell.cjs +43 -14
  423. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  424. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  425. package/dist/chat-ui/thread/chat-thread-shell.js +35 -6
  426. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  427. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  428. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  429. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  430. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  431. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  432. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  433. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  434. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  435. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  436. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  437. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  438. package/dist/collab/client.cjs +40 -3
  439. package/dist/collab/client.cjs.map +1 -1
  440. package/dist/collab/client.d.ts +25 -0
  441. package/dist/collab/client.js +40 -3
  442. package/dist/collab/client.js.map +1 -1
  443. package/dist/collab/document-status.cjs +150 -0
  444. package/dist/collab/document-status.cjs.map +1 -0
  445. package/dist/collab/document-status.d.ts +68 -0
  446. package/dist/collab/document-status.js +150 -0
  447. package/dist/collab/document-status.js.map +1 -0
  448. package/dist/collab/index.cjs +7 -0
  449. package/dist/collab/index.cjs.map +1 -1
  450. package/dist/collab/index.d.ts +6 -1
  451. package/dist/collab/index.js +7 -0
  452. package/dist/collab/index.js.map +1 -1
  453. package/dist/collab/presence-react.cjs +11 -11
  454. package/dist/collab/presence-react.cjs.map +1 -1
  455. package/dist/collab/react.cjs +6 -6
  456. package/dist/collab/react.cjs.map +1 -1
  457. package/dist/composer/AttachmentContext.cjs +24 -11
  458. package/dist/composer/AttachmentContext.cjs.map +1 -1
  459. package/dist/composer/AttachmentContext.js +18 -5
  460. package/dist/composer/AttachmentContext.js.map +1 -1
  461. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  462. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  463. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  464. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  465. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  466. package/dist/composer/ComposerDropZone.cjs +7 -7
  467. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  468. package/dist/composer/FileUploadButton.cjs +37 -22
  469. package/dist/composer/FileUploadButton.cjs.map +1 -1
  470. package/dist/composer/FileUploadButton.d.ts +6 -0
  471. package/dist/composer/FileUploadButton.js +34 -19
  472. package/dist/composer/FileUploadButton.js.map +1 -1
  473. package/dist/composer/QuoteContext.cjs +8 -8
  474. package/dist/composer/QuoteContext.cjs.map +1 -1
  475. package/dist/composer/composer-handoff.cjs +4 -4
  476. package/dist/composer/composer-handoff.cjs.map +1 -1
  477. package/dist/composer/useAppendToComposer.cjs +4 -4
  478. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  479. package/dist/composer/useAttachFiles.cjs +23 -6
  480. package/dist/composer/useAttachFiles.cjs.map +1 -1
  481. package/dist/composer/useAttachFiles.d.ts +15 -7
  482. package/dist/composer/useAttachFiles.js +22 -5
  483. package/dist/composer/useAttachFiles.js.map +1 -1
  484. package/dist/composer/useComposerAttachment.cjs +4 -4
  485. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  486. package/dist/composer/useFileUpload.cjs +21 -16
  487. package/dist/composer/useFileUpload.cjs.map +1 -1
  488. package/dist/composer/useFileUpload.d.ts +12 -0
  489. package/dist/composer/useFileUpload.js +12 -7
  490. package/dist/composer/useFileUpload.js.map +1 -1
  491. package/dist/composer/useReadComposerDraft.cjs +2 -2
  492. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  493. package/dist/composer/useSendMessage.cjs +4 -4
  494. package/dist/composer/useSendMessage.cjs.map +1 -1
  495. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  496. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  497. package/dist/dictation/audio-level-history.cjs +3 -3
  498. package/dist/dictation/audio-level-history.cjs.map +1 -1
  499. package/dist/dictation/dictation-controls.cjs +24 -20
  500. package/dist/dictation/dictation-controls.cjs.map +1 -1
  501. package/dist/dictation/dictation-controls.d.ts +6 -1
  502. package/dist/dictation/dictation-controls.js +24 -20
  503. package/dist/dictation/dictation-controls.js.map +1 -1
  504. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  505. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  506. package/dist/dictation/use-dictation.cjs +22 -22
  507. package/dist/dictation/use-dictation.cjs.map +1 -1
  508. package/dist/index.cjs +26 -2
  509. package/dist/index.cjs.map +1 -1
  510. package/dist/index.d.ts +15 -3
  511. package/dist/index.js +26 -2
  512. package/dist/index.js.map +1 -1
  513. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  514. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  515. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  516. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  517. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  518. package/dist/keryx-http/src/update-attributions.cjs +111 -0
  519. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  520. package/dist/keryx-http/src/update-attributions.d.ts +75 -0
  521. package/dist/keryx-http/src/update-attributions.js +111 -0
  522. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  523. package/dist/lib/owner-document.cjs +6 -6
  524. package/dist/lib/owner-document.cjs.map +1 -1
  525. package/dist/lib/use-athena-rest-query.cjs +4 -4
  526. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  527. package/dist/lib/use-document-active.cjs +4 -4
  528. package/dist/lib/use-document-active.cjs.map +1 -1
  529. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  530. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  531. package/dist/offline/offline-history.cjs +7 -7
  532. package/dist/offline/offline-history.cjs.map +1 -1
  533. package/dist/provider/AthenaContext.cjs +3 -3
  534. package/dist/provider/AthenaContext.cjs.map +1 -1
  535. package/dist/provider/AthenaProvider.cjs +116 -79
  536. package/dist/provider/AthenaProvider.cjs.map +1 -1
  537. package/dist/provider/AthenaProvider.js +40 -3
  538. package/dist/provider/AthenaProvider.js.map +1 -1
  539. package/dist/provider/PostHogProvider.cjs +2 -2
  540. package/dist/provider/PostHogProvider.cjs.map +1 -1
  541. package/dist/provider/agent-selection-context.cjs +2 -2
  542. package/dist/provider/agent-selection-context.cjs.map +1 -1
  543. package/dist/provider/chat-mode-context.cjs +2 -2
  544. package/dist/provider/chat-mode-context.cjs.map +1 -1
  545. package/dist/provider/session-persistence-context.cjs +10 -0
  546. package/dist/provider/session-persistence-context.cjs.map +1 -0
  547. package/dist/provider/session-persistence-context.d.ts +15 -0
  548. package/dist/provider/session-persistence-context.js +10 -0
  549. package/dist/provider/session-persistence-context.js.map +1 -0
  550. package/dist/provider/statewire-history-context.cjs +4 -4
  551. package/dist/provider/statewire-history-context.cjs.map +1 -1
  552. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  553. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  554. package/dist/provider/statewire-window-context.cjs +3 -3
  555. package/dist/provider/statewire-window-context.cjs.map +1 -1
  556. package/dist/provider/theme-style-context.cjs +3 -3
  557. package/dist/provider/theme-style-context.cjs.map +1 -1
  558. package/dist/react/package.json.cjs +1 -1
  559. package/dist/react/package.json.js +1 -1
  560. package/dist/references/src/tool-option-schemas.d.ts +0 -34
  561. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  562. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  563. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  564. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  565. package/dist/runtime/auth.cjs +13 -13
  566. package/dist/runtime/auth.cjs.map +1 -1
  567. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  568. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  569. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  570. package/dist/runtime/statewire-lifecycle.js +2 -1
  571. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  572. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  573. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  574. package/dist/runtime/statewire-session-lane.cjs +4 -4
  575. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  576. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  577. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  578. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  579. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  580. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  581. package/dist/styles.css +1 -1
  582. package/dist/threads/Inbox.cjs +8 -8
  583. package/dist/threads/Inbox.cjs.map +1 -1
  584. package/dist/threads/SessionList.cjs +9 -9
  585. package/dist/threads/SessionList.cjs.map +1 -1
  586. package/dist/threads/SessionsPage.cjs +11 -11
  587. package/dist/threads/SessionsPage.cjs.map +1 -1
  588. package/dist/threads/index-triggered-refresh.cjs +10 -10
  589. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  590. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  591. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  592. package/dist/threads/offline-session-list.cjs +3 -3
  593. package/dist/threads/offline-session-list.cjs.map +1 -1
  594. package/dist/threads/session-list-tab-share.cjs +5 -5
  595. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  596. package/dist/threads/statewire-thread-list.cjs +55 -51
  597. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  598. package/dist/threads/statewire-thread-list.js +6 -2
  599. package/dist/threads/statewire-thread-list.js.map +1 -1
  600. package/dist/threads/thread-id-context.cjs +5 -5
  601. package/dist/threads/thread-id-context.cjs.map +1 -1
  602. package/dist/threads/use-athena-session-attention.cjs +2 -2
  603. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  604. package/dist/threads/use-athena-sessions.cjs +10 -10
  605. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  606. package/dist/threads/use-athena-thread-model.cjs +3 -3
  607. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  608. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  609. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  610. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  611. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  612. package/dist/threads/use-thread-archive.cjs +9 -9
  613. package/dist/threads/use-thread-archive.cjs.map +1 -1
  614. package/dist/threads/use-thread-favorite.cjs +2 -2
  615. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  616. package/dist/threads/use-thread-field-override.cjs +20 -20
  617. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  618. package/dist/threads/use-thread-read-state.cjs +4 -4
  619. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  620. package/dist/threads/use-thread-rename.cjs +2 -2
  621. package/dist/threads/use-thread-rename.cjs.map +1 -1
  622. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  623. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  624. package/dist/tools/NestedPtcMessages.cjs +6 -6
  625. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  626. package/dist/tools/append-document-tool-ui.cjs +7 -7
  627. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  628. package/dist/tools/file-tool-uis.cjs +2 -2
  629. package/dist/tools/file-tool-uis.cjs.map +1 -1
  630. package/dist/tools/misc-tool-uis.cjs +2 -2
  631. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  632. package/dist/tools/primitives.cjs +6 -6
  633. package/dist/tools/primitives.cjs.map +1 -1
  634. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  635. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  636. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  637. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  638. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  639. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  640. package/dist/tools/todo-plan-store.cjs +4 -4
  641. package/dist/tools/todo-plan-store.cjs.map +1 -1
  642. package/dist/tools/tool-appearance.cjs +3 -3
  643. package/dist/tools/tool-appearance.cjs.map +1 -1
  644. package/dist/tools/tool-fallback.cjs +14 -14
  645. package/dist/tools/tool-fallback.cjs.map +1 -1
  646. package/dist/tools/tool-summary.cjs +0 -2
  647. package/dist/tools/tool-summary.cjs.map +1 -1
  648. package/dist/tools/tool-summary.js +0 -2
  649. package/dist/tools/tool-summary.js.map +1 -1
  650. package/dist/tools/tool-uis.cjs +74 -74
  651. package/dist/tools/tool-uis.cjs.map +1 -1
  652. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  653. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  654. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  655. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  656. package/dist/ui/image-viewer.cjs +382 -0
  657. package/dist/ui/image-viewer.cjs.map +1 -0
  658. package/dist/ui/image-viewer.d.ts +50 -0
  659. package/dist/ui/image-viewer.js +382 -0
  660. package/dist/ui/image-viewer.js.map +1 -0
  661. package/dist/voice/chat.cjs +6 -0
  662. package/dist/voice/chat.cjs.map +1 -1
  663. package/dist/voice/chat.d.ts +1 -1
  664. package/dist/voice/chat.js +8 -2
  665. package/dist/voice/livekit-join.cjs +52 -101
  666. package/dist/voice/livekit-join.cjs.map +1 -1
  667. package/dist/voice/livekit-join.d.ts +1 -6
  668. package/dist/voice/livekit-join.js +52 -101
  669. package/dist/voice/livekit-join.js.map +1 -1
  670. package/dist/voice/livekit.cjs.map +1 -1
  671. package/dist/voice/livekit.d.ts +11 -1
  672. package/dist/voice/livekit.js.map +1 -1
  673. package/dist/voice/use-athena-voice-session.cjs +34 -34
  674. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  675. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  676. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  677. package/dist/workbench/SessionWorkbench.cjs +22 -22
  678. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  679. package/dist/workbench/session-workbench-context.cjs +3 -3
  680. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  681. package/dist/workbench/session-workbench-panes.cjs +8 -8
  682. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  683. package/dist/workbench/workbench-layout-context.cjs +3 -3
  684. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  685. package/package.json +2 -1
@@ -1,7 +1,7 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { BotIcon, ChevronDownIcon, LayersIcon, CheckIcon, SparklesIcon } from "lucide-react";
3
3
  import { DropdownMenu } from "radix-ui";
4
- import { useState, useRef, useEffect, useContext } from "react";
4
+ import { useRef, useEffect, useContext, useState } from "react";
5
5
  import { usePortalContainer } from "../lib/owner-document.js";
6
6
  import { portalSurfaceStyle } from "../lib/portal-surface.js";
7
7
  import { AthenaAgentSelectionContext } from "../provider/agent-selection-context.js";
@@ -47,6 +47,21 @@ function PickerItem({
47
47
  /* @__PURE__ */ jsx(DropdownMenu.ItemIndicator, { className: "absolute right-2 inline-flex", children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5", "aria-hidden": true }) })
48
48
  ] });
49
49
  }
50
+ function DisabledReason({ reason, children }) {
51
+ if (!reason) return /* @__PURE__ */ jsx(Fragment, { children });
52
+ return /* @__PURE__ */ jsx("span", { className: "inline-flex", title: reason, "data-slot": "chat-picker-disabled-reason", children });
53
+ }
54
+ function usePickerMenu(disabled) {
55
+ const [open, setOpenState] = useState(false);
56
+ if (disabled && open) setOpenState(false);
57
+ return {
58
+ open: open && !disabled,
59
+ setOpen: (next) => setOpenState(next && !disabled),
60
+ choose: (apply) => {
61
+ if (!disabled) apply();
62
+ }
63
+ };
64
+ }
50
65
  function PickerNote({ children, alert = false }) {
51
66
  return /* @__PURE__ */ jsx(
52
67
  "p",
@@ -65,6 +80,7 @@ function ChatModelPicker({
65
80
  agent,
66
81
  channel,
67
82
  disabled = false,
83
+ disabledReason,
68
84
  className
69
85
  }) {
70
86
  const providerSelection = useContext(AthenaAgentSelectionContext);
@@ -80,6 +96,7 @@ function ChatModelPicker({
80
96
  onChange,
81
97
  defaultModelId,
82
98
  disabled,
99
+ disabledReason,
83
100
  className
84
101
  }
85
102
  );
@@ -92,6 +109,7 @@ function ChatModelPicker({
92
109
  defaultModelId,
93
110
  agentSelected,
94
111
  disabled,
112
+ disabledReason,
95
113
  className
96
114
  }
97
115
  );
@@ -103,6 +121,7 @@ function AgentAwareModelPicker({
103
121
  onChange,
104
122
  defaultModelId,
105
123
  disabled,
124
+ disabledReason,
106
125
  className
107
126
  }) {
108
127
  const { choices, modelLabel, catalog } = useAgentModelChoices({ agent: agentAssetId, channel });
@@ -115,6 +134,7 @@ function AgentAwareModelPicker({
115
134
  value,
116
135
  onChange,
117
136
  disabled,
137
+ disabledReason,
118
138
  className
119
139
  }
120
140
  );
@@ -130,6 +150,7 @@ function AgentAwareModelPicker({
130
150
  agentDefaultLabel: choices.defaultModel === null ? null : modelLabel(choices.defaultModel),
131
151
  holdReplacement: choices.status === "loading",
132
152
  disabled,
153
+ disabledReason,
133
154
  className
134
155
  }
135
156
  );
@@ -147,10 +168,12 @@ function WorkspaceModelMenu({
147
168
  agentDefaultLabel = null,
148
169
  holdReplacement = false,
149
170
  disabled,
171
+ disabledReason,
150
172
  className
151
173
  }) {
152
- const [open, setOpen] = useState(false);
174
+ const { open, setOpen, choose } = usePickerMenu(disabled);
153
175
  const models = catalog.data ?? [];
176
+ const reason = disabled ? disabledReason ?? null : null;
154
177
  const resolved = value === null && agentSelected ? null : resolveCatalogModelId({ stored: value, defaultModelId, models });
155
178
  const current = models.find((model) => model.id === resolved);
156
179
  const label = resolved === null ? "Agent’s model" : (current == null ? void 0 : current.label) ?? resolved;
@@ -162,13 +185,14 @@ function WorkspaceModelMenu({
162
185
  replacedRef.current = value;
163
186
  onChange(resolved);
164
187
  }, [holdReplacement, catalog.isSuccess, models, value, resolved, onChange]);
165
- return /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
188
+ return /* @__PURE__ */ jsx(DisabledReason, { reason, children: /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
166
189
  /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
167
190
  "button",
168
191
  {
169
192
  type: "button",
170
193
  className: cn(CHIP_CLASS, className),
171
194
  disabled,
195
+ title: reason ?? void 0,
172
196
  "aria-label": `Model: ${label}`,
173
197
  children: [
174
198
  /* @__PURE__ */ jsx(SparklesIcon, { className: "size-3.5 shrink-0", "aria-hidden": true }),
@@ -181,7 +205,7 @@ function WorkspaceModelMenu({
181
205
  DropdownMenu.RadioGroup,
182
206
  {
183
207
  value: resolved ?? AGENT_OWN_MODEL,
184
- onValueChange: (next) => onChange(next === AGENT_OWN_MODEL ? null : next),
208
+ onValueChange: (next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next)),
185
209
  children: [
186
210
  agentSelected && /* @__PURE__ */ jsx(PickerItem, { value: AGENT_OWN_MODEL, detail: agentDefaultLabel, children: "Agent’s own model" }),
187
211
  catalog.isPending && /* @__PURE__ */ jsx(PickerNote, { children: "Loading models…" }),
@@ -196,7 +220,7 @@ function WorkspaceModelMenu({
196
220
  ]
197
221
  }
198
222
  ) })
199
- ] });
223
+ ] }) });
200
224
  }
201
225
  function AgentModelMenu({
202
226
  choices,
@@ -204,9 +228,11 @@ function AgentModelMenu({
204
228
  value,
205
229
  onChange,
206
230
  disabled,
231
+ disabledReason,
207
232
  className
208
233
  }) {
209
- const [open, setOpen] = useState(false);
234
+ const { open, setOpen, choose } = usePickerMenu(disabled);
235
+ const reason = disabled ? disabledReason ?? null : null;
210
236
  const pinsDefault = value !== null && value === choices.defaultModel;
211
237
  const items = choices.options.map((option) => {
212
238
  const display = modelLabel(option.model);
@@ -252,13 +278,14 @@ function AgentModelMenu({
252
278
  }
253
279
  );
254
280
  }
255
- return /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
281
+ return /* @__PURE__ */ jsx(DisabledReason, { reason, children: /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
256
282
  /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
257
283
  "button",
258
284
  {
259
285
  type: "button",
260
286
  className: cn(CHIP_CLASS, className),
261
287
  disabled,
288
+ title: reason ?? void 0,
262
289
  "aria-label": `Model: ${label}`,
263
290
  children: [
264
291
  /* @__PURE__ */ jsx(SparklesIcon, { className: "size-3.5 shrink-0", "aria-hidden": true }),
@@ -271,7 +298,7 @@ function AgentModelMenu({
271
298
  DropdownMenu.RadioGroup,
272
299
  {
273
300
  value: selectedValue,
274
- onValueChange: (next) => onChange(next === AGENT_OWN_MODEL ? null : next),
301
+ onValueChange: (next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next)),
275
302
  children: [
276
303
  /* @__PURE__ */ jsx(DropdownMenu.Label, { className: "px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: "Agent models" }),
277
304
  items.map((item) => /* @__PURE__ */ jsxs(PickerItem, { value: item.value, detail: item.detail, children: [
@@ -281,13 +308,20 @@ function AgentModelMenu({
281
308
  ]
282
309
  }
283
310
  ) })
284
- ] });
311
+ ] }) });
285
312
  }
286
313
  const NO_AGENT = "__athena__";
287
- function ChatAgentPicker({ value, onChange, disabled = false, className }) {
314
+ function ChatAgentPicker({
315
+ value,
316
+ onChange,
317
+ disabled = false,
318
+ disabledReason,
319
+ className
320
+ }) {
288
321
  var _a;
289
322
  const catalog = useAthenaAgentCatalog();
290
- const [open, setOpen] = useState(false);
323
+ const { open, setOpen, choose } = usePickerMenu(disabled);
324
+ const reason = disabled ? disabledReason ?? null : null;
291
325
  const agents = catalog.data ?? [];
292
326
  const label = value === null ? "Athena" : ((_a = agents.find((agent) => agent.id === value)) == null ? void 0 : _a.name) ?? "Agent";
293
327
  const clearedRef = useRef(null);
@@ -297,13 +331,14 @@ function ChatAgentPicker({ value, onChange, disabled = false, className }) {
297
331
  clearedRef.current = value;
298
332
  onChange(null);
299
333
  }, [catalog.isSuccess, agents, value, onChange]);
300
- return /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
334
+ return /* @__PURE__ */ jsx(DisabledReason, { reason, children: /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
301
335
  /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
302
336
  "button",
303
337
  {
304
338
  type: "button",
305
339
  className: cn(CHIP_CLASS, className),
306
340
  disabled,
341
+ title: reason ?? void 0,
307
342
  "aria-label": `Agent: ${label}`,
308
343
  children: [
309
344
  /* @__PURE__ */ jsx(BotIcon, { className: "size-3.5 shrink-0", "aria-hidden": true }),
@@ -316,7 +351,7 @@ function ChatAgentPicker({ value, onChange, disabled = false, className }) {
316
351
  DropdownMenu.RadioGroup,
317
352
  {
318
353
  value: value ?? NO_AGENT,
319
- onValueChange: (next) => onChange(next === NO_AGENT ? null : next),
354
+ onValueChange: (next) => choose(() => onChange(next === NO_AGENT ? null : next)),
320
355
  children: [
321
356
  /* @__PURE__ */ jsx(PickerItem, { value: NO_AGENT, children: "Athena" }),
322
357
  catalog.isError && /* @__PURE__ */ jsx(PickerNote, { alert: true, children: "Couldn’t load the agents. Try again in a moment." }),
@@ -324,7 +359,7 @@ function ChatAgentPicker({ value, onChange, disabled = false, className }) {
324
359
  ]
325
360
  }
326
361
  ) })
327
- ] });
362
+ ] }) });
328
363
  }
329
364
  function ChatModePicker({
330
365
  value,
@@ -336,16 +371,17 @@ function ChatModePicker({
336
371
  className
337
372
  }) {
338
373
  var _a;
339
- const [open, setOpen] = useState(false);
374
+ const { open, setOpen, choose } = usePickerMenu(disabled);
340
375
  const label = ((_a = options.find((option) => option.id === value)) == null ? void 0 : _a.label) ?? valueLabel ?? value;
341
- return /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
376
+ const reason = disabled ? disabledReason ?? null : null;
377
+ return /* @__PURE__ */ jsx(DisabledReason, { reason, children: /* @__PURE__ */ jsxs(DropdownMenu.Root, { open, onOpenChange: setOpen, children: [
342
378
  /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
343
379
  "button",
344
380
  {
345
381
  type: "button",
346
382
  className: cn(CHIP_CLASS, className),
347
383
  disabled,
348
- title: disabled ? disabledReason : void 0,
384
+ title: reason ?? void 0,
349
385
  "aria-label": `Mode: ${label}`,
350
386
  "data-slot": "chat-mode-picker",
351
387
  children: [
@@ -355,8 +391,8 @@ function ChatModePicker({
355
391
  ]
356
392
  }
357
393
  ) }),
358
- /* @__PURE__ */ jsx(PickerMenu, { label: "Mode", children: /* @__PURE__ */ jsx(DropdownMenu.RadioGroup, { value, onValueChange: onChange, children: options.map((option) => /* @__PURE__ */ jsx(PickerItem, { value: option.id, children: option.label }, option.id)) }) })
359
- ] });
394
+ /* @__PURE__ */ jsx(PickerMenu, { label: "Mode", children: /* @__PURE__ */ jsx(DropdownMenu.RadioGroup, { value, onValueChange: (next) => choose(() => onChange(next)), children: options.map((option) => /* @__PURE__ */ jsx(PickerItem, { value: option.id, children: option.label }, option.id)) }) })
395
+ ] }) });
360
396
  }
361
397
  function AthenaChatModeMenu({ className }) {
362
398
  const mode = useAthenaChatMode();
@@ -1 +1 @@
1
- {"version":3,"file":"chat-pickers.js","sources":["../../src/catalog/chat-pickers.tsx"],"sourcesContent":["import { BotIcon, CheckIcon, ChevronDownIcon, LayersIcon, SparklesIcon } from 'lucide-react';\nimport { DropdownMenu } from 'radix-ui';\nimport { type ReactNode, useContext, useEffect, useRef, useState } from 'react';\nimport { usePortalContainer } from '../lib/owner-document';\nimport { portalSurfaceStyle } from '../lib/portal-surface';\nimport { cn } from '../lib/utils';\nimport { AthenaAgentSelectionContext } from '../provider/agent-selection-context';\nimport { useAthenaThemeStyle } from '../provider/theme-style-context';\nimport type { AthenaChatModeOption } from './agent-mode-menu';\nimport { agentAssetIdOf } from './agent-model-options';\nimport {\n type AthenaAgentModelOptions,\n groupModelsByProvider,\n resolveCatalogModelId,\n useAgentModelChoices,\n useAthenaAgentCatalog,\n useAthenaModelCatalog,\n} from './runtime-catalog';\nimport { useAthenaChatMode } from './use-athena-chat-mode';\n\n/**\n * The composer's agent and model pickers: compact chips for `AthenaChat`'s `toolbarStart` slot\n * that open a menu, as ChatGPT's and Codex's composers do. They are controlled: the host keeps the\n * choice (and remembers it if it likes) and passes it to `AthenaProvider` as `model` and\n * `agent=\"collab_agent:<id>\"`. New messages run with the choice. The menus are Radix radio menus,\n * so arrow keys, typeahead, Escape and focus return work as in any native menu.\n */\n\nconst CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n\n/** The chip without a menu: one choice, shown as a label. */\nconst STATIC_CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground';\n\nconst ITEM_CLASS =\n 'relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-7 text-sm outline-none data-[highlighted]:bg-muted data-[state=checked]:font-medium';\n\n/** The \"Agent's own model\" item's value: a chosen agent runs the model its author set. */\nconst AGENT_OWN_MODEL = '__agent_own_model__';\n\n/** What the chip says while a chosen agent's model is not known. */\nconst AGENT_MODEL_LABEL = 'Agent’s model';\n\n/** The menu body, portaled and themed like the SDK's popovers (it renders outside the provider). */\nfunction PickerMenu({ label, children }: { label: string; children: ReactNode }) {\n const themeStyle = useAthenaThemeStyle();\n const container = usePortalContainer();\n return (\n <DropdownMenu.Portal container={container}>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n aria-label={label}\n // Its box and colours inline: no host stylesheet can take them away\n // (lib/portal-surface.ts).\n style={portalSurfaceStyle({ surface: 'popover', themeStyle })}\n className={cn(\n 'athena-sdk athena-sdk-chrome',\n 'z-50 block max-h-80 w-64 overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md outline-none',\n )}\n >\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n );\n}\n\nfunction PickerItem({\n value,\n detail,\n children,\n}: {\n value: string;\n /** A second, muted line (the model behind an author's label, or why the item is listed). */\n detail?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <DropdownMenu.RadioItem value={value} className={ITEM_CLASS}>\n {detail ? (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">{children}</span>\n <span className=\"truncate text-xs font-normal text-muted-foreground\">{detail}</span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n )}\n <DropdownMenu.ItemIndicator className=\"absolute right-2 inline-flex\">\n <CheckIcon className=\"size-3.5\" aria-hidden />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.RadioItem>\n );\n}\n\nfunction PickerNote({ children, alert = false }: { children: ReactNode; alert?: boolean }) {\n return (\n <p\n className={cn('px-2 py-1.5 text-xs', alert ? 'text-destructive' : 'text-muted-foreground')}\n role={alert ? 'alert' : undefined}\n >\n {children}\n </p>\n );\n}\n\nexport interface ChatModelPickerProps {\n /** The chosen model id; `null` lets a selected agent run its own model. */\n value: string | null;\n onChange: (modelId: string | null) => void;\n /** The model a person who chose nothing runs, e.g. `claude-opus-5-5`. */\n defaultModelId: string;\n /**\n * A collab agent is chosen: the picker offers the workspace's models and\n * \"Agent's own model\" (`null`), as before, unless the agent restricts its\n * models (its \"Allow any workspace model\" switch is off), when it offers\n * exactly the agent's own (`useAthenaAgentModelOptions`). Which agent:\n * `agent`, else the one the surrounding `AthenaProvider` runs as.\n */\n agentSelected?: boolean;\n /**\n * The chosen collab agent, as its asset id or `collab_agent:<id>` (implies\n * `agentSelected`). `null` is no agent.\n */\n agent?: string | null;\n /**\n * The collab channel the chat runs on (its model override is the default\n * there). Defaults to the provider's `channel` when the agent is the\n * provider's.\n */\n channel?: string | null;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Which model new messages run, from the models the workspace allows this\n * person; with an agent chosen, also \"Agent's own model\" (`null`), or exactly\n * the models its author listed when the agent restricts its models\n * (`allowAnyModel: false`, opt-in per agent). The host passes the choice to\n * `AthenaProvider` as `model`; a change reaches an open session too (the\n * provider writes it to the session's server config).\n */\nexport function ChatModelPicker({\n value,\n onChange,\n defaultModelId,\n agentSelected = false,\n agent,\n channel,\n disabled = false,\n className,\n}: ChatModelPickerProps) {\n const providerSelection = useContext(AthenaAgentSelectionContext);\n const agentAssetId =\n agent !== undefined\n ? agentAssetIdOf(agent)\n : agentSelected\n ? (providerSelection?.agentAssetId ?? null)\n : null;\n if (agentAssetId !== null) {\n const agentChannel =\n channel !== undefined\n ? channel\n : providerSelection?.agentAssetId === agentAssetId\n ? providerSelection.channel\n : null;\n return (\n <AgentAwareModelPicker\n agentAssetId={agentAssetId}\n channel={agentChannel}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n disabled={disabled}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelPicker\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected={agentSelected}\n disabled={disabled}\n className={className}\n />\n );\n}\n\n/**\n * The picker with a collab agent chosen. The agent is read first: one that\n * restricts its models gets {@link AgentModelMenu}; every other agent (the\n * default, and one this person cannot read) gets the workspace menu as before,\n * its \"Agent's own model\" naming the agent's default when known. Until the\n * read settles the workspace menu shows but replaces nothing on the host's\n * behalf, since the host's model may be one only the agent offers.\n */\nfunction AgentAwareModelPicker({\n agentAssetId,\n channel,\n value,\n onChange,\n defaultModelId,\n disabled,\n className,\n}: {\n agentAssetId: string;\n channel: string | null;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n disabled: boolean;\n className?: string;\n}) {\n // One query client for the agent read and the catalog both menus name models from.\n const { choices, modelLabel, catalog } = useAgentModelChoices({ agent: agentAssetId, channel });\n if (choices.status === 'ready' && !choices.allowAnyModel) {\n return (\n <AgentModelMenu\n choices={choices}\n modelLabel={modelLabel}\n value={value}\n onChange={onChange}\n disabled={disabled}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelMenu\n catalog={catalog}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected\n agentDefaultLabel={choices.defaultModel === null ? null : modelLabel(choices.defaultModel)}\n holdReplacement={choices.status === 'loading'}\n disabled={disabled}\n className={className}\n />\n );\n}\n\n/** The model picker over the workspace's catalog, with no agent chosen (or none it can name). */\nfunction WorkspaceModelPicker(props: {\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n disabled: boolean;\n className?: string;\n}) {\n const catalog = useAthenaModelCatalog();\n return <WorkspaceModelMenu catalog={catalog} {...props} />;\n}\n\n/** The workspace catalog's menu (the picker as it was before agents could restrict models). */\nfunction WorkspaceModelMenu({\n catalog,\n value,\n onChange,\n defaultModelId,\n agentSelected,\n agentDefaultLabel = null,\n holdReplacement = false,\n disabled,\n className,\n}: {\n catalog: ReturnType<typeof useAthenaModelCatalog>;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n /** The chosen agent's default model (its channel's override when it has one), named under \"Agent's own model\". */\n agentDefaultLabel?: string | null;\n /** Replace no unoffered choice yet (the chosen agent is still being read). */\n holdReplacement?: boolean;\n disabled: boolean;\n className?: string;\n}) {\n const [open, setOpen] = useState(false);\n const models = catalog.data ?? [];\n const resolved =\n value === null && agentSelected\n ? null\n : resolveCatalogModelId({ stored: value, defaultModelId, models });\n const current = models.find((model) => model.id === resolved);\n const label = resolved === null ? 'Agent’s model' : (current?.label ?? resolved);\n // The host's choice is no longer offered (retired, or the workspace stopped allowing it): hand\n // the host the model the chip shows, so new messages run it instead of the dropped id. Once per\n // choice, so a host that keeps the old value is not asked again on every render.\n const replacedRef = useRef<string | null>(null);\n useEffect(() => {\n if (holdReplacement) return;\n if (!catalog.isSuccess || value === null || resolved === null || resolved === value) return;\n if (models.some((model) => model.id === value) || replacedRef.current === value) return;\n replacedRef.current = value;\n onChange(resolved);\n }, [holdReplacement, catalog.isSuccess, models, value, resolved, onChange]);\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={resolved ?? AGENT_OWN_MODEL}\n onValueChange={(next) => onChange(next === AGENT_OWN_MODEL ? null : next)}\n >\n {agentSelected && (\n <PickerItem value={AGENT_OWN_MODEL} detail={agentDefaultLabel}>\n Agent’s own model\n </PickerItem>\n )}\n {catalog.isPending && <PickerNote>Loading models…</PickerNote>}\n {catalog.isError && <PickerNote alert>Couldn’t load the models. Try again in a moment.</PickerNote>}\n {groupModelsByProvider({ models }).map((group) => (\n <DropdownMenu.Group key={group.provider}>\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.provider}\n </DropdownMenu.Label>\n {group.models.map((model) => (\n <PickerItem key={model.id} value={model.id}>\n {model.label}\n {model.status === 'LEGACY' ? ' (legacy)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.Group>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n );\n}\n\n/** One item of the agent's model menu. */\ninterface AgentModelItem {\n /** The radio value: a model id, or {@link AGENT_OWN_MODEL} for \"the agent's default\" (`null`). */\n value: string;\n label: string;\n isDefault: boolean;\n detail: string | null;\n}\n\n/**\n * The menu of a chosen collab agent that restricts its models: exactly its own\n * (`useAthenaAgentModelOptions`), the default as `null`. One choice is a label;\n * two or more a menu. Nothing is replaced on the host's behalf: a host choice\n * the agent does not list (an older pick) is shown and listed as it is, as is\n * a model the session pins outside the agent's list. A host choice that names\n * the default model explicitly is a pin, which the agent's next default would\n * not follow, so the menu then also offers \"Agent's own model\" (`null`).\n */\nfunction AgentModelMenu({\n choices,\n modelLabel,\n value,\n onChange,\n disabled,\n className,\n}: {\n choices: AthenaAgentModelOptions;\n modelLabel: (model: string) => string;\n value: string | null;\n onChange: (modelId: string | null) => void;\n disabled: boolean;\n className?: string;\n}) {\n const [open, setOpen] = useState(false);\n const pinsDefault = value !== null && value === choices.defaultModel;\n const items: AgentModelItem[] = choices.options.map((option) => {\n const display = modelLabel(option.model);\n return {\n value: option.isDefault && !pinsDefault ? AGENT_OWN_MODEL : option.model,\n label: option.label,\n isDefault: option.isDefault,\n detail: option.pinnedOutside\n ? 'Set for this conversation outside the agent'\n : display === option.label\n ? null\n : display,\n };\n });\n if (value !== null && !choices.options.some((option) => option.model === value)) {\n items.push({\n value,\n label: modelLabel(value),\n isDefault: false,\n detail: 'Not one of the agent’s models',\n });\n }\n if (pinsDefault) {\n items.push({\n value: AGENT_OWN_MODEL,\n label: 'Agent’s own model',\n isDefault: false,\n detail: 'Follows the agent’s default',\n });\n }\n const selectedValue = value ?? AGENT_OWN_MODEL;\n const selected = items.find((item) => item.value === selectedValue) ?? null;\n const label = selected?.label || AGENT_MODEL_LABEL;\n\n if (items.length < 2) {\n return (\n <span\n role=\"img\"\n aria-label={`Model: ${label}`}\n title={selected ? `This agent runs ${label}` : 'This agent runs its own model'}\n data-slot=\"chat-model-picker-label\"\n className={cn(STATIC_CHIP_CLASS, className)}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n }\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={selectedValue}\n onValueChange={(next) => onChange(next === AGENT_OWN_MODEL ? null : next)}\n >\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Agent models\n </DropdownMenu.Label>\n {items.map((item) => (\n <PickerItem key={item.value} value={item.value} detail={item.detail}>\n {item.label}\n {item.isDefault ? ' (default)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n );\n}\n\nexport interface ChatAgentPickerProps {\n /** The chosen collab agent's asset id; `null` is Athena. */\n value: string | null;\n onChange: (agentId: string | null) => void;\n disabled?: boolean;\n className?: string;\n}\n\n/** The \"Athena\" item's value: no collab agent. */\nconst NO_AGENT = '__athena__';\n\n/** Who answers new messages: Athena, or a published collab agent the person can see. */\nexport function ChatAgentPicker({ value, onChange, disabled = false, className }: ChatAgentPickerProps) {\n const catalog = useAthenaAgentCatalog();\n const [open, setOpen] = useState(false);\n const agents = catalog.data ?? [];\n const label = value === null ? 'Athena' : (agents.find((agent) => agent.id === value)?.name ?? 'Agent');\n // The chosen agent is gone (unpublished, or no longer shared with this person): fall back to\n // Athena, so new messages do not target an agent they cannot reach. Once per choice.\n const clearedRef = useRef<string | null>(null);\n useEffect(() => {\n if (!catalog.isSuccess || value === null || clearedRef.current === value) return;\n if (agents.some((agent) => agent.id === value)) return;\n clearedRef.current = value;\n onChange(null);\n }, [catalog.isSuccess, agents, value, onChange]);\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n aria-label={`Agent: ${label}`}\n >\n <BotIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Agent\">\n <DropdownMenu.RadioGroup\n value={value ?? NO_AGENT}\n onValueChange={(next) => onChange(next === NO_AGENT ? null : next)}\n >\n <PickerItem value={NO_AGENT}>Athena</PickerItem>\n {catalog.isError && <PickerNote alert>Couldn’t load the agents. Try again in a moment.</PickerNote>}\n {agents.map((agent) => (\n <PickerItem key={agent.id} value={agent.id}>\n {agent.name}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n );\n}\n\nexport interface ChatModePickerProps {\n /** The mode the session runs in: `base` or a mode's id. */\n value: string;\n /** The modes to offer. */\n options: readonly AthenaChatModeOption[];\n onChange: (modeId: string) => void;\n /** The name of `value` when it is none of `options`. */\n valueLabel?: string;\n disabled?: boolean;\n /** Why the picker is disabled, shown as its tooltip. */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which of the agent's modes the chat runs in, as a chip with a radio menu\n * like the other composer pickers. Controlled: `useAthenaChatMode` gives the\n * options, the current mode and `select`, which `AthenaChat`'s built-in menu\n * ({@link AthenaChatModeMenu}) wires up for you.\n */\nexport function ChatModePicker({\n value,\n options,\n onChange,\n valueLabel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModePickerProps) {\n const [open, setOpen] = useState(false);\n const label = options.find((option) => option.id === value)?.label ?? valueLabel ?? value;\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={disabled ? disabledReason : undefined}\n aria-label={`Mode: ${label}`}\n data-slot=\"chat-mode-picker\"\n >\n <LayersIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Mode\">\n <DropdownMenu.RadioGroup value={value} onValueChange={onChange}>\n {options.map((option) => (\n <PickerItem key={option.id} value={option.id}>\n {option.label}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n );\n}\n\n/**\n * `AthenaChat`'s mode menu: {@link ChatModePicker} over `useAthenaChatMode`,\n * shown only while the provider's `modes` give the chat two or more modes.\n */\nexport function AthenaChatModeMenu({ className }: { className?: string }) {\n const mode = useAthenaChatMode();\n if (mode.status !== 'ready') return null;\n return (\n <ChatModePicker\n value={mode.current}\n valueLabel={mode.currentLabel}\n options={mode.options}\n onChange={mode.select}\n disabled={!mode.canSwitch}\n disabledReason=\"This channel keeps each conversation in the mode it started in. Start a new conversation to pick another.\"\n className={className}\n />\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-pickers.js","sources":["../../src/catalog/chat-pickers.tsx"],"sourcesContent":["import { BotIcon, CheckIcon, ChevronDownIcon, LayersIcon, SparklesIcon } from 'lucide-react';\nimport { DropdownMenu } from 'radix-ui';\nimport { type ReactNode, useContext, useEffect, useRef, useState } from 'react';\nimport { usePortalContainer } from '../lib/owner-document';\nimport { portalSurfaceStyle } from '../lib/portal-surface';\nimport { cn } from '../lib/utils';\nimport { AthenaAgentSelectionContext } from '../provider/agent-selection-context';\nimport { useAthenaThemeStyle } from '../provider/theme-style-context';\nimport type { AthenaChatModeOption } from './agent-mode-menu';\nimport { agentAssetIdOf } from './agent-model-options';\nimport {\n type AthenaAgentModelOptions,\n groupModelsByProvider,\n resolveCatalogModelId,\n useAgentModelChoices,\n useAthenaAgentCatalog,\n useAthenaModelCatalog,\n} from './runtime-catalog';\nimport { useAthenaChatMode } from './use-athena-chat-mode';\n\n/**\n * The composer's agent and model pickers: compact chips for `AthenaChat`'s `toolbarStart` slot\n * that open a menu, as ChatGPT's and Codex's composers do. They are controlled: the host keeps the\n * choice (and remembers it if it likes) and passes it to `AthenaProvider` as `model` and\n * `agent=\"collab_agent:<id>\"`. New messages run with the choice. The menus are Radix radio menus,\n * so arrow keys, typeahead, Escape and focus return work as in any native menu.\n */\n\nconst CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n\n/** The chip without a menu: one choice, shown as a label. */\nconst STATIC_CHIP_CLASS =\n 'inline-flex h-7 max-w-[14rem] items-center gap-1 rounded-md px-2 text-xs text-muted-foreground';\n\nconst ITEM_CLASS =\n 'relative flex w-full cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-2 pr-7 text-sm outline-none data-[highlighted]:bg-muted data-[state=checked]:font-medium';\n\n/** The \"Agent's own model\" item's value: a chosen agent runs the model its author set. */\nconst AGENT_OWN_MODEL = '__agent_own_model__';\n\n/** What the chip says while a chosen agent's model is not known. */\nconst AGENT_MODEL_LABEL = 'Agent’s model';\n\n/** The menu body, portaled and themed like the SDK's popovers (it renders outside the provider). */\nfunction PickerMenu({ label, children }: { label: string; children: ReactNode }) {\n const themeStyle = useAthenaThemeStyle();\n const container = usePortalContainer();\n return (\n <DropdownMenu.Portal container={container}>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n collisionPadding={8}\n aria-label={label}\n // Its box and colours inline: no host stylesheet can take them away\n // (lib/portal-surface.ts).\n style={portalSurfaceStyle({ surface: 'popover', themeStyle })}\n className={cn(\n 'athena-sdk athena-sdk-chrome',\n 'z-50 block max-h-80 w-64 overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md outline-none',\n )}\n >\n {children}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n );\n}\n\nfunction PickerItem({\n value,\n detail,\n children,\n}: {\n value: string;\n /** A second, muted line (the model behind an author's label, or why the item is listed). */\n detail?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <DropdownMenu.RadioItem value={value} className={ITEM_CLASS}>\n {detail ? (\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate\">{children}</span>\n <span className=\"truncate text-xs font-normal text-muted-foreground\">{detail}</span>\n </span>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{children}</span>\n )}\n <DropdownMenu.ItemIndicator className=\"absolute right-2 inline-flex\">\n <CheckIcon className=\"size-3.5\" aria-hidden />\n </DropdownMenu.ItemIndicator>\n </DropdownMenu.RadioItem>\n );\n}\n\n/**\n * Where a chip disabled with a reason keeps it: a disabled button gets no pointer events, so its\n * reason is also the tooltip of a wrapper the pointer reaches (the button carries it as its own\n * description, for a screen reader). Without a reason, the chip alone.\n */\nfunction DisabledReason({ reason, children }: { reason: string | null; children: ReactNode }) {\n if (!reason) return <>{children}</>;\n return (\n <span className=\"inline-flex\" title={reason} data-slot=\"chat-picker-disabled-reason\">\n {children}\n </span>\n );\n}\n\n/**\n * A picker's menu, closed while the picker is disabled: one open when it turns disabled (Athena out\n * of reach while it shows) closes, and it opens again only on the person's next press, never by\n * itself once the picker is back. `choose` drops a choice made while disabled.\n */\nfunction usePickerMenu(disabled: boolean): {\n open: boolean;\n setOpen: (next: boolean) => void;\n choose: (apply: () => void) => void;\n} {\n const [open, setOpenState] = useState(false);\n if (disabled && open) setOpenState(false);\n return {\n open: open && !disabled,\n setOpen: (next) => setOpenState(next && !disabled),\n choose: (apply) => {\n if (!disabled) apply();\n },\n };\n}\n\nfunction PickerNote({ children, alert = false }: { children: ReactNode; alert?: boolean }) {\n return (\n <p\n className={cn('px-2 py-1.5 text-xs', alert ? 'text-destructive' : 'text-muted-foreground')}\n role={alert ? 'alert' : undefined}\n >\n {children}\n </p>\n );\n}\n\nexport interface ChatModelPickerProps {\n /** The chosen model id; `null` lets a selected agent run its own model. */\n value: string | null;\n onChange: (modelId: string | null) => void;\n /** The model a person who chose nothing runs, e.g. `claude-opus-5-5`. */\n defaultModelId: string;\n /**\n * A collab agent is chosen: the picker offers the workspace's models and\n * \"Agent's own model\" (`null`), as before, unless the agent restricts its\n * models (its \"Allow any workspace model\" switch is off), when it offers\n * exactly the agent's own (`useAthenaAgentModelOptions`). Which agent:\n * `agent`, else the one the surrounding `AthenaProvider` runs as.\n */\n agentSelected?: boolean;\n /**\n * The chosen collab agent, as its asset id or `collab_agent:<id>` (implies\n * `agentSelected`). `null` is no agent.\n */\n agent?: string | null;\n /**\n * The collab channel the chat runs on (its model override is the default\n * there). Defaults to the provider's `channel` when the agent is the\n * provider's.\n */\n channel?: string | null;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which model new messages run, from the models the workspace allows this\n * person; with an agent chosen, also \"Agent's own model\" (`null`), or exactly\n * the models its author listed when the agent restricts its models\n * (`allowAnyModel: false`, opt-in per agent). The host passes the choice to\n * `AthenaProvider` as `model`; a change reaches an open session too (the\n * provider writes it to the session's server config).\n */\nexport function ChatModelPicker({\n value,\n onChange,\n defaultModelId,\n agentSelected = false,\n agent,\n channel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModelPickerProps) {\n const providerSelection = useContext(AthenaAgentSelectionContext);\n const agentAssetId =\n agent !== undefined\n ? agentAssetIdOf(agent)\n : agentSelected\n ? (providerSelection?.agentAssetId ?? null)\n : null;\n if (agentAssetId !== null) {\n const agentChannel =\n channel !== undefined\n ? channel\n : providerSelection?.agentAssetId === agentAssetId\n ? providerSelection.channel\n : null;\n return (\n <AgentAwareModelPicker\n agentAssetId={agentAssetId}\n channel={agentChannel}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelPicker\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected={agentSelected}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/**\n * The picker with a collab agent chosen. The agent is read first: one that\n * restricts its models gets {@link AgentModelMenu}; every other agent (the\n * default, and one this person cannot read) gets the workspace menu as before,\n * its \"Agent's own model\" naming the agent's default when known. Until the\n * read settles the workspace menu shows but replaces nothing on the host's\n * behalf, since the host's model may be one only the agent offers.\n */\nfunction AgentAwareModelPicker({\n agentAssetId,\n channel,\n value,\n onChange,\n defaultModelId,\n disabled,\n disabledReason,\n className,\n}: {\n agentAssetId: string;\n channel: string | null;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n // One query client for the agent read and the catalog both menus name models from.\n const { choices, modelLabel, catalog } = useAgentModelChoices({ agent: agentAssetId, channel });\n if (choices.status === 'ready' && !choices.allowAnyModel) {\n return (\n <AgentModelMenu\n choices={choices}\n modelLabel={modelLabel}\n value={value}\n onChange={onChange}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n }\n return (\n <WorkspaceModelMenu\n catalog={catalog}\n value={value}\n onChange={onChange}\n defaultModelId={defaultModelId}\n agentSelected\n agentDefaultLabel={choices.defaultModel === null ? null : modelLabel(choices.defaultModel)}\n holdReplacement={choices.status === 'loading'}\n disabled={disabled}\n disabledReason={disabledReason}\n className={className}\n />\n );\n}\n\n/** The model picker over the workspace's catalog, with no agent chosen (or none it can name). */\nfunction WorkspaceModelPicker(props: {\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const catalog = useAthenaModelCatalog();\n return <WorkspaceModelMenu catalog={catalog} {...props} />;\n}\n\n/** The workspace catalog's menu (the picker as it was before agents could restrict models). */\nfunction WorkspaceModelMenu({\n catalog,\n value,\n onChange,\n defaultModelId,\n agentSelected,\n agentDefaultLabel = null,\n holdReplacement = false,\n disabled,\n disabledReason,\n className,\n}: {\n catalog: ReturnType<typeof useAthenaModelCatalog>;\n value: string | null;\n onChange: (modelId: string | null) => void;\n defaultModelId: string;\n agentSelected: boolean;\n /** The chosen agent's default model (its channel's override when it has one), named under \"Agent's own model\". */\n agentDefaultLabel?: string | null;\n /** Replace no unoffered choice yet (the chosen agent is still being read). */\n holdReplacement?: boolean;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const models = catalog.data ?? [];\n const reason = disabled ? (disabledReason ?? null) : null;\n const resolved =\n value === null && agentSelected\n ? null\n : resolveCatalogModelId({ stored: value, defaultModelId, models });\n const current = models.find((model) => model.id === resolved);\n const label = resolved === null ? 'Agent’s model' : (current?.label ?? resolved);\n // The host's choice is no longer offered (retired, or the workspace stopped allowing it): hand\n // the host the model the chip shows, so new messages run it instead of the dropped id. Once per\n // choice, so a host that keeps the old value is not asked again on every render.\n const replacedRef = useRef<string | null>(null);\n useEffect(() => {\n if (holdReplacement) return;\n if (!catalog.isSuccess || value === null || resolved === null || resolved === value) return;\n if (models.some((model) => model.id === value) || replacedRef.current === value) return;\n replacedRef.current = value;\n onChange(resolved);\n }, [holdReplacement, catalog.isSuccess, models, value, resolved, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={resolved ?? AGENT_OWN_MODEL}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n {agentSelected && (\n <PickerItem value={AGENT_OWN_MODEL} detail={agentDefaultLabel}>\n Agent’s own model\n </PickerItem>\n )}\n {catalog.isPending && <PickerNote>Loading models…</PickerNote>}\n {catalog.isError && <PickerNote alert>Couldn’t load the models. Try again in a moment.</PickerNote>}\n {groupModelsByProvider({ models }).map((group) => (\n <DropdownMenu.Group key={group.provider}>\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {group.provider}\n </DropdownMenu.Label>\n {group.models.map((model) => (\n <PickerItem key={model.id} value={model.id}>\n {model.label}\n {model.status === 'LEGACY' ? ' (legacy)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.Group>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/** One item of the agent's model menu. */\ninterface AgentModelItem {\n /** The radio value: a model id, or {@link AGENT_OWN_MODEL} for \"the agent's default\" (`null`). */\n value: string;\n label: string;\n isDefault: boolean;\n detail: string | null;\n}\n\n/**\n * The menu of a chosen collab agent that restricts its models: exactly its own\n * (`useAthenaAgentModelOptions`), the default as `null`. One choice is a label;\n * two or more a menu. Nothing is replaced on the host's behalf: a host choice\n * the agent does not list (an older pick) is shown and listed as it is, as is\n * a model the session pins outside the agent's list. A host choice that names\n * the default model explicitly is a pin, which the agent's next default would\n * not follow, so the menu then also offers \"Agent's own model\" (`null`).\n */\nfunction AgentModelMenu({\n choices,\n modelLabel,\n value,\n onChange,\n disabled,\n disabledReason,\n className,\n}: {\n choices: AthenaAgentModelOptions;\n modelLabel: (model: string) => string;\n value: string | null;\n onChange: (modelId: string | null) => void;\n disabled: boolean;\n disabledReason?: string;\n className?: string;\n}) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const pinsDefault = value !== null && value === choices.defaultModel;\n const items: AgentModelItem[] = choices.options.map((option) => {\n const display = modelLabel(option.model);\n return {\n value: option.isDefault && !pinsDefault ? AGENT_OWN_MODEL : option.model,\n label: option.label,\n isDefault: option.isDefault,\n detail: option.pinnedOutside\n ? 'Set for this conversation outside the agent'\n : display === option.label\n ? null\n : display,\n };\n });\n if (value !== null && !choices.options.some((option) => option.model === value)) {\n items.push({\n value,\n label: modelLabel(value),\n isDefault: false,\n detail: 'Not one of the agent’s models',\n });\n }\n if (pinsDefault) {\n items.push({\n value: AGENT_OWN_MODEL,\n label: 'Agent’s own model',\n isDefault: false,\n detail: 'Follows the agent’s default',\n });\n }\n const selectedValue = value ?? AGENT_OWN_MODEL;\n const selected = items.find((item) => item.value === selectedValue) ?? null;\n const label = selected?.label || AGENT_MODEL_LABEL;\n\n if (items.length < 2) {\n return (\n <span\n role=\"img\"\n aria-label={`Model: ${label}`}\n title={selected ? `This agent runs ${label}` : 'This agent runs its own model'}\n data-slot=\"chat-model-picker-label\"\n className={cn(STATIC_CHIP_CLASS, className)}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n }\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Model: ${label}`}\n >\n <SparklesIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Model\">\n <DropdownMenu.RadioGroup\n value={selectedValue}\n onValueChange={(next) => choose(() => onChange(next === AGENT_OWN_MODEL ? null : next))}\n >\n <DropdownMenu.Label className=\"px-2 pb-0.5 pt-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Agent models\n </DropdownMenu.Label>\n {items.map((item) => (\n <PickerItem key={item.value} value={item.value} detail={item.detail}>\n {item.label}\n {item.isDefault ? ' (default)' : ''}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatAgentPickerProps {\n /** The chosen collab agent's asset id; `null` is Athena. */\n value: string | null;\n onChange: (agentId: string | null) => void;\n disabled?: boolean;\n /**\n * Why the picker is disabled (e.g. \"Needs a connection…\" while the host knows Athena can't be\n * reached), shown as its tooltip while `disabled`.\n */\n disabledReason?: string;\n className?: string;\n}\n\n/** The \"Athena\" item's value: no collab agent. */\nconst NO_AGENT = '__athena__';\n\n/** Who answers new messages: Athena, or a published collab agent the person can see. */\nexport function ChatAgentPicker({\n value,\n onChange,\n disabled = false,\n disabledReason,\n className,\n}: ChatAgentPickerProps) {\n const catalog = useAthenaAgentCatalog();\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const reason = disabled ? (disabledReason ?? null) : null;\n const agents = catalog.data ?? [];\n const label = value === null ? 'Athena' : (agents.find((agent) => agent.id === value)?.name ?? 'Agent');\n // The chosen agent is gone (unpublished, or no longer shared with this person): fall back to\n // Athena, so new messages do not target an agent they cannot reach. Once per choice.\n const clearedRef = useRef<string | null>(null);\n useEffect(() => {\n if (!catalog.isSuccess || value === null || clearedRef.current === value) return;\n if (agents.some((agent) => agent.id === value)) return;\n clearedRef.current = value;\n onChange(null);\n }, [catalog.isSuccess, agents, value, onChange]);\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Agent: ${label}`}\n >\n <BotIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Agent\">\n <DropdownMenu.RadioGroup\n value={value ?? NO_AGENT}\n onValueChange={(next) => choose(() => onChange(next === NO_AGENT ? null : next))}\n >\n <PickerItem value={NO_AGENT}>Athena</PickerItem>\n {catalog.isError && <PickerNote alert>Couldn’t load the agents. Try again in a moment.</PickerNote>}\n {agents.map((agent) => (\n <PickerItem key={agent.id} value={agent.id}>\n {agent.name}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\nexport interface ChatModePickerProps {\n /** The mode the session runs in: `base` or a mode's id. */\n value: string;\n /** The modes to offer. */\n options: readonly AthenaChatModeOption[];\n onChange: (modeId: string) => void;\n /** The name of `value` when it is none of `options`. */\n valueLabel?: string;\n disabled?: boolean;\n /** Why the picker is disabled, shown as its tooltip. */\n disabledReason?: string;\n className?: string;\n}\n\n/**\n * Which of the agent's modes the chat runs in, as a chip with a radio menu\n * like the other composer pickers. Controlled: `useAthenaChatMode` gives the\n * options, the current mode and `select`, which `AthenaChat`'s built-in menu\n * ({@link AthenaChatModeMenu}) wires up for you.\n */\nexport function ChatModePicker({\n value,\n options,\n onChange,\n valueLabel,\n disabled = false,\n disabledReason,\n className,\n}: ChatModePickerProps) {\n const { open, setOpen, choose } = usePickerMenu(disabled);\n const label = options.find((option) => option.id === value)?.label ?? valueLabel ?? value;\n const reason = disabled ? (disabledReason ?? null) : null;\n return (\n <DisabledReason reason={reason}>\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(CHIP_CLASS, className)}\n disabled={disabled}\n title={reason ?? undefined}\n aria-label={`Mode: ${label}`}\n data-slot=\"chat-mode-picker\"\n >\n <LayersIcon className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon className=\"size-3 shrink-0\" aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <PickerMenu label=\"Mode\">\n <DropdownMenu.RadioGroup value={value} onValueChange={(next) => choose(() => onChange(next))}>\n {options.map((option) => (\n <PickerItem key={option.id} value={option.id}>\n {option.label}\n </PickerItem>\n ))}\n </DropdownMenu.RadioGroup>\n </PickerMenu>\n </DropdownMenu.Root>\n </DisabledReason>\n );\n}\n\n/**\n * `AthenaChat`'s mode menu: {@link ChatModePicker} over `useAthenaChatMode`,\n * shown only while the provider's `modes` give the chat two or more modes.\n */\nexport function AthenaChatModeMenu({ className }: { className?: string }) {\n const mode = useAthenaChatMode();\n if (mode.status !== 'ready') return null;\n return (\n <ChatModePicker\n value={mode.current}\n valueLabel={mode.currentLabel}\n options={mode.options}\n onChange={mode.select}\n disabled={!mode.canSwitch}\n disabledReason=\"This channel keeps each conversation in the mode it started in. Start a new conversation to pick another.\"\n className={className}\n />\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const runtimeCatalog = require("../agent-runtime/src/runtime-catalog.cjs");
3
4
  const reactQuery = require("@tanstack/react-query");
4
- const react = require("react");
5
+ const require$$0 = require("react");
5
6
  const AthenaAuthContext = require("../auth/AthenaAuthContext.cjs");
6
7
  const apiClient = require("../chat-ui/mentions/suggestions/data/api-client.cjs");
7
8
  const AthenaContext = require("../provider/AthenaContext.cjs");
8
9
  const useAthenaThreadModel = require("../threads/use-athena-thread-model.cjs");
9
10
  const agentModelOptions = require("./agent-model-options.cjs");
11
+ const channelRefusal = require("./channel-refusal.cjs");
10
12
  const MODEL_PROVIDER_LABELS = {
11
13
  ANTHROPIC: "Anthropic",
12
14
  OPENAI: "OpenAI",
@@ -38,13 +40,12 @@ const ATHENA_AGENT_CATALOG_QUERY = `
38
40
  function normalizeModelCatalog({
39
41
  response
40
42
  }) {
41
- const isAdmin = response.getCurrentUserWithWorkspace.user.isAdmin;
42
- const approved = new Set(response.settings.workspace.approvedLargeLlms);
43
- const denied = new Set(response.settings.workspace.blacklistedLlms);
44
- const hasAllowlist = approved.size > 0;
45
- return response.availableModels.filter(
46
- (model) => (!model.adminOnly || isAdmin) && (hasAllowlist ? approved.has(model.id) : !denied.has(model.id))
47
- ).map(
43
+ return runtimeCatalog.filterAndSortCatalogModels({
44
+ models: response.availableModels,
45
+ isAdmin: response.getCurrentUserWithWorkspace.user.isAdmin,
46
+ approvedModelIds: response.settings.workspace.approvedLargeLlms,
47
+ deniedModelIds: response.settings.workspace.blacklistedLlms
48
+ }).map(
48
49
  (model) => ({
49
50
  id: model.id,
50
51
  label: model.name,
@@ -58,17 +59,12 @@ function normalizeModelCatalog({
58
59
  isFeatured: model.isFeatured,
59
60
  variantOrder: model.variantOrder
60
61
  })
61
- ).sort(
62
- (left, right) => left.sortOrder - right.sortOrder || left.variantOrder - right.variantOrder || left.label.localeCompare(right.label)
63
62
  );
64
63
  }
65
64
  function normalizeAgentCatalog({
66
65
  assets
67
66
  }) {
68
- return assets.filter((asset) => asset.id.trim().length > 0).map((asset) => {
69
- var _a;
70
- return { id: asset.id, name: ((_a = asset.title) == null ? void 0 : _a.trim()) || "Untitled agent" };
71
- }).sort((left, right) => left.name.localeCompare(right.name));
67
+ return runtimeCatalog.normalizeCatalogAgentOptions({ assets });
72
68
  }
73
69
  function resolveCatalogModelId({
74
70
  stored,
@@ -91,7 +87,7 @@ function groupModelsByProvider({
91
87
  }
92
88
  function useCatalogAuth() {
93
89
  const config = AthenaContext.useAthenaConfig();
94
- return react.useMemo(
90
+ return require$$0.useMemo(
95
91
  () => ({
96
92
  backendUrl: config.backendUrl,
97
93
  appUrl: config.appUrl,
@@ -126,15 +122,15 @@ function credentialFingerprint({ credential }) {
126
122
  function useCatalogPrincipal() {
127
123
  var _a, _b;
128
124
  const config = AthenaContext.useAthenaConfig();
129
- const userId = (_b = (_a = react.useContext(AthenaAuthContext.AthenaAuthContext)) == null ? void 0 : _a.user) == null ? void 0 : _b.userId;
125
+ const userId = (_b = (_a = require$$0.useContext(AthenaAuthContext.AthenaAuthContext)) == null ? void 0 : _a.user) == null ? void 0 : _b.userId;
130
126
  if (userId) return `user:${userId}`;
131
127
  if (config.apiKey) return `key:${credentialFingerprint({ credential: config.apiKey })}`;
132
128
  if (config.token) return `token:${credentialFingerprint({ credential: config.token })}`;
133
129
  return "session";
134
130
  }
135
131
  function useCatalogQueryClient() {
136
- const host = react.useContext(reactQuery.QueryClientContext);
137
- const [own] = react.useState(() => new reactQuery.QueryClient());
132
+ const host = require$$0.useContext(reactQuery.QueryClientContext);
133
+ const [own] = require$$0.useState(() => new reactQuery.QueryClient());
138
134
  return host ?? own;
139
135
  }
140
136
  function useAthenaModelCatalog() {
@@ -209,6 +205,46 @@ function agentModelsRefetchInterval({
209
205
  }) {
210
206
  return data !== void 0 && !data.readable ? false : AGENT_MODELS_REFRESH_MS;
211
207
  }
208
+ const MAX_TIMER_MS = 2 ** 31 - 1;
209
+ function useChannelReplacementsRefused({
210
+ auth,
211
+ principal,
212
+ queryClient,
213
+ enabled
214
+ }) {
215
+ const read = reactQuery.useQuery(
216
+ {
217
+ queryKey: ["athena-sdk", "catalog", "channel-refusal-day", auth.backendUrl, principal],
218
+ queryFn: async () => {
219
+ try {
220
+ return channelRefusal.refusalDayOf(await apiClient.fetchGraphQL(auth, channelRefusal.ATHENA_CHANNEL_REFUSAL_QUERY));
221
+ } catch (error) {
222
+ if (error instanceof apiClient.AthenaGraphQLError && error.status === null && channelRefusal.answersWithoutRefusalDay(error.message)) {
223
+ return null;
224
+ }
225
+ throw error;
226
+ }
227
+ },
228
+ enabled,
229
+ staleTime: AGENT_MODELS_REFRESH_MS,
230
+ refetchInterval: AGENT_MODELS_REFRESH_MS,
231
+ // A picker waits on the first answer: one retry, not TanStack's three.
232
+ retry: 1
233
+ },
234
+ queryClient
235
+ );
236
+ const refusedFrom = enabled ? read.data ?? null : null;
237
+ const [tick, setTick] = require$$0.useState(0);
238
+ const refused = channelRefusal.channelReplacementsRefusedOn({ refusedFrom, now: Date.now() });
239
+ const startsAt = refused ? null : channelRefusal.channelReplacementsRefusalStartsAt(refusedFrom);
240
+ require$$0.useEffect(() => {
241
+ if (startsAt === null || tick < 0) return;
242
+ const delay = Math.min(Math.max(startsAt - Date.now(), 0), MAX_TIMER_MS);
243
+ const timer = setTimeout(() => setTick((value) => value + 1), delay);
244
+ return () => clearTimeout(timer);
245
+ }, [startsAt, tick]);
246
+ return { pending: enabled && read.isPending, refused };
247
+ }
212
248
  function useAgentModelChoices({
213
249
  agent,
214
250
  channel
@@ -247,35 +283,65 @@ function useAgentModelChoices({
247
283
  const threadModel = useAthenaThreadModel.useOptionalAthenaThreadModel();
248
284
  const pinnedModel = threadModel !== null && threadModel.ready && threadModel.configured ? threadModel.model : null;
249
285
  const trimmedChannel = (channel == null ? void 0 : channel.trim()) || null;
286
+ const refusal = useChannelReplacementsRefused({
287
+ auth,
288
+ principal,
289
+ queryClient,
290
+ enabled: assetId !== null && trimmedChannel !== null
291
+ });
292
+ const { pending: refusalPending, refused: refuseReplacements } = refusal;
250
293
  const models = catalog.data;
251
294
  const catalogPending = catalog.isPending;
252
295
  const { isPending: readPending, data: readData } = read;
253
- const modelLabel = react.useCallback(
296
+ const modelLabel = require$$0.useCallback(
254
297
  (model) => {
255
298
  var _a;
256
299
  return ((_a = models == null ? void 0 : models.find((option) => option.id === model)) == null ? void 0 : _a.label) ?? model;
257
300
  },
258
301
  [models]
259
302
  );
260
- const choices = react.useMemo(() => {
303
+ const choices = require$$0.useMemo(() => {
261
304
  if (assetId === null) return NO_AGENT_MODEL_OPTIONS.idle;
262
305
  if (readData === void 0) {
263
306
  return readPending ? NO_AGENT_MODEL_OPTIONS.loading : NO_AGENT_MODEL_OPTIONS.error;
264
307
  }
265
308
  if (!readData.readable || readData.source === null) return NO_AGENT_MODEL_OPTIONS.unavailable;
266
309
  if (catalogPending) return NO_AGENT_MODEL_OPTIONS.loading;
310
+ if (refusalPending) {
311
+ return {
312
+ status: "ready",
313
+ ...agentModelOptions.agentModelOptionsWithoutDefault({
314
+ source: readData.source,
315
+ channel: trimmedChannel,
316
+ pinnedModel,
317
+ modelLabel
318
+ }),
319
+ allowAnyModel: readData.source.allowAnyModel
320
+ };
321
+ }
267
322
  return {
268
323
  status: "ready",
269
324
  ...agentModelOptions.buildAgentModelOptions({
270
325
  source: readData.source,
271
326
  channel: trimmedChannel,
272
327
  pinnedModel,
273
- modelLabel
328
+ modelLabel,
329
+ refuseReplacements
274
330
  }),
275
331
  allowAnyModel: readData.source.allowAnyModel
276
332
  };
277
- }, [assetId, readPending, readData, catalogPending, modelLabel, trimmedChannel, pinnedModel]);
278
- return react.useMemo(() => ({ choices, modelLabel, catalog }), [choices, modelLabel, catalog]);
333
+ }, [
334
+ assetId,
335
+ readPending,
336
+ readData,
337
+ catalogPending,
338
+ modelLabel,
339
+ trimmedChannel,
340
+ pinnedModel,
341
+ refusalPending,
342
+ refuseReplacements
343
+ ]);
344
+ return require$$0.useMemo(() => ({ choices, modelLabel, catalog }), [choices, modelLabel, catalog]);
279
345
  }
280
346
  exports.AGENT_MODELS_REFRESH_MS = AGENT_MODELS_REFRESH_MS;
281
347
  exports.ATHENA_AGENT_CATALOG_QUERY = ATHENA_AGENT_CATALOG_QUERY;