@langchain/langgraph-sdk 0.1.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/_virtual/rolldown_runtime.cjs +25 -0
  3. package/dist/auth/error.cjs +76 -86
  4. package/dist/auth/error.cjs.map +1 -0
  5. package/dist/auth/error.d.cts +13 -0
  6. package/dist/auth/error.d.cts.map +1 -0
  7. package/dist/auth/error.d.ts +12 -8
  8. package/dist/auth/error.d.ts.map +1 -0
  9. package/dist/auth/error.js +76 -83
  10. package/dist/auth/error.js.map +1 -0
  11. package/dist/auth/index.cjs +36 -44
  12. package/dist/auth/index.cjs.map +1 -0
  13. package/dist/auth/index.d.cts +31 -0
  14. package/dist/auth/index.d.cts.map +1 -0
  15. package/dist/auth/index.d.ts +20 -15
  16. package/dist/auth/index.d.ts.map +1 -0
  17. package/dist/auth/index.js +35 -39
  18. package/dist/auth/index.js.map +1 -0
  19. package/dist/auth/types.d.cts +294 -0
  20. package/dist/auth/types.d.cts.map +1 -0
  21. package/dist/auth/types.d.ts +162 -165
  22. package/dist/auth/types.d.ts.map +1 -0
  23. package/dist/client.cjs +1108 -1294
  24. package/dist/client.cjs.map +1 -0
  25. package/dist/client.d.cts +688 -0
  26. package/dist/client.d.cts.map +1 -0
  27. package/dist/client.d.ts +647 -639
  28. package/dist/client.d.ts.map +1 -0
  29. package/dist/client.js +1099 -1281
  30. package/dist/client.js.map +1 -0
  31. package/dist/index.cjs +6 -8
  32. package/dist/index.d.cts +7 -0
  33. package/dist/index.d.ts +7 -7
  34. package/dist/index.js +4 -2
  35. package/dist/logging/index.cjs +30 -31
  36. package/dist/logging/index.cjs.map +1 -0
  37. package/dist/logging/index.d.cts +47 -0
  38. package/dist/logging/index.d.cts.map +1 -0
  39. package/dist/logging/index.d.ts +20 -16
  40. package/dist/logging/index.d.ts.map +1 -0
  41. package/dist/logging/index.js +31 -29
  42. package/dist/logging/index.js.map +1 -0
  43. package/dist/react/index.cjs +5 -7
  44. package/dist/react/index.d.cts +4 -0
  45. package/dist/react/index.d.ts +4 -3
  46. package/dist/react/index.js +4 -2
  47. package/dist/react/stream.cjs +14 -15
  48. package/dist/react/stream.cjs.map +1 -0
  49. package/dist/react/stream.custom.cjs +126 -145
  50. package/dist/react/stream.custom.cjs.map +1 -0
  51. package/dist/react/stream.custom.d.cts +39 -0
  52. package/dist/react/stream.custom.d.cts.map +1 -0
  53. package/dist/react/stream.custom.d.ts +35 -37
  54. package/dist/react/stream.custom.d.ts.map +1 -0
  55. package/dist/react/stream.custom.js +122 -137
  56. package/dist/react/stream.custom.js.map +1 -0
  57. package/dist/react/stream.d.cts +73 -0
  58. package/dist/react/stream.d.cts.map +1 -0
  59. package/dist/react/stream.d.ts +21 -15
  60. package/dist/react/stream.d.ts.map +1 -0
  61. package/dist/react/stream.js +12 -11
  62. package/dist/react/stream.js.map +1 -0
  63. package/dist/react/stream.lgp.cjs +438 -495
  64. package/dist/react/stream.lgp.cjs.map +1 -0
  65. package/dist/react/stream.lgp.js +433 -487
  66. package/dist/react/stream.lgp.js.map +1 -0
  67. package/dist/react/thread.cjs +18 -15
  68. package/dist/react/thread.cjs.map +1 -0
  69. package/dist/react/thread.js +19 -13
  70. package/dist/react/thread.js.map +1 -0
  71. package/dist/react/types.d.cts +355 -0
  72. package/dist/react/types.d.cts.map +1 -0
  73. package/dist/react/types.d.ts +333 -329
  74. package/dist/react/types.d.ts.map +1 -0
  75. package/dist/react-ui/client.cjs +123 -184
  76. package/dist/react-ui/client.cjs.map +1 -0
  77. package/dist/react-ui/client.d.cts +90 -0
  78. package/dist/react-ui/client.d.cts.map +1 -0
  79. package/dist/react-ui/client.d.ts +67 -51
  80. package/dist/react-ui/client.d.ts.map +1 -0
  81. package/dist/react-ui/client.js +118 -143
  82. package/dist/react-ui/client.js.map +1 -0
  83. package/dist/react-ui/index.cjs +14 -13
  84. package/dist/react-ui/index.cjs.map +1 -0
  85. package/dist/react-ui/index.d.cts +3 -0
  86. package/dist/react-ui/index.d.ts +3 -2
  87. package/dist/react-ui/index.js +8 -3
  88. package/dist/react-ui/index.js.map +1 -0
  89. package/dist/react-ui/server/index.cjs +5 -7
  90. package/dist/react-ui/server/index.d.cts +3 -0
  91. package/dist/react-ui/server/index.d.ts +3 -2
  92. package/dist/react-ui/server/index.js +4 -2
  93. package/dist/react-ui/server/server.cjs +53 -44
  94. package/dist/react-ui/server/server.cjs.map +1 -0
  95. package/dist/react-ui/server/server.d.cts +55 -0
  96. package/dist/react-ui/server/server.d.cts.map +1 -0
  97. package/dist/react-ui/server/server.d.ts +43 -39
  98. package/dist/react-ui/server/server.d.ts.map +1 -0
  99. package/dist/react-ui/server/server.js +54 -42
  100. package/dist/react-ui/server/server.js.map +1 -0
  101. package/dist/react-ui/types.cjs +32 -36
  102. package/dist/react-ui/types.cjs.map +1 -0
  103. package/dist/react-ui/types.d.cts +25 -0
  104. package/dist/react-ui/types.d.cts.map +1 -0
  105. package/dist/react-ui/types.d.ts +23 -19
  106. package/dist/react-ui/types.d.ts.map +1 -0
  107. package/dist/react-ui/types.js +32 -34
  108. package/dist/react-ui/types.js.map +1 -0
  109. package/dist/schema.d.cts +277 -0
  110. package/dist/schema.d.cts.map +1 -0
  111. package/dist/schema.d.ts +249 -242
  112. package/dist/schema.d.ts.map +1 -0
  113. package/dist/singletons/fetch.cjs +16 -20
  114. package/dist/singletons/fetch.cjs.map +1 -0
  115. package/dist/singletons/fetch.d.cts +14 -0
  116. package/dist/singletons/fetch.d.cts.map +1 -0
  117. package/dist/singletons/fetch.d.ts +5 -2
  118. package/dist/singletons/fetch.d.ts.map +1 -0
  119. package/dist/singletons/fetch.js +16 -17
  120. package/dist/singletons/fetch.js.map +1 -0
  121. package/dist/types.d.cts +187 -0
  122. package/dist/types.d.cts.map +1 -0
  123. package/dist/types.d.ts +178 -173
  124. package/dist/types.d.ts.map +1 -0
  125. package/dist/types.messages.d.cts +91 -0
  126. package/dist/types.messages.d.cts.map +1 -0
  127. package/dist/types.messages.d.ts +71 -66
  128. package/dist/types.messages.d.ts.map +1 -0
  129. package/dist/types.stream.d.cts +235 -0
  130. package/dist/types.stream.d.cts.map +1 -0
  131. package/dist/types.stream.d.ts +149 -142
  132. package/dist/types.stream.d.ts.map +1 -0
  133. package/dist/ui/branching.cjs +145 -141
  134. package/dist/ui/branching.cjs.map +1 -0
  135. package/dist/ui/branching.d.cts +22 -0
  136. package/dist/ui/branching.d.cts.map +1 -0
  137. package/dist/ui/branching.d.ts +17 -30
  138. package/dist/ui/branching.d.ts.map +1 -0
  139. package/dist/ui/branching.js +147 -139
  140. package/dist/ui/branching.js.map +1 -0
  141. package/dist/ui/errors.cjs +14 -12
  142. package/dist/ui/errors.cjs.map +1 -0
  143. package/dist/ui/errors.js +14 -9
  144. package/dist/ui/errors.js.map +1 -0
  145. package/dist/ui/manager.cjs +156 -232
  146. package/dist/ui/manager.cjs.map +1 -0
  147. package/dist/ui/manager.js +156 -228
  148. package/dist/ui/manager.js.map +1 -0
  149. package/dist/ui/messages.cjs +55 -69
  150. package/dist/ui/messages.cjs.map +1 -0
  151. package/dist/ui/messages.js +55 -66
  152. package/dist/ui/messages.js.map +1 -0
  153. package/dist/ui/utils.cjs +10 -10
  154. package/dist/ui/utils.cjs.map +1 -0
  155. package/dist/ui/utils.js +10 -8
  156. package/dist/ui/utils.js.map +1 -0
  157. package/dist/utils/async_caller.cjs +103 -185
  158. package/dist/utils/async_caller.cjs.map +1 -0
  159. package/dist/utils/async_caller.d.cts +53 -0
  160. package/dist/utils/async_caller.d.cts.map +1 -0
  161. package/dist/utils/async_caller.d.ts +36 -31
  162. package/dist/utils/async_caller.d.ts.map +1 -0
  163. package/dist/utils/async_caller.js +101 -177
  164. package/dist/utils/async_caller.js.map +1 -0
  165. package/dist/utils/env.cjs +11 -13
  166. package/dist/utils/env.cjs.map +1 -0
  167. package/dist/utils/env.js +11 -11
  168. package/dist/utils/env.js.map +1 -0
  169. package/dist/utils/signals.cjs +18 -19
  170. package/dist/utils/signals.cjs.map +1 -0
  171. package/dist/utils/signals.js +18 -17
  172. package/dist/utils/signals.js.map +1 -0
  173. package/dist/utils/sse.cjs +110 -140
  174. package/dist/utils/sse.cjs.map +1 -0
  175. package/dist/utils/sse.js +110 -138
  176. package/dist/utils/sse.js.map +1 -0
  177. package/dist/utils/stream.cjs +90 -114
  178. package/dist/utils/stream.cjs.map +1 -0
  179. package/dist/utils/stream.js +90 -111
  180. package/dist/utils/stream.js.map +1 -0
  181. package/package.json +72 -80
  182. package/auth.cjs +0 -1
  183. package/auth.d.cts +0 -1
  184. package/auth.d.ts +0 -1
  185. package/auth.js +0 -1
  186. package/client.cjs +0 -1
  187. package/client.d.cts +0 -1
  188. package/client.d.ts +0 -1
  189. package/client.js +0 -1
  190. package/dist/auth/types.cjs +0 -2
  191. package/dist/auth/types.js +0 -1
  192. package/dist/react/stream.lgp.d.ts +0 -7
  193. package/dist/react/thread.d.ts +0 -4
  194. package/dist/react/types.cjs +0 -2
  195. package/dist/react/types.js +0 -1
  196. package/dist/schema.cjs +0 -2
  197. package/dist/schema.js +0 -1
  198. package/dist/types.cjs +0 -2
  199. package/dist/types.js +0 -1
  200. package/dist/types.messages.cjs +0 -2
  201. package/dist/types.messages.js +0 -1
  202. package/dist/types.stream.cjs +0 -2
  203. package/dist/types.stream.js +0 -1
  204. package/dist/ui/branching.test.cjs +0 -370
  205. package/dist/ui/branching.test.d.ts +0 -1
  206. package/dist/ui/branching.test.js +0 -368
  207. package/dist/ui/errors.d.ts +0 -12
  208. package/dist/ui/manager.d.ts +0 -87
  209. package/dist/ui/messages.d.ts +0 -18
  210. package/dist/ui/utils.d.ts +0 -2
  211. package/dist/utils/env.d.ts +0 -1
  212. package/dist/utils/signals.d.ts +0 -1
  213. package/dist/utils/sse.d.ts +0 -8
  214. package/dist/utils/stream.d.ts +0 -13
  215. package/index.cjs +0 -1
  216. package/index.d.cts +0 -1
  217. package/index.d.ts +0 -1
  218. package/index.js +0 -1
  219. package/logging.cjs +0 -1
  220. package/logging.d.cts +0 -1
  221. package/logging.d.ts +0 -1
  222. package/logging.js +0 -1
  223. package/react-ui/server.cjs +0 -1
  224. package/react-ui/server.d.cts +0 -1
  225. package/react-ui/server.d.ts +0 -1
  226. package/react-ui/server.js +0 -1
  227. package/react-ui.cjs +0 -1
  228. package/react-ui.d.cts +0 -1
  229. package/react-ui.d.ts +0 -1
  230. package/react-ui.js +0 -1
  231. package/react.cjs +0 -1
  232. package/react.d.cts +0 -1
  233. package/react.d.ts +0 -1
  234. package/react.js +0 -1
