@athenaintel/react 0.41.2 → 0.42.1

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 (451) hide show
  1. package/README.md +108 -9
  2. package/dist/agent-runtime/src/asset-attachment.d.ts +98 -0
  3. package/dist/agent-runtime/src/athena-asset-drag.d.ts +32 -0
  4. package/dist/agent-runtime/src/auth-denial.d.ts +29 -0
  5. package/dist/agent-runtime/src/chat-outbox-attachments.cjs +41 -0
  6. package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -0
  7. package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +38 -0
  8. package/dist/agent-runtime/src/chat-outbox-attachments.js +41 -0
  9. package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -0
  10. package/dist/agent-runtime/src/chat-outbox-signals.cjs +63 -0
  11. package/dist/agent-runtime/src/chat-outbox-signals.cjs.map +1 -0
  12. package/dist/agent-runtime/src/chat-outbox-signals.d.ts +12 -0
  13. package/dist/agent-runtime/src/chat-outbox-signals.js +63 -0
  14. package/dist/agent-runtime/src/chat-outbox-signals.js.map +1 -0
  15. package/dist/agent-runtime/src/chat-outbox-store.cjs +509 -0
  16. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-store.d.ts +203 -0
  18. package/dist/agent-runtime/src/chat-outbox-store.js +509 -0
  19. package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -0
  20. package/dist/agent-runtime/src/chat-outbox-thread.cjs +136 -0
  21. package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -0
  22. package/dist/agent-runtime/src/chat-outbox-thread.d.ts +118 -0
  23. package/dist/agent-runtime/src/chat-outbox-thread.js +136 -0
  24. package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -0
  25. package/dist/agent-runtime/src/chat-outbox.cjs +696 -0
  26. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -0
  27. package/dist/agent-runtime/src/chat-outbox.d.ts +285 -0
  28. package/dist/agent-runtime/src/chat-outbox.js +696 -0
  29. package/dist/agent-runtime/src/chat-outbox.js.map +1 -0
  30. package/dist/agent-runtime/src/chat-socket-reachability.d.ts +45 -0
  31. package/dist/agent-runtime/src/client-tool-bridge.d.ts +152 -0
  32. package/dist/agent-runtime/src/client-tools.d.ts +133 -0
  33. package/dist/agent-runtime/src/composer-markdown.cjs +10 -0
  34. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  35. package/dist/agent-runtime/src/composer-markdown.d.ts +108 -0
  36. package/dist/agent-runtime/src/composer-markdown.js +10 -0
  37. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  38. package/dist/agent-runtime/src/config-mutations.d.ts +51 -0
  39. package/dist/agent-runtime/src/conversation-index.d.ts +110 -0
  40. package/dist/agent-runtime/src/conversation-list.d.ts +343 -0
  41. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -2
  42. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  43. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +166 -0
  44. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -2
  45. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  46. package/dist/agent-runtime/src/desktop-handoff.d.ts +139 -0
  47. package/dist/agent-runtime/src/durable-thread-snapshot-cache.cjs +158 -0
  48. package/dist/agent-runtime/src/durable-thread-snapshot-cache.cjs.map +1 -0
  49. package/dist/agent-runtime/src/durable-thread-snapshot-cache.d.ts +60 -0
  50. package/dist/agent-runtime/src/durable-thread-snapshot-cache.js +158 -0
  51. package/dist/agent-runtime/src/durable-thread-snapshot-cache.js.map +1 -0
  52. package/dist/agent-runtime/src/edit-command.d.ts +156 -0
  53. package/dist/agent-runtime/src/errors.d.ts +174 -0
  54. package/dist/agent-runtime/src/execute-output.d.ts +31 -0
  55. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +16 -2
  56. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  57. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +202 -0
  58. package/dist/agent-runtime/src/generated/runconfig-contract.js +16 -2
  59. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  60. package/dist/agent-runtime/src/github-wake-event.d.ts +77 -0
  61. package/dist/agent-runtime/src/index.d.ts +74 -0
  62. package/dist/agent-runtime/src/interrupts.cjs +17 -0
  63. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  64. package/dist/agent-runtime/src/interrupts.d.ts +348 -0
  65. package/dist/agent-runtime/src/interrupts.js +17 -0
  66. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  67. package/dist/agent-runtime/src/lane-follow.d.ts +121 -0
  68. package/dist/agent-runtime/src/lane-history.cjs +209 -0
  69. package/dist/agent-runtime/src/lane-history.cjs.map +1 -0
  70. package/dist/agent-runtime/src/lane-history.d.ts +175 -0
  71. package/dist/agent-runtime/src/lane-history.js +209 -0
  72. package/dist/agent-runtime/src/lane-history.js.map +1 -0
  73. package/dist/agent-runtime/src/lane-images.d.ts +184 -0
  74. package/dist/agent-runtime/src/message-author.d.ts +43 -0
  75. package/dist/agent-runtime/src/message-text.cjs +15 -0
  76. package/dist/agent-runtime/src/message-text.cjs.map +1 -0
  77. package/dist/agent-runtime/src/message-text.d.ts +47 -0
  78. package/dist/agent-runtime/src/message-text.js +15 -0
  79. package/dist/agent-runtime/src/message-text.js.map +1 -0
  80. package/dist/agent-runtime/src/message-window.cjs +15 -1
  81. package/dist/agent-runtime/src/message-window.cjs.map +1 -1
  82. package/dist/agent-runtime/src/message-window.d.ts +159 -0
  83. package/dist/agent-runtime/src/message-window.js +16 -2
  84. package/dist/agent-runtime/src/message-window.js.map +1 -1
  85. package/dist/agent-runtime/src/messages.cjs +88 -4
  86. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  87. package/dist/agent-runtime/src/messages.d.ts +603 -0
  88. package/dist/agent-runtime/src/messages.js +88 -4
  89. package/dist/agent-runtime/src/messages.js.map +1 -1
  90. package/dist/agent-runtime/src/model-context.d.ts +22 -0
  91. package/dist/agent-runtime/src/offline-status.d.ts +157 -0
  92. package/dist/agent-runtime/src/optimistic-content.d.ts +21 -0
  93. package/dist/agent-runtime/src/protocol.cjs +12 -4
  94. package/dist/agent-runtime/src/protocol.cjs.map +1 -1
  95. package/dist/agent-runtime/src/protocol.d.ts +119 -0
  96. package/dist/agent-runtime/src/protocol.js +13 -5
  97. package/dist/agent-runtime/src/protocol.js.map +1 -1
  98. package/dist/agent-runtime/src/ptc-subcalls.d.ts +51 -0
  99. package/dist/agent-runtime/src/queue.d.ts +138 -0
  100. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +154 -0
  101. package/dist/agent-runtime/src/running-tool-placeholder.cjs +11 -0
  102. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -0
  103. package/dist/agent-runtime/src/running-tool-placeholder.d.ts +25 -0
  104. package/dist/agent-runtime/src/running-tool-placeholder.js +11 -0
  105. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -0
  106. package/dist/agent-runtime/src/runtime-messages.d.ts +104 -0
  107. package/dist/agent-runtime/src/screen-point.d.ts +151 -0
  108. package/dist/agent-runtime/src/sealed-idb.cjs +112 -0
  109. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -0
  110. package/dist/agent-runtime/src/sealed-idb.d.ts +106 -0
  111. package/dist/agent-runtime/src/sealed-idb.js +112 -0
  112. package/dist/agent-runtime/src/sealed-idb.js.map +1 -0
  113. package/dist/agent-runtime/src/send-recovery.d.ts +40 -0
  114. package/dist/agent-runtime/src/statewire-attach-observer.d.ts +194 -0
  115. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +74 -0
  116. package/dist/agent-runtime/src/statewire-state.d.ts +29 -0
  117. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  118. package/dist/agent-runtime/src/statewire-suspended.d.ts +27 -0
  119. package/dist/agent-runtime/src/statewire-suspended.js.map +1 -1
  120. package/dist/agent-runtime/src/statewire-transport.d.ts +40 -0
  121. package/dist/agent-runtime/src/streaming-markdown.d.ts +46 -0
  122. package/dist/agent-runtime/src/subagent-transcripts.cjs +209 -0
  123. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -0
  124. package/dist/agent-runtime/src/subagent-transcripts.d.ts +71 -0
  125. package/dist/agent-runtime/src/subagent-transcripts.js +209 -0
  126. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -0
  127. package/dist/agent-runtime/src/subagents.cjs +253 -0
  128. package/dist/agent-runtime/src/subagents.cjs.map +1 -0
  129. package/dist/agent-runtime/src/subagents.d.ts +311 -0
  130. package/dist/agent-runtime/src/subagents.js +253 -0
  131. package/dist/agent-runtime/src/subagents.js.map +1 -0
  132. package/dist/agent-runtime/src/subscription-wake-event.d.ts +111 -0
  133. package/dist/agent-runtime/src/thread-extras.d.ts +43 -0
  134. package/dist/agent-runtime/src/thread-handoff.d.ts +364 -0
  135. package/dist/agent-runtime/src/thread-prewarm-controller.d.ts +76 -0
  136. package/dist/agent-runtime/src/thread-prewarm.d.ts +118 -0
  137. package/dist/agent-runtime/src/thread-snapshot-cache.d.ts +99 -0
  138. package/dist/agent-runtime/src/thread-snapshot-mirror.cjs +329 -0
  139. package/dist/agent-runtime/src/thread-snapshot-mirror.cjs.map +1 -0
  140. package/dist/agent-runtime/src/thread-snapshot-mirror.d.ts +101 -0
  141. package/dist/agent-runtime/src/thread-snapshot-mirror.js +329 -0
  142. package/dist/agent-runtime/src/thread-snapshot-mirror.js.map +1 -0
  143. package/dist/agent-runtime/src/thread-status.d.ts +53 -0
  144. package/dist/agent-runtime/src/tool-metadata.d.ts +146 -0
  145. package/dist/agent-runtime/src/tool-names.cjs +67 -0
  146. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  147. package/dist/agent-runtime/src/tool-names.d.ts +60 -0
  148. package/dist/agent-runtime/src/tool-names.js +68 -1
  149. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  150. package/dist/agent-runtime/src/tool-outputs.d.ts +35 -0
  151. package/dist/agent-runtime/src/tool-result.cjs +1 -0
  152. package/dist/agent-runtime/src/tool-result.cjs.map +1 -1
  153. package/dist/agent-runtime/src/tool-result.d.ts +126 -0
  154. package/dist/agent-runtime/src/tool-result.js +1 -0
  155. package/dist/agent-runtime/src/tool-result.js.map +1 -1
  156. package/dist/agent-runtime/src/types.d.ts +159 -0
  157. package/dist/agent-runtime/src/use-conversation-list.d.ts +76 -0
  158. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +136 -0
  159. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -0
  160. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +64 -0
  161. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +136 -0
  162. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -0
  163. package/dist/agent-runtime/src/use-deep-agent-config.d.ts +169 -0
  164. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +13 -0
  165. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  166. package/dist/agent-runtime/src/use-deep-agent-edit-submit.d.ts +22 -0
  167. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js +13 -0
  168. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -1
  169. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +20 -2
  170. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  171. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +168 -0
  172. package/dist/agent-runtime/src/use-deep-agent-runtime.js +20 -2
  173. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  174. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +12 -4
  175. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  176. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +320 -0
  177. package/dist/agent-runtime/src/use-deep-agent-thread.js +12 -4
  178. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  179. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +999 -0
  180. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -0
  181. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +409 -0
  182. package/dist/agent-runtime/src/use-deep-agent-voice.js +999 -0
  183. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -0
  184. package/dist/agent-runtime/src/use-deep-agent-window-sync.d.ts +102 -0
  185. package/dist/agent-runtime/src/use-historical-edit-attachments.d.ts +2 -0
  186. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +84 -0
  187. package/dist/agent-runtime/src/voice-presentation.d.ts +80 -0
  188. package/dist/agent-runtime/src/voice-turn-grouping.d.ts +28 -0
  189. package/dist/agent-runtime/src/voice-wire-types.d.ts +15 -0
  190. package/dist/agent-runtime/src/withdrawn-turns.d.ts +97 -0
  191. package/dist/chat/AthenaChat.cjs +77 -6
  192. package/dist/chat/AthenaChat.cjs.map +1 -1
  193. package/dist/chat/AthenaChat.js +78 -7
  194. package/dist/chat/AthenaChat.js.map +1 -1
  195. package/dist/chat/StatewireApprovalCard.d.ts +1 -1
  196. package/dist/chat/StatewireClientToolBridge.d.ts +1 -1
  197. package/dist/chat/StatewireQueuedMessages.cjs +11 -4
  198. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  199. package/dist/chat/StatewireQueuedMessages.d.ts +1 -1
  200. package/dist/chat/StatewireQueuedMessages.js +11 -4
  201. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  202. package/dist/chat/chat-outbox-rows.cjs +223 -0
  203. package/dist/chat/chat-outbox-rows.cjs.map +1 -0
  204. package/dist/chat/chat-outbox-rows.d.ts +29 -0
  205. package/dist/chat/chat-outbox-rows.js +223 -0
  206. package/dist/chat/chat-outbox-rows.js.map +1 -0
  207. package/dist/chat/statewire-approval.d.ts +1 -1
  208. package/dist/chat/statewire-client-tools.d.ts +1 -1
  209. package/dist/chat/super-grouping/SuperGroupingCard.cjs +3 -1
  210. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  211. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +7 -1
  212. package/dist/chat/super-grouping/SuperGroupingCard.js +3 -1
  213. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  214. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +7 -2
  215. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  216. package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +2 -2
  217. package/dist/chat/super-grouping/SuperGroupingTranscript.js +7 -2
  218. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  219. package/dist/chat/super-grouping/activity-timeline.cjs +19 -11
  220. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  221. package/dist/chat/super-grouping/activity-timeline.d.ts +25 -9
  222. package/dist/chat/super-grouping/activity-timeline.js +19 -11
  223. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  224. package/dist/chat/use-statewire-approval-request.cjs +36 -0
  225. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  226. package/dist/chat/use-statewire-approval-request.d.ts +49 -1
  227. package/dist/chat/use-statewire-approval-request.js +39 -3
  228. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  229. package/dist/chat-ui/composer/tiptap-composer.cjs +102 -3
  230. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  231. package/dist/chat-ui/composer/tiptap-composer.d.ts +32 -1
  232. package/dist/chat-ui/composer/tiptap-composer.js +103 -4
  233. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  234. package/dist/chat-ui/header/conversation-history-panel.d.ts +1 -1
  235. package/dist/chat-ui/index.d.ts +1 -1
  236. package/dist/chat-ui/messages/message-components.cjs +15 -0
  237. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  238. package/dist/chat-ui/messages/message-components.js +15 -0
  239. package/dist/chat-ui/messages/message-components.js.map +1 -1
  240. package/dist/chat-ui/messages/runtime-message.d.ts +1 -1
  241. package/dist/chat-ui/messages/statewire-continue-run.d.ts +1 -1
  242. package/dist/chat-ui/messages/user-edit-composer.cjs +15 -2
  243. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  244. package/dist/chat-ui/messages/user-edit-composer.d.ts +4 -2
  245. package/dist/chat-ui/messages/user-edit-composer.js +15 -2
  246. package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
  247. package/dist/chat-ui/messages/wake-marker.d.ts +1 -1
  248. package/dist/chat-ui/rich-text/chat-text-schema.cjs +1 -0
  249. package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -1
  250. package/dist/chat-ui/rich-text/chat-text-schema.d.ts +3 -0
  251. package/dist/chat-ui/rich-text/chat-text-schema.js +1 -0
  252. package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -1
  253. package/dist/chat-ui/statewire.cjs +1 -0
  254. package/dist/chat-ui/statewire.cjs.map +1 -1
  255. package/dist/chat-ui/statewire.d.ts +2 -2
  256. package/dist/chat-ui/statewire.js +2 -1
  257. package/dist/chat-ui/thread/statewire-history-edge.d.ts +1 -1
  258. package/dist/composer/AttachmentContext.cjs +8 -4
  259. package/dist/composer/AttachmentContext.cjs.map +1 -1
  260. package/dist/composer/AttachmentContext.d.ts +7 -0
  261. package/dist/composer/AttachmentContext.js +8 -4
  262. package/dist/composer/AttachmentContext.js.map +1 -1
  263. package/dist/composer/build-composed-message.cjs +34 -0
  264. package/dist/composer/build-composed-message.cjs.map +1 -1
  265. package/dist/composer/build-composed-message.d.ts +20 -0
  266. package/dist/composer/build-composed-message.js +35 -1
  267. package/dist/composer/build-composed-message.js.map +1 -1
  268. package/dist/composer/composer-handoff.cjs +39 -2
  269. package/dist/composer/composer-handoff.cjs.map +1 -1
  270. package/dist/composer/composer-handoff.d.ts +28 -3
  271. package/dist/composer/composer-handoff.js +39 -2
  272. package/dist/composer/composer-handoff.js.map +1 -1
  273. package/dist/composer/useAttachFiles.cjs +15 -2
  274. package/dist/composer/useAttachFiles.cjs.map +1 -1
  275. package/dist/composer/useAttachFiles.d.ts +11 -0
  276. package/dist/composer/useAttachFiles.js +15 -2
  277. package/dist/composer/useAttachFiles.js.map +1 -1
  278. package/dist/composer/useSendMessage.cjs.map +1 -1
  279. package/dist/composer/useSendMessage.d.ts +4 -3
  280. package/dist/composer/useSendMessage.js.map +1 -1
  281. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  282. package/dist/diagnostics/athena-diagnostics.d.ts +3 -1
  283. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  284. package/dist/index.cjs +18 -0
  285. package/dist/index.cjs.map +1 -1
  286. package/dist/index.d.ts +15 -6
  287. package/dist/index.js +19 -1
  288. package/dist/index.js.map +1 -1
  289. package/dist/offline/chat-outbox.cjs +57 -0
  290. package/dist/offline/chat-outbox.cjs.map +1 -0
  291. package/dist/offline/chat-outbox.d.ts +80 -0
  292. package/dist/offline/chat-outbox.js +57 -0
  293. package/dist/offline/chat-outbox.js.map +1 -0
  294. package/dist/offline/offline-history.cjs +77 -0
  295. package/dist/offline/offline-history.cjs.map +1 -0
  296. package/dist/offline/offline-history.d.ts +60 -0
  297. package/dist/offline/offline-history.js +77 -0
  298. package/dist/offline/offline-history.js.map +1 -0
  299. package/dist/provider/AthenaProvider.cjs +206 -9
  300. package/dist/provider/AthenaProvider.cjs.map +1 -1
  301. package/dist/provider/AthenaProvider.d.ts +22 -1
  302. package/dist/provider/AthenaProvider.js +207 -10
  303. package/dist/provider/AthenaProvider.js.map +1 -1
  304. package/dist/provider/statewire-window-context.d.ts +1 -1
  305. package/dist/react/package.json.cjs +1 -1
  306. package/dist/react/package.json.js +1 -1
  307. package/dist/references/src/anchors/file-line-range.d.ts +58 -0
  308. package/dist/references/src/anchors/format.d.ts +21 -0
  309. package/dist/references/src/anchors/message-anchors.d.ts +71 -0
  310. package/dist/references/src/anchors/parse.d.ts +8 -0
  311. package/dist/references/src/anchors/registry-contract.d.ts +24 -0
  312. package/dist/references/src/anchors/registry.d.ts +19 -0
  313. package/dist/references/src/anchors/schemas.d.ts +194 -0
  314. package/dist/references/src/anchors/serialize.d.ts +8 -0
  315. package/dist/references/src/anchors/time.d.ts +78 -0
  316. package/dist/references/src/anchors/types.d.ts +474 -0
  317. package/dist/references/src/asset-bounds.d.ts +27 -0
  318. package/dist/references/src/asset-links.d.ts +23 -0
  319. package/dist/references/src/asset-reference.d.ts +16 -0
  320. package/dist/references/src/formats/format-catalog.d.ts +79 -0
  321. package/dist/references/src/formats/markdown/parse-reference-markdown.d.ts +28 -0
  322. package/dist/references/src/formats/markdown/reference-display-name.d.ts +6 -0
  323. package/dist/references/src/formats/object/asset-object.d.ts +9 -0
  324. package/dist/references/src/formats/object/callable-object.d.ts +6 -0
  325. package/dist/references/src/formats/object/decode-reference-object-payload.d.ts +3 -0
  326. package/dist/references/src/formats/object/external-url-object.d.ts +9 -0
  327. package/dist/references/src/formats/object/group-object.d.ts +9 -0
  328. package/dist/references/src/formats/object/navigation-object.d.ts +9 -0
  329. package/dist/references/src/formats/object/parse-reference-object.d.ts +11 -0
  330. package/dist/references/src/formats/object/person-object.d.ts +9 -0
  331. package/dist/references/src/formats/uri/asset-mention-uri.d.ts +9 -0
  332. package/dist/references/src/formats/uri/asset-spaces-url.d.ts +9 -0
  333. package/dist/references/src/formats/uri/callable-mention-uris.d.ts +9 -0
  334. package/dist/references/src/formats/uri/detect-uri-wire.d.ts +9 -0
  335. package/dist/references/src/formats/uri/group-mention-uri.d.ts +12 -0
  336. package/dist/references/src/formats/uri/navigation-spaces-url.d.ts +14 -0
  337. package/dist/references/src/formats/uri/parse-reference-uri.d.ts +20 -0
  338. package/dist/references/src/formats/uri/person-mention-uri.d.ts +9 -0
  339. package/dist/references/src/formats/uri/template-placeholder.d.ts +12 -0
  340. package/dist/references/src/index.d.ts +47 -0
  341. package/dist/references/src/legacy/index.d.ts +14 -0
  342. package/dist/references/src/legacy/pre-reference-asset-url.d.ts +57 -0
  343. package/dist/references/src/legacy/pre-reference-citation-bridge.d.ts +22 -0
  344. package/dist/references/src/legacy/pre-reference-citation.d.ts +138 -0
  345. package/dist/references/src/legacy/pre-reference-external-url.d.ts +31 -0
  346. package/dist/references/src/legacy/pre-reference-format.d.ts +8 -0
  347. package/dist/references/src/legacy/pre-reference-mention.d.ts +27 -0
  348. package/dist/references/src/legacy/pre-reference-object.d.ts +8 -0
  349. package/dist/references/src/legacy/pre-reference-uri.d.ts +12 -0
  350. package/dist/references/src/legacy.d.ts +2 -0
  351. package/dist/references/src/mention-href-patterns.d.ts +19 -0
  352. package/dist/references/src/mention-node/index.d.ts +5 -0
  353. package/dist/references/src/mention-node/mention-node.d.ts +31 -0
  354. package/dist/references/src/mention-node/resolve-node-attrs.d.ts +27 -0
  355. package/dist/references/src/parse-reference.d.ts +23 -0
  356. package/dist/references/src/schemas.d.ts +463 -0
  357. package/dist/references/src/serialize-reference.d.ts +50 -0
  358. package/dist/references/src/sheet-name.d.ts +10 -0
  359. package/dist/references/src/tool-option-schemas.d.ts +597 -0
  360. package/dist/references/src/types.d.ts +125 -0
  361. package/dist/references/src/version-ref.d.ts +30 -0
  362. package/dist/runtime/statewire-lifecycle.d.ts +1 -1
  363. package/dist/runtime/statewire-model-lane.d.ts +1 -1
  364. package/dist/runtime/statewire-server-lane-context.d.ts +1 -1
  365. package/dist/runtime/statewire-session-key.cjs +7 -0
  366. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  367. package/dist/runtime/statewire-session-key.d.ts +16 -0
  368. package/dist/runtime/statewire-session-key.js +8 -1
  369. package/dist/runtime/statewire-session-key.js.map +1 -1
  370. package/dist/runtime/statewire-session-lane.cjs +48 -0
  371. package/dist/runtime/statewire-session-lane.cjs.map +1 -0
  372. package/dist/runtime/statewire-session-lane.d.ts +29 -0
  373. package/dist/runtime/statewire-session-lane.js +48 -0
  374. package/dist/runtime/statewire-session-lane.js.map +1 -0
  375. package/dist/runtime/statewire-thread-config-lane.d.ts +1 -1
  376. package/dist/runtime/useAthenaStatewireRuntime.cjs +16 -5
  377. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  378. package/dist/runtime/useAthenaStatewireRuntime.d.ts +15 -1
  379. package/dist/runtime/useAthenaStatewireRuntime.js +17 -6
  380. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  381. package/dist/styles.css +1 -1
  382. package/dist/threads/api.d.ts +1 -1
  383. package/dist/threads/conversation-list-fetcher.d.ts +1 -1
  384. package/dist/threads/index-triggered-refresh.cjs +164 -0
  385. package/dist/threads/index-triggered-refresh.cjs.map +1 -0
  386. package/dist/threads/index-triggered-refresh.d.ts +70 -0
  387. package/dist/threads/index-triggered-refresh.js +164 -0
  388. package/dist/threads/index-triggered-refresh.js.map +1 -0
  389. package/dist/threads/offline-session-list.cjs +75 -0
  390. package/dist/threads/offline-session-list.cjs.map +1 -0
  391. package/dist/threads/offline-session-list.d.ts +27 -0
  392. package/dist/threads/offline-session-list.js +75 -0
  393. package/dist/threads/offline-session-list.js.map +1 -0
  394. package/dist/threads/pull-request-display.d.ts +1 -1
  395. package/dist/threads/session-list-model.d.ts +1 -1
  396. package/dist/threads/session-list-tab-share.cjs +150 -0
  397. package/dist/threads/session-list-tab-share.cjs.map +1 -0
  398. package/dist/threads/session-list-tab-share.d.ts +73 -0
  399. package/dist/threads/session-list-tab-share.js +150 -0
  400. package/dist/threads/session-list-tab-share.js.map +1 -0
  401. package/dist/threads/session-row-parts.d.ts +1 -1
  402. package/dist/threads/sessions-query.d.ts +1 -1
  403. package/dist/threads/statewire-thread-list.cjs +105 -20
  404. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  405. package/dist/threads/statewire-thread-list.d.ts +31 -3
  406. package/dist/threads/statewire-thread-list.js +107 -22
  407. package/dist/threads/statewire-thread-list.js.map +1 -1
  408. package/dist/threads/thread-prefetcher.d.ts +1 -1
  409. package/dist/threads/use-athena-session-attention.d.ts +1 -1
  410. package/dist/threads/use-athena-sessions.cjs +32 -22
  411. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  412. package/dist/threads/use-athena-sessions.js +33 -23
  413. package/dist/threads/use-athena-sessions.js.map +1 -1
  414. package/dist/threads/use-rest-conversation-history.d.ts +1 -1
  415. package/dist/threads/use-statewire-conversation-history.d.ts +5 -5
  416. package/dist/tiptap-markdown-table/src/markdown-table-serializer.d.ts +56 -0
  417. package/dist/tools/NestedPtcMessages.cjs +14 -9
  418. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  419. package/dist/tools/NestedPtcMessages.d.ts +9 -0
  420. package/dist/tools/NestedPtcMessages.js +6 -1
  421. package/dist/tools/NestedPtcMessages.js.map +1 -1
  422. package/dist/tools/index.d.ts +1 -1
  423. package/dist/tools/primitives.d.ts +1 -1
  424. package/dist/tools/subagent-task-tool-ui.cjs +494 -0
  425. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -0
  426. package/dist/tools/subagent-task-tool-ui.d.ts +109 -0
  427. package/dist/tools/subagent-task-tool-ui.js +494 -0
  428. package/dist/tools/subagent-task-tool-ui.js.map +1 -0
  429. package/dist/tools/tool-fallback.d.ts +1 -1
  430. package/dist/tools/tool-icons.d.ts +1 -1
  431. package/dist/tools/tool-summary.d.ts +1 -1
  432. package/dist/tools/tool-uis.cjs +4 -0
  433. package/dist/tools/tool-uis.cjs.map +1 -1
  434. package/dist/tools/tool-uis.js +4 -0
  435. package/dist/tools/tool-uis.js.map +1 -1
  436. package/dist/voice/chat.cjs +6 -0
  437. package/dist/voice/chat.cjs.map +1 -0
  438. package/dist/voice/chat.d.ts +2 -0
  439. package/dist/voice/chat.js +6 -0
  440. package/dist/voice/chat.js.map +1 -0
  441. package/dist/voice/livekit-join.cjs +119 -0
  442. package/dist/voice/livekit-join.cjs.map +1 -0
  443. package/dist/voice/livekit-join.d.ts +8 -0
  444. package/dist/voice/livekit-join.js +119 -0
  445. package/dist/voice/livekit-join.js.map +1 -0
  446. package/dist/voice/livekit.cjs +32 -0
  447. package/dist/voice/livekit.cjs.map +1 -0
  448. package/dist/voice/livekit.d.ts +80 -0
  449. package/dist/voice/livekit.js +32 -0
  450. package/dist/voice/livekit.js.map +1 -0
  451. package/package.json +20 -10
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const lucideReact = require("lucide-react");
5
+ const react = require("react");
6
+ const cnfast = require("cnfast");
7
+ function asQueueEntry(entry) {
8
+ return {
9
+ id: entry.id,
10
+ role: "user",
11
+ parts: [{ type: "text", text: entry.text }],
12
+ ...entry.metadata !== void 0 && { metadata: entry.metadata }
13
+ };
14
+ }
15
+ function useSecondsLeft(endsAt) {
16
+ const [now, setNow] = react.useState(() => Date.now());
17
+ react.useEffect(() => {
18
+ if (endsAt === null) return void 0;
19
+ setNow(Date.now());
20
+ const timer = setInterval(() => setNow(Date.now()), 250);
21
+ return () => clearInterval(timer);
22
+ }, [endsAt]);
23
+ if (endsAt === null) return null;
24
+ return Math.max(1, Math.ceil((endsAt - now) / 1e3));
25
+ }
26
+ const STATUS_COPY = {
27
+ waiting: "Not sent yet — sends when Athena is back",
28
+ ask: "Not sent for more than a day — send it now?",
29
+ sending: "Sending…"
30
+ };
31
+ const pillButton = "inline-flex items-center gap-1 rounded-full border px-2 py-1 font-medium text-[10px] transition-colors";
32
+ const RowActions = ({ outbox, row }) => {
33
+ const { entry, state } = row;
34
+ switch (state.kind) {
35
+ case "waiting":
36
+ case "countdown":
37
+ return /* @__PURE__ */ jsxRuntime.jsx(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ "aria-label": "Cancel sending and edit",
42
+ title: "Don't send this — put it back in the composer",
43
+ onClick: () => outbox.cancel(entry.id),
44
+ className: cnfast.cn(pillButton, "border-border text-foreground/80 hover:bg-background hover:text-foreground"),
45
+ children: "Cancel"
46
+ }
47
+ );
48
+ case "ask":
49
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
50
+ /* @__PURE__ */ jsxRuntime.jsxs(
51
+ "button",
52
+ {
53
+ type: "button",
54
+ "aria-label": "Send now",
55
+ onClick: () => outbox.send(entry.id),
56
+ className: cnfast.cn(pillButton, "border-primary/30 text-primary hover:bg-primary/5"),
57
+ children: [
58
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SendIcon, { className: "size-2.5" }),
59
+ "Send"
60
+ ]
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsxRuntime.jsx(
64
+ "button",
65
+ {
66
+ type: "button",
67
+ "aria-label": "Edit message",
68
+ title: "Put it back in the composer",
69
+ onClick: () => outbox.cancel(entry.id),
70
+ className: cnfast.cn(pillButton, "border-border text-foreground/80 hover:bg-background hover:text-foreground"),
71
+ children: "Edit"
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsxRuntime.jsx(
75
+ "button",
76
+ {
77
+ type: "button",
78
+ "aria-label": "Discard message",
79
+ onClick: () => outbox.discard(entry.id),
80
+ className: "rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive",
81
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2Icon, { className: "size-3" })
82
+ }
83
+ )
84
+ ] });
85
+ case "failed":
86
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
87
+ /* @__PURE__ */ jsxRuntime.jsxs(
88
+ "button",
89
+ {
90
+ type: "button",
91
+ "aria-label": "Retry sending",
92
+ onClick: () => outbox.send(entry.id),
93
+ className: cnfast.cn(pillButton, "border-primary/30 text-primary hover:bg-primary/5"),
94
+ children: [
95
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcwIcon, { className: "size-2.5" }),
96
+ "Retry"
97
+ ]
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsxRuntime.jsx(
101
+ "button",
102
+ {
103
+ type: "button",
104
+ "aria-label": "Edit message",
105
+ title: "Put it back in the composer",
106
+ onClick: () => outbox.cancel(entry.id),
107
+ className: cnfast.cn(pillButton, "border-border text-foreground/80 hover:bg-background hover:text-foreground"),
108
+ children: "Edit"
109
+ }
110
+ ),
111
+ /* @__PURE__ */ jsxRuntime.jsx(
112
+ "button",
113
+ {
114
+ type: "button",
115
+ "aria-label": "Discard message",
116
+ onClick: () => outbox.discard(entry.id),
117
+ className: "rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive",
118
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2Icon, { className: "size-3" })
119
+ }
120
+ )
121
+ ] });
122
+ case "sending":
123
+ return null;
124
+ }
125
+ };
126
+ const RowIcon = ({ row }) => {
127
+ switch (row.state.kind) {
128
+ case "sending":
129
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2Icon, { className: "mt-0.5 size-3.5 shrink-0 animate-spin text-muted-foreground/60" });
130
+ case "failed":
131
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircleIcon, { className: "mt-0.5 size-3.5 shrink-0 text-destructive" });
132
+ case "countdown":
133
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SendIcon, { className: "mt-0.5 size-3.5 shrink-0 text-primary" });
134
+ default:
135
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ClockIcon, { className: "mt-0.5 size-3.5 shrink-0 text-muted-foreground" });
136
+ }
137
+ };
138
+ function announcementOf(snapshot) {
139
+ const kinds = new Set(snapshot.rows.map((row) => row.state.kind));
140
+ if (kinds.has("countdown")) return "Athena is back. Your unsent messages will be sent in a few seconds unless you cancel.";
141
+ if (kinds.has("failed")) return "A message couldn't be sent. Retry, edit or discard it.";
142
+ if (kinds.has("ask")) return "A message waited more than a day. Send, edit or discard it.";
143
+ if (kinds.has("sending")) return "Sending your unsent messages.";
144
+ return "Not sent yet. Your messages will be sent when Athena is back.";
145
+ }
146
+ const ElsewhereRows = ({
147
+ outbox,
148
+ elsewhere
149
+ }) => {
150
+ const { openThread } = outbox;
151
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "athena-chat-outbox-elsewhere", className: "px-1 py-1", children: [
152
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[10px] text-muted-foreground", children: "Not sent yet in other chats" }),
153
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { "aria-label": "Unsent messages in other chats", className: "max-h-24 overflow-y-auto", children: elsewhere.map((thread) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-2 py-0.5", children: [
154
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquareIcon, { className: "size-3 shrink-0 text-muted-foreground" }),
155
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-foreground/80 text-xs", children: thread.first.text }),
156
+ thread.count > 1 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: [
157
+ thread.count,
158
+ " messages"
159
+ ] }) : null,
160
+ openThread ? /* @__PURE__ */ jsxRuntime.jsx(
161
+ "button",
162
+ {
163
+ type: "button",
164
+ "aria-label": "Open that chat",
165
+ onClick: () => openThread({ threadId: thread.threadId, newChat: thread.newChat }),
166
+ className: cnfast.cn(
167
+ pillButton,
168
+ "shrink-0 border-border text-foreground/80 hover:bg-background hover:text-foreground"
169
+ ),
170
+ children: "Open"
171
+ }
172
+ ) : null
173
+ ] }, thread.threadId)) })
174
+ ] });
175
+ };
176
+ const ChatOutboxRows = ({ outbox, snapshot, renderContent }) => {
177
+ const secondsLeft = useSecondsLeft(snapshot.countdownEndsAt);
178
+ if (snapshot.rows.length === 0 && snapshot.elsewhere.length === 0) return null;
179
+ const statusOf = (row) => {
180
+ switch (row.state.kind) {
181
+ case "countdown":
182
+ return `Athena is back — sending in ${secondsLeft ?? 1} s`;
183
+ case "failed":
184
+ return `Couldn't send. ${row.state.message}`;
185
+ default:
186
+ return STATUS_COPY[row.state.kind];
187
+ }
188
+ };
189
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "athena-chat-outbox", className: "mb-1", children: [
190
+ snapshot.rows.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
191
+ /* @__PURE__ */ jsxRuntime.jsx("p", { "aria-live": "polite", className: "sr-only", children: announcementOf(snapshot) }),
192
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { "aria-label": "Messages not sent yet", className: "max-h-40 overflow-y-auto", children: snapshot.rows.map((row, index) => /* @__PURE__ */ jsxRuntime.jsxs(
193
+ "li",
194
+ {
195
+ "data-state": row.state.kind,
196
+ className: "group flex items-start gap-2 rounded-md px-1 py-1.5 hover:bg-background",
197
+ children: [
198
+ /* @__PURE__ */ jsxRuntime.jsx(RowIcon, { row }),
199
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
200
+ renderContent({ text: row.entry.text, index, item: asQueueEntry(row.entry) }),
201
+ /* @__PURE__ */ jsxRuntime.jsx(
202
+ "p",
203
+ {
204
+ className: cnfast.cn(
205
+ "mt-0.5 text-[10px]",
206
+ row.state.kind === "failed" ? "text-destructive" : "text-muted-foreground"
207
+ ),
208
+ children: statusOf(row)
209
+ }
210
+ )
211
+ ] }),
212
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center gap-1", "data-testid": "chat-outbox-row-actions", children: /* @__PURE__ */ jsxRuntime.jsx(RowActions, { outbox, row }) })
213
+ ]
214
+ },
215
+ row.entry.id
216
+ )) })
217
+ ] }) : null,
218
+ snapshot.durable ? null : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-1 text-[10px] text-muted-foreground", children: "This device can't keep unsent messages — they're lost if you close this page." }),
219
+ snapshot.elsewhere.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(ElsewhereRows, { outbox, elsewhere: snapshot.elsewhere }) : null
220
+ ] });
221
+ };
222
+ exports.ChatOutboxRows = ChatOutboxRows;
223
+ //# sourceMappingURL=chat-outbox-rows.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-outbox-rows.cjs","sources":["../../src/chat/chat-outbox-rows.tsx"],"sourcesContent":["import type { StatewireThread } from '@assistant-ui/react-statewire';\nimport type {\n ChatOutbox,\n ChatOutboxElsewhere,\n ChatOutboxEntry,\n ChatOutboxRow,\n ChatOutboxSnapshot,\n} from '@athenaintel/agent-runtime';\nimport {\n AlertCircleIcon,\n ClockIcon,\n Loader2Icon,\n MessageSquareIcon,\n RotateCcwIcon,\n SendIcon,\n Trash2Icon,\n} from 'lucide-react';\nimport { type FC, type ReactNode, useEffect, useState } from 'react';\nimport { cn } from '../lib/utils';\n\n/**\n * The messages typed while Athena couldn't be reached, at the top of the queue tray\n * (`@athenaintel/agent-runtime`'s chat outbox): always shown, each marked as not sent, with what\n * happens next and what the person can do about it.\n *\n * - **Not sent yet — sends when Athena is back**, with Cancel (the text goes back to the composer).\n * - **Sending in N s** once Athena is back and the app is in front, with Cancel.\n * - **Waited more than a day**: Send, Edit (back to the composer) or Discard.\n * - **Sending…** while it is handed to the conversation (its attachments asked about first).\n * - **Couldn't send** (an attachment Athena refused, or the hand-off failed): Retry, Edit (back to\n * the composer, attachments and quote included) or Discard; never retried on its own.\n *\n * Below them, the person's other conversations with messages waiting (a chat that never started\n * has no other way back), each with Open where the host can switch conversations.\n */\n\nexport interface ChatOutboxRowsProps {\n outbox: ChatOutbox;\n snapshot: ChatOutboxSnapshot;\n /** The row body (the tray's own renderer, e.g. mention chips); defaults to the plain text. */\n renderContent: (context: { text: string; index: number; item: StatewireThread.RunsQueueEntry }) => ReactNode;\n}\n\n/** The waiting message in the shape the tray's row renderers read. */\nfunction asQueueEntry(entry: ChatOutboxEntry): StatewireThread.RunsQueueEntry {\n return {\n id: entry.id,\n role: 'user',\n parts: [{ type: 'text', text: entry.text }],\n ...(entry.metadata !== undefined && { metadata: entry.metadata }),\n };\n}\n\n/** Whole seconds left on the countdown, re-rendered while it runs (never shows 0 before it fires). */\nfunction useSecondsLeft(endsAt: number | null): number | null {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (endsAt === null) return undefined;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 250);\n return () => clearInterval(timer);\n }, [endsAt]);\n if (endsAt === null) return null;\n return Math.max(1, Math.ceil((endsAt - now) / 1000));\n}\n\nconst STATUS_COPY = {\n waiting: 'Not sent yet — sends when Athena is back',\n ask: 'Not sent for more than a day — send it now?',\n sending: 'Sending…',\n} as const;\n\nconst pillButton =\n 'inline-flex items-center gap-1 rounded-full border px-2 py-1 font-medium text-[10px] transition-colors';\n\nconst RowActions: FC<{ outbox: ChatOutbox; row: ChatOutboxRow }> = ({ outbox, row }) => {\n const { entry, state } = row;\n switch (state.kind) {\n case 'waiting':\n case 'countdown':\n return (\n <button\n type=\"button\"\n aria-label=\"Cancel sending and edit\"\n title=\"Don't send this — put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Cancel\n </button>\n );\n case 'ask':\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Send now\"\n onClick={() => outbox.send(entry.id)}\n className={cn(pillButton, 'border-primary/30 text-primary hover:bg-primary/5')}\n >\n <SendIcon className=\"size-2.5\" />\n Send\n </button>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n title=\"Put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Edit\n </button>\n <button\n type=\"button\"\n aria-label=\"Discard message\"\n onClick={() => outbox.discard(entry.id)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2Icon className=\"size-3\" />\n </button>\n </>\n );\n case 'failed':\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Retry sending\"\n onClick={() => outbox.send(entry.id)}\n className={cn(pillButton, 'border-primary/30 text-primary hover:bg-primary/5')}\n >\n <RotateCcwIcon className=\"size-2.5\" />\n Retry\n </button>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n title=\"Put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Edit\n </button>\n <button\n type=\"button\"\n aria-label=\"Discard message\"\n onClick={() => outbox.discard(entry.id)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2Icon className=\"size-3\" />\n </button>\n </>\n );\n case 'sending':\n return null;\n }\n};\n\nconst RowIcon: FC<{ row: ChatOutboxRow }> = ({ row }) => {\n switch (row.state.kind) {\n case 'sending':\n return <Loader2Icon className=\"mt-0.5 size-3.5 shrink-0 animate-spin text-muted-foreground/60\" />;\n case 'failed':\n return <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0 text-destructive\" />;\n case 'countdown':\n return <SendIcon className=\"mt-0.5 size-3.5 shrink-0 text-primary\" />;\n default:\n return <ClockIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" />;\n }\n};\n\n/** What a screen reader hears: the state of the outbox, never the ticking seconds. */\nfunction announcementOf(snapshot: ChatOutboxSnapshot): string {\n const kinds = new Set(snapshot.rows.map((row) => row.state.kind));\n if (kinds.has('countdown')) return 'Athena is back. Your unsent messages will be sent in a few seconds unless you cancel.';\n if (kinds.has('failed')) return \"A message couldn't be sent. Retry, edit or discard it.\";\n if (kinds.has('ask')) return 'A message waited more than a day. Send, edit or discard it.';\n if (kinds.has('sending')) return 'Sending your unsent messages.';\n return 'Not sent yet. Your messages will be sent when Athena is back.';\n}\n\n/**\n * Every other conversation with waiting messages, each with Open where the host can switch: a chat\n * that never started has no other way back, so none is left out (the list scrolls instead).\n */\nconst ElsewhereRows: FC<{ outbox: ChatOutbox; elsewhere: readonly ChatOutboxElsewhere[] }> = ({\n outbox,\n elsewhere,\n}) => {\n const { openThread } = outbox;\n return (\n <div data-testid=\"athena-chat-outbox-elsewhere\" className=\"px-1 py-1\">\n <p className=\"text-[10px] text-muted-foreground\">Not sent yet in other chats</p>\n <ul aria-label=\"Unsent messages in other chats\" className=\"max-h-24 overflow-y-auto\">\n {elsewhere.map((thread) => (\n <li key={thread.threadId} className=\"flex items-center gap-2 py-0.5\">\n <MessageSquareIcon className=\"size-3 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-foreground/80 text-xs\">{thread.first.text}</span>\n {thread.count > 1 ? (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{thread.count} messages</span>\n ) : null}\n {openThread ? (\n <button\n type=\"button\"\n aria-label=\"Open that chat\"\n onClick={() => openThread({ threadId: thread.threadId, newChat: thread.newChat })}\n className={cn(\n pillButton,\n 'shrink-0 border-border text-foreground/80 hover:bg-background hover:text-foreground',\n )}\n >\n Open\n </button>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport const ChatOutboxRows: FC<ChatOutboxRowsProps> = ({ outbox, snapshot, renderContent }) => {\n const secondsLeft = useSecondsLeft(snapshot.countdownEndsAt);\n if (snapshot.rows.length === 0 && snapshot.elsewhere.length === 0) return null;\n const statusOf = (row: ChatOutboxRow): string => {\n switch (row.state.kind) {\n case 'countdown':\n return `Athena is back — sending in ${secondsLeft ?? 1} s`;\n case 'failed':\n return `Couldn't send. ${row.state.message}`;\n default:\n return STATUS_COPY[row.state.kind];\n }\n };\n return (\n <div data-testid=\"athena-chat-outbox\" className=\"mb-1\">\n {snapshot.rows.length > 0 ? (\n <>\n <p aria-live=\"polite\" className=\"sr-only\">\n {announcementOf(snapshot)}\n </p>\n <ul aria-label=\"Messages not sent yet\" className=\"max-h-40 overflow-y-auto\">\n {snapshot.rows.map((row, index) => (\n <li\n key={row.entry.id}\n data-state={row.state.kind}\n className=\"group flex items-start gap-2 rounded-md px-1 py-1.5 hover:bg-background\"\n >\n <RowIcon row={row} />\n <div className=\"min-w-0 flex-1\">\n {renderContent({ text: row.entry.text, index, item: asQueueEntry(row.entry) })}\n <p\n className={cn(\n 'mt-0.5 text-[10px]',\n row.state.kind === 'failed' ? 'text-destructive' : 'text-muted-foreground',\n )}\n >\n {statusOf(row)}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\" data-testid=\"chat-outbox-row-actions\">\n <RowActions outbox={outbox} row={row} />\n </div>\n </li>\n ))}\n </ul>\n </>\n ) : null}\n {snapshot.durable ? null : (\n <p className=\"px-1 text-[10px] text-muted-foreground\">\n This device can't keep unsent messages — they're lost if you close this page.\n </p>\n )}\n {snapshot.elsewhere.length > 0 ? <ElsewhereRows outbox={outbox} elsewhere={snapshot.elsewhere} /> : null}\n </div>\n );\n};\n"],"names":["useState","useEffect","jsx","cn","jsxs","Fragment","SendIcon","Trash2Icon","RotateCcwIcon","Loader2Icon","AlertCircleIcon","ClockIcon","MessageSquareIcon"],"mappings":";;;;;;AA4CA,SAAS,aAAa,OAAwD;AAC5E,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM;AAAA,IACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,MAAM;AAAA,IAC1C,GAAI,MAAM,aAAa,UAAa,EAAE,UAAU,MAAM,SAAA;AAAA,EAAS;AAEnE;AAGA,SAAS,eAAe,QAAsC;AAC5D,QAAM,CAAC,KAAK,MAAM,IAAIA,MAAAA,SAAS,MAAM,KAAK,KAAK;AAC/CC,QAAAA,UAAU,MAAM;AACd,QAAI,WAAW,KAAM,QAAO;AAC5B,WAAO,KAAK,KAAK;AACjB,UAAM,QAAQ,YAAY,MAAM,OAAO,KAAK,IAAA,CAAK,GAAG,GAAG;AACvD,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,MAAM,CAAC;AACX,MAAI,WAAW,KAAM,QAAO;AAC5B,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,OAAO,GAAI,CAAC;AACrD;AAEA,MAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,KAAK;AAAA,EACL,SAAS;AACX;AAEA,MAAM,aACJ;AAEF,MAAM,aAA6D,CAAC,EAAE,QAAQ,UAAU;AACtF,QAAM,EAAE,OAAO,MAAA,IAAU;AACzB,UAAQ,MAAM,MAAA;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aACEC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,OAAM;AAAA,UACN,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE;AAAA,UACrC,WAAWC,OAAAA,GAAG,YAAY,4EAA4E;AAAA,UACvG,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAIL,KAAK;AACH,aACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,QAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,OAAO,KAAK,MAAM,EAAE;AAAA,YACnC,WAAWD,OAAAA,GAAG,YAAY,mDAAmD;AAAA,YAE7E,UAAA;AAAA,cAAAD,2BAAAA,IAACI,YAAAA,UAAA,EAAS,WAAU,WAAA,CAAW;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnCJ,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAM;AAAA,YACN,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE;AAAA,YACrC,WAAWC,OAAAA,GAAG,YAAY,4EAA4E;AAAA,YACvG,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,OAAO,QAAQ,MAAM,EAAE;AAAA,YACtC,WAAU;AAAA,YAEV,UAAAA,2BAAAA,IAACK,YAAAA,YAAA,EAAW,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACjC,GACF;AAAA,IAEJ,KAAK;AACH,aACEH,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,QAAAD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,OAAO,KAAK,MAAM,EAAE;AAAA,YACnC,WAAWD,OAAAA,GAAG,YAAY,mDAAmD;AAAA,YAE7E,UAAA;AAAA,cAAAD,2BAAAA,IAACM,YAAAA,eAAA,EAAc,WAAU,WAAA,CAAW;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGxCN,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAM;AAAA,YACN,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE;AAAA,YACrC,WAAWC,OAAAA,GAAG,YAAY,4EAA4E;AAAA,YACvG,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,OAAO,QAAQ,MAAM,EAAE;AAAA,YACtC,WAAU;AAAA,YAEV,UAAAA,2BAAAA,IAACK,YAAAA,YAAA,EAAW,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACjC,GACF;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,EAAA;AAEb;AAEA,MAAM,UAAsC,CAAC,EAAE,UAAU;AACvD,UAAQ,IAAI,MAAM,MAAA;AAAA,IAChB,KAAK;AACH,aAAOL,2BAAAA,IAACO,YAAAA,aAAA,EAAY,WAAU,iEAAA,CAAiE;AAAA,IACjG,KAAK;AACH,aAAOP,2BAAAA,IAACQ,YAAAA,iBAAA,EAAgB,WAAU,4CAAA,CAA4C;AAAA,IAChF,KAAK;AACH,aAAOR,2BAAAA,IAACI,YAAAA,UAAA,EAAS,WAAU,wCAAA,CAAwC;AAAA,IACrE;AACE,aAAOJ,2BAAAA,IAACS,YAAAA,WAAA,EAAU,WAAU,iDAAA,CAAiD;AAAA,EAAA;AAEnF;AAGA,SAAS,eAAe,UAAsC;AAC5D,QAAM,QAAQ,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,CAAC;AAChE,MAAI,MAAM,IAAI,WAAW,EAAG,QAAO;AACnC,MAAI,MAAM,IAAI,QAAQ,EAAG,QAAO;AAChC,MAAI,MAAM,IAAI,KAAK,EAAG,QAAO;AAC7B,MAAI,MAAM,IAAI,SAAS,EAAG,QAAO;AACjC,SAAO;AACT;AAMA,MAAM,gBAAuF,CAAC;AAAA,EAC5F;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,eAAe;AACvB,SACEP,2BAAAA,KAAC,OAAA,EAAI,eAAY,gCAA+B,WAAU,aACxD,UAAA;AAAA,IAAAF,2BAAAA,IAAC,KAAA,EAAE,WAAU,qCAAoC,UAAA,+BAA2B;AAAA,IAC5EA,2BAAAA,IAAC,MAAA,EAAG,cAAW,kCAAiC,WAAU,4BACvD,UAAA,UAAU,IAAI,CAAC,WACdE,gCAAC,MAAA,EAAyB,WAAU,kCAClC,UAAA;AAAA,MAAAF,2BAAAA,IAACU,YAAAA,mBAAA,EAAkB,WAAU,wCAAA,CAAwC;AAAA,qCACpE,QAAA,EAAK,WAAU,sDAAsD,UAAA,OAAO,MAAM,MAAK;AAAA,MACvF,OAAO,QAAQ,IACdR,2BAAAA,KAAC,QAAA,EAAK,WAAU,8CAA8C,UAAA;AAAA,QAAA,OAAO;AAAA,QAAM;AAAA,MAAA,EAAA,CAAS,IAClF;AAAA,MACH,aACCF,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,SAAS,MAAM,WAAW,EAAE,UAAU,OAAO,UAAU,SAAS,OAAO,SAAS;AAAA,UAChF,WAAWC,OAAAA;AAAAA,YACT;AAAA,YACA;AAAA,UAAA;AAAA,UAEH,UAAA;AAAA,QAAA;AAAA,MAAA,IAGC;AAAA,IAAA,KAlBG,OAAO,QAmBhB,CACD,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEO,MAAM,iBAA0C,CAAC,EAAE,QAAQ,UAAU,oBAAoB;AAC9F,QAAM,cAAc,eAAe,SAAS,eAAe;AAC3D,MAAI,SAAS,KAAK,WAAW,KAAK,SAAS,UAAU,WAAW,EAAG,QAAO;AAC1E,QAAM,WAAW,CAAC,QAA+B;AAC/C,YAAQ,IAAI,MAAM,MAAA;AAAA,MAChB,KAAK;AACH,eAAO,+BAA+B,eAAe,CAAC;AAAA,MACxD,KAAK;AACH,eAAO,kBAAkB,IAAI,MAAM,OAAO;AAAA,MAC5C;AACE,eAAO,YAAY,IAAI,MAAM,IAAI;AAAA,IAAA;AAAA,EAEvC;AACA,SACEC,2BAAAA,KAAC,OAAA,EAAI,eAAY,sBAAqB,WAAU,QAC7C,UAAA;AAAA,IAAA,SAAS,KAAK,SAAS,IACtBA,2BAAAA,KAAAC,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAH,2BAAAA,IAAC,OAAE,aAAU,UAAS,WAAU,WAC7B,UAAA,eAAe,QAAQ,GAC1B;AAAA,MACAA,2BAAAA,IAAC,MAAA,EAAG,cAAW,yBAAwB,WAAU,4BAC9C,UAAA,SAAS,KAAK,IAAI,CAAC,KAAK,UACvBE,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,cAAY,IAAI,MAAM;AAAA,UACtB,WAAU;AAAA,UAEV,UAAA;AAAA,YAAAF,+BAAC,WAAQ,KAAU;AAAA,YACnBE,2BAAAA,KAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,cAAA,cAAc,EAAE,MAAM,IAAI,MAAM,MAAM,OAAO,MAAM,aAAa,IAAI,KAAK,EAAA,CAAG;AAAA,cAC7EF,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAWC,OAAAA;AAAAA,oBACT;AAAA,oBACA,IAAI,MAAM,SAAS,WAAW,qBAAqB;AAAA,kBAAA;AAAA,kBAGpD,mBAAS,GAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YACf,GACF;AAAA,YACAD,2BAAAA,IAAC,OAAA,EAAI,WAAU,oCAAmC,eAAY,2BAC5D,UAAAA,2BAAAA,IAAC,YAAA,EAAW,QAAgB,IAAA,CAAU,EAAA,CACxC;AAAA,UAAA;AAAA,QAAA;AAAA,QAlBK,IAAI,MAAM;AAAA,MAAA,CAoBlB,EAAA,CACH;AAAA,IAAA,EAAA,CACF,IACE;AAAA,IACH,SAAS,UAAU,sCACjB,KAAA,EAAE,WAAU,0CAAyC,UAAA,iFAEtD;AAAA,IAED,SAAS,UAAU,SAAS,IAAIA,2BAAAA,IAAC,iBAAc,QAAgB,WAAW,SAAS,UAAA,CAAW,IAAK;AAAA,EAAA,GACtG;AAEJ;;"}
@@ -0,0 +1,29 @@
1
+ import type { StatewireThread } from '@assistant-ui/react-statewire';
2
+ import type { ChatOutbox, ChatOutboxSnapshot } from '../agent-runtime/src/index';
3
+ import { type FC, type ReactNode } from 'react';
4
+ /**
5
+ * The messages typed while Athena couldn't be reached, at the top of the queue tray
6
+ * (`@athenaintel/agent-runtime`'s chat outbox): always shown, each marked as not sent, with what
7
+ * happens next and what the person can do about it.
8
+ *
9
+ * - **Not sent yet — sends when Athena is back**, with Cancel (the text goes back to the composer).
10
+ * - **Sending in N s** once Athena is back and the app is in front, with Cancel.
11
+ * - **Waited more than a day**: Send, Edit (back to the composer) or Discard.
12
+ * - **Sending…** while it is handed to the conversation (its attachments asked about first).
13
+ * - **Couldn't send** (an attachment Athena refused, or the hand-off failed): Retry, Edit (back to
14
+ * the composer, attachments and quote included) or Discard; never retried on its own.
15
+ *
16
+ * Below them, the person's other conversations with messages waiting (a chat that never started
17
+ * has no other way back), each with Open where the host can switch conversations.
18
+ */
19
+ export interface ChatOutboxRowsProps {
20
+ outbox: ChatOutbox;
21
+ snapshot: ChatOutboxSnapshot;
22
+ /** The row body (the tray's own renderer, e.g. mention chips); defaults to the plain text. */
23
+ renderContent: (context: {
24
+ text: string;
25
+ index: number;
26
+ item: StatewireThread.RunsQueueEntry;
27
+ }) => ReactNode;
28
+ }
29
+ export declare const ChatOutboxRows: FC<ChatOutboxRowsProps>;
@@ -0,0 +1,223 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { ClockIcon, SendIcon, AlertCircleIcon, Loader2Icon, RotateCcwIcon, Trash2Icon, MessageSquareIcon } from "lucide-react";
3
+ import { useState, useEffect } from "react";
4
+ import { cn } from "cnfast";
5
+ function asQueueEntry(entry) {
6
+ return {
7
+ id: entry.id,
8
+ role: "user",
9
+ parts: [{ type: "text", text: entry.text }],
10
+ ...entry.metadata !== void 0 && { metadata: entry.metadata }
11
+ };
12
+ }
13
+ function useSecondsLeft(endsAt) {
14
+ const [now, setNow] = useState(() => Date.now());
15
+ useEffect(() => {
16
+ if (endsAt === null) return void 0;
17
+ setNow(Date.now());
18
+ const timer = setInterval(() => setNow(Date.now()), 250);
19
+ return () => clearInterval(timer);
20
+ }, [endsAt]);
21
+ if (endsAt === null) return null;
22
+ return Math.max(1, Math.ceil((endsAt - now) / 1e3));
23
+ }
24
+ const STATUS_COPY = {
25
+ waiting: "Not sent yet — sends when Athena is back",
26
+ ask: "Not sent for more than a day — send it now?",
27
+ sending: "Sending…"
28
+ };
29
+ const pillButton = "inline-flex items-center gap-1 rounded-full border px-2 py-1 font-medium text-[10px] transition-colors";
30
+ const RowActions = ({ outbox, row }) => {
31
+ const { entry, state } = row;
32
+ switch (state.kind) {
33
+ case "waiting":
34
+ case "countdown":
35
+ return /* @__PURE__ */ jsx(
36
+ "button",
37
+ {
38
+ type: "button",
39
+ "aria-label": "Cancel sending and edit",
40
+ title: "Don't send this — put it back in the composer",
41
+ onClick: () => outbox.cancel(entry.id),
42
+ className: cn(pillButton, "border-border text-foreground/80 hover:bg-background hover:text-foreground"),
43
+ children: "Cancel"
44
+ }
45
+ );
46
+ case "ask":
47
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
48
+ /* @__PURE__ */ jsxs(
49
+ "button",
50
+ {
51
+ type: "button",
52
+ "aria-label": "Send now",
53
+ onClick: () => outbox.send(entry.id),
54
+ className: cn(pillButton, "border-primary/30 text-primary hover:bg-primary/5"),
55
+ children: [
56
+ /* @__PURE__ */ jsx(SendIcon, { className: "size-2.5" }),
57
+ "Send"
58
+ ]
59
+ }
60
+ ),
61
+ /* @__PURE__ */ jsx(
62
+ "button",
63
+ {
64
+ type: "button",
65
+ "aria-label": "Edit message",
66
+ title: "Put it back in the composer",
67
+ onClick: () => outbox.cancel(entry.id),
68
+ className: cn(pillButton, "border-border text-foreground/80 hover:bg-background hover:text-foreground"),
69
+ children: "Edit"
70
+ }
71
+ ),
72
+ /* @__PURE__ */ jsx(
73
+ "button",
74
+ {
75
+ type: "button",
76
+ "aria-label": "Discard message",
77
+ onClick: () => outbox.discard(entry.id),
78
+ className: "rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive",
79
+ children: /* @__PURE__ */ jsx(Trash2Icon, { className: "size-3" })
80
+ }
81
+ )
82
+ ] });
83
+ case "failed":
84
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
85
+ /* @__PURE__ */ jsxs(
86
+ "button",
87
+ {
88
+ type: "button",
89
+ "aria-label": "Retry sending",
90
+ onClick: () => outbox.send(entry.id),
91
+ className: cn(pillButton, "border-primary/30 text-primary hover:bg-primary/5"),
92
+ children: [
93
+ /* @__PURE__ */ jsx(RotateCcwIcon, { className: "size-2.5" }),
94
+ "Retry"
95
+ ]
96
+ }
97
+ ),
98
+ /* @__PURE__ */ jsx(
99
+ "button",
100
+ {
101
+ type: "button",
102
+ "aria-label": "Edit message",
103
+ title: "Put it back in the composer",
104
+ onClick: () => outbox.cancel(entry.id),
105
+ className: cn(pillButton, "border-border text-foreground/80 hover:bg-background hover:text-foreground"),
106
+ children: "Edit"
107
+ }
108
+ ),
109
+ /* @__PURE__ */ jsx(
110
+ "button",
111
+ {
112
+ type: "button",
113
+ "aria-label": "Discard message",
114
+ onClick: () => outbox.discard(entry.id),
115
+ className: "rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive",
116
+ children: /* @__PURE__ */ jsx(Trash2Icon, { className: "size-3" })
117
+ }
118
+ )
119
+ ] });
120
+ case "sending":
121
+ return null;
122
+ }
123
+ };
124
+ const RowIcon = ({ row }) => {
125
+ switch (row.state.kind) {
126
+ case "sending":
127
+ return /* @__PURE__ */ jsx(Loader2Icon, { className: "mt-0.5 size-3.5 shrink-0 animate-spin text-muted-foreground/60" });
128
+ case "failed":
129
+ return /* @__PURE__ */ jsx(AlertCircleIcon, { className: "mt-0.5 size-3.5 shrink-0 text-destructive" });
130
+ case "countdown":
131
+ return /* @__PURE__ */ jsx(SendIcon, { className: "mt-0.5 size-3.5 shrink-0 text-primary" });
132
+ default:
133
+ return /* @__PURE__ */ jsx(ClockIcon, { className: "mt-0.5 size-3.5 shrink-0 text-muted-foreground" });
134
+ }
135
+ };
136
+ function announcementOf(snapshot) {
137
+ const kinds = new Set(snapshot.rows.map((row) => row.state.kind));
138
+ if (kinds.has("countdown")) return "Athena is back. Your unsent messages will be sent in a few seconds unless you cancel.";
139
+ if (kinds.has("failed")) return "A message couldn't be sent. Retry, edit or discard it.";
140
+ if (kinds.has("ask")) return "A message waited more than a day. Send, edit or discard it.";
141
+ if (kinds.has("sending")) return "Sending your unsent messages.";
142
+ return "Not sent yet. Your messages will be sent when Athena is back.";
143
+ }
144
+ const ElsewhereRows = ({
145
+ outbox,
146
+ elsewhere
147
+ }) => {
148
+ const { openThread } = outbox;
149
+ return /* @__PURE__ */ jsxs("div", { "data-testid": "athena-chat-outbox-elsewhere", className: "px-1 py-1", children: [
150
+ /* @__PURE__ */ jsx("p", { className: "text-[10px] text-muted-foreground", children: "Not sent yet in other chats" }),
151
+ /* @__PURE__ */ jsx("ul", { "aria-label": "Unsent messages in other chats", className: "max-h-24 overflow-y-auto", children: elsewhere.map((thread) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2 py-0.5", children: [
152
+ /* @__PURE__ */ jsx(MessageSquareIcon, { className: "size-3 shrink-0 text-muted-foreground" }),
153
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-foreground/80 text-xs", children: thread.first.text }),
154
+ thread.count > 1 ? /* @__PURE__ */ jsxs("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: [
155
+ thread.count,
156
+ " messages"
157
+ ] }) : null,
158
+ openThread ? /* @__PURE__ */ jsx(
159
+ "button",
160
+ {
161
+ type: "button",
162
+ "aria-label": "Open that chat",
163
+ onClick: () => openThread({ threadId: thread.threadId, newChat: thread.newChat }),
164
+ className: cn(
165
+ pillButton,
166
+ "shrink-0 border-border text-foreground/80 hover:bg-background hover:text-foreground"
167
+ ),
168
+ children: "Open"
169
+ }
170
+ ) : null
171
+ ] }, thread.threadId)) })
172
+ ] });
173
+ };
174
+ const ChatOutboxRows = ({ outbox, snapshot, renderContent }) => {
175
+ const secondsLeft = useSecondsLeft(snapshot.countdownEndsAt);
176
+ if (snapshot.rows.length === 0 && snapshot.elsewhere.length === 0) return null;
177
+ const statusOf = (row) => {
178
+ switch (row.state.kind) {
179
+ case "countdown":
180
+ return `Athena is back — sending in ${secondsLeft ?? 1} s`;
181
+ case "failed":
182
+ return `Couldn't send. ${row.state.message}`;
183
+ default:
184
+ return STATUS_COPY[row.state.kind];
185
+ }
186
+ };
187
+ return /* @__PURE__ */ jsxs("div", { "data-testid": "athena-chat-outbox", className: "mb-1", children: [
188
+ snapshot.rows.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
189
+ /* @__PURE__ */ jsx("p", { "aria-live": "polite", className: "sr-only", children: announcementOf(snapshot) }),
190
+ /* @__PURE__ */ jsx("ul", { "aria-label": "Messages not sent yet", className: "max-h-40 overflow-y-auto", children: snapshot.rows.map((row, index) => /* @__PURE__ */ jsxs(
191
+ "li",
192
+ {
193
+ "data-state": row.state.kind,
194
+ className: "group flex items-start gap-2 rounded-md px-1 py-1.5 hover:bg-background",
195
+ children: [
196
+ /* @__PURE__ */ jsx(RowIcon, { row }),
197
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
198
+ renderContent({ text: row.entry.text, index, item: asQueueEntry(row.entry) }),
199
+ /* @__PURE__ */ jsx(
200
+ "p",
201
+ {
202
+ className: cn(
203
+ "mt-0.5 text-[10px]",
204
+ row.state.kind === "failed" ? "text-destructive" : "text-muted-foreground"
205
+ ),
206
+ children: statusOf(row)
207
+ }
208
+ )
209
+ ] }),
210
+ /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1", "data-testid": "chat-outbox-row-actions", children: /* @__PURE__ */ jsx(RowActions, { outbox, row }) })
211
+ ]
212
+ },
213
+ row.entry.id
214
+ )) })
215
+ ] }) : null,
216
+ snapshot.durable ? null : /* @__PURE__ */ jsx("p", { className: "px-1 text-[10px] text-muted-foreground", children: "This device can't keep unsent messages — they're lost if you close this page." }),
217
+ snapshot.elsewhere.length > 0 ? /* @__PURE__ */ jsx(ElsewhereRows, { outbox, elsewhere: snapshot.elsewhere }) : null
218
+ ] });
219
+ };
220
+ export {
221
+ ChatOutboxRows
222
+ };
223
+ //# sourceMappingURL=chat-outbox-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-outbox-rows.js","sources":["../../src/chat/chat-outbox-rows.tsx"],"sourcesContent":["import type { StatewireThread } from '@assistant-ui/react-statewire';\nimport type {\n ChatOutbox,\n ChatOutboxElsewhere,\n ChatOutboxEntry,\n ChatOutboxRow,\n ChatOutboxSnapshot,\n} from '@athenaintel/agent-runtime';\nimport {\n AlertCircleIcon,\n ClockIcon,\n Loader2Icon,\n MessageSquareIcon,\n RotateCcwIcon,\n SendIcon,\n Trash2Icon,\n} from 'lucide-react';\nimport { type FC, type ReactNode, useEffect, useState } from 'react';\nimport { cn } from '../lib/utils';\n\n/**\n * The messages typed while Athena couldn't be reached, at the top of the queue tray\n * (`@athenaintel/agent-runtime`'s chat outbox): always shown, each marked as not sent, with what\n * happens next and what the person can do about it.\n *\n * - **Not sent yet — sends when Athena is back**, with Cancel (the text goes back to the composer).\n * - **Sending in N s** once Athena is back and the app is in front, with Cancel.\n * - **Waited more than a day**: Send, Edit (back to the composer) or Discard.\n * - **Sending…** while it is handed to the conversation (its attachments asked about first).\n * - **Couldn't send** (an attachment Athena refused, or the hand-off failed): Retry, Edit (back to\n * the composer, attachments and quote included) or Discard; never retried on its own.\n *\n * Below them, the person's other conversations with messages waiting (a chat that never started\n * has no other way back), each with Open where the host can switch conversations.\n */\n\nexport interface ChatOutboxRowsProps {\n outbox: ChatOutbox;\n snapshot: ChatOutboxSnapshot;\n /** The row body (the tray's own renderer, e.g. mention chips); defaults to the plain text. */\n renderContent: (context: { text: string; index: number; item: StatewireThread.RunsQueueEntry }) => ReactNode;\n}\n\n/** The waiting message in the shape the tray's row renderers read. */\nfunction asQueueEntry(entry: ChatOutboxEntry): StatewireThread.RunsQueueEntry {\n return {\n id: entry.id,\n role: 'user',\n parts: [{ type: 'text', text: entry.text }],\n ...(entry.metadata !== undefined && { metadata: entry.metadata }),\n };\n}\n\n/** Whole seconds left on the countdown, re-rendered while it runs (never shows 0 before it fires). */\nfunction useSecondsLeft(endsAt: number | null): number | null {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (endsAt === null) return undefined;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 250);\n return () => clearInterval(timer);\n }, [endsAt]);\n if (endsAt === null) return null;\n return Math.max(1, Math.ceil((endsAt - now) / 1000));\n}\n\nconst STATUS_COPY = {\n waiting: 'Not sent yet — sends when Athena is back',\n ask: 'Not sent for more than a day — send it now?',\n sending: 'Sending…',\n} as const;\n\nconst pillButton =\n 'inline-flex items-center gap-1 rounded-full border px-2 py-1 font-medium text-[10px] transition-colors';\n\nconst RowActions: FC<{ outbox: ChatOutbox; row: ChatOutboxRow }> = ({ outbox, row }) => {\n const { entry, state } = row;\n switch (state.kind) {\n case 'waiting':\n case 'countdown':\n return (\n <button\n type=\"button\"\n aria-label=\"Cancel sending and edit\"\n title=\"Don't send this — put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Cancel\n </button>\n );\n case 'ask':\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Send now\"\n onClick={() => outbox.send(entry.id)}\n className={cn(pillButton, 'border-primary/30 text-primary hover:bg-primary/5')}\n >\n <SendIcon className=\"size-2.5\" />\n Send\n </button>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n title=\"Put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Edit\n </button>\n <button\n type=\"button\"\n aria-label=\"Discard message\"\n onClick={() => outbox.discard(entry.id)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2Icon className=\"size-3\" />\n </button>\n </>\n );\n case 'failed':\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Retry sending\"\n onClick={() => outbox.send(entry.id)}\n className={cn(pillButton, 'border-primary/30 text-primary hover:bg-primary/5')}\n >\n <RotateCcwIcon className=\"size-2.5\" />\n Retry\n </button>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n title=\"Put it back in the composer\"\n onClick={() => outbox.cancel(entry.id)}\n className={cn(pillButton, 'border-border text-foreground/80 hover:bg-background hover:text-foreground')}\n >\n Edit\n </button>\n <button\n type=\"button\"\n aria-label=\"Discard message\"\n onClick={() => outbox.discard(entry.id)}\n className=\"rounded p-1 text-muted-foreground transition-colors hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2Icon className=\"size-3\" />\n </button>\n </>\n );\n case 'sending':\n return null;\n }\n};\n\nconst RowIcon: FC<{ row: ChatOutboxRow }> = ({ row }) => {\n switch (row.state.kind) {\n case 'sending':\n return <Loader2Icon className=\"mt-0.5 size-3.5 shrink-0 animate-spin text-muted-foreground/60\" />;\n case 'failed':\n return <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0 text-destructive\" />;\n case 'countdown':\n return <SendIcon className=\"mt-0.5 size-3.5 shrink-0 text-primary\" />;\n default:\n return <ClockIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" />;\n }\n};\n\n/** What a screen reader hears: the state of the outbox, never the ticking seconds. */\nfunction announcementOf(snapshot: ChatOutboxSnapshot): string {\n const kinds = new Set(snapshot.rows.map((row) => row.state.kind));\n if (kinds.has('countdown')) return 'Athena is back. Your unsent messages will be sent in a few seconds unless you cancel.';\n if (kinds.has('failed')) return \"A message couldn't be sent. Retry, edit or discard it.\";\n if (kinds.has('ask')) return 'A message waited more than a day. Send, edit or discard it.';\n if (kinds.has('sending')) return 'Sending your unsent messages.';\n return 'Not sent yet. Your messages will be sent when Athena is back.';\n}\n\n/**\n * Every other conversation with waiting messages, each with Open where the host can switch: a chat\n * that never started has no other way back, so none is left out (the list scrolls instead).\n */\nconst ElsewhereRows: FC<{ outbox: ChatOutbox; elsewhere: readonly ChatOutboxElsewhere[] }> = ({\n outbox,\n elsewhere,\n}) => {\n const { openThread } = outbox;\n return (\n <div data-testid=\"athena-chat-outbox-elsewhere\" className=\"px-1 py-1\">\n <p className=\"text-[10px] text-muted-foreground\">Not sent yet in other chats</p>\n <ul aria-label=\"Unsent messages in other chats\" className=\"max-h-24 overflow-y-auto\">\n {elsewhere.map((thread) => (\n <li key={thread.threadId} className=\"flex items-center gap-2 py-0.5\">\n <MessageSquareIcon className=\"size-3 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-foreground/80 text-xs\">{thread.first.text}</span>\n {thread.count > 1 ? (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{thread.count} messages</span>\n ) : null}\n {openThread ? (\n <button\n type=\"button\"\n aria-label=\"Open that chat\"\n onClick={() => openThread({ threadId: thread.threadId, newChat: thread.newChat })}\n className={cn(\n pillButton,\n 'shrink-0 border-border text-foreground/80 hover:bg-background hover:text-foreground',\n )}\n >\n Open\n </button>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport const ChatOutboxRows: FC<ChatOutboxRowsProps> = ({ outbox, snapshot, renderContent }) => {\n const secondsLeft = useSecondsLeft(snapshot.countdownEndsAt);\n if (snapshot.rows.length === 0 && snapshot.elsewhere.length === 0) return null;\n const statusOf = (row: ChatOutboxRow): string => {\n switch (row.state.kind) {\n case 'countdown':\n return `Athena is back — sending in ${secondsLeft ?? 1} s`;\n case 'failed':\n return `Couldn't send. ${row.state.message}`;\n default:\n return STATUS_COPY[row.state.kind];\n }\n };\n return (\n <div data-testid=\"athena-chat-outbox\" className=\"mb-1\">\n {snapshot.rows.length > 0 ? (\n <>\n <p aria-live=\"polite\" className=\"sr-only\">\n {announcementOf(snapshot)}\n </p>\n <ul aria-label=\"Messages not sent yet\" className=\"max-h-40 overflow-y-auto\">\n {snapshot.rows.map((row, index) => (\n <li\n key={row.entry.id}\n data-state={row.state.kind}\n className=\"group flex items-start gap-2 rounded-md px-1 py-1.5 hover:bg-background\"\n >\n <RowIcon row={row} />\n <div className=\"min-w-0 flex-1\">\n {renderContent({ text: row.entry.text, index, item: asQueueEntry(row.entry) })}\n <p\n className={cn(\n 'mt-0.5 text-[10px]',\n row.state.kind === 'failed' ? 'text-destructive' : 'text-muted-foreground',\n )}\n >\n {statusOf(row)}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\" data-testid=\"chat-outbox-row-actions\">\n <RowActions outbox={outbox} row={row} />\n </div>\n </li>\n ))}\n </ul>\n </>\n ) : null}\n {snapshot.durable ? null : (\n <p className=\"px-1 text-[10px] text-muted-foreground\">\n This device can't keep unsent messages — they're lost if you close this page.\n </p>\n )}\n {snapshot.elsewhere.length > 0 ? <ElsewhereRows outbox={outbox} elsewhere={snapshot.elsewhere} /> : null}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;AA4CA,SAAS,aAAa,OAAwD;AAC5E,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM;AAAA,IACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,MAAM;AAAA,IAC1C,GAAI,MAAM,aAAa,UAAa,EAAE,UAAU,MAAM,SAAA;AAAA,EAAS;AAEnE;AAGA,SAAS,eAAe,QAAsC;AAC5D,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,MAAM,KAAK,KAAK;AAC/C,YAAU,MAAM;AACd,QAAI,WAAW,KAAM,QAAO;AAC5B,WAAO,KAAK,KAAK;AACjB,UAAM,QAAQ,YAAY,MAAM,OAAO,KAAK,IAAA,CAAK,GAAG,GAAG;AACvD,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,MAAM,CAAC;AACX,MAAI,WAAW,KAAM,QAAO;AAC5B,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,OAAO,GAAI,CAAC;AACrD;AAEA,MAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,KAAK;AAAA,EACL,SAAS;AACX;AAEA,MAAM,aACJ;AAEF,MAAM,aAA6D,CAAC,EAAE,QAAQ,UAAU;AACtF,QAAM,EAAE,OAAO,MAAA,IAAU;AACzB,UAAQ,MAAM,MAAA;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,OAAM;AAAA,UACN,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE;AAAA,UACrC,WAAW,GAAG,YAAY,4EAA4E;AAAA,UACvG,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAIL,KAAK;AACH,aACE,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,OAAO,KAAK,MAAM,EAAE;AAAA,YACnC,WAAW,GAAG,YAAY,mDAAmD;AAAA,YAE7E,UAAA;AAAA,cAAA,oBAAC,UAAA,EAAS,WAAU,WAAA,CAAW;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAM;AAAA,YACN,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE;AAAA,YACrC,WAAW,GAAG,YAAY,4EAA4E;AAAA,YACvG,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,OAAO,QAAQ,MAAM,EAAE;AAAA,YACtC,WAAU;AAAA,YAEV,UAAA,oBAAC,YAAA,EAAW,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACjC,GACF;AAAA,IAEJ,KAAK;AACH,aACE,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,OAAO,KAAK,MAAM,EAAE;AAAA,YACnC,WAAW,GAAG,YAAY,mDAAmD;AAAA,YAE7E,UAAA;AAAA,cAAA,oBAAC,eAAA,EAAc,WAAU,WAAA,CAAW;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGxC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAM;AAAA,YACN,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE;AAAA,YACrC,WAAW,GAAG,YAAY,4EAA4E;AAAA,YACvG,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM,OAAO,QAAQ,MAAM,EAAE;AAAA,YACtC,WAAU;AAAA,YAEV,UAAA,oBAAC,YAAA,EAAW,WAAU,SAAA,CAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACjC,GACF;AAAA,IAEJ,KAAK;AACH,aAAO;AAAA,EAAA;AAEb;AAEA,MAAM,UAAsC,CAAC,EAAE,UAAU;AACvD,UAAQ,IAAI,MAAM,MAAA;AAAA,IAChB,KAAK;AACH,aAAO,oBAAC,aAAA,EAAY,WAAU,iEAAA,CAAiE;AAAA,IACjG,KAAK;AACH,aAAO,oBAAC,iBAAA,EAAgB,WAAU,4CAAA,CAA4C;AAAA,IAChF,KAAK;AACH,aAAO,oBAAC,UAAA,EAAS,WAAU,wCAAA,CAAwC;AAAA,IACrE;AACE,aAAO,oBAAC,WAAA,EAAU,WAAU,iDAAA,CAAiD;AAAA,EAAA;AAEnF;AAGA,SAAS,eAAe,UAAsC;AAC5D,QAAM,QAAQ,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,CAAC;AAChE,MAAI,MAAM,IAAI,WAAW,EAAG,QAAO;AACnC,MAAI,MAAM,IAAI,QAAQ,EAAG,QAAO;AAChC,MAAI,MAAM,IAAI,KAAK,EAAG,QAAO;AAC7B,MAAI,MAAM,IAAI,SAAS,EAAG,QAAO;AACjC,SAAO;AACT;AAMA,MAAM,gBAAuF,CAAC;AAAA,EAC5F;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,eAAe;AACvB,SACE,qBAAC,OAAA,EAAI,eAAY,gCAA+B,WAAU,aACxD,UAAA;AAAA,IAAA,oBAAC,KAAA,EAAE,WAAU,qCAAoC,UAAA,+BAA2B;AAAA,IAC5E,oBAAC,MAAA,EAAG,cAAW,kCAAiC,WAAU,4BACvD,UAAA,UAAU,IAAI,CAAC,WACd,qBAAC,MAAA,EAAyB,WAAU,kCAClC,UAAA;AAAA,MAAA,oBAAC,mBAAA,EAAkB,WAAU,wCAAA,CAAwC;AAAA,0BACpE,QAAA,EAAK,WAAU,sDAAsD,UAAA,OAAO,MAAM,MAAK;AAAA,MACvF,OAAO,QAAQ,IACd,qBAAC,QAAA,EAAK,WAAU,8CAA8C,UAAA;AAAA,QAAA,OAAO;AAAA,QAAM;AAAA,MAAA,EAAA,CAAS,IAClF;AAAA,MACH,aACC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,SAAS,MAAM,WAAW,EAAE,UAAU,OAAO,UAAU,SAAS,OAAO,SAAS;AAAA,UAChF,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UAAA;AAAA,UAEH,UAAA;AAAA,QAAA;AAAA,MAAA,IAGC;AAAA,IAAA,KAlBG,OAAO,QAmBhB,CACD,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEO,MAAM,iBAA0C,CAAC,EAAE,QAAQ,UAAU,oBAAoB;AAC9F,QAAM,cAAc,eAAe,SAAS,eAAe;AAC3D,MAAI,SAAS,KAAK,WAAW,KAAK,SAAS,UAAU,WAAW,EAAG,QAAO;AAC1E,QAAM,WAAW,CAAC,QAA+B;AAC/C,YAAQ,IAAI,MAAM,MAAA;AAAA,MAChB,KAAK;AACH,eAAO,+BAA+B,eAAe,CAAC;AAAA,MACxD,KAAK;AACH,eAAO,kBAAkB,IAAI,MAAM,OAAO;AAAA,MAC5C;AACE,eAAO,YAAY,IAAI,MAAM,IAAI;AAAA,IAAA;AAAA,EAEvC;AACA,SACE,qBAAC,OAAA,EAAI,eAAY,sBAAqB,WAAU,QAC7C,UAAA;AAAA,IAAA,SAAS,KAAK,SAAS,IACtB,qBAAA,UAAA,EACE,UAAA;AAAA,MAAA,oBAAC,OAAE,aAAU,UAAS,WAAU,WAC7B,UAAA,eAAe,QAAQ,GAC1B;AAAA,MACA,oBAAC,MAAA,EAAG,cAAW,yBAAwB,WAAU,4BAC9C,UAAA,SAAS,KAAK,IAAI,CAAC,KAAK,UACvB;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,cAAY,IAAI,MAAM;AAAA,UACtB,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,oBAAC,WAAQ,KAAU;AAAA,YACnB,qBAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,cAAA,cAAc,EAAE,MAAM,IAAI,MAAM,MAAM,OAAO,MAAM,aAAa,IAAI,KAAK,EAAA,CAAG;AAAA,cAC7E;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,IAAI,MAAM,SAAS,WAAW,qBAAqB;AAAA,kBAAA;AAAA,kBAGpD,mBAAS,GAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YACf,GACF;AAAA,YACA,oBAAC,OAAA,EAAI,WAAU,oCAAmC,eAAY,2BAC5D,UAAA,oBAAC,YAAA,EAAW,QAAgB,IAAA,CAAU,EAAA,CACxC;AAAA,UAAA;AAAA,QAAA;AAAA,QAlBK,IAAI,MAAM;AAAA,MAAA,CAoBlB,EAAA,CACH;AAAA,IAAA,EAAA,CACF,IACE;AAAA,IACH,SAAS,UAAU,2BACjB,KAAA,EAAE,WAAU,0CAAyC,UAAA,iFAEtD;AAAA,IAED,SAAS,UAAU,SAAS,IAAI,oBAAC,iBAAc,QAAgB,WAAW,SAAS,UAAA,CAAW,IAAK;AAAA,EAAA,GACtG;AAEJ;"}
@@ -4,4 +4,4 @@
4
4
  * module so existing `@athenaintel/react` imports (and the package's public
5
5
  * exports) stay stable.
