@feathery/react 2.50.1 → 2.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/cjs/Form/index.d.ts.map +1 -1
  2. package/cjs/assistant/AssistantChat.d.ts +2 -1
  3. package/cjs/assistant/AssistantChat.d.ts.map +1 -1
  4. package/cjs/assistant/ToolStatus.d.ts +2 -1
  5. package/cjs/assistant/ToolStatus.d.ts.map +1 -1
  6. package/cjs/assistant/icons.d.ts +2 -0
  7. package/cjs/assistant/icons.d.ts.map +1 -1
  8. package/cjs/assistant/voice/audioPlayer.d.ts +30 -0
  9. package/cjs/assistant/voice/audioPlayer.d.ts.map +1 -0
  10. package/cjs/assistant/voice/useAssistantVoice.d.ts +34 -0
  11. package/cjs/assistant/voice/useAssistantVoice.d.ts.map +1 -0
  12. package/cjs/assistant/voice/voiceMic.d.ts +17 -0
  13. package/cjs/assistant/voice/voiceMic.d.ts.map +1 -0
  14. package/cjs/{fthry_AssistantChat.Bv_PnXs-.js → fthry_AssistantChat.BsoCfMXK.js} +658 -149
  15. package/cjs/{fthry_FormControl.BAksZlDz.js → fthry_FormControl.BzA7qxHZ.js} +1 -1
  16. package/cjs/{fthry_InlineTooltip.DplyptTz.js → fthry_InlineTooltip.Bw9pgDIw.js} +1 -1
  17. package/cjs/{fthry_PaymentMethodField.DpnN0V1H.js → fthry_PaymentMethodField.D98f9UKS.js} +3 -3
  18. package/cjs/{fthry_Placeholder.5Mvr4ask.js → fthry_Placeholder.B_zjw43E.js} +1 -1
  19. package/cjs/{fthry_ShowEyeIcon.5HKujzSD.js → fthry_ShowEyeIcon.ZLwZPfRq.js} +1 -1
  20. package/cjs/{fthry_TabsElement.CxiHTqRU.js → fthry_TabsElement.CCCOq9GT.js} +1 -1
  21. package/cjs/{fthry_auto-track.DV30-QdL.js → fthry_auto-track.BAWPFWe0.js} +2 -2
  22. package/cjs/{fthry_highlighted-body-TPN3WLV5.CtyrCPuE.js → fthry_highlighted-body-TPN3WLV5.CdZUMLQu.js} +3 -3
  23. package/cjs/{fthry_index.BUVzO2k5.js → fthry_index.B-OZzdzm.js} +1 -1
  24. package/cjs/{fthry_index.CVkyw_dk.js → fthry_index.B-hWSgmS.js} +2 -2
  25. package/cjs/{fthry_index.B9iGCw8F.js → fthry_index.B2VYo_3L.js} +2 -2
  26. package/cjs/{fthry_index.BPYIEjMq.js → fthry_index.B3cX_SU8.js} +10 -10
  27. package/cjs/{fthry_index.lC_5XhON.js → fthry_index.B6G4rkBG.js} +35 -33
  28. package/cjs/{fthry_index.CG2qDLCN.js → fthry_index.B7OIkL1Q.js} +3 -3
  29. package/cjs/{fthry_index.CXiwWMaB.js → fthry_index.BEwHwA6j.js} +1 -1
  30. package/cjs/{fthry_index.DO90MI7L.js → fthry_index.BJg_1W9K.js} +1 -1
  31. package/cjs/fthry_index.BUOiRJ-D.js +4107 -0
  32. package/cjs/{fthry_index.CB082HFt.js → fthry_index.BYS0fHe3.js} +5 -5
  33. package/cjs/{fthry_index.OHud4Plq.js → fthry_index.Bai03VA8.js} +2 -2
  34. package/cjs/{fthry_index.C_0LGAaW.js → fthry_index.BhDU-naO.js} +1 -1
  35. package/cjs/{fthry_index.0UtK4ObD.js → fthry_index.BjYlt6vi.js} +2 -2
  36. package/cjs/{fthry_index.Cbfqikpc.js → fthry_index.Bl1Ijmtp.js} +2 -2
  37. package/cjs/{fthry_index.DBDbbLL1.js → fthry_index.BpTdFmKU.js} +2 -2
  38. package/cjs/{fthry_index.DSxhyu57.js → fthry_index.C18Er2za.js} +1 -1
  39. package/cjs/{fthry_index.Byf43ZJS.js → fthry_index.C9qlOTHf.js} +3 -3
  40. package/cjs/{fthry_index.Dx62aGHl.js → fthry_index.CC6FOTfH.js} +1 -1
  41. package/cjs/{fthry_index.GZc-hNji.js → fthry_index.CCzbgjfm.js} +4 -4
  42. package/cjs/{fthry_index.D698F2zZ.js → fthry_index.CMsArMm_.js} +5 -5
  43. package/cjs/{fthry_index.B2kwLyNr.js → fthry_index.CSSbMDBw.js} +1 -1
  44. package/cjs/{fthry_index.DmtMegnj.js → fthry_index.D7EJH94c.js} +4 -4
  45. package/cjs/{fthry_index.C5BkZnrm.js → fthry_index.DIwRTqno.js} +5 -5
  46. package/cjs/{fthry_index.9V9ezpt1.js → fthry_index.DMobY2-N.js} +4 -4
  47. package/cjs/{fthry_index.Bp0-0Hpt.js → fthry_index.DMslw-i3.js} +4 -4
  48. package/cjs/{fthry_index.DXBYYUOP.js → fthry_index.Dh6IJZjX.js} +1 -1
  49. package/cjs/{fthry_index.DNf7jYzX.js → fthry_index.Di05NX_O.js} +3 -3
  50. package/cjs/{fthry_index.CXpQuMt1.js → fthry_index.Dr0P3X74.js} +1 -1
  51. package/cjs/{fthry_index.BQKxTWNQ.js → fthry_index.dSgl1CCN.js} +2 -2
  52. package/cjs/{fthry_index.D0tdVxWg.js → fthry_index.nZ_8ejIM.js} +7 -7
  53. package/cjs/{fthry_index.umd.DCBQBTfy.js → fthry_index.umd.DgFvyHQa.js} +1 -1
  54. package/cjs/{fthry_index.B-vFxNO_.js → fthry_index.unASrteD.js} +5 -5
  55. package/cjs/{fthry_index.DFZUCN27.js → fthry_index.w57aibSs.js} +1 -1
  56. package/cjs/{fthry_input.3B0IH5fK.js → fthry_input.C7BKq5z_.js} +1 -1
  57. package/cjs/fthry_logging.B-EvoWue.js +24 -0
  58. package/cjs/fthry_logging.CfOLa3Tt.js +29 -0
  59. package/cjs/{fthry_mermaid-O7DHMXV3.BwkCSjZC.js → fthry_mermaid-O7DHMXV3.B8USB1Kg.js} +3 -3
  60. package/cjs/{fthry_script.Dfvbhz8G.js → fthry_script.DrniTFOi.js} +1 -1
  61. package/cjs/{fthry_styles.BecNWwfa.js → fthry_styles.2fRCqt5B.js} +1 -1
  62. package/cjs/{fthry_useElementSize.D9fwVm32.js → fthry_useElementSize.Dl5cv1ek.js} +1 -1
  63. package/cjs/{fthry_useSalesforceSync.B8WpZf2e.js → fthry_useSalesforceSync.AymUQfjs.js} +1 -1
  64. package/cjs/{fthry_webfontloader.maDTrAYi.js → fthry_webfontloader.BPEBfvjW.js} +1 -1
  65. package/cjs/index.js +1 -1
  66. package/cjs/thumbnail-renderer.js +1 -1
  67. package/cjs/utils/formHelperFunctions.d.ts +1 -0
  68. package/cjs/utils/formHelperFunctions.d.ts.map +1 -1
  69. package/dist/Form/index.d.ts.map +1 -1
  70. package/dist/assistant/AssistantChat.d.ts +2 -1
  71. package/dist/assistant/AssistantChat.d.ts.map +1 -1
  72. package/dist/assistant/ToolStatus.d.ts +2 -1
  73. package/dist/assistant/ToolStatus.d.ts.map +1 -1
  74. package/dist/assistant/icons.d.ts +2 -0
  75. package/dist/assistant/icons.d.ts.map +1 -1
  76. package/dist/assistant/voice/audioPlayer.d.ts +30 -0
  77. package/dist/assistant/voice/audioPlayer.d.ts.map +1 -0
  78. package/dist/assistant/voice/useAssistantVoice.d.ts +34 -0
  79. package/dist/assistant/voice/useAssistantVoice.d.ts.map +1 -0
  80. package/dist/assistant/voice/voiceMic.d.ts +17 -0
  81. package/dist/assistant/voice/voiceMic.d.ts.map +1 -0
  82. package/dist/{fthry_AssistantChat.BWUYjfwA.js → fthry_AssistantChat.Ib6E1Bq3.js} +658 -149
  83. package/dist/{fthry_FormControl.gQmC3Q_5.js → fthry_FormControl.hTupl7ck.js} +1 -1
  84. package/dist/{fthry_InlineTooltip.M1XQiZpn.js → fthry_InlineTooltip.BssUbqg_.js} +1 -1
  85. package/dist/{fthry_PaymentMethodField.DEs0It74.js → fthry_PaymentMethodField.Djyo2xTk.js} +3 -3
  86. package/dist/{fthry_Placeholder.B8e4W9VJ.js → fthry_Placeholder.CzouKHi6.js} +1 -1
  87. package/dist/{fthry_ShowEyeIcon.DdLap_w9.js → fthry_ShowEyeIcon.AJJvDqNQ.js} +1 -1
  88. package/dist/{fthry_TabsElement.DpJTusbm.js → fthry_TabsElement.Bs_irzqq.js} +1 -1
  89. package/dist/{fthry_auto-track.HTzxPnUa.js → fthry_auto-track.Daz0pfsh.js} +2 -2
  90. package/dist/{fthry_highlighted-body-TPN3WLV5.kj3f_DpN.js → fthry_highlighted-body-TPN3WLV5.eroZTbSq.js} +3 -3
  91. package/dist/{fthry_index.CVJtI2Xl.js → fthry_index.2Sl9-JNb.js} +1 -1
  92. package/dist/{fthry_index.D0Cgvg7i.js → fthry_index.B4Nb9Sji.js} +3 -3
  93. package/dist/{fthry_index.CyvJ8-bB.js → fthry_index.B8HUJJnP.js} +2 -2
  94. package/dist/{fthry_index.Bx652TAg.js → fthry_index.B9PcKkAq.js} +1 -1
  95. package/dist/{fthry_index.CNFIYUXl.js → fthry_index.BFkYtZJ2.js} +2 -2
  96. package/dist/{fthry_index.C4_1X7GA.js → fthry_index.BT0EqM-G.js} +5 -5
  97. package/dist/{fthry_index.Dav1_JFe.js → fthry_index.BUsitTZS.js} +1 -1
  98. package/dist/{fthry_index.CWe8WGnw.js → fthry_index.BVPj0lva.js} +1 -1
  99. package/dist/{fthry_index.BBhLiIOO.js → fthry_index.BX0Co6y1.js} +4 -4
  100. package/dist/{fthry_index.Bq05T75f.js → fthry_index.BbVR1AtA.js} +1 -1
  101. package/dist/{fthry_index.CQOB3Ugj.js → fthry_index.BhzPTCxe.js} +3 -3
  102. package/dist/{fthry_index.znErF4eB.js → fthry_index.Bi7P0Xct.js} +2 -2
  103. package/dist/{fthry_index.CkW0oER4.js → fthry_index.C2d1jRBW.js} +5 -5
  104. package/dist/{fthry_index.DpXk-u8o.js → fthry_index.CbFfAKDZ.js} +10 -10
  105. package/dist/{fthry_index.D4NYHwF9.js → fthry_index.CbJ1X4oH.js} +7 -7
  106. package/dist/{fthry_index.ptJrcCPy.js → fthry_index.CvJSciOO.js} +36 -34
  107. package/dist/{fthry_index.B8mrrhCT.js → fthry_index.D09J5ND-.js} +3 -3
  108. package/dist/{fthry_index.r1TNpIHy.js → fthry_index.D4AWnyyX.js} +1 -1
  109. package/dist/{fthry_index.D7yot10w.js → fthry_index.D7GXEV6M.js} +1 -1
  110. package/dist/{fthry_index.BDiGpbY8.js → fthry_index.D7M_cXXa.js} +2 -2
  111. package/dist/{fthry_index.DTmSNKnS.js → fthry_index.D8-SD3eU.js} +5 -5
  112. package/dist/{fthry_index.CIqCJp4_.js → fthry_index.DhXWu2Ea.js} +4 -4
  113. package/dist/{fthry_index.C0iUe75-.js → fthry_index.Dk2qH_mD.js} +1 -1
  114. package/dist/{fthry_index.Dt6zQK3e.js → fthry_index.Dn7ecnQb.js} +4 -4
  115. package/dist/{fthry_index.Bo8U-enX.js → fthry_index.GEWCIsa9.js} +1 -1
  116. package/dist/{fthry_index.DzM7hukc.js → fthry_index.OJS8SYip.js} +2 -2
  117. package/dist/{fthry_index.DXY-WeCY.js → fthry_index.jn5SIgUf.js} +4 -4
  118. package/dist/fthry_index.pJdw8fzl.js +4105 -0
  119. package/dist/{fthry_index.D1WDrqdZ.js → fthry_index.r4Ruls8S.js} +1 -1
  120. package/dist/{fthry_index.BNN_GnRE.js → fthry_index.rteqieKy.js} +2 -2
  121. package/dist/{fthry_index.umd.C9mURNOx.js → fthry_index.umd.B6z1ClBd.js} +1 -1
  122. package/dist/{fthry_index.DfrV6A68.js → fthry_index.v__0hwR7.js} +4 -4
  123. package/dist/{fthry_index.DIAR7NXW.js → fthry_index.zmnisF_Z.js} +2 -2
  124. package/dist/{fthry_input.C-ByVjA4.js → fthry_input.Cpq5jq9k.js} +1 -1
  125. package/dist/fthry_logging.B1LWsZ3K.js +22 -0
  126. package/dist/fthry_logging.DzR9660y.js +27 -0
  127. package/dist/fthry_mermaid-O7DHMXV3.Bz4-4YvV.js +8 -0
  128. package/dist/{fthry_script.DvAaqiBk.js → fthry_script.DnFzekPL.js} +1 -1
  129. package/dist/{fthry_styles.DwzdoBlX.js → fthry_styles.DhyJBYwb.js} +1 -1
  130. package/dist/{fthry_useElementSize.9DmbhgBu.js → fthry_useElementSize.Dbmsu96w.js} +1 -1
  131. package/dist/{fthry_useSalesforceSync.qRdq0wu3.js → fthry_useSalesforceSync.BzPu52nT.js} +1 -1
  132. package/dist/{fthry_webfontloader.B5npG4_8.js → fthry_webfontloader.DpJa4nSy.js} +1 -1
  133. package/dist/index.js +2 -2
  134. package/dist/thumbnail-renderer.js +1 -1
  135. package/dist/utils/formHelperFunctions.d.ts +1 -0
  136. package/dist/utils/formHelperFunctions.d.ts.map +1 -1
  137. package/package.json +2 -1
  138. package/umd/129.ec2bd9be8700ef0450ee.js +1 -0
  139. package/umd/762.4a580055e4cb2c97c28f.js +2 -0
  140. package/umd/762.4a580055e4cb2c97c28f.js.LICENSE.txt +56 -0
  141. package/umd/968.2ad2025393b417351f94.js +1 -0
  142. package/umd/AssistantChat.dc0944bf4eba51ea8102.js +1 -0
  143. package/umd/index.js +1 -1
  144. package/dist/fthry_mermaid-O7DHMXV3.BLTan-1s.js +0 -8
  145. package/umd/AssistantChat.4c90e588cefb3c7dcc90.js +0 -1
@@ -1,9 +1,9 @@
1
- import { N as getDefaultExportFromCjs, j as jsx, _ as __assign, b as jsxs, e as __read, T as __spreadArray, l as css, s as __awaiter, t as __generator, aU as internalState, aV as getPositionKey, a1 as __values, aW as initState, aX as getRepeatedContainers, aY as getRepeatedContainer, aZ as getDefaultFieldValue, a_ as isButtonDisabled, M as replaceTextVariables, a$ as loadPhoneValidator, a0 as phoneLibPromise, Y as phoneLib, b0 as initInfo, b1 as getCookie, w as featheryWindow, z as featheryDoc, x as Fragment$1, ad as v4 } from './fthry_index.ptJrcCPy.js';
1
+ import { x as getDefaultExportFromCjs, j as jsx, _ as __assign, b as jsxs, w as featheryWindow, s as __awaiter, t as __generator, e as __read, T as __spreadArray, ad as v4, l as css, aU as internalState, aV as getPositionKey, a1 as __values, aW as initState, aX as getRepeatedContainers, aY as getRepeatedContainer, aZ as getDefaultFieldValue, a_ as isButtonDisabled, N as replaceTextVariables, a$ as loadPhoneValidator, a0 as phoneLibPromise, Y as phoneLib, b0 as initInfo, b1 as getCookie, A as featheryDoc, y as Fragment$1 } from './fthry_index.CvJSciOO.js';
2
2
  import { useRef, useCallback, useSyncExternalStore, useEffect, useState, memo, useId, useTransition, useMemo, cloneElement, createElement, createContext, isValidElement, useContext, Suspense, lazy as lazy$1, Fragment as Fragment$2 } from 'react';
3
3
  import { c as clsx } from './fthry_clsx.ChV9xqsO.js';
4
4
  import { jsx as jsx$1, jsxs as jsxs$1, Fragment } from 'react/jsx-runtime';
5
5
  import { createPortal } from 'react-dom';
6
- import { s as stateMap } from './fthry_index.r1TNpIHy.js';
6
+ import { s as stateMap } from './fthry_index.D4AWnyyX.js';
7
7
 
8
8
  // src/errors/ai-sdk-error.ts
9
9
  var marker = "vercel.ai.error";
