langgraph-ui-components 0.0.11-testing → 0.0.12

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 (249) hide show
  1. package/dist/index.es.js +2 -3
  2. package/dist/index.es10.js +6 -25
  3. package/dist/index.es10.js.map +1 -1
  4. package/dist/index.es100.js +156 -127
  5. package/dist/index.es100.js.map +1 -1
  6. package/dist/index.es101.js +195 -62
  7. package/dist/index.es101.js.map +1 -1
  8. package/dist/index.es102.js +14 -37
  9. package/dist/index.es102.js.map +1 -1
  10. package/dist/index.es103.js +27 -34
  11. package/dist/index.es103.js.map +1 -1
  12. package/dist/index.es104.js +25 -157
  13. package/dist/index.es104.js.map +1 -1
  14. package/dist/index.es105.js +3130 -176
  15. package/dist/index.es105.js.map +1 -1
  16. package/dist/index.es106.js +36 -13
  17. package/dist/index.es106.js.map +1 -1
  18. package/dist/index.es107.js +5 -30
  19. package/dist/index.es107.js.map +1 -1
  20. package/dist/index.es108.js +69 -30
  21. package/dist/index.es108.js.map +1 -1
  22. package/dist/index.es109.js +28 -3148
  23. package/dist/index.es109.js.map +1 -1
  24. package/dist/index.es11.js +6 -1
  25. package/dist/index.es11.js.map +1 -1
  26. package/dist/index.es113.js +5 -16
  27. package/dist/index.es113.js.map +1 -1
  28. package/dist/index.es114.js +2 -7
  29. package/dist/index.es114.js.map +1 -1
  30. package/dist/index.es115.js +13 -2
  31. package/dist/index.es115.js.map +1 -1
  32. package/dist/index.es116.js +499 -9
  33. package/dist/index.es116.js.map +1 -1
  34. package/dist/index.es117.js +5 -501
  35. package/dist/index.es117.js.map +1 -1
  36. package/dist/index.es118.js +2 -7
  37. package/dist/index.es118.js.map +1 -1
  38. package/dist/index.es119.js +148 -2
  39. package/dist/index.es119.js.map +1 -1
  40. package/dist/index.es120.js +878 -118
  41. package/dist/index.es120.js.map +1 -1
  42. package/dist/index.es121.js +251 -877
  43. package/dist/index.es121.js.map +1 -1
  44. package/dist/index.es122.js +3 -281
  45. package/dist/index.es122.js.map +1 -1
  46. package/dist/index.es123.js +445 -3
  47. package/dist/index.es123.js.map +1 -1
  48. package/dist/index.es124.js +38 -436
  49. package/dist/index.es124.js.map +1 -1
  50. package/dist/index.es125.js +22 -46
  51. package/dist/index.es125.js.map +1 -1
  52. package/dist/index.es126.js +78 -21
  53. package/dist/index.es126.js.map +1 -1
  54. package/dist/index.es127.js +126 -76
  55. package/dist/index.es127.js.map +1 -1
  56. package/dist/index.es128.js +45 -125
  57. package/dist/index.es128.js.map +1 -1
  58. package/dist/index.es129.js +9 -48
  59. package/dist/index.es129.js.map +1 -1
  60. package/dist/index.es13.js +6 -6
  61. package/dist/index.es130.js +45 -10
  62. package/dist/index.es130.js.map +1 -1
  63. package/dist/index.es131.js +97 -43
  64. package/dist/index.es131.js.map +1 -1
  65. package/dist/index.es132.js +48 -94
  66. package/dist/index.es132.js.map +1 -1
  67. package/dist/index.es133.js +14 -51
  68. package/dist/index.es133.js.map +1 -1
  69. package/dist/index.es15.js +59 -31
  70. package/dist/index.es15.js.map +1 -1
  71. package/dist/index.es16.js +4 -4
  72. package/dist/index.es16.js.map +1 -1
  73. package/dist/index.es183.js +13 -162
  74. package/dist/index.es183.js.map +1 -1
  75. package/dist/index.es184.js +89 -2
  76. package/dist/index.es184.js.map +1 -1
  77. package/dist/index.es185.js +2 -15
  78. package/dist/index.es185.js.map +1 -1
  79. package/dist/index.es186.js +54 -87
  80. package/dist/index.es186.js.map +1 -1
  81. package/dist/index.es187.js +100 -2
  82. package/dist/index.es187.js.map +1 -1
  83. package/dist/index.es188.js +185 -50
  84. package/dist/index.es188.js.map +1 -1
  85. package/dist/index.es189.js +96 -86
  86. package/dist/index.es189.js.map +1 -1
  87. package/dist/index.es190.js +31 -187
  88. package/dist/index.es190.js.map +1 -1
  89. package/dist/index.es191.js +9 -109
  90. package/dist/index.es191.js.map +1 -1
  91. package/dist/index.es192.js +11 -35
  92. package/dist/index.es192.js.map +1 -1
  93. package/dist/index.es193.js +12 -10
  94. package/dist/index.es193.js.map +1 -1
  95. package/dist/index.es194.js +90 -10
  96. package/dist/index.es194.js.map +1 -1
  97. package/dist/index.es195.js +274 -11
  98. package/dist/index.es195.js.map +1 -1
  99. package/dist/index.es196.js +2 -91
  100. package/dist/index.es196.js.map +1 -1
  101. package/dist/index.es197.js +150 -261
  102. package/dist/index.es197.js.map +1 -1
  103. package/dist/index.es198.js +51 -2
  104. package/dist/index.es198.js.map +1 -1
  105. package/dist/index.es199.js +34 -158
  106. package/dist/index.es199.js.map +1 -1
  107. package/dist/index.es2.js +84 -46
  108. package/dist/index.es2.js.map +1 -1
  109. package/dist/index.es20.js +2 -2
  110. package/dist/index.es200.js +34 -50
  111. package/dist/index.es200.js.map +1 -1
  112. package/dist/index.es201.js +32 -32
  113. package/dist/index.es201.js.map +1 -1
  114. package/dist/index.es202.js +23 -34
  115. package/dist/index.es202.js.map +1 -1
  116. package/dist/index.es203.js +583 -32
  117. package/dist/index.es203.js.map +1 -1
  118. package/dist/index.es204.js +121 -20
  119. package/dist/index.es204.js.map +1 -1
  120. package/dist/index.es205.js +158 -585
  121. package/dist/index.es205.js.map +1 -1
  122. package/dist/index.es206.js +2 -125
  123. package/dist/index.es206.js.map +1 -1
  124. package/dist/index.es22.js +15 -119
  125. package/dist/index.es22.js.map +1 -1
  126. package/dist/index.es23.js +37 -17
  127. package/dist/index.es23.js.map +1 -1
  128. package/dist/index.es24.js +27 -34
  129. package/dist/index.es24.js.map +1 -1
  130. package/dist/index.es25.js +145 -28
  131. package/dist/index.es25.js.map +1 -1
  132. package/dist/index.es252.js +2 -2
  133. package/dist/index.es253.js +1 -1
  134. package/dist/index.es258.js +1 -1
  135. package/dist/index.es26.js +100 -144
  136. package/dist/index.es26.js.map +1 -1
  137. package/dist/index.es260.js +2 -2
  138. package/dist/index.es262.js +2 -2
  139. package/dist/index.es265.js +1 -1
  140. package/dist/index.es267.js +1 -1
  141. package/dist/index.es27.js +66 -101
  142. package/dist/index.es27.js.map +1 -1
  143. package/dist/index.es277.js +147 -2
  144. package/dist/index.es277.js.map +1 -1
  145. package/dist/index.es278.js +167 -126
  146. package/dist/index.es278.js.map +1 -1
  147. package/dist/index.es279.js +2 -188
  148. package/dist/index.es279.js.map +1 -1
  149. package/dist/index.es28.js +121 -68
  150. package/dist/index.es28.js.map +1 -1
  151. package/dist/index.es280.js +1 -1
  152. package/dist/index.es283.js +1 -1
  153. package/dist/index.es288.js +1 -1
  154. package/dist/index.es29.js +1 -1
  155. package/dist/index.es3.js +10 -42
  156. package/dist/index.es3.js.map +1 -1
  157. package/dist/index.es300.js +1 -1
  158. package/dist/index.es302.js +1 -1
  159. package/dist/index.es314.js +1 -1
  160. package/dist/index.es334.js +2 -2
  161. package/dist/index.es4.js +1 -2
  162. package/dist/index.es4.js.map +1 -1
  163. package/dist/index.es43.js +5 -5
  164. package/dist/index.es45.js +1 -1
  165. package/dist/index.es49.js +3 -3
  166. package/dist/index.es5.js.map +1 -1
  167. package/dist/index.es50.js +208 -5
  168. package/dist/index.es50.js.map +1 -1
  169. package/dist/index.es51.js +5 -208
  170. package/dist/index.es51.js.map +1 -1
  171. package/dist/index.es52.js +3 -3
  172. package/dist/index.es61.js +1 -1
  173. package/dist/index.es62.js +2 -2
  174. package/dist/index.es64.js +142 -5
  175. package/dist/index.es64.js.map +1 -1
  176. package/dist/index.es65.js +285 -148
  177. package/dist/index.es65.js.map +1 -1
  178. package/dist/index.es66.js +62 -668
  179. package/dist/index.es66.js.map +1 -1
  180. package/dist/index.es67.js +201 -131
  181. package/dist/index.es67.js.map +1 -1
  182. package/dist/index.es68.js +29 -295
  183. package/dist/index.es68.js.map +1 -1
  184. package/dist/index.es69.js +8 -65
  185. package/dist/index.es69.js.map +1 -1
  186. package/dist/index.es7.js +1 -2
  187. package/dist/index.es7.js.map +1 -1
  188. package/dist/index.es70.js +9 -210
  189. package/dist/index.es70.js.map +1 -1
  190. package/dist/index.es71.js +181 -28
  191. package/dist/index.es71.js.map +1 -1
  192. package/dist/index.es72.js +23 -8
  193. package/dist/index.es72.js.map +1 -1
  194. package/dist/index.es73.js +1397 -9
  195. package/dist/index.es73.js.map +1 -1
  196. package/dist/index.es74.js +9 -187
  197. package/dist/index.es74.js.map +1 -1
  198. package/dist/index.es75.js +8 -24
  199. package/dist/index.es75.js.map +1 -1
  200. package/dist/index.es76.js +5 -1399
  201. package/dist/index.es76.js.map +1 -1
  202. package/dist/index.es77.js +163 -9
  203. package/dist/index.es77.js.map +1 -1
  204. package/dist/index.es78.js +672 -8
  205. package/dist/index.es78.js.map +1 -1
  206. package/dist/index.es79.js +11 -36
  207. package/dist/index.es79.js.map +1 -1
  208. package/dist/index.es80.js +40 -5
  209. package/dist/index.es80.js.map +1 -1
  210. package/dist/index.es81.js +32 -71
  211. package/dist/index.es81.js.map +1 -1
  212. package/dist/index.es82.js +225 -30
  213. package/dist/index.es82.js.map +1 -1
  214. package/dist/index.es83.js +29 -11
  215. package/dist/index.es83.js.map +1 -1
  216. package/dist/index.es84.js +72 -37
  217. package/dist/index.es84.js.map +1 -1
  218. package/dist/index.es85.js +74 -32
  219. package/dist/index.es85.js.map +1 -1
  220. package/dist/index.es86.js +46 -226
  221. package/dist/index.es86.js.map +1 -1
  222. package/dist/index.es87.js +6 -6
  223. package/dist/index.es87.js.map +1 -1
  224. package/dist/index.es88.js +39 -71
  225. package/dist/index.es88.js.map +1 -1
  226. package/dist/index.es89.js +54 -73
  227. package/dist/index.es89.js.map +1 -1
  228. package/dist/index.es90.js +13 -52
  229. package/dist/index.es90.js.map +1 -1
  230. package/dist/index.es91.js +135 -28
  231. package/dist/index.es91.js.map +1 -1
  232. package/dist/index.es92.js +20 -42
  233. package/dist/index.es92.js.map +1 -1
  234. package/dist/index.es93.js +175 -50
  235. package/dist/index.es93.js.map +1 -1
  236. package/dist/index.es94.js +239 -11
  237. package/dist/index.es94.js.map +1 -1
  238. package/dist/index.es95.js +348 -130
  239. package/dist/index.es95.js.map +1 -1
  240. package/dist/index.es96.js +134 -18
  241. package/dist/index.es96.js.map +1 -1
  242. package/dist/index.es97.js +61 -173
  243. package/dist/index.es97.js.map +1 -1
  244. package/dist/index.es98.js +30 -234
  245. package/dist/index.es98.js.map +1 -1
  246. package/dist/index.es99.js +26 -344
  247. package/dist/index.es99.js.map +1 -1
  248. package/dist/styles.css +1 -1
  249. package/package.json +1 -1
