@athenaintel/react 0.57.2 → 0.60.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 (852) hide show
  1. package/README.md +795 -12
  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 +0 -16
  46. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  47. package/dist/agent-runtime/src/composer-markdown.d.ts +1 -1
  48. package/dist/agent-runtime/src/composer-markdown.js +1 -17
  49. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  50. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -1
  51. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  52. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +8 -1
  53. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -1
  54. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  55. package/dist/agent-runtime/src/dictation-preferences.d.ts +356 -0
  56. package/dist/agent-runtime/src/dictation-record.d.ts +279 -0
  57. package/dist/agent-runtime/src/dictation-session.d.ts +106 -7
  58. package/dist/agent-runtime/src/dictation-snippets.d.ts +9 -0
  59. package/dist/agent-runtime/src/dictation-transfer.d.ts +142 -0
  60. package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
  61. package/dist/agent-runtime/src/edit-command.d.ts +1 -1
  62. package/dist/agent-runtime/src/edit-command.js.map +1 -1
  63. package/dist/agent-runtime/src/errors.cjs +1 -0
  64. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  65. package/dist/agent-runtime/src/errors.js +1 -0
  66. package/dist/agent-runtime/src/errors.js.map +1 -1
  67. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +24 -0
  68. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  69. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +3 -3
  70. package/dist/agent-runtime/src/generated/runconfig-contract.js +24 -0
  71. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  72. package/dist/agent-runtime/src/index.d.ts +14 -8
  73. package/dist/agent-runtime/src/lane-follow.cjs +289 -0
  74. package/dist/agent-runtime/src/lane-follow.cjs.map +1 -0
  75. package/dist/agent-runtime/src/lane-follow.js +289 -0
  76. package/dist/agent-runtime/src/lane-follow.js.map +1 -0
  77. package/dist/agent-runtime/src/lane-images.cjs +387 -0
  78. package/dist/agent-runtime/src/lane-images.cjs.map +1 -0
  79. package/dist/agent-runtime/src/lane-images.js +387 -0
  80. package/dist/agent-runtime/src/lane-images.js.map +1 -0
  81. package/dist/agent-runtime/src/message-window.js +1 -1
  82. package/dist/agent-runtime/src/messages.cjs +19 -1
  83. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  84. package/dist/agent-runtime/src/messages.d.ts +8 -0
  85. package/dist/agent-runtime/src/messages.js +21 -3
  86. package/dist/agent-runtime/src/messages.js.map +1 -1
  87. package/dist/agent-runtime/src/named-agents.cjs +301 -0
  88. package/dist/agent-runtime/src/named-agents.cjs.map +1 -0
  89. package/dist/agent-runtime/src/named-agents.d.ts +246 -0
  90. package/dist/agent-runtime/src/named-agents.js +301 -0
  91. package/dist/agent-runtime/src/named-agents.js.map +1 -0
  92. package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
  93. package/dist/agent-runtime/src/offline-status.d.ts +93 -2
  94. package/dist/agent-runtime/src/offline-status.js.map +1 -1
  95. package/dist/agent-runtime/src/ptc-subcalls.cjs +41 -0
  96. package/dist/agent-runtime/src/ptc-subcalls.cjs.map +1 -0
  97. package/dist/agent-runtime/src/ptc-subcalls.js +41 -0
  98. package/dist/agent-runtime/src/ptc-subcalls.js.map +1 -0
  99. package/dist/agent-runtime/src/queue.cjs +2 -2
  100. package/dist/agent-runtime/src/queue.cjs.map +1 -1
  101. package/dist/agent-runtime/src/queue.d.ts +20 -25
  102. package/dist/agent-runtime/src/queue.js +2 -2
  103. package/dist/agent-runtime/src/queue.js.map +1 -1
  104. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +314 -84
  105. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  106. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +137 -40
  107. package/dist/agent-runtime/src/quota-safe-local-storage-session.js +318 -88
  108. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  109. package/dist/agent-runtime/src/run-send.cjs +54 -0
  110. package/dist/agent-runtime/src/run-send.cjs.map +1 -0
  111. package/dist/agent-runtime/src/run-send.d.ts +51 -0
  112. package/dist/agent-runtime/src/run-send.js +54 -0
  113. package/dist/agent-runtime/src/run-send.js.map +1 -0
  114. package/dist/agent-runtime/src/running-tool-placeholder.cjs +6 -0
  115. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -1
  116. package/dist/agent-runtime/src/running-tool-placeholder.js +6 -0
  117. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -1
  118. package/dist/agent-runtime/src/runtime.d.ts +9 -5
  119. package/dist/agent-runtime/src/sealed-idb.cjs +64 -0
  120. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -1
  121. package/dist/agent-runtime/src/sealed-idb.d.ts +16 -0
  122. package/dist/agent-runtime/src/sealed-idb.js +64 -0
  123. package/dist/agent-runtime/src/sealed-idb.js.map +1 -1
  124. package/dist/agent-runtime/src/send-recovery.cjs +90 -118
  125. package/dist/agent-runtime/src/send-recovery.cjs.map +1 -1
  126. package/dist/agent-runtime/src/send-recovery.d.ts +25 -29
  127. package/dist/agent-runtime/src/send-recovery.js +90 -118
  128. package/dist/agent-runtime/src/send-recovery.js.map +1 -1
  129. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +4 -1
  130. package/dist/agent-runtime/src/statewire-held-sends.cjs +191 -0
  131. package/dist/agent-runtime/src/statewire-held-sends.cjs.map +1 -0
  132. package/dist/agent-runtime/src/statewire-held-sends.d.ts +119 -0
  133. package/dist/agent-runtime/src/statewire-held-sends.js +191 -0
  134. package/dist/agent-runtime/src/statewire-held-sends.js.map +1 -0
  135. package/dist/agent-runtime/src/statewire-state.cjs +4 -0
  136. package/dist/agent-runtime/src/statewire-state.cjs.map +1 -1
  137. package/dist/agent-runtime/src/statewire-state.js +4 -0
  138. package/dist/agent-runtime/src/statewire-state.js.map +1 -1
  139. package/dist/agent-runtime/src/statewire-transport.cjs +8 -2
  140. package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -1
  141. package/dist/agent-runtime/src/statewire-transport.d.ts +14 -5
  142. package/dist/agent-runtime/src/statewire-transport.js +8 -2
  143. package/dist/agent-runtime/src/statewire-transport.js.map +1 -1
  144. package/dist/agent-runtime/src/subagent-transcripts.cjs +1 -23
  145. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -1
  146. package/dist/agent-runtime/src/subagent-transcripts.js +3 -25
  147. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -1
  148. package/dist/agent-runtime/src/subagents.cjs +22 -29
  149. package/dist/agent-runtime/src/subagents.cjs.map +1 -1
  150. package/dist/agent-runtime/src/subagents.js +23 -30
  151. package/dist/agent-runtime/src/subagents.js.map +1 -1
  152. package/dist/agent-runtime/src/thread-extras.cjs +27 -19
  153. package/dist/agent-runtime/src/thread-extras.cjs.map +1 -1
  154. package/dist/agent-runtime/src/thread-extras.d.ts +19 -6
  155. package/dist/agent-runtime/src/thread-extras.js +27 -19
  156. package/dist/agent-runtime/src/thread-extras.js.map +1 -1
  157. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +8 -8
  158. package/dist/agent-runtime/src/tool-metadata.cjs +19 -0
  159. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  160. package/dist/agent-runtime/src/tool-metadata.js +19 -0
  161. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  162. package/dist/agent-runtime/src/tool-names.cjs +21 -0
  163. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  164. package/dist/agent-runtime/src/tool-names.d.ts +8 -0
  165. package/dist/agent-runtime/src/tool-names.js +21 -0
  166. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  167. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs +247 -0
  168. package/dist/agent-runtime/src/typed-interrupt-kinds.cjs.map +1 -0
  169. package/dist/agent-runtime/src/typed-interrupt-kinds.d.ts +173 -0
  170. package/dist/agent-runtime/src/typed-interrupt-kinds.js +247 -0
  171. package/dist/agent-runtime/src/typed-interrupt-kinds.js.map +1 -0
  172. package/dist/agent-runtime/src/typed-interrupts.cjs +48 -0
  173. package/dist/agent-runtime/src/typed-interrupts.cjs.map +1 -0
  174. package/dist/agent-runtime/src/typed-interrupts.d.ts +75 -0
  175. package/dist/agent-runtime/src/typed-interrupts.js +48 -0
  176. package/dist/agent-runtime/src/typed-interrupts.js.map +1 -0
  177. package/dist/agent-runtime/src/types.d.ts +1 -1
  178. package/dist/agent-runtime/src/use-conversation-list.cjs +1 -0
  179. package/dist/agent-runtime/src/use-conversation-list.cjs.map +1 -1
  180. package/dist/agent-runtime/src/use-conversation-list.d.ts +7 -0
  181. package/dist/agent-runtime/src/use-conversation-list.js +1 -0
  182. package/dist/agent-runtime/src/use-conversation-list.js.map +1 -1
  183. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +46 -29
  184. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -1
  185. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +14 -22
  186. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +46 -29
  187. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -1
  188. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +78 -14
  189. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  190. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +34 -7
  191. package/dist/agent-runtime/src/use-deep-agent-runtime.js +79 -15
  192. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  193. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +16 -1
  194. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  195. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +7 -2
  196. package/dist/agent-runtime/src/use-deep-agent-thread.js +16 -1
  197. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  198. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +30 -4
  199. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -1
  200. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +22 -4
  201. package/dist/agent-runtime/src/use-deep-agent-voice.js +30 -4
  202. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -1
  203. package/dist/agent-runtime/src/withdrawn-turns.d.ts +5 -4
  204. package/dist/agent-runtime/src/word-device-fit.d.ts +174 -0
  205. package/dist/agent-runtime/src/work-in.d.ts +127 -0
  206. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  207. package/dist/assets/AthenaAssetEmbed.d.ts +6 -1
  208. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  209. package/dist/assets/asset-panel-store.cjs +13 -5
  210. package/dist/assets/asset-panel-store.cjs.map +1 -1
  211. package/dist/assets/asset-panel-store.d.ts +33 -2
  212. package/dist/assets/asset-panel-store.js +13 -5
  213. package/dist/assets/asset-panel-store.js.map +1 -1
  214. package/dist/auth/AthenaCredentialSourceContext.cjs +11 -0
  215. package/dist/auth/AthenaCredentialSourceContext.cjs.map +1 -1
  216. package/dist/auth/AthenaCredentialSourceContext.d.ts +6 -0
  217. package/dist/auth/AthenaCredentialSourceContext.js +11 -0
  218. package/dist/auth/AthenaCredentialSourceContext.js.map +1 -1
  219. package/dist/auth/account-identity.cjs +13 -2
  220. package/dist/auth/account-identity.cjs.map +1 -1
  221. package/dist/auth/account-identity.d.ts +9 -0
  222. package/dist/auth/account-identity.js +13 -2
  223. package/dist/auth/account-identity.js.map +1 -1
  224. package/dist/auth/credential-source.cjs +20 -4
  225. package/dist/auth/credential-source.cjs.map +1 -1
  226. package/dist/auth/credential-source.d.ts +9 -0
  227. package/dist/auth/credential-source.js +20 -4
  228. package/dist/auth/credential-source.js.map +1 -1
  229. package/dist/catalog/chat-pickers.cjs +31 -0
  230. package/dist/catalog/chat-pickers.cjs.map +1 -1
  231. package/dist/catalog/chat-pickers.d.ts +17 -0
  232. package/dist/catalog/chat-pickers.js +33 -2
  233. package/dist/catalog/chat-pickers.js.map +1 -1
  234. package/dist/catalog/runtime-catalog.cjs +63 -3
  235. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  236. package/dist/catalog/runtime-catalog.d.ts +63 -3
  237. package/dist/catalog/runtime-catalog.js +64 -4
  238. package/dist/catalog/runtime-catalog.js.map +1 -1
  239. package/dist/chat/AthenaChat.cjs +301 -98
  240. package/dist/chat/AthenaChat.cjs.map +1 -1
  241. package/dist/chat/AthenaChat.d.ts +80 -4
  242. package/dist/chat/AthenaChat.js +302 -99
  243. package/dist/chat/AthenaChat.js.map +1 -1
  244. package/dist/chat/StatewireApprovalCard.cjs +35 -5
  245. package/dist/chat/StatewireApprovalCard.cjs.map +1 -1
  246. package/dist/chat/StatewireApprovalCard.d.ts +55 -2
  247. package/dist/chat/StatewireApprovalCard.js +37 -7
  248. package/dist/chat/StatewireApprovalCard.js.map +1 -1
  249. package/dist/chat/StatewireQueuedMessages.cjs +17 -2
  250. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  251. package/dist/chat/StatewireQueuedMessages.d.ts +8 -45
  252. package/dist/chat/StatewireQueuedMessages.js +18 -3
  253. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  254. package/dist/chat/chat-agent-mentions.cjs +70 -0
  255. package/dist/chat/chat-agent-mentions.cjs.map +1 -0
  256. package/dist/chat/chat-agent-mentions.d.ts +13 -0
  257. package/dist/chat/chat-agent-mentions.js +70 -0
  258. package/dist/chat/chat-agent-mentions.js.map +1 -0
  259. package/dist/chat/composer-actions.cjs +12 -0
  260. package/dist/chat/composer-actions.cjs.map +1 -0
  261. package/dist/chat/composer-actions.d.ts +22 -0
  262. package/dist/chat/composer-actions.js +12 -0
  263. package/dist/chat/composer-actions.js.map +1 -0
  264. package/dist/chat/follow-up-suggestions.cjs +185 -0
  265. package/dist/chat/follow-up-suggestions.cjs.map +1 -0
  266. package/dist/chat/follow-up-suggestions.d.ts +64 -0
  267. package/dist/chat/follow-up-suggestions.js +185 -0
  268. package/dist/chat/follow-up-suggestions.js.map +1 -0
  269. package/dist/chat/super-grouping/ToolTimeline.cjs +4 -3
  270. package/dist/chat/super-grouping/ToolTimeline.cjs.map +1 -1
  271. package/dist/chat/super-grouping/ToolTimeline.d.ts +7 -3
  272. package/dist/chat/super-grouping/ToolTimeline.js +4 -3
  273. package/dist/chat/super-grouping/ToolTimeline.js.map +1 -1
  274. package/dist/chat/turn-changes.cjs +284 -0
  275. package/dist/chat/turn-changes.cjs.map +1 -0
  276. package/dist/chat/turn-changes.d.ts +130 -0
  277. package/dist/chat/turn-changes.js +284 -0
  278. package/dist/chat/turn-changes.js.map +1 -0
  279. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs +31 -0
  280. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.cjs.map +1 -0
  281. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.d.ts +31 -0
  282. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js +31 -0
  283. package/dist/chat/typed-interrupts/StatewireTypedInterruptCard.js.map +1 -0
  284. package/dist/chat/typed-interrupts/approval-cards.cjs +250 -0
  285. package/dist/chat/typed-interrupts/approval-cards.cjs.map +1 -0
  286. package/dist/chat/typed-interrupts/approval-cards.d.ts +22 -0
  287. package/dist/chat/typed-interrupts/approval-cards.js +250 -0
  288. package/dist/chat/typed-interrupts/approval-cards.js.map +1 -0
  289. package/dist/chat/typed-interrupts/form-cards.cjs +289 -0
  290. package/dist/chat/typed-interrupts/form-cards.cjs.map +1 -0
  291. package/dist/chat/typed-interrupts/form-cards.d.ts +6 -0
  292. package/dist/chat/typed-interrupts/form-cards.js +289 -0
  293. package/dist/chat/typed-interrupts/form-cards.js.map +1 -0
  294. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs +182 -0
  295. package/dist/chat/typed-interrupts/interrupt-card-shell.cjs.map +1 -0
  296. package/dist/chat/typed-interrupts/interrupt-card-shell.d.ts +47 -0
  297. package/dist/chat/typed-interrupts/interrupt-card-shell.js +182 -0
  298. package/dist/chat/typed-interrupts/interrupt-card-shell.js.map +1 -0
  299. package/dist/chat/typed-interrupts/json-schema-form.cjs +388 -0
  300. package/dist/chat/typed-interrupts/json-schema-form.cjs.map +1 -0
  301. package/dist/chat/typed-interrupts/json-schema-form.d.ts +33 -0
  302. package/dist/chat/typed-interrupts/json-schema-form.js +388 -0
  303. package/dist/chat/typed-interrupts/json-schema-form.js.map +1 -0
  304. package/dist/chat/typed-interrupts/questionnaire-card.cjs +449 -0
  305. package/dist/chat/typed-interrupts/questionnaire-card.cjs.map +1 -0
  306. package/dist/chat/typed-interrupts/questionnaire-card.d.ts +20 -0
  307. package/dist/chat/typed-interrupts/questionnaire-card.js +449 -0
  308. package/dist/chat/typed-interrupts/questionnaire-card.js.map +1 -0
  309. package/dist/chat/typed-interrupts/request-file-card.cjs +159 -0
  310. package/dist/chat/typed-interrupts/request-file-card.cjs.map +1 -0
  311. package/dist/chat/typed-interrupts/request-file-card.d.ts +2 -0
  312. package/dist/chat/typed-interrupts/request-file-card.js +159 -0
  313. package/dist/chat/typed-interrupts/request-file-card.js.map +1 -0
  314. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs +189 -0
  315. package/dist/chat/typed-interrupts/toolkit-selection-card.cjs.map +1 -0
  316. package/dist/chat/typed-interrupts/toolkit-selection-card.d.ts +23 -0
  317. package/dist/chat/typed-interrupts/toolkit-selection-card.js +189 -0
  318. package/dist/chat/typed-interrupts/toolkit-selection-card.js.map +1 -0
  319. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs +26 -0
  320. package/dist/chat/typed-interrupts/typed-interrupt-body.cjs.map +1 -0
  321. package/dist/chat/typed-interrupts/typed-interrupt-body.d.ts +3 -0
  322. package/dist/chat/typed-interrupts/typed-interrupt-body.js +26 -0
  323. package/dist/chat/typed-interrupts/typed-interrupt-body.js.map +1 -0
  324. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs +105 -0
  325. package/dist/chat/typed-interrupts/typed-interrupt-graphql.cjs.map +1 -0
  326. package/dist/chat/typed-interrupts/typed-interrupt-graphql.d.ts +29 -0
  327. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js +105 -0
  328. package/dist/chat/typed-interrupts/typed-interrupt-graphql.js.map +1 -0
  329. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs +70 -0
  330. package/dist/chat/typed-interrupts/typed-interrupt-notice.cjs.map +1 -0
  331. package/dist/chat/typed-interrupts/typed-interrupt-notice.d.ts +45 -0
  332. package/dist/chat/typed-interrupts/typed-interrupt-notice.js +70 -0
  333. package/dist/chat/typed-interrupts/typed-interrupt-notice.js.map +1 -0
  334. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs +76 -0
  335. package/dist/chat/typed-interrupts/typed-interrupt-panel.cjs.map +1 -0
  336. package/dist/chat/typed-interrupts/typed-interrupt-panel.d.ts +11 -0
  337. package/dist/chat/typed-interrupts/typed-interrupt-panel.js +76 -0
  338. package/dist/chat/typed-interrupts/typed-interrupt-panel.js.map +1 -0
  339. package/dist/chat/typed-interrupts/typed-interrupt-types.d.ts +46 -0
  340. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs +106 -0
  341. package/dist/chat/typed-interrupts/use-interrupt-draft.cjs.map +1 -0
  342. package/dist/chat/typed-interrupts/use-interrupt-draft.d.ts +29 -0
  343. package/dist/chat/typed-interrupts/use-interrupt-draft.js +106 -0
  344. package/dist/chat/typed-interrupts/use-interrupt-draft.js.map +1 -0
  345. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs +231 -0
  346. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.cjs.map +1 -0
  347. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.d.ts +66 -0
  348. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js +231 -0
  349. package/dist/chat/typed-interrupts/use-statewire-typed-interrupt.js.map +1 -0
  350. package/dist/chat-ui/composer/composer-named-agents.cjs +13 -0
  351. package/dist/chat-ui/composer/composer-named-agents.cjs.map +1 -0
  352. package/dist/chat-ui/composer/composer-named-agents.d.ts +20 -0
  353. package/dist/chat-ui/composer/composer-named-agents.js +13 -0
  354. package/dist/chat-ui/composer/composer-named-agents.js.map +1 -0
  355. package/dist/chat-ui/composer/slash-command-menu.cjs +143 -0
  356. package/dist/chat-ui/composer/slash-command-menu.cjs.map +1 -0
  357. package/dist/chat-ui/composer/slash-command-menu.d.ts +19 -0
  358. package/dist/chat-ui/composer/slash-command-menu.js +143 -0
  359. package/dist/chat-ui/composer/slash-command-menu.js.map +1 -0
  360. package/dist/chat-ui/composer/slash-commands-extension.cjs +51 -0
  361. package/dist/chat-ui/composer/slash-commands-extension.cjs.map +1 -0
  362. package/dist/chat-ui/composer/slash-commands-extension.d.ts +39 -0
  363. package/dist/chat-ui/composer/slash-commands-extension.js +51 -0
  364. package/dist/chat-ui/composer/slash-commands-extension.js.map +1 -0
  365. package/dist/chat-ui/composer/slash-commands.cjs +74 -0
  366. package/dist/chat-ui/composer/slash-commands.cjs.map +1 -0
  367. package/dist/chat-ui/composer/slash-commands.d.ts +82 -0
  368. package/dist/chat-ui/composer/slash-commands.js +74 -0
  369. package/dist/chat-ui/composer/slash-commands.js.map +1 -0
  370. package/dist/chat-ui/composer/tiptap-composer.cjs +135 -9
  371. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  372. package/dist/chat-ui/composer/tiptap-composer.d.ts +61 -2
  373. package/dist/chat-ui/composer/tiptap-composer.js +135 -9
  374. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  375. package/dist/chat-ui/index.cjs +5 -0
  376. package/dist/chat-ui/index.cjs.map +1 -1
  377. package/dist/chat-ui/index.d.ts +4 -2
  378. package/dist/chat-ui/index.js +5 -0
  379. package/dist/chat-ui/index.js.map +1 -1
  380. package/dist/chat-ui/mentions/mention-chip.cjs +10 -4
  381. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  382. package/dist/chat-ui/mentions/mention-chip.js +11 -5
  383. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  384. package/dist/chat-ui/mentions/mention-extension.cjs +8 -1
  385. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
  386. package/dist/chat-ui/mentions/mention-extension.js +8 -1
  387. package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
  388. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs +1 -0
  389. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.cjs.map +1 -1
  390. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js +1 -0
  391. package/dist/chat-ui/mentions/suggestions/components/get-scope-name.js.map +1 -1
  392. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +20 -2
  393. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -1
  394. package/dist/chat-ui/mentions/suggestions/components/mention-icon.d.ts +10 -1
  395. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +22 -4
  396. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -1
  397. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs +1 -1
  398. package/dist/chat-ui/mentions/suggestions/components/menu-item.cjs.map +1 -1
  399. package/dist/chat-ui/mentions/suggestions/components/menu-item.js +1 -1
  400. package/dist/chat-ui/mentions/suggestions/components/menu-item.js.map +1 -1
  401. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +45 -0
  402. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  403. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +48 -0
  404. package/dist/chat-ui/mentions/suggestions/data/api-client.js +45 -0
  405. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  406. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.cjs +89 -0
  407. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.cjs.map +1 -0
  408. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.d.ts +8 -0
  409. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.js +89 -0
  410. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.js.map +1 -0
  411. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +140 -116
  412. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -1
  413. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.d.ts +46 -12
  414. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +141 -117
  415. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -1
  416. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +272 -25
  417. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  418. package/dist/chat-ui/mentions/suggestions/data/sources/index.d.ts +88 -10
  419. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +274 -27
  420. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  421. package/dist/chat-ui/mentions/suggestions/data/types.cjs.map +1 -1
  422. package/dist/chat-ui/mentions/suggestions/data/types.d.ts +27 -1
  423. package/dist/chat-ui/mentions/suggestions/data/types.js.map +1 -1
  424. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs +56 -5
  425. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.cjs.map +1 -1
  426. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.d.ts +26 -6
  427. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js +57 -6
  428. package/dist/chat-ui/mentions/suggestions/data/use-mention-suggestions.js.map +1 -1
  429. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs +34 -17
  430. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.cjs.map +1 -1
  431. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.d.ts +19 -1
  432. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js +35 -18
  433. package/dist/chat-ui/mentions/suggestions/mention-suggestions.extension.js.map +1 -1
  434. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs +12 -0
  435. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs.map +1 -0
  436. package/dist/chat-ui/mentions/use-asset-icon-app-url.d.ts +8 -0
  437. package/dist/chat-ui/mentions/use-asset-icon-app-url.js +12 -0
  438. package/dist/chat-ui/mentions/use-asset-icon-app-url.js.map +1 -0
  439. package/dist/chat-ui/statewire.d.ts +1 -1
  440. package/dist/chat-ui/thread/statewire-history-edge.cjs +15 -0
  441. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  442. package/dist/chat-ui/thread/statewire-history-edge.d.ts +4 -1
  443. package/dist/chat-ui/thread/statewire-history-edge.js +15 -0
  444. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  445. package/dist/collab/client.cjs +41 -6
  446. package/dist/collab/client.cjs.map +1 -1
  447. package/dist/collab/client.d.ts +38 -7
  448. package/dist/collab/client.js +41 -6
  449. package/dist/collab/client.js.map +1 -1
  450. package/dist/composer/ComposerAttachedReferences.cjs +119 -0
  451. package/dist/composer/ComposerAttachedReferences.cjs.map +1 -0
  452. package/dist/composer/ComposerAttachedReferences.d.ts +26 -0
  453. package/dist/composer/ComposerAttachedReferences.js +119 -0
  454. package/dist/composer/ComposerAttachedReferences.js.map +1 -0
  455. package/dist/composer/ComposerNamedAgents.cjs +63 -0
  456. package/dist/composer/ComposerNamedAgents.cjs.map +1 -0
  457. package/dist/composer/ComposerNamedAgents.d.ts +16 -0
  458. package/dist/composer/ComposerNamedAgents.js +63 -0
  459. package/dist/composer/ComposerNamedAgents.js.map +1 -0
  460. package/dist/composer/attached-references.cjs +159 -0
  461. package/dist/composer/attached-references.cjs.map +1 -0
  462. package/dist/composer/attached-references.d.ts +86 -0
  463. package/dist/composer/attached-references.js +159 -0
  464. package/dist/composer/attached-references.js.map +1 -0
  465. package/dist/composer/build-composed-message.cjs +14 -7
  466. package/dist/composer/build-composed-message.cjs.map +1 -1
  467. package/dist/composer/build-composed-message.d.ts +6 -1
  468. package/dist/composer/build-composed-message.js +14 -7
  469. package/dist/composer/build-composed-message.js.map +1 -1
  470. package/dist/composer/composer-handoff.cjs +6 -2
  471. package/dist/composer/composer-handoff.cjs.map +1 -1
  472. package/dist/composer/composer-handoff.d.ts +7 -1
  473. package/dist/composer/composer-handoff.js +6 -2
  474. package/dist/composer/composer-handoff.js.map +1 -1
  475. package/dist/composer/folder-upload.cjs +149 -0
  476. package/dist/composer/folder-upload.cjs.map +1 -0
  477. package/dist/composer/folder-upload.d.ts +79 -0
  478. package/dist/composer/folder-upload.js +149 -0
  479. package/dist/composer/folder-upload.js.map +1 -0
  480. package/dist/composer/index.d.ts +1 -1
  481. package/dist/composer/staged-message-metadata.cjs +12 -0
  482. package/dist/composer/staged-message-metadata.cjs.map +1 -0
  483. package/dist/composer/staged-message-metadata.d.ts +15 -0
  484. package/dist/composer/staged-message-metadata.js +12 -0
  485. package/dist/composer/staged-message-metadata.js.map +1 -0
  486. package/dist/composer/useAttachToChat.cjs +35 -0
  487. package/dist/composer/useAttachToChat.cjs.map +1 -0
  488. package/dist/composer/useAttachToChat.d.ts +54 -0
  489. package/dist/composer/useAttachToChat.js +35 -0
  490. package/dist/composer/useAttachToChat.js.map +1 -0
  491. package/dist/composer/useAttachedReferencesComposerProps.cjs +19 -0
  492. package/dist/composer/useAttachedReferencesComposerProps.cjs.map +1 -0
  493. package/dist/composer/useAttachedReferencesComposerProps.d.ts +12 -0
  494. package/dist/composer/useAttachedReferencesComposerProps.js +19 -0
  495. package/dist/composer/useAttachedReferencesComposerProps.js.map +1 -0
  496. package/dist/composer/useFileUpload.cjs +95 -7
  497. package/dist/composer/useFileUpload.cjs.map +1 -1
  498. package/dist/composer/useFileUpload.d.ts +21 -2
  499. package/dist/composer/useFileUpload.js +95 -7
  500. package/dist/composer/useFileUpload.js.map +1 -1
  501. package/dist/data/athena-api-error.cjs +125 -0
  502. package/dist/data/athena-api-error.cjs.map +1 -0
  503. package/dist/data/athena-api-error.d.ts +96 -0
  504. package/dist/data/athena-api-error.js +125 -0
  505. package/dist/data/athena-api-error.js.map +1 -0
  506. package/dist/data/athena-data-client.cjs +106 -0
  507. package/dist/data/athena-data-client.cjs.map +1 -0
  508. package/dist/data/athena-data-client.d.ts +74 -0
  509. package/dist/data/athena-data-client.js +106 -0
  510. package/dist/data/athena-data-client.js.map +1 -0
  511. package/dist/data/athena-member.cjs +93 -0
  512. package/dist/data/athena-member.cjs.map +1 -0
  513. package/dist/data/athena-member.d.ts +125 -0
  514. package/dist/data/athena-member.js +93 -0
  515. package/dist/data/athena-member.js.map +1 -0
  516. package/dist/data/athena-request.cjs +460 -0
  517. package/dist/data/athena-request.cjs.map +1 -0
  518. package/dist/data/athena-request.d.ts +120 -0
  519. package/dist/data/athena-request.js +460 -0
  520. package/dist/data/athena-request.js.map +1 -0
  521. package/dist/data/use-athena-fetch.cjs +14 -0
  522. package/dist/data/use-athena-fetch.cjs.map +1 -0
  523. package/dist/data/use-athena-fetch.d.ts +19 -0
  524. package/dist/data/use-athena-fetch.js +14 -0
  525. package/dist/data/use-athena-fetch.js.map +1 -0
  526. package/dist/data/use-athena-graphql.cjs +66 -0
  527. package/dist/data/use-athena-graphql.cjs.map +1 -0
  528. package/dist/data/use-athena-graphql.d.ts +56 -0
  529. package/dist/data/use-athena-graphql.js +66 -0
  530. package/dist/data/use-athena-graphql.js.map +1 -0
  531. package/dist/data/use-athena-rest.cjs +33 -0
  532. package/dist/data/use-athena-rest.cjs.map +1 -0
  533. package/dist/data/use-athena-rest.d.ts +21 -0
  534. package/dist/data/use-athena-rest.js +33 -0
  535. package/dist/data/use-athena-rest.js.map +1 -0
  536. package/dist/data/use-semantic-query.cjs +44 -0
  537. package/dist/data/use-semantic-query.cjs.map +1 -0
  538. package/dist/data/use-semantic-query.d.ts +92 -0
  539. package/dist/data/use-semantic-query.js +44 -0
  540. package/dist/data/use-semantic-query.js.map +1 -0
  541. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  542. package/dist/diagnostics/athena-diagnostics.d.ts +5 -1
  543. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  544. package/dist/diagnostics/errors.cjs +7 -0
  545. package/dist/diagnostics/errors.cjs.map +1 -1
  546. package/dist/diagnostics/errors.d.ts +7 -0
  547. package/dist/diagnostics/errors.js +7 -0
  548. package/dist/diagnostics/errors.js.map +1 -1
  549. package/dist/index.cjs +155 -11
  550. package/dist/index.cjs.map +1 -1
  551. package/dist/index.d.ts +72 -13
  552. package/dist/index.js +148 -4
  553. package/dist/index.js.map +1 -1
  554. package/dist/keryx-http/src/initial-sync.cjs +64 -16
  555. package/dist/keryx-http/src/initial-sync.cjs.map +1 -1
  556. package/dist/keryx-http/src/initial-sync.d.ts +31 -1
  557. package/dist/keryx-http/src/initial-sync.js +64 -16
  558. package/dist/keryx-http/src/initial-sync.js.map +1 -1
  559. package/dist/keryx-http/src/own-awareness.cjs +20 -0
  560. package/dist/keryx-http/src/own-awareness.cjs.map +1 -0
  561. package/dist/keryx-http/src/own-awareness.d.ts +50 -0
  562. package/dist/keryx-http/src/own-awareness.js +20 -0
  563. package/dist/keryx-http/src/own-awareness.js.map +1 -0
  564. package/dist/keryx-http/src/update-attributions.cjs +26 -1
  565. package/dist/keryx-http/src/update-attributions.cjs.map +1 -1
  566. package/dist/keryx-http/src/update-attributions.d.ts +10 -1
  567. package/dist/keryx-http/src/update-attributions.js +26 -1
  568. package/dist/keryx-http/src/update-attributions.js.map +1 -1
  569. package/dist/offline/chat-outbox.cjs +262 -26
  570. package/dist/offline/chat-outbox.cjs.map +1 -1
  571. package/dist/offline/chat-outbox.d.ts +90 -12
  572. package/dist/offline/chat-outbox.js +263 -27
  573. package/dist/offline/chat-outbox.js.map +1 -1
  574. package/dist/provider/AthenaProvider.cjs +60 -22
  575. package/dist/provider/AthenaProvider.cjs.map +1 -1
  576. package/dist/provider/AthenaProvider.d.ts +24 -8
  577. package/dist/provider/AthenaProvider.js +61 -23
  578. package/dist/provider/AthenaProvider.js.map +1 -1
  579. package/dist/react/package.json.cjs +1 -1
  580. package/dist/react/package.json.js +1 -1
  581. package/dist/references/src/anchors/parse.cjs +11 -1
  582. package/dist/references/src/anchors/parse.cjs.map +1 -1
  583. package/dist/references/src/anchors/parse.js +11 -1
  584. package/dist/references/src/anchors/parse.js.map +1 -1
  585. package/dist/references/src/anchors/schemas.d.ts +1 -0
  586. package/dist/references/src/anchors/serialize.cjs +1 -0
  587. package/dist/references/src/anchors/serialize.cjs.map +1 -1
  588. package/dist/references/src/anchors/serialize.js +1 -0
  589. package/dist/references/src/anchors/serialize.js.map +1 -1
  590. package/dist/references/src/anchors/types.cjs +5 -0
  591. package/dist/references/src/anchors/types.cjs.map +1 -1
  592. package/dist/references/src/anchors/types.d.ts +9 -0
  593. package/dist/references/src/anchors/types.js +5 -0
  594. package/dist/references/src/anchors/types.js.map +1 -1
  595. package/dist/references/src/attachable.cjs +149 -0
  596. package/dist/references/src/attachable.cjs.map +1 -0
  597. package/dist/references/src/attachable.d.ts +87 -0
  598. package/dist/references/src/attachable.js +149 -0
  599. package/dist/references/src/attachable.js.map +1 -0
  600. package/dist/references/src/schemas.d.ts +2 -0
  601. package/dist/runtime/StatewirePlanModeLaneSync.cjs +93 -0
  602. package/dist/runtime/StatewirePlanModeLaneSync.cjs.map +1 -0
  603. package/dist/runtime/StatewirePlanModeLaneSync.d.ts +34 -0
  604. package/dist/runtime/StatewirePlanModeLaneSync.js +93 -0
  605. package/dist/runtime/StatewirePlanModeLaneSync.js.map +1 -0
  606. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +2 -0
  607. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -1
  608. package/dist/runtime/StatewireThreadConfigLaneSync.d.ts +4 -0
  609. package/dist/runtime/StatewireThreadConfigLaneSync.js +2 -0
  610. package/dist/runtime/StatewireThreadConfigLaneSync.js.map +1 -1
  611. package/dist/runtime/statewire-plan-mode.cjs +71 -0
  612. package/dist/runtime/statewire-plan-mode.cjs.map +1 -0
  613. package/dist/runtime/statewire-plan-mode.d.ts +88 -0
  614. package/dist/runtime/statewire-plan-mode.js +71 -0
  615. package/dist/runtime/statewire-plan-mode.js.map +1 -0
  616. package/dist/runtime/statewire-run-config.cjs +3 -1
  617. package/dist/runtime/statewire-run-config.cjs.map +1 -1
  618. package/dist/runtime/statewire-run-config.d.ts +7 -0
  619. package/dist/runtime/statewire-run-config.js +3 -1
  620. package/dist/runtime/statewire-run-config.js.map +1 -1
  621. package/dist/runtime/statewire-session-key.cjs +11 -5
  622. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  623. package/dist/runtime/statewire-session-key.d.ts +22 -10
  624. package/dist/runtime/statewire-session-key.js +11 -5
  625. package/dist/runtime/statewire-session-key.js.map +1 -1
  626. package/dist/runtime/useAthenaStatewireRuntime.cjs +64 -9
  627. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  628. package/dist/runtime/useAthenaStatewireRuntime.d.ts +26 -10
  629. package/dist/runtime/useAthenaStatewireRuntime.js +66 -11
  630. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  631. package/dist/search/useAthenaAssets.cjs +394 -0
  632. package/dist/search/useAthenaAssets.cjs.map +1 -0
  633. package/dist/search/useAthenaAssets.d.ts +186 -0
  634. package/dist/search/useAthenaAssets.js +394 -0
  635. package/dist/search/useAthenaAssets.js.map +1 -0
  636. package/dist/sheet-range/index.cjs +4 -0
  637. package/dist/sheet-range/index.cjs.map +1 -1
  638. package/dist/sheet-range/index.d.ts +4 -2
  639. package/dist/sheet-range/index.js +4 -0
  640. package/dist/sheet-range/index.js.map +1 -1
  641. package/dist/sheet-range/query-range.cjs +102 -0
  642. package/dist/sheet-range/query-range.cjs.map +1 -0
  643. package/dist/sheet-range/query-range.d.ts +46 -0
  644. package/dist/sheet-range/query-range.js +102 -0
  645. package/dist/sheet-range/query-range.js.map +1 -0
  646. package/dist/styles.css +1 -1
  647. package/dist/subagents/index.cjs +49 -0
  648. package/dist/subagents/index.cjs.map +1 -0
  649. package/dist/subagents/index.d.ts +16 -0
  650. package/dist/subagents/index.js +49 -0
  651. package/dist/subagents/index.js.map +1 -0
  652. package/dist/subagents/lane-follow.cjs +19 -0
  653. package/dist/subagents/lane-follow.cjs.map +1 -0
  654. package/dist/subagents/lane-follow.d.ts +9 -0
  655. package/dist/subagents/lane-follow.js +19 -0
  656. package/dist/subagents/lane-follow.js.map +1 -0
  657. package/dist/subagents/lane-model.cjs +178 -0
  658. package/dist/subagents/lane-model.cjs.map +1 -0
  659. package/dist/subagents/lane-model.d.ts +140 -0
  660. package/dist/subagents/lane-model.js +178 -0
  661. package/dist/subagents/lane-model.js.map +1 -0
  662. package/dist/subagents/lane-parts.cjs +517 -0
  663. package/dist/subagents/lane-parts.cjs.map +1 -0
  664. package/dist/subagents/lane-parts.d.ts +130 -0
  665. package/dist/subagents/lane-parts.js +517 -0
  666. package/dist/subagents/lane-parts.js.map +1 -0
  667. package/dist/subagents/subagent-lane-group.cjs +215 -0
  668. package/dist/subagents/subagent-lane-group.cjs.map +1 -0
  669. package/dist/subagents/subagent-lane-group.d.ts +67 -0
  670. package/dist/subagents/subagent-lane-group.js +215 -0
  671. package/dist/subagents/subagent-lane-group.js.map +1 -0
  672. package/dist/subagents/subagent-transcript-drawer.cjs +431 -0
  673. package/dist/subagents/subagent-transcript-drawer.cjs.map +1 -0
  674. package/dist/subagents/subagent-transcript-drawer.d.ts +78 -0
  675. package/dist/subagents/subagent-transcript-drawer.js +431 -0
  676. package/dist/subagents/subagent-transcript-drawer.js.map +1 -0
  677. package/dist/subagents/task-subagent-group.cjs +115 -0
  678. package/dist/subagents/task-subagent-group.cjs.map +1 -0
  679. package/dist/subagents/task-subagent-group.d.ts +36 -0
  680. package/dist/subagents/task-subagent-group.js +115 -0
  681. package/dist/subagents/task-subagent-group.js.map +1 -0
  682. package/dist/subagents/use-omitted-images-in-view.cjs +68 -0
  683. package/dist/subagents/use-omitted-images-in-view.cjs.map +1 -0
  684. package/dist/subagents/use-omitted-images-in-view.d.ts +21 -0
  685. package/dist/subagents/use-omitted-images-in-view.js +68 -0
  686. package/dist/subagents/use-omitted-images-in-view.js.map +1 -0
  687. package/dist/threads/Inbox.cjs +2 -2
  688. package/dist/threads/Inbox.cjs.map +1 -1
  689. package/dist/threads/SessionList.cjs +6 -6
  690. package/dist/threads/SessionList.cjs.map +1 -1
  691. package/dist/threads/SessionsPage.cjs +13 -7
  692. package/dist/threads/SessionsPage.cjs.map +1 -1
  693. package/dist/threads/SessionsPage.d.ts +10 -1
  694. package/dist/threads/SessionsPage.js +9 -3
  695. package/dist/threads/SessionsPage.js.map +1 -1
  696. package/dist/threads/session-list-model.cjs.map +1 -1
  697. package/dist/threads/session-list-model.d.ts +2 -1
  698. package/dist/threads/session-list-model.js.map +1 -1
  699. package/dist/threads/session-row-parts.cjs +3 -3
  700. package/dist/threads/session-row-parts.cjs.map +1 -1
  701. package/dist/threads/sessions-page-model.cjs +13 -5
  702. package/dist/threads/sessions-page-model.cjs.map +1 -1
  703. package/dist/threads/sessions-page-model.d.ts +7 -0
  704. package/dist/threads/sessions-page-model.js +11 -3
  705. package/dist/threads/sessions-page-model.js.map +1 -1
  706. package/dist/threads/sessions-page-storage.cjs +8 -8
  707. package/dist/threads/sessions-page-storage.cjs.map +1 -1
  708. package/dist/threads/sessions-page-storage.d.ts +5 -1
  709. package/dist/threads/sessions-page-storage.js +8 -8
  710. package/dist/threads/sessions-page-storage.js.map +1 -1
  711. package/dist/threads/statewire-thread-list.cjs +14 -2
  712. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  713. package/dist/threads/statewire-thread-list.d.ts +11 -2
  714. package/dist/threads/statewire-thread-list.js +14 -2
  715. package/dist/threads/statewire-thread-list.js.map +1 -1
  716. package/dist/threads/use-athena-sessions.cjs +1 -0
  717. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  718. package/dist/threads/use-athena-sessions.d.ts +7 -0
  719. package/dist/threads/use-athena-sessions.js +1 -0
  720. package/dist/threads/use-athena-sessions.js.map +1 -1
  721. package/dist/threads/use-athena-thread-agent.cjs +31 -0
  722. package/dist/threads/use-athena-thread-agent.cjs.map +1 -0
  723. package/dist/threads/use-athena-thread-agent.d.ts +38 -0
  724. package/dist/threads/use-athena-thread-agent.js +31 -0
  725. package/dist/threads/use-athena-thread-agent.js.map +1 -0
  726. package/dist/threads/use-athena-thread-plan-mode.cjs +18 -0
  727. package/dist/threads/use-athena-thread-plan-mode.cjs.map +1 -0
  728. package/dist/threads/use-athena-thread-plan-mode.d.ts +18 -0
  729. package/dist/threads/use-athena-thread-plan-mode.js +18 -0
  730. package/dist/threads/use-athena-thread-plan-mode.js.map +1 -0
  731. package/dist/threads/use-rest-conversation-history.d.ts +1 -0
  732. package/dist/tools/agent-creations.cjs +97 -0
  733. package/dist/tools/agent-creations.cjs.map +1 -0
  734. package/dist/tools/agent-creations.d.ts +38 -0
  735. package/dist/tools/agent-creations.js +97 -0
  736. package/dist/tools/agent-creations.js.map +1 -0
  737. package/dist/tools/agent-highlights.cjs +100 -0
  738. package/dist/tools/agent-highlights.cjs.map +1 -0
  739. package/dist/tools/agent-highlights.d.ts +57 -0
  740. package/dist/tools/agent-highlights.js +100 -0
  741. package/dist/tools/agent-highlights.js.map +1 -0
  742. package/dist/tools/append-document-tool-ui.cjs +1 -0
  743. package/dist/tools/append-document-tool-ui.cjs.map +1 -1
  744. package/dist/tools/append-document-tool-ui.d.ts +7 -0
  745. package/dist/tools/append-document-tool-ui.js +2 -1
  746. package/dist/tools/append-document-tool-ui.js.map +1 -1
  747. package/dist/tools/auto-open-tools.cjs +144 -71
  748. package/dist/tools/auto-open-tools.cjs.map +1 -1
  749. package/dist/tools/auto-open-tools.d.ts +131 -1
  750. package/dist/tools/auto-open-tools.js +145 -72
  751. package/dist/tools/auto-open-tools.js.map +1 -1
  752. package/dist/tools/browser-tool-uis.cjs +594 -0
  753. package/dist/tools/browser-tool-uis.cjs.map +1 -0
  754. package/dist/tools/browser-tool-uis.d.ts +8 -0
  755. package/dist/tools/browser-tool-uis.js +594 -0
  756. package/dist/tools/browser-tool-uis.js.map +1 -0
  757. package/dist/tools/computer-asset-tool-uis.cjs +313 -0
  758. package/dist/tools/computer-asset-tool-uis.cjs.map +1 -0
  759. package/dist/tools/computer-asset-tool-uis.d.ts +5 -0
  760. package/dist/tools/computer-asset-tool-uis.js +313 -0
  761. package/dist/tools/computer-asset-tool-uis.js.map +1 -0
  762. package/dist/tools/document-edit-tool-uis.cjs +218 -0
  763. package/dist/tools/document-edit-tool-uis.cjs.map +1 -0
  764. package/dist/tools/document-edit-tool-uis.d.ts +40 -0
  765. package/dist/tools/document-edit-tool-uis.js +218 -0
  766. package/dist/tools/document-edit-tool-uis.js.map +1 -0
  767. package/dist/tools/drive-tool-uis.cjs +429 -0
  768. package/dist/tools/drive-tool-uis.cjs.map +1 -0
  769. package/dist/tools/drive-tool-uis.d.ts +121 -0
  770. package/dist/tools/drive-tool-uis.js +429 -0
  771. package/dist/tools/drive-tool-uis.js.map +1 -0
  772. package/dist/tools/email-calendar-tool-uis.cjs +789 -0
  773. package/dist/tools/email-calendar-tool-uis.cjs.map +1 -0
  774. package/dist/tools/email-calendar-tool-uis.d.ts +129 -0
  775. package/dist/tools/email-calendar-tool-uis.js +789 -0
  776. package/dist/tools/email-calendar-tool-uis.js.map +1 -0
  777. package/dist/tools/ontology-tool-uis.cjs +83 -0
  778. package/dist/tools/ontology-tool-uis.cjs.map +1 -0
  779. package/dist/tools/ontology-tool-uis.d.ts +9 -0
  780. package/dist/tools/ontology-tool-uis.js +83 -0
  781. package/dist/tools/ontology-tool-uis.js.map +1 -0
  782. package/dist/tools/orchestration-tool-uis.cjs +586 -0
  783. package/dist/tools/orchestration-tool-uis.cjs.map +1 -0
  784. package/dist/tools/orchestration-tool-uis.d.ts +141 -0
  785. package/dist/tools/orchestration-tool-uis.js +586 -0
  786. package/dist/tools/orchestration-tool-uis.js.map +1 -0
  787. package/dist/tools/presentation-edit-tool-uis.cjs +516 -0
  788. package/dist/tools/presentation-edit-tool-uis.cjs.map +1 -0
  789. package/dist/tools/presentation-edit-tool-uis.d.ts +73 -0
  790. package/dist/tools/presentation-edit-tool-uis.js +516 -0
  791. package/dist/tools/presentation-edit-tool-uis.js.map +1 -0
  792. package/dist/tools/project-tool-uis.cjs +213 -0
  793. package/dist/tools/project-tool-uis.cjs.map +1 -0
  794. package/dist/tools/project-tool-uis.d.ts +14 -0
  795. package/dist/tools/project-tool-uis.js +213 -0
  796. package/dist/tools/project-tool-uis.js.map +1 -0
  797. package/dist/tools/sandbox-tool-uis.cjs +491 -0
  798. package/dist/tools/sandbox-tool-uis.cjs.map +1 -0
  799. package/dist/tools/sandbox-tool-uis.d.ts +116 -0
  800. package/dist/tools/sandbox-tool-uis.js +491 -0
  801. package/dist/tools/sandbox-tool-uis.js.map +1 -0
  802. package/dist/tools/sheet-query-tool-ui.cjs +138 -0
  803. package/dist/tools/sheet-query-tool-ui.cjs.map +1 -0
  804. package/dist/tools/sheet-query-tool-ui.d.ts +15 -0
  805. package/dist/tools/sheet-query-tool-ui.js +138 -0
  806. package/dist/tools/sheet-query-tool-ui.js.map +1 -0
  807. package/dist/tools/studio-screenshot-tool-uis.cjs +262 -0
  808. package/dist/tools/studio-screenshot-tool-uis.cjs.map +1 -0
  809. package/dist/tools/studio-screenshot-tool-uis.d.ts +52 -0
  810. package/dist/tools/studio-screenshot-tool-uis.js +262 -0
  811. package/dist/tools/studio-screenshot-tool-uis.js.map +1 -0
  812. package/dist/tools/subagent-task-tool-ui.cjs +24 -475
  813. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -1
  814. package/dist/tools/subagent-task-tool-ui.d.ts +19 -103
  815. package/dist/tools/subagent-task-tool-ui.js +28 -479
  816. package/dist/tools/subagent-task-tool-ui.js.map +1 -1
  817. package/dist/tools/tool-summary.cjs +36 -0
  818. package/dist/tools/tool-summary.cjs.map +1 -1
  819. package/dist/tools/tool-summary.js +36 -0
  820. package/dist/tools/tool-summary.js.map +1 -1
  821. package/dist/tools/tool-uis.cjs +181 -53
  822. package/dist/tools/tool-uis.cjs.map +1 -1
  823. package/dist/tools/tool-uis.d.ts +40 -0
  824. package/dist/tools/tool-uis.js +183 -55
  825. package/dist/tools/tool-uis.js.map +1 -1
  826. package/dist/typed-interrupts/index.cjs +15 -0
  827. package/dist/typed-interrupts/index.cjs.map +1 -0
  828. package/dist/typed-interrupts/index.d.ts +20 -0
  829. package/dist/typed-interrupts/index.js +15 -0
  830. package/dist/typed-interrupts/index.js.map +1 -0
  831. package/dist/version.cjs +4 -0
  832. package/dist/version.cjs.map +1 -1
  833. package/dist/version.d.ts +9 -0
  834. package/dist/version.js +4 -0
  835. package/dist/version.js.map +1 -1
  836. package/dist/workbench/live-desktop-api.cjs +2 -1
  837. package/dist/workbench/live-desktop-api.cjs.map +1 -1
  838. package/dist/workbench/live-desktop-api.js +2 -1
  839. package/dist/workbench/live-desktop-api.js.map +1 -1
  840. package/dist/workbench/session-workbench-panes.cjs +6 -6
  841. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  842. package/dist/workbench/session-workspace-api.cjs +7 -2
  843. package/dist/workbench/session-workspace-api.cjs.map +1 -1
  844. package/dist/workbench/session-workspace-api.d.ts +10 -0
  845. package/dist/workbench/session-workspace-api.js +7 -2
  846. package/dist/workbench/session-workspace-api.js.map +1 -1
  847. package/package.json +28 -6
  848. package/dist/agent-runtime/src/chat-outbox-store.cjs +0 -510
  849. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +0 -1
  850. package/dist/agent-runtime/src/chat-outbox-store.d.ts +0 -210
  851. package/dist/agent-runtime/src/chat-outbox-store.js +0 -510
  852. package/dist/agent-runtime/src/chat-outbox-store.js.map +0 -1
