@athenaintel/react 0.28.1 → 0.30.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 (761) hide show
  1. package/README.md +418 -10
  2. package/dist/agent-runtime/src/asset-attachment.cjs.map +1 -0
  3. package/dist/agent-runtime/src/asset-attachment.js.map +1 -0
  4. package/dist/agent-runtime/src/auth-denial.cjs.map +1 -0
  5. package/dist/agent-runtime/src/auth-denial.js.map +1 -0
  6. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -0
  7. package/dist/agent-runtime/src/client-tool-bridge.js.map +1 -0
  8. package/dist/agent-runtime/src/client-tools.cjs.map +1 -0
  9. package/dist/agent-runtime/src/client-tools.js.map +1 -0
  10. package/dist/agent-runtime/src/composer-markdown.cjs +124 -0
  11. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -0
  12. package/dist/agent-runtime/src/composer-markdown.js +124 -0
  13. package/dist/agent-runtime/src/composer-markdown.js.map +1 -0
  14. package/dist/agent-runtime/src/conversation-index.cjs.map +1 -0
  15. package/dist/agent-runtime/src/conversation-index.js.map +1 -0
  16. package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-list.cjs +36 -0
  17. package/dist/agent-runtime/src/conversation-list.cjs.map +1 -0
  18. package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-list.js +36 -0
  19. package/dist/agent-runtime/src/conversation-list.js.map +1 -0
  20. package/dist/{packages/agent-runtime → agent-runtime}/src/deep-agent-transport-recipe.cjs +5 -3
  21. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -0
  22. package/dist/{packages/agent-runtime → agent-runtime}/src/deep-agent-transport-recipe.js +6 -4
  23. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -0
  24. package/dist/agent-runtime/src/edit-command.cjs.map +1 -0
  25. package/dist/agent-runtime/src/edit-command.js.map +1 -0
  26. package/dist/{packages/agent-runtime → agent-runtime}/src/errors.cjs +23 -0
  27. package/dist/agent-runtime/src/errors.cjs.map +1 -0
  28. package/dist/{packages/agent-runtime → agent-runtime}/src/errors.js +23 -0
  29. package/dist/agent-runtime/src/errors.js.map +1 -0
  30. package/dist/agent-runtime/src/execute-output.cjs +41 -0
  31. package/dist/agent-runtime/src/execute-output.cjs.map +1 -0
  32. package/dist/agent-runtime/src/execute-output.js +41 -0
  33. package/dist/agent-runtime/src/execute-output.js.map +1 -0
  34. package/dist/{packages/agent-runtime → agent-runtime}/src/generated/runconfig-contract.cjs +10 -2
  35. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -0
  36. package/dist/{packages/agent-runtime → agent-runtime}/src/generated/runconfig-contract.js +10 -2
  37. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -0
  38. package/dist/agent-runtime/src/github-wake-event.cjs.map +1 -0
  39. package/dist/agent-runtime/src/github-wake-event.js.map +1 -0
  40. package/dist/{packages/agent-runtime → agent-runtime}/src/interrupts.cjs +24 -1
  41. package/dist/agent-runtime/src/interrupts.cjs.map +1 -0
  42. package/dist/{packages/agent-runtime → agent-runtime}/src/interrupts.js +24 -1
  43. package/dist/agent-runtime/src/interrupts.js.map +1 -0
  44. package/dist/agent-runtime/src/message-author.cjs.map +1 -0
  45. package/dist/agent-runtime/src/message-author.js.map +1 -0
  46. package/dist/agent-runtime/src/message-window.cjs.map +1 -0
  47. package/dist/agent-runtime/src/message-window.js.map +1 -0
  48. package/dist/{packages/agent-runtime → agent-runtime}/src/messages.cjs +8 -4
  49. package/dist/agent-runtime/src/messages.cjs.map +1 -0
  50. package/dist/{packages/agent-runtime → agent-runtime}/src/messages.js +6 -2
  51. package/dist/agent-runtime/src/messages.js.map +1 -0
  52. package/dist/agent-runtime/src/model-context.cjs.map +1 -0
  53. package/dist/agent-runtime/src/model-context.js.map +1 -0
  54. package/dist/agent-runtime/src/optimistic-content.cjs.map +1 -0
  55. package/dist/agent-runtime/src/optimistic-content.js.map +1 -0
  56. package/dist/agent-runtime/src/protocol.cjs.map +1 -0
  57. package/dist/agent-runtime/src/protocol.js.map +1 -0
  58. package/dist/{packages/agent-runtime → agent-runtime}/src/queue.cjs +23 -2
  59. package/dist/agent-runtime/src/queue.cjs.map +1 -0
  60. package/dist/{packages/agent-runtime → agent-runtime}/src/queue.js +23 -2
  61. package/dist/agent-runtime/src/queue.js.map +1 -0
  62. package/dist/{packages/agent-runtime → agent-runtime}/src/quota-safe-local-storage-session.cjs +23 -13
  63. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -0
  64. package/dist/{packages/agent-runtime → agent-runtime}/src/quota-safe-local-storage-session.js +24 -14
  65. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -0
  66. package/dist/agent-runtime/src/runtime-messages.cjs.map +1 -0
  67. package/dist/agent-runtime/src/runtime-messages.js.map +1 -0
  68. package/dist/agent-runtime/src/screen-point.cjs.map +1 -0
  69. package/dist/agent-runtime/src/screen-point.js.map +1 -0
  70. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -0
  71. package/dist/agent-runtime/src/send-recovery.js.map +1 -0
  72. package/dist/agent-runtime/src/statewire-attach-observer.cjs.map +1 -0
  73. package/dist/agent-runtime/src/statewire-attach-observer.js.map +1 -0
  74. package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-state.cjs +8 -0
  75. package/dist/agent-runtime/src/statewire-state.cjs.map +1 -0
  76. package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-state.js +8 -0
  77. package/dist/agent-runtime/src/statewire-state.js.map +1 -0
  78. package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-suspended.cjs +4 -0
  79. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -0
  80. package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-suspended.js +4 -0
  81. package/dist/agent-runtime/src/statewire-suspended.js.map +1 -0
  82. package/dist/agent-runtime/src/statewire-transport.cjs +43 -0
  83. package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -0
  84. package/dist/agent-runtime/src/statewire-transport.js +43 -0
  85. package/dist/agent-runtime/src/statewire-transport.js.map +1 -0
  86. package/dist/agent-runtime/src/streaming-markdown.cjs.map +1 -0
  87. package/dist/agent-runtime/src/streaming-markdown.js.map +1 -0
  88. package/dist/agent-runtime/src/subscription-wake-event.cjs +252 -0
  89. package/dist/agent-runtime/src/subscription-wake-event.cjs.map +1 -0
  90. package/dist/agent-runtime/src/subscription-wake-event.js +252 -0
  91. package/dist/agent-runtime/src/subscription-wake-event.js.map +1 -0
  92. package/dist/agent-runtime/src/thread-extras.cjs.map +1 -0
  93. package/dist/agent-runtime/src/thread-extras.js.map +1 -0
  94. package/dist/agent-runtime/src/thread-snapshot-cache.cjs.map +1 -0
  95. package/dist/agent-runtime/src/thread-snapshot-cache.js.map +1 -0
  96. package/dist/agent-runtime/src/thread-status.cjs.map +1 -0
  97. package/dist/agent-runtime/src/thread-status.js.map +1 -0
  98. package/dist/{packages/agent-runtime → agent-runtime}/src/tool-metadata.cjs +279 -3
  99. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -0
  100. package/dist/{packages/agent-runtime → agent-runtime}/src/tool-metadata.js +279 -3
  101. package/dist/agent-runtime/src/tool-metadata.js.map +1 -0
  102. package/dist/agent-runtime/src/tool-names.cjs +5 -0
  103. package/dist/agent-runtime/src/tool-names.cjs.map +1 -0
  104. package/dist/agent-runtime/src/tool-names.js +5 -0
  105. package/dist/agent-runtime/src/tool-names.js.map +1 -0
  106. package/dist/agent-runtime/src/tool-outputs.cjs.map +1 -0
  107. package/dist/agent-runtime/src/tool-outputs.js.map +1 -0
  108. package/dist/agent-runtime/src/tool-result.cjs.map +1 -0
  109. package/dist/agent-runtime/src/tool-result.js.map +1 -0
  110. package/dist/{packages/agent-runtime → agent-runtime}/src/use-conversation-list.cjs +33 -22
  111. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -0
  112. package/dist/{packages/agent-runtime → agent-runtime}/src/use-conversation-list.js +34 -23
  113. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -0
  114. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -0
  115. package/dist/agent-runtime/src/use-deep-agent-config.js.map +1 -0
  116. package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-edit-submit.cjs +2 -0
  117. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -0
  118. package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-edit-submit.js +2 -0
  119. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -0
  120. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -0
  121. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -0
  122. package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-thread.cjs +1 -0
  123. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -0
  124. package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-thread.js +2 -1
  125. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -0
  126. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -0
  127. package/dist/agent-runtime/src/use-deep-agent-window-sync.js.map +1 -0
  128. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs +52 -0
  129. package/dist/agent-runtime/src/use-historical-edit-attachments.cjs.map +1 -0
  130. package/dist/agent-runtime/src/use-historical-edit-attachments.js +52 -0
  131. package/dist/agent-runtime/src/use-historical-edit-attachments.js.map +1 -0
  132. package/dist/{packages/agent-runtime → agent-runtime}/src/voice-presentation.cjs +14 -0
  133. package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -0
  134. package/dist/{packages/agent-runtime → agent-runtime}/src/voice-presentation.js +14 -0
  135. package/dist/agent-runtime/src/voice-presentation.js.map +1 -0
  136. package/dist/agent-runtime/src/voice-turn-grouping.cjs.map +1 -0
  137. package/dist/agent-runtime/src/voice-turn-grouping.js.map +1 -0
  138. package/dist/assets/AthenaAssetEmbed.cjs +8 -2
  139. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  140. package/dist/assets/AthenaAssetEmbed.d.ts +8 -0
  141. package/dist/assets/AthenaAssetEmbed.js +8 -2
  142. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  143. package/dist/assets/AthenaLayout.cjs +97 -31
  144. package/dist/assets/AthenaLayout.cjs.map +1 -1
  145. package/dist/assets/AthenaLayout.d.ts +13 -0
  146. package/dist/assets/AthenaLayout.js +98 -32
  147. package/dist/assets/AthenaLayout.js.map +1 -1
  148. package/dist/assets/asset-embed-messages.cjs.map +1 -1
  149. package/dist/assets/asset-embed-messages.d.ts +6 -0
  150. package/dist/assets/asset-embed-messages.js.map +1 -1
  151. package/dist/assets/asset-panel-store.cjs +68 -32
  152. package/dist/assets/asset-panel-store.cjs.map +1 -1
  153. package/dist/assets/asset-panel-store.d.ts +47 -1
  154. package/dist/assets/asset-panel-store.js +68 -32
  155. package/dist/assets/asset-panel-store.js.map +1 -1
  156. package/dist/assets/use-asset-embed.cjs +29 -8
  157. package/dist/assets/use-asset-embed.cjs.map +1 -1
  158. package/dist/assets/use-asset-embed.d.ts +7 -0
  159. package/dist/assets/use-asset-embed.js +29 -8
  160. package/dist/assets/use-asset-embed.js.map +1 -1
  161. package/dist/catalog/chat-pickers.cjs +152 -0
  162. package/dist/catalog/chat-pickers.cjs.map +1 -0
  163. package/dist/catalog/chat-pickers.d.ts +22 -0
  164. package/dist/catalog/chat-pickers.js +152 -0
  165. package/dist/catalog/chat-pickers.js.map +1 -0
  166. package/dist/catalog/runtime-catalog.cjs +181 -0
  167. package/dist/catalog/runtime-catalog.cjs.map +1 -0
  168. package/dist/catalog/runtime-catalog.d.ts +100 -0
  169. package/dist/catalog/runtime-catalog.js +181 -0
  170. package/dist/catalog/runtime-catalog.js.map +1 -0
  171. package/dist/chat/AthenaChat.cjs +86 -46
  172. package/dist/chat/AthenaChat.cjs.map +1 -1
  173. package/dist/chat/AthenaChat.d.ts +21 -4
  174. package/dist/chat/AthenaChat.js +88 -48
  175. package/dist/chat/AthenaChat.js.map +1 -1
  176. package/dist/chat/StatewireApprovalCard.cjs +38 -37
  177. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  178. package/dist/chat/StatewireApprovalCard.d.ts +2 -0
  179. package/dist/chat/StatewireApprovalCard.js +39 -38
  180. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  181. package/dist/chat/StatewireClientToolBridge.cjs +2 -2
  182. package/dist/chat/StatewireClientToolBridge.js +2 -2
  183. package/dist/chat/StatewireQueuedMessages.cjs +15 -12
  184. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  185. package/dist/chat/StatewireQueuedMessages.d.ts +22 -2
  186. package/dist/chat/StatewireQueuedMessages.js +15 -12
  187. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  188. package/dist/chat/StatewireRunRefusalNotice.cjs +48 -0
  189. package/dist/chat/StatewireRunRefusalNotice.cjs.map +1 -0
  190. package/dist/chat/StatewireRunRefusalNotice.d.ts +25 -0
  191. package/dist/chat/StatewireRunRefusalNotice.js +48 -0
  192. package/dist/chat/StatewireRunRefusalNotice.js.map +1 -0
  193. package/dist/chat/WaitingOnYouBanner.cjs +2 -2
  194. package/dist/chat/WaitingOnYouBanner.js +2 -2
  195. package/dist/chat/athena-citation-links.cjs +19 -15
  196. package/dist/chat/athena-citation-links.cjs.map +1 -1
  197. package/dist/chat/athena-citation-links.js +19 -15
  198. package/dist/chat/athena-citation-links.js.map +1 -1
  199. package/dist/chat/run-activity.cjs +9 -1
  200. package/dist/chat/run-activity.cjs.map +1 -1
  201. package/dist/chat/run-activity.d.ts +6 -0
  202. package/dist/chat/run-activity.js +10 -2
  203. package/dist/chat/run-activity.js.map +1 -1
  204. package/dist/chat/statewire-banners.cjs +30 -1
  205. package/dist/chat/statewire-banners.cjs.map +1 -1
  206. package/dist/chat/statewire-banners.d.ts +20 -1
  207. package/dist/chat/statewire-banners.js +32 -3
  208. package/dist/chat/statewire-banners.js.map +1 -1
  209. package/dist/chat/statewire-client-tools.cjs +1 -1
  210. package/dist/chat/statewire-client-tools.js +1 -1
  211. package/dist/chat/super-grouping/CollapsibleGroup.cjs +1 -1
  212. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  213. package/dist/chat/super-grouping/CollapsibleGroup.js +1 -1
  214. package/dist/chat/super-grouping/CollapsibleGroup.js.map +1 -1
  215. package/dist/chat/super-grouping/SuperGroupingCard.cjs +7 -5
  216. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  217. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +8 -2
  218. package/dist/chat/super-grouping/SuperGroupingCard.js +7 -5
  219. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  220. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +350 -0
  221. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -0
  222. package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +31 -0
  223. package/dist/chat/super-grouping/SuperGroupingTranscript.js +350 -0
  224. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -0
  225. package/dist/chat/super-grouping/ToolTimeline.cjs +13 -2
  226. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  227. package/dist/chat/super-grouping/ToolTimeline.d.ts +10 -3
  228. package/dist/chat/super-grouping/ToolTimeline.js +13 -2
  229. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  230. package/dist/chat/super-grouping/activity-timeline.cjs +51 -26
  231. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  232. package/dist/chat/super-grouping/activity-timeline.d.ts +40 -8
  233. package/dist/chat/super-grouping/activity-timeline.js +52 -27
  234. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  235. package/dist/chat/super-grouping/index.cjs +12 -0
  236. package/dist/chat/super-grouping/index.cjs.map +1 -1
  237. package/dist/chat/super-grouping/index.d.ts +7 -2
  238. package/dist/chat/super-grouping/index.js +14 -2
  239. package/dist/chat/super-grouping/index.js.map +1 -1
  240. package/dist/chat/super-grouping/timeline-step.cjs +14 -5
  241. package/dist/chat/super-grouping/timeline-step.cjs.map +1 -1
  242. package/dist/chat/super-grouping/timeline-step.d.ts +10 -1
  243. package/dist/chat/super-grouping/timeline-step.js +15 -6
  244. package/dist/chat/super-grouping/timeline-step.js.map +1 -1
  245. package/dist/chat/super-grouping/turn-segments.cjs +82 -0
  246. package/dist/chat/super-grouping/turn-segments.cjs.map +1 -0
  247. package/dist/chat/super-grouping/turn-segments.d.ts +69 -0
  248. package/dist/chat/super-grouping/turn-segments.js +82 -0
  249. package/dist/chat/super-grouping/turn-segments.js.map +1 -0
  250. package/dist/chat/super-grouping/turn-timing.cjs +110 -0
  251. package/dist/chat/super-grouping/turn-timing.cjs.map +1 -0
  252. package/dist/chat/super-grouping/turn-timing.d.ts +52 -0
  253. package/dist/chat/super-grouping/turn-timing.js +110 -0
  254. package/dist/chat/super-grouping/turn-timing.js.map +1 -0
  255. package/dist/chat/tiptap-text.cjs +1 -1
  256. package/dist/chat/tiptap-text.js +1 -1
  257. package/dist/chat/use-athena-run-live.cjs +1 -1
  258. package/dist/chat/use-athena-run-live.js +1 -1
  259. package/dist/chat/use-statewire-approval-request.cjs +73 -4
  260. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  261. package/dist/chat/use-statewire-approval-request.js +74 -5
  262. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  263. package/dist/chat-ui/composer/composer-message.cjs +284 -0
  264. package/dist/chat-ui/composer/composer-message.cjs.map +1 -0
  265. package/dist/chat-ui/composer/composer-message.d.ts +152 -0
  266. package/dist/chat-ui/composer/composer-message.js +284 -0
  267. package/dist/chat-ui/composer/composer-message.js.map +1 -0
  268. package/dist/chat-ui/composer/tiptap-composer.cjs +57 -11
  269. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  270. package/dist/chat-ui/composer/tiptap-composer.d.ts +34 -6
  271. package/dist/chat-ui/composer/tiptap-composer.js +57 -11
  272. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  273. package/dist/chat-ui/index.cjs +4 -1
  274. package/dist/chat-ui/index.cjs.map +1 -1
  275. package/dist/chat-ui/index.d.ts +3 -2
  276. package/dist/chat-ui/index.js +5 -2
  277. package/dist/chat-ui/index.js.map +1 -1
  278. package/dist/chat-ui/mentions/mention-chip.cjs +3 -2
  279. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  280. package/dist/chat-ui/mentions/mention-chip.js +4 -3
  281. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  282. package/dist/chat-ui/mentions/mention-extension.cjs +8 -2
  283. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
  284. package/dist/chat-ui/mentions/mention-extension.js +8 -2
  285. package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
  286. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs +3 -1
  287. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.cjs.map +1 -1
  288. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js +3 -1
  289. package/dist/chat-ui/mentions/suggestions/components/mention-suggestion-popup.js.map +1 -1
  290. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +65 -19
  291. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  292. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +15 -0
  293. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +67 -21
  294. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  295. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +4 -2
  296. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  297. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +2 -1
  298. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +5 -3
  299. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  300. package/dist/chat-ui/messages/message-components.cjs +30 -10
  301. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  302. package/dist/chat-ui/messages/message-components.d.ts +21 -1
  303. package/dist/chat-ui/messages/message-components.js +30 -10
  304. package/dist/chat-ui/messages/message-components.js.map +1 -1
  305. package/dist/chat-ui/messages/runtime-message.cjs +1 -1
  306. package/dist/chat-ui/messages/runtime-message.js +1 -1
  307. package/dist/chat-ui/messages/statewire-continue-run.cjs +5 -5
  308. package/dist/chat-ui/messages/statewire-continue-run.js +5 -5
  309. package/dist/chat-ui/messages/user-edit-composer.cjs +1 -1
  310. package/dist/chat-ui/messages/user-edit-composer.js +1 -1
  311. package/dist/chat-ui/messages/wake-marker.cjs +39 -4
  312. package/dist/chat-ui/messages/wake-marker.cjs.map +1 -1
  313. package/dist/chat-ui/messages/wake-marker.d.ts +16 -5
  314. package/dist/chat-ui/messages/wake-marker.js +40 -5
  315. package/dist/chat-ui/messages/wake-marker.js.map +1 -1
  316. package/dist/chat-ui/rich-text/chat-message-body.cjs +12 -8
  317. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  318. package/dist/chat-ui/rich-text/chat-message-body.d.ts +6 -1
  319. package/dist/chat-ui/rich-text/chat-message-body.js +13 -9
  320. package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
  321. package/dist/chat-ui/rich-text/chat-text-schema.cjs +64 -6
  322. package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -1
  323. package/dist/chat-ui/rich-text/chat-text-schema.d.ts +5 -0
  324. package/dist/chat-ui/rich-text/chat-text-schema.js +66 -8
  325. package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -1
  326. package/dist/chat-ui/statewire.cjs +1 -1
  327. package/dist/chat-ui/statewire.d.ts +1 -1
  328. package/dist/chat-ui/statewire.js +1 -1
  329. package/dist/chat-ui/thread/statewire-history-edge.cjs +2 -2
  330. package/dist/chat-ui/thread/statewire-history-edge.js +2 -2
  331. package/dist/collab/client.cjs +218 -13
  332. package/dist/collab/client.cjs.map +1 -1
  333. package/dist/collab/client.d.ts +105 -2
  334. package/dist/collab/client.js +221 -17
  335. package/dist/collab/client.js.map +1 -1
  336. package/dist/collab/index.cjs +2 -0
  337. package/dist/collab/index.cjs.map +1 -1
  338. package/dist/collab/index.d.ts +1 -1
  339. package/dist/collab/index.js +3 -1
  340. package/dist/composer/AttachmentContext.cjs +38 -12
  341. package/dist/composer/AttachmentContext.cjs.map +1 -1
  342. package/dist/composer/AttachmentContext.d.ts +22 -1
  343. package/dist/composer/AttachmentContext.js +40 -14
  344. package/dist/composer/AttachmentContext.js.map +1 -1
  345. package/dist/composer/QuoteContext.cjs +80 -28
  346. package/dist/composer/QuoteContext.cjs.map +1 -1
  347. package/dist/composer/QuoteContext.d.ts +35 -6
  348. package/dist/composer/QuoteContext.js +82 -30
  349. package/dist/composer/QuoteContext.js.map +1 -1
  350. package/dist/composer/build-composed-message.cjs +27 -0
  351. package/dist/composer/build-composed-message.cjs.map +1 -1
  352. package/dist/composer/build-composed-message.d.ts +21 -0
  353. package/dist/composer/build-composed-message.js +28 -1
  354. package/dist/composer/build-composed-message.js.map +1 -1
  355. package/dist/composer/composer-handoff.cjs +13 -1
  356. package/dist/composer/composer-handoff.cjs.map +1 -1
  357. package/dist/composer/composer-handoff.d.ts +12 -0
  358. package/dist/composer/composer-handoff.js +15 -3
  359. package/dist/composer/composer-handoff.js.map +1 -1
  360. package/dist/composer/index.d.ts +6 -3
  361. package/dist/composer/useReadComposerDraft.cjs +16 -0
  362. package/dist/composer/useReadComposerDraft.cjs.map +1 -0
  363. package/dist/composer/useReadComposerDraft.d.ts +6 -0
  364. package/dist/composer/useReadComposerDraft.js +16 -0
  365. package/dist/composer/useReadComposerDraft.js.map +1 -0
  366. package/dist/diagnostics/errors.cjs +6 -0
  367. package/dist/diagnostics/errors.cjs.map +1 -1
  368. package/dist/diagnostics/errors.d.ts +6 -0
  369. package/dist/diagnostics/errors.js +6 -0
  370. package/dist/diagnostics/errors.js.map +1 -1
  371. package/dist/index.cjs +159 -7
  372. package/dist/index.cjs.map +1 -1
  373. package/dist/index.d.ts +53 -12
  374. package/dist/index.js +166 -14
  375. package/dist/index.js.map +1 -1
  376. package/dist/lib/owner-document.cjs +32 -0
  377. package/dist/lib/owner-document.cjs.map +1 -0
  378. package/dist/lib/owner-document.d.ts +17 -0
  379. package/dist/lib/owner-document.js +32 -0
  380. package/dist/lib/owner-document.js.map +1 -0
  381. package/dist/lib/portal-surface.cjs +55 -0
  382. package/dist/lib/portal-surface.cjs.map +1 -0
  383. package/dist/lib/portal-surface.d.ts +37 -0
  384. package/dist/lib/portal-surface.js +55 -0
  385. package/dist/lib/portal-surface.js.map +1 -0
  386. package/dist/lib/use-athena-rest-query.cjs +34 -0
  387. package/dist/lib/use-athena-rest-query.cjs.map +1 -0
  388. package/dist/lib/use-athena-rest-query.d.ts +31 -0
  389. package/dist/lib/use-athena-rest-query.js +34 -0
  390. package/dist/lib/use-athena-rest-query.js.map +1 -0
  391. package/dist/provider/AthenaProvider.cjs +36 -6
  392. package/dist/provider/AthenaProvider.cjs.map +1 -1
  393. package/dist/provider/AthenaProvider.d.ts +20 -1
  394. package/dist/provider/AthenaProvider.js +38 -8
  395. package/dist/provider/AthenaProvider.js.map +1 -1
  396. package/dist/provider/citation-links.d.ts +10 -2
  397. package/dist/{packages/react → react}/package.json.cjs +1 -1
  398. package/dist/{packages/react → react}/package.json.js +1 -1
  399. package/dist/runtime/statewire-lifecycle.cjs +15 -3
  400. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  401. package/dist/runtime/statewire-lifecycle.d.ts +6 -0
  402. package/dist/runtime/statewire-lifecycle.js +15 -3
  403. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  404. package/dist/runtime/useAthenaStatewireRuntime.cjs +11 -7
  405. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  406. package/dist/runtime/useAthenaStatewireRuntime.js +11 -7
  407. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  408. package/dist/search/useAthenaRepoSearch.cjs +5 -13
  409. package/dist/search/useAthenaRepoSearch.cjs.map +1 -1
  410. package/dist/search/useAthenaRepoSearch.d.ts +3 -3
  411. package/dist/search/useAthenaRepoSearch.js +6 -14
  412. package/dist/search/useAthenaRepoSearch.js.map +1 -1
  413. package/dist/sheet-range/a1.cjs +162 -0
  414. package/dist/sheet-range/a1.cjs.map +1 -0
  415. package/dist/sheet-range/a1.d.ts +91 -0
  416. package/dist/sheet-range/a1.js +162 -0
  417. package/dist/sheet-range/a1.js.map +1 -0
  418. package/dist/sheet-range/index.cjs +22 -0
  419. package/dist/sheet-range/index.cjs.map +1 -0
  420. package/dist/sheet-range/index.d.ts +12 -0
  421. package/dist/sheet-range/index.js +22 -0
  422. package/dist/sheet-range/index.js.map +1 -0
  423. package/dist/sheet-range/range-preview-table.cjs +75 -0
  424. package/dist/sheet-range/range-preview-table.cjs.map +1 -0
  425. package/dist/sheet-range/range-preview-table.d.ts +20 -0
  426. package/dist/sheet-range/range-preview-table.js +75 -0
  427. package/dist/sheet-range/range-preview-table.js.map +1 -0
  428. package/dist/sheet-range/range-preview.cjs +116 -0
  429. package/dist/sheet-range/range-preview.cjs.map +1 -0
  430. package/dist/sheet-range/range-preview.d.ts +67 -0
  431. package/dist/sheet-range/range-preview.js +116 -0
  432. package/dist/sheet-range/range-preview.js.map +1 -0
  433. package/dist/styles.css +1 -1
  434. package/dist/threads/Inbox.cjs +289 -0
  435. package/dist/threads/Inbox.cjs.map +1 -0
  436. package/dist/threads/Inbox.d.ts +46 -0
  437. package/dist/threads/Inbox.js +289 -0
  438. package/dist/threads/Inbox.js.map +1 -0
  439. package/dist/threads/SessionList.cjs +51 -126
  440. package/dist/threads/SessionList.cjs.map +1 -1
  441. package/dist/threads/SessionList.d.ts +26 -1
  442. package/dist/threads/SessionList.js +45 -120
  443. package/dist/threads/SessionList.js.map +1 -1
  444. package/dist/threads/SessionsPage.cjs +753 -0
  445. package/dist/threads/SessionsPage.cjs.map +1 -0
  446. package/dist/threads/SessionsPage.d.ts +35 -0
  447. package/dist/threads/SessionsPage.js +753 -0
  448. package/dist/threads/SessionsPage.js.map +1 -0
  449. package/dist/threads/api.cjs +21 -1
  450. package/dist/threads/api.cjs.map +1 -1
  451. package/dist/threads/api.d.ts +59 -0
  452. package/dist/threads/api.js +21 -1
  453. package/dist/threads/api.js.map +1 -1
  454. package/dist/threads/conversation-list-fetcher.cjs +9 -2
  455. package/dist/threads/conversation-list-fetcher.cjs.map +1 -1
  456. package/dist/threads/conversation-list-fetcher.d.ts +14 -1
  457. package/dist/threads/conversation-list-fetcher.js +9 -2
  458. package/dist/threads/conversation-list-fetcher.js.map +1 -1
  459. package/dist/threads/index.d.ts +2 -1
  460. package/dist/threads/pull-request-display.cjs +25 -0
  461. package/dist/threads/pull-request-display.cjs.map +1 -0
  462. package/dist/threads/pull-request-display.d.ts +15 -0
  463. package/dist/threads/pull-request-display.js +25 -0
  464. package/dist/threads/pull-request-display.js.map +1 -0
  465. package/dist/threads/session-list-model.cjs +16 -2
  466. package/dist/threads/session-list-model.cjs.map +1 -1
  467. package/dist/threads/session-list-model.d.ts +10 -0
  468. package/dist/threads/session-list-model.js +16 -2
  469. package/dist/threads/session-list-model.js.map +1 -1
  470. package/dist/threads/session-row-parts.cjs +152 -0
  471. package/dist/threads/session-row-parts.cjs.map +1 -0
  472. package/dist/threads/session-row-parts.d.ts +50 -0
  473. package/dist/threads/session-row-parts.js +152 -0
  474. package/dist/threads/session-row-parts.js.map +1 -0
  475. package/dist/threads/sessions-page-model.cjs +305 -0
  476. package/dist/threads/sessions-page-model.cjs.map +1 -0
  477. package/dist/threads/sessions-page-model.d.ts +86 -0
  478. package/dist/threads/sessions-page-model.js +305 -0
  479. package/dist/threads/sessions-page-model.js.map +1 -0
  480. package/dist/threads/sessions-page-storage.cjs +93 -0
  481. package/dist/threads/sessions-page-storage.cjs.map +1 -0
  482. package/dist/threads/sessions-page-storage.d.ts +23 -0
  483. package/dist/threads/sessions-page-storage.js +93 -0
  484. package/dist/threads/sessions-page-storage.js.map +1 -0
  485. package/dist/threads/sessions-query.cjs +235 -0
  486. package/dist/threads/sessions-query.cjs.map +1 -0
  487. package/dist/threads/sessions-query.d.ts +119 -0
  488. package/dist/threads/sessions-query.js +235 -0
  489. package/dist/threads/sessions-query.js.map +1 -0
  490. package/dist/threads/statewire-thread-list.cjs +133 -40
  491. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  492. package/dist/threads/statewire-thread-list.d.ts +83 -2
  493. package/dist/threads/statewire-thread-list.js +134 -41
  494. package/dist/threads/statewire-thread-list.js.map +1 -1
  495. package/dist/threads/use-athena-sessions.cjs +198 -0
  496. package/dist/threads/use-athena-sessions.cjs.map +1 -0
  497. package/dist/threads/use-athena-sessions.d.ts +81 -0
  498. package/dist/threads/use-athena-sessions.js +198 -0
  499. package/dist/threads/use-athena-sessions.js.map +1 -0
  500. package/dist/threads/use-rest-conversation-history.cjs +1 -1
  501. package/dist/threads/use-rest-conversation-history.js +1 -1
  502. package/dist/threads/use-statewire-conversation-history.cjs +1 -1
  503. package/dist/threads/use-statewire-conversation-history.d.ts +3 -0
  504. package/dist/threads/use-statewire-conversation-history.js +1 -1
  505. package/dist/threads/use-thread-read-state.cjs +73 -0
  506. package/dist/threads/use-thread-read-state.cjs.map +1 -0
  507. package/dist/threads/use-thread-read-state.d.ts +51 -0
  508. package/dist/threads/use-thread-read-state.js +73 -0
  509. package/dist/threads/use-thread-read-state.js.map +1 -0
  510. package/dist/tiptap-markdown-table/src/markdown-table-serializer.cjs.map +1 -0
  511. package/dist/tiptap-markdown-table/src/markdown-table-serializer.js.map +1 -0
  512. package/dist/tools/auto-open-tools.cjs +2 -0
  513. package/dist/tools/auto-open-tools.cjs.map +1 -1
  514. package/dist/tools/auto-open-tools.js +2 -0
  515. package/dist/tools/auto-open-tools.js.map +1 -1
  516. package/dist/tools/file-tool-uis.cjs +18 -43
  517. package/dist/tools/file-tool-uis.cjs.map +1 -1
  518. package/dist/tools/file-tool-uis.d.ts +1 -2
  519. package/dist/tools/file-tool-uis.js +18 -42
  520. package/dist/tools/file-tool-uis.js.map +1 -1
  521. package/dist/tools/index.cjs +6 -2
  522. package/dist/tools/index.cjs.map +1 -1
  523. package/dist/tools/index.d.ts +1 -0
  524. package/dist/tools/index.js +6 -2
  525. package/dist/tools/index.js.map +1 -1
  526. package/dist/tools/misc-tool-uis.cjs +2 -2
  527. package/dist/tools/misc-tool-uis.js +2 -2
  528. package/dist/tools/primitives.cjs +1 -1
  529. package/dist/tools/primitives.js +1 -1
  530. package/dist/tools/read-asset-tool-ui.cjs +21 -70
  531. package/dist/tools/read-asset-tool-ui.cjs.map +1 -1
  532. package/dist/tools/read-asset-tool-ui.js +21 -70
  533. package/dist/tools/read-asset-tool-ui.js.map +1 -1
  534. package/dist/tools/step-text.cjs +21 -0
  535. package/dist/tools/step-text.cjs.map +1 -0
  536. package/dist/tools/step-text.d.ts +10 -0
  537. package/dist/tools/step-text.js +21 -0
  538. package/dist/tools/step-text.js.map +1 -0
  539. package/dist/tools/tool-fallback.cjs +24 -5
  540. package/dist/tools/tool-fallback.cjs.map +1 -1
  541. package/dist/tools/tool-fallback.d.ts +3 -1
  542. package/dist/tools/tool-fallback.js +24 -5
  543. package/dist/tools/tool-fallback.js.map +1 -1
  544. package/dist/tools/tool-summary.cjs +661 -0
  545. package/dist/tools/tool-summary.cjs.map +1 -0
  546. package/dist/tools/tool-summary.d.ts +99 -0
  547. package/dist/tools/tool-summary.js +661 -0
  548. package/dist/tools/tool-summary.js.map +1 -0
  549. package/dist/tools/tool-uis.cjs +37 -95
  550. package/dist/tools/tool-uis.cjs.map +1 -1
  551. package/dist/tools/tool-uis.js +37 -95
  552. package/dist/tools/tool-uis.js.map +1 -1
  553. package/dist/tools/voice-update-tool-ui.cjs +1 -1
  554. package/dist/tools/voice-update-tool-ui.js +1 -1
  555. package/dist/tools/write-todos-tool-ui.cjs +3 -2
  556. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  557. package/dist/tools/write-todos-tool-ui.d.ts +5 -0
  558. package/dist/tools/write-todos-tool-ui.js +5 -4
  559. package/dist/tools/write-todos-tool-ui.js.map +1 -1
  560. package/dist/ui/popover.cjs +6 -6
  561. package/dist/ui/popover.cjs.map +1 -1
  562. package/dist/ui/popover.js +6 -6
  563. package/dist/ui/popover.js.map +1 -1
  564. package/dist/ui/tooltip.cjs +16 -2
  565. package/dist/ui/tooltip.cjs.map +1 -1
  566. package/dist/ui/tooltip.d.ts +1 -1
  567. package/dist/ui/tooltip.js +16 -2
  568. package/dist/ui/tooltip.js.map +1 -1
  569. package/dist/version.cjs +1 -1
  570. package/dist/version.js +1 -1
  571. package/dist/voice/use-athena-voice-session.cjs.map +1 -1
  572. package/dist/voice/use-athena-voice-session.d.ts +3 -3
  573. package/dist/voice/use-athena-voice-session.js.map +1 -1
  574. package/dist/workbench/SessionWorkbench.cjs +378 -0
  575. package/dist/workbench/SessionWorkbench.cjs.map +1 -0
  576. package/dist/workbench/SessionWorkbench.d.ts +30 -0
  577. package/dist/workbench/SessionWorkbench.js +378 -0
  578. package/dist/workbench/SessionWorkbench.js.map +1 -0
  579. package/dist/workbench/session-workbench-context.cjs +26 -0
  580. package/dist/workbench/session-workbench-context.cjs.map +1 -0
  581. package/dist/workbench/session-workbench-context.d.ts +55 -0
  582. package/dist/workbench/session-workbench-context.js +26 -0
  583. package/dist/workbench/session-workbench-context.js.map +1 -0
  584. package/dist/workbench/session-workbench-model.cjs +288 -0
  585. package/dist/workbench/session-workbench-model.cjs.map +1 -0
  586. package/dist/workbench/session-workbench-model.d.ts +168 -0
  587. package/dist/workbench/session-workbench-model.js +288 -0
  588. package/dist/workbench/session-workbench-model.js.map +1 -0
  589. package/dist/workbench/session-workbench-panes.cjs +580 -0
  590. package/dist/workbench/session-workbench-panes.cjs.map +1 -0
  591. package/dist/workbench/session-workbench-panes.d.ts +16 -0
  592. package/dist/workbench/session-workbench-panes.js +580 -0
  593. package/dist/workbench/session-workbench-panes.js.map +1 -0
  594. package/dist/workbench/session-workspace-api.cjs +157 -0
  595. package/dist/workbench/session-workspace-api.cjs.map +1 -0
  596. package/dist/workbench/session-workspace-api.d.ts +70 -0
  597. package/dist/workbench/session-workspace-api.js +157 -0
  598. package/dist/workbench/session-workspace-api.js.map +1 -0
  599. package/dist/workbench/use-session-workspace.cjs +100 -0
  600. package/dist/workbench/use-session-workspace.cjs.map +1 -0
  601. package/dist/workbench/use-session-workspace.d.ts +45 -0
  602. package/dist/workbench/use-session-workspace.js +100 -0
  603. package/dist/workbench/use-session-workspace.js.map +1 -0
  604. package/dist/workbench/workbench-layout-context.cjs +10 -0
  605. package/dist/workbench/workbench-layout-context.cjs.map +1 -0
  606. package/dist/workbench/workbench-layout-context.d.ts +17 -0
  607. package/dist/workbench/workbench-layout-context.js +10 -0
  608. package/dist/workbench/workbench-layout-context.js.map +1 -0
  609. package/package.json +20 -9
  610. package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs +0 -77
  611. package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.cjs.map +0 -1
  612. package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js +0 -77
  613. package/dist/node_modules/@assistant-ui/react-langchain/dist/converter.js.map +0 -1
  614. package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs +0 -181
  615. package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.cjs.map +0 -1
  616. package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js +0 -181
  617. package/dist/node_modules/@assistant-ui/react-langgraph/dist/convertLangChainMessages.js.map +0 -1
  618. package/dist/packages/agent-runtime/src/asset-attachment.cjs.map +0 -1
  619. package/dist/packages/agent-runtime/src/asset-attachment.js.map +0 -1
  620. package/dist/packages/agent-runtime/src/auth-denial.cjs.map +0 -1
  621. package/dist/packages/agent-runtime/src/auth-denial.js.map +0 -1
  622. package/dist/packages/agent-runtime/src/client-tool-bridge.cjs.map +0 -1
  623. package/dist/packages/agent-runtime/src/client-tool-bridge.js.map +0 -1
  624. package/dist/packages/agent-runtime/src/client-tools.cjs.map +0 -1
  625. package/dist/packages/agent-runtime/src/client-tools.js.map +0 -1
  626. package/dist/packages/agent-runtime/src/conversation-index.cjs.map +0 -1
  627. package/dist/packages/agent-runtime/src/conversation-index.js.map +0 -1
  628. package/dist/packages/agent-runtime/src/conversation-list.cjs.map +0 -1
  629. package/dist/packages/agent-runtime/src/conversation-list.js.map +0 -1
  630. package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.cjs.map +0 -1
  631. package/dist/packages/agent-runtime/src/deep-agent-transport-recipe.js.map +0 -1
  632. package/dist/packages/agent-runtime/src/edit-command.cjs.map +0 -1
  633. package/dist/packages/agent-runtime/src/edit-command.js.map +0 -1
  634. package/dist/packages/agent-runtime/src/errors.cjs.map +0 -1
  635. package/dist/packages/agent-runtime/src/errors.js.map +0 -1
  636. package/dist/packages/agent-runtime/src/generated/runconfig-contract.cjs.map +0 -1
  637. package/dist/packages/agent-runtime/src/generated/runconfig-contract.js.map +0 -1
  638. package/dist/packages/agent-runtime/src/github-wake-event.cjs.map +0 -1
  639. package/dist/packages/agent-runtime/src/github-wake-event.js.map +0 -1
  640. package/dist/packages/agent-runtime/src/interrupts.cjs.map +0 -1
  641. package/dist/packages/agent-runtime/src/interrupts.js.map +0 -1
  642. package/dist/packages/agent-runtime/src/message-author.cjs.map +0 -1
  643. package/dist/packages/agent-runtime/src/message-author.js.map +0 -1
  644. package/dist/packages/agent-runtime/src/message-window.cjs.map +0 -1
  645. package/dist/packages/agent-runtime/src/message-window.js.map +0 -1
  646. package/dist/packages/agent-runtime/src/messages.cjs.map +0 -1
  647. package/dist/packages/agent-runtime/src/messages.js.map +0 -1
  648. package/dist/packages/agent-runtime/src/model-context.cjs.map +0 -1
  649. package/dist/packages/agent-runtime/src/model-context.js.map +0 -1
  650. package/dist/packages/agent-runtime/src/optimistic-content.cjs.map +0 -1
  651. package/dist/packages/agent-runtime/src/optimistic-content.js.map +0 -1
  652. package/dist/packages/agent-runtime/src/protocol.cjs.map +0 -1
  653. package/dist/packages/agent-runtime/src/protocol.js.map +0 -1
  654. package/dist/packages/agent-runtime/src/queue.cjs.map +0 -1
  655. package/dist/packages/agent-runtime/src/queue.js.map +0 -1
  656. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.cjs.map +0 -1
  657. package/dist/packages/agent-runtime/src/quota-safe-local-storage-session.js.map +0 -1
  658. package/dist/packages/agent-runtime/src/runtime-messages.cjs.map +0 -1
  659. package/dist/packages/agent-runtime/src/runtime-messages.js.map +0 -1
  660. package/dist/packages/agent-runtime/src/screen-point.cjs.map +0 -1
  661. package/dist/packages/agent-runtime/src/screen-point.js.map +0 -1
  662. package/dist/packages/agent-runtime/src/send-recovery.cjs.map +0 -1
  663. package/dist/packages/agent-runtime/src/send-recovery.js.map +0 -1
  664. package/dist/packages/agent-runtime/src/statewire-attach-observer.cjs.map +0 -1
  665. package/dist/packages/agent-runtime/src/statewire-attach-observer.js.map +0 -1
  666. package/dist/packages/agent-runtime/src/statewire-state.cjs.map +0 -1
  667. package/dist/packages/agent-runtime/src/statewire-state.js.map +0 -1
  668. package/dist/packages/agent-runtime/src/statewire-suspended.cjs.map +0 -1
  669. package/dist/packages/agent-runtime/src/statewire-suspended.js.map +0 -1
  670. package/dist/packages/agent-runtime/src/statewire-transport.cjs +0 -11
  671. package/dist/packages/agent-runtime/src/statewire-transport.cjs.map +0 -1
  672. package/dist/packages/agent-runtime/src/statewire-transport.js +0 -11
  673. package/dist/packages/agent-runtime/src/statewire-transport.js.map +0 -1
  674. package/dist/packages/agent-runtime/src/streaming-markdown.cjs.map +0 -1
  675. package/dist/packages/agent-runtime/src/streaming-markdown.js.map +0 -1
  676. package/dist/packages/agent-runtime/src/thread-extras.cjs.map +0 -1
  677. package/dist/packages/agent-runtime/src/thread-extras.js.map +0 -1
  678. package/dist/packages/agent-runtime/src/thread-snapshot-cache.cjs.map +0 -1
  679. package/dist/packages/agent-runtime/src/thread-snapshot-cache.js.map +0 -1
  680. package/dist/packages/agent-runtime/src/thread-status.cjs.map +0 -1
  681. package/dist/packages/agent-runtime/src/thread-status.js.map +0 -1
  682. package/dist/packages/agent-runtime/src/tool-metadata.cjs.map +0 -1
  683. package/dist/packages/agent-runtime/src/tool-metadata.js.map +0 -1
  684. package/dist/packages/agent-runtime/src/tool-outputs.cjs.map +0 -1
  685. package/dist/packages/agent-runtime/src/tool-outputs.js.map +0 -1
  686. package/dist/packages/agent-runtime/src/tool-result.cjs.map +0 -1
  687. package/dist/packages/agent-runtime/src/tool-result.js.map +0 -1
  688. package/dist/packages/agent-runtime/src/use-conversation-list.cjs.map +0 -1
  689. package/dist/packages/agent-runtime/src/use-conversation-list.js.map +0 -1
  690. package/dist/packages/agent-runtime/src/use-deep-agent-config.cjs.map +0 -1
  691. package/dist/packages/agent-runtime/src/use-deep-agent-config.js.map +0 -1
  692. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +0 -1
  693. package/dist/packages/agent-runtime/src/use-deep-agent-edit-submit.js.map +0 -1
  694. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.cjs.map +0 -1
  695. package/dist/packages/agent-runtime/src/use-deep-agent-runtime.js.map +0 -1
  696. package/dist/packages/agent-runtime/src/use-deep-agent-thread.cjs.map +0 -1
  697. package/dist/packages/agent-runtime/src/use-deep-agent-thread.js.map +0 -1
  698. package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.cjs.map +0 -1
  699. package/dist/packages/agent-runtime/src/use-deep-agent-window-sync.js.map +0 -1
  700. package/dist/packages/agent-runtime/src/voice-presentation.cjs.map +0 -1
  701. package/dist/packages/agent-runtime/src/voice-presentation.js.map +0 -1
  702. package/dist/packages/agent-runtime/src/voice-turn-grouping.cjs.map +0 -1
  703. package/dist/packages/agent-runtime/src/voice-turn-grouping.js.map +0 -1
  704. package/dist/packages/tiptap-markdown-table/src/markdown-table-serializer.cjs.map +0 -1
  705. package/dist/packages/tiptap-markdown-table/src/markdown-table-serializer.js.map +0 -1
  706. /package/dist/{packages/agent-runtime → agent-runtime}/src/asset-attachment.cjs +0 -0
  707. /package/dist/{packages/agent-runtime → agent-runtime}/src/asset-attachment.js +0 -0
  708. /package/dist/{packages/agent-runtime → agent-runtime}/src/auth-denial.cjs +0 -0
  709. /package/dist/{packages/agent-runtime → agent-runtime}/src/auth-denial.js +0 -0
  710. /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tool-bridge.cjs +0 -0
  711. /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tool-bridge.js +0 -0
  712. /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tools.cjs +0 -0
  713. /package/dist/{packages/agent-runtime → agent-runtime}/src/client-tools.js +0 -0
  714. /package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-index.cjs +0 -0
  715. /package/dist/{packages/agent-runtime → agent-runtime}/src/conversation-index.js +0 -0
  716. /package/dist/{packages/agent-runtime → agent-runtime}/src/edit-command.cjs +0 -0
  717. /package/dist/{packages/agent-runtime → agent-runtime}/src/edit-command.js +0 -0
  718. /package/dist/{packages/agent-runtime → agent-runtime}/src/github-wake-event.cjs +0 -0
  719. /package/dist/{packages/agent-runtime → agent-runtime}/src/github-wake-event.js +0 -0
  720. /package/dist/{packages/agent-runtime → agent-runtime}/src/message-author.cjs +0 -0
  721. /package/dist/{packages/agent-runtime → agent-runtime}/src/message-author.js +0 -0
  722. /package/dist/{packages/agent-runtime → agent-runtime}/src/message-window.cjs +0 -0
  723. /package/dist/{packages/agent-runtime → agent-runtime}/src/message-window.js +0 -0
  724. /package/dist/{packages/agent-runtime → agent-runtime}/src/model-context.cjs +0 -0
  725. /package/dist/{packages/agent-runtime → agent-runtime}/src/model-context.js +0 -0
  726. /package/dist/{packages/agent-runtime → agent-runtime}/src/optimistic-content.cjs +0 -0
  727. /package/dist/{packages/agent-runtime → agent-runtime}/src/optimistic-content.js +0 -0
  728. /package/dist/{packages/agent-runtime → agent-runtime}/src/protocol.cjs +0 -0
  729. /package/dist/{packages/agent-runtime → agent-runtime}/src/protocol.js +0 -0
  730. /package/dist/{packages/agent-runtime → agent-runtime}/src/runtime-messages.cjs +0 -0
  731. /package/dist/{packages/agent-runtime → agent-runtime}/src/runtime-messages.js +0 -0
  732. /package/dist/{packages/agent-runtime → agent-runtime}/src/screen-point.cjs +0 -0
  733. /package/dist/{packages/agent-runtime → agent-runtime}/src/screen-point.js +0 -0
  734. /package/dist/{packages/agent-runtime → agent-runtime}/src/send-recovery.cjs +0 -0
  735. /package/dist/{packages/agent-runtime → agent-runtime}/src/send-recovery.js +0 -0
  736. /package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-attach-observer.cjs +0 -0
  737. /package/dist/{packages/agent-runtime → agent-runtime}/src/statewire-attach-observer.js +0 -0
  738. /package/dist/{packages/agent-runtime → agent-runtime}/src/streaming-markdown.cjs +0 -0
  739. /package/dist/{packages/agent-runtime → agent-runtime}/src/streaming-markdown.js +0 -0
  740. /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-extras.cjs +0 -0
  741. /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-extras.js +0 -0
  742. /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-snapshot-cache.cjs +0 -0
  743. /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-snapshot-cache.js +0 -0
  744. /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-status.cjs +0 -0
  745. /package/dist/{packages/agent-runtime → agent-runtime}/src/thread-status.js +0 -0
  746. /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-outputs.cjs +0 -0
  747. /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-outputs.js +0 -0
  748. /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-result.cjs +0 -0
  749. /package/dist/{packages/agent-runtime → agent-runtime}/src/tool-result.js +0 -0
  750. /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-config.cjs +0 -0
  751. /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-config.js +0 -0
  752. /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-runtime.cjs +0 -0
  753. /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-runtime.js +0 -0
  754. /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-window-sync.cjs +0 -0
  755. /package/dist/{packages/agent-runtime → agent-runtime}/src/use-deep-agent-window-sync.js +0 -0
  756. /package/dist/{packages/agent-runtime → agent-runtime}/src/voice-turn-grouping.cjs +0 -0
  757. /package/dist/{packages/agent-runtime → agent-runtime}/src/voice-turn-grouping.js +0 -0
  758. /package/dist/{packages/react → react}/package.json.cjs.map +0 -0
  759. /package/dist/{packages/react → react}/package.json.js.map +0 -0
  760. /package/dist/{packages/tiptap-markdown-table → tiptap-markdown-table}/src/markdown-table-serializer.cjs +0 -0
  761. /package/dist/{packages/tiptap-markdown-table → tiptap-markdown-table}/src/markdown-table-serializer.js +0 -0
