@athenaintel/react 0.57.2 → 0.59.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 (799) hide show
  1. package/README.md +759 -9
  2. package/dist/agent-runtime/src/addressed-agents.cjs +16 -0
  3. package/dist/agent-runtime/src/addressed-agents.cjs.map +1 -0
  4. package/dist/agent-runtime/src/addressed-agents.d.ts +30 -0
  5. package/dist/agent-runtime/src/addressed-agents.js +16 -0
  6. package/dist/agent-runtime/src/addressed-agents.js.map +1 -0
  7. package/dist/agent-runtime/src/answer-label.cjs +4 -3
  8. package/dist/agent-runtime/src/answer-label.cjs.map +1 -1
  9. package/dist/agent-runtime/src/answer-label.d.ts +13 -6
  10. package/dist/agent-runtime/src/answer-label.js +4 -3
  11. package/dist/agent-runtime/src/answer-label.js.map +1 -1
  12. package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -1
  13. package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +1 -1
  14. package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -1
  15. package/dist/agent-runtime/src/chat-outbox-entry.cjs +101 -0
  16. package/dist/agent-runtime/src/chat-outbox-entry.cjs.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-entry.d.ts +99 -0
  18. package/dist/agent-runtime/src/chat-outbox-entry.js +101 -0
  19. package/dist/agent-runtime/src/chat-outbox-entry.js.map +1 -0
  20. package/dist/agent-runtime/src/chat-outbox-legacy.cjs +252 -0
  21. package/dist/agent-runtime/src/chat-outbox-legacy.cjs.map +1 -0
  22. package/dist/agent-runtime/src/chat-outbox-legacy.d.ts +96 -0
  23. package/dist/agent-runtime/src/chat-outbox-legacy.js +252 -0
  24. package/dist/agent-runtime/src/chat-outbox-legacy.js.map +1 -0
  25. package/dist/agent-runtime/src/chat-outbox-policy.cjs +30 -0
  26. package/dist/agent-runtime/src/chat-outbox-policy.cjs.map +1 -0
  27. package/dist/agent-runtime/src/chat-outbox-policy.d.ts +42 -0
  28. package/dist/agent-runtime/src/chat-outbox-policy.js +30 -0
  29. package/dist/agent-runtime/src/chat-outbox-policy.js.map +1 -0
  30. package/dist/agent-runtime/src/chat-outbox-storage.cjs +306 -0
  31. package/dist/agent-runtime/src/chat-outbox-storage.cjs.map +1 -0
  32. package/dist/agent-runtime/src/chat-outbox-storage.d.ts +194 -0
  33. package/dist/agent-runtime/src/chat-outbox-storage.js +306 -0
  34. package/dist/agent-runtime/src/chat-outbox-storage.js.map +1 -0
  35. package/dist/agent-runtime/src/chat-outbox-thread.cjs +21 -94
  36. package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -1
  37. package/dist/agent-runtime/src/chat-outbox-thread.d.ts +22 -18
  38. package/dist/agent-runtime/src/chat-outbox-thread.js +21 -94
  39. package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -1
  40. package/dist/agent-runtime/src/chat-outbox.cjs +492 -547
  41. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -1
  42. package/dist/agent-runtime/src/chat-outbox.d.ts +110 -142
  43. package/dist/agent-runtime/src/chat-outbox.js +492 -547
  44. package/dist/agent-runtime/src/chat-outbox.js.map +1 -1
  45. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  46. package/dist/agent-runtime/src/composer-markdown.d.ts +1 -1
  47. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  48. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -1
  49. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  50. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +8 -1
  51. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -1
  52. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  53. package/dist/agent-runtime/src/dictation-preferences.d.ts +356 -0
  54. package/dist/agent-runtime/src/dictation-record.d.ts +279 -0
  55. package/dist/agent-runtime/src/dictation-session.d.ts +106 -7
  56. package/dist/agent-runtime/src/dictation-snippets.d.ts +9 -0
  57. package/dist/agent-runtime/src/dictation-transfer.d.ts +142 -0
  58. package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
  59. package/dist/agent-runtime/src/edit-command.d.ts +1 -1
  60. package/dist/agent-runtime/src/edit-command.js.map +1 -1
  61. package/dist/agent-runtime/src/errors.cjs +1 -0
  62. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  63. package/dist/agent-runtime/src/errors.js +1 -0
  64. package/dist/agent-runtime/src/errors.js.map +1 -1
  65. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +24 -0
  66. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  67. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +3 -3
  68. package/dist/agent-runtime/src/generated/runconfig-contract.js +24 -0
  69. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  70. package/dist/agent-runtime/src/index.d.ts +14 -8
  71. package/dist/agent-runtime/src/lane-follow.cjs +289 -0
  72. package/dist/agent-runtime/src/lane-follow.cjs.map +1 -0
  73. package/dist/agent-runtime/src/lane-follow.js +289 -0
  74. package/dist/agent-runtime/src/lane-follow.js.map +1 -0
  75. package/dist/agent-runtime/src/lane-images.cjs +387 -0
  76. package/dist/agent-runtime/src/lane-images.cjs.map +1 -0
  77. package/dist/agent-runtime/src/lane-images.js +387 -0
  78. package/dist/agent-runtime/src/lane-images.js.map +1 -0
  79. package/dist/agent-runtime/src/message-window.js +1 -1
  80. package/dist/agent-runtime/src/messages.cjs +19 -1
  81. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  82. package/dist/agent-runtime/src/messages.d.ts +8 -0
  83. package/dist/agent-runtime/src/messages.js +21 -3
  84. package/dist/agent-runtime/src/messages.js.map +1 -1
  85. package/dist/agent-runtime/src/named-agents.cjs +301 -0
  86. package/dist/agent-runtime/src/named-agents.cjs.map +1 -0
  87. package/dist/agent-runtime/src/named-agents.d.ts +246 -0
  88. package/dist/agent-runtime/src/named-agents.js +301 -0
  89. package/dist/agent-runtime/src/named-agents.js.map +1 -0
  90. package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
  91. package/dist/agent-runtime/src/offline-status.d.ts +66 -2
  92. package/dist/agent-runtime/src/offline-status.js.map +1 -1
  93. package/dist/agent-runtime/src/ptc-subcalls.cjs +41 -0
  94. package/dist/agent-runtime/src/ptc-subcalls.cjs.map +1 -0
  95. package/dist/agent-runtime/src/ptc-subcalls.js +41 -0
  96. package/dist/agent-runtime/src/ptc-subcalls.js.map +1 -0
  97. package/dist/agent-runtime/src/queue.cjs +2 -2
  98. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  99. package/dist/agent-runtime/src/queue.d.ts +20 -25
  100. package/dist/agent-runtime/src/queue.js +2 -2
  101. package/dist/agent-runtime/src/queue.js.map +1 -1
  102. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +314 -84
  103. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  104. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +137 -40
  105. package/dist/agent-runtime/src/quota-safe-local-storage-session.js +318 -88
  106. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  107. package/dist/agent-runtime/src/run-send.cjs +54 -0
  108. package/dist/agent-runtime/src/run-send.cjs.map +1 -0
  109. package/dist/agent-runtime/src/run-send.d.ts +51 -0
  110. package/dist/agent-runtime/src/run-send.js +54 -0
  111. package/dist/agent-runtime/src/run-send.js.map +1 -0
  112. package/dist/agent-runtime/src/running-tool-placeholder.cjs +6 -0
  113. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -1
  114. package/dist/agent-runtime/src/running-tool-placeholder.js +6 -0
  115. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -1
  116. package/dist/agent-runtime/src/runtime.d.ts +9 -5
  117. package/dist/agent-runtime/src/sealed-idb.cjs +64 -0
  118. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -1
  119. package/dist/agent-runtime/src/sealed-idb.d.ts +16 -0
  120. package/dist/agent-runtime/src/sealed-idb.js +64 -0
  121. package/dist/agent-runtime/src/sealed-idb.js.map +1 -1
  122. package/dist/agent-runtime/src/send-recovery.cjs +90 -118
  123. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  124. package/dist/agent-runtime/src/send-recovery.d.ts +25 -29
  125. package/dist/agent-runtime/src/send-recovery.js +90 -118
  126. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  127. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +4 -1
  128. package/dist/agent-runtime/src/statewire-held-sends.cjs +191 -0
  129. package/dist/agent-runtime/src/statewire-held-sends.cjs.map +1 -0
  130. package/dist/agent-runtime/src/statewire-held-sends.d.ts +119 -0
  131. package/dist/agent-runtime/src/statewire-held-sends.js +191 -0
  132. package/dist/agent-runtime/src/statewire-held-sends.js.map +1 -0
  133. package/dist/agent-runtime/src/statewire-state.cjs +4 -0
  134. package/dist/agent-runtime/src/statewire-state.cjs.map +1 -1
  135. package/dist/agent-runtime/src/statewire-state.js +4 -0
  136. package/dist/agent-runtime/src/statewire-state.js.map +1 -1
  137. package/dist/agent-runtime/src/statewire-transport.cjs +8 -2
  138. package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -1
  139. package/dist/agent-runtime/src/statewire-transport.d.ts +14 -5
  140. package/dist/agent-runtime/src/statewire-transport.js +8 -2
  141. package/dist/agent-runtime/src/statewire-transport.js.map +1 -1
  142. package/dist/agent-runtime/src/subagent-transcripts.cjs +1 -23
  143. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -1
  144. package/dist/agent-runtime/src/subagent-transcripts.js +3 -25
  145. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -1
  146. package/dist/agent-runtime/src/subagents.cjs +22 -29
  147. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  148. package/dist/agent-runtime/src/subagents.js +23 -30
  149. package/dist/agent-runtime/src/subagents.js.map +1 -1
  150. package/dist/agent-runtime/src/thread-extras.cjs +27 -19
  151. package/dist/agent-runtime/src/thread-extras.cjs.map +1 -1
  152. package/dist/agent-runtime/src/thread-extras.d.ts +19 -6
  153. package/dist/agent-runtime/src/thread-extras.js +27 -19
  154. package/dist/agent-runtime/src/thread-extras.js.map +1 -1
  155. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +8 -8
  156. package/dist/agent-runtime/src/tool-metadata.cjs +12 -0
  157. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  158. package/dist/agent-runtime/src/tool-metadata.js +12 -0
  159. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  160. package/dist/agent-runtime/src/tool-names.cjs +21 -0
  161. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  162. package/dist/agent-runtime/src/tool-names.d.ts +8 -0
  163. package/dist/agent-runtime/src/tool-names.js +21 -0
  164. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  165. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs +247 -0
  166. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs.map +1 -0
  167. package/dist/agent-runtime/src/typed-interrupt-kinds.d.ts +173 -0
  168. package/dist/agent-runtime/src/typed-interrupt-kinds.js +247 -0
  169. package/dist/agent-runtime/src/typed-interrupt-kinds.js.map +1 -0
  170. package/dist/agent-runtime/src/typed-interrupts.cjs +48 -0
  171. package/dist/agent-runtime/src/typed-interrupts.cjs.map +1 -0
  172. package/dist/agent-runtime/src/typed-interrupts.d.ts +75 -0
  173. package/dist/agent-runtime/src/typed-interrupts.js +48 -0
  174. package/dist/agent-runtime/src/typed-interrupts.js.map +1 -0
  175. package/dist/agent-runtime/src/types.d.ts +1 -1
  176. package/dist/agent-runtime/src/use-conversation-list.cjs +1 -0
  177. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  178. package/dist/agent-runtime/src/use-conversation-list.d.ts +7 -0
  179. package/dist/agent-runtime/src/use-conversation-list.js +1 -0
  180. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  181. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +46 -29
  182. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  183. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +14 -22
  184. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +46 -29
  185. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  186. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +78 -14
  187. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  188. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +34 -7
  189. package/dist/agent-runtime/src/use-deep-agent-runtime.js +79 -15
  190. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  191. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +16 -1
  192. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  193. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +7 -2
  194. package/dist/agent-runtime/src/use-deep-agent-thread.js +16 -1
  195. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  196. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +30 -4
  197. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  198. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +22 -4
  199. package/dist/agent-runtime/src/use-deep-agent-voice.js +30 -4
  200. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  201. package/dist/agent-runtime/src/withdrawn-turns.d.ts +5 -4
  202. package/dist/agent-runtime/src/word-device-fit.d.ts +174 -0
  203. package/dist/agent-runtime/src/work-in.d.ts +127 -0
  204. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  205. package/dist/assets/AthenaAssetEmbed.d.ts +6 -1
  206. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  207. package/dist/assets/asset-panel-store.cjs +13 -5
  208. package/dist/assets/asset-panel-store.cjs.map +1 -1
  209. package/dist/assets/asset-panel-store.d.ts +33 -2
  210. package/dist/assets/asset-panel-store.js +13 -5
  211. package/dist/assets/asset-panel-store.js.map +1 -1
  212. package/dist/auth/AthenaCredentialSourceContext.cjs +11 -0
  213. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  214. package/dist/auth/AthenaCredentialSourceContext.d.ts +6 -0
  215. package/dist/auth/AthenaCredentialSourceContext.js +11 -0
  216. package/dist/auth/AthenaCredentialSourceContext.js.map +1 -1
  217. package/dist/auth/account-identity.cjs +13 -2
  218. package/dist/auth/account-identity.cjs.map +1 -1
  219. package/dist/auth/account-identity.d.ts +9 -0
  220. package/dist/auth/account-identity.js +13 -2
  221. package/dist/auth/account-identity.js.map +1 -1
  222. package/dist/auth/credential-source.cjs +20 -4
  223. package/dist/auth/credential-source.cjs.map +1 -1
  224. package/dist/auth/credential-source.d.ts +9 -0
  225. package/dist/auth/credential-source.js +20 -4
  226. package/dist/auth/credential-source.js.map +1 -1
  227. package/dist/catalog/chat-pickers.cjs +31 -0
  228. package/dist/catalog/chat-pickers.cjs.map +1 -1
  229. package/dist/catalog/chat-pickers.d.ts +17 -0
  230. package/dist/catalog/chat-pickers.js +33 -2
  231. package/dist/catalog/chat-pickers.js.map +1 -1
  232. package/dist/catalog/runtime-catalog.cjs +63 -3
  233. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  234. package/dist/catalog/runtime-catalog.d.ts +63 -3
  235. package/dist/catalog/runtime-catalog.js +64 -4
  236. package/dist/catalog/runtime-catalog.js.map +1 -1
  237. package/dist/chat/AthenaChat.cjs +290 -97
  238. package/dist/chat/AthenaChat.cjs.map +1 -1
  239. package/dist/chat/AthenaChat.d.ts +80 -4
  240. package/dist/chat/AthenaChat.js +290 -97
  241. package/dist/chat/AthenaChat.js.map +1 -1
  242. package/dist/chat/StatewireApprovalCard.cjs +35 -5
  243. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  244. package/dist/chat/StatewireApprovalCard.d.ts +55 -2
  245. package/dist/chat/StatewireApprovalCard.js +37 -7
  246. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  247. package/dist/chat/StatewireQueuedMessages.cjs +17 -2
  248. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.d.ts +8 -45
  250. package/dist/chat/StatewireQueuedMessages.js +18 -3
  251. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  252. package/dist/chat/chat-agent-mentions.cjs +70 -0
  253. package/dist/chat/chat-agent-mentions.cjs.map +1 -0
  254. package/dist/chat/chat-agent-mentions.d.ts +13 -0
  255. package/dist/chat/chat-agent-mentions.js +70 -0
  256. package/dist/chat/chat-agent-mentions.js.map +1 -0
  257. package/dist/chat/composer-actions.cjs +12 -0
  258. package/dist/chat/composer-actions.cjs.map +1 -0
  259. package/dist/chat/composer-actions.d.ts +22 -0
  260. package/dist/chat/composer-actions.js +12 -0
  261. package/dist/chat/composer-actions.js.map +1 -0
  262. package/dist/chat/follow-up-suggestions.cjs +185 -0
  263. package/dist/chat/follow-up-suggestions.cjs.map +1 -0
  264. package/dist/chat/follow-up-suggestions.d.ts +64 -0
  265. package/dist/chat/follow-up-suggestions.js +185 -0
  266. package/dist/chat/follow-up-suggestions.js.map +1 -0
  267. package/dist/chat/super-grouping/ToolTimeline.cjs +4 -3
  268. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  269. package/dist/chat/super-grouping/ToolTimeline.d.ts +7 -3
  270. package/dist/chat/super-grouping/ToolTimeline.js +4 -3
  271. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  272. package/dist/chat/turn-changes.cjs +284 -0
  273. package/dist/chat/turn-changes.cjs.map +1 -0
  274. package/dist/chat/turn-changes.d.ts +130 -0
  275. package/dist/chat/turn-changes.js +284 -0
  276. package/dist/chat/turn-changes.js.map +1 -0
  277. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs +31 -0
  278. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs.map +1 -0
  279. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.d.ts +31 -0
  280. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js +31 -0
  281. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js.map +1 -0
  282. package/dist/chat/typed-interrupts/approval-cards.cjs +250 -0
  283. package/dist/chat/typed-interrupts/approval-cards.cjs.map +1 -0
  284. package/dist/chat/typed-interrupts/approval-cards.d.ts +22 -0
  285. package/dist/chat/typed-interrupts/approval-cards.js +250 -0
  286. package/dist/chat/typed-interrupts/approval-cards.js.map +1 -0
  287. package/dist/chat/typed-interrupts/form-cards.cjs +289 -0
  288. package/dist/chat/typed-interrupts/form-cards.cjs.map +1 -0
  289. package/dist/chat/typed-interrupts/form-cards.d.ts +6 -0
  290. package/dist/chat/typed-interrupts/form-cards.js +289 -0
  291. package/dist/chat/typed-interrupts/form-cards.js.map +1 -0
  292. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs +182 -0
  293. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs.map +1 -0
  294. package/dist/chat/typed-interrupts/interrupt-card-shell.d.ts +47 -0
  295. package/dist/chat/typed-interrupts/interrupt-card-shell.js +182 -0
  296. package/dist/chat/typed-interrupts/interrupt-card-shell.js.map +1 -0
  297. package/dist/chat/typed-interrupts/json-schema-form.cjs +388 -0
  298. package/dist/chat/typed-interrupts/json-schema-form.cjs.map +1 -0
  299. package/dist/chat/typed-interrupts/json-schema-form.d.ts +33 -0
  300. package/dist/chat/typed-interrupts/json-schema-form.js +388 -0
  301. package/dist/chat/typed-interrupts/json-schema-form.js.map +1 -0
  302. package/dist/chat/typed-interrupts/questionnaire-card.cjs +449 -0
  303. package/dist/chat/typed-interrupts/questionnaire-card.cjs.map +1 -0
  304. package/dist/chat/typed-interrupts/questionnaire-card.d.ts +20 -0
  305. package/dist/chat/typed-interrupts/questionnaire-card.js +449 -0
  306. package/dist/chat/typed-interrupts/questionnaire-card.js.map +1 -0
  307. package/dist/chat/typed-interrupts/request-file-card.cjs +159 -0
  308. package/dist/chat/typed-interrupts/request-file-card.cjs.map +1 -0
  309. package/dist/chat/typed-interrupts/request-file-card.d.ts +2 -0
  310. package/dist/chat/typed-interrupts/request-file-card.js +159 -0
  311. package/dist/chat/typed-interrupts/request-file-card.js.map +1 -0
  312. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs +189 -0
  313. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs.map +1 -0
  314. package/dist/chat/typed-interrupts/toolkit-selection-card.d.ts +23 -0
  315. package/dist/chat/typed-interrupts/toolkit-selection-card.js +189 -0
  316. package/dist/chat/typed-interrupts/toolkit-selection-card.js.map +1 -0
  317. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs +26 -0
  318. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs.map +1 -0
  319. package/dist/chat/typed-interrupts/typed-interrupt-body.d.ts +3 -0
  320. package/dist/chat/typed-interrupts/typed-interrupt-body.js +26 -0
  321. package/dist/chat/typed-interrupts/typed-interrupt-body.js.map +1 -0
  322. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs +105 -0
  323. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs.map +1 -0
  324. package/dist/chat/typed-interrupts/typed-interrupt-graphql.d.ts +29 -0
  325. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js +105 -0
  326. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js.map +1 -0
  327. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs +70 -0
  328. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs.map +1 -0
  329. package/dist/chat/typed-interrupts/typed-interrupt-notice.d.ts +45 -0
  330. package/dist/chat/typed-interrupts/typed-interrupt-notice.js +70 -0
  331. package/dist/chat/typed-interrupts/typed-interrupt-notice.js.map +1 -0
  332. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs +76 -0
  333. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs.map +1 -0
  334. package/dist/chat/typed-interrupts/typed-interrupt-panel.d.ts +11 -0
  335. package/dist/chat/typed-interrupts/typed-interrupt-panel.js +76 -0
  336. package/dist/chat/typed-interrupts/typed-interrupt-panel.js.map +1 -0
  337. package/dist/chat/typed-interrupts/typed-interrupt-types.d.ts +46 -0
  338. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs +106 -0
  339. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs.map +1 -0
  340. package/dist/chat/typed-interrupts/use-interrupt-draft.d.ts +29 -0
  341. package/dist/chat/typed-interrupts/use-interrupt-draft.js +106 -0
  342. package/dist/chat/typed-interrupts/use-interrupt-draft.js.map +1 -0
  343. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs +231 -0
  344. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs.map +1 -0
  345. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.d.ts +66 -0
  346. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js +231 -0
  347. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js.map +1 -0
  348. package/dist/chat-ui/composer/composer-named-agents.cjs +13 -0
  349. package/dist/chat-ui/composer/composer-named-agents.cjs.map +1 -0
  350. package/dist/chat-ui/composer/composer-named-agents.d.ts +20 -0
  351. package/dist/chat-ui/composer/composer-named-agents.js +13 -0
  352. package/dist/chat-ui/composer/composer-named-agents.js.map +1 -0
  353. package/dist/chat-ui/composer/slash-command-menu.cjs +143 -0
  354. package/dist/chat-ui/composer/slash-command-menu.cjs.map +1 -0
  355. package/dist/chat-ui/composer/slash-command-menu.d.ts +19 -0
  356. package/dist/chat-ui/composer/slash-command-menu.js +143 -0
  357. package/dist/chat-ui/composer/slash-command-menu.js.map +1 -0
  358. package/dist/chat-ui/composer/slash-commands-extension.cjs +51 -0
  359. package/dist/chat-ui/composer/slash-commands-extension.cjs.map +1 -0
  360. package/dist/chat-ui/composer/slash-commands-extension.d.ts +39 -0
  361. package/dist/chat-ui/composer/slash-commands-extension.js +51 -0
  362. package/dist/chat-ui/composer/slash-commands-extension.js.map +1 -0
  363. package/dist/chat-ui/composer/slash-commands.cjs +74 -0
  364. package/dist/chat-ui/composer/slash-commands.cjs.map +1 -0
  365. package/dist/chat-ui/composer/slash-commands.d.ts +82 -0
  366. package/dist/chat-ui/composer/slash-commands.js +74 -0
  367. package/dist/chat-ui/composer/slash-commands.js.map +1 -0
  368. package/dist/chat-ui/composer/tiptap-composer.cjs +135 -9
  369. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  370. package/dist/chat-ui/composer/tiptap-composer.d.ts +61 -2
  371. package/dist/chat-ui/composer/tiptap-composer.js +135 -9
  372. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  373. package/dist/chat-ui/index.cjs +3 -0
  374. package/dist/chat-ui/index.cjs.map +1 -1
  375. package/dist/chat-ui/index.d.ts +3 -2
  376. package/dist/chat-ui/index.js +3 -0
  377. package/dist/chat-ui/index.js.map +1 -1
  378. package/dist/chat-ui/mentions/mention-chip.cjs +1 -1
  379. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  380. package/dist/chat-ui/mentions/mention-chip.js +2 -2
  381. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  382. package/dist/chat-ui/mentions/mention-extension.cjs +8 -1
  383. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
  384. package/dist/chat-ui/mentions/mention-extension.js +8 -1
  385. package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
  386. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs +1 -0
  387. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs.map +1 -1
  388. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js +1 -0
  389. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +2 -0
  391. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +3 -1
  393. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -1
  394. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +1 -1
  395. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -1
  396. package/dist/chat-ui/mentions/suggestions/components/menu-item.js +1 -1
  397. package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -1
  398. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +36 -0
  399. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  400. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +42 -0
  401. package/dist/chat-ui/mentions/suggestions/data/api-client.js +36 -0
  402. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  403. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +235 -19
  404. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  405. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +88 -10
  406. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +236 -20
  407. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  408. package/dist/chat-ui/mentions/suggestions/data/types.cjs.map +1 -1
  409. package/dist/chat-ui/mentions/suggestions/data/types.d.ts +27 -1
  410. package/dist/chat-ui/mentions/suggestions/data/types.js.map +1 -1
  411. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +56 -5
  412. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  413. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +26 -6
  414. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +57 -6
  415. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  416. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs +34 -17
  417. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs.map +1 -1
  418. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.d.ts +19 -1
  419. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js +35 -18
  420. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js.map +1 -1
  421. package/dist/chat-ui/statewire.d.ts +1 -1
  422. package/dist/chat-ui/thread/statewire-history-edge.cjs +15 -0
  423. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  424. package/dist/chat-ui/thread/statewire-history-edge.d.ts +4 -1
  425. package/dist/chat-ui/thread/statewire-history-edge.js +15 -0
  426. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  427. package/dist/collab/client.cjs +17 -5
  428. package/dist/collab/client.cjs.map +1 -1
  429. package/dist/collab/client.d.ts +22 -7
  430. package/dist/collab/client.js +17 -5
  431. package/dist/collab/client.js.map +1 -1
  432. package/dist/composer/ComposerAttachedReferences.cjs +119 -0
  433. package/dist/composer/ComposerAttachedReferences.cjs.map +1 -0
  434. package/dist/composer/ComposerAttachedReferences.d.ts +26 -0
  435. package/dist/composer/ComposerAttachedReferences.js +119 -0
  436. package/dist/composer/ComposerAttachedReferences.js.map +1 -0
  437. package/dist/composer/ComposerNamedAgents.cjs +63 -0
  438. package/dist/composer/ComposerNamedAgents.cjs.map +1 -0
  439. package/dist/composer/ComposerNamedAgents.d.ts +16 -0
  440. package/dist/composer/ComposerNamedAgents.js +63 -0
  441. package/dist/composer/ComposerNamedAgents.js.map +1 -0
  442. package/dist/composer/attached-references.cjs +159 -0
  443. package/dist/composer/attached-references.cjs.map +1 -0
  444. package/dist/composer/attached-references.d.ts +86 -0
  445. package/dist/composer/attached-references.js +159 -0
  446. package/dist/composer/attached-references.js.map +1 -0
  447. package/dist/composer/build-composed-message.cjs +14 -7
  448. package/dist/composer/build-composed-message.cjs.map +1 -1
  449. package/dist/composer/build-composed-message.d.ts +6 -1
  450. package/dist/composer/build-composed-message.js +14 -7
  451. package/dist/composer/build-composed-message.js.map +1 -1
  452. package/dist/composer/composer-handoff.cjs +6 -2
  453. package/dist/composer/composer-handoff.cjs.map +1 -1
  454. package/dist/composer/composer-handoff.d.ts +7 -1
  455. package/dist/composer/composer-handoff.js +6 -2
  456. package/dist/composer/composer-handoff.js.map +1 -1
  457. package/dist/composer/folder-upload.cjs +149 -0
  458. package/dist/composer/folder-upload.cjs.map +1 -0
  459. package/dist/composer/folder-upload.d.ts +79 -0
  460. package/dist/composer/folder-upload.js +149 -0
  461. package/dist/composer/folder-upload.js.map +1 -0
  462. package/dist/composer/index.d.ts +1 -1
  463. package/dist/composer/useAttachToChat.cjs +35 -0
  464. package/dist/composer/useAttachToChat.cjs.map +1 -0
  465. package/dist/composer/useAttachToChat.d.ts +54 -0
  466. package/dist/composer/useAttachToChat.js +35 -0
  467. package/dist/composer/useAttachToChat.js.map +1 -0
  468. package/dist/composer/useAttachedReferencesComposerProps.cjs +19 -0
  469. package/dist/composer/useAttachedReferencesComposerProps.cjs.map +1 -0
  470. package/dist/composer/useAttachedReferencesComposerProps.d.ts +12 -0
  471. package/dist/composer/useAttachedReferencesComposerProps.js +19 -0
  472. package/dist/composer/useAttachedReferencesComposerProps.js.map +1 -0
  473. package/dist/composer/useFileUpload.cjs +95 -7
  474. package/dist/composer/useFileUpload.cjs.map +1 -1
  475. package/dist/composer/useFileUpload.d.ts +21 -2
  476. package/dist/composer/useFileUpload.js +95 -7
  477. package/dist/composer/useFileUpload.js.map +1 -1
  478. package/dist/data/athena-api-error.cjs +125 -0
  479. package/dist/data/athena-api-error.cjs.map +1 -0
  480. package/dist/data/athena-api-error.d.ts +96 -0
  481. package/dist/data/athena-api-error.js +125 -0
  482. package/dist/data/athena-api-error.js.map +1 -0
  483. package/dist/data/athena-data-client.cjs +106 -0
  484. package/dist/data/athena-data-client.cjs.map +1 -0
  485. package/dist/data/athena-data-client.d.ts +74 -0
  486. package/dist/data/athena-data-client.js +106 -0
  487. package/dist/data/athena-data-client.js.map +1 -0
  488. package/dist/data/athena-member.cjs +93 -0
  489. package/dist/data/athena-member.cjs.map +1 -0
  490. package/dist/data/athena-member.d.ts +125 -0
  491. package/dist/data/athena-member.js +93 -0
  492. package/dist/data/athena-member.js.map +1 -0
  493. package/dist/data/athena-request.cjs +458 -0
  494. package/dist/data/athena-request.cjs.map +1 -0
  495. package/dist/data/athena-request.d.ts +120 -0
  496. package/dist/data/athena-request.js +458 -0
  497. package/dist/data/athena-request.js.map +1 -0
  498. package/dist/data/use-athena-fetch.cjs +14 -0
  499. package/dist/data/use-athena-fetch.cjs.map +1 -0
  500. package/dist/data/use-athena-fetch.d.ts +19 -0
  501. package/dist/data/use-athena-fetch.js +14 -0
  502. package/dist/data/use-athena-fetch.js.map +1 -0
  503. package/dist/data/use-athena-graphql.cjs +66 -0
  504. package/dist/data/use-athena-graphql.cjs.map +1 -0
  505. package/dist/data/use-athena-graphql.d.ts +56 -0
  506. package/dist/data/use-athena-graphql.js +66 -0
  507. package/dist/data/use-athena-graphql.js.map +1 -0
  508. package/dist/data/use-athena-rest.cjs +33 -0
  509. package/dist/data/use-athena-rest.cjs.map +1 -0
  510. package/dist/data/use-athena-rest.d.ts +21 -0
  511. package/dist/data/use-athena-rest.js +33 -0
  512. package/dist/data/use-athena-rest.js.map +1 -0
  513. package/dist/data/use-semantic-query.cjs +44 -0
  514. package/dist/data/use-semantic-query.cjs.map +1 -0
  515. package/dist/data/use-semantic-query.d.ts +92 -0
  516. package/dist/data/use-semantic-query.js +44 -0
  517. package/dist/data/use-semantic-query.js.map +1 -0
  518. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  519. package/dist/diagnostics/athena-diagnostics.d.ts +5 -1
  520. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  521. package/dist/diagnostics/errors.cjs +7 -0
  522. package/dist/diagnostics/errors.cjs.map +1 -1
  523. package/dist/diagnostics/errors.d.ts +7 -0
  524. package/dist/diagnostics/errors.js +7 -0
  525. package/dist/diagnostics/errors.js.map +1 -1
  526. package/dist/index.cjs +155 -11
  527. package/dist/index.cjs.map +1 -1
  528. package/dist/index.d.ts +72 -13
  529. package/dist/index.js +148 -4
  530. package/dist/index.js.map +1 -1
  531. package/dist/keryx-http/src/initial-sync.cjs +64 -16
  532. package/dist/keryx-http/src/initial-sync.cjs.map +1 -1
  533. package/dist/keryx-http/src/initial-sync.d.ts +31 -1
  534. package/dist/keryx-http/src/initial-sync.js +64 -16
  535. package/dist/keryx-http/src/initial-sync.js.map +1 -1
  536. package/dist/keryx-http/src/own-awareness.cjs +20 -0
  537. package/dist/keryx-http/src/own-awareness.cjs.map +1 -0
  538. package/dist/keryx-http/src/own-awareness.d.ts +50 -0
  539. package/dist/keryx-http/src/own-awareness.js +20 -0
  540. package/dist/keryx-http/src/own-awareness.js.map +1 -0
  541. package/dist/keryx-http/src/update-attributions.cjs +26 -1
  542. package/dist/keryx-http/src/update-attributions.cjs.map +1 -1
  543. package/dist/keryx-http/src/update-attributions.d.ts +10 -1
  544. package/dist/keryx-http/src/update-attributions.js +26 -1
  545. package/dist/keryx-http/src/update-attributions.js.map +1 -1
  546. package/dist/offline/chat-outbox.cjs +262 -26
  547. package/dist/offline/chat-outbox.cjs.map +1 -1
  548. package/dist/offline/chat-outbox.d.ts +90 -12
  549. package/dist/offline/chat-outbox.js +263 -27
  550. package/dist/offline/chat-outbox.js.map +1 -1
  551. package/dist/provider/AthenaProvider.cjs +56 -19
  552. package/dist/provider/AthenaProvider.cjs.map +1 -1
  553. package/dist/provider/AthenaProvider.d.ts +24 -8
  554. package/dist/provider/AthenaProvider.js +57 -20
  555. package/dist/provider/AthenaProvider.js.map +1 -1
  556. package/dist/react/package.json.cjs +1 -1
  557. package/dist/react/package.json.js +1 -1
  558. package/dist/references/src/anchors/types.cjs +5 -0
  559. package/dist/references/src/anchors/types.cjs.map +1 -1
  560. package/dist/references/src/anchors/types.js +5 -0
  561. package/dist/references/src/anchors/types.js.map +1 -1
  562. package/dist/references/src/attachable.cjs +149 -0
  563. package/dist/references/src/attachable.cjs.map +1 -0
  564. package/dist/references/src/attachable.d.ts +87 -0
  565. package/dist/references/src/attachable.js +149 -0
  566. package/dist/references/src/attachable.js.map +1 -0
  567. package/dist/runtime/StatewirePlanModeLaneSync.cjs +93 -0
  568. package/dist/runtime/StatewirePlanModeLaneSync.cjs.map +1 -0
  569. package/dist/runtime/StatewirePlanModeLaneSync.d.ts +34 -0
  570. package/dist/runtime/StatewirePlanModeLaneSync.js +93 -0
  571. package/dist/runtime/StatewirePlanModeLaneSync.js.map +1 -0
  572. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +2 -0
  573. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  574. package/dist/runtime/StatewireThreadConfigLaneSync.d.ts +4 -0
  575. package/dist/runtime/StatewireThreadConfigLaneSync.js +2 -0
  576. package/dist/runtime/StatewireThreadConfigLaneSync.js.map +1 -1
  577. package/dist/runtime/statewire-plan-mode.cjs +71 -0
  578. package/dist/runtime/statewire-plan-mode.cjs.map +1 -0
  579. package/dist/runtime/statewire-plan-mode.d.ts +88 -0
  580. package/dist/runtime/statewire-plan-mode.js +71 -0
  581. package/dist/runtime/statewire-plan-mode.js.map +1 -0
  582. package/dist/runtime/statewire-run-config.cjs +3 -1
  583. package/dist/runtime/statewire-run-config.cjs.map +1 -1
  584. package/dist/runtime/statewire-run-config.d.ts +7 -0
  585. package/dist/runtime/statewire-run-config.js +3 -1
  586. package/dist/runtime/statewire-run-config.js.map +1 -1
  587. package/dist/runtime/statewire-session-key.cjs +11 -5
  588. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  589. package/dist/runtime/statewire-session-key.d.ts +22 -10
  590. package/dist/runtime/statewire-session-key.js +11 -5
  591. package/dist/runtime/statewire-session-key.js.map +1 -1
  592. package/dist/runtime/useAthenaStatewireRuntime.cjs +65 -8
  593. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  594. package/dist/runtime/useAthenaStatewireRuntime.d.ts +26 -10
  595. package/dist/runtime/useAthenaStatewireRuntime.js +67 -10
  596. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  597. package/dist/search/useAthenaAssets.cjs +394 -0
  598. package/dist/search/useAthenaAssets.cjs.map +1 -0
  599. package/dist/search/useAthenaAssets.d.ts +186 -0
  600. package/dist/search/useAthenaAssets.js +394 -0
  601. package/dist/search/useAthenaAssets.js.map +1 -0
  602. package/dist/sheet-range/index.cjs +4 -0
  603. package/dist/sheet-range/index.cjs.map +1 -1
  604. package/dist/sheet-range/index.d.ts +4 -2
  605. package/dist/sheet-range/index.js +4 -0
  606. package/dist/sheet-range/index.js.map +1 -1
  607. package/dist/sheet-range/query-range.cjs +102 -0
  608. package/dist/sheet-range/query-range.cjs.map +1 -0
  609. package/dist/sheet-range/query-range.d.ts +46 -0
  610. package/dist/sheet-range/query-range.js +102 -0
  611. package/dist/sheet-range/query-range.js.map +1 -0
  612. package/dist/styles.css +1 -1
  613. package/dist/subagents/index.cjs +49 -0
  614. package/dist/subagents/index.cjs.map +1 -0
  615. package/dist/subagents/index.d.ts +16 -0
  616. package/dist/subagents/index.js +49 -0
  617. package/dist/subagents/index.js.map +1 -0
  618. package/dist/subagents/lane-follow.cjs +19 -0
  619. package/dist/subagents/lane-follow.cjs.map +1 -0
  620. package/dist/subagents/lane-follow.d.ts +9 -0
  621. package/dist/subagents/lane-follow.js +19 -0
  622. package/dist/subagents/lane-follow.js.map +1 -0
  623. package/dist/subagents/lane-model.cjs +178 -0
  624. package/dist/subagents/lane-model.cjs.map +1 -0
  625. package/dist/subagents/lane-model.d.ts +140 -0
  626. package/dist/subagents/lane-model.js +178 -0
  627. package/dist/subagents/lane-model.js.map +1 -0
  628. package/dist/subagents/lane-parts.cjs +517 -0
  629. package/dist/subagents/lane-parts.cjs.map +1 -0
  630. package/dist/subagents/lane-parts.d.ts +130 -0
  631. package/dist/subagents/lane-parts.js +517 -0
  632. package/dist/subagents/lane-parts.js.map +1 -0
  633. package/dist/subagents/subagent-lane-group.cjs +215 -0
  634. package/dist/subagents/subagent-lane-group.cjs.map +1 -0
  635. package/dist/subagents/subagent-lane-group.d.ts +67 -0
  636. package/dist/subagents/subagent-lane-group.js +215 -0
  637. package/dist/subagents/subagent-lane-group.js.map +1 -0
  638. package/dist/subagents/subagent-transcript-drawer.cjs +431 -0
  639. package/dist/subagents/subagent-transcript-drawer.cjs.map +1 -0
  640. package/dist/subagents/subagent-transcript-drawer.d.ts +78 -0
  641. package/dist/subagents/subagent-transcript-drawer.js +431 -0
  642. package/dist/subagents/subagent-transcript-drawer.js.map +1 -0
  643. package/dist/subagents/task-subagent-group.cjs +115 -0
  644. package/dist/subagents/task-subagent-group.cjs.map +1 -0
  645. package/dist/subagents/task-subagent-group.d.ts +36 -0
  646. package/dist/subagents/task-subagent-group.js +115 -0
  647. package/dist/subagents/task-subagent-group.js.map +1 -0
  648. package/dist/subagents/use-omitted-images-in-view.cjs +68 -0
  649. package/dist/subagents/use-omitted-images-in-view.cjs.map +1 -0
  650. package/dist/subagents/use-omitted-images-in-view.d.ts +21 -0
  651. package/dist/subagents/use-omitted-images-in-view.js +68 -0
  652. package/dist/subagents/use-omitted-images-in-view.js.map +1 -0
  653. package/dist/threads/Inbox.cjs +2 -2
  654. package/dist/threads/Inbox.cjs.map +1 -1
  655. package/dist/threads/SessionList.cjs +6 -6
  656. package/dist/threads/SessionList.cjs.map +1 -1
  657. package/dist/threads/SessionsPage.cjs +13 -7
  658. package/dist/threads/SessionsPage.cjs.map +1 -1
  659. package/dist/threads/SessionsPage.d.ts +10 -1
  660. package/dist/threads/SessionsPage.js +9 -3
  661. package/dist/threads/SessionsPage.js.map +1 -1
  662. package/dist/threads/session-list-model.cjs.map +1 -1
  663. package/dist/threads/session-list-model.d.ts +2 -1
  664. package/dist/threads/session-list-model.js.map +1 -1
  665. package/dist/threads/session-row-parts.cjs +3 -3
  666. package/dist/threads/session-row-parts.cjs.map +1 -1
  667. package/dist/threads/sessions-page-model.cjs +13 -5
  668. package/dist/threads/sessions-page-model.cjs.map +1 -1
  669. package/dist/threads/sessions-page-model.d.ts +7 -0
  670. package/dist/threads/sessions-page-model.js +11 -3
  671. package/dist/threads/sessions-page-model.js.map +1 -1
  672. package/dist/threads/sessions-page-storage.cjs +8 -8
  673. package/dist/threads/sessions-page-storage.cjs.map +1 -1
  674. package/dist/threads/sessions-page-storage.d.ts +5 -1
  675. package/dist/threads/sessions-page-storage.js +8 -8
  676. package/dist/threads/sessions-page-storage.js.map +1 -1
  677. package/dist/threads/use-athena-sessions.cjs +1 -0
  678. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  679. package/dist/threads/use-athena-sessions.d.ts +7 -0
  680. package/dist/threads/use-athena-sessions.js +1 -0
  681. package/dist/threads/use-athena-sessions.js.map +1 -1
  682. package/dist/threads/use-athena-thread-agent.cjs +31 -0
  683. package/dist/threads/use-athena-thread-agent.cjs.map +1 -0
  684. package/dist/threads/use-athena-thread-agent.d.ts +38 -0
  685. package/dist/threads/use-athena-thread-agent.js +31 -0
  686. package/dist/threads/use-athena-thread-agent.js.map +1 -0
  687. package/dist/threads/use-athena-thread-plan-mode.cjs +18 -0
  688. package/dist/threads/use-athena-thread-plan-mode.cjs.map +1 -0
  689. package/dist/threads/use-athena-thread-plan-mode.d.ts +18 -0
  690. package/dist/threads/use-athena-thread-plan-mode.js +18 -0
  691. package/dist/threads/use-athena-thread-plan-mode.js.map +1 -0
  692. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  693. package/dist/tools/agent-creations.cjs +97 -0
  694. package/dist/tools/agent-creations.cjs.map +1 -0
  695. package/dist/tools/agent-creations.d.ts +38 -0
  696. package/dist/tools/agent-creations.js +97 -0
  697. package/dist/tools/agent-creations.js.map +1 -0
  698. package/dist/tools/agent-highlights.cjs +100 -0
  699. package/dist/tools/agent-highlights.cjs.map +1 -0
  700. package/dist/tools/agent-highlights.d.ts +57 -0
  701. package/dist/tools/agent-highlights.js +100 -0
  702. package/dist/tools/agent-highlights.js.map +1 -0
  703. package/dist/tools/append-document-tool-ui.cjs +1 -0
  704. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  705. package/dist/tools/append-document-tool-ui.d.ts +7 -0
  706. package/dist/tools/append-document-tool-ui.js +2 -1
  707. package/dist/tools/append-document-tool-ui.js.map +1 -1
  708. package/dist/tools/auto-open-tools.cjs +144 -71
  709. package/dist/tools/auto-open-tools.cjs.map +1 -1
  710. package/dist/tools/auto-open-tools.d.ts +131 -1
  711. package/dist/tools/auto-open-tools.js +145 -72
  712. package/dist/tools/auto-open-tools.js.map +1 -1
  713. package/dist/tools/browser-tool-uis.cjs +594 -0
  714. package/dist/tools/browser-tool-uis.cjs.map +1 -0
  715. package/dist/tools/browser-tool-uis.d.ts +8 -0
  716. package/dist/tools/browser-tool-uis.js +594 -0
  717. package/dist/tools/browser-tool-uis.js.map +1 -0
  718. package/dist/tools/computer-asset-tool-uis.cjs +313 -0
  719. package/dist/tools/computer-asset-tool-uis.cjs.map +1 -0
  720. package/dist/tools/computer-asset-tool-uis.d.ts +5 -0
  721. package/dist/tools/computer-asset-tool-uis.js +313 -0
  722. package/dist/tools/computer-asset-tool-uis.js.map +1 -0
  723. package/dist/tools/document-edit-tool-uis.cjs +218 -0
  724. package/dist/tools/document-edit-tool-uis.cjs.map +1 -0
  725. package/dist/tools/document-edit-tool-uis.d.ts +40 -0
  726. package/dist/tools/document-edit-tool-uis.js +218 -0
  727. package/dist/tools/document-edit-tool-uis.js.map +1 -0
  728. package/dist/tools/drive-tool-uis.cjs +425 -0
  729. package/dist/tools/drive-tool-uis.cjs.map +1 -0
  730. package/dist/tools/drive-tool-uis.d.ts +120 -0
  731. package/dist/tools/drive-tool-uis.js +425 -0
  732. package/dist/tools/drive-tool-uis.js.map +1 -0
  733. package/dist/tools/email-calendar-tool-uis.cjs +789 -0
  734. package/dist/tools/email-calendar-tool-uis.cjs.map +1 -0
  735. package/dist/tools/email-calendar-tool-uis.d.ts +129 -0
  736. package/dist/tools/email-calendar-tool-uis.js +789 -0
  737. package/dist/tools/email-calendar-tool-uis.js.map +1 -0
  738. package/dist/tools/ontology-tool-uis.cjs +83 -0
  739. package/dist/tools/ontology-tool-uis.cjs.map +1 -0
  740. package/dist/tools/ontology-tool-uis.d.ts +9 -0
  741. package/dist/tools/ontology-tool-uis.js +83 -0
  742. package/dist/tools/ontology-tool-uis.js.map +1 -0
  743. package/dist/tools/orchestration-tool-uis.cjs +586 -0
  744. package/dist/tools/orchestration-tool-uis.cjs.map +1 -0
  745. package/dist/tools/orchestration-tool-uis.d.ts +141 -0
  746. package/dist/tools/orchestration-tool-uis.js +586 -0
  747. package/dist/tools/orchestration-tool-uis.js.map +1 -0
  748. package/dist/tools/presentation-edit-tool-uis.cjs +516 -0
  749. package/dist/tools/presentation-edit-tool-uis.cjs.map +1 -0
  750. package/dist/tools/presentation-edit-tool-uis.d.ts +73 -0
  751. package/dist/tools/presentation-edit-tool-uis.js +516 -0
  752. package/dist/tools/presentation-edit-tool-uis.js.map +1 -0
  753. package/dist/tools/project-tool-uis.cjs +213 -0
  754. package/dist/tools/project-tool-uis.cjs.map +1 -0
  755. package/dist/tools/project-tool-uis.d.ts +14 -0
  756. package/dist/tools/project-tool-uis.js +213 -0
  757. package/dist/tools/project-tool-uis.js.map +1 -0
  758. package/dist/tools/sandbox-tool-uis.cjs +491 -0
  759. package/dist/tools/sandbox-tool-uis.cjs.map +1 -0
  760. package/dist/tools/sandbox-tool-uis.d.ts +116 -0
  761. package/dist/tools/sandbox-tool-uis.js +491 -0
  762. package/dist/tools/sandbox-tool-uis.js.map +1 -0
  763. package/dist/tools/sheet-query-tool-ui.cjs +138 -0
  764. package/dist/tools/sheet-query-tool-ui.cjs.map +1 -0
  765. package/dist/tools/sheet-query-tool-ui.d.ts +15 -0
  766. package/dist/tools/sheet-query-tool-ui.js +138 -0
  767. package/dist/tools/sheet-query-tool-ui.js.map +1 -0
  768. package/dist/tools/studio-screenshot-tool-uis.cjs +262 -0
  769. package/dist/tools/studio-screenshot-tool-uis.cjs.map +1 -0
  770. package/dist/tools/studio-screenshot-tool-uis.d.ts +52 -0
  771. package/dist/tools/studio-screenshot-tool-uis.js +262 -0
  772. package/dist/tools/studio-screenshot-tool-uis.js.map +1 -0
  773. package/dist/tools/subagent-task-tool-ui.cjs +24 -475
  774. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  775. package/dist/tools/subagent-task-tool-ui.d.ts +19 -103
  776. package/dist/tools/subagent-task-tool-ui.js +28 -479
  777. package/dist/tools/subagent-task-tool-ui.js.map +1 -1
  778. package/dist/tools/tool-summary.cjs +36 -0
  779. package/dist/tools/tool-summary.cjs.map +1 -1
  780. package/dist/tools/tool-summary.js +36 -0
  781. package/dist/tools/tool-summary.js.map +1 -1
  782. package/dist/tools/tool-uis.cjs +181 -53
  783. package/dist/tools/tool-uis.cjs.map +1 -1
  784. package/dist/tools/tool-uis.d.ts +40 -0
  785. package/dist/tools/tool-uis.js +183 -55
  786. package/dist/tools/tool-uis.js.map +1 -1
  787. package/dist/typed-interrupts/index.cjs +15 -0
  788. package/dist/typed-interrupts/index.cjs.map +1 -0
  789. package/dist/typed-interrupts/index.d.ts +20 -0
  790. package/dist/typed-interrupts/index.js +15 -0
  791. package/dist/typed-interrupts/index.js.map +1 -0
  792. package/dist/workbench/session-workbench-panes.cjs +6 -6
  793. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  794. package/package.json +28 -6
  795. package/dist/agent-runtime/src/chat-outbox-store.cjs +0 -510
  796. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +0 -1
  797. package/dist/agent-runtime/src/chat-outbox-store.d.ts +0 -210
  798. package/dist/agent-runtime/src/chat-outbox-store.js +0 -510
  799. package/dist/agent-runtime/src/chat-outbox-store.js.map +0 -1
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("@assistant-ui/react");
5
+ const reactQuery = require("@tanstack/react-query");
6
+ const require$$0 = require("react");
7
+ const mint = require("../collab/mint.cjs");
8
+ const errors = require("../diagnostics/errors.cjs");
9
+ const useAthenaRestQuery = require("../lib/use-athena-rest-query.cjs");
10
+ const AthenaContext = require("../provider/AthenaContext.cjs");
11
+ const credentialRenewal = require("../runtime/credential-renewal.cjs");
12
+ const threadStatus = require("../agent-runtime/src/thread-status.cjs");
13
+ const runtimeMessages = require("../agent-runtime/src/runtime-messages.cjs");
14
+ const FOLLOW_UP_SUGGESTIONS_PATH = "/api/chat/follow-up-suggestions";
15
+ const MAX_FOLLOW_UP_SUGGESTIONS = 3;
16
+ const FOLLOW_UP_SUGGESTION_MAX_CHARS = 120;
17
+ const FOLLOW_UP_USER_MESSAGE_MAX_CHARS = 4e3;
18
+ function textOf(message) {
19
+ return message.content.map((part) => part.type === "text" ? part.text : "").filter((text) => text.trim().length > 0).join("\n\n").trim();
20
+ }
21
+ function readFinishedTurn(messages) {
22
+ const last = messages.at(-1);
23
+ if (!last || last.role !== "assistant") return null;
24
+ if (last.status.type !== "complete") return null;
25
+ if (runtimeMessages.readRuntimeMessageFromSourceMessages(last)) return null;
26
+ const reply = textOf(last);
27
+ if (!reply) return null;
28
+ const lastUser = messages.findLast((message) => message.role === "user");
29
+ return {
30
+ id: last.id,
31
+ lastUserMessage: (lastUser ? textOf(lastUser) : "").slice(0, FOLLOW_UP_USER_MESSAGE_MAX_CHARS),
32
+ lastAssistantMessage: reply.slice(-8e3)
33
+ };
34
+ }
35
+ function readFollowUpSuggestions(body) {
36
+ const suggestions = typeof body === "object" && body !== null ? Reflect.get(body, "suggestions") : void 0;
37
+ if (!Array.isArray(suggestions)) return [];
38
+ const seen = /* @__PURE__ */ new Set();
39
+ const out = [];
40
+ for (const item of suggestions) {
41
+ if (typeof item !== "string") continue;
42
+ const text = item.trim();
43
+ if (!text || text.length > FOLLOW_UP_SUGGESTION_MAX_CHARS || seen.has(text)) continue;
44
+ seen.add(text);
45
+ out.push(text);
46
+ if (out.length === MAX_FOLLOW_UP_SUGGESTIONS) break;
47
+ }
48
+ return out;
49
+ }
50
+ async function fetchFollowUpSuggestions({
51
+ backendUrl,
52
+ auth,
53
+ threadId,
54
+ turn,
55
+ signal
56
+ }) {
57
+ const url = `${mint.getAthenaApiBaseUrl(backendUrl)}${FOLLOW_UP_SUGGESTIONS_PATH}`;
58
+ const body = {
59
+ thread_id: threadId,
60
+ last_user_message: turn.lastUserMessage,
61
+ last_assistant_message: turn.lastAssistantMessage
62
+ };
63
+ const res = await credentialRenewal.sendWithCredentialRenewal(
64
+ auth,
65
+ (headers) => fetch(url, {
66
+ method: "POST",
67
+ headers: { "Content-Type": "application/json", ...headers },
68
+ body: JSON.stringify(body),
69
+ signal: signal ?? null
70
+ })
71
+ );
72
+ if (!res.ok) {
73
+ throw new errors.AthenaSdkError({
74
+ code: res.status === 401 || res.status === 403 ? "auth_rejected" : "follow_up_suggestions_failed",
75
+ message: `Follow-up suggestions failed: ${res.status}`,
76
+ status: res.status
77
+ });
78
+ }
79
+ return readFollowUpSuggestions(await res.json());
80
+ }
81
+ function useFinishedTurn({ enabled }) {
82
+ const connection = threadStatus.useDeepAgentConnection();
83
+ const live = react.useAuiState((state) => {
84
+ const thread = state.optional.thread;
85
+ return enabled && thread ? threadStatus.readRunLive(thread, connection) : false;
86
+ });
87
+ const messages = react.useAuiState((state) => {
88
+ var _a;
89
+ const thread = state.optional.thread;
90
+ if (!enabled || !thread || threadStatus.readRunLive(thread, connection)) return null;
91
+ const status = (_a = thread.extras) == null ? void 0 : _a.status;
92
+ if (status === void 0 ? thread.isRunning : status !== "ready") return null;
93
+ return thread.messages;
94
+ });
95
+ const resting = require$$0.useMemo(() => messages ? readFinishedTurn(messages) : null, [messages]);
96
+ const [armed, setArmed] = require$$0.useState(false);
97
+ const [finishedId, setFinishedId] = require$$0.useState(null);
98
+ require$$0.useEffect(() => {
99
+ if (!live) return;
100
+ setArmed(true);
101
+ setFinishedId(null);
102
+ }, [live]);
103
+ const restingId = (resting == null ? void 0 : resting.id) ?? null;
104
+ require$$0.useEffect(() => {
105
+ if (!armed || restingId === null) return;
106
+ setFinishedId(restingId);
107
+ setArmed(false);
108
+ }, [armed, restingId]);
109
+ return resting !== null && resting.id === finishedId ? resting : null;
110
+ }
111
+ const FollowUpSuggestions = ({ enabled, threadId, hasDraft, onPick }) => {
112
+ const config = AthenaContext.useAthenaConfig();
113
+ const { backendUrl, apiKey, getToken } = config;
114
+ const identity = useAthenaRestQuery.useAthenaQueryIdentity({ apiKey, token: config.token, getToken });
115
+ const queryClient = useAthenaRestQuery.useAthenaQueryClient();
116
+ const turn = useFinishedTurn({ enabled });
117
+ const [dismissed, setDismissed] = require$$0.useState(null);
118
+ const turnId = (turn == null ? void 0 : turn.id) ?? null;
119
+ require$$0.useEffect(() => {
120
+ if (hasDraft && turnId !== null) setDismissed(turnId);
121
+ }, [hasDraft, turnId]);
122
+ const open = turn !== null && turn.id !== dismissed && !hasDraft;
123
+ const { data } = reactQuery.useQuery(
124
+ {
125
+ queryKey: [
126
+ "athena-sdk",
127
+ "follow-up-suggestions",
128
+ backendUrl,
129
+ ...identity,
130
+ threadId,
131
+ turnId ?? ""
132
+ ],
133
+ // `config.token` is read at fetch time: the provider serves the latest
134
+ // token through a getter, so a rotation reaches the request.
135
+ queryFn: ({ signal }) => turn ? fetchFollowUpSuggestions({
136
+ backendUrl,
137
+ auth: { apiKey, token: config.token, getToken },
138
+ threadId,
139
+ turn,
140
+ signal
141
+ }) : [],
142
+ enabled: open && backendUrl.length > 0,
143
+ // One request per finished turn: never read again while the chat stays on it.
144
+ staleTime: Number.POSITIVE_INFINITY,
145
+ retry: false,
146
+ refetchOnWindowFocus: false,
147
+ refetchOnReconnect: false
148
+ },
149
+ queryClient
150
+ );
151
+ if (!open || !data || data.length === 0) return null;
152
+ return (
153
+ // A fieldset: one group named for assistive tech (its implicit role), no form semantics.
154
+ /* @__PURE__ */ jsxRuntime.jsx(
155
+ "fieldset",
156
+ {
157
+ "aria-label": "Suggested follow-ups",
158
+ "data-testid": "athena-follow-up-suggestions",
159
+ className: "aui-composer-follow-ups m-0 flex min-w-0 flex-wrap gap-1.5 border-0 px-1 pt-0 pb-2",
160
+ children: data.map((suggestion) => /* @__PURE__ */ jsxRuntime.jsx(
161
+ "button",
162
+ {
163
+ type: "button",
164
+ title: suggestion,
165
+ "data-follow-up-suggestion": "",
166
+ onClick: () => {
167
+ setDismissed(turnId);
168
+ onPick(suggestion);
169
+ },
170
+ className: "max-w-full truncate rounded-full border border-border/60 bg-card px-3 py-1 text-left text-muted-foreground text-xs shadow-sm transition-colors hover:border-border hover:bg-muted/40 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40",
171
+ children: suggestion
172
+ },
173
+ suggestion
174
+ ))
175
+ }
176
+ )
177
+ );
178
+ };
179
+ exports.FOLLOW_UP_SUGGESTIONS_PATH = FOLLOW_UP_SUGGESTIONS_PATH;
180
+ exports.FollowUpSuggestions = FollowUpSuggestions;
181
+ exports.MAX_FOLLOW_UP_SUGGESTIONS = MAX_FOLLOW_UP_SUGGESTIONS;
182
+ exports.fetchFollowUpSuggestions = fetchFollowUpSuggestions;
183
+ exports.readFinishedTurn = readFinishedTurn;
184
+ exports.readFollowUpSuggestions = readFollowUpSuggestions;
185
+ //# sourceMappingURL=follow-up-suggestions.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-up-suggestions.cjs","sources":["../../src/chat/follow-up-suggestions.tsx"],"sourcesContent":["/**\n * Suggested follow-up prompts (`AthenaChat`'s `followUpSuggestions`, off by\n * default): once a run this chat watched finishes with a reply, the chat asks\n * agora for up to three prompts the person might type next\n * (`POST /api/chat/follow-up-suggestions`, with the chat's own credential) and\n * shows them as chips above the composer. A chip puts its text in the composer\n * and sends nothing. They go away once the person types or sends, or a new run\n * starts; a turn that was stopped, failed or is waiting on the person gets\n * none, and a failed request shows nothing at all.\n */\nimport { type ThreadMessage, useAuiState } from '@assistant-ui/react';\nimport type { StatewireThread } from '@assistant-ui/react-statewire';\nimport {\n readRunLive,\n readRuntimeMessageFromSourceMessages,\n useDeepAgentConnection,\n} from '@athenaintel/agent-runtime';\nimport { useQuery } from '@tanstack/react-query';\nimport { useEffect, useMemo, useState, type FC } from 'react';\nimport { getAthenaApiBaseUrl } from '../collab/mint';\nimport { AthenaSdkError } from '../diagnostics/errors';\nimport { useAthenaQueryClient, useAthenaQueryIdentity } from '../lib/use-athena-rest-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport { sendWithCredentialRenewal } from '../runtime/credential-renewal';\nimport type { StatewireAuthSource } from '../runtime/statewire-auth-headers';\n\nexport const FOLLOW_UP_SUGGESTIONS_PATH = '/api/chat/follow-up-suggestions';\n/** The most chips shown, and the longest one agora answers. */\nexport const MAX_FOLLOW_UP_SUGGESTIONS = 3;\nconst FOLLOW_UP_SUGGESTION_MAX_CHARS = 120;\n/** What the route takes of each message: the start of the person's, the end of the reply. */\nconst FOLLOW_UP_USER_MESSAGE_MAX_CHARS = 4000;\nconst FOLLOW_UP_ASSISTANT_MESSAGE_MAX_CHARS = 8000;\n\n/** The turn a run just finished, as the request carries it. */\nexport interface FinishedTurn {\n /** The reply's message id: one request per finished turn. */\n id: string;\n lastUserMessage: string;\n lastAssistantMessage: string;\n}\n\n/** The route's JSON body. */\nexport interface FollowUpSuggestionsRequestBody {\n thread_id: string;\n last_user_message: string;\n last_assistant_message: string;\n}\n\n/** The message's words: its text parts, in order (no reasoning, tools or files). */\nfunction textOf(message: ThreadMessage): string {\n return message.content\n .map((part) => (part.type === 'text' ? part.text : ''))\n .filter((text) => text.trim().length > 0)\n .join('\\n\\n')\n .trim();\n}\n\n/**\n * The turn that ended the transcript, or `null` when it has nothing to follow\n * up on: the last message is not the assistant's, it carries no words, it did\n * not complete, or it is how the runtime ended the run (stopped, failed, a\n * server-update pause, a handoff, a send now).\n */\nexport function readFinishedTurn(messages: readonly ThreadMessage[]): FinishedTurn | null {\n const last = messages.at(-1);\n if (!last || last.role !== 'assistant') return null;\n if (last.status.type !== 'complete') return null;\n if (readRuntimeMessageFromSourceMessages(last)) return null;\n const reply = textOf(last);\n if (!reply) return null;\n const lastUser = messages.findLast((message) => message.role === 'user');\n return {\n id: last.id,\n lastUserMessage: (lastUser ? textOf(lastUser) : '').slice(0, FOLLOW_UP_USER_MESSAGE_MAX_CHARS),\n lastAssistantMessage: reply.slice(-FOLLOW_UP_ASSISTANT_MESSAGE_MAX_CHARS),\n };\n}\n\n/** The answer's suggestions as chips take them: strings, trimmed, at most three. */\nexport function readFollowUpSuggestions(body: unknown): string[] {\n const suggestions: unknown =\n typeof body === 'object' && body !== null ? Reflect.get(body, 'suggestions') : undefined;\n if (!Array.isArray(suggestions)) return [];\n const seen = new Set<string>();\n const out: string[] = [];\n for (const item of suggestions) {\n if (typeof item !== 'string') continue;\n const text = item.trim();\n if (!text || text.length > FOLLOW_UP_SUGGESTION_MAX_CHARS || seen.has(text)) continue;\n seen.add(text);\n out.push(text);\n if (out.length === MAX_FOLLOW_UP_SUGGESTIONS) break;\n }\n return out;\n}\n\n/**\n * One request for a finished turn. The credential rides `Authorization:\n * Bearer` (resolved live through `getToken`) or `X-API-KEY`, and a refused\n * bearer is renewed once (`sendWithCredentialRenewal`), as the SDK's other\n * REST reads do. Rejects with an `AthenaSdkError` on any refusal; the chat\n * shows nothing then.\n */\nexport async function fetchFollowUpSuggestions({\n backendUrl,\n auth,\n threadId,\n turn,\n signal,\n}: {\n backendUrl: string;\n auth: StatewireAuthSource;\n threadId: string;\n turn: FinishedTurn;\n signal?: AbortSignal;\n}): Promise<string[]> {\n const url = `${getAthenaApiBaseUrl(backendUrl)}${FOLLOW_UP_SUGGESTIONS_PATH}`;\n const body: FollowUpSuggestionsRequestBody = {\n thread_id: threadId,\n last_user_message: turn.lastUserMessage,\n last_assistant_message: turn.lastAssistantMessage,\n };\n const res = await sendWithCredentialRenewal(auth, (headers) =>\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(body),\n signal: signal ?? null,\n }),\n );\n if (!res.ok) {\n throw new AthenaSdkError({\n code: res.status === 401 || res.status === 403 ? 'auth_rejected' : 'follow_up_suggestions_failed',\n message: `Follow-up suggestions failed: ${res.status}`,\n status: res.status,\n });\n }\n return readFollowUpSuggestions(await res.json());\n}\n\n/**\n * The turn the last run this chat watched finished with, while `enabled`:\n * the transcript's last turn when the thread came to rest after a live run,\n * and only that one. A run that was over before the chat showed it (a\n * conversation opened at rest) asks for nothing, and neither does another\n * branch the person moves to afterwards: suggestions follow the turn the\n * person saw finish. `null` while a run is live, and after one that ended\n * any way but resting (stopped, failed, waiting on the person).\n */\nfunction useFinishedTurn({ enabled }: { enabled: boolean }): FinishedTurn | null {\n const connection = useDeepAgentConnection();\n const live = useAuiState((state) => {\n const thread = state.optional.thread;\n return enabled && thread ? readRunLive(thread, connection) : false;\n });\n const messages = useAuiState((state) => {\n const thread = state.optional.thread;\n if (!enabled || !thread || readRunLive(thread, connection)) return null;\n const status = (thread.extras as Partial<StatewireThread.Extras> | undefined)?.status;\n if (status === undefined ? thread.isRunning : status !== 'ready') return null;\n return thread.messages;\n });\n const resting = useMemo(() => (messages ? readFinishedTurn(messages) : null), [messages]);\n // A live run arms the latch; the first turn the thread rests on after it is the one followed up.\n const [armed, setArmed] = useState(false);\n const [finishedId, setFinishedId] = useState<string | null>(null);\n useEffect(() => {\n if (!live) return;\n setArmed(true);\n setFinishedId(null);\n }, [live]);\n const restingId = resting?.id ?? null;\n useEffect(() => {\n if (!armed || restingId === null) return;\n setFinishedId(restingId);\n setArmed(false);\n }, [armed, restingId]);\n return resting !== null && resting.id === finishedId ? resting : null;\n}\n\n/**\n * Up to three chips above the composer after a finished turn; nothing at all\n * while `enabled` is false (no request either). `hasDraft` is the composer\n * holding anything: the person typing puts this turn's chips away for good.\n * `onPick` gets a chip's text to put in the composer.\n */\nexport const FollowUpSuggestions: FC<{\n enabled: boolean;\n threadId: string;\n hasDraft: boolean;\n onPick: (text: string) => void;\n}> = ({ enabled, threadId, hasDraft, onPick }) => {\n const config = useAthenaConfig();\n const { backendUrl, apiKey, getToken } = config;\n const identity = useAthenaQueryIdentity({ apiKey, token: config.token, getToken });\n const queryClient = useAthenaQueryClient();\n const turn = useFinishedTurn({ enabled });\n // The turn whose chips the person put away (typed, sent, or picked one).\n const [dismissed, setDismissed] = useState<string | null>(null);\n const turnId = turn?.id ?? null;\n useEffect(() => {\n if (hasDraft && turnId !== null) setDismissed(turnId);\n }, [hasDraft, turnId]);\n const open = turn !== null && turn.id !== dismissed && !hasDraft;\n const { data } = useQuery(\n {\n queryKey: [\n 'athena-sdk',\n 'follow-up-suggestions',\n backendUrl,\n ...identity,\n threadId,\n turnId ?? '',\n ],\n // `config.token` is read at fetch time: the provider serves the latest\n // token through a getter, so a rotation reaches the request.\n queryFn: ({ signal }) =>\n turn\n ? fetchFollowUpSuggestions({\n backendUrl,\n auth: { apiKey, token: config.token, getToken },\n threadId,\n turn,\n signal,\n })\n : [],\n enabled: open && backendUrl.length > 0,\n // One request per finished turn: never read again while the chat stays on it.\n staleTime: Number.POSITIVE_INFINITY,\n retry: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n },\n queryClient,\n );\n if (!open || !data || data.length === 0) return null;\n return (\n // A fieldset: one group named for assistive tech (its implicit role), no form semantics.\n <fieldset\n aria-label=\"Suggested follow-ups\"\n data-testid=\"athena-follow-up-suggestions\"\n className=\"aui-composer-follow-ups m-0 flex min-w-0 flex-wrap gap-1.5 border-0 px-1 pt-0 pb-2\"\n >\n {data.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n title={suggestion}\n data-follow-up-suggestion=\"\"\n onClick={() => {\n setDismissed(turnId);\n onPick(suggestion);\n }}\n className=\"max-w-full truncate rounded-full border border-border/60 bg-card px-3 py-1 text-left text-muted-foreground text-xs shadow-sm transition-colors hover:border-border hover:bg-muted/40 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\"\n >\n {suggestion}\n </button>\n ))}\n </fieldset>\n );\n};\n"],"names":["readRuntimeMessageFromSourceMessages","getAthenaApiBaseUrl","sendWithCredentialRenewal","AthenaSdkError","useDeepAgentConnection","useAuiState","readRunLive","useMemo","useState","useEffect","useAthenaConfig","useAthenaQueryIdentity","useAthenaQueryClient","useQuery","jsx"],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Suggested follow-up prompts (`AthenaChat`'s `followUpSuggestions`, off by
3
+ * default): once a run this chat watched finishes with a reply, the chat asks
4
+ * agora for up to three prompts the person might type next
5
+ * (`POST /api/chat/follow-up-suggestions`, with the chat's own credential) and
6
+ * shows them as chips above the composer. A chip puts its text in the composer
7
+ * and sends nothing. They go away once the person types or sends, or a new run
8
+ * starts; a turn that was stopped, failed or is waiting on the person gets
9
+ * none, and a failed request shows nothing at all.
10
+ */
11
+ import { type ThreadMessage } from '@assistant-ui/react';
12
+ import { type FC } from 'react';
13
+ import type { StatewireAuthSource } from '../runtime/statewire-auth-headers';
14
+ export declare const FOLLOW_UP_SUGGESTIONS_PATH = "/api/chat/follow-up-suggestions";
15
+ /** The most chips shown, and the longest one agora answers. */
16
+ export declare const MAX_FOLLOW_UP_SUGGESTIONS = 3;
17
+ /** The turn a run just finished, as the request carries it. */
18
+ export interface FinishedTurn {
19
+ /** The reply's message id: one request per finished turn. */
20
+ id: string;
21
+ lastUserMessage: string;
22
+ lastAssistantMessage: string;
23
+ }
24
+ /** The route's JSON body. */
25
+ export interface FollowUpSuggestionsRequestBody {
26
+ thread_id: string;
27
+ last_user_message: string;
28
+ last_assistant_message: string;
29
+ }
30
+ /**
31
+ * The turn that ended the transcript, or `null` when it has nothing to follow
32
+ * up on: the last message is not the assistant's, it carries no words, it did
33
+ * not complete, or it is how the runtime ended the run (stopped, failed, a
34
+ * server-update pause, a handoff, a send now).
35
+ */
36
+ export declare function readFinishedTurn(messages: readonly ThreadMessage[]): FinishedTurn | null;
37
+ /** The answer's suggestions as chips take them: strings, trimmed, at most three. */
38
+ export declare function readFollowUpSuggestions(body: unknown): string[];
39
+ /**
40
+ * One request for a finished turn. The credential rides `Authorization:
41
+ * Bearer` (resolved live through `getToken`) or `X-API-KEY`, and a refused
42
+ * bearer is renewed once (`sendWithCredentialRenewal`), as the SDK's other
43
+ * REST reads do. Rejects with an `AthenaSdkError` on any refusal; the chat
44
+ * shows nothing then.
45
+ */
46
+ export declare function fetchFollowUpSuggestions({ backendUrl, auth, threadId, turn, signal, }: {
47
+ backendUrl: string;
48
+ auth: StatewireAuthSource;
49
+ threadId: string;
50
+ turn: FinishedTurn;
51
+ signal?: AbortSignal;
52
+ }): Promise<string[]>;
53
+ /**
54
+ * Up to three chips above the composer after a finished turn; nothing at all
55
+ * while `enabled` is false (no request either). `hasDraft` is the composer
56
+ * holding anything: the person typing puts this turn's chips away for good.
57
+ * `onPick` gets a chip's text to put in the composer.
58
+ */
59
+ export declare const FollowUpSuggestions: FC<{
60
+ enabled: boolean;
61
+ threadId: string;
62
+ hasDraft: boolean;
63
+ onPick: (text: string) => void;
64
+ }>;
@@ -0,0 +1,185 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useAuiState } from "@assistant-ui/react";
3
+ import { useQuery } from "@tanstack/react-query";
4
+ import { useState, useEffect, useMemo } from "react";
5
+ import { getAthenaApiBaseUrl } from "../collab/mint.js";
6
+ import { AthenaSdkError } from "../diagnostics/errors.js";
7
+ import { useAthenaQueryIdentity, useAthenaQueryClient } from "../lib/use-athena-rest-query.js";
8
+ import { useAthenaConfig } from "../provider/AthenaContext.js";
9
+ import { sendWithCredentialRenewal } from "../runtime/credential-renewal.js";
10
+ import { useDeepAgentConnection, readRunLive } from "../agent-runtime/src/thread-status.js";
11
+ import { readRuntimeMessageFromSourceMessages } from "../agent-runtime/src/runtime-messages.js";
12
+ const FOLLOW_UP_SUGGESTIONS_PATH = "/api/chat/follow-up-suggestions";
13
+ const MAX_FOLLOW_UP_SUGGESTIONS = 3;
14
+ const FOLLOW_UP_SUGGESTION_MAX_CHARS = 120;
15
+ const FOLLOW_UP_USER_MESSAGE_MAX_CHARS = 4e3;
16
+ function textOf(message) {
17
+ return message.content.map((part) => part.type === "text" ? part.text : "").filter((text) => text.trim().length > 0).join("\n\n").trim();
18
+ }
19
+ function readFinishedTurn(messages) {
20
+ const last = messages.at(-1);
21
+ if (!last || last.role !== "assistant") return null;
22
+ if (last.status.type !== "complete") return null;
23
+ if (readRuntimeMessageFromSourceMessages(last)) return null;
24
+ const reply = textOf(last);
25
+ if (!reply) return null;
26
+ const lastUser = messages.findLast((message) => message.role === "user");
27
+ return {
28
+ id: last.id,
29
+ lastUserMessage: (lastUser ? textOf(lastUser) : "").slice(0, FOLLOW_UP_USER_MESSAGE_MAX_CHARS),
30
+ lastAssistantMessage: reply.slice(-8e3)
31
+ };
32
+ }
33
+ function readFollowUpSuggestions(body) {
34
+ const suggestions = typeof body === "object" && body !== null ? Reflect.get(body, "suggestions") : void 0;
35
+ if (!Array.isArray(suggestions)) return [];
36
+ const seen = /* @__PURE__ */ new Set();
37
+ const out = [];
38
+ for (const item of suggestions) {
39
+ if (typeof item !== "string") continue;
40
+ const text = item.trim();
41
+ if (!text || text.length > FOLLOW_UP_SUGGESTION_MAX_CHARS || seen.has(text)) continue;
42
+ seen.add(text);
43
+ out.push(text);
44
+ if (out.length === MAX_FOLLOW_UP_SUGGESTIONS) break;
45
+ }
46
+ return out;
47
+ }
48
+ async function fetchFollowUpSuggestions({
49
+ backendUrl,
50
+ auth,
51
+ threadId,
52
+ turn,
53
+ signal
54
+ }) {
55
+ const url = `${getAthenaApiBaseUrl(backendUrl)}${FOLLOW_UP_SUGGESTIONS_PATH}`;
56
+ const body = {
57
+ thread_id: threadId,
58
+ last_user_message: turn.lastUserMessage,
59
+ last_assistant_message: turn.lastAssistantMessage
60
+ };
61
+ const res = await sendWithCredentialRenewal(
62
+ auth,
63
+ (headers) => fetch(url, {
64
+ method: "POST",
65
+ headers: { "Content-Type": "application/json", ...headers },
66
+ body: JSON.stringify(body),
67
+ signal: signal ?? null
68
+ })
69
+ );
70
+ if (!res.ok) {
71
+ throw new AthenaSdkError({
72
+ code: res.status === 401 || res.status === 403 ? "auth_rejected" : "follow_up_suggestions_failed",
73
+ message: `Follow-up suggestions failed: ${res.status}`,
74
+ status: res.status
75
+ });
76
+ }
77
+ return readFollowUpSuggestions(await res.json());
78
+ }
79
+ function useFinishedTurn({ enabled }) {
80
+ const connection = useDeepAgentConnection();
81
+ const live = useAuiState((state) => {
82
+ const thread = state.optional.thread;
83
+ return enabled && thread ? readRunLive(thread, connection) : false;
84
+ });
85
+ const messages = useAuiState((state) => {
86
+ var _a;
87
+ const thread = state.optional.thread;
88
+ if (!enabled || !thread || readRunLive(thread, connection)) return null;
89
+ const status = (_a = thread.extras) == null ? void 0 : _a.status;
90
+ if (status === void 0 ? thread.isRunning : status !== "ready") return null;
91
+ return thread.messages;
92
+ });
93
+ const resting = useMemo(() => messages ? readFinishedTurn(messages) : null, [messages]);
94
+ const [armed, setArmed] = useState(false);
95
+ const [finishedId, setFinishedId] = useState(null);
96
+ useEffect(() => {
97
+ if (!live) return;
98
+ setArmed(true);
99
+ setFinishedId(null);
100
+ }, [live]);
101
+ const restingId = (resting == null ? void 0 : resting.id) ?? null;
102
+ useEffect(() => {
103
+ if (!armed || restingId === null) return;
104
+ setFinishedId(restingId);
105
+ setArmed(false);
106
+ }, [armed, restingId]);
107
+ return resting !== null && resting.id === finishedId ? resting : null;
108
+ }
109
+ const FollowUpSuggestions = ({ enabled, threadId, hasDraft, onPick }) => {
110
+ const config = useAthenaConfig();
111
+ const { backendUrl, apiKey, getToken } = config;
112
+ const identity = useAthenaQueryIdentity({ apiKey, token: config.token, getToken });
113
+ const queryClient = useAthenaQueryClient();
114
+ const turn = useFinishedTurn({ enabled });
115
+ const [dismissed, setDismissed] = useState(null);
116
+ const turnId = (turn == null ? void 0 : turn.id) ?? null;
117
+ useEffect(() => {
118
+ if (hasDraft && turnId !== null) setDismissed(turnId);
119
+ }, [hasDraft, turnId]);
120
+ const open = turn !== null && turn.id !== dismissed && !hasDraft;
121
+ const { data } = useQuery(
122
+ {
123
+ queryKey: [
124
+ "athena-sdk",
125
+ "follow-up-suggestions",
126
+ backendUrl,
127
+ ...identity,
128
+ threadId,
129
+ turnId ?? ""
130
+ ],
131
+ // `config.token` is read at fetch time: the provider serves the latest
132
+ // token through a getter, so a rotation reaches the request.
133
+ queryFn: ({ signal }) => turn ? fetchFollowUpSuggestions({
134
+ backendUrl,
135
+ auth: { apiKey, token: config.token, getToken },
136
+ threadId,
137
+ turn,
138
+ signal
139
+ }) : [],
140
+ enabled: open && backendUrl.length > 0,
141
+ // One request per finished turn: never read again while the chat stays on it.
142
+ staleTime: Number.POSITIVE_INFINITY,
143
+ retry: false,
144
+ refetchOnWindowFocus: false,
145
+ refetchOnReconnect: false
146
+ },
147
+ queryClient
148
+ );
149
+ if (!open || !data || data.length === 0) return null;
150
+ return (
151
+ // A fieldset: one group named for assistive tech (its implicit role), no form semantics.
152
+ /* @__PURE__ */ jsx(
153
+ "fieldset",
154
+ {
155
+ "aria-label": "Suggested follow-ups",
156
+ "data-testid": "athena-follow-up-suggestions",
157
+ className: "aui-composer-follow-ups m-0 flex min-w-0 flex-wrap gap-1.5 border-0 px-1 pt-0 pb-2",
158
+ children: data.map((suggestion) => /* @__PURE__ */ jsx(
159
+ "button",
160
+ {
161
+ type: "button",
162
+ title: suggestion,
163
+ "data-follow-up-suggestion": "",
164
+ onClick: () => {
165
+ setDismissed(turnId);
166
+ onPick(suggestion);
167
+ },
168
+ className: "max-w-full truncate rounded-full border border-border/60 bg-card px-3 py-1 text-left text-muted-foreground text-xs shadow-sm transition-colors hover:border-border hover:bg-muted/40 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40",
169
+ children: suggestion
170
+ },
171
+ suggestion
172
+ ))
173
+ }
174
+ )
175
+ );
176
+ };
177
+ export {
178
+ FOLLOW_UP_SUGGESTIONS_PATH,
179
+ FollowUpSuggestions,
180
+ MAX_FOLLOW_UP_SUGGESTIONS,
181
+ fetchFollowUpSuggestions,
182
+ readFinishedTurn,
183
+ readFollowUpSuggestions
184
+ };
185
+ //# sourceMappingURL=follow-up-suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-up-suggestions.js","sources":["../../src/chat/follow-up-suggestions.tsx"],"sourcesContent":["/**\n * Suggested follow-up prompts (`AthenaChat`'s `followUpSuggestions`, off by\n * default): once a run this chat watched finishes with a reply, the chat asks\n * agora for up to three prompts the person might type next\n * (`POST /api/chat/follow-up-suggestions`, with the chat's own credential) and\n * shows them as chips above the composer. A chip puts its text in the composer\n * and sends nothing. They go away once the person types or sends, or a new run\n * starts; a turn that was stopped, failed or is waiting on the person gets\n * none, and a failed request shows nothing at all.\n */\nimport { type ThreadMessage, useAuiState } from '@assistant-ui/react';\nimport type { StatewireThread } from '@assistant-ui/react-statewire';\nimport {\n readRunLive,\n readRuntimeMessageFromSourceMessages,\n useDeepAgentConnection,\n} from '@athenaintel/agent-runtime';\nimport { useQuery } from '@tanstack/react-query';\nimport { useEffect, useMemo, useState, type FC } from 'react';\nimport { getAthenaApiBaseUrl } from '../collab/mint';\nimport { AthenaSdkError } from '../diagnostics/errors';\nimport { useAthenaQueryClient, useAthenaQueryIdentity } from '../lib/use-athena-rest-query';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport { sendWithCredentialRenewal } from '../runtime/credential-renewal';\nimport type { StatewireAuthSource } from '../runtime/statewire-auth-headers';\n\nexport const FOLLOW_UP_SUGGESTIONS_PATH = '/api/chat/follow-up-suggestions';\n/** The most chips shown, and the longest one agora answers. */\nexport const MAX_FOLLOW_UP_SUGGESTIONS = 3;\nconst FOLLOW_UP_SUGGESTION_MAX_CHARS = 120;\n/** What the route takes of each message: the start of the person's, the end of the reply. */\nconst FOLLOW_UP_USER_MESSAGE_MAX_CHARS = 4000;\nconst FOLLOW_UP_ASSISTANT_MESSAGE_MAX_CHARS = 8000;\n\n/** The turn a run just finished, as the request carries it. */\nexport interface FinishedTurn {\n /** The reply's message id: one request per finished turn. */\n id: string;\n lastUserMessage: string;\n lastAssistantMessage: string;\n}\n\n/** The route's JSON body. */\nexport interface FollowUpSuggestionsRequestBody {\n thread_id: string;\n last_user_message: string;\n last_assistant_message: string;\n}\n\n/** The message's words: its text parts, in order (no reasoning, tools or files). */\nfunction textOf(message: ThreadMessage): string {\n return message.content\n .map((part) => (part.type === 'text' ? part.text : ''))\n .filter((text) => text.trim().length > 0)\n .join('\\n\\n')\n .trim();\n}\n\n/**\n * The turn that ended the transcript, or `null` when it has nothing to follow\n * up on: the last message is not the assistant's, it carries no words, it did\n * not complete, or it is how the runtime ended the run (stopped, failed, a\n * server-update pause, a handoff, a send now).\n */\nexport function readFinishedTurn(messages: readonly ThreadMessage[]): FinishedTurn | null {\n const last = messages.at(-1);\n if (!last || last.role !== 'assistant') return null;\n if (last.status.type !== 'complete') return null;\n if (readRuntimeMessageFromSourceMessages(last)) return null;\n const reply = textOf(last);\n if (!reply) return null;\n const lastUser = messages.findLast((message) => message.role === 'user');\n return {\n id: last.id,\n lastUserMessage: (lastUser ? textOf(lastUser) : '').slice(0, FOLLOW_UP_USER_MESSAGE_MAX_CHARS),\n lastAssistantMessage: reply.slice(-FOLLOW_UP_ASSISTANT_MESSAGE_MAX_CHARS),\n };\n}\n\n/** The answer's suggestions as chips take them: strings, trimmed, at most three. */\nexport function readFollowUpSuggestions(body: unknown): string[] {\n const suggestions: unknown =\n typeof body === 'object' && body !== null ? Reflect.get(body, 'suggestions') : undefined;\n if (!Array.isArray(suggestions)) return [];\n const seen = new Set<string>();\n const out: string[] = [];\n for (const item of suggestions) {\n if (typeof item !== 'string') continue;\n const text = item.trim();\n if (!text || text.length > FOLLOW_UP_SUGGESTION_MAX_CHARS || seen.has(text)) continue;\n seen.add(text);\n out.push(text);\n if (out.length === MAX_FOLLOW_UP_SUGGESTIONS) break;\n }\n return out;\n}\n\n/**\n * One request for a finished turn. The credential rides `Authorization:\n * Bearer` (resolved live through `getToken`) or `X-API-KEY`, and a refused\n * bearer is renewed once (`sendWithCredentialRenewal`), as the SDK's other\n * REST reads do. Rejects with an `AthenaSdkError` on any refusal; the chat\n * shows nothing then.\n */\nexport async function fetchFollowUpSuggestions({\n backendUrl,\n auth,\n threadId,\n turn,\n signal,\n}: {\n backendUrl: string;\n auth: StatewireAuthSource;\n threadId: string;\n turn: FinishedTurn;\n signal?: AbortSignal;\n}): Promise<string[]> {\n const url = `${getAthenaApiBaseUrl(backendUrl)}${FOLLOW_UP_SUGGESTIONS_PATH}`;\n const body: FollowUpSuggestionsRequestBody = {\n thread_id: threadId,\n last_user_message: turn.lastUserMessage,\n last_assistant_message: turn.lastAssistantMessage,\n };\n const res = await sendWithCredentialRenewal(auth, (headers) =>\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(body),\n signal: signal ?? null,\n }),\n );\n if (!res.ok) {\n throw new AthenaSdkError({\n code: res.status === 401 || res.status === 403 ? 'auth_rejected' : 'follow_up_suggestions_failed',\n message: `Follow-up suggestions failed: ${res.status}`,\n status: res.status,\n });\n }\n return readFollowUpSuggestions(await res.json());\n}\n\n/**\n * The turn the last run this chat watched finished with, while `enabled`:\n * the transcript's last turn when the thread came to rest after a live run,\n * and only that one. A run that was over before the chat showed it (a\n * conversation opened at rest) asks for nothing, and neither does another\n * branch the person moves to afterwards: suggestions follow the turn the\n * person saw finish. `null` while a run is live, and after one that ended\n * any way but resting (stopped, failed, waiting on the person).\n */\nfunction useFinishedTurn({ enabled }: { enabled: boolean }): FinishedTurn | null {\n const connection = useDeepAgentConnection();\n const live = useAuiState((state) => {\n const thread = state.optional.thread;\n return enabled && thread ? readRunLive(thread, connection) : false;\n });\n const messages = useAuiState((state) => {\n const thread = state.optional.thread;\n if (!enabled || !thread || readRunLive(thread, connection)) return null;\n const status = (thread.extras as Partial<StatewireThread.Extras> | undefined)?.status;\n if (status === undefined ? thread.isRunning : status !== 'ready') return null;\n return thread.messages;\n });\n const resting = useMemo(() => (messages ? readFinishedTurn(messages) : null), [messages]);\n // A live run arms the latch; the first turn the thread rests on after it is the one followed up.\n const [armed, setArmed] = useState(false);\n const [finishedId, setFinishedId] = useState<string | null>(null);\n useEffect(() => {\n if (!live) return;\n setArmed(true);\n setFinishedId(null);\n }, [live]);\n const restingId = resting?.id ?? null;\n useEffect(() => {\n if (!armed || restingId === null) return;\n setFinishedId(restingId);\n setArmed(false);\n }, [armed, restingId]);\n return resting !== null && resting.id === finishedId ? resting : null;\n}\n\n/**\n * Up to three chips above the composer after a finished turn; nothing at all\n * while `enabled` is false (no request either). `hasDraft` is the composer\n * holding anything: the person typing puts this turn's chips away for good.\n * `onPick` gets a chip's text to put in the composer.\n */\nexport const FollowUpSuggestions: FC<{\n enabled: boolean;\n threadId: string;\n hasDraft: boolean;\n onPick: (text: string) => void;\n}> = ({ enabled, threadId, hasDraft, onPick }) => {\n const config = useAthenaConfig();\n const { backendUrl, apiKey, getToken } = config;\n const identity = useAthenaQueryIdentity({ apiKey, token: config.token, getToken });\n const queryClient = useAthenaQueryClient();\n const turn = useFinishedTurn({ enabled });\n // The turn whose chips the person put away (typed, sent, or picked one).\n const [dismissed, setDismissed] = useState<string | null>(null);\n const turnId = turn?.id ?? null;\n useEffect(() => {\n if (hasDraft && turnId !== null) setDismissed(turnId);\n }, [hasDraft, turnId]);\n const open = turn !== null && turn.id !== dismissed && !hasDraft;\n const { data } = useQuery(\n {\n queryKey: [\n 'athena-sdk',\n 'follow-up-suggestions',\n backendUrl,\n ...identity,\n threadId,\n turnId ?? '',\n ],\n // `config.token` is read at fetch time: the provider serves the latest\n // token through a getter, so a rotation reaches the request.\n queryFn: ({ signal }) =>\n turn\n ? fetchFollowUpSuggestions({\n backendUrl,\n auth: { apiKey, token: config.token, getToken },\n threadId,\n turn,\n signal,\n })\n : [],\n enabled: open && backendUrl.length > 0,\n // One request per finished turn: never read again while the chat stays on it.\n staleTime: Number.POSITIVE_INFINITY,\n retry: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n },\n queryClient,\n );\n if (!open || !data || data.length === 0) return null;\n return (\n // A fieldset: one group named for assistive tech (its implicit role), no form semantics.\n <fieldset\n aria-label=\"Suggested follow-ups\"\n data-testid=\"athena-follow-up-suggestions\"\n className=\"aui-composer-follow-ups m-0 flex min-w-0 flex-wrap gap-1.5 border-0 px-1 pt-0 pb-2\"\n >\n {data.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n title={suggestion}\n data-follow-up-suggestion=\"\"\n onClick={() => {\n setDismissed(turnId);\n onPick(suggestion);\n }}\n className=\"max-w-full truncate rounded-full border border-border/60 bg-card px-3 py-1 text-left text-muted-foreground text-xs shadow-sm transition-colors hover:border-border hover:bg-muted/40 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\"\n >\n {suggestion}\n </button>\n ))}\n </fieldset>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -82,7 +82,7 @@ function ToolTimeline({
82
82
  collapsible.CollapsibleTrigger,