@@ -1,229 +1,157 @@
1
- import { toMessageDict } from "./messages.js";
2
1
  import { StreamError } from "./errors.js";
3
- export class StreamManager {
4
- constructor(messages) {
5
- Object.defineProperty(this, "abortRef", {
6
- enumerable: true,
7
- configurable: true,
8
- writable: true,
9
- value: new AbortController()
10
- });
11
- Object.defineProperty(this, "messages", {
12
- enumerable: true,
13
- configurable: true,
14
- writable: true,
15
- value: void 0
16
- });
17
- Object.defineProperty(this, "listeners", {
18
- enumerable: true,
19
- configurable: true,
20
- writable: true,
21
- value: new Set()
22
- });
23
- Object.defineProperty(this, "state", {
24
- enumerable: true,
25
- configurable: true,
26
- writable: true,
27
- value: void 0
28
- });
29
- Object.defineProperty(this, "setState", {
30
- enumerable: true,
31
- configurable: true,
32
- writable: true,
33
- value: (newState) => {
34
- this.state = { ...this.state, ...newState };
35
- this.notifyListeners();
36
- }
37
- });
38
- Object.defineProperty(this, "notifyListeners", {
39
- enumerable: true,
40
- configurable: true,
41
- writable: true,
42
- value: () => {
43
- this.listeners.forEach((listener) => listener());
44
- }
45
- });
46
- Object.defineProperty(this, "subscribe", {
47
- enumerable: true,
48
- configurable: true,
49
- writable: true,
50
- value: (listener) => {
51
- this.listeners.add(listener);
52
- return () => this.listeners.delete(listener);
53
- }
54
- });
55
- Object.defineProperty(this, "getSnapshot", {
56
- enumerable: true,
57
- configurable: true,
58
- writable: true,
59
- value: () => this.state
60
- });
61
- Object.defineProperty(this, "setStreamValues", {
62
- enumerable: true,
63
- configurable: true,
64
- writable: true,
65
- value: (values, kind = "stream") => {
66
- if (typeof values === "function") {
67
- const [prevValues, prevKind] = this.state.values ?? [null, "stream"];
68
- const nextValues = values(prevValues, prevKind);
69
- this.setState({ values: nextValues != null ? [nextValues, kind] : null });
70
- }
71
- else {
72
- const nextValues = values != null ? [values, kind] : null;
73
- this.setState({ values: nextValues });
74
- }
75
- }
76
- });
77
- Object.defineProperty(this, "getMutateFn", {
78
- enumerable: true,
79
- configurable: true,
80
- writable: true,
81
- value: (kind, historyValues) => {
82
- return (update) => {
83
- const prev = {
84
- ...historyValues,
85
- ...(this.state.values ?? [null, "stream"])[0],
86
- };
87
- const next = typeof update === "function" ? update(prev) : update;
88
- this.setStreamValues({ ...prev, ...next }, kind);
89
- };
90
- }
91
- });
92
- Object.defineProperty(this, "matchEventType", {
93
- enumerable: true,
94
- configurable: true,
95
- writable: true,
96
- value: (expected, actual, _data) => {
97
- return expected === actual || actual.startsWith(`${expected}|`);
98
- }
99
- });
100
- Object.defineProperty(this, "start", {
101
- enumerable: true,
102
- configurable: true,
103
- writable: true,
104
- value: async (action, options) => {
105
- if (this.state.isLoading)
106
- return;
107
- try {
108
- this.setState({ isLoading: true, error: undefined });
109
- this.abortRef = new AbortController();
110
- const run = await action(this.abortRef.signal);
111
- let streamError;
112
- for await (const { event, data } of run) {
113
- if (event === "error") {
114
- streamError = new StreamError(data);
115
- break;
116
- }
117
- const namespace = event.includes("|")
118
- ? event.split("|").slice(1)
119
- : undefined;
120
- const mutate = this.getMutateFn("stream", options.initialValues);
121
- if (event === "metadata")
122
- options.callbacks.onMetadataEvent?.(data);
123
- if (event === "events")
124
- options.callbacks.onLangChainEvent?.(data);
125
- if (this.matchEventType("updates", event, data)) {
126
- options.callbacks.onUpdateEvent?.(data, { namespace, mutate });
127
- }
128
- if (this.matchEventType("custom", event, data)) {
129
- options.callbacks.onCustomEvent?.(data, { namespace, mutate });
130
- }
131
- if (this.matchEventType("checkpoints", event, data)) {
132
- options.callbacks.onCheckpointEvent?.(data, { namespace });
133
- }
134
- if (this.matchEventType("tasks", event, data)) {
135
- options.callbacks.onTaskEvent?.(data, { namespace });
136
- }
137
- if (this.matchEventType("debug", event, data)) {
138
- options.callbacks.onDebugEvent?.(data, { namespace });
139
- }
140
- if (event === "values") {
141
- if ("__interrupt__" in data) {
142
- this.setStreamValues((prev) => ({ ...prev, ...data }));
143
- }
144
- else {
145
- this.setStreamValues(data);
146
- }
147
- }
148
- if (this.matchEventType("messages", event, data)) {
149
- const [serialized, metadata] = data;
150
- const messageId = this.messages.add(serialized, metadata);
151
- if (!messageId) {
152
- console.warn("Failed to add message to manager, no message ID found");
153
- continue;
154
- }
155
- this.setStreamValues((streamValues) => {
156
- const values = { ...options.initialValues, ...streamValues };
157
- // Assumption: we're concatenating the message
158
- const messages = options.getMessages(values).slice();
159
- const { chunk, index } = this.messages.get(messageId, messages.length) ?? {};
160
- if (!chunk || index == null)
161
- return values;
162
- if (chunk.getType() === "remove") {
163
- messages.splice(index, 1);
164
- }
165
- else {
166
- messages[index] = toMessageDict(chunk);
167
- }
168
- return options.setMessages(values, messages);
169
- });
170
- }
171
- }
172
- if (streamError != null)
173
- throw streamError;
174
- const values = await options.onSuccess?.();
175
- if (typeof values !== "undefined")
176
- this.setStreamValues(values);
177
- }
178
- catch (error) {
179
- if (!(error instanceof Error && // eslint-disable-line no-instanceof/no-instanceof
180
- (error.name === "AbortError" || error.name === "TimeoutError"))) {
181
- console.error(error);
182
- this.setState({ error });
183
- await options.onError?.(error);
184
- }
185
- }
186
- finally {
187
- this.setState({ isLoading: false });
188
- this.abortRef = new AbortController();
189
- options.onFinish?.();
190
- }
191
- }
192
- });
193
- Object.defineProperty(this, "stop", {
194
- enumerable: true,
195
- configurable: true,
196
- writable: true,
197
- value: async (historyValues, options) => {
198
- this.abortRef.abort();
199
- this.abortRef = new AbortController();
200
- options.onStop?.({ mutate: this.getMutateFn("stop", historyValues) });
201
- }
202
- });
203
- Object.defineProperty(this, "clear", {
204
- enumerable: true,
205
- configurable: true,
206
- writable: true,
207
- value: () => {
208
- // Cancel any running streams
209
- this.abortRef.abort();
210
- this.abortRef = new AbortController();
211
- // Set the stream state to null
212
- this.setState({ error: undefined, values: null });
213
- // Clear any pending messages
214
- this.messages.clear();
215
- }
216
- });
217
- this.messages = messages;
218
- this.state = { isLoading: false, values: null, error: undefined };
219
- }
220
- get isLoading() {
221
- return this.state.isLoading;
222
- }
223
- get values() {
224
- return this.state.values?.[0] ?? null;
225
- }
226
- get error() {
227
- return this.state.error;
228
- }
229
- }
2
+ import { toMessageDict } from "./messages.js";
3
+
4
+ //#region src/ui/manager.ts
5
+ var StreamManager = class {
6
+ abortRef = new AbortController();
7
+ messages;
8
+ listeners = /* @__PURE__ */ new Set();
9
+ state;
10
+ constructor(messages) {
11
+ this.messages = messages;
12
+ this.state = {
13
+ isLoading: false,
14
+ values: null,
15
+ error: void 0
16
+ };
17
+ }
18
+ setState = (newState) => {
19
+ this.state = {
20
+ ...this.state,
21
+ ...newState
22
+ };
23
+ this.notifyListeners();
24
+ };
25
+ notifyListeners = () => {
26
+ this.listeners.forEach((listener) => listener());
27
+ };
28
+ subscribe = (listener) => {
29
+ this.listeners.add(listener);
30
+ return () => this.listeners.delete(listener);
31
+ };
32
+ getSnapshot = () => this.state;
33
+ get isLoading() {
34
+ return this.state.isLoading;
35
+ }
36
+ get values() {
37
+ return this.state.values?.[0] ?? null;
38
+ }
39
+ get error() {
40
+ return this.state.error;
41
+ }
42
+ setStreamValues = (values, kind = "stream") => {
43
+ if (typeof values === "function") {
44
+ const [prevValues, prevKind] = this.state.values ?? [null, "stream"];
45
+ const nextValues = values(prevValues, prevKind);
46
+ this.setState({ values: nextValues != null ? [nextValues, kind] : null });
47
+ } else {
48
+ const nextValues = values != null ? [values, kind] : null;
49
+ this.setState({ values: nextValues });
50
+ }
51
+ };
52
+ getMutateFn = (kind, historyValues) => {
53
+ return (update) => {
54
+ const prev = {
55
+ ...historyValues,
56
+ ...(this.state.values ?? [null, "stream"])[0]
57
+ };
58
+ const next = typeof update === "function" ? update(prev) : update;
59
+ this.setStreamValues({
60
+ ...prev,
61
+ ...next
62
+ }, kind);
63
+ };
64
+ };
65
+ matchEventType = (expected, actual, _data) => {
66
+ return expected === actual || actual.startsWith(`${expected}|`);
67
+ };
68
+ start = async (action, options) => {
69
+ if (this.state.isLoading) return;
70
+ try {
71
+ this.setState({
72
+ isLoading: true,
73
+ error: void 0
74
+ });
75
+ this.abortRef = new AbortController();
76
+ const run = await action(this.abortRef.signal);
77
+ let streamError;
78
+ for await (const { event, data } of run) {
79
+ if (event === "error") {
80
+ streamError = new StreamError(data);
81
+ break;
82
+ }
83
+ const namespace = event.includes("|") ? event.split("|").slice(1) : void 0;
84
+ const mutate = this.getMutateFn("stream", options.initialValues);
85
+ if (event === "metadata") options.callbacks.onMetadataEvent?.(data);
86
+ if (event === "events") options.callbacks.onLangChainEvent?.(data);
87
+ if (this.matchEventType("updates", event, data)) options.callbacks.onUpdateEvent?.(data, {
88
+ namespace,
89
+ mutate
90
+ });
91
+ if (this.matchEventType("custom", event, data)) options.callbacks.onCustomEvent?.(data, {
92
+ namespace,
93
+ mutate
94
+ });
95
+ if (this.matchEventType("checkpoints", event, data)) options.callbacks.onCheckpointEvent?.(data, { namespace });
96
+ if (this.matchEventType("tasks", event, data)) options.callbacks.onTaskEvent?.(data, { namespace });
97
+ if (this.matchEventType("debug", event, data)) options.callbacks.onDebugEvent?.(data, { namespace });
98
+ if (event === "values") if ("__interrupt__" in data) this.setStreamValues((prev) => ({
99
+ ...prev,
100
+ ...data
101
+ }));
102
+ else this.setStreamValues(data);
103
+ if (this.matchEventType("messages", event, data)) {
104
+ const [serialized, metadata] = data;
105
+ const messageId = this.messages.add(serialized, metadata);
106
+ if (!messageId) {
107
+ console.warn("Failed to add message to manager, no message ID found");
108
+ continue;
109
+ }
110
+ this.setStreamValues((streamValues) => {
111
+ const values$1 = {
112
+ ...options.initialValues,
113
+ ...streamValues
114
+ };
115
+ const messages = options.getMessages(values$1).slice();
116
+ const { chunk, index } = this.messages.get(messageId, messages.length) ?? {};
117
+ if (!chunk || index == null) return values$1;
118
+ if (chunk.getType() === "remove") messages.splice(index, 1);
119
+ else messages[index] = toMessageDict(chunk);
120
+ return options.setMessages(values$1, messages);
121
+ });
122
+ }
123
+ }
124
+ if (streamError != null) throw streamError;
125
+ const values = await options.onSuccess?.();
126
+ if (typeof values !== "undefined") this.setStreamValues(values);
127
+ } catch (error) {
128
+ if (!(error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError"))) {
129
+ console.error(error);
130
+ this.setState({ error });
131
+ await options.onError?.(error);
132
+ }
133
+ } finally {
134
+ this.setState({ isLoading: false });
135
+ this.abortRef = new AbortController();
136
+ options.onFinish?.();
137
+ }
138
+ };
139
+ stop = async (historyValues, options) => {
140
+ this.abortRef.abort();
141
+ this.abortRef = new AbortController();
142
+ options.onStop?.({ mutate: this.getMutateFn("stop", historyValues) });
143
+ };
144
+ clear = () => {
145
+ this.abortRef.abort();
146
+ this.abortRef = new AbortController();
147
+ this.setState({
148
+ error: void 0,
149
+ values: null
150
+ });
151
+ this.messages.clear();
152
+ };
153
+ };
154
+
155
+ //#endregion
156
+ export { StreamManager };
157
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","names":["streamError: StreamError | undefined","values"],"sources":["../../src/ui/manager.ts"],"sourcesContent":["import type {\n CheckpointsStreamEvent,\n CustomStreamEvent,\n DebugStreamEvent,\n ErrorStreamEvent,\n EventsStreamEvent,\n FeedbackStreamEvent,\n MessagesTupleStreamEvent,\n MetadataStreamEvent,\n TasksStreamEvent,\n UpdatesStreamEvent,\n ValuesStreamEvent,\n} from \"../types.stream.js\";\nimport { MessageTupleManager, toMessageDict } from \"./messages.js\";\nimport { StreamError } from \"./errors.js\";\nimport type { Message } from \"../types.messages.js\";\n\ntype BagTemplate = {\n ConfigurableType?: Record<string, unknown>;\n InterruptType?: unknown;\n CustomEventType?: unknown;\n UpdateType?: unknown;\n};\n\ntype GetUpdateType<\n Bag extends BagTemplate,\n StateType extends Record<string, unknown>\n> = Bag extends { UpdateType: unknown }\n ? Bag[\"UpdateType\"]\n : Partial<StateType>;\n\ntype GetCustomEventType<Bag extends BagTemplate> = Bag extends {\n CustomEventType: unknown;\n}\n ? Bag[\"CustomEventType\"]\n : unknown;\n\ntype EventStreamMap<StateType, UpdateType, CustomType> = {\n values: ValuesStreamEvent<StateType>;\n updates: UpdatesStreamEvent<UpdateType>;\n custom: CustomStreamEvent<CustomType>;\n debug: DebugStreamEvent;\n messages: MessagesTupleStreamEvent;\n events: EventsStreamEvent;\n metadata: MetadataStreamEvent;\n checkpoints: CheckpointsStreamEvent<StateType>;\n tasks: TasksStreamEvent<StateType, UpdateType>;\n error: ErrorStreamEvent;\n feedback: FeedbackStreamEvent;\n};\n\nexport type EventStreamEvent<StateType, UpdateType, CustomType> =\n EventStreamMap<StateType, UpdateType, CustomType>[keyof EventStreamMap<\n StateType,\n UpdateType,\n CustomType\n >];\n\ninterface StreamManagerEventCallbacks<\n StateType extends Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate\n> {\n onUpdateEvent?: (\n data: UpdatesStreamEvent<GetUpdateType<Bag, StateType>>[\"data\"],\n options: {\n namespace: string[] | undefined;\n mutate: (\n update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)\n ) => void;\n }\n ) => void;\n onCustomEvent?: (\n data: GetCustomEventType<Bag>,\n options: {\n namespace: string[] | undefined;\n mutate: (\n update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)\n ) => void;\n }\n ) => void;\n onMetadataEvent?: (data: MetadataStreamEvent[\"data\"]) => void;\n onLangChainEvent?: (data: EventsStreamEvent[\"data\"]) => void;\n onDebugEvent?: (\n data: DebugStreamEvent[\"data\"],\n options: { namespace: string[] | undefined }\n ) => void;\n onCheckpointEvent?: (\n data: CheckpointsStreamEvent<StateType>[\"data\"],\n options: { namespace: string[] | undefined }\n ) => void;\n onTaskEvent?: (\n data: TasksStreamEvent<StateType, GetUpdateType<Bag, StateType>>[\"data\"],\n options: { namespace: string[] | undefined }\n ) => void;\n}\n\nexport class StreamManager<\n StateType extends Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate\n> {\n private abortRef = new AbortController();\n\n private messages: MessageTupleManager;\n\n private listeners = new Set<() => void>();\n\n private state: {\n isLoading: boolean;\n values: [values: StateType, kind: \"stream\" | \"stop\"] | null;\n error: unknown;\n };\n\n constructor(messages: MessageTupleManager) {\n this.messages = messages;\n this.state = { isLoading: false, values: null, error: undefined };\n }\n\n private setState = (newState: Partial<typeof this.state>) => {\n this.state = { ...this.state, ...newState };\n this.notifyListeners();\n };\n\n private notifyListeners = () => {\n this.listeners.forEach((listener) => listener());\n };\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getSnapshot = () => this.state;\n\n get isLoading() {\n return this.state.isLoading;\n }\n\n get values() {\n return this.state.values?.[0] ?? null;\n }\n\n get error() {\n return this.state.error;\n }\n\n setStreamValues = (\n values:\n | (StateType | null)\n | ((prev: StateType | null, kind: \"stream\" | \"stop\") => StateType | null),\n kind: \"stream\" | \"stop\" = \"stream\"\n ) => {\n if (typeof values === \"function\") {\n const [prevValues, prevKind] = this.state.values ?? [null, \"stream\"];\n const nextValues = values(prevValues, prevKind);\n this.setState({ values: nextValues != null ? [nextValues, kind] : null });\n } else {\n const nextValues = values != null ? [values, kind] : null;\n this.setState({ values: nextValues as [StateType, \"stream\" | \"stop\"] });\n }\n };\n\n private getMutateFn = (kind: \"stream\" | \"stop\", historyValues: StateType) => {\n return (\n update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)\n ) => {\n const prev = {\n ...historyValues,\n ...(this.state.values ?? [null, \"stream\"])[0],\n };\n const next = typeof update === \"function\" ? update(prev) : update;\n this.setStreamValues({ ...prev, ...next }, kind);\n };\n };\n\n private matchEventType = <\n T extends keyof EventStreamMap<\n StateType,\n GetUpdateType<Bag, StateType>,\n GetCustomEventType<Bag>\n >\n >(\n expected: T,\n actual: EventStreamEvent<\n StateType,\n GetUpdateType<Bag, StateType>,\n GetCustomEventType<Bag>\n >[\"event\"],\n _data: EventStreamEvent<\n StateType,\n GetUpdateType<Bag, StateType>,\n GetCustomEventType<Bag>\n >[\"data\"]\n ): _data is EventStreamMap<\n StateType,\n GetUpdateType<Bag, StateType>,\n GetCustomEventType<Bag>\n >[T][\"data\"] => {\n return expected === actual || actual.startsWith(`${expected}|`);\n };\n\n start = async (\n action: (\n signal: AbortSignal\n ) => Promise<\n AsyncGenerator<\n EventStreamEvent<\n StateType,\n GetUpdateType<Bag, StateType>,\n GetCustomEventType<Bag>\n >\n >\n >,\n options: {\n getMessages: (values: StateType) => Message[];\n\n setMessages: (current: StateType, messages: Message[]) => StateType;\n\n initialValues: StateType;\n\n callbacks: StreamManagerEventCallbacks<StateType, Bag>;\n\n onSuccess: () =>\n | StateType\n | null\n | undefined\n | void\n | Promise<StateType | null | undefined | void>;\n\n onError: (error: unknown) => void | Promise<void>;\n\n onFinish?: () => void;\n }\n ): Promise<void> => {\n if (this.state.isLoading) return;\n\n try {\n this.setState({ isLoading: true, error: undefined });\n this.abortRef = new AbortController();\n\n const run = await action(this.abortRef.signal);\n\n let streamError: StreamError | undefined;\n for await (const { event, data } of run) {\n if (event === \"error\") {\n streamError = new StreamError(data);\n break;\n }\n\n const namespace = event.includes(\"|\")\n ? event.split(\"|\").slice(1)\n : undefined;\n\n const mutate = this.getMutateFn(\"stream\", options.initialValues);\n\n if (event === \"metadata\") options.callbacks.onMetadataEvent?.(data);\n if (event === \"events\") options.callbacks.onLangChainEvent?.(data);\n\n if (this.matchEventType(\"updates\", event, data)) {\n options.callbacks.onUpdateEvent?.(data, { namespace, mutate });\n }\n\n if (this.matchEventType(\"custom\", event, data)) {\n options.callbacks.onCustomEvent?.(data, { namespace, mutate });\n }\n\n if (this.matchEventType(\"checkpoints\", event, data)) {\n options.callbacks.onCheckpointEvent?.(data, { namespace });\n }\n\n if (this.matchEventType(\"tasks\", event, data)) {\n options.callbacks.onTaskEvent?.(data, { namespace });\n }\n\n if (this.matchEventType(\"debug\", event, data)) {\n options.callbacks.onDebugEvent?.(data, { namespace });\n }\n\n if (event === \"values\") {\n if (\"__interrupt__\" in data) {\n this.setStreamValues((prev) => ({ ...prev, ...data }));\n } else {\n this.setStreamValues(data);\n }\n }\n\n if (this.matchEventType(\"messages\", event, data)) {\n const [serialized, metadata] = data;\n\n const messageId = this.messages.add(serialized, metadata);\n if (!messageId) {\n console.warn(\n \"Failed to add message to manager, no message ID found\"\n );\n continue;\n }\n\n this.setStreamValues((streamValues) => {\n const values = { ...options.initialValues, ...streamValues };\n\n // Assumption: we're concatenating the message\n const messages = options.getMessages(values).slice();\n const { chunk, index } =\n this.messages.get(messageId, messages.length) ?? {};\n\n if (!chunk || index == null) return values;\n if (chunk.getType() === \"remove\") {\n messages.splice(index, 1);\n } else {\n messages[index] = toMessageDict(chunk);\n }\n\n return options.setMessages(values, messages);\n });\n }\n }\n\n if (streamError != null) throw streamError;\n\n const values = await options.onSuccess?.();\n if (typeof values !== \"undefined\") this.setStreamValues(values);\n } catch (error) {\n if (\n !(\n error instanceof Error && // eslint-disable-line no-instanceof/no-instanceof\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n )\n ) {\n console.error(error);\n this.setState({ error });\n await options.onError?.(error);\n }\n } finally {\n this.setState({ isLoading: false });\n this.abortRef = new AbortController();\n options.onFinish?.();\n }\n };\n\n stop = async (\n historyValues: StateType,\n options: {\n onStop?: (options: {\n mutate: (\n update: Partial<StateType> | ((prev: StateType) => Partial<StateType>)\n ) => void;\n }) => void;\n }\n ): Promise<void> => {\n this.abortRef.abort();\n this.abortRef = new AbortController();\n\n options.onStop?.({ mutate: this.getMutateFn(\"stop\", historyValues) });\n };\n\n clear = () => {\n // Cancel any running streams\n this.abortRef.abort();\n this.abortRef = new AbortController();\n\n // Set the stream state to null\n this.setState({ error: undefined, values: null });\n\n // Clear any pending messages\n this.messages.clear();\n };\n}\n"],"mappings":"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"}
@@ -1,76 +1,62 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toMessageDict = exports.MessageTupleManager = void 0;
4
- const messages_1 = require("@langchain/core/messages");
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const __langchain_core_messages = require_rolldown_runtime.__toESM(require("@langchain/core/messages"));
3
+
4
+ //#region src/ui/messages.ts
5
5
  function tryConvertToChunk(message) {
6
- try {
7
- return (0, messages_1.convertToChunk)(message);
8
- }
9
- catch {
10
- return null;
11
- }
6
+ try {
7
+ return (0, __langchain_core_messages.convertToChunk)(message);
8
+ } catch {
9
+ return null;
10
+ }
12
11
  }
