@langchain/langgraph-sdk 0.1.10 → 1.0.1

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 (235) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +11 -0
  3. package/dist/_virtual/rolldown_runtime.cjs +25 -0
  4. package/dist/auth/error.cjs +76 -86
  5. package/dist/auth/error.cjs.map +1 -0
  6. package/dist/auth/error.d.cts +13 -0
  7. package/dist/auth/error.d.cts.map +1 -0
  8. package/dist/auth/error.d.ts +12 -8
  9. package/dist/auth/error.d.ts.map +1 -0
  10. package/dist/auth/error.js +76 -83
  11. package/dist/auth/error.js.map +1 -0
  12. package/dist/auth/index.cjs +36 -44
  13. package/dist/auth/index.cjs.map +1 -0
  14. package/dist/auth/index.d.cts +31 -0
  15. package/dist/auth/index.d.cts.map +1 -0
  16. package/dist/auth/index.d.ts +20 -15
  17. package/dist/auth/index.d.ts.map +1 -0
  18. package/dist/auth/index.js +35 -39
  19. package/dist/auth/index.js.map +1 -0
  20. package/dist/auth/types.d.cts +294 -0
  21. package/dist/auth/types.d.cts.map +1 -0
  22. package/dist/auth/types.d.ts +162 -165
  23. package/dist/auth/types.d.ts.map +1 -0
  24. package/dist/client.cjs +1110 -1294
  25. package/dist/client.cjs.map +1 -0
  26. package/dist/client.d.cts +697 -0
  27. package/dist/client.d.cts.map +1 -0
  28. package/dist/client.d.ts +656 -639
  29. package/dist/client.d.ts.map +1 -0
  30. package/dist/client.js +1101 -1281
  31. package/dist/client.js.map +1 -0
  32. package/dist/index.cjs +6 -8
  33. package/dist/index.d.cts +7 -0
  34. package/dist/index.d.ts +7 -7
  35. package/dist/index.js +4 -2
  36. package/dist/logging/index.cjs +30 -31
  37. package/dist/logging/index.cjs.map +1 -0
  38. package/dist/logging/index.d.cts +47 -0
  39. package/dist/logging/index.d.cts.map +1 -0
  40. package/dist/logging/index.d.ts +20 -16
  41. package/dist/logging/index.d.ts.map +1 -0
  42. package/dist/logging/index.js +31 -29
  43. package/dist/logging/index.js.map +1 -0
  44. package/dist/react/index.cjs +5 -7
  45. package/dist/react/index.d.cts +4 -0
  46. package/dist/react/index.d.ts +4 -3
  47. package/dist/react/index.js +4 -2
  48. package/dist/react/stream.cjs +14 -15
  49. package/dist/react/stream.cjs.map +1 -0
  50. package/dist/react/stream.custom.cjs +126 -145
  51. package/dist/react/stream.custom.cjs.map +1 -0
  52. package/dist/react/stream.custom.d.cts +39 -0
  53. package/dist/react/stream.custom.d.cts.map +1 -0
  54. package/dist/react/stream.custom.d.ts +35 -37
  55. package/dist/react/stream.custom.d.ts.map +1 -0
  56. package/dist/react/stream.custom.js +122 -137
  57. package/dist/react/stream.custom.js.map +1 -0
  58. package/dist/react/stream.d.cts +73 -0
  59. package/dist/react/stream.d.cts.map +1 -0
  60. package/dist/react/stream.d.ts +21 -15
  61. package/dist/react/stream.d.ts.map +1 -0
  62. package/dist/react/stream.js +12 -11
  63. package/dist/react/stream.js.map +1 -0
  64. package/dist/react/stream.lgp.cjs +438 -498
  65. package/dist/react/stream.lgp.cjs.map +1 -0
  66. package/dist/react/stream.lgp.js +433 -490
  67. package/dist/react/stream.lgp.js.map +1 -0
  68. package/dist/react/thread.cjs +18 -15
  69. package/dist/react/thread.cjs.map +1 -0
  70. package/dist/react/thread.js +19 -13
  71. package/dist/react/thread.js.map +1 -0
  72. package/dist/react/types.d.cts +356 -0
  73. package/dist/react/types.d.cts.map +1 -0
  74. package/dist/react/types.d.ts +334 -329
  75. package/dist/react/types.d.ts.map +1 -0
  76. package/dist/react-ui/client.cjs +123 -184
  77. package/dist/react-ui/client.cjs.map +1 -0
  78. package/dist/react-ui/client.d.cts +90 -0
  79. package/dist/react-ui/client.d.cts.map +1 -0
  80. package/dist/react-ui/client.d.ts +67 -51
  81. package/dist/react-ui/client.d.ts.map +1 -0
  82. package/dist/react-ui/client.js +118 -143
  83. package/dist/react-ui/client.js.map +1 -0
  84. package/dist/react-ui/index.cjs +14 -13
  85. package/dist/react-ui/index.cjs.map +1 -0
  86. package/dist/react-ui/index.d.cts +3 -0
  87. package/dist/react-ui/index.d.ts +3 -2
  88. package/dist/react-ui/index.js +8 -3
  89. package/dist/react-ui/index.js.map +1 -0
  90. package/dist/react-ui/server/index.cjs +5 -7
  91. package/dist/react-ui/server/index.d.cts +3 -0
  92. package/dist/react-ui/server/index.d.ts +3 -2
  93. package/dist/react-ui/server/index.js +4 -2
  94. package/dist/react-ui/server/server.cjs +53 -44
  95. package/dist/react-ui/server/server.cjs.map +1 -0
  96. package/dist/react-ui/server/server.d.cts +55 -0
  97. package/dist/react-ui/server/server.d.cts.map +1 -0
  98. package/dist/react-ui/server/server.d.ts +43 -39
  99. package/dist/react-ui/server/server.d.ts.map +1 -0
  100. package/dist/react-ui/server/server.js +54 -42
  101. package/dist/react-ui/server/server.js.map +1 -0
  102. package/dist/react-ui/types.cjs +32 -36
  103. package/dist/react-ui/types.cjs.map +1 -0
  104. package/dist/react-ui/types.d.cts +25 -0
  105. package/dist/react-ui/types.d.cts.map +1 -0
  106. package/dist/react-ui/types.d.ts +23 -19
  107. package/dist/react-ui/types.d.ts.map +1 -0
  108. package/dist/react-ui/types.js +32 -34
  109. package/dist/react-ui/types.js.map +1 -0
  110. package/dist/schema.d.cts +278 -0
  111. package/dist/schema.d.cts.map +1 -0
  112. package/dist/schema.d.ts +250 -242
  113. package/dist/schema.d.ts.map +1 -0
  114. package/dist/singletons/fetch.cjs +16 -20
  115. package/dist/singletons/fetch.cjs.map +1 -0
  116. package/dist/singletons/fetch.d.cts +14 -0
  117. package/dist/singletons/fetch.d.cts.map +1 -0
  118. package/dist/singletons/fetch.d.ts +5 -2
  119. package/dist/singletons/fetch.d.ts.map +1 -0
  120. package/dist/singletons/fetch.js +16 -17
  121. package/dist/singletons/fetch.js.map +1 -0
  122. package/dist/types.d.cts +187 -0
  123. package/dist/types.d.cts.map +1 -0
  124. package/dist/types.d.ts +178 -173
  125. package/dist/types.d.ts.map +1 -0
  126. package/dist/types.messages.d.cts +91 -0
  127. package/dist/types.messages.d.cts.map +1 -0
  128. package/dist/types.messages.d.ts +71 -66
  129. package/dist/types.messages.d.ts.map +1 -0
  130. package/dist/types.stream.d.cts +235 -0
  131. package/dist/types.stream.d.cts.map +1 -0
  132. package/dist/types.stream.d.ts +149 -142
  133. package/dist/types.stream.d.ts.map +1 -0
  134. package/dist/ui/branching.cjs +145 -141
  135. package/dist/ui/branching.cjs.map +1 -0
  136. package/dist/ui/branching.d.cts +22 -0
  137. package/dist/ui/branching.d.cts.map +1 -0
  138. package/dist/ui/branching.d.ts +17 -30
  139. package/dist/ui/branching.d.ts.map +1 -0
  140. package/dist/ui/branching.js +147 -139
  141. package/dist/ui/branching.js.map +1 -0
  142. package/dist/ui/errors.cjs +14 -12
  143. package/dist/ui/errors.cjs.map +1 -0
  144. package/dist/ui/errors.js +14 -9
  145. package/dist/ui/errors.js.map +1 -0
  146. package/dist/ui/manager.cjs +156 -232
  147. package/dist/ui/manager.cjs.map +1 -0
  148. package/dist/ui/manager.js +156 -228
  149. package/dist/ui/manager.js.map +1 -0
  150. package/dist/ui/messages.cjs +55 -69
  151. package/dist/ui/messages.cjs.map +1 -0
  152. package/dist/ui/messages.js +55 -66
  153. package/dist/ui/messages.js.map +1 -0
  154. package/dist/ui/utils.cjs +10 -10
  155. package/dist/ui/utils.cjs.map +1 -0
  156. package/dist/ui/utils.js +10 -8
  157. package/dist/ui/utils.js.map +1 -0
  158. package/dist/utils/async_caller.cjs +103 -185
  159. package/dist/utils/async_caller.cjs.map +1 -0
  160. package/dist/utils/async_caller.d.cts +53 -0
  161. package/dist/utils/async_caller.d.cts.map +1 -0
  162. package/dist/utils/async_caller.d.ts +36 -31
  163. package/dist/utils/async_caller.d.ts.map +1 -0
  164. package/dist/utils/async_caller.js +101 -177
  165. package/dist/utils/async_caller.js.map +1 -0
  166. package/dist/utils/env.cjs +11 -13
  167. package/dist/utils/env.cjs.map +1 -0
  168. package/dist/utils/env.js +11 -11
  169. package/dist/utils/env.js.map +1 -0
  170. package/dist/utils/signals.cjs +18 -19
  171. package/dist/utils/signals.cjs.map +1 -0
  172. package/dist/utils/signals.js +18 -17
  173. package/dist/utils/signals.js.map +1 -0
  174. package/dist/utils/sse.cjs +110 -140
  175. package/dist/utils/sse.cjs.map +1 -0
  176. package/dist/utils/sse.js +110 -138
  177. package/dist/utils/sse.js.map +1 -0
  178. package/dist/utils/stream.cjs +90 -114
  179. package/dist/utils/stream.cjs.map +1 -0
  180. package/dist/utils/stream.js +90 -111
  181. package/dist/utils/stream.js.map +1 -0
  182. package/package.json +73 -81
  183. package/auth.cjs +0 -1
  184. package/auth.d.cts +0 -1
  185. package/auth.d.ts +0 -1
  186. package/auth.js +0 -1
  187. package/client.cjs +0 -1
  188. package/client.d.cts +0 -1
  189. package/client.d.ts +0 -1
  190. package/client.js +0 -1
  191. package/dist/auth/types.cjs +0 -2
  192. package/dist/auth/types.js +0 -1
  193. package/dist/react/stream.lgp.d.ts +0 -7
  194. package/dist/react/thread.d.ts +0 -4
  195. package/dist/react/types.cjs +0 -2
  196. package/dist/react/types.js +0 -1
  197. package/dist/schema.cjs +0 -2
  198. package/dist/schema.js +0 -1
  199. package/dist/types.cjs +0 -2
  200. package/dist/types.js +0 -1
  201. package/dist/types.messages.cjs +0 -2
  202. package/dist/types.messages.js +0 -1
  203. package/dist/types.stream.cjs +0 -2
  204. package/dist/types.stream.js +0 -1
  205. package/dist/ui/branching.test.cjs +0 -370
  206. package/dist/ui/branching.test.d.ts +0 -1
  207. package/dist/ui/branching.test.js +0 -368
  208. package/dist/ui/errors.d.ts +0 -12
  209. package/dist/ui/manager.d.ts +0 -87
  210. package/dist/ui/messages.d.ts +0 -18
  211. package/dist/ui/utils.d.ts +0 -2
  212. package/dist/utils/env.d.ts +0 -1
  213. package/dist/utils/signals.d.ts +0 -1
  214. package/dist/utils/sse.d.ts +0 -8
  215. package/dist/utils/stream.d.ts +0 -13
  216. package/index.cjs +0 -1
  217. package/index.d.cts +0 -1
  218. package/index.d.ts +0 -1
  219. package/index.js +0 -1
  220. package/logging.cjs +0 -1
  221. package/logging.d.cts +0 -1
  222. package/logging.d.ts +0 -1
  223. package/logging.js +0 -1
  224. package/react-ui/server.cjs +0 -1
  225. package/react-ui/server.d.cts +0 -1
  226. package/react-ui/server.d.ts +0 -1
  227. package/react-ui/server.js +0 -1
  228. package/react-ui.cjs +0 -1
  229. package/react-ui.d.cts +0 -1
  230. package/react-ui.d.ts +0 -1
  231. package/react-ui.js +0 -1
  232. package/react.cjs +0 -1
  233. package/react.d.cts +0 -1
  234. package/react.d.ts +0 -1
  235. 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"}