@mastra/react 1.7.3-alpha.3 → 1.8.0-alpha.4

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 (510) hide show
  1. package/dist/accumulator-B1MuNX3j.js +1668 -0
  2. package/dist/accumulator-B1MuNX3j.js.map +1 -0
  3. package/dist/accumulator-CsUGDUHk.cjs +1709 -0
  4. package/dist/accumulator-CsUGDUHk.cjs.map +1 -0
  5. package/dist/agent/hooks.d.ts.map +1 -1
  6. package/dist/agent/user-message.d.ts +4 -0
  7. package/dist/agent/user-message.d.ts.map +1 -0
  8. package/dist/chat/index.cjs +3 -0
  9. package/dist/chat/index.d.ts +3 -0
  10. package/dist/chat/index.d.ts.map +1 -0
  11. package/dist/chat/index.js +2 -0
  12. package/dist/feedback-refetch-interval-DLHzQoVV.js +12 -0
  13. package/dist/feedback-refetch-interval-DLHzQoVV.js.map +1 -0
  14. package/dist/feedback-refetch-interval-XD5FVc2k.cjs +17 -0
  15. package/dist/feedback-refetch-interval-XD5FVc2k.cjs.map +1 -0
  16. package/dist/hooks/agents/index.cjs +988 -0
  17. package/dist/hooks/agents/index.cjs.map +1 -0
  18. package/dist/hooks/agents/index.d.ts +19 -0
  19. package/dist/hooks/agents/index.d.ts.map +1 -0
  20. package/dist/hooks/agents/index.js +952 -0
  21. package/dist/hooks/agents/index.js.map +1 -0
  22. package/dist/hooks/agents/is-model-not-allowed.d.ts +15 -0
  23. package/dist/hooks/agents/is-model-not-allowed.d.ts.map +1 -0
  24. package/dist/hooks/agents/use-agent-messages.d.ts +18 -0
  25. package/dist/hooks/agents/use-agent-messages.d.ts.map +1 -0
  26. package/dist/hooks/agents/use-agent-plan.d.ts +14 -0
  27. package/dist/hooks/agents/use-agent-plan.d.ts.map +1 -0
  28. package/dist/hooks/agents/use-agent-skills.d.ts +2021 -0
  29. package/dist/hooks/agents/use-agent-skills.d.ts.map +1 -0
  30. package/dist/hooks/agents/use-agent-versions.d.ts +72 -0
  31. package/dist/hooks/agents/use-agent-versions.d.ts.map +1 -0
  32. package/dist/hooks/agents/use-agent-working-memory.d.ts +11 -0
  33. package/dist/hooks/agents/use-agent-working-memory.d.ts.map +1 -0
  34. package/dist/hooks/agents/use-agent-workspace.d.ts +2022 -0
  35. package/dist/hooks/agents/use-agent-workspace.d.ts.map +1 -0
  36. package/dist/hooks/agents/use-agent.d.ts +12 -0
  37. package/dist/hooks/agents/use-agent.d.ts.map +1 -0
  38. package/dist/hooks/agents/use-agents-model-providers.d.ts +9 -0
  39. package/dist/hooks/agents/use-agents-model-providers.d.ts.map +1 -0
  40. package/dist/hooks/agents/use-agents.d.ts +28 -0
  41. package/dist/hooks/agents/use-agents.d.ts.map +1 -0
  42. package/dist/hooks/agents/use-background-tasks.d.ts +51 -0
  43. package/dist/hooks/agents/use-background-tasks.d.ts.map +1 -0
  44. package/dist/hooks/agents/use-browser-session-probe.d.ts +34 -0
  45. package/dist/hooks/agents/use-browser-session-probe.d.ts.map +1 -0
  46. package/dist/hooks/agents/use-channels.d.ts +34 -0
  47. package/dist/hooks/agents/use-channels.d.ts.map +1 -0
  48. package/dist/hooks/agents/use-close-browser.d.ts +17 -0
  49. package/dist/hooks/agents/use-close-browser.d.ts.map +1 -0
  50. package/dist/hooks/agents/use-execute-agent-tool.d.ts +14 -0
  51. package/dist/hooks/agents/use-execute-agent-tool.d.ts.map +1 -0
  52. package/dist/hooks/agents/use-preview-instructions.d.ts +20 -0
  53. package/dist/hooks/agents/use-preview-instructions.d.ts.map +1 -0
  54. package/dist/hooks/agents/use-stored-agents.d.ts +8023 -0
  55. package/dist/hooks/agents/use-stored-agents.d.ts.map +1 -0
  56. package/dist/hooks/agents/use-stored-skills.d.ts +8 -0
  57. package/dist/hooks/agents/use-stored-skills.d.ts.map +1 -0
  58. package/dist/hooks/auth/fetch-with-refresh.d.ts +28 -0
  59. package/dist/hooks/auth/fetch-with-refresh.d.ts.map +1 -0
  60. package/dist/hooks/auth/get-client-query-key.d.ts +7 -0
  61. package/dist/hooks/auth/get-client-query-key.d.ts.map +1 -0
  62. package/dist/hooks/auth/index.cjs +492 -0
  63. package/dist/hooks/auth/index.cjs.map +1 -0
  64. package/dist/hooks/auth/index.d.ts +11 -0
  65. package/dist/hooks/auth/index.d.ts.map +1 -0
  66. package/dist/hooks/auth/index.js +474 -0
  67. package/dist/hooks/auth/index.js.map +1 -0
  68. package/dist/hooks/auth/sso-login.d.ts +8 -0
  69. package/dist/hooks/auth/sso-login.d.ts.map +1 -0
  70. package/dist/hooks/auth/types.d.ts +107 -0
  71. package/dist/hooks/auth/types.d.ts.map +1 -0
  72. package/dist/hooks/auth/use-auth-actions.d.ts +99 -0
  73. package/dist/hooks/auth/use-auth-actions.d.ts.map +1 -0
  74. package/dist/hooks/auth/use-auth-capabilities.d.ts +43 -0
  75. package/dist/hooks/auth/use-auth-capabilities.d.ts.map +1 -0
  76. package/dist/hooks/auth/use-credentials-login.d.ts +63 -0
  77. package/dist/hooks/auth/use-credentials-login.d.ts.map +1 -0
  78. package/dist/hooks/auth/use-credentials-signup.d.ts +66 -0
  79. package/dist/hooks/auth/use-credentials-signup.d.ts.map +1 -0
  80. package/dist/hooks/auth/use-current-user.d.ts +40 -0
  81. package/dist/hooks/auth/use-current-user.d.ts.map +1 -0
  82. package/dist/hooks/auth/use-permission-patterns.d.ts +24 -0
  83. package/dist/hooks/auth/use-permission-patterns.d.ts.map +1 -0
  84. package/dist/hooks/capabilities/index.cjs +47 -0
  85. package/dist/hooks/capabilities/index.cjs.map +1 -0
  86. package/dist/hooks/capabilities/index.d.ts +4 -0
  87. package/dist/hooks/capabilities/index.d.ts.map +1 -0
  88. package/dist/hooks/capabilities/index.js +44 -0
  89. package/dist/hooks/capabilities/index.js.map +1 -0
  90. package/dist/hooks/capabilities/use-feedback-available.d.ts +9 -0
  91. package/dist/hooks/capabilities/use-feedback-available.d.ts.map +1 -0
  92. package/dist/hooks/capabilities/use-observability-capabilities.d.ts +9 -0
  93. package/dist/hooks/capabilities/use-observability-capabilities.d.ts.map +1 -0
  94. package/dist/hooks/capabilities/use-trace-query-available.d.ts +9 -0
  95. package/dist/hooks/capabilities/use-trace-query-available.d.ts.map +1 -0
  96. package/dist/hooks/configuration/index.cjs +18 -0
  97. package/dist/hooks/configuration/index.cjs.map +1 -0
  98. package/dist/hooks/configuration/index.d.ts +2 -0
  99. package/dist/hooks/configuration/index.d.ts.map +1 -0
  100. package/dist/hooks/configuration/index.js +17 -0
  101. package/dist/hooks/configuration/index.js.map +1 -0
  102. package/dist/hooks/configuration/use-mastra-packages.d.ts +9 -0
  103. package/dist/hooks/configuration/use-mastra-packages.d.ts.map +1 -0
  104. package/dist/hooks/datasets/index.cjs +615 -0
  105. package/dist/hooks/datasets/index.cjs.map +1 -0
  106. package/dist/hooks/datasets/index.d.ts +10 -0
  107. package/dist/hooks/datasets/index.d.ts.map +1 -0
  108. package/dist/hooks/datasets/index.js +600 -0
  109. package/dist/hooks/datasets/index.js.map +1 -0
  110. package/dist/hooks/datasets/use-compare-experiments.d.ts +23 -0
  111. package/dist/hooks/datasets/use-compare-experiments.d.ts.map +1 -0
  112. package/dist/hooks/datasets/use-dataset-experiments.d.ts +49 -0
  113. package/dist/hooks/datasets/use-dataset-experiments.d.ts.map +1 -0
  114. package/dist/hooks/datasets/use-dataset-item-versions.d.ts +31 -0
  115. package/dist/hooks/datasets/use-dataset-item-versions.d.ts.map +1 -0
  116. package/dist/hooks/datasets/use-dataset-items.d.ts +38 -0
  117. package/dist/hooks/datasets/use-dataset-items.d.ts.map +1 -0
  118. package/dist/hooks/datasets/use-dataset-mutations.d.ts +362 -0
  119. package/dist/hooks/datasets/use-dataset-mutations.d.ts.map +1 -0
  120. package/dist/hooks/datasets/use-dataset-versions.d.ts +23 -0
  121. package/dist/hooks/datasets/use-dataset-versions.d.ts.map +1 -0
  122. package/dist/hooks/datasets/use-datasets.d.ts +44 -0
  123. package/dist/hooks/datasets/use-datasets.d.ts.map +1 -0
  124. package/dist/hooks/datasets/use-experiments.d.ts +16 -0
  125. package/dist/hooks/datasets/use-experiments.d.ts.map +1 -0
  126. package/dist/hooks/datasets/use-workflow-schema.d.ts +16 -0
  127. package/dist/hooks/datasets/use-workflow-schema.d.ts.map +1 -0
  128. package/dist/hooks/embedders/index.cjs +19 -0
  129. package/dist/hooks/embedders/index.cjs.map +1 -0
  130. package/dist/hooks/embedders/index.d.ts +2 -0
  131. package/dist/hooks/embedders/index.d.ts.map +1 -0
  132. package/dist/hooks/embedders/index.js +18 -0
  133. package/dist/hooks/embedders/index.js.map +1 -0
  134. package/dist/hooks/embedders/use-embedders.d.ts +17 -0
  135. package/dist/hooks/embedders/use-embedders.d.ts.map +1 -0
  136. package/dist/hooks/experiments/index.cjs +152 -0
  137. package/dist/hooks/experiments/index.cjs.map +1 -0
  138. package/dist/hooks/experiments/index.d.ts +5 -0
  139. package/dist/hooks/experiments/index.d.ts.map +1 -0
  140. package/dist/hooks/experiments/index.js +146 -0
  141. package/dist/hooks/experiments/index.js.map +1 -0
  142. package/dist/hooks/experiments/use-experiment-metrics.d.ts +30 -0
  143. package/dist/hooks/experiments/use-experiment-metrics.d.ts.map +1 -0
  144. package/dist/hooks/experiments/use-experiment-trace.d.ts +13 -0
  145. package/dist/hooks/experiments/use-experiment-trace.d.ts.map +1 -0
  146. package/dist/hooks/experiments/use-experiments-for-dataset-filter.d.ts +22 -0
  147. package/dist/hooks/experiments/use-experiments-for-dataset-filter.d.ts.map +1 -0
  148. package/dist/hooks/experiments/use-infinite-experiments.d.ts +22 -0
  149. package/dist/hooks/experiments/use-infinite-experiments.d.ts.map +1 -0
  150. package/dist/hooks/feedback/feedback-refetch-interval.d.ts +7 -0
  151. package/dist/hooks/feedback/feedback-refetch-interval.d.ts.map +1 -0
  152. package/dist/hooks/feedback/index.cjs +22 -0
  153. package/dist/hooks/feedback/index.cjs.map +1 -0
  154. package/dist/hooks/feedback/index.d.ts +3 -0
  155. package/dist/hooks/feedback/index.d.ts.map +1 -0
  156. package/dist/hooks/feedback/index.js +20 -0
  157. package/dist/hooks/feedback/index.js.map +1 -0
  158. package/dist/hooks/feedback/use-feedback.d.ts +56 -0
  159. package/dist/hooks/feedback/use-feedback.d.ts.map +1 -0
  160. package/dist/hooks/llm/index.cjs +17 -0
  161. package/dist/hooks/llm/index.cjs.map +1 -0
  162. package/dist/hooks/llm/index.d.ts +2 -0
  163. package/dist/hooks/llm/index.d.ts.map +1 -0
  164. package/dist/hooks/llm/index.js +16 -0
  165. package/dist/hooks/llm/index.js.map +1 -0
  166. package/dist/hooks/llm/use-llm-providers.d.ts +7 -0
  167. package/dist/hooks/llm/use-llm-providers.d.ts.map +1 -0
  168. package/dist/hooks/logs/index.cjs +84 -0
  169. package/dist/hooks/logs/index.cjs.map +1 -0
  170. package/dist/hooks/logs/index.d.ts +4 -0
  171. package/dist/hooks/logs/index.d.ts.map +1 -0
  172. package/dist/hooks/logs/index.js +82 -0
  173. package/dist/hooks/logs/index.js.map +1 -0
  174. package/dist/hooks/logs/types.d.ts +36 -0
  175. package/dist/hooks/logs/types.d.ts.map +1 -0
  176. package/dist/hooks/logs/use-logs.d.ts +79 -0
  177. package/dist/hooks/logs/use-logs.d.ts.map +1 -0
  178. package/dist/hooks/mcps/index.cjs +215 -0
  179. package/dist/hooks/mcps/index.cjs.map +1 -0
  180. package/dist/hooks/mcps/index.d.ts +7 -0
  181. package/dist/hooks/mcps/index.d.ts.map +1 -0
  182. package/dist/hooks/mcps/index.js +208 -0
  183. package/dist/hooks/mcps/index.js.map +1 -0
  184. package/dist/hooks/mcps/use-mcp-app-tools.d.ts +21 -0
  185. package/dist/hooks/mcps/use-mcp-app-tools.d.ts.map +1 -0
  186. package/dist/hooks/mcps/use-mcp-server-tool.d.ts +25 -0
  187. package/dist/hooks/mcps/use-mcp-server-tool.d.ts.map +1 -0
  188. package/dist/hooks/mcps/use-mcp-server-tools-by-id.d.ts +13 -0
  189. package/dist/hooks/mcps/use-mcp-server-tools-by-id.d.ts.map +1 -0
  190. package/dist/hooks/mcps/use-mcp-server-tools.d.ts +9 -0
  191. package/dist/hooks/mcps/use-mcp-server-tools.d.ts.map +1 -0
  192. package/dist/hooks/mcps/use-mcp-servers.d.ts +8 -0
  193. package/dist/hooks/mcps/use-mcp-servers.d.ts.map +1 -0
  194. package/dist/hooks/mcps/use-try-connect-mcp.d.ts +15 -0
  195. package/dist/hooks/mcps/use-try-connect-mcp.d.ts.map +1 -0
  196. package/dist/hooks/memory/index.cjs +328 -0
  197. package/dist/hooks/memory/index.cjs.map +1 -0
  198. package/dist/hooks/memory/index.d.ts +5 -0
  199. package/dist/hooks/memory/index.d.ts.map +1 -0
  200. package/dist/hooks/memory/index.js +312 -0
  201. package/dist/hooks/memory/index.js.map +1 -0
  202. package/dist/hooks/memory/use-memory-status.d.ts +12 -0
  203. package/dist/hooks/memory/use-memory-status.d.ts.map +1 -0
  204. package/dist/hooks/memory/use-memory-thread-messages.d.ts +13 -0
  205. package/dist/hooks/memory/use-memory-thread-messages.d.ts.map +1 -0
  206. package/dist/hooks/memory/use-memory.d.ts +159 -0
  207. package/dist/hooks/memory/use-memory.d.ts.map +1 -0
  208. package/dist/hooks/memory/use-observational-memory.d.ts +13 -0
  209. package/dist/hooks/memory/use-observational-memory.d.ts.map +1 -0
  210. package/dist/hooks/metrics/index.cjs +997 -0
  211. package/dist/hooks/metrics/index.cjs.map +1 -0
  212. package/dist/hooks/metrics/index.d.ts +16 -0
  213. package/dist/hooks/metrics/index.d.ts.map +1 -0
  214. package/dist/hooks/metrics/index.js +981 -0
  215. package/dist/hooks/metrics/index.js.map +1 -0
  216. package/dist/hooks/metrics/metrics-interval.d.ts +8 -0
  217. package/dist/hooks/metrics/metrics-interval.d.ts.map +1 -0
  218. package/dist/hooks/metrics/metrics-query-filters.d.ts +62 -0
  219. package/dist/hooks/metrics/metrics-query-filters.d.ts.map +1 -0
  220. package/dist/hooks/metrics/use-active-resources-kpi-metrics.d.ts +12 -0
  221. package/dist/hooks/metrics/use-active-resources-kpi-metrics.d.ts.map +1 -0
  222. package/dist/hooks/metrics/use-active-threads-kpi-metrics.d.ts +12 -0
  223. package/dist/hooks/metrics/use-active-threads-kpi-metrics.d.ts.map +1 -0
  224. package/dist/hooks/metrics/use-agent-runs-kpi-metrics.d.ts +9 -0
  225. package/dist/hooks/metrics/use-agent-runs-kpi-metrics.d.ts.map +1 -0
  226. package/dist/hooks/metrics/use-latency-metrics.d.ts +23 -0
  227. package/dist/hooks/metrics/use-latency-metrics.d.ts.map +1 -0
  228. package/dist/hooks/metrics/use-model-cost-kpi-metrics.d.ts +14 -0
  229. package/dist/hooks/metrics/use-model-cost-kpi-metrics.d.ts.map +1 -0
  230. package/dist/hooks/metrics/use-model-usage-cost-metrics.d.ts +16 -0
  231. package/dist/hooks/metrics/use-model-usage-cost-metrics.d.ts.map +1 -0
  232. package/dist/hooks/metrics/use-scores-metrics.d.ts +24 -0
  233. package/dist/hooks/metrics/use-scores-metrics.d.ts.map +1 -0
  234. package/dist/hooks/metrics/use-token-usage-by-agent-metrics.d.ts +15 -0
  235. package/dist/hooks/metrics/use-token-usage-by-agent-metrics.d.ts.map +1 -0
  236. package/dist/hooks/metrics/use-token-usage-timeseries.d.ts +22 -0
  237. package/dist/hooks/metrics/use-token-usage-timeseries.d.ts.map +1 -0
  238. package/dist/hooks/metrics/use-top-active-threads-metrics.d.ts +21 -0
  239. package/dist/hooks/metrics/use-top-active-threads-metrics.d.ts.map +1 -0
  240. package/dist/hooks/metrics/use-top-resources-by-threads-metrics.d.ts +20 -0
  241. package/dist/hooks/metrics/use-top-resources-by-threads-metrics.d.ts.map +1 -0
  242. package/dist/hooks/metrics/use-total-tokens-kpi-metrics.d.ts +13 -0
  243. package/dist/hooks/metrics/use-total-tokens-kpi-metrics.d.ts.map +1 -0
  244. package/dist/hooks/metrics/use-trace-volume-metrics.d.ts +17 -0
  245. package/dist/hooks/metrics/use-trace-volume-metrics.d.ts.map +1 -0
  246. package/dist/hooks/processors/index.cjs +43 -0
  247. package/dist/hooks/processors/index.cjs.map +1 -0
  248. package/dist/hooks/processors/index.d.ts +2 -0
  249. package/dist/hooks/processors/index.d.ts.map +1 -0
  250. package/dist/hooks/processors/index.js +40 -0
  251. package/dist/hooks/processors/index.js.map +1 -0
  252. package/dist/hooks/processors/use-processors.d.ts +64 -0
  253. package/dist/hooks/processors/use-processors.d.ts.map +1 -0
  254. package/dist/hooks/prompt-blocks/index.cjs +181 -0
  255. package/dist/hooks/prompt-blocks/index.cjs.map +1 -0
  256. package/dist/hooks/prompt-blocks/index.d.ts +3 -0
  257. package/dist/hooks/prompt-blocks/index.d.ts.map +1 -0
  258. package/dist/hooks/prompt-blocks/index.js +172 -0
  259. package/dist/hooks/prompt-blocks/index.js.map +1 -0
  260. package/dist/hooks/prompt-blocks/use-prompt-block-versions.d.ts +59 -0
  261. package/dist/hooks/prompt-blocks/use-prompt-block-versions.d.ts.map +1 -0
  262. package/dist/hooks/prompt-blocks/use-stored-prompt-blocks.d.ts +180 -0
  263. package/dist/hooks/prompt-blocks/use-stored-prompt-blocks.d.ts.map +1 -0
  264. package/dist/hooks/query/index.cjs +34 -0
  265. package/dist/hooks/query/index.cjs.map +1 -0
  266. package/dist/hooks/query/index.d.ts +4 -0
  267. package/dist/hooks/query/index.d.ts.map +1 -0
  268. package/dist/hooks/query/index.js +25 -0
  269. package/dist/hooks/query/index.js.map +1 -0
  270. package/dist/hooks/query/query-client-provider.d.ts +8 -0
  271. package/dist/hooks/query/query-client-provider.d.ts.map +1 -0
  272. package/dist/hooks/query/query-utils.d.ts +48 -0
  273. package/dist/hooks/query/query-utils.d.ts.map +1 -0
  274. package/dist/hooks/review/index.cjs +89 -0
  275. package/dist/hooks/review/index.cjs.map +1 -0
  276. package/dist/hooks/review/index.d.ts +4 -0
  277. package/dist/hooks/review/index.d.ts.map +1 -0
  278. package/dist/hooks/review/index.js +86 -0
  279. package/dist/hooks/review/index.js.map +1 -0
  280. package/dist/hooks/review/types.d.ts +21 -0
  281. package/dist/hooks/review/types.d.ts.map +1 -0
  282. package/dist/hooks/review/use-dataset-review-items.d.ts +19 -0
  283. package/dist/hooks/review/use-dataset-review-items.d.ts.map +1 -0
  284. package/dist/hooks/review/use-review-summary.d.ts +9 -0
  285. package/dist/hooks/review/use-review-summary.d.ts.map +1 -0
  286. package/dist/hooks/schedules/index.cjs +110 -0
  287. package/dist/hooks/schedules/index.cjs.map +1 -0
  288. package/dist/hooks/schedules/index.d.ts +5 -0
  289. package/dist/hooks/schedules/index.d.ts.map +1 -0
  290. package/dist/hooks/schedules/index.js +106 -0
  291. package/dist/hooks/schedules/index.js.map +1 -0
  292. package/dist/hooks/schedules/use-schedule-triggers.d.ts +18 -0
  293. package/dist/hooks/schedules/use-schedule-triggers.d.ts.map +1 -0
  294. package/dist/hooks/schedules/use-schedule.d.ts +11 -0
  295. package/dist/hooks/schedules/use-schedule.d.ts.map +1 -0
  296. package/dist/hooks/schedules/use-schedules.d.ts +7 -0
  297. package/dist/hooks/schedules/use-schedules.d.ts.map +1 -0
  298. package/dist/hooks/schedules/use-toggle-schedule.d.ts +13 -0
  299. package/dist/hooks/schedules/use-toggle-schedule.d.ts.map +1 -0
  300. package/dist/hooks/scores/index.cjs +339 -0
  301. package/dist/hooks/scores/index.cjs.map +1 -0
  302. package/dist/hooks/scores/index.d.ts +6 -0
  303. package/dist/hooks/scores/index.d.ts.map +1 -0
  304. package/dist/hooks/scores/index.js +323 -0
  305. package/dist/hooks/scores/index.js.map +1 -0
  306. package/dist/hooks/scores/use-scorer-versions.d.ts +71 -0
  307. package/dist/hooks/scores/use-scorer-versions.d.ts.map +1 -0
  308. package/dist/hooks/scores/use-scorers.d.ts +34 -0
  309. package/dist/hooks/scores/use-scorers.d.ts.map +1 -0
  310. package/dist/hooks/scores/use-stored-scorers.d.ts +151 -0
  311. package/dist/hooks/scores/use-stored-scorers.d.ts.map +1 -0
  312. package/dist/hooks/scores/use-trace-span-scores.d.ts +20 -0
  313. package/dist/hooks/scores/use-trace-span-scores.d.ts.map +1 -0
  314. package/dist/hooks/scores/use-trigger-scorer.d.ts +17 -0
  315. package/dist/hooks/scores/use-trigger-scorer.d.ts.map +1 -0
  316. package/dist/hooks/shared/cost.d.ts +7 -0
  317. package/dist/hooks/shared/cost.d.ts.map +1 -0
  318. package/dist/hooks/shared/date-format.d.ts +30 -0
  319. package/dist/hooks/shared/date-format.d.ts.map +1 -0
  320. package/dist/hooks/shared/map.d.ts +2 -0
  321. package/dist/hooks/shared/map.d.ts.map +1 -0
  322. package/dist/hooks/shared/query-options.d.ts +19 -0
  323. package/dist/hooks/shared/query-options.d.ts.map +1 -0
  324. package/dist/hooks/shared/use-in-view.d.ts +23 -0
  325. package/dist/hooks/shared/use-in-view.d.ts.map +1 -0
  326. package/dist/hooks/templates/index.cjs +464 -0
  327. package/dist/hooks/templates/index.cjs.map +1 -0
  328. package/dist/hooks/templates/index.d.ts +2 -0
  329. package/dist/hooks/templates/index.d.ts.map +1 -0
  330. package/dist/hooks/templates/index.js +456 -0
  331. package/dist/hooks/templates/index.js.map +1 -0
  332. package/dist/hooks/templates/use-templates.d.ts +139 -0
  333. package/dist/hooks/templates/use-templates.d.ts.map +1 -0
  334. package/dist/hooks/tool-providers/index.cjs +342 -0
  335. package/dist/hooks/tool-providers/index.cjs.map +1 -0
  336. package/dist/hooks/tool-providers/index.d.ts +10 -0
  337. package/dist/hooks/tool-providers/index.d.ts.map +1 -0
  338. package/dist/hooks/tool-providers/index.js +332 -0
  339. package/dist/hooks/tool-providers/index.js.map +1 -0
  340. package/dist/hooks/tool-providers/use-all-connections.d.ts +41 -0
  341. package/dist/hooks/tool-providers/use-all-connections.d.ts.map +1 -0
  342. package/dist/hooks/tool-providers/use-all-provider-tools.d.ts +25 -0
  343. package/dist/hooks/tool-providers/use-all-provider-tools.d.ts.map +1 -0
  344. package/dist/hooks/tool-providers/use-authorize.d.ts +45 -0
  345. package/dist/hooks/tool-providers/use-authorize.d.ts.map +1 -0
  346. package/dist/hooks/tool-providers/use-disconnect-connection.d.ts +24 -0
  347. package/dist/hooks/tool-providers/use-disconnect-connection.d.ts.map +1 -0
  348. package/dist/hooks/tool-providers/use-existing-connections.d.ts +33 -0
  349. package/dist/hooks/tool-providers/use-existing-connections.d.ts.map +1 -0
  350. package/dist/hooks/tool-providers/use-provider-tools.d.ts +17 -0
  351. package/dist/hooks/tool-providers/use-provider-tools.d.ts.map +1 -0
  352. package/dist/hooks/tool-providers/use-tool-providers.d.ts +23 -0
  353. package/dist/hooks/tool-providers/use-tool-providers.d.ts.map +1 -0
  354. package/dist/hooks/tool-providers/use-toolkits.d.ts +13 -0
  355. package/dist/hooks/tool-providers/use-toolkits.d.ts.map +1 -0
  356. package/dist/hooks/tool-providers/use-update-connection.d.ts +24 -0
  357. package/dist/hooks/tool-providers/use-update-connection.d.ts.map +1 -0
  358. package/dist/hooks/tools/index.cjs +49 -0
  359. package/dist/hooks/tools/index.cjs.map +1 -0
  360. package/dist/hooks/tools/index.d.ts +3 -0
  361. package/dist/hooks/tools/index.d.ts.map +1 -0
  362. package/dist/hooks/tools/index.js +46 -0
  363. package/dist/hooks/tools/index.js.map +1 -0
  364. package/dist/hooks/tools/use-all-tools.d.ts +16 -0
  365. package/dist/hooks/tools/use-all-tools.d.ts.map +1 -0
  366. package/dist/hooks/tools/use-execute-tool.d.ts +13 -0
  367. package/dist/hooks/tools/use-execute-tool.d.ts.map +1 -0
  368. package/dist/hooks/traces/discovery-cache.d.ts +12 -0
  369. package/dist/hooks/traces/discovery-cache.d.ts.map +1 -0
  370. package/dist/hooks/traces/index.cjs +1168 -0
  371. package/dist/hooks/traces/index.cjs.map +1 -0
  372. package/dist/hooks/traces/index.d.ts +22 -0
  373. package/dist/hooks/traces/index.d.ts.map +1 -0
  374. package/dist/hooks/traces/index.js +1129 -0
  375. package/dist/hooks/traces/index.js.map +1 -0
  376. package/dist/hooks/traces/types.d.ts +20 -0
  377. package/dist/hooks/traces/types.d.ts.map +1 -0
  378. package/dist/hooks/traces/use-branch.d.ts +18 -0
  379. package/dist/hooks/traces/use-branch.d.ts.map +1 -0
  380. package/dist/hooks/traces/use-create-feedback.d.ts +21 -0
  381. package/dist/hooks/traces/use-create-feedback.d.ts.map +1 -0
  382. package/dist/hooks/traces/use-delete-feedback.d.ts +21 -0
  383. package/dist/hooks/traces/use-delete-feedback.d.ts.map +1 -0
  384. package/dist/hooks/traces/use-entity-names.d.ts +14 -0
  385. package/dist/hooks/traces/use-entity-names.d.ts.map +1 -0
  386. package/dist/hooks/traces/use-environments.d.ts +10 -0
  387. package/dist/hooks/traces/use-environments.d.ts.map +1 -0
  388. package/dist/hooks/traces/use-service-names.d.ts +10 -0
  389. package/dist/hooks/traces/use-service-names.d.ts.map +1 -0
  390. package/dist/hooks/traces/use-span-detail.d.ts +14 -0
  391. package/dist/hooks/traces/use-span-detail.d.ts.map +1 -0
  392. package/dist/hooks/traces/use-span-feedback.d.ts +19 -0
  393. package/dist/hooks/traces/use-span-feedback.d.ts.map +1 -0
  394. package/dist/hooks/traces/use-tags.d.ts +10 -0
  395. package/dist/hooks/traces/use-tags.d.ts.map +1 -0
  396. package/dist/hooks/traces/use-thread-has-other-traces.d.ts +17 -0
  397. package/dist/hooks/traces/use-thread-has-other-traces.d.ts.map +1 -0
  398. package/dist/hooks/traces/use-trace-column-preferences-storage-key.d.ts +6 -0
  399. package/dist/hooks/traces/use-trace-column-preferences-storage-key.d.ts.map +1 -0
  400. package/dist/hooks/traces/use-trace-feedback.d.ts +16 -0
  401. package/dist/hooks/traces/use-trace-feedback.d.ts.map +1 -0
  402. package/dist/hooks/traces/use-trace-light-spans.d.ts +16 -0
  403. package/dist/hooks/traces/use-trace-light-spans.d.ts.map +1 -0
  404. package/dist/hooks/traces/use-trace-metadata-filter-fields.d.ts +36 -0
  405. package/dist/hooks/traces/use-trace-metadata-filter-fields.d.ts.map +1 -0
  406. package/dist/hooks/traces/use-trace-or-branch-spans.d.ts +39 -0
  407. package/dist/hooks/traces/use-trace-or-branch-spans.d.ts.map +1 -0
  408. package/dist/hooks/traces/use-trace-query.d.ts +57 -0
  409. package/dist/hooks/traces/use-trace-query.d.ts.map +1 -0
  410. package/dist/hooks/traces/use-trace-spans.d.ts +46 -0
  411. package/dist/hooks/traces/use-trace-spans.d.ts.map +1 -0
  412. package/dist/hooks/traces/use-trace-usage.d.ts +10 -0
  413. package/dist/hooks/traces/use-trace-usage.d.ts.map +1 -0
  414. package/dist/hooks/traces/use-traces.d.ts +292 -0
  415. package/dist/hooks/traces/use-traces.d.ts.map +1 -0
  416. package/dist/hooks/vectors/index.cjs +19 -0
  417. package/dist/hooks/vectors/index.cjs.map +1 -0
  418. package/dist/hooks/vectors/index.d.ts +2 -0
  419. package/dist/hooks/vectors/index.d.ts.map +1 -0
  420. package/dist/hooks/vectors/index.js +18 -0
  421. package/dist/hooks/vectors/index.js.map +1 -0
  422. package/dist/hooks/vectors/use-vectors.d.ts +14 -0
  423. package/dist/hooks/vectors/use-vectors.d.ts.map +1 -0
  424. package/dist/hooks/voice/index.cjs +87 -0
  425. package/dist/hooks/voice/index.cjs.map +1 -0
  426. package/dist/hooks/voice/index.d.ts +2 -0
  427. package/dist/hooks/voice/index.d.ts.map +1 -0
  428. package/dist/hooks/voice/index.js +86 -0
  429. package/dist/hooks/voice/index.js.map +1 -0
  430. package/dist/hooks/voice/use-read-aloud.d.ts +20 -0
  431. package/dist/hooks/voice/use-read-aloud.d.ts.map +1 -0
  432. package/dist/hooks/workflows/index.cjs +173 -0
  433. package/dist/hooks/workflows/index.cjs.map +1 -0
  434. package/dist/hooks/workflows/index.d.ts +7 -0
  435. package/dist/hooks/workflows/index.d.ts.map +1 -0
  436. package/dist/hooks/workflows/index.js +157 -0
  437. package/dist/hooks/workflows/index.js.map +1 -0
  438. package/dist/hooks/workflows/use-workflow-runs.d.ts +51 -0
  439. package/dist/hooks/workflows/use-workflow-runs.d.ts.map +1 -0
  440. package/dist/hooks/workflows/use-workflow.d.ts +14 -0
  441. package/dist/hooks/workflows/use-workflow.d.ts.map +1 -0
  442. package/dist/hooks/workflows/use-workflows-run-counts.d.ts +25 -0
  443. package/dist/hooks/workflows/use-workflows-run-counts.d.ts.map +1 -0
  444. package/dist/hooks/workflows/use-workflows.d.ts +10 -0
  445. package/dist/hooks/workflows/use-workflows.d.ts.map +1 -0
  446. package/dist/hooks/workspace/client-utils.d.ts +5 -0
  447. package/dist/hooks/workspace/client-utils.d.ts.map +1 -0
  448. package/dist/hooks/workspace/compatibility.d.ts +22 -0
  449. package/dist/hooks/workspace/compatibility.d.ts.map +1 -0
  450. package/dist/hooks/workspace/file-type.d.ts +7 -0
  451. package/dist/hooks/workspace/file-type.d.ts.map +1 -0
  452. package/dist/hooks/workspace/index.cjs +624 -0
  453. package/dist/hooks/workspace/index.cjs.map +1 -0
  454. package/dist/hooks/workspace/index.d.ts +11 -0
  455. package/dist/hooks/workspace/index.d.ts.map +1 -0
  456. package/dist/hooks/workspace/index.js +594 -0
  457. package/dist/hooks/workspace/index.js.map +1 -0
  458. package/dist/hooks/workspace/types.d.ts +199 -0
  459. package/dist/hooks/workspace/types.d.ts.map +1 -0
  460. package/dist/hooks/workspace/use-skills-sh.d.ts +104 -0
  461. package/dist/hooks/workspace/use-skills-sh.d.ts.map +1 -0
  462. package/dist/hooks/workspace/use-stored-workspaces.d.ts +12 -0
  463. package/dist/hooks/workspace/use-stored-workspaces.d.ts.map +1 -0
  464. package/dist/hooks/workspace/use-workspace-directory.d.ts +13 -0
  465. package/dist/hooks/workspace/use-workspace-directory.d.ts.map +1 -0
  466. package/dist/hooks/workspace/use-workspace-file-content.d.ts +15 -0
  467. package/dist/hooks/workspace/use-workspace-file-content.d.ts.map +1 -0
  468. package/dist/hooks/workspace/use-workspace-search.d.ts +20 -0
  469. package/dist/hooks/workspace/use-workspace-search.d.ts.map +1 -0
  470. package/dist/hooks/workspace/use-workspace-skills.d.ts +23 -0
  471. package/dist/hooks/workspace/use-workspace-skills.d.ts.map +1 -0
  472. package/dist/hooks/workspace/use-workspace.d.ts +56 -0
  473. package/dist/hooks/workspace/use-workspace.d.ts.map +1 -0
  474. package/dist/hooks-BFQK_s4g.js +1231 -0
  475. package/dist/hooks-BFQK_s4g.js.map +1 -0
  476. package/dist/hooks-CMjizg6y.cjs +1248 -0
  477. package/dist/hooks-CMjizg6y.cjs.map +1 -0
  478. package/dist/hooks-CjULNHpJ.js +252 -0
  479. package/dist/hooks-CjULNHpJ.js.map +1 -0
  480. package/dist/hooks-DsDYaJ3T.cjs +269 -0
  481. package/dist/hooks-DsDYaJ3T.cjs.map +1 -0
  482. package/dist/index.cjs +21 -3434
  483. package/dist/index.cjs.map +1 -1
  484. package/dist/index.d.ts +1 -0
  485. package/dist/index.d.ts.map +1 -1
  486. package/dist/index.js +6 -3419
  487. package/dist/index.js.map +1 -1
  488. package/dist/lib/mastra-db/fromCoreUserMessage.d.ts +3 -4
  489. package/dist/lib/mastra-db/fromCoreUserMessage.d.ts.map +1 -1
  490. package/dist/map-CDv4fbu4.js +12 -0
  491. package/dist/map-CDv4fbu4.js.map +1 -0
  492. package/dist/map-wjmL1y5O.cjs +17 -0
  493. package/dist/map-wjmL1y5O.cjs.map +1 -0
  494. package/dist/mastra-client-context-Bx_g84YB.js +50 -0
  495. package/dist/mastra-client-context-Bx_g84YB.js.map +1 -0
  496. package/dist/mastra-client-context-DzX3f0RF.cjs +61 -0
  497. package/dist/mastra-client-context-DzX3f0RF.cjs.map +1 -0
  498. package/dist/query-utils-CcrChYgz.cjs +174 -0
  499. package/dist/query-utils-CcrChYgz.cjs.map +1 -0
  500. package/dist/query-utils-D1NgFnWU.js +127 -0
  501. package/dist/query-utils-D1NgFnWU.js.map +1 -0
  502. package/dist/use-in-view-B6eJO9Zi.cjs +37 -0
  503. package/dist/use-in-view-B6eJO9Zi.cjs.map +1 -0
  504. package/dist/use-in-view-C9sYPGRm.js +32 -0
  505. package/dist/use-in-view-C9sYPGRm.js.map +1 -0
  506. package/dist/voice-BOtUdMi8.cjs +281 -0
  507. package/dist/voice-BOtUdMi8.cjs.map +1 -0
  508. package/dist/voice-DgirjEyH.js +264 -0
  509. package/dist/voice-DgirjEyH.js.map +1 -0
  510. package/package.json +32 -3