@@ -3,6 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const lucideReact = require("lucide-react");
6
+ const rangePreview = require("../sheet-range/range-preview.cjs");
7
+ const rangePreviewTable = require("../sheet-range/range-preview-table.cjs");
6
8
  const assetUtils = require("./asset-utils.cjs");
7
9
  const cnfast = require("cnfast");
8
10
  function normalizeResult(result) {
@@ -51,85 +53,34 @@ function isWorkbookFormat(value) {
51
53
  const workbook = obj.workbook;
52
54
  return Array.isArray(workbook.sheets);
53
55
  }
54
- function parseA1Range(range) {
55
- const match = range.match(/^([A-Z]+)(\d+)(?::([A-Z]+)(\d+))?$/i);
56
- if (!match) return null;
57
- const colToNumber = (letters) => letters.toUpperCase().split("").reduce((acc, char) => acc * 26 + (char.charCodeAt(0) - 64), 0);
58
- return {
59
- startCol: colToNumber(match[1]),
60
- startRow: Number.parseInt(match[2], 10),
61
- endCol: match[3] ? colToNumber(match[3]) : colToNumber(match[1]),
62
- endRow: match[4] ? Number.parseInt(match[4], 10) : Number.parseInt(match[2], 10)
63
- };
64
- }
65
- function numberToColumn(index) {
66
- let n = index;
67
- let output = "";
68
- while (n > 0) {
69
- const remainder = (n - 1) % 26;
70
- output = String.fromCharCode(65 + remainder) + output;
71
- n = Math.floor((n - 1) / 26);
72
- }
73
- return output;
74
- }
75
56
  function formatCellValue(value) {
76
57
  if (value === null || value === void 0) return "";
77
58
  if (Array.isArray(value)) return String(value[0] ?? "");
78
59
  return String(value);
79
60
  }
61
+ const WORKBOOK_PREVIEW_MAX_ROWS = 12;
62
+ const WORKBOOK_PREVIEW_MAX_COLUMNS = 8;
80
63
  function WorkbookPreview({ workbook }) {
81
64
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: workbook.workbook.sheets.map((sheet) => {
82
- const parsedRange = parseA1Range(sheet.dimension);
83
- if (!parsedRange) return null;
84
- const maxRows = Math.min(
85
- parsedRange.endRow - parsedRange.startRow + 1,
86
- 12
87
- );
88
- const maxCols = Math.min(
89
- parsedRange.endCol - parsedRange.startCol + 1,
90
- 8
91
- );
92
- const header = [
93
- "",
94
- ...Array.from(
95
- { length: maxCols },
96
- (_, idx) => numberToColumn(parsedRange.startCol + idx)
97
- )
98
- ];
99
- const dataRows = [];
100
- for (let row = 0; row < maxRows; row++) {
101
- const rowNumber = parsedRange.startRow + row;
102
- const values = [String(rowNumber)];
103
- for (let col = 0; col < maxCols; col++) {
104
- const colLabel = numberToColumn(parsedRange.startCol + col);
105
- values.push(
106
- formatCellValue(sheet.cells[`${colLabel}${rowNumber}`])
107
- );
108
- }
109
- dataRows.push(values);
110
- }
65
+ const preview = rangePreview.rangePreviewFromCellMap({
66
+ range: sheet.dimension,
67
+ cells: sheet.cells ?? {},
68
+ formatCell: formatCellValue,
69
+ maxRows: WORKBOOK_PREVIEW_MAX_ROWS,
70
+ maxColumns: WORKBOOK_PREVIEW_MAX_COLUMNS
71
+ });
72
+ if (!preview) return null;
111
73
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
112
74
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-1 text-xs font-semibold text-muted-foreground", children: sheet.sheetName }),
113
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto rounded-md border", children: /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full border-collapse text-[11px]", children: /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
114
- /* @__PURE__ */ jsxRuntime.jsx("tr", { children: header.map((cell, i) => /* @__PURE__ */ jsxRuntime.jsx(
115
- "th",
116
- {
117
- className: "border bg-muted px-2 py-1 text-left font-medium text-muted-foreground",
118
- children: cell
119
- },
120
- i
121
- )) }),
122
- dataRows.map((row, rowIdx) => /* @__PURE__ */ jsxRuntime.jsx("tr", { children: row.map(
123
- (cell, cellIdx) => cellIdx === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
124
- "th",
125
- {
126
- className: "border bg-muted px-2 py-1 text-left font-medium text-muted-foreground",
127
- children: cell
128
- },
129
- cellIdx
130
- ) : /* @__PURE__ */ jsxRuntime.jsx("td", { className: "border px-2 py-1", children: cell }, cellIdx)
131
- ) }, rowIdx))
132
- ] }) }) }),
75
+ /* @__PURE__ */ jsxRuntime.jsx(
76
+ rangePreviewTable.RangePreviewTable,
77
+ {
78
+ preview,
79
+ maxRows: WORKBOOK_PREVIEW_MAX_ROWS,
80
+ maxColumns: WORKBOOK_PREVIEW_MAX_COLUMNS,
81
+ caption: `${sheet.sheetName} ${sheet.dimension}`
82
+ }
83
+ ),
133
84
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-1 text-[10px] text-muted-foreground", children: [
134
85
  "Showing preview from ",