13
12
  function tryCoerceMessageLikeToMessage(message) {
14
- // TODO: this is unnecessary with https://github.com/langchain-ai/langchainjs/pull/8941
15
- if (message.type === "remove" && message.id != null) {
16
- return new messages_1.RemoveMessage({ ...message, id: message.id });
17
- }
18
- return (0, messages_1.coerceMessageLikeToMessage)(message);
13
+ if (message.type === "remove" && message.id != null) return new __langchain_core_messages.RemoveMessage({
14
+ ...message,
15
+ id: message.id
16
+ });
17
+ return (0, __langchain_core_messages.coerceMessageLikeToMessage)(message);
19
18
  }
20
- class MessageTupleManager {
21
- constructor() {
22
- Object.defineProperty(this, "chunks", {
23
- enumerable: true,
24
- configurable: true,
25
- writable: true,
26
- value: {}
27
- });
28
- this.chunks = {};
29
- }
30
- add(serialized, metadata) {
31
- // TODO: this is sometimes sent from the API
32
- // figure out how to prevent this or move this to LC.js
33
- if (serialized.type.endsWith("MessageChunk")) {
34
- // eslint-disable-next-line no-param-reassign
35
- serialized.type = serialized.type
36
- .slice(0, -"MessageChunk".length)
37
- .toLowerCase();
38
- }
39
- const message = tryCoerceMessageLikeToMessage(serialized);
40
- const chunk = tryConvertToChunk(message);
41
- const { id } = chunk ?? message;
42
- if (!id) {
43
- console.warn("No message ID found for chunk, ignoring in state", serialized);
44
- return null;
45
- }
46
- this.chunks[id] ??= {};
47
- this.chunks[id].metadata = metadata ?? this.chunks[id].metadata;
48
- if (chunk) {
49
- const prev = this.chunks[id].chunk;
50
- this.chunks[id].chunk =
51
- ((0, messages_1.isBaseMessageChunk)(prev) ? prev : null)?.concat(chunk) ?? chunk;
52
- }
53
- else {
54
- this.chunks[id].chunk = message;
55
- }
56
- return id;
57
- }
58
- clear() {
59
- this.chunks = {};
60
- }
61
- get(id, defaultIndex) {
62
- if (id == null)
63
- return null;
64
- if (this.chunks[id] == null)
65
- return null;
66
- if (defaultIndex != null)
67
- this.chunks[id].index ??= defaultIndex;
68
- return this.chunks[id];
69
- }
70
- }
71
- exports.MessageTupleManager = MessageTupleManager;
19
+ var MessageTupleManager = class {
20
+ chunks = {};
21
+ constructor() {
22
+ this.chunks = {};
23
+ }
24
+ add(serialized, metadata) {
25
+ if (serialized.type.endsWith("MessageChunk")) serialized.type = serialized.type.slice(0, -12).toLowerCase();
26
+ const message = tryCoerceMessageLikeToMessage(serialized);
27
+ const chunk = tryConvertToChunk(message);
28
+ const { id } = chunk ?? message;
29
+ if (!id) {
30
+ console.warn("No message ID found for chunk, ignoring in state", serialized);
31
+ return null;
32
+ }
33
+ this.chunks[id] ??= {};
34
+ this.chunks[id].metadata = metadata ?? this.chunks[id].metadata;
35
+ if (chunk) {
36
+ const prev = this.chunks[id].chunk;
37
+ this.chunks[id].chunk = ((0, __langchain_core_messages.isBaseMessageChunk)(prev) ? prev : null)?.concat(chunk) ?? chunk;
38
+ } else this.chunks[id].chunk = message;
39
+ return id;
40
+ }
41
+ clear() {
42
+ this.chunks = {};
43
+ }
44
+ get(id, defaultIndex) {
45
+ if (id == null) return null;
46
+ if (this.chunks[id] == null) return null;
47
+ if (defaultIndex != null) this.chunks[id].index ??= defaultIndex;
48
+ return this.chunks[id];
49
+ }
50
+ };
72
51
  const toMessageDict = (chunk) => {
73
- const { type, data } = chunk.toDict();
74
- return { ...data, type };
52
+ const { type, data } = chunk.toDict();
53
+ return {
54
+ ...data,
55
+ type
56
+ };
75
57
  };