@@ -1,34 +1,151 @@
1
- import { jsx, Fragment } from "react/jsx-runtime";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { useStreamContext } from "./index.es7.js";
3
- import { useCustomComponents } from "./index.es9.js";
4
- import "./index.es20.js";
5
- import React__default from "react";
6
- import { LoadExternalComponent } from "./index.es22.js";
7
- function CustomComponentRender({
8
- message,
9
- thread
10
- }) {
11
- const { values } = useStreamContext();
12
- const { components } = useCustomComponents();
13
- const customComponents = React__default.useMemo(() => {
14
- return values.ui?.filter(
15
- (ui) => ui?.metadata?.id === message.id || ui?.metadata?.message_id === message.id || ui?.id === message.id
3
+ import { X, Send, Pencil, Copy, FileIcon, CircleUser } from "lucide-react";
4
+ import React__default, { useState } from "react";
5
+ function HumanMessage({ message }) {
6
+ const [isEditing, setIsEditing] = useState(false);
7
+ const [editedText, setEditedText] = useState("");
8
+ const thread = useStreamContext();
9
+ const meta = thread.getMessagesMetadata(message);
10
+ const parentCheckpoint = meta?.firstSeenState?.parent_checkpoint;
11
+ const content = message.content;
12
+ let textContent = "";
13
+ let documents = [];
14
+ if (typeof content === "string") {
15
+ textContent = content;
16
+ } else if (Array.isArray(content)) {
17
+ textContent = content.filter((c) => c.type === "text").map((c) => c.type === "text" ? c.text : "").join("");
18
+ documents = content.filter((c) => c.type === "document") ?? [];
19
+ }
20
+ const handleSubmitEdit = () => {
21
+ if (!editedText.trim()) {
22
+ return;
23
+ }
24
+ setIsEditing(false);
25
+ const newMessage = { type: "human", content: editedText };
26
+ thread.submit(
27
+ { messages: [newMessage] },
28
+ {
29
+ checkpoint: parentCheckpoint,
30
+ streamMode: ["values"],
31
+ streamSubgraphs: true,
32
+ streamResumable: true,
33
+ optimisticValues: (prev) => {
34
+ const values = meta?.firstSeenState?.values;
35
+ if (!values) return prev;
36
+ return {
37
+ ...values,
38
+ messages: [...values.messages ?? [], newMessage]
39
+ };
40
+ }
41
+ }
16
42
  );
17
- }, [values.ui, message.id]);
18
- if (!customComponents?.length) return null;
19
- return /* @__PURE__ */ jsx(Fragment, { children: customComponents?.filter((c) => !!components?.[c.name]).map((customComponent, index) => /* @__PURE__ */ jsx(
20
- LoadExternalComponent,
21
- {
22
- stream: thread,
23
- message: customComponent,
24
- components,
25
- meta: { ui: customComponent }
26
- },
27
- customComponent._key || `${message.id}-${customComponent.id || index}`
28
- )) });
43
+ };
44
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-end gap-3 justify-end w-full group my-1", children: [
45
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col gap-2 items-end min-w-0", children: [
46
+ /* @__PURE__ */ jsx("span", { className: "text-zinc-400 text-xs font-medium mr-1 opacity-80", children: "You" }),
47
+ textContent && /* @__PURE__ */ jsx("div", { className: "relative", children: isEditing ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 w-full", children: [
48
+ /* @__PURE__ */ jsx(
49
+ "textarea",
50
+ {
51
+ value: editedText,
52
+ onChange: (e) => setEditedText(e.target.value),
53
+ onKeyDown: (e) => {
54
+ if (e.key === "Enter") {
55
+ e.preventDefault();
56
+ handleSubmitEdit();
57
+ }
58
+ },
59
+ className: "text-[15px] font-normal leading-relaxed rounded-2xl rounded-tr-sm px-5 py-3.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]",
60
+ autoFocus: true
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2", children: [
64
+ /* @__PURE__ */ jsxs(
65
+ "button",
66
+ {
67
+ onClick: () => {
68
+ setIsEditing(false);
69
+ setEditedText("");
70
+ },
71
+ 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",
72
+ children: [
73
+ /* @__PURE__ */ jsx(X, { size: 14 }),
74
+ "Cancel"
75
+ ]
76
+ }
77
+ ),
78
+ /* @__PURE__ */ jsxs(
79
+ "button",
80
+ {
81
+ onClick: handleSubmitEdit,
82
+ disabled: !editedText.trim(),
83
+ 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",
84
+ children: [
85
+ /* @__PURE__ */ jsx(Send, { size: 14 }),
86
+ "Send"
87
+ ]
88
+ }
89
+ )
90
+ ] })
91
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
92
+ /* @__PURE__ */ jsx("div", { className: "text-[15px] font-normal leading-relaxed rounded-2xl rounded-tr-sm px-5 py-3.5 bg-zinc-900 border border-zinc-900 text-white shadow-lg max-w-full break-words overflow-wrap-anywhere ", children: textContent }),
93
+ /* @__PURE__ */ jsxs(
94
+ "div",
95
+ {
96
+ className: "\n absolute right-1 my-2 flex items-center gap-2\n opacity-0 group-hover:opacity-100\n transition-opacity duration-300\n z-10\n ",
97
+ children: [
98
+ /* @__PURE__ */ jsx(
99
+ Pencil,
100
+ {
101
+ size: 16,
102
+ className: "text-zinc-500 cursor-pointer hover:text-white",
103
+ onClick: () => {
104
+ setIsEditing(true);
105
+ setEditedText(textContent);
106
+ }
107
+ }
108
+ ),
109
+ /* @__PURE__ */ jsx(
110
+ Copy,
111
+ {
112
+ size: 16,
113
+ className: "text-zinc-500 cursor-pointer hover:text-white",
114
+ onClick: () => {
115
+ navigator.clipboard.writeText(textContent);
116
+ }
117
+ }
118
+ )
119
+ ]
120
+ }
121
+ )
122
+ ] }) }),
123
+ documents.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 max-w-[90%]", children: documents.map((doc, idx) => /* @__PURE__ */ jsxs(
124
+ "div",
125
+ {
126
+ className: "flex items-center gap-3 bg-gradient-to-br from-zinc-800/90 to-zinc-900/90 backdrop-blur-sm px-4 py-2.5 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",
127
+ children: [
128
+ /* @__PURE__ */ jsx("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", children: /* @__PURE__ */ jsx(FileIcon, { size: 16, className: "text-blue-400 shrink-0" }) }),
129
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-zinc-200 truncate font-medium", children: doc.source?.filename || `Document ${idx + 1}` })
130
+ ]
131
+ },
132
+ `${message.id}-doc-${idx}`
133
+ )) })
134
+ ] }),
135
+ /* @__PURE__ */ jsx(
136
+ "div",
137
+ {
138
+ className: "size-9 shrink-0 flex items-center justify-center",
139
+ "data-alt": "User Avatar",
140
+ children: /* @__PURE__ */ jsx(CircleUser, { className: "text-white", size: 22 })
141
+ }
142
+ )
143
+ ] });
29
144
  }
