@langchain/langgraph-sdk 1.4.4 → 1.4.6

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 (197) hide show
  1. package/README.md +2 -2
  2. package/dist/_virtual/rolldown_runtime.cjs +29 -0
  3. package/dist/auth/error.cjs +79 -0
  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 +13 -0
  8. package/dist/auth/error.d.ts.map +1 -0
  9. package/dist/auth/error.js +78 -0
  10. package/dist/auth/error.js.map +1 -0
  11. package/dist/auth/index.cjs +39 -0
  12. package/dist/auth/index.cjs.map +1 -0
  13. package/dist/auth/index.d.cts +29 -0
  14. package/dist/auth/index.d.cts.map +1 -0
  15. package/dist/auth/index.d.ts +29 -0
  16. package/dist/auth/index.d.ts.map +1 -0
  17. package/dist/auth/index.js +37 -0
  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 +294 -0
  22. package/dist/auth/types.d.ts.map +1 -0
  23. package/dist/client.cjs +1210 -0
  24. package/dist/client.cjs.map +1 -0
  25. package/dist/client.d.cts +799 -0
  26. package/dist/client.d.cts.map +1 -0
  27. package/dist/client.d.ts +799 -0
  28. package/dist/client.d.ts.map +1 -0
  29. package/dist/client.js +1203 -0
  30. package/dist/client.js.map +1 -0
  31. package/dist/index.cjs +6 -0
  32. package/dist/index.d.cts +8 -0
  33. package/dist/index.d.ts +8 -0
  34. package/dist/index.js +4 -0
  35. package/dist/logging/index.cjs +35 -0
  36. package/dist/logging/index.cjs.map +1 -0
  37. package/dist/logging/index.d.cts +46 -0
  38. package/dist/logging/index.d.cts.map +1 -0
  39. package/dist/logging/index.d.ts +46 -0
  40. package/dist/logging/index.d.ts.map +1 -0
  41. package/dist/logging/index.js +34 -0
  42. package/dist/logging/index.js.map +1 -0
  43. package/dist/react/index.cjs +5 -0
  44. package/dist/react/index.d.cts +5 -0
  45. package/dist/react/index.d.ts +5 -0
  46. package/dist/react/index.js +4 -0
  47. package/dist/react/stream.cjs +18 -0
  48. package/dist/react/stream.cjs.map +1 -0
  49. package/dist/react/stream.custom.cjs +135 -0
  50. package/dist/react/stream.custom.cjs.map +1 -0
  51. package/dist/react/stream.custom.d.cts +40 -0
  52. package/dist/react/stream.custom.d.cts.map +1 -0
  53. package/dist/react/stream.custom.d.ts +40 -0
  54. package/dist/react/stream.custom.d.ts.map +1 -0
  55. package/dist/react/stream.custom.js +133 -0
  56. package/dist/react/stream.custom.js.map +1 -0
  57. package/dist/react/stream.d.cts +155 -0
  58. package/dist/react/stream.d.cts.map +1 -0
  59. package/dist/react/stream.d.ts +155 -0
  60. package/dist/react/stream.d.ts.map +1 -0
  61. package/dist/react/stream.js +17 -0
  62. package/dist/react/stream.js.map +1 -0
  63. package/dist/react/stream.lgp.cjs +448 -0
  64. package/dist/react/stream.lgp.cjs.map +1 -0
  65. package/dist/react/stream.lgp.js +447 -0
  66. package/dist/react/stream.lgp.js.map +1 -0
  67. package/dist/react/thread.cjs +21 -0
  68. package/dist/react/thread.cjs.map +1 -0
  69. package/dist/react/thread.js +20 -0
  70. package/dist/react/thread.js.map +1 -0
  71. package/dist/react/types.d.cts +152 -0
  72. package/dist/react/types.d.cts.map +1 -0
  73. package/dist/react/types.d.ts +152 -0
  74. package/dist/react/types.d.ts.map +1 -0
  75. package/dist/react-ui/client.cjs +138 -0
  76. package/dist/react-ui/client.cjs.map +1 -0
  77. package/dist/react-ui/client.d.cts +73 -0
  78. package/dist/react-ui/client.d.cts.map +1 -0
  79. package/dist/react-ui/client.d.ts +73 -0
  80. package/dist/react-ui/client.d.ts.map +1 -0
  81. package/dist/react-ui/client.js +132 -0
  82. package/dist/react-ui/client.js.map +1 -0
  83. package/dist/react-ui/index.cjs +14 -0
  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 -0
  87. package/dist/react-ui/index.js +9 -0
  88. package/dist/react-ui/index.js.map +1 -0
  89. package/dist/react-ui/server/index.cjs +5 -0
  90. package/dist/react-ui/server/index.d.cts +3 -0
  91. package/dist/react-ui/server/index.d.ts +3 -0
  92. package/dist/react-ui/server/index.js +4 -0
  93. package/dist/react-ui/server/server.cjs +57 -0
  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 +55 -0
  98. package/dist/react-ui/server/server.d.ts.map +1 -0
  99. package/dist/react-ui/server/server.js +56 -0
  100. package/dist/react-ui/server/server.js.map +1 -0
  101. package/dist/react-ui/types.cjs +38 -0
  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 +25 -0
  106. package/dist/react-ui/types.d.ts.map +1 -0
  107. package/dist/react-ui/types.js +35 -0
  108. package/dist/react-ui/types.js.map +1 -0
  109. package/dist/schema.d.cts +284 -0
  110. package/dist/schema.d.cts.map +1 -0
  111. package/dist/schema.d.ts +284 -0
  112. package/dist/schema.d.ts.map +1 -0
  113. package/dist/singletons/fetch.cjs +24 -0
  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 +14 -0
  118. package/dist/singletons/fetch.d.ts.map +1 -0
  119. package/dist/singletons/fetch.js +22 -0
  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 +187 -0
  124. package/dist/types.d.ts.map +1 -0
  125. package/dist/types.messages.d.cts +264 -0
  126. package/dist/types.messages.d.cts.map +1 -0
  127. package/dist/types.messages.d.ts +264 -0
  128. package/dist/types.messages.d.ts.map +1 -0
  129. package/dist/types.stream.d.cts +233 -0
  130. package/dist/types.stream.d.cts.map +1 -0
  131. package/dist/types.stream.d.ts +233 -0
  132. package/dist/types.stream.d.ts.map +1 -0
  133. package/dist/types.template.d.cts +19 -0
  134. package/dist/types.template.d.cts.map +1 -0
  135. package/dist/types.template.d.ts +19 -0
  136. package/dist/types.template.d.ts.map +1 -0
  137. package/dist/ui/branching.cjs +153 -0
  138. package/dist/ui/branching.cjs.map +1 -0
  139. package/dist/ui/branching.d.cts +19 -0
  140. package/dist/ui/branching.d.cts.map +1 -0
  141. package/dist/ui/branching.d.ts +19 -0
  142. package/dist/ui/branching.d.ts.map +1 -0
  143. package/dist/ui/branching.js +152 -0
  144. package/dist/ui/branching.js.map +1 -0
  145. package/dist/ui/errors.cjs +15 -0
  146. package/dist/ui/errors.cjs.map +1 -0
  147. package/dist/ui/errors.js +14 -0
  148. package/dist/ui/errors.js.map +1 -0
  149. package/dist/ui/manager.cjs +188 -0
  150. package/dist/ui/manager.cjs.map +1 -0
  151. package/dist/ui/manager.js +188 -0
  152. package/dist/ui/manager.js.map +1 -0
  153. package/dist/ui/messages.cjs +70 -0
  154. package/dist/ui/messages.cjs.map +1 -0
  155. package/dist/ui/messages.js +68 -0
  156. package/dist/ui/messages.js.map +1 -0
  157. package/dist/ui/types.d.cts +420 -0
  158. package/dist/ui/types.d.cts.map +1 -0
  159. package/dist/ui/types.d.ts +420 -0
  160. package/dist/ui/types.d.ts.map +1 -0
  161. package/dist/ui/utils.cjs +13 -0
  162. package/dist/ui/utils.cjs.map +1 -0
  163. package/dist/ui/utils.js +11 -0
  164. package/dist/ui/utils.js.map +1 -0
  165. package/dist/utils/async_caller.cjs +119 -0
  166. package/dist/utils/async_caller.cjs.map +1 -0
  167. package/dist/utils/async_caller.d.cts +51 -0
  168. package/dist/utils/async_caller.d.cts.map +1 -0
  169. package/dist/utils/async_caller.d.ts +51 -0
  170. package/dist/utils/async_caller.d.ts.map +1 -0
  171. package/dist/utils/async_caller.js +116 -0
  172. package/dist/utils/async_caller.js.map +1 -0
  173. package/dist/utils/env.cjs +13 -0
  174. package/dist/utils/env.cjs.map +1 -0
  175. package/dist/utils/env.js +12 -0
  176. package/dist/utils/env.js.map +1 -0
  177. package/dist/utils/error.cjs +17 -0
  178. package/dist/utils/error.cjs.map +1 -0
  179. package/dist/utils/error.js +16 -0
  180. package/dist/utils/error.js.map +1 -0
  181. package/dist/utils/signals.cjs +20 -0
  182. package/dist/utils/signals.cjs.map +1 -0
  183. package/dist/utils/signals.js +19 -0
  184. package/dist/utils/signals.js.map +1 -0
  185. package/dist/utils/sse.cjs +124 -0
  186. package/dist/utils/sse.cjs.map +1 -0
  187. package/dist/utils/sse.js +122 -0
  188. package/dist/utils/sse.js.map +1 -0
  189. package/dist/utils/stream.cjs +174 -0
  190. package/dist/utils/stream.cjs.map +1 -0
  191. package/dist/utils/stream.js +173 -0
  192. package/dist/utils/stream.js.map +1 -0
  193. package/dist/utils/tools.cjs +52 -0
  194. package/dist/utils/tools.cjs.map +1 -0
  195. package/dist/utils/tools.js +51 -0
  196. package/dist/utils/tools.js.map +1 -0
  197. package/package.json +15 -15