6
6
  */
7
- export { asHitlApproval, hasStatewireThreadExtras, HITL_PENDING_RESUME_GRACE_MS, type HitlApprovalPayload, isApprovalCardInterrupt, isPendingInterrupt, readInterruptMessage, } from '@athenaintel/agent-runtime';
7
+ export { asHitlApproval, hasStatewireThreadExtras, HITL_PENDING_RESUME_GRACE_MS, type HitlApprovalPayload, isApprovalCardInterrupt, isPendingInterrupt, readInterruptMessage, } from '../agent-runtime/src/index';
@@ -1,5 +1,5 @@
1
1
  import type { Toolkit } from '@assistant-ui/react';
2
- import { type RegisteredClientTool } from '@athenaintel/agent-runtime';
2
+ import { type RegisteredClientTool } from '../agent-runtime/src/index';
3
3
  /**
4
4
  * @deprecated The SDK's client tools ARE the shared `RegisteredClientTool`
5
5
  * shape from `@athenaintel/agent-runtime` (`definition` + `handler`); import
@@ -105,6 +105,7 @@ const SuperGroupingCard = react.memo(function SuperGroupingCard2({
105
105
  getToolGroupKey = toolkitMap.defaultGetToolGroupKey,
106
106
  groupingFunction: groupingFunction$1,
107
107
  waitingTools,
108
+ waitingToolCallIds,
108
109
  passThroughTools,
109
110
  isInlineTool = inlineTools.isSdkInlineTool,
110
111
  waitingForInput = false,
@@ -126,10 +127,11 @@ const SuperGroupingCard = react.memo(function SuperGroupingCard2({
126
127
  const timeline = react.useMemo(() => {
127
128
  const items = activityTimeline.buildActivityTimeline(messageContent, messageStatus, {
128
129
  waitingTools,
130
+ waitingToolCallIds,
129
131
  passThroughTools
130
132
  });
131
133
  return items.length > 0 ? items : EMPTY_TIMELINE;
132
- }, [messageContent, messageStatus, waitingTools, passThroughTools]);
134
+ }, [messageContent, messageStatus, waitingTools, waitingToolCallIds, passThroughTools]);
133
135
  const phase = react.useMemo(
134
136
  () => activityTimeline.resolveActivityPhase(messageStatus, timeline, { waitingForInput }),
135
137
  [messageStatus, timeline, waitingForInput]