langgraph-ui-components 0.0.17 → 0.0.18

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 (316) hide show
  1. package/dist/index.es100.js +20 -354
  2. package/dist/index.es100.js.map +1 -1
  3. package/dist/index.es101.js +172 -127
  4. package/dist/index.es101.js.map +1 -1
  5. package/dist/index.es102.js +231 -60
  6. package/dist/index.es102.js.map +1 -1
  7. package/dist/index.es103.js +352 -34
  8. package/dist/index.es103.js.map +1 -1
  9. package/dist/index.es104.js +134 -34
  10. package/dist/index.es104.js.map +1 -1
  11. package/dist/index.es105.js +65 -161
  12. package/dist/index.es105.js.map +1 -1
  13. package/dist/index.es106.js +30 -196
  14. package/dist/index.es106.js.map +1 -1
  15. package/dist/index.es107.js +36 -13
  16. package/dist/index.es107.js.map +1 -1
  17. package/dist/index.es108.js +162 -26
  18. package/dist/index.es108.js.map +1 -1
  19. package/dist/index.es109.js +196 -27
  20. package/dist/index.es109.js.map +1 -1
  21. package/dist/index.es110.js +13 -3156
  22. package/dist/index.es110.js.map +1 -1
  23. package/dist/index.es111.js +27 -34
  24. package/dist/index.es111.js.map +1 -1
  25. package/dist/index.es112.js +34 -5
  26. package/dist/index.es112.js.map +1 -1
  27. package/dist/index.es113.js +3145 -61
  28. package/dist/index.es113.js.map +1 -1
  29. package/dist/index.es114.js +33 -33
  30. package/dist/index.es114.js.map +1 -1
  31. package/dist/index.es115.js +5 -21
  32. package/dist/index.es115.js.map +1 -1
  33. package/dist/index.es116.js +69 -64
  34. package/dist/index.es116.js.map +1 -1
  35. package/dist/index.es117.js +37 -3
  36. package/dist/index.es117.js.map +1 -1
  37. package/dist/index.es12.js +1 -1
  38. package/dist/index.es121.js +9 -9
  39. package/dist/index.es122.js +1 -1
  40. package/dist/index.es126.js +1 -1
  41. package/dist/index.es128.js +2 -2
  42. package/dist/index.es13.js +9 -3
  43. package/dist/index.es13.js.map +1 -1
  44. package/dist/index.es136.js +1 -1
  45. package/dist/index.es137.js +6 -6
  46. package/dist/index.es139.js +1 -1
  47. package/dist/index.es14.js +6 -6
  48. package/dist/index.es140.js +1 -1
  49. package/dist/index.es143.js +1 -1
  50. package/dist/index.es144.js +1 -1
  51. package/dist/index.es145.js +1 -1
  52. package/dist/index.es146.js +1 -1
  53. package/dist/index.es147.js +1 -1
  54. package/dist/index.es148.js +1 -1
  55. package/dist/index.es149.js +1 -1
  56. package/dist/index.es150.js +1 -1
  57. package/dist/index.es151.js +1 -1
  58. package/dist/index.es152.js +1 -1
  59. package/dist/index.es153.js +1 -1
  60. package/dist/index.es154.js +1 -1
  61. package/dist/index.es155.js +1 -1
  62. package/dist/index.es156.js +1 -1
  63. package/dist/index.es157.js +1 -1
  64. package/dist/index.es158.js +1 -1
  65. package/dist/index.es159.js +1 -1
  66. package/dist/index.es16.js +10 -5
  67. package/dist/index.es16.js.map +1 -1
  68. package/dist/index.es160.js +1 -1
  69. package/dist/index.es161.js +1 -1
  70. package/dist/index.es162.js +1 -1
  71. package/dist/index.es163.js +1 -1
  72. package/dist/index.es164.js +1 -1
  73. package/dist/index.es165.js +1 -1
  74. package/dist/index.es166.js +1 -1
  75. package/dist/index.es167.js +1 -1
  76. package/dist/index.es168.js +1 -1
  77. package/dist/index.es169.js +1 -1
  78. package/dist/index.es170.js +1 -1
  79. package/dist/index.es171.js +1 -1
  80. package/dist/index.es172.js +1 -1
  81. package/dist/index.es173.js +1 -1
  82. package/dist/index.es174.js +1 -1
  83. package/dist/index.es175.js +1 -1
  84. package/dist/index.es176.js +1 -1
  85. package/dist/index.es177.js +1 -1
  86. package/dist/index.es178.js +1 -1
  87. package/dist/index.es179.js +1 -1
  88. package/dist/index.es18.js +7 -7
  89. package/dist/index.es180.js +1 -1
  90. package/dist/index.es181.js +1 -1
  91. package/dist/index.es182.js +1 -1
  92. package/dist/index.es183.js +1 -1
  93. package/dist/index.es184.js +1 -1
  94. package/dist/index.es185.js +1 -1
  95. package/dist/index.es186.js +1 -1
  96. package/dist/index.es187.js +1 -1
  97. package/dist/index.es191.js +2 -56
  98. package/dist/index.es191.js.map +1 -1
  99. package/dist/index.es192.js +2 -100
  100. package/dist/index.es192.js.map +1 -1
  101. package/dist/index.es193.js +2 -191
  102. package/dist/index.es193.js.map +1 -1
  103. package/dist/index.es194.js +2 -110
  104. package/dist/index.es194.js.map +1 -1
  105. package/dist/index.es195.js +2 -35
  106. package/dist/index.es195.js.map +1 -1
  107. package/dist/index.es196.js +2 -10
  108. package/dist/index.es196.js.map +1 -1
  109. package/dist/index.es197.js +2 -11
  110. package/dist/index.es197.js.map +1 -1
  111. package/dist/index.es198.js +2 -12
  112. package/dist/index.es198.js.map +1 -1
  113. package/dist/index.es199.js +2 -91
  114. package/dist/index.es199.js.map +1 -1
  115. package/dist/index.es2.js +96 -11
  116. package/dist/index.es2.js.map +1 -1
  117. package/dist/index.es20.js +2 -2
  118. package/dist/index.es200.js +2 -275
  119. package/dist/index.es200.js.map +1 -1
  120. package/dist/index.es201.js +2 -2
  121. package/dist/index.es202.js +2 -164
  122. package/dist/index.es202.js.map +1 -1
  123. package/dist/index.es203.js +2 -51
  124. package/dist/index.es203.js.map +1 -1
  125. package/dist/index.es204.js +2 -40
  126. package/dist/index.es204.js.map +1 -1
  127. package/dist/index.es205.js +2 -35
  128. package/dist/index.es205.js.map +1 -1
  129. package/dist/index.es206.js +2 -40
  130. package/dist/index.es206.js.map +1 -1
  131. package/dist/index.es207.js +2 -24
  132. package/dist/index.es207.js.map +1 -1
  133. package/dist/index.es208.js +2 -591
  134. package/dist/index.es208.js.map +1 -1
  135. package/dist/index.es209.js +2 -125
  136. package/dist/index.es209.js.map +1 -1
  137. package/dist/index.es210.js +2 -164
  138. package/dist/index.es210.js.map +1 -1
  139. package/dist/index.es211.js +2 -2
  140. package/dist/index.es212.js +2 -2
  141. package/dist/index.es213.js +2 -2
  142. package/dist/index.es214.js +2 -2
  143. package/dist/index.es215.js +2 -2
  144. package/dist/index.es216.js +2 -2
  145. package/dist/index.es217.js +2 -2
  146. package/dist/index.es218.js +2 -2
  147. package/dist/index.es219.js +2 -2
  148. package/dist/index.es22.js +35 -119
  149. package/dist/index.es22.js.map +1 -1
  150. package/dist/index.es220.js +2 -2
  151. package/dist/index.es221.js +2 -2
  152. package/dist/index.es222.js +2 -2
  153. package/dist/index.es223.js +2 -2
  154. package/dist/index.es224.js +2 -2
  155. package/dist/index.es225.js +2 -2
  156. package/dist/index.es226.js +2 -2
  157. package/dist/index.es227.js +2 -2
  158. package/dist/index.es228.js +2 -2
  159. package/dist/index.es229.js +2 -2
  160. package/dist/index.es23.js +66 -36
  161. package/dist/index.es23.js.map +1 -1
  162. package/dist/index.es230.js +2 -2
  163. package/dist/index.es231.js +2 -2
  164. package/dist/index.es232.js +2 -2
  165. package/dist/index.es233.js +2 -2
  166. package/dist/index.es234.js +2 -2
  167. package/dist/index.es235.js +2 -2
  168. package/dist/index.es236.js +56 -2
  169. package/dist/index.es236.js.map +1 -1
  170. package/dist/index.es237.js +100 -2
  171. package/dist/index.es237.js.map +1 -1
  172. package/dist/index.es238.js +191 -2
  173. package/dist/index.es238.js.map +1 -1
  174. package/dist/index.es239.js +110 -2
  175. package/dist/index.es239.js.map +1 -1
  176. package/dist/index.es24.js +30 -64
  177. package/dist/index.es24.js.map +1 -1
  178. package/dist/index.es240.js +35 -2
  179. package/dist/index.es240.js.map +1 -1
  180. package/dist/index.es241.js +10 -2
  181. package/dist/index.es241.js.map +1 -1
  182. package/dist/index.es242.js +11 -2
  183. package/dist/index.es242.js.map +1 -1
  184. package/dist/index.es243.js +12 -2
  185. package/dist/index.es243.js.map +1 -1
  186. package/dist/index.es244.js +91 -2
  187. package/dist/index.es244.js.map +1 -1
  188. package/dist/index.es245.js +275 -2
  189. package/dist/index.es245.js.map +1 -1
  190. package/dist/index.es246.js +2 -2
  191. package/dist/index.es247.js +164 -2
  192. package/dist/index.es247.js.map +1 -1
  193. package/dist/index.es248.js +51 -2
  194. package/dist/index.es248.js.map +1 -1
  195. package/dist/index.es249.js +40 -2
  196. package/dist/index.es249.js.map +1 -1
  197. package/dist/index.es25.js +120 -29
  198. package/dist/index.es25.js.map +1 -1
  199. package/dist/index.es250.js +35 -2
  200. package/dist/index.es250.js.map +1 -1
  201. package/dist/index.es251.js +40 -2
  202. package/dist/index.es251.js.map +1 -1
  203. package/dist/index.es252.js +24 -2
  204. package/dist/index.es252.js.map +1 -1
  205. package/dist/index.es253.js +591 -2
  206. package/dist/index.es253.js.map +1 -1
  207. package/dist/index.es254.js +125 -2
  208. package/dist/index.es254.js.map +1 -1
  209. package/dist/index.es255.js +164 -2
  210. package/dist/index.es255.js.map +1 -1
  211. package/dist/index.es256.js +2 -2
  212. package/dist/index.es26.js +102 -123
  213. package/dist/index.es26.js.map +1 -1
  214. package/dist/index.es267.js +1 -1
  215. package/dist/index.es27.js +66 -101
  216. package/dist/index.es27.js.map +1 -1
  217. package/dist/index.es28.js +139 -66
  218. package/dist/index.es28.js.map +1 -1
  219. package/dist/index.es29.js +295 -131
  220. package/dist/index.es29.js.map +1 -1
  221. package/dist/index.es30.js +114 -298
  222. package/dist/index.es30.js.map +1 -1
  223. package/dist/index.es305.js +1 -1
  224. package/dist/index.es307.js +1 -1
  225. package/dist/index.es319.js +1 -1
  226. package/dist/index.es32.js +7 -7
  227. package/dist/index.es33.js +1 -1
  228. package/dist/index.es339.js +2 -2
  229. package/dist/index.es36.js +4 -4
  230. package/dist/index.es37.js +289 -114
  231. package/dist/index.es37.js.map +1 -1
  232. package/dist/index.es38.js +44 -70
  233. package/dist/index.es38.js.map +1 -1
  234. package/dist/index.es39.js +145 -19
  235. package/dist/index.es39.js.map +1 -1
  236. package/dist/index.es40.js +5 -261
  237. package/dist/index.es40.js.map +1 -1
  238. package/dist/index.es41.js +247 -38
  239. package/dist/index.es41.js.map +1 -1
  240. package/dist/index.es42.js +110 -207
  241. package/dist/index.es42.js.map +1 -1
  242. package/dist/index.es43.js +68 -64
  243. package/dist/index.es43.js.map +1 -1
  244. package/dist/index.es44.js +17 -141
  245. package/dist/index.es44.js.map +1 -1
  246. package/dist/index.es45.js +251 -14
  247. package/dist/index.es45.js.map +1 -1
  248. package/dist/index.es46.js +36 -223
  249. package/dist/index.es46.js.map +1 -1
  250. package/dist/index.es47.js +213 -7
  251. package/dist/index.es47.js.map +1 -1
  252. package/dist/index.es48.js +55 -1180
  253. package/dist/index.es48.js.map +1 -1
  254. package/dist/index.es49.js +141 -6
  255. package/dist/index.es49.js.map +1 -1
  256. package/dist/index.es50.js +21 -144
  257. package/dist/index.es50.js.map +1 -1
  258. package/dist/index.es51.js +230 -5
  259. package/dist/index.es51.js.map +1 -1
  260. package/dist/index.es52.js +8 -292
  261. package/dist/index.es52.js.map +1 -1
  262. package/dist/index.es53.js +1190 -43
  263. package/dist/index.es53.js.map +1 -1
  264. package/dist/index.es54.js +7 -144
  265. package/dist/index.es54.js.map +1 -1
  266. package/dist/index.es55.js +136 -241
  267. package/dist/index.es55.js.map +1 -1
  268. package/dist/index.es59.js +1 -1
  269. package/dist/index.es6.js +21 -8
  270. package/dist/index.es6.js.map +1 -1
  271. package/dist/index.es60.js +1 -1
  272. package/dist/index.es61.js +1 -1
  273. package/dist/index.es62.js +7 -7
  274. package/dist/index.es67.js +3 -3
  275. package/dist/index.es69.js +2 -2
  276. package/dist/index.es70.js +1 -1
  277. package/dist/index.es71.js +1 -1
  278. package/dist/index.es72.js +1 -1
  279. package/dist/index.es77.js +7 -7
  280. package/dist/index.es78.js +17 -17
  281. package/dist/index.es82.js +1 -1
  282. package/dist/index.es83.js +4 -4
  283. package/dist/index.es84.js +20 -11
  284. package/dist/index.es84.js.map +1 -1
  285. package/dist/index.es85.js +66 -38
  286. package/dist/index.es85.js.map +1 -1
  287. package/dist/index.es86.js +3 -34
  288. package/dist/index.es86.js.map +1 -1
  289. package/dist/index.es87.js +10 -230
  290. package/dist/index.es87.js.map +1 -1
  291. package/dist/index.es88.js +39 -29
  292. package/dist/index.es88.js.map +1 -1
  293. package/dist/index.es89.js +32 -73
  294. package/dist/index.es89.js.map +1 -1
  295. package/dist/index.es90.js +200 -44
  296. package/dist/index.es90.js.map +1 -1
  297. package/dist/index.es91.js +15 -37
  298. package/dist/index.es91.js.map +1 -1
  299. package/dist/index.es92.js +71 -26
  300. package/dist/index.es92.js.map +1 -1
  301. package/dist/index.es93.js +72 -39
  302. package/dist/index.es93.js.map +1 -1
  303. package/dist/index.es94.js +48 -53
  304. package/dist/index.es94.js.map +1 -1
  305. package/dist/index.es95.js +30 -13
  306. package/dist/index.es95.js.map +1 -1
  307. package/dist/index.es96.js +40 -134
  308. package/dist/index.es96.js.map +1 -1
  309. package/dist/index.es97.js +56 -20
  310. package/dist/index.es97.js.map +1 -1
  311. package/dist/index.es98.js +11 -180
  312. package/dist/index.es98.js.map +1 -1
  313. package/dist/index.es99.js +129 -233
  314. package/dist/index.es99.js.map +1 -1
  315. package/dist/styles.css +1 -1
  316. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.es26.js","sources":["../src/components/messages/HumanMessage.tsx"],"sourcesContent":["import { useStreamContext } from \"@/providers/Stream\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport { Copy, FileIcon, Pencil, Send, X } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nfunction HumanMessage({ message }: { message: Message }) {\n const [isEditing, setIsEditing] = useState(false);\n const [editedText, setEditedText] = useState(\"\");\n const thread = useStreamContext();\n const meta = thread.getMessagesMetadata(message);\n const parentCheckpoint = meta?.firstSeenState?.parent_checkpoint;\n\n // Extract text and documents from content\n const content = message.content;\n let textContent = \"\";\n let documents: any[] = [];\n\n if (typeof content === \"string\") {\n textContent = content;\n } else if (Array.isArray(content)) {\n textContent = content\n .filter((c: any) => c.type === \"text\")\n .map((c: any) => (c.type === \"text\" ? c.text : \"\"))\n .join(\"\");\n documents = content.filter((c: any) => c.type === \"document\") ?? [];\n }\n\n const handleSubmitEdit = () => {\n // Validate that edited text is not empty\n if (!editedText.trim()) {\n return;\n }\n\n setIsEditing(false);\n // console.log(\"Send edited message:\", editedText);\n\n const newMessage: Message = { type: \"human\", content: editedText };\n thread.submit(\n { messages: [newMessage] },\n {\n checkpoint: parentCheckpoint,\n streamMode: [\"values\"],\n streamSubgraphs: true,\n streamResumable: true,\n optimisticValues: (prev) => {\n const values = meta?.firstSeenState?.values;\n if (!values) return prev;\n\n return {\n ...values,\n messages: [...(values.messages ?? []), newMessage],\n };\n },\n },\n );\n };\n\n return (\n <div className=\"flex flex-col gap-1 w-full group my-1\">\n <div className=\"flex flex-1 flex-col gap-2 items-end min-w-0 mr-4\">\n\n {documents.length > 0 && (\n <div className=\"flex flex-col gap-2 max-w-[90%]\">\n {documents.map((doc, idx) => (\n <div\n key={`${message.id}-doc-${idx}`}\n className=\"flex items-center gap-3 bg-gradient-to-br from-zinc-800/90 to-zinc-900/90 backdrop-blur-sm px-4 py-1 rounded-xl border border-zinc-700/50 shadow-md hover:border-blue-500/40 hover:shadow-lg hover:shadow-blue-500/10 transition-all duration-200 cursor-pointer group/file\"\n >\n <div className=\"p-1.5 bg-blue-500/10 rounded-lg border border-blue-500/20 group-hover/file:bg-blue-500/20 transition-colors\">\n <FileIcon size={16} className=\"text-blue-400 shrink-0\" />\n </div>\n <span className=\"text-sm text-zinc-200 truncate font-medium\">\n {doc.source?.filename || `Document ${idx + 1}`}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {textContent && (\n <div className=\"flex items-start gap-2\">\n {!isEditing && (\n <div className=\"flex items-center gap-4 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pt-4\">\n <Pencil\n size={16}\n className=\"text-zinc-500 cursor-pointer hover:text-white\"\n onClick={() => {\n setIsEditing(true);\n setEditedText(textContent);\n }}\n />\n <Copy\n size={16}\n className=\"text-zinc-500 cursor-pointer hover:text-white\"\n onClick={() => {\n navigator.clipboard.writeText(textContent);\n }}\n />\n </div>\n )}\n <div className=\"relative flex-1\">\n {isEditing ? (\n <div className=\"flex flex-col gap-2 w-full\">\n <textarea\n value={editedText}\n onChange={(e) => setEditedText(e.target.value)}\n onKeyDown={(e)=>{\n if(e.key === \"Enter\"){\n e.preventDefault();\n handleSubmitEdit();\n }\n }}\n className=\"text-[15px] font-normal leading-relaxed rounded-2xl px-5 bg-zinc-900 border border-zinc-800 text-white shadow-lg break-words overflow-wrap-anywhere resize-none focus:outline-none min-h-[60px]\"\n autoFocus\n />\n <div className=\"flex items-center justify-end gap-2\">\n <button\n onClick={() => {\n setIsEditing(false);\n setEditedText(\"\");\n }}\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-zinc-800 hover:bg-zinc-700 text-zinc-300 text-sm transition-colors\"\n >\n <X size={16} />\n </button>\n <button\n onClick={handleSubmitEdit}\n disabled={!editedText.trim()}\n className=\"flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-white text-black text-sm transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <Send size={16} />\n </button>\n </div>\n </div>\n ) : (\n <div className=\"text-[15px] font-normal leading-relaxed rounded-xl py-2 px-4 bg-[#242322] text-white shadow-lg max-w-full break-words overflow-wrap-anywhere \">\n {textContent}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// Memoize with deep comparison on message ID\nexport default React.memo(HumanMessage, (prevProps, nextProps) => {\n return prevProps.message.id === nextProps.message.id;\n});\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"index.es26.js","sources":["../src/components/Thinking.tsx"],"sourcesContent":["export default function Thinking() {\n return (\n <>\n <style>{`\n .loader-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n color: white;\n user-select: none;\n gap: 10px;\n }\n\n .loader {\n width: 20px;\n height: 20px;\n aspect-ratio: 1 / 1;\n border-radius: 50%;\n background-color: transparent;\n animation: loader-rotate 1.5s linear infinite;\n z-index: 0;\n }\n\n @keyframes loader-rotate {\n 0% {\n transform: rotate(90deg);\n box-shadow:\n 0 1px 1px 0 #fff inset,\n 0 3px 5px 0 #ff5f9f inset,\n 0 4px 4px 0 #0693ff inset;\n }\n 50% {\n transform: rotate(270deg);\n background: #7c0911;\n box-shadow:\n 0 1px 1px 0 #fff inset,\n 0 3px 5px 0 #d60a47 inset,\n 0 4px 4px 0 #fbef19 inset;\n }\n 100% {\n transform: rotate(450deg);\n box-shadow:\n 0 1px 1px 0 #fff inset,\n 0 3px 5px 0 #ff5f9f inset,\n 0 4px 4px 0 #28a9ff inset;\n }\n }\n\n .letter-wrapper {\n display: flex;\n gap: 1px;\n }\n\n .loader-letter {\n display: inline-block;\n opacity: 0.4;\n transform: translateY(0);\n animation: loader-letter-anim 2s infinite;\n z-index: 1;\n border-radius: 50ch;\n border: none;\n }\n\n .loader-letter:nth-child(1) { animation-delay: 0s; }\n .loader-letter:nth-child(2) { animation-delay: 0.1s; }\n .loader-letter:nth-child(3) { animation-delay: 0.2s; }\n .loader-letter:nth-child(4) { animation-delay: 0.3s; }\n .loader-letter:nth-child(5) { animation-delay: 0.4s; }\n .loader-letter:nth-child(6) { animation-delay: 0.5s; }\n .loader-letter:nth-child(7) { animation-delay: 0.6s; }\n .loader-letter:nth-child(8) { animation-delay: 0.7s; }\n\n @keyframes loader-letter-anim {\n 0%, 100% {\n opacity: 0.4;\n transform: translateY(0);\n }\n 20% {\n opacity: 1;\n transform: scale(1.15);\n }\n 40% {\n opacity: 0.7;\n transform: translateY(0);\n }\n }\n `}</style>\n <div className=\"loader-wrapper\">\n <div className=\"loader\"></div>\n <div className=\"letter-wrapper\">\n <span className=\"loader-letter\">T</span>\n <span className=\"loader-letter\">h</span>\n <span className=\"loader-letter\">i</span>\n <span className=\"loader-letter\">n</span>\n <span className=\"loader-letter\">k</span>\n <span className=\"loader-letter\">i</span>\n <span className=\"loader-letter\">n</span>\n <span className=\"loader-letter\">g</span>\n </div>\n </div>\n </>\n )\n}\n"],"names":[],"mappings":";AAAA,SAAwB,WAAW;AAC/B,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAO,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAoFN;AAAA,IACF,qBAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,MACxB,qBAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,IAAA,CAAC;AAAA,MAAA,EAAA,CACrC;AAAA,IAAA,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;"}