30
- const CustomComponentRender$1 = React__default.memo(CustomComponentRender);
145
+ const HumanMessage$1 = React__default.memo(HumanMessage, (prevProps, nextProps) => {
146
+ return prevProps.message.id === nextProps.message.id;
147
+ });
31
148
  export {
32
- CustomComponentRender$1 as default
149
+ HumanMessage$1 as default
33
150
  };
34
151
  //# sourceMappingURL=index.es25.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es25.js","sources":["../src/components/messages/CustomComponentRender.tsx"],"sourcesContent":["import { useStreamContext } from \"@/providers/Stream\";\nimport { useCustomComponents } from \"@/providers/CustomComponentProvider\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport { LoadExternalComponent } from \"@langchain/langgraph-sdk/react-ui\";\nimport { Fragment } from \"react/jsx-runtime\";\nimport React from \"react\";\nimport { logger } from \"@/utils/logger\";\n\nfunction CustomComponentRender({\n message,\n thread,\n}: {\n message: Message;\n thread: ReturnType<typeof useStreamContext>;\n}) {\n const { values } = useStreamContext();\n const { components } = useCustomComponents();\n \n // Memoize filtered components to prevent unnecessary re-renders\n const customComponents = React.useMemo(() => {\n return values.ui?.filter((ui) => \n ui?.metadata?.id === message.id || ui?.metadata?.message_id === message.id || ui?.id === message.id\n );\n }, [values.ui, message.id]);\n\n logger.debug(\"CustomComponentRender - customComponents:\", message);\n logger.debug(\"CustomComponentRender - available components:\", values);\n\n\n if (!customComponents?.length) return null;\n \n return (\n <Fragment>\n {customComponents\n ?.filter((c) => !!components?.[c.name as keyof typeof components])\n .map((customComponent, index) => (\n <LoadExternalComponent\n key={(customComponent as any)._key || `${message.id}-${customComponent.id || index}`}\n stream={thread}\n message={customComponent}\n components={components}\n meta={{ ui: customComponent }}\n />\n ))}\n </Fragment>\n );\n}\n\nexport default React.memo(CustomComponentRender);"],"names":["React"],"mappings":";;;;;;AAQA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,OAAA,IAAW,iBAAA;AACnB,QAAM,EAAE,WAAA,IAAe,oBAAA;AAGvB,QAAM,mBAAmBA,eAAM,QAAQ,MAAM;AAC3C,WAAO,OAAO,IAAI;AAAA,MAAO,CAAC,OACxB,IAAI,UAAU,OAAO,QAAQ,MAAM,IAAI,UAAU,eAAe,QAAQ,MAAM,IAAI,OAAO,QAAQ;AAAA,IAAA;AAAA,EAErG,GAAG,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;AAM1B,MAAI,CAAC,kBAAkB,OAAQ,QAAO;AAEtC,6BACG,UAAA,EACE,UAAA,kBACG,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,IAA+B,CAAC,EAChE,IAAI,CAAC,iBAAiB,UACrB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,MAAM,EAAE,IAAI,gBAAA;AAAA,IAAgB;AAAA,IAJtB,gBAAwB,QAAQ,GAAG,QAAQ,EAAE,IAAI,gBAAgB,MAAM,KAAK;AAAA,EAAA,CAMrF,GACL;AAEJ;AAEA,MAAA,0BAAeA,eAAM,KAAK,qBAAqB;"}