@@ -0,0 +1,152 @@
1
+ //#region src/ui/branching.ts
2
+ function getBranchSequence(history) {
3
+ const nodeIds = /* @__PURE__ */ new Set();
4
+ const childrenMap = {};
5
+ if (history.length <= 1) return {
6
+ rootSequence: {
7
+ type: "sequence",
8
+ items: history.map((value) => ({
9
+ type: "node",
10
+ value,
11
+ path: []
12
+ }))
13
+ },
14
+ paths: []
15
+ };
16
+ history.forEach((state) => {
17
+ const checkpointId = state.parent_checkpoint?.checkpoint_id ?? "$";
18
+ childrenMap[checkpointId] ??= [];
19
+ childrenMap[checkpointId].push(state);
20
+ if (state.checkpoint?.checkpoint_id != null) nodeIds.add(state.checkpoint.checkpoint_id);
21
+ });
22
+ const maxId = (...ids) => ids.filter((i) => i != null).sort((a, b) => a.localeCompare(b)).at(-1);
23
+ const lastOrphanedNode = childrenMap.$ == null ? Object.keys(childrenMap).filter((parentId) => !nodeIds.has(parentId)).map((parentId) => {
24
+ const queue$1 = [parentId];
25
+ const seen = /* @__PURE__ */ new Set();
26
+ let lastId = parentId;
27
+ while (queue$1.length > 0) {
28
+ const current = queue$1.shift();
29
+ if (seen.has(current)) continue;
30
+ seen.add(current);
31
+ const children = (childrenMap[current] ?? []).flatMap((i) => i.checkpoint?.checkpoint_id ?? []);
32
+ lastId = maxId(lastId, ...children);
33
+ queue$1.push(...children);
34
+ }
35
+ return {
36
+ parentId,
37
+ lastId
38
+ };
39
+ }).sort((a, b) => a.lastId.localeCompare(b.lastId)).at(-1)?.parentId : void 0;
40
+ if (lastOrphanedNode != null) childrenMap.$ = childrenMap[lastOrphanedNode];
41
+ const rootSequence = {
42
+ type: "sequence",
43
+ items: []
44
+ };
45
+ const queue = [{
46
+ id: "$",
47
+ sequence: rootSequence,
48
+ path: []
49
+ }];
50
+ const paths = [];
51
+ const visited = /* @__PURE__ */ new Set();
52
+ while (queue.length > 0) {
53
+ const task = queue.shift();
54
+ if (visited.has(task.id)) continue;
55
+ visited.add(task.id);
56
+ const children = childrenMap[task.id];
57
+ if (children == null || children.length === 0) continue;
58
+ let fork;
59
+ if (children.length > 1) {
60
+ fork = {
61
+ type: "fork",
62
+ items: []
63
+ };
64
+ task.sequence.items.push(fork);
65
+ }
66
+ for (const value of children) {
67
+ const id = value.checkpoint?.checkpoint_id;
68
+ if (id == null) continue;
69
+ let { sequence } = task;
70
+ let { path } = task;
71
+ if (fork != null) {
72
+ sequence = {
73
+ type: "sequence",
74
+ items: []
75
+ };
76
+ fork.items.unshift(sequence);
77
+ path = path.slice();
78
+ path.push(id);
79
+ paths.push(path);
80
+ }
81
+ sequence.items.push({
82
+ type: "node",
83
+ value,
84
+ path
85
+ });
86
+ queue.push({
87
+ id,
88
+ sequence,
89
+ path
90
+ });
91
+ }
92
+ }
93
+ return {
94
+ rootSequence,
95
+ paths
96
+ };
97
+ }
98
+ const PATH_SEP = ">";
99
+ const ROOT_ID = "$";
100
+ function getBranchView(sequence, paths, branch) {
101
+ const path = branch.split(PATH_SEP);
102
+ const pathMap = {};
103
+ for (const path$1 of paths) {
104
+ const parent = path$1.at(-2) ?? ROOT_ID;
105
+ pathMap[parent] ??= [];
106
+ pathMap[parent].unshift(path$1);
107
+ }
108
+ const history = [];
109
+ const branchByCheckpoint = {};
110
+ const forkStack = path.slice();
111
+ const queue = [...sequence.items];
112
+ while (queue.length > 0) {
113
+ const item = queue.shift();
114
+ if (item.type === "node") {
115
+ history.push(item.value);
116
+ const checkpointId = item.value.checkpoint?.checkpoint_id;
117
+ if (checkpointId == null) continue;
118
+ branchByCheckpoint[checkpointId] = {
119
+ branch: item.path.join(PATH_SEP),
120
+ branchOptions: (item.path.length > 0 ? pathMap[item.path.at(-2) ?? ROOT_ID] ?? [] : []).map((p) => p.join(PATH_SEP))
121
+ };
122
+ }
123
+ if (item.type === "fork") {
124
+ const forkId = forkStack.shift();
125
+ const index = forkId != null ? item.items.findIndex((value) => {
126
+ const firstItem = value.items.at(0);
127
+ if (!firstItem || firstItem.type !== "node") return false;
128
+ return firstItem.value.checkpoint?.checkpoint_id === forkId;
129
+ }) : -1;
130
+ const nextItems = item.items.at(index)?.items ?? [];
131
+ queue.push(...nextItems);
132
+ }
133
+ }
134
+ return {
135
+ history,
136
+ branchByCheckpoint
137
+ };
138
+ }
139
+ function getBranchContext(branch, history) {
140
+ const { rootSequence: branchTree, paths } = getBranchSequence(history ?? []);
141
+ const { history: flatHistory, branchByCheckpoint } = getBranchView(branchTree, paths, branch);
142
+ return {
143
+ branchTree,
144
+ flatHistory,
145
+ branchByCheckpoint,
146
+ threadHead: flatHistory.at(-1)
147
+ };
148
+ }
149
+
150
+ //#endregion
151
+ export { getBranchContext };
152
+ //# sourceMappingURL=branching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branching.js","names":["queue","path"],"sources":["../../src/ui/branching.ts"],"sourcesContent":["import type { ThreadState } from \"../schema.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ninterface Node<StateType = any> {\n type: \"node\";\n value: ThreadState<StateType>;\n path: string[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ninterface Fork<StateType = any> {\n type: \"fork\";\n items: Array<Sequence<StateType>>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface Sequence<StateType = any> {\n type: \"sequence\";\n items: Array<Node<StateType> | Fork<StateType>>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ninterface ValidFork<StateType = any> {\n type: \"fork\";\n items: Array<ValidSequence<StateType>>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ninterface ValidSequence<StateType = any> {\n type: \"sequence\";\n items: [Node<StateType>, ...(Node<StateType> | ValidFork<StateType>)[]];\n}\n\nexport function getBranchSequence<StateType extends Record<string, unknown>>(\n history: ThreadState<StateType>[]\n) {\n const nodeIds = new Set<string>();\n const childrenMap: Record<string, ThreadState<StateType>[]> = {};\n\n // Short circuit if there's only a singular one state\n if (history.length <= 1) {\n return {\n rootSequence: {\n type: \"sequence\",\n items: history.map((value) => ({ type: \"node\", value, path: [] })),\n } satisfies Sequence<StateType>,\n paths: [],\n };\n }\n\n // First pass - collect nodes for each checkpoint\n history.forEach((state) => {\n const checkpointId = state.parent_checkpoint?.checkpoint_id ?? \"$\";\n childrenMap[checkpointId] ??= [];\n childrenMap[checkpointId].push(state);\n\n if (state.checkpoint?.checkpoint_id != null) {\n nodeIds.add(state.checkpoint.checkpoint_id);\n }\n });\n\n // If dealing with partial history, take the branch\n // with the latest checkpoint and mark it as the root.\n const maxId = (...ids: (string | null)[]) =>\n ids\n .filter((i): i is string => i != null)\n .sort((a, b) => a.localeCompare(b))\n .at(-1)!;\n\n const lastOrphanedNode =\n childrenMap.$ == null\n ? Object.keys(childrenMap)\n .filter((parentId) => !nodeIds.has(parentId))\n .map((parentId) => {\n const queue: string[] = [parentId];\n const seen = new Set<string>();\n\n let lastId = parentId;\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n if (seen.has(current)) continue;\n seen.add(current);\n\n const children = (childrenMap[current] ?? []).flatMap(\n (i) => i.checkpoint?.checkpoint_id ?? []\n );\n\n lastId = maxId(lastId, ...children);\n queue.push(...children);\n }\n\n return { parentId, lastId };\n })\n .sort((a, b) => a.lastId.localeCompare(b.lastId))\n .at(-1)?.parentId\n : undefined;\n\n if (lastOrphanedNode != null) childrenMap.$ = childrenMap[lastOrphanedNode];\n\n // Second pass - create a tree of sequences\n type Task = { id: string; sequence: Sequence; path: string[] };\n const rootSequence: Sequence = { type: \"sequence\", items: [] };\n const queue: Task[] = [{ id: \"$\", sequence: rootSequence, path: [] }];\n\n const paths: string[][] = [];\n\n const visited = new Set<string>();\n while (queue.length > 0) {\n const task = queue.shift()!;\n if (visited.has(task.id)) continue;\n visited.add(task.id);\n\n const children = childrenMap[task.id];\n if (children == null || children.length === 0) continue;\n\n // If we've encountered a fork (2+ children), push the fork\n // to the sequence and add a new sequence for each child\n let fork: Fork | undefined;\n if (children.length > 1) {\n fork = { type: \"fork\", items: [] };\n task.sequence.items.push(fork);\n }\n\n for (const value of children) {\n const id = value.checkpoint?.checkpoint_id;\n if (id == null) continue;\n\n let { sequence } = task;\n let { path } = task;\n if (fork != null) {\n sequence = { type: \"sequence\", items: [] };\n fork.items.unshift(sequence);\n\n path = path.slice();\n path.push(id);\n paths.push(path);\n }\n\n sequence.items.push({ type: \"node\", value, path });\n queue.push({ id, sequence, path });\n }\n }\n\n return { rootSequence, paths };\n}\n\nconst PATH_SEP = \">\";\nconst ROOT_ID = \"$\";\n\n// Get flat view\nexport function getBranchView<StateType extends Record<string, unknown>>(\n sequence: Sequence<StateType>,\n paths: string[][],\n branch: string\n) {\n const path = branch.split(PATH_SEP);\n const pathMap: Record<string, string[][]> = {};\n\n for (const path of paths) {\n const parent = path.at(-2) ?? ROOT_ID;\n pathMap[parent] ??= [];\n pathMap[parent].unshift(path);\n }\n\n const history: ThreadState<StateType>[] = [];\n const branchByCheckpoint: Record<\n string,\n { branch: string | undefined; branchOptions: string[] | undefined }\n > = {};\n\n const forkStack = path.slice();\n const queue: (Node<StateType> | Fork<StateType>)[] = [...sequence.items];\n\n while (queue.length > 0) {\n const item = queue.shift()!;\n\n if (item.type === \"node\") {\n history.push(item.value);\n const checkpointId = item.value.checkpoint?.checkpoint_id;\n if (checkpointId == null) continue;\n\n branchByCheckpoint[checkpointId] = {\n branch: item.path.join(PATH_SEP),\n branchOptions: (item.path.length > 0\n ? pathMap[item.path.at(-2) ?? ROOT_ID] ?? []\n : []\n ).map((p) => p.join(PATH_SEP)),\n };\n }\n if (item.type === \"fork\") {\n const forkId = forkStack.shift();\n const index =\n forkId != null\n ? item.items.findIndex((value) => {\n const firstItem = value.items.at(0);\n if (!firstItem || firstItem.type !== \"node\") return false;\n return firstItem.value.checkpoint?.checkpoint_id === forkId;\n })\n : -1;\n\n const nextItems = item.items.at(index)?.items ?? [];\n queue.push(...nextItems);\n }\n }\n\n return { history, branchByCheckpoint };\n}\n\nexport function getBranchContext<StateType extends Record<string, unknown>>(\n branch: string,\n history: ThreadState<StateType>[] | undefined\n) {\n const { rootSequence: branchTree, paths } = getBranchSequence(history ?? []);\n const { history: flatHistory, branchByCheckpoint } = getBranchView(\n branchTree,\n paths,\n branch\n );\n\n return {\n branchTree,\n flatHistory,\n branchByCheckpoint,\n threadHead: flatHistory.at(-1),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+
2
+ //#region src/ui/errors.ts
3
+ var StreamError = class extends Error {
4
+ constructor(data) {
5
+ super(data.message);
6
+ this.name = data.name ?? data.error ?? "StreamError";
7
+ }
8
+ static isStructuredError(error) {
9
+ return typeof error === "object" && error != null && "message" in error;
10
+ }
11
+ };
12
+
13
+ //#endregion
14
+ exports.StreamError = StreamError;
15
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../../src/ui/errors.ts"],"sourcesContent":["export class StreamError extends Error {\n constructor(data: { error?: string; name?: string; message: string }) {\n super(data.message);\n this.name = data.name ?? data.error ?? \"StreamError\";\n }\n\n static isStructuredError(error: unknown): error is {\n error?: string;\n name?: string;\n message: string;\n } {\n return typeof error === \"object\" && error != null && \"message\" in error;\n }\n}\n"],"mappings":";;AAAA,IAAa,cAAb,cAAiC,MAAM;CACrC,YAAY,MAA0D;AACpE,QAAM,KAAK,QAAQ;AACnB,OAAK,OAAO,KAAK,QAAQ,KAAK,SAAS;;CAGzC,OAAO,kBAAkB,OAIvB;AACA,SAAO,OAAO,UAAU,YAAY,SAAS,QAAQ,aAAa"}
@@ -0,0 +1,14 @@
1
+ //#region src/ui/errors.ts
2
+ var StreamError = class extends Error {
3
+ constructor(data) {
4
+ super(data.message);
5
+ this.name = data.name ?? data.error ?? "StreamError";
6
+ }
7
+ static isStructuredError(error) {
8
+ return typeof error === "object" && error != null && "message" in error;
9
+ }
10
+ };
11
+
12
+ //#endregion
13
+ export { StreamError };
14
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../../src/ui/errors.ts"],"sourcesContent":["export class StreamError extends Error {\n constructor(data: { error?: string; name?: string; message: string }) {\n super(data.message);\n this.name = data.name ?? data.error ?? \"StreamError\";\n }\n\n static isStructuredError(error: unknown): error is {\n error?: string;\n name?: string;\n message: string;\n } {\n return typeof error === \"object\" && error != null && \"message\" in error;\n }\n}\n"],"mappings":";AAAA,IAAa,cAAb,cAAiC,MAAM;CACrC,YAAY,MAA0D;AACpE,QAAM,KAAK,QAAQ;AACnB,OAAK,OAAO,KAAK,QAAQ,KAAK,SAAS;;CAGzC,OAAO,kBAAkB,OAIvB;AACA,SAAO,OAAO,UAAU,YAAY,SAAS,QAAQ,aAAa"}
@@ -0,0 +1,188 @@
1
+ const require_errors = require('./errors.cjs');
2
+ const require_messages = require('./messages.cjs');
3
+
4
+ //#region src/ui/manager.ts
5
+ /**
6
+ * Special ID used by LangGraph's messagesStateReducer to signal
7
+ * that all messages should be removed from the state.
8
+ */
9
+ const REMOVE_ALL_MESSAGES = "__remove_all__";
10
+ var StreamManager = class {
11
+ abortRef = new AbortController();
12
+ messages;
13
+ listeners = /* @__PURE__ */ new Set();
14
+ throttle;
15
+ queue = Promise.resolve();
16
+ queueSize = 0;
17
+ state;
18
+ constructor(messages, options) {
19
+ this.messages = messages;
20
+ this.state = {
21
+ isLoading: false,
22
+ values: null,
23
+ error: void 0
24
+ };
25
+ this.throttle = options.throttle;
26
+ }
27
+ setState = (newState) => {
28
+ this.state = {
29
+ ...this.state,
30
+ ...newState
31
+ };
32
+ this.notifyListeners();
33
+ };
34
+ notifyListeners = () => {
35
+ this.listeners.forEach((listener) => listener());
36
+ };
37
+ subscribe = (listener) => {
38
+ if (this.throttle === false) {
39
+ this.listeners.add(listener);
40
+ return () => this.listeners.delete(listener);
41
+ }
42
+ const timeoutMs = this.throttle === true ? 0 : this.throttle;
43
+ let timeoutId;
44
+ const throttledListener = () => {
45
+ clearTimeout(timeoutId);
46
+ timeoutId = setTimeout(() => {
47
+ clearTimeout(timeoutId);
48
+ listener();
49
+ }, timeoutMs);
50
+ };
51
+ this.listeners.add(throttledListener);
52
+ return () => {
53
+ clearTimeout(timeoutId);
54
+ this.listeners.delete(throttledListener);
55
+ };
56
+ };
57
+ getSnapshot = () => this.state;
58
+ get isLoading() {
59
+ return this.state.isLoading;
60
+ }
61
+ get values() {
62
+ return this.state.values?.[0] ?? null;
63
+ }
64
+ get error() {
65
+ return this.state.error;
66
+ }
67
+ setStreamValues = (values, kind = "stream") => {
68
+ if (typeof values === "function") {
69
+ const [prevValues, prevKind] = this.state.values ?? [null, "stream"];
70
+ const nextValues = values(prevValues, prevKind);
71
+ this.setState({ values: nextValues != null ? [nextValues, kind] : null });
72
+ } else {
73
+ const nextValues = values != null ? [values, kind] : null;
74
+ this.setState({ values: nextValues });
75
+ }
76
+ };
77
+ getMutateFn = (kind, historyValues) => {
78
+ return (update) => {
79
+ const prev = {
80
+ ...historyValues,
81
+ ...(this.state.values ?? [null, "stream"])[0]
82
+ };
83
+ const next = typeof update === "function" ? update(prev) : update;
84
+ this.setStreamValues({
85
+ ...prev,
86
+ ...next
87
+ }, kind);
88
+ };
89
+ };
90
+ matchEventType = (expected, actual, _data) => {
91
+ return expected === actual || actual.startsWith(`${expected}|`);
92
+ };
93
+ enqueue = async (action, options) => {
94
+ try {
95
+ this.queueSize = Math.max(0, this.queueSize - 1);
96
+ this.setState({
97
+ isLoading: true,
98
+ error: void 0
99
+ });
100
+ this.abortRef = new AbortController();
101
+ const run = await action(this.abortRef.signal);
102
+ let streamError;
103
+ for await (const { event, data } of run) {
104
+ if (event === "error") {
105
+ streamError = new require_errors.StreamError(data);
106
+ break;
107
+ }
108
+ const namespace = event.includes("|") ? event.split("|").slice(1) : void 0;
109
+ const mutate = this.getMutateFn("stream", options.initialValues);
110
+ if (event === "metadata") options.callbacks.onMetadataEvent?.(data);
111
+ if (event === "events") options.callbacks.onLangChainEvent?.(data);
112
+ if (this.matchEventType("updates", event, data)) options.callbacks.onUpdateEvent?.(data, {
113
+ namespace,
114
+ mutate
115
+ });
116
+ if (this.matchEventType("custom", event, data)) options.callbacks.onCustomEvent?.(data, {
117
+ namespace,
118
+ mutate
119
+ });
120
+ if (this.matchEventType("checkpoints", event, data)) options.callbacks.onCheckpointEvent?.(data, { namespace });
121
+ if (this.matchEventType("tasks", event, data)) options.callbacks.onTaskEvent?.(data, { namespace });
122
+ if (this.matchEventType("debug", event, data)) options.callbacks.onDebugEvent?.(data, { namespace });
123
+ if (event === "values") if ("__interrupt__" in data) this.setStreamValues((prev) => ({
124
+ ...prev,
125
+ ...data
126
+ }));
127
+ else this.setStreamValues(data);
128
+ if (this.matchEventType("messages", event, data)) {
129
+ const [serialized, metadata] = data;
130
+ const messageId = this.messages.add(serialized, metadata);
131
+ if (!messageId) {
132
+ console.warn("Failed to add message to manager, no message ID found");
133
+ continue;
134
+ }
135
+ this.setStreamValues((streamValues) => {
136
+ const values$1 = {
137
+ ...options.initialValues,
138
+ ...streamValues
139
+ };
140
+ let messages = options.getMessages(values$1).slice();
141
+ const { chunk, index } = this.messages.get(messageId, messages.length) ?? {};
142
+ if (!chunk || index == null) return values$1;
143
+ if (chunk.getType() === "remove") if (chunk.id === REMOVE_ALL_MESSAGES) messages = [];
144
+ else messages.splice(index, 1);
145
+ else messages[index] = require_messages.toMessageDict(chunk);
146
+ return options.setMessages(values$1, messages);
147
+ });
148
+ }
149
+ }
150
+ if (streamError != null) throw streamError;
151
+ const values = await options.onSuccess?.();
152
+ if (typeof values !== "undefined" && this.queueSize === 0) this.setStreamValues(values);
153
+ } catch (error) {
154
+ if (!(error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError"))) {
155
+ console.error(error);
156
+ this.setState({ error });
157
+ await options.onError?.(error);
158
+ }
159
+ } finally {
160
+ this.setState({ isLoading: false });
161
+ this.abortRef = new AbortController();
162
+ options.onFinish?.();
163
+ }
164
+ };
165
+ start = async (action, options) => {
166
+ this.queueSize += 1;
167
+ this.queue = this.queue.then(() => this.enqueue(action, options));
168
+ };
169
+ stop = async (historyValues, options) => {
170
+ this.abortRef.abort();
171
+ this.abortRef = new AbortController();
172
+ options.onStop?.({ mutate: this.getMutateFn("stop", historyValues) });
173
+ };
174
+ clear = () => {
175
+ this.abortRef.abort();
176
+ this.abortRef = new AbortController();
177
+ this.setState({
178
+ error: void 0,
179
+ values: null,
180
+ isLoading: false
181
+ });
182
+ this.messages.clear();
183
+ };
184
+ };
185
+
186
+ //#endregion
187
+ exports.StreamManager = StreamManager;
188
+ //# sourceMappingURL=manager.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.cjs","names":["StreamError","values","toMessageDict"],"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\";\nimport type { BagTemplate } from \"../types.template.js\";\n\n/**\n * Special ID used by LangGraph's messagesStateReducer to signal\n * that all messages should be removed from the state.\n */\nexport const REMOVE_ALL_MESSAGES = \"__remove_all__\";\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 throttle: number | boolean;\n\n private queue: Promise<unknown> = Promise.resolve();\n\n private queueSize: number = 0;\n\n private state: {\n isLoading: boolean;\n values: [values: StateType, kind: \"stream\" | \"stop\"] | null;\n error: unknown;\n };\n\n constructor(\n messages: MessageTupleManager,\n options: { throttle: number | boolean }\n ) {\n this.messages = messages;\n this.state = { isLoading: false, values: null, error: undefined };\n this.throttle = options.throttle;\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 if (this.throttle === false) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n const timeoutMs = this.throttle === true ? 0 : this.throttle;\n let timeoutId: NodeJS.Timeout | number | undefined;\n\n const throttledListener = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n clearTimeout(timeoutId);\n listener();\n }, timeoutMs);\n };\n\n this.listeners.add(throttledListener);\n return () => {\n clearTimeout(timeoutId);\n this.listeners.delete(throttledListener);\n };\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 protected enqueue = 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 ) => {\n try {\n this.queueSize = Math.max(0, this.queueSize - 1);\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 let 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 // Check for special REMOVE_ALL_MESSAGES sentinel\n if (chunk.id === REMOVE_ALL_MESSAGES) {\n // Clear all messages when __remove_all__ is received\n messages = [];\n } else {\n messages.splice(index, 1);\n }\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.queueSize === 0) {\n this.setStreamValues(values);\n }\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 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 this.queueSize += 1;\n this.queue = this.queue.then(() => this.enqueue(action, options));\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, isLoading: false });\n\n // Clear any pending messages\n this.messages.clear();\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ import { StreamError } from "./errors.js";
2
+ import { toMessageDict } from "./messages.js";
3
+
4
+ //#region src/ui/manager.ts
5
+ /**
6
+ * Special ID used by LangGraph's messagesStateReducer to signal
7
+ * that all messages should be removed from the state.
8
+ */
9
+ const REMOVE_ALL_MESSAGES = "__remove_all__";
10
+ var StreamManager = class {
11
+ abortRef = new AbortController();
12
+ messages;
13
+ listeners = /* @__PURE__ */ new Set();
14
+ throttle;
15
+ queue = Promise.resolve();
16
+ queueSize = 0;
17
+ state;
18
+ constructor(messages, options) {
19
+ this.messages = messages;
20
+ this.state = {
21
+ isLoading: false,
22
+ values: null,
23
+ error: void 0
24
+ };
25
+ this.throttle = options.throttle;
26
+ }
27
+ setState = (newState) => {
28
+ this.state = {
29
+ ...this.state,
30
+ ...newState
31
+ };
32
+ this.notifyListeners();
33
+ };
34
+ notifyListeners = () => {
35
+ this.listeners.forEach((listener) => listener());
36
+ };
37
+ subscribe = (listener) => {
38
+ if (this.throttle === false) {
39
+ this.listeners.add(listener);
40
+ return () => this.listeners.delete(listener);
41
+ }
42
+ const timeoutMs = this.throttle === true ? 0 : this.throttle;
43
+ let timeoutId;
44
+ const throttledListener = () => {
45
+ clearTimeout(timeoutId);
46
+ timeoutId = setTimeout(() => {
47
+ clearTimeout(timeoutId);
48
+ listener();
49
+ }, timeoutMs);
50
+ };
51
+ this.listeners.add(throttledListener);
52
+ return () => {
53
+ clearTimeout(timeoutId);
54
+ this.listeners.delete(throttledListener);
55
+ };
56
+ };
57
+ getSnapshot = () => this.state;
58
+ get isLoading() {
59
+ return this.state.isLoading;
60
+ }
61
+ get values() {
62
+ return this.state.values?.[0] ?? null;
63
+ }
64
+ get error() {
65
+ return this.state.error;
66
+ }
67
+ setStreamValues = (values, kind = "stream") => {
68
+ if (typeof values === "function") {
69
+ const [prevValues, prevKind] = this.state.values ?? [null, "stream"];
70
+ const nextValues = values(prevValues, prevKind);
71
+ this.setState({ values: nextValues != null ? [nextValues, kind] : null });
72
+ } else {
73
+ const nextValues = values != null ? [values, kind] : null;
74
+ this.setState({ values: nextValues });
75
+ }
76
+ };
77
+ getMutateFn = (kind, historyValues) => {
78
+ return (update) => {
79
+ const prev = {
80
+ ...historyValues,
81
+ ...(this.state.values ?? [null, "stream"])[0]
82
+ };
83
+ const next = typeof update === "function" ? update(prev) : update;
84
+ this.setStreamValues({
85
+ ...prev,
86
+ ...next
87
+ }, kind);
88
+ };
89
+ };
90
+ matchEventType = (expected, actual, _data) => {
91
+ return expected === actual || actual.startsWith(`${expected}|`);
92
+ };
93
+ enqueue = async (action, options) => {
94
+ try {
95
+ this.queueSize = Math.max(0, this.queueSize - 1);
96
+ this.setState({
97
+ isLoading: true,
98
+ error: void 0
99
+ });
100
+ this.abortRef = new AbortController();
101
+ const run = await action(this.abortRef.signal);
102
+ let streamError;
103
+ for await (const { event, data } of run) {
104
+ if (event === "error") {
105
+ streamError = new StreamError(data);
106
+ break;
107
+ }
108
+ const namespace = event.includes("|") ? event.split("|").slice(1) : void 0;
109
+ const mutate = this.getMutateFn("stream", options.initialValues);
110
+ if (event === "metadata") options.callbacks.onMetadataEvent?.(data);
111
+ if (event === "events") options.callbacks.onLangChainEvent?.(data);
112
+ if (this.matchEventType("updates", event, data)) options.callbacks.onUpdateEvent?.(data, {
113
+ namespace,
114
+ mutate
115
+ });
116
+ if (this.matchEventType("custom", event, data)) options.callbacks.onCustomEvent?.(data, {
117
+ namespace,
118
+ mutate
119
+ });
120
+ if (this.matchEventType("checkpoints", event, data)) options.callbacks.onCheckpointEvent?.(data, { namespace });
121
+ if (this.matchEventType("tasks", event, data)) options.callbacks.onTaskEvent?.(data, { namespace });
122
+ if (this.matchEventType("debug", event, data)) options.callbacks.onDebugEvent?.(data, { namespace });
123
+ if (event === "values") if ("__interrupt__" in data) this.setStreamValues((prev) => ({
124
+ ...prev,
125
+ ...data
126
+ }));
127
+ else this.setStreamValues(data);
128
+ if (this.matchEventType("messages", event, data)) {
129
+ const [serialized, metadata] = data;
130
+ const messageId = this.messages.add(serialized, metadata);
131
+ if (!messageId) {
132
+ console.warn("Failed to add message to manager, no message ID found");
133
+ continue;
134
+ }
135
+ this.setStreamValues((streamValues) => {
136
+ const values$1 = {
137
+ ...options.initialValues,
138
+ ...streamValues
139
+ };
140
+ let messages = options.getMessages(values$1).slice();
141
+ const { chunk, index } = this.messages.get(messageId, messages.length) ?? {};
142
+ if (!chunk || index == null) return values$1;
143
+ if (chunk.getType() === "remove") if (chunk.id === REMOVE_ALL_MESSAGES) messages = [];
144
+ else messages.splice(index, 1);
145
+ else messages[index] = toMessageDict(chunk);
146
+ return options.setMessages(values$1, messages);
147
+ });
148
+ }
149
+ }
150
+ if (streamError != null) throw streamError;
151
+ const values = await options.onSuccess?.();
152
+ if (typeof values !== "undefined" && this.queueSize === 0) this.setStreamValues(values);
153
+ } catch (error) {
154
+ if (!(error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError"))) {
155
+ console.error(error);
156
+ this.setState({ error });
157
+ await options.onError?.(error);
158
+ }
159
+ } finally {
160
+ this.setState({ isLoading: false });
161
+ this.abortRef = new AbortController();
162
+ options.onFinish?.();
163
+ }
164
+ };
165
+ start = async (action, options) => {
166
+ this.queueSize += 1;
167
+ this.queue = this.queue.then(() => this.enqueue(action, options));
168
+ };
169
+ stop = async (historyValues, options) => {
170
+ this.abortRef.abort();
171
+ this.abortRef = new AbortController();
172
+ options.onStop?.({ mutate: this.getMutateFn("stop", historyValues) });
173
+ };
174
+ clear = () => {
175
+ this.abortRef.abort();
176
+ this.abortRef = new AbortController();
177
+ this.setState({
178
+ error: void 0,
179
+ values: null,
180
+ isLoading: false
181
+ });
182
+ this.messages.clear();
183
+ };
184
+ };
185
+
186
+ //#endregion
187
+ export { StreamManager };
188
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","names":["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\";\nimport type { BagTemplate } from \"../types.template.js\";\n\n/**\n * Special ID used by LangGraph's messagesStateReducer to signal\n * that all messages should be removed from the state.\n */\nexport const REMOVE_ALL_MESSAGES = \"__remove_all__\";\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 throttle: number | boolean;\n\n private queue: Promise<unknown> = Promise.resolve();\n\n private queueSize: number = 0;\n\n private state: {\n isLoading: boolean;\n values: [values: StateType, kind: \"stream\" | \"stop\"] | null;\n error: unknown;\n };\n\n constructor(\n messages: MessageTupleManager,\n options: { throttle: number | boolean }\n ) {\n this.messages = messages;\n this.state = { isLoading: false, values: null, error: undefined };\n this.throttle = options.throttle;\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 if (this.throttle === false) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n const timeoutMs = this.throttle === true ? 0 : this.throttle;\n let timeoutId: NodeJS.Timeout | number | undefined;\n\n const throttledListener = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n clearTimeout(timeoutId);\n listener();\n }, timeoutMs);\n };\n\n this.listeners.add(throttledListener);\n return () => {\n clearTimeout(timeoutId);\n this.listeners.delete(throttledListener);\n };\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 protected enqueue = 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 ) => {\n try {\n this.queueSize = Math.max(0, this.queueSize - 1);\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 let 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 // Check for special REMOVE_ALL_MESSAGES sentinel\n if (chunk.id === REMOVE_ALL_MESSAGES) {\n // Clear all messages when __remove_all__ is received\n messages = [];\n } else {\n messages.splice(index, 1);\n }\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.queueSize === 0) {\n this.setStreamValues(values);\n }\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 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 this.queueSize += 1;\n this.queue = this.queue.then(() => this.enqueue(action, options));\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, isLoading: false });\n\n // Clear any pending messages\n this.messages.clear();\n };\n}\n"],"mappings":";;;;;;;;AAsBA,MAAa,sBAAsB;AA0EnC,IAAa,gBAAb,MAGE;CACA,AAAQ,WAAW,IAAI,iBAAiB;CAExC,AAAQ;CAER,AAAQ,4BAAY,IAAI,KAAiB;CAEzC,AAAQ;CAER,AAAQ,QAA0B,QAAQ,SAAS;CAEnD,AAAQ,YAAoB;CAE5B,AAAQ;CAMR,YACE,UACA,SACA;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;GAAE,WAAW;GAAO,QAAQ;GAAM,OAAO;GAAW;AACjE,OAAK,WAAW,QAAQ;;CAG1B,AAAQ,YAAY,aAAyC;AAC3D,OAAK,QAAQ;GAAE,GAAG,KAAK;GAAO,GAAG;GAAU;AAC3C,OAAK,iBAAiB;;CAGxB,AAAQ,wBAAwB;AAC9B,OAAK,UAAU,SAAS,aAAa,UAAU,CAAC;;CAGlD,aAAa,aAAuC;AAClD,MAAI,KAAK,aAAa,OAAO;AAC3B,QAAK,UAAU,IAAI,SAAS;AAC5B,gBAAa,KAAK,UAAU,OAAO,SAAS;;EAG9C,MAAM,YAAY,KAAK,aAAa,OAAO,IAAI,KAAK;EACpD,IAAI;EAEJ,MAAM,0BAA0B;AAC9B,gBAAa,UAAU;AACvB,eAAY,iBAAiB;AAC3B,iBAAa,UAAU;AACvB,cAAU;MACT,UAAU;;AAGf,OAAK,UAAU,IAAI,kBAAkB;AACrC,eAAa;AACX,gBAAa,UAAU;AACvB,QAAK,UAAU,OAAO,kBAAkB;;;CAI5C,oBAAoB,KAAK;CAEzB,IAAI,YAAY;AACd,SAAO,KAAK,MAAM;;CAGpB,IAAI,SAAS;AACX,SAAO,KAAK,MAAM,SAAS,MAAM;;CAGnC,IAAI,QAAQ;AACV,SAAO,KAAK,MAAM;;CAGpB,mBACE,QAGA,OAA0B,aACvB;AACH,MAAI,OAAO,WAAW,YAAY;GAChC,MAAM,CAAC,YAAY,YAAY,KAAK,MAAM,UAAU,CAAC,MAAM,SAAS;GACpE,MAAM,aAAa,OAAO,YAAY,SAAS;AAC/C,QAAK,SAAS,EAAE,QAAQ,cAAc,OAAO,CAAC,YAAY,KAAK,GAAG,MAAM,CAAC;SACpE;GACL,MAAM,aAAa,UAAU,OAAO,CAAC,QAAQ,KAAK,GAAG;AACrD,QAAK,SAAS,EAAE,QAAQ,YAA8C,CAAC;;;CAI3E,AAAQ,eAAe,MAAyB,kBAA6B;AAC3E,UACE,WACG;GACH,MAAM,OAAO;IACX,GAAG;IACH,IAAI,KAAK,MAAM,UAAU,CAAC,MAAM,SAAS,EAAE;IAC5C;GACD,MAAM,OAAO,OAAO,WAAW,aAAa,OAAO,KAAK,GAAG;AAC3D,QAAK,gBAAgB;IAAE,GAAG;IAAM,GAAG;IAAM,EAAE,KAAK;;;CAIpD,AAAQ,kBAON,UACA,QAKA,UASc;AACd,SAAO,aAAa,UAAU,OAAO,WAAW,GAAG,SAAS,GAAG;;CAGjE,AAAU,UAAU,OAClB,QAWA,YAoBG;AACH,MAAI;AACF,QAAK,YAAY,KAAK,IAAI,GAAG,KAAK,YAAY,EAAE;AAChD,QAAK,SAAS;IAAE,WAAW;IAAM,OAAO;IAAW,CAAC;AACpD,QAAK,WAAW,IAAI,iBAAiB;GAErC,MAAM,MAAM,MAAM,OAAO,KAAK,SAAS,OAAO;GAE9C,IAAI;AACJ,cAAW,MAAM,EAAE,OAAO,UAAU,KAAK;AACvC,QAAI,UAAU,SAAS;AACrB,mBAAc,IAAI,YAAY,KAAK;AACnC;;IAGF,MAAM,YAAY,MAAM,SAAS,IAAI,GACjC,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,GACzB;IAEJ,MAAM,SAAS,KAAK,YAAY,UAAU,QAAQ,cAAc;AAEhE,QAAI,UAAU,WAAY,SAAQ,UAAU,kBAAkB,KAAK;AACnE,QAAI,UAAU,SAAU,SAAQ,UAAU,mBAAmB,KAAK;AAElE,QAAI,KAAK,eAAe,WAAW,OAAO,KAAK,CAC7C,SAAQ,UAAU,gBAAgB,MAAM;KAAE;KAAW;KAAQ,CAAC;AAGhE,QAAI,KAAK,eAAe,UAAU,OAAO,KAAK,CAC5C,SAAQ,UAAU,gBAAgB,MAAM;KAAE;KAAW;KAAQ,CAAC;AAGhE,QAAI,KAAK,eAAe,eAAe,OAAO,KAAK,CACjD,SAAQ,UAAU,oBAAoB,MAAM,EAAE,WAAW,CAAC;AAG5D,QAAI,KAAK,eAAe,SAAS,OAAO,KAAK,CAC3C,SAAQ,UAAU,cAAc,MAAM,EAAE,WAAW,CAAC;AAGtD,QAAI,KAAK,eAAe,SAAS,OAAO,KAAK,CAC3C,SAAQ,UAAU,eAAe,MAAM,EAAE,WAAW,CAAC;AAGvD,QAAI,UAAU,SACZ,KAAI,mBAAmB,KACrB,MAAK,iBAAiB,UAAU;KAAE,GAAG;KAAM,GAAG;KAAM,EAAE;QAEtD,MAAK,gBAAgB,KAAK;AAI9B,QAAI,KAAK,eAAe,YAAY,OAAO,KAAK,EAAE;KAChD,MAAM,CAAC,YAAY,YAAY;KAE/B,MAAM,YAAY,KAAK,SAAS,IAAI,YAAY,SAAS;AACzD,SAAI,CAAC,WAAW;AACd,cAAQ,KACN,wDACD;AACD;;AAGF,UAAK,iBAAiB,iBAAiB;MACrC,MAAMA,WAAS;OAAE,GAAG,QAAQ;OAAe,GAAG;OAAc;MAG5D,IAAI,WAAW,QAAQ,YAAYA,SAAO,CAAC,OAAO;MAClD,MAAM,EAAE,OAAO,UACb,KAAK,SAAS,IAAI,WAAW,SAAS,OAAO,IAAI,EAAE;AAErD,UAAI,CAAC,SAAS,SAAS,KAAM,QAAOA;AACpC,UAAI,MAAM,SAAS,KAAK,SAEtB,KAAI,MAAM,OAAO,oBAEf,YAAW,EAAE;UAEb,UAAS,OAAO,OAAO,EAAE;UAG3B,UAAS,SAAS,cAAc,MAAM;AAGxC,aAAO,QAAQ,YAAYA,UAAQ,SAAS;OAC5C;;;AAIN,OAAI,eAAe,KAAM,OAAM;GAE/B,MAAM,SAAS,MAAM,QAAQ,aAAa;AAC1C,OAAI,OAAO,WAAW,eAAe,KAAK,cAAc,EACtD,MAAK,gBAAgB,OAAO;WAEvB,OAAO;AACd,OACE,EACE,iBAAiB,UAChB,MAAM,SAAS,gBAAgB,MAAM,SAAS,kBAEjD;AACA,YAAQ,MAAM,MAAM;AACpB,SAAK,SAAS,EAAE,OAAO,CAAC;AACxB,UAAM,QAAQ,UAAU,MAAM;;YAExB;AACR,QAAK,SAAS,EAAE,WAAW,OAAO,CAAC;AACnC,QAAK,WAAW,IAAI,iBAAiB;AACrC,WAAQ,YAAY;;;CAIxB,QAAQ,OACN,QAWA,YAoBkB;AAClB,OAAK,aAAa;AAClB,OAAK,QAAQ,KAAK,MAAM,WAAW,KAAK,QAAQ,QAAQ,QAAQ,CAAC;;CAGnE,OAAO,OACL,eACA,YAOkB;AAClB,OAAK,SAAS,OAAO;AACrB,OAAK,WAAW,IAAI,iBAAiB;AAErC,UAAQ,SAAS,EAAE,QAAQ,KAAK,YAAY,QAAQ,cAAc,EAAE,CAAC;;CAGvE,cAAc;AAEZ,OAAK,SAAS,OAAO;AACrB,OAAK,WAAW,IAAI,iBAAiB;AAGrC,OAAK,SAAS;GAAE,OAAO;GAAW,QAAQ;GAAM,WAAW;GAAO,CAAC;AAGnE,OAAK,SAAS,OAAO"}