@@ -9761,7 +9761,444 @@ var FullscreenIcon = function (props) { return (jsxs("svg", __assign({ width: '1
9761
9761
  var MinusIcon = function (props) { return (jsx("svg", __assign({ width: '16', height: '16', viewBox: '0 0 24 24', fill: 'none' }, props, { children: jsx("path", { d: 'M5 12h14', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round' }) }))); };
9762
9762
  var ChevronsLeftIcon = function (props) { return (jsxs("svg", __assign({ width: '16', height: '16', viewBox: '0 0 24 24', fill: 'none' }, props, { children: [jsx("path", { d: 'm11 17-5-5 5-5', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' }), jsx("path", { d: 'm18 17-5-5 5-5', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' })] }))); };
9763
9763
  var ChevronsRightIcon = function (props) { return (jsxs("svg", __assign({ width: '16', height: '16', viewBox: '0 0 24 24', fill: 'none' }, props, { children: [jsx("path", { d: 'm6 17 5-5-5-5', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' }), jsx("path", { d: 'm13 17 5-5-5-5', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' })] }))); };
9764
- var LinkIcon = function (props) { return (jsxs("svg", __assign({ width: '12', height: '12', viewBox: '0 0 24 24', fill: 'none' }, props, { children: [jsx("path", { d: 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' }), jsx("path", { d: 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' })] }))); };
9764
+ var LinkIcon = function (props) { return (jsxs("svg", __assign({ width: '12', height: '12', viewBox: '0 0 24 24', fill: 'none' }, props, { children: [jsx("path", { d: 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' }), jsx("path", { d: 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round', strokeLinejoin: 'round' })] }))); };
9765
+ var MicIcon = function (props) { return (jsxs("svg", __assign({ width: '20', height: '20', viewBox: '0 0 24 24', fill: 'none' }, props, { children: [jsx("rect", { x: '9', y: '3', width: '6', height: '12', rx: '3', stroke: 'currentColor', strokeWidth: '2' }), jsx("path", { d: 'M5 11a7 7 0 0 0 14 0', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round' }), jsx("path", { d: 'M12 18v3', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round' })] }))); };
9766
+ var WaveformIcon = function (props) { return (jsxs("svg", __assign({ width: '18', height: '18', viewBox: '0 0 24 24', fill: 'none' }, props, { children: [jsx("path", { d: 'M4 12v0', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round' }), jsx("path", { d: 'M8 9v6', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round' }), jsx("path", { d: 'M12 5v14', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round' }), jsx("path", { d: 'M16 9v6', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round' }), jsx("path", { d: 'M20 11v2', stroke: 'currentColor', strokeWidth: '2', strokeLinecap: 'round' })] }))); };
9767
+
9768
+ function base64ToBytes(base64) {
9769
+ var binary = featheryWindow().atob(base64);
9770
+ var bytes = new Uint8Array(binary.length);
9771
+ for (var i = 0; i < binary.length; i++)
9772
+ bytes[i] = binary.charCodeAt(i);
9773
+ return bytes;
9774
+ }
9775
+ // Reveal text slightly ahead of the audio so it reads naturally rather than lagging
9776
+ var REVEAL_LEAD = 1.5;
9777
+ // Play the turn's audio clip by clip, reporting progress to drive the text reveal
9778
+ var AudioPlayer = /** @class */ (function () {
9779
+ function AudioPlayer(opts) {
9780
+ if (opts === void 0) { opts = {}; }
9781
+ this.building = [];
9782
+ this.queue = [];
9783
+ this.playIndex = 0;
9784
+ this.ended = false;
9785
+ this.playing = false;
9786
+ this.audio = null;
9787
+ this.objectUrl = null;
9788
+ this.rafId = null;
9789
+ this.opts = opts;
9790
+ }
9791
+ Object.defineProperty(AudioPlayer.prototype, "isPlaying", {
9792
+ get: function () {
9793
+ return this.playing;
9794
+ },
9795
+ enumerable: false,
9796
+ configurable: true
9797
+ });
9798
+ AudioPlayer.prototype.pushChunk = function (base64) {
9799
+ this.building.push(base64ToBytes(base64));
9800
+ };
9801
+ // The sentence's audio is fully sent, queue it (with its text) and keep playback moving
9802
+ AudioPlayer.prototype.pushSegment = function (text) {
9803
+ this.queue.push({ text: text, bytes: this.building });
9804
+ this.building = [];
9805
+ this.playing = true;
9806
+ this.playNext();
9807
+ };
9808
+ // No more clips coming
9809
+ AudioPlayer.prototype.end = function () {
9810
+ this.ended = true;
9811
+ this.playNext();
9812
+ };
9813
+ // Cut playback and drop anything queued
9814
+ AudioPlayer.prototype.skip = function () {
9815
+ this.teardown();
9816
+ };
9817
+ AudioPlayer.prototype.playNext = function () {
9818
+ var _this = this;
9819
+ var _a, _b, _c, _d;
9820
+ if (this.audio)
9821
+ return;
9822
+ var clip = this.queue[this.playIndex];
9823
+ if (!clip) {
9824
+ if (this.ended && this.playing) {
9825
+ this.playing = false;
9826
+ (_b = (_a = this.opts).onIdle) === null || _b === void 0 ? void 0 : _b.call(_a);
9827
+ }
9828
+ return;
9829
+ }
9830
+ if (clip.bytes.length === 0) {
9831
+ // TTS produced no audio for this sentence, credit its text to keep the reveal moving
9832
+ (_d = (_c = this.opts).onSegmentEnd) === null || _d === void 0 ? void 0 : _d.call(_c, clip.text);
9833
+ this.playIndex += 1;
9834
+ this.playNext();
9835
+ return;
9836
+ }
9837
+ var url = URL.createObjectURL(new Blob(clip.bytes, { type: 'audio/mpeg' }));
9838
+ var audio = new Audio(url);
9839
+ this.audio = audio;
9840
+ this.objectUrl = url;
9841
+ audio.onplaying = function () {
9842
+ var _a, _b;
9843
+ if (_this.audio !== audio)
9844
+ return;
9845
+ (_b = (_a = _this.opts).onSegmentStart) === null || _b === void 0 ? void 0 : _b.call(_a, clip.text);
9846
+ _this.startReveal(audio, clip.text);
9847
+ };
9848
+ audio.onended = function () { return _this.finishClip(audio, clip.text); };
9849
+ audio.onerror = function () { return _this.finishClip(audio, clip.text); };
9850
+ audio.play().catch(function () { return _this.finishClip(audio, clip.text); });
9851
+ };
9852
+ // Drive the text reveal from the clip's playback position
9853
+ AudioPlayer.prototype.startReveal = function (audio, text) {
9854
+ var _this = this;
9855
+ var win = featheryWindow();
9856
+ var tick = function () {
9857
+ var _a, _b;
9858
+ if (_this.audio !== audio) {
9859
+ _this.rafId = null;
9860
+ return;
9861
+ }
9862
+ var d = audio.duration;
9863
+ var fraction = d && isFinite(d) && d > 0
9864
+ ? Math.min(1, (audio.currentTime / d) * REVEAL_LEAD)
9865
+ : 0;
9866
+ (_b = (_a = _this.opts).onSegmentProgress) === null || _b === void 0 ? void 0 : _b.call(_a, text, fraction);
9867
+ _this.rafId = win.requestAnimationFrame(tick);
9868
+ };
9869
+ this.rafId = win.requestAnimationFrame(tick);
9870
+ };
9871
+ AudioPlayer.prototype.stopReveal = function () {
9872
+ if (this.rafId !== null) {
9873
+ featheryWindow().cancelAnimationFrame(this.rafId);
9874
+ this.rafId = null;
9875
+ }
9876
+ };
9877
+ AudioPlayer.prototype.finishClip = function (audio, text) {
9878
+ var _a, _b;
9879
+ if (this.audio !== audio)
9880
+ return;
9881
+ this.stopReveal();
9882
+ (_b = (_a = this.opts).onSegmentEnd) === null || _b === void 0 ? void 0 : _b.call(_a, text);
9883
+ audio.pause();
9884
+ audio.src = '';
9885
+ this.audio = null;
9886
+ if (this.objectUrl) {
9887
+ URL.revokeObjectURL(this.objectUrl);
9888
+ this.objectUrl = null;
9889
+ }
9890
+ this.playIndex += 1;
9891
+ this.playNext();
9892
+ };
9893
+ AudioPlayer.prototype.teardown = function () {
9894
+ var _a, _b;
9895
+ this.stopReveal();
9896
+ if (this.audio) {
9897
+ this.audio.pause();
9898
+ this.audio.src = '';
9899
+ this.audio = null;
9900
+ }
9901
+ if (this.objectUrl) {
9902
+ URL.revokeObjectURL(this.objectUrl);
9903
+ this.objectUrl = null;
9904
+ }
9905
+ this.building = [];
9906
+ this.queue = [];
9907
+ this.playIndex = 0;
9908
+ this.ended = false;
9909
+ this.playing = false;
9910
+ (_b = (_a = this.opts).onIdle) === null || _b === void 0 ? void 0 : _b.call(_a);
9911
+ };
9912
+ return AudioPlayer;
9913
+ }());
9914
+
9915
+ // CDN-hosted so consumers don't have to serve the WASM/model assets
9916
+ var VAD_ASSET_BASE = 'https://cdn.jsdelivr.net/npm/@ricky0123/vad-web@0.0.30/dist/';
9917
+ var ORT_ASSET_BASE = 'https://cdn.jsdelivr.net/npm/onnxruntime-web@1.27.0/dist/';
9918
+ // Clips under ~0.4s are noise, STT hallucinates words on them
9919
+ var MIN_SAMPLES = 6400;
9920
+ var VoiceMic = /** @class */ (function () {
9921
+ function VoiceMic(opts) {
9922
+ this.vad = null;
9923
+ this.paused = false;
9924
+ this.opts = opts;
9925
+ }
9926
+ VoiceMic.prototype.start = function () {
9927
+ return __awaiter(this, void 0, void 0, function () {
9928
+ var _a, MicVAD_1, vadUtils_1, vadLog, _b;
9929
+ var _this = this;
9930
+ return __generator(this, function (_d) {
9931
+ switch (_d.label) {
9932
+ case 0:
9933
+ _d.trys.push([0, 4, , 5]);
9934
+ return [4 /*yield*/, import('./fthry_index.pJdw8fzl.js').then(function (n) { return n.i; })];
9935
+ case 1:
9936
+ _a = _d.sent(), MicVAD_1 = _a.MicVAD, vadUtils_1 = _a.utils;
9937
+ return [4 /*yield*/, import('./fthry_logging.DzR9660y.js').then(function (n) { return n.l; })];
9938
+ case 2:
9939
+ vadLog = (_d.sent()).log;
9940
+ vadLog.debug = function () { return undefined; };
9941
+ _b = this;
9942
+ return [4 /*yield*/, MicVAD_1.new({
9943
+ baseAssetPath: VAD_ASSET_BASE,
9944
+ onnxWASMBasePath: ORT_ASSET_BASE,
9945
+ getStream: function () {
9946
+ return featheryWindow().navigator.mediaDevices.getUserMedia({
9947
+ audio: {
9948
+ echoCancellation: true,
9949
+ noiseSuppression: true,
9950
+ autoGainControl: true
9951
+ }
9952
+ });
9953
+ },
9954
+ onSpeechStart: function () {
9955
+ if (!_this.paused)
9956
+ _this.opts.onSpeechStart();
9957
+ },
9958
+ onSpeechEnd: function (audio) {
9959
+ if (_this.paused || audio.length < MIN_SAMPLES)
9960
+ return;
9961
+ var wav = new Blob([vadUtils_1.encodeWAV(audio)], {
9962
+ type: 'audio/wav'
9963
+ });
9964
+ _this.opts.onUtterance(wav);
9965
+ }
9966
+ })];
9967
+ case 3:
9968
+ _b.vad = _d.sent();
9969
+ this.vad.start();
9970
+ return [2 /*return*/, true];
9971
+ case 4:
9972
+ _d.sent();
9973
+ this.vad = null;
9974
+ return [2 /*return*/, false];
9975
+ case 5: return [2 /*return*/];
9976
+ }
9977
+ });
9978
+ });
9979
+ };
9980
+ // Hot only during the user's turn, off while the assistant thinks and speaks
9981
+ VoiceMic.prototype.pause = function () {
9982
+ var _a;
9983
+ this.paused = true;
9984
+ (_a = this.vad) === null || _a === void 0 ? void 0 : _a.pause();
9985
+ };
9986
+ VoiceMic.prototype.resume = function () {
9987
+ var _a;
9988
+ this.paused = false;
9989
+ (_a = this.vad) === null || _a === void 0 ? void 0 : _a.start();
9990
+ };
9991
+ VoiceMic.prototype.destroy = function () {
9992
+ var _a;
9993
+ (_a = this.vad) === null || _a === void 0 ? void 0 : _a.destroy();
9994
+ this.vad = null;
9995
+ };
9996
+ return VoiceMic;
9997
+ }());
9998
+ function probeMicAvailable() {
9999
+ var _a;
10000
+ try {
10001
+ var md = (_a = featheryWindow().navigator) === null || _a === void 0 ? void 0 : _a.mediaDevices;
10002
+ return !!md && typeof md.getUserMedia === 'function';
10003
+ }
10004
+ catch (_b) {
10005
+ return false;
10006
+ }
10007
+ }
10008
+
10009
+ var nonWhitespace = function (text) { return text.replace(/\s/g, '').length; };
10010
+ function useAssistantVoice(_a) {
10011
+ var _this = this;
10012
+ var status = _a.status, sendMessage = _a.sendMessage, setMessages = _a.setMessages, ensureThread = _a.ensureThread, voiceActiveRef = _a.voiceActiveRef, pendingAudioRef = _a.pendingAudioRef, voiceDataRef = _a.voiceDataRef;
10013
+ var _b = __read(useState('idle'), 2), voiceState = _b[0], setVoiceStateRaw = _b[1];
10014
+ var _c = __read(useState(probeMicAvailable), 1), micAvailable = _c[0];
10015
+ // Characters of the reply whose audio clip has begun playing, driving the in-order text reveal
10016
+ var _d = __read(useState(0), 2), spokenChars = _d[0], setSpokenChars = _d[1];
10017
+ // True while this turn's audio is queued or playing, keeping the reveal paced after the stream closes
10018
+ var _e = __read(useState(false), 2), audioDraining = _e[0], setAudioDraining = _e[1];
10019
+ var stateRef = useRef('idle');
10020
+ var statusRef = useRef(status);
10021
+ var micRef = useRef(null);
10022
+ var playerRef = useRef(null);
10023
+ // Non-whitespace chars of clips already finished, progress adds the in-flight clip on top
10024
+ var baseRef = useRef(0);
10025
+ // Set when the user taps skip, muting the rest of this turn's audio
10026
+ var skippedRef = useRef(false);
10027
+ var setVoiceState = useCallback(function (next) {
10028
+ stateRef.current = next;
10029
+ setVoiceStateRaw(next);
10030
+ }, []);
10031
+ // Return to listening once the turn ends (done or errored) and audio has drained
10032
+ var maybeFinishSpeaking = useCallback(function () {
10033
+ var _a, _b;
10034
+ if (!voiceActiveRef.current)
10035
+ return;
10036
+ if (statusRef.current !== 'ready' && statusRef.current !== 'error')
10037
+ return;
10038
+ if ((_a = playerRef.current) === null || _a === void 0 ? void 0 : _a.isPlaying)
10039
+ return;
10040
+ if (stateRef.current === 'transcribing' ||
10041
+ stateRef.current === 'thinking' ||
10042
+ stateRef.current === 'speaking') {
10043
+ (_b = micRef.current) === null || _b === void 0 ? void 0 : _b.resume();
10044
+ setVoiceState('listening');
10045
+ }
10046
+ }, [voiceActiveRef, setVoiceState]);
10047
+ var handleUtterance = useCallback(function (wav) {
10048
+ var _a, _b;
10049
+ if (stateRef.current !== 'recording' && stateRef.current !== 'listening')
10050
+ return;
10051
+ pendingAudioRef.current = wav;
10052
+ (_a = micRef.current) === null || _a === void 0 ? void 0 : _a.pause();
10053
+ (_b = playerRef.current) === null || _b === void 0 ? void 0 : _b.skip();
10054
+ baseRef.current = 0;
10055
+ skippedRef.current = false;
10056
+ setSpokenChars(0);
10057
+ setVoiceState('transcribing');
10058
+ ensureThread();
10059
+ // Send an empty user message so the turn anchors on it like a typed one
10060
+ sendMessage({ text: '' });
10061
+ }, [pendingAudioRef, ensureThread, sendMessage, setVoiceState]);
10062
+ // Mic is created once, route through a ref to reach the current handler
10063
+ var handleUtteranceRef = useRef(handleUtterance);
10064
+ handleUtteranceRef.current = handleUtterance;
10065
+ var startVoice = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
10066
+ var player, mic, ok;
10067
+ return __generator(this, function (_a) {
10068
+ switch (_a.label) {
10069
+ case 0:
10070
+ if (stateRef.current !== 'idle' && stateRef.current !== 'error')
10071
+ return [2 /*return*/];
10072
+ player = new AudioPlayer({
10073
+ onSegmentStart: function () {
10074
+ if (voiceActiveRef.current)
10075
+ setVoiceState('speaking');
10076
+ },
10077
+ onSegmentProgress: function (text, fraction) {
10078
+ return setSpokenChars(baseRef.current + Math.floor(nonWhitespace(text) * fraction));
10079
+ },
10080
+ onSegmentEnd: function (text) {
10081
+ baseRef.current += nonWhitespace(text);
10082
+ setSpokenChars(baseRef.current);
10083
+ },
10084
+ onIdle: function () {
10085
+ setAudioDraining(false);
10086
+ maybeFinishSpeaking();
10087
+ }
10088
+ });
10089
+ mic = new VoiceMic({
10090
+ onSpeechStart: function () {
10091
+ if (stateRef.current === 'listening')
10092
+ setVoiceState('recording');
10093
+ },
10094
+ onUtterance: function (wav) { return handleUtteranceRef.current(wav); }
10095
+ });
10096
+ playerRef.current = player;
10097
+ micRef.current = mic;
10098
+ voiceActiveRef.current = true;
10099
+ // Stays 'loading' until the VAD assets finish downloading, only then is the mic live
10100
+ setVoiceState('loading');
10101
+ return [4 /*yield*/, mic.start()];
10102
+ case 1:
10103
+ ok = _a.sent();
10104
+ if (!ok) {
10105
+ voiceActiveRef.current = false;
10106
+ setVoiceState('error');
10107
+ }
10108
+ else {
10109
+ setVoiceState('listening');
10110
+ }
10111
+ return [2 /*return*/];
10112
+ }
10113
+ });
10114
+ }); }, [voiceActiveRef, maybeFinishSpeaking, setVoiceState]);
10115
+ var stopVoice = useCallback(function () {
10116
+ var _a, _b;
10117
+ (_a = micRef.current) === null || _a === void 0 ? void 0 : _a.destroy();
10118
+ micRef.current = null;
10119
+ (_b = playerRef.current) === null || _b === void 0 ? void 0 : _b.skip();
10120
+ playerRef.current = null;
10121
+ pendingAudioRef.current = null;
10122
+ voiceActiveRef.current = false;
10123
+ setVoiceState('idle');
10124
+ }, [voiceActiveRef, pendingAudioRef, setVoiceState]);
10125
+ var skipSpeaking = useCallback(function () {
10126
+ var _a;
10127
+ if (stateRef.current !== 'speaking')
10128
+ return;
10129
+ skippedRef.current = true;
10130
+ (_a = playerRef.current) === null || _a === void 0 ? void 0 : _a.skip();
10131
+ // Audio is muted, so reveal the rest of the reply text immediately
10132
+ setSpokenChars(Number.MAX_SAFE_INTEGER);
10133
+ }, []);
10134
+ // Route the transient transcript + audio parts coming off the chat stream
10135
+ useEffect(function () {
10136
+ voiceDataRef.current = function (part) {
10137
+ var _a, _b, _c, _d, _e, _f, _g;
10138
+ if (!voiceActiveRef.current)
10139
+ return;
10140
+ if (part.type === 'data-audio') {
10141
+ if ((_a = part.data) === null || _a === void 0 ? void 0 : _a.done)
10142
+ (_b = playerRef.current) === null || _b === void 0 ? void 0 : _b.end();
10143
+ else if (((_c = part.data) === null || _c === void 0 ? void 0 : _c.chunk) && !skippedRef.current)
10144
+ (_d = playerRef.current) === null || _d === void 0 ? void 0 : _d.pushChunk(part.data.chunk);
10145
+ }
10146
+ else if (part.type === 'data-segment' && ((_e = part.data) === null || _e === void 0 ? void 0 : _e.text)) {
10147
+ if (skippedRef.current)
10148
+ return;
10149
+ setAudioDraining(true);
10150
+ (_f = playerRef.current) === null || _f === void 0 ? void 0 : _f.pushSegment(part.data.text);
10151
+ }
10152
+ else if (part.type === 'data-transcript' && ((_g = part.data) === null || _g === void 0 ? void 0 : _g.text)) {
10153
+ var text_1 = part.data.text;
10154
+ // Transcript is in, the agent is now working on the reply
10155
+ if (stateRef.current === 'transcribing')
10156
+ setVoiceState('thinking');
10157
+ // Fill the empty user message this turn was sent with
10158
+ setMessages(function (prev) {
10159
+ for (var i = prev.length - 1; i >= 0; i--) {
10160
+ if (prev[i].role === 'user') {
10161
+ var next = __spreadArray([], __read(prev), false);
10162
+ next[i] = __assign(__assign({}, prev[i]), { parts: [{ type: 'text', text: text_1 }] });
10163
+ return next;
10164
+ }
10165
+ }
10166
+ return __spreadArray(__spreadArray([], __read(prev), false), [
10167
+ { id: v4(), role: 'user', parts: [{ type: 'text', text: text_1 }] }
10168
+ ], false);
10169
+ });
10170
+ }
10171
+ };
10172
+ return function () {
10173
+ voiceDataRef.current = null;
10174
+ };
10175
+ }, [voiceDataRef, voiceActiveRef, setMessages, setVoiceState]);
10176
+ useEffect(function () {
10177
+ statusRef.current = status;
10178
+ // A turn that ends with the user message still empty had no usable transcript, drop it
10179
+ if ((status === 'ready' || status === 'error') && voiceActiveRef.current) {
10180
+ setMessages(function (prev) {
10181
+ var _a;
10182
+ var last = prev[prev.length - 1];
10183
+ var emptyUser = (last === null || last === void 0 ? void 0 : last.role) === 'user' &&
10184
+ !((_a = last.parts) !== null && _a !== void 0 ? _a : []).some(function (p) { var _a; return p.type === 'text' && ((_a = p.text) !== null && _a !== void 0 ? _a : '').trim(); });
10185
+ return emptyUser ? prev.slice(0, -1) : prev;
10186
+ });
10187
+ }
10188
+ maybeFinishSpeaking();
10189
+ }, [status, maybeFinishSpeaking, voiceActiveRef, setMessages]);
10190
+ useEffect(function () { return function () { return stopVoice(); }; }, [stopVoice]);
10191
+ return {
10192
+ voiceState: voiceState,
10193
+ voiceActive: voiceState !== 'idle' && voiceState !== 'error',
10194
+ micAvailable: micAvailable,
10195
+ spokenChars: spokenChars,
10196
+ audioDraining: audioDraining,
10197
+ startVoice: startVoice,
10198
+ stopVoice: stopVoice,
10199
+ skipSpeaking: skipSpeaking
10200
+ };
10201
+ }
9765
10202
 
9766
10203
  var DEFAULT_CHAT_COLOR = '#6b7280';
9767
10204
  var GRAY_50 = '#f9fafb';
@@ -10001,12 +10438,13 @@ var shimmerCss = {
10001
10438
  }
10002
10439
  };
10003
10440
  var ToolChunk = function (_a) {
10004
- var rows = _a.rows, followedByText = _a.followedByText, turnFinished = _a.turnFinished, _b = _a.linkColor, linkColor = _b === void 0 ? DEFAULT_CHAT_COLOR : _b, _c = _a.isFirstChunk, isFirstChunk = _c === void 0 ? false : _c;
10441
+ var rows = _a.rows, followedByText = _a.followedByText, turnFinished = _a.turnFinished, _b = _a.audioPending, audioPending = _b === void 0 ? false : _b, _c = _a.linkColor, linkColor = _c === void 0 ? DEFAULT_CHAT_COLOR : _c, _d = _a.isFirstChunk, isFirstChunk = _d === void 0 ? false : _d;
10005
10442
  var isRunning = rows.some(function (r) { return isRunningState(r.state); });
10006
- var chunkDone = !isRunning && (followedByText || turnFinished);
10007
- var shouldCollapse = !isRunning && followedByText;
10443
+ // Voice: keep showing "Working on it" until the following reply's audio arrives
10444
+ var chunkDone = !isRunning && !audioPending && (followedByText || turnFinished);
10445
+ var shouldCollapse = !isRunning && !audioPending && followedByText;
10008
10446
  var defaultExpanded = !shouldCollapse;
10009
- var _d = __read(useState(null), 2), override = _d[0], setOverride = _d[1];
10447
+ var _e = __read(useState(null), 2), override = _e[0], setOverride = _e[1];
10010
10448
  var expanded = override !== null && override !== void 0 ? override : defaultExpanded;
10011
10449
  var toggle = function () { return setOverride(!expanded); };
10012
10450
  // Match the message bubble's horizontal padding
@@ -51304,14 +51742,14 @@ ${e}</tr>
51304
51742
  Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error occurred:</p><pre>"+T(n.message+"",true)+"</pre>";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var L$1=new D;function g(u,e){return L$1.parse(u,e)}g.options=g.setOptions=function(u){return L$1.setOptions(u),g.defaults=L$1.defaults,G(g.defaults),g};g.getDefaults=M;g.defaults=O;g.use=function(...u){return L$1.use(...u),g.defaults=L$1.defaults,G(g.defaults),g};g.walkTokens=function(u,e){return L$1.walkTokens(u,e)};g.parseInline=L$1.parseInline;g.Parser=b;g.parser=b.parse;g.Renderer=y$1;g.TextRenderer=$;g.Lexer=x;g.lexer=x.lex;g.Tokenizer=w;g.Hooks=P;g.parse=g;g.options;g.setOptions;g.use;g.walkTokens;g.parseInline;b.parse;x.lex;
51305
51743
 
51306
51744
  var En=300,Hn="300px",Dn=500;function Lt(e={}){let{immediate:t=false,debounceDelay:o=En,rootMargin:n=Hn,idleTimeout:r=Dn}=e,[s,a]=useState(false),l=useRef(null),i=useRef(null),c=useRef(null),d=useMemo(()=>p=>{let g=Date.now();return window.setTimeout(()=>{p({didTimeout:false,timeRemaining:()=>Math.max(0,50-(Date.now()-g))});},1)},[]),u=useMemo(()=>typeof window!="undefined"&&window.requestIdleCallback?(p,g)=>window.requestIdleCallback(p,g):d,[d]),m=useMemo(()=>typeof window!="undefined"&&window.cancelIdleCallback?p=>window.cancelIdleCallback(p):p=>{clearTimeout(p);},[]);return useEffect(()=>{if(t){a(true);return}let p=l.current;if(!p)return;i.current&&(clearTimeout(i.current),i.current=null),c.current&&(m(c.current),c.current=null);let g=()=>{i.current&&(clearTimeout(i.current),i.current=null),c.current&&(m(c.current),c.current=null);},h=x=>{c.current=u(w=>{w.timeRemaining()>0||w.didTimeout?(a(true),x.disconnect()):c.current=u(()=>{a(true),x.disconnect();},{timeout:r/2});},{timeout:r});},b=x=>{g(),i.current=window.setTimeout(()=>{var I,H;let w=x.takeRecords();(w.length===0||(H=(I=w.at(-1))==null?void 0:I.isIntersecting)!=null&&H)&&h(x);},o);},f=(x,w)=>{x.isIntersecting?b(w):g();},T=new IntersectionObserver(x=>{for(let w of x)f(w,T);},{rootMargin:n,threshold:0});return T.observe(p),()=>{i.current&&clearTimeout(i.current),c.current&&m(c.current),T.disconnect();}},[t,o,n,r,m,u]),{shouldRender:s,containerRef:l}}var Rt=/\s/,On=/^\s+$/,Vn=new Set(["code","pre","svg","math","annotation"]),jn=e=>typeof e=="object"&&e!==null&&"type"in e&&e.type==="element",Fn=e=>e.some(t=>jn(t)&&Vn.has(t.tagName)),zn=e=>{let t=[],o="",n=false;for(let r of e){let s=Rt.test(r);s!==n&&o&&(t.push(o),o=""),o+=r,n=s;}return o&&t.push(o),t},_n=e=>{let t=[],o="";for(let n of e)Rt.test(n)?o+=n:(o&&(t.push(o),o=""),t.push(n));return o&&t.push(o),t},qn=(e,t,o,n,r)=>({type:"element",tagName:"span",properties:{"data-sd-animate":true,style:r?`--sd-animation:sd-${t};--sd-duration:0ms;--sd-easing:${n}`:`--sd-animation:sd-${t};--sd-duration:${o}ms;--sd-easing:${n}`},children:[{type:"text",value:e}]}),$n=(e,t,o,n,r)=>{let s=t.at(-1);if(!(s&&"children"in s))return;if(Fn(t))return SKIP;let a=s,l=a.children.indexOf(e);if(l===-1)return;let i=e.value;if(!i.trim()){r.count+=i.length;return}let c=o.sep==="char"?_n(i):zn(i),d=n.prevContentLength,u=c.map(m=>{let p=r.count;if(r.count+=m.length,On.test(m))return {type:"text",value:m};let g=d>0&&p<d;return qn(m,o.animation,o.duration,o.easing,g)});return a.children.splice(l,1,...u),l+u.length},Wn=0;function be(e){var s,a,l,i;let t={animation:(s=e==null?void 0:e.animation)!=null?s:"fadeIn",duration:(a=e==null?void 0:e.duration)!=null?a:150,easing:(l=e==null?void 0:e.easing)!=null?l:"ease",sep:(i=e==null?void 0:e.sep)!=null?i:"word"},o={prevContentLength:0,lastRenderCharCount:0},n=Wn++,r=()=>c=>{let d={count:0};visitParents(c,"text",(u,m)=>$n(u,m,t,o,d)),o.lastRenderCharCount=d.count,o.prevContentLength=0;};return Object.defineProperty(r,"name",{value:`rehypeAnimate$${n}`}),{name:"animate",type:"animate",rehypePlugin:r,setPrevContentLength(c){o.prevContentLength=c;},getLastRenderCharCount(){let c=o.lastRenderCharCount;return o.lastRenderCharCount=0,c}}}be();var Qe=createContext(false),et=()=>useContext(Qe);var he=(...e)=>twMerge(clsx(e)),Jn=(e,t)=>{if(!e||!t)return t;let o=`${e}:`;return t.split(/\s+/).filter(Boolean).map(n=>n.startsWith(o)?n:`${e}:${n}`).join(" ")},Ht=e=>e?(...t)=>Jn(e,twMerge(clsx(t))):he,J=(e,t,o)=>{let n=typeof t=="string"?new Blob([t],{type:o}):t,r=URL.createObjectURL(n),s=document.createElement("a");s.href=r,s.download=e,document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(r);};var Se=createContext(he),y=()=>useContext(Se);var Yn=he("block","before:content-[counter(line)]","before:inline-block","before:[counter-increment:line]","before:w-6","before:mr-4","before:text-[13px]","before:text-right","before:text-muted-foreground/50","before:font-mono","before:select-none"),Qn=e=>{let t={};for(let o of e.split(";")){let n=o.indexOf(":");if(n>0){let r=o.slice(0,n).trim(),s=o.slice(n+1).trim();r&&s&&(t[r]=s);}}return t},Bt=memo(({children:e,result:t,language:o,className:n,startLine:r,...s})=>{let a=y(),l=useMemo(()=>a(Yn),[a]),i=useMemo(()=>{let c={};return t.bg&&(c["--sdm-bg"]=t.bg),t.fg&&(c["--sdm-fg"]=t.fg),t.rootStyle&&Object.assign(c,Qn(t.rootStyle)),c},[t.bg,t.fg,t.rootStyle]);return jsx$1("div",{className:a(n,"overflow-hidden rounded-md border border-border bg-background p-4 text-sm"),"data-language":o,"data-streamdown":"code-block-body",...s,children:jsx$1("pre",{className:a(n,"bg-[var(--sdm-bg,inherit]","dark:bg-[var(--shiki-dark-bg,var(--sdm-bg,inherit)]"),style:i,children:jsx$1("code",{className:a("[counter-increment:line_0] [counter-reset:line]"),style:r&&r>1?{counterReset:`line ${r-1}`}:void 0,children:t.tokens.map((c,d)=>jsx$1("span",{className:l,children:c.length===0||c.length===1&&c[0].content===""?`
51307
- `:c.map((u,m)=>{let p={},g=!!u.bgColor;if(u.color&&(p["--sdm-c"]=u.color),u.bgColor&&(p["--sdm-tbg"]=u.bgColor),u.htmlStyle)for(let[h,b]of Object.entries(u.htmlStyle))h==="color"?p["--sdm-c"]=b:h==="background-color"?(p["--sdm-tbg"]=b,g=true):p[h]=b;return jsx$1("span",{className:a("text-[var(--sdm-c,inherit)]","dark:text-[var(--shiki-dark,var(--sdm-c,inherit))]",g&&"bg-[var(--sdm-tbg)]",g&&"dark:bg-[var(--shiki-dark-bg,var(--sdm-tbg))]"),style:p,...u.htmlAttrs,children:u.content},m)})},d))})})})},(e,t)=>e.result===t.result&&e.language===t.language&&e.className===t.className&&e.startLine===t.startLine);var tt=({className:e,language:t,style:o,isIncomplete:n,...r})=>{let s=y();return jsx$1("div",{className:s("my-4 flex w-full flex-col gap-2 rounded-xl border border-border bg-sidebar p-2",e),"data-incomplete":n||void 0,"data-language":t,"data-streamdown":"code-block",style:{contentVisibility:"auto",containIntrinsicSize:"auto 200px",...o},...r})};var ot=createContext({code:""}),Ee=()=>useContext(ot);var nt=({language:e})=>{let t=y();return jsx$1("div",{className:t("flex h-8 items-center text-muted-foreground text-xs"),"data-language":e,"data-streamdown":"code-block-header",children:jsx$1("span",{className:t("ml-1 font-mono lowercase"),children:e})})};var sr=/\n+$/,ar=lazy$1(()=>import('./fthry_highlighted-body-TPN3WLV5.kj3f_DpN.js').then(e=>({default:e.HighlightedCodeBlockBody}))),rt=({code:e,language:t,className:o,children:n,isIncomplete:r=false,startLine:s,...a})=>{let l=y(),i=useMemo(()=>e.replace(sr,""),[e]),c=useMemo(()=>({bg:"transparent",fg:"inherit",tokens:i.split(`
51745
+ `:c.map((u,m)=>{let p={},g=!!u.bgColor;if(u.color&&(p["--sdm-c"]=u.color),u.bgColor&&(p["--sdm-tbg"]=u.bgColor),u.htmlStyle)for(let[h,b]of Object.entries(u.htmlStyle))h==="color"?p["--sdm-c"]=b:h==="background-color"?(p["--sdm-tbg"]=b,g=true):p[h]=b;return jsx$1("span",{className:a("text-[var(--sdm-c,inherit)]","dark:text-[var(--shiki-dark,var(--sdm-c,inherit))]",g&&"bg-[var(--sdm-tbg)]",g&&"dark:bg-[var(--shiki-dark-bg,var(--sdm-tbg))]"),style:p,...u.htmlAttrs,children:u.content},m)})},d))})})})},(e,t)=>e.result===t.result&&e.language===t.language&&e.className===t.className&&e.startLine===t.startLine);var tt=({className:e,language:t,style:o,isIncomplete:n,...r})=>{let s=y();return jsx$1("div",{className:s("my-4 flex w-full flex-col gap-2 rounded-xl border border-border bg-sidebar p-2",e),"data-incomplete":n||void 0,"data-language":t,"data-streamdown":"code-block",style:{contentVisibility:"auto",containIntrinsicSize:"auto 200px",...o},...r})};var ot=createContext({code:""}),Ee=()=>useContext(ot);var nt=({language:e})=>{let t=y();return jsx$1("div",{className:t("flex h-8 items-center text-muted-foreground text-xs"),"data-language":e,"data-streamdown":"code-block-header",children:jsx$1("span",{className:t("ml-1 font-mono lowercase"),children:e})})};var sr=/\n+$/,ar=lazy$1(()=>import('./fthry_highlighted-body-TPN3WLV5.eroZTbSq.js').then(e=>({default:e.HighlightedCodeBlockBody}))),rt=({code:e,language:t,className:o,children:n,isIncomplete:r=false,startLine:s,...a})=>{let l=y(),i=useMemo(()=>e.replace(sr,""),[e]),c=useMemo(()=>({bg:"transparent",fg:"inherit",tokens:i.split(`
51308
51746
  `).map(d=>[{content:d,color:"inherit",bgColor:"transparent",htmlStyle:{},offset:0}])}),[i]);return jsx$1(ot.Provider,{value:{code:e},children:jsxs$1(tt,{isIncomplete:r,language:t,children:[jsx$1(nt,{language:t}),n?jsx$1("div",{className:l("pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end"),children:jsx$1("div",{className:l("pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur"),"data-streamdown":"code-block-actions",children:n})}):null,jsx$1(Suspense,{fallback:jsx$1(Bt,{className:o,language:t,result:c,startLine:s,...a}),children:jsx$1(ar,{className:o,code:i,language:t,raw:c,startLine:s,...a})})]})})};var Vt=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z",fill:"currentColor",fillRule:"evenodd"})}),jt=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z",fill:"currentColor",fillRule:"evenodd"})}),Ft=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M8.75 1V1.75V8.68934L10.7197 6.71967L11.25 6.18934L12.3107 7.25L11.7803 7.78033L8.70711 10.8536C8.31658 11.2441 7.68342 11.2441 7.29289 10.8536L4.21967 7.78033L3.68934 7.25L4.75 6.18934L5.28033 6.71967L7.25 8.68934V1.75V1H8.75ZM13.5 9.25V13.5H2.5V9.25V8.5H1V9.25V14C1 14.5523 1.44771 15 2 15H14C14.5523 15 15 14.5523 15 14V9.25V8.5H13.5V9.25Z",fill:"currentColor",fillRule:"evenodd"})}),zt=e=>jsxs$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:[jsx$1("path",{d:"M8 0V4",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M8 16V12",opacity:"0.5",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M3.29773 1.52783L5.64887 4.7639",opacity:"0.9",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M12.7023 1.52783L10.3511 4.7639",opacity:"0.1",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M12.7023 14.472L10.3511 11.236",opacity:"0.4",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M3.29773 14.472L5.64887 11.236",opacity:"0.6",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M15.6085 5.52783L11.8043 6.7639",opacity:"0.2",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M0.391602 10.472L4.19583 9.23598",opacity:"0.7",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M15.6085 10.4722L11.8043 9.2361",opacity:"0.3",stroke:"currentColor",strokeWidth:"1.5"}),jsx$1("path",{d:"M0.391602 5.52783L4.19583 6.7639",opacity:"0.8",stroke:"currentColor",strokeWidth:"1.5"})]}),_t=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M1 5.25V6H2.5V5.25V2.5H5.25H6V1H5.25H2C1.44772 1 1 1.44772 1 2V5.25ZM5.25 14.9994H6V13.4994H5.25H2.5V10.7494V9.99939H1V10.7494V13.9994C1 14.5517 1.44772 14.9994 2 14.9994H5.25ZM15 10V10.75V14C15 14.5523 14.5523 15 14 15H10.75H10V13.5H10.75H13.5V10.75V10H15ZM10.75 1H10V2.5H10.75H13.5V5.25V6H15V5.25V2C15 1.44772 14.5523 1 14 1H10.75Z",fill:"currentColor",fillRule:"evenodd"})}),qt=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M13.5 8C13.5 4.96643 11.0257 2.5 7.96452 2.5C5.42843 2.5 3.29365 4.19393 2.63724 6.5H5.25H6V8H5.25H0.75C0.335787 8 0 7.66421 0 7.25V2.75V2H1.5V2.75V5.23347C2.57851 2.74164 5.06835 1 7.96452 1C11.8461 1 15 4.13001 15 8C15 11.87 11.8461 15 7.96452 15C5.62368 15 3.54872 13.8617 2.27046 12.1122L1.828 11.5066L3.03915 10.6217L3.48161 11.2273C4.48831 12.6051 6.12055 13.5 7.96452 13.5C11.0257 13.5 13.5 11.0336 13.5 8Z",fill:"currentColor",fillRule:"evenodd"})}),$t=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M12.4697 13.5303L13 14.0607L14.0607 13L13.5303 12.4697L9.06065 7.99999L13.5303 3.53032L14.0607 2.99999L13 1.93933L12.4697 2.46966L7.99999 6.93933L3.53032 2.46966L2.99999 1.93933L1.93933 2.99999L2.46966 3.53032L6.93933 7.99999L2.46966 12.4697L1.93933 13L2.99999 14.0607L3.53032 13.5303L7.99999 9.06065L12.4697 13.5303Z",fill:"currentColor",fillRule:"evenodd"})}),Wt=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M13.5 10.25V13.25C13.5 13.3881 13.3881 13.5 13.25 13.5H2.75C2.61193 13.5 2.5 13.3881 2.5 13.25L2.5 2.75C2.5 2.61193 2.61193 2.5 2.75 2.5H5.75H6.5V1H5.75H2.75C1.7835 1 1 1.7835 1 2.75V13.25C1 14.2165 1.7835 15 2.75 15H13.25C14.2165 15 15 14.2165 15 13.25V10.25V9.5H13.5V10.25ZM9 1H9.75H14.2495C14.6637 1 14.9995 1.33579 14.9995 1.75V6.25V7H13.4995V6.25V3.56066L8.53033 8.52978L8 9.06011L6.93934 7.99945L7.46967 7.46912L12.4388 2.5H9.75H9V1Z",fill:"currentColor",fillRule:"evenodd"})}),Zt=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M1.5 6.5C1.5 3.73858 3.73858 1.5 6.5 1.5C9.26142 1.5 11.5 3.73858 11.5 6.5C11.5 9.26142 9.26142 11.5 6.5 11.5C3.73858 11.5 1.5 9.26142 1.5 6.5ZM6.5 0C2.91015 0 0 2.91015 0 6.5C0 10.0899 2.91015 13 6.5 13C8.02469 13 9.42677 12.475 10.5353 11.596L13.9697 15.0303L14.5 15.5607L15.5607 14.5L15.0303 13.9697L11.596 10.5353C12.475 9.42677 13 8.02469 13 6.5C13 2.91015 10.0899 0 6.5 0ZM4.125 5.875H4.75H5.875V4.75V4.125H7.125V4.75V5.875H8.25H8.875V7.125H8.25H7.125V8.25V8.875H5.875V8.25V7.125H4.75H4.125V5.875Z",fill:"currentColor",fillRule:"evenodd"})}),Xt=e=>jsx$1("svg",{color:"currentColor",height:16,strokeLinejoin:"round",viewBox:"0 0 16 16",width:16,...e,children:jsx$1("path",{clipRule:"evenodd",d:"M1.5 6.5C1.5 3.73858 3.73858 1.5 6.5 1.5C9.26142 1.5 11.5 3.73858 11.5 6.5C11.5 9.26142 9.26142 11.5 6.5 11.5C3.73858 11.5 1.5 9.26142 1.5 6.5ZM6.5 0C2.91015 0 0 2.91015 0 6.5C0 10.0899 2.91015 13 6.5 13C8.02469 13 9.42677 12.475 10.5353 11.596L13.9697 15.0303L14.5 15.5607L15.5607 14.5L15.0303 13.9697L11.596 10.5353C12.475 9.42677 13 8.02469 13 6.5C13 2.91015 10.0899 0 6.5 0ZM4.125 5.875H4.75H8.25H8.875V7.125H8.25H4.75H4.125V5.875Z",fill:"currentColor",fillRule:"evenodd"})});var we={CheckIcon:Vt,CopyIcon:jt,DownloadIcon:Ft,ExternalLinkIcon:Wt,Loader2Icon:zt,Maximize2Icon:_t,RotateCcwIcon:qt,XIcon:$t,ZoomInIcon:Zt,ZoomOutIcon:Xt},Kt=createContext(we),mr=(e,t)=>{if(e===t)return true;if(!(e&&t))return e===t;let o=Object.keys(e),n=Object.keys(t);return o.length!==n.length?false:o.every(r=>e[r]===t[r])},st=({icons:e,children:t})=>{let o=useRef(e),n=useRef(e?{...we,...e}:we);mr(o.current,e)||(o.current=e,n.current=e?{...we,...e}:we);let r=n.current;return jsx$1(Kt.Provider,{value:r,children:t})},L=()=>useContext(Kt);var He={copyCode:"Copy Code",downloadFile:"Download file",downloadDiagram:"Download diagram",downloadDiagramAsSvg:"Download diagram as SVG",downloadDiagramAsPng:"Download diagram as PNG",downloadDiagramAsMmd:"Download diagram as MMD",viewFullscreen:"View fullscreen",exitFullscreen:"Exit fullscreen",mermaidFormatSvg:"SVG",mermaidFormatPng:"PNG",mermaidFormatMmd:"MMD",copyTable:"Copy table",copyTableAsMarkdown:"Copy table as Markdown",copyTableAsCsv:"Copy table as CSV",copyTableAsTsv:"Copy table as TSV",downloadTable:"Download table",downloadTableAsCsv:"Download table as CSV",downloadTableAsMarkdown:"Download table as Markdown",tableFormatMarkdown:"Markdown",tableFormatCsv:"CSV",tableFormatTsv:"TSV",imageNotAvailable:"Image not available",downloadImage:"Download image",openExternalLink:"Open external link?",externalLinkWarning:"You're about to visit an external website.",close:"Close",copyLink:"Copy link",copied:"Copied",openLink:"Open link"},De=createContext(He),B=()=>useContext(De);var Be=({onCopy:e,onError:t,timeout:o=2e3,children:n,className:r,code:s,...a})=>{let l=y(),[i,c]=useState(false),d=useRef(0),{code:u}=Ee(),{isAnimating:m}=useContext(R),p=B(),g=s!=null?s:u,h=async()=>{var T;if(typeof window=="undefined"||!((T=navigator==null?void 0:navigator.clipboard)!=null&&T.writeText)){t==null||t(new Error("Clipboard API not available"));return}try{i||(await navigator.clipboard.writeText(g),c(!0),e==null||e(),d.current=window.setTimeout(()=>c(!1),o));}catch(x){t==null||t(x);}};useEffect(()=>()=>{window.clearTimeout(d.current);},[]);let b=L(),f=i?b.CheckIcon:b.CopyIcon;return jsx$1("button",{className:l("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",r),"data-streamdown":"code-block-copy-button",disabled:m,onClick:h,title:p.copyCode,type:"button",...a,children:n!=null?n:jsx$1(f,{size:14})})};var Gt={"1c":"1c","1c-query":"1cq",abap:"abap","actionscript-3":"as",ada:"ada",adoc:"adoc","angular-html":"html","angular-ts":"ts",apache:"conf",apex:"cls",apl:"apl",applescript:"applescript",ara:"ara",asciidoc:"adoc",asm:"asm",astro:"astro",awk:"awk",ballerina:"bal",bash:"sh",bat:"bat",batch:"bat",be:"be",beancount:"beancount",berry:"berry",bibtex:"bib",bicep:"bicep",blade:"blade.php",bsl:"bsl",c:"c","c#":"cs","c++":"cpp",cadence:"cdc",cairo:"cairo",cdc:"cdc",clarity:"clar",clj:"clj",clojure:"clj","closure-templates":"soy",cmake:"cmake",cmd:"cmd",cobol:"cob",codeowners:"CODEOWNERS",codeql:"ql",coffee:"coffee",coffeescript:"coffee","common-lisp":"lisp",console:"sh",coq:"v",cpp:"cpp",cql:"cql",crystal:"cr",cs:"cs",csharp:"cs",css:"css",csv:"csv",cue:"cue",cypher:"cql",d:"d",dart:"dart",dax:"dax",desktop:"desktop",diff:"diff",docker:"dockerfile",dockerfile:"dockerfile",dotenv:"env","dream-maker":"dm",edge:"edge",elisp:"el",elixir:"ex",elm:"elm","emacs-lisp":"el",erb:"erb",erl:"erl",erlang:"erl",f:"f","f#":"fs",f03:"f03",f08:"f08",f18:"f18",f77:"f77",f90:"f90",f95:"f95",fennel:"fnl",fish:"fish",fluent:"ftl",for:"for","fortran-fixed-form":"f","fortran-free-form":"f90",fs:"fs",fsharp:"fs",fsl:"fsl",ftl:"ftl",gdresource:"tres",gdscript:"gd",gdshader:"gdshader",genie:"gs",gherkin:"feature","git-commit":"gitcommit","git-rebase":"gitrebase",gjs:"js",gleam:"gleam","glimmer-js":"js","glimmer-ts":"ts",glsl:"glsl",gnuplot:"plt",go:"go",gql:"gql",graphql:"graphql",groovy:"groovy",gts:"gts",hack:"hack",haml:"haml",handlebars:"hbs",haskell:"hs",haxe:"hx",hbs:"hbs",hcl:"hcl",hjson:"hjson",hlsl:"hlsl",hs:"hs",html:"html","html-derivative":"html",http:"http",hxml:"hxml",hy:"hy",imba:"imba",ini:"ini",jade:"jade",java:"java",javascript:"js",jinja:"jinja",jison:"jison",jl:"jl",js:"js",json:"json",json5:"json5",jsonc:"jsonc",jsonl:"jsonl",jsonnet:"jsonnet",jssm:"jssm",jsx:"jsx",julia:"jl",kotlin:"kt",kql:"kql",kt:"kt",kts:"kts",kusto:"kql",latex:"tex",lean:"lean",lean4:"lean",less:"less",liquid:"liquid",lisp:"lisp",lit:"lit",llvm:"ll",log:"log",logo:"logo",lua:"lua",luau:"luau",make:"mak",makefile:"mak",markdown:"md",marko:"marko",matlab:"m",md:"md",mdc:"mdc",mdx:"mdx",mediawiki:"wiki",mermaid:"mmd",mips:"s",mipsasm:"s",mmd:"mmd",mojo:"mojo",move:"move",nar:"nar",narrat:"narrat",nextflow:"nf",nf:"nf",nginx:"conf",nim:"nim",nix:"nix",nu:"nu",nushell:"nu",objc:"m","objective-c":"m","objective-cpp":"mm",ocaml:"ml",pascal:"pas",perl:"pl",perl6:"p6",php:"php",plsql:"pls",po:"po",polar:"polar",postcss:"pcss",pot:"pot",potx:"potx",powerquery:"pq",powershell:"ps1",prisma:"prisma",prolog:"pl",properties:"properties",proto:"proto",protobuf:"proto",ps:"ps",ps1:"ps1",pug:"pug",puppet:"pp",purescript:"purs",py:"py",python:"py",ql:"ql",qml:"qml",qmldir:"qmldir",qss:"qss",r:"r",racket:"rkt",raku:"raku",razor:"cshtml",rb:"rb",reg:"reg",regex:"regex",regexp:"regexp",rel:"rel",riscv:"s",rs:"rs",rst:"rst",ruby:"rb",rust:"rs",sas:"sas",sass:"sass",scala:"scala",scheme:"scm",scss:"scss",sdbl:"sdbl",sh:"sh",shader:"shader",shaderlab:"shader",shell:"sh",shellscript:"sh",shellsession:"sh",smalltalk:"st",solidity:"sol",soy:"soy",sparql:"rq",spl:"spl",splunk:"spl",sql:"sql","ssh-config":"config",stata:"do",styl:"styl",stylus:"styl",svelte:"svelte",swift:"swift","system-verilog":"sv",systemd:"service",talon:"talon",talonscript:"talon",tasl:"tasl",tcl:"tcl",templ:"templ",terraform:"tf",tex:"tex",tf:"tf",tfvars:"tfvars",toml:"toml",ts:"ts","ts-tags":"ts",tsp:"tsp",tsv:"tsv",tsx:"tsx",turtle:"ttl",twig:"twig",typ:"typ",typescript:"ts",typespec:"tsp",typst:"typ",v:"v",vala:"vala",vb:"vb",verilog:"v",vhdl:"vhdl",vim:"vim",viml:"vim",vimscript:"vim",vue:"vue","vue-html":"html","vue-vine":"vine",vy:"vy",vyper:"vy",wasm:"wasm",wenyan:"wy",wgsl:"wgsl",wiki:"wiki",wikitext:"wiki",wit:"wit",wl:"wl",wolfram:"wl",xml:"xml",xsl:"xsl",yaml:"yaml",yml:"yml",zenscript:"zs",zig:"zig",zsh:"zsh",\u6587\u8A00:"wy"},at=({onDownload:e,onError:t,language:o,children:n,className:r,code:s,...a})=>{let l=y(),{code:i}=Ee(),{isAnimating:c}=useContext(R),d=B(),u=L(),m=s!=null?s:i,g=`file.${o&&o in Gt?Gt[o]:"txt"}`,h="text/plain",b=()=>{try{J(g,m,h),e==null||e();}catch(f){t==null||t(f);}};return jsx$1("button",{className:l("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",r),"data-streamdown":"code-block-download-button",disabled:c,onClick:b,title:d.downloadFile,type:"button",...a,children:n!=null?n:jsx$1(u.DownloadIcon,{size:14})})};var Ae=()=>{let{Loader2Icon:e}=L(),t=y();return jsxs$1("div",{className:t("w-full divide-y divide-border overflow-hidden rounded-xl border border-border"),children:[jsx$1("div",{className:t("h-[46px] w-full bg-muted/80")}),jsx$1("div",{className:t("flex w-full items-center justify-center p-4"),children:jsx$1(e,{className:t("size-4 animate-spin")})})]})};var xr=/\.[^/.]+$/,to=({node:e,className:t,src:o,alt:n,onLoad:r,onError:s,...a})=>{let{DownloadIcon:l}=L(),i=y(),c=useRef(null),[d,u]=useState(false),[m,p]=useState(false),g=B(),h=a.width!=null||a.height!=null,b=(d||h)&&!m,f=m&&!h;useEffect(()=>{let k=c.current;if(k!=null&&k.complete){let I=k.naturalWidth>0;u(I),p(!I);}},[]);let T=useCallback(k=>{u(true),p(false),r==null||r(k);},[r]),x=useCallback(k=>{u(false),p(true),s==null||s(k);},[s]),w=async()=>{if(o)try{let I=await(await fetch(o)).blob(),S=new URL(o,window.location.origin).pathname.split("/").pop()||"",F=S.split(".").pop(),z=S.includes(".")&&F!==void 0&&F.length<=4,q="";if(z)q=S;else {let A=I.type,K="png";A.includes("jpeg")||A.includes("jpg")?K="jpg":A.includes("png")?K="png":A.includes("svg")?K="svg":A.includes("gif")?K="gif":A.includes("webp")&&(K="webp"),q=`${(n||S||"image").replace(xr,"")}.${K}`;}J(q,I,I.type);}catch(k){window.open(o,"_blank");}};return o?jsxs$1("div",{className:i("group relative my-4 inline-block"),"data-streamdown":"image-wrapper",children:[jsx$1("img",{alt:n,className:i("max-w-full rounded-lg",f&&"hidden",t),"data-streamdown":"image",onError:x,onLoad:T,ref:c,src:o,...a}),f&&jsx$1("span",{className:i("text-muted-foreground text-xs italic"),"data-streamdown":"image-fallback",children:g.imageNotAvailable}),jsx$1("div",{className:i("pointer-events-none absolute inset-0 hidden rounded-lg bg-black/10 group-hover:block")}),b&&jsx$1("button",{className:i("absolute right-2 bottom-2 flex h-8 w-8 cursor-pointer items-center justify-center rounded-md border border-border bg-background/90 shadow-sm backdrop-blur-sm transition-all duration-200 hover:bg-background","opacity-0 group-hover:opacity-100"),onClick:w,title:g.downloadImage,type:"button",children:jsx$1(l,{size:14})})]}):null};var ke=0,le=()=>{ke+=1,ke===1&&(document.body.style.overflow="hidden");},ce=()=>{ke=Math.max(0,ke-1),ke===0&&(document.body.style.overflow="");};var ro=({url:e,isOpen:t,onClose:o,onConfirm:n})=>{let{CheckIcon:r,CopyIcon:s,ExternalLinkIcon:a,XIcon:l}=L(),i=y(),[c,d]=useState(false),u=B(),m=useCallback(async()=>{try{await navigator.clipboard.writeText(e),d(!0),setTimeout(()=>d(!1),2e3);}catch(g){}},[e]),p=useCallback(()=>{n(),o();},[n,o]);return useEffect(()=>{if(t){le();let g=h=>{h.key==="Escape"&&o();};return document.addEventListener("keydown",g),()=>{document.removeEventListener("keydown",g),ce();}}},[t,o]),t?jsx$1("div",{className:i("fixed inset-0 z-50 flex items-center justify-center bg-background/50 backdrop-blur-sm"),"data-streamdown":"link-safety-modal",onClick:o,onKeyDown:g=>{g.key==="Escape"&&o();},role:"button",tabIndex:0,children:jsxs$1("div",{className:i("relative mx-4 flex w-full max-w-md flex-col gap-4 rounded-xl border bg-background p-6 shadow-lg"),onClick:g=>g.stopPropagation(),onKeyDown:g=>g.stopPropagation(),role:"presentation",children:[jsx$1("button",{className:i("absolute top-4 right-4 rounded-md p-1 text-muted-foreground transition-all hover:bg-muted hover:text-foreground"),onClick:o,title:u.close,type:"button",children:jsx$1(l,{size:16})}),jsxs$1("div",{className:i("flex flex-col gap-2"),children:[jsxs$1("div",{className:i("flex items-center gap-2 font-semibold text-lg"),children:[jsx$1(a,{size:20}),jsx$1("span",{children:u.openExternalLink})]}),jsx$1("p",{className:i("text-muted-foreground text-sm"),children:u.externalLinkWarning})]}),jsx$1("div",{className:i("break-all rounded-md bg-muted p-3 font-mono text-sm",e.length>100&&"max-h-32 overflow-y-auto"),children:e}),jsxs$1("div",{className:i("flex gap-2"),children:[jsx$1("button",{className:i("flex flex-1 items-center justify-center gap-2 rounded-md border bg-background px-4 py-2 font-medium text-sm transition-all hover:bg-muted"),onClick:m,type:"button",children:c?jsxs$1(Fragment,{children:[jsx$1(r,{size:14}),jsx$1("span",{children:u.copied})]}):jsxs$1(Fragment,{children:[jsx$1(s,{size:14}),jsx$1("span",{children:u.copyLink})]})}),jsxs$1("button",{className:i("flex flex-1 items-center justify-center gap-2 rounded-md bg-primary px-4 py-2 font-medium text-primary-foreground text-sm transition-all hover:bg-primary/90"),onClick:p,type:"button",children:[jsx$1(a,{size:14}),jsx$1("span",{children:u.openLink})]})]})]})}):null};var Oe=createContext(null),lt=()=>useContext(Oe),Mi=()=>{var t;let e=lt();return (t=e==null?void 0:e.code)!=null?t:null},de=()=>{var t;let e=lt();return (t=e==null?void 0:e.mermaid)!=null?t:null};var so=e=>{var o;let t=lt();return t!=null&&t.renderers&&e&&(o=t.renderers.find(n=>Array.isArray(n.language)?n.language.includes(e):n.language===e))!=null?o:null};var ao=(e,t)=>{var n;let o=(n=void 0)!=null?n:5;return new Promise((r,s)=>{let a="data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(e))),l=new Image;l.crossOrigin="anonymous",l.onload=()=>{let i=document.createElement("canvas"),c=l.width*o,d=l.height*o;i.width=c,i.height=d;let u=i.getContext("2d");if(!u){s(new Error("Failed to create 2D canvas context for PNG export"));return}u.drawImage(l,0,0,c,d),i.toBlob(m=>{if(!m){s(new Error("Failed to create PNG blob"));return}r(m);},"image/png");},l.onerror=()=>s(new Error("Failed to load SVG image")),l.src=a;})};var lo=({chart:e,children:t,className:o,onDownload:n,config:r,onError:s})=>{let a=y(),[l,i]=useState(false),c=useRef(null),{isAnimating:d}=useContext(R),u=L(),m=de(),p=B(),g=async h=>{try{if(h==="mmd"){J("diagram.mmd",e,"text/plain"),i(!1),n==null||n(h);return}if(!m){s==null||s(new Error("Mermaid plugin not available"));return}let b=m.getMermaid(r),f=e.split("").reduce((w,k)=>(w<<5)-w+k.charCodeAt(0)|0,0),T=`mermaid-${Math.abs(f)}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,{svg:x}=await b.render(T,e);if(!x){s==null||s(new Error("SVG not found. Please wait for the diagram to render."));return}if(h==="svg"){J("diagram.svg",x,"image/svg+xml"),i(!1),n==null||n(h);return}if(h==="png"){let w=await ao(x);J("diagram.png",w,"image/png"),n==null||n(h),i(!1);return}}catch(b){s==null||s(b);}};return useEffect(()=>{let h=b=>{let f=b.composedPath();c.current&&!f.includes(c.current)&&i(false);};return document.addEventListener("mousedown",h),()=>{document.removeEventListener("mousedown",h);}},[]),jsxs$1("div",{className:a("relative"),ref:c,children:[jsx$1("button",{className:a("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",o),disabled:d,onClick:()=>i(!l),title:p.downloadDiagram,type:"button",children:t!=null?t:jsx$1(u.DownloadIcon,{size:14})}),l?jsxs$1("div",{className:a("absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg"),children:[jsx$1("button",{className:a("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("svg"),title:p.downloadDiagramAsSvg,type:"button",children:p.mermaidFormatSvg}),jsx$1("button",{className:a("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("png"),title:p.downloadDiagramAsPng,type:"button",children:p.mermaidFormatPng}),jsx$1("button",{className:a("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("mmd"),title:p.downloadDiagramAsMmd,type:"button",children:p.mermaidFormatMmd})]}):null]})};var po=({chart:e,config:t,onFullscreen:o,onExit:n,className:r,...s})=>{let{Maximize2Icon:a,XIcon:l}=L(),i=y(),[c,d]=useState(false),{isAnimating:u,controls:m}=useContext(R),p=B(),g=(()=>{if(typeof m=="boolean")return m;let b=m.mermaid;return b===false?false:b===true||b===void 0?true:b.panZoom!==false})(),h=()=>{d(!c);};return useEffect(()=>{if(c){le();let b=f=>{f.key==="Escape"&&d(false);};return document.addEventListener("keydown",b),()=>{document.removeEventListener("keydown",b),ce();}}},[c]),useEffect(()=>{c?o==null||o():n&&n();},[c,o,n]),jsxs$1(Fragment,{children:[jsx$1("button",{className:i("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",r),disabled:u,onClick:h,title:p.viewFullscreen,type:"button",...s,children:jsx$1(a,{size:14})}),c?createPortal(jsxs$1("div",{className:i("fixed inset-0 z-50 flex items-center justify-center bg-background/95 backdrop-blur-sm"),onClick:h,onKeyDown:b=>{b.key==="Escape"&&h();},role:"button",tabIndex:0,children:[jsx$1("button",{className:i("absolute top-4 right-4 z-10 rounded-md p-2 text-muted-foreground transition-all hover:bg-muted hover:text-foreground"),onClick:h,title:p.exitFullscreen,type:"button",children:jsx$1(l,{size:20})}),jsx$1("div",{className:i("flex size-full items-center justify-center p-4"),onClick:b=>b.stopPropagation(),onKeyDown:b=>b.stopPropagation(),role:"presentation",children:jsx$1(uo,{chart:e,className:i("size-full [&_svg]:h-auto [&_svg]:w-auto"),config:t,fullscreen:true,showControls:g})})]}),document.body):null]})};var ue=e=>{var s,a;let t=[],o=[],n=e.querySelectorAll("thead th");for(let l of n)t.push(((s=l.textContent)==null?void 0:s.trim())||"");let r=e.querySelectorAll("tbody tr");for(let l of r){let i=[],c=l.querySelectorAll("td");for(let d of c)i.push(((a=d.textContent)==null?void 0:a.trim())||"");o.push(i);}return {headers:t,rows:o}},oe=e=>{let{headers:t,rows:o}=e,n=l=>{let i=false,c=false;for(let d of l){if(d==='"'){i=true,c=true;break}(d===","||d===`
51309
51747
  `)&&(i=true);}return i?c?`"${l.replace(/"/g,'""')}"`:`"${l}"`:l},r=t.length>0?o.length+1:o.length,s=new Array(r),a=0;t.length>0&&(s[a]=t.map(n).join(","),a+=1);for(let l of o)s[a]=l.map(n).join(","),a+=1;return s.join(`
51310
51748
  `)},ct=e=>{let{headers:t,rows:o}=e,n=l=>{let i=false;for(let d of l)if(d===" "||d===`
51311
51749
  `||d==="\r"){i=true;break}if(!i)return l;let c=[];for(let d of l)d===" "?c.push("\\t"):d===`
51312
51750
  `?c.push("\\n"):d==="\r"?c.push("\\r"):c.push(d);return c.join("")},r=t.length>0?o.length+1:o.length,s=new Array(r),a=0;t.length>0&&(s[a]=t.map(n).join(" "),a+=1);for(let l of o)s[a]=l.map(n).join(" "),a+=1;return s.join(`
51313
51751
  `)},Ve=e=>{let t=false;for(let n of e)if(n==="\\"||n==="|"){t=true;break}if(!t)return e;let o=[];for(let n of e)n==="\\"?o.push("\\\\"):n==="|"?o.push("\\|"):o.push(n);return o.join("")},ne=e=>{let{headers:t,rows:o}=e;if(t.length===0)return "";let n=new Array(o.length+2),r=0,s=t.map(l=>Ve(l));n[r]=`| ${s.join(" | ")} |`,r+=1;let a=new Array(t.length);for(let l=0;l<t.length;l+=1)a[l]="---";n[r]=`| ${a.join(" | ")} |`,r+=1;for(let l of o)if(l.length<t.length){let i=new Array(t.length);for(let c=0;c<t.length;c+=1)i[c]=c<l.length?Ve(l[c]):"";n[r]=`| ${i.join(" | ")} |`,r+=1;}else {let i=l.map(c=>Ve(c));n[r]=`| ${i.join(" | ")} |`,r+=1;}return n.join(`
51314
- `)};var Te=({children:e,className:t,onCopy:o,onError:n,timeout:r=2e3})=>{let s=y(),[a,l]=useState(false),[i,c]=useState(false),d=useRef(null),u=useRef(0),{isAnimating:m}=useContext(R),p=B(),g=async f=>{var T,x;if(typeof window=="undefined"||!((T=navigator==null?void 0:navigator.clipboard)!=null&&T.write)){n==null||n(new Error("Clipboard API not available"));return}try{let w=(x=d.current)==null?void 0:x.closest('[data-streamdown="table-wrapper"]'),k=w==null?void 0:w.querySelector("table");if(!k){n==null||n(new Error("Table not found"));return}let I=ue(k),F=({csv:oe,tsv:ct,md:ne}[f]||ne)(I),z=new ClipboardItem({"text/plain":new Blob([F],{type:"text/plain"}),"text/html":new Blob([k.outerHTML],{type:"text/html"})});await navigator.clipboard.write([z]),c(!0),l(!1),o==null||o(f),u.current=window.setTimeout(()=>c(!1),r);}catch(w){n==null||n(w);}};useEffect(()=>{let f=T=>{let x=T.composedPath();d.current&&!x.includes(d.current)&&l(false);};return document.addEventListener("mousedown",f),()=>{document.removeEventListener("mousedown",f),window.clearTimeout(u.current);}},[]);let h=L(),b=i?h.CheckIcon:h.CopyIcon;return jsxs$1("div",{className:s("relative"),ref:d,children:[jsx$1("button",{className:s("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:m,onClick:()=>l(!a),title:p.copyTable,type:"button",children:e!=null?e:jsx$1(b,{height:14,width:14})}),a?jsxs$1("div",{className:s("absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg"),children:[jsx$1("button",{className:s("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("md"),title:p.copyTableAsMarkdown,type:"button",children:p.tableFormatMarkdown}),jsx$1("button",{className:s("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("csv"),title:p.copyTableAsCsv,type:"button",children:p.tableFormatCsv}),jsx$1("button",{className:s("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("tsv"),title:p.copyTableAsTsv,type:"button",children:p.tableFormatTsv})]}):null]})};var Pe=({children:e,className:t,onDownload:o,onError:n})=>{let r=y(),[s,a]=useState(false),l=useRef(null),{isAnimating:i}=useContext(R),c=B(),d=L(),u=m=>{var p;try{let g=(p=l.current)==null?void 0:p.closest('[data-streamdown="table-wrapper"]'),h=g==null?void 0:g.querySelector("table");if(!h){n==null||n(new Error("Table not found"));return}let b=ue(h),f=m==="csv"?oe(b):ne(b);J(`table.${m==="csv"?"csv":"md"}`,f,m==="csv"?"text/csv":"text/markdown"),a(!1),o==null||o(m);}catch(g){n==null||n(g);}};return useEffect(()=>{let m=p=>{let g=p.composedPath();l.current&&!g.includes(l.current)&&a(false);};return document.addEventListener("mousedown",m),()=>{document.removeEventListener("mousedown",m);}},[]),jsxs$1("div",{className:r("relative"),ref:l,children:[jsx$1("button",{className:r("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:i,onClick:()=>a(!s),title:c.downloadTable,type:"button",children:e!=null?e:jsx$1(d.DownloadIcon,{size:14})}),s?jsxs$1("div",{className:r("absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg"),children:[jsx$1("button",{className:r("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>u("csv"),title:c.downloadTableAsCsv,type:"button",children:c.tableFormatCsv}),jsx$1("button",{className:r("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>u("markdown"),title:c.downloadTableAsMarkdown,type:"button",children:c.tableFormatMarkdown})]}):null]})};var wo=({children:e,className:t,showCopy:o=true,showDownload:n=true})=>{let{Maximize2Icon:r,XIcon:s}=L(),a=y(),[l,i]=useState(false),{isAnimating:c}=useContext(R),d=B(),u=()=>{i(true);},m=()=>{i(false);};return useEffect(()=>{if(l){le();let p=g=>{g.key==="Escape"&&i(false);};return document.addEventListener("keydown",p),()=>{document.removeEventListener("keydown",p),ce();}}},[l]),jsxs$1(Fragment,{children:[jsx$1("button",{className:a("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:c,onClick:u,title:d.viewFullscreen,type:"button",children:jsx$1(r,{size:14})}),l?createPortal(jsx$1("div",{"aria-label":d.viewFullscreen,"aria-modal":"true",className:a("fixed inset-0 z-50 flex flex-col bg-background"),"data-streamdown":"table-fullscreen",onClick:m,onKeyDown:p=>{p.key==="Escape"&&m();},role:"dialog",children:jsxs$1("div",{className:a("flex h-full flex-col"),onClick:p=>p.stopPropagation(),onKeyDown:p=>p.stopPropagation(),role:"presentation",children:[jsxs$1("div",{className:a("flex items-center justify-end gap-1 p-4"),children:[o?jsx$1(Te,{}):null,n?jsx$1(Pe,{}):null,jsx$1("button",{className:a("rounded-md p-1 text-muted-foreground transition-all hover:bg-muted hover:text-foreground"),onClick:m,title:d.exitFullscreen,type:"button",children:jsx$1(s,{size:20})})]}),jsx$1("div",{className:a("flex-1 overflow-auto p-4 pt-0 [&_thead]:sticky [&_thead]:top-0 [&_thead]:z-10"),children:jsx$1("table",{className:a("w-full border-collapse border border-border"),"data-streamdown":"table",children:e})})]})}),document.body):null]})};var ko=({children:e,className:t,showControls:o,showCopy:n=true,showDownload:r=true,showFullscreen:s=true,...a})=>{let l=y(),i=o&&n,c=o&&r,d=o&&s,u=i||c||d;return jsxs$1("div",{className:l("my-4 flex flex-col gap-2 rounded-lg border border-border bg-sidebar p-2"),"data-streamdown":"table-wrapper",children:[u?jsxs$1("div",{className:l("flex items-center justify-end gap-1"),children:[i?jsx$1(Te,{}):null,c?jsx$1(Pe,{}):null,d?jsx$1(wo,{showCopy:i,showDownload:c,children:e}):null]}):null,jsx$1("div",{className:l("border-collapse overflow-x-auto overflow-y-auto rounded-md border border-border bg-background"),children:jsx$1("table",{className:l("w-full divide-y divide-border",t),"data-streamdown":"table",...a,children:e})})]})};var Gr=/startLine=(\d+)/,Yr=lazy$1(()=>import('./fthry_mermaid-O7DHMXV3.BLTan-1s.js').then(e=>({default:e.Mermaid}))),Qr=/language-([^\s]+)/;function _e(e,t){if(!(e!=null&&e.position||t!=null&&t.position))return true;if(!(e!=null&&e.position&&(t!=null&&t.position)))return false;let o=e.position.start,n=t.position.start,r=e.position.end,s=t.position.end;return (o==null?void 0:o.line)===(n==null?void 0:n.line)&&(o==null?void 0:o.column)===(n==null?void 0:n.column)&&(r==null?void 0:r.line)===(s==null?void 0:s.line)&&(r==null?void 0:r.column)===(s==null?void 0:s.column)}function E(e,t){return e.className===t.className&&_e(e.node,t.node)}var pt=(e,t)=>typeof e=="boolean"?e:e[t]!==false,ut=(e,t)=>{if(typeof e=="boolean")return e;let o=e.table;return o===false?false:o===true||o===void 0?true:o[t]!==false},xo=(e,t)=>{if(typeof e=="boolean")return e;let o=e.code;return o===false?false:o===true||o===void 0?true:o[t]!==false},je=(e,t)=>{if(typeof e=="boolean")return e;let o=e.mermaid;return o===false?false:o===true||o===void 0?true:o[t]!==false},gt=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("ol",{className:r("list-inside list-decimal whitespace-normal [li_&]:pl-6",t),"data-streamdown":"ordered-list",...n,children:e})},(e,t)=>E(e,t));gt.displayName="MarkdownOl";var To=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("li",{className:r("py-1 [&>p]:inline",t),"data-streamdown":"list-item",...n,children:e})},(e,t)=>e.className===t.className&&_e(e.node,t.node));To.displayName="MarkdownLi";var Po=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("ul",{className:r("list-inside list-disc whitespace-normal [li_&]:pl-6",t),"data-streamdown":"unordered-list",...n,children:e})},(e,t)=>E(e,t));Po.displayName="MarkdownUl";var Mo=memo(({className:e,node:t,...o})=>{let n=y();return jsx$1("hr",{className:n("my-6 border-border",e),"data-streamdown":"horizontal-rule",...o})},(e,t)=>E(e,t));Mo.displayName="MarkdownHr";var Io=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("span",{className:r("font-semibold",t),"data-streamdown":"strong",...n,children:e})},(e,t)=>E(e,t));Io.displayName="MarkdownStrong";var es=({children:e,className:t,href:o,node:n,...r})=>{let s=y(),{linkSafety:a}=useContext(R),[l,i]=useState(false),c=o==="streamdown:incomplete-link",d=useCallback(async g=>{if(!(!(a!=null&&a.enabled&&o)||c)){if(g.preventDefault(),a.onLinkCheck&&await a.onLinkCheck(o)){window.open(o,"_blank","noreferrer");return}i(true);}},[a,o,c]),u=useCallback(()=>{o&&window.open(o,"_blank","noreferrer");},[o]),m=useCallback(()=>{i(false);},[]),p={url:o!=null?o:"",isOpen:l,onClose:m,onConfirm:u};return a!=null&&a.enabled&&o?jsxs$1(Fragment,{children:[jsx$1("button",{className:s("wrap-anywhere appearance-none text-left font-medium text-primary underline",t),"data-incomplete":c,"data-streamdown":"link",onClick:d,type:"button",children:e}),a.renderModal?a.renderModal(p):jsx$1(ro,{...p})]}):jsx$1("a",{className:s("wrap-anywhere font-medium text-primary underline",t),"data-incomplete":c,"data-streamdown":"link",href:o,rel:"noreferrer",target:"_blank",...r,children:e})},No=memo(es,(e,t)=>E(e,t)&&e.href===t.href);No.displayName="MarkdownA";var Lo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h1",{className:r("mt-6 mb-2 font-semibold text-3xl",t),"data-streamdown":"heading-1",...n,children:e})},(e,t)=>E(e,t));Lo.displayName="MarkdownH1";var Ro=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h2",{className:r("mt-6 mb-2 font-semibold text-2xl",t),"data-streamdown":"heading-2",...n,children:e})},(e,t)=>E(e,t));Ro.displayName="MarkdownH2";var So=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h3",{className:r("mt-6 mb-2 font-semibold text-xl",t),"data-streamdown":"heading-3",...n,children:e})},(e,t)=>E(e,t));So.displayName="MarkdownH3";var Eo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h4",{className:r("mt-6 mb-2 font-semibold text-lg",t),"data-streamdown":"heading-4",...n,children:e})},(e,t)=>E(e,t));Eo.displayName="MarkdownH4";var Ho=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h5",{className:r("mt-6 mb-2 font-semibold text-base",t),"data-streamdown":"heading-5",...n,children:e})},(e,t)=>E(e,t));Ho.displayName="MarkdownH5";var Do=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h6",{className:r("mt-6 mb-2 font-semibold text-sm",t),"data-streamdown":"heading-6",...n,children:e})},(e,t)=>E(e,t));Do.displayName="MarkdownH6";var Bo=memo(({children:e,className:t,node:o,...n})=>{let{controls:r}=useContext(R),s=pt(r,"table"),a=ut(r,"copy"),l=ut(r,"download"),i=ut(r,"fullscreen");return jsx$1(ko,{className:t,showControls:s,showCopy:a,showDownload:l,showFullscreen:i,...n,children:e})},(e,t)=>E(e,t));Bo.displayName="MarkdownTable";var Ao=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("thead",{className:r("bg-muted/80",t),"data-streamdown":"table-header",...n,children:e})},(e,t)=>E(e,t));Ao.displayName="MarkdownThead";var Oo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("tbody",{className:r("divide-y divide-border",t),"data-streamdown":"table-body",...n,children:e})},(e,t)=>E(e,t));Oo.displayName="MarkdownTbody";var Vo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("tr",{className:r("border-border",t),"data-streamdown":"table-row",...n,children:e})},(e,t)=>E(e,t));Vo.displayName="MarkdownTr";var jo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("th",{className:r("whitespace-nowrap px-4 py-2 text-left font-semibold text-sm",t),"data-streamdown":"table-header-cell",...n,children:e})},(e,t)=>E(e,t));jo.displayName="MarkdownTh";var Fo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("td",{className:r("px-4 py-2 text-sm",t),"data-streamdown":"table-cell",...n,children:e})},(e,t)=>E(e,t));Fo.displayName="MarkdownTd";var zo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("blockquote",{className:r("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",t),"data-streamdown":"blockquote",...n,children:e})},(e,t)=>E(e,t));zo.displayName="MarkdownBlockquote";var _o=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("sup",{className:r("text-sm",t),"data-streamdown":"superscript",...n,children:e})},(e,t)=>E(e,t));_o.displayName="MarkdownSup";var qo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("sub",{className:r("text-sm",t),"data-streamdown":"subscript",...n,children:e})},(e,t)=>E(e,t));qo.displayName="MarkdownSub";var $o=memo(({children:e,className:t,node:o,...n})=>{if("data-footnotes"in n){let s=i=>{var m,p;if(!isValidElement(i))return false;let c=Array.isArray(i.props.children)?i.props.children:[i.props.children],d=false,u=false;for(let g of c)if(g){if(typeof g=="string")g.trim()!==""&&(d=true);else if(isValidElement(g))if(((m=g.props)==null?void 0:m["data-footnote-backref"])!==void 0)u=true;else {let h=Array.isArray(g.props.children)?g.props.children:[g.props.children];for(let b of h){if(typeof b=="string"&&b.trim()!==""){d=true;break}if(isValidElement(b)&&((p=b.props)==null?void 0:p["data-footnote-backref"])===void 0){d=true;break}}}}return u&&!d},a=Array.isArray(e)?e.map(i=>{if(!isValidElement(i))return i;if(i.type===gt){let d=(Array.isArray(i.props.children)?i.props.children:[i.props.children]).filter(u=>!s(u));return d.length===0?null:{...i,props:{...i.props,children:d}}}return i}):e;return (Array.isArray(a)?a.some(i=>i!==null):a!==null)?jsx$1("section",{className:t,...n,children:a}):null}return jsx$1("section",{className:t,...n,children:e})},(e,t)=>E(e,t));$o.displayName="MarkdownSection";var ts=({node:e,className:t,children:o,...n})=>{var k,I;let r=y(),s=!("data-block"in n),{mermaid:a,controls:l}=useContext(R),i=de(),c=et(),d=t==null?void 0:t.match(Qr),u=(k=d==null?void 0:d.at(1))!=null?k:"",m=so(u);if(s)return jsx$1("code",{className:r("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...n,children:o});let p=(I=e==null?void 0:e.properties)==null?void 0:I.metastring,g=p==null?void 0:p.match(Gr),h=g?Number.parseInt(g[1],10):void 0,b=h!==void 0&&h>=1?h:void 0,f="";if(isValidElement(o)&&o.props&&typeof o.props=="object"&&"children"in o.props&&typeof o.props.children=="string"?f=o.props.children:typeof o=="string"&&(f=o),m){let H=m.component;return jsx$1(Suspense,{fallback:jsx$1(Ae,{}),children:jsx$1(H,{code:f,isIncomplete:c,language:u})})}if(u==="mermaid"&&i){let H=pt(l,"mermaid"),S=je(l,"download"),F=je(l,"copy"),z=je(l,"fullscreen"),q=je(l,"panZoom"),A=H&&(S||F||z);return jsx$1(Suspense,{fallback:jsx$1(Ae,{}),children:jsxs$1("div",{className:r("group relative my-4 flex w-full flex-col gap-2 rounded-xl border border-border bg-sidebar p-2",t),"data-streamdown":"mermaid-block",children:[jsx$1("div",{className:r("flex h-8 items-center text-muted-foreground text-xs"),children:jsx$1("span",{className:r("ml-1 font-mono lowercase"),children:"mermaid"})}),A?jsx$1("div",{className:r("pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end"),children:jsxs$1("div",{className:r("pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur"),"data-streamdown":"mermaid-block-actions",children:[S?jsx$1(lo,{chart:f,config:a==null?void 0:a.config}):null,F?jsx$1(Be,{code:f}):null,z?jsx$1(po,{chart:f,config:a==null?void 0:a.config}):null]})}):null,jsx$1("div",{className:r("rounded-md border border-border bg-background"),children:jsx$1(Yr,{chart:f,config:a==null?void 0:a.config,showControls:q})})]})})}let T=pt(l,"code"),x=xo(l,"download"),w=xo(l,"copy");return jsx$1(rt,{className:t,code:f,isIncomplete:c,language:u,startLine:b,children:T?jsxs$1(Fragment,{children:[x?jsx$1(at,{code:f,language:u}):null,w?jsx$1(Be,{}):null]}):null})},Wo=memo(ts,(e,t)=>e.className===t.className&&_e(e.node,t.node));Wo.displayName="MarkdownCode";var Zo=memo(to,(e,t)=>e.className===t.className&&_e(e.node,t.node));Zo.displayName="MarkdownImg";var Xo=memo(({children:e,node:t,...o})=>{let r=(Array.isArray(e)?e:[e]).filter(s=>s!=null&&s!=="");if(r.length===1&&isValidElement(r[0])){let s=r[0].props.node,a=s==null?void 0:s.tagName;if(a==="img")return jsx$1(Fragment,{children:e});if(a==="code"&&"data-block"in r[0].props)return jsx$1(Fragment,{children:e})}return jsx$1("p",{...o,children:e})},(e,t)=>E(e,t));Xo.displayName="MarkdownParagraph";var Jo={ol:gt,li:To,ul:Po,hr:Mo,strong:Io,a:No,h1:Lo,h2:Ro,h3:So,h4:Eo,h5:Ho,h6:Do,table:Bo,thead:Ao,tbody:Oo,tr:Vo,th:jo,td:Fo,blockquote:zo,code:Wo,img:Zo,pre:({children:e})=>isValidElement(e)?cloneElement(e,{"data-block":"true"}):e,sup:_o,sub:qo,p:Xo,section:$o};var os=/[\u0590-\u08FF\uFB1D-\uFDFF\uFE70-\uFEFF]/,ns=/\p{L}/u;function qe(e){let t=e.replace(/^#{1,6}\s+/gm,"").replace(/(\*{1,3}|_{1,3})/g,"").replace(/`[^`]*`/g,"").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/^[\s>*\-+\d.]+/gm,"");for(let o of t){if(os.test(o))return "rtl";if(ns.test(o))return "ltr"}return "ltr"}var rs=/^[ \t]{0,3}(`{3,}|~{3,})/,ss=/^\|?[ \t]*:?-{1,}:?[ \t]*(\|[ \t]*:?-{1,}:?[ \t]*)*\|?$/,bt=e=>{let t=e.split(`
51752
+ `)};var Te=({children:e,className:t,onCopy:o,onError:n,timeout:r=2e3})=>{let s=y(),[a,l]=useState(false),[i,c]=useState(false),d=useRef(null),u=useRef(0),{isAnimating:m}=useContext(R),p=B(),g=async f=>{var T,x;if(typeof window=="undefined"||!((T=navigator==null?void 0:navigator.clipboard)!=null&&T.write)){n==null||n(new Error("Clipboard API not available"));return}try{let w=(x=d.current)==null?void 0:x.closest('[data-streamdown="table-wrapper"]'),k=w==null?void 0:w.querySelector("table");if(!k){n==null||n(new Error("Table not found"));return}let I=ue(k),F=({csv:oe,tsv:ct,md:ne}[f]||ne)(I),z=new ClipboardItem({"text/plain":new Blob([F],{type:"text/plain"}),"text/html":new Blob([k.outerHTML],{type:"text/html"})});await navigator.clipboard.write([z]),c(!0),l(!1),o==null||o(f),u.current=window.setTimeout(()=>c(!1),r);}catch(w){n==null||n(w);}};useEffect(()=>{let f=T=>{let x=T.composedPath();d.current&&!x.includes(d.current)&&l(false);};return document.addEventListener("mousedown",f),()=>{document.removeEventListener("mousedown",f),window.clearTimeout(u.current);}},[]);let h=L(),b=i?h.CheckIcon:h.CopyIcon;return jsxs$1("div",{className:s("relative"),ref:d,children:[jsx$1("button",{className:s("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:m,onClick:()=>l(!a),title:p.copyTable,type:"button",children:e!=null?e:jsx$1(b,{height:14,width:14})}),a?jsxs$1("div",{className:s("absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg"),children:[jsx$1("button",{className:s("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("md"),title:p.copyTableAsMarkdown,type:"button",children:p.tableFormatMarkdown}),jsx$1("button",{className:s("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("csv"),title:p.copyTableAsCsv,type:"button",children:p.tableFormatCsv}),jsx$1("button",{className:s("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>g("tsv"),title:p.copyTableAsTsv,type:"button",children:p.tableFormatTsv})]}):null]})};var Pe=({children:e,className:t,onDownload:o,onError:n})=>{let r=y(),[s,a]=useState(false),l=useRef(null),{isAnimating:i}=useContext(R),c=B(),d=L(),u=m=>{var p;try{let g=(p=l.current)==null?void 0:p.closest('[data-streamdown="table-wrapper"]'),h=g==null?void 0:g.querySelector("table");if(!h){n==null||n(new Error("Table not found"));return}let b=ue(h),f=m==="csv"?oe(b):ne(b);J(`table.${m==="csv"?"csv":"md"}`,f,m==="csv"?"text/csv":"text/markdown"),a(!1),o==null||o(m);}catch(g){n==null||n(g);}};return useEffect(()=>{let m=p=>{let g=p.composedPath();l.current&&!g.includes(l.current)&&a(false);};return document.addEventListener("mousedown",m),()=>{document.removeEventListener("mousedown",m);}},[]),jsxs$1("div",{className:r("relative"),ref:l,children:[jsx$1("button",{className:r("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:i,onClick:()=>a(!s),title:c.downloadTable,type:"button",children:e!=null?e:jsx$1(d.DownloadIcon,{size:14})}),s?jsxs$1("div",{className:r("absolute top-full right-0 z-10 mt-1 min-w-[120px] overflow-hidden rounded-md border border-border bg-background shadow-lg"),children:[jsx$1("button",{className:r("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>u("csv"),title:c.downloadTableAsCsv,type:"button",children:c.tableFormatCsv}),jsx$1("button",{className:r("w-full px-3 py-2 text-left text-sm transition-colors hover:bg-muted/40"),onClick:()=>u("markdown"),title:c.downloadTableAsMarkdown,type:"button",children:c.tableFormatMarkdown})]}):null]})};var wo=({children:e,className:t,showCopy:o=true,showDownload:n=true})=>{let{Maximize2Icon:r,XIcon:s}=L(),a=y(),[l,i]=useState(false),{isAnimating:c}=useContext(R),d=B(),u=()=>{i(true);},m=()=>{i(false);};return useEffect(()=>{if(l){le();let p=g=>{g.key==="Escape"&&i(false);};return document.addEventListener("keydown",p),()=>{document.removeEventListener("keydown",p),ce();}}},[l]),jsxs$1(Fragment,{children:[jsx$1("button",{className:a("cursor-pointer p-1 text-muted-foreground transition-all hover:text-foreground disabled:cursor-not-allowed disabled:opacity-50",t),disabled:c,onClick:u,title:d.viewFullscreen,type:"button",children:jsx$1(r,{size:14})}),l?createPortal(jsx$1("div",{"aria-label":d.viewFullscreen,"aria-modal":"true",className:a("fixed inset-0 z-50 flex flex-col bg-background"),"data-streamdown":"table-fullscreen",onClick:m,onKeyDown:p=>{p.key==="Escape"&&m();},role:"dialog",children:jsxs$1("div",{className:a("flex h-full flex-col"),onClick:p=>p.stopPropagation(),onKeyDown:p=>p.stopPropagation(),role:"presentation",children:[jsxs$1("div",{className:a("flex items-center justify-end gap-1 p-4"),children:[o?jsx$1(Te,{}):null,n?jsx$1(Pe,{}):null,jsx$1("button",{className:a("rounded-md p-1 text-muted-foreground transition-all hover:bg-muted hover:text-foreground"),onClick:m,title:d.exitFullscreen,type:"button",children:jsx$1(s,{size:20})})]}),jsx$1("div",{className:a("flex-1 overflow-auto p-4 pt-0 [&_thead]:sticky [&_thead]:top-0 [&_thead]:z-10"),children:jsx$1("table",{className:a("w-full border-collapse border border-border"),"data-streamdown":"table",children:e})})]})}),document.body):null]})};var ko=({children:e,className:t,showControls:o,showCopy:n=true,showDownload:r=true,showFullscreen:s=true,...a})=>{let l=y(),i=o&&n,c=o&&r,d=o&&s,u=i||c||d;return jsxs$1("div",{className:l("my-4 flex flex-col gap-2 rounded-lg border border-border bg-sidebar p-2"),"data-streamdown":"table-wrapper",children:[u?jsxs$1("div",{className:l("flex items-center justify-end gap-1"),children:[i?jsx$1(Te,{}):null,c?jsx$1(Pe,{}):null,d?jsx$1(wo,{showCopy:i,showDownload:c,children:e}):null]}):null,jsx$1("div",{className:l("border-collapse overflow-x-auto overflow-y-auto rounded-md border border-border bg-background"),children:jsx$1("table",{className:l("w-full divide-y divide-border",t),"data-streamdown":"table",...a,children:e})})]})};var Gr=/startLine=(\d+)/,Yr=lazy$1(()=>import('./fthry_mermaid-O7DHMXV3.Bz4-4YvV.js').then(e=>({default:e.Mermaid}))),Qr=/language-([^\s]+)/;function _e(e,t){if(!(e!=null&&e.position||t!=null&&t.position))return true;if(!(e!=null&&e.position&&(t!=null&&t.position)))return false;let o=e.position.start,n=t.position.start,r=e.position.end,s=t.position.end;return (o==null?void 0:o.line)===(n==null?void 0:n.line)&&(o==null?void 0:o.column)===(n==null?void 0:n.column)&&(r==null?void 0:r.line)===(s==null?void 0:s.line)&&(r==null?void 0:r.column)===(s==null?void 0:s.column)}function E(e,t){return e.className===t.className&&_e(e.node,t.node)}var pt=(e,t)=>typeof e=="boolean"?e:e[t]!==false,ut=(e,t)=>{if(typeof e=="boolean")return e;let o=e.table;return o===false?false:o===true||o===void 0?true:o[t]!==false},xo=(e,t)=>{if(typeof e=="boolean")return e;let o=e.code;return o===false?false:o===true||o===void 0?true:o[t]!==false},je=(e,t)=>{if(typeof e=="boolean")return e;let o=e.mermaid;return o===false?false:o===true||o===void 0?true:o[t]!==false},gt=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("ol",{className:r("list-inside list-decimal whitespace-normal [li_&]:pl-6",t),"data-streamdown":"ordered-list",...n,children:e})},(e,t)=>E(e,t));gt.displayName="MarkdownOl";var To=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("li",{className:r("py-1 [&>p]:inline",t),"data-streamdown":"list-item",...n,children:e})},(e,t)=>e.className===t.className&&_e(e.node,t.node));To.displayName="MarkdownLi";var Po=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("ul",{className:r("list-inside list-disc whitespace-normal [li_&]:pl-6",t),"data-streamdown":"unordered-list",...n,children:e})},(e,t)=>E(e,t));Po.displayName="MarkdownUl";var Mo=memo(({className:e,node:t,...o})=>{let n=y();return jsx$1("hr",{className:n("my-6 border-border",e),"data-streamdown":"horizontal-rule",...o})},(e,t)=>E(e,t));Mo.displayName="MarkdownHr";var Io=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("span",{className:r("font-semibold",t),"data-streamdown":"strong",...n,children:e})},(e,t)=>E(e,t));Io.displayName="MarkdownStrong";var es=({children:e,className:t,href:o,node:n,...r})=>{let s=y(),{linkSafety:a}=useContext(R),[l,i]=useState(false),c=o==="streamdown:incomplete-link",d=useCallback(async g=>{if(!(!(a!=null&&a.enabled&&o)||c)){if(g.preventDefault(),a.onLinkCheck&&await a.onLinkCheck(o)){window.open(o,"_blank","noreferrer");return}i(true);}},[a,o,c]),u=useCallback(()=>{o&&window.open(o,"_blank","noreferrer");},[o]),m=useCallback(()=>{i(false);},[]),p={url:o!=null?o:"",isOpen:l,onClose:m,onConfirm:u};return a!=null&&a.enabled&&o?jsxs$1(Fragment,{children:[jsx$1("button",{className:s("wrap-anywhere appearance-none text-left font-medium text-primary underline",t),"data-incomplete":c,"data-streamdown":"link",onClick:d,type:"button",children:e}),a.renderModal?a.renderModal(p):jsx$1(ro,{...p})]}):jsx$1("a",{className:s("wrap-anywhere font-medium text-primary underline",t),"data-incomplete":c,"data-streamdown":"link",href:o,rel:"noreferrer",target:"_blank",...r,children:e})},No=memo(es,(e,t)=>E(e,t)&&e.href===t.href);No.displayName="MarkdownA";var Lo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h1",{className:r("mt-6 mb-2 font-semibold text-3xl",t),"data-streamdown":"heading-1",...n,children:e})},(e,t)=>E(e,t));Lo.displayName="MarkdownH1";var Ro=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h2",{className:r("mt-6 mb-2 font-semibold text-2xl",t),"data-streamdown":"heading-2",...n,children:e})},(e,t)=>E(e,t));Ro.displayName="MarkdownH2";var So=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h3",{className:r("mt-6 mb-2 font-semibold text-xl",t),"data-streamdown":"heading-3",...n,children:e})},(e,t)=>E(e,t));So.displayName="MarkdownH3";var Eo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h4",{className:r("mt-6 mb-2 font-semibold text-lg",t),"data-streamdown":"heading-4",...n,children:e})},(e,t)=>E(e,t));Eo.displayName="MarkdownH4";var Ho=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h5",{className:r("mt-6 mb-2 font-semibold text-base",t),"data-streamdown":"heading-5",...n,children:e})},(e,t)=>E(e,t));Ho.displayName="MarkdownH5";var Do=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("h6",{className:r("mt-6 mb-2 font-semibold text-sm",t),"data-streamdown":"heading-6",...n,children:e})},(e,t)=>E(e,t));Do.displayName="MarkdownH6";var Bo=memo(({children:e,className:t,node:o,...n})=>{let{controls:r}=useContext(R),s=pt(r,"table"),a=ut(r,"copy"),l=ut(r,"download"),i=ut(r,"fullscreen");return jsx$1(ko,{className:t,showControls:s,showCopy:a,showDownload:l,showFullscreen:i,...n,children:e})},(e,t)=>E(e,t));Bo.displayName="MarkdownTable";var Ao=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("thead",{className:r("bg-muted/80",t),"data-streamdown":"table-header",...n,children:e})},(e,t)=>E(e,t));Ao.displayName="MarkdownThead";var Oo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("tbody",{className:r("divide-y divide-border",t),"data-streamdown":"table-body",...n,children:e})},(e,t)=>E(e,t));Oo.displayName="MarkdownTbody";var Vo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("tr",{className:r("border-border",t),"data-streamdown":"table-row",...n,children:e})},(e,t)=>E(e,t));Vo.displayName="MarkdownTr";var jo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("th",{className:r("whitespace-nowrap px-4 py-2 text-left font-semibold text-sm",t),"data-streamdown":"table-header-cell",...n,children:e})},(e,t)=>E(e,t));jo.displayName="MarkdownTh";var Fo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("td",{className:r("px-4 py-2 text-sm",t),"data-streamdown":"table-cell",...n,children:e})},(e,t)=>E(e,t));Fo.displayName="MarkdownTd";var zo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("blockquote",{className:r("my-4 border-muted-foreground/30 border-l-4 pl-4 text-muted-foreground italic",t),"data-streamdown":"blockquote",...n,children:e})},(e,t)=>E(e,t));zo.displayName="MarkdownBlockquote";var _o=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("sup",{className:r("text-sm",t),"data-streamdown":"superscript",...n,children:e})},(e,t)=>E(e,t));_o.displayName="MarkdownSup";var qo=memo(({children:e,className:t,node:o,...n})=>{let r=y();return jsx$1("sub",{className:r("text-sm",t),"data-streamdown":"subscript",...n,children:e})},(e,t)=>E(e,t));qo.displayName="MarkdownSub";var $o=memo(({children:e,className:t,node:o,...n})=>{if("data-footnotes"in n){let s=i=>{var m,p;if(!isValidElement(i))return false;let c=Array.isArray(i.props.children)?i.props.children:[i.props.children],d=false,u=false;for(let g of c)if(g){if(typeof g=="string")g.trim()!==""&&(d=true);else if(isValidElement(g))if(((m=g.props)==null?void 0:m["data-footnote-backref"])!==void 0)u=true;else {let h=Array.isArray(g.props.children)?g.props.children:[g.props.children];for(let b of h){if(typeof b=="string"&&b.trim()!==""){d=true;break}if(isValidElement(b)&&((p=b.props)==null?void 0:p["data-footnote-backref"])===void 0){d=true;break}}}}return u&&!d},a=Array.isArray(e)?e.map(i=>{if(!isValidElement(i))return i;if(i.type===gt){let d=(Array.isArray(i.props.children)?i.props.children:[i.props.children]).filter(u=>!s(u));return d.length===0?null:{...i,props:{...i.props,children:d}}}return i}):e;return (Array.isArray(a)?a.some(i=>i!==null):a!==null)?jsx$1("section",{className:t,...n,children:a}):null}return jsx$1("section",{className:t,...n,children:e})},(e,t)=>E(e,t));$o.displayName="MarkdownSection";var ts=({node:e,className:t,children:o,...n})=>{var k,I;let r=y(),s=!("data-block"in n),{mermaid:a,controls:l}=useContext(R),i=de(),c=et(),d=t==null?void 0:t.match(Qr),u=(k=d==null?void 0:d.at(1))!=null?k:"",m=so(u);if(s)return jsx$1("code",{className:r("rounded bg-muted px-1.5 py-0.5 font-mono text-sm",t),"data-streamdown":"inline-code",...n,children:o});let p=(I=e==null?void 0:e.properties)==null?void 0:I.metastring,g=p==null?void 0:p.match(Gr),h=g?Number.parseInt(g[1],10):void 0,b=h!==void 0&&h>=1?h:void 0,f="";if(isValidElement(o)&&o.props&&typeof o.props=="object"&&"children"in o.props&&typeof o.props.children=="string"?f=o.props.children:typeof o=="string"&&(f=o),m){let H=m.component;return jsx$1(Suspense,{fallback:jsx$1(Ae,{}),children:jsx$1(H,{code:f,isIncomplete:c,language:u})})}if(u==="mermaid"&&i){let H=pt(l,"mermaid"),S=je(l,"download"),F=je(l,"copy"),z=je(l,"fullscreen"),q=je(l,"panZoom"),A=H&&(S||F||z);return jsx$1(Suspense,{fallback:jsx$1(Ae,{}),children:jsxs$1("div",{className:r("group relative my-4 flex w-full flex-col gap-2 rounded-xl border border-border bg-sidebar p-2",t),"data-streamdown":"mermaid-block",children:[jsx$1("div",{className:r("flex h-8 items-center text-muted-foreground text-xs"),children:jsx$1("span",{className:r("ml-1 font-mono lowercase"),children:"mermaid"})}),A?jsx$1("div",{className:r("pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end"),children:jsxs$1("div",{className:r("pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur"),"data-streamdown":"mermaid-block-actions",children:[S?jsx$1(lo,{chart:f,config:a==null?void 0:a.config}):null,F?jsx$1(Be,{code:f}):null,z?jsx$1(po,{chart:f,config:a==null?void 0:a.config}):null]})}):null,jsx$1("div",{className:r("rounded-md border border-border bg-background"),children:jsx$1(Yr,{chart:f,config:a==null?void 0:a.config,showControls:q})})]})})}let T=pt(l,"code"),x=xo(l,"download"),w=xo(l,"copy");return jsx$1(rt,{className:t,code:f,isIncomplete:c,language:u,startLine:b,children:T?jsxs$1(Fragment,{children:[x?jsx$1(at,{code:f,language:u}):null,w?jsx$1(Be,{}):null]}):null})},Wo=memo(ts,(e,t)=>e.className===t.className&&_e(e.node,t.node));Wo.displayName="MarkdownCode";var Zo=memo(to,(e,t)=>e.className===t.className&&_e(e.node,t.node));Zo.displayName="MarkdownImg";var Xo=memo(({children:e,node:t,...o})=>{let r=(Array.isArray(e)?e:[e]).filter(s=>s!=null&&s!=="");if(r.length===1&&isValidElement(r[0])){let s=r[0].props.node,a=s==null?void 0:s.tagName;if(a==="img")return jsx$1(Fragment,{children:e});if(a==="code"&&"data-block"in r[0].props)return jsx$1(Fragment,{children:e})}return jsx$1("p",{...o,children:e})},(e,t)=>E(e,t));Xo.displayName="MarkdownParagraph";var Jo={ol:gt,li:To,ul:Po,hr:Mo,strong:Io,a:No,h1:Lo,h2:Ro,h3:So,h4:Eo,h5:Ho,h6:Do,table:Bo,thead:Ao,tbody:Oo,tr:Vo,th:jo,td:Fo,blockquote:zo,code:Wo,img:Zo,pre:({children:e})=>isValidElement(e)?cloneElement(e,{"data-block":"true"}):e,sup:_o,sub:qo,p:Xo,section:$o};var os=/[\u0590-\u08FF\uFB1D-\uFDFF\uFE70-\uFEFF]/,ns=/\p{L}/u;function qe(e){let t=e.replace(/^#{1,6}\s+/gm,"").replace(/(\*{1,3}|_{1,3})/g,"").replace(/`[^`]*`/g,"").replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/^[\s>*\-+\d.]+/gm,"");for(let o of t){if(os.test(o))return "rtl";if(ns.test(o))return "ltr"}return "ltr"}var rs=/^[ \t]{0,3}(`{3,}|~{3,})/,ss=/^\|?[ \t]*:?-{1,}:?[ \t]*(\|[ \t]*:?-{1,}:?[ \t]*)*\|?$/,bt=e=>{let t=e.split(`
51315
51753
  `),o=null,n=0;for(let r of t){let s=rs.exec(r);if(o===null){if(s){let a=s[1];o=a[0],n=a.length;}}else if(s){let a=s[1],l=a[0],i=a.length;l===o&&i>=n&&(o=null,n=0);}}return o!==null},Ko=e=>{let t=e.split(`
51316
51754
  `);for(let o of t){let n=o.trim();if(n.length>0&&n.includes("|")&&ss.test(n))return true}return false};var Uo=()=>e=>{visit(e,"html",(t,o,n)=>{!n||typeof o!="number"||(n.children[o]={type:"text",value:t.value});});};var Yo=[],Qo={allowDangerousHtml:true},$e=new WeakMap,yt=class{constructor(){this.cache=new Map;this.keyCache=new WeakMap;this.maxSize=100;}generateCacheKey(t){let o=this.keyCache.get(t);if(o)return o;let n=t.rehypePlugins,r=t.remarkPlugins,s=t.remarkRehypeOptions;if(!(n||r||s)){let u="default";return this.keyCache.set(t,u),u}let a=u=>{if(!u||u.length===0)return "";let m="";for(let p=0;p<u.length;p+=1){let g=u[p];if(p>0&&(m+=","),Array.isArray(g)){let[h,b]=g;if(typeof h=="function"){let f=$e.get(h);f||(f=h.name,$e.set(h,f)),m+=f;}else m+=String(h);m+=":",m+=JSON.stringify(b);}else if(typeof g=="function"){let h=$e.get(g);h||(h=g.name,$e.set(g,h)),m+=h;}else m+=String(g);}return m},l=a(n),i=a(r),c=s?JSON.stringify(s):"",d=`${i}::${l}::${c}`;return this.keyCache.set(t,d),d}get(t){let o=this.generateCacheKey(t),n=this.cache.get(o);return n&&(this.cache.delete(o),this.cache.set(o,n)),n}set(t,o){let n=this.generateCacheKey(t);if(this.cache.size>=this.maxSize){let r=this.cache.keys().next().value;r&&this.cache.delete(r);}this.cache.set(n,o);}clear(){this.cache.clear();}},en=new yt,wt=e=>{let t=gs(e),o=e.children||"",n=t.runSync(t.parse(o),o);return ks(n,e)},gs=e=>{let t=en.get(e);if(t)return t;let o=hs(e);return en.set(e,o),o},bs=e=>e.some(t=>Array.isArray(t)?t[0]===rehypeRaw:t===rehypeRaw),hs=e=>{let t=e.rehypePlugins||Yo,o=e.remarkPlugins||Yo,n=bs(t)?o:[...o,Uo],r=e.remarkRehypeOptions?{...Qo,...e.remarkRehypeOptions}:Qo;return unified().use(remarkParse).use(n).use(remarkRehype,r).use(t)},tn=e=>e,ys=(e,t,o,n)=>{o?e.children.splice(t,1):e.children[t]={type:"text",value:n};},ws=(e,t)=>{var o;for(let n in urlAttributes)if(Object.hasOwn(urlAttributes,n)&&Object.hasOwn(e.properties,n)){let r=e.properties[n],s=urlAttributes[n];(s===null||s.includes(e.tagName))&&(e.properties[n]=(o=t(String(r||""),n,e))!=null?o:void 0);}},Cs=(e,t,o,n,r,s)=>{let a=false;return n?a=!n.includes(e.tagName):r&&(a=r.includes(e.tagName)),!a&&s&&typeof t=="number"&&(a=!s(e,t,o)),a},ks=(e,t)=>{let{allowElement:o,allowedElements:n,disallowedElements:r,skipHtml:s,unwrapDisallowed:a,urlTransform:l}=t;if(o||n||r||s||l){let c=l||tn;visit(e,(d,u,m)=>{if(d.type==="raw"&&m&&typeof u=="number")return ys(m,u,s,d.value),u;if(d.type==="element"&&(ws(d,c),Cs(d,u,m,n,r,o)&&m&&typeof u=="number"))return a&&d.children?m.children.splice(u,1,...d.children):m.children.splice(u,1),u});}return toJsxRuntime(e,{Fragment:Fragment,components:t.components,ignoreInvalidStyle:true,jsx:jsx$1,jsxs:jsxs$1,passKeys:true,passNode:true})};var xs=/\[\^[\w-]{1,200}\](?!:)/,Ts=/\[\^[\w-]{1,200}\]:/;var Ps=/<(\w+)[\s>]/,Ms=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),on=new Map,nn=new Map,Is=e=>{let t=e.toLowerCase(),o=on.get(t);if(o)return o;let n=new RegExp(`<${t}(?=[\\s>/])[^>]*>`,"gi");return on.set(t,n),n},Ns=e=>{let t=e.toLowerCase(),o=nn.get(t);if(o)return o;let n=new RegExp(`</${t}(?=[\\s>])[^>]*>`,"gi");return nn.set(t,n),n},rn=(e,t)=>{if(Ms.has(t.toLowerCase()))return 0;let o=e.match(Is(t));if(!o)return 0;let n=0;for(let r of o)r.trimEnd().endsWith("/>")||(n+=1);return n},sn=(e,t)=>{let o=e.match(Ns(t));return o?o.length:0},Ls=e=>{let t=0;for(let o=0;o<e.length-1;o+=1)e[o]==="$"&&e[o+1]==="$"&&(t+=1,o+=1);return t},Ct=e=>{let t=xs.test(e),o=Ts.test(e);if(t||o)return [e];let n=x.lex(e,{gfm:true}),r=[],s=[],a=false;for(let l of n){let i=l.raw,c=r.length;if(s.length>0){r[c-1]+=i;let d=s.at(-1),u=rn(i,d),m=sn(i,d);for(let p=0;p<u;p+=1)s.push(d);for(let p=0;p<m;p+=1)s.length>0&&s.at(-1)===d&&s.pop();continue}if(l.type==="html"&&l.block){let d=i.match(Ps);if(d){let u=d[1],m=rn(i,u),p=sn(i,u);m>p&&s.push(u);}}if(c>0&&!a){let d=r[c-1];if(Ls(d)%2===1){r[c-1]=d+i;continue}}r.push(i),l.type!=="space"&&(a=l.type==="code");}return r};var an=(e,t)=>{if(!t.length)return e;let o=e;for(let n of t){let r=new RegExp(`(<${n}(?=[\\s>/])[^>]*>)([\\s\\S]*?)(</${n}\\s*>)`,"gi");o=o.replace(r,(s,a,l,i)=>{let c=l.replace(/\n\n/g,`
51317
51755
  <!---->
@@ -52954,7 +53392,7 @@ var DEFAULT_MODES = [
52954
53392
  var AssistantChat = function (_a) {
52955
53393
  var _b, _c;
52956
53394
  var _d;
52957
- var instanceId = _a.instanceId, getTargets = _a.getTargets, getJwt = _a.getJwt, baseUrl = _a.baseUrl, _e = _a.bottom, bottom = _e === void 0 ? 20 : _e, color = _a.color, _f = _a.workflowActions, workflowActions = _f === void 0 ? [] : _f, _g = _a.allowedModes, allowedModes = _g === void 0 ? DEFAULT_MODES : _g, onLayoutChange = _a.onLayoutChange;
53395
+ var instanceId = _a.instanceId, getTargets = _a.getTargets, getJwt = _a.getJwt, baseUrl = _a.baseUrl, _e = _a.bottom, bottom = _e === void 0 ? 20 : _e, color = _a.color, _f = _a.voiceEnabled, voiceEnabled = _f === void 0 ? false : _f, _g = _a.workflowActions, workflowActions = _g === void 0 ? [] : _g, _h = _a.allowedModes, allowedModes = _h === void 0 ? DEFAULT_MODES : _h, onLayoutChange = _a.onLayoutChange;
52958
53396
  var headers = useMemo(function () {
52959
53397
  if (getJwt)
52960
53398
  return function () { return ({ Authorization: "Bearer ".concat(getJwt()) }); };
@@ -52981,14 +53419,14 @@ var AssistantChat = function (_a) {
52981
53419
  }
52982
53420
  return body;
52983
53421
  };
52984
- var _h = __read(useState(false), 2), isOpen = _h[0], setIsOpen = _h[1];
52985
- var _j = __read(useState(readStoredMode), 2), mode = _j[0], setModeState = _j[1];
53422
+ var _j = __read(useState(false), 2), isOpen = _j[0], setIsOpen = _j[1];
53423
+ var _k = __read(useState(readStoredMode), 2), mode = _k[0], setModeState = _k[1];
52986
53424
  var setMode = useCallback(function (next) {
52987
53425
  setModeState(next);
52988
53426
  writeStoredMode(next);
52989
53427
  }, []);
52990
- var _k = __read(useState(readStoredSidebarWidth), 2), sidebarWidth = _k[0], setSidebarWidth = _k[1];
52991
- var _l = __read(useState(false), 2), isResizing = _l[0], setIsResizing = _l[1];
53428
+ var _l = __read(useState(readStoredSidebarWidth), 2), sidebarWidth = _l[0], setSidebarWidth = _l[1];
53429
+ var _m = __read(useState(false), 2), isResizing = _m[0], setIsResizing = _m[1];
52992
53430
  useEffect(function () {
52993
53431
  var onWindowResize = function () {
52994
53432
  setSidebarWidth(function (w) {
@@ -53034,17 +53472,20 @@ var AssistantChat = function (_a) {
53034
53472
  setSidebarWidth(DEFAULT_SIDEBAR_WIDTH);
53035
53473
  writeStoredSidebarWidth(DEFAULT_SIDEBAR_WIDTH);
53036
53474
  }, []);
53037
- var _m = __read(useState(''), 2), input = _m[0], setInput = _m[1];
53038
- var _o = __read(useState([]), 2), threads = _o[0], setThreads = _o[1];
53039
- var _p = __read(useState(null), 2), activeThreadId = _p[0], setActiveThreadId = _p[1];
53040
- var _q = __read(useState(false), 2), isDropdownOpen = _q[0], setIsDropdownOpen = _q[1];
53041
- var _r = __read(useState(false), 2), isModeMenuOpen = _r[0], setIsModeMenuOpen = _r[1];
53042
- var _s = __read(useState(null), 2), actionTooltip = _s[0], setActionTooltip = _s[1];
53043
- var messagesEndRef = useRef(null);
53475
+ var _o = __read(useState(''), 2), input = _o[0], setInput = _o[1];
53476
+ var _p = __read(useState([]), 2), threads = _p[0], setThreads = _p[1];
53477
+ var _q = __read(useState(null), 2), activeThreadId = _q[0], setActiveThreadId = _q[1];
53478
+ var _r = __read(useState(false), 2), isDropdownOpen = _r[0], setIsDropdownOpen = _r[1];
53479
+ var _s = __read(useState(false), 2), isModeMenuOpen = _s[0], setIsModeMenuOpen = _s[1];
53480
+ var _t = __read(useState(null), 2), actionTooltip = _t[0], setActionTooltip = _t[1];
53044
53481
  var messagesContainerRef = useRef(null);
53045
53482
  // Suppresses auto-scroll when the user has scrolled up to read earlier content
53046
53483
  var atBottomRef = useRef(true);
53047
53484
  var BOTTOM_THRESHOLD_PX = 60;
53485
+ // Voice state read while sending a request and while routing its streamed data parts
53486
+ var voiceActiveRef = useRef(false);
53487
+ var pendingAudioRef = useRef(null);
53488
+ var voiceDataRef = useRef(null);
53048
53489
  var handleMessagesScroll = useCallback(function () {
53049
53490
  var el = messagesContainerRef.current;
53050
53491
  if (!el)
@@ -53052,23 +53493,77 @@ var AssistantChat = function (_a) {
53052
53493
  var distance = el.scrollHeight - el.scrollTop - el.clientHeight;
53053
53494
  atBottomRef.current = distance < BOTTOM_THRESHOLD_PX;
53054
53495
  }, []);
53496
+ // Keep the newest content anchored at the bottom, pushing older content up
53497
+ var pinToBottom = useCallback(function () {
53498
+ var el = messagesContainerRef.current;
53499
+ if (!el || !atBottomRef.current)
53500
+ return;
53501
+ el.scrollTop = el.scrollHeight;
53502
+ }, []);
53055
53503
  var colors = useMemo(function () { return getChatColors(color || DEFAULT_CHAT_COLOR); }, [color]);
53056
53504
  var makeChat = function (threadId, initialMessages, initialTitle) {
53057
53505
  if (initialMessages === void 0) { initialMessages = []; }
53058
53506
  var resolvedThreadId = threadId;
53059
53507
  var titleGenerated = !!initialTitle;
53508
+ // Title the thread from its first user message, whether typed or a voice transcript
53509
+ var triggerTitle = function (userText) {
53510
+ if (titleGenerated || !userText)
53511
+ return;
53512
+ titleGenerated = true;
53513
+ var currentThreadId = resolvedThreadId || null;
53514
+ var titleContext = {};
53515
+ var targets = getTargets();
53516
+ if (targets.length > 0)
53517
+ titleContext.targets = targets;
53518
+ if (instanceId) {
53519
+ var stepKey = getCurrentStepKey(instanceId);
53520
+ if (stepKey)
53521
+ titleContext.current_step = stepKey;
53522
+ }
53523
+ generateThreadTitle(baseUrl, headers, currentThreadId, userText, titleContext).then(function (title) {
53524
+ if (!title)
53525
+ return;
53526
+ setThreads(function (prev) {
53527
+ return prev.map(function (t) {
53528
+ return t.id === currentThreadId || t.chat === chat ? __assign(__assign({}, t), { title: title }) : t;
53529
+ });
53530
+ });
53531
+ });
53532
+ };
53060
53533
  var chatTransport = new DefaultChatTransport({
53061
53534
  api: baseUrl,
53062
53535
  headers: headers,
53063
53536
  body: function () { return (__assign(__assign({}, buildChatBody()), { thread_id: resolvedThreadId || null })); },
53064
53537
  fetch: function (url, init) { return __awaiter(void 0, void 0, void 0, function () {
53065
- var res, threadId, titleMessage, currentThreadId_1, titleContext, targets, stepKey;
53066
- var _a, _b, _c;
53067
- return __generator(this, function (_d) {
53068
- switch (_d.label) {
53069
- case 0: return [4 /*yield*/, fetch(url, init)];
53538
+ var res, form, audio, threadId;
53539
+ var _a, _b, _c, _d;
53540
+ return __generator(this, function (_e) {
53541
+ switch (_e.label) {
53542
+ case 0:
53543
+ if (!voiceActiveRef.current) return [3 /*break*/, 2];
53544
+ form = new FormData();
53545
+ form.append('payload', typeof (init === null || init === void 0 ? void 0 : init.body) === 'string'
53546
+ ? init.body
53547
+ : JSON.stringify((_a = init === null || init === void 0 ? void 0 : init.body) !== null && _a !== void 0 ? _a : {}));
53548
+ audio = pendingAudioRef.current;
53549
+ if (audio) {
53550
+ form.append('audio', audio, 'speech.wav');
53551
+ pendingAudioRef.current = null;
53552
+ }
53553
+ return [4 /*yield*/, fetch("".concat(baseUrl, "voice/turn/"), {
53554
+ method: 'POST',
53555
+ headers: headers(),
53556
+ body: form,
53557
+ signal: init === null || init === void 0 ? void 0 : init.signal
53558
+ })];
53070
53559
  case 1:
53071
- res = _d.sent();
53560
+ res = _e.sent();
53561
+ return [3 /*break*/, 4];
53562
+ case 2: return [4 /*yield*/, fetch(url, init)];
53563
+ case 3:
53564
+ res = _e.sent();
53565
+ _e.label = 4;
53566
+ case 4:
53072
53567
  threadId = res.headers.get('X-Thread-Id');
53073
53568
  if (threadId && !resolvedThreadId) {
53074
53569
  resolvedThreadId = threadId;
@@ -53088,38 +53583,7 @@ var AssistantChat = function (_a) {
53088
53583
  });
53089
53584
  });
53090
53585
  }
53091
- if (!titleGenerated) {
53092
- titleMessage = (_c = (_b = (_a = chat.messages.find(function (m) { return m.role === 'user'; })) === null || _a === void 0 ? void 0 : _a.parts) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.text;
53093
- if (titleMessage) {
53094
- titleGenerated = true;
53095
- currentThreadId_1 = resolvedThreadId || threadId || null;
53096
- titleContext = {};
53097
- targets = getTargets();
53098
- if (targets.length > 0)
53099
- titleContext.targets = targets;
53100
- if (instanceId) {
53101
- stepKey = getCurrentStepKey(instanceId);
53102
- if (stepKey)
53103
- titleContext.current_step = stepKey;
53104
- }
53105
- generateThreadTitle(baseUrl, headers, currentThreadId_1, titleMessage, titleContext).then(function (title) {
53106
- if (!title)
53107
- return;
53108
- if (currentThreadId_1) {
53109
- setThreads(function (prev) {
53110
- return prev.map(function (t) {
53111
- return t.id === currentThreadId_1 ? __assign(__assign({}, t), { title: title }) : t;
53112
- });
53113
- });
53114
- }
53115
- else {
53116
- setThreads(function (prev) {
53117
- return prev.map(function (t) { return (t.chat === chat ? __assign(__assign({}, t), { title: title }) : t); });
53118
- });
53119
- }
53120
- });
53121
- }
53122
- }
53586
+ triggerTitle((_d = (_c = (_b = chat.messages.find(function (m) { return m.role === 'user'; })) === null || _b === void 0 ? void 0 : _b.parts) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.text);
53123
53587
  return [2 /*return*/, res];
53124
53588
  }
53125
53589
  });
@@ -53129,6 +53593,12 @@ var AssistantChat = function (_a) {
53129
53593
  transport: chatTransport,
53130
53594
  messages: initialMessages,
53131
53595
  sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,
53596
+ onData: function (part) {
53597
+ var _a, _b;
53598
+ if ((part === null || part === void 0 ? void 0 : part.type) === 'data-transcript')
53599
+ triggerTitle((_a = part.data) === null || _a === void 0 ? void 0 : _a.text);
53600
+ (_b = voiceDataRef.current) === null || _b === void 0 ? void 0 : _b.call(voiceDataRef, part);
53601
+ },
53132
53602
  onToolCall: function (_a) {
53133
53603
  var toolCall = _a.toolCall;
53134
53604
  return __awaiter(void 0, void 0, void 0, function () {
@@ -53248,9 +53718,9 @@ var AssistantChat = function (_a) {
53248
53718
  var readyChat = useMemo(function () { return makeChat(null); }, [headers, getTargets, getJwt]);
53249
53719
  var activeThread = threads.find(function (t) { return t.id === activeThreadId; });
53250
53720
  var activeChat = (_d = activeThread === null || activeThread === void 0 ? void 0 : activeThread.chat) !== null && _d !== void 0 ? _d : readyChat;
53251
- var _t = useChat({
53721
+ var _u = useChat({
53252
53722
  chat: activeChat
53253
- }), rawMessages = _t.messages, sendMessage = _t.sendMessage, status = _t.status, error = _t.error;
53723
+ }), rawMessages = _u.messages, sendMessage = _u.sendMessage, setMessages = _u.setMessages, status = _u.status, error = _u.error;
53254
53724
  var messages = useMemo(function () {
53255
53725
  var e_1, _a;
53256
53726
  var _b, _c;
@@ -53279,25 +53749,14 @@ var AssistantChat = function (_a) {
53279
53749
  return combined;
53280
53750
  }, [rawMessages]);
53281
53751
  useEffect(function () {
53282
- var _a;
53283
- if (!atBottomRef.current)
53284
- return;
53285
- (_a = messagesEndRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ behavior: 'smooth' });
53286
- }, [messages]);
53752
+ pinToBottom();
53753
+ }, [messages, pinToBottom]);
53287
53754
  useEffect(function () {
53288
53755
  if (status !== 'ready')
53289
53756
  return;
53290
- if (!atBottomRef.current)
53291
- return;
53292
- var id = featheryWindow().requestAnimationFrame(function () {
53293
- var _a;
53294
- (_a = messagesEndRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({
53295
- behavior: 'smooth',
53296
- block: 'end'
53297
- });
53298
- });
53757
+ var id = featheryWindow().requestAnimationFrame(pinToBottom);
53299
53758
  return function () { return featheryWindow().cancelAnimationFrame(id); };
53300
- }, [status]);
53759
+ }, [status, pinToBottom]);
53301
53760
  var fetchThreads = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
53302
53761
  var data;
53303
53762
  return __generator(this, function (_a) {
@@ -53320,6 +53779,7 @@ var AssistantChat = function (_a) {
53320
53779
  fetchThreads();
53321
53780
  }, [isOpen, fetchThreads]);
53322
53781
  var handleNewThread = function () {
53782
+ stopVoice();
53323
53783
  atBottomRef.current = true;
53324
53784
  var id = v4();
53325
53785
  var now = new Date().toISOString();
@@ -53342,6 +53802,7 @@ var AssistantChat = function (_a) {
53342
53802
  return __generator(this, function (_c) {
53343
53803
  switch (_c.label) {
53344
53804
  case 0:
53805
+ stopVoice();
53345
53806
  atBottomRef.current = true;
53346
53807
  if ((_a = threads.find(function (t) { return t.id === id; })) === null || _a === void 0 ? void 0 : _a.chat) {
53347
53808
  setActiveThreadId(id);
@@ -53383,45 +53844,15 @@ var AssistantChat = function (_a) {
53383
53844
  }
53384
53845
  });
53385
53846
  }); };
53386
- var handleSend = function () {
53387
- if (input.trim() && status === 'ready') {
53388
- atBottomRef.current = true;
53389
- var now_1 = new Date().toISOString();
53390
- if (!activeThreadId) {
53391
- // First send, register readyChat as a real thread entry
53392
- var id_1 = v4();
53393
- setThreads(function (prev) { return __spreadArray([
53394
- {
53395
- id: id_1,
53396
- title: 'New Chat',
53397
- created_at: now_1,
53398
- updated_at: now_1,
53399
- isTemporary: true,
53400
- chat: activeChat
53401
- }
53402
- ], __read(prev), false); });
53403
- setActiveThreadId(id_1);
53404
- }
53405
- else {
53406
- if (activeThread && !activeThread.title) {
53407
- setThreads(function (prev) { return __spreadArray([
53408
- __assign(__assign({}, activeThread), { title: 'New Chat', updated_at: now_1 })
53409
- ], __read(prev.filter(function (t) { return t.id !== activeThreadId; })), false); });
53410
- }
53411
- }
53412
- sendMessage({ text: input });
53413
- setInput('');
53414
- }
53415
- };
53416
- var handleWorkflowAction = function (action) {
53417
- if (status !== 'ready')
53418
- return;
53847
+ // First send of a thread registers it as a real entry, for both text and voice
53848
+ var registerActiveThread = useCallback(function () {
53849
+ atBottomRef.current = true;
53419
53850
  var now = new Date().toISOString();
53420
53851
  if (!activeThreadId) {
53421
- var id_2 = v4();
53852
+ var id_1 = v4();
53422
53853
  setThreads(function (prev) { return __spreadArray([
53423
53854
  {
53424
- id: id_2,
53855
+ id: id_1,
53425
53856
  title: 'New Chat',
53426
53857
  created_at: now,
53427
53858
  updated_at: now,
@@ -53429,13 +53860,38 @@ var AssistantChat = function (_a) {
53429
53860
  chat: activeChat
53430
53861
  }
53431
53862
  ], __read(prev), false); });
53432
- setActiveThreadId(id_2);
53863
+ setActiveThreadId(id_1);
53433
53864
  }
53434
53865
  else if (activeThread && !activeThread.title) {
53435
53866
  setThreads(function (prev) { return __spreadArray([
53436
53867
  __assign(__assign({}, activeThread), { title: 'New Chat', updated_at: now })
53437
53868
  ], __read(prev.filter(function (t) { return t.id !== activeThreadId; })), false); });
53438
53869
  }
53870
+ }, [activeThreadId, activeThread, activeChat]);
53871
+ var _v = useAssistantVoice({
53872
+ status: status,
53873
+ sendMessage: function (message) { return sendMessage(message); },
53874
+ setMessages: setMessages,
53875
+ ensureThread: registerActiveThread,
53876
+ voiceActiveRef: voiceActiveRef,
53877
+ pendingAudioRef: pendingAudioRef,
53878
+ voiceDataRef: voiceDataRef
53879
+ }), voiceState = _v.voiceState, voiceActive = _v.voiceActive, micAvailable = _v.micAvailable, spokenChars = _v.spokenChars, audioDraining = _v.audioDraining, startVoice = _v.startVoice, stopVoice = _v.stopVoice, skipSpeaking = _v.skipSpeaking;
53880
+ // Voice: keep the view pinned to the bottom as the reply reveals during playback
53881
+ useEffect(function () {
53882
+ pinToBottom();
53883
+ }, [spokenChars, audioDraining, pinToBottom]);
53884
+ var handleSend = function () {
53885
+ if (input.trim() && status === 'ready') {
53886
+ registerActiveThread();
53887
+ sendMessage({ text: input });
53888
+ setInput('');
53889
+ }
53890
+ };
53891
+ var handleWorkflowAction = function (action) {
53892
+ if (status !== 'ready')
53893
+ return;
53894
+ registerActiveThread();
53439
53895
  sendMessage({
53440
53896
  parts: [
53441
53897
  { type: 'text', text: action.name },
@@ -53458,6 +53914,20 @@ var AssistantChat = function (_a) {
53458
53914
  // Only show threads that have had at least one message sent
53459
53915
  var visibleThreads = threads.filter(function (t) { return t.title; });
53460
53916
  var isLoading = status === 'submitted' || status === 'streaming';
53917
+ var composerButtonCss = {
53918
+ padding: '10px',
53919
+ backgroundColor: colors.primary,
53920
+ color: 'white',
53921
+ border: 'none',
53922
+ borderRadius: '8px',
53923
+ cursor: 'pointer',
53924
+ display: 'flex',
53925
+ alignItems: 'center',
53926
+ justifyContent: 'center',
53927
+ transition: 'background-color 0.2s',
53928
+ ':hover:not(:disabled)': { backgroundColor: colors.hover },
53929
+ ':disabled': { backgroundColor: colors.disabled, cursor: 'not-allowed' }
53930
+ };
53461
53931
  var layoutSide = mode === 'sidebar-left'
53462
53932
  ? 'left'
53463
53933
  : mode === 'sidebar-right'
@@ -53609,7 +54079,10 @@ var AssistantChat = function (_a) {
53609
54079
  justifyContent: 'center',
53610
54080
  borderRadius: '4px',
53611
54081
  ':hover': { backgroundColor: 'rgba(255, 255, 255, 0.1)' }
53612
- } }, { children: jsx(ModeTriggerIcon, {}) })), jsx("button", __assign({ type: 'button', onClick: function () { return setIsOpen(false); }, css: {
54082
+ } }, { children: jsx(ModeTriggerIcon, {}) })), jsx("button", __assign({ type: 'button', onClick: function () {
54083
+ stopVoice();
54084
+ setIsOpen(false);
54085
+ }, css: {
53613
54086
  background: 'none',
53614
54087
  border: 'none',
53615
54088
  color: 'white',
@@ -53757,9 +54230,10 @@ var AssistantChat = function (_a) {
53757
54230
  fontSize: '14px',
53758
54231
  marginTop: '40px'
53759
54232
  } }, { children: "How can I help?" }))), messages.map(function (message, mIdx) {
54233
+ var _a;
53760
54234
  return message.role === 'user' ? (
53761
- // User message - single bubble
53762
- jsx("div", __assign({ css: {
54235
+ // Show the bubble only once its transcript lands, not as an empty placeholder
54236
+ ((_a = message.parts) !== null && _a !== void 0 ? _a : []).some(function (p) { var _a; return p.type === 'text' && ((_a = p.text) !== null && _a !== void 0 ? _a : '').trim(); }) ? (jsx("div", __assign({ css: {
53763
54237
  display: 'flex',
53764
54238
  justifyContent: 'flex-end'
53765
54239
  } }, { children: jsx("div", __assign({ css: {
@@ -53776,14 +54250,34 @@ var AssistantChat = function (_a) {
53776
54250
  .filter(function (part) { return !part.hidden; })
53777
54251
  .map(function (part, index) {
53778
54252
  return part.type === 'text' ? (jsx("span", { children: part.text }, index)) : null;
53779
- }) })) }), message.id)) : (jsx(Fragment$2, { children: (function () {
54253
+ }) })) }), message.id)) : null) : (jsx(Fragment$2, { children: (function () {
53780
54254
  var isLastMsg = mIdx === messages.length - 1;
53781
54255
  var chunks = mergeAssistantParts(message.parts);
53782
54256
  var lastPart = message.parts[message.parts.length - 1];
53783
54257
  var turnFinished = !isLastMsg ||
53784
54258
  (status === 'ready' && (lastPart === null || lastPart === void 0 ? void 0 : lastPart.type) === 'text');
54259
+ // Voice: reveal parts top-to-bottom, paced by how much audio has played
54260
+ var paceByAudio = voiceActiveRef.current &&
54261
+ isLastMsg &&
54262
+ (isLoading || audioDraining);
54263
+ var revealable = paceByAudio ? spokenChars : Infinity;
54264
+ var blocked = false;
53785
54265
  return chunks.map(function (chunk, chunkIdx) {
54266
+ if (blocked)
54267
+ return null;
53786
54268
  if (chunk.kind === 'text') {
54269
+ // Reveal up to the spoken budget, whitespace is free so the trailing "?" isn't held back
54270
+ var revealLen = 0;
54271
+ while (revealLen < chunk.text.length &&
54272
+ (revealable > 0 || /\s/.test(chunk.text[revealLen]))) {
54273
+ if (!/\s/.test(chunk.text[revealLen]))
54274
+ revealable -= 1;
54275
+ revealLen += 1;
54276
+ }
54277
+ if (revealLen < chunk.text.length)
54278
+ blocked = true;
54279
+ if (revealLen <= 0)
54280
+ return null;
53787
54281
  return (jsx("div", __assign({ css: {
53788
54282
  display: 'flex',
53789
54283
  justifyContent: 'flex-start'
@@ -53797,37 +54291,50 @@ var AssistantChat = function (_a) {
53797
54291
  color: GRAY_800,
53798
54292
  overflowWrap: 'anywhere',
53799
54293
  wordBreak: 'break-word'
53800
- } }, { children: jsx(MarkdownText, { text: chunk.text, isStreaming: isLoading &&
54294
+ } }, { children: jsx(MarkdownText, { text: chunk.text.slice(0, revealLen), isStreaming: isLoading &&
53801
54295
  isLastMsg &&
53802
54296
  chunkIdx === chunks.length - 1 }) })) }), chunk.key));
53803
54297
  }
53804
54298
  var followedByText = chunks
53805
54299
  .slice(chunkIdx + 1)
53806
54300
  .some(function (c) { return c.kind === 'text'; });
54301
+ // Hold the tool's working state until the followup reply's audio begins
54302
+ var audioPending = paceByAudio && followedByText && revealable <= 0;
53807
54303
  return (jsx("div", __assign({ css: {
53808
54304
  display: 'flex',
53809
54305
  justifyContent: 'flex-start',
53810
54306
  maxWidth: '80%',
53811
54307
  minWidth: 0
53812
- } }, { children: jsx(ToolChunk, { rows: chunk.rows, turnFinished: turnFinished, followedByText: followedByText, linkColor: colors.primary, isFirstChunk: chunkIdx === 0 }) }), chunk.key));
54308
+ } }, { children: jsx(ToolChunk, { rows: chunk.rows, turnFinished: turnFinished, followedByText: followedByText, audioPending: audioPending, linkColor: colors.primary, isFirstChunk: chunkIdx === 0 }) }), chunk.key));
53813
54309
  });
53814
54310
  })() }, message.id));
53815
54311
  }), (function () {
54312
+ var _a;
53816
54313
  if (!isLoading)
53817
54314
  return null;
53818
54315
  var last = messages[messages.length - 1];
53819
54316
  if (!last)
53820
54317
  return null;
53821
- if (last.role !== 'user') {
53822
- var parts = last.parts || [];
53823
- var hasContent = parts.some(function (p) {
53824
- var _a;
53825
- if ((p === null || p === void 0 ? void 0 : p.type) === 'text')
53826
- return ((_a = p.text) !== null && _a !== void 0 ? _a : '').trim().length > 0;
53827
- var t = typeof (p === null || p === void 0 ? void 0 : p.type) === 'string' ? p.type : '';
53828
- return t.startsWith('tool-') || t === 'dynamic-tool';
53829
- });
53830
- if (hasContent)
54318
+ var parts = last.parts || [];
54319
+ var isContent = function (p) {
54320
+ var _a;
54321
+ if ((p === null || p === void 0 ? void 0 : p.type) === 'text')
54322
+ return ((_a = p.text) !== null && _a !== void 0 ? _a : '').trim().length > 0;
54323
+ var t = typeof (p === null || p === void 0 ? void 0 : p.type) === 'string' ? p.type : '';
54324
+ return t.startsWith('tool-') || t === 'dynamic-tool';
54325
+ };
54326
+ var hasContent = parts.some(isContent);
54327
+ if (last.role === 'user') {
54328
+ // Wait for the user's (transcribed) message to be visible before showing the indicator
54329
+ if (!hasContent)
54330
+ return null;
54331
+ }
54332
+ else {
54333
+ // Voice: keep the indicator up while a leading reply is held waiting for its audio
54334
+ var held = voiceActiveRef.current &&
54335
+ spokenChars <= 0 &&
54336
+ ((_a = parts.find(isContent)) === null || _a === void 0 ? void 0 : _a.type) === 'text';
54337
+ if (hasContent && !held)
53831
54338
  return null;
53832
54339
  }
53833
54340
  return jsx(ToolChunkPlaceholder, {});
@@ -53837,7 +54344,7 @@ var AssistantChat = function (_a) {
53837
54344
  backgroundColor: '#fef2f2',
53838
54345
  color: '#dc2626',
53839
54346
  fontSize: '14px'
53840
- } }, { children: "Something went wrong. Please try again." }))), jsx("div", { ref: messagesEndRef })] })), workflowActions.length > 0 && (jsxs("div", __assign({ css: {
54347
+ } }, { children: "Something went wrong. Please try again." })))] })), workflowActions.length > 0 && (jsxs("div", __assign({ css: {
53841
54348
  position: 'relative',
53842
54349
  zIndex: 1,
53843
54350
  borderTop: "1px solid ".concat(GRAY_200),
@@ -53888,7 +54395,27 @@ var AssistantChat = function (_a) {
53888
54395
  padding: '12px 16px',
53889
54396
  borderTop: "1px solid ".concat(GRAY_200),
53890
54397
  backgroundColor: GRAY_50
53891
- } }, { children: [jsx("input", { type: 'text', value: input, onChange: function (e) { return setInput(e.target.value); }, onKeyDown: handleKeyDown, placeholder: 'Type a message...', css: {
54398
+ } }, { children: [voiceActive ? (jsxs("button", __assign({ type: 'button', onClick: voiceState === 'speaking' ? skipSpeaking : undefined, css: {
54399
+ flex: 1,
54400
+ display: 'flex',
54401
+ alignItems: 'center',
54402
+ gap: '8px',
54403
+ padding: '10px 14px',
54404
+ border: "1px solid ".concat(GRAY_200),
54405
+ borderRadius: '8px',
54406
+ backgroundColor: 'white',
54407
+ fontSize: '14px',
54408
+ color: GRAY_800,
54409
+ cursor: voiceState === 'speaking' ? 'pointer' : 'default'
54410
+ } }, { children: [jsx(WaveformIcon, { css: { color: colors.primary } }), voiceState === 'loading'
54411
+ ? 'Loading…'
54412
+ : voiceState === 'transcribing'
54413
+ ? 'Transcribing…'
54414
+ : voiceState === 'thinking'
54415
+ ? 'Thinking…'
54416
+ : voiceState === 'speaking'
54417
+ ? 'Tap to skip'
54418
+ : 'Listening…'] }))) : (jsx("input", { type: 'text', value: input, onChange: function (e) { return setInput(e.target.value); }, onKeyDown: handleKeyDown, placeholder: 'Type a message...', css: {
53892
54419
  flex: 1,
53893
54420
  padding: '10px 14px',
53894
54421
  border: "1px solid ".concat(GRAY_200),
@@ -53899,25 +54426,7 @@ var AssistantChat = function (_a) {
53899
54426
  ':focus': {
53900
54427
  borderColor: colors.primary
53901
54428
  }
53902
- } }), jsx("button", __assign({ type: 'button', onClick: handleSend, disabled: isLoading || !input.trim(), css: {
53903
- padding: '10px',
53904
- backgroundColor: colors.primary,
53905
- color: 'white',
53906
- border: 'none',
53907
- borderRadius: '8px',
53908
- cursor: 'pointer',
53909
- display: 'flex',
53910
- alignItems: 'center',
53911
- justifyContent: 'center',
53912
- transition: 'background-color 0.2s',
53913
- ':hover:not(:disabled)': {
53914
- backgroundColor: colors.hover
53915
- },
53916
- ':disabled': {
53917
- backgroundColor: colors.disabled,
53918
- cursor: 'not-allowed'
53919
- }
53920
- } }, { children: jsx(SendIcon, {}) }))] }))] })));
54429
+ } })), voiceActive ? (jsx("button", __assign({ type: 'button', onClick: stopVoice, "aria-label": 'Exit voice mode', css: composerButtonCss }, { children: jsx(CloseIcon, {}) }))) : !voiceEnabled || input.trim() ? (jsx("button", __assign({ type: 'button', onClick: handleSend, disabled: isLoading || !input.trim(), css: composerButtonCss }, { children: jsx(SendIcon, {}) }))) : (jsx("button", __assign({ type: 'button', onClick: startVoice, disabled: isLoading || !micAvailable, "aria-label": 'Start voice mode', title: micAvailable ? undefined : 'Microphone unavailable', css: composerButtonCss }, { children: jsx(MicIcon, {}) })))] }))] })));
53921
54430
  };
53922
54431
 
53923
54432
  var AssistantChat$1 = /*#__PURE__*/Object.freeze({