83
83
  {
84
84
  "aria-controls": panelId,
85
- className: "group/trigger flex min-w-0 flex-1 items-center gap-1.5 rounded-md py-1 text-left text-[13px] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
85
+ className: "group/trigger flex min-w-[min(6rem,50%)] flex-1 items-center gap-1.5 rounded-md py-1 text-left text-[13px] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
86
86
  children: [
87
87
  /* @__PURE__ */ jsxRuntime.jsx(
88
88
  lucideReact.ChevronRight,
@@ -111,8 +111,9 @@ function ToolTimeline({
111
111
  "div",
112
112
  {
113
113
  "data-slot": "tool-timeline-meta",
114
- className: "flex shrink-0 items-center text-xs text-muted-foreground tabular-nums",
115
- children: meta
114
+ title: typeof meta === "string" ? meta : void 0,
115
+ className: "flex min-w-0 max-w-[50%] items-center overflow-hidden whitespace-nowrap text-xs text-muted-foreground tabular-nums [&>*]:min-w-0 [&>*]:truncate",
116
+ children: typeof meta === "string" || typeof meta === "number" ? /* @__PURE__ */ jsxRuntime.jsx("span", { children: meta }) : meta
116
117
  }
117
118
  ) : null,
118
119
  actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center gap-1", children: actions }) : null
@@ -1 +1 @@
1
- {"version":3,"file":"ToolTimeline.cjs","sources":["../../../src/chat/super-grouping/ToolTimeline.tsx"],"sourcesContent":["'use client';\n\n/*!\n * Adapted from assistant-ui's ToolTimeline element:\n * https://github.com/assistant-ui/assistant-ui/blob/main/packages/ui/src/components/react/assistant-ui/elements/tool-timeline.tsx\n * MIT License — Copyright (c) 2025 AgentbaseAI Inc.\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport { AlertCircle, Check, ChevronRight, Circle, LoaderCircle, Pause, X } from 'lucide-react';\nimport { type ReactElement, type ReactNode, useId, useState } from 'react';\nimport { sourceFaviconUrl } from '../../chat-ui/rich-text/citation-anchors';\nimport { cn } from '../../lib/utils';\nimport { StepText } from '../../tools/step-text';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../../ui/collapsible';\nimport type { ActivityPhase } from './activity-timeline';\nimport { type TimelineStep, visibleTimelineSteps } from './timeline-step';\n\nfunction StepIcon({ state }: { state: TimelineStep['state'] }) {\n const Icon =\n state === 'running'\n ? LoaderCircle\n : state === 'complete'\n ? Check\n : state === 'error'\n ? AlertCircle\n : state === 'rejected'\n ? X\n : state === 'paused'\n ? Pause\n : Circle;\n return (\n <Icon\n aria-hidden=\"true\"\n className={cn(\n 'size-3.5 shrink-0',\n state === 'running' && 'motion-safe:animate-spin',\n state === 'error'\n ? 'text-destructive'\n : state === 'waiting' || state === 'paused'\n ? 'text-amber-600 dark:text-amber-400'\n : 'text-muted-foreground',\n )}\n />\n );\n}\n\nfunction SourceFavicon({ url }: { url: string }) {\n const [failed, setFailed] = useState(false);\n const src = sourceFaviconUrl(url);\n if (!src || failed) return null;\n return (\n <img\n src={src}\n alt=\"\"\n width={14}\n height={14}\n className=\"size-3.5 shrink-0 rounded-[3px] ring-2 ring-background [&:not(:first-child)]:-ml-1\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n draggable={false}\n onError={() => setFailed(true)}\n />\n );\n}\n\n/** The sites a step's result came from, as overlapping favicons; one that fails to load is left out. */\nfunction StepSourceFavicons({ urls }: { urls: readonly string[] }) {\n return (\n <span data-slot=\"tool-timeline-sources\" className=\"flex shrink-0 items-center\">\n {urls.map((url) => (\n <SourceFavicon key={url} url={url} />\n ))}\n </span>\n );\n}\n\n/**\n * The upstream disclosure/verb/chip layout, with real per-call states and live\n * tool UIs. `meta` (a host's elapsed counter) sits on the header row itself,\n * right of the status and before `actions`, so a live card carries one status\n * line rather than a second row repeating what the header already says.\n *\n * A step can be drawn by the host instead (`renderStepRow`): its node fills\n * the step's `<li>`. While `keepMounted` holds, such a row stays mounted even\n * when \"Show N earlier steps\" folds it away (hidden), so what it renders keeps\n * running, and the fold button names it in `aria-controls`, so a deep link's\n * reveal can open the fold to it.\n */\nexport function ToolTimeline({\n steps,\n open,\n onOpenChange,\n label,\n labelTitle,\n phase,\n maxVisibleSteps,\n keepMounted,\n actions,\n meta,\n renderStepIcon,\n renderStepRow,\n showSourceFavicons = false,\n children,\n}: {\n steps: readonly TimelineStep[];\n open: boolean;\n onOpenChange: (open: boolean) => void;\n label: ReactNode;\n /** Tooltip for the header line (the full form of a clipped label). */\n labelTitle?: string;\n phase: ActivityPhase;\n maxVisibleSteps: number;\n keepMounted: boolean;\n actions?: ReactNode;\n meta?: ReactNode;\n /** The host's icon for a step's tool (its toolkit icon), after the status icon. */\n renderStepIcon?: (step: TimelineStep) => ReactNode;\n /** The host's own row for a step, in place of its status line; `null` keeps the status line. */\n renderStepRow?: (step: TimelineStep) => ReactElement | null;\n /** Show the favicons of the sites a finished step's result lists. */\n showSourceFavicons?: boolean;\n children?: ReactNode;\n}) {\n const panelId = useId();\n const [showAll, setShowAll] = useState(false);\n const recentSteps = visibleTimelineSteps({ steps, limit: maxVisibleSteps });\n const hiddenCount = steps.length - recentSteps.length;\n const recent = new Set(recentSteps);\n const hostRows = new Map<TimelineStep, ReactElement>();\n if (renderStepRow) {\n for (const step of steps) {\n const row = renderStepRow(step);\n if (row) hostRows.set(step, row);\n }\n }\n const hostRowId = (position: number) => `${panelId}-step-${position}`;\n // The host rows the fold hides while they are mounted: the ones it shows\n // again, or keeps mounted hidden.\n const foldedHostRowIds = steps.flatMap((step, position) =>\n hostRows.has(step) && !recent.has(step) && (showAll || keepMounted) ? [hostRowId(position)] : [],\n );\n return (\n <Collapsible data-slot=\"tool-timeline\" open={open} onOpenChange={onOpenChange} className=\"w-full min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <CollapsibleTrigger\n aria-controls={panelId}\n className=\"group/trigger flex min-w-0 flex-1 items-center gap-1.5 rounded-md py-1 text-left text-[13px] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 opacity-60 transition-transform duration-200 group-data-[state=open]/trigger:rotate-90 motion-reduce:transition-none\"\n />\n {phase === 'error' || phase === 'waiting' ? <StepIcon state={phase} /> : null}\n <span\n title={labelTitle}\n className={cn(\n 'min-w-0 break-words leading-5',\n phase === 'running' && 'motion-safe:animate-pulse',\n phase === 'error' && 'text-destructive',\n )}\n >\n {label}\n </span>\n </CollapsibleTrigger>\n {meta ? (\n <div\n data-slot=\"tool-timeline-meta\"\n className=\"flex shrink-0 items-center text-xs text-muted-foreground tabular-nums\"\n >\n {meta}\n </div>\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </div>\n <CollapsibleContent\n id={panelId}\n forceMount={keepMounted ? true : undefined}\n hidden={!open}\n className=\"min-w-0\"\n >\n <ol aria-label=\"Work status updates\" className=\"flex list-none flex-col gap-2.5 py-2.5 pl-5\">\n {hiddenCount > 0 ? (\n <li>\n <button\n type=\"button\"\n onClick={() => setShowAll((previous) => !previous)}\n {...(foldedHostRowIds.length > 0\n ? { 'aria-controls': foldedHostRowIds.join(' '), 'aria-expanded': showAll }\n : {})}\n className=\"rounded text-xs text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {showAll\n ? 'Show recent steps'\n : `Show ${hiddenCount} earlier ${hiddenCount === 1 ? 'step' : 'steps'}`}\n </button>\n </li>\n ) : null}\n {steps.map((step, position) => {\n const folded = !showAll && !recent.has(step);\n const hostRow = hostRows.get(step);\n if (hostRow) {\n if (folded && !keepMounted) return null;\n // No display utility: `hidden` alone hides a folded row.\n return (\n <li\n key={step.id}\n id={hostRowId(position)}\n data-step-id={step.id}\n data-step-state={step.state}\n hidden={folded}\n className=\"min-w-0\"\n >\n {hostRow}\n </li>\n );\n }\n if (folded) return null;\n return (\n <li\n key={step.id}\n data-step-id={step.id}\n data-step-state={step.state}\n className=\"flex min-w-0 items-center gap-2 text-[13px] text-muted-foreground\"\n >\n <StepIcon state={step.state} />\n {renderStepIcon?.(step)}\n <span\n title={step.detail}\n className={cn(\n 'min-w-0 break-words leading-5',\n step.state === 'error' && 'text-destructive',\n step.state === 'running' && 'text-foreground',\n )}\n >\n <StepText text={step.verb} code={step.code} />\n </span>\n {showSourceFavicons && step.sourceUrls ? <StepSourceFavicons urls={step.sourceUrls} /> : null}\n {step.chip ? (\n <span\n title={step.chip}\n className=\"max-w-[45%] truncate rounded-md bg-foreground/[0.06] px-1.5 py-0.5 font-mono text-[11px] text-foreground/70\"\n >\n {step.chip}\n </span>\n ) : null}\n <span className=\"sr-only\">{step.state}</span>\n </li>\n );\n })}\n </ol>\n {children}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"names":["LoaderCircle","Check","AlertCircle","X","Pause","Circle","jsx","cn","useState","sourceFaviconUrl","useId","visibleTimelineSteps","Collapsible","jsxs","CollapsibleTrigger","ChevronRight","CollapsibleContent","StepText"],"mappings":"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"}
1
+ {"version":3,"file":"ToolTimeline.cjs","sources":["../../../src/chat/super-grouping/ToolTimeline.tsx"],"sourcesContent":["'use client';\n\n/*!\n * Adapted from assistant-ui's ToolTimeline element:\n * https://github.com/assistant-ui/assistant-ui/blob/main/packages/ui/src/components/react/assistant-ui/elements/tool-timeline.tsx\n * MIT License — Copyright (c) 2025 AgentbaseAI Inc.\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport { AlertCircle, Check, ChevronRight, Circle, LoaderCircle, Pause, X } from 'lucide-react';\nimport { type ReactElement, type ReactNode, useId, useState } from 'react';\nimport { sourceFaviconUrl } from '../../chat-ui/rich-text/citation-anchors';\nimport { cn } from '../../lib/utils';\nimport { StepText } from '../../tools/step-text';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../../ui/collapsible';\nimport type { ActivityPhase } from './activity-timeline';\nimport { type TimelineStep, visibleTimelineSteps } from './timeline-step';\n\nfunction StepIcon({ state }: { state: TimelineStep['state'] }) {\n const Icon =\n state === 'running'\n ? LoaderCircle\n : state === 'complete'\n ? Check\n : state === 'error'\n ? AlertCircle\n : state === 'rejected'\n ? X\n : state === 'paused'\n ? Pause\n : Circle;\n return (\n <Icon\n aria-hidden=\"true\"\n className={cn(\n 'size-3.5 shrink-0',\n state === 'running' && 'motion-safe:animate-spin',\n state === 'error'\n ? 'text-destructive'\n : state === 'waiting' || state === 'paused'\n ? 'text-amber-600 dark:text-amber-400'\n : 'text-muted-foreground',\n )}\n />\n );\n}\n\nfunction SourceFavicon({ url }: { url: string }) {\n const [failed, setFailed] = useState(false);\n const src = sourceFaviconUrl(url);\n if (!src || failed) return null;\n return (\n <img\n src={src}\n alt=\"\"\n width={14}\n height={14}\n className=\"size-3.5 shrink-0 rounded-[3px] ring-2 ring-background [&:not(:first-child)]:-ml-1\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n draggable={false}\n onError={() => setFailed(true)}\n />\n );\n}\n\n/** The sites a step's result came from, as overlapping favicons; one that fails to load is left out. */\nfunction StepSourceFavicons({ urls }: { urls: readonly string[] }) {\n return (\n <span data-slot=\"tool-timeline-sources\" className=\"flex shrink-0 items-center\">\n {urls.map((url) => (\n <SourceFavicon key={url} url={url} />\n ))}\n </span>\n );\n}\n\n/**\n * The upstream disclosure/verb/chip layout, with real per-call states and live\n * tool UIs. `meta` (a host's elapsed counter, or a step's detail such as a\n * search query) sits on the header row itself, right of the status and before\n * `actions`, so a live card carries one status line rather than a second row\n * repeating what the header already says. In a narrow host it gives way first:\n * it takes at most half the row and ends in an ellipsis (a string `meta` keeps\n * its full text as the tooltip), while the label keeps at least 6rem (half the\n * row when that is narrower).\n *\n * A step can be drawn by the host instead (`renderStepRow`): its node fills\n * the step's `<li>`. While `keepMounted` holds, such a row stays mounted even\n * when \"Show N earlier steps\" folds it away (hidden), so what it renders keeps\n * running, and the fold button names it in `aria-controls`, so a deep link's\n * reveal can open the fold to it.\n */\nexport function ToolTimeline({\n steps,\n open,\n onOpenChange,\n label,\n labelTitle,\n phase,\n maxVisibleSteps,\n keepMounted,\n actions,\n meta,\n renderStepIcon,\n renderStepRow,\n showSourceFavicons = false,\n children,\n}: {\n steps: readonly TimelineStep[];\n open: boolean;\n onOpenChange: (open: boolean) => void;\n label: ReactNode;\n /** Tooltip for the header line (the full form of a clipped label). */\n labelTitle?: string;\n phase: ActivityPhase;\n maxVisibleSteps: number;\n keepMounted: boolean;\n actions?: ReactNode;\n meta?: ReactNode;\n /** The host's icon for a step's tool (its toolkit icon), after the status icon. */\n renderStepIcon?: (step: TimelineStep) => ReactNode;\n /** The host's own row for a step, in place of its status line; `null` keeps the status line. */\n renderStepRow?: (step: TimelineStep) => ReactElement | null;\n /** Show the favicons of the sites a finished step's result lists. */\n showSourceFavicons?: boolean;\n children?: ReactNode;\n}) {\n const panelId = useId();\n const [showAll, setShowAll] = useState(false);\n const recentSteps = visibleTimelineSteps({ steps, limit: maxVisibleSteps });\n const hiddenCount = steps.length - recentSteps.length;\n const recent = new Set(recentSteps);\n const hostRows = new Map<TimelineStep, ReactElement>();\n if (renderStepRow) {\n for (const step of steps) {\n const row = renderStepRow(step);\n if (row) hostRows.set(step, row);\n }\n }\n const hostRowId = (position: number) => `${panelId}-step-${position}`;\n // The host rows the fold hides while they are mounted: the ones it shows\n // again, or keeps mounted hidden.\n const foldedHostRowIds = steps.flatMap((step, position) =>\n hostRows.has(step) && !recent.has(step) && (showAll || keepMounted) ? [hostRowId(position)] : [],\n );\n return (\n <Collapsible data-slot=\"tool-timeline\" open={open} onOpenChange={onOpenChange} className=\"w-full min-w-0\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <CollapsibleTrigger\n aria-controls={panelId}\n className=\"group/trigger flex min-w-[min(6rem,50%)] flex-1 items-center gap-1.5 rounded-md py-1 text-left text-[13px] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 opacity-60 transition-transform duration-200 group-data-[state=open]/trigger:rotate-90 motion-reduce:transition-none\"\n />\n {phase === 'error' || phase === 'waiting' ? <StepIcon state={phase} /> : null}\n <span\n title={labelTitle}\n className={cn(\n 'min-w-0 break-words leading-5',\n phase === 'running' && 'motion-safe:animate-pulse',\n phase === 'error' && 'text-destructive',\n )}\n >\n {label}\n </span>\n </CollapsibleTrigger>\n {meta ? (\n <div\n data-slot=\"tool-timeline-meta\"\n title={typeof meta === 'string' ? meta : undefined}\n className=\"flex min-w-0 max-w-[50%] items-center overflow-hidden whitespace-nowrap text-xs text-muted-foreground tabular-nums [&>*]:min-w-0 [&>*]:truncate\"\n >\n {typeof meta === 'string' || typeof meta === 'number' ? <span>{meta}</span> : meta}\n </div>\n ) : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n </div>\n <CollapsibleContent\n id={panelId}\n forceMount={keepMounted ? true : undefined}\n hidden={!open}\n className=\"min-w-0\"\n >\n <ol aria-label=\"Work status updates\" className=\"flex list-none flex-col gap-2.5 py-2.5 pl-5\">\n {hiddenCount > 0 ? (\n <li>\n <button\n type=\"button\"\n onClick={() => setShowAll((previous) => !previous)}\n {...(foldedHostRowIds.length > 0\n ? { 'aria-controls': foldedHostRowIds.join(' '), 'aria-expanded': showAll }\n : {})}\n className=\"rounded text-xs text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {showAll\n ? 'Show recent steps'\n : `Show ${hiddenCount} earlier ${hiddenCount === 1 ? 'step' : 'steps'}`}\n </button>\n </li>\n ) : null}\n {steps.map((step, position) => {\n const folded = !showAll && !recent.has(step);\n const hostRow = hostRows.get(step);\n if (hostRow) {\n if (folded && !keepMounted) return null;\n // No display utility: `hidden` alone hides a folded row.\n return (\n <li\n key={step.id}\n id={hostRowId(position)}\n data-step-id={step.id}\n data-step-state={step.state}\n hidden={folded}\n className=\"min-w-0\"\n >\n {hostRow}\n </li>\n );\n }\n if (folded) return null;\n return (\n <li\n key={step.id}\n data-step-id={step.id}\n data-step-state={step.state}\n className=\"flex min-w-0 items-center gap-2 text-[13px] text-muted-foreground\"\n >\n <StepIcon state={step.state} />\n {renderStepIcon?.(step)}\n <span\n title={step.detail}\n className={cn(\n 'min-w-0 break-words leading-5',\n step.state === 'error' && 'text-destructive',\n step.state === 'running' && 'text-foreground',\n )}\n >\n <StepText text={step.verb} code={step.code} />\n </span>\n {showSourceFavicons && step.sourceUrls ? <StepSourceFavicons urls={step.sourceUrls} /> : null}\n {step.chip ? (\n <span\n title={step.chip}\n className=\"max-w-[45%] truncate rounded-md bg-foreground/[0.06] px-1.5 py-0.5 font-mono text-[11px] text-foreground/70\"\n >\n {step.chip}\n </span>\n ) : null}\n <span className=\"sr-only\">{step.state}</span>\n </li>\n );\n })}\n </ol>\n {children}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"names":["LoaderCircle","Check","AlertCircle","X","Pause","Circle","jsx","cn","useState","sourceFaviconUrl","useId","visibleTimelineSteps","Collapsible","jsxs","CollapsibleTrigger","ChevronRight","CollapsibleContent","StepText"],"mappings":"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"}
@@ -3,9 +3,13 @@ import type { ActivityPhase } from './activity-timeline';
3
3
  import { type TimelineStep } from './timeline-step';
4
4
  /**
5
5
  * The upstream disclosure/verb/chip layout, with real per-call states and live
6
- * tool UIs. `meta` (a host's elapsed counter) sits on the header row itself,
7
- * right of the status and before `actions`, so a live card carries one status
8
- * line rather than a second row repeating what the header already says.
6
+ * tool UIs. `meta` (a host's elapsed counter, or a step's detail such as a
7
+ * search query) sits on the header row itself, right of the status and before
8
+ * `actions`, so a live card carries one status line rather than a second row
9
+ * repeating what the header already says. In a narrow host it gives way first:
10
+ * it takes at most half the row and ends in an ellipsis (a string `meta` keeps
11
+ * its full text as the tooltip), while the label keeps at least 6rem (half the
12
+ * row when that is narrower).
9
13
  *
10
14
  * A step can be drawn by the host instead (`renderStepRow`): its node fills
11
15
  * the step's `<li>`. While `keepMounted` holds, such a row stays mounted even