@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 +1 @@
1
- {"version":3,"file":"test-recording-tool-uis.cjs","sources":["../../src/tools/test-recording-tool-uis.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The UI Testing toolkit's cards: an agent records itself checking a UI\n * change on its computer and hands back an annotated video.\n *\n * - `test_recording_stop` — the report: the recording's title, \"N passed · M\n * failed\", each test with its ✓ / ✗ assertions (what the agent saw), the\n * summary, and the video, with every test's start as a chapter that plays\n * from there. It stays in the conversation instead of folding into the\n * turn's steps (`isSdkInlineTool`).\n * - `test_recording_start` / `test_recording_mark` — one compact row each.\n *\n * The video is an Athena asset the signed-in user owns. It is read with the\n * user's own credential through `useAthenaAssetContent` (a permission-checked\n * read of the stored file) and played from a page-local object URL, only when\n * the person presses play or picks a chapter; no shareable link is minted.\n */\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n AlertCircleIcon,\n CheckIcon,\n CircleDashedIcon,\n CircleDotIcon,\n ClapperboardIcon,\n ExternalLinkIcon,\n FlaskConicalIcon,\n LoaderIcon,\n PlayIcon,\n StickyNoteIcon,\n XIcon,\n} from \"lucide-react\";\nimport {\n type ElementType,\n memo,\n type SyntheticEvent,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAthenaAssetContent, useObjectUrl } from \"../assets/use-asset-content\";\nimport { cn } from \"../lib/utils\";\nimport { AthenaContext } from \"../provider/AthenaContext\";\nimport { ToolCard, type ToolStatus } from \"./primitives\";\nimport {\n describeTestRecordingMark,\n describeTestRecordingStart,\n formatRecordingClock,\n parseTestRecordingStopResult,\n type TestRecordingAssertion,\n type TestRecordingMarkKind,\n type TestRecordingOutcome,\n type TestRecordingReport,\n type TestRecordingTest,\n} from \"./test-recording-report\";\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction argsRecord(args: unknown): Record<string, unknown> | undefined {\n return typeof args === \"object\" && args !== null && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : undefined;\n}\n\nfunction argString(args: Record<string, unknown> | undefined, key: string): string | undefined {\n const value = args?.[key];\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : undefined;\n}\n\n/** The message an `incomplete` tool status carries, or `null` for any other status. */\nfunction incompleteMessage(\n status: { type: string; reason?: string; error?: unknown } | undefined,\n fallback: string,\n): string | null {\n if (status?.type !== \"incomplete\") return null;\n if (status.reason === \"cancelled\") return \"Cancelled\";\n if (typeof status.error === \"string\" && status.error.trim() !== \"\") return status.error;\n return fallback;\n}\n\n// ─── Playback ────────────────────────────────────────────────────────\n\ninterface PlaybackRequest {\n /** The person asked to play: the video is read from then on. */\n requested: boolean;\n /** The last chapter picked; `nonce` makes picking the same chapter twice seek twice. */\n seek: { time: number; nonce: number } | null;\n}\n\nconst IDLE_PLAYBACK: PlaybackRequest = { requested: false, seek: null };\n\n/** `HTMLMediaElement.HAVE_METADATA`: below it a seek waits for the video's metadata. */\nconst HAVE_METADATA = 1;\n\nfunction playbackErrorMessage(error: Error): string {\n const status = (error as { status?: unknown }).status;\n if (status === 401 || status === 403) return \"You don't have access to this recording.\";\n if (status === 404) return \"The recording's video was not found.\";\n return \"The recording could not be loaded.\";\n}\n\nfunction TestRecordingPlayer({\n assetId,\n title,\n durationS,\n url,\n playback,\n onPlay,\n}: {\n assetId: string;\n title: string;\n durationS: number | null;\n url: string | null;\n playback: PlaybackRequest;\n onPlay: () => void;\n}) {\n const content = useAthenaAssetContent({ assetId, enabled: playback.requested });\n // Bytes a query already holds still wait for the person to press play.\n const src = useObjectUrl(playback.requested ? content.data : undefined);\n const { refetch } = content;\n const retry = useCallback(() => {\n void refetch();\n }, [refetch]);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const pendingSeekRef = useRef<number | null>(null);\n const seekTime = playback.seek?.time;\n const seekNonce = playback.seek?.nonce ?? 0;\n\n // Play once the bytes are here, and again from each chapter picked (the\n // nonce is the pick's change signal; picking one chapter twice seeks twice).\n // A seek before the metadata loads sets the start position and is applied\n // again once it has (`onLoadedMetadata`).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !src) return;\n if (seekTime !== undefined) {\n video.currentTime = seekTime;\n pendingSeekRef.current = video.readyState < HAVE_METADATA ? seekTime : null;\n }\n video.play()?.catch(() => {\n // Autoplay refused (no recent user gesture): the controls stay to press play.\n });\n }, [src, seekNonce]);\n\n const handleLoadedMetadata = useCallback((event: SyntheticEvent<HTMLVideoElement>) => {\n const pending = pendingSeekRef.current;\n pendingSeekRef.current = null;\n if (pending !== null) event.currentTarget.currentTime = pending;\n }, []);\n\n if (src) {\n return (\n <video\n ref={videoRef}\n data-testid=\"test-recording-video\"\n src={src}\n controls\n playsInline\n preload=\"auto\"\n aria-label={`Recording: ${title}`}\n onLoadedMetadata={handleLoadedMetadata}\n className=\"block max-h-[480px] w-full bg-black\"\n />\n );\n }\n\n if (content.isError && !content.isFetching) {\n return (\n <div\n role=\"alert\"\n data-testid=\"test-recording-video-error\"\n className=\"flex aspect-video w-full flex-col items-center justify-center gap-2 bg-muted/40 px-6 text-center\"\n >\n <AlertCircleIcon className=\"size-5 text-destructive\" aria-hidden />\n <p className=\"text-[12.5px] text-foreground\">{playbackErrorMessage(content.error)}</p>\n <div className=\"flex items-center gap-3\">\n {/* An explicit retry, refusals included: access may have changed since. */}\n <button\n type=\"button\"\n onClick={retry}\n className=\"rounded-md border border-border bg-background px-2.5 py-1 text-[12px] font-medium text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Try again\n </button>\n {url ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[12px] font-medium text-primary hover:underline\"\n >\n Watch in Athena\n </a>\n ) : null}\n </div>\n </div>\n );\n }\n\n if (playback.requested) {\n return (\n <output\n data-testid=\"test-recording-video-loading\"\n className=\"flex aspect-video w-full items-center justify-center gap-2 bg-zinc-950 text-[12px] text-white/80\"\n >\n <LoaderIcon className=\"size-4 animate-spin\" aria-hidden />\n Loading recording…\n </output>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onPlay}\n aria-label={`Play recording: ${title}`}\n className=\"group relative flex aspect-video w-full items-center justify-center bg-zinc-950 text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n >\n <span className=\"flex size-12 items-center justify-center rounded-full bg-white/15 transition-colors group-hover:bg-white/25\">\n <PlayIcon className=\"ml-0.5 size-5 fill-current\" aria-hidden />\n </span>\n {durationS !== null ? (\n <span className=\"absolute right-3 bottom-2 text-[11px] tabular-nums text-white/80\">\n {formatRecordingClock(durationS)}\n </span>\n ) : null}\n </button>\n );\n}\n\n/** A time that plays the recording from there: a test's chapter or an assertion's moment. */\nfunction ChapterButton({\n time,\n label,\n onSeek,\n}: {\n time: number;\n label: string;\n onSeek: (time: number) => void;\n}) {\n const clock = formatRecordingClock(time);\n return (\n <button\n type=\"button\"\n data-testid=\"test-recording-chapter\"\n onClick={() => onSeek(time)}\n aria-label={`Play from ${clock}: ${label}`}\n className=\"shrink-0 rounded px-1.5 py-0.5 font-mono text-[11px] tabular-nums text-primary transition-colors hover:bg-primary/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {clock}\n </button>\n );\n}\n\n// ─── Report card ─────────────────────────────────────────────────────\n\nconst OUTCOME_LABEL: Record<TestRecordingOutcome, string> = {\n passed: \"Passed\",\n failed: \"Failed\",\n untested: \"Not checked\",\n};\n\nfunction OutcomeIcon({ result }: { result: TestRecordingOutcome }) {\n if (result === \"passed\") {\n return (\n <span className=\"mt-px flex size-4 shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white\">\n <CheckIcon className=\"size-2.5\" strokeWidth={3.5} aria-hidden />\n </span>\n );\n }\n if (result === \"failed\") {\n return (\n <span className=\"mt-px flex size-4 shrink-0 items-center justify-center rounded-full bg-destructive text-white\">\n <XIcon className=\"size-2.5\" strokeWidth={3.5} aria-hidden />\n </span>\n );\n }\n return <CircleDashedIcon className=\"mt-px size-4 shrink-0 text-muted-foreground\" aria-hidden />;\n}\n\nfunction AssertionRow({\n assertion,\n onSeek,\n}: {\n assertion: TestRecordingAssertion;\n onSeek: ((time: number) => void) | null;\n}) {\n const failed = assertion.result === \"failed\";\n const text = assertion.text || (failed ? \"Failed\" : \"Passed\");\n return (\n <li\n data-testid=\"test-recording-assertion\"\n data-result={assertion.result}\n className={cn(\n \"flex items-start gap-1.5 rounded-md px-1.5 py-0.5 text-[12px] leading-snug\",\n failed ? \"bg-destructive/10 text-destructive\" : \"text-muted-foreground\",\n )}\n >\n {failed ? (\n <XIcon className=\"mt-0.5 size-3 shrink-0\" strokeWidth={3} aria-hidden />\n ) : (\n <CheckIcon className=\"mt-0.5 size-3 shrink-0 text-emerald-600\" strokeWidth={3} aria-hidden />\n )}\n <span className=\"min-w-0 flex-1 break-words\">\n <span className=\"sr-only\">{failed ? \"Failed: \" : \"Passed: \"}</span>\n {text}\n </span>\n {onSeek && assertion.editedTimeS !== null ? (\n <ChapterButton time={assertion.editedTimeS} label={text} onSeek={onSeek} />\n ) : null}\n </li>\n );\n}\n\nfunction TestRow({ test, onSeek }: { test: TestRecordingTest; onSeek: ((time: number) => void) | null }) {\n return (\n <li data-testid=\"test-recording-test\" data-result={test.result} className=\"px-4 py-2.5\">\n <div className=\"flex items-start gap-2\">\n <OutcomeIcon result={test.result} />\n <span\n className={cn(\n \"min-w-0 flex-1 break-words text-[12.5px] font-medium leading-snug\",\n test.result === \"failed\" && \"text-destructive\",\n test.result === \"passed\" && \"text-foreground\",\n test.result === \"untested\" && \"text-muted-foreground\",\n )}\n >\n <span className=\"sr-only\">{`${OUTCOME_LABEL[test.result]}: `}</span>\n {test.name}\n </span>\n {test.result === \"untested\" ? (\n <span className=\"shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n Not checked\n </span>\n ) : null}\n {onSeek && test.startTimeS !== null ? (\n <ChapterButton time={test.startTimeS} label={test.name} onSeek={onSeek} />\n ) : null}\n </div>\n {test.assertions.length > 0 ? (\n <ul className=\"mt-1 flex flex-col gap-0.5 pl-6\">\n {test.assertions.map((assertion, index) => (\n <AssertionRow\n // Assertions are an ordered log with no id of their own, never reordered.\n key={index}\n assertion={assertion}\n onSeek={onSeek}\n />\n ))}\n </ul>\n ) : null}\n </li>\n );\n}\n\nexport interface TestRecordingReportCardProps {\n report: TestRecordingReport;\n className?: string;\n}\n\n/**\n * A saved test recording: the title and counts, the video (read with the\n * signed-in user's credential when the person presses play), each test with\n * its assertions and chapter times, the summary, and a link to the asset in\n * Athena.\n */\nexport function TestRecordingReportCard({ report, className }: TestRecordingReportCardProps) {\n const [playback, setPlayback] = useState<PlaybackRequest>(IDLE_PLAYBACK);\n const play = useCallback(() => {\n setPlayback((previous) => ({ ...previous, requested: true }));\n }, []);\n const seek = useCallback((time: number) => {\n setPlayback((previous) => ({\n requested: true,\n seek: { time, nonce: (previous.seek?.nonce ?? 0) + 1 },\n }));\n }, []);\n // The video is read with the provider's credentials; a host that renders\n // the card outside `<AthenaProvider>` gets the report and the link only.\n const athenaConfig = useContext(AthenaContext);\n const playableAssetId = athenaConfig ? report.assetId : null;\n const onSeek = playableAssetId ? seek : null;\n const hasFailures = report.failed > 0;\n\n return (\n <section\n data-testid=\"test-recording-report\"\n data-has-failures={hasFailures ? \"true\" : \"false\"}\n aria-label={`Test recording: ${report.title}`}\n className={cn(\n \"my-3 w-full overflow-hidden rounded-xl border border-border/60 bg-background shadow-sm\",\n className,\n )}\n >\n <header className=\"flex items-start gap-3 px-4 py-3\">\n <span\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-lg\",\n hasFailures ? \"bg-destructive/10 text-destructive\" : \"bg-emerald-50 text-emerald-600\",\n )}\n >\n <ClapperboardIcon className=\"size-4\" aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"break-words text-[13px] font-medium leading-snug text-foreground\">\n {report.title}\n </h3>\n <p data-testid=\"test-recording-counts\" className=\"text-[12px] tabular-nums text-muted-foreground\">\n <span className={cn(report.passed > 0 && \"text-emerald-700\")}>{report.passed} passed</span>\n {\" · \"}\n <span className={cn(hasFailures && \"font-medium text-destructive\")}>{report.failed} failed</span>\n {report.untested > 0 ? ` · ${report.untested} untested` : null}\n </p>\n </div>\n <span className=\"shrink-0 rounded-md bg-muted/60 px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n UI test\n </span>\n </header>\n\n {playableAssetId ? (\n <div className=\"border-t border-border/40\">\n <TestRecordingPlayer\n assetId={playableAssetId}\n title={report.title}\n durationS={report.editedDurationS}\n url={report.url}\n playback={playback}\n onPlay={play}\n />\n </div>\n ) : null}\n\n {report.tests.length > 0 ? (\n <ol aria-label=\"Tests\" className=\"flex flex-col divide-y divide-border/40 border-t border-border/40\">\n {report.tests.map((test, index) => (\n // Tests are an ordered log, never reordered; two may share a name.\n <TestRow key={index} test={test} onSeek={onSeek} />\n ))}\n </ol>\n ) : (\n <p className=\"border-t border-border/40 px-4 py-2.5 text-[12px] text-muted-foreground\">\n No tests were marked in this recording.\n </p>\n )}\n\n {report.summary ? (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <p className=\"text-[11px] font-medium text-muted-foreground\">Summary</p>\n <p\n data-testid=\"test-recording-summary\"\n className=\"mt-0.5 whitespace-pre-wrap break-words text-[12.5px] leading-relaxed text-foreground\"\n >\n {report.summary}\n </p>\n </div>\n ) : null}\n\n {report.url ? (\n <div className=\"flex justify-end border-t border-border/40 px-4 py-2\">\n <a\n href={report.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1.5 rounded-md px-2 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" aria-hidden />\n Watch in Athena\n </a>\n </div>\n ) : null}\n </section>\n );\n}\n\n// ─── test_recording_stop ─────────────────────────────────────────────\n\nconst TestRecordingStopToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = argsRecord(args);\n const titleArg = argString(typedArgs, \"title\");\n const parsed = useMemo(\n () => parseTestRecordingStopResult(result, { fallbackTitle: titleArg }),\n [result, titleArg],\n );\n\n if (parsed.kind === \"saved\") return <TestRecordingReportCard report={parsed.report} />;\n\n const isRunning = status?.type === \"running\";\n const error =\n incompleteMessage(status, \"The test recording could not be saved.\") ??\n (parsed.kind === \"error\" ? parsed.message : null);\n const cardStatus: ToolStatus = error ? \"incomplete\" : isRunning ? \"running\" : \"complete\";\n return (\n <ToolCard\n icon={ClapperboardIcon}\n status={cardStatus}\n title={\n error ? \"Couldn't save the test recording\" : isRunning ? \"Saving test recording…\" : \"Test recording\"\n }\n subtitle={titleArg}\n toolName={toolName}\n error={error}\n args={typedArgs}\n result={result}\n >\n {cardStatus === \"complete\" ? (\n <p className=\"border-t border-border/40 px-4 py-2.5 text-[12px] text-muted-foreground\">\n The recording's report could not be read.\n </p>\n ) : null}\n </ToolCard>\n );\n};\n\nexport const TestRecordingStopToolUI = memo(\n TestRecordingStopToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nTestRecordingStopToolUI.displayName = \"TestRecordingStopToolUI\";\n\n// ─── Compact rows: test_recording_start / test_recording_mark ────────\n\nfunction TestRecordingRow({\n testId,\n kind,\n icon: Icon,\n iconClassName,\n label,\n labelClassName,\n text,\n time,\n error,\n}: {\n testId: string;\n kind?: string;\n icon: ElementType;\n iconClassName?: string;\n label: string;\n labelClassName?: string;\n text?: string;\n time?: string | null;\n error?: string | null;\n}) {\n return (\n <div\n data-testid={testId}\n data-kind={kind}\n data-failed={error ? \"true\" : \"false\"}\n className={cn(\n \"my-1 flex items-start gap-2 rounded-lg px-2 py-1 text-[12.5px] leading-snug\",\n error && \"bg-destructive/5\",\n )}\n >\n <Icon className={cn(\"mt-0.5 size-3.5 shrink-0\", iconClassName)} aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <span className={cn(\"mr-1.5 font-medium\", labelClassName)}>{label}</span>\n {text ? <span className=\"break-words text-foreground\">{text}</span> : null}\n {error ? <p className=\"mt-0.5 break-words text-[12px] text-destructive\">{error}</p> : null}\n </div>\n {time ? (\n <span className=\"shrink-0 font-mono text-[11px] tabular-nums text-muted-foreground\">{time}</span>\n ) : null}\n </div>\n );\n}\n\nconst TestRecordingStartToolUIImpl: ToolCallMessagePartComponent = ({ args, result, status }) => {\n const start = useMemo(\n () => describeTestRecordingStart({ args: argsRecord(args), result }),\n [args, result],\n );\n const error = incompleteMessage(status, \"The recording could not start.\") ?? start.error;\n const isRunning = !error && status?.type === \"running\";\n return (\n <TestRecordingRow\n testId=\"test-recording-start\"\n icon={error ? AlertCircleIcon : isRunning ? LoaderIcon : CircleDotIcon}\n iconClassName={cn(\n error && \"text-destructive\",\n isRunning && \"animate-spin text-muted-foreground\",\n !error && !isRunning && \"text-red-500\",\n )}\n label={error ? \"Couldn't start recording\" : isRunning ? \"Starting recording\" : \"Recording started\"}\n labelClassName={error ? \"text-destructive\" : \"text-muted-foreground\"}\n text={start.title}\n error={error}\n />\n );\n};\n\nexport const TestRecordingStartToolUI = memo(\n TestRecordingStartToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nTestRecordingStartToolUI.displayName = \"TestRecordingStartToolUI\";\n\nconst MARK_ROW: Record<\n TestRecordingMarkKind,\n { label: string; icon: ElementType; iconClassName: string; labelClassName: string }\n> = {\n test: {\n label: \"Test\",\n icon: FlaskConicalIcon,\n iconClassName: \"text-primary\",\n labelClassName: \"text-primary\",\n },\n pass: {\n label: \"Pass\",\n icon: CheckIcon,\n iconClassName: \"text-emerald-600\",\n labelClassName: \"text-emerald-700\",\n },\n fail: {\n label: \"Fail\",\n icon: XIcon,\n iconClassName: \"text-destructive\",\n labelClassName: \"text-destructive\",\n },\n note: {\n label: \"Note\",\n icon: StickyNoteIcon,\n iconClassName: \"text-muted-foreground\",\n labelClassName: \"text-muted-foreground\",\n },\n};\n\n/** A mark whose kind has not streamed in yet (or is one this SDK does not know). */\nconst UNKNOWN_MARK_ROW = {\n label: \"Mark\",\n icon: StickyNoteIcon,\n iconClassName: \"text-muted-foreground\",\n labelClassName: \"text-muted-foreground\",\n} as const;\n\nconst TestRecordingMarkToolUIImpl: ToolCallMessagePartComponent = ({ args, result, status }) => {\n const mark = useMemo(\n () => describeTestRecordingMark({ args: argsRecord(args), result }),\n [args, result],\n );\n const error = incompleteMessage(status, \"The mark was not recorded.\") ?? mark.error;\n const isRunning = !error && status?.type === \"running\";\n const row = mark.kind ? MARK_ROW[mark.kind] : UNKNOWN_MARK_ROW;\n return (\n <TestRecordingRow\n testId=\"test-recording-mark\"\n kind={mark.kind ?? undefined}\n icon={error ? AlertCircleIcon : isRunning ? LoaderIcon : row.icon}\n iconClassName={cn(\n error && \"text-destructive\",\n isRunning && \"animate-spin text-muted-foreground\",\n !error && !isRunning && row.iconClassName,\n )}\n label={error ? `Couldn't mark ${row.label.toLowerCase()}` : row.label}\n labelClassName={error ? \"text-destructive\" : row.labelClassName}\n text={mark.text}\n time={mark.elapsedS !== null ? formatRecordingClock(mark.elapsedS) : null}\n error={error}\n />\n );\n};\n\nexport const TestRecordingMarkToolUI = memo(\n TestRecordingMarkToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nTestRecordingMarkToolUI.displayName = \"TestRecordingMarkToolUI\";\n"],"names":["useAthenaAssetContent","useObjectUrl","useCallback","useRef","useEffect","_a","jsx","jsxs","AlertCircleIcon","LoaderIcon","PlayIcon","formatRecordingClock","CheckIcon","XIcon","CircleDashedIcon","cn","useState","useContext","AthenaContext","ClapperboardIcon","ExternalLinkIcon","useMemo","parseTestRecordingStopResult","ToolCard","memo","describeTestRecordingStart","CircleDotIcon","FlaskConicalIcon","StickyNoteIcon","describeTestRecordingMark"],"mappings":"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"}
1
+ {"version":3,"file":"test-recording-tool-uis.cjs","sources":["../../src/tools/test-recording-tool-uis.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The UI Testing toolkit's cards: an agent records itself checking a UI\n * change on its computer and hands back an annotated video.\n *\n * - `test_recording_stop` — the report: the recording's title, \"N passed · M\n * failed\", each test with its ✓ / ✗ assertions (what the agent saw), the\n * summary, and the video, with every test's start as a chapter that plays\n * from there. It stays in the conversation instead of folding into the\n * turn's steps (`isSdkInlineTool`).\n * - `test_recording_start` / `test_recording_mark` — one compact row each.\n *\n * The video is an Athena asset the signed-in user owns. It is read with the\n * user's own credential through `useAthenaAssetContent` (a permission-checked\n * read of the stored file) and played from a page-local object URL, only when\n * the person presses play or picks a chapter; no shareable link is minted.\n */\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n AlertCircleIcon,\n CheckIcon,\n CircleDashedIcon,\n CircleDotIcon,\n ClapperboardIcon,\n ExternalLinkIcon,\n FlaskConicalIcon,\n LoaderIcon,\n PlayIcon,\n StickyNoteIcon,\n XIcon,\n} from \"lucide-react\";\nimport {\n type ElementType,\n memo,\n type SyntheticEvent,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAthenaAssetContent, useObjectUrl } from \"../assets/use-asset-content\";\nimport { cn } from \"../lib/utils\";\nimport { AthenaContext } from \"../provider/AthenaContext\";\nimport { ToolCard, type ToolStatus } from \"./primitives\";\nimport {\n describeTestRecordingMark,\n describeTestRecordingStart,\n formatRecordingClock,\n parseTestRecordingStopResult,\n type TestRecordingAssertion,\n type TestRecordingMarkKind,\n type TestRecordingOutcome,\n type TestRecordingReport,\n type TestRecordingTest,\n} from \"./test-recording-report\";\n\n// ─── Helpers ─────────────────────────────────────────────────────────\n\nfunction argsRecord(args: unknown): Record<string, unknown> | undefined {\n return typeof args === \"object\" && args !== null && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : undefined;\n}\n\nfunction argString(args: Record<string, unknown> | undefined, key: string): string | undefined {\n const value = args?.[key];\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : undefined;\n}\n\n/** The message an `incomplete` tool status carries, or `null` for any other status. */\nfunction incompleteMessage(\n status: { type: string; reason?: string; error?: unknown } | undefined,\n fallback: string,\n): string | null {\n if (status?.type !== \"incomplete\") return null;\n if (status.reason === \"cancelled\") return \"Cancelled\";\n if (typeof status.error === \"string\" && status.error.trim() !== \"\") return status.error;\n return fallback;\n}\n\n// ─── Playback ────────────────────────────────────────────────────────\n\ninterface PlaybackRequest {\n /** The person asked to play: the video is read from then on. */\n requested: boolean;\n /** The last chapter picked; `nonce` makes picking the same chapter twice seek twice. */\n seek: { time: number; nonce: number } | null;\n}\n\nconst IDLE_PLAYBACK: PlaybackRequest = { requested: false, seek: null };\n\n/** `HTMLMediaElement.HAVE_METADATA`: below it a seek waits for the video's metadata. */\nconst HAVE_METADATA = 1;\n\nfunction playbackErrorMessage(error: Error): string {\n const status = (error as { status?: unknown }).status;\n if (status === 401 || status === 403) return \"You don't have access to this recording.\";\n if (status === 404) return \"The recording's video was not found.\";\n return \"The recording could not be loaded.\";\n}\n\nfunction TestRecordingPlayer({\n assetId,\n title,\n durationS,\n url,\n playback,\n onPlay,\n}: {\n assetId: string;\n title: string;\n durationS: number | null;\n url: string | null;\n playback: PlaybackRequest;\n onPlay: () => void;\n}) {\n const content = useAthenaAssetContent({ assetId, enabled: playback.requested });\n // Bytes a query already holds still wait for the person to press play.\n const src = useObjectUrl(playback.requested ? content.data : undefined);\n const { refetch } = content;\n const retry = useCallback(() => {\n void refetch();\n }, [refetch]);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const pendingSeekRef = useRef<number | null>(null);\n const seekTime = playback.seek?.time;\n const seekNonce = playback.seek?.nonce ?? 0;\n\n // Play once the bytes are here, and again from each chapter picked (the\n // nonce is the pick's change signal; picking one chapter twice seeks twice).\n // A seek before the metadata loads sets the start position and is applied\n // again once it has (`onLoadedMetadata`).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n const video = videoRef.current;\n if (!video || !src) return;\n if (seekTime !== undefined) {\n video.currentTime = seekTime;\n pendingSeekRef.current = video.readyState < HAVE_METADATA ? seekTime : null;\n }\n video.play()?.catch(() => {\n // Autoplay refused (no recent user gesture): the controls stay to press play.\n });\n }, [src, seekNonce]);\n\n const handleLoadedMetadata = useCallback((event: SyntheticEvent<HTMLVideoElement>) => {\n const pending = pendingSeekRef.current;\n pendingSeekRef.current = null;\n if (pending !== null) event.currentTarget.currentTime = pending;\n }, []);\n\n if (src) {\n return (\n <video\n ref={videoRef}\n data-testid=\"test-recording-video\"\n src={src}\n controls\n playsInline\n preload=\"auto\"\n aria-label={`Recording: ${title}`}\n onLoadedMetadata={handleLoadedMetadata}\n className=\"block max-h-[480px] w-full bg-black\"\n />\n );\n }\n\n if (content.isError && !content.isFetching) {\n return (\n <div\n role=\"alert\"\n data-testid=\"test-recording-video-error\"\n className=\"flex aspect-video w-full flex-col items-center justify-center gap-2 bg-muted/40 px-6 text-center\"\n >\n <AlertCircleIcon className=\"size-5 text-destructive\" aria-hidden />\n <p className=\"text-[12.5px] text-foreground\">{playbackErrorMessage(content.error)}</p>\n <div className=\"flex items-center gap-3\">\n {/* An explicit retry, refusals included: access may have changed since. */}\n <button\n type=\"button\"\n onClick={retry}\n className=\"rounded-md border border-border bg-background px-2.5 py-1 text-[12px] font-medium text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n Try again\n </button>\n {url ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[12px] font-medium text-primary hover:underline\"\n >\n Watch in Athena\n </a>\n ) : null}\n </div>\n </div>\n );\n }\n\n if (playback.requested) {\n return (\n <output\n data-testid=\"test-recording-video-loading\"\n className=\"flex aspect-video w-full items-center justify-center gap-2 bg-zinc-950 text-[12px] text-white/80\"\n >\n <LoaderIcon className=\"size-4 animate-spin\" aria-hidden />\n Loading recording…\n </output>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onPlay}\n aria-label={`Play recording: ${title}`}\n className=\"group relative flex aspect-video w-full items-center justify-center bg-zinc-950 text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n >\n <span className=\"flex size-12 items-center justify-center rounded-full bg-white/15 transition-colors group-hover:bg-white/25\">\n <PlayIcon className=\"ml-0.5 size-5 fill-current\" aria-hidden />\n </span>\n {durationS !== null ? (\n <span className=\"absolute right-3 bottom-2 text-[11px] tabular-nums text-white/80\">\n {formatRecordingClock(durationS)}\n </span>\n ) : null}\n </button>\n );\n}\n\n/** A time that plays the recording from there: a test's chapter or an assertion's moment. */\nfunction ChapterButton({\n time,\n label,\n onSeek,\n}: {\n time: number;\n label: string;\n onSeek: (time: number) => void;\n}) {\n const clock = formatRecordingClock(time);\n return (\n <button\n type=\"button\"\n data-testid=\"test-recording-chapter\"\n onClick={() => onSeek(time)}\n aria-label={`Play from ${clock}: ${label}`}\n className=\"shrink-0 rounded px-1.5 py-0.5 font-mono text-[11px] tabular-nums text-primary transition-colors hover:bg-primary/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {clock}\n </button>\n );\n}\n\n// ─── Report card ─────────────────────────────────────────────────────\n\nconst OUTCOME_LABEL: Record<TestRecordingOutcome, string> = {\n passed: \"Passed\",\n failed: \"Failed\",\n untested: \"Not checked\",\n};\n\nfunction OutcomeIcon({ result }: { result: TestRecordingOutcome }) {\n if (result === \"passed\") {\n return (\n <span className=\"mt-px flex size-4 shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white\">\n <CheckIcon className=\"size-2.5\" strokeWidth={3.5} aria-hidden />\n </span>\n );\n }\n if (result === \"failed\") {\n return (\n <span className=\"mt-px flex size-4 shrink-0 items-center justify-center rounded-full bg-destructive text-white\">\n <XIcon className=\"size-2.5\" strokeWidth={3.5} aria-hidden />\n </span>\n );\n }\n return <CircleDashedIcon className=\"mt-px size-4 shrink-0 text-muted-foreground\" aria-hidden />;\n}\n\nfunction AssertionRow({\n assertion,\n onSeek,\n}: {\n assertion: TestRecordingAssertion;\n onSeek: ((time: number) => void) | null;\n}) {\n const failed = assertion.result === \"failed\";\n const text = assertion.text || (failed ? \"Failed\" : \"Passed\");\n return (\n <li\n data-testid=\"test-recording-assertion\"\n data-result={assertion.result}\n className={cn(\n \"flex items-start gap-1.5 rounded-md px-1.5 py-0.5 text-[12px] leading-snug\",\n failed ? \"bg-destructive/10 text-destructive\" : \"text-muted-foreground\",\n )}\n >\n {failed ? (\n <XIcon className=\"mt-0.5 size-3 shrink-0\" strokeWidth={3} aria-hidden />\n ) : (\n <CheckIcon className=\"mt-0.5 size-3 shrink-0 text-emerald-600\" strokeWidth={3} aria-hidden />\n )}\n <span className=\"min-w-0 flex-1 break-words\">\n <span className=\"sr-only\">{failed ? \"Failed: \" : \"Passed: \"}</span>\n {text}\n </span>\n {onSeek && assertion.editedTimeS !== null ? (\n <ChapterButton time={assertion.editedTimeS} label={text} onSeek={onSeek} />\n ) : null}\n </li>\n );\n}\n\nfunction TestRow({ test, onSeek }: { test: TestRecordingTest; onSeek: ((time: number) => void) | null }) {\n return (\n <li data-testid=\"test-recording-test\" data-result={test.result} className=\"px-4 py-2.5\">\n <div className=\"flex items-start gap-2\">\n <OutcomeIcon result={test.result} />\n <span\n className={cn(\n \"min-w-0 flex-1 break-words text-[12.5px] font-medium leading-snug\",\n test.result === \"failed\" && \"text-destructive\",\n test.result === \"passed\" && \"text-foreground\",\n test.result === \"untested\" && \"text-muted-foreground\",\n )}\n >\n <span className=\"sr-only\">{`${OUTCOME_LABEL[test.result]}: `}</span>\n {test.name}\n </span>\n {test.result === \"untested\" ? (\n <span className=\"shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n Not checked\n </span>\n ) : null}\n {onSeek && test.startTimeS !== null ? (\n <ChapterButton time={test.startTimeS} label={test.name} onSeek={onSeek} />\n ) : null}\n </div>\n {test.assertions.length > 0 ? (\n <ul className=\"mt-1 flex flex-col gap-0.5 pl-6\">\n {test.assertions.map((assertion, index) => (\n <AssertionRow\n // Assertions are an ordered log with no id of their own, never reordered.\n key={index}\n assertion={assertion}\n onSeek={onSeek}\n />\n ))}\n </ul>\n ) : null}\n </li>\n );\n}\n\nexport interface TestRecordingReportCardProps {\n report: TestRecordingReport;\n className?: string;\n}\n\n/**\n * A saved test recording: the title and counts, the video (read with the\n * signed-in user's credential when the person presses play), each test with\n * its assertions and chapter times, the summary, and a link to the asset in\n * Athena.\n */\nexport function TestRecordingReportCard({ report, className }: TestRecordingReportCardProps) {\n const [playback, setPlayback] = useState<PlaybackRequest>(IDLE_PLAYBACK);\n const play = useCallback(() => {\n setPlayback((previous) => ({ ...previous, requested: true }));\n }, []);\n const seek = useCallback((time: number) => {\n setPlayback((previous) => ({\n requested: true,\n seek: { time, nonce: (previous.seek?.nonce ?? 0) + 1 },\n }));\n }, []);\n // The video is read with the provider's credentials; a host that renders\n // the card outside `<AthenaProvider>` gets the report and the link only.\n const athenaConfig = useContext(AthenaContext);\n const playableAssetId = athenaConfig ? report.assetId : null;\n const onSeek = playableAssetId ? seek : null;\n const hasFailures = report.failed > 0;\n\n return (\n <section\n data-testid=\"test-recording-report\"\n data-has-failures={hasFailures ? \"true\" : \"false\"}\n aria-label={`Test recording: ${report.title}`}\n className={cn(\n \"my-3 w-full overflow-hidden rounded-xl border border-border/60 bg-background shadow-sm\",\n className,\n )}\n >\n <header className=\"flex items-start gap-3 px-4 py-3\">\n <span\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-lg\",\n hasFailures ? \"bg-destructive/10 text-destructive\" : \"bg-emerald-50 text-emerald-600\",\n )}\n >\n <ClapperboardIcon className=\"size-4\" aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"break-words text-[13px] font-medium leading-snug text-foreground\">\n {report.title}\n </h3>\n <p data-testid=\"test-recording-counts\" className=\"text-[12px] tabular-nums text-muted-foreground\">\n <span className={cn(report.passed > 0 && \"text-emerald-700\")}>{report.passed} passed</span>\n {\" · \"}\n <span className={cn(hasFailures && \"font-medium text-destructive\")}>{report.failed} failed</span>\n {report.untested > 0 ? ` · ${report.untested} untested` : null}\n </p>\n </div>\n <span className=\"shrink-0 rounded-md bg-muted/60 px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground\">\n UI test\n </span>\n </header>\n\n {playableAssetId ? (\n <div className=\"border-t border-border/40\">\n <TestRecordingPlayer\n assetId={playableAssetId}\n title={report.title}\n durationS={report.editedDurationS}\n url={report.url}\n playback={playback}\n onPlay={play}\n />\n </div>\n ) : null}\n\n {report.tests.length > 0 ? (\n <ol aria-label=\"Tests\" className=\"flex flex-col divide-y divide-border/40 border-t border-border/40\">\n {report.tests.map((test, index) => (\n // Tests are an ordered log, never reordered; two may share a name.\n <TestRow key={index} test={test} onSeek={onSeek} />\n ))}\n </ol>\n ) : (\n <p className=\"border-t border-border/40 px-4 py-2.5 text-[12px] text-muted-foreground\">\n No tests were marked in this recording.\n </p>\n )}\n\n {report.summary ? (\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <p className=\"text-[11px] font-medium text-muted-foreground\">Summary</p>\n <p\n data-testid=\"test-recording-summary\"\n className=\"mt-0.5 whitespace-pre-wrap break-words text-[12.5px] leading-relaxed text-foreground\"\n >\n {report.summary}\n </p>\n </div>\n ) : null}\n\n {report.url ? (\n <div className=\"flex justify-end border-t border-border/40 px-4 py-2\">\n <a\n href={report.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1.5 rounded-md px-2 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3\" aria-hidden />\n Watch in Athena\n </a>\n </div>\n ) : null}\n </section>\n );\n}\n\n// ─── test_recording_stop ─────────────────────────────────────────────\n\nconst TestRecordingStopToolUIImpl: ToolCallMessagePartComponent = ({\n toolName,\n args,\n result,\n status,\n}) => {\n const typedArgs = argsRecord(args);\n const titleArg = argString(typedArgs, \"title\");\n const parsed = useMemo(\n () => parseTestRecordingStopResult(result, { fallbackTitle: titleArg }),\n [result, titleArg],\n );\n\n if (parsed.kind === \"saved\") return <TestRecordingReportCard report={parsed.report} />;\n\n const isRunning = status?.type === \"running\";\n const error =\n incompleteMessage(status, \"The test recording could not be saved.\") ??\n (parsed.kind === \"error\" ? parsed.message : null);\n const cardStatus: ToolStatus = error ? \"incomplete\" : isRunning ? \"running\" : \"complete\";\n return (\n <ToolCard\n icon={ClapperboardIcon}\n status={cardStatus}\n title={\n error ? \"Couldn't save the test recording\" : isRunning ? \"Saving test recording…\" : \"Test recording\"\n }\n subtitle={titleArg}\n toolName={toolName}\n error={error}\n args={typedArgs}\n result={result}\n >\n {cardStatus === \"complete\" ? (\n <p className=\"border-t border-border/40 px-4 py-2.5 text-[12px] text-muted-foreground\">\n The recording's report could not be read.\n </p>\n ) : null}\n </ToolCard>\n );\n};\n\nexport const TestRecordingStopToolUI = memo(\n TestRecordingStopToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nTestRecordingStopToolUI.displayName = \"TestRecordingStopToolUI\";\n\n// ─── Compact rows: test_recording_start / test_recording_mark ────────\n\nfunction TestRecordingRow({\n testId,\n kind,\n icon: Icon,\n iconClassName,\n label,\n labelClassName,\n text,\n time,\n error,\n}: {\n testId: string;\n kind?: string;\n icon: ElementType;\n iconClassName?: string;\n label: string;\n labelClassName?: string;\n text?: string;\n time?: string | null;\n error?: string | null;\n}) {\n return (\n <div\n data-testid={testId}\n data-kind={kind}\n data-failed={error ? \"true\" : \"false\"}\n className={cn(\n \"my-1 flex items-start gap-2 rounded-lg px-2 py-1 text-[12.5px] leading-snug\",\n error && \"bg-destructive/5\",\n )}\n >\n <Icon className={cn(\"mt-0.5 size-3.5 shrink-0\", iconClassName)} aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <span className={cn(\"mr-1.5 font-medium\", labelClassName)}>{label}</span>\n {text ? <span className=\"break-words text-foreground\">{text}</span> : null}\n {error ? <p className=\"mt-0.5 break-words text-[12px] text-destructive\">{error}</p> : null}\n </div>\n {time ? (\n <span className=\"shrink-0 font-mono text-[11px] tabular-nums text-muted-foreground\">{time}</span>\n ) : null}\n </div>\n );\n}\n\nconst TestRecordingStartToolUIImpl: ToolCallMessagePartComponent = ({ args, result, status }) => {\n const start = useMemo(\n () => describeTestRecordingStart({ args: argsRecord(args), result }),\n [args, result],\n );\n const error = incompleteMessage(status, \"The recording could not start.\") ?? start.error;\n const isRunning = !error && status?.type === \"running\";\n return (\n <TestRecordingRow\n testId=\"test-recording-start\"\n icon={error ? AlertCircleIcon : isRunning ? LoaderIcon : CircleDotIcon}\n iconClassName={cn(\n error && \"text-destructive\",\n isRunning && \"animate-spin text-muted-foreground\",\n !error && !isRunning && \"text-red-500\",\n )}\n label={error ? \"Couldn't start recording\" : isRunning ? \"Starting recording\" : \"Recording started\"}\n labelClassName={error ? \"text-destructive\" : \"text-muted-foreground\"}\n text={start.title}\n error={error}\n />\n );\n};\n\nexport const TestRecordingStartToolUI = memo(\n TestRecordingStartToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nTestRecordingStartToolUI.displayName = \"TestRecordingStartToolUI\";\n\nconst MARK_ROW: Record<\n TestRecordingMarkKind,\n { label: string; icon: ElementType; iconClassName: string; labelClassName: string }\n> = {\n test: {\n label: \"Test\",\n icon: FlaskConicalIcon,\n iconClassName: \"text-primary\",\n labelClassName: \"text-primary\",\n },\n pass: {\n label: \"Pass\",\n icon: CheckIcon,\n iconClassName: \"text-emerald-600\",\n labelClassName: \"text-emerald-700\",\n },\n fail: {\n label: \"Fail\",\n icon: XIcon,\n iconClassName: \"text-destructive\",\n labelClassName: \"text-destructive\",\n },\n note: {\n label: \"Note\",\n icon: StickyNoteIcon,\n iconClassName: \"text-muted-foreground\",\n labelClassName: \"text-muted-foreground\",\n },\n};\n\n/** A mark whose kind has not streamed in yet (or is one this SDK does not know). */\nconst UNKNOWN_MARK_ROW = {\n label: \"Mark\",\n icon: StickyNoteIcon,\n iconClassName: \"text-muted-foreground\",\n labelClassName: \"text-muted-foreground\",\n} as const;\n\nconst TestRecordingMarkToolUIImpl: ToolCallMessagePartComponent = ({ args, result, status }) => {\n const mark = useMemo(\n () => describeTestRecordingMark({ args: argsRecord(args), result }),\n [args, result],\n );\n const error = incompleteMessage(status, \"The mark was not recorded.\") ?? mark.error;\n const isRunning = !error && status?.type === \"running\";\n const row = mark.kind ? MARK_ROW[mark.kind] : UNKNOWN_MARK_ROW;\n return (\n <TestRecordingRow\n testId=\"test-recording-mark\"\n kind={mark.kind ?? undefined}\n icon={error ? AlertCircleIcon : isRunning ? LoaderIcon : row.icon}\n iconClassName={cn(\n error && \"text-destructive\",\n isRunning && \"animate-spin text-muted-foreground\",\n !error && !isRunning && row.iconClassName,\n )}\n label={error ? `Couldn't mark ${row.label.toLowerCase()}` : row.label}\n labelClassName={error ? \"text-destructive\" : row.labelClassName}\n text={mark.text}\n time={mark.elapsedS !== null ? formatRecordingClock(mark.elapsedS) : null}\n error={error}\n />\n );\n};\n\nexport const TestRecordingMarkToolUI = memo(\n TestRecordingMarkToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\nTestRecordingMarkToolUI.displayName = \"TestRecordingMarkToolUI\";\n"],"names":["useAthenaAssetContent","useObjectUrl","useCallback","useRef","useEffect","_a","jsx","jsxs","AlertCircleIcon","LoaderIcon","PlayIcon","formatRecordingClock","CheckIcon","XIcon","CircleDashedIcon","cn","useState","useContext","AthenaContext","ClapperboardIcon","ExternalLinkIcon","useMemo","parseTestRecordingStopResult","ToolCard","memo","describeTestRecordingStart","CircleDotIcon","FlaskConicalIcon","StickyNoteIcon","describeTestRecordingMark"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const react = require("react");
3
+ const require$$0 = require("react");
4
4
  const threadIdContext = require("../threads/thread-id-context.cjs");
5
5
  const DEFAULT_SCOPE = "default";
6
6
  let nextSeq = 1;
@@ -64,16 +64,16 @@ function subscribe(listener) {
64
64
  }
65
65
  const getVersion = () => version;
66
66
  function usePlanScope() {
67
- return react.useContext(threadIdContext.AthenaThreadIdContext) ?? DEFAULT_SCOPE;
67
+ return require$$0.useContext(threadIdContext.AthenaThreadIdContext) ?? DEFAULT_SCOPE;
68
68
  }
69
69
  function useIsLatestPlanCard(scope, seq) {
70
- react.useSyncExternalStore(subscribe, getVersion, getVersion);
70
+ require$$0.useSyncExternalStore(subscribe, getVersion, getVersion);
71
71
  const latest = latestPlanSeq(scope);
72
72
  return latest === null || latest === seq;
73
73
  }
74
74
  function useLatestTodoPlan() {
75
75
  const scope = usePlanScope();
76
- react.useSyncExternalStore(subscribe, getVersion, getVersion);
76
+ require$$0.useSyncExternalStore(subscribe, getVersion, getVersion);
77
77
  const entry = latestPlanEntry(scope);
78
78
  return entry ? { plan: entry.plan, isWriting: entry.isWriting } : null;
79
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"todo-plan-store.cjs","sources":["../../src/tools/todo-plan-store.ts"],"sourcesContent":["/**\n * Live registry of mounted `write_todos` cards — the newest one wins.\n *\n * A run updates its plan by calling `write_todos` repeatedly, and every call\n * renders its own card, so a conversation stacks \"Plan in progress / Plan\n * complete\" cards that all describe the same plan. The registry tracks the\n * mounted cards in mount order (the thread renders messages top-down, so the\n * newest call mounts last); {@link WriteTodosToolUI} renders the full card\n * only for the newest instance and nothing for superseded ones.\n *\n * Scoped by thread id (from `AthenaThreadIdContext`): a page hosting several\n * chats ranks each conversation's cards separately, so one chat's plan never\n * suppresses another's. Two views of the SAME thread share a scope, which is\n * the correct behavior — they show the same plan.\n *\n * Instance-scoped sequence numbers, not callId-scoped: reopening a thread\n * mounts fresh instances with fresh sequence numbers, so \"newest\" always\n * resolves within what is currently on screen.\n *\n * Hosts that want a pinned plan strip instead of the inline card should\n * register {@link HiddenWriteTodosToolUI} (which feeds this registry and\n * renders nothing) and read {@link useLatestTodoPlan}.\n */\nimport { useContext, useSyncExternalStore } from \"react\";\nimport { AthenaThreadIdContext } from \"../threads/thread-id-context\";\nimport type { TodoPlan } from \"./write-todos-tool-ui\";\n\ninterface PlanEntry {\n seq: number;\n plan: TodoPlan;\n isWriting: boolean;\n}\n\nconst DEFAULT_SCOPE = \"default\";\n\nlet nextSeq = 1;\nconst scopes = new Map<string, Map<number, PlanEntry>>();\nconst listeners = new Set<() => void>();\nlet version = 0;\n\nfunction emit(): void {\n version++;\n for (const listener of listeners) listener();\n}\n\nfunction scopeEntries(scope: string): Map<number, PlanEntry> {\n let entries = scopes.get(scope);\n if (!entries) {\n entries = new Map();\n scopes.set(scope, entries);\n }\n return entries;\n}\n\n/** Allocate a mount-ordered sequence number (pure counter — safe to discard). */\nexport function allocatePlanSeq(): number {\n return nextSeq++;\n}\n\nexport function registerPlanCard(\n scope: string,\n seq: number,\n plan: TodoPlan,\n isWriting: boolean,\n): void {\n scopeEntries(scope).set(seq, { seq, plan, isWriting });\n emit();\n}\n\nexport function updatePlanCard(\n scope: string,\n seq: number,\n plan: TodoPlan,\n isWriting: boolean,\n): void {\n const entry = scopes.get(scope)?.get(seq);\n if (!entry) return;\n entry.plan = plan;\n entry.isWriting = isWriting;\n emit();\n}\n\nexport function unregisterPlanCard(scope: string, seq: number): void {\n const entries = scopes.get(scope);\n if (!entries) return;\n if (entries.delete(seq)) {\n if (entries.size === 0) scopes.delete(scope);\n emit();\n }\n}\n\nexport function latestPlanSeq(scope: string): number | null {\n const entries = scopes.get(scope);\n if (!entries) return null;\n let latest: number | null = null;\n for (const seq of entries.keys()) {\n if (latest === null || seq > latest) latest = seq;\n }\n return latest;\n}\n\nfunction latestPlanEntry(scope: string): PlanEntry | null {\n const seq = latestPlanSeq(scope);\n return seq === null ? null : (scopes.get(scope)?.get(seq) ?? null);\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nconst getVersion = () => version;\n\n/** The plan scope for the calling component's chat (its thread id). */\nexport function usePlanScope(): string {\n return useContext(AthenaThreadIdContext) ?? DEFAULT_SCOPE;\n}\n\n/**\n * Whether the card with this sequence number is the newest mounted plan card\n * in its scope. On the server (and before client effects have registered any\n * card) every card reports latest, so static renders still show the plan.\n */\nexport function useIsLatestPlanCard(scope: string, seq: number): boolean {\n const currentVersion = useSyncExternalStore(subscribe, getVersion, getVersion);\n void currentVersion; // subscription tick — the value itself is not meaningful\n const latest = latestPlanSeq(scope);\n return latest === null || latest === seq;\n}\n\nexport interface LatestTodoPlan {\n plan: TodoPlan;\n /** True while the newest plan card's tool call is still streaming. */\n isWriting: boolean;\n}\n\n/**\n * The newest mounted plan for the calling chat, for hosts building their own\n * pinned plan UI. Pair with `toolUIs={{ write_todos: HiddenWriteTodosToolUI }}`\n * — that component keeps feeding this registry while rendering nothing inline\n * (a bare `() => null` override would starve it).\n */\nexport function useLatestTodoPlan(): LatestTodoPlan | null {\n const scope = usePlanScope();\n const currentVersion = useSyncExternalStore(subscribe, getVersion, getVersion);\n void currentVersion;\n const entry = latestPlanEntry(scope);\n return entry ? { plan: entry.plan, isWriting: entry.isWriting } : null;\n}\n\n/** Test-only: reset module state between cases. */\nexport function resetTodoPlanStoreForTests(): void {\n nextSeq = 1;\n scopes.clear();\n version = 0;\n}\n"],"names":["useContext","AthenaThreadIdContext","useSyncExternalStore"],"mappings":";;;;AAiCA,MAAM,gBAAgB;AAEtB,IAAI,UAAU;AACd,MAAM,6BAAa,IAAA;AACnB,MAAM,gCAAgB,IAAA;AACtB,IAAI,UAAU;AAEd,SAAS,OAAa;AACpB;AACA,aAAW,YAAY,UAAW,UAAA;AACpC;AAEA,SAAS,aAAa,OAAuC;AAC3D,MAAI,UAAU,OAAO,IAAI,KAAK;AAC9B,MAAI,CAAC,SAAS;AACZ,kCAAc,IAAA;AACd,WAAO,IAAI,OAAO,OAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAGO,SAAS,kBAA0B;AACxC,SAAO;AACT;AAEO,SAAS,iBACd,OACA,KACA,MACA,WACM;AACN,eAAa,KAAK,EAAE,IAAI,KAAK,EAAE,KAAK,MAAM,WAAW;AACrD,OAAA;AACF;AAEO,SAAS,eACd,OACA,KACA,MACA,WACM;;AACN,QAAM,SAAQ,YAAO,IAAI,KAAK,MAAhB,mBAAmB,IAAI;AACrC,MAAI,CAAC,MAAO;AACZ,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,OAAA;AACF;AAEO,SAAS,mBAAmB,OAAe,KAAmB;AACnE,QAAM,UAAU,OAAO,IAAI,KAAK;AAChC,MAAI,CAAC,QAAS;AACd,MAAI,QAAQ,OAAO,GAAG,GAAG;AACvB,QAAI,QAAQ,SAAS,EAAG,QAAO,OAAO,KAAK;AAC3C,SAAA;AAAA,EACF;AACF;AAEO,SAAS,cAAc,OAA8B;AAC1D,QAAM,UAAU,OAAO,IAAI,KAAK;AAChC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,SAAwB;AAC5B,aAAW,OAAO,QAAQ,QAAQ;AAChC,QAAI,WAAW,QAAQ,MAAM,OAAQ,UAAS;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAiC;;AACxD,QAAM,MAAM,cAAc,KAAK;AAC/B,SAAO,QAAQ,OAAO,SAAQ,YAAO,IAAI,KAAK,MAAhB,mBAAmB,IAAI,SAAQ;AAC/D;AAEA,SAAS,UAAU,UAAkC;AACnD,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM;AACX,cAAU,OAAO,QAAQ;AAAA,EAC3B;AACF;AAEA,MAAM,aAAa,MAAM;AAGlB,SAAS,eAAuB;AACrC,SAAOA,MAAAA,WAAWC,gBAAAA,qBAAqB,KAAK;AAC9C;AAOO,SAAS,oBAAoB,OAAe,KAAsB;AAChDC,6BAAqB,WAAW,YAAY,UAAU;AAE7E,QAAM,SAAS,cAAc,KAAK;AAClC,SAAO,WAAW,QAAQ,WAAW;AACvC;AAcO,SAAS,oBAA2C;AACzD,QAAM,QAAQ,aAAA;AACSA,6BAAqB,WAAW,YAAY,UAAU;AAE7E,QAAM,QAAQ,gBAAgB,KAAK;AACnC,SAAO,QAAQ,EAAE,MAAM,MAAM,MAAM,WAAW,MAAM,cAAc;AACpE;;;;;;;;;"}
1
+ {"version":3,"file":"todo-plan-store.cjs","sources":["../../src/tools/todo-plan-store.ts"],"sourcesContent":["/**\n * Live registry of mounted `write_todos` cards — the newest one wins.\n *\n * A run updates its plan by calling `write_todos` repeatedly, and every call\n * renders its own card, so a conversation stacks \"Plan in progress / Plan\n * complete\" cards that all describe the same plan. The registry tracks the\n * mounted cards in mount order (the thread renders messages top-down, so the\n * newest call mounts last); {@link WriteTodosToolUI} renders the full card\n * only for the newest instance and nothing for superseded ones.\n *\n * Scoped by thread id (from `AthenaThreadIdContext`): a page hosting several\n * chats ranks each conversation's cards separately, so one chat's plan never\n * suppresses another's. Two views of the SAME thread share a scope, which is\n * the correct behavior — they show the same plan.\n *\n * Instance-scoped sequence numbers, not callId-scoped: reopening a thread\n * mounts fresh instances with fresh sequence numbers, so \"newest\" always\n * resolves within what is currently on screen.\n *\n * Hosts that want a pinned plan strip instead of the inline card should\n * register {@link HiddenWriteTodosToolUI} (which feeds this registry and\n * renders nothing) and read {@link useLatestTodoPlan}.\n */\nimport { useContext, useSyncExternalStore } from \"react\";\nimport { AthenaThreadIdContext } from \"../threads/thread-id-context\";\nimport type { TodoPlan } from \"./write-todos-tool-ui\";\n\ninterface PlanEntry {\n seq: number;\n plan: TodoPlan;\n isWriting: boolean;\n}\n\nconst DEFAULT_SCOPE = \"default\";\n\nlet nextSeq = 1;\nconst scopes = new Map<string, Map<number, PlanEntry>>();\nconst listeners = new Set<() => void>();\nlet version = 0;\n\nfunction emit(): void {\n version++;\n for (const listener of listeners) listener();\n}\n\nfunction scopeEntries(scope: string): Map<number, PlanEntry> {\n let entries = scopes.get(scope);\n if (!entries) {\n entries = new Map();\n scopes.set(scope, entries);\n }\n return entries;\n}\n\n/** Allocate a mount-ordered sequence number (pure counter — safe to discard). */\nexport function allocatePlanSeq(): number {\n return nextSeq++;\n}\n\nexport function registerPlanCard(\n scope: string,\n seq: number,\n plan: TodoPlan,\n isWriting: boolean,\n): void {\n scopeEntries(scope).set(seq, { seq, plan, isWriting });\n emit();\n}\n\nexport function updatePlanCard(\n scope: string,\n seq: number,\n plan: TodoPlan,\n isWriting: boolean,\n): void {\n const entry = scopes.get(scope)?.get(seq);\n if (!entry) return;\n entry.plan = plan;\n entry.isWriting = isWriting;\n emit();\n}\n\nexport function unregisterPlanCard(scope: string, seq: number): void {\n const entries = scopes.get(scope);\n if (!entries) return;\n if (entries.delete(seq)) {\n if (entries.size === 0) scopes.delete(scope);\n emit();\n }\n}\n\nexport function latestPlanSeq(scope: string): number | null {\n const entries = scopes.get(scope);\n if (!entries) return null;\n let latest: number | null = null;\n for (const seq of entries.keys()) {\n if (latest === null || seq > latest) latest = seq;\n }\n return latest;\n}\n\nfunction latestPlanEntry(scope: string): PlanEntry | null {\n const seq = latestPlanSeq(scope);\n return seq === null ? null : (scopes.get(scope)?.get(seq) ?? null);\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nconst getVersion = () => version;\n\n/** The plan scope for the calling component's chat (its thread id). */\nexport function usePlanScope(): string {\n return useContext(AthenaThreadIdContext) ?? DEFAULT_SCOPE;\n}\n\n/**\n * Whether the card with this sequence number is the newest mounted plan card\n * in its scope. On the server (and before client effects have registered any\n * card) every card reports latest, so static renders still show the plan.\n */\nexport function useIsLatestPlanCard(scope: string, seq: number): boolean {\n const currentVersion = useSyncExternalStore(subscribe, getVersion, getVersion);\n void currentVersion; // subscription tick — the value itself is not meaningful\n const latest = latestPlanSeq(scope);\n return latest === null || latest === seq;\n}\n\nexport interface LatestTodoPlan {\n plan: TodoPlan;\n /** True while the newest plan card's tool call is still streaming. */\n isWriting: boolean;\n}\n\n/**\n * The newest mounted plan for the calling chat, for hosts building their own\n * pinned plan UI. Pair with `toolUIs={{ write_todos: HiddenWriteTodosToolUI }}`\n * — that component keeps feeding this registry while rendering nothing inline\n * (a bare `() => null` override would starve it).\n */\nexport function useLatestTodoPlan(): LatestTodoPlan | null {\n const scope = usePlanScope();\n const currentVersion = useSyncExternalStore(subscribe, getVersion, getVersion);\n void currentVersion;\n const entry = latestPlanEntry(scope);\n return entry ? { plan: entry.plan, isWriting: entry.isWriting } : null;\n}\n\n/** Test-only: reset module state between cases. */\nexport function resetTodoPlanStoreForTests(): void {\n nextSeq = 1;\n scopes.clear();\n version = 0;\n}\n"],"names":["useContext","AthenaThreadIdContext","useSyncExternalStore"],"mappings":";;;;AAiCA,MAAM,gBAAgB;AAEtB,IAAI,UAAU;AACd,MAAM,6BAAa,IAAA;AACnB,MAAM,gCAAgB,IAAA;AACtB,IAAI,UAAU;AAEd,SAAS,OAAa;AACpB;AACA,aAAW,YAAY,UAAW,UAAA;AACpC;AAEA,SAAS,aAAa,OAAuC;AAC3D,MAAI,UAAU,OAAO,IAAI,KAAK;AAC9B,MAAI,CAAC,SAAS;AACZ,kCAAc,IAAA;AACd,WAAO,IAAI,OAAO,OAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAGO,SAAS,kBAA0B;AACxC,SAAO;AACT;AAEO,SAAS,iBACd,OACA,KACA,MACA,WACM;AACN,eAAa,KAAK,EAAE,IAAI,KAAK,EAAE,KAAK,MAAM,WAAW;AACrD,OAAA;AACF;AAEO,SAAS,eACd,OACA,KACA,MACA,WACM;;AACN,QAAM,SAAQ,YAAO,IAAI,KAAK,MAAhB,mBAAmB,IAAI;AACrC,MAAI,CAAC,MAAO;AACZ,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,OAAA;AACF;AAEO,SAAS,mBAAmB,OAAe,KAAmB;AACnE,QAAM,UAAU,OAAO,IAAI,KAAK;AAChC,MAAI,CAAC,QAAS;AACd,MAAI,QAAQ,OAAO,GAAG,GAAG;AACvB,QAAI,QAAQ,SAAS,EAAG,QAAO,OAAO,KAAK;AAC3C,SAAA;AAAA,EACF;AACF;AAEO,SAAS,cAAc,OAA8B;AAC1D,QAAM,UAAU,OAAO,IAAI,KAAK;AAChC,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,SAAwB;AAC5B,aAAW,OAAO,QAAQ,QAAQ;AAChC,QAAI,WAAW,QAAQ,MAAM,OAAQ,UAAS;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAiC;;AACxD,QAAM,MAAM,cAAc,KAAK;AAC/B,SAAO,QAAQ,OAAO,SAAQ,YAAO,IAAI,KAAK,MAAhB,mBAAmB,IAAI,SAAQ;AAC/D;AAEA,SAAS,UAAU,UAAkC;AACnD,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM;AACX,cAAU,OAAO,QAAQ;AAAA,EAC3B;AACF;AAEA,MAAM,aAAa,MAAM;AAGlB,SAAS,eAAuB;AACrC,SAAOA,WAAAA,WAAWC,gBAAAA,qBAAqB,KAAK;AAC9C;AAOO,SAAS,oBAAoB,OAAe,KAAsB;AAChDC,kCAAqB,WAAW,YAAY,UAAU;AAE7E,QAAM,SAAS,cAAc,KAAK;AAClC,SAAO,WAAW,QAAQ,WAAW;AACvC;AAcO,SAAS,oBAA2C;AACzD,QAAM,QAAQ,aAAA;AACSA,kCAAqB,WAAW,YAAY,UAAU;AAE7E,QAAM,QAAQ,gBAAgB,KAAK;AACnC,SAAO,QAAQ,EAAE,MAAM,MAAM,MAAM,WAAW,MAAM,cAAc;AACpE;;;;;;;;;"}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const react = require("react");
4
- const ToolAppearanceContext = react.createContext(null);
3
+ const require$$0 = require("react");
4
+ const ToolAppearanceContext = require$$0.createContext(null);
5
5
  function useToolAppearance(explicit) {
6
- const fromContext = react.useContext(ToolAppearanceContext);
6
+ const fromContext = require$$0.useContext(ToolAppearanceContext);
7
7
  return explicit ?? (fromContext == null ? void 0 : fromContext.appearance) ?? "card";
8
8
  }
9
9
  exports.ToolAppearanceContext = ToolAppearanceContext;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-appearance.cjs","sources":["../../src/tools/tool-appearance.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Which anatomy a tool call renders with.\n *\n * - `card` — the boxed host card Olympus, the Chrome side panel and the Office\n * task pane render today (the default; its markup is snapshot-pinned).\n * - `thread` — the SDK thread's one-line row: status glyph, verb + target on\n * one line, a disclosure for arguments and result. Every tool call in the\n * thread uses it, dedicated tool UIs included, so a transcript reads as one\n * anatomy.\n *\n * The appearance is read from the nearest provider when a card is not given\n * one explicitly; with no provider the default stays `card`, so a host that\n * never mounts the provider renders exactly what it rendered before.\n */\nimport { createContext, useContext, type ComponentType } from \"react\";\nimport type { ToolCardProps } from \"./primitives\";\n\nexport type ToolAppearance = \"card\" | \"thread\";\n\nexport interface ToolAppearanceContextValue {\n appearance: ToolAppearance;\n /**\n * Renders a dedicated tool UI's `ToolCard` in this appearance. Set by the\n * thread provider (the renderer lives with `ToolFallback`, which this module\n * cannot import without a cycle); `undefined` keeps `ToolCard`'s own markup.\n */\n ToolCard?: ComponentType<ToolCardProps>;\n}\n\nexport const ToolAppearanceContext =\n createContext<ToolAppearanceContextValue | null>(null);\n\n/** The appearance in force: the explicit prop, else the provider's, else `card`. */\nexport function useToolAppearance(explicit?: ToolAppearance): ToolAppearance {\n const fromContext = useContext(ToolAppearanceContext);\n return explicit ?? fromContext?.appearance ?? \"card\";\n}\n"],"names":["createContext","useContext"],"mappings":";;;AA+BO,MAAM,wBACXA,MAAAA,cAAiD,IAAI;AAGhD,SAAS,kBAAkB,UAA2C;AAC3E,QAAM,cAAcC,MAAAA,WAAW,qBAAqB;AACpD,SAAO,aAAY,2CAAa,eAAc;AAChD;;;"}
1
+ {"version":3,"file":"tool-appearance.cjs","sources":["../../src/tools/tool-appearance.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Which anatomy a tool call renders with.\n *\n * - `card` — the boxed host card Olympus, the Chrome side panel and the Office\n * task pane render today (the default; its markup is snapshot-pinned).\n * - `thread` — the SDK thread's one-line row: status glyph, verb + target on\n * one line, a disclosure for arguments and result. Every tool call in the\n * thread uses it, dedicated tool UIs included, so a transcript reads as one\n * anatomy.\n *\n * The appearance is read from the nearest provider when a card is not given\n * one explicitly; with no provider the default stays `card`, so a host that\n * never mounts the provider renders exactly what it rendered before.\n */\nimport { createContext, useContext, type ComponentType } from \"react\";\nimport type { ToolCardProps } from \"./primitives\";\n\nexport type ToolAppearance = \"card\" | \"thread\";\n\nexport interface ToolAppearanceContextValue {\n appearance: ToolAppearance;\n /**\n * Renders a dedicated tool UI's `ToolCard` in this appearance. Set by the\n * thread provider (the renderer lives with `ToolFallback`, which this module\n * cannot import without a cycle); `undefined` keeps `ToolCard`'s own markup.\n */\n ToolCard?: ComponentType<ToolCardProps>;\n}\n\nexport const ToolAppearanceContext =\n createContext<ToolAppearanceContextValue | null>(null);\n\n/** The appearance in force: the explicit prop, else the provider's, else `card`. */\nexport function useToolAppearance(explicit?: ToolAppearance): ToolAppearance {\n const fromContext = useContext(ToolAppearanceContext);\n return explicit ?? fromContext?.appearance ?? \"card\";\n}\n"],"names":["createContext","useContext"],"mappings":";;;AA+BO,MAAM,wBACXA,WAAAA,cAAiD,IAAI;AAGhD,SAAS,kBAAkB,UAA2C;AAC3E,QAAM,cAAcC,WAAAA,WAAW,qBAAqB;AACpD,SAAO,aAAY,2CAAa,eAAc;AAChD;;;"}
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react = require("react");
4
+ const require$$0 = require("react");
5
5
  const lucideReact = require("lucide-react");
6
- const react$1 = require("@assistant-ui/react");
6
+ const react = require("@assistant-ui/react");
7
7
  const collapsible = require("../ui/collapsible.cjs");
8
8
  const assetPanelStore = require("../assets/asset-panel-store.cjs");
9
9
  const NestedPtcMessages = require("./NestedPtcMessages.cjs");
@@ -122,12 +122,12 @@ function ToolFallbackRoot({
122
122
  ...props
123
123
  }) {
124
124
  const appearance = toolAppearance.useToolAppearance(appearanceProp);
125
- const collapsibleRef = react.useRef(null);
126
- const [uncontrolledOpen, setUncontrolledOpen] = react.useState(defaultOpen);
127
- const lockScroll = react$1.useScrollLock(collapsibleRef, ANIMATION_DURATION);
125
+ const collapsibleRef = require$$0.useRef(null);
126
+ const [uncontrolledOpen, setUncontrolledOpen] = require$$0.useState(defaultOpen);
127
+ const lockScroll = react.useScrollLock(collapsibleRef, ANIMATION_DURATION);
128
128
  const isControlled = controlledOpen !== void 0;
129
129
  const isOpen = isControlled ? controlledOpen : uncontrolledOpen;
130
- const handleOpenChange = react.useCallback(
130
+ const handleOpenChange = require$$0.useCallback(
131
131
  (open) => {
132
132
  if (!open) {
133
133
  lockScroll();
@@ -191,16 +191,16 @@ function ToolFallbackTrigger({
191
191
  const ToolIcon = icon ?? toolIcons.toolIcon(meta.icon);
192
192
  const title = displayName ?? meta.displayName;
193
193
  const running = activeLabel ?? meta.activeLabel;
194
- const summary = react.useMemo(() => {
194
+ const summary = require$$0.useMemo(() => {
195
195
  if (isRunning && !isThread || !argsText) return null;
196
196
  const parsed = primitives.tryParseJson(argsText);
197
197
  return parsed ? toolMetadata.describeToolArgs({ toolName, args: parsed }) ?? null : null;
198
198
  }, [toolName, argsText, isRunning, isThread]);
199
- const message = react.useMemo(
199
+ const message = require$$0.useMemo(
200
200
  () => state === "complete" ? toolResult.resultMessage(result) : null,
201
201
  [result, state]
202
202
  );
203
- const callSummary = react.useMemo(() => {
203
+ const callSummary = require$$0.useMemo(() => {
204
204
  if (!isThread || displayName !== void 0 || activeLabel !== void 0) return null;
205
205
  const parsedArgs = args ?? (argsText ? primitives.tryParseJson(argsText) ?? void 0 : void 0);
206
206
  return toolSummary.summarizeToolCall({
@@ -425,7 +425,7 @@ function ToolFallbackResult({
425
425
  }) {
426
426
  const message = toolResult.resultMessage(result);
427
427
  const succeeded = (classification ?? toolResult.classifyToolResult({ status: { type: "complete" }, result })).state === "complete";
428
- const displayValue = react.useMemo(() => {
428
+ const displayValue = require$$0.useMemo(() => {
429
429
  if (result === void 0) return "";
430
430
  if (typeof result === "string") {
431
431
  const parsed = primitives.tryParseJson(result);
@@ -525,7 +525,7 @@ function AssetToolCard({
525
525
  className,
526
526
  rootProps
527
527
  }) {
528
- const [detailsOpen, setDetailsOpen] = react.useState(defaultOpen ?? false);
528
+ const [detailsOpen, setDetailsOpen] = require$$0.useState(defaultOpen ?? false);
529
529
  const openAsset = useOpenAsset(onOpenAsset);
530
530
  const meta = toolMetadata.getToolDisplayMeta(toolName);
531
531
  const ToolIcon = icon ?? toolIcons.toolIcon(meta.icon);
@@ -784,7 +784,7 @@ function ThreadToolCard({
784
784
  const isError = status === "incomplete";
785
785
  const partStatus = status === "running" ? { type: "running" } : status === "requires-action" ? { type: "requires-action", reason: "interrupt" } : status === "incomplete" ? { type: "incomplete", reason: "error", ...error ? { error } : {} } : { type: "complete" };
786
786
  const classification = toolResult.classifyToolResult({ status: partStatus, result: void 0, isError });
787
- const argsText = react.useMemo(() => args ? JSON.stringify(args) : void 0, [args]);
787
+ const argsText = require$$0.useMemo(() => args ? JSON.stringify(args) : void 0, [args]);
788
788
  const name = toolName ?? title;
789
789
  return /* @__PURE__ */ jsxRuntime.jsxs(
790
790
  ToolFallbackRoot,
@@ -836,7 +836,7 @@ function ToolFallbackAppearanceProvider({
836
836
  appearance,
837
837
  children
838
838
  }) {
839
- const value = react.useMemo(
839
+ const value = require$$0.useMemo(
840
840
  () => ({
841
841
  appearance,
842
842
  ToolCard: appearance === "thread" ? ThreadToolCard : void 0
@@ -845,7 +845,7 @@ function ToolFallbackAppearanceProvider({
845
845
  );
846
846
  return /* @__PURE__ */ jsxRuntime.jsx(toolAppearance.ToolAppearanceContext.Provider, { value, children });
847
847
  }
848
- const ToolFallback = react.memo(
848
+ const ToolFallback = require$$0.memo(
849
849
  ToolFallbackImpl
850
850
  );
851
851
  ToolFallback.displayName = "ToolFallback";