1
+ {"version":3,"file":"index.es25.js","sources":["../src/components/messages/HumanMessage.tsx"],"sourcesContent":["import { useStreamContext } from \"@/providers/Stream\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport { CircleUser, 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 items-end gap-3 justify-end w-full group my-1\">\n <div className=\"flex flex-1 flex-col gap-2 items-end min-w-0\">\n <span className=\"text-zinc-400 text-xs font-medium mr-1 opacity-80\">\n You\n </span>\n\n {textContent && (\n <div className=\"relative\">\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 rounded-tr-sm px-5 py-3.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={14} />\n Cancel\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={14} />\n Send\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className=\"text-[15px] font-normal leading-relaxed rounded-2xl rounded-tr-sm px-5 py-3.5 bg-zinc-900 border border-zinc-900 text-white shadow-lg max-w-full break-words overflow-wrap-anywhere \">\n {textContent}\n </div>\n <div\n className=\"\n absolute right-1 my-2 flex items-center gap-2\n opacity-0 group-hover:opacity-100\n transition-opacity duration-300\n z-10\n \"\n >\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\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 )}\n </div>\n )}\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-2.5 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 </div>\n\n <div\n className=\"size-9 shrink-0 flex items-center justify-center\"\n data-alt=\"User Avatar\"\n >\n <CircleUser className=\"text-white\" size={22} />\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,5 +1,5 @@
1
- import javascript from "./index.es278.js";
2
- import markup from "./index.es279.js";
1
+ import javascript from "./index.es277.js";
2
+ import markup from "./index.es278.js";
3
3
  jsx.displayName = "jsx";
4
4
  jsx.aliases = [];
5
5
  function jsx(Prism) {
@@ -1,4 +1,4 @@
1
- import javascript from "./index.es278.js";
1
+ import javascript from "./index.es277.js";
2
2
  typescript.displayName = "typescript";
3
3
  typescript.aliases = ["ts"];
4
4
  function typescript(Prism) {
@@ -1,4 +1,4 @@
1
- import { __exports as lowerBound } from "./index.es277.js";
1
+ import { __exports as lowerBound } from "./index.es279.js";
2
2
  var hasRequiredLowerBound;
3
3
  function requireLowerBound() {
4
4
  if (hasRequiredLowerBound) return lowerBound;
@@ -1,151 +1,107 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { useStreamContext } from "./index.es7.js";
3
- import { X, Send, Pencil, Copy, FileIcon, CircleUser } from "lucide-react";
4
- import React__default, { useState } from "react";
5
- function HumanMessage({ message }) {
6
- const [isEditing, setIsEditing] = useState(false);
7
- const [editedText, setEditedText] = useState("");
8
- const thread = useStreamContext();
9
- const meta = thread.getMessagesMetadata(message);
10
- const parentCheckpoint = meta?.firstSeenState?.parent_checkpoint;
11
- const content = message.content;
12
- let textContent = "";
13
- let documents = [];
14
- if (typeof content === "string") {
15
- textContent = content;
16
- } else if (Array.isArray(content)) {
17
- textContent = content.filter((c) => c.type === "text").map((c) => c.type === "text" ? c.text : "").join("");
18
- documents = content.filter((c) => c.type === "document") ?? [];
19
- }
20
- const handleSubmitEdit = () => {
21
- if (!editedText.trim()) {
22
- return;
23
- }
24
- setIsEditing(false);
25
- const newMessage = { type: "human", content: editedText };
26
- thread.submit(
27
- { messages: [newMessage] },
28
- {
29
- checkpoint: parentCheckpoint,
30
- streamMode: ["values"],
31
- streamSubgraphs: true,
32
- streamResumable: true,
33
- optimisticValues: (prev) => {
34
- const values = meta?.firstSeenState?.values;
35
- if (!values) return prev;
36
- return {
37
- ...values,
38
- messages: [...values.messages ?? [], newMessage]
39
- };
40
- }
41
- }
42
- );
43
- };
44
- return /* @__PURE__ */ jsxs("div", { className: "flex items-end gap-3 justify-end w-full group my-1", children: [
45
- /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col gap-2 items-end min-w-0", children: [
46
- /* @__PURE__ */ jsx("span", { className: "text-zinc-400 text-xs font-medium mr-1 opacity-80", children: "You" }),
47
- textContent && /* @__PURE__ */ jsx("div", { className: "relative", children: isEditing ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 w-full", children: [
48
- /* @__PURE__ */ jsx(
49
- "textarea",
50
- {
51
- value: editedText,
52
- onChange: (e) => setEditedText(e.target.value),
53
- onKeyDown: (e) => {
54
- if (e.key === "Enter") {
55
- e.preventDefault();
56
- handleSubmitEdit();
57
- }
58
- },
59
- className: "text-[15px] font-normal leading-relaxed rounded-2xl rounded-tr-sm px-5 py-3.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]",
60
- autoFocus: true
61
- }
62
- ),
63
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2", children: [
64
- /* @__PURE__ */ jsxs(
65
- "button",
66
- {
67
- onClick: () => {
68
- setIsEditing(false);
69
- setEditedText("");
70
- },
71
- 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",
72
- children: [
73
- /* @__PURE__ */ jsx(X, { size: 14 }),
74
- "Cancel"
75
- ]
76
- }
77
- ),
78
- /* @__PURE__ */ jsxs(
79
- "button",
80
- {
81
- onClick: handleSubmitEdit,
82
- disabled: !editedText.trim(),
83
- 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",
84
- children: [
85
- /* @__PURE__ */ jsx(Send, { size: 14 }),
86
- "Send"
87
- ]
88
- }
89
- )
90
- ] })
91
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
92
- /* @__PURE__ */ jsx("div", { className: "text-[15px] font-normal leading-relaxed rounded-2xl rounded-tr-sm px-5 py-3.5 bg-zinc-900 border border-zinc-900 text-white shadow-lg max-w-full break-words overflow-wrap-anywhere ", children: textContent }),
93
- /* @__PURE__ */ jsxs(
94
- "div",
95
- {
96
- className: "\n absolute right-1 my-2 flex items-center gap-2\n opacity-0 group-hover:opacity-100\n transition-opacity duration-300\n z-10\n ",
97
- children: [
98
- /* @__PURE__ */ jsx(
99
- Pencil,
100
- {
101
- size: 16,
102
- className: "text-zinc-500 cursor-pointer hover:text-white",
103
- onClick: () => {
104
- setIsEditing(true);
105
- setEditedText(textContent);
106
- }
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;
107
13
  }
108
- ),
109
- /* @__PURE__ */ jsx(
110
- Copy,
111
- {
112
- size: 16,
113
- className: "text-zinc-500 cursor-pointer hover:text-white",
114
- onClick: () => {
115
- navigator.clipboard.writeText(textContent);
116
- }
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;
117
23
  }
118
- )
119
- ]
120
- }
121
- )
122
- ] }) }),
123
- documents.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 max-w-[90%]", children: documents.map((doc, idx) => /* @__PURE__ */ jsxs(
124
- "div",
125
- {
126
- className: "flex items-center gap-3 bg-gradient-to-br from-zinc-800/90 to-zinc-900/90 backdrop-blur-sm px-4 py-2.5 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",
127
- children: [
128
- /* @__PURE__ */ jsx("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", children: /* @__PURE__ */ jsx(FileIcon, { size: 16, className: "text-blue-400 shrink-0" }) }),
129
- /* @__PURE__ */ jsx("span", { className: "text-sm text-zinc-200 truncate font-medium", children: doc.source?.filename || `Document ${idx + 1}` })
130
- ]
131
- },
132
- `${message.id}-doc-${idx}`
133
- )) })
134
- ] }),
135
- /* @__PURE__ */ jsx(
136
- "div",
137
- {
138
- className: "size-9 shrink-0 flex items-center justify-center",
139
- "data-alt": "User Avatar",
140
- children: /* @__PURE__ */ jsx(CircleUser, { className: "text-white", size: 22 })
141
- }
142
- )
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);
86
+ }
87
+ }
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
+ ] })
143
102
  ] });
