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,122 +1,297 @@
1
- const CR = "\r".charCodeAt(0);
2
- const LF = "\n".charCodeAt(0);
3
- const NULL = "\0".charCodeAt(0);
4
- const COLON = ":".charCodeAt(0);
5
- const SPACE = " ".charCodeAt(0);
6
- const TRAILING_NEWLINE = [CR, LF];
7
- function BytesLineDecoder() {
8
- let buffer = [];
9
- let trailingCr = false;
10
- return new TransformStream({
11
- start() {
12
- buffer = [];
13
- trailingCr = false;
14
- },
15
- transform(chunk, controller) {
16
- let text = chunk;
17
- if (trailingCr) {
18
- text = joinArrays([[CR], text]);
19
- trailingCr = false;
20
- }
21
- if (text.length > 0 && text.at(-1) === CR) {
22
- trailingCr = true;
23
- text = text.subarray(0, -1);
24
- }
25
- if (!text.length) return;
26
- const trailingNewline = TRAILING_NEWLINE.includes(text.at(-1));
27
- const lastIdx = text.length - 1;
28
- const { lines } = text.reduce((acc, cur, idx) => {
29
- if (acc.from > idx) return acc;
30
- if (cur === CR || cur === LF) {
31
- acc.lines.push(text.subarray(acc.from, idx));
32
- if (cur === CR && text[idx + 1] === LF) acc.from = idx + 2;
33
- else acc.from = idx + 1;
34
- }
35
- if (idx === lastIdx && acc.from <= lastIdx) acc.lines.push(text.subarray(acc.from));
36
- return acc;
37
- }, {
38
- lines: [],
39
- from: 0
40
- });
41
- if (lines.length === 1 && !trailingNewline) {
42
- buffer.push(lines[0]);
43
- return;
44
- }
45
- if (buffer.length) {
46
- buffer.push(lines[0]);
47
- lines[0] = joinArrays(buffer);
48
- buffer = [];
49
- }
50
- if (!trailingNewline) {
51
- if (lines.length) buffer = [lines.pop()];
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cn } from "./index.es40.js";
3
+ import { CopyIcon, CheckIcon } from "lucide-react";
4
+ import { useState } from "react";
5
+ import ReactMarkdown from "react-markdown";
6
+ import rehypeAutoLinkHeadings from "rehype-autolink-headings";
7
+ import rehypeHighlight from "rehype-highlight";
8
+ import remarkBreaks from "remark-breaks";
9
+ import remarkGfm from "remark-gfm";
10
+ import remarkMath from "remark-math";
11
+ import rehypeKatex from "rehype-katex";
12
+ import { SyntaxHighlighter } from "./index.es67.js";
13
+ /* empty css */
14
+ const useCopyToClipboard = ({
15
+ copiedDuration = 3e3
16
+ } = {}) => {
17
+ const [isCopied, setIsCopied] = useState(false);
18
+ const copyToClipboard = (value) => {
19
+ if (!value) return;
20
+ navigator.clipboard.writeText(value).then(() => {
21
+ setIsCopied(true);
22
+ setTimeout(() => setIsCopied(false), copiedDuration);
23
+ });
24
+ };
25
+ return { isCopied, copyToClipboard };
26
+ };
27
+ const CodeHeader = ({ language, code }) => {
28
+ const { isCopied, copyToClipboard } = useCopyToClipboard();
29
+ const onCopy = () => {
30
+ if (!code || isCopied) return;
31
+ copyToClipboard(code);
32
+ };
33
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4 rounded-t-lg bg-zinc-800 px-4 py-2 text-sm font-semibold text-zinc-200 border-b border-zinc-700", children: [
34
+ /* @__PURE__ */ jsx("span", { className: "lowercase text-xs font-mono", children: language || "text" }),
35
+ /* @__PURE__ */ jsxs(
36
+ "button",
37
+ {
38
+ onClick: onCopy,
39
+ className: "p-1 rounded hover:bg-zinc-700 transition-colors",
40
+ title: isCopied ? "Copied!" : "Copy code",
41
+ children: [
42
+ !isCopied && /* @__PURE__ */ jsx(CopyIcon, { size: 16 }),
43
+ isCopied && /* @__PURE__ */ jsx(CheckIcon, { size: 16, className: "text-green-400" })
44
+ ]
52
45
  }
53
- for (const line of lines) controller.enqueue(line);
54
- },
55
- flush(controller) {
56
- if (buffer.length) controller.enqueue(joinArrays(buffer));
46
+ )
47
+ ] });
48
+ };
49
+ const defaultComponents = {
50
+ h1: ({ className, ...props }) => /* @__PURE__ */ jsx(
51
+ "h1",
52
+ {
53
+ className: cn(
54
+ "mb-6 mt-8 scroll-m-20 text-3xl font-bold tracking-tight text-zinc-100 first:mt-0 last:mb-0",
55
+ className
56
+ ),
57
+ ...props
57
58
  }
58
- });
59
- }
60
- function SSEDecoder() {
61
- let event = "";
62
- let data = [];
63
- let lastEventId = "";
64
- let retry = null;
65
- const decoder = new TextDecoder();
66
- return new TransformStream({
67
- transform(chunk, controller) {
68
- if (!chunk.length) {
69
- if (!event && !data.length && !lastEventId && retry == null) return;
70
- const sse = {
71
- id: lastEventId || void 0,
72
- event,
73
- data: data.length ? decodeArraysToJson(decoder, data) : null
74
- };
75
- event = "";
76
- data = [];
77
- retry = null;
78
- controller.enqueue(sse);
79
- return;
80
- }
81
- if (chunk[0] === COLON) return;
82
- const sepIdx = chunk.indexOf(COLON);
83
- if (sepIdx === -1) return;
84
- const fieldName = decoder.decode(chunk.subarray(0, sepIdx));
85
- let value = chunk.subarray(sepIdx + 1);
86
- if (value[0] === SPACE) value = value.subarray(1);
87
- if (fieldName === "event") event = decoder.decode(value);
88
- else if (fieldName === "data") data.push(value);
89
- else if (fieldName === "id") {
90
- if (value.indexOf(NULL) === -1) lastEventId = decoder.decode(value);
91
- } else if (fieldName === "retry") {
92
- const retryNum = Number.parseInt(decoder.decode(value), 10);
93
- if (!Number.isNaN(retryNum)) retry = retryNum;
59
+ ),
60
+ h2: ({ className, ...props }) => /* @__PURE__ */ jsx(
61
+ "h2",
62
+ {
63
+ className: cn(
64
+ "mt-8 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight text-zinc-100 first:mt-0 last:mb-0 border-b border-zinc-800 pb-2",
65
+ className
66
+ ),
67
+ ...props
68
+ }
69
+ ),
70
+ h3: ({ className, ...props }) => /* @__PURE__ */ jsx(
71
+ "h3",
72
+ {
73
+ className: cn(
74
+ "mt-6 mb-3 scroll-m-20 text-xl font-semibold tracking-tight text-zinc-100 first:mt-0 last:mb-0",
75
+ className
76
+ ),
77
+ ...props
78
+ }
79
+ ),
80
+ h4: ({ className, ...props }) => /* @__PURE__ */ jsx(
81
+ "h4",
82
+ {
83
+ className: cn(
84
+ "mt-6 mb-3 scroll-m-20 text-lg font-semibold tracking-tight text-zinc-200 first:mt-0 last:mb-0",
85
+ className
86
+ ),
87
+ ...props
88
+ }
89
+ ),
90
+ h5: ({ className, ...props }) => /* @__PURE__ */ jsx(
91
+ "h5",
92
+ {
93
+ className: cn(
94
+ "my-3 text-base font-semibold text-zinc-200 first:mt-0 last:mb-0",
95
+ className
96
+ ),
97
+ ...props
98
+ }
99
+ ),
100
+ h6: ({ className, ...props }) => /* @__PURE__ */ jsx(
101
+ "h6",
102
+ {
103
+ className: cn("my-3 text-sm font-semibold text-zinc-300 first:mt-0 last:mb-0", className),
104
+ ...props
105
+ }
106
+ ),
107
+ p: ({ className, ...props }) => /* @__PURE__ */ jsx(
108
+ "p",
109
+ {
110
+ className: cn("mb-5 leading-7 text-zinc-200 first:mt-0 last:mb-0", className),
111
+ ...props
112
+ }
113
+ ),
114
+ a: ({ className, href, ...props }) => /* @__PURE__ */ jsx(
115
+ "a",
116
+ {
117
+ href,
118
+ target: href?.startsWith("http") ? "_blank" : void 0,
119
+ rel: href?.startsWith("http") ? "noopener noreferrer" : void 0,
120
+ className: cn(
121
+ "text-blue-400 hover:text-blue-300 font-medium underline underline-offset-4 transition-colors",
122
+ className
123
+ ),
124
+ ...props
125
+ }
126
+ ),
127
+ blockquote: ({ className, ...props }) => /* @__PURE__ */ jsx(
128
+ "blockquote",
129
+ {
130
+ className: cn(
131
+ "my-4 border-l-4 border-zinc-600 pl-4 italic text-zinc-300 bg-zinc-900/50 py-2 rounded-r",
132
+ className
133
+ ),
134
+ ...props
135
+ }
136
+ ),
137
+ ul: ({ className, ...props }) => /* @__PURE__ */ jsx(
138
+ "ul",
139
+ {
140
+ className: cn(
141
+ "my-4 ml-6 space-y-2 list-none text-zinc-200",
142
+ className
143
+ ),
144
+ ...props
145
+ }
146
+ ),
147
+ ol: ({ className, ...props }) => /* @__PURE__ */ jsx(
148
+ "ol",
149
+ {
150
+ className: cn("my-4 ml-8 list-decimal text-zinc-200 [&>li]:mt-2", className),
151
+ ...props
152
+ }
153
+ ),
154
+ li: ({ className, ...props }) => /* @__PURE__ */ jsx(
155
+ "li",
156
+ {
157
+ className: cn(
158
+ "leading-7 pl-6 relative before:content-['•'] before:absolute before:left-0 before:text-zinc-400 before:font-bold",
159
+ // This adds a bullet using CSS before pseudo-element with proper positioning
160
+ className
161
+ ),
162
+ ...props
163
+ }
164
+ ),
165
+ hr: ({ className, ...props }) => /* @__PURE__ */ jsx(
166
+ "hr",
167
+ {
168
+ className: cn("my-6 border-zinc-700", className),
169
+ ...props
170
+ }
171
+ ),
172
+ table: ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: "my-4 w-full overflow-x-auto", children: /* @__PURE__ */ jsx(
173
+ "table",
174
+ {
175
+ className: cn(
176
+ "w-full border-collapse border border-zinc-700 rounded-lg overflow-hidden",
177
+ className
178
+ ),
179
+ ...props
180
+ }
181
+ ) }),
182
+ th: ({ className, ...props }) => /* @__PURE__ */ jsx(
183
+ "th",
184
+ {
185
+ className: cn(
186
+ "bg-zinc-800 border border-zinc-700 px-4 py-2 text-left font-semibold text-zinc-100 [&[align=center]]:text-center [&[align=right]]:text-right",
187
+ className
188
+ ),
189
+ ...props
190
+ }
191
+ ),
192
+ td: ({ className, ...props }) => /* @__PURE__ */ jsx(
193
+ "td",
194
+ {
195
+ className: cn(
196
+ "border border-zinc-700 px-4 py-2 text-left text-zinc-200 [&[align=center]]:text-center [&[align=right]]:text-right",
197
+ className
198
+ ),
199
+ ...props
200
+ }
201
+ ),
202
+ tr: ({ className, ...props }) => /* @__PURE__ */ jsx(
203
+ "tr",
204
+ {
205
+ className: cn(
206
+ "m-0 border-b border-zinc-700 p-0 even:bg-zinc-900/30",
207
+ className
208
+ ),
209
+ ...props
210
+ }
211
+ ),
212
+ sup: ({ className, ...props }) => /* @__PURE__ */ jsx(
213
+ "sup",
214
+ {
215
+ className: cn("[&>a]:text-xs [&>a]:no-underline", className),
216
+ ...props
217
+ }
218
+ ),
219
+ strong: ({ className, ...props }) => /* @__PURE__ */ jsx(
220
+ "strong",
221
+ {
222
+ className: cn("font-bold text-zinc-100", className),
223
+ ...props
224
+ }
225
+ ),
226
+ em: ({ className, ...props }) => /* @__PURE__ */ jsx(
227
+ "em",
228
+ {
229
+ className: cn("italic text-zinc-200", className),
230
+ ...props
231
+ }
232
+ ),
233
+ pre: ({ className, ...props }) => /* @__PURE__ */ jsx(
234
+ "pre",
235
+ {
236
+ className: cn(
237
+ "my-4 overflow-x-auto rounded-lg bg-zinc-900 text-white",
238
+ className
239
+ ),
240
+ ...props
241
+ }
242
+ ),
243
+ code: ({
244
+ className,
245
+ children,
246
+ ...props
247
+ }) => {
248
+ const match = /language-(\w+)/.exec(className || "");
249
+ if (match) {
250
+ const language = match[1];
251
+ const code = String(children).replace(/\n$/, "");
252
+ return /* @__PURE__ */ jsxs("div", { className: "my-4 rounded-lg overflow-hidden border border-zinc-700", children: [
253
+ /* @__PURE__ */ jsx(
254
+ CodeHeader,
255
+ {
256
+ language,
257
+ code
258
+ }
259
+ ),
260
+ /* @__PURE__ */ jsx(
261
+ SyntaxHighlighter,
262
+ {
263
+ language,
264
+ className,
265
+ children: code
266
+ }
267
+ )
268
+ ] });
269
+ }
270
+ return /* @__PURE__ */ jsx(
271
+ "code",
272
+ {
273
+ className: cn(
274
+ "rounded bg-zinc-800 px-1.5 py-0.5 font-mono text-sm text-zinc-100 border border-zinc-700",
275
+ className
276
+ ),
277
+ ...props,
278
+ children
94
279
  }
95
- },
96
- flush(controller) {
97
- if (event) controller.enqueue({
98
- id: lastEventId || void 0,
99
- event,
100
- data: data.length ? decodeArraysToJson(decoder, data) : null
101
- });
102
- }
103
- });
104
- }
105
- function joinArrays(data) {
106
- const totalLength = data.reduce((acc, curr) => acc + curr.length, 0);
107
- const merged = new Uint8Array(totalLength);
108
- let offset = 0;
109
- for (const c of data) {
110
- merged.set(c, offset);
111
- offset += c.length;
280
+ );
112
281
  }