58
+
59
+ //#endregion
60
+ exports.MessageTupleManager = MessageTupleManager;
76
61
  exports.toMessageDict = toMessageDict;
62
+ //# sourceMappingURL=messages.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.cjs","names":["RemoveMessage"],"sources":["../../src/ui/messages.ts"],"sourcesContent":["import {\n type BaseMessage,\n type BaseMessageChunk,\n RemoveMessage,\n convertToChunk,\n coerceMessageLikeToMessage,\n isBaseMessageChunk,\n} from \"@langchain/core/messages\";\n\nimport type { Message } from \"../types.messages.js\";\n\nfunction tryConvertToChunk(message: BaseMessage): BaseMessageChunk | null {\n try {\n return convertToChunk(message);\n } catch {\n return null;\n }\n}\n\nfunction tryCoerceMessageLikeToMessage(message: Message): BaseMessage {\n // TODO: this is unnecessary with https://github.com/langchain-ai/langchainjs/pull/8941\n if (message.type === \"remove\" && message.id != null) {\n return new RemoveMessage({ ...message, id: message.id });\n }\n\n return coerceMessageLikeToMessage(message);\n}\n\nexport class MessageTupleManager {\n chunks: Record<\n string,\n {\n chunk?: BaseMessageChunk | BaseMessage;\n metadata?: Record<string, unknown>;\n index?: number;\n }\n > = {};\n\n constructor() {\n this.chunks = {};\n }\n\n add(\n serialized: Message,\n metadata: Record<string, unknown> | undefined\n ): string | null {\n // TODO: this is sometimes sent from the API\n // figure out how to prevent this or move this to LC.js\n if (serialized.type.endsWith(\"MessageChunk\")) {\n // eslint-disable-next-line no-param-reassign\n serialized.type = serialized.type\n .slice(0, -\"MessageChunk\".length)\n .toLowerCase() as Message[\"type\"];\n }\n\n const message = tryCoerceMessageLikeToMessage(serialized);\n const chunk = tryConvertToChunk(message);\n\n const { id } = chunk ?? message;\n if (!id) {\n console.warn(\n \"No message ID found for chunk, ignoring in state\",\n serialized\n );\n return null;\n }\n\n this.chunks[id] ??= {};\n this.chunks[id].metadata = metadata ?? this.chunks[id].metadata;\n if (chunk) {\n const prev = this.chunks[id].chunk;\n this.chunks[id].chunk =\n (isBaseMessageChunk(prev) ? prev : null)?.concat(chunk) ?? chunk;\n } else {\n this.chunks[id].chunk = message;\n }\n\n return id;\n }\n\n clear() {\n this.chunks = {};\n }\n\n get(id: string | null | undefined, defaultIndex?: number) {\n if (id == null) return null;\n if (this.chunks[id] == null) return null;\n if (defaultIndex != null) this.chunks[id].index ??= defaultIndex;\n return this.chunks[id];\n }\n}\n\nexport const toMessageDict = (chunk: BaseMessage): Message => {\n const { type, data } = chunk.toDict();\n return { ...data, type } as Message;\n};\n"],"mappings":";;;;AAWA,SAAS,kBAAkB,SAA+C;AACxE,KAAI;AACF,uDAAsB;SAChB;AACN,SAAO;;;AAIX,SAAS,8BAA8B,SAA+B;AAEpE,KAAI,QAAQ,SAAS,YAAY,QAAQ,MAAM,KAC7C,QAAO,IAAIA,wCAAc;EAAE,GAAG;EAAS,IAAI,QAAQ;;AAGrD,kEAAkC;;AAGpC,IAAa,sBAAb,MAAiC;CAC/B,SAOI;CAEJ,cAAc;AACZ,OAAK,SAAS;;CAGhB,IACE,YACA,UACe;AAGf,MAAI,WAAW,KAAK,SAAS,gBAE3B,YAAW,OAAO,WAAW,KAC1B,MAAM,GAAG,KACT;EAGL,MAAM,UAAU,8BAA8B;EAC9C,MAAM,QAAQ,kBAAkB;EAEhC,MAAM,EAAE,OAAO,SAAS;AACxB,MAAI,CAAC,IAAI;AACP,WAAQ,KACN,oDACA;AAEF,UAAO;;AAGT,OAAK,OAAO,QAAQ;AACpB,OAAK,OAAO,IAAI,WAAW,YAAY,KAAK,OAAO,IAAI;AACvD,MAAI,OAAO;GACT,MAAM,OAAO,KAAK,OAAO,IAAI;AAC7B,QAAK,OAAO,IAAI,2DACM,QAAQ,OAAO,OAAO,OAAO,UAAU;QAE7D,MAAK,OAAO,IAAI,QAAQ;AAG1B,SAAO;;CAGT,QAAQ;AACN,OAAK,SAAS;;CAGhB,IAAI,IAA+B,cAAuB;AACxD,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,KAAK,OAAO,OAAO,KAAM,QAAO;AACpC,MAAI,gBAAgB,KAAM,MAAK,OAAO,IAAI,UAAU;AACpD,SAAO,KAAK,OAAO;;;AAIvB,MAAa,iBAAiB,UAAgC;CAC5D,MAAM,EAAE,MAAM,SAAS,MAAM;AAC7B,QAAO;EAAE,GAAG;EAAM"}