@athenaintel/react 0.41.3 → 0.42.2

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 (479) hide show
  1. package/README.md +132 -10
  2. package/dist/agent-runtime/src/asset-attachment.d.ts +98 -0
  3. package/dist/agent-runtime/src/athena-asset-drag.d.ts +32 -0
  4. package/dist/agent-runtime/src/auth-denial.d.ts +29 -0
  5. package/dist/agent-runtime/src/chat-outbox-attachments.cjs +41 -0
  6. package/dist/agent-runtime/src/chat-outbox-attachments.cjs.map +1 -0
  7. package/dist/agent-runtime/src/chat-outbox-attachments.d.ts +38 -0
  8. package/dist/agent-runtime/src/chat-outbox-attachments.js +41 -0
  9. package/dist/agent-runtime/src/chat-outbox-attachments.js.map +1 -0
  10. package/dist/agent-runtime/src/chat-outbox-signals.cjs +63 -0
  11. package/dist/agent-runtime/src/chat-outbox-signals.cjs.map +1 -0
  12. package/dist/agent-runtime/src/chat-outbox-signals.d.ts +12 -0
  13. package/dist/agent-runtime/src/chat-outbox-signals.js +63 -0
  14. package/dist/agent-runtime/src/chat-outbox-signals.js.map +1 -0
  15. package/dist/agent-runtime/src/chat-outbox-store.cjs +509 -0
  16. package/dist/agent-runtime/src/chat-outbox-store.cjs.map +1 -0
  17. package/dist/agent-runtime/src/chat-outbox-store.d.ts +203 -0
  18. package/dist/agent-runtime/src/chat-outbox-store.js +509 -0
  19. package/dist/agent-runtime/src/chat-outbox-store.js.map +1 -0
  20. package/dist/agent-runtime/src/chat-outbox-thread.cjs +136 -0
  21. package/dist/agent-runtime/src/chat-outbox-thread.cjs.map +1 -0
  22. package/dist/agent-runtime/src/chat-outbox-thread.d.ts +118 -0
  23. package/dist/agent-runtime/src/chat-outbox-thread.js +136 -0
  24. package/dist/agent-runtime/src/chat-outbox-thread.js.map +1 -0
  25. package/dist/agent-runtime/src/chat-outbox.cjs +696 -0
  26. package/dist/agent-runtime/src/chat-outbox.cjs.map +1 -0
  27. package/dist/agent-runtime/src/chat-outbox.d.ts +285 -0
  28. package/dist/agent-runtime/src/chat-outbox.js +696 -0
  29. package/dist/agent-runtime/src/chat-outbox.js.map +1 -0
  30. package/dist/agent-runtime/src/chat-socket-reachability.d.ts +45 -0
  31. package/dist/agent-runtime/src/client-tool-bridge.d.ts +152 -0
  32. package/dist/agent-runtime/src/client-tools.d.ts +133 -0
  33. package/dist/agent-runtime/src/composer-markdown.cjs +10 -0
  34. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  35. package/dist/agent-runtime/src/composer-markdown.d.ts +108 -0
  36. package/dist/agent-runtime/src/composer-markdown.js +10 -0
  37. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  38. package/dist/agent-runtime/src/config-mutations.d.ts +51 -0
  39. package/dist/agent-runtime/src/conversation-index.d.ts +110 -0
  40. package/dist/agent-runtime/src/conversation-list.d.ts +343 -0
  41. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +3 -2
  42. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  43. package/dist/agent-runtime/src/deep-agent-transport-recipe.d.ts +166 -0
  44. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -2
  45. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  46. package/dist/agent-runtime/src/desktop-handoff.d.ts +139 -0
  47. package/dist/agent-runtime/src/durable-thread-snapshot-cache.d.ts +60 -0
  48. package/dist/agent-runtime/src/edit-command.d.ts +156 -0
  49. package/dist/agent-runtime/src/errors.d.ts +174 -0
  50. package/dist/agent-runtime/src/execute-output.d.ts +31 -0
  51. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +16 -2
  52. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  53. package/dist/agent-runtime/src/generated/runconfig-contract.d.ts +202 -0
  54. package/dist/agent-runtime/src/generated/runconfig-contract.js +16 -2
  55. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  56. package/dist/agent-runtime/src/github-wake-event.d.ts +77 -0
  57. package/dist/agent-runtime/src/index.d.ts +74 -0
  58. package/dist/agent-runtime/src/interrupts.cjs +17 -0
  59. package/dist/agent-runtime/src/interrupts.cjs.map +1 -1
  60. package/dist/agent-runtime/src/interrupts.d.ts +348 -0
  61. package/dist/agent-runtime/src/interrupts.js +17 -0
  62. package/dist/agent-runtime/src/interrupts.js.map +1 -1
  63. package/dist/agent-runtime/src/lane-follow.d.ts +121 -0
  64. package/dist/agent-runtime/src/lane-history.cjs +209 -0
  65. package/dist/agent-runtime/src/lane-history.cjs.map +1 -0
  66. package/dist/agent-runtime/src/lane-history.d.ts +175 -0
  67. package/dist/agent-runtime/src/lane-history.js +209 -0
  68. package/dist/agent-runtime/src/lane-history.js.map +1 -0
  69. package/dist/agent-runtime/src/lane-images.d.ts +184 -0
  70. package/dist/agent-runtime/src/message-author.d.ts +43 -0
  71. package/dist/agent-runtime/src/message-text.cjs +15 -0
  72. package/dist/agent-runtime/src/message-text.cjs.map +1 -0
  73. package/dist/agent-runtime/src/message-text.d.ts +47 -0
  74. package/dist/agent-runtime/src/message-text.js +15 -0
  75. package/dist/agent-runtime/src/message-text.js.map +1 -0
  76. package/dist/agent-runtime/src/message-window.cjs +15 -1
  77. package/dist/agent-runtime/src/message-window.cjs.map +1 -1
  78. package/dist/agent-runtime/src/message-window.d.ts +159 -0
  79. package/dist/agent-runtime/src/message-window.js +16 -2
  80. package/dist/agent-runtime/src/message-window.js.map +1 -1
  81. package/dist/agent-runtime/src/messages.cjs +123 -8
  82. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  83. package/dist/agent-runtime/src/messages.d.ts +621 -0
  84. package/dist/agent-runtime/src/messages.js +123 -8
  85. package/dist/agent-runtime/src/messages.js.map +1 -1
  86. package/dist/agent-runtime/src/model-context.d.ts +22 -0
  87. package/dist/agent-runtime/src/offline-status.d.ts +157 -0
  88. package/dist/agent-runtime/src/optimistic-content.d.ts +21 -0
  89. package/dist/agent-runtime/src/protocol.cjs +12 -4
  90. package/dist/agent-runtime/src/protocol.cjs.map +1 -1
  91. package/dist/agent-runtime/src/protocol.d.ts +119 -0
  92. package/dist/agent-runtime/src/protocol.js +13 -5
  93. package/dist/agent-runtime/src/protocol.js.map +1 -1
  94. package/dist/agent-runtime/src/ptc-subcalls.d.ts +51 -0
  95. package/dist/agent-runtime/src/queue.d.ts +138 -0
  96. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +10 -0
  97. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  98. package/dist/agent-runtime/src/quota-safe-local-storage-session.d.ts +161 -0
  99. package/dist/agent-runtime/src/quota-safe-local-storage-session.js +10 -0
  100. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  101. package/dist/agent-runtime/src/running-tool-placeholder.cjs +11 -0
  102. package/dist/agent-runtime/src/running-tool-placeholder.cjs.map +1 -0
  103. package/dist/agent-runtime/src/running-tool-placeholder.d.ts +25 -0
  104. package/dist/agent-runtime/src/running-tool-placeholder.js +11 -0
  105. package/dist/agent-runtime/src/running-tool-placeholder.js.map +1 -0
  106. package/dist/agent-runtime/src/runtime-messages.d.ts +104 -0
  107. package/dist/agent-runtime/src/screen-point.d.ts +151 -0
  108. package/dist/agent-runtime/src/sealed-idb.cjs +112 -0
  109. package/dist/agent-runtime/src/sealed-idb.cjs.map +1 -0
  110. package/dist/agent-runtime/src/sealed-idb.d.ts +106 -0
  111. package/dist/agent-runtime/src/sealed-idb.js +112 -0
  112. package/dist/agent-runtime/src/sealed-idb.js.map +1 -0
  113. package/dist/agent-runtime/src/send-recovery.d.ts +40 -0
  114. package/dist/agent-runtime/src/session-lane-scope.cjs +25 -0
  115. package/dist/agent-runtime/src/session-lane-scope.cjs.map +1 -0
  116. package/dist/agent-runtime/src/session-lane-scope.d.ts +59 -0
  117. package/dist/agent-runtime/src/session-lane-scope.js +25 -0
  118. package/dist/agent-runtime/src/session-lane-scope.js.map +1 -0
  119. package/dist/agent-runtime/src/statewire-attach-observer.d.ts +194 -0
  120. package/dist/agent-runtime/src/statewire-diagnostics.d.ts +74 -0
  121. package/dist/agent-runtime/src/statewire-state.d.ts +29 -0
  122. package/dist/agent-runtime/src/statewire-suspended.cjs.map +1 -1
  123. package/dist/agent-runtime/src/statewire-suspended.d.ts +27 -0
  124. package/dist/agent-runtime/src/statewire-suspended.js.map +1 -1
  125. package/dist/agent-runtime/src/statewire-transport.d.ts +40 -0
  126. package/dist/agent-runtime/src/streaming-markdown.d.ts +46 -0
  127. package/dist/agent-runtime/src/subagent-transcripts.cjs +209 -0
  128. package/dist/agent-runtime/src/subagent-transcripts.cjs.map +1 -0
  129. package/dist/agent-runtime/src/subagent-transcripts.d.ts +71 -0
  130. package/dist/agent-runtime/src/subagent-transcripts.js +209 -0
  131. package/dist/agent-runtime/src/subagent-transcripts.js.map +1 -0
  132. package/dist/agent-runtime/src/subagents.cjs +253 -0
  133. package/dist/agent-runtime/src/subagents.cjs.map +1 -0
  134. package/dist/agent-runtime/src/subagents.d.ts +311 -0
  135. package/dist/agent-runtime/src/subagents.js +253 -0
  136. package/dist/agent-runtime/src/subagents.js.map +1 -0
  137. package/dist/agent-runtime/src/subscription-wake-event.d.ts +111 -0
  138. package/dist/agent-runtime/src/thread-extras.d.ts +43 -0
  139. package/dist/agent-runtime/src/thread-handoff.d.ts +364 -0
  140. package/dist/agent-runtime/src/thread-prewarm-controller.d.ts +76 -0
  141. package/dist/agent-runtime/src/thread-prewarm.d.ts +118 -0
  142. package/dist/agent-runtime/src/thread-snapshot-cache.d.ts +99 -0
  143. package/dist/agent-runtime/src/thread-snapshot-mirror.cjs +46 -117
  144. package/dist/agent-runtime/src/thread-snapshot-mirror.cjs.map +1 -1
  145. package/dist/agent-runtime/src/thread-snapshot-mirror.d.ts +101 -0
  146. package/dist/agent-runtime/src/thread-snapshot-mirror.js +17 -88
  147. package/dist/agent-runtime/src/thread-snapshot-mirror.js.map +1 -1
  148. package/dist/agent-runtime/src/thread-status.d.ts +53 -0
  149. package/dist/agent-runtime/src/tool-metadata.d.ts +146 -0
  150. package/dist/agent-runtime/src/tool-names.cjs +71 -0
  151. package/dist/agent-runtime/src/tool-names.cjs.map +1 -1
  152. package/dist/agent-runtime/src/tool-names.d.ts +67 -0
  153. package/dist/agent-runtime/src/tool-names.js +72 -1
  154. package/dist/agent-runtime/src/tool-names.js.map +1 -1
  155. package/dist/agent-runtime/src/tool-outputs.d.ts +35 -0
  156. package/dist/agent-runtime/src/tool-result.cjs +1 -0
  157. package/dist/agent-runtime/src/tool-result.cjs.map +1 -1
  158. package/dist/agent-runtime/src/tool-result.d.ts +126 -0
  159. package/dist/agent-runtime/src/tool-result.js +1 -0
  160. package/dist/agent-runtime/src/tool-result.js.map +1 -1
  161. package/dist/agent-runtime/src/types.d.ts +159 -0
  162. package/dist/agent-runtime/src/use-conversation-list.d.ts +76 -0
  163. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs +136 -0
  164. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.cjs.map +1 -0
  165. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.d.ts +64 -0
  166. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js +136 -0
  167. package/dist/agent-runtime/src/use-deep-agent-chat-outbox.js.map +1 -0
  168. package/dist/agent-runtime/src/use-deep-agent-config.d.ts +169 -0
  169. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs +13 -0
  170. package/dist/agent-runtime/src/use-deep-agent-edit-submit.cjs.map +1 -1
  171. package/dist/agent-runtime/src/use-deep-agent-edit-submit.d.ts +22 -0
  172. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js +13 -0
  173. package/dist/agent-runtime/src/use-deep-agent-edit-submit.js.map +1 -1
  174. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs +37 -2
  175. package/dist/agent-runtime/src/use-deep-agent-runtime.cjs.map +1 -1
  176. package/dist/agent-runtime/src/use-deep-agent-runtime.d.ts +177 -0
  177. package/dist/agent-runtime/src/use-deep-agent-runtime.js +38 -3
  178. package/dist/agent-runtime/src/use-deep-agent-runtime.js.map +1 -1
  179. package/dist/agent-runtime/src/use-deep-agent-thread.cjs +39 -13
  180. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  181. package/dist/agent-runtime/src/use-deep-agent-thread.d.ts +352 -0
  182. package/dist/agent-runtime/src/use-deep-agent-thread.js +39 -13
  183. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  184. package/dist/agent-runtime/src/use-deep-agent-voice.cjs +1019 -0
  185. package/dist/agent-runtime/src/use-deep-agent-voice.cjs.map +1 -0
  186. package/dist/agent-runtime/src/use-deep-agent-voice.d.ts +409 -0
  187. package/dist/agent-runtime/src/use-deep-agent-voice.js +1019 -0
  188. package/dist/agent-runtime/src/use-deep-agent-voice.js.map +1 -0
  189. package/dist/agent-runtime/src/use-deep-agent-window-sync.d.ts +102 -0
  190. package/dist/agent-runtime/src/use-historical-edit-attachments.d.ts +2 -0
  191. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +84 -0
  192. package/dist/agent-runtime/src/voice-presentation.cjs +2 -0
  193. package/dist/agent-runtime/src/voice-presentation.cjs.map +1 -1
  194. package/dist/agent-runtime/src/voice-presentation.d.ts +80 -0
  195. package/dist/agent-runtime/src/voice-presentation.js +2 -0
  196. package/dist/agent-runtime/src/voice-presentation.js.map +1 -1
  197. package/dist/agent-runtime/src/voice-turn-grouping.d.ts +28 -0
  198. package/dist/agent-runtime/src/voice-wire-types.d.ts +15 -0
  199. package/dist/agent-runtime/src/withdrawn-turns.d.ts +97 -0
  200. package/dist/catalog/runtime-catalog.js +1 -1
  201. package/dist/chat/AthenaChat.cjs +192 -103
  202. package/dist/chat/AthenaChat.cjs.map +1 -1
  203. package/dist/chat/AthenaChat.d.ts +9 -0
  204. package/dist/chat/AthenaChat.js +194 -105
  205. package/dist/chat/AthenaChat.js.map +1 -1
  206. package/dist/chat/StatewireApprovalCard.d.ts +1 -1
  207. package/dist/chat/StatewireClientToolBridge.d.ts +1 -1
  208. package/dist/chat/StatewireQueuedMessages.cjs +11 -4
  209. package/dist/chat/StatewireQueuedMessages.cjs.map +1 -1
  210. package/dist/chat/StatewireQueuedMessages.d.ts +1 -1
  211. package/dist/chat/StatewireQueuedMessages.js +11 -4
  212. package/dist/chat/StatewireQueuedMessages.js.map +1 -1
  213. package/dist/chat/chat-outbox-rows.cjs +223 -0
  214. package/dist/chat/chat-outbox-rows.cjs.map +1 -0
  215. package/dist/chat/chat-outbox-rows.d.ts +29 -0
  216. package/dist/chat/chat-outbox-rows.js +223 -0
  217. package/dist/chat/chat-outbox-rows.js.map +1 -0
  218. package/dist/chat/chat-voice-controls.cjs +128 -0
  219. package/dist/chat/chat-voice-controls.cjs.map +1 -0
  220. package/dist/chat/chat-voice-controls.d.ts +19 -0
  221. package/dist/chat/chat-voice-controls.js +128 -0
  222. package/dist/chat/chat-voice-controls.js.map +1 -0
  223. package/dist/chat/statewire-approval.d.ts +1 -1
  224. package/dist/chat/statewire-client-tools.d.ts +1 -1
  225. package/dist/chat/super-grouping/SuperGroupingCard.cjs +3 -1
  226. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  227. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +7 -1
  228. package/dist/chat/super-grouping/SuperGroupingCard.js +3 -1
  229. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  230. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +7 -2
  231. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  232. package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +2 -2
  233. package/dist/chat/super-grouping/SuperGroupingTranscript.js +7 -2
  234. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  235. package/dist/chat/super-grouping/activity-timeline.cjs +15 -8
  236. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  237. package/dist/chat/super-grouping/activity-timeline.d.ts +18 -8
  238. package/dist/chat/super-grouping/activity-timeline.js +15 -8
  239. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  240. package/dist/chat/use-statewire-approval-request.cjs +36 -0
  241. package/dist/chat/use-statewire-approval-request.cjs.map +1 -1
  242. package/dist/chat/use-statewire-approval-request.d.ts +49 -1
  243. package/dist/chat/use-statewire-approval-request.js +39 -3
  244. package/dist/chat/use-statewire-approval-request.js.map +1 -1
  245. package/dist/chat-ui/composer/tiptap-composer.cjs +133 -14
  246. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  247. package/dist/chat-ui/composer/tiptap-composer.d.ts +33 -1
  248. package/dist/chat-ui/composer/tiptap-composer.js +135 -16
  249. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  250. package/dist/chat-ui/header/conversation-history-panel.d.ts +1 -1
  251. package/dist/chat-ui/index.d.ts +1 -1
  252. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +2 -1
  253. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  254. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +3 -1
  255. package/dist/chat-ui/mentions/suggestions/data/api-client.js +2 -1
  256. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  257. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +29 -51
  258. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -1
  259. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +2 -2
  260. package/dist/chat-ui/mentions/use-account-workspace-id.js +30 -52
  261. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -1
  262. package/dist/chat-ui/messages/message-components.cjs +15 -0
  263. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  264. package/dist/chat-ui/messages/message-components.js +15 -0
  265. package/dist/chat-ui/messages/message-components.js.map +1 -1
  266. package/dist/chat-ui/messages/runtime-message.d.ts +1 -1
  267. package/dist/chat-ui/messages/statewire-continue-run.d.ts +1 -1
  268. package/dist/chat-ui/messages/user-edit-composer.cjs +15 -2
  269. package/dist/chat-ui/messages/user-edit-composer.cjs.map +1 -1
  270. package/dist/chat-ui/messages/user-edit-composer.d.ts +4 -2
  271. package/dist/chat-ui/messages/user-edit-composer.js +15 -2
  272. package/dist/chat-ui/messages/user-edit-composer.js.map +1 -1
  273. package/dist/chat-ui/messages/wake-marker.d.ts +1 -1
  274. package/dist/chat-ui/rich-text/chat-text-schema.cjs +1 -0
  275. package/dist/chat-ui/rich-text/chat-text-schema.cjs.map +1 -1
  276. package/dist/chat-ui/rich-text/chat-text-schema.d.ts +3 -0
  277. package/dist/chat-ui/rich-text/chat-text-schema.js +1 -0
  278. package/dist/chat-ui/rich-text/chat-text-schema.js.map +1 -1
  279. package/dist/chat-ui/statewire.cjs +1 -0
  280. package/dist/chat-ui/statewire.cjs.map +1 -1
  281. package/dist/chat-ui/statewire.d.ts +2 -2
  282. package/dist/chat-ui/statewire.js +2 -1
  283. package/dist/chat-ui/thread/composer-send-or-stop.cjs +2 -1
  284. package/dist/chat-ui/thread/composer-send-or-stop.cjs.map +1 -1
  285. package/dist/chat-ui/thread/composer-send-or-stop.d.ts +2 -0
  286. package/dist/chat-ui/thread/composer-send-or-stop.js +2 -1
  287. package/dist/chat-ui/thread/composer-send-or-stop.js.map +1 -1
  288. package/dist/chat-ui/thread/statewire-history-edge.d.ts +1 -1
  289. package/dist/composer/AttachmentContext.cjs +8 -4
  290. package/dist/composer/AttachmentContext.cjs.map +1 -1
  291. package/dist/composer/AttachmentContext.d.ts +7 -0
  292. package/dist/composer/AttachmentContext.js +8 -4
  293. package/dist/composer/AttachmentContext.js.map +1 -1
  294. package/dist/composer/build-composed-message.cjs +34 -0
  295. package/dist/composer/build-composed-message.cjs.map +1 -1
  296. package/dist/composer/build-composed-message.d.ts +20 -0
  297. package/dist/composer/build-composed-message.js +35 -1
  298. package/dist/composer/build-composed-message.js.map +1 -1
  299. package/dist/composer/composer-handoff.cjs +39 -2
  300. package/dist/composer/composer-handoff.cjs.map +1 -1
  301. package/dist/composer/composer-handoff.d.ts +28 -3
  302. package/dist/composer/composer-handoff.js +39 -2
  303. package/dist/composer/composer-handoff.js.map +1 -1
  304. package/dist/composer/useAttachFiles.cjs +15 -2
  305. package/dist/composer/useAttachFiles.cjs.map +1 -1
  306. package/dist/composer/useAttachFiles.d.ts +11 -0
  307. package/dist/composer/useAttachFiles.js +15 -2
  308. package/dist/composer/useAttachFiles.js.map +1 -1
  309. package/dist/composer/useSendMessage.cjs.map +1 -1
  310. package/dist/composer/useSendMessage.d.ts +4 -3
  311. package/dist/composer/useSendMessage.js.map +1 -1
  312. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  313. package/dist/diagnostics/athena-diagnostics.d.ts +3 -1
  314. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  315. package/dist/index.cjs +13 -0
  316. package/dist/index.cjs.map +1 -1
  317. package/dist/index.d.ts +14 -7
  318. package/dist/index.js +14 -1
  319. package/dist/index.js.map +1 -1
  320. package/dist/offline/chat-outbox.cjs +57 -0
  321. package/dist/offline/chat-outbox.cjs.map +1 -0
  322. package/dist/offline/chat-outbox.d.ts +80 -0
  323. package/dist/offline/chat-outbox.js +57 -0
  324. package/dist/offline/chat-outbox.js.map +1 -0
  325. package/dist/offline/offline-history.d.ts +1 -1
  326. package/dist/provider/AthenaProvider.cjs +162 -8
  327. package/dist/provider/AthenaProvider.cjs.map +1 -1
  328. package/dist/provider/AthenaProvider.d.ts +15 -1
  329. package/dist/provider/AthenaProvider.js +163 -9
  330. package/dist/provider/AthenaProvider.js.map +1 -1
  331. package/dist/provider/statewire-window-context.d.ts +1 -1
  332. package/dist/react/package.json.cjs +1 -1
  333. package/dist/react/package.json.js +1 -1
  334. package/dist/references/src/anchors/file-line-range.d.ts +58 -0
  335. package/dist/references/src/anchors/format.d.ts +21 -0
  336. package/dist/references/src/anchors/message-anchors.d.ts +71 -0
  337. package/dist/references/src/anchors/parse.d.ts +8 -0
  338. package/dist/references/src/anchors/registry-contract.d.ts +24 -0
  339. package/dist/references/src/anchors/registry.d.ts +19 -0
  340. package/dist/references/src/anchors/schemas.d.ts +194 -0
  341. package/dist/references/src/anchors/serialize.d.ts +8 -0
  342. package/dist/references/src/anchors/time.d.ts +78 -0
  343. package/dist/references/src/anchors/types.d.ts +474 -0
  344. package/dist/references/src/asset-bounds.d.ts +27 -0
  345. package/dist/references/src/asset-links.d.ts +23 -0
  346. package/dist/references/src/asset-reference.d.ts +16 -0
  347. package/dist/references/src/formats/format-catalog.d.ts +79 -0
  348. package/dist/references/src/formats/markdown/parse-reference-markdown.d.ts +28 -0
  349. package/dist/references/src/formats/markdown/reference-display-name.d.ts +6 -0
  350. package/dist/references/src/formats/object/asset-object.d.ts +9 -0
  351. package/dist/references/src/formats/object/callable-object.d.ts +6 -0
  352. package/dist/references/src/formats/object/decode-reference-object-payload.d.ts +3 -0
  353. package/dist/references/src/formats/object/external-url-object.d.ts +9 -0
  354. package/dist/references/src/formats/object/group-object.d.ts +9 -0
  355. package/dist/references/src/formats/object/navigation-object.d.ts +9 -0
  356. package/dist/references/src/formats/object/parse-reference-object.d.ts +11 -0
  357. package/dist/references/src/formats/object/person-object.d.ts +9 -0
  358. package/dist/references/src/formats/uri/asset-mention-uri.d.ts +9 -0
  359. package/dist/references/src/formats/uri/asset-spaces-url.d.ts +9 -0
  360. package/dist/references/src/formats/uri/callable-mention-uris.d.ts +9 -0
  361. package/dist/references/src/formats/uri/detect-uri-wire.d.ts +9 -0
  362. package/dist/references/src/formats/uri/group-mention-uri.d.ts +12 -0
  363. package/dist/references/src/formats/uri/navigation-spaces-url.d.ts +14 -0
  364. package/dist/references/src/formats/uri/parse-reference-uri.d.ts +20 -0
  365. package/dist/references/src/formats/uri/person-mention-uri.d.ts +9 -0
  366. package/dist/references/src/formats/uri/template-placeholder.d.ts +12 -0
  367. package/dist/references/src/index.d.ts +47 -0
  368. package/dist/references/src/legacy/index.d.ts +14 -0
  369. package/dist/references/src/legacy/pre-reference-asset-url.d.ts +57 -0
  370. package/dist/references/src/legacy/pre-reference-citation-bridge.d.ts +22 -0
  371. package/dist/references/src/legacy/pre-reference-citation.d.ts +138 -0
  372. package/dist/references/src/legacy/pre-reference-external-url.d.ts +31 -0
  373. package/dist/references/src/legacy/pre-reference-format.d.ts +8 -0
  374. package/dist/references/src/legacy/pre-reference-mention.d.ts +27 -0
  375. package/dist/references/src/legacy/pre-reference-object.d.ts +8 -0
  376. package/dist/references/src/legacy/pre-reference-uri.d.ts +12 -0
  377. package/dist/references/src/legacy.d.ts +2 -0
  378. package/dist/references/src/mention-href-patterns.d.ts +19 -0
  379. package/dist/references/src/mention-node/index.d.ts +5 -0
  380. package/dist/references/src/mention-node/mention-node.d.ts +31 -0
  381. package/dist/references/src/mention-node/resolve-node-attrs.d.ts +27 -0
  382. package/dist/references/src/parse-reference.d.ts +23 -0
  383. package/dist/references/src/schemas.d.ts +463 -0
  384. package/dist/references/src/serialize-reference.d.ts +50 -0
  385. package/dist/references/src/sheet-name.d.ts +10 -0
  386. package/dist/references/src/tool-option-schemas.d.ts +597 -0
  387. package/dist/references/src/types.d.ts +125 -0
  388. package/dist/references/src/version-ref.d.ts +30 -0
  389. package/dist/runtime/statewire-lifecycle.d.ts +1 -1
  390. package/dist/runtime/statewire-model-lane.d.ts +1 -1
  391. package/dist/runtime/statewire-server-lane-context.d.ts +1 -1
  392. package/dist/runtime/statewire-session-key.cjs +7 -0
  393. package/dist/runtime/statewire-session-key.cjs.map +1 -1
  394. package/dist/runtime/statewire-session-key.d.ts +19 -0
  395. package/dist/runtime/statewire-session-key.js +8 -1
  396. package/dist/runtime/statewire-session-key.js.map +1 -1
  397. package/dist/runtime/statewire-session-lane.cjs +48 -0
  398. package/dist/runtime/statewire-session-lane.cjs.map +1 -0
  399. package/dist/runtime/statewire-session-lane.d.ts +29 -0
  400. package/dist/runtime/statewire-session-lane.js +48 -0
  401. package/dist/runtime/statewire-session-lane.js.map +1 -0
  402. package/dist/runtime/statewire-thread-config-lane.d.ts +1 -1
  403. package/dist/runtime/useAthenaStatewireRuntime.cjs +19 -5
  404. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  405. package/dist/runtime/useAthenaStatewireRuntime.d.ts +15 -1
  406. package/dist/runtime/useAthenaStatewireRuntime.js +20 -6
  407. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  408. package/dist/styles.css +1 -1
  409. package/dist/threads/api.d.ts +1 -1
  410. package/dist/threads/conversation-list-fetcher.d.ts +1 -1
  411. package/dist/threads/index-triggered-refresh.cjs +164 -0
  412. package/dist/threads/index-triggered-refresh.cjs.map +1 -0
  413. package/dist/threads/index-triggered-refresh.d.ts +70 -0
  414. package/dist/threads/index-triggered-refresh.js +164 -0
  415. package/dist/threads/index-triggered-refresh.js.map +1 -0
  416. package/dist/threads/offline-session-list.d.ts +1 -1
  417. package/dist/threads/pull-request-display.d.ts +1 -1
  418. package/dist/threads/session-list-model.d.ts +1 -1
  419. package/dist/threads/session-list-tab-share.cjs +150 -0
  420. package/dist/threads/session-list-tab-share.cjs.map +1 -0
  421. package/dist/threads/session-list-tab-share.d.ts +73 -0
  422. package/dist/threads/session-list-tab-share.js +150 -0
  423. package/dist/threads/session-list-tab-share.js.map +1 -0
  424. package/dist/threads/session-row-parts.d.ts +1 -1
  425. package/dist/threads/sessions-query.d.ts +1 -1
  426. package/dist/threads/statewire-thread-list.cjs +42 -16
  427. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  428. package/dist/threads/statewire-thread-list.d.ts +11 -2
  429. package/dist/threads/statewire-thread-list.js +43 -17
  430. package/dist/threads/statewire-thread-list.js.map +1 -1
  431. package/dist/threads/thread-prefetcher.d.ts +1 -1
  432. package/dist/threads/use-athena-session-attention.d.ts +1 -1
  433. package/dist/threads/use-athena-sessions.cjs +32 -22
  434. package/dist/threads/use-athena-sessions.cjs.map +1 -1
  435. package/dist/threads/use-athena-sessions.js +33 -23
  436. package/dist/threads/use-athena-sessions.js.map +1 -1
  437. package/dist/threads/use-rest-conversation-history.d.ts +1 -1
  438. package/dist/threads/use-statewire-conversation-history.d.ts +5 -5
  439. package/dist/tiptap-markdown-table/src/markdown-table-serializer.d.ts +56 -0
  440. package/dist/tools/NestedPtcMessages.cjs +14 -9
  441. package/dist/tools/NestedPtcMessages.cjs.map +1 -1
  442. package/dist/tools/NestedPtcMessages.d.ts +9 -0
  443. package/dist/tools/NestedPtcMessages.js +6 -1
  444. package/dist/tools/NestedPtcMessages.js.map +1 -1
  445. package/dist/tools/index.d.ts +1 -1
  446. package/dist/tools/primitives.d.ts +1 -1
  447. package/dist/tools/subagent-task-tool-ui.cjs +494 -0
  448. package/dist/tools/subagent-task-tool-ui.cjs.map +1 -0
  449. package/dist/tools/subagent-task-tool-ui.d.ts +109 -0
  450. package/dist/tools/subagent-task-tool-ui.js +494 -0
  451. package/dist/tools/subagent-task-tool-ui.js.map +1 -0
  452. package/dist/tools/tool-fallback.d.ts +1 -1
  453. package/dist/tools/tool-icons.d.ts +1 -1
  454. package/dist/tools/tool-summary.d.ts +1 -1
  455. package/dist/tools/tool-uis.cjs +4 -0
  456. package/dist/tools/tool-uis.cjs.map +1 -1
  457. package/dist/tools/tool-uis.js +4 -0
  458. package/dist/tools/tool-uis.js.map +1 -1
  459. package/dist/voice/chat.cjs +6 -0
  460. package/dist/voice/chat.cjs.map +1 -0
  461. package/dist/voice/chat.d.ts +2 -0
  462. package/dist/voice/chat.js +6 -0
  463. package/dist/voice/chat.js.map +1 -0
  464. package/dist/voice/livekit-join.cjs +119 -0
  465. package/dist/voice/livekit-join.cjs.map +1 -0
  466. package/dist/voice/livekit-join.d.ts +8 -0
  467. package/dist/voice/livekit-join.js +119 -0
  468. package/dist/voice/livekit-join.js.map +1 -0
  469. package/dist/voice/livekit.cjs +32 -0
  470. package/dist/voice/livekit.cjs.map +1 -0
  471. package/dist/voice/livekit.d.ts +80 -0
  472. package/dist/voice/livekit.js +32 -0
  473. package/dist/voice/livekit.js.map +1 -0
  474. package/dist/voice/use-chat-voice-enabled.cjs +43 -0
  475. package/dist/voice/use-chat-voice-enabled.cjs.map +1 -0
  476. package/dist/voice/use-chat-voice-enabled.d.ts +9 -0
  477. package/dist/voice/use-chat-voice-enabled.js +43 -0
  478. package/dist/voice/use-chat-voice-enabled.js.map +1 -0
  479. package/package.json +22 -16
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const useDeepAgentVoice = require("../agent-runtime/src/use-deep-agent-voice.cjs");
4
+ exports.describeVoiceFailure = useDeepAgentVoice.describeVoiceFailure;
5
+ exports.useAthenaChatVoice = useDeepAgentVoice.useDeepAgentVoice;
6
+ //# sourceMappingURL=chat.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,2 @@
1
+ /** The chat voice controller carried by this SDK's shared agent runtime. */
2
+ export { useDeepAgentVoice as useAthenaChatVoice, describeVoiceFailure, type DeepAgentVoiceDiagnostic, type DeepAgentVoiceFailure, type DeepAgentVoiceLiveKitAdapter, type DeepAgentVoiceLiveKitAnswer, type DeepAgentVoiceLiveKitSession, type DeepAgentVoiceModelOption, type DeepAgentVoicePhase, type UseDeepAgentVoiceOptions as UseAthenaChatVoiceOptions, type UseDeepAgentVoiceReturn as UseAthenaChatVoiceReturn, } from '../agent-runtime/src/use-deep-agent-voice';
@@ -0,0 +1,6 @@
1
+ import { describeVoiceFailure, useDeepAgentVoice } from "../agent-runtime/src/use-deep-agent-voice.js";
2
+ export {
3
+ describeVoiceFailure,
4
+ useDeepAgentVoice as useAthenaChatVoice
5
+ };
6
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const livekitClient = require("livekit-client");
4
+ const MICROPHONE_CAPTURE = {
5
+ echoCancellation: true,
6
+ noiseSuppression: true,
7
+ autoGainControl: true
8
+ };
9
+ const disconnectReasonLabel = (reason) => {
10
+ if (reason === void 0) return "room-disconnected";
11
+ const name = livekitClient.DisconnectReason[reason];
12
+ return `room-disconnected:${(name ?? String(reason)).toLowerCase()}`;
13
+ };
14
+ const defaultRoomFactory = () => new livekitClient.Room({
15
+ adaptiveStream: false,
16
+ dynacast: false,
17
+ audioCaptureDefaults: MICROPHONE_CAPTURE,
18
+ publishDefaults: { stopMicTrackOnMute: true }
19
+ });
20
+ async function joinDeepAgentVoiceRoom({
21
+ answer,
22
+ handlers,
23
+ audioElement,
24
+ roomFactory = defaultRoomFactory
25
+ }) {
26
+ const { signal } = handlers;
27
+ const endedError = () => new DOMException("The voice session ended", "AbortError");
28
+ if (signal == null ? void 0 : signal.aborted) throw endedError();
29
+ const room = roomFactory();
30
+ let connected = false;
31
+ let joined = false;
32
+ let closed = false;
33
+ let disconnecting = null;
34
+ const attached = /* @__PURE__ */ new Set();
35
+ let rejectEnded;
36
+ const ended = new Promise((_, reject) => {
37
+ rejectEnded = reject;
38
+ });
39
+ const closeRoom = () => {
40
+ closed = true;
41
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
42
+ for (const track of attached) {
43
+ try {
44
+ track.detach();
45
+ } catch {
46
+ }
47
+ }
48
+ attached.clear();
49
+ disconnecting ?? (disconnecting = room.disconnect().then(() => void 0));
50
+ return disconnecting;
51
+ };
52
+ const onAbort = () => {
53
+ rejectEnded(endedError());
54
+ void closeRoom().catch(() => void 0);
55
+ };
56
+ signal == null ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
57
+ if (signal == null ? void 0 : signal.aborted) onAbort();
58
+ room.on(livekitClient.RoomEvent.TrackSubscribed, (track) => {
59
+ if (closed || track.kind !== livekitClient.Track.Kind.Audio) return;
60
+ track.attach(audioElement() ?? void 0);
61
+ attached.add(track);
62
+ });
63
+ room.on(livekitClient.RoomEvent.TrackUnsubscribed, (track) => {
64
+ if (track.kind !== livekitClient.Track.Kind.Audio) return;
65
+ if (attached.delete(track)) track.detach();
66
+ });
67
+ room.on(livekitClient.RoomEvent.Disconnected, (reason) => {
68
+ if (closed) return;
69
+ if (!connected && reason === livekitClient.DisconnectReason.JOIN_FAILURE) return;
70
+ const label = disconnectReasonLabel(reason);
71
+ rejectEnded(new Error(label));
72
+ void closeRoom().catch(() => void 0);
73
+ if (joined) handlers.onDisconnected(label);
74
+ });
75
+ const checkOpen = () => {
76
+ if (closed) throw endedError();
77
+ };
78
+ const joining = (async () => {
79
+ try {
80
+ checkOpen();
81
+ await room.connect(answer.serverUrl, answer.token);
82
+ connected = true;
83
+ checkOpen();
84
+ await room.localParticipant.setMicrophoneEnabled(
85
+ !handlers.micMuted,
86
+ MICROPHONE_CAPTURE
87
+ );
88
+ checkOpen();
89
+ } catch (error) {
90
+ const alreadyClosed = closed;
91
+ await closeRoom().catch(() => void 0);
92
+ if (alreadyClosed) await room.disconnect().catch(() => void 0);
93
+ throw error;
94
+ }
95
+ })();
96
+ await Promise.race([joining, ended]);
97
+ checkOpen();
98
+ joined = true;
99
+ return {
100
+ setMicrophoneEnabled: (enabled) => {
101
+ const changing = (async () => {
102
+ checkOpen();
103
+ try {
104
+ await room.localParticipant.setMicrophoneEnabled(enabled);
105
+ checkOpen();
106
+ } finally {
107
+ if (closed) await room.disconnect().catch(() => void 0);
108
+ }
109
+ })();
110
+ return Promise.race([changing, ended]);
111
+ },
112
+ disconnect: () => {
113
+ rejectEnded(endedError());
114
+ return closeRoom();
115
+ }
116
+ };
117
+ }
118
+ exports.joinDeepAgentVoiceRoom = joinDeepAgentVoiceRoom;
119
+ //# sourceMappingURL=livekit-join.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livekit-join.cjs","sources":["../../src/voice/livekit-join.ts"],"sourcesContent":["import type {\n DeepAgentVoiceLiveKitSession,\n DeepAgentVoiceLiveKitRoom,\n DeepAgentVoiceLiveKitRemoteTrack,\n JoinDeepAgentVoiceRoomOptions,\n} from './livekit';\nimport {\n type AudioCaptureOptions,\n DisconnectReason,\n Room,\n RoomEvent,\n Track,\n} from 'livekit-client';\n\n/** Conversation-grade capture: the same processing the transcriber asks for. */\nconst MICROPHONE_CAPTURE = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n} satisfies AudioCaptureOptions;\n\n/** The media-loss reason the session state machine records for a room drop. */\nconst disconnectReasonLabel = (\n reason: DisconnectReason | undefined,\n): string => {\n if (reason === undefined) return 'room-disconnected';\n const name: string | undefined = DisconnectReason[reason];\n return `room-disconnected:${(name ?? String(reason)).toLowerCase()}`;\n};\n\n// One remote audio track: adaptive stream and dynacast are video levers.\nconst defaultRoomFactory = (): DeepAgentVoiceLiveKitRoom =>\n new Room({\n adaptiveStream: false,\n dynacast: false,\n audioCaptureDefaults: MICROPHONE_CAPTURE,\n publishDefaults: { stopMicTrackOnMute: true },\n });\n\n/**\n * The LiveKit half of the composer's voice adapter (`livekit.ts`),\n * loaded when a session joins its room: join the room the host minted, publish\n * the microphone, play the agent's track, and report a drop. Everything that\n * needs `livekit-client` at runtime lives here, behind that one import.\n */\nexport async function joinDeepAgentVoiceRoom({\n answer,\n handlers,\n audioElement,\n roomFactory = defaultRoomFactory,\n}: JoinDeepAgentVoiceRoomOptions): Promise<DeepAgentVoiceLiveKitSession> {\n const { signal } = handlers;\n const endedError = () =>\n new DOMException('The voice session ended', 'AbortError');\n if (signal?.aborted) throw endedError();\n const room = roomFactory();\n let connected = false;\n let joined = false;\n let closed = false;\n let disconnecting: Promise<void> | null = null;\n const attached = new Set<DeepAgentVoiceLiveKitRemoteTrack>();\n let rejectEnded!: (error: Error) => void;\n const ended = new Promise<never>((_, reject) => {\n rejectEnded = reject;\n });\n const closeRoom = (): Promise<void> => {\n closed = true;\n signal?.removeEventListener('abort', onAbort);\n for (const track of attached) {\n try {\n track.detach();\n } catch {\n /* Release the remaining tracks too. */\n }\n }\n attached.clear();\n disconnecting ??= room.disconnect().then(() => undefined);\n return disconnecting;\n };\n const onAbort = (): void => {\n rejectEnded(endedError());\n void closeRoom().catch(() => undefined);\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n // A custom factory may synchronously end its caller's attempt.\n if (signal?.aborted) onAbort();\n room.on(RoomEvent.TrackSubscribed, (track) => {\n if (closed || track.kind !== Track.Kind.Audio) return;\n track.attach(audioElement() ?? undefined);\n attached.add(track);\n });\n room.on(RoomEvent.TrackUnsubscribed, (track) => {\n if (track.kind !== Track.Kind.Audio) return;\n if (attached.delete(track)) track.detach();\n });\n room.on(RoomEvent.Disconnected, (reason) => {\n if (closed) return;\n // Room.connect() emits JOIN_FAILURE before rejecting with its real cause.\n // Preserve that error (including microphone/permission classifications).\n if (!connected && reason === DisconnectReason.JOIN_FAILURE) return;\n // A drop can follow connect() while capture is still pending. Settle the\n // join now; the platform operation may neither resolve nor reject yet.\n const label = disconnectReasonLabel(reason);\n rejectEnded(new Error(label));\n void closeRoom().catch(() => undefined);\n if (joined) handlers.onDisconnected(label);\n });\n const checkOpen = (): void => {\n if (closed) throw endedError();\n };\n const joining = (async () => {\n try {\n checkOpen();\n await room.connect(answer.serverUrl, answer.token);\n connected = true;\n checkOpen();\n await room.localParticipant.setMicrophoneEnabled(\n !handlers.micMuted,\n MICROPHONE_CAPTURE,\n );\n checkOpen();\n } catch (error) {\n const alreadyClosed = closed;\n await closeRoom().catch(() => undefined);\n // An uncancellable capture/join may finish after the first disconnect.\n if (alreadyClosed) await room.disconnect().catch(() => undefined);\n throw error;\n }\n })();\n await Promise.race([joining, ended]);\n checkOpen();\n joined = true;\n return {\n setMicrophoneEnabled: (enabled) => {\n const changing = (async () => {\n checkOpen();\n try {\n await room.localParticipant.setMicrophoneEnabled(enabled);\n checkOpen();\n } finally {\n if (closed) await room.disconnect().catch(() => undefined);\n }\n })();\n return Promise.race([changing, ended]);\n },\n disconnect: () => {\n rejectEnded(endedError());\n return closeRoom();\n },\n };\n}\n"],"names":["DisconnectReason","Room","RoomEvent","Track"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DeepAgentVoiceLiveKitSession, JoinDeepAgentVoiceRoomOptions } from './livekit';
2
+ /**
3
+ * The LiveKit half of the composer's voice adapter (`livekit.ts`),
4
+ * loaded when a session joins its room: join the room the host minted, publish
5
+ * the microphone, play the agent's track, and report a drop. Everything that
6
+ * needs `livekit-client` at runtime lives here, behind that one import.
7
+ */
8
+ export declare function joinDeepAgentVoiceRoom({ answer, handlers, audioElement, roomFactory, }: JoinDeepAgentVoiceRoomOptions): Promise<DeepAgentVoiceLiveKitSession>;
@@ -0,0 +1,119 @@
1
+ import { Room, RoomEvent, Track, DisconnectReason } from "livekit-client";
2
+ const MICROPHONE_CAPTURE = {
3
+ echoCancellation: true,
4
+ noiseSuppression: true,
5
+ autoGainControl: true
6
+ };
7
+ const disconnectReasonLabel = (reason) => {
8
+ if (reason === void 0) return "room-disconnected";
9
+ const name = DisconnectReason[reason];
10
+ return `room-disconnected:${(name ?? String(reason)).toLowerCase()}`;
11
+ };
12
+ const defaultRoomFactory = () => new Room({
13
+ adaptiveStream: false,
14
+ dynacast: false,
15
+ audioCaptureDefaults: MICROPHONE_CAPTURE,
16
+ publishDefaults: { stopMicTrackOnMute: true }
17
+ });
18
+ async function joinDeepAgentVoiceRoom({
19
+ answer,
20
+ handlers,
21
+ audioElement,
22
+ roomFactory = defaultRoomFactory
23
+ }) {
24
+ const { signal } = handlers;
25
+ const endedError = () => new DOMException("The voice session ended", "AbortError");
26
+ if (signal == null ? void 0 : signal.aborted) throw endedError();
27
+ const room = roomFactory();
28
+ let connected = false;
29
+ let joined = false;
30
+ let closed = false;
31
+ let disconnecting = null;
32
+ const attached = /* @__PURE__ */ new Set();
33
+ let rejectEnded;
34
+ const ended = new Promise((_, reject) => {
35
+ rejectEnded = reject;
36
+ });
37
+ const closeRoom = () => {
38
+ closed = true;
39
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
40
+ for (const track of attached) {
41
+ try {
42
+ track.detach();
43
+ } catch {
44
+ }
45
+ }
46
+ attached.clear();
47
+ disconnecting ?? (disconnecting = room.disconnect().then(() => void 0));
48
+ return disconnecting;
49
+ };
50
+ const onAbort = () => {
51
+ rejectEnded(endedError());
52
+ void closeRoom().catch(() => void 0);
53
+ };
54
+ signal == null ? void 0 : signal.addEventListener("abort", onAbort, { once: true });
55
+ if (signal == null ? void 0 : signal.aborted) onAbort();
56
+ room.on(RoomEvent.TrackSubscribed, (track) => {
57
+ if (closed || track.kind !== Track.Kind.Audio) return;
58
+ track.attach(audioElement() ?? void 0);
59
+ attached.add(track);
60
+ });
61
+ room.on(RoomEvent.TrackUnsubscribed, (track) => {
62
+ if (track.kind !== Track.Kind.Audio) return;
63
+ if (attached.delete(track)) track.detach();
64
+ });
65
+ room.on(RoomEvent.Disconnected, (reason) => {
66
+ if (closed) return;
67
+ if (!connected && reason === DisconnectReason.JOIN_FAILURE) return;
68
+ const label = disconnectReasonLabel(reason);
69
+ rejectEnded(new Error(label));
70
+ void closeRoom().catch(() => void 0);
71
+ if (joined) handlers.onDisconnected(label);
72
+ });
73
+ const checkOpen = () => {
74
+ if (closed) throw endedError();
75
+ };
76
+ const joining = (async () => {
77
+ try {
78
+ checkOpen();
79
+ await room.connect(answer.serverUrl, answer.token);
80
+ connected = true;
81
+ checkOpen();
82
+ await room.localParticipant.setMicrophoneEnabled(
83
+ !handlers.micMuted,
84
+ MICROPHONE_CAPTURE
85
+ );
86
+ checkOpen();
87
+ } catch (error) {
88
+ const alreadyClosed = closed;
89
+ await closeRoom().catch(() => void 0);
90
+ if (alreadyClosed) await room.disconnect().catch(() => void 0);
91
+ throw error;
92
+ }
93
+ })();
94
+ await Promise.race([joining, ended]);
95
+ checkOpen();
96
+ joined = true;
97
+ return {
98
+ setMicrophoneEnabled: (enabled) => {
99
+ const changing = (async () => {
100
+ checkOpen();
101
+ try {
102
+ await room.localParticipant.setMicrophoneEnabled(enabled);
103
+ checkOpen();
104
+ } finally {
105
+ if (closed) await room.disconnect().catch(() => void 0);
106
+ }
107
+ })();
108
+ return Promise.race([changing, ended]);
109
+ },
110
+ disconnect: () => {
111
+ rejectEnded(endedError());
112
+ return closeRoom();
113
+ }
114
+ };
115
+ }
116
+ export {
117
+ joinDeepAgentVoiceRoom
118
+ };
119
+ //# sourceMappingURL=livekit-join.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livekit-join.js","sources":["../../src/voice/livekit-join.ts"],"sourcesContent":["import type {\n DeepAgentVoiceLiveKitSession,\n DeepAgentVoiceLiveKitRoom,\n DeepAgentVoiceLiveKitRemoteTrack,\n JoinDeepAgentVoiceRoomOptions,\n} from './livekit';\nimport {\n type AudioCaptureOptions,\n DisconnectReason,\n Room,\n RoomEvent,\n Track,\n} from 'livekit-client';\n\n/** Conversation-grade capture: the same processing the transcriber asks for. */\nconst MICROPHONE_CAPTURE = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n} satisfies AudioCaptureOptions;\n\n/** The media-loss reason the session state machine records for a room drop. */\nconst disconnectReasonLabel = (\n reason: DisconnectReason | undefined,\n): string => {\n if (reason === undefined) return 'room-disconnected';\n const name: string | undefined = DisconnectReason[reason];\n return `room-disconnected:${(name ?? String(reason)).toLowerCase()}`;\n};\n\n// One remote audio track: adaptive stream and dynacast are video levers.\nconst defaultRoomFactory = (): DeepAgentVoiceLiveKitRoom =>\n new Room({\n adaptiveStream: false,\n dynacast: false,\n audioCaptureDefaults: MICROPHONE_CAPTURE,\n publishDefaults: { stopMicTrackOnMute: true },\n });\n\n/**\n * The LiveKit half of the composer's voice adapter (`livekit.ts`),\n * loaded when a session joins its room: join the room the host minted, publish\n * the microphone, play the agent's track, and report a drop. Everything that\n * needs `livekit-client` at runtime lives here, behind that one import.\n */\nexport async function joinDeepAgentVoiceRoom({\n answer,\n handlers,\n audioElement,\n roomFactory = defaultRoomFactory,\n}: JoinDeepAgentVoiceRoomOptions): Promise<DeepAgentVoiceLiveKitSession> {\n const { signal } = handlers;\n const endedError = () =>\n new DOMException('The voice session ended', 'AbortError');\n if (signal?.aborted) throw endedError();\n const room = roomFactory();\n let connected = false;\n let joined = false;\n let closed = false;\n let disconnecting: Promise<void> | null = null;\n const attached = new Set<DeepAgentVoiceLiveKitRemoteTrack>();\n let rejectEnded!: (error: Error) => void;\n const ended = new Promise<never>((_, reject) => {\n rejectEnded = reject;\n });\n const closeRoom = (): Promise<void> => {\n closed = true;\n signal?.removeEventListener('abort', onAbort);\n for (const track of attached) {\n try {\n track.detach();\n } catch {\n /* Release the remaining tracks too. */\n }\n }\n attached.clear();\n disconnecting ??= room.disconnect().then(() => undefined);\n return disconnecting;\n };\n const onAbort = (): void => {\n rejectEnded(endedError());\n void closeRoom().catch(() => undefined);\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n // A custom factory may synchronously end its caller's attempt.\n if (signal?.aborted) onAbort();\n room.on(RoomEvent.TrackSubscribed, (track) => {\n if (closed || track.kind !== Track.Kind.Audio) return;\n track.attach(audioElement() ?? undefined);\n attached.add(track);\n });\n room.on(RoomEvent.TrackUnsubscribed, (track) => {\n if (track.kind !== Track.Kind.Audio) return;\n if (attached.delete(track)) track.detach();\n });\n room.on(RoomEvent.Disconnected, (reason) => {\n if (closed) return;\n // Room.connect() emits JOIN_FAILURE before rejecting with its real cause.\n // Preserve that error (including microphone/permission classifications).\n if (!connected && reason === DisconnectReason.JOIN_FAILURE) return;\n // A drop can follow connect() while capture is still pending. Settle the\n // join now; the platform operation may neither resolve nor reject yet.\n const label = disconnectReasonLabel(reason);\n rejectEnded(new Error(label));\n void closeRoom().catch(() => undefined);\n if (joined) handlers.onDisconnected(label);\n });\n const checkOpen = (): void => {\n if (closed) throw endedError();\n };\n const joining = (async () => {\n try {\n checkOpen();\n await room.connect(answer.serverUrl, answer.token);\n connected = true;\n checkOpen();\n await room.localParticipant.setMicrophoneEnabled(\n !handlers.micMuted,\n MICROPHONE_CAPTURE,\n );\n checkOpen();\n } catch (error) {\n const alreadyClosed = closed;\n await closeRoom().catch(() => undefined);\n // An uncancellable capture/join may finish after the first disconnect.\n if (alreadyClosed) await room.disconnect().catch(() => undefined);\n throw error;\n }\n })();\n await Promise.race([joining, ended]);\n checkOpen();\n joined = true;\n return {\n setMicrophoneEnabled: (enabled) => {\n const changing = (async () => {\n checkOpen();\n try {\n await room.localParticipant.setMicrophoneEnabled(enabled);\n checkOpen();\n } finally {\n if (closed) await room.disconnect().catch(() => undefined);\n }\n })();\n return Promise.race([changing, ended]);\n },\n disconnect: () => {\n rejectEnded(endedError());\n return closeRoom();\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ let joinModuleLoad = null;
4
+ const loadDeepAgentVoiceLiveKitJoin = () => {
5
+ joinModuleLoad ?? (joinModuleLoad = Promise.resolve().then(() => require("./livekit-join.cjs")).catch((error) => {
6
+ joinModuleLoad = null;
7
+ throw error;
8
+ }));
9
+ return joinModuleLoad;
10
+ };
11
+ const createDeepAgentVoiceLiveKitAdapter = ({
12
+ audioElement,
13
+ roomFactory
14
+ }) => ({
15
+ async connect(answer, handlers) {
16
+ const { joinDeepAgentVoiceRoom: joinDeepAgentVoiceRoom2 } = await loadDeepAgentVoiceLiveKitJoin();
17
+ return joinDeepAgentVoiceRoom2({
18
+ answer,
19
+ handlers,
20
+ audioElement,
21
+ roomFactory
22
+ });
23
+ }
24
+ });
25
+ async function joinDeepAgentVoiceRoom(options) {
26
+ const join = await loadDeepAgentVoiceLiveKitJoin();
27
+ return join.joinDeepAgentVoiceRoom(options);
28
+ }
29
+ exports.createDeepAgentVoiceLiveKitAdapter = createDeepAgentVoiceLiveKitAdapter;
30
+ exports.joinDeepAgentVoiceRoom = joinDeepAgentVoiceRoom;
31
+ exports.loadDeepAgentVoiceLiveKitJoin = loadDeepAgentVoiceLiveKitJoin;
32
+ //# sourceMappingURL=livekit.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livekit.cjs","sources":["../../src/voice/livekit.ts"],"sourcesContent":["/** Media credentials already authorized and issued by the chat host. */\nexport interface DeepAgentVoiceLiveKitCredentials {\n serverUrl: string;\n token: string;\n}\n\n/** The media controls the shared chat voice lifecycle drives. */\nexport interface DeepAgentVoiceLiveKitSession {\n setMicrophoneEnabled(enabled: boolean): Promise<void>;\n disconnect(): Promise<void>;\n}\n\n/** Lifecycle controls supplied by the owning chat voice attempt. */\nexport interface DeepAgentVoiceLiveKitHandlers {\n micMuted: boolean;\n /** Ends pending and joined media with the owning chat voice attempt. */\n signal?: AbortSignal;\n onDisconnected: (reason: string) => void;\n}\n\n/** Structural media boundary; compatible with the shared agent runtime. */\nexport interface DeepAgentVoiceLiveKitAdapter {\n connect(\n answer: DeepAgentVoiceLiveKitCredentials,\n handlers: DeepAgentVoiceLiveKitHandlers,\n ): Promise<DeepAgentVoiceLiveKitSession>;\n}\n\n/** The remote-track surface the adapter drives (`RemoteTrack`, structurally). */\nexport interface DeepAgentVoiceLiveKitRemoteTrack {\n readonly kind: 'audio' | 'video' | 'unknown';\n /** Without an element LiveKit creates a detached, autoplaying one. */\n attach(element?: HTMLMediaElement): HTMLMediaElement;\n detach(): HTMLMediaElement[];\n}\n\n/**\n * The slice of `livekit-client`'s `Room` the adapter drives — a real `Room`\n * satisfies it; tests inject a fake through `roomFactory`.\n */\nexport interface DeepAgentVoiceLiveKitRoom {\n readonly localParticipant: {\n setMicrophoneEnabled(\n enabled: boolean,\n options?: {\n echoCancellation?: boolean;\n noiseSuppression?: boolean;\n autoGainControl?: boolean;\n },\n ): Promise<unknown>;\n };\n connect(url: string, token: string): Promise<void>;\n disconnect(): Promise<unknown>;\n on(\n event: 'trackSubscribed',\n listener: (track: DeepAgentVoiceLiveKitRemoteTrack) => void,\n ): unknown;\n on(\n event: 'trackUnsubscribed',\n listener: (track: DeepAgentVoiceLiveKitRemoteTrack) => void,\n ): unknown;\n on(event: 'disconnected', listener: (reason?: number) => void): unknown;\n}\n\nexport interface CreateDeepAgentVoiceLiveKitAdapterOptions {\n /**\n * The `<audio>` sink for the agent participant's track, read when the track\n * arrives; `null` lets LiveKit play through an element of its own.\n */\n audioElement: () => HTMLAudioElement | null;\n /** Test seam; defaults to a fresh `livekit-client` `Room`. */\n roomFactory?: () => DeepAgentVoiceLiveKitRoom;\n}\n\ntype DeepAgentVoiceLiveKitJoin = typeof import('./livekit-join');\n\nlet joinModuleLoad: Promise<DeepAgentVoiceLiveKitJoin> | null = null;\n\n/**\n * The room join and `livekit-client` (~120 KB gzip) are fetched when a voice\n * session starts, not with the composer: every Spaces boot mounts the\n * composer, few start a voice session. One `import()` keeps LiveKit in one\n * lazy chunk group. A failed import is not memoized: the next session imports\n * again.\n */\nexport const loadDeepAgentVoiceLiveKitJoin =\n (): Promise<DeepAgentVoiceLiveKitJoin> => {\n joinModuleLoad ??= import('./livekit-join').catch((error: unknown) => {\n joinModuleLoad = null;\n throw error;\n });\n return joinModuleLoad;\n };\n\n/**\n * The composer's LiveKit leg for the shared voice session\n * (`useDeepAgentVoice({ transport: 'livekit' })`): join the room the host\n * minted, publish the microphone, play the agent's track, and report a drop\n * (`joinDeepAgentVoiceRoom`, loaded on the first join).\n */\nexport const createDeepAgentVoiceLiveKitAdapter = ({\n audioElement,\n roomFactory,\n}: CreateDeepAgentVoiceLiveKitAdapterOptions): DeepAgentVoiceLiveKitAdapter => ({\n async connect(\n answer: DeepAgentVoiceLiveKitCredentials,\n handlers: DeepAgentVoiceLiveKitHandlers,\n ): Promise<DeepAgentVoiceLiveKitSession> {\n const { joinDeepAgentVoiceRoom } = await loadDeepAgentVoiceLiveKitJoin();\n return joinDeepAgentVoiceRoom({\n answer,\n handlers,\n audioElement,\n roomFactory,\n });\n },\n});\n\n/** Join with an already-authorized room answer without eagerly loading LiveKit. */\nexport async function joinDeepAgentVoiceRoom(\n options: JoinDeepAgentVoiceRoomOptions,\n): Promise<DeepAgentVoiceLiveKitSession> {\n const join = await loadDeepAgentVoiceLiveKitJoin();\n return join.joinDeepAgentVoiceRoom(options);\n}\n\nexport interface JoinDeepAgentVoiceRoomOptions {\n answer: DeepAgentVoiceLiveKitCredentials;\n handlers: DeepAgentVoiceLiveKitHandlers;\n audioElement: () => HTMLAudioElement | null;\n roomFactory?: () => DeepAgentVoiceLiveKitRoom;\n}\n"],"names":["joinDeepAgentVoiceRoom"],"mappings":";;AA4EA,IAAI,iBAA4D;AASzD,MAAM,gCACX,MAA0C;AACxC,sCAAmB,QAAA,QAAA,EAAA,KAAA,MAAA,QAAO,oBAAgB,CAAA,EAAE,MAAM,CAAC,UAAmB;AACpE,qBAAiB;AACjB,UAAM;AAAA,EACR,CAAC;AACD,SAAO;AACT;AAQK,MAAM,qCAAqC,CAAC;AAAA,EACjD;AAAA,EACA;AACF,OAAgF;AAAA,EAC9E,MAAM,QACJ,QACA,UACuC;AACvC,UAAM,EAAE,wBAAAA,wBAAAA,IAA2B,MAAM,8BAAA;AACzC,WAAOA,wBAAuB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAGA,eAAsB,uBACpB,SACuC;AACvC,QAAM,OAAO,MAAM,8BAAA;AACnB,SAAO,KAAK,uBAAuB,OAAO;AAC5C;;;;"}
@@ -0,0 +1,80 @@
1
+ /** Media credentials already authorized and issued by the chat host. */
2
+ export interface DeepAgentVoiceLiveKitCredentials {
3
+ serverUrl: string;
4
+ token: string;
5
+ }
6
+ /** The media controls the shared chat voice lifecycle drives. */
7
+ export interface DeepAgentVoiceLiveKitSession {
8
+ setMicrophoneEnabled(enabled: boolean): Promise<void>;
9
+ disconnect(): Promise<void>;
10
+ }
11
+ /** Lifecycle controls supplied by the owning chat voice attempt. */
12
+ export interface DeepAgentVoiceLiveKitHandlers {
13
+ micMuted: boolean;
14
+ /** Ends pending and joined media with the owning chat voice attempt. */
15
+ signal?: AbortSignal;
16
+ onDisconnected: (reason: string) => void;
17
+ }
18
+ /** Structural media boundary; compatible with the shared agent runtime. */
19
+ export interface DeepAgentVoiceLiveKitAdapter {
20
+ connect(answer: DeepAgentVoiceLiveKitCredentials, handlers: DeepAgentVoiceLiveKitHandlers): Promise<DeepAgentVoiceLiveKitSession>;
21
+ }
22
+ /** The remote-track surface the adapter drives (`RemoteTrack`, structurally). */
23
+ export interface DeepAgentVoiceLiveKitRemoteTrack {
24
+ readonly kind: 'audio' | 'video' | 'unknown';
25
+ /** Without an element LiveKit creates a detached, autoplaying one. */
26
+ attach(element?: HTMLMediaElement): HTMLMediaElement;
27
+ detach(): HTMLMediaElement[];
28
+ }
29
+ /**
30
+ * The slice of `livekit-client`'s `Room` the adapter drives — a real `Room`
31
+ * satisfies it; tests inject a fake through `roomFactory`.
32
+ */
33
+ export interface DeepAgentVoiceLiveKitRoom {
34
+ readonly localParticipant: {
35
+ setMicrophoneEnabled(enabled: boolean, options?: {
36
+ echoCancellation?: boolean;
37
+ noiseSuppression?: boolean;
38
+ autoGainControl?: boolean;
39
+ }): Promise<unknown>;
40
+ };
41
+ connect(url: string, token: string): Promise<void>;
42
+ disconnect(): Promise<unknown>;
43
+ on(event: 'trackSubscribed', listener: (track: DeepAgentVoiceLiveKitRemoteTrack) => void): unknown;
44
+ on(event: 'trackUnsubscribed', listener: (track: DeepAgentVoiceLiveKitRemoteTrack) => void): unknown;
45
+ on(event: 'disconnected', listener: (reason?: number) => void): unknown;
46
+ }
47
+ export interface CreateDeepAgentVoiceLiveKitAdapterOptions {
48
+ /**
49
+ * The `<audio>` sink for the agent participant's track, read when the track
50
+ * arrives; `null` lets LiveKit play through an element of its own.
51
+ */
52
+ audioElement: () => HTMLAudioElement | null;
53
+ /** Test seam; defaults to a fresh `livekit-client` `Room`. */
54
+ roomFactory?: () => DeepAgentVoiceLiveKitRoom;
55
+ }
56
+ type DeepAgentVoiceLiveKitJoin = typeof import('./livekit-join');
57
+ /**
58
+ * The room join and `livekit-client` (~120 KB gzip) are fetched when a voice
59
+ * session starts, not with the composer: every Spaces boot mounts the
60
+ * composer, few start a voice session. One `import()` keeps LiveKit in one
61
+ * lazy chunk group. A failed import is not memoized: the next session imports
62
+ * again.
63
+ */
64
+ export declare const loadDeepAgentVoiceLiveKitJoin: () => Promise<DeepAgentVoiceLiveKitJoin>;
65
+ /**
66
+ * The composer's LiveKit leg for the shared voice session
67
+ * (`useDeepAgentVoice({ transport: 'livekit' })`): join the room the host
68
+ * minted, publish the microphone, play the agent's track, and report a drop
69
+ * (`joinDeepAgentVoiceRoom`, loaded on the first join).
70
+ */
71
+ export declare const createDeepAgentVoiceLiveKitAdapter: ({ audioElement, roomFactory, }: CreateDeepAgentVoiceLiveKitAdapterOptions) => DeepAgentVoiceLiveKitAdapter;
72
+ /** Join with an already-authorized room answer without eagerly loading LiveKit. */
73
+ export declare function joinDeepAgentVoiceRoom(options: JoinDeepAgentVoiceRoomOptions): Promise<DeepAgentVoiceLiveKitSession>;
74
+ export interface JoinDeepAgentVoiceRoomOptions {
75
+ answer: DeepAgentVoiceLiveKitCredentials;
76
+ handlers: DeepAgentVoiceLiveKitHandlers;
77
+ audioElement: () => HTMLAudioElement | null;
78
+ roomFactory?: () => DeepAgentVoiceLiveKitRoom;
79
+ }
80
+ export {};
@@ -0,0 +1,32 @@
1
+ let joinModuleLoad = null;
2
+ const loadDeepAgentVoiceLiveKitJoin = () => {
3
+ joinModuleLoad ?? (joinModuleLoad = import("./livekit-join.js").catch((error) => {
4
+ joinModuleLoad = null;
5
+ throw error;
6
+ }));
7
+ return joinModuleLoad;
8
+ };
9
+ const createDeepAgentVoiceLiveKitAdapter = ({
10
+ audioElement,
11
+ roomFactory
12
+ }) => ({
13
+ async connect(answer, handlers) {
14
+ const { joinDeepAgentVoiceRoom: joinDeepAgentVoiceRoom2 } = await loadDeepAgentVoiceLiveKitJoin();
15
+ return joinDeepAgentVoiceRoom2({
16
+ answer,
17
+ handlers,
18
+ audioElement,
19
+ roomFactory
20
+ });
21
+ }
22
+ });
23
+ async function joinDeepAgentVoiceRoom(options) {
24
+ const join = await loadDeepAgentVoiceLiveKitJoin();
25
+ return join.joinDeepAgentVoiceRoom(options);
26
+ }
27
+ export {
28
+ createDeepAgentVoiceLiveKitAdapter,
29
+ joinDeepAgentVoiceRoom,
30
+ loadDeepAgentVoiceLiveKitJoin
31
+ };
32
+ //# sourceMappingURL=livekit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livekit.js","sources":["../../src/voice/livekit.ts"],"sourcesContent":["/** Media credentials already authorized and issued by the chat host. */\nexport interface DeepAgentVoiceLiveKitCredentials {\n serverUrl: string;\n token: string;\n}\n\n/** The media controls the shared chat voice lifecycle drives. */\nexport interface DeepAgentVoiceLiveKitSession {\n setMicrophoneEnabled(enabled: boolean): Promise<void>;\n disconnect(): Promise<void>;\n}\n\n/** Lifecycle controls supplied by the owning chat voice attempt. */\nexport interface DeepAgentVoiceLiveKitHandlers {\n micMuted: boolean;\n /** Ends pending and joined media with the owning chat voice attempt. */\n signal?: AbortSignal;\n onDisconnected: (reason: string) => void;\n}\n\n/** Structural media boundary; compatible with the shared agent runtime. */\nexport interface DeepAgentVoiceLiveKitAdapter {\n connect(\n answer: DeepAgentVoiceLiveKitCredentials,\n handlers: DeepAgentVoiceLiveKitHandlers,\n ): Promise<DeepAgentVoiceLiveKitSession>;\n}\n\n/** The remote-track surface the adapter drives (`RemoteTrack`, structurally). */\nexport interface DeepAgentVoiceLiveKitRemoteTrack {\n readonly kind: 'audio' | 'video' | 'unknown';\n /** Without an element LiveKit creates a detached, autoplaying one. */\n attach(element?: HTMLMediaElement): HTMLMediaElement;\n detach(): HTMLMediaElement[];\n}\n\n/**\n * The slice of `livekit-client`'s `Room` the adapter drives — a real `Room`\n * satisfies it; tests inject a fake through `roomFactory`.\n */\nexport interface DeepAgentVoiceLiveKitRoom {\n readonly localParticipant: {\n setMicrophoneEnabled(\n enabled: boolean,\n options?: {\n echoCancellation?: boolean;\n noiseSuppression?: boolean;\n autoGainControl?: boolean;\n },\n ): Promise<unknown>;\n };\n connect(url: string, token: string): Promise<void>;\n disconnect(): Promise<unknown>;\n on(\n event: 'trackSubscribed',\n listener: (track: DeepAgentVoiceLiveKitRemoteTrack) => void,\n ): unknown;\n on(\n event: 'trackUnsubscribed',\n listener: (track: DeepAgentVoiceLiveKitRemoteTrack) => void,\n ): unknown;\n on(event: 'disconnected', listener: (reason?: number) => void): unknown;\n}\n\nexport interface CreateDeepAgentVoiceLiveKitAdapterOptions {\n /**\n * The `<audio>` sink for the agent participant's track, read when the track\n * arrives; `null` lets LiveKit play through an element of its own.\n */\n audioElement: () => HTMLAudioElement | null;\n /** Test seam; defaults to a fresh `livekit-client` `Room`. */\n roomFactory?: () => DeepAgentVoiceLiveKitRoom;\n}\n\ntype DeepAgentVoiceLiveKitJoin = typeof import('./livekit-join');\n\nlet joinModuleLoad: Promise<DeepAgentVoiceLiveKitJoin> | null = null;\n\n/**\n * The room join and `livekit-client` (~120 KB gzip) are fetched when a voice\n * session starts, not with the composer: every Spaces boot mounts the\n * composer, few start a voice session. One `import()` keeps LiveKit in one\n * lazy chunk group. A failed import is not memoized: the next session imports\n * again.\n */\nexport const loadDeepAgentVoiceLiveKitJoin =\n (): Promise<DeepAgentVoiceLiveKitJoin> => {\n joinModuleLoad ??= import('./livekit-join').catch((error: unknown) => {\n joinModuleLoad = null;\n throw error;\n });\n return joinModuleLoad;\n };\n\n/**\n * The composer's LiveKit leg for the shared voice session\n * (`useDeepAgentVoice({ transport: 'livekit' })`): join the room the host\n * minted, publish the microphone, play the agent's track, and report a drop\n * (`joinDeepAgentVoiceRoom`, loaded on the first join).\n */\nexport const createDeepAgentVoiceLiveKitAdapter = ({\n audioElement,\n roomFactory,\n}: CreateDeepAgentVoiceLiveKitAdapterOptions): DeepAgentVoiceLiveKitAdapter => ({\n async connect(\n answer: DeepAgentVoiceLiveKitCredentials,\n handlers: DeepAgentVoiceLiveKitHandlers,\n ): Promise<DeepAgentVoiceLiveKitSession> {\n const { joinDeepAgentVoiceRoom } = await loadDeepAgentVoiceLiveKitJoin();\n return joinDeepAgentVoiceRoom({\n answer,\n handlers,\n audioElement,\n roomFactory,\n });\n },\n});\n\n/** Join with an already-authorized room answer without eagerly loading LiveKit. */\nexport async function joinDeepAgentVoiceRoom(\n options: JoinDeepAgentVoiceRoomOptions,\n): Promise<DeepAgentVoiceLiveKitSession> {\n const join = await loadDeepAgentVoiceLiveKitJoin();\n return join.joinDeepAgentVoiceRoom(options);\n}\n\nexport interface JoinDeepAgentVoiceRoomOptions {\n answer: DeepAgentVoiceLiveKitCredentials;\n handlers: DeepAgentVoiceLiveKitHandlers;\n audioElement: () => HTMLAudioElement | null;\n roomFactory?: () => DeepAgentVoiceLiveKitRoom;\n}\n"],"names":["joinDeepAgentVoiceRoom"],"mappings":"AA4EA,IAAI,iBAA4D;AASzD,MAAM,gCACX,MAA0C;AACxC,sCAAmB,OAAO,mBAAgB,EAAE,MAAM,CAAC,UAAmB;AACpE,qBAAiB;AACjB,UAAM;AAAA,EACR,CAAC;AACD,SAAO;AACT;AAQK,MAAM,qCAAqC,CAAC;AAAA,EACjD;AAAA,EACA;AACF,OAAgF;AAAA,EAC9E,MAAM,QACJ,QACA,UACuC;AACvC,UAAM,EAAE,wBAAAA,wBAAAA,IAA2B,MAAM,8BAAA;AACzC,WAAOA,wBAAuB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAGA,eAAsB,uBACpB,SACuC;AACvC,QAAM,OAAO,MAAM,8BAAA;AACnB,SAAO,KAAK,uBAAuB,OAAO;AAC5C;"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const reactQuery = require("@tanstack/react-query");
4
+ const apiClient = require("../chat-ui/mentions/suggestions/data/api-client.cjs");
5
+ const runtimeCatalog = require("../catalog/runtime-catalog.cjs");
6
+ const CHAT_VOICE_ACCESS_QUERY = `
7
+ query AthenaChatVoiceAccess {
8
+ getCurrentUserWithWorkspace { workspace { id voiceModeConfig } }
9
+ }
10
+ `;
11
+ function readChatVoiceEnabled(data) {
12
+ if (typeof data !== "object" || data === null || !("getCurrentUserWithWorkspace" in data))
13
+ return false;
14
+ const account = data.getCurrentUserWithWorkspace;
15
+ if (typeof account !== "object" || account === null || !("workspace" in account)) return false;
16
+ const workspace = account.workspace;
17
+ if (typeof workspace !== "object" || workspace === null || !("voiceModeConfig" in workspace))
18
+ return false;
19
+ const config = workspace.voiceModeConfig;
20
+ return typeof config === "object" && config !== null && "enabled" in config && config.enabled === true;
21
+ }
22
+ function useChatVoiceEnabled({ enabled }) {
23
+ const auth = apiClient.useMentionAuth();
24
+ const principal = runtimeCatalog.useCatalogPrincipal();
25
+ const queryClient = runtimeCatalog.useCatalogQueryClient();
26
+ const query = reactQuery.useQuery(
27
+ {
28
+ queryKey: ["athena-sdk", "chat-voice-access", auth.backendUrl, principal, auth.workspaceId],
29
+ queryFn: async ({ signal }) => readChatVoiceEnabled(
30
+ await apiClient.fetchGraphQL(auth, CHAT_VOICE_ACCESS_QUERY, {}, { signal })
31
+ ),
32
+ enabled,
33
+ retry: false,
34
+ staleTime: 3e4,
35
+ refetchInterval: 3e4
36
+ },
37
+ queryClient
38
+ );
39
+ return enabled && !query.isError && query.data === true;
40
+ }
41
+ exports.readChatVoiceEnabled = readChatVoiceEnabled;
42
+ exports.useChatVoiceEnabled = useChatVoiceEnabled;
43
+ //# sourceMappingURL=use-chat-voice-enabled.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chat-voice-enabled.cjs","sources":["../../src/voice/use-chat-voice-enabled.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { useMentionAuth, fetchGraphQL } from '../chat-ui/mentions/suggestions/data/api-client';\nimport { useCatalogPrincipal, useCatalogQueryClient } from '../catalog/runtime-catalog';\n\nconst CHAT_VOICE_ACCESS_QUERY = `\n query AthenaChatVoiceAccess {\n getCurrentUserWithWorkspace { workspace { id voiceModeConfig } }\n }\n`;\n\n/** Only an explicit boolean enables voice; malformed or older answers fail closed. */\nexport function readChatVoiceEnabled(data: unknown): boolean {\n if (typeof data !== 'object' || data === null || !('getCurrentUserWithWorkspace' in data))\n return false;\n const account = data.getCurrentUserWithWorkspace;\n if (typeof account !== 'object' || account === null || !('workspace' in account)) return false;\n const workspace = account.workspace;\n if (typeof workspace !== 'object' || workspace === null || !('voiceModeConfig' in workspace))\n return false;\n const config = workspace.voiceModeConfig;\n return (\n typeof config === 'object' && config !== null && 'enabled' in config && config.enabled === true\n );\n}\n\n/**\n * The workspace read already folds in VOICE_MODE_ENABLED on the server. This\n * controls presentation; voice/start still enforces _require_voice_access.\n */\nexport function useChatVoiceEnabled({ enabled }: { enabled: boolean }): boolean {\n const auth = useMentionAuth();\n const principal = useCatalogPrincipal();\n const queryClient = useCatalogQueryClient();\n const query = useQuery(\n {\n queryKey: ['athena-sdk', 'chat-voice-access', auth.backendUrl, principal, auth.workspaceId],\n queryFn: async ({ signal }) =>\n readChatVoiceEnabled(\n await fetchGraphQL<unknown>(auth, CHAT_VOICE_ACCESS_QUERY, {}, { signal })\n ),\n enabled,\n retry: false,\n staleTime: 30_000,\n refetchInterval: 30_000,\n },\n queryClient\n );\n return enabled && !query.isError && query.data === true;\n}\n"],"names":["useMentionAuth","useCatalogPrincipal","useCatalogQueryClient","useQuery","fetchGraphQL"],"mappings":";;;;;AAIA,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAOzB,SAAS,qBAAqB,MAAwB;AAC3D,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,EAAE,iCAAiC;AAClF,WAAO;AACT,QAAM,UAAU,KAAK;AACrB,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,EAAE,eAAe,SAAU,QAAO;AACzF,QAAM,YAAY,QAAQ;AAC1B,MAAI,OAAO,cAAc,YAAY,cAAc,QAAQ,EAAE,qBAAqB;AAChF,WAAO;AACT,QAAM,SAAS,UAAU;AACzB,SACE,OAAO,WAAW,YAAY,WAAW,QAAQ,aAAa,UAAU,OAAO,YAAY;AAE/F;AAMO,SAAS,oBAAoB,EAAE,WAA0C;AAC9E,QAAM,OAAOA,UAAAA,eAAA;AACb,QAAM,YAAYC,eAAAA,oBAAA;AAClB,QAAM,cAAcC,eAAAA,sBAAA;AACpB,QAAM,QAAQC,WAAAA;AAAAA,IACZ;AAAA,MACE,UAAU,CAAC,cAAc,qBAAqB,KAAK,YAAY,WAAW,KAAK,WAAW;AAAA,MAC1F,SAAS,OAAO,EAAE,OAAA,MAChB;AAAA,QACE,MAAMC,UAAAA,aAAsB,MAAM,yBAAyB,CAAA,GAAI,EAAE,QAAQ;AAAA,MAAA;AAAA,MAE7E;AAAA,MACA,OAAO;AAAA,MACP,WAAW;AAAA,MACX,iBAAiB;AAAA,IAAA;AAAA,IAEnB;AAAA,EAAA;AAEF,SAAO,WAAW,CAAC,MAAM,WAAW,MAAM,SAAS;AACrD;;;"}
@@ -0,0 +1,9 @@
1
+ /** Only an explicit boolean enables voice; malformed or older answers fail closed. */
2
+ export declare function readChatVoiceEnabled(data: unknown): boolean;
3
+ /**
4
+ * The workspace read already folds in VOICE_MODE_ENABLED on the server. This
5
+ * controls presentation; voice/start still enforces _require_voice_access.
6
+ */
7
+ export declare function useChatVoiceEnabled({ enabled }: {
8
+ enabled: boolean;
9
+ }): boolean;
@@ -0,0 +1,43 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ import { useMentionAuth, fetchGraphQL } from "../chat-ui/mentions/suggestions/data/api-client.js";
3
+ import { useCatalogPrincipal, useCatalogQueryClient } from "../catalog/runtime-catalog.js";
4
+ const CHAT_VOICE_ACCESS_QUERY = `
5
+ query AthenaChatVoiceAccess {
6
+ getCurrentUserWithWorkspace { workspace { id voiceModeConfig } }
7
+ }
8
+ `;
9
+ function readChatVoiceEnabled(data) {
10
+ if (typeof data !== "object" || data === null || !("getCurrentUserWithWorkspace" in data))
11
+ return false;
12
+ const account = data.getCurrentUserWithWorkspace;
13
+ if (typeof account !== "object" || account === null || !("workspace" in account)) return false;
14
+ const workspace = account.workspace;
15
+ if (typeof workspace !== "object" || workspace === null || !("voiceModeConfig" in workspace))
16
+ return false;
17
+ const config = workspace.voiceModeConfig;
18
+ return typeof config === "object" && config !== null && "enabled" in config && config.enabled === true;
19
+ }
20
+ function useChatVoiceEnabled({ enabled }) {
21
+ const auth = useMentionAuth();
22
+ const principal = useCatalogPrincipal();
23
+ const queryClient = useCatalogQueryClient();
24
+ const query = useQuery(
25
+ {
26
+ queryKey: ["athena-sdk", "chat-voice-access", auth.backendUrl, principal, auth.workspaceId],
27
+ queryFn: async ({ signal }) => readChatVoiceEnabled(
28
+ await fetchGraphQL(auth, CHAT_VOICE_ACCESS_QUERY, {}, { signal })
29
+ ),
30
+ enabled,
31
+ retry: false,
32
+ staleTime: 3e4,
33
+ refetchInterval: 3e4
34
+ },
35
+ queryClient
36
+ );
37
+ return enabled && !query.isError && query.data === true;
38
+ }
39
+ export {
40
+ readChatVoiceEnabled,
41
+ useChatVoiceEnabled
42
+ };
43
+ //# sourceMappingURL=use-chat-voice-enabled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chat-voice-enabled.js","sources":["../../src/voice/use-chat-voice-enabled.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { useMentionAuth, fetchGraphQL } from '../chat-ui/mentions/suggestions/data/api-client';\nimport { useCatalogPrincipal, useCatalogQueryClient } from '../catalog/runtime-catalog';\n\nconst CHAT_VOICE_ACCESS_QUERY = `\n query AthenaChatVoiceAccess {\n getCurrentUserWithWorkspace { workspace { id voiceModeConfig } }\n }\n`;\n\n/** Only an explicit boolean enables voice; malformed or older answers fail closed. */\nexport function readChatVoiceEnabled(data: unknown): boolean {\n if (typeof data !== 'object' || data === null || !('getCurrentUserWithWorkspace' in data))\n return false;\n const account = data.getCurrentUserWithWorkspace;\n if (typeof account !== 'object' || account === null || !('workspace' in account)) return false;\n const workspace = account.workspace;\n if (typeof workspace !== 'object' || workspace === null || !('voiceModeConfig' in workspace))\n return false;\n const config = workspace.voiceModeConfig;\n return (\n typeof config === 'object' && config !== null && 'enabled' in config && config.enabled === true\n );\n}\n\n/**\n * The workspace read already folds in VOICE_MODE_ENABLED on the server. This\n * controls presentation; voice/start still enforces _require_voice_access.\n */\nexport function useChatVoiceEnabled({ enabled }: { enabled: boolean }): boolean {\n const auth = useMentionAuth();\n const principal = useCatalogPrincipal();\n const queryClient = useCatalogQueryClient();\n const query = useQuery(\n {\n queryKey: ['athena-sdk', 'chat-voice-access', auth.backendUrl, principal, auth.workspaceId],\n queryFn: async ({ signal }) =>\n readChatVoiceEnabled(\n await fetchGraphQL<unknown>(auth, CHAT_VOICE_ACCESS_QUERY, {}, { signal })\n ),\n enabled,\n retry: false,\n staleTime: 30_000,\n refetchInterval: 30_000,\n },\n queryClient\n );\n return enabled && !query.isError && query.data === true;\n}\n"],"names":[],"mappings":";;;AAIA,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAOzB,SAAS,qBAAqB,MAAwB;AAC3D,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,EAAE,iCAAiC;AAClF,WAAO;AACT,QAAM,UAAU,KAAK;AACrB,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,EAAE,eAAe,SAAU,QAAO;AACzF,QAAM,YAAY,QAAQ;AAC1B,MAAI,OAAO,cAAc,YAAY,cAAc,QAAQ,EAAE,qBAAqB;AAChF,WAAO;AACT,QAAM,SAAS,UAAU;AACzB,SACE,OAAO,WAAW,YAAY,WAAW,QAAQ,aAAa,UAAU,OAAO,YAAY;AAE/F;AAMO,SAAS,oBAAoB,EAAE,WAA0C;AAC9E,QAAM,OAAO,eAAA;AACb,QAAM,YAAY,oBAAA;AAClB,QAAM,cAAc,sBAAA;AACpB,QAAM,QAAQ;AAAA,IACZ;AAAA,MACE,UAAU,CAAC,cAAc,qBAAqB,KAAK,YAAY,WAAW,KAAK,WAAW;AAAA,MAC1F,SAAS,OAAO,EAAE,OAAA,MAChB;AAAA,QACE,MAAM,aAAsB,MAAM,yBAAyB,CAAA,GAAI,EAAE,QAAQ;AAAA,MAAA;AAAA,MAE7E;AAAA,MACA,OAAO;AAAA,MACP,WAAW;AAAA,MACX,iBAAiB;AAAA,IAAA;AAAA,IAEnB;AAAA,EAAA;AAEF,SAAO,WAAW,CAAC,MAAM,WAAW,MAAM,SAAS;AACrD;"}