113
- return merged;
114
- }
115
- function decodeArraysToJson(decoder, data) {
116
- return JSON.parse(decoder.decode(joinArrays(data)));
282
+ };
283
+ function AgentMarkdown({ content }) {
284
+ return /* @__PURE__ */ jsx("div", { className: "prose prose-invert max-w-none", children: /* @__PURE__ */ jsx(
285
+ ReactMarkdown,
286
+ {
287
+ remarkPlugins: [remarkGfm, remarkBreaks, remarkMath],
288
+ rehypePlugins: [rehypeHighlight, rehypeAutoLinkHeadings, rehypeKatex],
289
+ components: defaultComponents,
290
+ children: content
291
+ }
292
+ ) });
117
293
  }
118
294
  export {
119
- BytesLineDecoder,
120
- SSEDecoder
295
+ AgentMarkdown
121
296
  };
122
297
  //# sourceMappingURL=index.es37.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es37.js","sources":["../node_modules/.pnpm/@langchain+langgraph-sdk@1.5.3_@langchain+core@1.1.13_openai@6.16.0_zod@4.3.5___react-d_6e8116ad15c37793c6138fe0d58aa04e/node_modules/@langchain/langgraph-sdk/dist/utils/sse.js"],"sourcesContent":["//#region src/utils/sse.ts\nconst CR = \"\\r\".charCodeAt(0);\nconst LF = \"\\n\".charCodeAt(0);\nconst NULL = \"\\0\".charCodeAt(0);\nconst COLON = \":\".charCodeAt(0);\nconst SPACE = \" \".charCodeAt(0);\nconst TRAILING_NEWLINE = [CR, LF];\nfunction BytesLineDecoder() {\n\tlet buffer = [];\n\tlet trailingCr = false;\n\treturn new TransformStream({\n\t\tstart() {\n\t\t\tbuffer = [];\n\t\t\ttrailingCr = false;\n\t\t},\n\t\ttransform(chunk, controller) {\n\t\t\tlet text = chunk;\n\t\t\tif (trailingCr) {\n\t\t\t\ttext = joinArrays([[CR], text]);\n\t\t\t\ttrailingCr = false;\n\t\t\t}\n\t\t\tif (text.length > 0 && text.at(-1) === CR) {\n\t\t\t\ttrailingCr = true;\n\t\t\t\ttext = text.subarray(0, -1);\n\t\t\t}\n\t\t\tif (!text.length) return;\n\t\t\tconst trailingNewline = TRAILING_NEWLINE.includes(text.at(-1));\n\t\t\tconst lastIdx = text.length - 1;\n\t\t\tconst { lines } = text.reduce((acc, cur, idx) => {\n\t\t\t\tif (acc.from > idx) return acc;\n\t\t\t\tif (cur === CR || cur === LF) {\n\t\t\t\t\tacc.lines.push(text.subarray(acc.from, idx));\n\t\t\t\t\tif (cur === CR && text[idx + 1] === LF) acc.from = idx + 2;\n\t\t\t\t\telse acc.from = idx + 1;\n\t\t\t\t}\n\t\t\t\tif (idx === lastIdx && acc.from <= lastIdx) acc.lines.push(text.subarray(acc.from));\n\t\t\t\treturn acc;\n\t\t\t}, {\n\t\t\t\tlines: [],\n\t\t\t\tfrom: 0\n\t\t\t});\n\t\t\tif (lines.length === 1 && !trailingNewline) {\n\t\t\t\tbuffer.push(lines[0]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (buffer.length) {\n\t\t\t\tbuffer.push(lines[0]);\n\t\t\t\tlines[0] = joinArrays(buffer);\n\t\t\t\tbuffer = [];\n\t\t\t}\n\t\t\tif (!trailingNewline) {\n\t\t\t\tif (lines.length) buffer = [lines.pop()];\n\t\t\t}\n\t\t\tfor (const line of lines) controller.enqueue(line);\n\t\t},\n\t\tflush(controller) {\n\t\t\tif (buffer.length) controller.enqueue(joinArrays(buffer));\n\t\t}\n\t});\n}\nfunction SSEDecoder() {\n\tlet event = \"\";\n\tlet data = [];\n\tlet lastEventId = \"\";\n\tlet retry = null;\n\tconst decoder = new TextDecoder();\n\treturn new TransformStream({\n\t\ttransform(chunk, controller) {\n\t\t\tif (!chunk.length) {\n\t\t\t\tif (!event && !data.length && !lastEventId && retry == null) return;\n\t\t\t\tconst sse = {\n\t\t\t\t\tid: lastEventId || void 0,\n\t\t\t\t\tevent,\n\t\t\t\t\tdata: data.length ? decodeArraysToJson(decoder, data) : null\n\t\t\t\t};\n\t\t\t\tevent = \"\";\n\t\t\t\tdata = [];\n\t\t\t\tretry = null;\n\t\t\t\tcontroller.enqueue(sse);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (chunk[0] === COLON) return;\n\t\t\tconst sepIdx = chunk.indexOf(COLON);\n\t\t\tif (sepIdx === -1) return;\n\t\t\tconst fieldName = decoder.decode(chunk.subarray(0, sepIdx));\n\t\t\tlet value = chunk.subarray(sepIdx + 1);\n\t\t\tif (value[0] === SPACE) value = value.subarray(1);\n\t\t\tif (fieldName === \"event\") event = decoder.decode(value);\n\t\t\telse if (fieldName === \"data\") data.push(value);\n\t\t\telse if (fieldName === \"id\") {\n\t\t\t\tif (value.indexOf(NULL) === -1) lastEventId = decoder.decode(value);\n\t\t\t} else if (fieldName === \"retry\") {\n\t\t\t\tconst retryNum = Number.parseInt(decoder.decode(value), 10);\n\t\t\t\tif (!Number.isNaN(retryNum)) retry = retryNum;\n\t\t\t}\n\t\t},\n\t\tflush(controller) {\n\t\t\tif (event) controller.enqueue({\n\t\t\t\tid: lastEventId || void 0,\n\t\t\t\tevent,\n\t\t\t\tdata: data.length ? decodeArraysToJson(decoder, data) : null\n\t\t\t});\n\t\t}\n\t});\n}\nfunction joinArrays(data) {\n\tconst totalLength = data.reduce((acc, curr) => acc + curr.length, 0);\n\tconst merged = new Uint8Array(totalLength);\n\tlet offset = 0;\n\tfor (const c of data) {\n\t\tmerged.set(c, offset);\n\t\toffset += c.length;\n\t}\n\treturn merged;\n}\nfunction decodeArraysToJson(decoder, data) {\n\treturn JSON.parse(decoder.decode(joinArrays(data)));\n}\n\n//#endregion\nexport { BytesLineDecoder, SSEDecoder };\n//# sourceMappingURL=sse.js.map"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.es37.js","sources":["../src/components/ui/AgentMarkdown.tsx"],"sourcesContent":["import { cn } from \"@/utils/tailwindUtil\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport { type FC, useState } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeAutoLinkHeadings from \"rehype-autolink-headings\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport rehypeKatex from \"rehype-katex\";\nimport { SyntaxHighlighter } from \"./syntax-highlighter\";\nimport \"katex/dist/katex.min.css\";\n\ninterface CodeHeaderProps {\n language?: string;\n code: string;\n}\n\nconst useCopyToClipboard = ({\n copiedDuration = 3000,\n}: {\n copiedDuration?: number;\n} = {}) => {\n const [isCopied, setIsCopied] = useState<boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (!value) return;\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n });\n };\n\n return { isCopied, copyToClipboard };\n};\n\nconst CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard();\n const onCopy = () => {\n if (!code || isCopied) return;\n copyToClipboard(code);\n };\n\n return (\n <div className=\"flex items-center justify-between gap-4 rounded-t-lg bg-zinc-800 px-4 py-2 text-sm font-semibold text-zinc-200 border-b border-zinc-700\">\n <span className=\"lowercase text-xs font-mono\">{language || \"text\"}</span>\n <button\n onClick={onCopy}\n className=\"p-1 rounded hover:bg-zinc-700 transition-colors\"\n title={isCopied ? \"Copied!\" : \"Copy code\"}\n >\n {!isCopied && <CopyIcon size={16} />}\n {isCopied && <CheckIcon size={16} className=\"text-green-400\" />}\n </button>\n </div>\n );\n};\n\nconst defaultComponents: any = {\n h1: ({ className, ...props }: { className?: string }) => (\n <h1\n className={cn(\n \"mb-6 mt-8 scroll-m-20 text-3xl font-bold tracking-tight text-zinc-100 first:mt-0 last:mb-0\",\n className,\n )}\n {...props}\n />\n ),\n h2: ({ className, ...props }: { className?: string }) => (\n <h2\n className={cn(\n \"mt-8 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight text-zinc-100 first:mt-0 last:mb-0 border-b border-zinc-800 pb-2\",\n className,\n )}\n {...props}\n />\n ),\n h3: ({ className, ...props }: { className?: string }) => (\n <h3\n className={cn(\n \"mt-6 mb-3 scroll-m-20 text-xl font-semibold tracking-tight text-zinc-100 first:mt-0 last:mb-0\",\n className,\n )}\n {...props}\n />\n ),\n h4: ({ className, ...props }: { className?: string }) => (\n <h4\n className={cn(\n \"mt-6 mb-3 scroll-m-20 text-lg font-semibold tracking-tight text-zinc-200 first:mt-0 last:mb-0\",\n className,\n )}\n {...props}\n />\n ),\n h5: ({ className, ...props }: { className?: string }) => (\n <h5\n className={cn(\n \"my-3 text-base font-semibold text-zinc-200 first:mt-0 last:mb-0\",\n className,\n )}\n {...props}\n />\n ),\n h6: ({ className, ...props }: { className?: string }) => (\n <h6\n className={cn(\"my-3 text-sm font-semibold text-zinc-300 first:mt-0 last:mb-0\", className)}\n {...props}\n />\n ),\n p: ({ className, ...props }: { className?: string }) => (\n <p\n className={cn(\"mb-5 leading-7 text-zinc-200 first:mt-0 last:mb-0\", className)} // Changed mb-4 to mb-5\n {...props}\n />\n ),\n a: ({ className, href, ...props }: { className?: string; href?: string }) => (\n <a\n href={href}\n target={href?.startsWith('http') ? \"_blank\" : undefined}\n rel={href?.startsWith('http') ? \"noopener noreferrer\" : undefined}\n className={cn(\n \"text-blue-400 hover:text-blue-300 font-medium underline underline-offset-4 transition-colors\",\n className,\n )}\n {...props}\n />\n ),\n blockquote: ({ className, ...props }: { className?: string }) => (\n <blockquote\n className={cn(\n \"my-4 border-l-4 border-zinc-600 pl-4 italic text-zinc-300 bg-zinc-900/50 py-2 rounded-r\",\n className\n )}\n {...props}\n />\n ),\n ul: ({ className, ...props }: { className?: string }) => (\n <ul\n className={cn(\n \"my-4 ml-6 space-y-2 list-none text-zinc-200\",\n className\n )}\n {...props}\n />\n ),\n ol: ({ className, ...props }: { className?: string }) => (\n <ol\n className={cn(\"my-4 ml-8 list-decimal text-zinc-200 [&>li]:mt-2\", className)}\n {...props}\n />\n ),\n li: ({ className, ...props }: { className?: string }) => (\n <li\n className={cn(\n \"leading-7 pl-6 relative before:content-['•'] before:absolute before:left-0 before:text-zinc-400 before:font-bold\",\n // This adds a bullet using CSS before pseudo-element with proper positioning\n className\n )}\n {...props}\n />\n ),\n hr: ({ className, ...props }: { className?: string }) => (\n <hr\n className={cn(\"my-6 border-zinc-700\", className)}\n {...props}\n />\n ),\n table: ({ className, ...props }: { className?: string }) => (\n <div className=\"my-4 w-full overflow-x-auto\">\n <table\n className={cn(\n \"w-full border-collapse border border-zinc-700 rounded-lg overflow-hidden\",\n className,\n )}\n {...props}\n />\n </div>\n ),\n th: ({ className, ...props }: { className?: string }) => (\n <th\n className={cn(\n \"bg-zinc-800 border border-zinc-700 px-4 py-2 text-left font-semibold text-zinc-100 [&[align=center]]:text-center [&[align=right]]:text-right\",\n className,\n )}\n {...props}\n />\n ),\n td: ({ className, ...props }: { className?: string }) => (\n <td\n className={cn(\n \"border border-zinc-700 px-4 py-2 text-left text-zinc-200 [&[align=center]]:text-center [&[align=right]]:text-right\",\n className,\n )}\n {...props}\n />\n ),\n tr: ({ className, ...props }: { className?: string }) => (\n <tr\n className={cn(\n \"m-0 border-b border-zinc-700 p-0 even:bg-zinc-900/30\",\n className,\n )}\n {...props}\n />\n ),\n sup: ({ className, ...props }: { className?: string }) => (\n <sup\n className={cn(\"[&>a]:text-xs [&>a]:no-underline\", className)}\n {...props}\n />\n ),\n strong: ({ className, ...props }: { className?: string }) => (\n <strong\n className={cn(\"font-bold text-zinc-100\", className)}\n {...props}\n />\n ),\n em: ({ className, ...props }: { className?: string }) => (\n <em\n className={cn(\"italic text-zinc-200\", className)}\n {...props}\n />\n ),\n pre: ({ className, ...props }: { className?: string }) => (\n <pre\n className={cn(\n \"my-4 overflow-x-auto rounded-lg bg-zinc-900 text-white\",\n className,\n )}\n {...props}\n />\n ),\n code: ({\n className,\n children,\n ...props\n }: {\n className?: string;\n children: React.ReactNode;\n }) => {\n const match = /language-(\\w+)/.exec(className || \"\");\n\n if (match) {\n const language = match[1];\n const code = String(children).replace(/\\n$/, \"\");\n\n return (\n <div className=\"my-4 rounded-lg overflow-hidden border border-zinc-700\">\n <CodeHeader\n language={language}\n code={code}\n />\n <SyntaxHighlighter\n language={language}\n className={className}\n >\n {code}\n </SyntaxHighlighter>\n </div>\n );\n }\n\n return (\n <code\n className={cn(\n \"rounded bg-zinc-800 px-1.5 py-0.5 font-mono text-sm text-zinc-100 border border-zinc-700\",\n className\n )}\n {...props}\n >\n {children}\n </code>\n );\n },\n};\n\nexport function AgentMarkdown({ content }: { content: string }) {\n return (\n <div className=\"prose prose-invert max-w-none\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkBreaks, remarkMath]}\n rehypePlugins={[rehypeHighlight, rehypeAutoLinkHeadings, rehypeKatex]}\n components={defaultComponents}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,75 +1,49 @@
