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,72 +1,125 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { getContentString } from "./index.es23.js";
3
- import React__default, { useState } from "react";
4
- function ToolCallFunctions({ title, toolMessages }) {
5
- const [open, setOpen] = useState(false);
6
- if (!toolMessages || toolMessages.length === 0) return null;
7
- return /* @__PURE__ */ jsxs(
8
- "div",
9
- {
10
- id: "accordion-collapse",
11
- "data-accordion": "collapse",
12
- className: "w-full rounded-base overflow-hidden shadow-xs border rounded-xl border-zinc-800 max-w-[90%] min-w-25",
13
- children: [
14
- /* @__PURE__ */ jsx("h2", { id: "accordion-collapse-heading-1", children: /* @__PURE__ */ jsxs(
15
- "button",
16
- {
17
- type: "button",
18
- className: "flex items-center justify-between w-full p-2 font-medium gap-3 text-body border-0 outline-none ring-0 appearance-none bg-transparent",
19
- onClick: () => setOpen((v) => !v),
20
- "aria-expanded": open,
21
- "aria-controls": "accordion-collapse-body-1",
22
- children: [
23
- /* @__PURE__ */ jsxs("span", { children: [
24
- "🔷 ",
25
- title
26
- ] }),
27
- /* @__PURE__ */ jsx(
28
- "svg",
29
- {
30
- "data-accordion-icon": true,
31
- className: `w-5 h-5 shrink-0 transition-transform ${open ? "rotate-0" : "rotate-180"}`,
32
- "aria-hidden": "true",
33
- xmlns: "http://www.w3.org/2000/svg",
34
- width: "24",
35
- height: "24",
36
- fill: "none",
37
- viewBox: "0 0 24 24",
38
- children: /* @__PURE__ */ jsx(
39
- "path",
40
- {
41
- stroke: "currentColor",
42
- strokeLinecap: "round",
43
- strokeLinejoin: "round",
44
- strokeWidth: "2",
45
- d: "m5 15 7-7 7 7"
46
- }
47
- )
48
- }
49
- )
50
- ]
51
- }
52
- ) }),
53
- /* @__PURE__ */ jsx(
54
- "div",
55
- {
56
- id: "accordion-collapse-body-1",
57
- className: `${open ? "" : "hidden"}`,
58
- "aria-labelledby": "accordion-collapse-heading-1",
59
- children: /* @__PURE__ */ jsx("div", { className: "md:p-5 text-left space-y-3", children: toolMessages.map((toolMsg) => /* @__PURE__ */ jsx("div", { className: "border-zinc-700", children: /* @__PURE__ */ jsx("p", { className: "text-body text-sm", children: toolMsg.content ? getContentString(toolMsg.content) : "" }) }, toolMsg.id)) })
60
- }
61
- )
62
- ]
63
- }
64
- );
1
+ import { useStream } from "./index.es19.js";
2
+ import "./index.es18.js";
3
+ import * as React from "react";
4
+ import * as ReactDOM from "react-dom";
5
+ import * as JsxRuntime from "react/jsx-runtime";
6
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
7
+ const UseStreamContext = React.createContext(null);
8
+ function useStreamContext() {
9
+ const ctx = React.useContext(UseStreamContext);
10
+ if (!ctx) throw new Error("useStreamContext must be used within a LoadExternalComponent");
11
+ return new Proxy(ctx, { get(target, prop) {
12
+ if (prop === "meta") return target.meta;
13
+ return target.stream[prop];
14
+ } });
15
+ }
16
+ var ComponentStore = class {
17
+ cache = {};
18
+ boundCache = {};
19
+ callbacks = {};
20
+ respond(shadowRootId, comp, targetElement) {
21
+ this.cache[shadowRootId] = {
22
+ comp,
23
+ target: targetElement
24
+ };
25
+ this.callbacks[shadowRootId]?.forEach((c) => c(comp, targetElement));
26
+ }
27
+ getBoundStore(shadowRootId) {
28
+ this.boundCache[shadowRootId] ??= {
29
+ subscribe: (onStoreChange) => {
30
+ this.callbacks[shadowRootId] ??= [];
31
+ this.callbacks[shadowRootId].push(onStoreChange);
32
+ return () => {
33
+ this.callbacks[shadowRootId] = this.callbacks[shadowRootId].filter((c) => c !== onStoreChange);
34
+ };
35
+ },
36
+ getSnapshot: () => this.cache[shadowRootId]
37
+ };
38
+ return this.boundCache[shadowRootId];
39
+ }
40
+ };
41
+ const COMPONENT_STORE = new ComponentStore();
42
+ const EXT_STORE_SYMBOL = /* @__PURE__ */ Symbol.for("LGUI_EXT_STORE");
43
+ const REQUIRE_SYMBOL = /* @__PURE__ */ Symbol.for("LGUI_REQUIRE");
44
+ const REQUIRE_EXTRA_SYMBOL = /* @__PURE__ */ Symbol.for("LGUI_REQUIRE_EXTRA");
45
+ const isIterable = (value) => value != null && typeof value === "object" && Symbol.iterator in value;
46
+ const isPromise = (value) => value != null && typeof value === "object" && "then" in value && typeof value.then === "function";
47
+ const isReactNode = (value) => {
48
+ if (React.isValidElement(value)) return true;
49
+ if (value == null) return true;
50
+ if (typeof value === "string" || typeof value === "number" || typeof value === "bigint" || typeof value === "boolean") return true;
51
+ if (isIterable(value)) return true;
52
+ if (isPromise(value)) return true;
53
+ return false;
54
+ };
55
+ function LoadExternalComponent({ stream, namespace, message, meta, fallback, components, ...props }) {
56
+ const ref = React.useRef(null);
57
+ const shadowRootId = `child-shadow-${React.useId()}`;
58
+ const store = React.useMemo(() => COMPONENT_STORE.getBoundStore(shadowRootId), [shadowRootId]);
59
+ const state = React.useSyncExternalStore(store.subscribe, store.getSnapshot);
60
+ const clientComponent = components?.[message.name];
61
+ const hasClientComponent = clientComponent != null;
62
+ let fallbackComponent = null;
63
+ if (isReactNode(fallback)) fallbackComponent = fallback;
64
+ else if (typeof fallback === "object" && fallback != null) fallbackComponent = fallback?.[message.name];
65
+ const uiNamespace = namespace ?? stream.assistantId;
66
+ const uiClient = stream.client["~ui"];
67
+ React.useEffect(() => {
68
+ if (hasClientComponent) return;
69
+ uiClient.getComponent(uiNamespace, message.name).then((html) => {
70
+ const dom = ref.current;
71
+ if (!dom) return;
72
+ const root = dom.shadowRoot ?? dom.attachShadow({ mode: "open" });
73
+ const fragment = document.createRange().createContextualFragment(html.replace("{{shadowRootId}}", shadowRootId));
74
+ root.appendChild(fragment);
75
+ });
76
+ }, [
77
+ uiClient,
78
+ uiNamespace,
79
+ message.name,
80
+ shadowRootId,
81
+ hasClientComponent
82
+ ]);
83
+ if (hasClientComponent) return /* @__PURE__ */ jsx(UseStreamContext.Provider, {
84
+ value: {
85
+ stream,
86
+ meta
87
+ },
88
+ children: React.createElement(clientComponent, message.props)
89
+ });
90
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
91
+ id: shadowRootId,
92
+ ref,
93
+ ...props
94
+ }), /* @__PURE__ */ jsx(UseStreamContext.Provider, {
95
+ value: {
96
+ stream,
97
+ meta
98
+ },
99
+ children: state?.target != null ? ReactDOM.createPortal(React.createElement(state.comp, message.props), state.target) : fallbackComponent
100
+ })] });
101
+ }
102
+ function bootstrapUiContext() {
103
+ if (typeof window === "undefined") return;
104
+ window[EXT_STORE_SYMBOL] = COMPONENT_STORE;
105
+ window[REQUIRE_SYMBOL] = (name) => {
106
+ if (name === "react") return React;
107
+ if (name === "react-dom") return ReactDOM;
108
+ if (name === "react/jsx-runtime") return JsxRuntime;
109
+ if (name === "@langchain/langgraph-sdk/react") return { useStream };
110
+ if (name === "@langchain/langgraph-sdk/react-ui") return {
111
+ useStreamContext,
112
+ LoadExternalComponent: () => {
113
+ throw new Error("Nesting LoadExternalComponent is not supported");
114
+ }
115
+ };
116
+ if (window[REQUIRE_EXTRA_SYMBOL] != null && typeof window[REQUIRE_EXTRA_SYMBOL] === "object" && name in window[REQUIRE_EXTRA_SYMBOL]) return window[REQUIRE_EXTRA_SYMBOL][name];
117
+ throw new Error(`Unknown module...: ${name}`);
118
+ };
65
119
  }
