@athenaintel/react 0.43.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (746) hide show
  1. package/README.md +258 -8
  2. package/dist/agent-runtime/src/answer-label.cjs +137 -0
  3. package/dist/agent-runtime/src/answer-label.cjs.map +1 -0
  4. package/dist/agent-runtime/src/answer-label.d.ts +104 -0
  5. package/dist/agent-runtime/src/answer-label.js +137 -0
  6. package/dist/agent-runtime/src/answer-label.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-rows.cjs +180 -0
  8. package/dist/agent-runtime/src/answer-rows.cjs.map +1 -0
  9. package/dist/agent-runtime/src/answer-rows.d.ts +86 -0
  10. package/dist/agent-runtime/src/answer-rows.js +180 -0
  11. package/dist/agent-runtime/src/answer-rows.js.map +1 -0
  12. package/dist/agent-runtime/src/call-recap.cjs +319 -0
  13. package/dist/agent-runtime/src/call-recap.cjs.map +1 -0
  14. package/dist/agent-runtime/src/call-recap.d.ts +142 -0
  15. package/dist/agent-runtime/src/call-recap.js +319 -0
  16. package/dist/agent-runtime/src/call-recap.js.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-store.cjs +1 -0
  18. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -1
  19. package/dist/agent-runtime/src/chat-outbox-store.d.ts +7 -0
  20. package/dist/agent-runtime/src/chat-outbox-store.js +1 -0
  21. package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -1
  22. package/dist/agent-runtime/src/chat-outbox.cjs +46 -5
  23. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
  24. package/dist/agent-runtime/src/chat-outbox.d.ts +29 -0
  25. package/dist/agent-runtime/src/chat-outbox.js +46 -5
  26. package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
  27. package/dist/agent-runtime/src/client-tool-bridge.cjs +15 -15
  28. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  29. package/dist/agent-runtime/src/conversation-index.cjs +8 -8
  30. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -1
  31. package/dist/agent-runtime/src/conversation-index.d.ts +7 -0
  32. package/dist/agent-runtime/src/conversation-index.js.map +1 -1
  33. package/dist/agent-runtime/src/conversation-list.cjs +2 -1
  34. package/dist/agent-runtime/src/conversation-list.cjs.map +1 -1
  35. package/dist/agent-runtime/src/conversation-list.d.ts +19 -3
  36. package/dist/agent-runtime/src/conversation-list.js +2 -1
  37. package/dist/agent-runtime/src/conversation-list.js.map +1 -1
  38. package/dist/agent-runtime/src/decision-checks.cjs +207 -0
  39. package/dist/agent-runtime/src/decision-checks.cjs.map +1 -0
  40. package/dist/agent-runtime/src/decision-checks.d.ts +142 -0
  41. package/dist/agent-runtime/src/decision-checks.js +207 -0
  42. package/dist/agent-runtime/src/decision-checks.js.map +1 -0
  43. package/dist/agent-runtime/src/desktop-handoff.d.ts +12 -0
  44. package/dist/agent-runtime/src/errors.cjs +18 -0
  45. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  46. package/dist/agent-runtime/src/errors.d.ts +7 -0
  47. package/dist/agent-runtime/src/errors.js +18 -0
  48. package/dist/agent-runtime/src/errors.js.map +1 -1
  49. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +12 -0
  50. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  51. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +6 -6
  52. package/dist/agent-runtime/src/generated/runconfig-contract.js +12 -0
  53. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  54. package/dist/agent-runtime/src/handoff-arrival.cjs +60 -0
  55. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -0
  56. package/dist/agent-runtime/src/handoff-arrival.d.ts +46 -0
  57. package/dist/agent-runtime/src/handoff-arrival.js +60 -0
  58. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -0
  59. package/dist/agent-runtime/src/index.d.ts +16 -9
  60. package/dist/agent-runtime/src/interrupts.cjs +71 -19
  61. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  62. package/dist/agent-runtime/src/interrupts.d.ts +40 -3
  63. package/dist/agent-runtime/src/interrupts.js +56 -4
  64. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  65. package/dist/agent-runtime/src/lane-history.cjs +8 -8
  66. package/dist/agent-runtime/src/lane-history.cjs.map +1 -1
  67. package/dist/agent-runtime/src/messages.cjs +43 -8
  68. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  69. package/dist/agent-runtime/src/messages.d.ts +25 -3
  70. package/dist/agent-runtime/src/messages.js +43 -8
  71. package/dist/agent-runtime/src/messages.js.map +1 -1
  72. package/dist/agent-runtime/src/model-context.cjs +3 -2
  73. package/dist/agent-runtime/src/model-context.cjs.map +1 -1
  74. package/dist/agent-runtime/src/model-context.d.ts +6 -1
  75. package/dist/agent-runtime/src/model-context.js +3 -2
  76. package/dist/agent-runtime/src/model-context.js.map +1 -1
  77. package/dist/agent-runtime/src/offline-status.cjs +36 -0
  78. package/dist/agent-runtime/src/offline-status.cjs.map +1 -0
  79. package/dist/agent-runtime/src/offline-status.d.ts +118 -3
  80. package/dist/agent-runtime/src/offline-status.js +36 -0
  81. package/dist/agent-runtime/src/offline-status.js.map +1 -0
  82. package/dist/agent-runtime/src/queue.cjs +0 -9
  83. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  84. package/dist/agent-runtime/src/queue.js +0 -9
  85. package/dist/agent-runtime/src/queue.js.map +1 -1
  86. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +9 -9
  87. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  88. package/dist/agent-runtime/src/runtime-catalog.cjs +42 -0
  89. package/dist/agent-runtime/src/runtime-catalog.cjs.map +1 -0
  90. package/dist/agent-runtime/src/runtime-catalog.d.ts +35 -0
  91. package/dist/agent-runtime/src/runtime-catalog.js +42 -0
  92. package/dist/agent-runtime/src/runtime-catalog.js.map +1 -0
  93. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -1
  94. package/dist/agent-runtime/src/runtime-messages.d.ts +1 -1
  95. package/dist/agent-runtime/src/runtime-messages.js.map +1 -1
  96. package/dist/agent-runtime/src/runtime.d.ts +41 -0
  97. package/dist/agent-runtime/src/send-recovery.cjs +37 -3
  98. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  99. package/dist/agent-runtime/src/send-recovery.d.ts +19 -0
  100. package/dist/agent-runtime/src/send-recovery.js +37 -3
  101. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  102. package/dist/agent-runtime/src/statewire-suspended.cjs +3 -3
  103. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  104. package/dist/agent-runtime/src/subagents.cjs +32 -2
  105. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  106. package/dist/agent-runtime/src/subagents.d.ts +9 -0
  107. package/dist/agent-runtime/src/subagents.js +30 -0
  108. package/dist/agent-runtime/src/subagents.js.map +1 -1
  109. package/dist/agent-runtime/src/thread-driver.cjs +67 -0
  110. package/dist/agent-runtime/src/thread-driver.cjs.map +1 -0
  111. package/dist/agent-runtime/src/thread-driver.d.ts +49 -0
  112. package/dist/agent-runtime/src/thread-driver.js +67 -0
  113. package/dist/agent-runtime/src/thread-driver.js.map +1 -0
  114. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +172 -0
  115. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +868 -0
  116. package/dist/agent-runtime/src/thread-handoff-qr.d.ts +11 -0
  117. package/dist/agent-runtime/src/thread-handoff.d.ts +3 -364
  118. package/dist/agent-runtime/src/thread-status.cjs +3 -3
  119. package/dist/agent-runtime/src/thread-status.cjs.map +1 -1
  120. package/dist/agent-runtime/src/tool-metadata.cjs +210 -25
  121. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  122. package/dist/agent-runtime/src/tool-metadata.d.ts +12 -0
  123. package/dist/agent-runtime/src/tool-metadata.js +210 -25
  124. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  125. package/dist/agent-runtime/src/tool-names.cjs +2 -0
  126. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  127. package/dist/agent-runtime/src/tool-names.d.ts +2 -0
  128. package/dist/agent-runtime/src/tool-names.js +2 -0
  129. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  130. package/dist/agent-runtime/src/types.d.ts +10 -2
  131. package/dist/agent-runtime/src/use-conversation-list.cjs +14 -13
  132. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  133. package/dist/agent-runtime/src/use-conversation-list.d.ts +6 -0
  134. package/dist/agent-runtime/src/use-conversation-list.js +3 -2
  135. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  136. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +45 -20
  137. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  138. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +10 -3
  139. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +27 -2
  140. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  141. package/dist/agent-runtime/src/use-deep-agent-config.cjs +14 -14
  142. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  143. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +6 -6
  144. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  145. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +40 -22
  146. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  147. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +17 -0
  148. package/dist/agent-runtime/src/use-deep-agent-runtime.js +24 -6
  149. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  150. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +45 -45
  151. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  152. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +588 -130
  153. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  154. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +162 -10
  155. package/dist/agent-runtime/src/use-deep-agent-voice.js +529 -71
  156. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  157. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +26 -26
  158. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  159. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +4 -4
  160. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -1
  161. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +34 -26
  162. package/dist/agent-runtime/src/voice-earcon.cjs +139 -0
  163. package/dist/agent-runtime/src/voice-earcon.cjs.map +1 -0
  164. package/dist/agent-runtime/src/voice-earcon.d.ts +38 -0
  165. package/dist/agent-runtime/src/voice-earcon.js +139 -0
  166. package/dist/agent-runtime/src/voice-earcon.js.map +1 -0
  167. package/dist/agent-runtime/src/voice-media.cjs +117 -0
  168. package/dist/agent-runtime/src/voice-media.cjs.map +1 -0
  169. package/dist/agent-runtime/src/voice-media.d.ts +63 -0
  170. package/dist/agent-runtime/src/voice-media.js +117 -0
  171. package/dist/agent-runtime/src/voice-media.js.map +1 -0
  172. package/dist/agent-runtime/src/voice-presentation.cjs +2 -0
  173. package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -1
  174. package/dist/agent-runtime/src/voice-presentation.js +2 -0
  175. package/dist/agent-runtime/src/voice-presentation.js.map +1 -1
  176. package/dist/agent-runtime/src/voice-wire-types.d.ts +32 -0
  177. package/dist/assets/AssetPanel.cjs +11 -11
  178. package/dist/assets/AssetPanel.cjs.map +1 -1
  179. package/dist/assets/AthenaAssetEmbed.cjs +11 -9
  180. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  181. package/dist/assets/AthenaAssetEmbed.d.ts +18 -5
  182. package/dist/assets/AthenaAssetEmbed.js +4 -2
  183. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  184. package/dist/assets/AthenaLayout.cjs +16 -16
  185. package/dist/assets/AthenaLayout.cjs.map +1 -1
  186. package/dist/assets/use-asset-content.cjs +4 -4
  187. package/dist/assets/use-asset-content.cjs.map +1 -1
  188. package/dist/assets/use-asset-embed.cjs +14 -7
  189. package/dist/assets/use-asset-embed.cjs.map +1 -1
  190. package/dist/assets/use-asset-embed.d.ts +23 -6
  191. package/dist/assets/use-asset-embed.js +10 -3
  192. package/dist/assets/use-asset-embed.js.map +1 -1
  193. package/dist/auth/AthenaAuthContext.cjs +3 -3
  194. package/dist/auth/AthenaAuthContext.cjs.map +1 -1
  195. package/dist/auth/AthenaAuthProvider.cjs +8 -8
  196. package/dist/auth/AthenaAuthProvider.cjs.map +1 -1
  197. package/dist/auth/AthenaCredentialSourceContext.cjs +5 -5
  198. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  199. package/dist/auth/AthenaSSOProvider.cjs +14 -14
  200. package/dist/auth/AthenaSSOProvider.cjs.map +1 -1
  201. package/dist/auth/credential-source.cjs +26 -13
  202. package/dist/auth/credential-source.cjs.map +1 -1
  203. package/dist/auth/credential-source.d.ts +8 -0
  204. package/dist/auth/credential-source.js +26 -13
  205. package/dist/auth/credential-source.js.map +1 -1
  206. package/dist/catalog/agent-model-options.cjs +25 -17
  207. package/dist/catalog/agent-model-options.cjs.map +1 -1
  208. package/dist/catalog/agent-model-options.d.ts +38 -5
  209. package/dist/catalog/agent-model-options.js +25 -17
  210. package/dist/catalog/agent-model-options.js.map +1 -1
  211. package/dist/catalog/channel-refusal.cjs +36 -0
  212. package/dist/catalog/channel-refusal.cjs.map +1 -0
  213. package/dist/catalog/channel-refusal.d.ts +29 -0
  214. package/dist/catalog/channel-refusal.js +36 -0
  215. package/dist/catalog/channel-refusal.js.map +1 -0
  216. package/dist/catalog/chat-pickers.cjs +60 -24
  217. package/dist/catalog/chat-pickers.cjs.map +1 -1
  218. package/dist/catalog/chat-pickers.d.ts +12 -2
  219. package/dist/catalog/chat-pickers.js +56 -20
  220. package/dist/catalog/chat-pickers.js.map +1 -1
  221. package/dist/catalog/runtime-catalog.cjs +89 -23
  222. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  223. package/dist/catalog/runtime-catalog.d.ts +8 -2
  224. package/dist/catalog/runtime-catalog.js +83 -17
  225. package/dist/catalog/runtime-catalog.js.map +1 -1
  226. package/dist/catalog/use-athena-chat-mode.cjs +12 -12
  227. package/dist/catalog/use-athena-chat-mode.cjs.map +1 -1
  228. package/dist/chat/AthenaChat.cjs +155 -67
  229. package/dist/chat/AthenaChat.cjs.map +1 -1
  230. package/dist/chat/AthenaChat.d.ts +42 -2
  231. package/dist/chat/AthenaChat.js +106 -18
  232. package/dist/chat/AthenaChat.js.map +1 -1
  233. package/dist/chat/AthenaChatErrorBoundary.cjs +3 -3
  234. package/dist/chat/AthenaChatErrorBoundary.cjs.map +1 -1
  235. package/dist/chat/DrivingOnChip.cjs +23 -0
  236. package/dist/chat/DrivingOnChip.cjs.map +1 -0
  237. package/dist/chat/DrivingOnChip.d.ts +17 -0
  238. package/dist/chat/DrivingOnChip.js +23 -0
  239. package/dist/chat/DrivingOnChip.js.map +1 -0
  240. package/dist/chat/StatewireApprovalCard.cjs +166 -37
  241. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  242. package/dist/chat/StatewireApprovalCard.d.ts +91 -2
  243. package/dist/chat/StatewireApprovalCard.js +156 -27
  244. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  245. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  246. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  247. package/dist/chat/StatewireQueuedMessages.cjs +81 -69
  248. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.d.ts +25 -13
  250. package/dist/chat/StatewireQueuedMessages.js +73 -61
  251. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  252. package/dist/chat/WaitingOnYouBanner.cjs +9 -5
  253. package/dist/chat/WaitingOnYouBanner.cjs.map +1 -1
  254. package/dist/chat/WaitingOnYouBanner.js +7 -3
  255. package/dist/chat/WaitingOnYouBanner.js.map +1 -1
  256. package/dist/chat/athena-chat-welcome.cjs +2 -2
  257. package/dist/chat/athena-chat-welcome.cjs.map +1 -1
  258. package/dist/chat/athena-citation-links.cjs +5 -5
  259. package/dist/chat/athena-citation-links.cjs.map +1 -1
  260. package/dist/chat/athena-composer-controls.cjs +26 -16
  261. package/dist/chat/athena-composer-controls.cjs.map +1 -1
  262. package/dist/chat/athena-composer-controls.d.ts +6 -0
  263. package/dist/chat/athena-composer-controls.js +26 -16
  264. package/dist/chat/athena-composer-controls.js.map +1 -1
  265. package/dist/chat/athena-turn-end-status.cjs +42 -0
  266. package/dist/chat/athena-turn-end-status.cjs.map +1 -0
  267. package/dist/chat/athena-turn-end-status.d.ts +24 -0
  268. package/dist/chat/athena-turn-end-status.js +42 -0
  269. package/dist/chat/athena-turn-end-status.js.map +1 -0
  270. package/dist/chat/browser-decision-check.cjs +131 -0
  271. package/dist/chat/browser-decision-check.cjs.map +1 -0
  272. package/dist/chat/browser-decision-check.d.ts +61 -0
  273. package/dist/chat/browser-decision-check.js +131 -0
  274. package/dist/chat/browser-decision-check.js.map +1 -0
  275. package/dist/chat/chat-outbox-rows.cjs +3 -3
  276. package/dist/chat/chat-outbox-rows.cjs.map +1 -1
  277. package/dist/chat/chat-voice-controls.cjs +96 -29
  278. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  279. package/dist/chat/chat-voice-controls.d.ts +42 -3
  280. package/dist/chat/chat-voice-controls.js +92 -25
  281. package/dist/chat/chat-voice-controls.js.map +1 -1
  282. package/dist/chat/composer-keyboard-hint.cjs +5 -5
  283. package/dist/chat/composer-keyboard-hint.cjs.map +1 -1
  284. package/dist/chat/device-operation.cjs +29 -0
  285. package/dist/chat/device-operation.cjs.map +1 -0
  286. package/dist/chat/device-operation.d.ts +34 -0
  287. package/dist/chat/device-operation.js +29 -0
  288. package/dist/chat/device-operation.js.map +1 -0
  289. package/dist/chat/super-grouping/CollapsibleGroup.cjs +14 -14
  290. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  291. package/dist/chat/super-grouping/GroupedMessageParts.cjs +4 -4
  292. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -1
  293. package/dist/chat/super-grouping/SuperGroupingCard.cjs +52 -36
  294. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  295. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +19 -4
  296. package/dist/chat/super-grouping/SuperGroupingCard.js +29 -13
  297. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  298. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +32 -32
  299. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  300. package/dist/chat/super-grouping/SuperGroupingTranscript.js +3 -3
  301. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  302. package/dist/chat/super-grouping/ToolTimeline.cjs +73 -40
  303. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  304. package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -2
  305. package/dist/chat/super-grouping/ToolTimeline.js +69 -36
  306. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  307. package/dist/chat/super-grouping/activity-timeline.cjs +47 -12
  308. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  309. package/dist/chat/super-grouping/activity-timeline.d.ts +21 -0
  310. package/dist/chat/super-grouping/activity-timeline.js +47 -12
  311. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  312. package/dist/chat/super-grouping/grouping-function.cjs +4 -0
  313. package/dist/chat/super-grouping/grouping-function.cjs.map +1 -1
  314. package/dist/chat/super-grouping/grouping-function.d.ts +7 -0
  315. package/dist/chat/super-grouping/grouping-function.js +5 -1
  316. package/dist/chat/super-grouping/grouping-function.js.map +1 -1
  317. package/dist/chat/super-grouping/index.cjs +6 -0
  318. package/dist/chat/super-grouping/index.cjs.map +1 -1
  319. package/dist/chat/super-grouping/index.d.ts +5 -2
  320. package/dist/chat/super-grouping/index.js +7 -1
  321. package/dist/chat/super-grouping/index.js.map +1 -1
  322. package/dist/chat/super-grouping/tool-part-placement.cjs +17 -0
  323. package/dist/chat/super-grouping/tool-part-placement.cjs.map +1 -0
  324. package/dist/chat/super-grouping/tool-part-placement.d.ts +22 -0
  325. package/dist/chat/super-grouping/tool-part-placement.js +17 -0
  326. package/dist/chat/super-grouping/tool-part-placement.js.map +1 -0
  327. package/dist/chat/thread-scroll-to-bottom.cjs +2 -2
  328. package/dist/chat/thread-scroll-to-bottom.cjs.map +1 -1
  329. package/dist/chat/thread-scroll-to-bottom.d.ts +10 -7
  330. package/dist/chat/thread-scroll-to-bottom.js +2 -2
  331. package/dist/chat/thread-scroll-to-bottom.js.map +1 -1
  332. package/dist/chat/tooltip-icon-button.cjs +2 -2
  333. package/dist/chat/tooltip-icon-button.cjs.map +1 -1
  334. package/dist/chat/use-athena-voice-live.cjs +11 -0
  335. package/dist/chat/use-athena-voice-live.cjs.map +1 -0
  336. package/dist/chat/use-athena-voice-live.d.ts +11 -0
  337. package/dist/chat/use-athena-voice-live.js +11 -0
  338. package/dist/chat/use-athena-voice-live.js.map +1 -0
  339. package/dist/chat/use-statewire-approval-request.cjs +56 -24
  340. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  341. package/dist/chat/use-statewire-approval-request.d.ts +33 -4
  342. package/dist/chat/use-statewire-approval-request.js +41 -9
  343. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  344. package/dist/chat-ui/auth/sign-in-card.cjs +2 -2
  345. package/dist/chat-ui/auth/sign-in-card.cjs.map +1 -1
  346. package/dist/chat-ui/composer/tiptap-composer.cjs +138 -107
  347. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  348. package/dist/chat-ui/composer/tiptap-composer.d.ts +20 -4
  349. package/dist/chat-ui/composer/tiptap-composer.js +85 -54
  350. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  351. package/dist/chat-ui/header/conversation-history-panel.cjs +49 -23
  352. package/dist/chat-ui/header/conversation-history-panel.cjs.map +1 -1
  353. package/dist/chat-ui/header/conversation-history-panel.d.ts +12 -1
  354. package/dist/chat-ui/header/conversation-history-panel.js +38 -12
  355. package/dist/chat-ui/header/conversation-history-panel.js.map +1 -1
  356. package/dist/chat-ui/index.cjs +21 -0
  357. package/dist/chat-ui/index.cjs.map +1 -1
  358. package/dist/chat-ui/index.d.ts +8 -1
  359. package/dist/chat-ui/index.js +21 -0
  360. package/dist/chat-ui/index.js.map +1 -1
  361. package/dist/chat-ui/mentions/mention-chip.cjs +4 -4
  362. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  363. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs +10 -9
  364. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.cjs.map +1 -1
  365. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js +3 -2
  366. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-list.js.map +1 -1
  367. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +2 -2
  368. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  369. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs +29 -6
  370. package/dist/chat-ui/mentions/suggestions/components/menu-list.cjs.map +1 -1
  371. package/dist/chat-ui/mentions/suggestions/components/menu-list.d.ts +7 -1
  372. package/dist/chat-ui/mentions/suggestions/components/menu-list.js +25 -2
  373. package/dist/chat-ui/mentions/suggestions/components/menu-list.js.map +1 -1
  374. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs +2 -2
  375. package/dist/chat-ui/mentions/suggestions/components/use-keyboard-navigation.cjs.map +1 -1
  376. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs +2 -2
  377. package/dist/chat-ui/mentions/suggestions/components/use-menu-navigation.cjs.map +1 -1
  378. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +3 -3
  379. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  380. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs +56 -2
  381. package/dist/chat-ui/mentions/suggestions/data/orchestrator.cjs.map +1 -1
  382. package/dist/chat-ui/mentions/suggestions/data/orchestrator.d.ts +12 -0
  383. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js +56 -2
  384. package/dist/chat-ui/mentions/suggestions/data/orchestrator.js.map +1 -1
  385. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +24 -3
  386. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  387. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +7 -0
  388. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +24 -3
  389. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +35 -13
  391. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +15 -1
  393. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +28 -6
  394. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  395. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs +9 -6
  396. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.cjs.map +1 -1
  397. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.d.ts +3 -0
  398. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js +5 -2
  399. package/dist/chat-ui/mentions/suggestions/data/use-menu-items.js.map +1 -1
  400. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +45 -10
  401. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  402. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +24 -1
  403. package/dist/chat-ui/mentions/use-account-workspace-id.js +46 -11
  404. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  405. package/dist/chat-ui/mentions/use-member-avatar.cjs +4 -4
  406. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -1
  407. package/dist/chat-ui/mentions/use-mention-asset.cjs +3 -3
  408. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
  409. package/dist/chat-ui/messages/answer-label.cjs +42 -0
  410. package/dist/chat-ui/messages/answer-label.cjs.map +1 -0
  411. package/dist/chat-ui/messages/answer-label.d.ts +33 -0
  412. package/dist/chat-ui/messages/answer-label.js +42 -0
  413. package/dist/chat-ui/messages/answer-label.js.map +1 -0
  414. package/dist/chat-ui/messages/arrival-animation.cjs +13 -0
  415. package/dist/chat-ui/messages/arrival-animation.cjs.map +1 -0
  416. package/dist/chat-ui/messages/arrival-animation.d.ts +14 -0
  417. package/dist/chat-ui/messages/arrival-animation.js +13 -0
  418. package/dist/chat-ui/messages/arrival-animation.js.map +1 -0
  419. package/dist/chat-ui/messages/continue-pill.cjs +5 -5
  420. package/dist/chat-ui/messages/continue-pill.cjs.map +1 -1
  421. package/dist/chat-ui/messages/from-the-call-card.cjs +124 -0
  422. package/dist/chat-ui/messages/from-the-call-card.cjs.map +1 -0
  423. package/dist/chat-ui/messages/from-the-call-card.d.ts +17 -0
  424. package/dist/chat-ui/messages/from-the-call-card.js +124 -0
  425. package/dist/chat-ui/messages/from-the-call-card.js.map +1 -0
  426. package/dist/chat-ui/messages/handoff-arrival-divider.cjs +44 -0
  427. package/dist/chat-ui/messages/handoff-arrival-divider.cjs.map +1 -0
  428. package/dist/chat-ui/messages/handoff-arrival-divider.d.ts +17 -0
  429. package/dist/chat-ui/messages/handoff-arrival-divider.js +44 -0
  430. package/dist/chat-ui/messages/handoff-arrival-divider.js.map +1 -0
  431. package/dist/chat-ui/messages/message-actions-config.cjs +3 -3
  432. package/dist/chat-ui/messages/message-actions-config.cjs.map +1 -1
  433. package/dist/chat-ui/messages/message-components.cjs +8 -4
  434. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  435. package/dist/chat-ui/messages/message-components.js +5 -1
  436. package/dist/chat-ui/messages/message-components.js.map +1 -1
  437. package/dist/chat-ui/messages/message-images.cjs +66 -0
  438. package/dist/chat-ui/messages/message-images.cjs.map +1 -0
  439. package/dist/chat-ui/messages/message-images.d.ts +16 -0
  440. package/dist/chat-ui/messages/message-images.js +66 -0
  441. package/dist/chat-ui/messages/message-images.js.map +1 -0
  442. package/dist/chat-ui/messages/user-edit-composer.cjs +2 -2
  443. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  444. package/dist/chat-ui/messages/wake-marker.cjs +3 -3
  445. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  446. package/dist/chat-ui/rich-text/chat-link.cjs +3 -2
  447. package/dist/chat-ui/rich-text/chat-link.cjs.map +1 -1
  448. package/dist/chat-ui/rich-text/chat-link.d.ts +4 -0
  449. package/dist/chat-ui/rich-text/chat-link.js +4 -3
  450. package/dist/chat-ui/rich-text/chat-link.js.map +1 -1
  451. package/dist/chat-ui/rich-text/chat-message-body.cjs +9 -8
  452. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  453. package/dist/chat-ui/rich-text/chat-message-body.d.ts +12 -0
  454. package/dist/chat-ui/rich-text/chat-message-body.js +2 -1
  455. package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
  456. package/dist/chat-ui/rich-text/chat-node-views.cjs +6 -6
  457. package/dist/chat-ui/rich-text/chat-node-views.cjs.map +1 -1
  458. package/dist/chat-ui/rich-text/dom-output-spec.cjs +2 -2
  459. package/dist/chat-ui/rich-text/dom-output-spec.cjs.map +1 -1
  460. package/dist/chat-ui/statewire.cjs +3 -0
  461. package/dist/chat-ui/statewire.cjs.map +1 -1
  462. package/dist/chat-ui/statewire.d.ts +2 -1
  463. package/dist/chat-ui/statewire.js +3 -0
  464. package/dist/chat-ui/statewire.js.map +1 -1
  465. package/dist/chat-ui/thread/chat-thread-shell.cjs +45 -14
  466. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  467. package/dist/chat-ui/thread/chat-thread-shell.d.ts +16 -2
  468. package/dist/chat-ui/thread/chat-thread-shell.js +37 -6
  469. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  470. package/dist/chat-ui/thread/composer-send-or-stop.cjs +30 -20
  471. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  472. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +8 -0
  473. package/dist/chat-ui/thread/composer-send-or-stop.js +29 -19
  474. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  475. package/dist/chat-ui/thread/statewire-history-edge.cjs +20 -21
  476. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  477. package/dist/chat-ui/thread/statewire-history-edge.js +3 -4
  478. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  479. package/dist/chat-ui/thread/thread-loading-overlay.cjs +5 -5
  480. package/dist/chat-ui/thread/thread-loading-overlay.cjs.map +1 -1
  481. package/dist/collab/client.cjs +52 -3
  482. package/dist/collab/client.cjs.map +1 -1
  483. package/dist/collab/client.d.ts +27 -0
  484. package/dist/collab/client.js +52 -3
  485. package/dist/collab/client.js.map +1 -1
  486. package/dist/collab/document-status.cjs +150 -0
  487. package/dist/collab/document-status.cjs.map +1 -0
  488. package/dist/collab/document-status.d.ts +68 -0
  489. package/dist/collab/document-status.js +150 -0
  490. package/dist/collab/document-status.js.map +1 -0
  491. package/dist/collab/index.cjs +7 -0
  492. package/dist/collab/index.cjs.map +1 -1
  493. package/dist/collab/index.d.ts +6 -1
  494. package/dist/collab/index.js +7 -0
  495. package/dist/collab/index.js.map +1 -1
  496. package/dist/collab/presence-react.cjs +11 -11
  497. package/dist/collab/presence-react.cjs.map +1 -1
  498. package/dist/collab/react.cjs +6 -6
  499. package/dist/collab/react.cjs.map +1 -1
  500. package/dist/composer/AttachmentContext.cjs +24 -11
  501. package/dist/composer/AttachmentContext.cjs.map +1 -1
  502. package/dist/composer/AttachmentContext.js +18 -5
  503. package/dist/composer/AttachmentContext.js.map +1 -1
  504. package/dist/composer/ComposerAttachmentPreview.cjs +78 -23
  505. package/dist/composer/ComposerAttachmentPreview.cjs.map +1 -1
  506. package/dist/composer/ComposerAttachmentPreview.d.ts +5 -3
  507. package/dist/composer/ComposerAttachmentPreview.js +79 -24
  508. package/dist/composer/ComposerAttachmentPreview.js.map +1 -1
  509. package/dist/composer/ComposerDropZone.cjs +7 -7
  510. package/dist/composer/ComposerDropZone.cjs.map +1 -1
  511. package/dist/composer/FileUploadButton.cjs +37 -22
  512. package/dist/composer/FileUploadButton.cjs.map +1 -1
  513. package/dist/composer/FileUploadButton.d.ts +6 -0
  514. package/dist/composer/FileUploadButton.js +34 -19
  515. package/dist/composer/FileUploadButton.js.map +1 -1
  516. package/dist/composer/QuoteContext.cjs +8 -8
  517. package/dist/composer/QuoteContext.cjs.map +1 -1
  518. package/dist/composer/composer-handoff.cjs +4 -4
  519. package/dist/composer/composer-handoff.cjs.map +1 -1
  520. package/dist/composer/index.d.ts +1 -1
  521. package/dist/composer/useAppendToComposer.cjs +4 -4
  522. package/dist/composer/useAppendToComposer.cjs.map +1 -1
  523. package/dist/composer/useAttachFiles.cjs +23 -6
  524. package/dist/composer/useAttachFiles.cjs.map +1 -1
  525. package/dist/composer/useAttachFiles.d.ts +15 -7
  526. package/dist/composer/useAttachFiles.js +22 -5
  527. package/dist/composer/useAttachFiles.js.map +1 -1
  528. package/dist/composer/useComposerAttachment.cjs +4 -4
  529. package/dist/composer/useComposerAttachment.cjs.map +1 -1
  530. package/dist/composer/useFileUpload.cjs +21 -16
  531. package/dist/composer/useFileUpload.cjs.map +1 -1
  532. package/dist/composer/useFileUpload.d.ts +12 -0
  533. package/dist/composer/useFileUpload.js +12 -7
  534. package/dist/composer/useFileUpload.js.map +1 -1
  535. package/dist/composer/useReadComposerDraft.cjs +27 -8
  536. package/dist/composer/useReadComposerDraft.cjs.map +1 -1
  537. package/dist/composer/useReadComposerDraft.d.ts +23 -1
  538. package/dist/composer/useReadComposerDraft.js +27 -8
  539. package/dist/composer/useReadComposerDraft.js.map +1 -1
  540. package/dist/composer/useSendMessage.cjs +4 -4
  541. package/dist/composer/useSendMessage.cjs.map +1 -1
  542. package/dist/diagnostics/useAthenaDiagnostics.cjs +4 -4
  543. package/dist/diagnostics/useAthenaDiagnostics.cjs.map +1 -1
  544. package/dist/dictation/audio-level-history.cjs +3 -3
  545. package/dist/dictation/audio-level-history.cjs.map +1 -1
  546. package/dist/dictation/dictation-controls.cjs +24 -20
  547. package/dist/dictation/dictation-controls.cjs.map +1 -1
  548. package/dist/dictation/dictation-controls.d.ts +6 -1
  549. package/dist/dictation/dictation-controls.js +24 -20
  550. package/dist/dictation/dictation-controls.js.map +1 -1
  551. package/dist/dictation/use-athena-dictation-engine.cjs +3 -3
  552. package/dist/dictation/use-athena-dictation-engine.cjs.map +1 -1
  553. package/dist/dictation/use-dictation.cjs +22 -22
  554. package/dist/dictation/use-dictation.cjs.map +1 -1
  555. package/dist/index.cjs +29 -2
  556. package/dist/index.cjs.map +1 -1
  557. package/dist/index.d.ts +18 -4
  558. package/dist/index.js +30 -3
  559. package/dist/index.js.map +1 -1
  560. package/dist/keryx-http/src/receive-only-socket.cjs +40 -0
  561. package/dist/keryx-http/src/receive-only-socket.cjs.map +1 -0
  562. package/dist/keryx-http/src/receive-only-socket.d.ts +27 -0
  563. package/dist/keryx-http/src/receive-only-socket.js +40 -0
  564. package/dist/keryx-http/src/receive-only-socket.js.map +1 -0
  565. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs +190 -0
  566. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs.map +1 -0
  567. package/dist/keryx-http/src/unconfirmed-update-attributions.d.ts +132 -0
  568. package/dist/keryx-http/src/unconfirmed-update-attributions.js +190 -0
  569. package/dist/keryx-http/src/unconfirmed-update-attributions.js.map +1 -0
  570. package/dist/keryx-http/src/update-attributions.cjs +141 -0
  571. package/dist/keryx-http/src/update-attributions.cjs.map +1 -0
  572. package/dist/keryx-http/src/update-attributions.d.ts +107 -0
  573. package/dist/keryx-http/src/update-attributions.js +141 -0
  574. package/dist/keryx-http/src/update-attributions.js.map +1 -0
  575. package/dist/lib/owner-document.cjs +6 -6
  576. package/dist/lib/owner-document.cjs.map +1 -1
  577. package/dist/lib/use-athena-rest-query.cjs +4 -4
  578. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  579. package/dist/lib/use-document-active.cjs +4 -4
  580. package/dist/lib/use-document-active.cjs.map +1 -1
  581. package/dist/lib/use-prefers-reduced-motion.cjs +2 -2
  582. package/dist/lib/use-prefers-reduced-motion.cjs.map +1 -1
  583. package/dist/offline/offline-history.cjs +7 -7
  584. package/dist/offline/offline-history.cjs.map +1 -1
  585. package/dist/provider/AthenaContext.cjs +3 -3
  586. package/dist/provider/AthenaContext.cjs.map +1 -1
  587. package/dist/provider/AthenaProvider.cjs +120 -79
  588. package/dist/provider/AthenaProvider.cjs.map +1 -1
  589. package/dist/provider/AthenaProvider.d.ts +11 -1
  590. package/dist/provider/AthenaProvider.js +44 -3
  591. package/dist/provider/AthenaProvider.js.map +1 -1
  592. package/dist/provider/PostHogProvider.cjs +2 -2
  593. package/dist/provider/PostHogProvider.cjs.map +1 -1
  594. package/dist/provider/agent-selection-context.cjs +2 -2
  595. package/dist/provider/agent-selection-context.cjs.map +1 -1
  596. package/dist/provider/chat-mode-context.cjs +2 -2
  597. package/dist/provider/chat-mode-context.cjs.map +1 -1
  598. package/dist/provider/session-persistence-context.cjs +10 -0
  599. package/dist/provider/session-persistence-context.cjs.map +1 -0
  600. package/dist/provider/session-persistence-context.d.ts +15 -0
  601. package/dist/provider/session-persistence-context.js +10 -0
  602. package/dist/provider/session-persistence-context.js.map +1 -0
  603. package/dist/provider/statewire-history-context.cjs +4 -4
  604. package/dist/provider/statewire-history-context.cjs.map +1 -1
  605. package/dist/provider/statewire-lifecycle-context.cjs +3 -3
  606. package/dist/provider/statewire-lifecycle-context.cjs.map +1 -1
  607. package/dist/provider/statewire-window-context.cjs +3 -3
  608. package/dist/provider/statewire-window-context.cjs.map +1 -1
  609. package/dist/provider/theme-style-context.cjs +3 -3
  610. package/dist/provider/theme-style-context.cjs.map +1 -1
  611. package/dist/react/package.json.cjs +1 -1
  612. package/dist/react/package.json.js +1 -1
  613. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +10 -10
  614. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  615. package/dist/runtime/auth-refusal-restart.cjs +7 -7
  616. package/dist/runtime/auth-refusal-restart.cjs.map +1 -1
  617. package/dist/runtime/auth.cjs +13 -13
  618. package/dist/runtime/auth.cjs.map +1 -1
  619. package/dist/runtime/statewire-lifecycle.cjs +1 -0
  620. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  621. package/dist/runtime/statewire-lifecycle.d.ts +3 -1
  622. package/dist/runtime/statewire-lifecycle.js +2 -1
  623. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  624. package/dist/runtime/statewire-server-lane-context.cjs +2 -2
  625. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -1
  626. package/dist/runtime/statewire-session-lane.cjs +4 -4
  627. package/dist/runtime/statewire-session-lane.cjs.map +1 -1
  628. package/dist/runtime/useAthenaStatewireRuntime.cjs +10 -8
  629. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  630. package/dist/runtime/useAthenaStatewireRuntime.d.ts +2 -0
  631. package/dist/runtime/useAthenaStatewireRuntime.js +2 -0
  632. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  633. package/dist/styles.css +1 -1
  634. package/dist/threads/Inbox.cjs +8 -8
  635. package/dist/threads/Inbox.cjs.map +1 -1
  636. package/dist/threads/SessionList.cjs +9 -9
  637. package/dist/threads/SessionList.cjs.map +1 -1
  638. package/dist/threads/SessionsPage.cjs +11 -11
  639. package/dist/threads/SessionsPage.cjs.map +1 -1
  640. package/dist/threads/api.cjs.map +1 -1
  641. package/dist/threads/api.d.ts +15 -0
  642. package/dist/threads/api.js.map +1 -1
  643. package/dist/threads/conversation-list-fetcher.cjs +13 -5
  644. package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
  645. package/dist/threads/conversation-list-fetcher.d.ts +4 -1
  646. package/dist/threads/conversation-list-fetcher.js +13 -5
  647. package/dist/threads/conversation-list-fetcher.js.map +1 -1
  648. package/dist/threads/index-triggered-refresh.cjs +10 -10
  649. package/dist/threads/index-triggered-refresh.cjs.map +1 -1
  650. package/dist/threads/mark-viewed-thread-read.cjs +12 -12
  651. package/dist/threads/mark-viewed-thread-read.cjs.map +1 -1
  652. package/dist/threads/offline-session-list.cjs +3 -3
  653. package/dist/threads/offline-session-list.cjs.map +1 -1
  654. package/dist/threads/session-list-tab-share.cjs +5 -5
  655. package/dist/threads/session-list-tab-share.cjs.map +1 -1
  656. package/dist/threads/statewire-thread-list.cjs +79 -57
  657. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  658. package/dist/threads/statewire-thread-list.d.ts +20 -8
  659. package/dist/threads/statewire-thread-list.js +28 -6
  660. package/dist/threads/statewire-thread-list.js.map +1 -1
  661. package/dist/threads/thread-id-context.cjs +5 -5
  662. package/dist/threads/thread-id-context.cjs.map +1 -1
  663. package/dist/threads/use-athena-session-attention.cjs +2 -2
  664. package/dist/threads/use-athena-session-attention.cjs.map +1 -1
  665. package/dist/threads/use-athena-sessions.cjs +37 -15
  666. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  667. package/dist/threads/use-athena-sessions.d.ts +10 -5
  668. package/dist/threads/use-athena-sessions.js +28 -6
  669. package/dist/threads/use-athena-sessions.js.map +1 -1
  670. package/dist/threads/use-athena-thread-model.cjs +3 -3
  671. package/dist/threads/use-athena-thread-model.cjs.map +1 -1
  672. package/dist/threads/use-rest-conversation-history.cjs +3 -3
  673. package/dist/threads/use-rest-conversation-history.cjs.map +1 -1
  674. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  675. package/dist/threads/use-statewire-conversation-history.cjs +8 -8
  676. package/dist/threads/use-statewire-conversation-history.cjs.map +1 -1
  677. package/dist/threads/use-thread-archive.cjs +9 -9
  678. package/dist/threads/use-thread-archive.cjs.map +1 -1
  679. package/dist/threads/use-thread-favorite.cjs +2 -2
  680. package/dist/threads/use-thread-favorite.cjs.map +1 -1
  681. package/dist/threads/use-thread-field-override.cjs +20 -20
  682. package/dist/threads/use-thread-field-override.cjs.map +1 -1
  683. package/dist/threads/use-thread-read-state.cjs +4 -4
  684. package/dist/threads/use-thread-read-state.cjs.map +1 -1
  685. package/dist/threads/use-thread-rename.cjs +2 -2
  686. package/dist/threads/use-thread-rename.cjs.map +1 -1
  687. package/dist/threads/useAthenaThreadManager.cjs +2 -2
  688. package/dist/threads/useAthenaThreadManager.cjs.map +1 -1
  689. package/dist/tools/NestedPtcMessages.cjs +6 -6
  690. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  691. package/dist/tools/append-document-tool-ui.cjs +7 -7
  692. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  693. package/dist/tools/file-tool-uis.cjs +2 -2
  694. package/dist/tools/file-tool-uis.cjs.map +1 -1
  695. package/dist/tools/misc-tool-uis.cjs +2 -2
  696. package/dist/tools/misc-tool-uis.cjs.map +1 -1
  697. package/dist/tools/primitives.cjs +6 -6
  698. package/dist/tools/primitives.cjs.map +1 -1
  699. package/dist/tools/read-asset-tool-ui.cjs +6 -6
  700. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  701. package/dist/tools/subagent-task-tool-ui.cjs +21 -21
  702. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  703. package/dist/tools/test-recording-tool-uis.cjs +16 -16
  704. package/dist/tools/test-recording-tool-uis.cjs.map +1 -1
  705. package/dist/tools/todo-plan-store.cjs +4 -4
  706. package/dist/tools/todo-plan-store.cjs.map +1 -1
  707. package/dist/tools/tool-appearance.cjs +3 -3
  708. package/dist/tools/tool-appearance.cjs.map +1 -1
  709. package/dist/tools/tool-fallback.cjs +14 -14
  710. package/dist/tools/tool-fallback.cjs.map +1 -1
  711. package/dist/tools/tool-uis.cjs +74 -74
  712. package/dist/tools/tool-uis.cjs.map +1 -1
  713. package/dist/tools/use-elapsed-seconds.cjs +3 -3
  714. package/dist/tools/use-elapsed-seconds.cjs.map +1 -1
  715. package/dist/tools/write-todos-tool-ui.cjs +9 -9
  716. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  717. package/dist/ui/image-viewer.cjs +382 -0
  718. package/dist/ui/image-viewer.cjs.map +1 -0
  719. package/dist/ui/image-viewer.d.ts +50 -0
  720. package/dist/ui/image-viewer.js +382 -0
  721. package/dist/ui/image-viewer.js.map +1 -0
  722. package/dist/voice/chat.cjs +6 -0
  723. package/dist/voice/chat.cjs.map +1 -1
  724. package/dist/voice/chat.d.ts +1 -1
  725. package/dist/voice/chat.js +8 -2
  726. package/dist/voice/livekit-join.cjs +52 -101
  727. package/dist/voice/livekit-join.cjs.map +1 -1
  728. package/dist/voice/livekit-join.d.ts +1 -6
  729. package/dist/voice/livekit-join.js +52 -101
  730. package/dist/voice/livekit-join.js.map +1 -1
  731. package/dist/voice/livekit.cjs.map +1 -1
  732. package/dist/voice/livekit.d.ts +11 -1
  733. package/dist/voice/livekit.js.map +1 -1
  734. package/dist/voice/use-athena-voice-session.cjs +34 -34
  735. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  736. package/dist/workbench/ComputerLiveDesktop.cjs +13 -13
  737. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -1
  738. package/dist/workbench/SessionWorkbench.cjs +22 -22
  739. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  740. package/dist/workbench/session-workbench-context.cjs +3 -3
  741. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  742. package/dist/workbench/session-workbench-panes.cjs +8 -8
  743. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  744. package/dist/workbench/workbench-layout-context.cjs +3 -3
  745. package/dist/workbench/workbench-layout-context.cjs.map +1 -1
  746. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use-thread-favorite.cjs","sources":["../../src/threads/use-thread-favorite.ts"],"sourcesContent":["/**\n * The pin toggle behind `SessionList` and the conversation-history hooks:\n * `useThreadFieldOverride` over `POST /api/conversations/threads/favorite`\n * (see that module for the optimistic-override, rollback, serialization and\n * identity-scoping contract). A 404 / 405 marks the toggle unavailable — the\n * backend predates the route — so the UI falls back to the read-only pin\n * instead of failing on every click.\n */\nimport { useCallback } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { isThreadFavoriteUnavailableError, setThreadFavorite } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport {\n resetThreadFieldUnavailableWarnings,\n type ThreadFieldTarget,\n useThreadFieldOverride,\n} from './use-thread-field-override';\n\nexport interface ThreadFavoriteTarget {\n threadId: string;\n isFavorited: boolean;\n}\n\n/** The two fields the override layer reads and writes on a list row. */\nexport interface FavoriteRow {\n threadId: string;\n isFavorited?: boolean;\n}\n\nexport interface UseThreadFavoriteOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key (as the read-state mutation keys). */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /**\n * The rows as the list sources currently report them, BEFORE overrides. An\n * override is dropped once its row reports the same value.\n */\n rows: readonly FavoriteRow[];\n /** Write the server's answer into the list caches (`patchConversation`). */\n onServerTruth?: (result: ThreadFavoriteTarget) => void;\n}\n\nexport interface ThreadFavoriteToggle {\n /** Optimistic, then server-confirmed, values layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, boolean>>;\n /**\n * Pin or unpin a thread. Flips the row at once; while that thread's write\n * is in flight the call only records the desired value (see module doc).\n */\n setFavorited: (target: ThreadFavoriteTarget) => void;\n /** True while any toggle is in flight. */\n isPending: boolean;\n /** The threads whose toggle is in flight — a pin control disables itself for these. */\n pendingThreadIds: ReadonlySet<string>;\n /**\n * `false` once the backend answered 404 / 405: the route is not deployed\n * there, and the UI shows the read-only pin instead of a toggle.\n */\n isAvailable: boolean;\n}\n\n/** Test seam: forget which backends were warned about (shared with the other field writes). */\nexport const resetThreadFavoriteUnavailableWarnings = resetThreadFieldUnavailableWarnings;\n\nconst FAVORITE_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/favorite route yet; session pins stay read-only until it deploys.';\n\nconst readFavorite = (row: FavoriteRow): boolean => row.isFavorited ?? false;\n\nexport function useThreadFavorite({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadFavoriteOptions): ThreadFavoriteToggle {\n const field = useThreadFieldOverride<boolean, FavoriteRow>({\n field: 'favorite',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readFavorite,\n write: async (auth, { threadId, value }) => {\n const result = await setThreadFavorite(backendUrl, auth, { threadId, isFavorited: value });\n return { threadId: result.thread_id, value: result.is_favorited };\n },\n isUnavailableError: isThreadFavoriteUnavailableError,\n unavailableWarning: FAVORITE_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<boolean>) =>\n onServerTruth({ threadId, isFavorited: value })\n : undefined,\n });\n const set = field.set;\n const setFavorited = useCallback(\n ({ threadId, isFavorited }: ThreadFavoriteTarget) => set({ threadId, value: isFavorited }),\n [set],\n );\n return {\n overrides: field.overrides,\n setFavorited,\n isPending: field.isPending,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\n/** The row with its override applied, or the row itself when it has none. */\nexport function withFavoriteOverride<T extends FavoriteRow>(\n row: T,\n overrides: Readonly<Record<string, boolean>>,\n): T {\n const override = overrides[row.threadId];\n return override === undefined || override === row.isFavorited\n ? row\n : { ...row, isFavorited: override };\n}\n\n/** Every row with its override applied. */\nexport function withFavoriteOverrides<T extends FavoriteRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, boolean>>,\n): T[] {\n return rows.map((row) => withFavoriteOverride(row, overrides));\n}\n"],"names":["useThreadFieldOverride","setThreadFavorite","isThreadFavoriteUnavailableError","useCallback"],"mappings":";;;;;AAkEA,MAAM,+BACJ;AAEF,MAAM,eAAe,CAAC,QAA8B,IAAI,eAAe;AAEhE,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmD;AACjD,QAAM,QAAQA,uBAAAA,uBAA6C;AAAA,IACzD,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,kBAAkB,YAAY,MAAM,EAAE,UAAU,aAAa,OAAO;AACzF,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,aAAA;AAAA,IACrD;AAAA,IACA,oBAAoBC,IAAAA;AAAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MACX,cAAc,EAAE,UAAU,aAAa,MAAA,CAAO,IAChD;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,eAAeC,MAAAA;AAAAA,IACnB,CAAC,EAAE,UAAU,kBAAwC,IAAI,EAAE,UAAU,OAAO,aAAa;AAAA,IACzF,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;AAGO,SAAS,qBACd,KACA,WACG;AACH,QAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,SAAO,aAAa,UAAa,aAAa,IAAI,cAC9C,MACA,EAAE,GAAG,KAAK,aAAa,SAAA;AAC7B;AAGO,SAAS,sBACd,MACA,WACK;AACL,SAAO,KAAK,IAAI,CAAC,QAAQ,qBAAqB,KAAK,SAAS,CAAC;AAC/D;;;;"}