@@ -0,0 +1,281 @@
1
+ const require_mastra_client_context = require("./mastra-client-context-DzX3f0RF.cjs");
2
+ let react = require("react");
3
+ //#region src/voice/record-mic-to-file.ts
4
+ async function recordMicrophoneToFile(onFinish) {
5
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
6
+ const mediaRecorder = new MediaRecorder(stream);
7
+ let chunks = [];
8
+ mediaRecorder.ondataavailable = (e) => {
9
+ chunks.push(e.data);
10
+ };
11
+ mediaRecorder.onstop = () => {
12
+ const blob = new Blob(chunks, { type: "audio/webm" });
13
+ const file = new File([blob], `recording-${Date.now()}.webm`, {
14
+ type: "audio/webm",
15
+ lastModified: Date.now()
16
+ });
17
+ stream.getTracks().forEach((track) => track.stop());
18
+ onFinish(file);
19
+ };
20
+ return mediaRecorder;
21
+ }
22
+ //#endregion
23
+ //#region src/voice/play-stream-with-web-audio.ts
24
+ async function playStreamWithWebAudio(stream, onEnded) {
25
+ const audioContext = new window.AudioContext();
26
+ const reader = stream.getReader();
27
+ const chunks = [];
28
+ try {
29
+ while (true) {
30
+ const { done, value } = await reader.read();
31
+ if (done) break;
32
+ chunks.push(value);
33
+ }
34
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
35
+ const combinedBuffer = new Uint8Array(totalLength);
36
+ let offset = 0;
37
+ for (const chunk of chunks) {
38
+ combinedBuffer.set(chunk, offset);
39
+ offset += chunk.length;
40
+ }
41
+ const audioBuffer = await audioContext.decodeAudioData(combinedBuffer.buffer);
42
+ const source = audioContext.createBufferSource();
43
+ source.buffer = audioBuffer;
44
+ source.onended = onEnded ?? null;
45
+ source.connect(audioContext.destination);
46
+ source.start();
47
+ return () => {
48
+ source.onended = null;
49
+ source.stop();
50
+ audioContext.close();
51
+ };
52
+ } catch (error) {
53
+ await reader.cancel().catch(() => void 0);
54
+ await audioContext.close().catch(() => void 0);
55
+ throw error;
56
+ } finally {
57
+ reader.releaseLock();
58
+ }
59
+ }
60
+ //#endregion
61
+ //#region src/voice/use-speech-recognition.ts
62
+ const useSpeechRecognition = ({ language = "en-US", agentId, requestContext }) => {
63
+ const client = require_mastra_client_context.useMastraClient();
64
+ const [agent, setAgent] = (0, react.useState)(null);
65
+ (0, react.useEffect)(() => {
66
+ let cancelled = false;
67
+ if (!agentId) {
68
+ setAgent(null);
69
+ return () => {
70
+ cancelled = true;
71
+ };
72
+ }
73
+ const agent = client.getAgent(agentId);
74
+ const check = async () => {
75
+ try {
76
+ const speakers = await agent.voice.getSpeakers(requestContext);
77
+ if (!cancelled) setAgent(speakers.length > 0 ? agent : null);
78
+ } catch {
79
+ if (!cancelled) setAgent(null);
80
+ }
81
+ };
82
+ check();
83
+ return () => {
84
+ cancelled = true;
85
+ };
86
+ }, [
87
+ agentId,
88
+ client,
89
+ requestContext
90
+ ]);
91
+ const browserSpeechRecognition = useBrowserSpeechRecognition({ language });
92
+ const mastraSpeechRecognition = useMastraSpeechToText({
93
+ agent,
94
+ language
95
+ });
96
+ if (!agent) return browserSpeechRecognition;
97
+ return mastraSpeechRecognition;
98
+ };
99
+ const useBrowserSpeechRecognition = ({ language = "en-US" }) => {
100
+ const speechRecognitionRef = (0, react.useRef)(null);
101
+ const [state, setState] = (0, react.useState)({
102
+ isListening: false,
103
+ transcript: "",
104
+ error: null
105
+ });
106
+ const start = () => {
107
+ if (!speechRecognitionRef.current) return;
108
+ speechRecognitionRef.current.start();
109
+ };
110
+ const stop = () => {
111
+ if (!speechRecognitionRef.current) return;
112
+ speechRecognitionRef.current.stop();
113
+ };
114
+ (0, react.useEffect)(() => {
115
+ if (!("webkitSpeechRecognition" in window) && !("SpeechRecognition" in window)) {
116
+ setState((prev) => ({
117
+ ...prev,
118
+ error: "Speech Recognition not supported in this browser"
119
+ }));
120
+ return;
121
+ }
122
+ const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
123
+ speechRecognitionRef.current = recognition;
124
+ recognition.continuous = true;
125
+ recognition.lang = language;
126
+ recognition.onstart = () => {
127
+ setState((prev) => ({
128
+ ...prev,
129
+ isListening: true,
130
+ error: null,
131
+ transcript: ""
132
+ }));
133
+ };
134
+ recognition.onresult = (event) => {
135
+ let finalTranscript = "";
136
+ for (let i = event.resultIndex; i < event.results.length; i++) {
137
+ const transcript = event.results[i][0].transcript;
138
+ if (event.results[i].isFinal) finalTranscript += transcript + " ";
139
+ }
140
+ if (!finalTranscript) return;
141
+ setState((prev) => ({
142
+ ...prev,
143
+ transcript: prev.transcript + finalTranscript
144
+ }));
145
+ };
146
+ recognition.onerror = (event) => {
147
+ setState((prev) => ({
148
+ ...prev,
149
+ error: `Error: ${event.error}`
150
+ }));
151
+ };
152
+ recognition.onend = () => setState((prev) => ({
153
+ ...prev,
154
+ isListening: false
155
+ }));
156
+ return () => {
157
+ try {
158
+ recognition.stop();
159
+ } catch {}
160
+ recognition.onstart = null;
161
+ recognition.onresult = null;
162
+ recognition.onerror = null;
163
+ recognition.onend = null;
164
+ speechRecognitionRef.current = null;
165
+ };
166
+ }, [language]);
167
+ return {
168
+ ...state,
169
+ start,
170
+ stop
171
+ };
172
+ };
173
+ const useMastraSpeechToText = ({ agent, language }) => {
174
+ const [state, setState] = (0, react.useState)({
175
+ isListening: false,
176
+ transcript: "",
177
+ error: null
178
+ });
179
+ const recorderRef = (0, react.useRef)(null);
180
+ const sessionRef = (0, react.useRef)(0);
181
+ const startInFlightRef = (0, react.useRef)(false);
182
+ (0, react.useEffect)(() => {
183
+ return () => {
184
+ sessionRef.current += 1;
185
+ startInFlightRef.current = false;
186
+ recorderRef.current?.stop();
187
+ recorderRef.current = null;
188
+ };
189
+ }, [agent]);
190
+ const handleFinish = (session) => (file) => {
191
+ if (!agent || session !== sessionRef.current) return;
192
+ recorderRef.current = null;
193
+ setState((prev) => ({
194
+ ...prev,
195
+ isListening: false
196
+ }));
197
+ agent.voice.listen(file, { language }).then((res) => {
198
+ if (session !== sessionRef.current) return;
199
+ setState((prev) => ({
200
+ ...prev,
201
+ transcript: res.text,
202
+ error: null
203
+ }));
204
+ }).catch((error) => {
205
+ if (session !== sessionRef.current) return;
206
+ const message = error instanceof Error ? error.message : "Failed to transcribe speech";
207
+ setState((prev) => ({
208
+ ...prev,
209
+ error: message
210
+ }));
211
+ });
212
+ };
213
+ const start = () => {
214
+ if (!agent || startInFlightRef.current || recorderRef.current) return;
215
+ startInFlightRef.current = true;
216
+ sessionRef.current += 1;
217
+ const session = sessionRef.current;
218
+ recordMicrophoneToFile(handleFinish(session)).then((recorder) => {
219
+ startInFlightRef.current = false;
220
+ if (session !== sessionRef.current) {
221
+ try {
222
+ recorder.stop();
223
+ } catch {}
224
+ return;
225
+ }
226
+ recorderRef.current = recorder;
227
+ setState((prev) => ({
228
+ ...prev,
229
+ isListening: true,
230
+ error: null
231
+ }));
232
+ recorder.start();
233
+ }).catch((error) => {
234
+ startInFlightRef.current = false;
235
+ if (session !== sessionRef.current) return;
236
+ const message = error instanceof Error ? error.message : "Failed to start speech recording";
237
+ setState((prev) => ({
238
+ ...prev,
239
+ isListening: false,
240
+ error: message
241
+ }));
242
+ });
243
+ };
244
+ const stop = () => {
245
+ if (recorderRef.current) {
246
+ recorderRef.current.stop();
247
+ recorderRef.current = null;
248
+ } else if (startInFlightRef.current) sessionRef.current += 1;
249
+ startInFlightRef.current = false;
250
+ setState((prev) => ({
251
+ ...prev,
252
+ isListening: false
253
+ }));
254
+ };
255
+ return {
256
+ ...state,
257
+ start,
258
+ stop
259
+ };
260
+ };
261
+ //#endregion
262
+ Object.defineProperty(exports, "playStreamWithWebAudio", {
263
+ enumerable: true,
264
+ get: function() {
265
+ return playStreamWithWebAudio;
266
+ }
267
+ });
268
+ Object.defineProperty(exports, "recordMicrophoneToFile", {
269
+ enumerable: true,
270
+ get: function() {
271
+ return recordMicrophoneToFile;
272
+ }
273
+ });
274
+ Object.defineProperty(exports, "useSpeechRecognition", {
275
+ enumerable: true,
276
+ get: function() {
277
+ return useSpeechRecognition;
278
+ }
279
+ });
280
+
281
+ //# sourceMappingURL=voice-BOtUdMi8.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-BOtUdMi8.cjs","names":["useMastraClient"],"sources":["../src/voice/record-mic-to-file.ts","../src/voice/play-stream-with-web-audio.ts","../src/voice/use-speech-recognition.ts"],"sourcesContent":["export async function recordMicrophoneToFile(onFinish: (file: File) => void) {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const mediaRecorder = new MediaRecorder(stream);\n\n let chunks: BlobPart[] = [];\n\n mediaRecorder.ondataavailable = e => {\n chunks.push(e.data);\n };\n\n mediaRecorder.onstop = () => {\n const blob = new Blob(chunks, { type: 'audio/webm' });\n const file = new File([blob], `recording-${Date.now()}.webm`, {\n type: 'audio/webm',\n lastModified: Date.now(),\n });\n\n stream.getTracks().forEach(track => track.stop());\n onFinish(file);\n };\n\n return mediaRecorder;\n}\n","export async function playStreamWithWebAudio(stream: ReadableStream, onEnded?: () => void) {\n const audioContext = new window.AudioContext();\n\n const reader = stream.getReader();\n const chunks = [];\n\n try {\n // Read all chunks\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n // Combine chunks into single ArrayBuffer\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combinedBuffer = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n combinedBuffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Decode and play\n const audioBuffer = await audioContext.decodeAudioData(combinedBuffer.buffer);\n const source = audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.onended = onEnded ?? null;\n source.connect(audioContext.destination);\n source.start();\n\n return () => {\n source.onended = null;\n source.stop();\n void audioContext.close();\n };\n } catch (error) {\n await reader.cancel().catch(() => undefined);\n await audioContext.close().catch(() => undefined);\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useEffect, useRef, useState } from 'react';\nimport { useMastraClient } from '../mastra-client-context';\nimport { recordMicrophoneToFile } from './record-mic-to-file';\n\ntype Agent = ReturnType<MastraClient['getAgent']>;\ntype VoiceRequestContext = Parameters<Agent['voice']['getSpeakers']>[0];\n\nexport interface SpeechRecognitionState {\n isListening: boolean;\n transcript: string;\n error: string | null;\n}\n\nexport interface UseSpeechRecognitionArgs {\n language?: string;\n agentId?: string;\n requestContext?: VoiceRequestContext;\n}\n\ntype SpeechRecognitionResult = SpeechRecognitionState & {\n start: () => void;\n stop: () => void;\n};\n\nexport const useSpeechRecognition = ({\n language = 'en-US',\n agentId,\n requestContext,\n}: UseSpeechRecognitionArgs): SpeechRecognitionResult => {\n const client = useMastraClient();\n const [agent, setAgent] = useState<Agent | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n if (!agentId) {\n setAgent(null);\n return () => {\n cancelled = true;\n };\n }\n\n const agent = client.getAgent(agentId);\n\n const check = async () => {\n try {\n const speakers = await agent.voice.getSpeakers(requestContext);\n if (!cancelled) {\n setAgent(speakers.length > 0 ? agent : null);\n }\n } catch {\n if (!cancelled) {\n setAgent(null);\n }\n }\n };\n\n void check();\n\n return () => {\n cancelled = true;\n };\n }, [agentId, client, requestContext]);\n\n const browserSpeechRecognition = useBrowserSpeechRecognition({ language });\n const mastraSpeechRecognition = useMastraSpeechToText({ agent, language });\n\n if (!agent) {\n return browserSpeechRecognition;\n }\n\n return mastraSpeechRecognition;\n};\n\nconst useBrowserSpeechRecognition = ({ language = 'en-US' }: { language?: string }): SpeechRecognitionResult => {\n const speechRecognitionRef = useRef<any>(null);\n const [state, setState] = useState<SpeechRecognitionState>({\n isListening: false,\n transcript: '',\n error: null,\n });\n\n const start = () => {\n if (!speechRecognitionRef.current) return;\n speechRecognitionRef.current.start();\n };\n\n const stop = () => {\n if (!speechRecognitionRef.current) return;\n speechRecognitionRef.current.stop();\n };\n\n useEffect(() => {\n if (!('webkitSpeechRecognition' in window) && !('SpeechRecognition' in window)) {\n setState(prev => ({ ...prev, error: 'Speech Recognition not supported in this browser' }));\n return;\n }\n\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n const recognition = new SpeechRecognition();\n speechRecognitionRef.current = recognition;\n\n recognition.continuous = true;\n recognition.lang = language;\n\n recognition.onstart = () => {\n setState(prev => ({ ...prev, isListening: true, error: null, transcript: '' }));\n };\n\n recognition.onresult = (event: any) => {\n let finalTranscript = '';\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n finalTranscript += transcript + ' ';\n }\n }\n\n if (!finalTranscript) return;\n // Continuous mode emits one event per finalized phrase with an advancing\n // resultIndex, so append to the session transcript instead of replacing it.\n setState(prev => ({ ...prev, transcript: prev.transcript + finalTranscript }));\n };\n\n recognition.onerror = (event: any) => {\n setState(prev => ({ ...prev, error: `Error: ${event.error}` }));\n };\n\n recognition.onend = () => setState(prev => ({ ...prev, isListening: false }));\n\n return () => {\n try {\n recognition.stop();\n } catch {\n // ignore: recognition may not be running\n }\n recognition.onstart = null;\n recognition.onresult = null;\n recognition.onerror = null;\n recognition.onend = null;\n speechRecognitionRef.current = null;\n };\n }, [language]);\n\n return {\n ...state,\n start,\n stop,\n };\n};\n\nconst useMastraSpeechToText = ({\n agent,\n language,\n}: {\n agent: Agent | null;\n language: string;\n}): SpeechRecognitionResult => {\n const [state, setState] = useState<SpeechRecognitionState>({\n isListening: false,\n transcript: '',\n error: null,\n });\n const recorderRef = useRef<MediaRecorder | null>(null);\n const sessionRef = useRef(0);\n const startInFlightRef = useRef(false);\n\n useEffect(() => {\n return () => {\n sessionRef.current += 1;\n startInFlightRef.current = false;\n recorderRef.current?.stop();\n recorderRef.current = null;\n };\n }, [agent]);\n\n const handleFinish = (session: number) => (file: File) => {\n if (!agent || session !== sessionRef.current) return;\n\n recorderRef.current = null;\n setState(prev => ({ ...prev, isListening: false }));\n\n void agent.voice\n .listen(file, { language })\n .then(res => {\n if (session !== sessionRef.current) return;\n setState(prev => ({ ...prev, transcript: res.text, error: null }));\n })\n .catch(error => {\n if (session !== sessionRef.current) return;\n const message = error instanceof Error ? error.message : 'Failed to transcribe speech';\n setState(prev => ({ ...prev, error: message }));\n });\n };\n\n const start = () => {\n if (!agent || startInFlightRef.current || recorderRef.current) return;\n\n startInFlightRef.current = true;\n // Bump the session here (not in stop()) so a normal stop's onstop callback\n // still matches sessionRef.current. Only a new start (or unmount) should\n // invalidate a prior in-flight recording's result.\n // See: https://github.com/mastra-ai/mastra/issues/19980\n sessionRef.current += 1;\n const session = sessionRef.current;\n\n void recordMicrophoneToFile(handleFinish(session))\n .then(recorder => {\n startInFlightRef.current = false;\n if (session !== sessionRef.current) {\n try {\n recorder.stop();\n } catch {\n // ignore: recorder was never started\n }\n return;\n }\n recorderRef.current = recorder;\n setState(prev => ({ ...prev, isListening: true, error: null }));\n recorder.start();\n })\n .catch(error => {\n startInFlightRef.current = false;\n if (session !== sessionRef.current) return;\n const message = error instanceof Error ? error.message : 'Failed to start speech recording';\n setState(prev => ({ ...prev, isListening: false, error: message }));\n });\n };\n\n const stop = () => {\n if (recorderRef.current) {\n // An active recording — its session was fixed at start() time and hasn't\n // changed, so its own onstop/handleFinish will complete normally.\n recorderRef.current.stop();\n recorderRef.current = null;\n } else if (startInFlightRef.current) {\n // No recorder yet but a start() is still in-flight. Invalidate the\n // session so that start's resolution knows to abort (stop the recorder\n // instead of assigning/starting it) rather than silently proceeding.\n sessionRef.current += 1;\n }\n // Otherwise the hook is idle, or a finished recording's transcription is\n // still in flight — bumping the session then would silently discard the\n // transcript (the same failure class as #19980, in a narrower window).\n startInFlightRef.current = false;\n setState(prev => ({ ...prev, isListening: false }));\n };\n\n return {\n ...state,\n start,\n stop,\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ import { n as useMastraClient } from "./mastra-client-context-Bx_g84YB.js";
2
+ import { useEffect, useRef, useState } from "react";
3
+ //#region src/voice/record-mic-to-file.ts
4
+ async function recordMicrophoneToFile(onFinish) {
5
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
6
+ const mediaRecorder = new MediaRecorder(stream);
7
+ let chunks = [];
8
+ mediaRecorder.ondataavailable = (e) => {
9
+ chunks.push(e.data);
10
+ };
11
+ mediaRecorder.onstop = () => {
12
+ const blob = new Blob(chunks, { type: "audio/webm" });
13
+ const file = new File([blob], `recording-${Date.now()}.webm`, {
14
+ type: "audio/webm",
15
+ lastModified: Date.now()
16
+ });
17
+ stream.getTracks().forEach((track) => track.stop());
18
+ onFinish(file);
19
+ };
20
+ return mediaRecorder;
21
+ }
22
+ //#endregion
23
+ //#region src/voice/play-stream-with-web-audio.ts
24
+ async function playStreamWithWebAudio(stream, onEnded) {
25
+ const audioContext = new window.AudioContext();
26
+ const reader = stream.getReader();
27
+ const chunks = [];
28
+ try {
29
+ while (true) {
30
+ const { done, value } = await reader.read();
31
+ if (done) break;
32
+ chunks.push(value);
33
+ }
34
+ const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
35
+ const combinedBuffer = new Uint8Array(totalLength);
36
+ let offset = 0;
37
+ for (const chunk of chunks) {
38
+ combinedBuffer.set(chunk, offset);
39
+ offset += chunk.length;
40
+ }
41
+ const audioBuffer = await audioContext.decodeAudioData(combinedBuffer.buffer);
42
+ const source = audioContext.createBufferSource();
43
+ source.buffer = audioBuffer;
44
+ source.onended = onEnded ?? null;
45
+ source.connect(audioContext.destination);
46
+ source.start();
47
+ return () => {
48
+ source.onended = null;
49
+ source.stop();
50
+ audioContext.close();
51
+ };
52
+ } catch (error) {
53
+ await reader.cancel().catch(() => void 0);
54
+ await audioContext.close().catch(() => void 0);
55
+ throw error;
56
+ } finally {
57
+ reader.releaseLock();
58
+ }
59
+ }
60
+ //#endregion
61
+ //#region src/voice/use-speech-recognition.ts
62
+ const useSpeechRecognition = ({ language = "en-US", agentId, requestContext }) => {
63
+ const client = useMastraClient();
64
+ const [agent, setAgent] = useState(null);
65
+ useEffect(() => {
66
+ let cancelled = false;
67
+ if (!agentId) {
68
+ setAgent(null);
69
+ return () => {
70
+ cancelled = true;
71
+ };
72
+ }
73
+ const agent = client.getAgent(agentId);
74
+ const check = async () => {
75
+ try {
76
+ const speakers = await agent.voice.getSpeakers(requestContext);
77
+ if (!cancelled) setAgent(speakers.length > 0 ? agent : null);
78
+ } catch {
79
+ if (!cancelled) setAgent(null);
80
+ }
81
+ };
82
+ check();
83
+ return () => {
84
+ cancelled = true;
85
+ };
86
+ }, [
87
+ agentId,
88
+ client,
89
+ requestContext
90
+ ]);
91
+ const browserSpeechRecognition = useBrowserSpeechRecognition({ language });
92
+ const mastraSpeechRecognition = useMastraSpeechToText({
93
+ agent,
94
+ language
95
+ });
96
+ if (!agent) return browserSpeechRecognition;
97
+ return mastraSpeechRecognition;
98
+ };
99
+ const useBrowserSpeechRecognition = ({ language = "en-US" }) => {
100
+ const speechRecognitionRef = useRef(null);
101
+ const [state, setState] = useState({
102
+ isListening: false,
103
+ transcript: "",
104
+ error: null
105
+ });
106
+ const start = () => {
107
+ if (!speechRecognitionRef.current) return;
108
+ speechRecognitionRef.current.start();
109
+ };
110
+ const stop = () => {
111
+ if (!speechRecognitionRef.current) return;
112
+ speechRecognitionRef.current.stop();
113
+ };
114
+ useEffect(() => {
115
+ if (!("webkitSpeechRecognition" in window) && !("SpeechRecognition" in window)) {
116
+ setState((prev) => ({
117
+ ...prev,
118
+ error: "Speech Recognition not supported in this browser"
119
+ }));
120
+ return;
121
+ }
122
+ const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
123
+ speechRecognitionRef.current = recognition;
124
+ recognition.continuous = true;
125
+ recognition.lang = language;
126
+ recognition.onstart = () => {
127
+ setState((prev) => ({
128
+ ...prev,
129
+ isListening: true,
130
+ error: null,
131
+ transcript: ""
132
+ }));
133
+ };
134
+ recognition.onresult = (event) => {
135
+ let finalTranscript = "";
136
+ for (let i = event.resultIndex; i < event.results.length; i++) {
137
+ const transcript = event.results[i][0].transcript;
138
+ if (event.results[i].isFinal) finalTranscript += transcript + " ";
139
+ }
140
+ if (!finalTranscript) return;
141
+ setState((prev) => ({
142
+ ...prev,
143
+ transcript: prev.transcript + finalTranscript
144
+ }));
145
+ };
146
+ recognition.onerror = (event) => {
147
+ setState((prev) => ({
148
+ ...prev,
149
+ error: `Error: ${event.error}`
150
+ }));
151
+ };
152
+ recognition.onend = () => setState((prev) => ({
153
+ ...prev,
154
+ isListening: false
155
+ }));
156
+ return () => {
157
+ try {
158
+ recognition.stop();
159
+ } catch {}
160
+ recognition.onstart = null;
161
+ recognition.onresult = null;
162
+ recognition.onerror = null;
163
+ recognition.onend = null;
164
+ speechRecognitionRef.current = null;
165
+ };
166
+ }, [language]);
167
+ return {
168
+ ...state,
169
+ start,
170
+ stop
171
+ };
172
+ };
173
+ const useMastraSpeechToText = ({ agent, language }) => {
174
+ const [state, setState] = useState({
175
+ isListening: false,
176
+ transcript: "",
177
+ error: null
178
+ });
179
+ const recorderRef = useRef(null);
180
+ const sessionRef = useRef(0);
181
+ const startInFlightRef = useRef(false);
182
+ useEffect(() => {
183
+ return () => {
184
+ sessionRef.current += 1;
185
+ startInFlightRef.current = false;
186
+ recorderRef.current?.stop();
187
+ recorderRef.current = null;
188
+ };
189
+ }, [agent]);
190
+ const handleFinish = (session) => (file) => {
191
+ if (!agent || session !== sessionRef.current) return;
192
+ recorderRef.current = null;
193
+ setState((prev) => ({
194
+ ...prev,
195
+ isListening: false
196
+ }));
197
+ agent.voice.listen(file, { language }).then((res) => {
198
+ if (session !== sessionRef.current) return;
199
+ setState((prev) => ({
200
+ ...prev,
201
+ transcript: res.text,
202
+ error: null
203
+ }));
204
+ }).catch((error) => {
205
+ if (session !== sessionRef.current) return;
206
+ const message = error instanceof Error ? error.message : "Failed to transcribe speech";
207
+ setState((prev) => ({
208
+ ...prev,
209
+ error: message
210
+ }));
211
+ });
212
+ };
213
+ const start = () => {
214
+ if (!agent || startInFlightRef.current || recorderRef.current) return;
215
+ startInFlightRef.current = true;
216
+ sessionRef.current += 1;
217
+ const session = sessionRef.current;
218
+ recordMicrophoneToFile(handleFinish(session)).then((recorder) => {
219
+ startInFlightRef.current = false;
220
+ if (session !== sessionRef.current) {
221
+ try {
222
+ recorder.stop();
223
+ } catch {}
224
+ return;
225
+ }
226
+ recorderRef.current = recorder;
227
+ setState((prev) => ({
228
+ ...prev,
229
+ isListening: true,
230
+ error: null
231
+ }));
232
+ recorder.start();
233
+ }).catch((error) => {
234
+ startInFlightRef.current = false;
235
+ if (session !== sessionRef.current) return;
236
+ const message = error instanceof Error ? error.message : "Failed to start speech recording";
237
+ setState((prev) => ({
238
+ ...prev,
239
+ isListening: false,
240
+ error: message
241
+ }));
242
+ });
243
+ };
244
+ const stop = () => {
245
+ if (recorderRef.current) {
246
+ recorderRef.current.stop();
247
+ recorderRef.current = null;
248
+ } else if (startInFlightRef.current) sessionRef.current += 1;
249
+ startInFlightRef.current = false;
250
+ setState((prev) => ({
251
+ ...prev,
252
+ isListening: false
253
+ }));
254
+ };
255
+ return {
256
+ ...state,
257
+ start,
258
+ stop
259
+ };
260
+ };
261
+ //#endregion
262
+ export { playStreamWithWebAudio as n, recordMicrophoneToFile as r, useSpeechRecognition as t };
263
+
264
+ //# sourceMappingURL=voice-DgirjEyH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-DgirjEyH.js","names":[],"sources":["../src/voice/record-mic-to-file.ts","../src/voice/play-stream-with-web-audio.ts","../src/voice/use-speech-recognition.ts"],"sourcesContent":["export async function recordMicrophoneToFile(onFinish: (file: File) => void) {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const mediaRecorder = new MediaRecorder(stream);\n\n let chunks: BlobPart[] = [];\n\n mediaRecorder.ondataavailable = e => {\n chunks.push(e.data);\n };\n\n mediaRecorder.onstop = () => {\n const blob = new Blob(chunks, { type: 'audio/webm' });\n const file = new File([blob], `recording-${Date.now()}.webm`, {\n type: 'audio/webm',\n lastModified: Date.now(),\n });\n\n stream.getTracks().forEach(track => track.stop());\n onFinish(file);\n };\n\n return mediaRecorder;\n}\n","export async function playStreamWithWebAudio(stream: ReadableStream, onEnded?: () => void) {\n const audioContext = new window.AudioContext();\n\n const reader = stream.getReader();\n const chunks = [];\n\n try {\n // Read all chunks\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n // Combine chunks into single ArrayBuffer\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combinedBuffer = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n combinedBuffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Decode and play\n const audioBuffer = await audioContext.decodeAudioData(combinedBuffer.buffer);\n const source = audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.onended = onEnded ?? null;\n source.connect(audioContext.destination);\n source.start();\n\n return () => {\n source.onended = null;\n source.stop();\n void audioContext.close();\n };\n } catch (error) {\n await reader.cancel().catch(() => undefined);\n await audioContext.close().catch(() => undefined);\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useEffect, useRef, useState } from 'react';\nimport { useMastraClient } from '../mastra-client-context';\nimport { recordMicrophoneToFile } from './record-mic-to-file';\n\ntype Agent = ReturnType<MastraClient['getAgent']>;\ntype VoiceRequestContext = Parameters<Agent['voice']['getSpeakers']>[0];\n\nexport interface SpeechRecognitionState {\n isListening: boolean;\n transcript: string;\n error: string | null;\n}\n\nexport interface UseSpeechRecognitionArgs {\n language?: string;\n agentId?: string;\n requestContext?: VoiceRequestContext;\n}\n\ntype SpeechRecognitionResult = SpeechRecognitionState & {\n start: () => void;\n stop: () => void;\n};\n\nexport const useSpeechRecognition = ({\n language = 'en-US',\n agentId,\n requestContext,\n}: UseSpeechRecognitionArgs): SpeechRecognitionResult => {\n const client = useMastraClient();\n const [agent, setAgent] = useState<Agent | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n if (!agentId) {\n setAgent(null);\n return () => {\n cancelled = true;\n };\n }\n\n const agent = client.getAgent(agentId);\n\n const check = async () => {\n try {\n const speakers = await agent.voice.getSpeakers(requestContext);\n if (!cancelled) {\n setAgent(speakers.length > 0 ? agent : null);\n }\n } catch {\n if (!cancelled) {\n setAgent(null);\n }\n }\n };\n\n void check();\n\n return () => {\n cancelled = true;\n };\n }, [agentId, client, requestContext]);\n\n const browserSpeechRecognition = useBrowserSpeechRecognition({ language });\n const mastraSpeechRecognition = useMastraSpeechToText({ agent, language });\n\n if (!agent) {\n return browserSpeechRecognition;\n }\n\n return mastraSpeechRecognition;\n};\n\nconst useBrowserSpeechRecognition = ({ language = 'en-US' }: { language?: string }): SpeechRecognitionResult => {\n const speechRecognitionRef = useRef<any>(null);\n const [state, setState] = useState<SpeechRecognitionState>({\n isListening: false,\n transcript: '',\n error: null,\n });\n\n const start = () => {\n if (!speechRecognitionRef.current) return;\n speechRecognitionRef.current.start();\n };\n\n const stop = () => {\n if (!speechRecognitionRef.current) return;\n speechRecognitionRef.current.stop();\n };\n\n useEffect(() => {\n if (!('webkitSpeechRecognition' in window) && !('SpeechRecognition' in window)) {\n setState(prev => ({ ...prev, error: 'Speech Recognition not supported in this browser' }));\n return;\n }\n\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n const recognition = new SpeechRecognition();\n speechRecognitionRef.current = recognition;\n\n recognition.continuous = true;\n recognition.lang = language;\n\n recognition.onstart = () => {\n setState(prev => ({ ...prev, isListening: true, error: null, transcript: '' }));\n };\n\n recognition.onresult = (event: any) => {\n let finalTranscript = '';\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n finalTranscript += transcript + ' ';\n }\n }\n\n if (!finalTranscript) return;\n // Continuous mode emits one event per finalized phrase with an advancing\n // resultIndex, so append to the session transcript instead of replacing it.\n setState(prev => ({ ...prev, transcript: prev.transcript + finalTranscript }));\n };\n\n recognition.onerror = (event: any) => {\n setState(prev => ({ ...prev, error: `Error: ${event.error}` }));\n };\n\n recognition.onend = () => setState(prev => ({ ...prev, isListening: false }));\n\n return () => {\n try {\n recognition.stop();\n } catch {\n // ignore: recognition may not be running\n }\n recognition.onstart = null;\n recognition.onresult = null;\n recognition.onerror = null;\n recognition.onend = null;\n speechRecognitionRef.current = null;\n };\n }, [language]);\n\n return {\n ...state,\n start,\n stop,\n };\n};\n\nconst useMastraSpeechToText = ({\n agent,\n language,\n}: {\n agent: Agent | null;\n language: string;\n}): SpeechRecognitionResult => {\n const [state, setState] = useState<SpeechRecognitionState>({\n isListening: false,\n transcript: '',\n error: null,\n });\n const recorderRef = useRef<MediaRecorder | null>(null);\n const sessionRef = useRef(0);\n const startInFlightRef = useRef(false);\n\n useEffect(() => {\n return () => {\n sessionRef.current += 1;\n startInFlightRef.current = false;\n recorderRef.current?.stop();\n recorderRef.current = null;\n };\n }, [agent]);\n\n const handleFinish = (session: number) => (file: File) => {\n if (!agent || session !== sessionRef.current) return;\n\n recorderRef.current = null;\n setState(prev => ({ ...prev, isListening: false }));\n\n void agent.voice\n .listen(file, { language })\n .then(res => {\n if (session !== sessionRef.current) return;\n setState(prev => ({ ...prev, transcript: res.text, error: null }));\n })\n .catch(error => {\n if (session !== sessionRef.current) return;\n const message = error instanceof Error ? error.message : 'Failed to transcribe speech';\n setState(prev => ({ ...prev, error: message }));\n });\n };\n\n const start = () => {\n if (!agent || startInFlightRef.current || recorderRef.current) return;\n\n startInFlightRef.current = true;\n // Bump the session here (not in stop()) so a normal stop's onstop callback\n // still matches sessionRef.current. Only a new start (or unmount) should\n // invalidate a prior in-flight recording's result.\n // See: https://github.com/mastra-ai/mastra/issues/19980\n sessionRef.current += 1;\n const session = sessionRef.current;\n\n void recordMicrophoneToFile(handleFinish(session))\n .then(recorder => {\n startInFlightRef.current = false;\n if (session !== sessionRef.current) {\n try {\n recorder.stop();\n } catch {\n // ignore: recorder was never started\n }\n return;\n }\n recorderRef.current = recorder;\n setState(prev => ({ ...prev, isListening: true, error: null }));\n recorder.start();\n })\n .catch(error => {\n startInFlightRef.current = false;\n if (session !== sessionRef.current) return;\n const message = error instanceof Error ? error.message : 'Failed to start speech recording';\n setState(prev => ({ ...prev, isListening: false, error: message }));\n });\n };\n\n const stop = () => {\n if (recorderRef.current) {\n // An active recording — its session was fixed at start() time and hasn't\n // changed, so its own onstop/handleFinish will complete normally.\n recorderRef.current.stop();\n recorderRef.current = null;\n } else if (startInFlightRef.current) {\n // No recorder yet but a start() is still in-flight. Invalidate the\n // session so that start's resolution knows to abort (stop the recorder\n // instead of assigning/starting it) rather than silently proceeding.\n sessionRef.current += 1;\n }\n // Otherwise the hook is idle, or a finished recording's transcription is\n // still in flight — bumping the session then would silently discard the\n // transcript (the same failure class as #19980, in a narrower window).\n startInFlightRef.current = false;\n setState(prev => ({ ...prev, isListening: false }));\n };\n\n return {\n ...state,\n start,\n stop,\n };\n};\n"],"mappings":"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"}