66
- const ToolCallFunctions$1 = React__default.memo(ToolCallFunctions, (prevProps, nextProps) => {
67
- return prevProps.toolMessages?.length === nextProps.toolMessages?.length;
68
- });
69
120
  export {
70
- ToolCallFunctions$1 as default
121
+ LoadExternalComponent,
122
+ bootstrapUiContext,
123
+ useStreamContext
71
124
  };
72
125
  //# sourceMappingURL=index.es28.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es28.js","sources":["../src/components/ToolCallFunctions.tsx"],"sourcesContent":["import { getContentString } from \"@/utils/utils\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport React, { useState } from \"react\";\n\nfunction ToolCallFunctions({ title, toolMessages }: {\n title?: string;\n toolMessages: Message[];\n}) {\n const [open, setOpen] = useState(false);\n\n // Only render if there are tool messages\n if (!toolMessages || toolMessages.length === 0) return null;\n\n return (\n <div\n id=\"accordion-collapse\"\n data-accordion=\"collapse\"\n className=\"w-full rounded-base overflow-hidden shadow-xs border rounded-xl border-zinc-800 max-w-[90%] min-w-25\"\n >\n <h2 id=\"accordion-collapse-heading-1\">\n <button\n type=\"button\"\n className=\"flex items-center justify-between w-full p-2 font-medium gap-3 text-body border-0 outline-none ring-0 appearance-none bg-transparent\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n aria-controls=\"accordion-collapse-body-1\"\n >\n <span>🔷 {title}</span>\n <svg\n data-accordion-icon\n className={`w-5 h-5 shrink-0 transition-transform ${open ? \"rotate-0\" : \"rotate-180\"\n }`}\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"m5 15 7-7 7 7\"\n />\n </svg>\n </button>\n </h2>\n <div\n id=\"accordion-collapse-body-1\"\n className={`${open ? \"\" : \"hidden\"}`}\n aria-labelledby=\"accordion-collapse-heading-1\"\n >\n <div className=\"md:p-5 text-left space-y-3\">\n {toolMessages.map((toolMsg) => (\n <div key={toolMsg.id} className=\"border-zinc-700\">\n <p className=\"text-body text-sm\">{toolMsg.content ? getContentString(toolMsg.content) : \"\"}</p>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nexport default React.memo(ToolCallFunctions, (prevProps, nextProps) => {\n return prevProps.toolMessages?.length === nextProps.toolMessages?.length;\n});"],"names":["React"],"mappings":";;;AAIA,SAAS,kBAAkB,EAAE,OAAO,gBAGjC;AACD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAGtC,MAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO;AAEvD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,kBAAe;AAAA,MACf,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAG,IAAG,gCACL,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,YAChC,iBAAe;AAAA,YACf,iBAAc;AAAA,YAEd,UAAA;AAAA,cAAA,qBAAC,QAAA,EAAK,UAAA;AAAA,gBAAA;AAAA,gBAAI;AAAA,cAAA,GAAM;AAAA,cAChB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,uBAAmB;AAAA,kBACnB,WAAW,yCAAyC,OAAO,aAAa,YACtE;AAAA,kBACF,eAAY;AAAA,kBACZ,OAAM;AAAA,kBACN,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,MAAK;AAAA,kBACL,SAAQ;AAAA,kBAER,UAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,QAAO;AAAA,sBACP,eAAc;AAAA,sBACd,gBAAe;AAAA,sBACf,aAAY;AAAA,sBACZ,GAAE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACJ;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA,GAEJ;AAAA,QACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAW,GAAG,OAAO,KAAK,QAAQ;AAAA,YAClC,mBAAgB;AAAA,YAEhB,UAAA,oBAAC,OAAA,EAAI,WAAU,8BACZ,UAAA,aAAa,IAAI,CAAC,YACjB,oBAAC,OAAA,EAAqB,WAAU,mBAC9B,UAAA,oBAAC,KAAA,EAAE,WAAU,qBAAqB,UAAA,QAAQ,UAAU,iBAAiB,QAAQ,OAAO,IAAI,GAAA,CAAG,EAAA,GADnF,QAAQ,EAElB,CACD,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAA,sBAAeA,eAAM,KAAK,mBAAmB,CAAC,WAAW,cAAc;AACrE,SAAO,UAAU,cAAc,WAAW,UAAU,cAAc;AACpE,CAAC;"}