@@ -4,6 +4,7 @@ import { athenaDiagnostics } from "../diagnostics/athena-diagnostics.js";
4
4
  import { AthenaSdkError } from "../diagnostics/errors.js";
5
5
  import { useStatewireSessionLanePending } from "../runtime/statewire-session-lane.js";
6
6
  import { useAthenaStatewireThreadList } from "../threads/statewire-thread-list.js";
7
+ import { autoComposerSendOptions } from "../agent-runtime/src/run-send.js";
7
8
  function createComposerHandoffStore() {
8
9
  return {
9
10
  pending: [],
@@ -74,7 +75,7 @@ function applyComposerWrite({
74
75
  store,
75
76
  write
76
77
  }) {
77
- var _a;
78
+ var _a, _b;
78
79
  const current = target.composer.getState().text ?? "";
79
80
  const next = mergeComposerDraft({ current, write });
80
81
  target.composer.setText(next);
@@ -87,7 +88,10 @@ function applyComposerWrite({
87
88
  data: { phase: "applied", send: write.send, focus: write.focus, chars: next.length }
88
89
  });
89
90
  if (write.send) {
90
- return Promise.resolve(target.composer.send({ steer: false })).then(() => void 0);
91
+ const isRunning = ((_b = target.thread) == null ? void 0 : _b.call(target).getState().isRunning) ?? false;
92
+ return Promise.resolve(target.composer.send(autoComposerSendOptions(isRunning))).then(
93
+ () => void 0
94
+ );
91
95
  }
92
96
  return void 0;
93
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"composer-handoff.js","sources":["../../src/composer/composer-handoff.ts"],"sourcesContent":["/**\n * Composer handoff: writes to the chat composer from host UI that lives\n * outside `<AthenaChat>` (a sidebar, an agenda card, a workflow button).\n *\n * Two problems it solves for `useAppendToComposer` / `useSendMessage`:\n *\n * 1. A write before the chat is ready is lost. While the thread list is still\n * resolving the active thread, or the thread's history is still loading,\n * the composer the hooks write to belongs to a mount that is about to be\n * replaced (thread-list mode keys the statewire subtree by thread), and\n * the draft goes with it. The store below lives ABOVE that mount, so a\n * write made too early waits here and the ready mount drains it.\n * 2. A prefilled draft should put the caret after the text so the user can\n * keep typing or dictating. The Tiptap editor mirrors runtime text on a\n * later tick; the `focusOnNextMirror` flag asks it to focus at the end\n * right after that mirror lands, instead of the host guessing a delay.\n *\n * Every queued write is bound to the statewire thread it was made for and\n * drains only into that thread's mount; a thread switch, an identity change\n * or a provider unmount drops what waits with a `composer_write_dropped`\n * error, never into another user's or another thread's composer.\n */\nimport { createContext, useCallback, useContext } from 'react';\nimport { useAuiState } from '@assistant-ui/react';\nimport type { ChatOutboxAttachment } from '@athenaintel/agent-runtime';\nimport { athenaDiagnostics } from '../diagnostics/athena-diagnostics';\nimport { AthenaSdkError } from '../diagnostics/errors';\nimport { useStatewireSessionLanePending } from '../runtime/statewire-session-lane';\nimport { useAthenaStatewireThreadList } from '../threads/statewire-thread-list';\n\n/** The slice of the assistant-ui client the handoff writes to. */\nexport interface ComposerTarget {\n composer: {\n getState: () => { text: string };\n setText: (text: string) => void;\n send: (options?: { steer?: boolean }) => unknown;\n };\n}\n\nexport interface ComposerWrite {\n text: string;\n /** Replace the draft instead of appending on a new line. */\n replace: boolean;\n /** Submit right after writing. */\n send: boolean;\n /** Put the caret at the end of the draft once the editor shows it. */\n focus: boolean;\n /** The statewire thread the write was made for; it drains only into that thread's mount. */\n threadId: string | null;\n /** Settled once the write has been applied (and, for `send`, with the send's outcome). */\n resolve?: (outcome: Promise<void> | void) => void;\n /** Settled with `composer_write_dropped` when the write can no longer land. */\n reject?: (error: AthenaSdkError) => void;\n}\n\nexport interface ComposerHandoffStore {\n /** Writes waiting for a ready composer, oldest first. Adjacent plain appends fold together. */\n pending: ComposerWrite[];\n /** Set by a `focus` write; the editor consumes it after mirroring the draft. */\n focusOnNextMirror: boolean;\n /** Registered by the mounted editor: place the caret at the end of the draft. */\n focusEnd: (() => void) | null;\n /** Set by `useFocusComposer` before the editor mounted; the editor consumes it when it does. */\n focusOnMount: boolean;\n /**\n * Per thread, the attachments of messages the chat outbox gave back to the composer (Cancel, or\n * Edit on one that couldn't be sent): files already in Athena, back in the draft as mentions. A\n * message held again from that draft names those still in it, so the outbox asks Athena about\n * them again before it goes ({@link rememberRestoredAttachments}, {@link takeRestoredAttachments}).\n */\n restoredAttachments?: Map<string, ChatOutboxAttachment[]>;\n}\n\nexport function createComposerHandoffStore(): ComposerHandoffStore {\n return {\n pending: [],\n focusOnNextMirror: false,\n focusEnd: null,\n focusOnMount: false,\n restoredAttachments: new Map(),\n };\n}\n\n/** A held message given back to `threadId`'s composer: remember the attachments it carried. */\nexport function rememberRestoredAttachments({\n store,\n threadId,\n attachments,\n}: {\n store: ComposerHandoffStore;\n threadId: string;\n attachments: readonly ChatOutboxAttachment[];\n}): void {\n if (attachments.length === 0) return;\n store.restoredAttachments ??= new Map();\n const kept = store.restoredAttachments.get(threadId) ?? [];\n const known = new Set(kept.map((attachment) => attachment.assetId));\n store.restoredAttachments.set(threadId, [\n ...kept,\n ...attachments.filter((attachment) => !known.has(attachment.assetId)),\n ]);\n}\n\n/**\n * The remembered attachments of `threadId`'s draft whose mentions it still holds, for the message\n * leaving it now; the composer forgets them all (sent, held again, or removed from the draft).\n */\nexport function takeRestoredAttachments({\n store,\n threadId,\n assetIdsInDraft,\n}: {\n store: ComposerHandoffStore | null;\n threadId: string;\n assetIdsInDraft: ReadonlySet<string>;\n}): ChatOutboxAttachment[] {\n const kept = store?.restoredAttachments?.get(threadId);\n if (!kept) return [];\n store?.restoredAttachments?.delete(threadId);\n return kept.filter((attachment) => assetIdsInDraft.has(attachment.assetId));\n}\n\nexport const ComposerHandoffContext = createContext<ComposerHandoffStore | null>(null);\n\n/** The provider's handoff store, or null outside `AthenaProvider`. */\nexport function useComposerHandoffStore(): ComposerHandoffStore | null {\n return useContext(ComposerHandoffContext);\n}\n\n/**\n * Puts the caret at the end of the composer's draft and leaves the draft as it is; asked before the\n * editor has mounted, it focuses the editor as it mounts. For a host that shows the chat again and\n * wants typing to land in it (a launcher window a shortcut brings back).\n */\nexport function useFocusComposer(): () => void {\n const store = useComposerHandoffStore();\n return useCallback(() => {\n if (store) focusComposer({ store });\n }, [store]);\n}\n\n/** The caret to the end of the draft now, or, with no editor mounted yet, as one mounts. */\nexport function focusComposer({ store }: { store: ComposerHandoffStore }): void {\n if (store.focusEnd) store.focusEnd();\n else store.focusOnMount = true;\n}\n\n/**\n * Whether a composer write lands now: in thread-list mode the list has\n * resolved which thread is active, that thread's history has loaded, and the\n * chat's session lane is known (the sign-in provider above has resolved who is\n * signed in; see `StatewireSessionLane`). Until then the composer the hooks\n * write to is the one of a mount that is about to be replaced, and the draft\n * goes with it, or a send would go into a parked lane that refuses it unsent.\n *\n * Deliberately not the socket status: a never-started chat sits in\n * `standby` until its first send and must still take a prefill.\n */\nexport function useComposerReady(): boolean {\n const list = useAthenaStatewireThreadList();\n const threadLoading = useAuiState((s) => s.optional.thread?.isLoading ?? false);\n const lanePending = useStatewireSessionLanePending();\n return !(list?.isLoading ?? false) && !threadLoading && !lanePending;\n}\n\n/** The draft after `write`: `replace` (or an empty draft) takes the text as is. */\nexport function mergeComposerDraft({\n current,\n write,\n}: {\n current: string;\n write: Pick<ComposerWrite, 'text' | 'replace'>;\n}): string {\n if (write.replace || !current) return write.text;\n return `${current}\\n${write.text}`;\n}\n\n/**\n * Write into the live composer. Returns the send's outcome for a `send`\n * write so callers can await it.\n */\nexport function applyComposerWrite({\n target,\n store,\n write,\n}: {\n target: ComposerTarget;\n store: ComposerHandoffStore | null;\n write: ComposerWrite;\n}): Promise<void> | void {\n const current = target.composer.getState().text ?? '';\n const next = mergeComposerDraft({ current, write });\n target.composer.setText(next);\n if (write.focus && store) {\n // An unchanged draft never re-mirrors, so focus at once; otherwise the\n // editor focuses itself right after it has shown the new text.\n if (next === current) store.focusEnd?.();\n else store.focusOnNextMirror = true;\n }\n athenaDiagnostics.emit('composer.handoff', {\n level: 'debug',\n data: { phase: 'applied', send: write.send, focus: write.focus, chars: next.length },\n });\n if (write.send) {\n return Promise.resolve(target.composer.send({ steer: false })).then(() => undefined);\n }\n return undefined;\n}\n\n/**\n * Hold a write until the composer is ready. Writes keep their order; a plain\n * append folds into a directly preceding plain append for the same thread\n * (one draft, not two), while a replace or a send is kept as its own step so\n * no message is lost and every send settles on its own.\n */\nexport function queueComposerWrite({\n store,\n write,\n}: {\n store: ComposerHandoffStore;\n write: ComposerWrite;\n}): void {\n const last = store.pending[store.pending.length - 1];\n const foldable =\n last !== undefined &&\n !last.send &&\n !write.send &&\n !write.replace &&\n last.threadId === write.threadId &&\n last.resolve === undefined &&\n write.resolve === undefined;\n if (foldable) {\n last.text = mergeComposerDraft({ current: last.text, write });\n last.focus = last.focus || write.focus;\n } else {\n store.pending.push(write);\n }\n athenaDiagnostics.emit('composer.handoff', {\n level: 'debug',\n data: { phase: 'deferred', send: write.send, focus: write.focus, queued: store.pending.length },\n });\n}\n\nfunction dropWrite({ write, reason }: { write: ComposerWrite; reason: string }): void {\n const error = new AthenaSdkError({\n code: 'composer_write_dropped',\n message: `A composer ${write.send ? 'send' : 'draft'} queued before the chat was ready was dropped: ${reason}.`,\n hint: 'Make the write again from the chat that is active now.',\n context: { threadId: write.threadId, send: write.send },\n });\n athenaDiagnostics.emit('composer.handoff', {\n level: 'warn',\n error,\n data: { phase: 'dropped', send: write.send, reason, threadId: write.threadId },\n });\n write.reject?.(error);\n}\n\n/**\n * Deliver the pending writes, in order, into a now-ready composer. A write\n * made for another thread is dropped (rejected), never applied here.\n */\nexport function drainComposerHandoff({\n store,\n target,\n threadId,\n}: {\n store: ComposerHandoffStore;\n target: ComposerTarget;\n /** The statewire thread of the mount that is draining. */\n threadId: string | null;\n}): void {\n const writes = store.pending;\n if (writes.length === 0) return;\n store.pending = [];\n for (const write of writes) {\n if (write.threadId !== null && threadId !== null && write.threadId !== threadId) {\n dropWrite({ write, reason: `it was made for thread ${write.threadId}, thread ${threadId} is active` });\n continue;\n }\n const outcome = applyComposerWrite({ target, store, write });\n write.resolve?.(outcome);\n }\n}\n\n/** Drop every pending write (identity changed, provider unmounted). */\nexport function clearComposerHandoff({\n store,\n reason,\n}: {\n store: ComposerHandoffStore;\n reason: string;\n}): void {\n // Another identity, or no provider: the attachments given back belong to drafts that are gone.\n store.restoredAttachments?.clear();\n const writes = store.pending;\n if (writes.length === 0) return;\n store.pending = [];\n for (const write of writes) dropWrite({ write, reason });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"composer-handoff.js","sources":["../../src/composer/composer-handoff.ts"],"sourcesContent":["/**\n * Composer handoff: writes to the chat composer from host UI that lives\n * outside `<AthenaChat>` (a sidebar, an agenda card, a workflow button).\n *\n * Two problems it solves for `useAppendToComposer` / `useSendMessage`:\n *\n * 1. A write before the chat is ready is lost. While the thread list is still\n * resolving the active thread, or the thread's history is still loading,\n * the composer the hooks write to belongs to a mount that is about to be\n * replaced (thread-list mode keys the statewire subtree by thread), and\n * the draft goes with it. The store below lives ABOVE that mount, so a\n * write made too early waits here and the ready mount drains it.\n * 2. A prefilled draft should put the caret after the text so the user can\n * keep typing or dictating. The Tiptap editor mirrors runtime text on a\n * later tick; the `focusOnNextMirror` flag asks it to focus at the end\n * right after that mirror lands, instead of the host guessing a delay.\n *\n * Every queued write is bound to the statewire thread it was made for and\n * drains only into that thread's mount; a thread switch, an identity change\n * or a provider unmount drops what waits with a `composer_write_dropped`\n * error, never into another user's or another thread's composer.\n */\nimport { createContext, useCallback, useContext } from 'react';\nimport { useAuiState } from '@assistant-ui/react';\nimport { autoComposerSendOptions, type ChatOutboxAttachment } from '@athenaintel/agent-runtime';\nimport { athenaDiagnostics } from '../diagnostics/athena-diagnostics';\nimport { AthenaSdkError } from '../diagnostics/errors';\nimport { useStatewireSessionLanePending } from '../runtime/statewire-session-lane';\nimport { useAthenaStatewireThreadList } from '../threads/statewire-thread-list';\n\n/** The slice of the assistant-ui client the handoff writes to. */\nexport interface ComposerTarget {\n composer: {\n getState: () => { text: string };\n setText: (text: string) => void;\n send: (options?: { steer?: boolean }) => unknown;\n };\n /** The thread the composer sends into; its running state picks the `auto` send. */\n thread?: () => { getState: () => { isRunning: boolean } };\n}\n\nexport interface ComposerWrite {\n text: string;\n /** Replace the draft instead of appending on a new line. */\n replace: boolean;\n /** Submit right after writing. */\n send: boolean;\n /** Put the caret at the end of the draft once the editor shows it. */\n focus: boolean;\n /** The statewire thread the write was made for; it drains only into that thread's mount. */\n threadId: string | null;\n /** Settled once the write has been applied (and, for `send`, with the send's outcome). */\n resolve?: (outcome: Promise<void> | void) => void;\n /** Settled with `composer_write_dropped` when the write can no longer land. */\n reject?: (error: AthenaSdkError) => void;\n}\n\nexport interface ComposerHandoffStore {\n /** Writes waiting for a ready composer, oldest first. Adjacent plain appends fold together. */\n pending: ComposerWrite[];\n /** Set by a `focus` write; the editor consumes it after mirroring the draft. */\n focusOnNextMirror: boolean;\n /** Registered by the mounted editor: place the caret at the end of the draft. */\n focusEnd: (() => void) | null;\n /** Set by `useFocusComposer` before the editor mounted; the editor consumes it when it does. */\n focusOnMount: boolean;\n /**\n * Per thread, the attachments of messages the chat outbox gave back to the composer (Cancel, or\n * Edit on one that couldn't be sent): files already in Athena, back in the draft as mentions. A\n * message held again from that draft names those still in it, so the outbox asks Athena about\n * them again before it goes ({@link rememberRestoredAttachments}, {@link takeRestoredAttachments}).\n */\n restoredAttachments?: Map<string, ChatOutboxAttachment[]>;\n}\n\nexport function createComposerHandoffStore(): ComposerHandoffStore {\n return {\n pending: [],\n focusOnNextMirror: false,\n focusEnd: null,\n focusOnMount: false,\n restoredAttachments: new Map(),\n };\n}\n\n/** A held message given back to `threadId`'s composer: remember the attachments it carried. */\nexport function rememberRestoredAttachments({\n store,\n threadId,\n attachments,\n}: {\n store: ComposerHandoffStore;\n threadId: string;\n attachments: readonly ChatOutboxAttachment[];\n}): void {\n if (attachments.length === 0) return;\n store.restoredAttachments ??= new Map();\n const kept = store.restoredAttachments.get(threadId) ?? [];\n const known = new Set(kept.map((attachment) => attachment.assetId));\n store.restoredAttachments.set(threadId, [\n ...kept,\n ...attachments.filter((attachment) => !known.has(attachment.assetId)),\n ]);\n}\n\n/**\n * The remembered attachments of `threadId`'s draft whose mentions it still holds, for the message\n * leaving it now; the composer forgets them all (sent, held again, or removed from the draft).\n */\nexport function takeRestoredAttachments({\n store,\n threadId,\n assetIdsInDraft,\n}: {\n store: ComposerHandoffStore | null;\n threadId: string;\n assetIdsInDraft: ReadonlySet<string>;\n}): ChatOutboxAttachment[] {\n const kept = store?.restoredAttachments?.get(threadId);\n if (!kept) return [];\n store?.restoredAttachments?.delete(threadId);\n return kept.filter((attachment) => assetIdsInDraft.has(attachment.assetId));\n}\n\nexport const ComposerHandoffContext = createContext<ComposerHandoffStore | null>(null);\n\n/** The provider's handoff store, or null outside `AthenaProvider`. */\nexport function useComposerHandoffStore(): ComposerHandoffStore | null {\n return useContext(ComposerHandoffContext);\n}\n\n/**\n * Puts the caret at the end of the composer's draft and leaves the draft as it is; asked before the\n * editor has mounted, it focuses the editor as it mounts. For a host that shows the chat again and\n * wants typing to land in it (a launcher window a shortcut brings back).\n */\nexport function useFocusComposer(): () => void {\n const store = useComposerHandoffStore();\n return useCallback(() => {\n if (store) focusComposer({ store });\n }, [store]);\n}\n\n/** The caret to the end of the draft now, or, with no editor mounted yet, as one mounts. */\nexport function focusComposer({ store }: { store: ComposerHandoffStore }): void {\n if (store.focusEnd) store.focusEnd();\n else store.focusOnMount = true;\n}\n\n/**\n * Whether a composer write lands now: in thread-list mode the list has\n * resolved which thread is active, that thread's history has loaded, and the\n * chat's session lane is known (the sign-in provider above has resolved who is\n * signed in; see `StatewireSessionLane`). Until then the composer the hooks\n * write to is the one of a mount that is about to be replaced, and the draft\n * goes with it, or a send would go into a parked lane that refuses it unsent.\n *\n * Deliberately not the socket status: a never-started chat sits in\n * `standby` until its first send and must still take a prefill.\n */\nexport function useComposerReady(): boolean {\n const list = useAthenaStatewireThreadList();\n const threadLoading = useAuiState((s) => s.optional.thread?.isLoading ?? false);\n const lanePending = useStatewireSessionLanePending();\n return !(list?.isLoading ?? false) && !threadLoading && !lanePending;\n}\n\n/** The draft after `write`: `replace` (or an empty draft) takes the text as is. */\nexport function mergeComposerDraft({\n current,\n write,\n}: {\n current: string;\n write: Pick<ComposerWrite, 'text' | 'replace'>;\n}): string {\n if (write.replace || !current) return write.text;\n return `${current}\\n${write.text}`;\n}\n\n/**\n * Write into the live composer. Returns the send's outcome for a `send`\n * write so callers can await it.\n */\nexport function applyComposerWrite({\n target,\n store,\n write,\n}: {\n target: ComposerTarget;\n store: ComposerHandoffStore | null;\n write: ComposerWrite;\n}): Promise<void> | void {\n const current = target.composer.getState().text ?? '';\n const next = mergeComposerDraft({ current, write });\n target.composer.setText(next);\n if (write.focus && store) {\n // An unchanged draft never re-mirrors, so focus at once; otherwise the\n // editor focuses itself right after it has shown the new text.\n if (next === current) store.focusEnd?.();\n else store.focusOnNextMirror = true;\n }\n athenaDiagnostics.emit('composer.handoff', {\n level: 'debug',\n data: { phase: 'applied', send: write.send, focus: write.focus, chars: next.length },\n });\n if (write.send) {\n const isRunning = target.thread?.().getState().isRunning ?? false;\n return Promise.resolve(target.composer.send(autoComposerSendOptions(isRunning))).then(\n () => undefined,\n );\n }\n return undefined;\n}\n\n/**\n * Hold a write until the composer is ready. Writes keep their order; a plain\n * append folds into a directly preceding plain append for the same thread\n * (one draft, not two), while a replace or a send is kept as its own step so\n * no message is lost and every send settles on its own.\n */\nexport function queueComposerWrite({\n store,\n write,\n}: {\n store: ComposerHandoffStore;\n write: ComposerWrite;\n}): void {\n const last = store.pending[store.pending.length - 1];\n const foldable =\n last !== undefined &&\n !last.send &&\n !write.send &&\n !write.replace &&\n last.threadId === write.threadId &&\n last.resolve === undefined &&\n write.resolve === undefined;\n if (foldable) {\n last.text = mergeComposerDraft({ current: last.text, write });\n last.focus = last.focus || write.focus;\n } else {\n store.pending.push(write);\n }\n athenaDiagnostics.emit('composer.handoff', {\n level: 'debug',\n data: { phase: 'deferred', send: write.send, focus: write.focus, queued: store.pending.length },\n });\n}\n\nfunction dropWrite({ write, reason }: { write: ComposerWrite; reason: string }): void {\n const error = new AthenaSdkError({\n code: 'composer_write_dropped',\n message: `A composer ${write.send ? 'send' : 'draft'} queued before the chat was ready was dropped: ${reason}.`,\n hint: 'Make the write again from the chat that is active now.',\n context: { threadId: write.threadId, send: write.send },\n });\n athenaDiagnostics.emit('composer.handoff', {\n level: 'warn',\n error,\n data: { phase: 'dropped', send: write.send, reason, threadId: write.threadId },\n });\n write.reject?.(error);\n}\n\n/**\n * Deliver the pending writes, in order, into a now-ready composer. A write\n * made for another thread is dropped (rejected), never applied here.\n */\nexport function drainComposerHandoff({\n store,\n target,\n threadId,\n}: {\n store: ComposerHandoffStore;\n target: ComposerTarget;\n /** The statewire thread of the mount that is draining. */\n threadId: string | null;\n}): void {\n const writes = store.pending;\n if (writes.length === 0) return;\n store.pending = [];\n for (const write of writes) {\n if (write.threadId !== null && threadId !== null && write.threadId !== threadId) {\n dropWrite({ write, reason: `it was made for thread ${write.threadId}, thread ${threadId} is active` });\n continue;\n }\n const outcome = applyComposerWrite({ target, store, write });\n write.resolve?.(outcome);\n }\n}\n\n/** Drop every pending write (identity changed, provider unmounted). */\nexport function clearComposerHandoff({\n store,\n reason,\n}: {\n store: ComposerHandoffStore;\n reason: string;\n}): void {\n // Another identity, or no provider: the attachments given back belong to drafts that are gone.\n store.restoredAttachments?.clear();\n const writes = store.pending;\n if (writes.length === 0) return;\n store.pending = [];\n for (const write of writes) dropWrite({ write, reason });\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiClient = require("../chat-ui/mentions/suggestions/data/api-client.cjs");
4
+ const FOLDER_UPLOAD_PATH = "/api/upload/async";
5
+ const FOLDER_UPLOAD_DEADLINE_MS = 15 * 60 * 1e3;
6
+ const FOLDER_UPLOAD_POLL_MIN_MS = 250;
7
+ const FOLDER_UPLOAD_POLL_MAX_MS = 2e3;
8
+ const ASYNC_UPLOAD_TASK_QUERY = `
9
+ query AthenaAsyncUploadTask($taskId: String!) {
10
+ asyncUploadTask(taskId: $taskId) {
11
+ taskId
12
+ status
13
+ requestedCount
14
+ processedCount
15
+ uploadedCount
16
+ failedCount
17
+ message
18
+ results {
19
+ fileIndex
20
+ filename
21
+ status
22
+ message
23
+ assetId
24
+ }
25
+ }
26
+ }
27
+ `;
28
+ const ENDED = /* @__PURE__ */ new Set(["completed", "failed", "cancelled"]);
29
+ function folderUploadPollDelayMs(attempt) {
30
+ return Math.min(FOLDER_UPLOAD_POLL_MIN_MS * 2 ** attempt, FOLDER_UPLOAD_POLL_MAX_MS);
31
+ }
32
+ function folderUploadForm({
33
+ files,
34
+ parentFolderId
35
+ }) {
36
+ const form = new FormData();
37
+ for (const file of files) form.append("files", file, file.name);
38
+ form.append("parent_folder_id", parentFolderId);
39
+ return form;
40
+ }
41
+ function taskIdOf(body) {
42
+ const camel = Reflect.get(Object(body), "taskId");
43
+ if (typeof camel === "string" && camel) return camel;
44
+ const snake = Reflect.get(Object(body), "task_id");
45
+ return typeof snake === "string" && snake ? snake : null;
46
+ }
47
+ async function refusalDetail(response) {
48
+ const body = await response.json().catch(() => null);
49
+ const detail = Reflect.get(Object(body), "detail");
50
+ return typeof detail === "string" && detail ? detail : null;
51
+ }
52
+ function folderUploadResultOf({
53
+ task,
54
+ files
55
+ }) {
56
+ const uploaded = [];
57
+ const failed = [];
58
+ const answered = /* @__PURE__ */ new Set();
59
+ for (const result of task.results) {
60
+ answered.add(result.fileIndex);
61
+ const file = files[result.fileIndex];
62
+ if (result.status === "uploaded" && result.assetId) {
63
+ uploaded.push({
64
+ id: result.assetId,
65
+ title: result.filename,
66
+ fileName: result.filename,
67
+ fileSize: (file == null ? void 0 : file.size) ?? 0,
68
+ mediaType: (file == null ? void 0 : file.type) || "application/octet-stream",
69
+ fileIndex: result.fileIndex
70
+ });
71
+ } else {
72
+ failed.push({ fileName: result.filename, error: result.message || "Upload failed" });
73
+ }
74
+ }
75
+ files.forEach((file, index) => {
76
+ if (answered.has(index)) return;
77
+ failed.push({ fileName: file.name, error: task.message || `Upload ${task.status}` });
78
+ });
79
+ return { uploaded, failed };
80
+ }
81
+ function wait(ms, signal) {
82
+ return new Promise((resolve, reject) => {
83
+ if (signal == null ? void 0 : signal.aborted) {
84
+ reject(new DOMException("Upload cancelled", "AbortError"));
85
+ return;
86
+ }
87
+ const timer = setTimeout(() => {
88
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
89
+ resolve();
90
+ }, ms);
91
+ const onAbort = () => {
92
+ clearTimeout(timer);
93
+ reject(new DOMException("Upload cancelled", "AbortError"));
94
+ };
95
+ signal == null ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
96
+ });
97
+ }
98
+ async function waitForFolderUploadTask({
99
+ auth,
100
+ taskId,
101
+ signal,
102
+ deadlineMs = FOLDER_UPLOAD_DEADLINE_MS,
103
+ now = Date.now,
104
+ sleep = (ms) => wait(ms, signal)
105
+ }) {
106
+ const startedAt = now();
107
+ for (let attempt = 0; ; attempt += 1) {
108
+ const data = await apiClient.fetchGraphQL(
109
+ auth,
110
+ ASYNC_UPLOAD_TASK_QUERY,
111
+ { taskId },
112
+ { signal }
113
+ );
114
+ const task = data.asyncUploadTask;
115
+ if (!task) throw new Error("Athena no longer knows this upload.");
116
+ if (ENDED.has(task.status)) return task;
117
+ if (now() - startedAt >= deadlineMs) {
118
+ throw new Error("The upload is taking too long; it may still finish in Athena.");
119
+ }
120
+ await sleep(folderUploadPollDelayMs(attempt));
121
+ }
122
+ }
123
+ async function startFolderUpload({
124
+ send,
125
+ files,
126
+ parentFolderId
127
+ }) {
128
+ const response = await send(folderUploadForm({ files, parentFolderId }));
129
+ if (!response.ok) {
130
+ const detail = await refusalDetail(response);
131
+ if (response.status === 401 || response.status === 403) {
132
+ throw new Error(detail ?? "You can’t add files to this folder.");
133
+ }
134
+ if (response.status === 404) throw new Error(detail ?? "That folder is no longer there.");
135
+ throw new Error(detail ?? `Upload failed with status ${response.status}`);
136
+ }
137
+ const taskId = taskIdOf(await response.json().catch(() => null));
138
+ if (!taskId) throw new Error("Athena did not start the upload.");
139
+ return taskId;
140
+ }
141
+ exports.ASYNC_UPLOAD_TASK_QUERY = ASYNC_UPLOAD_TASK_QUERY;
142
+ exports.FOLDER_UPLOAD_DEADLINE_MS = FOLDER_UPLOAD_DEADLINE_MS;
143
+ exports.FOLDER_UPLOAD_PATH = FOLDER_UPLOAD_PATH;
144
+ exports.folderUploadForm = folderUploadForm;
145
+ exports.folderUploadPollDelayMs = folderUploadPollDelayMs;
146
+ exports.folderUploadResultOf = folderUploadResultOf;
147
+ exports.startFolderUpload = startFolderUpload;
148
+ exports.waitForFolderUploadTask = waitForFolderUploadTask;
149
+ //# sourceMappingURL=folder-upload.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-upload.cjs","sources":["../../src/composer/folder-upload.ts"],"sourcesContent":["/**\n * Uploading files into a folder. agora's quick upload (`POST /api/upload/`) files what it takes at\n * the workspace's root; its async upload (`POST /api/upload/async`) takes a destination,\n * `parent_folder_id`, and authorizes EDIT on that folder before it stages a byte\n * (`_require_upload_destination`: the folder's permission check, then its ABAC edit gate), so a\n * folder the person may only view, or may not open, refuses the whole upload. The task it starts is\n * then read through GraphQL (`asyncUploadTask`, answered only for the caller's current workspace)\n * until it ends, at most `FOLDER_UPLOAD_DEADLINE_MS`.\n */\nimport {\n fetchGraphQL,\n type MentionAuthContext,\n} from '../chat-ui/mentions/suggestions/data/api-client';\nimport type { UploadedAsset } from './useFileUpload';\n\n/** agora's async upload route, under the API base. */\nexport const FOLDER_UPLOAD_PATH = '/api/upload/async';\n\n/** How long an upload's task is read before the upload gives up on it (it may still finish). */\nexport const FOLDER_UPLOAD_DEADLINE_MS = 15 * 60 * 1000;\n/** The first wait before the task is read again, doubling to `FOLDER_UPLOAD_POLL_MAX_MS`. */\nconst FOLDER_UPLOAD_POLL_MIN_MS = 250;\nconst FOLDER_UPLOAD_POLL_MAX_MS = 2_000;\n\nexport const ASYNC_UPLOAD_TASK_QUERY = `\n query AthenaAsyncUploadTask($taskId: String!) {\n asyncUploadTask(taskId: $taskId) {\n taskId\n status\n requestedCount\n processedCount\n uploadedCount\n failedCount\n message\n results {\n fileIndex\n filename\n status\n message\n assetId\n }\n }\n }\n`;\n\n/** The states an upload task ends in. */\nconst ENDED: ReadonlySet<string> = new Set(['completed', 'failed', 'cancelled']);\n\nexport interface FolderUploadTask {\n taskId: string;\n status: string;\n requestedCount: number;\n processedCount: number;\n uploadedCount: number;\n failedCount: number;\n message: string | null;\n results: Array<{\n fileIndex: number;\n filename: string;\n status: string;\n message: string;\n assetId: string | null;\n }>;\n}\n\n/** What an upload into a folder made, and what it could not. */\nexport interface FolderUploadResult {\n uploaded: UploadedAsset[];\n failed: Array<{ fileName: string; error: string }>;\n}\n\n/** The wait before the `attempt`th read of the task (0-indexed), doubling to its cap. */\nexport function folderUploadPollDelayMs(attempt: number): number {\n return Math.min(FOLDER_UPLOAD_POLL_MIN_MS * 2 ** attempt, FOLDER_UPLOAD_POLL_MAX_MS);\n}\n\n/** The upload's form: every file, and the folder they go into. */\nexport function folderUploadForm({\n files,\n parentFolderId,\n}: {\n files: readonly File[];\n parentFolderId: string;\n}): FormData {\n const form = new FormData();\n for (const file of files) form.append('files', file, file.name);\n form.append('parent_folder_id', parentFolderId);\n return form;\n}\n\n/** The task id agora's answer names (`taskId`; `task_id` from an agora that answers snake_case). */\nfunction taskIdOf(body: unknown): string | null {\n const camel: unknown = Reflect.get(Object(body), 'taskId');\n if (typeof camel === 'string' && camel) return camel;\n const snake: unknown = Reflect.get(Object(body), 'task_id');\n return typeof snake === 'string' && snake ? snake : null;\n}\n\n/** agora's `detail` for a refused upload, when it gave one. */\nasync function refusalDetail(response: Response): Promise<string | null> {\n const body: unknown = await response.json().catch(() => null);\n const detail: unknown = Reflect.get(Object(body), 'detail');\n return typeof detail === 'string' && detail ? detail : null;\n}\n\n/**\n * What the task made, file by file: each uploaded file as the asset it became (named and sized\n * from the file sent), each failed one with agora's reason, and a task that ended without a result\n * for a file (cancelled, or failed as a whole) with the task's message.\n */\nexport function folderUploadResultOf({\n task,\n files,\n}: {\n task: FolderUploadTask;\n files: readonly File[];\n}): FolderUploadResult {\n const uploaded: UploadedAsset[] = [];\n const failed: FolderUploadResult['failed'] = [];\n const answered = new Set<number>();\n for (const result of task.results) {\n answered.add(result.fileIndex);\n const file = files[result.fileIndex];\n if (result.status === 'uploaded' && result.assetId) {\n uploaded.push({\n id: result.assetId,\n title: result.filename,\n fileName: result.filename,\n fileSize: file?.size ?? 0,\n mediaType: file?.type || 'application/octet-stream',\n fileIndex: result.fileIndex,\n });\n } else {\n failed.push({ fileName: result.filename, error: result.message || 'Upload failed' });\n }\n }\n files.forEach((file, index) => {\n if (answered.has(index)) return;\n failed.push({ fileName: file.name, error: task.message || `Upload ${task.status}` });\n });\n return { uploaded, failed };\n}\n\n/** Waits `ms`, or rejects at once when `signal` aborts. */\nfunction wait(ms: number, signal: AbortSignal | undefined): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('Upload cancelled', 'AbortError'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new DOMException('Upload cancelled', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Reads the task until it ends: at once, then after waits that double from 250 ms to 2 s. A task\n * agora no longer names (another workspace, or gone) and one that has not ended by the deadline\n * fail the upload; what the task did by then stays done.\n */\nexport async function waitForFolderUploadTask({\n auth,\n taskId,\n signal,\n deadlineMs = FOLDER_UPLOAD_DEADLINE_MS,\n now = Date.now,\n sleep = (ms) => wait(ms, signal),\n}: {\n auth: MentionAuthContext;\n taskId: string;\n signal?: AbortSignal;\n deadlineMs?: number;\n now?: () => number;\n sleep?: (ms: number) => Promise<void>;\n}): Promise<FolderUploadTask> {\n const startedAt = now();\n for (let attempt = 0; ; attempt += 1) {\n const data = await fetchGraphQL<{ asyncUploadTask: FolderUploadTask | null }>(\n auth,\n ASYNC_UPLOAD_TASK_QUERY,\n { taskId },\n { signal },\n );\n const task = data.asyncUploadTask;\n if (!task) throw new Error('Athena no longer knows this upload.');\n if (ENDED.has(task.status)) return task;\n if (now() - startedAt >= deadlineMs) {\n throw new Error('The upload is taking too long; it may still finish in Athena.');\n }\n await sleep(folderUploadPollDelayMs(attempt));\n }\n}\n\n/**\n * Starts an upload of `files` into `parentFolderId` (agora's async upload, which refuses a folder\n * the caller may not edit before it takes any file), as `send` posts it, and answers its task id.\n */\nexport async function startFolderUpload({\n send,\n files,\n parentFolderId,\n}: {\n /** Posts the form to `FOLDER_UPLOAD_PATH` with the credential (and the byte progress). */\n send: (form: FormData) => Promise<Response>;\n files: readonly File[];\n parentFolderId: string;\n}): Promise<string> {\n const response = await send(folderUploadForm({ files, parentFolderId }));\n if (!response.ok) {\n const detail = await refusalDetail(response);\n if (response.status === 401 || response.status === 403) {\n throw new Error(detail ?? 'You can’t add files to this folder.');\n }\n if (response.status === 404) throw new Error(detail ?? 'That folder is no longer there.');\n throw new Error(detail ?? `Upload failed with status ${response.status}`);\n }\n const taskId = taskIdOf(await response.json().catch(() => null));\n if (!taskId) throw new Error('Athena did not start the upload.');\n return taskId;\n}\n"],"names":["fetchGraphQL"],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Uploading files into a folder. agora's quick upload (`POST /api/upload/`) files what it takes at
3
+ * the workspace's root; its async upload (`POST /api/upload/async`) takes a destination,
4
+ * `parent_folder_id`, and authorizes EDIT on that folder before it stages a byte
5
+ * (`_require_upload_destination`: the folder's permission check, then its ABAC edit gate), so a
6
+ * folder the person may only view, or may not open, refuses the whole upload. The task it starts is
7
+ * then read through GraphQL (`asyncUploadTask`, answered only for the caller's current workspace)
8
+ * until it ends, at most `FOLDER_UPLOAD_DEADLINE_MS`.
9
+ */
10
+ import { type MentionAuthContext } from '../chat-ui/mentions/suggestions/data/api-client';
11
+ import type { UploadedAsset } from './useFileUpload';
12
+ /** agora's async upload route, under the API base. */
13
+ export declare const FOLDER_UPLOAD_PATH = "/api/upload/async";
14
+ /** How long an upload's task is read before the upload gives up on it (it may still finish). */
15
+ export declare const FOLDER_UPLOAD_DEADLINE_MS: number;
16
+ export declare const ASYNC_UPLOAD_TASK_QUERY = "\n query AthenaAsyncUploadTask($taskId: String!) {\n asyncUploadTask(taskId: $taskId) {\n taskId\n status\n requestedCount\n processedCount\n uploadedCount\n failedCount\n message\n results {\n fileIndex\n filename\n status\n message\n assetId\n }\n }\n }\n";
17
+ export interface FolderUploadTask {
18
+ taskId: string;
19
+ status: string;
20
+ requestedCount: number;
21
+ processedCount: number;
22
+ uploadedCount: number;
23
+ failedCount: number;
24
+ message: string | null;
25
+ results: Array<{
26
+ fileIndex: number;
27
+ filename: string;
28
+ status: string;
29
+ message: string;
30
+ assetId: string | null;
31
+ }>;
32
+ }
33
+ /** What an upload into a folder made, and what it could not. */
34
+ export interface FolderUploadResult {
35
+ uploaded: UploadedAsset[];
36
+ failed: Array<{
37
+ fileName: string;
38
+ error: string;
39
+ }>;
40
+ }
41
+ /** The wait before the `attempt`th read of the task (0-indexed), doubling to its cap. */
42
+ export declare function folderUploadPollDelayMs(attempt: number): number;
43
+ /** The upload's form: every file, and the folder they go into. */
44
+ export declare function folderUploadForm({ files, parentFolderId, }: {
45
+ files: readonly File[];
46
+ parentFolderId: string;
47
+ }): FormData;
48
+ /**
49
+ * What the task made, file by file: each uploaded file as the asset it became (named and sized
50
+ * from the file sent), each failed one with agora's reason, and a task that ended without a result
51
+ * for a file (cancelled, or failed as a whole) with the task's message.
52
+ */
53
+ export declare function folderUploadResultOf({ task, files, }: {
54
+ task: FolderUploadTask;
55
+ files: readonly File[];
56
+ }): FolderUploadResult;
57
+ /**
58
+ * Reads the task until it ends: at once, then after waits that double from 250 ms to 2 s. A task
59
+ * agora no longer names (another workspace, or gone) and one that has not ended by the deadline
60
+ * fail the upload; what the task did by then stays done.
61
+ */
62
+ export declare function waitForFolderUploadTask({ auth, taskId, signal, deadlineMs, now, sleep, }: {
63
+ auth: MentionAuthContext;
64
+ taskId: string;
65
+ signal?: AbortSignal;
66
+ deadlineMs?: number;
67
+ now?: () => number;
68
+ sleep?: (ms: number) => Promise<void>;
69
+ }): Promise<FolderUploadTask>;
70
+ /**
71
+ * Starts an upload of `files` into `parentFolderId` (agora's async upload, which refuses a folder
72
+ * the caller may not edit before it takes any file), as `send` posts it, and answers its task id.
73
+ */
74
+ export declare function startFolderUpload({ send, files, parentFolderId, }: {
75
+ /** Posts the form to `FOLDER_UPLOAD_PATH` with the credential (and the byte progress). */
76
+ send: (form: FormData) => Promise<Response>;
77
+ files: readonly File[];
78
+ parentFolderId: string;
79
+ }): Promise<string>;
@@ -0,0 +1,149 @@
1
+ import { fetchGraphQL } from "../chat-ui/mentions/suggestions/data/api-client.js";
2
+ const FOLDER_UPLOAD_PATH = "/api/upload/async";
3
+ const FOLDER_UPLOAD_DEADLINE_MS = 15 * 60 * 1e3;
4
+ const FOLDER_UPLOAD_POLL_MIN_MS = 250;
5
+ const FOLDER_UPLOAD_POLL_MAX_MS = 2e3;
6
+ const ASYNC_UPLOAD_TASK_QUERY = `
7
+ query AthenaAsyncUploadTask($taskId: String!) {
8
+ asyncUploadTask(taskId: $taskId) {
9
+ taskId
10
+ status
11
+ requestedCount
12
+ processedCount
13
+ uploadedCount
14
+ failedCount
15
+ message
16
+ results {
17
+ fileIndex
18
+ filename
19
+ status
20
+ message
21
+ assetId
22
+ }
23
+ }
24
+ }
25
+ `;
26
+ const ENDED = /* @__PURE__ */ new Set(["completed", "failed", "cancelled"]);
27
+ function folderUploadPollDelayMs(attempt) {
28
+ return Math.min(FOLDER_UPLOAD_POLL_MIN_MS * 2 ** attempt, FOLDER_UPLOAD_POLL_MAX_MS);
29
+ }
30
+ function folderUploadForm({
31
+ files,
32
+ parentFolderId
33
+ }) {
34
+ const form = new FormData();
35
+ for (const file of files) form.append("files", file, file.name);
36
+ form.append("parent_folder_id", parentFolderId);
37
+ return form;
38
+ }
39
+ function taskIdOf(body) {
40
+ const camel = Reflect.get(Object(body), "taskId");
41
+ if (typeof camel === "string" && camel) return camel;
42
+ const snake = Reflect.get(Object(body), "task_id");
43
+ return typeof snake === "string" && snake ? snake : null;
44
+ }
45
+ async function refusalDetail(response) {
46
+ const body = await response.json().catch(() => null);
47
+ const detail = Reflect.get(Object(body), "detail");
48
+ return typeof detail === "string" && detail ? detail : null;
49
+ }
50
+ function folderUploadResultOf({
51
+ task,
52
+ files
53
+ }) {
54
+ const uploaded = [];
55
+ const failed = [];
56
+ const answered = /* @__PURE__ */ new Set();
57
+ for (const result of task.results) {
58
+ answered.add(result.fileIndex);
59
+ const file = files[result.fileIndex];
60
+ if (result.status === "uploaded" && result.assetId) {
61
+ uploaded.push({
62
+ id: result.assetId,
63
+ title: result.filename,
64
+ fileName: result.filename,
65
+ fileSize: (file == null ? void 0 : file.size) ?? 0,
66
+ mediaType: (file == null ? void 0 : file.type) || "application/octet-stream",
67
+ fileIndex: result.fileIndex
68
+ });
69
+ } else {
70
+ failed.push({ fileName: result.filename, error: result.message || "Upload failed" });
71
+ }
72
+ }
73
+ files.forEach((file, index) => {
74
+ if (answered.has(index)) return;
75
+ failed.push({ fileName: file.name, error: task.message || `Upload ${task.status}` });
76
+ });
77
+ return { uploaded, failed };
78
+ }
79
+ function wait(ms, signal) {
80
+ return new Promise((resolve, reject) => {
81
+ if (signal == null ? void 0 : signal.aborted) {
82
+ reject(new DOMException("Upload cancelled", "AbortError"));
83
+ return;
84
+ }
85
+ const timer = setTimeout(() => {
86
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
87
+ resolve();
88
+ }, ms);
89
+ const onAbort = () => {
90
+ clearTimeout(timer);
91
+ reject(new DOMException("Upload cancelled", "AbortError"));
92
+ };
93
+ signal == null ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
94
+ });
95
+ }
96
+ async function waitForFolderUploadTask({
97
+ auth,
98
+ taskId,
99
+ signal,
100
+ deadlineMs = FOLDER_UPLOAD_DEADLINE_MS,
101
+ now = Date.now,
102
+ sleep = (ms) => wait(ms, signal)
103
+ }) {
104
+ const startedAt = now();
105
+ for (let attempt = 0; ; attempt += 1) {
106
+ const data = await fetchGraphQL(
107
+ auth,
108
+ ASYNC_UPLOAD_TASK_QUERY,
109
+ { taskId },
110
+ { signal }
111
+ );
112
+ const task = data.asyncUploadTask;
113
+ if (!task) throw new Error("Athena no longer knows this upload.");
114
+ if (ENDED.has(task.status)) return task;
115
+ if (now() - startedAt >= deadlineMs) {
116
+ throw new Error("The upload is taking too long; it may still finish in Athena.");
117
+ }
118
+ await sleep(folderUploadPollDelayMs(attempt));
119
+ }
120
+ }
121
+ async function startFolderUpload({
122
+ send,
123
+ files,
124
+ parentFolderId
125
+ }) {
126
+ const response = await send(folderUploadForm({ files, parentFolderId }));
127
+ if (!response.ok) {
128
+ const detail = await refusalDetail(response);
129
+ if (response.status === 401 || response.status === 403) {
130
+ throw new Error(detail ?? "You can’t add files to this folder.");
131
+ }
132
+ if (response.status === 404) throw new Error(detail ?? "That folder is no longer there.");
133
+ throw new Error(detail ?? `Upload failed with status ${response.status}`);
134
+ }
135
+ const taskId = taskIdOf(await response.json().catch(() => null));
136
+ if (!taskId) throw new Error("Athena did not start the upload.");
137
+ return taskId;
138
+ }
139
+ export {
140
+ ASYNC_UPLOAD_TASK_QUERY,
141
+ FOLDER_UPLOAD_DEADLINE_MS,
142
+ FOLDER_UPLOAD_PATH,
143
+ folderUploadForm,
144
+ folderUploadPollDelayMs,
145
+ folderUploadResultOf,
146
+ startFolderUpload,
147
+ waitForFolderUploadTask
148
+ };
149
+ //# sourceMappingURL=folder-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-upload.js","sources":["../../src/composer/folder-upload.ts"],"sourcesContent":["/**\n * Uploading files into a folder. agora's quick upload (`POST /api/upload/`) files what it takes at\n * the workspace's root; its async upload (`POST /api/upload/async`) takes a destination,\n * `parent_folder_id`, and authorizes EDIT on that folder before it stages a byte\n * (`_require_upload_destination`: the folder's permission check, then its ABAC edit gate), so a\n * folder the person may only view, or may not open, refuses the whole upload. The task it starts is\n * then read through GraphQL (`asyncUploadTask`, answered only for the caller's current workspace)\n * until it ends, at most `FOLDER_UPLOAD_DEADLINE_MS`.\n */\nimport {\n fetchGraphQL,\n type MentionAuthContext,\n} from '../chat-ui/mentions/suggestions/data/api-client';\nimport type { UploadedAsset } from './useFileUpload';\n\n/** agora's async upload route, under the API base. */\nexport const FOLDER_UPLOAD_PATH = '/api/upload/async';\n\n/** How long an upload's task is read before the upload gives up on it (it may still finish). */\nexport const FOLDER_UPLOAD_DEADLINE_MS = 15 * 60 * 1000;\n/** The first wait before the task is read again, doubling to `FOLDER_UPLOAD_POLL_MAX_MS`. */\nconst FOLDER_UPLOAD_POLL_MIN_MS = 250;\nconst FOLDER_UPLOAD_POLL_MAX_MS = 2_000;\n\nexport const ASYNC_UPLOAD_TASK_QUERY = `\n query AthenaAsyncUploadTask($taskId: String!) {\n asyncUploadTask(taskId: $taskId) {\n taskId\n status\n requestedCount\n processedCount\n uploadedCount\n failedCount\n message\n results {\n fileIndex\n filename\n status\n message\n assetId\n }\n }\n }\n`;\n\n/** The states an upload task ends in. */\nconst ENDED: ReadonlySet<string> = new Set(['completed', 'failed', 'cancelled']);\n\nexport interface FolderUploadTask {\n taskId: string;\n status: string;\n requestedCount: number;\n processedCount: number;\n uploadedCount: number;\n failedCount: number;\n message: string | null;\n results: Array<{\n fileIndex: number;\n filename: string;\n status: string;\n message: string;\n assetId: string | null;\n }>;\n}\n\n/** What an upload into a folder made, and what it could not. */\nexport interface FolderUploadResult {\n uploaded: UploadedAsset[];\n failed: Array<{ fileName: string; error: string }>;\n}\n\n/** The wait before the `attempt`th read of the task (0-indexed), doubling to its cap. */\nexport function folderUploadPollDelayMs(attempt: number): number {\n return Math.min(FOLDER_UPLOAD_POLL_MIN_MS * 2 ** attempt, FOLDER_UPLOAD_POLL_MAX_MS);\n}\n\n/** The upload's form: every file, and the folder they go into. */\nexport function folderUploadForm({\n files,\n parentFolderId,\n}: {\n files: readonly File[];\n parentFolderId: string;\n}): FormData {\n const form = new FormData();\n for (const file of files) form.append('files', file, file.name);\n form.append('parent_folder_id', parentFolderId);\n return form;\n}\n\n/** The task id agora's answer names (`taskId`; `task_id` from an agora that answers snake_case). */\nfunction taskIdOf(body: unknown): string | null {\n const camel: unknown = Reflect.get(Object(body), 'taskId');\n if (typeof camel === 'string' && camel) return camel;\n const snake: unknown = Reflect.get(Object(body), 'task_id');\n return typeof snake === 'string' && snake ? snake : null;\n}\n\n/** agora's `detail` for a refused upload, when it gave one. */\nasync function refusalDetail(response: Response): Promise<string | null> {\n const body: unknown = await response.json().catch(() => null);\n const detail: unknown = Reflect.get(Object(body), 'detail');\n return typeof detail === 'string' && detail ? detail : null;\n}\n\n/**\n * What the task made, file by file: each uploaded file as the asset it became (named and sized\n * from the file sent), each failed one with agora's reason, and a task that ended without a result\n * for a file (cancelled, or failed as a whole) with the task's message.\n */\nexport function folderUploadResultOf({\n task,\n files,\n}: {\n task: FolderUploadTask;\n files: readonly File[];\n}): FolderUploadResult {\n const uploaded: UploadedAsset[] = [];\n const failed: FolderUploadResult['failed'] = [];\n const answered = new Set<number>();\n for (const result of task.results) {\n answered.add(result.fileIndex);\n const file = files[result.fileIndex];\n if (result.status === 'uploaded' && result.assetId) {\n uploaded.push({\n id: result.assetId,\n title: result.filename,\n fileName: result.filename,\n fileSize: file?.size ?? 0,\n mediaType: file?.type || 'application/octet-stream',\n fileIndex: result.fileIndex,\n });\n } else {\n failed.push({ fileName: result.filename, error: result.message || 'Upload failed' });\n }\n }\n files.forEach((file, index) => {\n if (answered.has(index)) return;\n failed.push({ fileName: file.name, error: task.message || `Upload ${task.status}` });\n });\n return { uploaded, failed };\n}\n\n/** Waits `ms`, or rejects at once when `signal` aborts. */\nfunction wait(ms: number, signal: AbortSignal | undefined): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('Upload cancelled', 'AbortError'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new DOMException('Upload cancelled', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Reads the task until it ends: at once, then after waits that double from 250 ms to 2 s. A task\n * agora no longer names (another workspace, or gone) and one that has not ended by the deadline\n * fail the upload; what the task did by then stays done.\n */\nexport async function waitForFolderUploadTask({\n auth,\n taskId,\n signal,\n deadlineMs = FOLDER_UPLOAD_DEADLINE_MS,\n now = Date.now,\n sleep = (ms) => wait(ms, signal),\n}: {\n auth: MentionAuthContext;\n taskId: string;\n signal?: AbortSignal;\n deadlineMs?: number;\n now?: () => number;\n sleep?: (ms: number) => Promise<void>;\n}): Promise<FolderUploadTask> {\n const startedAt = now();\n for (let attempt = 0; ; attempt += 1) {\n const data = await fetchGraphQL<{ asyncUploadTask: FolderUploadTask | null }>(\n auth,\n ASYNC_UPLOAD_TASK_QUERY,\n { taskId },\n { signal },\n );\n const task = data.asyncUploadTask;\n if (!task) throw new Error('Athena no longer knows this upload.');\n if (ENDED.has(task.status)) return task;\n if (now() - startedAt >= deadlineMs) {\n throw new Error('The upload is taking too long; it may still finish in Athena.');\n }\n await sleep(folderUploadPollDelayMs(attempt));\n }\n}\n\n/**\n * Starts an upload of `files` into `parentFolderId` (agora's async upload, which refuses a folder\n * the caller may not edit before it takes any file), as `send` posts it, and answers its task id.\n */\nexport async function startFolderUpload({\n send,\n files,\n parentFolderId,\n}: {\n /** Posts the form to `FOLDER_UPLOAD_PATH` with the credential (and the byte progress). */\n send: (form: FormData) => Promise<Response>;\n files: readonly File[];\n parentFolderId: string;\n}): Promise<string> {\n const response = await send(folderUploadForm({ files, parentFolderId }));\n if (!response.ok) {\n const detail = await refusalDetail(response);\n if (response.status === 401 || response.status === 403) {\n throw new Error(detail ?? 'You can’t add files to this folder.');\n }\n if (response.status === 404) throw new Error(detail ?? 'That folder is no longer there.');\n throw new Error(detail ?? `Upload failed with status ${response.status}`);\n }\n const taskId = taskIdOf(await response.json().catch(() => null));\n if (!taskId) throw new Error('Athena did not start the upload.');\n return taskId;\n}\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export { useComposerReady, useFocusComposer } from './composer-handoff';
6
6
  export { useReadComposerDraft, useTryReadComposerDraft } from './useReadComposerDraft';
7
7
  export { useComposerAttachment } from './useComposerAttachment';
8
8
  export { useFileUpload } from './useFileUpload';
9
- export type { UploadedAsset, UploadProgress, UseFileUploadReturn } from './useFileUpload';
9
+ export type { UploadedAsset, UploadOptions, UploadProgress, UploadRefusal, UseFileUploadReturn, } from './useFileUpload';
10
10
  export { FileUploadButton } from './FileUploadButton';
11
11
  export type { FileUploadButtonProps } from './FileUploadButton';
12
12
  export { ComposerQuotePreview } from './ComposerQuotePreview';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const namedAgents = require("../agent-runtime/src/named-agents.cjs");
4
+ const attachedReferences = require("./attached-references.cjs");
5
+ const composerMarkdown = require("../agent-runtime/src/composer-markdown.cjs");
6
+ function takeStagedMessageMetadata(threadId) {
7
+ const metadata = attachedReferences.withStagedAttachedReferences(threadId, namedAgents.stagedNamedAgentsMessageMetadata(threadId));
8
+ const markdown = composerMarkdown.takeStagedComposerMarkdownMetadata(threadId);
9
+ return markdown === void 0 ? metadata : { ...metadata, ...markdown };
10
+ }
11
+ exports.takeStagedMessageMetadata = takeStagedMessageMetadata;
12
+ //# sourceMappingURL=staged-message-metadata.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staged-message-metadata.cjs","sources":["../../src/composer/staged-message-metadata.ts"],"sourcesContent":["import { takeStagedComposerMarkdownMetadata } from '@athenaintel/agent-runtime';\nimport { stagedNamedAgentsMessageMetadata } from '@athenaintel/agent-runtime/named-agents';\nimport { withStagedAttachedReferences } from './attached-references';\n\n/**\n * The metadata the message `threadId` sends now carries, taking every slot a composer staged for\n * it right before it sent: the agents it names (`addressedAgents`), what an app attached to it\n * (`attachedReferences`) and the draft its text came from (`composer_markdown`). `undefined` when\n * nothing was staged.\n *\n * Two readers, one taking each message's slots once:\n * - the runtime's `getMessageMetadata` (`useAthenaStatewireRuntime`), for a send the composer\n * runtime makes. That option exists only in the monorepo's patch of\n * `@assistant-ui/react-statewire`; the stock package an app installs with the SDK from npm\n * ignores it.\n * - a send that puts the metadata on its message itself (`AthenaChat`'s composed send of a message\n * with attachments), which the stock package forwards as the message's metadata.\n */\nexport function takeStagedMessageMetadata(threadId: string): Record<string, unknown> | undefined {\n const metadata = withStagedAttachedReferences(threadId, stagedNamedAgentsMessageMetadata(threadId));\n const markdown = takeStagedComposerMarkdownMetadata(threadId);\n return markdown === undefined ? metadata : { ...metadata, ...markdown };\n}\n"],"names":["withStagedAttachedReferences","stagedNamedAgentsMessageMetadata","takeStagedComposerMarkdownMetadata"],"mappings":";;;;;AAkBO,SAAS,0BAA0B,UAAuD;AAC/F,QAAM,WAAWA,mBAAAA,6BAA6B,UAAUC,YAAAA,iCAAiC,QAAQ,CAAC;AAClG,QAAM,WAAWC,iBAAAA,mCAAmC,QAAQ;AAC5D,SAAO,aAAa,SAAY,WAAW,EAAE,GAAG,UAAU,GAAG,SAAA;AAC/D;;"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The metadata the message `threadId` sends now carries, taking every slot a composer staged for
3
+ * it right before it sent: the agents it names (`addressedAgents`), what an app attached to it
4
+ * (`attachedReferences`) and the draft its text came from (`composer_markdown`). `undefined` when
5
+ * nothing was staged.
6
+ *
7
+ * Two readers, one taking each message's slots once:
8
+ * - the runtime's `getMessageMetadata` (`useAthenaStatewireRuntime`), for a send the composer
9
+ * runtime makes. That option exists only in the monorepo's patch of
10
+ * `@assistant-ui/react-statewire`; the stock package an app installs with the SDK from npm
11
+ * ignores it.
12
+ * - a send that puts the metadata on its message itself (`AthenaChat`'s composed send of a message
13
+ * with attachments), which the stock package forwards as the message's metadata.
14
+ */
15
+ export declare function takeStagedMessageMetadata(threadId: string): Record<string, unknown> | undefined;
@@ -0,0 +1,12 @@
1
+ import { stagedNamedAgentsMessageMetadata } from "../agent-runtime/src/named-agents.js";
2
+ import { withStagedAttachedReferences } from "./attached-references.js";
3
+ import { takeStagedComposerMarkdownMetadata } from "../agent-runtime/src/composer-markdown.js";
4
+ function takeStagedMessageMetadata(threadId) {
5
+ const metadata = withStagedAttachedReferences(threadId, stagedNamedAgentsMessageMetadata(threadId));
6
+ const markdown = takeStagedComposerMarkdownMetadata(threadId);
7
+ return markdown === void 0 ? metadata : { ...metadata, ...markdown };
8
+ }
9
+ export {
10
+ takeStagedMessageMetadata
11
+ };
12
+ //# sourceMappingURL=staged-message-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staged-message-metadata.js","sources":["../../src/composer/staged-message-metadata.ts"],"sourcesContent":["import { takeStagedComposerMarkdownMetadata } from '@athenaintel/agent-runtime';\nimport { stagedNamedAgentsMessageMetadata } from '@athenaintel/agent-runtime/named-agents';\nimport { withStagedAttachedReferences } from './attached-references';\n\n/**\n * The metadata the message `threadId` sends now carries, taking every slot a composer staged for\n * it right before it sent: the agents it names (`addressedAgents`), what an app attached to it\n * (`attachedReferences`) and the draft its text came from (`composer_markdown`). `undefined` when\n * nothing was staged.\n *\n * Two readers, one taking each message's slots once:\n * - the runtime's `getMessageMetadata` (`useAthenaStatewireRuntime`), for a send the composer\n * runtime makes. That option exists only in the monorepo's patch of\n * `@assistant-ui/react-statewire`; the stock package an app installs with the SDK from npm\n * ignores it.\n * - a send that puts the metadata on its message itself (`AthenaChat`'s composed send of a message\n * with attachments), which the stock package forwards as the message's metadata.\n */\nexport function takeStagedMessageMetadata(threadId: string): Record<string, unknown> | undefined {\n const metadata = withStagedAttachedReferences(threadId, stagedNamedAgentsMessageMetadata(threadId));\n const markdown = takeStagedComposerMarkdownMetadata(threadId);\n return markdown === undefined ? metadata : { ...metadata, ...markdown };\n}\n"],"names":[],"mappings":";;;AAkBO,SAAS,0BAA0B,UAAuD;AAC/F,QAAM,WAAW,6BAA6B,UAAU,iCAAiC,QAAQ,CAAC;AAClG,QAAM,WAAW,mCAAmC,QAAQ;AAC5D,SAAO,aAAa,SAAY,WAAW,EAAE,GAAG,UAAU,GAAG,SAAA;AAC/D;"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const require$$0 = require("react");
4
+ const threadIdContext = require("../threads/thread-id-context.cjs");
5
+ const attachedReferences = require("./attached-references.cjs");
6
+ const composerHandoff = require("./composer-handoff.cjs");
7
+ const useAppendToComposer = require("./useAppendToComposer.cjs");
8
+ function useAttachToChat() {
9
+ const threadId = require$$0.useContext(threadIdContext.AthenaStatewireThreadIdContext);
10
+ const references = attachedReferences.usePendingAttachedReferences(threadId);
11
+ const appendToComposer = useAppendToComposer.useAppendToComposer();
12
+ const focusComposer = composerHandoff.useFocusComposer();
13
+ const attach = require$$0.useCallback(
14
+ (reference, options) => {
15
+ const result = attachedReferences.attachReferenceToThread({ threadId, reference });
16
+ if (!result.attached) return result;
17
+ const prompt = options == null ? void 0 : options.prompt;
18
+ if (prompt) appendToComposer(prompt, { focus: (options == null ? void 0 : options.open) ?? false });
19
+ else if (options == null ? void 0 : options.open) focusComposer();
20
+ return result;
21
+ },
22
+ [appendToComposer, focusComposer, threadId]
23
+ );
24
+ const detach = require$$0.useCallback(
25
+ (reference) => attachedReferences.detachReferenceFromThread({ threadId, reference }),
26
+ [threadId]
27
+ );
28
+ const clear = require$$0.useCallback(() => attachedReferences.clearAttachedReferences(threadId), [threadId]);
29
+ return require$$0.useMemo(
30
+ () => ({ attach, detach, clear, references }),
31
+ [attach, clear, detach, references]
32
+ );
33
+ }
34
+ exports.useAttachToChat = useAttachToChat;
35
+ //# sourceMappingURL=useAttachToChat.cjs.map