135
86
  sheet.dimension
@@ -1 +1 @@
1
- {"version":3,"file":"read-asset-tool-ui.cjs","sources":["../../src/tools/read-asset-tool-ui.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n FileTextIcon,\n LoaderIcon,\n AlertCircleIcon,\n BookOpenIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { getAssetInfo, tryParseJson } from \"./asset-utils\";\n\nfunction normalizeResult(result: unknown): unknown {\n if (typeof result === \"string\") return tryParseJson(result) ?? result;\n if (typeof result === \"object\" && result !== null) {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\")\n return tryParseJson(obj.result) ?? obj.result;\n return obj;\n }\n return result;\n}\n\nfunction isErrorResult(resultText: string): boolean {\n return (\n resultText.startsWith(\"Error reading asset\") ||\n resultText.startsWith(\"Error:\")\n );\n}\n\ninterface ReadAssetResultItem {\n asset_id?: string;\n format?: string;\n content?: string;\n success?: boolean;\n error?: string;\n title?: string;\n}\n\nfunction isReadAssetResultItem(value: unknown): value is ReadAssetResultItem {\n if (!value || typeof value !== \"object\") return false;\n const item = value as Record<string, unknown>;\n return (\n typeof item.asset_id === \"string\" ||\n typeof item.format === \"string\" ||\n typeof item.content === \"string\" ||\n typeof item.success === \"boolean\" ||\n typeof item.error === \"string\"\n );\n}\n\nfunction getResultItems(value: unknown): ReadAssetResultItem[] {\n if (Array.isArray(value)) return value.filter(isReadAssetResultItem);\n if (isReadAssetResultItem(value)) return [value];\n return [];\n}\n\nfunction getResultAssetIds(items: ReadAssetResultItem[]): string[] {\n return items\n .map((item) => item.asset_id?.split(\"?\")[0])\n .filter((assetId): assetId is string => !!assetId);\n}\n\nfunction getReviewedText(items: ReadAssetResultItem[]): string | null {\n const textParts = items\n .filter(\n (item) =>\n item.success !== false &&\n typeof item.content === \"string\" &&\n item.content,\n )\n .map((item) => item.content as string);\n return textParts.length > 0 ? textParts.join(\"\\n\\n---\\n\\n\") : null;\n}\n\nfunction getErrorText(items: ReadAssetResultItem[]): string | null {\n const firstError = items.find((item) => item.success === false && item.error);\n return firstError?.error ?? null;\n}\n\n// --- Workbook preview ---\n\ntype WorkbookCellValue =\n | string\n | number\n | boolean\n | null\n | [string, unknown]\n | [string, unknown, string];\n\ninterface WorkbookSheet {\n sheetName: string;\n dimension: string;\n cells: Record<string, WorkbookCellValue>;\n}\n\ninterface WorkbookFormat {\n workbook: {\n sheets: WorkbookSheet[];\n };\n}\n\nfunction isWorkbookFormat(value: unknown): value is WorkbookFormat {\n if (!value || typeof value !== \"object\") return false;\n const obj = value as Record<string, unknown>;\n if (!obj.workbook || typeof obj.workbook !== \"object\") return false;\n const workbook = obj.workbook as Record<string, unknown>;\n return Array.isArray(workbook.sheets);\n}\n\nfunction parseA1Range(range: string) {\n const match = range.match(/^([A-Z]+)(\\d+)(?::([A-Z]+)(\\d+))?$/i);\n if (!match) return null;\n const colToNumber = (letters: string) =>\n letters\n .toUpperCase()\n .split(\"\")\n .reduce((acc, char) => acc * 26 + (char.charCodeAt(0) - 64), 0);\n return {\n startCol: colToNumber(match[1]),\n startRow: Number.parseInt(match[2], 10),\n endCol: match[3] ? colToNumber(match[3]) : colToNumber(match[1]),\n endRow: match[4]\n ? Number.parseInt(match[4], 10)\n : Number.parseInt(match[2], 10),\n };\n}\n\nfunction numberToColumn(index: number): string {\n let n = index;\n let output = \"\";\n while (n > 0) {\n const remainder = (n - 1) % 26;\n output = String.fromCharCode(65 + remainder) + output;\n n = Math.floor((n - 1) / 26);\n }\n return output;\n}\n\nfunction formatCellValue(value: WorkbookCellValue): string {\n if (value === null || value === undefined) return \"\";\n if (Array.isArray(value)) return String(value[0] ?? \"\");\n return String(value);\n}\n\nfunction WorkbookPreview({ workbook }: { workbook: WorkbookFormat }) {\n return (\n <div className=\"space-y-3\">\n {workbook.workbook.sheets.map((sheet) => {\n const parsedRange = parseA1Range(sheet.dimension);\n if (!parsedRange) return null;\n\n const maxRows = Math.min(\n parsedRange.endRow - parsedRange.startRow + 1,\n 12,\n );\n const maxCols = Math.min(\n parsedRange.endCol - parsedRange.startCol + 1,\n 8,\n );\n const header = [\n \"\",\n ...Array.from({ length: maxCols }, (_, idx) =>\n numberToColumn(parsedRange.startCol + idx),\n ),\n ];\n const dataRows: string[][] = [];\n for (let row = 0; row < maxRows; row++) {\n const rowNumber = parsedRange.startRow + row;\n const values = [String(rowNumber)];\n for (let col = 0; col < maxCols; col++) {\n const colLabel = numberToColumn(parsedRange.startCol + col);\n values.push(\n formatCellValue(sheet.cells[`${colLabel}${rowNumber}`]),\n );\n }\n dataRows.push(values);\n }\n\n return (\n <div key={sheet.sheetName}>\n <p className=\"mb-1 text-xs font-semibold text-muted-foreground\">\n {sheet.sheetName}\n </p>\n <div className=\"overflow-x-auto rounded-md border\">\n <table className=\"w-full border-collapse text-[11px]\">\n <tbody>\n <tr>\n {header.map((cell, i) => (\n <th\n key={i}\n className=\"border bg-muted px-2 py-1 text-left font-medium text-muted-foreground\"\n >\n {cell}\n </th>\n ))}\n </tr>\n {dataRows.map((row, rowIdx) => (\n <tr key={rowIdx}>\n {row.map((cell, cellIdx) =>\n cellIdx === 0 ? (\n <th\n key={cellIdx}\n className=\"border bg-muted px-2 py-1 text-left font-medium text-muted-foreground\"\n >\n {cell}\n </th>\n ) : (\n <td key={cellIdx} className=\"border px-2 py-1\">\n {cell}\n </td>\n ),\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Showing preview from {sheet.dimension}\n </p>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction TextContentPreview({ text }: { text: string }) {\n const lines = text.split(\"\\n\");\n const previewLines = lines.slice(0, 20);\n const hasMore = lines.length > 20;\n\n return (\n <pre className=\"whitespace-pre-wrap break-words text-[12px] leading-[1.6] text-muted-foreground\">\n {previewLines.join(\"\\n\")}\n {hasMore && (\n <span className=\"text-muted-foreground/70\">{`\\n... ${lines.length - 20} more lines`}</span>\n )}\n </pre>\n );\n}\n\n// --- Main component ---\n\nconst ReadAssetToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n result,\n status,\n isError: isToolError,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const typedArgs = args as Record<string, unknown> | undefined;\n const assetIds = (typedArgs?.asset_ids as string[]) ?? [];\n const firstAssetId = assetIds[0] ?? \"\";\n const assetCount = assetIds.length;\n\n const normalizedResult = useMemo(() => normalizeResult(result), [result]);\n const resultItems = useMemo(\n () => getResultItems(normalizedResult),\n [normalizedResult],\n );\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const isIncomplete = status?.type === \"incomplete\";\n\n const reviewedText = useMemo(\n () => getReviewedText(resultItems),\n [resultItems],\n );\n const resultText =\n typeof normalizedResult === \"string\" ? normalizedResult : reviewedText;\n const workbookData = isWorkbookFormat(normalizedResult)\n ? normalizedResult\n : null;\n const failedItems = resultItems.filter((item) => item.success === false);\n const allFailed =\n resultItems.length > 0 && failedItems.length === resultItems.length;\n const hasPartialIssues = failedItems.length > 0 && !allFailed;\n const resultError = getErrorText(resultItems);\n const hasError =\n isToolError ||\n isIncomplete ||\n allFailed ||\n (resultText != null && isErrorResult(resultText));\n\n const resultAssetIds = getResultAssetIds(resultItems);\n const resolvedAssetCount = Math.max(assetCount, new Set(resultAssetIds).size);\n const primaryAsset = getAssetInfo(firstAssetId || resultAssetIds[0] || \"\");\n // Prefer human titles over raw asset ids — an `asset_<uuid>` label reads as\n // garble to non-technical users. Multi-reads get a per-source checklist of\n // titles below the header; when the runtime offloaded the result (no titles\n // survive, only ids), fall back to a plain count rather than a uuid.\n const resultTitle = resultItems.find((item) => item.title)?.title;\n const isOpaqueId = (label: string) => /^asset_[0-9a-f-]{8,}/i.test(label);\n const primaryLabel =\n resultTitle ??\n (isOpaqueId(primaryAsset.name) ? \"1 document\" : primaryAsset.name);\n const sourceList =\n resolvedAssetCount > 1\n ? resultItems\n .filter((item) => typeof item.title === \"string\" && item.title !== \"\")\n .map((item, index) => ({\n key: item.asset_id ?? `${index}-${item.title}`,\n label: item.title as string,\n failed: item.success === false,\n }))\n : [];\n const assetLabel =\n resolvedAssetCount > 1\n ? `${resolvedAssetCount} documents`\n : primaryLabel;\n const statusTitle = isRunning\n ? \"Reviewing asset content\"\n : hasError\n ? \"Asset content review failed\"\n : hasPartialIssues\n ? \"Asset content reviewed with issues\"\n : \"Asset content review complete\";\n const badge = hasPartialIssues\n ? `${failedItems.length} ${failedItems.length === 1 ? \"issue\" : \"issues\"}`\n : resolvedAssetCount > 1\n ? `${resolvedAssetCount} sources`\n : workbookData\n ? \"Workbook review\"\n : \"Content review\";\n\n const hasContent =\n (isComplete || isIncomplete) && (resultText || workbookData);\n const errorMessage =\n status?.type === \"incomplete\"\n ? String(status.error ?? \"Content review failed\")\n : (resultError ?? (hasError && resultText ? resultText : null));\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 && !hasError && \"bg-emerald-50 text-emerald-600\",\n isComplete && hasError && \"bg-red-50 text-red-500\",\n isIncomplete && \"bg-red-50 text-red-500\",\n !isRunning &&\n !isComplete &&\n !isIncomplete &&\n \"bg-muted text-muted-foreground\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : hasError || isIncomplete ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <BookOpenIcon 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\">{statusTitle}</span>\n {isComplete && !hasError && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n <span className=\"rounded-full border border-border/60 bg-muted/50 px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {badge}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <FileTextIcon className=\"size-4\" />\n <span className=\"truncate text-[12px] text-muted-foreground\">\n Source: {assetLabel}\n </span>\n </div>\n </div>\n\n {/* Loading shimmer for streaming */}\n {isRunning && (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-1.5 w-12 animate-pulse rounded-full bg-blue-100\" />\n <div className=\"h-1.5 w-8 animate-pulse rounded-full bg-blue-100\" />\n </div>\n )}\n </div>\n\n {/* Per-source checklist — actual titles with checkmarks (multi-read only;\n offloaded results carry no titles, so the header count stands alone) */}\n {sourceList.length > 1 && (\n <ul className=\"border-t px-4 py-2\">\n {sourceList.slice(0, 8).map((source) => (\n <li\n key={source.key}\n className=\"flex items-center gap-2 py-0.5 text-[12px] text-muted-foreground\"\n >\n {source.failed ? (\n <AlertCircleIcon className=\"size-3.5 shrink-0 text-red-400\" />\n ) : (\n <CheckCircle2Icon className=\"size-3.5 shrink-0 text-emerald-500\" />\n )}\n <span className=\"min-w-0 truncate\">{source.label}</span>\n </li>\n ))}\n {sourceList.length > 8 && (\n <li className=\"py-0.5 text-[11px] text-muted-foreground/70\">\n and {sourceList.length - 8} more\n </li>\n )}\n </ul>\n )}\n\n {/* Error message */}\n {hasError && errorMessage && (\n <div className=\"border-t bg-red-50/50 px-4 py-2.5\">\n <p className=\"text-[12px] leading-relaxed text-red-600\">\n {errorMessage}\n </p>\n </div>\n )}\n\n {/* Content preview (non-error) */}\n {hasContent && !hasError && (\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>\n {expanded ? \"Hide reviewed content\" : \"Show reviewed content\"}\n </span>\n </button>\n\n {expanded && (\n <div className=\"max-h-80 overflow-y-auto border-t bg-muted/30 px-4 py-3\">\n <div className=\"mb-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Reviewed content\n </div>\n {workbookData ? (\n <WorkbookPreview workbook={workbookData} />\n ) : resultText ? (\n <TextContentPreview text={resultText} />\n ) : null}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const ReadAssetToolUI = memo(\n ReadAssetToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\n\nReadAssetToolUI.displayName = \"ReadAssetToolUI\";\n"],"names":["tryParseJson","jsx","jsxs","useState","useMemo","getAssetInfo","cn","LoaderIcon","AlertCircleIcon","BookOpenIcon","CheckCircle2Icon","FileTextIcon","ChevronDownIcon","memo"],"mappings":"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"}
1
+ {"version":3,"file":"read-asset-tool-ui.cjs","sources":["../../src/tools/read-asset-tool-ui.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n FileTextIcon,\n LoaderIcon,\n AlertCircleIcon,\n BookOpenIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { rangePreviewFromCellMap } from \"../sheet-range/range-preview\";\nimport { RangePreviewTable } from \"../sheet-range/range-preview-table\";\nimport { getAssetInfo, tryParseJson } from \"./asset-utils\";\n\nfunction normalizeResult(result: unknown): unknown {\n if (typeof result === \"string\") return tryParseJson(result) ?? result;\n if (typeof result === \"object\" && result !== null) {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\")\n return tryParseJson(obj.result) ?? obj.result;\n return obj;\n }\n return result;\n}\n\nfunction isErrorResult(resultText: string): boolean {\n return (\n resultText.startsWith(\"Error reading asset\") ||\n resultText.startsWith(\"Error:\")\n );\n}\n\ninterface ReadAssetResultItem {\n asset_id?: string;\n format?: string;\n content?: string;\n success?: boolean;\n error?: string;\n title?: string;\n}\n\nfunction isReadAssetResultItem(value: unknown): value is ReadAssetResultItem {\n if (!value || typeof value !== \"object\") return false;\n const item = value as Record<string, unknown>;\n return (\n typeof item.asset_id === \"string\" ||\n typeof item.format === \"string\" ||\n typeof item.content === \"string\" ||\n typeof item.success === \"boolean\" ||\n typeof item.error === \"string\"\n );\n}\n\nfunction getResultItems(value: unknown): ReadAssetResultItem[] {\n if (Array.isArray(value)) return value.filter(isReadAssetResultItem);\n if (isReadAssetResultItem(value)) return [value];\n return [];\n}\n\nfunction getResultAssetIds(items: ReadAssetResultItem[]): string[] {\n return items\n .map((item) => item.asset_id?.split(\"?\")[0])\n .filter((assetId): assetId is string => !!assetId);\n}\n\nfunction getReviewedText(items: ReadAssetResultItem[]): string | null {\n const textParts = items\n .filter(\n (item) =>\n item.success !== false &&\n typeof item.content === \"string\" &&\n item.content,\n )\n .map((item) => item.content as string);\n return textParts.length > 0 ? textParts.join(\"\\n\\n---\\n\\n\") : null;\n}\n\nfunction getErrorText(items: ReadAssetResultItem[]): string | null {\n const firstError = items.find((item) => item.success === false && item.error);\n return firstError?.error ?? null;\n}\n\n// --- Workbook preview ---\n\ntype WorkbookCellValue =\n | string\n | number\n | boolean\n | null\n | [string, unknown]\n | [string, unknown, string];\n\ninterface WorkbookSheet {\n sheetName: string;\n dimension: string;\n cells: Record<string, WorkbookCellValue>;\n}\n\ninterface WorkbookFormat {\n workbook: {\n sheets: WorkbookSheet[];\n };\n}\n\nfunction isWorkbookFormat(value: unknown): value is WorkbookFormat {\n if (!value || typeof value !== \"object\") return false;\n const obj = value as Record<string, unknown>;\n if (!obj.workbook || typeof obj.workbook !== \"object\") return false;\n const workbook = obj.workbook as Record<string, unknown>;\n return Array.isArray(workbook.sheets);\n}\n\nfunction formatCellValue(value: WorkbookCellValue | undefined): string {\n if (value === null || value === undefined) return \"\";\n if (Array.isArray(value)) return String(value[0] ?? \"\");\n return String(value);\n}\n\n// A glance at each sheet, not the whole of it: the card's body is short.\nconst WORKBOOK_PREVIEW_MAX_ROWS = 12;\nconst WORKBOOK_PREVIEW_MAX_COLUMNS = 8;\n\nfunction WorkbookPreview({ workbook }: { workbook: WorkbookFormat }) {\n return (\n <div className=\"space-y-3\">\n {workbook.workbook.sheets.map((sheet) => {\n const preview = rangePreviewFromCellMap({\n range: sheet.dimension,\n cells: sheet.cells ?? {},\n formatCell: formatCellValue,\n maxRows: WORKBOOK_PREVIEW_MAX_ROWS,\n maxColumns: WORKBOOK_PREVIEW_MAX_COLUMNS,\n });\n if (!preview) return null;\n\n return (\n <div key={sheet.sheetName}>\n <p className=\"mb-1 text-xs font-semibold text-muted-foreground\">\n {sheet.sheetName}\n </p>\n <RangePreviewTable\n preview={preview}\n maxRows={WORKBOOK_PREVIEW_MAX_ROWS}\n maxColumns={WORKBOOK_PREVIEW_MAX_COLUMNS}\n caption={`${sheet.sheetName} ${sheet.dimension}`}\n />\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Showing preview from {sheet.dimension}\n </p>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction TextContentPreview({ text }: { text: string }) {\n const lines = text.split(\"\\n\");\n const previewLines = lines.slice(0, 20);\n const hasMore = lines.length > 20;\n\n return (\n <pre className=\"whitespace-pre-wrap break-words text-[12px] leading-[1.6] text-muted-foreground\">\n {previewLines.join(\"\\n\")}\n {hasMore && (\n <span className=\"text-muted-foreground/70\">{`\\n... ${lines.length - 20} more lines`}</span>\n )}\n </pre>\n );\n}\n\n// --- Main component ---\n\nconst ReadAssetToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n result,\n status,\n isError: isToolError,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const typedArgs = args as Record<string, unknown> | undefined;\n const assetIds = (typedArgs?.asset_ids as string[]) ?? [];\n const firstAssetId = assetIds[0] ?? \"\";\n const assetCount = assetIds.length;\n\n const normalizedResult = useMemo(() => normalizeResult(result), [result]);\n const resultItems = useMemo(\n () => getResultItems(normalizedResult),\n [normalizedResult],\n );\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const isIncomplete = status?.type === \"incomplete\";\n\n const reviewedText = useMemo(\n () => getReviewedText(resultItems),\n [resultItems],\n );\n const resultText =\n typeof normalizedResult === \"string\" ? normalizedResult : reviewedText;\n const workbookData = isWorkbookFormat(normalizedResult)\n ? normalizedResult\n : null;\n const failedItems = resultItems.filter((item) => item.success === false);\n const allFailed =\n resultItems.length > 0 && failedItems.length === resultItems.length;\n const hasPartialIssues = failedItems.length > 0 && !allFailed;\n const resultError = getErrorText(resultItems);\n const hasError =\n isToolError ||\n isIncomplete ||\n allFailed ||\n (resultText != null && isErrorResult(resultText));\n\n const resultAssetIds = getResultAssetIds(resultItems);\n const resolvedAssetCount = Math.max(assetCount, new Set(resultAssetIds).size);\n const primaryAsset = getAssetInfo(firstAssetId || resultAssetIds[0] || \"\");\n // Prefer human titles over raw asset ids — an `asset_<uuid>` label reads as\n // garble to non-technical users. Multi-reads get a per-source checklist of\n // titles below the header; when the runtime offloaded the result (no titles\n // survive, only ids), fall back to a plain count rather than a uuid.\n const resultTitle = resultItems.find((item) => item.title)?.title;\n const isOpaqueId = (label: string) => /^asset_[0-9a-f-]{8,}/i.test(label);\n const primaryLabel =\n resultTitle ??\n (isOpaqueId(primaryAsset.name) ? \"1 document\" : primaryAsset.name);\n const sourceList =\n resolvedAssetCount > 1\n ? resultItems\n .filter((item) => typeof item.title === \"string\" && item.title !== \"\")\n .map((item, index) => ({\n key: item.asset_id ?? `${index}-${item.title}`,\n label: item.title as string,\n failed: item.success === false,\n }))\n : [];\n const assetLabel =\n resolvedAssetCount > 1\n ? `${resolvedAssetCount} documents`\n : primaryLabel;\n const statusTitle = isRunning\n ? \"Reviewing asset content\"\n : hasError\n ? \"Asset content review failed\"\n : hasPartialIssues\n ? \"Asset content reviewed with issues\"\n : \"Asset content review complete\";\n const badge = hasPartialIssues\n ? `${failedItems.length} ${failedItems.length === 1 ? \"issue\" : \"issues\"}`\n : resolvedAssetCount > 1\n ? `${resolvedAssetCount} sources`\n : workbookData\n ? \"Workbook review\"\n : \"Content review\";\n\n const hasContent =\n (isComplete || isIncomplete) && (resultText || workbookData);\n const errorMessage =\n status?.type === \"incomplete\"\n ? String(status.error ?? \"Content review failed\")\n : (resultError ?? (hasError && resultText ? resultText : null));\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 && !hasError && \"bg-emerald-50 text-emerald-600\",\n isComplete && hasError && \"bg-red-50 text-red-500\",\n isIncomplete && \"bg-red-50 text-red-500\",\n !isRunning &&\n !isComplete &&\n !isIncomplete &&\n \"bg-muted text-muted-foreground\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : hasError || isIncomplete ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <BookOpenIcon 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\">{statusTitle}</span>\n {isComplete && !hasError && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n <span className=\"rounded-full border border-border/60 bg-muted/50 px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {badge}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <FileTextIcon className=\"size-4\" />\n <span className=\"truncate text-[12px] text-muted-foreground\">\n Source: {assetLabel}\n </span>\n </div>\n </div>\n\n {/* Loading shimmer for streaming */}\n {isRunning && (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-1.5 w-12 animate-pulse rounded-full bg-blue-100\" />\n <div className=\"h-1.5 w-8 animate-pulse rounded-full bg-blue-100\" />\n </div>\n )}\n </div>\n\n {/* Per-source checklist — actual titles with checkmarks (multi-read only;\n offloaded results carry no titles, so the header count stands alone) */}\n {sourceList.length > 1 && (\n <ul className=\"border-t px-4 py-2\">\n {sourceList.slice(0, 8).map((source) => (\n <li\n key={source.key}\n className=\"flex items-center gap-2 py-0.5 text-[12px] text-muted-foreground\"\n >\n {source.failed ? (\n <AlertCircleIcon className=\"size-3.5 shrink-0 text-red-400\" />\n ) : (\n <CheckCircle2Icon className=\"size-3.5 shrink-0 text-emerald-500\" />\n )}\n <span className=\"min-w-0 truncate\">{source.label}</span>\n </li>\n ))}\n {sourceList.length > 8 && (\n <li className=\"py-0.5 text-[11px] text-muted-foreground/70\">\n and {sourceList.length - 8} more\n </li>\n )}\n </ul>\n )}\n\n {/* Error message */}\n {hasError && errorMessage && (\n <div className=\"border-t bg-red-50/50 px-4 py-2.5\">\n <p className=\"text-[12px] leading-relaxed text-red-600\">\n {errorMessage}\n </p>\n </div>\n )}\n\n {/* Content preview (non-error) */}\n {hasContent && !hasError && (\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>\n {expanded ? \"Hide reviewed content\" : \"Show reviewed content\"}\n </span>\n </button>\n\n {expanded && (\n <div className=\"max-h-80 overflow-y-auto border-t bg-muted/30 px-4 py-3\">\n <div className=\"mb-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Reviewed content\n </div>\n {workbookData ? (\n <WorkbookPreview workbook={workbookData} />\n ) : resultText ? (\n <TextContentPreview text={resultText} />\n ) : null}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const ReadAssetToolUI = memo(\n ReadAssetToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\n\nReadAssetToolUI.displayName = \"ReadAssetToolUI\";\n"],"names":["tryParseJson","jsx","rangePreviewFromCellMap","RangePreviewTable","jsxs","useState","useMemo","getAssetInfo","cn","LoaderIcon","AlertCircleIcon","BookOpenIcon","CheckCircle2Icon","FileTextIcon","ChevronDownIcon","memo"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { memo, useState, useMemo } from "react";
3
3
  import { LoaderIcon, AlertCircleIcon, BookOpenIcon, CheckCircle2Icon, FileTextIcon, ChevronDownIcon } from "lucide-react";
4
+ import { rangePreviewFromCellMap } from "../sheet-range/range-preview.js";
5
+ import { RangePreviewTable } from "../sheet-range/range-preview-table.js";
4
6
  import { getAssetInfo, tryParseJson } from "./asset-utils.js";
5
7
  import { cn } from "cnfast";
6
8
  function normalizeResult(result) {
@@ -49,85 +51,34 @@ function isWorkbookFormat(value) {
49
51
  const workbook = obj.workbook;
50
52
  return Array.isArray(workbook.sheets);
51
53
  }
52
- function parseA1Range(range) {
53
- const match = range.match(/^([A-Z]+)(\d+)(?::([A-Z]+)(\d+))?$/i);
54
- if (!match) return null;
55
- const colToNumber = (letters) => letters.toUpperCase().split("").reduce((acc, char) => acc * 26 + (char.charCodeAt(0) - 64), 0);
56
- return {
57
- startCol: colToNumber(match[1]),
58
- startRow: Number.parseInt(match[2], 10),
59
- endCol: match[3] ? colToNumber(match[3]) : colToNumber(match[1]),
60
- endRow: match[4] ? Number.parseInt(match[4], 10) : Number.parseInt(match[2], 10)
61
- };
62
- }
63
- function numberToColumn(index) {
64
- let n = index;
65
- let output = "";
66
- while (n > 0) {
67
- const remainder = (n - 1) % 26;
68
- output = String.fromCharCode(65 + remainder) + output;
69
- n = Math.floor((n - 1) / 26);
70
- }
71
- return output;
72
- }
73
54
  function formatCellValue(value) {
74
55
  if (value === null || value === void 0) return "";
75
56
  if (Array.isArray(value)) return String(value[0] ?? "");
76
57
  return String(value);
77
58
  }
59
+ const WORKBOOK_PREVIEW_MAX_ROWS = 12;
60
+ const WORKBOOK_PREVIEW_MAX_COLUMNS = 8;
78
61
  function WorkbookPreview({ workbook }) {
79
62
  return /* @__PURE__ */ jsx("div", { className: "space-y-3", children: workbook.workbook.sheets.map((sheet) => {
80
- const parsedRange = parseA1Range(sheet.dimension);
81
- if (!parsedRange) return null;
82
- const maxRows = Math.min(
83
- parsedRange.endRow - parsedRange.startRow + 1,
84
- 12
85
- );
86
- const maxCols = Math.min(
87
- parsedRange.endCol - parsedRange.startCol + 1,
88
- 8
89
- );
90
- const header = [
91
- "",
92
- ...Array.from(
93
- { length: maxCols },
94
- (_, idx) => numberToColumn(parsedRange.startCol + idx)
95
- )
96
- ];
97
- const dataRows = [];
98
- for (let row = 0; row < maxRows; row++) {
99
- const rowNumber = parsedRange.startRow + row;
100
- const values = [String(rowNumber)];
101
- for (let col = 0; col < maxCols; col++) {
102
- const colLabel = numberToColumn(parsedRange.startCol + col);
103
- values.push(
104
- formatCellValue(sheet.cells[`${colLabel}${rowNumber}`])
105
- );
106
- }
107
- dataRows.push(values);
108
- }
63
+ const preview = rangePreviewFromCellMap({
64
+ range: sheet.dimension,
65
+ cells: sheet.cells ?? {},
66
+ formatCell: formatCellValue,
67
+ maxRows: WORKBOOK_PREVIEW_MAX_ROWS,
68
+ maxColumns: WORKBOOK_PREVIEW_MAX_COLUMNS
69
+ });
70
+ if (!preview) return null;
109
71
  return /* @__PURE__ */ jsxs("div", { children: [
110
72
  /* @__PURE__ */ jsx("p", { className: "mb-1 text-xs font-semibold text-muted-foreground", children: sheet.sheetName }),
111
- /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded-md border", children: /* @__PURE__ */ jsx("table", { className: "w-full border-collapse text-[11px]", children: /* @__PURE__ */ jsxs("tbody", { children: [
112
- /* @__PURE__ */ jsx("tr", { children: header.map((cell, i) => /* @__PURE__ */ jsx(
113
- "th",
114
- {
115
- className: "border bg-muted px-2 py-1 text-left font-medium text-muted-foreground",
116
- children: cell
117
- },
118
- i
119
- )) }),
120
- dataRows.map((row, rowIdx) => /* @__PURE__ */ jsx("tr", { children: row.map(
121
- (cell, cellIdx) => cellIdx === 0 ? /* @__PURE__ */ jsx(
122
- "th",
123
- {
124
- className: "border bg-muted px-2 py-1 text-left font-medium text-muted-foreground",
125
- children: cell
126
- },
127
- cellIdx
128
- ) : /* @__PURE__ */ jsx("td", { className: "border px-2 py-1", children: cell }, cellIdx)
129
- ) }, rowIdx))
130
- ] }) }) }),
73
+ /* @__PURE__ */ jsx(
74
+ RangePreviewTable,
75
+ {
76
+ preview,
77
+ maxRows: WORKBOOK_PREVIEW_MAX_ROWS,
78
+ maxColumns: WORKBOOK_PREVIEW_MAX_COLUMNS,
79
+ caption: `${sheet.sheetName} ${sheet.dimension}`
80
+ }
81
+ ),
131
82
  /* @__PURE__ */ jsxs("p", { className: "mt-1 text-[10px] text-muted-foreground", children: [
132
83
  "Showing preview from ",
133
84
  sheet.dimension
@@ -1 +1 @@
1
- {"version":3,"file":"read-asset-tool-ui.js","sources":["../../src/tools/read-asset-tool-ui.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n FileTextIcon,\n LoaderIcon,\n AlertCircleIcon,\n BookOpenIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { getAssetInfo, tryParseJson } from \"./asset-utils\";\n\nfunction normalizeResult(result: unknown): unknown {\n if (typeof result === \"string\") return tryParseJson(result) ?? result;\n if (typeof result === \"object\" && result !== null) {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\")\n return tryParseJson(obj.result) ?? obj.result;\n return obj;\n }\n return result;\n}\n\nfunction isErrorResult(resultText: string): boolean {\n return (\n resultText.startsWith(\"Error reading asset\") ||\n resultText.startsWith(\"Error:\")\n );\n}\n\ninterface ReadAssetResultItem {\n asset_id?: string;\n format?: string;\n content?: string;\n success?: boolean;\n error?: string;\n title?: string;\n}\n\nfunction isReadAssetResultItem(value: unknown): value is ReadAssetResultItem {\n if (!value || typeof value !== \"object\") return false;\n const item = value as Record<string, unknown>;\n return (\n typeof item.asset_id === \"string\" ||\n typeof item.format === \"string\" ||\n typeof item.content === \"string\" ||\n typeof item.success === \"boolean\" ||\n typeof item.error === \"string\"\n );\n}\n\nfunction getResultItems(value: unknown): ReadAssetResultItem[] {\n if (Array.isArray(value)) return value.filter(isReadAssetResultItem);\n if (isReadAssetResultItem(value)) return [value];\n return [];\n}\n\nfunction getResultAssetIds(items: ReadAssetResultItem[]): string[] {\n return items\n .map((item) => item.asset_id?.split(\"?\")[0])\n .filter((assetId): assetId is string => !!assetId);\n}\n\nfunction getReviewedText(items: ReadAssetResultItem[]): string | null {\n const textParts = items\n .filter(\n (item) =>\n item.success !== false &&\n typeof item.content === \"string\" &&\n item.content,\n )\n .map((item) => item.content as string);\n return textParts.length > 0 ? textParts.join(\"\\n\\n---\\n\\n\") : null;\n}\n\nfunction getErrorText(items: ReadAssetResultItem[]): string | null {\n const firstError = items.find((item) => item.success === false && item.error);\n return firstError?.error ?? null;\n}\n\n// --- Workbook preview ---\n\ntype WorkbookCellValue =\n | string\n | number\n | boolean\n | null\n | [string, unknown]\n | [string, unknown, string];\n\ninterface WorkbookSheet {\n sheetName: string;\n dimension: string;\n cells: Record<string, WorkbookCellValue>;\n}\n\ninterface WorkbookFormat {\n workbook: {\n sheets: WorkbookSheet[];\n };\n}\n\nfunction isWorkbookFormat(value: unknown): value is WorkbookFormat {\n if (!value || typeof value !== \"object\") return false;\n const obj = value as Record<string, unknown>;\n if (!obj.workbook || typeof obj.workbook !== \"object\") return false;\n const workbook = obj.workbook as Record<string, unknown>;\n return Array.isArray(workbook.sheets);\n}\n\nfunction parseA1Range(range: string) {\n const match = range.match(/^([A-Z]+)(\\d+)(?::([A-Z]+)(\\d+))?$/i);\n if (!match) return null;\n const colToNumber = (letters: string) =>\n letters\n .toUpperCase()\n .split(\"\")\n .reduce((acc, char) => acc * 26 + (char.charCodeAt(0) - 64), 0);\n return {\n startCol: colToNumber(match[1]),\n startRow: Number.parseInt(match[2], 10),\n endCol: match[3] ? colToNumber(match[3]) : colToNumber(match[1]),\n endRow: match[4]\n ? Number.parseInt(match[4], 10)\n : Number.parseInt(match[2], 10),\n };\n}\n\nfunction numberToColumn(index: number): string {\n let n = index;\n let output = \"\";\n while (n > 0) {\n const remainder = (n - 1) % 26;\n output = String.fromCharCode(65 + remainder) + output;\n n = Math.floor((n - 1) / 26);\n }\n return output;\n}\n\nfunction formatCellValue(value: WorkbookCellValue): string {\n if (value === null || value === undefined) return \"\";\n if (Array.isArray(value)) return String(value[0] ?? \"\");\n return String(value);\n}\n\nfunction WorkbookPreview({ workbook }: { workbook: WorkbookFormat }) {\n return (\n <div className=\"space-y-3\">\n {workbook.workbook.sheets.map((sheet) => {\n const parsedRange = parseA1Range(sheet.dimension);\n if (!parsedRange) return null;\n\n const maxRows = Math.min(\n parsedRange.endRow - parsedRange.startRow + 1,\n 12,\n );\n const maxCols = Math.min(\n parsedRange.endCol - parsedRange.startCol + 1,\n 8,\n );\n const header = [\n \"\",\n ...Array.from({ length: maxCols }, (_, idx) =>\n numberToColumn(parsedRange.startCol + idx),\n ),\n ];\n const dataRows: string[][] = [];\n for (let row = 0; row < maxRows; row++) {\n const rowNumber = parsedRange.startRow + row;\n const values = [String(rowNumber)];\n for (let col = 0; col < maxCols; col++) {\n const colLabel = numberToColumn(parsedRange.startCol + col);\n values.push(\n formatCellValue(sheet.cells[`${colLabel}${rowNumber}`]),\n );\n }\n dataRows.push(values);\n }\n\n return (\n <div key={sheet.sheetName}>\n <p className=\"mb-1 text-xs font-semibold text-muted-foreground\">\n {sheet.sheetName}\n </p>\n <div className=\"overflow-x-auto rounded-md border\">\n <table className=\"w-full border-collapse text-[11px]\">\n <tbody>\n <tr>\n {header.map((cell, i) => (\n <th\n key={i}\n className=\"border bg-muted px-2 py-1 text-left font-medium text-muted-foreground\"\n >\n {cell}\n </th>\n ))}\n </tr>\n {dataRows.map((row, rowIdx) => (\n <tr key={rowIdx}>\n {row.map((cell, cellIdx) =>\n cellIdx === 0 ? (\n <th\n key={cellIdx}\n className=\"border bg-muted px-2 py-1 text-left font-medium text-muted-foreground\"\n >\n {cell}\n </th>\n ) : (\n <td key={cellIdx} className=\"border px-2 py-1\">\n {cell}\n </td>\n ),\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Showing preview from {sheet.dimension}\n </p>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction TextContentPreview({ text }: { text: string }) {\n const lines = text.split(\"\\n\");\n const previewLines = lines.slice(0, 20);\n const hasMore = lines.length > 20;\n\n return (\n <pre className=\"whitespace-pre-wrap break-words text-[12px] leading-[1.6] text-muted-foreground\">\n {previewLines.join(\"\\n\")}\n {hasMore && (\n <span className=\"text-muted-foreground/70\">{`\\n... ${lines.length - 20} more lines`}</span>\n )}\n </pre>\n );\n}\n\n// --- Main component ---\n\nconst ReadAssetToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n result,\n status,\n isError: isToolError,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const typedArgs = args as Record<string, unknown> | undefined;\n const assetIds = (typedArgs?.asset_ids as string[]) ?? [];\n const firstAssetId = assetIds[0] ?? \"\";\n const assetCount = assetIds.length;\n\n const normalizedResult = useMemo(() => normalizeResult(result), [result]);\n const resultItems = useMemo(\n () => getResultItems(normalizedResult),\n [normalizedResult],\n );\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const isIncomplete = status?.type === \"incomplete\";\n\n const reviewedText = useMemo(\n () => getReviewedText(resultItems),\n [resultItems],\n );\n const resultText =\n typeof normalizedResult === \"string\" ? normalizedResult : reviewedText;\n const workbookData = isWorkbookFormat(normalizedResult)\n ? normalizedResult\n : null;\n const failedItems = resultItems.filter((item) => item.success === false);\n const allFailed =\n resultItems.length > 0 && failedItems.length === resultItems.length;\n const hasPartialIssues = failedItems.length > 0 && !allFailed;\n const resultError = getErrorText(resultItems);\n const hasError =\n isToolError ||\n isIncomplete ||\n allFailed ||\n (resultText != null && isErrorResult(resultText));\n\n const resultAssetIds = getResultAssetIds(resultItems);\n const resolvedAssetCount = Math.max(assetCount, new Set(resultAssetIds).size);\n const primaryAsset = getAssetInfo(firstAssetId || resultAssetIds[0] || \"\");\n // Prefer human titles over raw asset ids — an `asset_<uuid>` label reads as\n // garble to non-technical users. Multi-reads get a per-source checklist of\n // titles below the header; when the runtime offloaded the result (no titles\n // survive, only ids), fall back to a plain count rather than a uuid.\n const resultTitle = resultItems.find((item) => item.title)?.title;\n const isOpaqueId = (label: string) => /^asset_[0-9a-f-]{8,}/i.test(label);\n const primaryLabel =\n resultTitle ??\n (isOpaqueId(primaryAsset.name) ? \"1 document\" : primaryAsset.name);\n const sourceList =\n resolvedAssetCount > 1\n ? resultItems\n .filter((item) => typeof item.title === \"string\" && item.title !== \"\")\n .map((item, index) => ({\n key: item.asset_id ?? `${index}-${item.title}`,\n label: item.title as string,\n failed: item.success === false,\n }))\n : [];\n const assetLabel =\n resolvedAssetCount > 1\n ? `${resolvedAssetCount} documents`\n : primaryLabel;\n const statusTitle = isRunning\n ? \"Reviewing asset content\"\n : hasError\n ? \"Asset content review failed\"\n : hasPartialIssues\n ? \"Asset content reviewed with issues\"\n : \"Asset content review complete\";\n const badge = hasPartialIssues\n ? `${failedItems.length} ${failedItems.length === 1 ? \"issue\" : \"issues\"}`\n : resolvedAssetCount > 1\n ? `${resolvedAssetCount} sources`\n : workbookData\n ? \"Workbook review\"\n : \"Content review\";\n\n const hasContent =\n (isComplete || isIncomplete) && (resultText || workbookData);\n const errorMessage =\n status?.type === \"incomplete\"\n ? String(status.error ?? \"Content review failed\")\n : (resultError ?? (hasError && resultText ? resultText : null));\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 && !hasError && \"bg-emerald-50 text-emerald-600\",\n isComplete && hasError && \"bg-red-50 text-red-500\",\n isIncomplete && \"bg-red-50 text-red-500\",\n !isRunning &&\n !isComplete &&\n !isIncomplete &&\n \"bg-muted text-muted-foreground\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : hasError || isIncomplete ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <BookOpenIcon 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\">{statusTitle}</span>\n {isComplete && !hasError && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n <span className=\"rounded-full border border-border/60 bg-muted/50 px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {badge}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <FileTextIcon className=\"size-4\" />\n <span className=\"truncate text-[12px] text-muted-foreground\">\n Source: {assetLabel}\n </span>\n </div>\n </div>\n\n {/* Loading shimmer for streaming */}\n {isRunning && (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-1.5 w-12 animate-pulse rounded-full bg-blue-100\" />\n <div className=\"h-1.5 w-8 animate-pulse rounded-full bg-blue-100\" />\n </div>\n )}\n </div>\n\n {/* Per-source checklist — actual titles with checkmarks (multi-read only;\n offloaded results carry no titles, so the header count stands alone) */}\n {sourceList.length > 1 && (\n <ul className=\"border-t px-4 py-2\">\n {sourceList.slice(0, 8).map((source) => (\n <li\n key={source.key}\n className=\"flex items-center gap-2 py-0.5 text-[12px] text-muted-foreground\"\n >\n {source.failed ? (\n <AlertCircleIcon className=\"size-3.5 shrink-0 text-red-400\" />\n ) : (\n <CheckCircle2Icon className=\"size-3.5 shrink-0 text-emerald-500\" />\n )}\n <span className=\"min-w-0 truncate\">{source.label}</span>\n </li>\n ))}\n {sourceList.length > 8 && (\n <li className=\"py-0.5 text-[11px] text-muted-foreground/70\">\n and {sourceList.length - 8} more\n </li>\n )}\n </ul>\n )}\n\n {/* Error message */}\n {hasError && errorMessage && (\n <div className=\"border-t bg-red-50/50 px-4 py-2.5\">\n <p className=\"text-[12px] leading-relaxed text-red-600\">\n {errorMessage}\n </p>\n </div>\n )}\n\n {/* Content preview (non-error) */}\n {hasContent && !hasError && (\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>\n {expanded ? \"Hide reviewed content\" : \"Show reviewed content\"}\n </span>\n </button>\n\n {expanded && (\n <div className=\"max-h-80 overflow-y-auto border-t bg-muted/30 px-4 py-3\">\n <div className=\"mb-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Reviewed content\n </div>\n {workbookData ? (\n <WorkbookPreview workbook={workbookData} />\n ) : resultText ? (\n <TextContentPreview text={resultText} />\n ) : null}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const ReadAssetToolUI = memo(\n ReadAssetToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\n\nReadAssetToolUI.displayName = \"ReadAssetToolUI\";\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-asset-tool-ui.js","sources":["../../src/tools/read-asset-tool-ui.tsx"],"sourcesContent":["import { memo, useMemo, useState } from \"react\";\nimport type { ToolCallMessagePartComponent } from \"@assistant-ui/react\";\nimport {\n CheckCircle2Icon,\n ChevronDownIcon,\n FileTextIcon,\n LoaderIcon,\n AlertCircleIcon,\n BookOpenIcon,\n} from \"lucide-react\";\nimport { cn } from \"../lib/utils\";\nimport { rangePreviewFromCellMap } from \"../sheet-range/range-preview\";\nimport { RangePreviewTable } from \"../sheet-range/range-preview-table\";\nimport { getAssetInfo, tryParseJson } from \"./asset-utils\";\n\nfunction normalizeResult(result: unknown): unknown {\n if (typeof result === \"string\") return tryParseJson(result) ?? result;\n if (typeof result === \"object\" && result !== null) {\n const obj = result as Record<string, unknown>;\n if (typeof obj.result === \"string\")\n return tryParseJson(obj.result) ?? obj.result;\n return obj;\n }\n return result;\n}\n\nfunction isErrorResult(resultText: string): boolean {\n return (\n resultText.startsWith(\"Error reading asset\") ||\n resultText.startsWith(\"Error:\")\n );\n}\n\ninterface ReadAssetResultItem {\n asset_id?: string;\n format?: string;\n content?: string;\n success?: boolean;\n error?: string;\n title?: string;\n}\n\nfunction isReadAssetResultItem(value: unknown): value is ReadAssetResultItem {\n if (!value || typeof value !== \"object\") return false;\n const item = value as Record<string, unknown>;\n return (\n typeof item.asset_id === \"string\" ||\n typeof item.format === \"string\" ||\n typeof item.content === \"string\" ||\n typeof item.success === \"boolean\" ||\n typeof item.error === \"string\"\n );\n}\n\nfunction getResultItems(value: unknown): ReadAssetResultItem[] {\n if (Array.isArray(value)) return value.filter(isReadAssetResultItem);\n if (isReadAssetResultItem(value)) return [value];\n return [];\n}\n\nfunction getResultAssetIds(items: ReadAssetResultItem[]): string[] {\n return items\n .map((item) => item.asset_id?.split(\"?\")[0])\n .filter((assetId): assetId is string => !!assetId);\n}\n\nfunction getReviewedText(items: ReadAssetResultItem[]): string | null {\n const textParts = items\n .filter(\n (item) =>\n item.success !== false &&\n typeof item.content === \"string\" &&\n item.content,\n )\n .map((item) => item.content as string);\n return textParts.length > 0 ? textParts.join(\"\\n\\n---\\n\\n\") : null;\n}\n\nfunction getErrorText(items: ReadAssetResultItem[]): string | null {\n const firstError = items.find((item) => item.success === false && item.error);\n return firstError?.error ?? null;\n}\n\n// --- Workbook preview ---\n\ntype WorkbookCellValue =\n | string\n | number\n | boolean\n | null\n | [string, unknown]\n | [string, unknown, string];\n\ninterface WorkbookSheet {\n sheetName: string;\n dimension: string;\n cells: Record<string, WorkbookCellValue>;\n}\n\ninterface WorkbookFormat {\n workbook: {\n sheets: WorkbookSheet[];\n };\n}\n\nfunction isWorkbookFormat(value: unknown): value is WorkbookFormat {\n if (!value || typeof value !== \"object\") return false;\n const obj = value as Record<string, unknown>;\n if (!obj.workbook || typeof obj.workbook !== \"object\") return false;\n const workbook = obj.workbook as Record<string, unknown>;\n return Array.isArray(workbook.sheets);\n}\n\nfunction formatCellValue(value: WorkbookCellValue | undefined): string {\n if (value === null || value === undefined) return \"\";\n if (Array.isArray(value)) return String(value[0] ?? \"\");\n return String(value);\n}\n\n// A glance at each sheet, not the whole of it: the card's body is short.\nconst WORKBOOK_PREVIEW_MAX_ROWS = 12;\nconst WORKBOOK_PREVIEW_MAX_COLUMNS = 8;\n\nfunction WorkbookPreview({ workbook }: { workbook: WorkbookFormat }) {\n return (\n <div className=\"space-y-3\">\n {workbook.workbook.sheets.map((sheet) => {\n const preview = rangePreviewFromCellMap({\n range: sheet.dimension,\n cells: sheet.cells ?? {},\n formatCell: formatCellValue,\n maxRows: WORKBOOK_PREVIEW_MAX_ROWS,\n maxColumns: WORKBOOK_PREVIEW_MAX_COLUMNS,\n });\n if (!preview) return null;\n\n return (\n <div key={sheet.sheetName}>\n <p className=\"mb-1 text-xs font-semibold text-muted-foreground\">\n {sheet.sheetName}\n </p>\n <RangePreviewTable\n preview={preview}\n maxRows={WORKBOOK_PREVIEW_MAX_ROWS}\n maxColumns={WORKBOOK_PREVIEW_MAX_COLUMNS}\n caption={`${sheet.sheetName} ${sheet.dimension}`}\n />\n <p className=\"mt-1 text-[10px] text-muted-foreground\">\n Showing preview from {sheet.dimension}\n </p>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction TextContentPreview({ text }: { text: string }) {\n const lines = text.split(\"\\n\");\n const previewLines = lines.slice(0, 20);\n const hasMore = lines.length > 20;\n\n return (\n <pre className=\"whitespace-pre-wrap break-words text-[12px] leading-[1.6] text-muted-foreground\">\n {previewLines.join(\"\\n\")}\n {hasMore && (\n <span className=\"text-muted-foreground/70\">{`\\n... ${lines.length - 20} more lines`}</span>\n )}\n </pre>\n );\n}\n\n// --- Main component ---\n\nconst ReadAssetToolUIImpl: ToolCallMessagePartComponent = ({\n args,\n result,\n status,\n isError: isToolError,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const typedArgs = args as Record<string, unknown> | undefined;\n const assetIds = (typedArgs?.asset_ids as string[]) ?? [];\n const firstAssetId = assetIds[0] ?? \"\";\n const assetCount = assetIds.length;\n\n const normalizedResult = useMemo(() => normalizeResult(result), [result]);\n const resultItems = useMemo(\n () => getResultItems(normalizedResult),\n [normalizedResult],\n );\n\n const isRunning = status?.type === \"running\";\n const isComplete = status?.type === \"complete\";\n const isIncomplete = status?.type === \"incomplete\";\n\n const reviewedText = useMemo(\n () => getReviewedText(resultItems),\n [resultItems],\n );\n const resultText =\n typeof normalizedResult === \"string\" ? normalizedResult : reviewedText;\n const workbookData = isWorkbookFormat(normalizedResult)\n ? normalizedResult\n : null;\n const failedItems = resultItems.filter((item) => item.success === false);\n const allFailed =\n resultItems.length > 0 && failedItems.length === resultItems.length;\n const hasPartialIssues = failedItems.length > 0 && !allFailed;\n const resultError = getErrorText(resultItems);\n const hasError =\n isToolError ||\n isIncomplete ||\n allFailed ||\n (resultText != null && isErrorResult(resultText));\n\n const resultAssetIds = getResultAssetIds(resultItems);\n const resolvedAssetCount = Math.max(assetCount, new Set(resultAssetIds).size);\n const primaryAsset = getAssetInfo(firstAssetId || resultAssetIds[0] || \"\");\n // Prefer human titles over raw asset ids — an `asset_<uuid>` label reads as\n // garble to non-technical users. Multi-reads get a per-source checklist of\n // titles below the header; when the runtime offloaded the result (no titles\n // survive, only ids), fall back to a plain count rather than a uuid.\n const resultTitle = resultItems.find((item) => item.title)?.title;\n const isOpaqueId = (label: string) => /^asset_[0-9a-f-]{8,}/i.test(label);\n const primaryLabel =\n resultTitle ??\n (isOpaqueId(primaryAsset.name) ? \"1 document\" : primaryAsset.name);\n const sourceList =\n resolvedAssetCount > 1\n ? resultItems\n .filter((item) => typeof item.title === \"string\" && item.title !== \"\")\n .map((item, index) => ({\n key: item.asset_id ?? `${index}-${item.title}`,\n label: item.title as string,\n failed: item.success === false,\n }))\n : [];\n const assetLabel =\n resolvedAssetCount > 1\n ? `${resolvedAssetCount} documents`\n : primaryLabel;\n const statusTitle = isRunning\n ? \"Reviewing asset content\"\n : hasError\n ? \"Asset content review failed\"\n : hasPartialIssues\n ? \"Asset content reviewed with issues\"\n : \"Asset content review complete\";\n const badge = hasPartialIssues\n ? `${failedItems.length} ${failedItems.length === 1 ? \"issue\" : \"issues\"}`\n : resolvedAssetCount > 1\n ? `${resolvedAssetCount} sources`\n : workbookData\n ? \"Workbook review\"\n : \"Content review\";\n\n const hasContent =\n (isComplete || isIncomplete) && (resultText || workbookData);\n const errorMessage =\n status?.type === \"incomplete\"\n ? String(status.error ?? \"Content review failed\")\n : (resultError ?? (hasError && resultText ? resultText : null));\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 && !hasError && \"bg-emerald-50 text-emerald-600\",\n isComplete && hasError && \"bg-red-50 text-red-500\",\n isIncomplete && \"bg-red-50 text-red-500\",\n !isRunning &&\n !isComplete &&\n !isIncomplete &&\n \"bg-muted text-muted-foreground\",\n )}\n >\n {isRunning ? (\n <LoaderIcon className=\"size-4 animate-spin\" />\n ) : hasError || isIncomplete ? (\n <AlertCircleIcon className=\"size-4\" />\n ) : (\n <BookOpenIcon 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\">{statusTitle}</span>\n {isComplete && !hasError && (\n <CheckCircle2Icon className=\"size-3.5 text-emerald-500\" />\n )}\n <span className=\"rounded-full border border-border/60 bg-muted/50 px-2 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {badge}\n </span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <FileTextIcon className=\"size-4\" />\n <span className=\"truncate text-[12px] text-muted-foreground\">\n Source: {assetLabel}\n </span>\n </div>\n </div>\n\n {/* Loading shimmer for streaming */}\n {isRunning && (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"h-1.5 w-12 animate-pulse rounded-full bg-blue-100\" />\n <div className=\"h-1.5 w-8 animate-pulse rounded-full bg-blue-100\" />\n </div>\n )}\n </div>\n\n {/* Per-source checklist — actual titles with checkmarks (multi-read only;\n offloaded results carry no titles, so the header count stands alone) */}\n {sourceList.length > 1 && (\n <ul className=\"border-t px-4 py-2\">\n {sourceList.slice(0, 8).map((source) => (\n <li\n key={source.key}\n className=\"flex items-center gap-2 py-0.5 text-[12px] text-muted-foreground\"\n >\n {source.failed ? (\n <AlertCircleIcon className=\"size-3.5 shrink-0 text-red-400\" />\n ) : (\n <CheckCircle2Icon className=\"size-3.5 shrink-0 text-emerald-500\" />\n )}\n <span className=\"min-w-0 truncate\">{source.label}</span>\n </li>\n ))}\n {sourceList.length > 8 && (\n <li className=\"py-0.5 text-[11px] text-muted-foreground/70\">\n and {sourceList.length - 8} more\n </li>\n )}\n </ul>\n )}\n\n {/* Error message */}\n {hasError && errorMessage && (\n <div className=\"border-t bg-red-50/50 px-4 py-2.5\">\n <p className=\"text-[12px] leading-relaxed text-red-600\">\n {errorMessage}\n </p>\n </div>\n )}\n\n {/* Content preview (non-error) */}\n {hasContent && !hasError && (\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>\n {expanded ? \"Hide reviewed content\" : \"Show reviewed content\"}\n </span>\n </button>\n\n {expanded && (\n <div className=\"max-h-80 overflow-y-auto border-t bg-muted/30 px-4 py-3\">\n <div className=\"mb-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Reviewed content\n </div>\n {workbookData ? (\n <WorkbookPreview workbook={workbookData} />\n ) : resultText ? (\n <TextContentPreview text={resultText} />\n ) : null}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport const ReadAssetToolUI = memo(\n ReadAssetToolUIImpl,\n) as unknown as ToolCallMessagePartComponent;\n\nReadAssetToolUI.displayName = \"ReadAssetToolUI\";\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ function StepText({ text, code }) {
5
+ const at = code ? text.indexOf(code) : -1;
6
+ if (!code || at < 0) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: text });
7
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
8
+ text.slice(0, at),
9
+ /* @__PURE__ */ jsxRuntime.jsx(
10
+ "code",
11
+ {
12
+ "data-slot": "step-code",
13
+ className: "rounded bg-foreground/[0.06] px-1 py-px font-mono text-[12px] text-foreground/85",
14
+ children: code
15
+ }
16
+ ),
17
+ text.slice(at + code.length)
18
+ ] });
19
+ }
20
+ exports.StepText = StepText;
21
+ //# sourceMappingURL=step-text.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-text.cjs","sources":["../../src/tools/step-text.tsx"],"sourcesContent":["/**\n * A tool step's line with its literal part (a command, a file name, a\n * pattern) set in monospace: \"Ran `git diff --stat`\". `code` must occur in\n * `text` (the summary registry only sets it when it does); otherwise the line\n * renders as plain text.\n */\nexport function StepText({ text, code }: { text: string; code?: string | undefined }) {\n const at = code ? text.indexOf(code) : -1;\n if (!code || at < 0) return <>{text}</>;\n return (\n <>\n {text.slice(0, at)}\n <code\n data-slot=\"step-code\"\n className=\"rounded bg-foreground/[0.06] px-1 py-px font-mono text-[12px] text-foreground/85\"\n >\n {code}\n </code>\n {text.slice(at + code.length)}\n </>\n );\n}\n"],"names":["jsxs","Fragment","jsx"],"mappings":";;;AAMO,SAAS,SAAS,EAAE,MAAM,QAAqD;AACpF,QAAM,KAAK,OAAO,KAAK,QAAQ,IAAI,IAAI;AACvC,MAAI,CAAC,QAAQ,KAAK,EAAG,8DAAU,UAAA,MAAK;AACpC,SACEA,2BAAAA,KAAAC,qBAAA,EACG,UAAA;AAAA,IAAA,KAAK,MAAM,GAAG,EAAE;AAAA,IACjBC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAU;AAAA,QACV,WAAU;AAAA,QAET,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,KAAK,MAAM,KAAK,KAAK,MAAM;AAAA,EAAA,GAC9B;AAEJ;;"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * A tool step's line with its literal part (a command, a file name, a
3
+ * pattern) set in monospace: "Ran `git diff --stat`". `code` must occur in
4
+ * `text` (the summary registry only sets it when it does); otherwise the line
5
+ * renders as plain text.
6
+ */
7
+ export declare function StepText({ text, code }: {
8
+ text: string;
9
+ code?: string | undefined;
10
+ }): import("react").JSX.Element;
@@ -0,0 +1,21 @@
1
+ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
2
+ function StepText({ text, code }) {
3
+ const at = code ? text.indexOf(code) : -1;
4
+ if (!code || at < 0) return /* @__PURE__ */ jsx(Fragment, { children: text });
5
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
6
+ text.slice(0, at),
7
+ /* @__PURE__ */ jsx(
8
+ "code",
9
+ {
10
+ "data-slot": "step-code",
11
+ className: "rounded bg-foreground/[0.06] px-1 py-px font-mono text-[12px] text-foreground/85",
12
+ children: code
13
+ }
14
+ ),
15
+ text.slice(at + code.length)
16
+ ] });
17
+ }
18
+ export {
19
+ StepText
20
+ };
21
+ //# sourceMappingURL=step-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-text.js","sources":["../../src/tools/step-text.tsx"],"sourcesContent":["/**\n * A tool step's line with its literal part (a command, a file name, a\n * pattern) set in monospace: \"Ran `git diff --stat`\". `code` must occur in\n * `text` (the summary registry only sets it when it does); otherwise the line\n * renders as plain text.\n */\nexport function StepText({ text, code }: { text: string; code?: string | undefined }) {\n const at = code ? text.indexOf(code) : -1;\n if (!code || at < 0) return <>{text}</>;\n return (\n <>\n {text.slice(0, at)}\n <code\n data-slot=\"step-code\"\n className=\"rounded bg-foreground/[0.06] px-1 py-px font-mono text-[12px] text-foreground/85\"\n >\n {code}\n </code>\n {text.slice(at + code.length)}\n </>\n );\n}\n"],"names":[],"mappings":";AAMO,SAAS,SAAS,EAAE,MAAM,QAAqD;AACpF,QAAM,KAAK,OAAO,KAAK,QAAQ,IAAI,IAAI;AACvC,MAAI,CAAC,QAAQ,KAAK,EAAG,wCAAU,UAAA,MAAK;AACpC,SACE,qBAAA,UAAA,EACG,UAAA;AAAA,IAAA,KAAK,MAAM,GAAG,EAAE;AAAA,IACjB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAU;AAAA,QACV,WAAU;AAAA,QAET,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,KAAK,MAAM,KAAK,KAAK,MAAM;AAAA,EAAA,GAC9B;AAEJ;"}
@@ -9,10 +9,12 @@ const assetPanelStore = require("../assets/asset-panel-store.cjs");
9
9
  const NestedPtcMessages = require("./NestedPtcMessages.cjs");