144
103
  }
145
- const HumanMessage$1 = React__default.memo(HumanMessage, (prevProps, nextProps) => {
146
- return prevProps.message.id === nextProps.message.id;
147
- });
148
104
  export {
149
- HumanMessage$1 as default
105
+ Thinking as default
150
106
  };
151
107
  //# sourceMappingURL=index.es26.js.map
@@ -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 { CircleUser, 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 items-end gap-3 justify-end w-full group my-1\">\n <div className=\"flex flex-1 flex-col gap-2 items-end min-w-0\">\n <span className=\"text-zinc-400 text-xs font-medium mr-1 opacity-80\">\n You\n </span>\n\n {textContent && (\n <div className=\"relative\">\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 rounded-tr-sm px-5 py-3.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={14} />\n Cancel\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={14} />\n Send\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className=\"text-[15px] font-normal leading-relaxed rounded-2xl rounded-tr-sm px-5 py-3.5 bg-zinc-900 border border-zinc-900 text-white shadow-lg max-w-full break-words overflow-wrap-anywhere \">\n {textContent}\n </div>\n <div\n className=\"\n absolute right-1 my-2 flex items-center gap-2\n opacity-0 group-hover:opacity-100\n transition-opacity duration-300\n z-10\n \"\n >\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\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 )}\n </div>\n )}\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-2.5 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 </div>\n\n <div\n className=\"size-9 shrink-0 flex items-center justify-center\"\n data-alt=\"User Avatar\"\n >\n <CircleUser className=\"text-white\" size={22} />\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,8 +1,8 @@
1
1
  import "uuid";
2
- import { RunTree } from "./index.es121.js";
2
+ import { RunTree } from "./index.es120.js";
3
+ import "./index.es117.js";
3
4
  import "./index.es118.js";
4
5
  import "./index.es119.js";
5
- import "./index.es120.js";
6
6
  const __version__ = "0.4.6";
7
7
  export {
8
8
  RunTree,
@@ -1,6 +1,6 @@
1
- import { getEnvironmentVariable } from "./index.es188.js";
1
+ import { getEnvironmentVariable } from "./index.es186.js";
2
2
  import { Client } from "./index.es280.js";
3
- import "./index.es121.js";
3
+ import "./index.es120.js";
4
4
  import "uuid";
5
5
  let client;
6
6
  const getDefaultLangChainClientSingleton = () => {
@@ -1,5 +1,5 @@
1
1
  import { $constructor } from "./index.es264.js";
2
- import { jsonStringifyReplacer } from "./index.es127.js";
2
+ import { jsonStringifyReplacer } from "./index.es126.js";
3
3
  const initializer = (inst, def) => {
4
4
  inst.name = "$ZodError";
5
5
  Object.defineProperty(inst, "_zod", {
@@ -1,4 +1,4 @@
1
- import { globalRegistry } from "./index.es129.js";
1
+ import { globalRegistry } from "./index.es128.js";
2
2
  function initializeContext(params) {
3
3
  let target = params?.target ?? "draft-2020-12";
4
4
  if (target === "draft-4")