@xpert-ai/xpert-sdk 0.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 (122) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth/error.d.ts +9 -0
  3. package/dist/auth/error.js +76 -0
  4. package/dist/auth/error.js.map +1 -0
  5. package/dist/auth/error.mjs +76 -0
  6. package/dist/auth/error.mjs.map +1 -0
  7. package/dist/auth/index.d.ts +18 -0
  8. package/dist/auth/index.js +35 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/auth/index.mjs +35 -0
  11. package/dist/auth/index.mjs.map +1 -0
  12. package/dist/auth/types.d.ts +297 -0
  13. package/dist/auth/types.js +2 -0
  14. package/dist/auth/types.js.map +1 -0
  15. package/dist/auth/types.mjs +2 -0
  16. package/dist/auth/types.mjs.map +1 -0
  17. package/dist/client.d.ts +662 -0
  18. package/dist/client.js +1233 -0
  19. package/dist/client.js.map +1 -0
  20. package/dist/client.mjs +1233 -0
  21. package/dist/client.mjs.map +1 -0
  22. package/dist/index.d.ts +7 -0
  23. package/dist/index.js +3 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/index.mjs +3 -0
  26. package/dist/index.mjs.map +1 -0
  27. package/dist/logging/index.d.ts +43 -0
  28. package/dist/logging/index.js +33 -0
  29. package/dist/logging/index.js.map +1 -0
  30. package/dist/logging/index.mjs +33 -0
  31. package/dist/logging/index.mjs.map +1 -0
  32. package/dist/schema.d.ts +270 -0
  33. package/dist/schema.js +2 -0
  34. package/dist/schema.js.map +1 -0
  35. package/dist/schema.mjs +2 -0
  36. package/dist/schema.mjs.map +1 -0
  37. package/dist/singletons/fetch.d.ts +7 -0
  38. package/dist/singletons/fetch.js +24 -0
  39. package/dist/singletons/fetch.js.map +1 -0
  40. package/dist/singletons/fetch.mjs +24 -0
  41. package/dist/singletons/fetch.mjs.map +1 -0
  42. package/dist/tests/fetch.test.d.ts +1 -0
  43. package/dist/tests/fetch.test.js +154 -0
  44. package/dist/tests/fetch.test.js.map +1 -0
  45. package/dist/tests/fetch.test.mjs +154 -0
  46. package/dist/tests/fetch.test.mjs.map +1 -0
  47. package/dist/tests/sse.test.d.ts +1 -0
  48. package/dist/tests/sse.test.js +157 -0
  49. package/dist/tests/sse.test.js.map +1 -0
  50. package/dist/tests/sse.test.mjs +157 -0
  51. package/dist/tests/sse.test.mjs.map +1 -0
  52. package/dist/types.d.ts +176 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/types.messages.d.ts +86 -0
  56. package/dist/types.messages.js +2 -0
  57. package/dist/types.messages.js.map +1 -0
  58. package/dist/types.messages.mjs +2 -0
  59. package/dist/types.messages.mjs.map +1 -0
  60. package/dist/types.mjs +2 -0
  61. package/dist/types.mjs.map +1 -0
  62. package/dist/types.stream.d.ts +212 -0
  63. package/dist/types.stream.js +2 -0
  64. package/dist/types.stream.js.map +1 -0
  65. package/dist/types.stream.mjs +2 -0
  66. package/dist/types.stream.mjs.map +1 -0
  67. package/dist/ui/branching.d.ts +35 -0
  68. package/dist/ui/branching.js +145 -0
  69. package/dist/ui/branching.js.map +1 -0
  70. package/dist/ui/branching.mjs +145 -0
  71. package/dist/ui/branching.mjs.map +1 -0
  72. package/dist/ui/branching.test.d.ts +1 -0
  73. package/dist/ui/branching.test.js +369 -0
  74. package/dist/ui/branching.test.js.map +1 -0
  75. package/dist/ui/branching.test.mjs +369 -0
  76. package/dist/ui/branching.test.mjs.map +1 -0
  77. package/dist/ui/errors.d.ts +12 -0
  78. package/dist/ui/errors.js +10 -0
  79. package/dist/ui/errors.js.map +1 -0
  80. package/dist/ui/errors.mjs +10 -0
  81. package/dist/ui/errors.mjs.map +1 -0
  82. package/dist/ui/manager.d.ts +87 -0
  83. package/dist/ui/manager.js +160 -0
  84. package/dist/ui/manager.js.map +1 -0
  85. package/dist/ui/manager.mjs +160 -0
  86. package/dist/ui/manager.mjs.map +1 -0
  87. package/dist/ui/messages.d.ts +18 -0
  88. package/dist/ui/messages.js +67 -0
  89. package/dist/ui/messages.js.map +1 -0
  90. package/dist/ui/messages.mjs +67 -0
  91. package/dist/ui/messages.mjs.map +1 -0
  92. package/dist/ui/utils.d.ts +2 -0
  93. package/dist/ui/utils.js +11 -0
  94. package/dist/ui/utils.js.map +1 -0
  95. package/dist/ui/utils.mjs +11 -0
  96. package/dist/ui/utils.mjs.map +1 -0
  97. package/dist/utils/async_caller.d.ts +48 -0
  98. package/dist/utils/async_caller.js +147 -0
  99. package/dist/utils/async_caller.js.map +1 -0
  100. package/dist/utils/async_caller.mjs +147 -0
  101. package/dist/utils/async_caller.mjs.map +1 -0
  102. package/dist/utils/env.d.ts +1 -0
  103. package/dist/utils/env.js +13 -0
  104. package/dist/utils/env.js.map +1 -0
  105. package/dist/utils/env.mjs +13 -0
  106. package/dist/utils/env.mjs.map +1 -0
  107. package/dist/utils/signals.d.ts +1 -0
  108. package/dist/utils/signals.js +19 -0
  109. package/dist/utils/signals.js.map +1 -0
  110. package/dist/utils/signals.mjs +19 -0
  111. package/dist/utils/signals.mjs.map +1 -0
  112. package/dist/utils/sse.d.ts +8 -0
  113. package/dist/utils/sse.js +151 -0
  114. package/dist/utils/sse.js.map +1 -0
  115. package/dist/utils/sse.mjs +151 -0
  116. package/dist/utils/sse.mjs.map +1 -0
  117. package/dist/utils/stream.d.ts +13 -0
  118. package/dist/utils/stream.js +109 -0
  119. package/dist/utils/stream.js.map +1 -0
  120. package/dist/utils/stream.mjs +109 -0
  121. package/dist/utils/stream.mjs.map +1 -0
  122. package/package.json +56 -0
