@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,1019 @@
1
+ import { useStatewireSendCommand, useStatewireState } from "@assistant-ui/react-statewire";
2
+ import { useRef, useCallback, useState, useEffect, useMemo } from "react";
3
+ import { statewireRejectionPayload } from "./errors.js";
4
+ import { readDeepAgentStreamValues, isDeepAgentStateHydrated } from "./statewire-state.js";
5
+ const readSendFailure = (error) => {
6
+ const failure = error == null ? void 0 : error.failure;
7
+ if (failure === null || typeof failure !== "object") return null;
8
+ return typeof failure.fate === "string" ? failure : null;
9
+ };
10
+ const errorMessage = (error) => error instanceof Error ? error.message : String(error);
11
+ class VoiceAnswerTimeoutError extends Error {
12
+ constructor() {
13
+ super("The voice session did not answer in time");
14
+ this.name = "VoiceAnswerTimeoutError";
15
+ }
16
+ }
17
+ const classifyVoiceStartError = (error) => {
18
+ if (error instanceof VoiceAnswerTimeoutError) {
19
+ return { kind: "answer_timeout", message: error.message };
20
+ }
21
+ const failure = readSendFailure(error);
22
+ if (failure === null) return { kind: "unknown", message: errorMessage(error) };
23
+ if (failure.fate === "rejected") {
24
+ const payload = failure.payload;
25
+ const detail = payload == null ? void 0 : payload.detail;
26
+ const reason = typeof (payload == null ? void 0 : payload.reason) === "string" ? payload.reason : void 0;
27
+ const detailCode = typeof (detail == null ? void 0 : detail.code) === "string" ? detail.code : void 0;
28
+ const detailMessage = typeof (detail == null ? void 0 : detail.message) === "string" ? detail.message : void 0;
29
+ const code = reason ?? detailCode ?? failure.code;
30
+ const status = typeof (payload == null ? void 0 : payload.status) === "number" ? payload.status : void 0;
31
+ return {
32
+ kind: "server_rejected",
33
+ message: failure.message ?? detailMessage ?? errorMessage(error),
34
+ ...code !== void 0 && { code },
35
+ ...status !== void 0 && { status }
36
+ };
37
+ }
38
+ return {
39
+ kind: "command_failed",
40
+ message: failure.message ?? errorMessage(error),
41
+ fate: failure.fate,
42
+ ...failure.cause !== void 0 && failure.cause !== "server" && { reason: failure.cause }
43
+ };
44
+ };
45
+ class VoiceNoAnswerError extends Error {
46
+ constructor(message) {
47
+ super(message);
48
+ this.name = "VoiceNoAnswerError";
49
+ }
50
+ }
51
+ const parseVoiceLiveKitAnswer = (answer) => {
52
+ if (!answer.startsWith(VOICE_LIVEKIT_ANSWER_PREFIX)) {
53
+ throw new VoiceNoAnswerError("voice/start returned no voice room");
54
+ }
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(answer.slice(VOICE_LIVEKIT_ANSWER_PREFIX.length));
58
+ } catch {
59
+ throw new VoiceNoAnswerError("voice/start returned a malformed voice room");
60
+ }
61
+ const record = parsed ?? null;
62
+ const serverUrl = record == null ? void 0 : record.serverUrl;
63
+ const token = record == null ? void 0 : record.token;
64
+ const roomName = record == null ? void 0 : record.roomName;
65
+ if (typeof serverUrl !== "string" || serverUrl === "" || typeof token !== "string" || token === "" || typeof roomName !== "string" || roomName === "") {
66
+ throw new VoiceNoAnswerError("voice/start returned an incomplete voice room");
67
+ }
68
+ return { serverUrl, token, roomName };
69
+ };
70
+ const classifyStartFailure = (error, stage) => {
71
+ const message = errorMessage(error);
72
+ switch (stage) {
73
+ case "preflight":
74
+ return { kind: "unsupported", stage, message };
75
+ case "audio-session":
76
+ return { kind: "audio_session", stage, message };
77
+ case "capture":
78
+ return {
79
+ kind: isMicrophoneDenied(error) ? "microphone_denied" : "capture_failed",
80
+ stage,
81
+ message
82
+ };
83
+ case "offer":
84
+ return { kind: "offer_failed", stage, message };
85
+ case "negotiate":
86
+ return { ...classifyVoiceStartError(error), stage };
87
+ case "answer":
88
+ return {
89
+ kind: error instanceof VoiceNoAnswerError ? "no_answer" : "answer_failed",
90
+ stage,
91
+ message
92
+ };
93
+ case "relay":
94
+ return { kind: "relay_failed", stage, message };
95
+ case "room":
96
+ return {
97
+ kind: isMicrophoneDenied(error) ? "microphone_denied" : "room_failed",
98
+ stage,
99
+ message
100
+ };
101
+ default:
102
+ return { kind: "unknown", stage, message };
103
+ }
104
+ };
105
+ const isMicrophoneDenied = (error) => {
106
+ const name = error == null ? void 0 : error.name;
107
+ if (name === "SecurityError" || name === "NotAllowedError" || name === "PermissionDeniedError") {
108
+ return true;
109
+ }
110
+ return /permission|denied|not allowed/i.test(errorMessage(error));
111
+ };
112
+ const describeVoiceFailure = (failure) => {
113
+ switch (failure.kind) {
114
+ case "microphone_denied":
115
+ return "Microphone access is blocked. Allow the microphone for Athena and try again.";
116
+ case "unsupported":
117
+ return "Voice mode is not available in this environment.";
118
+ case "audio_session":
119
+ return `The audio session could not start: ${failure.message}`;
120
+ case "answer_timeout":
121
+ return "The voice session did not answer in time. Check your connection and try again.";
122
+ case "room_failed":
123
+ return "The voice room could not be joined. Check your connection and try again.";
124
+ case "media_lost":
125
+ return "The voice connection was lost. Start voice again to continue.";
126
+ case "server_rejected":
127
+ if (failure.code === "voice-active") {
128
+ return "A voice session is already live on another device or tab. End it there first.";
129
+ }
130
+ if (failure.code === "voice-not-enabled") {
131
+ return "Voice mode is not enabled for this workspace.";
132
+ }
133
+ return failure.message;
134
+ default:
135
+ return failure.message;
136
+ }
137
+ };
138
+ const VOICE_WEBSOCKET_OFFER = "athena-voice-transport:websocket/v1";
139
+ const VOICE_RELAY_ANSWER_PREFIX = "athena-voice-relay:";
140
+ const VOICE_RELAY_SAMPLE_RATE = 24e3;
141
+ const VOICE_LIVEKIT_OFFER = "athena-voice-transport:livekit/v1";
142
+ const VOICE_LIVEKIT_ANSWER_PREFIX = "athena-voice-livekit:";
143
+ const VOICE_MODEL_PROVIDERS = /* @__PURE__ */ new Set(["openai_live", "google"]);
144
+ const parseVoiceModelOptions = (value) => {
145
+ if (!Array.isArray(value)) return null;
146
+ const options = [];
147
+ for (const entry of value) {
148
+ if (entry === null || typeof entry !== "object") continue;
149
+ const { id, label, provider, enabled, description } = entry;
150
+ if (typeof id !== "string" || id === "" || typeof label !== "string" || typeof provider !== "string" || !VOICE_MODEL_PROVIDERS.has(provider) || typeof enabled !== "boolean" || typeof description !== "string") {
151
+ continue;
152
+ }
153
+ options.push({
154
+ id,
155
+ label,
156
+ provider,
157
+ enabled,
158
+ description
159
+ });
160
+ }
161
+ return options;
162
+ };
163
+ const sameVoiceModelOptions = (a, b) => a.length === b.length && a.every((option, index) => {
164
+ const other = b[index];
165
+ return other !== void 0 && option.id === other.id && option.label === other.label && option.provider === other.provider && option.enabled === other.enabled && option.description === other.description;
166
+ });
167
+ function releaseCaptureStream(stream) {
168
+ if (!stream) return;
169
+ releaseSafely(() => {
170
+ for (const track of stream.getTracks()) releaseSafely(() => track.stop());
171
+ });
172
+ releaseSafely(() => {
173
+ var _a;
174
+ return (_a = stream.release) == null ? void 0 : _a.call(stream);
175
+ });
176
+ }
177
+ function releaseSafely(release) {
178
+ try {
179
+ void Promise.resolve(release()).catch(() => void 0);
180
+ } catch {
181
+ }
182
+ }
183
+ const voiceGlobals = globalThis;
184
+ const ANSWER_TIMEOUT_MS = 45e3;
185
+ const ICE_TIMEOUT_MS = 1e4;
186
+ const RELAY_OPEN_TIMEOUT_MS = 1e4;
187
+ const RELAY_CAPTURE_FRAME_SAMPLES = 1024;
188
+ const RELAY_PLAYBACK_LEAD_SECONDS = 0.02;
189
+ const MEDIA_DISCONNECT_GRACE_MS = 5e3;
190
+ const END_BEFORE_RESTART_TIMEOUT_MS = 3e3;
191
+ const mintVoiceTextId = () => `voicetext_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 12)}`;
192
+ const formatVoiceElapsed = (sinceMs, nowMs = Date.now()) => {
193
+ const total = Math.max(0, Math.floor((nowMs - sinceMs) / 1e3));
194
+ const hours = Math.floor(total / 3600);
195
+ const minutes = Math.floor(total % 3600 / 60);
196
+ const seconds = total % 60;
197
+ const mmss = `${minutes}:${String(seconds).padStart(2, "0")}`;
198
+ return hours > 0 ? `${hours}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}` : mmss;
199
+ };
200
+ const useVoiceElapsed = (since) => {
201
+ const [now, setNow] = useState(() => Date.now());
202
+ useEffect(() => {
203
+ if (since === null) return;
204
+ setNow(Date.now());
205
+ const timer = setInterval(() => setNow(Date.now()), 1e3);
206
+ return () => clearInterval(timer);
207
+ }, [since]);
208
+ return since === null ? null : formatVoiceElapsed(since, now);
209
+ };
210
+ const REQUEST_LABELS = {
211
+ "session.commentary.append": "a result for the voice conversation",
212
+ "session.thinking.append": "a context update",
213
+ "session.input_audio.mute": "the mute request",
214
+ "session.input_audio.unmute": "the unmute request",
215
+ "response.item.create": "a tool result"
216
+ };
217
+ const describeVoiceWireError = (error) => {
218
+ const subject = error.requestType ? REQUEST_LABELS[error.requestType] ?? `a ${error.requestType} event` : "a session event";
219
+ return `The voice service rejected ${subject}: ${error.message}`;
220
+ };
221
+ const voiceRelayUrl = (relayUrl, ticket) => `${relayUrl.replace(/^http/, "ws").replace(/\/+$/, "")}/api/voice/relay?ticket=${encodeURIComponent(ticket)}`;
222
+ const pcm16FromFloat32 = (samples) => {
223
+ const pcm = new Int16Array(samples.length);
224
+ for (let index = 0; index < samples.length; index += 1) {
225
+ const clamped = Math.max(-1, Math.min(1, samples[index] ?? 0));
226
+ pcm[index] = clamped < 0 ? Math.round(clamped * 32768) : Math.round(clamped * 32767);
227
+ }
228
+ return pcm;
229
+ };
230
+ const float32FromPcm16 = (pcm) => {
231
+ const samples = new Float32Array(pcm.length);
232
+ for (let index = 0; index < pcm.length; index += 1) {
233
+ samples[index] = (pcm[index] ?? 0) / 32768;
234
+ }
235
+ return samples;
236
+ };
237
+ const isRecoveredCommandAuthRejection = (error) => {
238
+ const payload = statewireRejectionPayload(error);
239
+ if ((payload == null ? void 0 : payload.status) !== 503) return false;
240
+ const detail = payload.detail;
241
+ return (detail == null ? void 0 : detail.code) === "command_auth_context_expired" && detail.retryable === true;
242
+ };
243
+ const waitForIce = (pc, timeoutMs) => new Promise((resolve) => {
244
+ if (pc.iceGatheringState === "complete") {
245
+ resolve("complete");
246
+ return;
247
+ }
248
+ const timeout = setTimeout(() => {
249
+ pc.removeEventListener("icegatheringstatechange", check);
250
+ resolve("timeout");
251
+ }, timeoutMs);
252
+ const check = () => {
253
+ if (pc.iceGatheringState !== "complete") return;
254
+ clearTimeout(timeout);
255
+ pc.removeEventListener("icegatheringstatechange", check);
256
+ resolve("complete");
257
+ };
258
+ pc.addEventListener("icegatheringstatechange", check);
259
+ });
260
+ const waitForRelayOpen = (ws, timeoutMs) => new Promise((resolve, reject) => {
261
+ const timeout = setTimeout(
262
+ () => reject(new Error("The voice relay did not open in time")),
263
+ timeoutMs
264
+ );
265
+ ws.addEventListener("open", () => {
266
+ clearTimeout(timeout);
267
+ resolve();
268
+ });
269
+ ws.addEventListener("error", () => {
270
+ clearTimeout(timeout);
271
+ reject(new Error("The voice relay connection failed"));
272
+ });
273
+ ws.addEventListener("close", () => {
274
+ clearTimeout(timeout);
275
+ reject(new Error("The voice relay closed before it opened"));
276
+ });
277
+ });
278
+ const useDeepAgentVoice = (options = {}) => {
279
+ const wireSendCommand = useStatewireSendCommand();
280
+ const sendCommandRef = useRef(wireSendCommand);
281
+ sendCommandRef.current = wireSendCommand;
282
+ const sendCommand = useCallback(
283
+ async (command) => sendCommandRef.current(command),
284
+ []
285
+ );
286
+ const voice = useStatewireState(
287
+ // The raw wire state is non-object until the attach snapshot hydrates it.
288
+ (s) => readDeepAgentStreamValues(s).voice ?? null
289
+ );
290
+ const [phase, setPhase] = useState("idle");
291
+ const [failure, setFailure] = useState(null);
292
+ const error = (failure == null ? void 0 : failure.message) ?? null;
293
+ const [micMuted, setMicMutedState] = useState(false);
294
+ const micMutedRef = useRef(false);
295
+ const micChangeRef = useRef(0);
296
+ const [liveSince, setLiveSince] = useState(null);
297
+ const [handoffTask, setHandoffTask] = useState(null);
298
+ const lastActiveTaskRef = useRef(null);
299
+ const pcRef = useRef(null);
300
+ const releasePeerListenersRef = useRef(null);
301
+ const streamRef = useRef(null);
302
+ const wsRef = useRef(null);
303
+ const audioContextRef = useRef(null);
304
+ const audioNodesRef = useRef([]);
305
+ const playheadRef = useRef(0);
306
+ const livekitRef = useRef(null);
307
+ const livekitAbortRef = useRef(null);
308
+ const attemptRef = useRef(0);
309
+ const startingRef = useRef(false);
310
+ const startPromiseRef = useRef(null);
311
+ const autoRestartedRef = useRef(false);
312
+ const onRemoteStreamRef = useRef(options.onRemoteStream);
313
+ onRemoteStreamRef.current = options.onRemoteStream;
314
+ const audioSessionRef = useRef(options.audioSession);
315
+ audioSessionRef.current = options.audioSession;
316
+ const transportRef = useRef(options.transport ?? "webrtc");
317
+ transportRef.current = options.transport ?? "webrtc";
318
+ const relayUrlRef = useRef(options.relayUrl);
319
+ relayUrlRef.current = options.relayUrl;
320
+ const livekitAdapterRef = useRef(options.livekit);
321
+ livekitAdapterRef.current = options.livekit;
322
+ const modelRef = useRef(options.model);
323
+ modelRef.current = options.model;
324
+ const onDiagnosticRef = useRef(options.onDiagnostic);
325
+ onDiagnosticRef.current = options.onDiagnostic;
326
+ const timeoutsRef = useRef(options.timeouts);
327
+ timeoutsRef.current = options.timeouts;
328
+ const phaseRef = useRef("idle");
329
+ phaseRef.current = phase;
330
+ const attemptStartedAtRef = useRef(0);
331
+ const activeAudioSessionRef = useRef(null);
332
+ const startingAudioSessionRef = useRef(null);
333
+ const audioSessionIdleRef = useRef(Promise.resolve());
334
+ const report = useCallback(
335
+ (event, attempt, data) => {
336
+ const observer = onDiagnosticRef.current;
337
+ if (!observer) return;
338
+ const at = Date.now();
339
+ try {
340
+ observer({
341
+ event,
342
+ attempt,
343
+ at,
344
+ sinceStartMs: Math.max(0, at - attemptStartedAtRef.current),
345
+ ...data !== void 0 && { data }
346
+ });
347
+ } catch {
348
+ }
349
+ },
350
+ []
351
+ );
352
+ const releaseAudioSession = useCallback(() => {
353
+ const session = activeAudioSessionRef.current;
354
+ if (!session) return;
355
+ activeAudioSessionRef.current = null;
356
+ audioSessionIdleRef.current = audioSessionIdleRef.current.then(() => session.stop()).catch(() => void 0);
357
+ }, []);
358
+ const teardown = useCallback(() => {
359
+ attemptRef.current += 1;
360
+ const livekitAbort = livekitAbortRef.current;
361
+ livekitAbortRef.current = null;
362
+ releaseSafely(() => livekitAbort == null ? void 0 : livekitAbort.abort());
363
+ releaseSafely(() => {
364
+ var _a, _b;
365
+ return (_b = (_a = startingAudioSessionRef.current) == null ? void 0 : _a.cancelStart) == null ? void 0 : _b.call(_a);
366
+ });
367
+ releaseAudioSession();
368
+ const releasePeerListeners = releasePeerListenersRef.current;
369
+ releasePeerListenersRef.current = null;
370
+ releaseSafely(() => releasePeerListeners == null ? void 0 : releasePeerListeners());
371
+ const pc = pcRef.current;
372
+ pcRef.current = null;
373
+ releaseSafely(() => pc == null ? void 0 : pc.close());
374
+ const ws = wsRef.current;
375
+ wsRef.current = null;
376
+ releaseSafely(() => {
377
+ if (ws && ws.readyState < 2) ws.close(1e3, "client end");
378
+ });
379
+ const nodes = audioNodesRef.current;
380
+ audioNodesRef.current = [];
381
+ for (const node of nodes) releaseSafely(() => node.disconnect());
382
+ const audio = audioContextRef.current;
383
+ audioContextRef.current = null;
384
+ releaseSafely(() => audio == null ? void 0 : audio.close());
385
+ playheadRef.current = 0;
386
+ const livekit = livekitRef.current;
387
+ livekitRef.current = null;
388
+ releaseSafely(() => livekit == null ? void 0 : livekit.disconnect());
389
+ const stream = streamRef.current;
390
+ streamRef.current = null;
391
+ releaseCaptureStream(stream);
392
+ setLiveSince(null);
393
+ releaseSafely(() => {
394
+ var _a;
395
+ return (_a = onRemoteStreamRef.current) == null ? void 0 : _a.call(onRemoteStreamRef, null);
396
+ });
397
+ }, [releaseAudioSession]);
398
+ const fail = useCallback(
399
+ (nextFailure) => {
400
+ report("error", attemptRef.current, {
401
+ kind: nextFailure.kind,
402
+ stage: nextFailure.stage,
403
+ message: nextFailure.message,
404
+ code: nextFailure.code ?? null,
405
+ status: nextFailure.status ?? null,
406
+ fate: nextFailure.fate ?? null,
407
+ reason: nextFailure.reason ?? null
408
+ });
409
+ teardown();
410
+ setFailure(nextFailure);
411
+ setPhase("error");
412
+ },
413
+ [report, teardown]
414
+ );
415
+ const handleMediaLossRef = useRef(
416
+ async () => void 0
417
+ );
418
+ const watchConnection = useCallback((pc, attempt) => {
419
+ let disconnectTimer = null;
420
+ const clearDisconnectTimer = () => {
421
+ if (disconnectTimer === null) return;
422
+ clearTimeout(disconnectTimer);
423
+ disconnectTimer = null;
424
+ };
425
+ const onChange = () => {
426
+ if (attemptRef.current !== attempt) {
427
+ clearDisconnectTimer();
428
+ return;
429
+ }
430
+ const state = pc.connectionState ?? pc.iceConnectionState;
431
+ report("media-state", attempt, {
432
+ connectionState: pc.connectionState ?? null,
433
+ iceConnectionState: pc.iceConnectionState ?? null
434
+ });
435
+ if (state === "failed" || state === "closed") {
436
+ clearDisconnectTimer();
437
+ void handleMediaLossRef.current(attempt, state);
438
+ return;
439
+ }
440
+ if (state === "disconnected") {
441
+ if (disconnectTimer !== null) return;
442
+ disconnectTimer = setTimeout(() => {
443
+ disconnectTimer = null;
444
+ if (attemptRef.current !== attempt) return;
445
+ void handleMediaLossRef.current(attempt, "disconnected");
446
+ }, MEDIA_DISCONNECT_GRACE_MS);
447
+ return;
448
+ }
449
+ clearDisconnectTimer();
450
+ };
451
+ pc.addEventListener("connectionstatechange", onChange);
452
+ pc.addEventListener("iceconnectionstatechange", onChange);
453
+ return () => {
454
+ clearDisconnectTimer();
455
+ releaseSafely(() => pc.removeEventListener("connectionstatechange", onChange));
456
+ releaseSafely(() => pc.removeEventListener("iceconnectionstatechange", onChange));
457
+ };
458
+ }, [report]);
459
+ const playRelayChunk = useCallback((audio, data) => {
460
+ const pcm = new Int16Array(data);
461
+ if (pcm.length === 0) return;
462
+ const samples = float32FromPcm16(pcm);
463
+ const buffer = audio.createBuffer(1, samples.length, VOICE_RELAY_SAMPLE_RATE);
464
+ buffer.copyToChannel(samples, 0);
465
+ const node = audio.createBufferSource();
466
+ node.buffer = buffer;
467
+ node.connect(audio.destination);
468
+ const startAt = Math.max(audio.currentTime + RELAY_PLAYBACK_LEAD_SECONDS, playheadRef.current);
469
+ node.start(startAt);
470
+ playheadRef.current = startAt + buffer.duration;
471
+ }, []);
472
+ const runStartSession = useCallback(async () => {
473
+ var _a, _b, _c;
474
+ const attempt = attemptRef.current += 1;
475
+ startingRef.current = true;
476
+ attemptStartedAtRef.current = Date.now();
477
+ setFailure(null);
478
+ setPhase("connecting");
479
+ let stage = "preflight";
480
+ const timeouts = timeoutsRef.current;
481
+ const iceGatheringMs = (timeouts == null ? void 0 : timeouts.iceGatheringMs) ?? ICE_TIMEOUT_MS;
482
+ const answerMs = (timeouts == null ? void 0 : timeouts.answerMs) ?? ANSWER_TIMEOUT_MS;
483
+ const relayOpenMs = (timeouts == null ? void 0 : timeouts.relayOpenMs) ?? RELAY_OPEN_TIMEOUT_MS;
484
+ const stale = () => {
485
+ report("stale-attempt", attempt, { stage });
486
+ releaseAudioSession();
487
+ };
488
+ report("start-requested", attempt, { transport: transportRef.current });
489
+ try {
490
+ const transport = transportRef.current;
491
+ const mediaDevices = (_a = voiceGlobals.navigator) == null ? void 0 : _a.mediaDevices;
492
+ const PeerConnection = voiceGlobals.RTCPeerConnection;
493
+ const WebSocketCtor = voiceGlobals.WebSocket;
494
+ const AudioContextCtor = voiceGlobals.AudioContext;
495
+ const livekitAdapter = livekitAdapterRef.current;
496
+ if (transport === "livekit" && !livekitAdapter)
497
+ throw new Error("Voice is unavailable in this environment");
498
+ if (transport !== "livekit" && !mediaDevices)
499
+ throw new Error("Microphone capture is unavailable in this environment");
500
+ if (transport === "webrtc" && !PeerConnection)
501
+ throw new Error("WebRTC is unavailable in this environment");
502
+ if (transport === "websocket" && (!WebSocketCtor || !AudioContextCtor))
503
+ throw new Error("WebSocket audio is unavailable in this environment");
504
+ const relayUrl = relayUrlRef.current;
505
+ if (transport === "websocket" && !relayUrl)
506
+ throw new Error("The websocket voice transport needs a relay URL");
507
+ const audioSession = audioSessionRef.current;
508
+ if (audioSession) {
509
+ stage = "audio-session";
510
+ await audioSessionIdleRef.current;
511
+ if (attemptRef.current !== attempt) {
512
+ report("stale-attempt", attempt, { stage });
513
+ return;
514
+ }
515
+ startingAudioSessionRef.current = audioSession;
516
+ try {
517
+ await audioSession.start();
518
+ } finally {
519
+ startingAudioSessionRef.current = null;
520
+ }
521
+ activeAudioSessionRef.current = audioSession;
522
+ if (attemptRef.current !== attempt) {
523
+ stale();
524
+ return;
525
+ }
526
+ report("audio-session-ready", attempt);
527
+ }
528
+ const modelOption = modelRef.current;
529
+ const requestedModel = typeof modelOption === "function" ? modelOption() : modelOption;
530
+ const model2 = typeof requestedModel === "string" && requestedModel !== "" ? requestedModel : void 0;
531
+ const sendVoiceStart = (offer2) => sendCommand({
532
+ type: "voice/start",
533
+ offer: offer2,
534
+ ...model2 !== void 0 && { model: model2 }
535
+ });
536
+ const negotiateStart = async (offer2) => {
537
+ stage = "negotiate";
538
+ const negotiationStartedAt = Date.now();
539
+ const commandPromise = sendVoiceStart(offer2).catch((commandError) => {
540
+ if (!isRecoveredCommandAuthRejection(commandError)) throw commandError;
541
+ return sendVoiceStart(offer2);
542
+ });
543
+ void commandPromise.then(() => {
544
+ if (attemptRef.current !== attempt)
545
+ void sendCommand({ type: "voice/end" }).catch(() => void 0);
546
+ }).catch(() => void 0);
547
+ let answerTimer = null;
548
+ let result;
549
+ try {
550
+ result = await Promise.race([
551
+ commandPromise,
552
+ new Promise((_, reject) => {
553
+ answerTimer = setTimeout(() => reject(new VoiceAnswerTimeoutError()), answerMs);
554
+ })
555
+ ]);
556
+ } finally {
557
+ if (answerTimer !== null) clearTimeout(answerTimer);
558
+ }
559
+ report("answer-received", attempt, {
560
+ negotiationMs: Date.now() - negotiationStartedAt
561
+ });
562
+ stage = "answer";
563
+ const answer2 = result == null ? void 0 : result.answer;
564
+ if (typeof answer2 !== "string" || answer2 === "")
565
+ throw new VoiceNoAnswerError("voice/start returned no answer");
566
+ return answer2;
567
+ };
568
+ if (transport === "livekit") {
569
+ if (!livekitAdapter) return;
570
+ const answer2 = await negotiateStart(VOICE_LIVEKIT_OFFER);
571
+ if (attemptRef.current !== attempt) {
572
+ stale();
573
+ return;
574
+ }
575
+ try {
576
+ const room = parseVoiceLiveKitAnswer(answer2);
577
+ stage = "room";
578
+ let joined = false;
579
+ let disconnectedWhileJoining = false;
580
+ const controller = new AbortController();
581
+ livekitAbortRef.current = controller;
582
+ const session = await livekitAdapter.connect(room, {
583
+ micMuted: micMutedRef.current,
584
+ signal: controller.signal,
585
+ onDisconnected: (reason) => {
586
+ if (attemptRef.current !== attempt) return;
587
+ if (!joined) {
588
+ disconnectedWhileJoining = true;
589
+ return;
590
+ }
591
+ void handleMediaLossRef.current(attempt, reason);
592
+ }
593
+ });
594
+ if (attemptRef.current !== attempt) {
595
+ releaseSafely(() => session.disconnect());
596
+ stale();
597
+ return;
598
+ }
599
+ if (disconnectedWhileJoining) {
600
+ releaseSafely(() => session.disconnect());
601
+ throw new Error("The voice room disconnected while joining");
602
+ }
603
+ joined = true;
604
+ livekitRef.current = session;
605
+ report("room-joined", attempt, { roomName: room.roomName });
606
+ } catch (roomError) {
607
+ if (attemptRef.current === attempt)
608
+ void sendCommand({ type: "voice/end" }).catch(() => void 0);
609
+ throw roomError;
610
+ }
611
+ report("live", attempt, { transport, ...model2 !== void 0 && { model: model2 } });
612
+ if (micMutedRef.current) {
613
+ void sendCommand({ type: "voice/set-mic", paused: true }).catch(() => void 0);
614
+ }
615
+ setPhase("live");
616
+ setLiveSince(Date.now());
617
+ return;
618
+ }
619
+ if (!mediaDevices) return;
620
+ stage = "capture";
621
+ const stream = await mediaDevices.getUserMedia({ audio: true });
622
+ if (attemptRef.current !== attempt) {
623
+ releaseCaptureStream(stream);
624
+ stale();
625
+ return;
626
+ }
627
+ streamRef.current = stream;
628
+ for (const track of stream.getTracks()) track.enabled = !micMutedRef.current;
629
+ report("microphone-captured", attempt, {
630
+ tracks: stream.getTracks().length
631
+ });
632
+ if (transport === "websocket") {
633
+ if (!WebSocketCtor || !AudioContextCtor || !relayUrl) return;
634
+ const answer2 = await negotiateStart(VOICE_WEBSOCKET_OFFER);
635
+ if (attemptRef.current !== attempt) {
636
+ stale();
637
+ return;
638
+ }
639
+ if (!answer2.startsWith(VOICE_RELAY_ANSWER_PREFIX))
640
+ throw new VoiceNoAnswerError("voice/start returned no relay ticket");
641
+ stage = "relay";
642
+ const ticket = answer2.slice(VOICE_RELAY_ANSWER_PREFIX.length);
643
+ const ws = new WebSocketCtor(voiceRelayUrl(relayUrl, ticket));
644
+ ws.binaryType = "arraybuffer";
645
+ wsRef.current = ws;
646
+ await waitForRelayOpen(ws, relayOpenMs);
647
+ if (attemptRef.current !== attempt) {
648
+ stale();
649
+ return;
650
+ }
651
+ const audio = new AudioContextCtor({
652
+ sampleRate: VOICE_RELAY_SAMPLE_RATE
653
+ });
654
+ audioContextRef.current = audio;
655
+ await ((_b = audio.resume) == null ? void 0 : _b.call(audio));
656
+ if (attemptRef.current !== attempt) {
657
+ stale();
658
+ return;
659
+ }
660
+ const source = audio.createMediaStreamSource(stream);
661
+ const processor = audio.createScriptProcessor(RELAY_CAPTURE_FRAME_SAMPLES, 1, 1);
662
+ const sink = audio.createGain();
663
+ sink.gain.value = 0;
664
+ processor.onaudioprocess = (event) => {
665
+ if (attemptRef.current !== attempt || ws.readyState !== 1) return;
666
+ ws.send(pcm16FromFloat32(event.inputBuffer.getChannelData(0)).buffer);
667
+ };
668
+ source.connect(processor);
669
+ processor.connect(sink);
670
+ sink.connect(audio.destination);
671
+ audioNodesRef.current = [source, processor, sink];
672
+ playheadRef.current = 0;
673
+ ws.addEventListener("message", (event) => {
674
+ if (attemptRef.current !== attempt) return;
675
+ if (event.data instanceof ArrayBuffer) playRelayChunk(audio, event.data);
676
+ });
677
+ ws.addEventListener("close", () => {
678
+ if (attemptRef.current !== attempt) return;
679
+ void handleMediaLossRef.current(attempt, "relay-closed");
680
+ });
681
+ ws.addEventListener("error", () => {
682
+ if (attemptRef.current !== attempt) return;
683
+ void handleMediaLossRef.current(attempt, "relay-error");
684
+ });
685
+ report("live", attempt, { transport });
686
+ if (micMutedRef.current) {
687
+ void sendCommand({ type: "voice/set-mic", paused: true }).catch(() => void 0);
688
+ }
689
+ setPhase("live");
690
+ setLiveSince(Date.now());
691
+ return;
692
+ }
693
+ if (!PeerConnection) return;
694
+ stage = "offer";
695
+ const pc = new PeerConnection();
696
+ pcRef.current = pc;
697
+ for (const track of stream.getTracks()) pc.addTrack(track, stream);
698
+ const onTrack = async (trackEvent) => {
699
+ var _a2;
700
+ if (attemptRef.current !== attempt) return;
701
+ try {
702
+ const remote = trackEvent.streams[0] ?? (voiceGlobals.MediaStream ? new voiceGlobals.MediaStream([trackEvent.track]) : null);
703
+ if (!remote) return;
704
+ await ((_a2 = onRemoteStreamRef.current) == null ? void 0 : _a2.call(onRemoteStreamRef, remote));
705
+ } catch (playError) {
706
+ if (attemptRef.current !== attempt) return;
707
+ void sendCommand({ type: "voice/end" }).catch(() => void 0);
708
+ fail({
709
+ kind: "playback_failed",
710
+ stage: "playback",
711
+ message: `Audio playback: ${errorMessage(playError)}`
712
+ });
713
+ }
714
+ };
715
+ pc.addEventListener("track", onTrack);
716
+ const unwatchConnection = watchConnection(pc, attempt);
717
+ releasePeerListenersRef.current = () => {
718
+ unwatchConnection();
719
+ releaseSafely(() => pc.removeEventListener("track", onTrack));
720
+ };
721
+ const offer = await pc.createOffer();
722
+ await pc.setLocalDescription(offer);
723
+ const iceStartedAt = Date.now();
724
+ const iceOutcome = await waitForIce(pc, iceGatheringMs);
725
+ if (attemptRef.current !== attempt) {
726
+ stale();
727
+ return;
728
+ }
729
+ if (iceOutcome === "timeout") {
730
+ report("ice-gathering-timeout", attempt, {
731
+ waitedMs: Date.now() - iceStartedAt,
732
+ iceGatheringState: pc.iceGatheringState
733
+ });
734
+ }
735
+ const sdp = (_c = pc.localDescription) == null ? void 0 : _c.sdp;
736
+ if (!sdp) throw new Error("failed to create a local SDP offer");
737
+ report("offer-ready", attempt, {
738
+ iceGatheringMs: Date.now() - iceStartedAt,
739
+ iceGathering: iceOutcome,
740
+ sdpBytes: sdp.length
741
+ });
742
+ const answer = await negotiateStart(sdp);
743
+ if (attemptRef.current !== attempt) {
744
+ stale();
745
+ return;
746
+ }
747
+ await pc.setRemoteDescription({ type: "answer", sdp: answer });
748
+ if (attemptRef.current !== attempt) {
749
+ stale();
750
+ return;
751
+ }
752
+ report("live", attempt, { transport });
753
+ if (micMutedRef.current) {
754
+ void sendCommand({ type: "voice/set-mic", paused: true }).catch(() => void 0);
755
+ }
756
+ setPhase("live");
757
+ setLiveSince(Date.now());
758
+ } catch (startError) {
759
+ if (attemptRef.current !== attempt) {
760
+ stale();
761
+ return;
762
+ }
763
+ fail(classifyStartFailure(startError, stage));
764
+ } finally {
765
+ startingRef.current = false;
766
+ }
767
+ }, [fail, playRelayChunk, releaseAudioSession, report, sendCommand, watchConnection]);
768
+ const startSession = useCallback(async () => {
769
+ if (pcRef.current || wsRef.current || livekitRef.current || startingRef.current) return;
770
+ const run = runStartSession();
771
+ startPromiseRef.current = run;
772
+ try {
773
+ await run;
774
+ } finally {
775
+ if (startPromiseRef.current === run) startPromiseRef.current = null;
776
+ }
777
+ }, [runStartSession]);
778
+ const startRef = useRef(startSession);
779
+ startRef.current = startSession;
780
+ const handleMediaLoss = useCallback(
781
+ async (attempt, reason) => {
782
+ if (attemptRef.current !== attempt) return;
783
+ report("media-loss", attempt, {
784
+ reason,
785
+ restartBudgetLeft: !autoRestartedRef.current
786
+ });
787
+ if (lastActiveTaskRef.current) setHandoffTask(lastActiveTaskRef.current);
788
+ const ending = sendCommand({ type: "voice/end" }).catch(() => void 0);
789
+ teardown();
790
+ const recovery = attemptRef.current;
791
+ setPhase("idle");
792
+ let endTimer;
793
+ try {
794
+ await Promise.race([
795
+ ending,
796
+ new Promise((resolve) => {
797
+ endTimer = setTimeout(resolve, END_BEFORE_RESTART_TIMEOUT_MS);
798
+ })
799
+ ]);
800
+ } finally {
801
+ clearTimeout(endTimer);
802
+ }
803
+ const inflight = startPromiseRef.current;
804
+ if (inflight) await inflight.catch(() => void 0);
805
+ if (attemptRef.current !== recovery) return;
806
+ if (!autoRestartedRef.current) {
807
+ autoRestartedRef.current = true;
808
+ report("auto-restart", recovery, { trigger: "media-loss", reason });
809
+ await startRef.current();
810
+ return;
811
+ }
812
+ if (startingRef.current || pcRef.current || wsRef.current || livekitRef.current) return;
813
+ const lost = {
814
+ kind: "media_lost",
815
+ stage: "media",
816
+ message: `The voice connection was lost (${reason})`,
817
+ reason
818
+ };
819
+ report("error", recovery, {
820
+ kind: lost.kind,
821
+ stage: lost.stage,
822
+ message: lost.message,
823
+ reason
824
+ });
825
+ setFailure(lost);
826
+ setPhase("error");
827
+ },
828
+ [report, sendCommand, teardown]
829
+ );
830
+ handleMediaLossRef.current = handleMediaLoss;
831
+ const start = useCallback(async () => {
832
+ if (pcRef.current || wsRef.current || livekitRef.current || startingRef.current) return;
833
+ micMutedRef.current = false;
834
+ setMicMutedState(false);
835
+ autoRestartedRef.current = false;
836
+ setHandoffTask(null);
837
+ await startSession();
838
+ }, [startSession]);
839
+ const end = useCallback(() => {
840
+ if (phase === "connecting" || phase === "live") {
841
+ report("end", attemptRef.current, { source: "user", phase });
842
+ void sendCommand({ type: "voice/end" }).catch(() => void 0);
843
+ if (lastActiveTaskRef.current) setHandoffTask(lastActiveTaskRef.current);
844
+ }
845
+ teardown();
846
+ micMutedRef.current = false;
847
+ setMicMutedState(false);
848
+ setPhase("idle");
849
+ }, [phase, report, sendCommand, teardown]);
850
+ const setMicMuted = useCallback(
851
+ (muted) => {
852
+ if (phase !== "live") return;
853
+ const attempt = attemptRef.current;
854
+ const change = ++micChangeRef.current;
855
+ const applyLocal = (value) => {
856
+ var _a;
857
+ micMutedRef.current = value;
858
+ setMicMutedState(value);
859
+ for (const track of ((_a = streamRef.current) == null ? void 0 : _a.getTracks()) ?? []) track.enabled = !value;
860
+ const room = livekitRef.current;
861
+ if (room) releaseSafely(() => room.setMicrophoneEnabled(!value));
862
+ };
863
+ applyLocal(muted);
864
+ void sendCommand({ type: "voice/set-mic", paused: muted }).catch(() => {
865
+ if (!muted && attemptRef.current === attempt && micChangeRef.current === change) {
866
+ applyLocal(true);
867
+ }
868
+ });
869
+ },
870
+ [phase, sendCommand]
871
+ );
872
+ const sessionGone = useStatewireState(
873
+ (s) => isDeepAgentStateHydrated(s) && (readDeepAgentStreamValues(s).voice ?? null) === null
874
+ );
875
+ useEffect(() => {
876
+ var _a;
877
+ if (phase !== "live" || !sessionGone) return;
878
+ report("server-ended", attemptRef.current, {
879
+ restartBudgetLeft: !autoRestartedRef.current
880
+ });
881
+ if (lastActiveTaskRef.current) setHandoffTask(lastActiveTaskRef.current);
882
+ teardown();
883
+ setPhase("idle");
884
+ if (!autoRestartedRef.current) {
885
+ autoRestartedRef.current = true;
886
+ report("auto-restart", attemptRef.current, { trigger: "server-ended" });
887
+ void ((_a = startRef.current) == null ? void 0 : _a.call(startRef));
888
+ }
889
+ }, [phase, report, sessionGone, teardown]);
890
+ useEffect(
891
+ () => () => {
892
+ const phaseAtUnmount = phaseRef.current;
893
+ if (phaseAtUnmount === "connecting" || phaseAtUnmount === "live") {
894
+ report("end", attemptRef.current, {
895
+ source: "unmount",
896
+ phase: phaseAtUnmount
897
+ });
898
+ void sendCommand({ type: "voice/end" }).catch(() => void 0);
899
+ }
900
+ teardown();
901
+ },
902
+ [report, sendCommand, teardown]
903
+ );
904
+ const activeTask = (voice == null ? void 0 : voice.activeTask) ?? null;
905
+ useEffect(() => {
906
+ if (phase === "live") lastActiveTaskRef.current = activeTask;
907
+ else if (phase === "idle" || phase === "error") lastActiveTaskRef.current = null;
908
+ }, [phase, activeTask]);
909
+ const handoffRunActive = useStatewireState((s) => {
910
+ if (!isDeepAgentStateHydrated(s)) return true;
911
+ const status = readDeepAgentStreamValues(s).status;
912
+ return status === "running" || status === "stopping" || status === "input-required";
913
+ });
914
+ useEffect(() => {
915
+ if (handoffTask !== null && !handoffRunActive) setHandoffTask(null);
916
+ }, [handoffTask, handoffRunActive]);
917
+ const wireError = useStatewireState(
918
+ (s) => isDeepAgentStateHydrated(s) ? readDeepAgentStreamValues(s).voiceLastError ?? null : null
919
+ );
920
+ const notice = phase === "live" && wireError ? describeVoiceWireError(wireError) : null;
921
+ const model = useStatewireState((s) => {
922
+ if (!isDeepAgentStateHydrated(s)) return null;
923
+ const value = readDeepAgentStreamValues(s).voiceModel;
924
+ return typeof value === "string" && value !== "" ? value : null;
925
+ });
926
+ const wireModelOptions = useStatewireState(
927
+ (s) => isDeepAgentStateHydrated(s) ? readDeepAgentStreamValues(s).voiceModelOptions ?? null : null
928
+ );
929
+ const modelOptionsRef = useRef(null);
930
+ const modelOptions = useMemo(() => {
931
+ const next = parseVoiceModelOptions(wireModelOptions);
932
+ const previous = modelOptionsRef.current;
933
+ if (previous !== null && next !== null && sameVoiceModelOptions(previous, next)) return previous;
934
+ modelOptionsRef.current = next;
935
+ return next;
936
+ }, [wireModelOptions]);
937
+ const syncProfile = useCallback(() => {
938
+ if (phase !== "connecting" && phase !== "live") return;
939
+ void sendCommand({ type: "voice/profile-sync" }).catch(() => void 0);
940
+ }, [phase, sendCommand]);
941
+ const sendContext = useCallback(
942
+ (text) => {
943
+ const trimmed = text.trim();
944
+ if (phase !== "live" || !trimmed) return;
945
+ void sendCommand({ type: "voice/context", text: trimmed }).catch(() => void 0);
946
+ },
947
+ [phase, sendCommand]
948
+ );
949
+ const sendUserText = useCallback(
950
+ async (text) => {
951
+ if (phase !== "live" || !text.trim()) return false;
952
+ const messageId = mintVoiceTextId();
953
+ try {
954
+ await sendCommand({ type: "voice/user-text", text, messageId });
955
+ return true;
956
+ } catch {
957
+ return false;
958
+ }
959
+ },
960
+ [phase, sendCommand]
961
+ );
962
+ return useMemo(
963
+ () => ({
964
+ phase,
965
+ error,
966
+ failure,
967
+ start,
968
+ end,
969
+ activeTask,
970
+ liveSince,
971
+ micMuted,
972
+ setMicMuted,
973
+ sendUserText,
974
+ handoffTask,
975
+ syncProfile,
976
+ notice,
977
+ sendContext,
978
+ model,
979
+ modelOptions
980
+ }),
981
+ [
982
+ phase,
983
+ error,
984
+ failure,
985
+ start,
986
+ end,
987
+ activeTask,
988
+ liveSince,
989
+ micMuted,
990
+ setMicMuted,
991
+ sendUserText,
992
+ handoffTask,
993
+ syncProfile,
994
+ notice,
995
+ sendContext,
996
+ model,
997
+ modelOptions
998
+ ]
999
+ );
1000
+ };
1001
+ export {
1002
+ VOICE_LIVEKIT_ANSWER_PREFIX,
1003
+ VOICE_LIVEKIT_OFFER,
1004
+ VOICE_RELAY_ANSWER_PREFIX,
1005
+ VOICE_RELAY_SAMPLE_RATE,
1006
+ VOICE_WEBSOCKET_OFFER,
1007
+ classifyVoiceStartError,
1008
+ describeVoiceFailure,
1009
+ describeVoiceWireError,
1010
+ float32FromPcm16,
1011
+ formatVoiceElapsed,
1012
+ parseVoiceLiveKitAnswer,
1013
+ parseVoiceModelOptions,
1014
+ pcm16FromFloat32,
1015
+ useDeepAgentVoice,
1016
+ useVoiceElapsed,
1017
+ voiceRelayUrl
1018
+ };
1019
+ //# sourceMappingURL=use-deep-agent-voice.js.map