1
+ {"version":3,"file":"use-thread-favorite.cjs","sources":["../../src/threads/use-thread-favorite.ts"],"sourcesContent":["/**\n * The pin toggle behind `SessionList` and the conversation-history hooks:\n * `useThreadFieldOverride` over `POST /api/conversations/threads/favorite`\n * (see that module for the optimistic-override, rollback, serialization and\n * identity-scoping contract). A 404 / 405 marks the toggle unavailable — the\n * backend predates the route — so the UI falls back to the read-only pin\n * instead of failing on every click.\n */\nimport { useCallback } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { isThreadFavoriteUnavailableError, setThreadFavorite } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport {\n resetThreadFieldUnavailableWarnings,\n type ThreadFieldTarget,\n useThreadFieldOverride,\n} from './use-thread-field-override';\n\nexport interface ThreadFavoriteTarget {\n threadId: string;\n isFavorited: boolean;\n}\n\n/** The two fields the override layer reads and writes on a list row. */\nexport interface FavoriteRow {\n threadId: string;\n isFavorited?: boolean;\n}\n\nexport interface UseThreadFavoriteOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key (as the read-state mutation keys). */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /**\n * The rows as the list sources currently report them, BEFORE overrides. An\n * override is dropped once its row reports the same value.\n */\n rows: readonly FavoriteRow[];\n /** Write the server's answer into the list caches (`patchConversation`). */\n onServerTruth?: (result: ThreadFavoriteTarget) => void;\n}\n\nexport interface ThreadFavoriteToggle {\n /** Optimistic, then server-confirmed, values layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, boolean>>;\n /**\n * Pin or unpin a thread. Flips the row at once; while that thread's write\n * is in flight the call only records the desired value (see module doc).\n */\n setFavorited: (target: ThreadFavoriteTarget) => void;\n /** True while any toggle is in flight. */\n isPending: boolean;\n /** The threads whose toggle is in flight — a pin control disables itself for these. */\n pendingThreadIds: ReadonlySet<string>;\n /**\n * `false` once the backend answered 404 / 405: the route is not deployed\n * there, and the UI shows the read-only pin instead of a toggle.\n */\n isAvailable: boolean;\n}\n\n/** Test seam: forget which backends were warned about (shared with the other field writes). */\nexport const resetThreadFavoriteUnavailableWarnings = resetThreadFieldUnavailableWarnings;\n\nconst FAVORITE_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/favorite route yet; session pins stay read-only until it deploys.';\n\nconst readFavorite = (row: FavoriteRow): boolean => row.isFavorited ?? false;\n\nexport function useThreadFavorite({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadFavoriteOptions): ThreadFavoriteToggle {\n const field = useThreadFieldOverride<boolean, FavoriteRow>({\n field: 'favorite',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readFavorite,\n write: async (auth, { threadId, value }) => {\n const result = await setThreadFavorite(backendUrl, auth, { threadId, isFavorited: value });\n return { threadId: result.thread_id, value: result.is_favorited };\n },\n isUnavailableError: isThreadFavoriteUnavailableError,\n unavailableWarning: FAVORITE_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<boolean>) =>\n onServerTruth({ threadId, isFavorited: value })\n : undefined,\n });\n const set = field.set;\n const setFavorited = useCallback(\n ({ threadId, isFavorited }: ThreadFavoriteTarget) => set({ threadId, value: isFavorited }),\n [set],\n );\n return {\n overrides: field.overrides,\n setFavorited,\n isPending: field.isPending,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\n/** The row with its override applied, or the row itself when it has none. */\nexport function withFavoriteOverride<T extends FavoriteRow>(\n row: T,\n overrides: Readonly<Record<string, boolean>>,\n): T {\n const override = overrides[row.threadId];\n return override === undefined || override === row.isFavorited\n ? row\n : { ...row, isFavorited: override };\n}\n\n/** Every row with its override applied. */\nexport function withFavoriteOverrides<T extends FavoriteRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, boolean>>,\n): T[] {\n return rows.map((row) => withFavoriteOverride(row, overrides));\n}\n"],"names":["useThreadFieldOverride","setThreadFavorite","isThreadFavoriteUnavailableError","useCallback"],"mappings":";;;;;AAkEA,MAAM,+BACJ;AAEF,MAAM,eAAe,CAAC,QAA8B,IAAI,eAAe;AAEhE,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmD;AACjD,QAAM,QAAQA,uBAAAA,uBAA6C;AAAA,IACzD,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,kBAAkB,YAAY,MAAM,EAAE,UAAU,aAAa,OAAO;AACzF,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,aAAA;AAAA,IACrD;AAAA,IACA,oBAAoBC,IAAAA;AAAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MACX,cAAc,EAAE,UAAU,aAAa,MAAA,CAAO,IAChD;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,eAAeC,WAAAA;AAAAA,IACnB,CAAC,EAAE,UAAU,kBAAwC,IAAI,EAAE,UAAU,OAAO,aAAa;AAAA,IACzF,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;AAGO,SAAS,qBACd,KACA,WACG;AACH,QAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,SAAO,aAAa,UAAa,aAAa,IAAI,cAC9C,MACA,EAAE,GAAG,KAAK,aAAa,SAAA;AAC7B;AAGO,SAAS,sBACd,MACA,WACK;AACL,SAAO,KAAK,IAAI,CAAC,QAAQ,qBAAqB,KAAK,SAAS,CAAC;AAC/D;;;;"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const reactQuery = require("@tanstack/react-query");
4
- const react = require("react");
4
+ const require$$0 = require("react");
5
5
  const credentialRenewal = require("../runtime/credential-renewal.cjs");
6
6
  const EMPTY_PENDING = /* @__PURE__ */ new Set();
7
7
  function fieldScope(backendUrl, principalId) {
@@ -30,7 +30,7 @@ function useThreadFieldOverride({
30
30
  equals = strictEquals
31
31
  }) {
32
32
  const scope = fieldScope(backendUrl, principalId);
33
- const [state, setState] = react.useState(() => ({
33
+ const [state, setState] = require$$0.useState(() => ({
34
34
  scope,
35
35
  overrides: {},
36
36
  pending: EMPTY_PENDING
@@ -38,36 +38,36 @@ function useThreadFieldOverride({
38
38
  if (state.scope !== scope) {
39
39
  setState({ scope, overrides: {}, pending: EMPTY_PENDING });
40
40
  }
41
- const emptyOverridesRef = react.useRef(Object.freeze({}));
41
+ const emptyOverridesRef = require$$0.useRef(Object.freeze({}));
42
42
  const overrides = state.scope === scope ? state.overrides : emptyOverridesRef.current;
43
43
  const pendingThreadIds = state.scope === scope ? state.pending : EMPTY_PENDING;
44
- const [unavailableBackend, setUnavailableBackend] = react.useState(null);
45
- const scopeRef = react.useRef(scope);
44
+ const [unavailableBackend, setUnavailableBackend] = require$$0.useState(null);
45
+ const scopeRef = require$$0.useRef(scope);
46
46
  scopeRef.current = scope;
47
- const overridesRef = react.useRef(overrides);
47
+ const overridesRef = require$$0.useRef(overrides);
48
48
  overridesRef.current = overrides;
49
- const readRowRef = react.useRef(readRow);
49
+ const readRowRef = require$$0.useRef(readRow);
50
50
  readRowRef.current = readRow;
51
- const writeRef = react.useRef(write);
51
+ const writeRef = require$$0.useRef(write);
52
52
  writeRef.current = write;
53
- const isUnavailableErrorRef = react.useRef(isUnavailableError);
53
+ const isUnavailableErrorRef = require$$0.useRef(isUnavailableError);
54
54
  isUnavailableErrorRef.current = isUnavailableError;
55
- const unavailableWarningRef = react.useRef(unavailableWarning);
55
+ const unavailableWarningRef = require$$0.useRef(unavailableWarning);
56
56
  unavailableWarningRef.current = unavailableWarning;
57
- const onServerTruthRef = react.useRef(onServerTruth);
57
+ const onServerTruthRef = require$$0.useRef(onServerTruth);
58
58
  onServerTruthRef.current = onServerTruth;
59
- const equalsRef = react.useRef(equals);
59
+ const equalsRef = require$$0.useRef(equals);
60
60
  equalsRef.current = equals;
61
- const inFlightRef = react.useRef(/* @__PURE__ */ new Map());
62
- const queuedRef = react.useRef(/* @__PURE__ */ new Map());
63
- const seqRef = react.useRef(0);
64
- const bookkeepingScopeRef = react.useRef(scope);
61
+ const inFlightRef = require$$0.useRef(/* @__PURE__ */ new Map());
62
+ const queuedRef = require$$0.useRef(/* @__PURE__ */ new Map());
63
+ const seqRef = require$$0.useRef(0);
64
+ const bookkeepingScopeRef = require$$0.useRef(scope);
65
65
  if (bookkeepingScopeRef.current !== scope) {
66
66
  bookkeepingScopeRef.current = scope;
67
67
  inFlightRef.current = /* @__PURE__ */ new Map();
68
68
  queuedRef.current = /* @__PURE__ */ new Map();
69
69
  }
70
- const update = react.useCallback(
70
+ const update = require$$0.useCallback(
71
71
  (forScope, patch) => {
72
72
  setState((current) => {
73
73
  const base = current.scope === forScope ? current : { scope: forScope, overrides: {}, pending: EMPTY_PENDING };
@@ -77,7 +77,7 @@ function useThreadFieldOverride({
77
77
  },
78
78
  []
79
79
  );
80
- react.useEffect(() => {
80
+ require$$0.useEffect(() => {
81
81
  const caughtUp = Object.keys(overrides).filter((threadId) => {
82
82
  if (pendingThreadIds.has(threadId)) return false;
83
83
  const row = rows.find((candidate) => candidate.threadId === threadId);
@@ -155,9 +155,9 @@ function useThreadFieldOverride({
155
155
  }));
156
156
  mutate({ ...write2, scope: forScope, seq });
157
157
  }
158
- const startWriteRef = react.useRef(startWrite);
158
+ const startWriteRef = require$$0.useRef(startWrite);
159
159
  startWriteRef.current = startWrite;
160
- const set = react.useCallback(
160
+ const set = require$$0.useCallback(
161
161
  ({ threadId, value }) => {
162
162
  const forScope = scopeRef.current;
163
163
  const previous = overridesRef.current[threadId];
@@ -1 +1 @@
1
- {"version":3,"file":"use-thread-field-override.cjs","sources":["../../src/threads/use-thread-field-override.ts"],"sourcesContent":["/**\n * The optimistic per-thread field write behind the pin (`useThreadFavorite`)\n * and the rename (`useThreadRename`): one TanStack mutation over a REST\n * route with an override map layered over the list rows.\n *\n * Why overrides rather than a cache patch alone: a row's field is folded from\n * two sources — the fetched page and the pushed conversation index — and a\n * push that predates the write would clobber a patched page. The override\n * sits over both until the sources report the same value, then drops away so\n * they own the field again (a later write from another client is never\n * masked). A failure restores the previous value; a 404 / 405 marks the\n * write unavailable — the backend predates the route — so the UI withdraws\n * the control instead of failing on every use.\n *\n * Same-thread writes are serialized: while one is in flight, a further write\n * for that thread flips the row at once but only records the desired value,\n * and at most one follow-up write is sent — with that value — once the\n * in-flight one has answered. Two independent writes for one thread never\n * race, so the server cannot end on an earlier request's value.\n *\n * Everything the hook holds is scoped to `(backendUrl, principalId)`: a\n * credential swap under the same list reads an empty override map, and a\n * write that was in flight for the previous identity is ignored when it\n * answers, so a same-id row under the new identity never inherits the old\n * one's value.\n */\nimport { useMutation } from '@tanstack/react-query';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { type CredentialResolver, withCredentialRenewal } from '../runtime/credential-renewal';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\n\nexport interface ThreadFieldTarget<T> {\n threadId: string;\n value: T;\n}\n\n/** The one field every row must carry: its identity. */\nexport interface ThreadFieldRow {\n threadId: string;\n}\n\nexport interface UseThreadFieldOverrideOptions<T, R extends ThreadFieldRow> {\n /** Names the field: part of the mutation key and of the one-per-backend warning. */\n field: string;\n backendUrl: string;\n /** Non-secret identity in the mutation key (as the read-state mutation keys). */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /**\n * The rows as the list sources currently report them, BEFORE overrides. An\n * override is dropped once its row reports the same value.\n */\n rows: readonly R[];\n /** The field as a source row reports it; `undefined` when the row does not carry it. */\n readRow: (row: R) => T | undefined;\n /** The write; resolves to the server's truth after it. */\n write: (auth: RestConversationAuth, target: ThreadFieldTarget<T>) => Promise<ThreadFieldTarget<T>>;\n /** True for the rejection that means the backend has no such route (404 / 405). */\n isUnavailableError: (error: unknown) => boolean;\n /** Logged once per backend when the route is found missing. */\n unavailableWarning: string;\n /** Write the server's answer into the list caches (`patchConversation`). */\n onServerTruth?: (truth: ThreadFieldTarget<T>) => void;\n /** Value equality (default `===`). */\n equals?: (a: T, b: T) => boolean;\n}\n\nexport interface ThreadFieldOverride<T> {\n /** Optimistic, then server-confirmed, values layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, T>>;\n /**\n * Write the field. Flips the row at once; while that thread's write is in\n * flight the call only records the desired value (see module doc).\n */\n set: (target: ThreadFieldTarget<T>) => void;\n /** True while any write is in flight. */\n isPending: boolean;\n /** The threads whose write is in flight — a control disables itself for these. */\n pendingThreadIds: ReadonlySet<string>;\n /**\n * `false` once the backend answered 404 / 405: the route is not deployed\n * there, and the UI withdraws the control.\n */\n isAvailable: boolean;\n}\n\n/** The hook's state, tagged with the identity it belongs to. */\ninterface ScopedFieldState<T> {\n scope: string;\n overrides: Record<string, T>;\n pending: ReadonlySet<string>;\n}\n\ninterface FieldWrite<T> extends ThreadFieldTarget<T> {\n /** The override before this chain of writes began; `undefined` restores the source value. */\n previous: T | undefined;\n /** The identity the write was issued for; an answer for another one is ignored. */\n scope: string;\n /** This thread's write generation; an answer for an older one is ignored. */\n seq: number;\n}\n\nconst EMPTY_PENDING: ReadonlySet<string> = new Set();\n\nfunction fieldScope(backendUrl: string, principalId: string): string {\n return `${backendUrl}::${principalId}`;\n}\n\nfunction withPending(pending: ReadonlySet<string>, threadId: string, isPending: boolean): ReadonlySet<string> {\n if (pending.has(threadId) === isPending) return pending;\n const next = new Set(pending);\n if (isPending) next.add(threadId);\n else next.delete(threadId);\n return next;\n}\n\nconst strictEquals = <T,>(a: T, b: T): boolean => a === b;\n\n/** `(field, backend)` pairs already warned about, so an older agora logs one line per page load, not one per use. */\nconst warnedUnavailableBackends = new Set<string>();\n\n/** Test seam: forget which backends were warned about. */\nexport function resetThreadFieldUnavailableWarnings(): void {\n warnedUnavailableBackends.clear();\n}\n\nexport function useThreadFieldOverride<T, R extends ThreadFieldRow>({\n field,\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow,\n write,\n isUnavailableError,\n unavailableWarning,\n onServerTruth,\n equals = strictEquals,\n}: UseThreadFieldOverrideOptions<T, R>): ThreadFieldOverride<T> {\n const scope = fieldScope(backendUrl, principalId);\n const [state, setState] = useState<ScopedFieldState<T>>(() => ({\n scope,\n overrides: {},\n pending: EMPTY_PENDING,\n }));\n // An identity swap discards everything held for the previous identity —\n // overrides AND pending rows — rather than merely hiding it: a round trip\n // back to that identity must not revive a row pinned for a write whose\n // answer has since been dropped (it would stay disabled for good). Setting\n // state during render is React's derived-state reset; the render re-runs\n // with the empty state before anything is committed.\n if (state.scope !== scope) {\n setState({ scope, overrides: {}, pending: EMPTY_PENDING });\n }\n const emptyOverridesRef = useRef<Readonly<Record<string, T>>>(Object.freeze({}) as Record<string, T>);\n const overrides = state.scope === scope ? state.overrides : emptyOverridesRef.current;\n const pendingThreadIds = state.scope === scope ? state.pending : EMPTY_PENDING;\n // The backend the route was found missing on. The route is a property of\n // the backend, not of who is asking, so this is keyed by backend alone; a\n // different backend is presumed to have it until it says otherwise.\n const [unavailableBackend, setUnavailableBackend] = useState<string | null>(null);\n\n const scopeRef = useRef(scope);\n scopeRef.current = scope;\n const overridesRef = useRef(overrides);\n overridesRef.current = overrides;\n // The per-render option closures ride refs so a consumer's fresh functions\n // never re-key the mutation or the caught-up effect.\n const readRowRef = useRef(readRow);\n readRowRef.current = readRow;\n const writeRef = useRef(write);\n writeRef.current = write;\n const isUnavailableErrorRef = useRef(isUnavailableError);\n isUnavailableErrorRef.current = isUnavailableError;\n const unavailableWarningRef = useRef(unavailableWarning);\n unavailableWarningRef.current = unavailableWarning;\n const onServerTruthRef = useRef(onServerTruth);\n onServerTruthRef.current = onServerTruth;\n const equalsRef = useRef(equals);\n equalsRef.current = equals;\n // Per-thread write bookkeeping for the CURRENT identity: the generation of\n // the write in flight, and the value a further write asked for meanwhile.\n const inFlightRef = useRef<Map<string, number>>(new Map());\n const queuedRef = useRef<Map<string, T>>(new Map());\n const seqRef = useRef(0);\n const bookkeepingScopeRef = useRef(scope);\n if (bookkeepingScopeRef.current !== scope) {\n // The previous identity's writes are abandoned with its state: their\n // answers are dropped by the scope guard below, and nothing queued\n // behind them is sent.\n bookkeepingScopeRef.current = scope;\n inFlightRef.current = new Map();\n queuedRef.current = new Map();\n }\n\n const update = useCallback(\n (forScope: string, patch: (current: ScopedFieldState<T>) => ScopedFieldState<T>) => {\n setState((current) => {\n const base: ScopedFieldState<T> =\n current.scope === forScope\n ? current\n : { scope: forScope, overrides: {}, pending: EMPTY_PENDING };\n const next = patch(base);\n return next === base && current.scope === forScope ? current : next;\n });\n },\n [],\n );\n\n useEffect(() => {\n const caughtUp = Object.keys(overrides).filter((threadId) => {\n // A row with a write in flight keeps its override whatever the sources\n // say: the first write of a chain patches the page with a value the\n // user has since moved away from, and the row must not flash it.\n if (pendingThreadIds.has(threadId)) return false;\n const row = rows.find((candidate) => candidate.threadId === threadId);\n if (row === undefined) return false;\n const reported = readRowRef.current(row);\n const override = overrides[threadId];\n return reported !== undefined && override !== undefined && equalsRef.current(reported, override);\n });\n if (caughtUp.length === 0) return;\n update(scope, (current) => {\n const next = { ...current.overrides };\n for (const threadId of caughtUp) delete next[threadId];\n return { ...current, overrides: next };\n });\n }, [overrides, pendingThreadIds, rows, scope, update]);\n\n const mutation = useMutation({\n mutationKey: ['conversation-history', field, backendUrl, principalId],\n mutationFn: async ({ threadId, value }: FieldWrite<T>) =>\n withCredentialRenewal(getAuth, (auth) => writeRef.current(auth, { threadId, value })),\n onError: (error, write) => {\n if (isUnavailableErrorRef.current(error)) {\n setUnavailableBackend(backendUrl);\n const warnKey = `${field}::${backendUrl}`;\n if (!warnedUnavailableBackends.has(warnKey)) {\n warnedUnavailableBackends.add(warnKey);\n console.warn(unavailableWarningRef.current);\n }\n }\n if (!isCurrentWrite(write)) return;\n inFlightRef.current.delete(write.threadId);\n // Whatever was asked for meanwhile is dropped with the failure: the row\n // goes back to what it showed before the chain began.\n queuedRef.current.delete(write.threadId);\n update(write.scope, (current) => {\n const overridesNext = { ...current.overrides };\n if (write.previous === undefined) delete overridesNext[write.threadId];\n else overridesNext[write.threadId] = write.previous;\n return {\n ...current,\n overrides: overridesNext,\n pending: withPending(current.pending, write.threadId, false),\n };\n });\n },\n onSuccess: (truth, write) => {\n if (!isCurrentWrite(write)) return;\n inFlightRef.current.delete(write.threadId);\n const queued = queuedRef.current.get(write.threadId);\n const hadQueued = queuedRef.current.has(write.threadId);\n queuedRef.current.delete(write.threadId);\n onServerTruthRef.current?.(truth);\n if (hadQueued && queued !== undefined && !equalsRef.current(queued, truth.value)) {\n // The row already shows the value asked for meanwhile; the server\n // does not have it yet, so send it now — one write, the latest value.\n startWrite(write.scope, {\n threadId: write.threadId,\n value: queued,\n previous: truth.value,\n });\n return;\n }\n update(write.scope, (current) => ({\n ...current,\n overrides: { ...current.overrides, [truth.threadId]: truth.value },\n pending: withPending(current.pending, truth.threadId, false),\n }));\n },\n });\n const mutate = mutation.mutate;\n\n /** True when the answer belongs to the current identity and to this thread's latest write. */\n function isCurrentWrite(write: FieldWrite<T>): boolean {\n return (\n scopeRef.current === write.scope && inFlightRef.current.get(write.threadId) === write.seq\n );\n }\n\n function startWrite(forScope: string, write: Omit<FieldWrite<T>, 'scope' | 'seq'>): void {\n const seq = ++seqRef.current;\n inFlightRef.current.set(write.threadId, seq);\n update(forScope, (current) => ({\n ...current,\n pending: withPending(current.pending, write.threadId, true),\n }));\n mutate({ ...write, scope: forScope, seq });\n }\n\n const startWriteRef = useRef(startWrite);\n startWriteRef.current = startWrite;\n\n const set = useCallback(\n ({ threadId, value }: ThreadFieldTarget<T>) => {\n const forScope = scopeRef.current;\n const previous = overridesRef.current[threadId];\n // The row flips at once whether the write goes out now or after the\n // one in flight.\n update(forScope, (current) => ({\n ...current,\n overrides: { ...current.overrides, [threadId]: value },\n }));\n if (inFlightRef.current.has(threadId)) {\n queuedRef.current.set(threadId, value);\n return;\n }\n startWriteRef.current(forScope, { threadId, value, previous });\n },\n [update],\n );\n\n return {\n overrides,\n set,\n isPending: pendingThreadIds.size > 0,\n pendingThreadIds,\n isAvailable: unavailableBackend !== backendUrl,\n };\n}\n"],"names":["useState","useRef","useCallback","useEffect","useMutation","withCredentialRenewal","write"],"mappings":"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"}
1
+ {"version":3,"file":"use-thread-field-override.cjs","sources":["../../src/threads/use-thread-field-override.ts"],"sourcesContent":["/**\n * The optimistic per-thread field write behind the pin (`useThreadFavorite`)\n * and the rename (`useThreadRename`): one TanStack mutation over a REST\n * route with an override map layered over the list rows.\n *\n * Why overrides rather than a cache patch alone: a row's field is folded from\n * two sources — the fetched page and the pushed conversation index — and a\n * push that predates the write would clobber a patched page. The override\n * sits over both until the sources report the same value, then drops away so\n * they own the field again (a later write from another client is never\n * masked). A failure restores the previous value; a 404 / 405 marks the\n * write unavailable — the backend predates the route — so the UI withdraws\n * the control instead of failing on every use.\n *\n * Same-thread writes are serialized: while one is in flight, a further write\n * for that thread flips the row at once but only records the desired value,\n * and at most one follow-up write is sent — with that value — once the\n * in-flight one has answered. Two independent writes for one thread never\n * race, so the server cannot end on an earlier request's value.\n *\n * Everything the hook holds is scoped to `(backendUrl, principalId)`: a\n * credential swap under the same list reads an empty override map, and a\n * write that was in flight for the previous identity is ignored when it\n * answers, so a same-id row under the new identity never inherits the old\n * one's value.\n */\nimport { useMutation } from '@tanstack/react-query';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { type CredentialResolver, withCredentialRenewal } from '../runtime/credential-renewal';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\n\nexport interface ThreadFieldTarget<T> {\n threadId: string;\n value: T;\n}\n\n/** The one field every row must carry: its identity. */\nexport interface ThreadFieldRow {\n threadId: string;\n}\n\nexport interface UseThreadFieldOverrideOptions<T, R extends ThreadFieldRow> {\n /** Names the field: part of the mutation key and of the one-per-backend warning. */\n field: string;\n backendUrl: string;\n /** Non-secret identity in the mutation key (as the read-state mutation keys). */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /**\n * The rows as the list sources currently report them, BEFORE overrides. An\n * override is dropped once its row reports the same value.\n */\n rows: readonly R[];\n /** The field as a source row reports it; `undefined` when the row does not carry it. */\n readRow: (row: R) => T | undefined;\n /** The write; resolves to the server's truth after it. */\n write: (auth: RestConversationAuth, target: ThreadFieldTarget<T>) => Promise<ThreadFieldTarget<T>>;\n /** True for the rejection that means the backend has no such route (404 / 405). */\n isUnavailableError: (error: unknown) => boolean;\n /** Logged once per backend when the route is found missing. */\n unavailableWarning: string;\n /** Write the server's answer into the list caches (`patchConversation`). */\n onServerTruth?: (truth: ThreadFieldTarget<T>) => void;\n /** Value equality (default `===`). */\n equals?: (a: T, b: T) => boolean;\n}\n\nexport interface ThreadFieldOverride<T> {\n /** Optimistic, then server-confirmed, values layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, T>>;\n /**\n * Write the field. Flips the row at once; while that thread's write is in\n * flight the call only records the desired value (see module doc).\n */\n set: (target: ThreadFieldTarget<T>) => void;\n /** True while any write is in flight. */\n isPending: boolean;\n /** The threads whose write is in flight — a control disables itself for these. */\n pendingThreadIds: ReadonlySet<string>;\n /**\n * `false` once the backend answered 404 / 405: the route is not deployed\n * there, and the UI withdraws the control.\n */\n isAvailable: boolean;\n}\n\n/** The hook's state, tagged with the identity it belongs to. */\ninterface ScopedFieldState<T> {\n scope: string;\n overrides: Record<string, T>;\n pending: ReadonlySet<string>;\n}\n\ninterface FieldWrite<T> extends ThreadFieldTarget<T> {\n /** The override before this chain of writes began; `undefined` restores the source value. */\n previous: T | undefined;\n /** The identity the write was issued for; an answer for another one is ignored. */\n scope: string;\n /** This thread's write generation; an answer for an older one is ignored. */\n seq: number;\n}\n\nconst EMPTY_PENDING: ReadonlySet<string> = new Set();\n\nfunction fieldScope(backendUrl: string, principalId: string): string {\n return `${backendUrl}::${principalId}`;\n}\n\nfunction withPending(pending: ReadonlySet<string>, threadId: string, isPending: boolean): ReadonlySet<string> {\n if (pending.has(threadId) === isPending) return pending;\n const next = new Set(pending);\n if (isPending) next.add(threadId);\n else next.delete(threadId);\n return next;\n}\n\nconst strictEquals = <T,>(a: T, b: T): boolean => a === b;\n\n/** `(field, backend)` pairs already warned about, so an older agora logs one line per page load, not one per use. */\nconst warnedUnavailableBackends = new Set<string>();\n\n/** Test seam: forget which backends were warned about. */\nexport function resetThreadFieldUnavailableWarnings(): void {\n warnedUnavailableBackends.clear();\n}\n\nexport function useThreadFieldOverride<T, R extends ThreadFieldRow>({\n field,\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow,\n write,\n isUnavailableError,\n unavailableWarning,\n onServerTruth,\n equals = strictEquals,\n}: UseThreadFieldOverrideOptions<T, R>): ThreadFieldOverride<T> {\n const scope = fieldScope(backendUrl, principalId);\n const [state, setState] = useState<ScopedFieldState<T>>(() => ({\n scope,\n overrides: {},\n pending: EMPTY_PENDING,\n }));\n // An identity swap discards everything held for the previous identity —\n // overrides AND pending rows — rather than merely hiding it: a round trip\n // back to that identity must not revive a row pinned for a write whose\n // answer has since been dropped (it would stay disabled for good). Setting\n // state during render is React's derived-state reset; the render re-runs\n // with the empty state before anything is committed.\n if (state.scope !== scope) {\n setState({ scope, overrides: {}, pending: EMPTY_PENDING });\n }\n const emptyOverridesRef = useRef<Readonly<Record<string, T>>>(Object.freeze({}) as Record<string, T>);\n const overrides = state.scope === scope ? state.overrides : emptyOverridesRef.current;\n const pendingThreadIds = state.scope === scope ? state.pending : EMPTY_PENDING;\n // The backend the route was found missing on. The route is a property of\n // the backend, not of who is asking, so this is keyed by backend alone; a\n // different backend is presumed to have it until it says otherwise.\n const [unavailableBackend, setUnavailableBackend] = useState<string | null>(null);\n\n const scopeRef = useRef(scope);\n scopeRef.current = scope;\n const overridesRef = useRef(overrides);\n overridesRef.current = overrides;\n // The per-render option closures ride refs so a consumer's fresh functions\n // never re-key the mutation or the caught-up effect.\n const readRowRef = useRef(readRow);\n readRowRef.current = readRow;\n const writeRef = useRef(write);\n writeRef.current = write;\n const isUnavailableErrorRef = useRef(isUnavailableError);\n isUnavailableErrorRef.current = isUnavailableError;\n const unavailableWarningRef = useRef(unavailableWarning);\n unavailableWarningRef.current = unavailableWarning;\n const onServerTruthRef = useRef(onServerTruth);\n onServerTruthRef.current = onServerTruth;\n const equalsRef = useRef(equals);\n equalsRef.current = equals;\n // Per-thread write bookkeeping for the CURRENT identity: the generation of\n // the write in flight, and the value a further write asked for meanwhile.\n const inFlightRef = useRef<Map<string, number>>(new Map());\n const queuedRef = useRef<Map<string, T>>(new Map());\n const seqRef = useRef(0);\n const bookkeepingScopeRef = useRef(scope);\n if (bookkeepingScopeRef.current !== scope) {\n // The previous identity's writes are abandoned with its state: their\n // answers are dropped by the scope guard below, and nothing queued\n // behind them is sent.\n bookkeepingScopeRef.current = scope;\n inFlightRef.current = new Map();\n queuedRef.current = new Map();\n }\n\n const update = useCallback(\n (forScope: string, patch: (current: ScopedFieldState<T>) => ScopedFieldState<T>) => {\n setState((current) => {\n const base: ScopedFieldState<T> =\n current.scope === forScope\n ? current\n : { scope: forScope, overrides: {}, pending: EMPTY_PENDING };\n const next = patch(base);\n return next === base && current.scope === forScope ? current : next;\n });\n },\n [],\n );\n\n useEffect(() => {\n const caughtUp = Object.keys(overrides).filter((threadId) => {\n // A row with a write in flight keeps its override whatever the sources\n // say: the first write of a chain patches the page with a value the\n // user has since moved away from, and the row must not flash it.\n if (pendingThreadIds.has(threadId)) return false;\n const row = rows.find((candidate) => candidate.threadId === threadId);\n if (row === undefined) return false;\n const reported = readRowRef.current(row);\n const override = overrides[threadId];\n return reported !== undefined && override !== undefined && equalsRef.current(reported, override);\n });\n if (caughtUp.length === 0) return;\n update(scope, (current) => {\n const next = { ...current.overrides };\n for (const threadId of caughtUp) delete next[threadId];\n return { ...current, overrides: next };\n });\n }, [overrides, pendingThreadIds, rows, scope, update]);\n\n const mutation = useMutation({\n mutationKey: ['conversation-history', field, backendUrl, principalId],\n mutationFn: async ({ threadId, value }: FieldWrite<T>) =>\n withCredentialRenewal(getAuth, (auth) => writeRef.current(auth, { threadId, value })),\n onError: (error, write) => {\n if (isUnavailableErrorRef.current(error)) {\n setUnavailableBackend(backendUrl);\n const warnKey = `${field}::${backendUrl}`;\n if (!warnedUnavailableBackends.has(warnKey)) {\n warnedUnavailableBackends.add(warnKey);\n console.warn(unavailableWarningRef.current);\n }\n }\n if (!isCurrentWrite(write)) return;\n inFlightRef.current.delete(write.threadId);\n // Whatever was asked for meanwhile is dropped with the failure: the row\n // goes back to what it showed before the chain began.\n queuedRef.current.delete(write.threadId);\n update(write.scope, (current) => {\n const overridesNext = { ...current.overrides };\n if (write.previous === undefined) delete overridesNext[write.threadId];\n else overridesNext[write.threadId] = write.previous;\n return {\n ...current,\n overrides: overridesNext,\n pending: withPending(current.pending, write.threadId, false),\n };\n });\n },\n onSuccess: (truth, write) => {\n if (!isCurrentWrite(write)) return;\n inFlightRef.current.delete(write.threadId);\n const queued = queuedRef.current.get(write.threadId);\n const hadQueued = queuedRef.current.has(write.threadId);\n queuedRef.current.delete(write.threadId);\n onServerTruthRef.current?.(truth);\n if (hadQueued && queued !== undefined && !equalsRef.current(queued, truth.value)) {\n // The row already shows the value asked for meanwhile; the server\n // does not have it yet, so send it now — one write, the latest value.\n startWrite(write.scope, {\n threadId: write.threadId,\n value: queued,\n previous: truth.value,\n });\n return;\n }\n update(write.scope, (current) => ({\n ...current,\n overrides: { ...current.overrides, [truth.threadId]: truth.value },\n pending: withPending(current.pending, truth.threadId, false),\n }));\n },\n });\n const mutate = mutation.mutate;\n\n /** True when the answer belongs to the current identity and to this thread's latest write. */\n function isCurrentWrite(write: FieldWrite<T>): boolean {\n return (\n scopeRef.current === write.scope && inFlightRef.current.get(write.threadId) === write.seq\n );\n }\n\n function startWrite(forScope: string, write: Omit<FieldWrite<T>, 'scope' | 'seq'>): void {\n const seq = ++seqRef.current;\n inFlightRef.current.set(write.threadId, seq);\n update(forScope, (current) => ({\n ...current,\n pending: withPending(current.pending, write.threadId, true),\n }));\n mutate({ ...write, scope: forScope, seq });\n }\n\n const startWriteRef = useRef(startWrite);\n startWriteRef.current = startWrite;\n\n const set = useCallback(\n ({ threadId, value }: ThreadFieldTarget<T>) => {\n const forScope = scopeRef.current;\n const previous = overridesRef.current[threadId];\n // The row flips at once whether the write goes out now or after the\n // one in flight.\n update(forScope, (current) => ({\n ...current,\n overrides: { ...current.overrides, [threadId]: value },\n }));\n if (inFlightRef.current.has(threadId)) {\n queuedRef.current.set(threadId, value);\n return;\n }\n startWriteRef.current(forScope, { threadId, value, previous });\n },\n [update],\n );\n\n return {\n overrides,\n set,\n isPending: pendingThreadIds.size > 0,\n pendingThreadIds,\n isAvailable: unavailableBackend !== backendUrl,\n };\n}\n"],"names":["useState","useRef","useCallback","useEffect","useMutation","withCredentialRenewal","write"],"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 api = require("./api.cjs");
5
5
  const useThreadFieldOverride = require("./use-thread-field-override.cjs");
6
6
  const READ_STATE_UNAVAILABLE_WARNING = "[AthenaSDK] This backend has no POST /api/conversations/threads/read-state route; sessions cannot be marked read from here.";
@@ -29,10 +29,10 @@ function useThreadReadState({
29
29
  onServerTruth: onServerTruth ? ({ threadId, value }) => onServerTruth({ threadId, isUnread: value }) : void 0
30
30
  });
31
31
  const set = field.set;
32
- const rowsRef = react.useRef(rows);
32
+ const rowsRef = require$$0.useRef(rows);
33
33
  rowsRef.current = rows;
34
- const [coveredUpdatedAt, setCoveredUpdatedAt] = react.useState({});
35
- const setReadState = react.useCallback(
34
+ const [coveredUpdatedAt, setCoveredUpdatedAt] = require$$0.useState({});
35
+ const setReadState = require$$0.useCallback(
36
36
  ({ threadId, isUnread, updatedAt }) => {
37
37
  var _a;
38
38
  const covered = updatedAt ?? ((_a = rowsRef.current.find((row) => row.threadId === threadId)) == null ? void 0 : _a.updatedAt);
@@ -1 +1 @@
1
- {"version":3,"file":"use-thread-read-state.cjs","sources":["../../src/threads/use-thread-read-state.ts"],"sourcesContent":["/**\n * Mark a session read or unread for the viewer — the inbox's \"Mark read\" and\n * the session list's read toggle: `useThreadFieldOverride` over\n * `POST /api/conversations/threads/read-state` (see that module for the\n * optimistic-override, rollback, serialization and identity-scoping\n * contract).\n *\n * The override matters more here than for the pin: the read-state route\n * publishes no conversation-index update, so a pushed index entry keeps the\n * `is_unread` it had at the index's last rebuild. The override holds the\n * viewer's answer over that stale push until the sources agree.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { setThreadReadState } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport { type ThreadFieldTarget, useThreadFieldOverride } from './use-thread-field-override';\n\nexport interface ThreadReadStateTarget {\n threadId: string;\n isUnread: boolean;\n /**\n * The row's last update the receipt covers (its `updatedAt` when the person\n * acted). Activity newer than that ends the override, so a session read\n * here turns unread again when it gets a new message — even in a list the\n * provider's own page does not hold. Without it the provider's page row's\n * value is used when it has one.\n */\n updatedAt?: string;\n}\n\n/** The fields the override layer reads on a list row. */\nexport interface ReadStateRow {\n threadId: string;\n isUnread: boolean;\n updatedAt?: string;\n}\n\nexport interface UseThreadReadStateOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key. */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /** The rows as the list sources report them, BEFORE overrides. */\n rows: readonly ReadStateRow[];\n /** Write the server's answer into the list caches. */\n onServerTruth?: (result: ThreadReadStateTarget) => void;\n}\n\nexport interface ThreadReadStateToggle {\n /** Optimistic, then server-confirmed, values layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, boolean>>;\n /** The `updatedAt` each override covers; a row updated after it shows its own value. */\n coveredUpdatedAt: Readonly<Record<string, string>>;\n setReadState: (target: ThreadReadStateTarget) => void;\n pendingThreadIds: ReadonlySet<string>;\n /**\n * Always `true`: every agora the SDK supports has the read-state route, so\n * a 404 is a session that no longer exists, never a missing route.\n */\n isAvailable: boolean;\n}\n\nconst READ_STATE_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/read-state route; sessions cannot be marked read from here.';\n\n/** The route predates every agora the SDK supports; a rejection is per thread, never \"no route\". */\nconst isReadStateUnavailableError = (): boolean => false;\n\nconst readUnread = (row: ReadStateRow): boolean => row.isUnread;\n\nexport function useThreadReadState({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadReadStateOptions): ThreadReadStateToggle {\n const field = useThreadFieldOverride<boolean, ReadStateRow>({\n field: 'read-state',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readUnread,\n write: async (auth, { threadId, value }) => {\n const result = await setThreadReadState(backendUrl, auth, { threadId, isUnread: value });\n return { threadId: result.thread_id, value: result.is_unread };\n },\n isUnavailableError: isReadStateUnavailableError,\n unavailableWarning: READ_STATE_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<boolean>) =>\n onServerTruth({ threadId, isUnread: value })\n : undefined,\n });\n const set = field.set;\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const [coveredUpdatedAt, setCoveredUpdatedAt] = useState<Readonly<Record<string, string>>>({});\n const setReadState = useCallback(\n ({ threadId, isUnread, updatedAt }: ThreadReadStateTarget) => {\n const covered =\n updatedAt ?? rowsRef.current.find((row) => row.threadId === threadId)?.updatedAt;\n setCoveredUpdatedAt((current) => {\n const next = { ...current };\n if (covered) next[threadId] = covered;\n else delete next[threadId];\n return next;\n });\n set({ threadId, value: isUnread });\n },\n [set],\n );\n return {\n overrides: field.overrides,\n coveredUpdatedAt,\n setReadState,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\nfunction updatedAfter(row: ReadStateRow, covered: string | undefined): boolean {\n if (!covered || !row.updatedAt) return false;\n const rowAt = Date.parse(row.updatedAt);\n const coveredAt = Date.parse(covered);\n return Number.isFinite(rowAt) && Number.isFinite(coveredAt) && rowAt > coveredAt;\n}\n\n/**\n * Every row with its read-state override applied — except a row updated\n * after the activity the override covers, which shows its own value (marking\n * read never moves `updatedAt`, so a newer one is new activity).\n */\nexport function withReadStateOverrides<T extends ReadStateRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, boolean>>,\n coveredUpdatedAt: Readonly<Record<string, string>> = {},\n): T[] {\n return rows.map((row) => {\n const override = overrides[row.threadId];\n if (override === undefined || override === row.isUnread) return row;\n if (updatedAfter(row, coveredUpdatedAt[row.threadId])) return row;\n return { ...row, isUnread: override };\n });\n}\n"],"names":["useThreadFieldOverride","setThreadReadState","useRef","useState","useCallback"],"mappings":";;;;;AAgEA,MAAM,iCACJ;AAGF,MAAM,8BAA8B,MAAe;AAEnD,MAAM,aAAa,CAAC,QAA+B,IAAI;AAEhD,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqD;AACnD,QAAM,QAAQA,uBAAAA,uBAA8C;AAAA,IAC1D,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,mBAAmB,YAAY,MAAM,EAAE,UAAU,UAAU,OAAO;AACvF,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,UAAA;AAAA,IACrD;AAAA,IACA,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MACX,cAAc,EAAE,UAAU,UAAU,MAAA,CAAO,IAC7C;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,UAAUC,MAAAA,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAClB,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC,MAAAA,SAA2C,CAAA,CAAE;AAC7F,QAAM,eAAeC,MAAAA;AAAAA,IACnB,CAAC,EAAE,UAAU,UAAU,gBAAuC;;AAC5D,YAAM,UACJ,eAAa,aAAQ,QAAQ,KAAK,CAAC,QAAQ,IAAI,aAAa,QAAQ,MAAvD,mBAA0D;AACzE,0BAAoB,CAAC,YAAY;AAC/B,cAAM,OAAO,EAAE,GAAG,QAAA;AAClB,YAAI,QAAS,MAAK,QAAQ,IAAI;AAAA,YACzB,QAAO,KAAK,QAAQ;AACzB,eAAO;AAAA,MACT,CAAC;AACD,UAAI,EAAE,UAAU,OAAO,SAAA,CAAU;AAAA,IACnC;AAAA,IACA,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;AAEA,SAAS,aAAa,KAAmB,SAAsC;AAC7E,MAAI,CAAC,WAAW,CAAC,IAAI,UAAW,QAAO;AACvC,QAAM,QAAQ,KAAK,MAAM,IAAI,SAAS;AACtC,QAAM,YAAY,KAAK,MAAM,OAAO;AACpC,SAAO,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,SAAS,KAAK,QAAQ;AACzE;AAOO,SAAS,uBACd,MACA,WACA,mBAAqD,CAAA,GAChD;AACL,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,QAAI,aAAa,UAAa,aAAa,IAAI,SAAU,QAAO;AAChE,QAAI,aAAa,KAAK,iBAAiB,IAAI,QAAQ,CAAC,EAAG,QAAO;AAC9D,WAAO,EAAE,GAAG,KAAK,UAAU,SAAA;AAAA,EAC7B,CAAC;AACH;;;"}
1
+ {"version":3,"file":"use-thread-read-state.cjs","sources":["../../src/threads/use-thread-read-state.ts"],"sourcesContent":["/**\n * Mark a session read or unread for the viewer — the inbox's \"Mark read\" and\n * the session list's read toggle: `useThreadFieldOverride` over\n * `POST /api/conversations/threads/read-state` (see that module for the\n * optimistic-override, rollback, serialization and identity-scoping\n * contract).\n *\n * The override matters more here than for the pin: the read-state route\n * publishes no conversation-index update, so a pushed index entry keeps the\n * `is_unread` it had at the index's last rebuild. The override holds the\n * viewer's answer over that stale push until the sources agree.\n */\nimport { useCallback, useRef, useState } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { setThreadReadState } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport { type ThreadFieldTarget, useThreadFieldOverride } from './use-thread-field-override';\n\nexport interface ThreadReadStateTarget {\n threadId: string;\n isUnread: boolean;\n /**\n * The row's last update the receipt covers (its `updatedAt` when the person\n * acted). Activity newer than that ends the override, so a session read\n * here turns unread again when it gets a new message — even in a list the\n * provider's own page does not hold. Without it the provider's page row's\n * value is used when it has one.\n */\n updatedAt?: string;\n}\n\n/** The fields the override layer reads on a list row. */\nexport interface ReadStateRow {\n threadId: string;\n isUnread: boolean;\n updatedAt?: string;\n}\n\nexport interface UseThreadReadStateOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key. */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /** The rows as the list sources report them, BEFORE overrides. */\n rows: readonly ReadStateRow[];\n /** Write the server's answer into the list caches. */\n onServerTruth?: (result: ThreadReadStateTarget) => void;\n}\n\nexport interface ThreadReadStateToggle {\n /** Optimistic, then server-confirmed, values layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, boolean>>;\n /** The `updatedAt` each override covers; a row updated after it shows its own value. */\n coveredUpdatedAt: Readonly<Record<string, string>>;\n setReadState: (target: ThreadReadStateTarget) => void;\n pendingThreadIds: ReadonlySet<string>;\n /**\n * Always `true`: every agora the SDK supports has the read-state route, so\n * a 404 is a session that no longer exists, never a missing route.\n */\n isAvailable: boolean;\n}\n\nconst READ_STATE_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/read-state route; sessions cannot be marked read from here.';\n\n/** The route predates every agora the SDK supports; a rejection is per thread, never \"no route\". */\nconst isReadStateUnavailableError = (): boolean => false;\n\nconst readUnread = (row: ReadStateRow): boolean => row.isUnread;\n\nexport function useThreadReadState({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadReadStateOptions): ThreadReadStateToggle {\n const field = useThreadFieldOverride<boolean, ReadStateRow>({\n field: 'read-state',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readUnread,\n write: async (auth, { threadId, value }) => {\n const result = await setThreadReadState(backendUrl, auth, { threadId, isUnread: value });\n return { threadId: result.thread_id, value: result.is_unread };\n },\n isUnavailableError: isReadStateUnavailableError,\n unavailableWarning: READ_STATE_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<boolean>) =>\n onServerTruth({ threadId, isUnread: value })\n : undefined,\n });\n const set = field.set;\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const [coveredUpdatedAt, setCoveredUpdatedAt] = useState<Readonly<Record<string, string>>>({});\n const setReadState = useCallback(\n ({ threadId, isUnread, updatedAt }: ThreadReadStateTarget) => {\n const covered =\n updatedAt ?? rowsRef.current.find((row) => row.threadId === threadId)?.updatedAt;\n setCoveredUpdatedAt((current) => {\n const next = { ...current };\n if (covered) next[threadId] = covered;\n else delete next[threadId];\n return next;\n });\n set({ threadId, value: isUnread });\n },\n [set],\n );\n return {\n overrides: field.overrides,\n coveredUpdatedAt,\n setReadState,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\nfunction updatedAfter(row: ReadStateRow, covered: string | undefined): boolean {\n if (!covered || !row.updatedAt) return false;\n const rowAt = Date.parse(row.updatedAt);\n const coveredAt = Date.parse(covered);\n return Number.isFinite(rowAt) && Number.isFinite(coveredAt) && rowAt > coveredAt;\n}\n\n/**\n * Every row with its read-state override applied — except a row updated\n * after the activity the override covers, which shows its own value (marking\n * read never moves `updatedAt`, so a newer one is new activity).\n */\nexport function withReadStateOverrides<T extends ReadStateRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, boolean>>,\n coveredUpdatedAt: Readonly<Record<string, string>> = {},\n): T[] {\n return rows.map((row) => {\n const override = overrides[row.threadId];\n if (override === undefined || override === row.isUnread) return row;\n if (updatedAfter(row, coveredUpdatedAt[row.threadId])) return row;\n return { ...row, isUnread: override };\n });\n}\n"],"names":["useThreadFieldOverride","setThreadReadState","useRef","useState","useCallback"],"mappings":";;;;;AAgEA,MAAM,iCACJ;AAGF,MAAM,8BAA8B,MAAe;AAEnD,MAAM,aAAa,CAAC,QAA+B,IAAI;AAEhD,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqD;AACnD,QAAM,QAAQA,uBAAAA,uBAA8C;AAAA,IAC1D,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,mBAAmB,YAAY,MAAM,EAAE,UAAU,UAAU,OAAO;AACvF,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,UAAA;AAAA,IACrD;AAAA,IACA,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MACX,cAAc,EAAE,UAAU,UAAU,MAAA,CAAO,IAC7C;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,UAAUC,WAAAA,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAClB,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC,WAAAA,SAA2C,CAAA,CAAE;AAC7F,QAAM,eAAeC,WAAAA;AAAAA,IACnB,CAAC,EAAE,UAAU,UAAU,gBAAuC;;AAC5D,YAAM,UACJ,eAAa,aAAQ,QAAQ,KAAK,CAAC,QAAQ,IAAI,aAAa,QAAQ,MAAvD,mBAA0D;AACzE,0BAAoB,CAAC,YAAY;AAC/B,cAAM,OAAO,EAAE,GAAG,QAAA;AAClB,YAAI,QAAS,MAAK,QAAQ,IAAI;AAAA,YACzB,QAAO,KAAK,QAAQ;AACzB,eAAO;AAAA,MACT,CAAC;AACD,UAAI,EAAE,UAAU,OAAO,SAAA,CAAU;AAAA,IACnC;AAAA,IACA,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;AAEA,SAAS,aAAa,KAAmB,SAAsC;AAC7E,MAAI,CAAC,WAAW,CAAC,IAAI,UAAW,QAAO;AACvC,QAAM,QAAQ,KAAK,MAAM,IAAI,SAAS;AACtC,QAAM,YAAY,KAAK,MAAM,OAAO;AACpC,SAAO,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,SAAS,KAAK,QAAQ;AACzE;AAOO,SAAS,uBACd,MACA,WACA,mBAAqD,CAAA,GAChD;AACL,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,QAAI,aAAa,UAAa,aAAa,IAAI,SAAU,QAAO;AAChE,QAAI,aAAa,KAAK,iBAAiB,IAAI,QAAQ,CAAC,EAAG,QAAO;AAC9D,WAAO,EAAE,GAAG,KAAK,UAAU,SAAA;AAAA,EAC7B,CAAC;AACH;;;"}
@@ -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 api = require("./api.cjs");
5
5
  const useThreadFieldOverride = require("./use-thread-field-override.cjs");
6
6
  const RENAME_UNAVAILABLE_WARNING = "[AthenaSDK] This backend has no POST /api/conversations/threads/rename route yet; sessions cannot be renamed from here until it deploys.";
@@ -28,7 +28,7 @@ function useThreadRename({
28
28
  onServerTruth: onServerTruth ? ({ threadId, value }) => onServerTruth({ threadId, title: value }) : void 0
29
29
  });
30
30
  const set = field.set;
31
- const rename = react.useCallback(
31
+ const rename = require$$0.useCallback(
32
32
  ({ threadId, title }) => set({ threadId, value: title }),
33
33
  [set]
34
34
  );
@@ -1 +1 @@
1
- {"version":3,"file":"use-thread-rename.cjs","sources":["../../src/threads/use-thread-rename.ts"],"sourcesContent":["/**\n * The inline rename behind `SessionList`: `useThreadFieldOverride` over\n * `POST /api/conversations/threads/rename` (see that module for the\n * optimistic-override, rollback, serialization and identity-scoping\n * contract). The row shows the new title on commit; the server's stored\n * title (trimmed) is written back, and a failure restores the previous one.\n * A 404 / 405 marks the rename unavailable — the backend predates the route\n * — so the list withdraws the action instead of failing on every commit.\n */\nimport { useCallback } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { isThreadRenameUnavailableError, renameThread } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport { type ThreadFieldTarget, useThreadFieldOverride } from './use-thread-field-override';\n\nexport interface ThreadRenameTarget {\n threadId: string;\n /** The new title; the caller trims it (the server trims again and bounds it to 1–200 characters). */\n title: string;\n}\n\n/** The two fields the override layer reads and writes on a list row. */\nexport interface TitleRow {\n threadId: string;\n title: string;\n}\n\nexport interface UseThreadRenameOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key (as the read-state mutation keys). */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /**\n * The rows as the list sources currently report them, BEFORE overrides. An\n * override is dropped once its row reports the same title.\n */\n rows: readonly TitleRow[];\n /** Write the server's answer into the list caches (`patchConversation`). */\n onServerTruth?: (result: ThreadRenameTarget) => void;\n}\n\nexport interface ThreadRename {\n /** Optimistic, then server-confirmed, titles layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, string>>;\n /**\n * Rename a thread. The row shows the title at once; while that thread's\n * write is in flight the call only records the desired title (see the\n * field-override module doc).\n */\n rename: (target: ThreadRenameTarget) => void;\n /** True while any rename is in flight. */\n isPending: boolean;\n /** The threads whose rename is in flight — the row's editor stays closed for these. */\n pendingThreadIds: ReadonlySet<string>;\n /**\n * `false` once the backend answered 404 / 405: the route is not deployed\n * there, and the list offers no rename action.\n */\n isAvailable: boolean;\n}\n\nconst RENAME_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/rename route yet; sessions cannot be renamed from here until it deploys.';\n\nconst readTitle = (row: TitleRow): string => row.title;\n\nexport function useThreadRename({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadRenameOptions): ThreadRename {\n const field = useThreadFieldOverride<string, TitleRow>({\n field: 'rename',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readTitle,\n write: async (auth, { threadId, value }) => {\n const result = await renameThread(backendUrl, auth, { threadId, title: value });\n return { threadId: result.thread_id, value: result.title };\n },\n isUnavailableError: isThreadRenameUnavailableError,\n unavailableWarning: RENAME_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<string>) => onServerTruth({ threadId, title: value })\n : undefined,\n });\n const set = field.set;\n const rename = useCallback(\n ({ threadId, title }: ThreadRenameTarget) => set({ threadId, value: title }),\n [set],\n );\n return {\n overrides: field.overrides,\n rename,\n isPending: field.isPending,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\n/** The row with its title override applied, or the row itself when it has none. */\nexport function withTitleOverride<T extends TitleRow>(\n row: T,\n overrides: Readonly<Record<string, string>>,\n): T {\n const override = overrides[row.threadId];\n return override === undefined || override === row.title ? row : { ...row, title: override };\n}\n\n/** Every row with its title override applied. */\nexport function withTitleOverrides<T extends TitleRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, string>>,\n): T[] {\n return rows.map((row) => withTitleOverride(row, overrides));\n}\n"],"names":["useThreadFieldOverride","renameThread","isThreadRenameUnavailableError","useCallback"],"mappings":";;;;;AA8DA,MAAM,6BACJ;AAEF,MAAM,YAAY,CAAC,QAA0B,IAAI;AAE1C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,QAAQA,uBAAAA,uBAAyC;AAAA,IACrD,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,aAAa,YAAY,MAAM,EAAE,UAAU,OAAO,OAAO;AAC9E,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,MAAA;AAAA,IACrD;AAAA,IACA,oBAAoBC,IAAAA;AAAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MAAuC,cAAc,EAAE,UAAU,OAAO,MAAA,CAAO,IAC5F;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,SAASC,MAAAA;AAAAA,IACb,CAAC,EAAE,UAAU,YAAgC,IAAI,EAAE,UAAU,OAAO,OAAO;AAAA,IAC3E,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;AAGO,SAAS,kBACd,KACA,WACG;AACH,QAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,SAAO,aAAa,UAAa,aAAa,IAAI,QAAQ,MAAM,EAAE,GAAG,KAAK,OAAO,SAAA;AACnF;AAGO,SAAS,mBACd,MACA,WACK;AACL,SAAO,KAAK,IAAI,CAAC,QAAQ,kBAAkB,KAAK,SAAS,CAAC;AAC5D;;;;"}
1
+ {"version":3,"file":"use-thread-rename.cjs","sources":["../../src/threads/use-thread-rename.ts"],"sourcesContent":["/**\n * The inline rename behind `SessionList`: `useThreadFieldOverride` over\n * `POST /api/conversations/threads/rename` (see that module for the\n * optimistic-override, rollback, serialization and identity-scoping\n * contract). The row shows the new title on commit; the server's stored\n * title (trimmed) is written back, and a failure restores the previous one.\n * A 404 / 405 marks the rename unavailable — the backend predates the route\n * — so the list withdraws the action instead of failing on every commit.\n */\nimport { useCallback } from 'react';\nimport type { CredentialResolver } from '../runtime/credential-renewal';\nimport { isThreadRenameUnavailableError, renameThread } from './api';\nimport type { RestConversationAuth } from './use-rest-conversation-history';\nimport { type ThreadFieldTarget, useThreadFieldOverride } from './use-thread-field-override';\n\nexport interface ThreadRenameTarget {\n threadId: string;\n /** The new title; the caller trims it (the server trims again and bounds it to 1–200 characters). */\n title: string;\n}\n\n/** The two fields the override layer reads and writes on a list row. */\nexport interface TitleRow {\n threadId: string;\n title: string;\n}\n\nexport interface UseThreadRenameOptions {\n backendUrl: string;\n /** Non-secret identity in the mutation key (as the read-state mutation keys). */\n principalId: string;\n /** Resolved per request; called with `{ force: true }` when the host refuses the token. */\n getAuth: CredentialResolver<RestConversationAuth>;\n /**\n * The rows as the list sources currently report them, BEFORE overrides. An\n * override is dropped once its row reports the same title.\n */\n rows: readonly TitleRow[];\n /** Write the server's answer into the list caches (`patchConversation`). */\n onServerTruth?: (result: ThreadRenameTarget) => void;\n}\n\nexport interface ThreadRename {\n /** Optimistic, then server-confirmed, titles layered over the list sources, keyed by thread id. */\n overrides: Readonly<Record<string, string>>;\n /**\n * Rename a thread. The row shows the title at once; while that thread's\n * write is in flight the call only records the desired title (see the\n * field-override module doc).\n */\n rename: (target: ThreadRenameTarget) => void;\n /** True while any rename is in flight. */\n isPending: boolean;\n /** The threads whose rename is in flight — the row's editor stays closed for these. */\n pendingThreadIds: ReadonlySet<string>;\n /**\n * `false` once the backend answered 404 / 405: the route is not deployed\n * there, and the list offers no rename action.\n */\n isAvailable: boolean;\n}\n\nconst RENAME_UNAVAILABLE_WARNING =\n '[AthenaSDK] This backend has no POST /api/conversations/threads/rename route yet; sessions cannot be renamed from here until it deploys.';\n\nconst readTitle = (row: TitleRow): string => row.title;\n\nexport function useThreadRename({\n backendUrl,\n principalId,\n getAuth,\n rows,\n onServerTruth,\n}: UseThreadRenameOptions): ThreadRename {\n const field = useThreadFieldOverride<string, TitleRow>({\n field: 'rename',\n backendUrl,\n principalId,\n getAuth,\n rows,\n readRow: readTitle,\n write: async (auth, { threadId, value }) => {\n const result = await renameThread(backendUrl, auth, { threadId, title: value });\n return { threadId: result.thread_id, value: result.title };\n },\n isUnavailableError: isThreadRenameUnavailableError,\n unavailableWarning: RENAME_UNAVAILABLE_WARNING,\n onServerTruth: onServerTruth\n ? ({ threadId, value }: ThreadFieldTarget<string>) => onServerTruth({ threadId, title: value })\n : undefined,\n });\n const set = field.set;\n const rename = useCallback(\n ({ threadId, title }: ThreadRenameTarget) => set({ threadId, value: title }),\n [set],\n );\n return {\n overrides: field.overrides,\n rename,\n isPending: field.isPending,\n pendingThreadIds: field.pendingThreadIds,\n isAvailable: field.isAvailable,\n };\n}\n\n/** The row with its title override applied, or the row itself when it has none. */\nexport function withTitleOverride<T extends TitleRow>(\n row: T,\n overrides: Readonly<Record<string, string>>,\n): T {\n const override = overrides[row.threadId];\n return override === undefined || override === row.title ? row : { ...row, title: override };\n}\n\n/** Every row with its title override applied. */\nexport function withTitleOverrides<T extends TitleRow>(\n rows: readonly T[],\n overrides: Readonly<Record<string, string>>,\n): T[] {\n return rows.map((row) => withTitleOverride(row, overrides));\n}\n"],"names":["useThreadFieldOverride","renameThread","isThreadRenameUnavailableError","useCallback"],"mappings":";;;;;AA8DA,MAAM,6BACJ;AAEF,MAAM,YAAY,CAAC,QAA0B,IAAI;AAE1C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,QAAQA,uBAAAA,uBAAyC;AAAA,IACrD,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO,OAAO,MAAM,EAAE,UAAU,YAAY;AAC1C,YAAM,SAAS,MAAMC,IAAAA,aAAa,YAAY,MAAM,EAAE,UAAU,OAAO,OAAO;AAC9E,aAAO,EAAE,UAAU,OAAO,WAAW,OAAO,OAAO,MAAA;AAAA,IACrD;AAAA,IACA,oBAAoBC,IAAAA;AAAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,gBACX,CAAC,EAAE,UAAU,MAAA,MAAuC,cAAc,EAAE,UAAU,OAAO,MAAA,CAAO,IAC5F;AAAA,EAAA,CACL;AACD,QAAM,MAAM,MAAM;AAClB,QAAM,SAASC,WAAAA;AAAAA,IACb,CAAC,EAAE,UAAU,YAAgC,IAAI,EAAE,UAAU,OAAO,OAAO;AAAA,IAC3E,CAAC,GAAG;AAAA,EAAA;AAEN,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;AAGO,SAAS,kBACd,KACA,WACG;AACH,QAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,SAAO,aAAa,UAAa,aAAa,IAAI,QAAQ,MAAM,EAAE,GAAG,KAAK,OAAO,SAAA;AACnF;AAGO,SAAS,mBACd,MACA,WACK;AACL,SAAO,KAAK,IAAI,CAAC,QAAQ,kBAAkB,KAAK,SAAS,CAAC;AAC5D;;;;"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const react = require("@assistant-ui/react");
4
- const react$1 = require("react");
4
+ const require$$0 = require("react");
5
5
  const statewireThreadList = require("./statewire-thread-list.cjs");
6
6
  function useAthenaThreadManager() {
7
7
  const list = statewireThreadList.useAthenaStatewireThreadList();
@@ -9,7 +9,7 @@ function useAthenaThreadManager() {
9
9
  var _a;
10
10
  return ((_a = s.optional.thread) == null ? void 0 : _a.isLoading) ?? false;
11
11
  });
12
- return react$1.useMemo(() => {
12
+ return require$$0.useMemo(() => {
13
13
  if (!list) return null;
14
14
  return {
15
15
  activeThreadId: list.isNewChat ? null : list.activeThreadId,
@@ -1 +1 @@
1
- {"version":3,"file":"useAthenaThreadManager.cjs","sources":["../../src/threads/useAthenaThreadManager.ts"],"sourcesContent":["/**\n * Public hook for managing thread state and navigation.\n *\n * Wraps the provider's thread-list state to provide a clean, Athena-branded\n * API for reading the active thread and switching between threads.\n *\n * Must be used inside `<AthenaProvider enableThreadList>`.\n */\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useMemo } from 'react';\nimport { useAthenaStatewireThreadList } from './statewire-thread-list';\n\nexport interface AthenaThreadManagerState {\n /** The backend thread ID of the currently active thread, or null while the\n * active chat is a never-started local chat the backend has not listed yet. */\n activeThreadId: string | null;\n /** Whether the thread list is still loading from the backend. */\n isListLoading: boolean;\n /** Whether the current thread is loading its message history (e.g. after a thread switch). */\n isThreadLoading: boolean;\n /** Switch the chat to a different thread by its backend thread ID. */\n switchToThread: (threadId: string) => Promise<void>;\n /** Create and switch to a new empty thread. */\n switchToNewThread: () => Promise<void>;\n}\n\n/**\n * Hook for managing thread navigation.\n *\n * Returns `null` when called outside `<AthenaProvider enableThreadList>`.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const threads = useAthenaThreadManager();\n * if (!threads) return null;\n *\n * return (\n * <div>\n * <p>Active: {threads.activeThreadId}</p>\n * <button onClick={() => threads.switchToNewThread()}>New Chat</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAthenaThreadManager(): AthenaThreadManagerState | null {\n const list = useAthenaStatewireThreadList();\n const isThreadLoading = useAuiState((s) => s.optional.thread?.isLoading ?? false);\n\n return useMemo<AthenaThreadManagerState | null>(() => {\n if (!list) return null;\n return {\n activeThreadId: list.isNewChat ? null : list.activeThreadId,\n isListLoading: list.isLoading,\n isThreadLoading,\n switchToThread: async (threadId: string) => list.selectThread(threadId),\n switchToNewThread: async () => list.newThread(),\n };\n }, [list, isThreadLoading]);\n}\n"],"names":["useAthenaStatewireThreadList","useAuiState","useMemo"],"mappings":";;;;;AA+CO,SAAS,yBAA0D;AACxE,QAAM,OAAOA,oBAAAA,6BAAA;AACb,QAAM,kBAAkBC,MAAAA,YAAY,CAAC,MAAA;;AAAM,oBAAE,SAAS,WAAX,mBAAmB,cAAa;AAAA,GAAK;AAEhF,SAAOC,QAAAA,QAAyC,MAAM;AACpD,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO;AAAA,MACL,gBAAgB,KAAK,YAAY,OAAO,KAAK;AAAA,MAC7C,eAAe,KAAK;AAAA,MACpB;AAAA,MACA,gBAAgB,OAAO,aAAqB,KAAK,aAAa,QAAQ;AAAA,MACtE,mBAAmB,YAAY,KAAK,UAAA;AAAA,IAAU;AAAA,EAElD,GAAG,CAAC,MAAM,eAAe,CAAC;AAC5B;;"}
1
+ {"version":3,"file":"useAthenaThreadManager.cjs","sources":["../../src/threads/useAthenaThreadManager.ts"],"sourcesContent":["/**\n * Public hook for managing thread state and navigation.\n *\n * Wraps the provider's thread-list state to provide a clean, Athena-branded\n * API for reading the active thread and switching between threads.\n *\n * Must be used inside `<AthenaProvider enableThreadList>`.\n */\n\nimport { useAuiState } from '@assistant-ui/react';\nimport { useMemo } from 'react';\nimport { useAthenaStatewireThreadList } from './statewire-thread-list';\n\nexport interface AthenaThreadManagerState {\n /** The backend thread ID of the currently active thread, or null while the\n * active chat is a never-started local chat the backend has not listed yet. */\n activeThreadId: string | null;\n /** Whether the thread list is still loading from the backend. */\n isListLoading: boolean;\n /** Whether the current thread is loading its message history (e.g. after a thread switch). */\n isThreadLoading: boolean;\n /** Switch the chat to a different thread by its backend thread ID. */\n switchToThread: (threadId: string) => Promise<void>;\n /** Create and switch to a new empty thread. */\n switchToNewThread: () => Promise<void>;\n}\n\n/**\n * Hook for managing thread navigation.\n *\n * Returns `null` when called outside `<AthenaProvider enableThreadList>`.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const threads = useAthenaThreadManager();\n * if (!threads) return null;\n *\n * return (\n * <div>\n * <p>Active: {threads.activeThreadId}</p>\n * <button onClick={() => threads.switchToNewThread()}>New Chat</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAthenaThreadManager(): AthenaThreadManagerState | null {\n const list = useAthenaStatewireThreadList();\n const isThreadLoading = useAuiState((s) => s.optional.thread?.isLoading ?? false);\n\n return useMemo<AthenaThreadManagerState | null>(() => {\n if (!list) return null;\n return {\n activeThreadId: list.isNewChat ? null : list.activeThreadId,\n isListLoading: list.isLoading,\n isThreadLoading,\n switchToThread: async (threadId: string) => list.selectThread(threadId),\n switchToNewThread: async () => list.newThread(),\n };\n }, [list, isThreadLoading]);\n}\n"],"names":["useAthenaStatewireThreadList","useAuiState","useMemo"],"mappings":";;;;;AA+CO,SAAS,yBAA0D;AACxE,QAAM,OAAOA,oBAAAA,6BAAA;AACb,QAAM,kBAAkBC,MAAAA,YAAY,CAAC,MAAA;;AAAM,oBAAE,SAAS,WAAX,mBAAmB,cAAa;AAAA,GAAK;AAEhF,SAAOC,WAAAA,QAAyC,MAAM;AACpD,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO;AAAA,MACL,gBAAgB,KAAK,YAAY,OAAO,KAAK;AAAA,MAC7C,eAAe,KAAK;AAAA,MACpB;AAAA,MACA,gBAAgB,OAAO,aAAqB,KAAK,aAAa,QAAQ;AAAA,MACtE,mBAAmB,YAAY,KAAK,UAAA;AAAA,IAAU;AAAA,EAElD,GAAG,CAAC,MAAM,eAAe,CAAC;AAC5B;;"}
@@ -2,13 +2,13 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("@assistant-ui/react");
5
- const react$1 = require("react");
5
+ const require$$0 = require("react");
6
6
  const toolNames = require("../agent-runtime/src/tool-names.cjs");
7
- const NestedPtcComponentsContext = react$1.createContext(null);
7
+ const NestedPtcComponentsContext = require$$0.createContext(null);
8
8
  const NestedPtcComponentsProvider = ({ components, children }) => /* @__PURE__ */ jsxRuntime.jsx(NestedPtcComponentsContext.Provider, { value: components, children });
9
9
  const useNestedPtcComponents = (fallback) => {
10
- const components = react$1.useContext(NestedPtcComponentsContext);
11
- return react$1.useMemo(() => {
10
+ const components = require$$0.useContext(NestedPtcComponentsContext);
11
+ return require$$0.useMemo(() => {
12
12
  const standardComponents = components && "ChainOfThought" in components && components.ChainOfThought ? void 0 : components;
13
13
  return {
14
14
  ...standardComponents ?? {},
@@ -27,9 +27,9 @@ const NestedPtcMessages = ({
27
27
  const isSubagentLane = react.useAuiState(
28
28
  (s) => s.part.type === "tool-call" && s.part.toolName === toolNames.TASK_TOOL_NAME
29
29
  );
30
- const propsRef = react$1.useRef({ components, messageClassName });
30
+ const propsRef = require$$0.useRef({ components, messageClassName });
31
31
  propsRef.current = { components, messageClassName };
32
- const messageComponents = react$1.useMemo(() => {
32
+ const messageComponents = require$$0.useMemo(() => {
33
33
  const NestedMessage = () => {
34
34
  const { components: components2, messageClassName: messageClassName2 } = propsRef.current;
35
35
  const parts = /* @__PURE__ */ jsxRuntime.jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"NestedPtcMessages.cjs","sources":["../../src/tools/NestedPtcMessages.tsx"],"sourcesContent":["\"use client\";\n\nimport { MessagePartPrimitive, MessagePrimitive, useAuiState } from \"@assistant-ui/react\";\nimport { TASK_TOOL_NAME } from \"@athenaintel/agent-runtime\";\nimport {\n createContext,\n useContext,\n useMemo,\n useRef,\n type ComponentProps,\n type FC,\n type PropsWithChildren,\n} from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\n\ntype PartsComponents = ComponentProps<typeof MessagePrimitive.Parts>[\"components\"];\ntype StandardPartsComponents = Extract<\n NonNullable<PartsComponents>,\n { ChainOfThought?: undefined }\n>;\n\nconst NestedPtcComponentsContext = createContext<PartsComponents | null>(null);\n\nexport const NestedPtcComponentsProvider: FC<\n PropsWithChildren<{ components: PartsComponents }>\n> = ({ components, children }) => (\n <NestedPtcComponentsContext.Provider value={components}>\n {children}\n </NestedPtcComponentsContext.Provider>\n);\n\nexport const useNestedPtcComponents = (\n fallback: ToolCallMessagePartComponent\n): PartsComponents => {\n const components = useContext(NestedPtcComponentsContext);\n\n return useMemo(() => {\n const standardComponents =\n components && \"ChainOfThought\" in components && components.ChainOfThought\n ? undefined\n : (components as StandardPartsComponents | null);\n\n return {\n ...(standardComponents ?? {}),\n tools: {\n ...(standardComponents?.tools ?? {}),\n Fallback: fallback,\n },\n } satisfies StandardPartsComponents;\n }, [components, fallback]);\n};\n\nexport interface NestedPtcMessagesProps {\n components: PartsComponents;\n messageClassName?: string;\n}\n\nconst EmptyComponent: FC = () => null;\n\n/**\n * A tool call's nested messages (a programmatic-tool-calling execution's\n * sub-calls), rendered under the tool card with the parent's renderers.\n *\n * Except a `task` call's: those are its subagent's lane, which the subagent\n * card (`SubagentTaskToolUI`) shows and pages. A generic card or a host's own\n * `task` UI wrapped with these would show a second, unpaged copy (a cut lane\n * holds only its newest steps), so it renders nothing for them.\n */\nexport const NestedPtcMessages: FC<NestedPtcMessagesProps> = ({\n components,\n messageClassName,\n}) => {\n const isSubagentLane = useAuiState(\n (s) => s.part.type === \"tool-call\" && s.part.toolName === TASK_TOOL_NAME,\n );\n const propsRef = useRef({ components, messageClassName });\n propsRef.current = { components, messageClassName };\n\n const messageComponents = useMemo(() => {\n const NestedMessage: FC = () => {\n const { components, messageClassName } = propsRef.current;\n const parts = (\n <MessagePrimitive.Parts\n components={{ Empty: EmptyComponent, ...components }}\n />\n );\n return messageClassName ? (\n <div className={messageClassName}>{parts}</div>\n ) : (\n parts\n );\n };\n\n return { Message: NestedMessage };\n }, []);\n\n if (isSubagentLane) return null;\n return <MessagePartPrimitive.Messages components={messageComponents} />;\n};\n"],"names":["createContext","jsx","useContext","useMemo","useAuiState","TASK_TOOL_NAME","useRef","components","messageClassName","MessagePrimitive","MessagePartPrimitive"],"mappings":";;;;;;AAqBA,MAAM,6BAA6BA,QAAAA,cAAsC,IAAI;AAEtE,MAAM,8BAET,CAAC,EAAE,YAAY,eACjBC,2BAAAA,IAAC,2BAA2B,UAA3B,EAAoC,OAAO,YACzC,SAAA,CACH;AAGK,MAAM,yBAAyB,CACpC,aACoB;AACpB,QAAM,aAAaC,QAAAA,WAAW,0BAA0B;AAExD,SAAOC,QAAAA,QAAQ,MAAM;AACnB,UAAM,qBACJ,cAAc,oBAAoB,cAAc,WAAW,iBACvD,SACC;AAEP,WAAO;AAAA,MACL,GAAI,sBAAsB,CAAA;AAAA,MAC1B,OAAO;AAAA,QACL,IAAI,yDAAoB,UAAS,CAAA;AAAA,QACjC,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,EAEJ,GAAG,CAAC,YAAY,QAAQ,CAAC;AAC3B;AAOA,MAAM,iBAAqB,MAAM;AAW1B,MAAM,oBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,iBAAiBC,MAAAA;AAAAA,IACrB,CAAC,MAAM,EAAE,KAAK,SAAS,eAAe,EAAE,KAAK,aAAaC,UAAAA;AAAAA,EAAA;AAE5D,QAAM,WAAWC,QAAAA,OAAO,EAAE,YAAY,kBAAkB;AACxD,WAAS,UAAU,EAAE,YAAY,iBAAA;AAEjC,QAAM,oBAAoBH,QAAAA,QAAQ,MAAM;AACtC,UAAM,gBAAoB,MAAM;AAC9B,YAAM,EAAE,YAAAI,aAAY,kBAAAC,kBAAAA,IAAqB,SAAS;AAClD,YAAM,QACJP,2BAAAA;AAAAA,QAACQ,MAAAA,iBAAiB;AAAA,QAAjB;AAAA,UACC,YAAY,EAAE,OAAO,gBAAgB,GAAGF,YAAAA;AAAAA,QAAW;AAAA,MAAA;AAGvD,aAAOC,oBACLP,+BAAC,OAAA,EAAI,WAAWO,mBAAmB,iBAAM,IAEzC;AAAA,IAEJ;AAEA,WAAO,EAAE,SAAS,cAAA;AAAA,EACpB,GAAG,CAAA,CAAE;AAEL,MAAI,eAAgB,QAAO;AAC3B,SAAOP,2BAAAA,IAACS,MAAAA,qBAAqB,UAArB,EAA8B,YAAY,kBAAA,CAAmB;AACvE;;;;"}
1
+ {"version":3,"file":"NestedPtcMessages.cjs","sources":["../../src/tools/NestedPtcMessages.tsx"],"sourcesContent":["\"use client\";\n\nimport { MessagePartPrimitive, MessagePrimitive, useAuiState } from \"@assistant-ui/react\";\nimport { TASK_TOOL_NAME } from \"@athenaintel/agent-runtime\";\nimport {\n createContext,\n useContext,\n useMemo,\n useRef,\n type ComponentProps,\n type FC,\n type PropsWithChildren,\n} from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\n\ntype PartsComponents = ComponentProps<typeof MessagePrimitive.Parts>[\"components\"];\ntype StandardPartsComponents = Extract<\n NonNullable<PartsComponents>,\n { ChainOfThought?: undefined }\n>;\n\nconst NestedPtcComponentsContext = createContext<PartsComponents | null>(null);\n\nexport const NestedPtcComponentsProvider: FC<\n PropsWithChildren<{ components: PartsComponents }>\n> = ({ components, children }) => (\n <NestedPtcComponentsContext.Provider value={components}>\n {children}\n </NestedPtcComponentsContext.Provider>\n);\n\nexport const useNestedPtcComponents = (\n fallback: ToolCallMessagePartComponent\n): PartsComponents => {\n const components = useContext(NestedPtcComponentsContext);\n\n return useMemo(() => {\n const standardComponents =\n components && \"ChainOfThought\" in components && components.ChainOfThought\n ? undefined\n : (components as StandardPartsComponents | null);\n\n return {\n ...(standardComponents ?? {}),\n tools: {\n ...(standardComponents?.tools ?? {}),\n Fallback: fallback,\n },\n } satisfies StandardPartsComponents;\n }, [components, fallback]);\n};\n\nexport interface NestedPtcMessagesProps {\n components: PartsComponents;\n messageClassName?: string;\n}\n\nconst EmptyComponent: FC = () => null;\n\n/**\n * A tool call's nested messages (a programmatic-tool-calling execution's\n * sub-calls), rendered under the tool card with the parent's renderers.\n *\n * Except a `task` call's: those are its subagent's lane, which the subagent\n * card (`SubagentTaskToolUI`) shows and pages. A generic card or a host's own\n * `task` UI wrapped with these would show a second, unpaged copy (a cut lane\n * holds only its newest steps), so it renders nothing for them.\n */\nexport const NestedPtcMessages: FC<NestedPtcMessagesProps> = ({\n components,\n messageClassName,\n}) => {\n const isSubagentLane = useAuiState(\n (s) => s.part.type === \"tool-call\" && s.part.toolName === TASK_TOOL_NAME,\n );\n const propsRef = useRef({ components, messageClassName });\n propsRef.current = { components, messageClassName };\n\n const messageComponents = useMemo(() => {\n const NestedMessage: FC = () => {\n const { components, messageClassName } = propsRef.current;\n const parts = (\n <MessagePrimitive.Parts\n components={{ Empty: EmptyComponent, ...components }}\n />\n );\n return messageClassName ? (\n <div className={messageClassName}>{parts}</div>\n ) : (\n parts\n );\n };\n\n return { Message: NestedMessage };\n }, []);\n\n if (isSubagentLane) return null;\n return <MessagePartPrimitive.Messages components={messageComponents} />;\n};\n"],"names":["createContext","jsx","useContext","useMemo","useAuiState","TASK_TOOL_NAME","useRef","components","messageClassName","MessagePrimitive","MessagePartPrimitive"],"mappings":";;;;;;AAqBA,MAAM,6BAA6BA,WAAAA,cAAsC,IAAI;AAEtE,MAAM,8BAET,CAAC,EAAE,YAAY,eACjBC,2BAAAA,IAAC,2BAA2B,UAA3B,EAAoC,OAAO,YACzC,SAAA,CACH;AAGK,MAAM,yBAAyB,CACpC,aACoB;AACpB,QAAM,aAAaC,WAAAA,WAAW,0BAA0B;AAExD,SAAOC,WAAAA,QAAQ,MAAM;AACnB,UAAM,qBACJ,cAAc,oBAAoB,cAAc,WAAW,iBACvD,SACC;AAEP,WAAO;AAAA,MACL,GAAI,sBAAsB,CAAA;AAAA,MAC1B,OAAO;AAAA,QACL,IAAI,yDAAoB,UAAS,CAAA;AAAA,QACjC,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,EAEJ,GAAG,CAAC,YAAY,QAAQ,CAAC;AAC3B;AAOA,MAAM,iBAAqB,MAAM;AAW1B,MAAM,oBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,iBAAiBC,MAAAA;AAAAA,IACrB,CAAC,MAAM,EAAE,KAAK,SAAS,eAAe,EAAE,KAAK,aAAaC,UAAAA;AAAAA,EAAA;AAE5D,QAAM,WAAWC,WAAAA,OAAO,EAAE,YAAY,kBAAkB;AACxD,WAAS,UAAU,EAAE,YAAY,iBAAA;AAEjC,QAAM,oBAAoBH,WAAAA,QAAQ,MAAM;AACtC,UAAM,gBAAoB,MAAM;AAC9B,YAAM,EAAE,YAAAI,aAAY,kBAAAC,kBAAAA,IAAqB,SAAS;AAClD,YAAM,QACJP,2BAAAA;AAAAA,QAACQ,MAAAA,iBAAiB;AAAA,QAAjB;AAAA,UACC,YAAY,EAAE,OAAO,gBAAgB,GAAGF,YAAAA;AAAAA,QAAW;AAAA,MAAA;AAGvD,aAAOC,oBACLP,+BAAC,OAAA,EAAI,WAAWO,mBAAmB,iBAAM,IAEzC;AAAA,IAEJ;AAEA,WAAO,EAAE,SAAS,cAAA;AAAA,EACpB,GAAG,CAAA,CAAE;AAEL,MAAI,eAAgB,QAAO;AAC3B,SAAOP,2BAAAA,IAACS,MAAAA,qBAAqB,UAArB,EAA8B,YAAY,kBAAA,CAAmB;AACvE;;;;"}
@@ -1,8 +1,8 @@
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");
5
- const react$1 = require("@tiptap/react");
4
+ const require$$0 = require("react");
5
+ const react = require("@tiptap/react");
6
6
  const StarterKit = require("@tiptap/starter-kit");
7
7
  const Link = require("@tiptap/extension-link");
8
8
  const tiptapMarkdown = require("tiptap-markdown");
@@ -40,7 +40,7 @@ const markdownPreviewExtensions = [
40
40
  })
41
41
  ];
42
42
  function MarkdownPreview({ content }) {
43
- const editor = react$1.useEditor({
43
+ const editor = react.useEditor({
44
44
  immediatelyRender: true,
45
45
  extensions: markdownPreviewExtensions,
46
46
  content,
@@ -51,16 +51,16 @@ function MarkdownPreview({ content }) {
51
51
  }
52
52
  }
53
53
  });
54
- return /* @__PURE__ */ jsxRuntime.jsx(react$1.EditorContent, { editor });
54
+ return /* @__PURE__ */ jsxRuntime.jsx(react.EditorContent, { editor });
55
55
  }
56
56
  const AppendDocumentToolUIImpl = ({
57
57
  args,
58
58
  result,
59
59
  status
60
60
  }) => {
61
- const [expanded, setExpanded] = react.useState(false);
61
+ const [expanded, setExpanded] = require$$0.useState(false);
62
62
  const typedArgs = args;
63
- const resultData = react.useMemo(() => {
63
+ const resultData = require$$0.useMemo(() => {
64
64
  if (!result) return null;
65
65
  if (typeof result === "string") return assetUtils.tryParseJson(result);
66
66
  if (typeof result === "object") {
@@ -142,7 +142,7 @@ const AppendDocumentToolUIImpl = ({
142
142
  ] })
143
143
  ] });
144
144
  };
145
- const AppendDocumentToolUI = react.memo(
145
+ const AppendDocumentToolUI = require$$0.memo(
146
146
  AppendDocumentToolUIImpl
147
147
  );
148
148
  AppendDocumentToolUI.displayName = "AppendDocumentToolUI";
@@ -1 +1 @@
1
- {"version":3,"file":"append-document-tool-ui.cjs","sources":["../../src/tools/append-document-tool-ui.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Link from \"@tiptap/extension-link\";\nimport { Markdown } from \"tiptap-markdown\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n FileTextIcon,\n LoaderIcon,\n AlertCircleIcon,\n NotebookPenIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { getAssetInfo, tryParseJson } from \"./asset-utils\";\n\nconst markdownPreviewExtensions = [\n StarterKit.configure({\n // Tiptap 3 StarterKit also bundles these; the preview registers its own link.\n link: false,\n underline: false,\n listKeymap: false,\n trailingNode: false,\n codeBlock: {\n HTMLAttributes: {\n class: \"rounded bg-muted p-2 font-mono text-[11px]\",\n },\n },\n }),\n Link.configure({\n openOnClick: true,\n HTMLAttributes: {\n class: \"text-blue-600 underline decoration-blue-300 hover:text-blue-700\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n Markdown.configure({\n html: false,\n tightLists: true,\n linkify: true,\n breaks: true,\n transformPastedText: false,\n transformCopiedText: false,\n }),\n];\n\nfunction MarkdownPreview({ content }: { content: string }) {\n const editor = useEditor({\n immediatelyRender: true,\n extensions: markdownPreviewExtensions,\n content,\n editable: false,\n editorProps: {\n attributes: {\n class: \"prose prose-sm max-w-none focus:outline-none\",\n },\n },\n });\n\n return <EditorContent editor={editor} />;\n}\n\nconst AppendDocumentToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n result,\n status,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const typedArgs = args as Record<string, unknown> | undefined;\n const resultData = useMemo(() => {\n if (!result) return null;\n if (typeof result === \"string\") return tryParseJson(result);\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\") return tryParseJson(obj.result) ?? obj;\n return obj;\n }\n return null;\n }, [result]);\n\n const assetId = (typedArgs?.asset_id as string) ?? \"\";\n const markdownText = ((typedArgs?.markdown_text ?? typedArgs?.markdownText) as string) ?? \"\";\n const asset = getAssetInfo(assetId);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const isError = status?.type === \"incomplete\";\n\n const wordCount = resultData?.word_count as number | undefined;\n const lineCount = resultData?.non_empty_line_count as number | undefined;\n const msg = resultData?.msg as string | undefined;\n const isSuccess = isComplete && (msg?.toLowerCase().includes(\"success\") ?? true);\n\n return (\n <div className=\"my-1.5 w-full overflow-hidden rounded-xl border bg-background shadow-sm\">\n {/* Header */}\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <div\n className={cn(\n \"flex size-9 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n isComplete && isSuccess && \"bg-emerald-50 text-emerald-600\",\n isComplete && !isSuccess && \"bg-amber-50 text-amber-600\",\n isError && \"bg-red-50 text-red-500\",\n !isRunning && !isComplete && !isError && \"bg-muted text-muted-foreground\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : isError ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <NotebookPenIcon className=\"size-4\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[13px] font-semibold\">\n {isRunning ? \"Writing to document...\" : \"Appended content to document\"}\n </span>\n {isComplete && isSuccess && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <FileTextIcon className=\"size-4\" />\n <span className=\"text-[12px] text-muted-foreground\">{asset.name}</span>\n </div>\n </div>\n\n {/* Stats badges */}\n {isComplete && (wordCount || lineCount) && (\n <div className=\"flex items-center gap-2\">\n {lineCount ? (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {lineCount} lines\n </span>\n ) : null}\n {wordCount ? (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {wordCount.toLocaleString()} words\n </span>\n ) : null}\n </div>\n )}\n </div>\n\n {/* Content preview */}\n {markdownText && (\n <div className=\"border-t\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex w-full items-center gap-2 px-4 py-2 text-left text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/50\"\n >\n <ChevronDownIcon\n className={cn(\n \"size-3.5 shrink-0 transition-transform duration-200\",\n !expanded && \"-rotate-90\",\n )}\n />\n <span>{expanded ? \"Hide content\" : \"Show content preview\"}</span>\n </button>\n\n {expanded && (\n <div className=\"max-h-72 overflow-y-auto border-t bg-muted/30 px-4 py-3\">\n <MarkdownPreview content={markdownText} />\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const AppendDocumentToolUI = memo(\n AppendDocumentToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\n\nAppendDocumentToolUI.displayName = \"AppendDocumentToolUI\";\n"],"names":["Markdown","useEditor","jsx","EditorContent","useState","useMemo","tryParseJson","getAssetInfo","jsxs","cn","LoaderIcon","AlertCircleIcon","NotebookPenIcon","CheckCircle2Icon","FileTextIcon","ChevronDownIcon","memo"],"mappings":"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"}
1
+ {"version":3,"file":"append-document-tool-ui.cjs","sources":["../../src/tools/append-document-tool-ui.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Link from \"@tiptap/extension-link\";\nimport { Markdown } from \"tiptap-markdown\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n FileTextIcon,\n LoaderIcon,\n AlertCircleIcon,\n NotebookPenIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { getAssetInfo, tryParseJson } from \"./asset-utils\";\n\nconst markdownPreviewExtensions = [\n StarterKit.configure({\n // Tiptap 3 StarterKit also bundles these; the preview registers its own link.\n link: false,\n underline: false,\n listKeymap: false,\n trailingNode: false,\n codeBlock: {\n HTMLAttributes: {\n class: \"rounded bg-muted p-2 font-mono text-[11px]\",\n },\n },\n }),\n Link.configure({\n openOnClick: true,\n HTMLAttributes: {\n class: \"text-blue-600 underline decoration-blue-300 hover:text-blue-700\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n },\n }),\n Markdown.configure({\n html: false,\n tightLists: true,\n linkify: true,\n breaks: true,\n transformPastedText: false,\n transformCopiedText: false,\n }),\n];\n\nfunction MarkdownPreview({ content }: { content: string }) {\n const editor = useEditor({\n immediatelyRender: true,\n extensions: markdownPreviewExtensions,\n content,\n editable: false,\n editorProps: {\n attributes: {\n class: \"prose prose-sm max-w-none focus:outline-none\",\n },\n },\n });\n\n return <EditorContent editor={editor} />;\n}\n\nconst AppendDocumentToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n result,\n status,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const typedArgs = args as Record<string, unknown> | undefined;\n const resultData = useMemo(() => {\n if (!result) return null;\n if (typeof result === \"string\") return tryParseJson(result);\n if (typeof result === \"object\") {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\") return tryParseJson(obj.result) ?? obj;\n return obj;\n }\n return null;\n }, [result]);\n\n const assetId = (typedArgs?.asset_id as string) ?? \"\";\n const markdownText = ((typedArgs?.markdown_text ?? typedArgs?.markdownText) as string) ?? \"\";\n const asset = getAssetInfo(assetId);\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const isError = status?.type === \"incomplete\";\n\n const wordCount = resultData?.word_count as number | undefined;\n const lineCount = resultData?.non_empty_line_count as number | undefined;\n const msg = resultData?.msg as string | undefined;\n const isSuccess = isComplete && (msg?.toLowerCase().includes(\"success\") ?? true);\n\n return (\n <div className=\"my-1.5 w-full overflow-hidden rounded-xl border bg-background shadow-sm\">\n {/* Header */}\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <div\n className={cn(\n \"flex size-9 shrink-0 items-center justify-center rounded-lg\",\n isRunning && \"bg-blue-50 text-blue-600\",\n isComplete && isSuccess && \"bg-emerald-50 text-emerald-600\",\n isComplete && !isSuccess && \"bg-amber-50 text-amber-600\",\n isError && \"bg-red-50 text-red-500\",\n !isRunning && !isComplete && !isError && \"bg-muted text-muted-foreground\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : isError ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <NotebookPenIcon className=\"size-4\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[13px] font-semibold\">\n {isRunning ? \"Writing to document...\" : \"Appended content to document\"}\n </span>\n {isComplete && isSuccess && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <FileTextIcon className=\"size-4\" />\n <span className=\"text-[12px] text-muted-foreground\">{asset.name}</span>\n </div>\n </div>\n\n {/* Stats badges */}\n {isComplete && (wordCount || lineCount) && (\n <div className=\"flex items-center gap-2\">\n {lineCount ? (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {lineCount} lines\n </span>\n ) : null}\n {wordCount ? (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground\">\n {wordCount.toLocaleString()} words\n </span>\n ) : null}\n </div>\n )}\n </div>\n\n {/* Content preview */}\n {markdownText && (\n <div className=\"border-t\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex w-full items-center gap-2 px-4 py-2 text-left text-[11px] font-medium text-muted-foreground transition-colors hover:bg-muted/50\"\n >\n <ChevronDownIcon\n className={cn(\n \"size-3.5 shrink-0 transition-transform duration-200\",\n !expanded && \"-rotate-90\",\n )}\n />\n <span>{expanded ? \"Hide content\" : \"Show content preview\"}</span>\n </button>\n\n {expanded && (\n <div className=\"max-h-72 overflow-y-auto border-t bg-muted/30 px-4 py-3\">\n <MarkdownPreview content={markdownText} />\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const AppendDocumentToolUI = memo(\n AppendDocumentToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\n\nAppendDocumentToolUI.displayName = \"AppendDocumentToolUI\";\n"],"names":["Markdown","useEditor","jsx","EditorContent","useState","useMemo","tryParseJson","getAssetInfo","jsxs","cn","LoaderIcon","AlertCircleIcon","NotebookPenIcon","CheckCircle2Icon","FileTextIcon","ChevronDownIcon","memo"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const lucideReact = require("lucide-react");
5
- const react = require("react");
5
+ const require$$0 = require("react");
6
6
  const primitives = require("./primitives.cjs");
7
7
  const toolSummary = require("./tool-summary.cjs");
8
8
  function rawDetails(result) {
@@ -50,7 +50,7 @@ function makeQuietFileToolUI(spec) {
50
50
  }
51
51
  );
52
52
  };
53
- const Quiet = react.memo(Impl);
53
+ const Quiet = require$$0.memo(Impl);
54
54
  Quiet.displayName = `QuietFileToolUI(${spec.detailsLabel})`;
55
55
  return Quiet;
56
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-tool-uis.cjs","sources":["../../src/tools/file-tool-uis.tsx"],"sourcesContent":["/**\n * Quiet tool cards for the deep-agent workspace-file tools.\n *\n * `read_file` / `ls` / `write_file` / `edit_file` / `glob` / `grep` are the\n * agent's own scratch-space plumbing. Without registry entries they fall\n * through to the generic fallback, which renders the raw args/result JSON —\n * scratch paths like `/large_tool_results/toolu_…` and screenfuls of encoded\n * text that read as garble to a non-technical user. Each becomes a one-line\n * card titled by the shared summary registry (\"Read config.ts\", \"Edited\n * upstream.py\" with \"+4 −1\", scratch paths in plain English); the raw output\n * stays available behind a collapsed \"Show details\" section. Hosts can still\n * override any of them via the `toolUIs` prop, which wins over the registry.\n */\nimport {\n FileTextIcon,\n FolderOpenIcon,\n PenLineIcon,\n ScanSearchIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport { memo } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport { ExpandableSection, normalizeResult, ToolCard, truncate } from \"./primitives\";\nimport { summarizeToolCall, type ToolSummaryState } from \"./tool-summary\";\n\nexport { friendlyWorkspacePath } from \"./tool-summary\";\n\nfunction rawDetails(result: unknown): string | null {\n if (result === null || result === undefined) return null;\n // File tools usually return plain text (file content, listings) — show it\n // as-is; only genuinely structured results get pretty-printed.\n if (typeof result === \"string\") {\n return result.trim() !== \"\" ? result : null;\n }\n if (typeof result === \"object\") {\n const inner = (result as Record<string, unknown>).result;\n if (typeof inner === \"string\") {\n return inner.trim() !== \"\" ? inner : null;\n }\n }\n const data = normalizeResult(result);\n if (data === null) return null;\n const text = JSON.stringify(data, null, 2);\n return text.trim() !== \"\" ? text : null;\n}\n\ninterface QuietFileToolSpec {\n icon: React.ElementType;\n detailsLabel: string;\n}\n\nfunction quietCardState(status: { type: string; reason?: string } | undefined): ToolSummaryState {\n if (status?.type === \"running\") return \"running\";\n if (status?.type === \"requires-action\") return \"waiting\";\n if (status?.type === \"incomplete\") return status.reason === \"cancelled\" ? \"cancelled\" : \"error\";\n return \"complete\";\n}\n\nfunction makeQuietFileToolUI(spec: QuietFileToolSpec): ToolCallMessagePartComponent {\n const Impl: ToolCallMessagePartComponent = ({ toolName, args, result, status }) => {\n const isFailed = status?.type === \"incomplete\";\n const errorMsg = isFailed ? String(status.error ?? \"\") : null;\n const details = status?.type === \"complete\" ? rawDetails(result) : null;\n const summary = summarizeToolCall({\n toolName,\n args: args as Record<string, unknown> | undefined,\n result: status?.type === \"complete\" ? result : undefined,\n status: quietCardState(status),\n });\n\n return (\n <ToolCard\n icon={spec.icon}\n status={status?.type ?? \"complete\"}\n title={summary.label}\n subtitle={summary.meta ? truncate(summary.meta, 70) : undefined}\n error={errorMsg || undefined}\n >\n {details && (\n <ExpandableSection label={spec.detailsLabel}>\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-all text-[11px] leading-snug text-muted-foreground\">\n {truncate(details, 6000)}\n </pre>\n </ExpandableSection>\n )}\n </ToolCard>\n );\n };\n const Quiet = memo(Impl) as unknown as ToolCallMessagePartComponent;\n Quiet.displayName = `QuietFileToolUI(${spec.detailsLabel})`;\n return Quiet;\n}\n\nexport const ReadFileToolUI = makeQuietFileToolUI({\n icon: ScanSearchIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const ListFilesToolUI = makeQuietFileToolUI({\n icon: FolderOpenIcon,\n detailsLabel: \"Show files\",\n});\n\nexport const WriteFileToolUI = makeQuietFileToolUI({\n icon: FileTextIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const EditFileToolUI = makeQuietFileToolUI({\n icon: PenLineIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const SearchFilesToolUI = makeQuietFileToolUI({\n icon: SearchIcon,\n detailsLabel: \"Show matches\",\n});\n"],"names":["normalizeResult","summarizeToolCall","jsx","ToolCard","truncate","ExpandableSection","memo","ScanSearchIcon","FolderOpenIcon","FileTextIcon","PenLineIcon","SearchIcon"],"mappings":";;;;;;;AA2BA,SAAS,WAAW,QAAgC;AAClD,MAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AAGpD,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,OAAO,KAAA,MAAW,KAAK,SAAS;AAAA,EACzC;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,QAAS,OAAmC;AAClD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,MAAM,KAAA,MAAW,KAAK,QAAQ;AAAA,IACvC;AAAA,EACF;AACA,QAAM,OAAOA,WAAAA,gBAAgB,MAAM;AACnC,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACzC,SAAO,KAAK,KAAA,MAAW,KAAK,OAAO;AACrC;AAOA,SAAS,eAAe,QAAyE;AAC/F,OAAI,iCAAQ,UAAS,UAAW,QAAO;AACvC,OAAI,iCAAQ,UAAS,kBAAmB,QAAO;AAC/C,OAAI,iCAAQ,UAAS,qBAAqB,OAAO,WAAW,cAAc,cAAc;AACxF,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAuD;AAClF,QAAM,OAAqC,CAAC,EAAE,UAAU,MAAM,QAAQ,aAAa;AACjF,UAAM,YAAW,iCAAQ,UAAS;AAClC,UAAM,WAAW,WAAW,OAAO,OAAO,SAAS,EAAE,IAAI;AACzD,UAAM,WAAU,iCAAQ,UAAS,aAAa,WAAW,MAAM,IAAI;AACnE,UAAM,UAAUC,YAAAA,kBAAkB;AAAA,MAChC;AAAA,MACA;AAAA,MACA,SAAQ,iCAAQ,UAAS,aAAa,SAAS;AAAA,MAC/C,QAAQ,eAAe,MAAM;AAAA,IAAA,CAC9B;AAED,WACEC,2BAAAA;AAAAA,MAACC,WAAAA;AAAAA,MAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,SAAQ,iCAAQ,SAAQ;AAAA,QACxB,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ,OAAOC,WAAAA,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,QACtD,OAAO,YAAY;AAAA,QAElB,UAAA,WACCF,2BAAAA,IAACG,WAAAA,mBAAA,EAAkB,OAAO,KAAK,cAC7B,UAAAH,2BAAAA,IAAC,OAAA,EAAI,WAAU,uGACZ,UAAAE,WAAAA,SAAS,SAAS,GAAI,GACzB,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACA,QAAM,QAAQE,MAAAA,KAAK,IAAI;AACvB,QAAM,cAAc,mBAAmB,KAAK,YAAY;AACxD,SAAO;AACT;AAEO,MAAM,iBAAiB,oBAAoB;AAAA,EAChD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,kBAAkB,oBAAoB;AAAA,EACjD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,kBAAkB,oBAAoB;AAAA,EACjD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,iBAAiB,oBAAoB;AAAA,EAChD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,oBAAoB,oBAAoB;AAAA,EACnD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;;;;;;;"}
1
+ {"version":3,"file":"file-tool-uis.cjs","sources":["../../src/tools/file-tool-uis.tsx"],"sourcesContent":["/**\n * Quiet tool cards for the deep-agent workspace-file tools.\n *\n * `read_file` / `ls` / `write_file` / `edit_file` / `glob` / `grep` are the\n * agent's own scratch-space plumbing. Without registry entries they fall\n * through to the generic fallback, which renders the raw args/result JSON —\n * scratch paths like `/large_tool_results/toolu_…` and screenfuls of encoded\n * text that read as garble to a non-technical user. Each becomes a one-line\n * card titled by the shared summary registry (\"Read config.ts\", \"Edited\n * upstream.py\" with \"+4 −1\", scratch paths in plain English); the raw output\n * stays available behind a collapsed \"Show details\" section. Hosts can still\n * override any of them via the `toolUIs` prop, which wins over the registry.\n */\nimport {\n FileTextIcon,\n FolderOpenIcon,\n PenLineIcon,\n ScanSearchIcon,\n SearchIcon,\n} from \"lucide-react\";\nimport { memo } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport { ExpandableSection, normalizeResult, ToolCard, truncate } from \"./primitives\";\nimport { summarizeToolCall, type ToolSummaryState } from \"./tool-summary\";\n\nexport { friendlyWorkspacePath } from \"./tool-summary\";\n\nfunction rawDetails(result: unknown): string | null {\n if (result === null || result === undefined) return null;\n // File tools usually return plain text (file content, listings) — show it\n // as-is; only genuinely structured results get pretty-printed.\n if (typeof result === \"string\") {\n return result.trim() !== \"\" ? result : null;\n }\n if (typeof result === \"object\") {\n const inner = (result as Record<string, unknown>).result;\n if (typeof inner === \"string\") {\n return inner.trim() !== \"\" ? inner : null;\n }\n }\n const data = normalizeResult(result);\n if (data === null) return null;\n const text = JSON.stringify(data, null, 2);\n return text.trim() !== \"\" ? text : null;\n}\n\ninterface QuietFileToolSpec {\n icon: React.ElementType;\n detailsLabel: string;\n}\n\nfunction quietCardState(status: { type: string; reason?: string } | undefined): ToolSummaryState {\n if (status?.type === \"running\") return \"running\";\n if (status?.type === \"requires-action\") return \"waiting\";\n if (status?.type === \"incomplete\") return status.reason === \"cancelled\" ? \"cancelled\" : \"error\";\n return \"complete\";\n}\n\nfunction makeQuietFileToolUI(spec: QuietFileToolSpec): ToolCallMessagePartComponent {\n const Impl: ToolCallMessagePartComponent = ({ toolName, args, result, status }) => {\n const isFailed = status?.type === \"incomplete\";\n const errorMsg = isFailed ? String(status.error ?? \"\") : null;\n const details = status?.type === \"complete\" ? rawDetails(result) : null;\n const summary = summarizeToolCall({\n toolName,\n args: args as Record<string, unknown> | undefined,\n result: status?.type === \"complete\" ? result : undefined,\n status: quietCardState(status),\n });\n\n return (\n <ToolCard\n icon={spec.icon}\n status={status?.type ?? \"complete\"}\n title={summary.label}\n subtitle={summary.meta ? truncate(summary.meta, 70) : undefined}\n error={errorMsg || undefined}\n >\n {details && (\n <ExpandableSection label={spec.detailsLabel}>\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-all text-[11px] leading-snug text-muted-foreground\">\n {truncate(details, 6000)}\n </pre>\n </ExpandableSection>\n )}\n </ToolCard>\n );\n };\n const Quiet = memo(Impl) as unknown as ToolCallMessagePartComponent;\n Quiet.displayName = `QuietFileToolUI(${spec.detailsLabel})`;\n return Quiet;\n}\n\nexport const ReadFileToolUI = makeQuietFileToolUI({\n icon: ScanSearchIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const ListFilesToolUI = makeQuietFileToolUI({\n icon: FolderOpenIcon,\n detailsLabel: \"Show files\",\n});\n\nexport const WriteFileToolUI = makeQuietFileToolUI({\n icon: FileTextIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const EditFileToolUI = makeQuietFileToolUI({\n icon: PenLineIcon,\n detailsLabel: \"Show details\",\n});\n\nexport const SearchFilesToolUI = makeQuietFileToolUI({\n icon: SearchIcon,\n detailsLabel: \"Show matches\",\n});\n"],"names":["normalizeResult","summarizeToolCall","jsx","ToolCard","truncate","ExpandableSection","memo","ScanSearchIcon","FolderOpenIcon","FileTextIcon","PenLineIcon","SearchIcon"],"mappings":";;;;;;;AA2BA,SAAS,WAAW,QAAgC;AAClD,MAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AAGpD,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,OAAO,KAAA,MAAW,KAAK,SAAS;AAAA,EACzC;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,QAAS,OAAmC;AAClD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,MAAM,KAAA,MAAW,KAAK,QAAQ;AAAA,IACvC;AAAA,EACF;AACA,QAAM,OAAOA,WAAAA,gBAAgB,MAAM;AACnC,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACzC,SAAO,KAAK,KAAA,MAAW,KAAK,OAAO;AACrC;AAOA,SAAS,eAAe,QAAyE;AAC/F,OAAI,iCAAQ,UAAS,UAAW,QAAO;AACvC,OAAI,iCAAQ,UAAS,kBAAmB,QAAO;AAC/C,OAAI,iCAAQ,UAAS,qBAAqB,OAAO,WAAW,cAAc,cAAc;AACxF,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAuD;AAClF,QAAM,OAAqC,CAAC,EAAE,UAAU,MAAM,QAAQ,aAAa;AACjF,UAAM,YAAW,iCAAQ,UAAS;AAClC,UAAM,WAAW,WAAW,OAAO,OAAO,SAAS,EAAE,IAAI;AACzD,UAAM,WAAU,iCAAQ,UAAS,aAAa,WAAW,MAAM,IAAI;AACnE,UAAM,UAAUC,YAAAA,kBAAkB;AAAA,MAChC;AAAA,MACA;AAAA,MACA,SAAQ,iCAAQ,UAAS,aAAa,SAAS;AAAA,MAC/C,QAAQ,eAAe,MAAM;AAAA,IAAA,CAC9B;AAED,WACEC,2BAAAA;AAAAA,MAACC,WAAAA;AAAAA,MAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,SAAQ,iCAAQ,SAAQ;AAAA,QACxB,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ,OAAOC,WAAAA,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,QACtD,OAAO,YAAY;AAAA,QAElB,UAAA,WACCF,2BAAAA,IAACG,WAAAA,mBAAA,EAAkB,OAAO,KAAK,cAC7B,UAAAH,2BAAAA,IAAC,OAAA,EAAI,WAAU,uGACZ,UAAAE,WAAAA,SAAS,SAAS,GAAI,GACzB,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACA,QAAM,QAAQE,WAAAA,KAAK,IAAI;AACvB,QAAM,cAAc,mBAAmB,KAAK,YAAY;AACxD,SAAO;AACT;AAEO,MAAM,iBAAiB,oBAAoB;AAAA,EAChD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,kBAAkB,oBAAoB;AAAA,EACjD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,kBAAkB,oBAAoB;AAAA,EACjD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,iBAAiB,oBAAoB;AAAA,EAChD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;AAEM,MAAM,oBAAoB,oBAAoB;AAAA,EACnD,MAAMC,YAAAA;AAAAA,EACN,cAAc;AAChB,CAAC;;;;;;;"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const lucideReact = require("lucide-react");
5
- const react = require("react");
5
+ const require$$0 = require("react");
6
6
  const primitives = require("./primitives.cjs");
7
7
  const toolFallback = require("./tool-fallback.cjs");
8
8
  const toolResult = require("../agent-runtime/src/tool-result.cjs");
@@ -33,7 +33,7 @@ const InstallPackageToolUIImpl = (props) => {
33
33
  }
34
34
  );
35
35
  };
36
- const InstallPackageToolUI = react.memo(
36
+ const InstallPackageToolUI = require$$0.memo(
37
37
  InstallPackageToolUIImpl
38
38
  );
39
39
  InstallPackageToolUI.displayName = "InstallPackageToolUI";