@@ -1,4 +1,4 @@
1
- import { getEnvironmentVariable } from "./index.es191.js";
1
+ import { getEnvironmentVariable } from "./index.es236.js";
2
2
  import { Client } from "./index.es285.js";
3
3
  import "./index.es125.js";
4
4
  import "uuid";
@@ -1,107 +1,72 @@
1
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
- function Thinking() {
3
- return /* @__PURE__ */ jsxs(Fragment, { children: [
4
- /* @__PURE__ */ jsx("style", { children: `
5
- .loader-wrapper {
6
- position: relative;
7
- display: flex;
8
- align-items: center;
9
- justify-content: flex-start;
10
- color: white;
11
- user-select: none;
12
- gap: 10px;
13
- }
14
-
15
- .loader {
16
- width: 20px;
17
- height: 20px;
18
- aspect-ratio: 1 / 1;
19
- border-radius: 50%;
20
- background-color: transparent;
21
- animation: loader-rotate 1.5s linear infinite;
22
- z-index: 0;
23
- }
24
-
25
- @keyframes loader-rotate {
26
- 0% {
27
- transform: rotate(90deg);
28
- box-shadow:
29
- 0 1px 1px 0 #fff inset,
30
- 0 3px 5px 0 #ff5f9f inset,
31
- 0 4px 4px 0 #0693ff inset;
32
- }
33
- 50% {
34
- transform: rotate(270deg);
35
- background: #7c0911;
36
- box-shadow:
37
- 0 1px 1px 0 #fff inset,
38
- 0 3px 5px 0 #d60a47 inset,
39
- 0 4px 4px 0 #fbef19 inset;
40
- }
41
- 100% {
42
- transform: rotate(450deg);
43
- box-shadow:
44
- 0 1px 1px 0 #fff inset,
45
- 0 3px 5px 0 #ff5f9f inset,
46
- 0 4px 4px 0 #28a9ff inset;
47
- }
48
- }
49
-
50
- .letter-wrapper {
51
- display: flex;
52
- gap: 1px;
53
- }
54
-
55
- .loader-letter {
56
- display: inline-block;
57
- opacity: 0.4;
58
- transform: translateY(0);
59
- animation: loader-letter-anim 2s infinite;
60
- z-index: 1;
61
- border-radius: 50ch;
62
- border: none;
63
- }
64
-
65
- .loader-letter:nth-child(1) { animation-delay: 0s; }
66
- .loader-letter:nth-child(2) { animation-delay: 0.1s; }
67
- .loader-letter:nth-child(3) { animation-delay: 0.2s; }
68
- .loader-letter:nth-child(4) { animation-delay: 0.3s; }
69
- .loader-letter:nth-child(5) { animation-delay: 0.4s; }
70
- .loader-letter:nth-child(6) { animation-delay: 0.5s; }
71
- .loader-letter:nth-child(7) { animation-delay: 0.6s; }
72
- .loader-letter:nth-child(8) { animation-delay: 0.7s; }
73
-
74
- @keyframes loader-letter-anim {
75
- 0%, 100% {
76
- opacity: 0.4;
77
- transform: translateY(0);
78
- }
79
- 20% {
80
- opacity: 1;
81
- transform: scale(1.15);
82
- }
83
- 40% {
84
- opacity: 0.7;
85
- transform: translateY(0);
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { getContentString } from "./index.es22.js";
3
+ import React__default, { useState } from "react";
4
+ function ToolCallFunctions({ title, toolMessages }) {
5
+ const [open, setOpen] = useState(false);
6
+ if (!toolMessages || toolMessages.length === 0) return null;
7
+ return /* @__PURE__ */ jsxs(
8
+ "div",
9
+ {
10
+ id: "accordion-collapse",
11
+ "data-accordion": "collapse",
12
+ className: "w-full rounded-base overflow-hidden shadow-xs border rounded-xl border-zinc-800 max-w-[90%] min-w-25",
13
+ children: [
14
+ /* @__PURE__ */ jsx("h2", { id: "accordion-collapse-heading-1", children: /* @__PURE__ */ jsxs(
15
+ "button",
16
+ {
17
+ type: "button",
18
+ className: "flex items-center justify-between w-full p-2 font-medium gap-3 text-body border-0 outline-none ring-0 appearance-none bg-transparent",
19
+ onClick: () => setOpen((v) => !v),
20
+ "aria-expanded": open,
21
+ "aria-controls": "accordion-collapse-body-1",
22
+ children: [
23
+ /* @__PURE__ */ jsxs("span", { children: [
24
+ "🔷 ",
25
+ title
26
+ ] }),
27
+ /* @__PURE__ */ jsx(
28
+ "svg",
29
+ {
30
+ "data-accordion-icon": true,
31
+ className: `w-5 h-5 shrink-0 transition-transform ${open ? "rotate-0" : "rotate-180"}`,
32
+ "aria-hidden": "true",
33
+ xmlns: "http://www.w3.org/2000/svg",
34
+ width: "24",
35
+ height: "24",
36
+ fill: "none",
37
+ viewBox: "0 0 24 24",
38
+ children: /* @__PURE__ */ jsx(
39
+ "path",
40
+ {
41
+ stroke: "currentColor",
42
+ strokeLinecap: "round",
43
+ strokeLinejoin: "round",
44
+ strokeWidth: "2",
45
+ d: "m5 15 7-7 7 7"
86
46
  }
47
+ )
87
48
  }
88
- ` }),
89
- /* @__PURE__ */ jsxs("div", { className: "loader-wrapper", children: [
90
- /* @__PURE__ */ jsx("div", { className: "loader" }),
91
- /* @__PURE__ */ jsxs("div", { className: "letter-wrapper", children: [
92
- /* @__PURE__ */ jsx("span", { className: "loader-letter", children: "T" }),
93
- /* @__PURE__ */ jsx("span", { className: "loader-letter", children: "h" }),
94
- /* @__PURE__ */ jsx("span", { className: "loader-letter", children: "i" }),
95
- /* @__PURE__ */ jsx("span", { className: "loader-letter", children: "n" }),
96
- /* @__PURE__ */ jsx("span", { className: "loader-letter", children: "k" }),
97
- /* @__PURE__ */ jsx("span", { className: "loader-letter", children: "i" }),
98
- /* @__PURE__ */ jsx("span", { className: "loader-letter", children: "n" }),
99
- /* @__PURE__ */ jsx("span", { className: "loader-letter", children: "g" })
100
- ] })
101
- ] })
102
- ] });
49
+ )
50
+ ]
51
+ }
52
+ ) }),
53
+ /* @__PURE__ */ jsx(
54
+ "div",
55
+ {
56
+ id: "accordion-collapse-body-1",
57
+ className: `${open ? "" : "hidden"}`,
58
+ "aria-labelledby": "accordion-collapse-heading-1",
59
+ children: /* @__PURE__ */ jsx("div", { className: "md:p-5 text-left space-y-3", children: toolMessages.map((toolMsg) => /* @__PURE__ */ jsx("div", { className: "border-zinc-700", children: /* @__PURE__ */ jsx("p", { className: "text-body text-sm", children: toolMsg.content ? getContentString(toolMsg.content) : "" }) }, toolMsg.id)) })
60
+ }
61
+ )
62
+ ]
63
+ }
64
+ );
103
65
  }