10
10
  const primitives = require("./primitives.cjs");
11
11
  const toolAppearance = require("./tool-appearance.cjs");
12
+ const stepText = require("./step-text.cjs");
12
13
  const toolIcons = require("./tool-icons.cjs");
14
+ const toolSummary = require("./tool-summary.cjs");
13
15
  const useElapsedSeconds = require("./use-elapsed-seconds.cjs");
14
- const toolResult = require("../packages/agent-runtime/src/tool-result.cjs");
15
- const toolMetadata = require("../packages/agent-runtime/src/tool-metadata.cjs");
16
+ const toolResult = require("../agent-runtime/src/tool-result.cjs");
17
+ const toolMetadata = require("../agent-runtime/src/tool-metadata.cjs");
16
18
  const cnfast = require("cnfast");
17
19
  const ANIMATION_DURATION = 200;
18
20
  const THREAD_ROOT_CLASS = "aui-tool-fallback-root group/tool-fallback-root my-1.5 w-full rounded-lg border border-border/50 bg-background";
@@ -157,9 +159,14 @@ function ToolFallbackRoot({
157
159
  }
158
160
  );
159
161
  }
162
+ function summaryState(classification, isCancelled) {
163
+ if (isCancelled) return "cancelled";
164
+ return classification.state === "requires-action" ? "waiting" : classification.state;
165
+ }
160
166
  function ToolFallbackTrigger({
161
167
  toolName,
162
168
  argsText,
169
+ args,
163
170
  result,
164
171
  status,
165
172
  isError,
@@ -193,9 +200,19 @@ function ToolFallbackTrigger({
193
200
  () => state === "complete" ? toolResult.resultMessage(result) : null,
194
201
  [result, state]
195
202
  );
203
+ const callSummary = react.useMemo(() => {
204
+ if (!isThread || displayName !== void 0 || activeLabel !== void 0) return null;
205
+ const parsedArgs = args ?? (argsText ? primitives.tryParseJson(argsText) ?? void 0 : void 0);
206
+ return toolSummary.summarizeToolCall({
207
+ toolName,
208
+ args: parsedArgs,
209
+ result,
210
+ status: summaryState(classification, isCancelled)
211
+ });
212
+ }, [isThread, displayName, activeLabel, args, argsText, toolName, result, classification, isCancelled]);
196
213
  const rejection = rejectedOutcome(classification);
197
214
  const headline = rejection ? toolMetadata.toolStatusLabel(toolName, "rejected", displayName) : state === "error" ? `Failed: ${title}` : state === "paused" ? `Paused: ${title}` : title;
198
- const secondary = secondaryProp ?? (rejection ? rejection.reason : message || summary);
215
+ const secondary = secondaryProp ?? (rejection ? rejection.reason : callSummary ? callSummary.meta ?? message ?? null : message || summary);
199
216
  if (isThread) {
200
217
  return /* @__PURE__ */ jsxRuntime.jsxs(
201
218
  collapsible.CollapsibleTrigger,
@@ -216,11 +233,12 @@ function ToolFallbackTrigger({
216
233
  {
217
234
  "data-slot": "tool-fallback-verb",
218
235
  className: cnfast.cn(
219
- "shrink-0 font-medium",
236
+ "font-medium",
237
+ callSummary ? "min-w-0 truncate" : "shrink-0",
220
238
  state === "error" && !isCancelled && "text-destructive",
221
239
  isCancelled && "text-muted-foreground line-through"
222
240
  ),
223
- children: isRunning ? running : headline
241
+ children: callSummary ? /* @__PURE__ */ jsxRuntime.jsx("span", { title: callSummary.detail, children: /* @__PURE__ */ jsxRuntime.jsx(stepText.StepText, { text: callSummary.label, code: callSummary.code }) }) : isRunning ? running : headline
224
242
  }
225
243
  ),
226
244
  isRunning && elapsed ? /* @__PURE__ */ jsxRuntime.jsxs(
@@ -707,6 +725,7 @@ const ToolFallbackImpl = ({
707
725
  appearance,
708
726
  toolName,
709
727
  argsText,
728
+ args: args ?? void 0,
710
729
  result,
711
730
  status,
712
731
  classification,