1
- import { isNetworkError } from "./index.es39.js";
2
- var MaxReconnectAttemptsError = class extends Error {
3
- constructor(maxAttempts, cause) {
4
- super(`Exceeded maximum SSE reconnection attempts (${maxAttempts})`);
5
- this.name = "MaxReconnectAttemptsError";
6
- this.cause = cause;
7
- }
8
- };
9
- async function* streamWithRetry(makeRequest, options = {}) {
10
- const maxRetries = options.maxRetries ?? 5;
11
- let attempt = 0;
12
- let lastEventId;
13
- let reconnectPath;
14
- while (true) {
15
- let shouldRetry = false;
16
- let lastError;
17
- let reader;
18
- try {
19
- if (options.signal?.aborted) return;
20
- const { response, stream } = await makeRequest(reconnectPath ? {
21
- lastEventId,
22
- reconnectPath
23
- } : void 0);
24
- const locationHeader = response.headers.get("location");
25
- if (locationHeader) reconnectPath = locationHeader;
26
- const contentType = response.headers.get("content-type")?.split(";")[0];
27
- if (contentType && !contentType.includes("text/event-stream")) throw new Error(`Expected response header Content-Type to contain 'text/event-stream', got '${contentType}'`);
28
- reader = stream.getReader();
29
- try {
30
- while (true) {
31
- if (options.signal?.aborted) {
32
- await reader.cancel();
33
- return;
34
- }
35
- const { done, value } = await reader.read();
36
- if (done) break;
37
- if (value.id) lastEventId = value.id;
38
- yield value;
39
- }
40
- break;
41
- } catch (error) {
42
- if (reconnectPath && !options.signal?.aborted) shouldRetry = true;
43
- else throw error;
44
- } finally {
45
- if (reader) try {
46
- reader.releaseLock();
47
- } catch {
48
- }
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { Button } from "./index.es29.js";
3
+ import { ChevronLeft, ChevronRight } from "lucide-react";
4
+ function BranchSwitcher({
5
+ branch,
6
+ branchOptions,
7
+ onSelect,
8
+ isLoading
9
+ }) {
10
+ if (branchOptions.length <= 1) return null;
11
+ const currentIndex = branchOptions.indexOf(branch);
12
+ if (currentIndex === -1) return null;
13
+ const totalBranches = branchOptions.length;
14
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-zinc-500", children: [
15
+ /* @__PURE__ */ jsx(
16
+ Button,
17
+ {
18
+ variant: "ghost",
19
+ size: "icon",
20
+ className: "size-6 p-1 h-6 w-6 hover:bg-zinc-800 hover:text-zinc-300",
21
+ onClick: () => onSelect(branchOptions[currentIndex - 1]),
22
+ disabled: isLoading || currentIndex === 0,
23
+ title: "Previous response",
24
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
25
+ }
26
+ ),
27
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-zinc-400 font-medium min-w-[3rem] text-center", children: [
28
+ currentIndex + 1,
29
+ " / ",
30
+ totalBranches
31
+ ] }),
32
+ /* @__PURE__ */ jsx(
33
+ Button,
34
+ {
35
+ variant: "ghost",
36
+ size: "icon",
37
+ className: "size-6 p-1 h-6 w-6 hover:bg-zinc-800 hover:text-zinc-300",
38
+ onClick: () => onSelect(branchOptions[currentIndex + 1]),
39
+ disabled: isLoading || currentIndex === totalBranches - 1,
40
+ title: "Next response",
41
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
49
42
  }
50
- } catch (error) {
51
- lastError = error;
52
- if (isNetworkError(error) && reconnectPath && !options.signal?.aborted) shouldRetry = true;
53
- else throw error;
54
- }
55
- if (shouldRetry) {
56
- attempt += 1;
57
- if (attempt > maxRetries) throw new MaxReconnectAttemptsError(maxRetries, lastError);
58
- options.onReconnect?.({
59
- attempt,
60
- lastEventId,
61
- cause: lastError
62
- });
63
- const delay = Math.min(1e3 * 2 ** (attempt - 1), 5e3) + Math.random() * 1e3;
64
- await new Promise((resolve) => {
65
- setTimeout(resolve, delay);
66
- });
67
- continue;
68
- }
69
- break;
70
- }
43
+ )
44
+ ] });
71
45
  }