66
+ const ToolCallFunctions$1 = React__default.memo(ToolCallFunctions, (prevProps, nextProps) => {
67
+ return prevProps.toolMessages?.length === nextProps.toolMessages?.length;
68
+ });
104
69
  export {
105
- Thinking as default
70
+ ToolCallFunctions$1 as default
106
71
  };
107
72
  //# sourceMappingURL=index.es27.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es27.js","sources":["../src/components/Thinking.tsx"],"sourcesContent":["export default function Thinking() {\n return (\n <>\n <style>{`\n .loader-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n color: white;\n user-select: none;\n gap: 10px;\n }\n\n .loader {\n width: 20px;\n height: 20px;\n aspect-ratio: 1 / 1;\n border-radius: 50%;\n background-color: transparent;\n animation: loader-rotate 1.5s linear infinite;\n z-index: 0;\n }\n\n @keyframes loader-rotate {\n 0% {\n transform: rotate(90deg);\n box-shadow:\n 0 1px 1px 0 #fff inset,\n 0 3px 5px 0 #ff5f9f inset,\n 0 4px 4px 0 #0693ff inset;\n }\n 50% {\n transform: rotate(270deg);\n background: #7c0911;\n box-shadow:\n 0 1px 1px 0 #fff inset,\n 0 3px 5px 0 #d60a47 inset,\n 0 4px 4px 0 #fbef19 inset;\n }\n 100% {\n transform: rotate(450deg);\n box-shadow:\n 0 1px 1px 0 #fff inset,\n 0 3px 5px 0 #ff5f9f inset,\n 0 4px 4px 0 #28a9ff inset;\n }\n }\n\n .letter-wrapper {\n display: flex;\n gap: 1px;\n }\n\n .loader-letter {\n display: inline-block;\n opacity: 0.4;\n transform: translateY(0);\n animation: loader-letter-anim 2s infinite;\n z-index: 1;\n border-radius: 50ch;\n border: none;\n }\n\n .loader-letter:nth-child(1) { animation-delay: 0s; }\n .loader-letter:nth-child(2) { animation-delay: 0.1s; }\n .loader-letter:nth-child(3) { animation-delay: 0.2s; }\n .loader-letter:nth-child(4) { animation-delay: 0.3s; }\n .loader-letter:nth-child(5) { animation-delay: 0.4s; }\n .loader-letter:nth-child(6) { animation-delay: 0.5s; }\n .loader-letter:nth-child(7) { animation-delay: 0.6s; }\n .loader-letter:nth-child(8) { animation-delay: 0.7s; }\n\n @keyframes loader-letter-anim {\n 0%, 100% {\n opacity: 0.4;\n transform: translateY(0);\n }\n 20% {\n opacity: 1;\n transform: scale(1.15);\n }\n 40% {\n opacity: 0.7;\n transform: translateY(0);\n }\n }\n `}</style>\n <div className=\"loader-wrapper\">\n <div className=\"loader\"></div>\n <div className=\"letter-wrapper\">\n <span className=\"loader-letter\">T</span>\n <span className=\"loader-letter\">h</span>\n <span className=\"loader-letter\">i</span>\n <span className=\"loader-letter\">n</span>\n <span className=\"loader-letter\">k</span>\n <span className=\"loader-letter\">i</span>\n <span className=\"loader-letter\">n</span>\n <span className=\"loader-letter\">g</span>\n </div>\n </div>\n </>\n )\n}\n"],"names":[],"mappings":";AAAA,SAAwB,WAAW;AAC/B,SACI,qBAAA,UAAA,EACI,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAO,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAoFN;AAAA,IACF,qBAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,MAAA,oBAAC,OAAA,EAAI,WAAU,SAAA,CAAS;AAAA,MACxB,qBAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,KAAC;AAAA,QACjC,oBAAC,QAAA,EAAK,WAAU,iBAAgB,UAAA,IAAA,CAAC;AAAA,MAAA,EAAA,CACrC;AAAA,IAAA,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;"}