1
+ {"version":3,"file":"index.es28.js","sources":["../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/react-ui/client.js"],"sourcesContent":["\"use client\";\n\nimport { useStream } from \"../react/stream.js\";\nimport \"../react/index.js\";\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport * as JsxRuntime from \"react/jsx-runtime\";\nimport { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\n\n//#region src/react-ui/client.tsx\nconst UseStreamContext = React.createContext(null);\nfunction useStreamContext() {\n\tconst ctx = React.useContext(UseStreamContext);\n\tif (!ctx) throw new Error(\"useStreamContext must be used within a LoadExternalComponent\");\n\treturn new Proxy(ctx, { get(target, prop) {\n\t\tif (prop === \"meta\") return target.meta;\n\t\treturn target.stream[prop];\n\t} });\n}\nvar ComponentStore = class {\n\tcache = {};\n\tboundCache = {};\n\tcallbacks = {};\n\trespond(shadowRootId, comp, targetElement) {\n\t\tthis.cache[shadowRootId] = {\n\t\t\tcomp,\n\t\t\ttarget: targetElement\n\t\t};\n\t\tthis.callbacks[shadowRootId]?.forEach((c) => c(comp, targetElement));\n\t}\n\tgetBoundStore(shadowRootId) {\n\t\tthis.boundCache[shadowRootId] ??= {\n\t\t\tsubscribe: (onStoreChange) => {\n\t\t\t\tthis.callbacks[shadowRootId] ??= [];\n\t\t\t\tthis.callbacks[shadowRootId].push(onStoreChange);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.callbacks[shadowRootId] = this.callbacks[shadowRootId].filter((c) => c !== onStoreChange);\n\t\t\t\t};\n\t\t\t},\n\t\t\tgetSnapshot: () => this.cache[shadowRootId]\n\t\t};\n\t\treturn this.boundCache[shadowRootId];\n\t}\n};\nconst COMPONENT_STORE = new ComponentStore();\nconst EXT_STORE_SYMBOL = Symbol.for(\"LGUI_EXT_STORE\");\nconst REQUIRE_SYMBOL = Symbol.for(\"LGUI_REQUIRE\");\nconst REQUIRE_EXTRA_SYMBOL = Symbol.for(\"LGUI_REQUIRE_EXTRA\");\nconst isIterable = (value) => value != null && typeof value === \"object\" && Symbol.iterator in value;\nconst isPromise = (value) => value != null && typeof value === \"object\" && \"then\" in value && typeof value.then === \"function\";\nconst isReactNode = (value) => {\n\tif (React.isValidElement(value)) return true;\n\tif (value == null) return true;\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"bigint\" || typeof value === \"boolean\") return true;\n\tif (isIterable(value)) return true;\n\tif (isPromise(value)) return true;\n\treturn false;\n};\nfunction LoadExternalComponent({ stream, namespace, message, meta, fallback, components, ...props }) {\n\tconst ref = React.useRef(null);\n\tconst shadowRootId = `child-shadow-${React.useId()}`;\n\tconst store = React.useMemo(() => COMPONENT_STORE.getBoundStore(shadowRootId), [shadowRootId]);\n\tconst state = React.useSyncExternalStore(store.subscribe, store.getSnapshot);\n\tconst clientComponent = components?.[message.name];\n\tconst hasClientComponent = clientComponent != null;\n\tlet fallbackComponent = null;\n\tif (isReactNode(fallback)) fallbackComponent = fallback;\n\telse if (typeof fallback === \"object\" && fallback != null) fallbackComponent = fallback?.[message.name];\n\tconst uiNamespace = namespace ?? stream.assistantId;\n\tconst uiClient = stream.client[\"~ui\"];\n\tReact.useEffect(() => {\n\t\tif (hasClientComponent) return;\n\t\tuiClient.getComponent(uiNamespace, message.name).then((html) => {\n\t\t\tconst dom = ref.current;\n\t\t\tif (!dom) return;\n\t\t\tconst root = dom.shadowRoot ?? dom.attachShadow({ mode: \"open\" });\n\t\t\tconst fragment = document.createRange().createContextualFragment(html.replace(\"{{shadowRootId}}\", shadowRootId));\n\t\t\troot.appendChild(fragment);\n\t\t});\n\t}, [\n\t\tuiClient,\n\t\tuiNamespace,\n\t\tmessage.name,\n\t\tshadowRootId,\n\t\thasClientComponent\n\t]);\n\tif (hasClientComponent) return /* @__PURE__ */ jsx(UseStreamContext.Provider, {\n\t\tvalue: {\n\t\t\tstream,\n\t\t\tmeta\n\t\t},\n\t\tchildren: React.createElement(clientComponent, message.props)\n\t});\n\treturn /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(\"div\", {\n\t\tid: shadowRootId,\n\t\tref,\n\t\t...props\n\t}), /* @__PURE__ */ jsx(UseStreamContext.Provider, {\n\t\tvalue: {\n\t\t\tstream,\n\t\t\tmeta\n\t\t},\n\t\tchildren: state?.target != null ? ReactDOM.createPortal(React.createElement(state.comp, message.props), state.target) : fallbackComponent\n\t})] });\n}\nfunction experimental_loadShare(name, module) {\n\tif (typeof window === \"undefined\") return;\n\twindow[REQUIRE_EXTRA_SYMBOL] ??= {};\n\twindow[REQUIRE_EXTRA_SYMBOL][name] = module;\n}\nfunction bootstrapUiContext() {\n\tif (typeof window === \"undefined\") return;\n\twindow[EXT_STORE_SYMBOL] = COMPONENT_STORE;\n\twindow[REQUIRE_SYMBOL] = (name) => {\n\t\tif (name === \"react\") return React;\n\t\tif (name === \"react-dom\") return ReactDOM;\n\t\tif (name === \"react/jsx-runtime\") return JsxRuntime;\n\t\tif (name === \"@langchain/langgraph-sdk/react\") return { useStream };\n\t\tif (name === \"@langchain/langgraph-sdk/react-ui\") return {\n\t\t\tuseStreamContext,\n\t\t\tLoadExternalComponent: () => {\n\t\t\t\tthrow new Error(\"Nesting LoadExternalComponent is not supported\");\n\t\t\t}\n\t\t};\n\t\tif (window[REQUIRE_EXTRA_SYMBOL] != null && typeof window[REQUIRE_EXTRA_SYMBOL] === \"object\" && name in window[REQUIRE_EXTRA_SYMBOL]) return window[REQUIRE_EXTRA_SYMBOL][name];\n\t\tthrow new Error(`Unknown module...: ${name}`);\n\t};\n}\n\n//#endregion\nexport { LoadExternalComponent, bootstrapUiContext, experimental_loadShare, useStreamContext };\n//# sourceMappingURL=client.js.map"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
@@ -11,7 +11,7 @@ import { parsePromptIdentifier } from "./index.es288.js";
11
11
  import { raiseForStatus, isLangSmithNotFoundError } from "./index.es289.js";
12
12
  import { Cache } from "./index.es290.js";
13
13
  import { _getFetchImplementation, _globalFetchImplementationIsNodeFetch } from "./index.es291.js";
14
- import { serialize } from "./index.es120.js";
14
+ import { serialize } from "./index.es119.js";
15
15
  function mergeRuntimeEnvIntoRun(run, cachedEnvVars, omitTracedRuntimeInfo) {
16
16
  if (omitTracedRuntimeInfo) {
17
17
  return run;
@@ -1,5 +1,5 @@
1
1
  import pRetry from "./index.es337.js";
2
- import PQueueMod from "./index.es118.js";
2
+ import PQueueMod from "./index.es117.js";
3
3
  const STATUS_RETRYABLE = [
4
4
  408,
5
5
  // Request Timeout
@@ -1,4 +1,4 @@
1
- import "./index.es119.js";
1
+ import "./index.es118.js";
2
2
  function parsePromptIdentifier(identifier) {
3
3
  if (!identifier || identifier.split("/").length > 2 || identifier.startsWith("/") || identifier.endsWith("/") || identifier.split(":").length > 2) {
4
4
  throw new Error(`Invalid identifier format: ${identifier}`);
@@ -2,7 +2,7 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { Slot } from "@radix-ui/react-slot";
4
4
  import { cva } from "class-variance-authority";
5
- import { cn } from "./index.es50.js";
5
+ import { cn } from "./index.es51.js";
6
6
  const buttonVariants = cva(
7
7
  "inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
8
8
  {
package/dist/index.es3.js CHANGED
@@ -7,7 +7,6 @@ import { useFileProvider } from "./index.es8.js";
7
7
  import { useStreamContext } from "./index.es7.js";
8
8
  import { useThread } from "./index.es6.js";
9
9
  import { useState, useEffect } from "react";
10
- import { v4 } from "uuid";
11
10
  function Chat({ chatProps }) {
12
11
  const { callThisOnSubmit, handleFileSelect, enableToolCallIndicator } = chatProps || {};
13
12
  const [isFirstMessage, setIsFirstMessage] = useState(true);
@@ -21,29 +20,14 @@ function Chat({ chatProps }) {
21
20
  const isLoading = stream.isLoading;
22
21
  const { setMode, threadId } = useThread();
23
22
  useEffect(() => {
24
- const loadCatalog = async () => {
25
- try {
26
- const catalog = await fetchCatalog();
27
- if (catalog && Array.isArray(catalog)) {
28
- const agentList = catalog.map((agent) => ({
29
- agent_id: agent.agent_id,
30
- display_name: agent.display_name
31
- }));
32
- setAgents(agentList);
33
- }
34
- } catch (error) {
35
- console.error("Failed to load agent catalog:", error);
36
- }
37
- };
38
- loadCatalog();
39
- }, []);
23
+ fetchCatalog();
24
+ setAgents(["V3ya_external_agent", "chat_agent"]);
25
+ }, [fetchCatalog]);
40
26
  const handleAgentChange = (event) => {
41
- const selectedAgent = event.target.getAttribute("data-agent-id");
42
- if (selectedAgent) {
43
- console.log("Selected agent:", selectedAgent);
44
- setAssistantId(selectedAgent);
45
- setIsDropdownOpen(false);
46
- }
27
+ const selectedAgent = event.target.innerText;
28
+ console.log("Selected agent:", selectedAgent);
29
+ setAssistantId(selectedAgent);
30
+ setIsDropdownOpen(false);
47
31
  };
48
32
  useEffect(() => {
49
33
  setMode("multi");
@@ -59,25 +43,9 @@ function Chat({ chatProps }) {
59
43
  e.preventDefault();
60
44
  if (input.trim().length === 0 && fileInput.length === 0 || isLoading)
61
45
  return;
62
- let latestFiles = fileInput;
63
46
  if (callThisOnSubmit) {
64
- const result = await callThisOnSubmit();
65
- if (result && result.length > 0) latestFiles = result;
47
+ await callThisOnSubmit();
66
48
  }
67
- const contentBlocks = [
68
- ...input.trim().length > 0 ? [{ type: "text", text: input }] : [],
69
- ...latestFiles.map((file) => ({
70
- type: "document",
71
- ...file,
72
- cache_control: { type: "ephemeral" }
73
- }))
74
- ];
75
- const newHumanMessage = {
76
- id: v4(),
77
- type: "human",
78
- content: contentBlocks
79
- };
80
- await stream.submitMessage(newHumanMessage);
81
49
  setIsFirstMessage(false);
82
50
  setInput("");
83
51
  setFileInput([]);
@@ -121,11 +89,11 @@ function Chat({ chatProps }) {
121
89
  type: "button",
122
90
  children: [
123
91
  assistantId,
124
- /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 ms-1.5 -me-0.5", "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", fill: "none", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "m19 9-7 7-7-7" }) })
92
+ /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 ms-1.5 -me-0.5", "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", fill: "none", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { stroke: "currentColor", "stroke-linecap": "round", "stroke-linejoin": "round", "stroke-width": "2", d: "m19 9-7 7-7-7" }) })
125
93
  ]
126
94
  }
127
95
  ),
128
- /* @__PURE__ */ jsx("div", { id: "dropdownDivider", className: `z-10 absolute top-14 bg-neutral-primary-medium bg-zinc-800 rounded-2xl divide-y divide-default-medium w-44 ${isDropdownOpen ? "" : "hidden"}`, children: /* @__PURE__ */ jsx("ul", { className: "p-2 text-sm text-body font-medium", "aria-labelledby": "dropdownDividerButton", children: agents.map((agent) => /* @__PURE__ */ jsx("li", { className: "hover:bg-zinc-700 hover:rounded-2xl", onClick: handleAgentChange, "data-agent-id": agent.agent_id, children: /* @__PURE__ */ jsx("span", { className: "inline-flex items-center w-full p-2 hover:bg-neutral-tertiary-medium hover:text-heading rounded", "data-agent-id": agent.agent_id, children: agent.display_name }) }, agent.agent_id)) }) })
96
+ /* @__PURE__ */ jsx("div", { id: "dropdownDivider", className: `z-10 absolute top-14 bg-neutral-primary-medium bg-zinc-800 rounded-2xl divide-y divide-default-medium w-44 ${isDropdownOpen ? "" : "hidden"}`, children: /* @__PURE__ */ jsx("ul", { className: "p-2 text-sm text-body font-medium", "aria-labelledby": "dropdownDividerButton", children: agents.map((agentName) => /* @__PURE__ */ jsx("li", { className: "hover:bg-zinc-700 hover:rounded-2xl", onClick: handleAgentChange, children: /* @__PURE__ */ jsx("span", { className: "inline-flex items-center w-full p-2 hover:bg-neutral-tertiary-medium hover:text-heading rounded", children: agentName }) }, agentName)) }) })
129
97
  ] }),
130
98
  /* @__PURE__ */ jsx("div", { className: "relative flex flex-1 overflow-hidden", children: isFirstMessage ? /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col items-center justify-center", children: [
131
99
  /* @__PURE__ */ jsx("h1", { className: "mb-8 text-2xl font-medium text-white/80", children: "What are you working on?" }),
@@ -1 +1 @@
1
- {"version":3,"file":"index.es3.js","sources":["../src/pages/Chat/Chat.tsx"],"sourcesContent":["import ChatBody from \"@/components/ChatBody\";\nimport ChatInput from \"@/components/sidebar/ChatInput\";\nimport ThreadHistory from \"@/components/threads/ThreadHistory\";\nimport { useChatRuntime } from \"@/providers/ChatRuntime\";\nimport { useFileProvider } from \"@/providers/FileProvider\";\nimport { useStreamContext } from \"@/providers/Stream\";\nimport { useThread } from \"@/providers/Thread\";\nimport type { ChatUIProps } from \"@/types/ChatProps\";\nimport type { FileInfo } from \"@/types/fileInput\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport function Chat({chatProps}: {chatProps?: ChatUIProps}) {\n const { callThisOnSubmit, handleFileSelect, enableToolCallIndicator } = chatProps || {};\n const [isFirstMessage, setIsFirstMessage] = useState(true);\n const [input, setInput] = useState(\"\");\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const { fileInput, setFileInput } = useFileProvider();\n const [agents, setAgents] = useState<Array<{agent_id: string; display_name: string}>>([]);\n const { fetchCatalog } = useStreamContext();\n const stream = useStreamContext();\n const { assistantId, setAssistantId } = useChatRuntime();\n const isLoading = stream.isLoading;\n const { setMode, threadId } = useThread();\n\n useEffect(() => {\n // Fetch the agent catalog on component mount\n const loadCatalog = async () => {\n try {\n const catalog = await fetchCatalog();\n if (catalog && Array.isArray(catalog)) {\n // Extract agent_id and display_name from catalog\n const agentList = catalog.map((agent) => ({\n agent_id: agent.agent_id,\n display_name: agent.display_name,\n }));\n setAgents(agentList);\n // console.log(\"Loaded agents from catalog:\", agentList);\n }\n } catch (error) {\n console.error(\"Failed to load agent catalog:\", error);\n }\n };\n \n loadCatalog();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only run once on mount\n\n const handleAgentChange = (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n const selectedAgent = (event.target as HTMLElement).getAttribute(\"data-agent-id\");\n if (selectedAgent) {\n console.log(\"Selected agent:\", selectedAgent);\n setAssistantId(selectedAgent);\n setIsDropdownOpen(false);\n }\n }\n\n\n // Set thread mode to multi when using Chat\n useEffect(() => {\n setMode(\"multi\");\n }, [setMode]);\n\n // Update isFirstMessage based on thread messages\n useEffect(() => {\n if (stream.messages && stream.messages.length > 0) {\n setIsFirstMessage(false);\n } else {\n setIsFirstMessage(true);\n }\n }, [threadId, stream.messages]);\n\n const defaultHandleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n if ((input.trim().length === 0 && fileInput.length === 0) || isLoading)\n return;\n\n // console.log(\"Submitting with input:\", input);\n\n // Call the custom upload and get the latest files\n let latestFiles: FileInfo[] = fileInput;\n if (callThisOnSubmit) {\n const result = await callThisOnSubmit();\n if (result && result.length > 0) latestFiles = result;\n }\n\n // console.log(\"Using files for submission:\", latestFiles);\n\n const contentBlocks = [\n ...(input.trim().length > 0 ? [{ type: \"text\", text: input }] : []),\n ...latestFiles.map((file) => ({\n type: \"document\" as const,\n ...file,\n cache_control: { type: \"ephemeral\" as const },\n })),\n ] as unknown as Message[\"content\"];\n\n const newHumanMessage: Message = {\n id: uuidv4(),\n type: \"human\",\n content: contentBlocks,\n };\n\n // Use the unified submitMessage function\n await stream.submitMessage(newHumanMessage);\n\n setIsFirstMessage(false);\n setInput(\"\");\n setFileInput([]);\n };\n\n const defaultHandleFileSelect = async (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = event.target.files;\n if (!files) return;\n\n // Convert files to base64 for sending\n const fileDetails: FileInfo[] = await Promise.all(\n Array.from(files).map(async (file) => {\n const base64Data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result.split(\",\")[1]); // Remove data:...;base64, prefix\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n return {\n fileName: file.name,\n fileType: file.type,\n file: file,\n fileData: base64Data, // Add this to your FileInfo type\n };\n })\n );\n\n setFileInput((prevFile) => [...prevFile, ...fileDetails]);\n };\n\n const onFileSelect = handleFileSelect || defaultHandleFileSelect;\n\n return (\n <div className=\"flex h-screen w-screen bg-[#0f0f0f] text-white\">\n <ThreadHistory />\n <main className=\"flex flex-1 flex-col\">\n {/* Header */}\n <header className=\"flex h-14 items-center justify-between border-b border-white/10 px-6\">\n {/* <span className=\"text-sm text-white/80\">ChatGPT 5.2s</span> */}\n {/* <div className=\"flex gap-2\">\n <div className=\"h-8 w-8 rounded-full bg-white/10\" />\n <div className=\"h-8 w-8 rounded-full bg-white/10\" />\n </div> */}\n\n <button\n id=\"dropdownDividerButton\"\n onClick={() => setIsDropdownOpen(!isDropdownOpen)}\n className=\"inline-flex items-center justify-center text-white bg-brand box-border border rounded-2xl border-transparent hover:bg-brand-strong font-medium leading-5 rounded-base text-sm px-4 py-2.5 bg-zinc-800\"\n type=\"button\"\n >\n {assistantId}\n <svg className=\"w-4 h-4 ms-1.5 -me-0.5\" aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" viewBox=\"0 0 24 24\"><path stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"m19 9-7 7-7-7\" /></svg>\n </button>\n\n <div id=\"dropdownDivider\" className={`z-10 absolute top-14 bg-neutral-primary-medium bg-zinc-800 rounded-2xl divide-y divide-default-medium w-44 ${isDropdownOpen ? '' : 'hidden'}`}>\n <ul className=\"p-2 text-sm text-body font-medium\" aria-labelledby=\"dropdownDividerButton\">\n {agents.map((agent) => (\n <li key={agent.agent_id} className=\"hover:bg-zinc-700 hover:rounded-2xl\" onClick={handleAgentChange} data-agent-id={agent.agent_id}>\n <span className=\"inline-flex items-center w-full p-2 hover:bg-neutral-tertiary-medium hover:text-heading rounded\" data-agent-id={agent.agent_id}>{agent.display_name}</span>\n </li>\n ))}\n </ul>\n {/* <div className=\"p-2 text-sm text-body font-medium\">\n <a href=\"#\" className=\"inline-flex items-center w-full p-2 hover:bg-neutral-tertiary-medium hover:text-heading rounded\">Separated link</a>\n </div> */}\n </div>\n\n </header>\n\n {/* CONTENT AREA */}\n <div className=\"relative flex flex-1 overflow-hidden\">\n {isFirstMessage ?\n <div className=\"flex flex-1 flex-col items-center justify-center\">\n <h1 className=\"mb-8 text-2xl font-medium text-white/80\">\n What are you working on?\n </h1>\n\n <div className=\"w-full max-w-2xl px-4\">\n <ChatInput input={input} setInput={setInput} handleSubmit={defaultHandleSubmit} fileInput={fileInput} setFileInput={setFileInput} handleFileSelect={onFileSelect} />\n </div>\n </div> :\n // =========================\n // CHAT STATE (after message)\n // =========================\n <div className=\"flex h-full w-full flex-col\">\n <div className=\"flex-1 overflow-y-auto thread-scrollbar\">\n <div className=\"mx-auto max-w-3xl px-4 py-6\">\n <ChatBody setIsFirstMessage={setIsFirstMessage} enableToolCallIndicator={enableToolCallIndicator} />\n </div>\n </div>\n\n <div className=\"border-t border-white/10 p-1\">\n <div className=\"mx-auto max-w-3xl\">\n <ChatInput input={input} setInput={setInput} handleSubmit={defaultHandleSubmit} fileInput={fileInput} setFileInput={setFileInput} handleFileSelect={onFileSelect} />\n </div>\n </div>\n </div>\n }\n </div>\n </main>\n </div>\n )\n}\n"],"names":["uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"index.es3.js","sources":["../src/pages/Chat/Chat.tsx"],"sourcesContent":["import ChatBody from \"@/components/ChatBody\";\nimport ChatInput from \"@/components/sidebar/ChatInput\";\nimport ThreadHistory from \"@/components/threads/ThreadHistory\";\nimport { useChatRuntime } from \"@/providers/ChatRuntime\";\nimport { useFileProvider } from \"@/providers/FileProvider\";\nimport { useStreamContext } from \"@/providers/Stream\";\nimport { useThread } from \"@/providers/Thread\";\nimport type { ChatUIProps } from \"@/types/ChatProps\";\nimport type { FileInfo } from \"@/types/fileInput\";\nimport { useEffect, useState, type FormEvent } from \"react\";\n\nexport function Chat({chatProps}: {chatProps?: ChatUIProps}) {\n const { callThisOnSubmit, handleFileSelect, enableToolCallIndicator } = chatProps || {};\n const [isFirstMessage, setIsFirstMessage] = useState(true);\n const [input, setInput] = useState(\"\");\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const { fileInput, setFileInput } = useFileProvider();\n const [agents, setAgents] = useState<Array<string>>([]);\n const { fetchCatalog } = useStreamContext();\n const stream = useStreamContext();\n const { assistantId, setAssistantId } = useChatRuntime();\n const isLoading = stream.isLoading;\n const { setMode, threadId } = useThread();\n\n useEffect(() => {\n // Fetch the agent catalog on component mount\n fetchCatalog();\n setAgents([\"V3ya_external_agent\", \"chat_agent\"]);\n }, [fetchCatalog]);\n\n const handleAgentChange = (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n const selectedAgent = (event.target as HTMLElement).innerText;\n console.log(\"Selected agent:\", selectedAgent);\n setAssistantId(selectedAgent);\n setIsDropdownOpen(false);\n }\n\n\n // Set thread mode to multi when using Chat\n useEffect(() => {\n setMode(\"multi\");\n }, [setMode]);\n\n // Update isFirstMessage based on thread messages\n useEffect(() => {\n if (stream.messages && stream.messages.length > 0) {\n setIsFirstMessage(false);\n } else {\n setIsFirstMessage(true);\n }\n }, [threadId, stream.messages]);\n\n const defaultHandleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n if ((input.trim().length === 0 && fileInput.length === 0) || isLoading)\n return;\n\n if (callThisOnSubmit) {\n await callThisOnSubmit();\n }\n\n setIsFirstMessage(false);\n setInput(\"\");\n setFileInput([]);\n };\n\n const defaultHandleFileSelect = async (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = event.target.files;\n if (!files) return;\n\n const fileDetails: FileInfo[] = await Promise.all(\n Array.from(files).map(async (file) => {\n const base64Data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result.split(\",\")[1]); \n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n return {\n fileName: file.name,\n fileType: file.type,\n file: file,\n fileData: base64Data, // Add this to your FileInfo type\n };\n })\n );\n\n setFileInput((prevFile) => [...prevFile, ...fileDetails]);\n };\n\n const onFileSelect = handleFileSelect || defaultHandleFileSelect;\n\n return (\n <div className=\"flex h-screen w-screen bg-[#0f0f0f] text-white\">\n <ThreadHistory />\n <main className=\"flex flex-1 flex-col\">\n {/* Header */}\n <header className=\"flex h-14 items-center justify-between border-b border-white/10 px-6\">\n {/* <span className=\"text-sm text-white/80\">ChatGPT 5.2s</span> */}\n {/* <div className=\"flex gap-2\">\n <div className=\"h-8 w-8 rounded-full bg-white/10\" />\n <div className=\"h-8 w-8 rounded-full bg-white/10\" />\n </div> */}\n\n <button\n id=\"dropdownDividerButton\"\n onClick={() => setIsDropdownOpen(!isDropdownOpen)}\n className=\"inline-flex items-center justify-center text-white bg-brand box-border border rounded-2xl border-transparent hover:bg-brand-strong font-medium leading-5 rounded-base text-sm px-4 py-2.5 bg-zinc-800\"\n type=\"button\"\n >\n {assistantId}\n <svg className=\"w-4 h-4 ms-1.5 -me-0.5\" aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" viewBox=\"0 0 24 24\"><path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m19 9-7 7-7-7\" /></svg>\n </button>\n\n <div id=\"dropdownDivider\" className={`z-10 absolute top-14 bg-neutral-primary-medium bg-zinc-800 rounded-2xl divide-y divide-default-medium w-44 ${isDropdownOpen ? '' : 'hidden'}`}>\n <ul className=\"p-2 text-sm text-body font-medium\" aria-labelledby=\"dropdownDividerButton\">\n {agents.map((agentName) => (\n <li key={agentName} className=\"hover:bg-zinc-700 hover:rounded-2xl\" onClick={handleAgentChange}>\n <span className=\"inline-flex items-center w-full p-2 hover:bg-neutral-tertiary-medium hover:text-heading rounded\">{agentName}</span>\n </li>\n ))}\n </ul>\n {/* <div className=\"p-2 text-sm text-body font-medium\">\n <a href=\"#\" className=\"inline-flex items-center w-full p-2 hover:bg-neutral-tertiary-medium hover:text-heading rounded\">Separated link</a>\n </div> */}\n </div>\n\n </header>\n\n {/* CONTENT AREA */}\n <div className=\"relative flex flex-1 overflow-hidden\">\n {isFirstMessage ?\n <div className=\"flex flex-1 flex-col items-center justify-center\">\n <h1 className=\"mb-8 text-2xl font-medium text-white/80\">\n What are you working on?\n </h1>\n\n <div className=\"w-full max-w-2xl px-4\">\n <ChatInput input={input} setInput={setInput} handleSubmit={defaultHandleSubmit} fileInput={fileInput} setFileInput={setFileInput} handleFileSelect={onFileSelect} />\n </div>\n </div> :\n // =========================\n // CHAT STATE (after message)\n // =========================\n <div className=\"flex h-full w-full flex-col\">\n <div className=\"flex-1 overflow-y-auto thread-scrollbar\">\n <div className=\"mx-auto max-w-3xl px-4 py-6\">\n <ChatBody setIsFirstMessage={setIsFirstMessage} enableToolCallIndicator={enableToolCallIndicator} />\n </div>\n </div>\n\n <div className=\"border-t border-white/10 p-1\">\n <div className=\"mx-auto max-w-3xl\">\n <ChatInput input={input} setInput={setInput} handleSubmit={defaultHandleSubmit} fileInput={fileInput} setFileInput={setFileInput} handleFileSelect={onFileSelect} />\n </div>\n </div>\n </div>\n }\n </div>\n </main>\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@ import { parseTupleDef } from "./index.es327.js";
28
28
  import { parseUndefinedDef } from "./index.es328.js";
29
29
  import { parseUnknownDef } from "./index.es329.js";
30
30
  import { parseReadonlyDef } from "./index.es330.js";
31
- import { ZodFirstPartyTypeKind } from "./index.es109.js";
31
+ import { ZodFirstPartyTypeKind } from "./index.es105.js";
32
32
  const selectParser = (def, typeName, refs) => {
33
33
  switch (typeName) {
34
34
  case ZodFirstPartyTypeKind.ZodString:
@@ -1,6 +1,6 @@
1
1
  import { setResponseValueAndErrors } from "./index.es301.js";
2
2
  import { parseDef } from "./index.es270.js";
3
- import { ZodFirstPartyTypeKind } from "./index.es109.js";
3
+ import { ZodFirstPartyTypeKind } from "./index.es105.js";
4
4
  function parseArrayDef(def, refs) {
5
5
  const res = { type: "array" };
6
6
  if (def.type?._def && def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny) res.items = parseDef(def.type._def, {
@@ -2,7 +2,7 @@ import { parseAnyDef } from "./index.es269.js";
2
2
  import { parseBrandedDef } from "./index.es305.js";
3
3
  import { parseStringDef } from "./index.es313.js";
4
4
  import { parseDef } from "./index.es270.js";
5
- import { ZodFirstPartyTypeKind } from "./index.es109.js";
5
+ import { ZodFirstPartyTypeKind } from "./index.es105.js";
6
6
  function parseRecordDef(def, refs) {
7
7
  if (refs.target === "openAi") console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");
8
8
  if (refs.target === "openApi3" && def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) return {
@@ -1,5 +1,5 @@
1
- import { deepCompareStrict } from "./index.es203.js";
2
- import { dereference } from "./index.es206.js";
1
+ import { deepCompareStrict } from "./index.es201.js";
2
+ import { dereference } from "./index.es204.js";
3
3
  import { format } from "./index.es332.js";
4
4
  import { encodePointer } from "./index.es331.js";
5
5
  import { ucs2length } from "./index.es333.js";
package/dist/index.es4.js CHANGED
@@ -6,7 +6,6 @@ import { FileProvider } from "./index.es8.js";
6
6
  import { StreamProvider } from "./index.es7.js";
7
7
  import { ThreadProvider } from "./index.es6.js";
8
8
  import { SuggestionProvider } from "./index.es11.js";
9
- import { ToolsProvider } from "./index.es10.js";
10
9
  function ChatProvider({
11
10
  apiUrl,
12
11
  assistantId,
@@ -20,7 +19,7 @@ function ChatProvider({
20
19
  apiUrl,
21
20
  assistantId,
22
21
  identity,
23
- children: /* @__PURE__ */ jsx(ThreadProvider, { children: /* @__PURE__ */ jsx(StreamProvider, { children: /* @__PURE__ */ jsx(SuggestionProvider, { children: /* @__PURE__ */ jsx(ToolsProvider, { children: /* @__PURE__ */ jsx(CustomComponentProvider, { initialComponents: customComponents, children: /* @__PURE__ */ jsx(FileProvider, { children }) }) }) }) }) })
22
+ children: /* @__PURE__ */ jsx(ThreadProvider, { children: /* @__PURE__ */ jsx(StreamProvider, { children: /* @__PURE__ */ jsx(SuggestionProvider, { children: /* @__PURE__ */ jsx(CustomComponentProvider, { initialComponents: customComponents, children: /* @__PURE__ */ jsx(FileProvider, { children }) }) }) }) })
24
23
  }
25
24
  ) });
26
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.es4.js","sources":["../src/providers/ChatProvider.tsx"],"sourcesContent":["import React from \"react\";\nimport { ChatRuntimeProvider } from \"./ChatRuntime\";\nimport { CustomComponentProvider } from \"./CustomComponentProvider\";\nimport { FileProvider } from \"./FileProvider\";\nimport { StreamProvider } from \"./Stream\";\nimport { ThreadProvider } from \"./Thread\";\nimport { SuggestionProvider } from \"./useChatSuggestions\";\nimport type { ChatIdentity } from \"@/types/ChatIdentity\";\nimport { ToolsProvider } from \"./ToolsProvider\";\n\n\ninterface ChatProviderProps {\n /** Base URL for the LangGraph API endpoint */\n apiUrl: string;\n /** Unique identifier for the assistant/agent to communicate with */\n assistantId: string;\n /** User and organization identity information */\n identity?: ChatIdentity | null;\n /** Child components that will have access to chat context */\n children: React.ReactNode;\n /** Optional custom React components to render in chat messages */\n customComponents?: Record<string, React.FunctionComponent | React.ComponentClass>;\n}\n\n/**\n * Main provider component that wraps all chat-related contexts.\n * This is the recommended way to set up the chat system as it includes all necessary providers\n * in the correct order: Runtime, Thread, Stream, Suggestions, Custom Components, and File handling.\n * \n * @example\n * ```tsx\n * <ChatProvider\n * apiUrl=\"https://api.example.com\"\n * assistantId=\"my-assistant\"\n * identity={{ user_id: \"user123\", org_id: \"org456\" }}\n * >\n * <YourChatUI />\n * </ChatProvider>\n * ```\n */\nexport function ChatProvider({\n apiUrl,\n assistantId,\n identity,\n children,\n customComponents,\n}: ChatProviderProps) {\n return (\n <React.Suspense fallback={<div>Loading chat...</div>}>\n <ChatRuntimeProvider\n apiUrl={apiUrl}\n assistantId={assistantId}\n identity={identity}\n >\n <ThreadProvider>\n <StreamProvider>\n <SuggestionProvider>\n <ToolsProvider>\n <CustomComponentProvider initialComponents={customComponents}>\n <FileProvider>{children}</FileProvider>\n </CustomComponentProvider>\n </ToolsProvider>\n </SuggestionProvider>\n </StreamProvider>\n </ThreadProvider>\n </ChatRuntimeProvider>\n </React.Suspense>\n );\n}"],"names":["React"],"mappings":";;;;;;;;;AAwCO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,SACE,oBAACA,eAAM,UAAN,EAAe,UAAU,oBAAC,OAAA,EAAI,6BAAe,GAC5C,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MAEA,8BAAC,gBAAA,EACC,UAAA,oBAAC,kBACC,UAAA,oBAAC,oBAAA,EACC,8BAAC,eAAA,EACC,UAAA,oBAAC,2BAAwB,mBAAmB,kBAC1C,8BAAC,cAAA,EAAc,SAAA,CAAS,GAC1B,EAAA,CACF,EAAA,CACF,GACF,EAAA,CACF;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"index.es4.js","sources":["../src/providers/ChatProvider.tsx"],"sourcesContent":["import React from \"react\";\nimport { ChatRuntimeProvider } from \"./ChatRuntime\";\nimport { CustomComponentProvider } from \"./CustomComponentProvider\";\nimport { FileProvider } from \"./FileProvider\";\nimport { StreamProvider } from \"./Stream\";\nimport { ThreadProvider } from \"./Thread\";\nimport { SuggestionProvider } from \"./useChatSuggestions\";\n\n/**\n * Identity information for authenticating and identifying the chat user.\n * Used for routing messages and maintaining user context in the chat system.\n */\nexport interface ChatIdentity {\n /** Unique identifier for the user */\n user_id: string;\n /** Organization identifier for multi-tenant applications */\n org_id: string;\n}\n\ninterface ChatProviderProps {\n /** Base URL for the LangGraph API endpoint */\n apiUrl: string;\n /** Unique identifier for the assistant/agent to communicate with */\n assistantId: string;\n /** User and organization identity information */\n identity?: ChatIdentity | null;\n /** Child components that will have access to chat context */\n children: React.ReactNode;\n /** Optional custom React components to render in chat messages */\n customComponents?: Record<string, React.FunctionComponent | React.ComponentClass>;\n}\n\n/**\n * Main provider component that wraps all chat-related contexts.\n * This is the recommended way to set up the chat system as it includes all necessary providers\n * in the correct order: Runtime, Thread, Stream, Suggestions, Custom Components, and File handling.\n * \n * @example\n * ```tsx\n * <ChatProvider\n * apiUrl=\"https://api.example.com\"\n * assistantId=\"my-assistant\"\n * identity={{ user_id: \"user123\", org_id: \"org456\" }}\n * >\n * <YourChatUI />\n * </ChatProvider>\n * ```\n */\nexport function ChatProvider({\n apiUrl,\n assistantId,\n identity,\n children,\n customComponents,\n}: ChatProviderProps) {\n return (\n <React.Suspense fallback={<div>Loading chat...</div>}>\n <ChatRuntimeProvider\n apiUrl={apiUrl}\n assistantId={assistantId}\n identity={identity}\n >\n <ThreadProvider>\n <StreamProvider>\n <SuggestionProvider>\n <CustomComponentProvider initialComponents={customComponents}>\n <FileProvider>{children}</FileProvider>\n </CustomComponentProvider>\n </SuggestionProvider>\n </StreamProvider>\n </ThreadProvider>\n </ChatRuntimeProvider>\n </React.Suspense>\n );\n}"],"names":["React"],"mappings":";;;;;;;;AAgDO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,SACE,oBAACA,eAAM,UAAN,EAAe,UAAU,oBAAC,OAAA,EAAI,6BAAe,GAC5C,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MAEA,8BAAC,gBAAA,EACC,UAAA,oBAAC,gBAAA,EACC,UAAA,oBAAC,sBACC,UAAA,oBAAC,yBAAA,EAAwB,mBAAmB,kBAC1C,8BAAC,cAAA,EAAc,UAAS,EAAA,CAC1B,EAAA,CACF,GACF,EAAA,CACF;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -1,10 +1,10 @@
1
- import { Serializable } from "./index.es67.js";
1
+ import { Serializable } from "./index.es64.js";
2
2
  import { isDataContentBlock } from "./index.es56.js";
3
- import { convertToV1FromAnthropicInput } from "./index.es68.js";
4
- import { convertToV1FromDataContent } from "./index.es69.js";
5
- import { convertToV1FromChatCompletionsInput } from "./index.es70.js";
3
+ import { convertToV1FromAnthropicInput } from "./index.es65.js";
4
+ import { convertToV1FromDataContent } from "./index.es66.js";
5
+ import { convertToV1FromChatCompletionsInput } from "./index.es67.js";
6
6
  import { isMessage } from "./index.es57.js";
7
- import { convertToFormattedString } from "./index.es71.js";
7
+ import { convertToFormattedString } from "./index.es68.js";
8
8
  const MESSAGE_SYMBOL = /* @__PURE__ */ Symbol.for("langchain.message");
9
9
  function mergeContent(firstContent, secondContent) {
10
10
  if (typeof firstContent === "string") {
@@ -1,5 +1,5 @@
1
1
  import { BaseMessage, BaseMessageChunk, _mergeDicts, mergeContent, _mergeLists } from "./index.es43.js";
2
- import { getTranslator } from "./index.es75.js";
2
+ import { getTranslator } from "./index.es72.js";
3
3
  import { mergeResponseMetadata, mergeUsageMetadata } from "./index.es58.js";
4
4
  import { defaultToolCallParser } from "./index.es47.js";
5
5
  import { collapseToolCallChunks } from "./index.es49.js";
@@ -1,8 +1,8 @@
1
1
  import { isBaseMessage, _isMessageFieldWithRole } from "./index.es43.js";
2
2
  import { ToolMessage } from "./index.es47.js";
3
- import { addLangChainErrorFields } from "./index.es72.js";
4
- import { _isToolCall } from "./index.es73.js";
5
- import { parsePartialJson } from "./index.es74.js";
3
+ import { addLangChainErrorFields } from "./index.es69.js";
4
+ import { _isToolCall } from "./index.es70.js";
5
+ import { parsePartialJson } from "./index.es71.js";
6
6
  import { ChatMessage, ChatMessageChunk } from "./index.es59.js";
7
7
  import { FunctionMessage, FunctionMessageChunk } from "./index.es60.js";
8
8
  import { HumanMessage, HumanMessageChunk } from "./index.es44.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.es5.js","sources":["../src/providers/ChatRuntime.tsx"],"sourcesContent":["/* @refresh reset */\nimport type { ChatIdentity } from \"@/types/ChatIdentity\";\nimport { createContext, useContext, useMemo, useState, type ReactNode } from \"react\";\n\n/**\n * Context value containing core chat runtime configuration.\n * This includes API connection details and user identity.\n */\nexport type ChatRuntimeContextValue = {\n /** Base URL for the LangGraph API */\n apiUrl: string;\n /** Unique identifier for the assistant/agent */\n assistantId: string;\n /** Function to update the assistant ID */\n setAssistantId: (assistantId: string) => void;\n /** Optional user identity and authentication information */\n identity?: ChatIdentity | null;\n};\n\nconst ChatRuntimeContext = createContext<ChatRuntimeContextValue | undefined>(\n undefined\n);\n\ntype ChatRuntimeProviderProps = {\n /** Base URL for the LangGraph API endpoint */\n apiUrl: string;\n /** Unique identifier for the assistant/agent */\n assistantId: string;\n /** Optional user identity and authentication information */\n identity?: ChatIdentity | null;\n /** Child components that will have access to the runtime context */\n children: ReactNode;\n};\n\n/**\n * Provides core runtime configuration for the chat system.\n * This should be one of the outermost providers in your component tree.\n * \n * @example\n * ```tsx\n * <ChatRuntimeProvider\n * apiUrl=\"https://api.example.com\"\n * assistantId=\"my-assistant\"\n * identity={{ user_id: \"user123\" }}\n * >\n * <App />\n * </ChatRuntimeProvider>\n * ```\n */\nexport function ChatRuntimeProvider({\n apiUrl,\n assistantId: initialAssistantId,\n identity,\n children,\n}: ChatRuntimeProviderProps) {\n \n const [assistantId, setAssistantId] = useState(initialAssistantId);\n\n const value: ChatRuntimeContextValue = useMemo(() => ({\n apiUrl,\n assistantId,\n setAssistantId,\n identity,\n }), [apiUrl, assistantId, identity]);\n\n return (\n <ChatRuntimeContext.Provider value={value}>\n {children}\n </ChatRuntimeContext.Provider>\n );\n}\n\n/**\n * Hook to access the chat runtime context.\n * Returns API configuration and user identity information.\n * \n * @throws {Error} If used outside of ChatRuntimeProvider\n * \n * @example\n * ```tsx\n * const { apiUrl, assistantId, identity } = useChatRuntime();\n * ```\n */\nexport function useChatRuntime(): ChatRuntimeContextValue {\n const context = useContext(ChatRuntimeContext);\n if (!context) {\n throw new Error(\"useChatRuntime must be used within a ChatRuntimeProvider\");\n }\n return context;\n}\n"],"names":[],"mappings":";;AAmBA,MAAM,qBAAqB;AAAA,EACzB;AACF;AA4BO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AACF,GAA6B;AAE3B,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,kBAAkB;AAEjE,QAAM,QAAiC,QAAQ,OAAO;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,CAAC,QAAQ,aAAa,QAAQ,CAAC;AAEnC,SACE,oBAAC,mBAAmB,UAAnB,EAA4B,OAC1B,SAAA,CACH;AAEJ;AAaO,SAAS,iBAA0C;AACxD,QAAM,UAAU,WAAW,kBAAkB;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"index.es5.js","sources":["../src/providers/ChatRuntime.tsx"],"sourcesContent":["/* @refresh reset */\nimport { createContext, useContext, useMemo, useState, type ReactNode } from \"react\";\n\n/**\n * Identity information for the chat runtime.\n * Supports authentication tokens and custom identity fields.\n */\nexport type ChatIdentity = {\n /** Optional bearer token for API authentication */\n authToken?: string | null;\n /** Optional user identifier */\n user_id?: string | null;\n /** Optional organization identifier */\n org_id?: string | null;\n /** Allow additional custom identity fields */\n [key: string]: any;\n};\n\n/**\n * Context value containing core chat runtime configuration.\n * This includes API connection details and user identity.\n */\nexport type ChatRuntimeContextValue = {\n /** Base URL for the LangGraph API */\n apiUrl: string;\n /** Unique identifier for the assistant/agent */\n assistantId: string;\n /** Function to update the assistant ID */\n setAssistantId: (assistantId: string) => void;\n /** Optional user identity and authentication information */\n identity?: ChatIdentity | null;\n};\n\nconst ChatRuntimeContext = createContext<ChatRuntimeContextValue | undefined>(\n undefined\n);\n\ntype ChatRuntimeProviderProps = {\n /** Base URL for the LangGraph API endpoint */\n apiUrl: string;\n /** Unique identifier for the assistant/agent */\n assistantId: string;\n /** Optional user identity and authentication information */\n identity?: ChatIdentity | null;\n /** Child components that will have access to the runtime context */\n children: ReactNode;\n};\n\n/**\n * Provides core runtime configuration for the chat system.\n * This should be one of the outermost providers in your component tree.\n * \n * @example\n * ```tsx\n * <ChatRuntimeProvider\n * apiUrl=\"https://api.example.com\"\n * assistantId=\"my-assistant\"\n * identity={{ user_id: \"user123\" }}\n * >\n * <App />\n * </ChatRuntimeProvider>\n * ```\n */\nexport function ChatRuntimeProvider({\n apiUrl,\n assistantId: initialAssistantId,\n identity,\n children,\n}: ChatRuntimeProviderProps) {\n \n const [assistantId, setAssistantId] = useState(initialAssistantId);\n\n const value: ChatRuntimeContextValue = useMemo(() => ({\n apiUrl,\n assistantId,\n setAssistantId,\n identity,\n }), [apiUrl, assistantId, identity]);\n\n return (\n <ChatRuntimeContext.Provider value={value}>\n {children}\n </ChatRuntimeContext.Provider>\n );\n}\n\n/**\n * Hook to access the chat runtime context.\n * Returns API configuration and user identity information.\n * \n * @throws {Error} If used outside of ChatRuntimeProvider\n * \n * @example\n * ```tsx\n * const { apiUrl, assistantId, identity } = useChatRuntime();\n * ```\n */\nexport function useChatRuntime(): ChatRuntimeContextValue {\n const context = useContext(ChatRuntimeContext);\n if (!context) {\n throw new Error(\"useChatRuntime must be used within a ChatRuntimeProvider\");\n }\n return context;\n}\n"],"names":[],"mappings":";;AAiCA,MAAM,qBAAqB;AAAA,EACzB;AACF;AA4BO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AACF,GAA6B;AAE3B,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,kBAAkB;AAEjE,QAAM,QAAiC,QAAQ,OAAO;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE,CAAC,QAAQ,aAAa,QAAQ,CAAC;AAEnC,SACE,oBAAC,mBAAmB,UAAnB,EAA4B,OAC1B,SAAA,CACH;AAEJ;AAaO,SAAS,iBAA0C;AACxD,QAAM,UAAU,WAAW,kBAAkB;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;"}