72
46
  export {
73
- streamWithRetry
47
+ BranchSwitcher
74
48
  };
75
49
  //# sourceMappingURL=index.es38.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es38.js","sources":["../node_modules/.pnpm/@langchain+langgraph-sdk@1.5.3_@langchain+core@1.1.13_openai@6.16.0_zod@4.3.5___react-d_6e8116ad15c37793c6138fe0d58aa04e/node_modules/@langchain/langgraph-sdk/dist/utils/stream.js"],"sourcesContent":["import { isNetworkError } from \"./error.js\";\n\n//#region src/utils/stream.ts\n/**\n* Error thrown when maximum reconnection attempts are exceeded.\n*/\nvar MaxReconnectAttemptsError = class extends Error {\n\tconstructor(maxAttempts, cause) {\n\t\tsuper(`Exceeded maximum SSE reconnection attempts (${maxAttempts})`);\n\t\tthis.name = \"MaxReconnectAttemptsError\";\n\t\tthis.cause = cause;\n\t}\n};\n/**\n* Stream with automatic retry logic for SSE connections.\n* Implements reconnection behavior similar to the Python SDK.\n*\n* @param makeRequest Function to make requests. When `params` is undefined/empty, it's the initial request.\n* When `params.reconnectPath` is provided, it's a reconnection request.\n* @param options Configuration options\n* @returns AsyncGenerator yielding stream events\n*/\nasync function* streamWithRetry(makeRequest, options = {}) {\n\tconst maxRetries = options.maxRetries ?? 5;\n\tlet attempt = 0;\n\tlet lastEventId;\n\tlet reconnectPath;\n\twhile (true) {\n\t\tlet shouldRetry = false;\n\t\tlet lastError;\n\t\tlet reader;\n\t\ttry {\n\t\t\tif (options.signal?.aborted) return;\n\t\t\tconst { response, stream } = await makeRequest(reconnectPath ? {\n\t\t\t\tlastEventId,\n\t\t\t\treconnectPath\n\t\t\t} : void 0);\n\t\t\tconst locationHeader = response.headers.get(\"location\");\n\t\t\tif (locationHeader) reconnectPath = locationHeader;\n\t\t\tconst contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n\t\t\tif (contentType && !contentType.includes(\"text/event-stream\")) throw new Error(`Expected response header Content-Type to contain 'text/event-stream', got '${contentType}'`);\n\t\t\treader = stream.getReader();\n\t\t\ttry {\n\t\t\t\twhile (true) {\n\t\t\t\t\tif (options.signal?.aborted) {\n\t\t\t\t\t\tawait reader.cancel();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\t\tif (done) break;\n\t\t\t\t\tif (value.id) lastEventId = value.id;\n\t\t\t\t\tyield value;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} catch (error) {\n\t\t\t\tif (reconnectPath && !options.signal?.aborted) shouldRetry = true;\n\t\t\t\telse throw error;\n\t\t\t} finally {\n\t\t\t\tif (reader) try {\n\t\t\t\t\treader.releaseLock();\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlastError = error;\n\t\t\tif (isNetworkError(error) && reconnectPath && !options.signal?.aborted) shouldRetry = true;\n\t\t\telse throw error;\n\t\t}\n\t\tif (shouldRetry) {\n\t\t\tattempt += 1;\n\t\t\tif (attempt > maxRetries) throw new MaxReconnectAttemptsError(maxRetries, lastError);\n\t\t\toptions.onReconnect?.({\n\t\t\t\tattempt,\n\t\t\t\tlastEventId,\n\t\t\t\tcause: lastError\n\t\t\t});\n\t\t\tconst delay = Math.min(1e3 * 2 ** (attempt - 1), 5e3) + Math.random() * 1e3;\n\t\t\tawait new Promise((resolve) => {\n\t\t\t\tsetTimeout(resolve, delay);\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tbreak;\n\t}\n}\nvar IterableReadableStream = class IterableReadableStream extends ReadableStream {\n\treader;\n\tensureReader() {\n\t\tif (!this.reader) this.reader = this.getReader();\n\t}\n\tasync next() {\n\t\tthis.ensureReader();\n\t\ttry {\n\t\t\tconst result = await this.reader.read();\n\t\t\tif (result.done) {\n\t\t\t\tthis.reader.releaseLock();\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: void 0\n\t\t\t\t};\n\t\t\t} else return {\n\t\t\t\tdone: false,\n\t\t\t\tvalue: result.value\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tthis.reader.releaseLock();\n\t\t\tthrow e;\n\t\t}\n\t}\n\tasync return() {\n\t\tthis.ensureReader();\n\t\tif (this.locked) {\n\t\t\tconst cancelPromise = this.reader.cancel();\n\t\t\tthis.reader.releaseLock();\n\t\t\tawait cancelPromise;\n\t\t}\n\t\treturn {\n\t\t\tdone: true,\n\t\t\tvalue: void 0\n\t\t};\n\t}\n\tasync throw(e) {\n\t\tthis.ensureReader();\n\t\tif (this.locked) {\n\t\t\tconst cancelPromise = this.reader.cancel();\n\t\t\tthis.reader.releaseLock();\n\t\t\tawait cancelPromise;\n\t\t}\n\t\tthrow e;\n\t}\n\tasync [Symbol.asyncDispose]() {\n\t\tawait this.return();\n\t}\n\t[Symbol.asyncIterator]() {\n\t\treturn this;\n\t}\n\tstatic fromReadableStream(stream) {\n\t\tconst reader = stream.getReader();\n\t\treturn new IterableReadableStream({\n\t\t\tstart(controller) {\n\t\t\t\treturn pump();\n\t\t\t\tfunction pump() {\n\t\t\t\t\treturn reader.read().then(({ done, value }) => {\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontroller.enqueue(value);\n\t\t\t\t\t\treturn pump();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tcancel() {\n\t\t\t\treader.releaseLock();\n\t\t\t}\n\t\t});\n\t}\n\tstatic fromAsyncGenerator(generator) {\n\t\treturn new IterableReadableStream({\n\t\t\tasync pull(controller) {\n\t\t\t\tconst { value, done } = await generator.next();\n\t\t\t\tif (done) controller.close();\n\t\t\t\tcontroller.enqueue(value);\n\t\t\t},\n\t\t\tasync cancel(reason) {\n\t\t\t\tawait generator.return(reason);\n\t\t\t}\n\t\t});\n\t}\n};\n\n//#endregion\nexport { IterableReadableStream, streamWithRetry };\n//# sourceMappingURL=stream.js.map"],"names":[],"mappings":";AAMA,IAAI,4BAA4B,cAAc,MAAM;AAAA,EACnD,YAAY,aAAa,OAAO;AAC/B,UAAM,+CAA+C,WAAW,GAAG;AACnE,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACd;AACD;AAUA,gBAAgB,gBAAgB,aAAa,UAAU,IAAI;AAC1D,QAAM,aAAa,QAAQ,cAAc;AACzC,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AACJ,SAAO,MAAM;AACZ,QAAI,cAAc;AAClB,QAAI;AACJ,QAAI;AACJ,QAAI;AACH,UAAI,QAAQ,QAAQ,QAAS;AAC7B,YAAM,EAAE,UAAU,OAAM,IAAK,MAAM,YAAY,gBAAgB;AAAA,QAC9D;AAAA,QACA;AAAA,MACJ,IAAO,MAAM;AACV,YAAM,iBAAiB,SAAS,QAAQ,IAAI,UAAU;AACtD,UAAI,eAAgB,iBAAgB;AACpC,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC;AACtE,UAAI,eAAe,CAAC,YAAY,SAAS,mBAAmB,EAAG,OAAM,IAAI,MAAM,8EAA8E,WAAW,GAAG;AAC3K,eAAS,OAAO,UAAS;AACzB,UAAI;AACH,eAAO,MAAM;AACZ,cAAI,QAAQ,QAAQ,SAAS;AAC5B,kBAAM,OAAO,OAAM;AACnB;AAAA,UACD;AACA,gBAAM,EAAE,MAAM,MAAK,IAAK,MAAM,OAAO,KAAI;AACzC,cAAI,KAAM;AACV,cAAI,MAAM,GAAI,eAAc,MAAM;AAClC,gBAAM;AAAA,QACP;AACA;AAAA,MACD,SAAS,OAAO;AACf,YAAI,iBAAiB,CAAC,QAAQ,QAAQ,QAAS,eAAc;AAAA,YACxD,OAAM;AAAA,MACZ,UAAC;AACA,YAAI,OAAQ,KAAI;AACf,iBAAO,YAAW;AAAA,QACnB,QAAQ;AAAA,QAAC;AAAA,MACV;AAAA,IACD,SAAS,OAAO;AACf,kBAAY;AACZ,UAAI,eAAe,KAAK,KAAK,iBAAiB,CAAC,QAAQ,QAAQ,QAAS,eAAc;AAAA,UACjF,OAAM;AAAA,IACZ;AACA,QAAI,aAAa;AAChB,iBAAW;AACX,UAAI,UAAU,WAAY,OAAM,IAAI,0BAA0B,YAAY,SAAS;AACnF,cAAQ,cAAc;AAAA,QACrB;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACX,CAAI;AACD,YAAM,QAAQ,KAAK,IAAI,MAAM,MAAM,UAAU,IAAI,GAAG,IAAI,KAAK,OAAM,IAAK;AACxE,YAAM,IAAI,QAAQ,CAAC,YAAY;AAC9B,mBAAW,SAAS,KAAK;AAAA,MAC1B,CAAC;AACD;AAAA,IACD;AACA;AAAA,EACD;AACD;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.es38.js","sources":["../src/components/messages/BranchSwitcher.tsx"],"sourcesContent":["import { Button } from \"@/components/ui/button\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport interface BranchSwitcherProps {\n branch: string;\n branchOptions: string[];\n onSelect: (branch: string) => void;\n isLoading: boolean;\n}\n\nexport function BranchSwitcher({\n branch,\n branchOptions,\n onSelect,\n isLoading,\n}: BranchSwitcherProps) {\n if (branchOptions.length <= 1) return null;\n\n const currentIndex = branchOptions.indexOf(branch);\n if (currentIndex === -1) return null;\n\n const totalBranches = branchOptions.length;\n\n return (\n <div className=\"flex items-center gap-2 text-xs text-zinc-500\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 p-1 h-6 w-6 hover:bg-zinc-800 hover:text-zinc-300\"\n onClick={() => onSelect(branchOptions[currentIndex - 1])}\n disabled={isLoading || currentIndex === 0}\n title=\"Previous response\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <span className=\"text-xs text-zinc-400 font-medium min-w-[3rem] text-center\">\n {currentIndex + 1} / {totalBranches}\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 p-1 h-6 w-6 hover:bg-zinc-800 hover:text-zinc-300\"\n onClick={() => onSelect(branchOptions[currentIndex + 1])}\n disabled={isLoading || currentIndex === totalBranches - 1}\n title=\"Next response\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,MAAI,cAAc,UAAU,EAAG,QAAO;AAEtC,QAAM,eAAe,cAAc,QAAQ,MAAM;AACjD,MAAI,iBAAiB,GAAI,QAAO;AAEhC,QAAM,gBAAgB,cAAc;AAEpC,SACE,qBAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,SAAS,cAAc,eAAe,CAAC,CAAC;AAAA,QACvD,UAAU,aAAa,iBAAiB;AAAA,QACxC,OAAM;AAAA,QAEN,UAAA,oBAAC,aAAA,EAAY,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEnC,qBAAC,QAAA,EAAK,WAAU,8DACb,UAAA;AAAA,MAAA,eAAe;AAAA,MAAE;AAAA,MAAI;AAAA,IAAA,GACxB;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,SAAS,cAAc,eAAe,CAAC,CAAC;AAAA,QACvD,UAAU,aAAa,iBAAiB,gBAAgB;AAAA,QACxD,OAAM;AAAA,QAEN,UAAA,oBAAC,cAAA,EAAa,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACpC,GACF;AAEJ;"}