1
+ {"version":3,"file":"index.es27.js","sources":["../src/components/ToolCallFunctions.tsx"],"sourcesContent":["import { getContentString } from \"@/utils/utils\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport React, { useState } from \"react\";\n\nfunction ToolCallFunctions({ title, toolMessages }: {\n title?: string;\n toolMessages: Message[];\n}) {\n const [open, setOpen] = useState(false);\n\n // Only render if there are tool messages\n if (!toolMessages || toolMessages.length === 0) return null;\n\n return (\n <div\n id=\"accordion-collapse\"\n data-accordion=\"collapse\"\n className=\"w-full rounded-base overflow-hidden shadow-xs border rounded-xl border-zinc-800 max-w-[90%] min-w-25\"\n >\n <h2 id=\"accordion-collapse-heading-1\">\n <button\n type=\"button\"\n className=\"flex items-center justify-between w-full p-2 font-medium gap-3 text-body border-0 outline-none ring-0 appearance-none bg-transparent\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n aria-controls=\"accordion-collapse-body-1\"\n >\n <span>🔷 {title}</span>\n <svg\n data-accordion-icon\n className={`w-5 h-5 shrink-0 transition-transform ${open ? \"rotate-0\" : \"rotate-180\"\n }`}\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"m5 15 7-7 7 7\"\n />\n </svg>\n </button>\n </h2>\n <div\n id=\"accordion-collapse-body-1\"\n className={`${open ? \"\" : \"hidden\"}`}\n aria-labelledby=\"accordion-collapse-heading-1\"\n >\n <div className=\"md:p-5 text-left space-y-3\">\n {toolMessages.map((toolMsg) => (\n <div key={toolMsg.id} className=\"border-zinc-700\">\n <p className=\"text-body text-sm\">{toolMsg.content ? getContentString(toolMsg.content) : \"\"}</p>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nexport default React.memo(ToolCallFunctions, (prevProps, nextProps) => {\n return prevProps.toolMessages?.length === nextProps.toolMessages?.length;\n});"],"names":["React"],"mappings":";;;AAIA,SAAS,kBAAkB,EAAE,OAAO,gBAGjC;AACD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAGtC,MAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO;AAEvD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,kBAAe;AAAA,MACf,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAG,IAAG,gCACL,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,YAChC,iBAAe;AAAA,YACf,iBAAc;AAAA,YAEd,UAAA;AAAA,cAAA,qBAAC,QAAA,EAAK,UAAA;AAAA,gBAAA;AAAA,gBAAI;AAAA,cAAA,GAAM;AAAA,cAChB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,uBAAmB;AAAA,kBACnB,WAAW,yCAAyC,OAAO,aAAa,YACtE;AAAA,kBACF,eAAY;AAAA,kBACZ,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,MAAK;AAAA,kBACL,SAAQ;AAAA,kBAER,UAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,QAAO;AAAA,sBACP,eAAc;AAAA,sBACd,gBAAe;AAAA,sBACf,aAAY;AAAA,sBACZ,GAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACJ;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA,GAEJ;AAAA,QACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAW,GAAG,OAAO,KAAK,QAAQ;AAAA,YAClC,mBAAgB;AAAA,YAEhB,UAAA,oBAAC,OAAA,EAAI,WAAU,8BACZ,UAAA,aAAa,IAAI,CAAC,YACjB,oBAAC,OAAA,EAAqB,WAAU,mBAC9B,UAAA,oBAAC,KAAA,EAAE,WAAU,qBAAqB,UAAA,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,IAAI,GAAA,CAAG,EAAA,GADnF,QAAQ,EAElB,CACD,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAA,sBAAeA,eAAM,KAAK,mBAAmB,CAAC,WAAW,cAAc;AACrE,SAAO,UAAU,cAAc,WAAW,UAAU,cAAc;AACpE,CAAC;"}
@@ -1,72 +1,145 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { getContentString } from "./index.es23.js";
3
- import React__default, { useState } from "react";
4
- function ToolCallFunctions({ title, toolMessages }) {
5
- const [open, setOpen] = useState(false);
6
- if (!toolMessages || toolMessages.length === 0) return null;
7
- return /* @__PURE__ */ jsxs(
8
- "div",
9
- {
10
- id: "accordion-collapse",
11
- "data-accordion": "collapse",
12
- className: "w-full rounded-base overflow-hidden shadow-xs border rounded-xl border-zinc-800 max-w-[90%] min-w-25",
13
- children: [
14
- /* @__PURE__ */ jsx("h2", { id: "accordion-collapse-heading-1", children: /* @__PURE__ */ jsxs(
15
- "button",
16
- {
17
- type: "button",
18
- className: "flex items-center justify-between w-full p-2 font-medium gap-3 text-body border-0 outline-none ring-0 appearance-none bg-transparent",
19
- onClick: () => setOpen((v) => !v),
20
- "aria-expanded": open,
21
- "aria-controls": "accordion-collapse-body-1",
22
- children: [
23
- /* @__PURE__ */ jsxs("span", { children: [
24
- "🔷 ",
25
- title
26
- ] }),
27
- /* @__PURE__ */ jsx(
28
- "svg",
29
- {
30
- "data-accordion-icon": true,
31
- className: `w-5 h-5 shrink-0 transition-transform ${open ? "rotate-0" : "rotate-180"}`,
32
- "aria-hidden": "true",
33
- xmlns: "http://www.w3.org/2000/svg",
34
- width: "24",
35
- height: "24",
36
- fill: "none",
37
- viewBox: "0 0 24 24",
38
- children: /* @__PURE__ */ jsx(
39
- "path",
40
- {
41
- stroke: "currentColor",
42
- strokeLinecap: "round",
43
- strokeLinejoin: "round",
44
- strokeWidth: "2",
45
- d: "m5 15 7-7 7 7"
46
- }
47
- )
48
- }
49
- )
50
- ]
51
- }
52
- ) }),
53
- /* @__PURE__ */ jsx(
54
- "div",
55
- {
56
- id: "accordion-collapse-body-1",
57
- className: `${open ? "" : "hidden"}`,
58
- "aria-labelledby": "accordion-collapse-heading-1",
59
- children: /* @__PURE__ */ jsx("div", { className: "md:p-5 text-left space-y-3", children: toolMessages.map((toolMsg) => /* @__PURE__ */ jsx("div", { className: "border-zinc-700", children: /* @__PURE__ */ jsx("p", { className: "text-body text-sm", children: toolMsg.content ? getContentString(toolMsg.content) : "" }) }, toolMsg.id)) })
1
+ import { useState, useRef, useCallback } from "react";
2
+ import { webmFixDuration } from "./index.es41.js";
3
+ import { useChatRuntime } from "./index.es5.js";
4
+ function getMimeType() {
5
+ const types = [
6
+ "audio/webm",
7
+ "audio/mp4",
8
+ "audio/ogg",
9
+ "audio/wav",
10
+ "audio/aac"
11
+ ];
12
+ for (let i = 0; i < types.length; i++) {
13
+ if (MediaRecorder.isTypeSupported(types[i])) {
14
+ return types[i];
15
+ }
16
+ }
17
+ return void 0;
18
+ }
19
+ function useAudioRecorder() {
20
+ const { identity } = useChatRuntime();
21
+ const [isRecording, setIsRecording] = useState(false);
22
+ const [recordingTime, setRecordingTime] = useState(0);
23
+ const [isTranscribing, setIsTranscribing] = useState(false);
24
+ const streamRef = useRef(null);
25
+ const mediaRecorderRef = useRef(null);
26
+ const chunksRef = useRef([]);
27
+ const timerRef = useRef(null);
28
+ const startTimeRef = useRef(0);
29
+ const startRecording = useCallback(async () => {
30
+ try {
31
+ if (!streamRef.current) {
32
+ streamRef.current = await navigator.mediaDevices.getUserMedia({
33
+ audio: true
34
+ });
35
+ }
36
+ const mimeType = getMimeType();
37
+ const mediaRecorder = new MediaRecorder(streamRef.current, {
38
+ mimeType
39
+ });
40
+ mediaRecorderRef.current = mediaRecorder;
41
+ chunksRef.current = [];
42
+ startTimeRef.current = Date.now();
43
+ mediaRecorder.addEventListener("dataavailable", (event) => {
44
+ if (event.data.size > 0) {
45
+ chunksRef.current.push(event.data);
46
+ }
47
+ });
48
+ mediaRecorder.start();
49
+ setIsRecording(true);
50
+ timerRef.current = window.setInterval(() => {
51
+ setRecordingTime(Math.floor((Date.now() - startTimeRef.current) / 1e3));
52
+ }, 1e3);
53
+ } catch (error) {
54
+ console.error("Error accessing microphone:", error);
55
+ alert("Unable to access microphone. Please check your permissions.");
56
+ }
57
+ }, []);
58
+ const stopRecording = useCallback(() => {
59
+ return new Promise((resolve) => {
60
+ if (mediaRecorderRef.current && mediaRecorderRef.current.state === "recording") {
61
+ const mimeType = mediaRecorderRef.current.mimeType;
62
+ const duration = Date.now() - startTimeRef.current;
63
+ mediaRecorderRef.current.addEventListener("stop", async () => {
64
+ let blob = new Blob(chunksRef.current, { type: mimeType });
65
+ if (mimeType === "audio/webm") {
66
+ blob = await webmFixDuration(blob, duration, blob.type);
60
67
  }
61
- )
62
- ]
68
+ resolve(blob);
69
+ });
70
+ mediaRecorderRef.current.stop();
71
+ setIsRecording(false);
72
+ setRecordingTime(0);
73
+ if (timerRef.current) {
74
+ window.clearInterval(timerRef.current);
75
+ timerRef.current = null;
76
+ }
77
+ if (streamRef.current) {
78
+ streamRef.current.getTracks().forEach((track) => track.stop());
79
+ streamRef.current = null;
80
+ }
81
+ } else {
82
+ resolve(null);
83
+ }
84
+ });
85
+ }, []);
86
+ const transcribeAudio = useCallback(async (audioBlob) => {
87
+ setIsTranscribing(true);
88
+ try {
89
+ const apiUrl = identity?.textToSpeechVoice?.apiUrl || "";
90
+ const apiKey = identity?.textToSpeechVoice?.apiKey;
91
+ const formData = new FormData();
92
+ formData.append("file", audioBlob, "audio.webm");
93
+ formData.append("model", identity?.textToSpeechVoice?.model || "Systran/faster-whisper-large-v3");
94
+ formData.append("response_format", "json");
95
+ const headers = {};
96
+ if (apiKey) {
97
+ headers["Authorization"] = `Bearer ${apiKey}`;
98
+ }
99
+ const response = await fetch(apiUrl, {
100
+ method: "POST",
101
+ headers,
102
+ body: formData
103
+ });
104
+ if (!response.ok) {
105
+ throw new Error(`Transcription failed: ${response.statusText}`);
106
+ }
107
+ const data = await response.json();
108
+ return data.text || "";
109
+ } catch (error) {
110
+ console.error("Transcription error:", error);
111
+ throw error;
112
+ } finally {
113
+ setIsTranscribing(false);
114
+ }
115
+ }, [identity]);
116
+ const cancelRecording = useCallback(() => {
117
+ if (mediaRecorderRef.current) {
118
+ mediaRecorderRef.current.stop();
119
+ }
120
+ if (streamRef.current) {
121
+ streamRef.current.getTracks().forEach((track) => track.stop());
122
+ streamRef.current = null;
123
+ }
124
+ if (timerRef.current) {
125
+ window.clearInterval(timerRef.current);
126
+ timerRef.current = null;
63
127
  }
64
- );
128
+ chunksRef.current = [];
129
+ setIsRecording(false);
130
+ setRecordingTime(0);
131
+ }, []);
132
+ return {
133
+ isRecording,
134
+ recordingTime,
135
+ isTranscribing,
136
+ startRecording,
137
+ stopRecording,
138
+ transcribeAudio,
139
+ cancelRecording
140
+ };
65
141
  }
66
- const ToolCallFunctions$1 = React__default.memo(ToolCallFunctions, (prevProps, nextProps) => {
67
- return prevProps.toolMessages?.length === nextProps.toolMessages?.length;
68
- });
69
142
  export {
70
- ToolCallFunctions$1 as default
143
+ useAudioRecorder
71
144
  };
72
145
  //# sourceMappingURL=index.es28.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es28.js","sources":["../src/components/ToolCallFunctions.tsx"],"sourcesContent":["import { getContentString } from \"@/utils/utils\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport React, { useState } from \"react\";\n\nfunction ToolCallFunctions({ title, toolMessages }: {\n title?: string;\n toolMessages: Message[];\n}) {\n const [open, setOpen] = useState(false);\n\n // Only render if there are tool messages\n if (!toolMessages || toolMessages.length === 0) return null;\n\n return (\n <div\n id=\"accordion-collapse\"\n data-accordion=\"collapse\"\n className=\"w-full rounded-base overflow-hidden shadow-xs border rounded-xl border-zinc-800 max-w-[90%] min-w-25\"\n >\n <h2 id=\"accordion-collapse-heading-1\">\n <button\n type=\"button\"\n className=\"flex items-center justify-between w-full p-2 font-medium gap-3 text-body border-0 outline-none ring-0 appearance-none bg-transparent\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n aria-controls=\"accordion-collapse-body-1\"\n >\n <span>🔷 {title}</span>\n <svg\n data-accordion-icon\n className={`w-5 h-5 shrink-0 transition-transform ${open ? \"rotate-0\" : \"rotate-180\"\n }`}\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"m5 15 7-7 7 7\"\n />\n </svg>\n </button>\n </h2>\n <div\n id=\"accordion-collapse-body-1\"\n className={`${open ? \"\" : \"hidden\"}`}\n aria-labelledby=\"accordion-collapse-heading-1\"\n >\n <div className=\"md:p-5 text-left space-y-3\">\n {toolMessages.map((toolMsg) => (\n <div key={toolMsg.id} className=\"border-zinc-700\">\n <p className=\"text-body text-sm\">{toolMsg.content ? getContentString(toolMsg.content) : \"\"}</p>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nexport default React.memo(ToolCallFunctions, (prevProps, nextProps) => {\n return prevProps.toolMessages?.length === nextProps.toolMessages?.length;\n});"],"names":["React"],"mappings":";;;AAIA,SAAS,kBAAkB,EAAE,OAAO,gBAGjC;AACD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAGtC,MAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO;AAEvD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,kBAAe;AAAA,MACf,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAG,IAAG,gCACL,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,YAChC,iBAAe;AAAA,YACf,iBAAc;AAAA,YAEd,UAAA;AAAA,cAAA,qBAAC,QAAA,EAAK,UAAA;AAAA,gBAAA;AAAA,gBAAI;AAAA,cAAA,GAAM;AAAA,cAChB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,uBAAmB;AAAA,kBACnB,WAAW,yCAAyC,OAAO,aAAa,YACtE;AAAA,kBACF,eAAY;AAAA,kBACZ,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,MAAK;AAAA,kBACL,SAAQ;AAAA,kBAER,UAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,QAAO;AAAA,sBACP,eAAc;AAAA,sBACd,gBAAe;AAAA,sBACf,aAAY;AAAA,sBACZ,GAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACJ;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA,GAEJ;AAAA,QACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAW,GAAG,OAAO,KAAK,QAAQ;AAAA,YAClC,mBAAgB;AAAA,YAEhB,UAAA,oBAAC,OAAA,EAAI,WAAU,8BACZ,UAAA,aAAa,IAAI,CAAC,YACjB,oBAAC,OAAA,EAAqB,WAAU,mBAC9B,UAAA,oBAAC,KAAA,EAAE,WAAU,qBAAqB,UAAA,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,IAAI,GAAA,CAAG,EAAA,GADnF,QAAQ,EAElB,CACD,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAA,sBAAeA,eAAM,KAAK,mBAAmB,CAAC,WAAW,cAAc;AACrE,SAAO,UAAU,cAAc,WAAW,UAAU,cAAc;AACpE,CAAC;"}
1
+ {"version":3,"file":"index.es28.js","sources":["../src/hooks/useAudioRecorder.ts"],"sourcesContent":["import { useState, useRef, useCallback } from \"react\";\nimport { webmFixDuration } from \"../utils/BlobFix\";\nimport { useChatRuntime } from \"@/providers/ChatRuntime\";\n\nfunction getMimeType() {\n const types = [\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg\",\n \"audio/wav\",\n \"audio/aac\",\n ];\n for (let i = 0; i < types.length; i++) {\n if (MediaRecorder.isTypeSupported(types[i])) {\n return types[i];\n }\n }\n return undefined;\n}\n\nexport function useAudioRecorder() {\n const { identity } = useChatRuntime();\n const [isRecording, setIsRecording] = useState(false);\n const [recordingTime, setRecordingTime] = useState(0);\n const [isTranscribing, setIsTranscribing] = useState(false);\n \n const streamRef = useRef<MediaStream | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const timerRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n\n const startRecording = useCallback(async () => {\n try {\n if (!streamRef.current) {\n streamRef.current = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n }\n\n const mimeType = getMimeType();\n const mediaRecorder = new MediaRecorder(streamRef.current, {\n mimeType,\n });\n\n mediaRecorderRef.current = mediaRecorder;\n chunksRef.current = [];\n startTimeRef.current = Date.now();\n\n mediaRecorder.addEventListener(\"dataavailable\", (event) => {\n if (event.data.size > 0) {\n chunksRef.current.push(event.data);\n }\n });\n\n mediaRecorder.start();\n setIsRecording(true);\n\n // Start timer\n timerRef.current = window.setInterval(() => {\n setRecordingTime(Math.floor((Date.now() - startTimeRef.current) / 1000));\n }, 1000);\n } catch (error) {\n console.error(\"Error accessing microphone:\", error);\n alert(\"Unable to access microphone. Please check your permissions.\");\n }\n }, []);\n\n const stopRecording = useCallback((): Promise<Blob | null> => {\n return new Promise((resolve) => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state === \"recording\"\n ) {\n const mimeType = mediaRecorderRef.current.mimeType;\n const duration = Date.now() - startTimeRef.current;\n\n mediaRecorderRef.current.addEventListener(\"stop\", async () => {\n let blob = new Blob(chunksRef.current, { type: mimeType });\n\n if (mimeType === \"audio/webm\") {\n blob = await webmFixDuration(blob, duration, blob.type);\n }\n\n resolve(blob);\n });\n\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n setRecordingTime(0);\n\n if (timerRef.current) {\n window.clearInterval(timerRef.current);\n timerRef.current = null;\n }\n\n // Stop all tracks\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n } else {\n resolve(null);\n }\n });\n }, []);\n\n const transcribeAudio = useCallback(async (audioBlob: Blob): Promise<string> => {\n setIsTranscribing(true);\n try {\n const apiUrl = identity?.textToSpeechVoice?.apiUrl || \"\";\n const apiKey = identity?.textToSpeechVoice?.apiKey;\n\n const formData = new FormData();\n formData.append(\"file\", audioBlob, \"audio.webm\");\n formData.append(\"model\", identity?.textToSpeechVoice?.model || \"Systran/faster-whisper-large-v3\");\n formData.append(\"response_format\", \"json\");\n\n const headers: HeadersInit = {};\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(apiUrl, {\n method: \"POST\",\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Transcription failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.text || \"\";\n } catch (error) {\n console.error(\"Transcription error:\", error);\n throw error;\n } finally {\n setIsTranscribing(false);\n }\n }, [identity]);\n\n const cancelRecording = useCallback(() => {\n if (mediaRecorderRef.current) {\n mediaRecorderRef.current.stop();\n }\n\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n\n if (timerRef.current) {\n window.clearInterval(timerRef.current);\n timerRef.current = null;\n }\n\n chunksRef.current = [];\n setIsRecording(false);\n setRecordingTime(0);\n }, []);\n\n return {\n isRecording,\n recordingTime,\n isTranscribing,\n startRecording,\n stopRecording,\n transcribeAudio,\n cancelRecording,\n };\n}\n"],"names":[],"mappings":"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"}