@@ -0,0 +1,145 @@
1
+ export function getBranchSequence(history) {
2
+ const nodeIds = new Set();
3
+ const childrenMap = {};
4
+ // Short circuit if there's only a singular one state
5
+ if (history.length <= 1) {
6
+ return {
7
+ rootSequence: {
8
+ type: "sequence",
9
+ items: history.map((value) => ({ type: "node", value, path: [] })),
10
+ },
11
+ paths: [],
12
+ };
13
+ }
14
+ // First pass - collect nodes for each checkpoint
15
+ history.forEach((state) => {
16
+ const checkpointId = state.parent_checkpoint?.checkpoint_id ?? "$";
17
+ childrenMap[checkpointId] ??= [];
18
+ childrenMap[checkpointId].push(state);
19
+ if (state.checkpoint?.checkpoint_id != null) {
20
+ nodeIds.add(state.checkpoint.checkpoint_id);
21
+ }
22
+ });
23
+ // If dealing with partial history, take the branch
24
+ // with the latest checkpoint and mark it as the root.
25
+ const maxId = (...ids) => ids
26
+ .filter((i) => i != null)
27
+ .sort((a, b) => a.localeCompare(b))
28
+ .at(-1);
29
+ const lastOrphanedNode = childrenMap.$ == null
30
+ ? Object.keys(childrenMap)
31
+ .filter((parentId) => !nodeIds.has(parentId))
32
+ .map((parentId) => {
33
+ const queue = [parentId];
34
+ const seen = new Set();
35
+ let lastId = parentId;
36
+ while (queue.length > 0) {
37
+ const current = queue.shift();
38
+ if (seen.has(current))
39
+ continue;
40
+ seen.add(current);
41
+ const children = (childrenMap[current] ?? []).flatMap((i) => i.checkpoint?.checkpoint_id ?? []);
42
+ lastId = maxId(lastId, ...children);
43
+ queue.push(...children);
44
+ }
45
+ return { parentId, lastId };
46
+ })
47
+ .sort((a, b) => a.lastId.localeCompare(b.lastId))
48
+ .at(-1)?.parentId
49
+ : undefined;
50
+ if (lastOrphanedNode != null)
51
+ childrenMap.$ = childrenMap[lastOrphanedNode];
52
+ const rootSequence = { type: "sequence", items: [] };
53
+ const queue = [{ id: "$", sequence: rootSequence, path: [] }];
54
+ const paths = [];
55
+ const visited = new Set();
56
+ while (queue.length > 0) {
57
+ const task = queue.shift();
58
+ if (visited.has(task.id))
59
+ continue;
60
+ visited.add(task.id);
61
+ const children = childrenMap[task.id];
62
+ if (children == null || children.length === 0)
63
+ continue;
64
+ // If we've encountered a fork (2+ children), push the fork
65
+ // to the sequence and add a new sequence for each child
66
+ let fork;
67
+ if (children.length > 1) {
68
+ fork = { type: "fork", items: [] };
69
+ task.sequence.items.push(fork);
70
+ }
71
+ for (const value of children) {
72
+ const id = value.checkpoint?.checkpoint_id;
73
+ if (id == null)
74
+ continue;
75
+ let { sequence } = task;
76
+ let { path } = task;
77
+ if (fork != null) {
78
+ sequence = { type: "sequence", items: [] };
79
+ fork.items.unshift(sequence);
80
+ path = path.slice();
81
+ path.push(id);
82
+ paths.push(path);
83
+ }
84
+ sequence.items.push({ type: "node", value, path });
85
+ queue.push({ id, sequence, path });
86
+ }
87
+ }
88
+ return { rootSequence, paths };
89
+ }
90
+ const PATH_SEP = ">";
91
+ const ROOT_ID = "$";
92
+ // Get flat view
93
+ export function getBranchView(sequence, paths, branch) {
94
+ const path = branch.split(PATH_SEP);
95
+ const pathMap = {};
96
+ for (const path of paths) {
97
+ const parent = path.at(-2) ?? ROOT_ID;
98
+ pathMap[parent] ??= [];
99
+ pathMap[parent].unshift(path);
100
+ }
101
+ const history = [];
102
+ const branchByCheckpoint = {};
103
+ const forkStack = path.slice();
104
+ const queue = [...sequence.items];
105
+ while (queue.length > 0) {
106
+ const item = queue.shift();
107
+ if (item.type === "node") {
108
+ history.push(item.value);
109
+ const checkpointId = item.value.checkpoint?.checkpoint_id;
110
+ if (checkpointId == null)
111
+ continue;
112
+ branchByCheckpoint[checkpointId] = {
113
+ branch: item.path.join(PATH_SEP),
114
+ branchOptions: (item.path.length > 0
115
+ ? pathMap[item.path.at(-2) ?? ROOT_ID] ?? []
116
+ : []).map((p) => p.join(PATH_SEP)),
117
+ };
118
+ }
119
+ if (item.type === "fork") {
120
+ const forkId = forkStack.shift();
121
+ const index = forkId != null
122
+ ? item.items.findIndex((value) => {
123
+ const firstItem = value.items.at(0);
124
+ if (!firstItem || firstItem.type !== "node")
125
+ return false;
126
+ return firstItem.value.checkpoint?.checkpoint_id === forkId;
127
+ })
128
+ : -1;
129
+ const nextItems = item.items.at(index)?.items ?? [];
130
+ queue.push(...nextItems);
131
+ }
132
+ }
133
+ return { history, branchByCheckpoint };
134
+ }
135
+ export function getBranchContext(branch, history) {
136
+ const { rootSequence: branchTree, paths } = getBranchSequence(history ?? []);
137
+ const { history: flatHistory, branchByCheckpoint } = getBranchView(branchTree, paths, branch);
138
+ return {
139
+ branchTree,
140
+ flatHistory,
141
+ branchByCheckpoint,
142
+ threadHead: flatHistory.at(-1),
143
+ };
144
+ }
145
+ //# sourceMappingURL=branching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branching.js","sourceRoot":"","sources":["../../src/ui/branching.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ export function getBranchSequence(history) {
2
+ const nodeIds = new Set();
3
+ const childrenMap = {};
4
+ // Short circuit if there's only a singular one state
5
+ if (history.length <= 1) {
6
+ return {
7
+ rootSequence: {
8
+ type: "sequence",
9
+ items: history.map((value) => ({ type: "node", value, path: [] })),
10
+ },
11
+ paths: [],
12
+ };
13
+ }
14
+ // First pass - collect nodes for each checkpoint
15
+ history.forEach((state) => {
16
+ const checkpointId = state.parent_checkpoint?.checkpoint_id ?? "$";
17
+ childrenMap[checkpointId] ??= [];
18
+ childrenMap[checkpointId].push(state);
19
+ if (state.checkpoint?.checkpoint_id != null) {
20
+ nodeIds.add(state.checkpoint.checkpoint_id);
21
+ }
22
+ });
23
+ // If dealing with partial history, take the branch
24
+ // with the latest checkpoint and mark it as the root.
25
+ const maxId = (...ids) => ids
26
+ .filter((i) => i != null)
27
+ .sort((a, b) => a.localeCompare(b))
28
+ .at(-1);
29
+ const lastOrphanedNode = childrenMap.$ == null
30
+ ? Object.keys(childrenMap)
31
+ .filter((parentId) => !nodeIds.has(parentId))
32
+ .map((parentId) => {
33
+ const queue = [parentId];
34
+ const seen = new Set();
35
+ let lastId = parentId;
36
+ while (queue.length > 0) {
37
+ const current = queue.shift();
38
+ if (seen.has(current))
39
+ continue;
40
+ seen.add(current);
41
+ const children = (childrenMap[current] ?? []).flatMap((i) => i.checkpoint?.checkpoint_id ?? []);
42
+ lastId = maxId(lastId, ...children);
43
+ queue.push(...children);
44
+ }
45
+ return { parentId, lastId };
46
+ })
47
+ .sort((a, b) => a.lastId.localeCompare(b.lastId))
48
+ .at(-1)?.parentId
49
+ : undefined;
50
+ if (lastOrphanedNode != null)
51
+ childrenMap.$ = childrenMap[lastOrphanedNode];
52
+ const rootSequence = { type: "sequence", items: [] };
53
+ const queue = [{ id: "$", sequence: rootSequence, path: [] }];
54
+ const paths = [];
55
+ const visited = new Set();
56
+ while (queue.length > 0) {
57
+ const task = queue.shift();
58
+ if (visited.has(task.id))
59
+ continue;
60
+ visited.add(task.id);
61
+ const children = childrenMap[task.id];
62
+ if (children == null || children.length === 0)
63
+ continue;
64
+ // If we've encountered a fork (2+ children), push the fork
65
+ // to the sequence and add a new sequence for each child
66
+ let fork;
67
+ if (children.length > 1) {
68
+ fork = { type: "fork", items: [] };
69
+ task.sequence.items.push(fork);
70
+ }
71
+ for (const value of children) {
72
+ const id = value.checkpoint?.checkpoint_id;
73
+ if (id == null)
74
+ continue;
75
+ let { sequence } = task;
76
+ let { path } = task;
77
+ if (fork != null) {
78
+ sequence = { type: "sequence", items: [] };
79
+ fork.items.unshift(sequence);
80
+ path = path.slice();
81
+ path.push(id);
82
+ paths.push(path);
83
+ }
84
+ sequence.items.push({ type: "node", value, path });
85
+ queue.push({ id, sequence, path });
86
+ }
87
+ }
88
+ return { rootSequence, paths };
89
+ }
90
+ const PATH_SEP = ">";
91
+ const ROOT_ID = "$";
92
+ // Get flat view
93
+ export function getBranchView(sequence, paths, branch) {
94
+ const path = branch.split(PATH_SEP);
95
+ const pathMap = {};
96
+ for (const path of paths) {
97
+ const parent = path.at(-2) ?? ROOT_ID;
98
+ pathMap[parent] ??= [];
99
+ pathMap[parent].unshift(path);
100
+ }
101
+ const history = [];
102
+ const branchByCheckpoint = {};
103
+ const forkStack = path.slice();
104
+ const queue = [...sequence.items];
105
+ while (queue.length > 0) {
106
+ const item = queue.shift();
107
+ if (item.type === "node") {
108
+ history.push(item.value);
109
+ const checkpointId = item.value.checkpoint?.checkpoint_id;
110
+ if (checkpointId == null)
111
+ continue;
112
+ branchByCheckpoint[checkpointId] = {
113
+ branch: item.path.join(PATH_SEP),
114
+ branchOptions: (item.path.length > 0
115
+ ? pathMap[item.path.at(-2) ?? ROOT_ID] ?? []
116
+ : []).map((p) => p.join(PATH_SEP)),
117
+ };
118
+ }
119
+ if (item.type === "fork") {
120
+ const forkId = forkStack.shift();
121
+ const index = forkId != null
122
+ ? item.items.findIndex((value) => {
123
+ const firstItem = value.items.at(0);
124
+ if (!firstItem || firstItem.type !== "node")
125
+ return false;
126
+ return firstItem.value.checkpoint?.checkpoint_id === forkId;
127
+ })
128
+ : -1;
129
+ const nextItems = item.items.at(index)?.items ?? [];
130
+ queue.push(...nextItems);
131
+ }
132
+ }
133
+ return { history, branchByCheckpoint };
134
+ }
135
+ export function getBranchContext(branch, history) {
136
+ const { rootSequence: branchTree, paths } = getBranchSequence(history ?? []);
137
+ const { history: flatHistory, branchByCheckpoint } = getBranchView(branchTree, paths, branch);
138
+ return {
139
+ branchTree,
140
+ flatHistory,
141
+ branchByCheckpoint,
142
+ threadHead: flatHistory.at(-1),
143
+ };
144
+ }
145
+ //# sourceMappingURL=branching.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branching.mjs","sourceRoot":"","sources":["../../src/ui/branching.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,369 @@
1
+ import { it, expect } from "vitest";
2
+ import { getBranchSequence } from "./branching.js";
3
+ const history = [
4
+ {
5
+ values: {
6
+ messages: [
7
+ {
8
+ content: "Fork: Hello",
9
+ additional_kwargs: {},
10
+ response_metadata: {},
11
+ id: "33357aea-9c2d-4718-92f4-20038d5a2d29",
12
+ type: "human",
13
+ },
14
+ {
15
+ content: "Hey",
16
+ additional_kwargs: {},
17
+ response_metadata: {},
18
+ tool_call_chunks: [],
19
+ id: "run-782a2f90-2e39-4c21-9ee6-0f38585a0ae6",
20
+ tool_calls: [],
21
+ invalid_tool_calls: [],
22
+ type: "ai",
23
+ },
24
+ ],
25
+ },
26
+ next: [],
27
+ tasks: [],
28
+ metadata: {
29
+ source: "loop",
30
+ step: 2,
31
+ parents: {},
32
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
33
+ },
34
+ created_at: "2025-08-21T12:47:12.640Z",
35
+ checkpoint: {
36
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
37
+ checkpoint_id: "1f07e8cf-56a7-6000-8002-5e272b1d5285",
38
+ checkpoint_ns: "",
39
+ checkpoint_map: null,
40
+ },
41
+ parent_checkpoint: {
42
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
43
+ checkpoint_id: "1f07e8cf-53aa-6d70-8001-2096b0bbf835",
44
+ checkpoint_ns: "",
45
+ checkpoint_map: null,
46
+ },
47
+ },
48
+ {
49
+ values: {
50
+ messages: [
51
+ {
52
+ content: "Fork: Hello",
53
+ additional_kwargs: {},
54
+ response_metadata: {},
55
+ id: "33357aea-9c2d-4718-92f4-20038d5a2d29",
56
+ type: "human",
57
+ },
58
+ ],
59
+ },
60
+ next: ["agent"],
61
+ tasks: [
62
+ {
63
+ id: "680ee831-4d10-50f9-956f-e0d937321614",
64
+ name: "agent",
65
+ error: null,
66
+ interrupts: [],
67
+ path: ["__pregel_pull", "agent"],
68
+ checkpoint: null,
69
+ state: null,
70
+ result: {
71
+ messages: [
72
+ {
73
+ content: "Hey",
74
+ additional_kwargs: {},
75
+ response_metadata: {},
76
+ tool_call_chunks: [],
77
+ id: "run-782a2f90-2e39-4c21-9ee6-0f38585a0ae6",
78
+ tool_calls: [],
79
+ invalid_tool_calls: [],
80
+ type: "ai",
81
+ },
82
+ ],
83
+ },
84
+ },
85
+ ],
86
+ metadata: {
87
+ source: "loop",
88
+ step: 1,
89
+ parents: {},
90
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
91
+ },
92
+ created_at: "2025-08-21T12:47:12.327Z",
93
+ checkpoint: {
94
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
95
+ checkpoint_id: "1f07e8cf-53aa-6d70-8001-2096b0bbf835",
96
+ checkpoint_ns: "",
97
+ checkpoint_map: null,
98
+ },
99
+ parent_checkpoint: {
100
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
101
+ checkpoint_id: "1f07e8cf-53a8-6660-8000-f157c9cf7d66",
102
+ checkpoint_ns: "",
103
+ checkpoint_map: null,
104
+ },
105
+ },
106
+ {
107
+ values: { messages: [] },
108
+ next: ["__start__"],
109
+ tasks: [
110
+ {
111
+ id: "4233f4c0-5ea2-5117-9153-95e5fe59eee3",
112
+ name: "__start__",
113
+ error: null,
114
+ interrupts: [],
115
+ path: ["__pregel_pull", "__start__"],
116
+ checkpoint: null,
117
+ state: null,
118
+ result: { messages: [{ type: "human", content: "Fork: Hello" }] },
119
+ },
120
+ ],
121
+ metadata: {
122
+ source: "input",
123
+ step: 0,
124
+ parents: {},
125
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
126
+ },
127
+ created_at: "2025-08-21T12:47:12.326Z",
128
+ checkpoint: {
129
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
130
+ checkpoint_id: "1f07e8cf-53a8-6660-8000-f157c9cf7d66",
131
+ checkpoint_ns: "",
132
+ checkpoint_map: null,
133
+ },
134
+ parent_checkpoint: {
135
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
136
+ checkpoint_id: "1f07e8cf-4cea-6530-ffff-0995a53299c5",
137
+ checkpoint_ns: "",
138
+ checkpoint_map: null,
139
+ },
140
+ },
141
+ {
142
+ values: {
143
+ messages: [
144
+ {
145
+ content: "Hello",
146
+ additional_kwargs: {},
147
+ response_metadata: {},
148
+ id: "ec300e63-1494-4ef6-936c-60d02d7bdce1",
149
+ type: "human",
150
+ },
151
+ {
152
+ content: "Hey",
153
+ additional_kwargs: {},
154
+ response_metadata: {},
155
+ tool_call_chunks: [],
156
+ id: "run-593064bd-dd07-4ed3-99c0-a918625f4884",
157
+ tool_calls: [],
158
+ invalid_tool_calls: [],
159
+ type: "ai",
160
+ },
161
+ ],
162
+ },
163
+ next: [],
164
+ tasks: [],
165
+ metadata: {
166
+ source: "loop",
167
+ step: 1,
168
+ parents: {},
169
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
170
+ },
171
+ created_at: "2025-08-21T12:47:12.285Z",
172
+ checkpoint: {
173
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
174
+ checkpoint_id: "1f07e8cf-5344-64d0-8001-8a176e91d12f",
175
+ checkpoint_ns: "",
176
+ checkpoint_map: null,
177
+ },
178
+ parent_checkpoint: {
179
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
180
+ checkpoint_id: "1f07e8cf-4cf8-6f90-8000-7707fd155a8a",
181
+ checkpoint_ns: "",
182
+ checkpoint_map: null,
183
+ },
184
+ },
185
+ {
186
+ values: {
187
+ messages: [
188
+ {
189
+ content: "Hello",
190
+ additional_kwargs: {},
191
+ response_metadata: {},
192
+ id: "ec300e63-1494-4ef6-936c-60d02d7bdce1",
193
+ type: "human",
194
+ },
195
+ {
196
+ content: "Hey",
197
+ additional_kwargs: {},
198
+ response_metadata: {},
199
+ tool_call_chunks: [],
200
+ id: "run-b86ef558-eaff-4838-bc03-218f20554a9f",
201
+ tool_calls: [],
202
+ invalid_tool_calls: [],
203
+ type: "ai",
204
+ },
205
+ ],
206
+ },
207
+ next: [],
208
+ tasks: [],
209
+ metadata: {
210
+ source: "loop",
211
+ step: 1,
212
+ parents: {},
213
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
214
+ },
215
+ created_at: "2025-08-21T12:47:11.936Z",
216
+ checkpoint: {
217
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
218
+ checkpoint_id: "1f07e8cf-4ff0-6400-8001-a54aedf52a76",
219
+ checkpoint_ns: "",
220
+ checkpoint_map: null,
221
+ },
222
+ parent_checkpoint: {
223
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
224
+ checkpoint_id: "1f07e8cf-4cf8-6f90-8000-7707fd155a8a",
225
+ checkpoint_ns: "",
226
+ checkpoint_map: null,
227
+ },
228
+ },
229
+ {
230
+ values: {
231
+ messages: [
232
+ {
233
+ content: "Hello",
234
+ additional_kwargs: {},
235
+ response_metadata: {},
236
+ id: "ec300e63-1494-4ef6-936c-60d02d7bdce1",
237
+ type: "human",
238
+ },
239
+ ],
240
+ },
241
+ next: ["agent"],
242
+ tasks: [
243
+ {
244
+ id: "e3f503f1-73bc-5db1-8b4d-13f660ad1b51",
245
+ name: "agent",
246
+ error: null,
247
+ interrupts: [],
248
+ path: ["__pregel_pull", "agent"],
249
+ checkpoint: null,
250
+ state: null,
251
+ result: {
252
+ messages: [
253
+ {
254
+ content: "Hey",
255
+ additional_kwargs: {},
256
+ response_metadata: {},
257
+ tool_call_chunks: [],
258
+ id: "run-b86ef558-eaff-4838-bc03-218f20554a9f",
259
+ tool_calls: [],
260
+ invalid_tool_calls: [],
261
+ type: "ai",
262
+ },
263
+ ],
264
+ },
265
+ },
266
+ ],
267
+ metadata: {
268
+ source: "loop",
269
+ step: 0,
270
+ parents: {},
271
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
272
+ },
273
+ created_at: "2025-08-21T12:47:11.625Z",
274
+ checkpoint: {
275
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
276
+ checkpoint_id: "1f07e8cf-4cf8-6f90-8000-7707fd155a8a",
277
+ checkpoint_ns: "",
278
+ checkpoint_map: null,
279
+ },
280
+ parent_checkpoint: {
281
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
282
+ checkpoint_id: "1f07e8cf-4cea-6530-ffff-0995a53299c5",
283
+ checkpoint_ns: "",
284
+ checkpoint_map: null,
285
+ },
286
+ },
287
+ {
288
+ values: { messages: [] },
289
+ next: ["__start__"],
290
+ tasks: [
291
+ {
292
+ id: "cddede95-d276-59f1-bc08-8051d6448734",
293
+ name: "__start__",
294
+ error: null,
295
+ interrupts: [],
296
+ path: ["__pregel_pull", "__start__"],
297
+ checkpoint: null,
298
+ state: null,
299
+ result: { messages: [{ type: "human", content: "Hello" }] },
300
+ },
301
+ ],
302
+ metadata: {
303
+ source: "input",
304
+ step: -1,
305
+ parents: {},
306
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
307
+ },
308
+ created_at: "2025-08-21T12:47:11.619Z",
309
+ checkpoint: {
310
+ thread_id: "efa80f4d-725f-4903-b19f-216309f060bc",
311
+ checkpoint_id: "1f07e8cf-4cea-6530-ffff-0995a53299c5",
312
+ checkpoint_ns: "",
313
+ checkpoint_map: null,
314
+ },
315
+ parent_checkpoint: null,
316
+ },
317
+ ];
318
+ const node = (value, paths = []) => ({
319
+ type: "node",
320
+ value: typeof value === "number" ? history.at(value) : value,
321
+ path: paths.map((v) => {
322
+ if (typeof v === "number") {
323
+ return history.at(v)?.checkpoint?.checkpoint_id;
324
+ }
325
+ return v?.checkpoint?.checkpoint_id;
326
+ }),
327
+ });
328
+ const fork = (...items) => ({ type: "fork", items });
329
+ const sequence = (...items) => ({ type: "sequence", items });
330
+ it("full tree", async () => {
331
+ const { rootSequence, paths } = getBranchSequence(history);
332
+ expect
333
+ .soft(paths)
334
+ .toMatchObject(expect.arrayContaining([[5], [5, 4], [5, 3], [2]].map((p) => p.map((i) => history.at(i)?.checkpoint?.checkpoint_id))));
335
+ expect
336
+ .soft(rootSequence)
337
+ .toMatchObject(sequence(node(6), fork(sequence(node(5, [5]), fork(sequence(node(4, [5, 4])), sequence(node(3, [5, 3])))), sequence(node(2, [2]), node(1, [2]), node(0, [2])))));
338
+ });
339
+ it("partial tree", async () => {
340
+ expect(getBranchSequence(history.slice(0, 1))).toMatchObject({
341
+ paths: [],
342
+ rootSequence: sequence(node(0)),
343
+ });
344
+ expect(getBranchSequence(history.slice(0, 2))).toMatchObject({
345
+ paths: [],
346
+ rootSequence: sequence(node(1), node(0)),
347
+ });
348
+ expect(getBranchSequence(history.slice(0, 3))).toMatchObject({
349
+ paths: [],
350
+ rootSequence: sequence(node(2), node(1), node(0)),
351
+ });
352
+ expect(getBranchSequence(history.slice(0, 4))).toMatchObject({
353
+ paths: [],
354
+ rootSequence: sequence(node(2), node(1), node(0)),
355
+ });
356
+ expect(getBranchSequence(history.slice(0, 5))).toMatchObject({
357
+ paths: [],
358
+ rootSequence: sequence(node(2), node(1), node(0)),
359
+ });
360
+ expect(getBranchSequence(history.slice(0, 6))).toMatchObject({
361
+ paths: expect.arrayContaining([[5], [5, 4], [5, 3], [2]].map((p) => p.map((i) => history.at(i)?.checkpoint?.checkpoint_id))),
362
+ rootSequence: sequence(fork(sequence(node(5, [5]), fork(sequence(node(4, [5, 4])), sequence(node(3, [5, 3])))), sequence(node(2, [2]), node(1, [2]), node(0, [2])))),
363
+ });
364
+ expect(getBranchSequence(history.slice(0, 7))).toMatchObject({
365
+ paths: expect.arrayContaining([[5], [5, 4], [5, 3], [2]].map((p) => p.map((i) => history.at(i)?.checkpoint?.checkpoint_id))),
366
+ rootSequence: sequence(node(6), fork(sequence(node(5, [5]), fork(sequence(node(4, [5, 4])), sequence(node(3, [5, 3])))), sequence(node(2, [2]), node(1, [2]), node(0, [2])))),
367
+ });
368
+ });
369
+ //# sourceMappingURL=branching.test.js.map