@langchain/langgraph 1.1.0 → 1.1.2

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 (104) hide show
  1. package/dist/errors.d.cts.map +1 -1
  2. package/dist/graph/annotation.cjs +3 -0
  3. package/dist/graph/annotation.cjs.map +1 -1
  4. package/dist/graph/annotation.d.cts +1 -0
  5. package/dist/graph/annotation.d.cts.map +1 -1
  6. package/dist/graph/annotation.d.ts +1 -0
  7. package/dist/graph/annotation.d.ts.map +1 -1
  8. package/dist/graph/annotation.js +3 -0
  9. package/dist/graph/annotation.js.map +1 -1
  10. package/dist/graph/graph.cjs +3 -3
  11. package/dist/graph/graph.cjs.map +1 -1
  12. package/dist/graph/graph.js +3 -3
  13. package/dist/graph/graph.js.map +1 -1
  14. package/dist/graph/message.d.cts +2 -2
  15. package/dist/graph/message.d.cts.map +1 -1
  16. package/dist/graph/message.d.ts +2 -2
  17. package/dist/graph/message.d.ts.map +1 -1
  18. package/dist/graph/messages_annotation.d.cts +5 -5
  19. package/dist/graph/messages_annotation.d.cts.map +1 -1
  20. package/dist/graph/messages_annotation.d.ts +5 -5
  21. package/dist/graph/messages_annotation.d.ts.map +1 -1
  22. package/dist/graph/state.cjs +98 -78
  23. package/dist/graph/state.cjs.map +1 -1
  24. package/dist/graph/state.d.cts +68 -35
  25. package/dist/graph/state.d.cts.map +1 -1
  26. package/dist/graph/state.d.ts +68 -35
  27. package/dist/graph/state.d.ts.map +1 -1
  28. package/dist/graph/state.js +99 -79
  29. package/dist/graph/state.js.map +1 -1
  30. package/dist/graph/types.cjs +41 -0
  31. package/dist/graph/types.cjs.map +1 -0
  32. package/dist/graph/types.d.cts +247 -18
  33. package/dist/graph/types.d.cts.map +1 -1
  34. package/dist/graph/types.d.ts +247 -18
  35. package/dist/graph/types.d.ts.map +1 -1
  36. package/dist/graph/types.js +40 -0
  37. package/dist/graph/types.js.map +1 -0
  38. package/dist/graph/zod/meta.cjs +4 -4
  39. package/dist/graph/zod/meta.cjs.map +1 -1
  40. package/dist/graph/zod/meta.js +4 -4
  41. package/dist/graph/zod/meta.js.map +1 -1
  42. package/dist/graph/zod/zod-registry.d.cts.map +1 -1
  43. package/dist/graph/zod/zod-registry.d.ts.map +1 -1
  44. package/dist/hash.cjs +1 -1
  45. package/dist/hash.cjs.map +1 -1
  46. package/dist/hash.js +1 -1
  47. package/dist/hash.js.map +1 -1
  48. package/dist/index.d.cts +3 -3
  49. package/dist/index.d.ts +3 -3
  50. package/dist/prebuilt/agent_executor.d.cts +5 -5
  51. package/dist/prebuilt/agent_executor.d.cts.map +1 -1
  52. package/dist/prebuilt/agent_executor.d.ts +5 -5
  53. package/dist/prebuilt/agent_executor.d.ts.map +1 -1
  54. package/dist/prebuilt/react_agent_executor.cjs +12 -12
  55. package/dist/prebuilt/react_agent_executor.cjs.map +1 -1
  56. package/dist/prebuilt/react_agent_executor.d.cts +3 -3
  57. package/dist/prebuilt/react_agent_executor.d.cts.map +1 -1
  58. package/dist/prebuilt/react_agent_executor.d.ts +3 -3
  59. package/dist/prebuilt/react_agent_executor.d.ts.map +1 -1
  60. package/dist/prebuilt/react_agent_executor.js +12 -12
  61. package/dist/prebuilt/react_agent_executor.js.map +1 -1
  62. package/dist/prebuilt/tool_node.cjs +1 -1
  63. package/dist/prebuilt/tool_node.cjs.map +1 -1
  64. package/dist/prebuilt/tool_node.js +1 -1
  65. package/dist/prebuilt/tool_node.js.map +1 -1
  66. package/dist/pregel/debug.cjs +9 -9
  67. package/dist/pregel/debug.cjs.map +1 -1
  68. package/dist/pregel/debug.js +9 -9
  69. package/dist/pregel/debug.js.map +1 -1
  70. package/dist/pregel/index.cjs +44 -44
  71. package/dist/pregel/index.cjs.map +1 -1
  72. package/dist/pregel/index.js +44 -44
  73. package/dist/pregel/index.js.map +1 -1
  74. package/dist/pregel/loop.cjs +1 -1
  75. package/dist/pregel/loop.cjs.map +1 -1
  76. package/dist/pregel/loop.js +1 -1
  77. package/dist/pregel/loop.js.map +1 -1
  78. package/dist/pregel/utils/subgraph.cjs +2 -2
  79. package/dist/pregel/utils/subgraph.cjs.map +1 -1
  80. package/dist/pregel/utils/subgraph.js +2 -2
  81. package/dist/pregel/utils/subgraph.js.map +1 -1
  82. package/dist/state/schema.cjs +8 -9
  83. package/dist/state/schema.cjs.map +1 -1
  84. package/dist/state/schema.d.cts +18 -22
  85. package/dist/state/schema.d.cts.map +1 -1
  86. package/dist/state/schema.d.ts +18 -22
  87. package/dist/state/schema.d.ts.map +1 -1
  88. package/dist/state/schema.js +8 -9
  89. package/dist/state/schema.js.map +1 -1
  90. package/dist/state/values/reduced.cjs.map +1 -1
  91. package/dist/state/values/reduced.d.cts +1 -1
  92. package/dist/state/values/reduced.d.cts.map +1 -1
  93. package/dist/state/values/reduced.d.ts +1 -1
  94. package/dist/state/values/reduced.d.ts.map +1 -1
  95. package/dist/state/values/reduced.js.map +1 -1
  96. package/dist/state/values/untracked.cjs.map +1 -1
  97. package/dist/state/values/untracked.d.cts +4 -0
  98. package/dist/state/values/untracked.d.cts.map +1 -1
  99. package/dist/state/values/untracked.d.ts +4 -0
  100. package/dist/state/values/untracked.d.ts.map +1 -1
  101. package/dist/state/values/untracked.js.map +1 -1
  102. package/dist/web.d.cts +3 -3
  103. package/dist/web.d.ts +3 -3
  104. package/package.json +6 -6
@@ -1,7 +1,6 @@
1
1
  import { InvalidUpdateError, ParentCommand, StateGraphInputError } from "../errors.js";
2
- import { isBaseChannel } from "../channels/base.js";
3
2
  import { LastValueAfterFinish } from "../channels/last_value.js";
4
- import { getChannel } from "./annotation.js";
3
+ import { AnnotationRoot, getChannel } from "./annotation.js";
5
4
  import { CHECKPOINT_NAMESPACE_END, CHECKPOINT_NAMESPACE_SEPARATOR, Command, END, SELF, START, TAG_HIDDEN, _isSend, isCommand, isInterrupted } from "../constants.js";
6
5
  import { RunnableCallable } from "../utils.js";
7
6
  import { ChannelWrite, PASSTHROUGH } from "../pregel/write.js";
@@ -13,6 +12,7 @@ import { NamedBarrierValue, NamedBarrierValueAfterFinish } from "../channels/nam
13
12
  import { StateSchema } from "../state/schema.js";
14
13
  import "../state/index.js";
15
14
  import { schemaMetaRegistry } from "./zod/meta.js";
15
+ import { isStateDefinitionInit, isStateGraphInit } from "./types.js";
16
16
  import { Runnable, _coerceToRunnable } from "@langchain/core/runnables";
17
17
  import { interopParse, interopZodObjectPartial, isInteropZodObject } from "@langchain/core/utils/types";
18
18
 
@@ -111,57 +111,86 @@ var StateGraph = class extends Graph {
111
111
  _interrupt;
112
112
  /** @internal */
113
113
  _writer;
114
- constructor(fields, contextSchema) {
114
+ constructor(stateOrInit, options) {
115
115
  super();
116
- if (StateSchema.isInstance(fields)) {
117
- const channels = fields.getChannels();
118
- this._schemaDefinition = channels;
119
- this.channels = channels;
120
- this._schemaRuntimeDefinition = fields;
121
- this._inputRuntimeDefinition = PartialStateSchema;
122
- this._outputRuntimeDefinition = fields;
123
- } else if (isZodStateGraphArgsWithStateSchema(fields)) {
124
- const stateDef = this._metaRegistry.getChannelsForSchema(fields.state);
125
- const inputDef = fields.input != null ? this._metaRegistry.getChannelsForSchema(fields.input) : stateDef;
126
- const outputDef = fields.output != null ? this._metaRegistry.getChannelsForSchema(fields.output) : stateDef;
127
- this._schemaDefinition = stateDef;
128
- this._schemaRuntimeDefinition = fields.state;
129
- this._inputDefinition = inputDef;
130
- this._inputRuntimeDefinition = fields.input ?? PartialStateSchema;
131
- this._outputDefinition = outputDef;
132
- this._outputRuntimeDefinition = fields.output ?? fields.state;
133
- } else if (isInteropZodObject(fields)) {
134
- const stateDef = this._metaRegistry.getChannelsForSchema(fields);
135
- this._schemaDefinition = stateDef;
136
- this._schemaRuntimeDefinition = fields;
137
- this._inputDefinition = stateDef;
138
- this._inputRuntimeDefinition = PartialStateSchema;
139
- this._outputDefinition = stateDef;
140
- this._outputRuntimeDefinition = fields;
141
- } else if (isStateGraphArgsWithInputOutputSchemas(fields)) {
142
- this._schemaDefinition = fields.input.spec;
143
- this._inputDefinition = fields.input.spec;
144
- this._outputDefinition = fields.output.spec;
145
- } else if (isStateGraphArgsWithStateSchema(fields)) {
146
- this._schemaDefinition = fields.stateSchema.spec;
147
- this._inputDefinition = fields.input?.spec ?? this._schemaDefinition;
148
- this._outputDefinition = fields.output?.spec ?? this._schemaDefinition;
149
- } else if (isStateDefinition(fields) || isAnnotationRoot(fields)) this._schemaDefinition = isAnnotationRoot(fields) ? fields.spec : fields;
150
- else if (isStateGraphArgs(fields)) this._schemaDefinition = _getChannels(fields.channels);
151
- else throw new StateGraphInputError();
152
- this._inputDefinition ??= this._schemaDefinition;
153
- this._outputDefinition ??= this._schemaDefinition;
116
+ const init = this._normalizeToStateGraphInit(stateOrInit, options);
117
+ const stateSchema = init.state ?? init.stateSchema ?? init.input;
118
+ if (!stateSchema) throw new StateGraphInputError();
119
+ const stateChannelDef = this._getChannelsFromSchema(stateSchema);
120
+ this._schemaDefinition = stateChannelDef;
121
+ if (StateSchema.isInstance(stateSchema)) this._schemaRuntimeDefinition = stateSchema;
122
+ else if (isInteropZodObject(stateSchema)) this._schemaRuntimeDefinition = stateSchema;
123
+ if (init.input) if (StateSchema.isInstance(init.input)) this._inputRuntimeDefinition = init.input;
124
+ else if (isInteropZodObject(init.input)) this._inputRuntimeDefinition = init.input;
125
+ else this._inputRuntimeDefinition = PartialStateSchema;
126
+ else this._inputRuntimeDefinition = PartialStateSchema;
127
+ if (init.output) if (StateSchema.isInstance(init.output)) this._outputRuntimeDefinition = init.output;
128
+ else if (isInteropZodObject(init.output)) this._outputRuntimeDefinition = init.output;
129
+ else this._outputRuntimeDefinition = this._schemaRuntimeDefinition;
130
+ else this._outputRuntimeDefinition = this._schemaRuntimeDefinition;
131
+ const inputChannelDef = init.input ? this._getChannelsFromSchema(init.input) : stateChannelDef;
132
+ const outputChannelDef = init.output ? this._getChannelsFromSchema(init.output) : stateChannelDef;
133
+ this._inputDefinition = inputChannelDef;
134
+ this._outputDefinition = outputChannelDef;
154
135
  this._addSchema(this._schemaDefinition);
155
136
  this._addSchema(this._inputDefinition);
156
137
  this._addSchema(this._outputDefinition);
157
- function isOptions(options) {
158
- return typeof options === "object" && options != null && !("spec" in options) && !isInteropZodObject(options);
138
+ if (init.context) {
139
+ if (isInteropZodObject(init.context)) this._configRuntimeSchema = init.context;
159
140
  }
160
- if (isOptions(contextSchema)) {
161
- if (isInteropZodObject(contextSchema.context)) this._configRuntimeSchema = contextSchema.context;
162
- this._interrupt = contextSchema.interrupt;
163
- this._writer = contextSchema.writer;
164
- } else if (isInteropZodObject(contextSchema)) this._configRuntimeSchema = contextSchema;
141
+ this._interrupt = init.interrupt;
142
+ this._writer = init.writer;
143
+ }
144
+ /**
145
+ * Normalize all constructor input patterns to a unified StateGraphInit object.
146
+ * @internal
147
+ */
148
+ _normalizeToStateGraphInit(stateOrInit, options) {
149
+ if (isStateGraphInit(stateOrInit)) {
150
+ if (isInteropZodObject(options) || AnnotationRoot.isInstance(options)) return {
151
+ ...stateOrInit,
152
+ context: options
153
+ };
154
+ const opts = options;
155
+ return {
156
+ ...stateOrInit,
157
+ input: stateOrInit.input ?? opts?.input,
158
+ output: stateOrInit.output ?? opts?.output,
159
+ context: stateOrInit.context ?? opts?.context,
160
+ interrupt: stateOrInit.interrupt ?? opts?.interrupt,
161
+ writer: stateOrInit.writer ?? opts?.writer,
162
+ nodes: stateOrInit.nodes ?? opts?.nodes
163
+ };
164
+ }
165
+ if (isStateDefinitionInit(stateOrInit)) {
166
+ if (isInteropZodObject(options) || AnnotationRoot.isInstance(options)) return {
167
+ state: stateOrInit,
168
+ context: options
169
+ };
170
+ const opts = options;
171
+ return {
172
+ state: stateOrInit,
173
+ input: opts?.input,
174
+ output: opts?.output,
175
+ context: opts?.context,
176
+ interrupt: opts?.interrupt,
177
+ writer: opts?.writer,
178
+ nodes: opts?.nodes
179
+ };
180
+ }
181
+ if (isStateGraphArgs(stateOrInit)) return { state: _getChannels(stateOrInit.channels) };
182
+ throw new StateGraphInputError();
183
+ }
184
+ /**
185
+ * Convert any supported schema type to a StateDefinition (channel map).
186
+ * @internal
187
+ */
188
+ _getChannelsFromSchema(schema) {
189
+ if (StateSchema.isInstance(schema)) return schema.getChannels();
190
+ if (isInteropZodObject(schema)) return this._metaRegistry.getChannelsForSchema(schema);
191
+ if (typeof schema === "object" && "lc_graph_name" in schema && schema.lc_graph_name === "AnnotationRoot") return schema.spec;
192
+ if (typeof schema === "object" && !Array.isArray(schema) && Object.keys(schema).length > 0) return schema;
193
+ throw new StateGraphInputError("Invalid schema type. Expected StateSchema, Zod object, AnnotationRoot, or StateDefinition.");
165
194
  }
166
195
  get allEdges() {
167
196
  return new Set([...this.edges, ...Array.from(this.waitingEdges).flatMap(([starts, end]) => starts.map((start) => [start, end]))]);
@@ -181,8 +210,8 @@ var StateGraph = class extends Graph {
181
210
  }
182
211
  }
183
212
  addNode(...args) {
184
- function isMultipleNodes(args$1) {
185
- return args$1.length >= 1 && typeof args$1[0] !== "string";
213
+ function isMultipleNodes(args) {
214
+ return args.length >= 1 && typeof args[0] !== "string";
186
215
  }
187
216
  const nodes = isMultipleNodes(args) ? Array.isArray(args[0]) ? args[0] : Object.entries(args[0]).map(([key, action]) => [key, action]) : [[
188
217
  args[0],
@@ -197,11 +226,8 @@ var StateGraph = class extends Graph {
197
226
  if (key in this.nodes) throw new Error(`Node \`${key}\` already present.`);
198
227
  if (key === END || key === START) throw new Error(`Node \`${key}\` is reserved.`);
199
228
  let inputSpec = this._schemaDefinition;
200
- if (options?.input !== void 0) {
201
- if (isInteropZodObject(options.input)) inputSpec = this._metaRegistry.getChannelsForSchema(options.input);
202
- else if (options.input.spec !== void 0) inputSpec = options.input.spec;
203
- }
204
- if (inputSpec !== void 0) this._addSchema(inputSpec);
229
+ if (options?.input !== void 0) inputSpec = this._getChannelsFromSchema(options.input);
230
+ this._addSchema(inputSpec);
205
231
  let runnable;
206
232
  if (Runnable.isRunnable(action)) runnable = action;
207
233
  else if (typeof action === "function") runnable = new RunnableCallable({
@@ -285,7 +311,7 @@ var StateGraph = class extends Graph {
285
311
  for (const [key] of Object.entries(this.nodes)) compiled.attachBranch(key, SELF, _getControlBranch(), { withReader: false });
286
312
  for (const [start, end] of this.edges) compiled.attachEdge(start, end);
287
313
  for (const [starts, end] of this.waitingEdges) compiled.attachEdge(starts, end);
288
- for (const [start, branches] of Object.entries(this.branches)) for (const [name$1, branch] of Object.entries(branches)) compiled.attachBranch(start, name$1, branch);
314
+ for (const [start, branches] of Object.entries(this.branches)) for (const [name, branch] of Object.entries(branches)) compiled.attachBranch(start, name, branch);
289
315
  return compiled.validate();
290
316
  }
291
317
  };
@@ -426,7 +452,15 @@ var CompiledStateGraph = class extends CompiledGraph {
426
452
  if (input == null) return input;
427
453
  const inputDef = this.builder._inputRuntimeDefinition;
428
454
  const schemaDef = this.builder._schemaRuntimeDefinition;
429
- if (StateSchema.isInstance(schemaDef)) {
455
+ if (StateSchema.isInstance(inputDef)) {
456
+ if (isCommand(input)) {
457
+ const parsedInput = input;
458
+ if (input.update) parsedInput.update = await inputDef.validateInput(Array.isArray(input.update) ? Object.fromEntries(input.update) : input.update);
459
+ return parsedInput;
460
+ }
461
+ return await inputDef.validateInput(input);
462
+ }
463
+ if (inputDef === PartialStateSchema && StateSchema.isInstance(schemaDef)) {
430
464
  if (isCommand(input)) {
431
465
  const parsedInput = input;
432
466
  if (input.update) parsedInput.update = await schemaDef.validateInput(Array.isArray(input.update) ? Object.fromEntries(input.update) : input.update);
@@ -435,9 +469,9 @@ var CompiledStateGraph = class extends CompiledGraph {
435
469
  return await schemaDef.validateInput(input);
436
470
  }
437
471
  const schema = (() => {
438
- const apply = (schema$1) => {
439
- if (schema$1 == null) return void 0;
440
- return this._metaRegistry.getExtendedChannelSchemas(schema$1, { withReducerSchema: true });
472
+ const apply = (schema) => {
473
+ if (schema == null) return void 0;
474
+ return this._metaRegistry.getExtendedChannelSchemas(schema, { withReducerSchema: true });
441
475
  };
442
476
  if (isInteropZodObject(inputDef)) return apply(inputDef);
443
477
  if (inputDef === PartialStateSchema) {
@@ -462,28 +496,14 @@ var CompiledStateGraph = class extends CompiledGraph {
462
496
  return config;
463
497
  }
464
498
  };
465
- function isStateDefinition(obj) {
466
- return typeof obj === "object" && obj !== null && !Array.isArray(obj) && Object.keys(obj).length > 0 && Object.values(obj).every((v) => typeof v === "function" || isBaseChannel(v));
467
- }
468
- function isAnnotationRoot(obj) {
469
- return typeof obj === "object" && obj !== null && "lc_graph_name" in obj && obj.lc_graph_name === "AnnotationRoot";
470
- }
499
+ /**
500
+ * Check if value is a legacy StateGraphArgs with channels.
501
+ * @internal
502
+ * @deprecated Use StateGraphInit instead
503
+ */
471
504
  function isStateGraphArgs(obj) {
472
505
  return typeof obj === "object" && obj !== null && obj.channels !== void 0;
473
506
  }
474
- function isStateGraphArgsWithStateSchema(obj) {
475
- return typeof obj === "object" && obj !== null && obj.stateSchema !== void 0;
476
- }
477
- function isStateGraphArgsWithInputOutputSchemas(obj) {
478
- return typeof obj === "object" && obj !== null && obj.stateSchema === void 0 && obj.input !== void 0 && obj.output !== void 0;
479
- }
480
- function isZodStateGraphArgsWithStateSchema(value) {
481
- if (typeof value !== "object" || value == null) return false;
482
- if (!("state" in value) || !isInteropZodObject(value.state)) return false;
483
- if ("input" in value && !isInteropZodObject(value.input)) return false;
484
- if ("output" in value && !isInteropZodObject(value.output)) return false;
485
- return true;
486
- }
487
507
  function _controlBranch(value) {
488
508
  if (_isSend(value)) return [value];
489
509
  const commands = [];
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","names":["args","name","schema"],"sources":["../../src/graph/state.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { _coerceToRunnable, Runnable } from \"@langchain/core/runnables\";\nimport {\n All,\n type BaseCache,\n BaseCheckpointSaver,\n BaseStore,\n} from \"@langchain/langgraph-checkpoint\";\nimport {\n type InteropZodObject,\n interopParse,\n interopZodObjectPartial,\n isInteropZodObject,\n} from \"@langchain/core/utils/types\";\nimport type {\n RunnableLike,\n LangGraphRunnableConfig,\n Runtime,\n} from \"../pregel/runnable_types.js\";\nimport { BaseChannel, isBaseChannel } from \"../channels/base.js\";\nimport {\n CompiledGraph,\n Graph,\n Branch,\n AddNodeOptions,\n NodeSpec,\n} from \"./graph.js\";\nimport {\n ChannelWrite,\n ChannelWriteEntry,\n ChannelWriteTupleEntry,\n PASSTHROUGH,\n} from \"../pregel/write.js\";\nimport { ChannelRead, PregelNode } from \"../pregel/read.js\";\nimport {\n NamedBarrierValue,\n NamedBarrierValueAfterFinish,\n} from \"../channels/named_barrier_value.js\";\nimport { EphemeralValue } from \"../channels/ephemeral_value.js\";\nimport { RunnableCallable } from \"../utils.js\";\nimport {\n isCommand,\n _isSend,\n CHECKPOINT_NAMESPACE_END,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n Command,\n SELF,\n Send,\n START,\n END,\n TAG_HIDDEN,\n CommandInstance,\n isInterrupted,\n Interrupt,\n INTERRUPT,\n} from \"../constants.js\";\nimport {\n InvalidUpdateError,\n ParentCommand,\n StateGraphInputError,\n} from \"../errors.js\";\nimport {\n AnnotationRoot,\n getChannel,\n SingleReducer,\n StateDefinition,\n StateType,\n} from \"./annotation.js\";\nimport { StateSchema } from \"../state/index.js\";\nimport type { CachePolicy, RetryPolicy } from \"../pregel/utils/index.js\";\nimport { isPregelLike } from \"../pregel/utils/subgraph.js\";\nimport { LastValueAfterFinish } from \"../channels/last_value.js\";\nimport { type SchemaMetaRegistry, schemaMetaRegistry } from \"./zod/meta.js\";\nimport type {\n InferInterruptResumeType,\n InferInterruptInputType,\n} from \"../interrupt.js\";\nimport type { InferWriterType } from \"../writer.js\";\nimport type { AnyStateSchema } from \"../state/schema.js\";\nimport {\n ExtractStateType,\n ExtractUpdateType,\n ToStateDefinition,\n type StateDefinitionInit,\n} from \"./types.js\";\n\nconst ROOT = \"__root__\";\n\nexport type ChannelReducers<Channels extends object> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K in keyof Channels]: SingleReducer<Channels[K], any>;\n};\n\nexport interface StateGraphArgs<Channels extends object | unknown> {\n channels: Channels extends object\n ? Channels extends unknown[]\n ? ChannelReducers<{ __root__: Channels }>\n : ChannelReducers<Channels>\n : ChannelReducers<{ __root__: Channels }>;\n}\n\nexport type StateGraphNodeSpec<RunInput, RunOutput> = NodeSpec<\n RunInput,\n RunOutput\n> & {\n input?: StateDefinition;\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy;\n};\n\nexport type StateGraphAddNodeOptions<Nodes extends string = string> = {\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy | boolean;\n // TODO: Fix generic typing for annotations\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: AnnotationRoot<any> | InteropZodObject;\n} & AddNodeOptions<Nodes>;\n\nexport type StateGraphArgsWithStateSchema<\n SD extends StateDefinition,\n I extends StateDefinition,\n O extends StateDefinition\n> = {\n stateSchema: AnnotationRoot<SD>;\n input?: AnnotationRoot<I>;\n output?: AnnotationRoot<O>;\n};\n\nexport type StateGraphArgsWithInputOutputSchemas<\n SD extends StateDefinition,\n O extends StateDefinition = SD\n> = {\n input: AnnotationRoot<SD>;\n output: AnnotationRoot<O>;\n};\n\ntype ZodStateGraphArgsWithStateSchema<\n SD extends InteropZodObject,\n I extends StateDefinitionInit,\n O extends StateDefinitionInit\n> = { state: SD; input?: I; output?: O };\n\ntype ExtractStateDefinition<T> = T extends AnyStateSchema\n ? T // Keep StateSchema as-is to preserve type information\n : T extends StateDefinitionInit\n ? ToStateDefinition<T>\n : StateDefinition;\n\ntype NodeAction<\n S,\n U,\n C extends StateDefinitionInit,\n InterruptType,\n WriterType\n> = RunnableLike<\n S,\n U extends object ? U & Record<string, any> : U, // eslint-disable-line @typescript-eslint/no-explicit-any\n Runtime<StateType<ToStateDefinition<C>>, InterruptType, WriterType>\n>;\n\ntype StrictNodeAction<\n S,\n U,\n C extends StateDefinitionInit,\n Nodes extends string,\n InterruptType,\n WriterType\n> = RunnableLike<\n Prettify<S>,\n | U\n | Command<\n InferInterruptResumeType<InterruptType>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n U & Record<string, any>,\n Nodes\n >,\n Runtime<StateType<ToStateDefinition<C>>, InterruptType, WriterType>\n>;\n\nconst PartialStateSchema = Symbol.for(\"langgraph.state.partial\");\ntype PartialStateSchema = typeof PartialStateSchema;\n\ntype MergeReturnType<Prev, Curr> = Prev & Curr extends infer T\n ? { [K in keyof T]: T[K] } & unknown\n : never;\n\ntype Prettify<T> = {\n [K in keyof T]: T[K];\n // eslint-disable-next-line @typescript-eslint/ban-types\n} & {};\n\n/**\n * A graph whose nodes communicate by reading and writing to a shared state.\n * Each node takes a defined `State` as input and returns a `Partial<State>`.\n *\n * Each state key can optionally be annotated with a reducer function that\n * will be used to aggregate the values of that key received from multiple nodes.\n * The signature of a reducer function is (left: Value, right: UpdateValue) => Value.\n *\n * See {@link Annotation} for more on defining state.\n *\n * After adding nodes and edges to your graph, you must call `.compile()` on it before\n * you can use it.\n *\n * @example\n * ```ts\n * import {\n * type BaseMessage,\n * AIMessage,\n * HumanMessage,\n * } from \"@langchain/core/messages\";\n * import { StateGraph, Annotation } from \"@langchain/langgraph\";\n *\n * // Define a state with a single key named \"messages\" that will\n * // combine a returned BaseMessage or arrays of BaseMessages\n * const StateAnnotation = Annotation.Root({\n * sentiment: Annotation<string>,\n * messages: Annotation<BaseMessage[]>({\n * reducer: (left: BaseMessage[], right: BaseMessage | BaseMessage[]) => {\n * if (Array.isArray(right)) {\n * return left.concat(right);\n * }\n * return left.concat([right]);\n * },\n * default: () => [],\n * }),\n * });\n *\n * const graphBuilder = new StateGraph(StateAnnotation);\n *\n * // A node in the graph that returns an object with a \"messages\" key\n * // will update the state by combining the existing value with the returned one.\n * const myNode = (state: typeof StateAnnotation.State) => {\n * return {\n * messages: [new AIMessage(\"Some new response\")],\n * sentiment: \"positive\",\n * };\n * };\n *\n * const graph = graphBuilder\n * .addNode(\"myNode\", myNode)\n * .addEdge(\"__start__\", \"myNode\")\n * .addEdge(\"myNode\", \"__end__\")\n * .compile();\n *\n * await graph.invoke({ messages: [new HumanMessage(\"how are you?\")] });\n *\n * // {\n * // messages: [HumanMessage(\"how are you?\"), AIMessage(\"Some new response\")],\n * // sentiment: \"positive\",\n * // }\n * ```\n */\nexport class StateGraph<\n SD extends StateDefinitionInit | unknown,\n S = ExtractStateType<SD>,\n U = ExtractUpdateType<SD, S>,\n N extends string = typeof START,\n I extends StateDefinitionInit = ExtractStateDefinition<SD>,\n O extends StateDefinitionInit = ExtractStateDefinition<SD>,\n C extends StateDefinitionInit = StateDefinition,\n NodeReturnType = unknown,\n InterruptType = unknown,\n WriterType = unknown\n> extends Graph<N, S, U, StateGraphNodeSpec<S, U>, ToStateDefinition<C>> {\n channels: Record<string, BaseChannel> = {};\n\n // TODO: this doesn't dedupe edges as in py, so worth fixing at some point\n waitingEdges: Set<[N[], N]> = new Set();\n\n /** @internal */\n _schemaDefinition: StateDefinition;\n\n /** @internal */\n _schemaRuntimeDefinition: InteropZodObject | AnyStateSchema | undefined;\n\n /** @internal */\n _inputDefinition: I;\n\n /** @internal */\n _inputRuntimeDefinition:\n | InteropZodObject\n | AnyStateSchema\n | PartialStateSchema\n | undefined;\n\n /** @internal */\n _outputDefinition: O;\n\n /** @internal */\n _outputRuntimeDefinition: InteropZodObject | AnyStateSchema | undefined;\n\n /**\n * Map schemas to managed values\n * @internal\n */\n _schemaDefinitions = new Map();\n\n /** @internal */\n _metaRegistry: SchemaMetaRegistry = schemaMetaRegistry;\n\n /** @internal Used only for typing. */\n _configSchema: ToStateDefinition<C> | undefined;\n\n /** @internal */\n _configRuntimeSchema: InteropZodObject | undefined;\n\n /** @internal */\n _interrupt: InterruptType;\n\n /** @internal */\n _writer: WriterType;\n\n declare Node: StrictNodeAction<S, U, C, N, InterruptType, WriterType>;\n\n constructor(\n state: SD extends StateDefinition ? AnnotationRoot<SD> : never,\n options?: {\n context?: C | AnnotationRoot<ToStateDefinition<C>>;\n input?: I | AnnotationRoot<ToStateDefinition<I>>;\n output?: O | AnnotationRoot<ToStateDefinition<O>>;\n\n interrupt?: InterruptType;\n writer?: WriterType;\n\n nodes?: N[];\n }\n );\n\n constructor(\n state: SD extends AnyStateSchema ? SD : never,\n options?: {\n context?: C | AnnotationRoot<ToStateDefinition<C>>;\n input?: I | AnnotationRoot<ToStateDefinition<I>>;\n output?: O | AnnotationRoot<ToStateDefinition<O>>;\n\n interrupt?: InterruptType;\n writer?: WriterType;\n\n nodes?: N[];\n }\n );\n\n constructor(\n state: SD extends InteropZodObject ? SD : never,\n options?: {\n context?: C | AnnotationRoot<ToStateDefinition<C>>;\n input?: I | AnnotationRoot<ToStateDefinition<I>>;\n output?: O | AnnotationRoot<ToStateDefinition<O>>;\n\n interrupt?: InterruptType;\n writer?: WriterType;\n\n nodes?: N[];\n }\n );\n\n constructor(\n fields: SD extends StateDefinition\n ? StateGraphArgsWithInputOutputSchemas<SD, ToStateDefinition<O>>\n : never,\n contextSchema?: C | AnnotationRoot<ToStateDefinition<C>>\n );\n\n constructor(\n fields: SD extends StateDefinition\n ?\n | AnnotationRoot<SD>\n | StateGraphArgsWithStateSchema<\n SD,\n ToStateDefinition<I>,\n ToStateDefinition<O>\n >\n : never,\n contextSchema?: C | AnnotationRoot<ToStateDefinition<C>>\n );\n\n /** @deprecated Use `Annotation.Root` or `zod` for state definition instead. */\n constructor(\n fields: SD extends StateDefinition\n ? SD | StateGraphArgs<S>\n : StateGraphArgs<S>,\n contextSchema?: C | AnnotationRoot<ToStateDefinition<C>>\n );\n\n constructor(\n fields: SD extends InteropZodObject\n ? SD | ZodStateGraphArgsWithStateSchema<SD, I, O>\n : never,\n contextSchema?: C | AnnotationRoot<ToStateDefinition<C>>\n );\n\n constructor(\n fields: SD extends AnyStateSchema\n ? SD\n : SD extends InteropZodObject\n ? SD | ZodStateGraphArgsWithStateSchema<SD, I, O>\n : SD extends StateDefinition\n ?\n | SD\n | AnnotationRoot<SD>\n | StateGraphArgs<S>\n | StateGraphArgsWithStateSchema<\n SD,\n ToStateDefinition<I>,\n ToStateDefinition<O>\n >\n | StateGraphArgsWithInputOutputSchemas<SD, ToStateDefinition<O>>\n : StateGraphArgs<S>,\n contextSchema?:\n | C\n | AnnotationRoot<ToStateDefinition<C>>\n | {\n input?: I | AnnotationRoot<ToStateDefinition<I>>;\n output?: O | AnnotationRoot<ToStateDefinition<O>>;\n context?: C | AnnotationRoot<ToStateDefinition<C>>;\n interrupt?: InterruptType;\n writer?: WriterType;\n nodes?: N[];\n }\n ) {\n super();\n\n if (StateSchema.isInstance(fields)) {\n const channels = fields.getChannels();\n this._schemaDefinition = channels;\n this.channels = channels;\n\n this._schemaRuntimeDefinition = fields;\n this._inputRuntimeDefinition = PartialStateSchema;\n this._outputRuntimeDefinition = fields;\n } else if (isZodStateGraphArgsWithStateSchema(fields)) {\n const stateDef = this._metaRegistry.getChannelsForSchema(fields.state);\n const inputDef =\n fields.input != null\n ? this._metaRegistry.getChannelsForSchema(fields.input)\n : stateDef;\n const outputDef =\n fields.output != null\n ? this._metaRegistry.getChannelsForSchema(fields.output)\n : stateDef;\n\n this._schemaDefinition = stateDef;\n this._schemaRuntimeDefinition = fields.state;\n\n this._inputDefinition = inputDef as I;\n this._inputRuntimeDefinition = fields.input ?? PartialStateSchema;\n\n this._outputDefinition = outputDef as O;\n this._outputRuntimeDefinition = fields.output ?? fields.state;\n } else if (isInteropZodObject(fields)) {\n const stateDef = this._metaRegistry.getChannelsForSchema(fields);\n\n this._schemaDefinition = stateDef;\n this._schemaRuntimeDefinition = fields;\n\n this._inputDefinition = stateDef as I;\n this._inputRuntimeDefinition = PartialStateSchema;\n\n this._outputDefinition = stateDef as O;\n this._outputRuntimeDefinition = fields;\n } else if (\n isStateGraphArgsWithInputOutputSchemas<\n SD extends StateDefinition ? SD : never,\n O extends StateDefinition ? O : never\n >(fields)\n ) {\n this._schemaDefinition = fields.input.spec;\n this._inputDefinition = fields.input.spec as unknown as I;\n this._outputDefinition = fields.output.spec;\n } else if (isStateGraphArgsWithStateSchema(fields)) {\n this._schemaDefinition = fields.stateSchema.spec;\n this._inputDefinition = (fields.input?.spec ??\n this._schemaDefinition) as I;\n this._outputDefinition = (fields.output?.spec ??\n this._schemaDefinition) as O;\n } else if (isStateDefinition(fields) || isAnnotationRoot(fields)) {\n const spec = isAnnotationRoot(fields) ? fields.spec : fields;\n this._schemaDefinition = spec;\n } else if (isStateGraphArgs(fields)) {\n const spec = _getChannels(fields.channels);\n this._schemaDefinition = spec;\n } else {\n throw new StateGraphInputError();\n }\n\n this._inputDefinition ??= this._schemaDefinition as I;\n this._outputDefinition ??= this._schemaDefinition as O;\n\n this._addSchema(this._schemaDefinition);\n this._addSchema(this._inputDefinition);\n this._addSchema(this._outputDefinition);\n\n function isOptions(options: unknown): options is {\n context?: C | AnnotationRoot<ToStateDefinition<C>>;\n input?: I | AnnotationRoot<ToStateDefinition<I>>;\n output?: O | AnnotationRoot<ToStateDefinition<O>>;\n interrupt?: InterruptType;\n writer?: WriterType;\n nodes?: N[];\n } {\n return (\n typeof options === \"object\" &&\n options != null &&\n !(\"spec\" in options) &&\n !isInteropZodObject(options)\n );\n }\n\n // Handle runtime config options\n if (isOptions(contextSchema)) {\n if (isInteropZodObject(contextSchema.context)) {\n this._configRuntimeSchema = contextSchema.context;\n }\n this._interrupt = contextSchema.interrupt as InterruptType;\n this._writer = contextSchema.writer as WriterType;\n } else if (isInteropZodObject(contextSchema)) {\n this._configRuntimeSchema = contextSchema;\n }\n }\n\n get allEdges(): Set<[string, string]> {\n return new Set([\n ...this.edges,\n ...Array.from(this.waitingEdges).flatMap(([starts, end]) =>\n starts.map((start) => [start, end] as [string, string])\n ),\n ]);\n }\n\n _addSchema(stateDefinition: StateDefinitionInit) {\n if (this._schemaDefinitions.has(stateDefinition)) {\n return;\n }\n // TODO: Support managed values\n this._schemaDefinitions.set(stateDefinition, stateDefinition);\n for (const [key, val] of Object.entries(stateDefinition)) {\n let channel;\n if (typeof val === \"function\") {\n channel = val();\n } else {\n channel = val;\n }\n if (this.channels[key] !== undefined) {\n if (!this.channels[key].equals(channel)) {\n if (channel.lc_graph_name !== \"LastValue\") {\n throw new Error(\n `Channel \"${key}\" already exists with a different type.`\n );\n }\n }\n } else {\n this.channels[key] = channel;\n }\n }\n }\n\n override addNode<\n K extends string,\n NodeMap extends Record<K, NodeAction<S, U, C, InterruptType, WriterType>>\n >(\n nodes: NodeMap\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<\n NodeReturnType,\n {\n [key in keyof NodeMap]: NodeMap[key] extends NodeAction<\n S,\n infer U,\n C,\n InterruptType,\n WriterType\n >\n ? U\n : never;\n }\n >\n >;\n\n override addNode<K extends string, NodeInput = S, NodeOutput extends U = U>(\n nodes:\n | [\n key: K,\n action: NodeAction<\n NodeInput,\n NodeOutput,\n C,\n InterruptType,\n WriterType\n >,\n options?: StateGraphAddNodeOptions\n ][]\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n\n override addNode<K extends string, NodeInput = S, NodeOutput extends U = U>(\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C, InterruptType, WriterType>,\n options?: StateGraphAddNodeOptions\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n\n override addNode<K extends string, NodeInput = S>(\n key: K,\n action: NodeAction<NodeInput, U, C, InterruptType, WriterType>,\n options?: StateGraphAddNodeOptions\n ): StateGraph<SD, S, U, N | K, I, O, C, NodeReturnType>;\n\n override addNode<K extends string, NodeInput = S, NodeOutput extends U = U>(\n ...args:\n | [\n key: K,\n action: NodeAction<\n NodeInput,\n NodeOutput,\n C,\n InterruptType,\n WriterType\n >,\n options?: StateGraphAddNodeOptions\n ]\n | [\n nodes:\n | Record<K, NodeAction<NodeInput, U, C, InterruptType, WriterType>>\n | [\n key: K,\n action: NodeAction<NodeInput, U, C, InterruptType, WriterType>,\n options?: StateGraphAddNodeOptions\n ][]\n ]\n ): StateGraph<SD, S, U, N | K, I, O, C> {\n function isMultipleNodes(\n args: unknown[]\n ): args is [\n nodes:\n | Record<K, NodeAction<NodeInput, U, C, InterruptType, WriterType>>\n | [\n key: K,\n action: NodeAction<NodeInput, U, C, InterruptType, WriterType>,\n options?: AddNodeOptions\n ][]\n ] {\n return args.length >= 1 && typeof args[0] !== \"string\";\n }\n\n const nodes = (\n isMultipleNodes(args) // eslint-disable-line no-nested-ternary\n ? Array.isArray(args[0])\n ? args[0]\n : Object.entries(args[0]).map(([key, action]) => [key, action])\n : [[args[0], args[1], args[2]]]\n ) as [\n K,\n NodeAction<NodeInput, U, C, InterruptType, WriterType>,\n StateGraphAddNodeOptions | undefined\n ][];\n\n if (nodes.length === 0) {\n throw new Error(\"No nodes provided in `addNode`\");\n }\n\n for (const [key, action, options] of nodes) {\n if (key in this.channels) {\n throw new Error(\n `${key} is already being used as a state attribute (a.k.a. a channel), cannot also be used as a node name.`\n );\n }\n\n for (const reservedChar of [\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CHECKPOINT_NAMESPACE_END,\n ]) {\n if (key.includes(reservedChar)) {\n throw new Error(\n `\"${reservedChar}\" is a reserved character and is not allowed in node names.`\n );\n }\n }\n this.warnIfCompiled(\n `Adding a node to a graph that has already been compiled. This will not be reflected in the compiled graph.`\n );\n\n if (key in this.nodes) {\n throw new Error(`Node \\`${key}\\` already present.`);\n }\n if (key === END || key === START) {\n throw new Error(`Node \\`${key}\\` is reserved.`);\n }\n\n let inputSpec = this._schemaDefinition;\n if (options?.input !== undefined) {\n if (isInteropZodObject(options.input)) {\n inputSpec = this._metaRegistry.getChannelsForSchema(options.input);\n } else if (options.input.spec !== undefined) {\n inputSpec = options.input.spec;\n }\n }\n if (inputSpec !== undefined) {\n this._addSchema(inputSpec);\n }\n\n let runnable;\n if (Runnable.isRunnable(action)) {\n runnable = action;\n } else if (typeof action === \"function\") {\n runnable = new RunnableCallable({\n func: action,\n name: key,\n trace: false,\n });\n } else {\n runnable = _coerceToRunnable(action);\n }\n\n let cachePolicy = options?.cachePolicy;\n if (typeof cachePolicy === \"boolean\") {\n cachePolicy = cachePolicy ? {} : undefined;\n }\n\n const nodeSpec: StateGraphNodeSpec<S, U> = {\n runnable: runnable as unknown as Runnable<S, U>,\n retryPolicy: options?.retryPolicy,\n cachePolicy,\n metadata: options?.metadata,\n input: inputSpec ?? this._schemaDefinition,\n subgraphs: isPregelLike(runnable)\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [runnable as any]\n : options?.subgraphs,\n ends: options?.ends,\n defer: options?.defer,\n };\n\n this.nodes[key as unknown as N] = nodeSpec;\n }\n\n return this as StateGraph<SD, S, U, N | K, I, O, C>;\n }\n\n override addEdge(\n startKey: typeof START | N | N[],\n endKey: N | typeof END\n ): this {\n if (typeof startKey === \"string\") {\n return super.addEdge(startKey, endKey);\n }\n\n if (this.compiled) {\n console.warn(\n \"Adding an edge to a graph that has already been compiled. This will \" +\n \"not be reflected in the compiled graph.\"\n );\n }\n\n for (const start of startKey) {\n if (start === END) {\n throw new Error(\"END cannot be a start node\");\n }\n if (!Object.keys(this.nodes).some((node) => node === start)) {\n throw new Error(`Need to add a node named \"${start}\" first`);\n }\n }\n if (endKey === END) {\n throw new Error(\"END cannot be an end node\");\n }\n if (!Object.keys(this.nodes).some((node) => node === endKey)) {\n throw new Error(`Need to add a node named \"${endKey}\" first`);\n }\n\n this.waitingEdges.add([startKey, endKey]);\n\n return this;\n }\n\n addSequence<K extends string, NodeInput = S, NodeOutput extends U = U>(\n nodes: [\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C, InterruptType, WriterType>,\n options?: StateGraphAddNodeOptions\n ][]\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n\n addSequence<\n K extends string,\n NodeMap extends Record<K, NodeAction<S, U, C, InterruptType, WriterType>>\n >(\n nodes: NodeMap\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<\n NodeReturnType,\n {\n [key in keyof NodeMap]: NodeMap[key] extends NodeAction<\n S,\n infer U,\n C,\n InterruptType,\n WriterType\n >\n ? U\n : never;\n }\n >\n >;\n\n addSequence<K extends string, NodeInput = S, NodeOutput extends U = U>(\n nodes:\n | [\n key: K,\n action: NodeAction<\n NodeInput,\n NodeOutput,\n C,\n InterruptType,\n WriterType\n >,\n options?: StateGraphAddNodeOptions\n ][]\n | Record<\n K,\n NodeAction<NodeInput, NodeOutput, C, InterruptType, WriterType>\n >\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n > {\n const parsedNodes = Array.isArray(nodes) ? nodes : Object.entries(nodes);\n\n if (parsedNodes.length === 0) {\n throw new Error(\"Sequence requires at least one node.\");\n }\n\n let previousNode: N | undefined;\n for (const [key, action, options] of parsedNodes) {\n if (key in this.nodes) {\n throw new Error(\n `Node names must be unique: node with the name \"${key}\" already exists.`\n );\n }\n\n const validKey = key as unknown as N;\n this.addNode(\n validKey,\n action as NodeAction<S, U, C, InterruptType, WriterType>,\n options\n );\n if (previousNode != null) {\n this.addEdge(previousNode, validKey);\n }\n\n previousNode = validKey;\n }\n\n return this as StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n }\n\n override compile({\n checkpointer,\n store,\n cache,\n interruptBefore,\n interruptAfter,\n name,\n description,\n }: {\n checkpointer?: BaseCheckpointSaver | boolean;\n store?: BaseStore;\n cache?: BaseCache;\n interruptBefore?: N[] | All;\n interruptAfter?: N[] | All;\n name?: string;\n description?: string;\n } = {}): CompiledStateGraph<\n Prettify<S>,\n Prettify<U>,\n N,\n I,\n O,\n C,\n NodeReturnType,\n InterruptType,\n WriterType\n > {\n // validate the graph\n this.validate([\n ...(Array.isArray(interruptBefore) ? interruptBefore : []),\n ...(Array.isArray(interruptAfter) ? interruptAfter : []),\n ]);\n\n // prepare output channels\n const outputKeys = Object.keys(\n this._schemaDefinitions.get(this._outputDefinition)\n );\n const outputChannels =\n outputKeys.length === 1 && outputKeys[0] === ROOT ? ROOT : outputKeys;\n\n const streamKeys = Object.keys(this.channels);\n const streamChannels =\n streamKeys.length === 1 && streamKeys[0] === ROOT ? ROOT : streamKeys;\n\n const userInterrupt = this._interrupt;\n // create empty compiled graph\n const compiled = new CompiledStateGraph<\n S,\n U,\n N,\n I,\n O,\n C,\n NodeReturnType,\n InterruptType,\n WriterType\n >({\n builder: this,\n checkpointer,\n interruptAfter,\n interruptBefore,\n autoValidate: false,\n nodes: {} as Record<N | typeof START, PregelNode<S, U>>,\n channels: {\n ...this.channels,\n [START]: new EphemeralValue(),\n } as Record<N | typeof START | typeof END | string, BaseChannel>,\n inputChannels: START,\n outputChannels,\n streamChannels,\n streamMode: \"updates\",\n store,\n cache,\n name,\n description,\n userInterrupt,\n });\n\n // attach nodes, edges and branches\n compiled.attachNode(START);\n for (const [key, node] of Object.entries<StateGraphNodeSpec<S, U>>(\n this.nodes\n )) {\n compiled.attachNode(key as N, node);\n }\n compiled.attachBranch(START, SELF, _getControlBranch() as Branch<S, N>, {\n withReader: false,\n });\n for (const [key] of Object.entries<StateGraphNodeSpec<S, U>>(this.nodes)) {\n compiled.attachBranch(\n key as N,\n SELF,\n _getControlBranch() as Branch<S, N>,\n {\n withReader: false,\n }\n );\n }\n for (const [start, end] of this.edges) {\n compiled.attachEdge(start, end);\n }\n for (const [starts, end] of this.waitingEdges) {\n compiled.attachEdge(starts, end);\n }\n for (const [start, branches] of Object.entries(this.branches)) {\n for (const [name, branch] of Object.entries(branches)) {\n compiled.attachBranch(start as N, name, branch);\n }\n }\n\n return compiled.validate();\n }\n}\n\nfunction _getChannels<Channels extends Record<string, unknown> | unknown>(\n schema: StateGraphArgs<Channels>[\"channels\"]\n): Record<string, BaseChannel> {\n const channels: Record<string, BaseChannel> = {};\n for (const [name, val] of Object.entries(schema)) {\n if (name === ROOT) {\n channels[name] = getChannel<Channels>(val as SingleReducer<Channels>);\n } else {\n const key = name as keyof Channels;\n channels[name] = getChannel<Channels[typeof key]>(\n val as SingleReducer<Channels[typeof key]>\n );\n }\n }\n return channels;\n}\n\n/**\n * Final result from building and compiling a {@link StateGraph}.\n * Should not be instantiated directly, only using the StateGraph `.compile()`\n * instance method.\n */\nexport class CompiledStateGraph<\n S,\n U,\n N extends string = typeof START,\n I extends StateDefinitionInit = StateDefinition,\n O extends StateDefinitionInit = StateDefinition,\n C extends StateDefinitionInit = StateDefinition,\n NodeReturnType = unknown,\n InterruptType = unknown,\n WriterType = unknown\n> extends CompiledGraph<\n N,\n S,\n U,\n ExtractStateType<C>,\n ExtractUpdateType<I, ExtractStateType<I>>,\n ExtractStateType<O>,\n NodeReturnType,\n CommandInstance<InferInterruptResumeType<InterruptType>, Prettify<U>, N>,\n InferWriterType<WriterType>\n> {\n declare builder: StateGraph<unknown, S, U, N, I, O, C, NodeReturnType>;\n\n /**\n * The description of the compiled graph.\n * This is used by the supervisor agent to describe the handoff to the agent.\n */\n description?: string;\n\n /** @internal */\n _metaRegistry: SchemaMetaRegistry = schemaMetaRegistry;\n\n constructor({\n description,\n ...rest\n }: { description?: string } & ConstructorParameters<\n typeof CompiledGraph<\n N,\n S,\n U,\n ExtractStateType<C>,\n ExtractUpdateType<I, ExtractStateType<I>>,\n ExtractStateType<O>,\n NodeReturnType,\n CommandInstance<InferInterruptResumeType<InterruptType>, Prettify<U>, N>,\n InferWriterType<WriterType>\n >\n >[0]) {\n super(rest);\n this.description = description;\n }\n\n attachNode(key: typeof START, node?: never): void;\n\n attachNode(key: N, node: StateGraphNodeSpec<S, U>): void;\n\n attachNode(key: N | typeof START, node?: StateGraphNodeSpec<S, U>): void {\n let outputKeys: string[];\n if (key === START) {\n // Get input schema keys excluding managed values\n outputKeys = Object.entries(\n this.builder._schemaDefinitions.get(this.builder._inputDefinition)\n ).map(([k]) => k);\n } else {\n outputKeys = Object.keys(this.builder.channels);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _getRoot(input: unknown): [string, any][] | null {\n if (isCommand(input)) {\n if (input.graph === Command.PARENT) {\n return null;\n }\n return input._updateAsTuples();\n } else if (\n Array.isArray(input) &&\n input.length > 0 &&\n input.some((i) => isCommand(i))\n ) {\n const updates: [string, unknown][] = [];\n for (const i of input) {\n if (isCommand(i)) {\n if (i.graph === Command.PARENT) {\n continue;\n }\n updates.push(...i._updateAsTuples());\n } else {\n updates.push([ROOT, i]);\n }\n }\n return updates;\n } else if (input != null) {\n return [[ROOT, input]];\n }\n return null;\n }\n\n // to avoid name collision below\n const nodeKey = key;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _getUpdates(input: U): [string, any][] | null {\n if (!input) {\n return null;\n } else if (isCommand(input)) {\n if (input.graph === Command.PARENT) {\n return null;\n }\n return input._updateAsTuples().filter(([k]) => outputKeys.includes(k));\n } else if (\n Array.isArray(input) &&\n input.length > 0 &&\n input.some(isCommand)\n ) {\n const updates: [string, unknown][] = [];\n for (const item of input) {\n if (isCommand(item)) {\n if (item.graph === Command.PARENT) {\n continue;\n }\n updates.push(\n ...item._updateAsTuples().filter(([k]) => outputKeys.includes(k))\n );\n } else {\n const itemUpdates = _getUpdates(item);\n if (itemUpdates) {\n updates.push(...(itemUpdates ?? []));\n }\n }\n }\n return updates;\n } else if (typeof input === \"object\" && !Array.isArray(input)) {\n return Object.entries(input).filter(([k]) => outputKeys.includes(k));\n } else {\n const typeofInput = Array.isArray(input) ? \"array\" : typeof input;\n throw new InvalidUpdateError(\n `Expected node \"${nodeKey.toString()}\" to return an object or an array containing at least one Command object, received ${typeofInput}`,\n {\n lc_error_code: \"INVALID_GRAPH_NODE_RETURN_VALUE\",\n }\n );\n }\n }\n\n const stateWriteEntries: (ChannelWriteTupleEntry | ChannelWriteEntry)[] = [\n {\n value: PASSTHROUGH,\n mapper: new RunnableCallable({\n func:\n outputKeys.length && outputKeys[0] === ROOT\n ? _getRoot\n : _getUpdates,\n trace: false,\n recurse: false,\n }),\n },\n ];\n\n // add node and output channel\n if (key === START) {\n this.nodes[key] = new PregelNode<S, U>({\n tags: [TAG_HIDDEN],\n triggers: [START],\n channels: [START],\n writers: [new ChannelWrite(stateWriteEntries, [TAG_HIDDEN])],\n });\n } else {\n const inputDefinition = node?.input ?? this.builder._schemaDefinition;\n const inputValues = Object.fromEntries(\n Object.keys(this.builder._schemaDefinitions.get(inputDefinition)).map(\n (k) => [k, k]\n )\n );\n const isSingleInput =\n Object.keys(inputValues).length === 1 && ROOT in inputValues;\n const branchChannel = `branch:to:${key}` as string | N;\n this.channels[branchChannel] = node?.defer\n ? new LastValueAfterFinish()\n : new EphemeralValue(false);\n this.nodes[key] = new PregelNode<S, U>({\n triggers: [branchChannel],\n // read state keys\n channels: isSingleInput ? Object.keys(inputValues) : inputValues,\n // publish to state keys\n writers: [new ChannelWrite(stateWriteEntries, [TAG_HIDDEN])],\n mapper: isSingleInput\n ? undefined\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (input: Record<string, any>) => {\n return Object.fromEntries(\n Object.entries(input).filter(([k]) => k in inputValues)\n );\n },\n bound: node?.runnable,\n metadata: node?.metadata,\n retryPolicy: node?.retryPolicy,\n cachePolicy: node?.cachePolicy,\n subgraphs: node?.subgraphs,\n ends: node?.ends,\n });\n }\n }\n\n attachEdge(starts: N | N[] | \"__start__\", end: N | \"__end__\"): void {\n if (end === END) return;\n if (typeof starts === \"string\") {\n this.nodes[starts].writers.push(\n new ChannelWrite(\n [{ channel: `branch:to:${end}`, value: null }],\n [TAG_HIDDEN]\n )\n );\n } else if (Array.isArray(starts)) {\n const channelName = `join:${starts.join(\"+\")}:${end}`;\n // register channel\n this.channels[channelName as string | N] = this.builder.nodes[end].defer\n ? new NamedBarrierValueAfterFinish(new Set(starts))\n : new NamedBarrierValue(new Set(starts));\n // subscribe to channel\n this.nodes[end].triggers.push(channelName);\n // publish to channel\n for (const start of starts) {\n this.nodes[start].writers.push(\n new ChannelWrite(\n [{ channel: channelName, value: start }],\n [TAG_HIDDEN]\n )\n );\n }\n }\n }\n\n attachBranch(\n start: N | typeof START,\n _: string,\n branch: Branch<S, N>,\n options: { withReader?: boolean } = { withReader: true }\n ): void {\n const branchWriter = async (\n packets: (string | Send)[],\n config: LangGraphRunnableConfig\n ) => {\n const filteredPackets = packets.filter((p) => p !== END);\n if (!filteredPackets.length) return;\n\n const writes: (ChannelWriteEntry | Send)[] = filteredPackets.map((p) => {\n if (_isSend(p)) return p;\n return { channel: p === END ? p : `branch:to:${p}`, value: start };\n });\n await ChannelWrite.doWrite(\n { ...config, tags: (config.tags ?? []).concat([TAG_HIDDEN]) },\n writes\n );\n };\n // attach branch publisher\n this.nodes[start].writers.push(\n branch.run(\n branchWriter,\n // reader\n options.withReader\n ? (config) =>\n ChannelRead.doRead<S>(\n config,\n this.streamChannels ?? this.outputChannels,\n true\n )\n : undefined\n )\n );\n }\n\n protected async _validateInput(\n input: ExtractUpdateType<I, ExtractStateType<I>>\n ): Promise<ExtractUpdateType<I, ExtractStateType<I>>> {\n if (input == null) return input;\n\n const inputDef = this.builder._inputRuntimeDefinition;\n const schemaDef = this.builder._schemaRuntimeDefinition;\n\n // Handle StateSchema validation\n if (StateSchema.isInstance(schemaDef)) {\n if (isCommand(input)) {\n const parsedInput = input;\n if (input.update) {\n parsedInput.update = await schemaDef.validateInput(\n Array.isArray(input.update)\n ? Object.fromEntries(input.update)\n : input.update\n );\n }\n return parsedInput;\n }\n return await schemaDef.validateInput(input);\n }\n\n // Handle InteropZodObject validation\n const schema = (() => {\n const apply = (schema: InteropZodObject | undefined) => {\n if (schema == null) return undefined;\n return this._metaRegistry.getExtendedChannelSchemas(schema, {\n withReducerSchema: true,\n });\n };\n\n if (isInteropZodObject(inputDef)) return apply(inputDef);\n if (inputDef === PartialStateSchema) {\n if (isInteropZodObject(schemaDef)) {\n return interopZodObjectPartial(apply(schemaDef)!);\n }\n return undefined;\n }\n return undefined;\n })();\n\n if (isCommand(input)) {\n const parsedInput = input;\n if (input.update && schema != null)\n parsedInput.update = interopParse(schema, input.update);\n return parsedInput;\n }\n if (schema != null) return interopParse(schema, input);\n return input;\n }\n\n public isInterrupted(input: unknown): input is {\n [INTERRUPT]: Interrupt<InferInterruptInputType<InterruptType>>[];\n } {\n return isInterrupted(input);\n }\n\n protected async _validateContext(\n config: Partial<Record<string, unknown>>\n ): Promise<Partial<Record<string, unknown>>> {\n const configSchema = this.builder._configRuntimeSchema;\n if (isInteropZodObject(configSchema)) interopParse(configSchema, config);\n return config;\n }\n}\n\nfunction isStateDefinition(obj: unknown): obj is StateDefinition {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n !Array.isArray(obj) &&\n Object.keys(obj).length > 0 &&\n Object.values(obj).every((v) => typeof v === \"function\" || isBaseChannel(v))\n );\n}\n\nfunction isAnnotationRoot<SD extends StateDefinition>(\n obj: unknown | AnnotationRoot<SD>\n): obj is AnnotationRoot<SD> {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"lc_graph_name\" in obj &&\n obj.lc_graph_name === \"AnnotationRoot\"\n );\n}\n\nfunction isStateGraphArgs<Channels extends object | unknown>(\n obj: unknown | StateGraphArgs<Channels>\n): obj is StateGraphArgs<Channels> {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as StateGraphArgs<Channels>).channels !== undefined\n );\n}\n\nfunction isStateGraphArgsWithStateSchema<\n SD extends StateDefinition,\n I extends StateDefinition,\n O extends StateDefinition\n>(\n obj: unknown | StateGraphArgsWithStateSchema<SD, I, O>\n): obj is StateGraphArgsWithStateSchema<SD, I, O> {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as StateGraphArgsWithStateSchema<SD, I, O>).stateSchema !== undefined\n );\n}\n\nfunction isStateGraphArgsWithInputOutputSchemas<\n SD extends StateDefinition,\n O extends StateDefinition\n>(\n obj: unknown | StateGraphArgsWithInputOutputSchemas<SD, O>\n): obj is StateGraphArgsWithInputOutputSchemas<SD, O> {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (obj as any).stateSchema === undefined &&\n (obj as StateGraphArgsWithInputOutputSchemas<SD, O>).input !== undefined &&\n (obj as StateGraphArgsWithInputOutputSchemas<SD, O>).output !== undefined\n );\n}\n\nfunction isZodStateGraphArgsWithStateSchema<\n SD extends InteropZodObject,\n I extends InteropZodObject,\n O extends InteropZodObject\n>(value: unknown): value is ZodStateGraphArgsWithStateSchema<SD, I, O> {\n if (typeof value !== \"object\" || value == null) {\n return false;\n }\n\n if (!(\"state\" in value) || !isInteropZodObject(value.state)) {\n return false;\n }\n\n if (\"input\" in value && !isInteropZodObject(value.input)) {\n return false;\n }\n\n if (\"output\" in value && !isInteropZodObject(value.output)) {\n return false;\n }\n\n return true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _controlBranch(value: any): (string | Send)[] {\n if (_isSend(value)) {\n return [value];\n }\n const commands = [];\n if (isCommand(value)) {\n commands.push(value);\n } else if (Array.isArray(value)) {\n commands.push(...value.filter(isCommand));\n }\n const destinations: (string | Send)[] = [];\n\n for (const command of commands) {\n if (command.graph === Command.PARENT) {\n throw new ParentCommand(command);\n }\n\n if (_isSend(command.goto)) {\n destinations.push(command.goto);\n } else if (typeof command.goto === \"string\") {\n destinations.push(command.goto);\n } else {\n if (Array.isArray(command.goto)) {\n destinations.push(...command.goto);\n }\n }\n }\n return destinations;\n}\n\nfunction _getControlBranch() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const CONTROL_BRANCH_PATH = new RunnableCallable<any, (string | Send)[]>({\n func: _controlBranch,\n tags: [TAG_HIDDEN],\n trace: false,\n recurse: false,\n name: \"<control_branch>\",\n });\n return new Branch({\n path: CONTROL_BRANCH_PATH,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"state.js","names":[],"sources":["../../src/graph/state.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport { _coerceToRunnable, Runnable } from \"@langchain/core/runnables\";\nimport {\n All,\n type BaseCache,\n BaseCheckpointSaver,\n BaseStore,\n} from \"@langchain/langgraph-checkpoint\";\nimport {\n type InteropZodObject,\n interopParse,\n interopZodObjectPartial,\n isInteropZodObject,\n} from \"@langchain/core/utils/types\";\nimport type {\n RunnableLike,\n LangGraphRunnableConfig,\n Runtime,\n} from \"../pregel/runnable_types.js\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport {\n CompiledGraph,\n Graph,\n Branch,\n AddNodeOptions,\n NodeSpec,\n} from \"./graph.js\";\nimport {\n ChannelWrite,\n ChannelWriteEntry,\n ChannelWriteTupleEntry,\n PASSTHROUGH,\n} from \"../pregel/write.js\";\nimport { ChannelRead, PregelNode } from \"../pregel/read.js\";\nimport {\n NamedBarrierValue,\n NamedBarrierValueAfterFinish,\n} from \"../channels/named_barrier_value.js\";\nimport { EphemeralValue } from \"../channels/ephemeral_value.js\";\nimport { RunnableCallable } from \"../utils.js\";\nimport {\n isCommand,\n _isSend,\n CHECKPOINT_NAMESPACE_END,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n Command,\n SELF,\n Send,\n START,\n END,\n TAG_HIDDEN,\n CommandInstance,\n isInterrupted,\n Interrupt,\n INTERRUPT,\n} from \"../constants.js\";\nimport {\n InvalidUpdateError,\n ParentCommand,\n StateGraphInputError,\n} from \"../errors.js\";\nimport {\n AnnotationRoot,\n getChannel,\n SingleReducer,\n StateDefinition,\n StateType,\n} from \"./annotation.js\";\nimport { StateSchema } from \"../state/index.js\";\nimport type { CachePolicy, RetryPolicy } from \"../pregel/utils/index.js\";\nimport { isPregelLike } from \"../pregel/utils/subgraph.js\";\nimport { LastValueAfterFinish } from \"../channels/last_value.js\";\nimport { type SchemaMetaRegistry, schemaMetaRegistry } from \"./zod/meta.js\";\nimport type {\n InferInterruptResumeType,\n InferInterruptInputType,\n} from \"../interrupt.js\";\nimport type { InferWriterType } from \"../writer.js\";\nimport type { AnyStateSchema } from \"../state/schema.js\";\nimport {\n ContextSchemaInit,\n ExtractStateType,\n ExtractUpdateType,\n isStateDefinitionInit,\n isStateGraphInit,\n StateGraphInit,\n StateGraphOptions,\n ToStateDefinition,\n type StateDefinitionInit,\n} from \"./types.js\";\n\nconst ROOT = \"__root__\";\n\nexport type ChannelReducers<Channels extends object> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K in keyof Channels]: SingleReducer<Channels[K], any>;\n};\n\nexport interface StateGraphArgs<Channels extends object | unknown> {\n channels: Channels extends object\n ? Channels extends unknown[]\n ? ChannelReducers<{ __root__: Channels }>\n : ChannelReducers<Channels>\n : ChannelReducers<{ __root__: Channels }>;\n}\n\nexport type StateGraphNodeSpec<RunInput, RunOutput> = NodeSpec<\n RunInput,\n RunOutput\n> & {\n input?: StateDefinition;\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy;\n};\n\n/**\n * Options for StateGraph.addNode() method.\n *\n * @template Nodes - Node name constraints\n * @template InputSchema - Per-node input schema type (inferred from options.input)\n */\nexport type StateGraphAddNodeOptions<\n Nodes extends string = string,\n InputSchema extends StateDefinitionInit | undefined =\n | StateDefinitionInit\n | undefined\n> = {\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy | boolean;\n input?: InputSchema;\n} & AddNodeOptions<Nodes>;\n\nexport type StateGraphArgsWithStateSchema<\n SD extends StateDefinition,\n I extends StateDefinition,\n O extends StateDefinition\n> = {\n stateSchema: AnnotationRoot<SD>;\n input?: AnnotationRoot<I>;\n output?: AnnotationRoot<O>;\n};\n\nexport type StateGraphArgsWithInputOutputSchemas<\n SD extends StateDefinition,\n O extends StateDefinition = SD\n> = {\n input: AnnotationRoot<SD>;\n output: AnnotationRoot<O>;\n};\n\ntype ExtractStateDefinition<T> = T extends AnyStateSchema\n ? T // Keep StateSchema as-is to preserve type information\n : T extends StateDefinitionInit\n ? ToStateDefinition<T>\n : StateDefinition;\n\ntype NodeAction<\n S,\n U,\n C extends StateDefinitionInit,\n InterruptType,\n WriterType\n> = RunnableLike<\n S,\n U extends object ? U & Record<string, any> : U, // eslint-disable-line @typescript-eslint/no-explicit-any\n Runtime<StateType<ToStateDefinition<C>>, InterruptType, WriterType>\n>;\n\ntype StrictNodeAction<\n S,\n U,\n C extends StateDefinitionInit,\n Nodes extends string,\n InterruptType,\n WriterType\n> = RunnableLike<\n Prettify<S>,\n | U\n | Command<\n InferInterruptResumeType<InterruptType>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n U & Record<string, any>,\n Nodes\n >,\n Runtime<StateType<ToStateDefinition<C>>, InterruptType, WriterType>\n>;\n\nconst PartialStateSchema = Symbol.for(\"langgraph.state.partial\");\ntype PartialStateSchema = typeof PartialStateSchema;\n\ntype MergeReturnType<Prev, Curr> = Prev & Curr extends infer T\n ? { [K in keyof T]: T[K] } & unknown\n : never;\n\ntype Prettify<T> = {\n [K in keyof T]: T[K];\n // eslint-disable-next-line @typescript-eslint/ban-types\n} & {};\n\n/**\n * A graph whose nodes communicate by reading and writing to a shared state.\n * Each node takes a defined `State` as input and returns a `Partial<State>`.\n *\n * Each state key can optionally be annotated with a reducer function that\n * will be used to aggregate the values of that key received from multiple nodes.\n * The signature of a reducer function is (left: Value, right: UpdateValue) => Value.\n *\n * See {@link Annotation} for more on defining state.\n *\n * After adding nodes and edges to your graph, you must call `.compile()` on it before\n * you can use it.\n *\n * @example\n * ```ts\n * import {\n * type BaseMessage,\n * AIMessage,\n * HumanMessage,\n * } from \"@langchain/core/messages\";\n * import { StateGraph, Annotation } from \"@langchain/langgraph\";\n *\n * // Define a state with a single key named \"messages\" that will\n * // combine a returned BaseMessage or arrays of BaseMessages\n * const StateAnnotation = Annotation.Root({\n * sentiment: Annotation<string>,\n * messages: Annotation<BaseMessage[]>({\n * reducer: (left: BaseMessage[], right: BaseMessage | BaseMessage[]) => {\n * if (Array.isArray(right)) {\n * return left.concat(right);\n * }\n * return left.concat([right]);\n * },\n * default: () => [],\n * }),\n * });\n *\n * const graphBuilder = new StateGraph(StateAnnotation);\n *\n * // A node in the graph that returns an object with a \"messages\" key\n * // will update the state by combining the existing value with the returned one.\n * const myNode = (state: typeof StateAnnotation.State) => {\n * return {\n * messages: [new AIMessage(\"Some new response\")],\n * sentiment: \"positive\",\n * };\n * };\n *\n * const graph = graphBuilder\n * .addNode(\"myNode\", myNode)\n * .addEdge(\"__start__\", \"myNode\")\n * .addEdge(\"myNode\", \"__end__\")\n * .compile();\n *\n * await graph.invoke({ messages: [new HumanMessage(\"how are you?\")] });\n *\n * // {\n * // messages: [HumanMessage(\"how are you?\"), AIMessage(\"Some new response\")],\n * // sentiment: \"positive\",\n * // }\n * ```\n */\nexport class StateGraph<\n SD extends StateDefinitionInit | unknown,\n S = ExtractStateType<SD>,\n U = ExtractUpdateType<SD, S>,\n N extends string = typeof START,\n I extends StateDefinitionInit = ExtractStateDefinition<SD>,\n O extends StateDefinitionInit = ExtractStateDefinition<SD>,\n C extends StateDefinitionInit = StateDefinition,\n NodeReturnType = unknown,\n InterruptType = unknown,\n WriterType = unknown\n> extends Graph<N, S, U, StateGraphNodeSpec<S, U>, ToStateDefinition<C>> {\n channels: Record<string, BaseChannel> = {};\n\n // TODO: this doesn't dedupe edges as in py, so worth fixing at some point\n waitingEdges: Set<[N[], N]> = new Set();\n\n /** @internal */\n _schemaDefinition: StateDefinition;\n\n /** @internal */\n _schemaRuntimeDefinition: InteropZodObject | AnyStateSchema | undefined;\n\n /** @internal */\n _inputDefinition: I;\n\n /** @internal */\n _inputRuntimeDefinition:\n | InteropZodObject\n | AnyStateSchema\n | PartialStateSchema\n | undefined;\n\n /** @internal */\n _outputDefinition: O;\n\n /** @internal */\n _outputRuntimeDefinition: InteropZodObject | AnyStateSchema | undefined;\n\n /**\n * Map schemas to managed values\n * @internal\n */\n _schemaDefinitions = new Map();\n\n /** @internal */\n _metaRegistry: SchemaMetaRegistry = schemaMetaRegistry;\n\n /** @internal Used only for typing. */\n _configSchema: ToStateDefinition<C> | undefined;\n\n /** @internal */\n _configRuntimeSchema: InteropZodObject | undefined;\n\n /** @internal */\n _interrupt: InterruptType;\n\n /** @internal */\n _writer: WriterType;\n\n declare Node: StrictNodeAction<S, U, C, N, InterruptType, WriterType>;\n\n /**\n * Create a new StateGraph for building stateful, multi-step workflows.\n *\n * Accepts state definitions via `Annotation.Root`, `StateSchema`, or Zod schemas.\n *\n * @example Direct schema\n * ```ts\n * const StateAnnotation = Annotation.Root({\n * messages: Annotation<string[]>({ reducer: (a, b) => [...a, ...b] }),\n * });\n * const graph = new StateGraph(StateAnnotation);\n * ```\n *\n * @example Direct schema with input/output filtering\n * ```ts\n * const graph = new StateGraph(StateAnnotation, {\n * input: InputSchema,\n * output: OutputSchema,\n * });\n * ```\n *\n * @example Object pattern with state, input, output\n * ```ts\n * const graph = new StateGraph({\n * state: FullStateSchema,\n * input: InputSchema,\n * output: OutputSchema,\n * });\n * ```\n *\n * @example Input/output only (state inferred from input)\n * ```ts\n * const graph = new StateGraph({\n * input: InputAnnotation,\n * output: OutputAnnotation,\n * });\n * ```\n */\n constructor(\n state: SD extends StateDefinitionInit ? SD : never,\n options?:\n | C\n | AnnotationRoot<ToStateDefinition<C>>\n | StateGraphOptions<I, O, C, N, InterruptType, WriterType>\n );\n\n constructor(\n fields: SD extends StateDefinition\n ? StateGraphArgsWithInputOutputSchemas<SD, ToStateDefinition<O>>\n : never,\n contextSchema?: C | AnnotationRoot<ToStateDefinition<C>>\n );\n\n constructor(\n fields: SD extends StateDefinition\n ?\n | AnnotationRoot<SD>\n | StateGraphArgsWithStateSchema<\n SD,\n ToStateDefinition<I>,\n ToStateDefinition<O>\n >\n : never,\n contextSchema?: C | AnnotationRoot<ToStateDefinition<C>>\n );\n\n constructor(\n init: Omit<\n StateGraphInit<\n SD extends StateDefinitionInit ? SD : StateDefinitionInit,\n SD extends StateDefinitionInit ? SD : StateDefinitionInit,\n O,\n C extends ContextSchemaInit ? C : undefined,\n N,\n InterruptType,\n WriterType\n >,\n \"state\" | \"stateSchema\" | \"input\"\n > & {\n input: SD extends StateDefinitionInit ? SD : never;\n state?: never;\n stateSchema?: never;\n },\n contextSchema?: C | AnnotationRoot<ToStateDefinition<C>>\n );\n\n constructor(\n init: StateGraphInit<\n SD extends StateDefinitionInit ? SD : StateDefinitionInit,\n I,\n O,\n C extends ContextSchemaInit ? C : undefined,\n N,\n InterruptType,\n WriterType\n >\n );\n\n /** @deprecated Use `Annotation.Root`, `StateSchema`, or Zod schemas instead. */\n constructor(\n fields: StateGraphArgs<S>,\n contextSchema?: C | AnnotationRoot<ToStateDefinition<C>>\n );\n\n constructor(\n stateOrInit:\n | StateDefinitionInit\n | StateGraphInit<StateDefinitionInit, I, O>\n | StateGraphArgs<S>,\n options?:\n | C\n | AnnotationRoot<ToStateDefinition<C>>\n | StateGraphOptions<\n I,\n O,\n C extends ContextSchemaInit ? C : undefined,\n N,\n InterruptType,\n WriterType\n >\n ) {\n super();\n\n // Normalize all input patterns to StateGraphInit format\n const init = this._normalizeToStateGraphInit(stateOrInit, options);\n\n // Resolve state schema: state > stateSchema (deprecated) > input\n const stateSchema = init.state ?? init.stateSchema ?? init.input;\n if (!stateSchema) {\n throw new StateGraphInputError();\n }\n\n // Get channel definitions from the schema (may contain channel factories)\n const stateChannelDef = this._getChannelsFromSchema(stateSchema);\n\n // Set schema definitions (these may contain channel factories)\n this._schemaDefinition = stateChannelDef;\n\n // Set runtime definitions for validation\n if (StateSchema.isInstance(stateSchema)) {\n this._schemaRuntimeDefinition = stateSchema;\n } else if (isInteropZodObject(stateSchema)) {\n this._schemaRuntimeDefinition = stateSchema;\n }\n\n // Set input runtime definition\n if (init.input) {\n if (StateSchema.isInstance(init.input)) {\n this._inputRuntimeDefinition = init.input;\n } else if (isInteropZodObject(init.input)) {\n this._inputRuntimeDefinition = init.input;\n } else {\n this._inputRuntimeDefinition = PartialStateSchema;\n }\n } else {\n this._inputRuntimeDefinition = PartialStateSchema;\n }\n\n // Set output runtime definition\n if (init.output) {\n if (StateSchema.isInstance(init.output)) {\n this._outputRuntimeDefinition = init.output;\n } else if (isInteropZodObject(init.output)) {\n this._outputRuntimeDefinition = init.output;\n } else {\n this._outputRuntimeDefinition = this._schemaRuntimeDefinition;\n }\n } else {\n this._outputRuntimeDefinition = this._schemaRuntimeDefinition;\n }\n\n // Set input/output definitions (default to state)\n const inputChannelDef = init.input\n ? this._getChannelsFromSchema(init.input)\n : stateChannelDef;\n const outputChannelDef = init.output\n ? (this._getChannelsFromSchema(init.output) as O)\n : stateChannelDef;\n this._inputDefinition = inputChannelDef as I;\n this._outputDefinition = outputChannelDef as O;\n\n // Add all schemas (_addSchema instantiates channel factories and populates this.channels)\n this._addSchema(this._schemaDefinition);\n this._addSchema(this._inputDefinition);\n this._addSchema(this._outputDefinition);\n\n // Handle context schema\n if (init.context) {\n if (isInteropZodObject(init.context)) {\n this._configRuntimeSchema = init.context;\n }\n }\n\n // Handle interrupt and writer\n this._interrupt = init.interrupt as InterruptType;\n this._writer = init.writer as WriterType;\n }\n\n /**\n * Normalize all constructor input patterns to a unified StateGraphInit object.\n * @internal\n */\n private _normalizeToStateGraphInit(\n stateOrInit: unknown,\n options?: unknown\n ): StateGraphInit<StateDefinitionInit, I, O, C> {\n // Check if already StateGraphInit format\n if (isStateGraphInit(stateOrInit)) {\n // Second arg can be either a direct context schema or an options object\n if (isInteropZodObject(options) || AnnotationRoot.isInstance(options)) {\n return {\n ...stateOrInit,\n context: options as C,\n };\n }\n // Merge any 2nd arg options\n const opts = options as StateGraphOptions<I, O> | undefined;\n return {\n ...stateOrInit,\n input: stateOrInit.input ?? opts?.input,\n output: stateOrInit.output ?? opts?.output,\n context: stateOrInit.context ?? opts?.context,\n interrupt: stateOrInit.interrupt ?? opts?.interrupt,\n writer: stateOrInit.writer ?? opts?.writer,\n nodes: stateOrInit.nodes ?? opts?.nodes,\n } as StateGraphInit<StateDefinitionInit, I, O, C>;\n }\n\n // Check if direct schema (StateSchema, Zod, Annotation, StateDefinition)\n if (isStateDefinitionInit(stateOrInit)) {\n // Second arg can be either a direct context schema or an options object\n if (isInteropZodObject(options) || AnnotationRoot.isInstance(options)) {\n return {\n state: stateOrInit,\n context: options as C,\n };\n }\n const opts = options as StateGraphOptions<I, O> | undefined;\n return {\n state: stateOrInit as StateDefinitionInit,\n input: opts?.input as I,\n output: opts?.output as O,\n context: opts?.context,\n interrupt: opts?.interrupt,\n writer: opts?.writer,\n nodes: opts?.nodes,\n };\n }\n\n // Check for legacy { channels } format\n if (isStateGraphArgs(stateOrInit as StateGraphArgs<S>)) {\n const legacyArgs = stateOrInit as StateGraphArgs<S>;\n const spec = _getChannels(legacyArgs.channels);\n return {\n state: spec as StateDefinitionInit,\n };\n }\n\n throw new StateGraphInputError();\n }\n\n /**\n * Convert any supported schema type to a StateDefinition (channel map).\n * @internal\n */\n private _getChannelsFromSchema(schema: StateDefinitionInit): StateDefinition {\n if (StateSchema.isInstance(schema)) {\n return schema.getChannels();\n }\n\n if (isInteropZodObject(schema)) {\n return this._metaRegistry.getChannelsForSchema(schema);\n }\n\n // AnnotationRoot - has .spec property that is the StateDefinition\n if (\n typeof schema === \"object\" &&\n \"lc_graph_name\" in schema &&\n (schema as { lc_graph_name: unknown }).lc_graph_name === \"AnnotationRoot\"\n ) {\n return (schema as AnnotationRoot<StateDefinition>).spec;\n }\n\n // StateDefinition (raw channel map) - return as-is\n if (\n typeof schema === \"object\" &&\n !Array.isArray(schema) &&\n Object.keys(schema).length > 0\n ) {\n return schema as StateDefinition;\n }\n\n throw new StateGraphInputError(\n \"Invalid schema type. Expected StateSchema, Zod object, AnnotationRoot, or StateDefinition.\"\n );\n }\n\n get allEdges(): Set<[string, string]> {\n return new Set([\n ...this.edges,\n ...Array.from(this.waitingEdges).flatMap(([starts, end]) =>\n starts.map((start) => [start, end] as [string, string])\n ),\n ]);\n }\n\n _addSchema(stateDefinition: StateDefinitionInit) {\n if (this._schemaDefinitions.has(stateDefinition)) {\n return;\n }\n // TODO: Support managed values\n this._schemaDefinitions.set(stateDefinition, stateDefinition);\n for (const [key, val] of Object.entries(stateDefinition)) {\n let channel;\n if (typeof val === \"function\") {\n channel = val();\n } else {\n channel = val;\n }\n if (this.channels[key] !== undefined) {\n if (!this.channels[key].equals(channel)) {\n if (channel.lc_graph_name !== \"LastValue\") {\n throw new Error(\n `Channel \"${key}\" already exists with a different type.`\n );\n }\n }\n } else {\n this.channels[key] = channel;\n }\n }\n }\n\n override addNode<\n K extends string,\n NodeMap extends Record<K, NodeAction<S, U, C, InterruptType, WriterType>>\n >(\n nodes: NodeMap\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<\n NodeReturnType,\n {\n [key in keyof NodeMap]: NodeMap[key] extends NodeAction<\n S,\n infer U,\n C,\n InterruptType,\n WriterType\n >\n ? U\n : never;\n }\n >\n >;\n\n override addNode<K extends string, NodeInput = S, NodeOutput extends U = U>(\n nodes:\n | [\n key: K,\n action: NodeAction<\n NodeInput,\n NodeOutput,\n C,\n InterruptType,\n WriterType\n >,\n options?: StateGraphAddNodeOptions\n ][]\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n\n override addNode<\n K extends string,\n InputSchema extends StateDefinitionInit,\n NodeOutput extends U = U\n >(\n key: K,\n action: NodeAction<\n ExtractStateType<InputSchema>,\n NodeOutput,\n C,\n InterruptType,\n WriterType\n >,\n options: StateGraphAddNodeOptions<N | K, InputSchema>\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n\n override addNode<\n K extends string,\n InputSchema extends StateDefinitionInit,\n NodeOutput extends U = U\n >(\n key: K,\n action: NodeAction<\n ExtractStateType<InputSchema>,\n NodeOutput,\n C,\n InterruptType,\n WriterType\n >,\n options: StateGraphAddNodeOptions<N | K, InputSchema>\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n\n override addNode<K extends string, NodeInput = S, NodeOutput extends U = U>(\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C, InterruptType, WriterType>,\n options?: StateGraphAddNodeOptions\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n\n override addNode<K extends string, NodeInput = S>(\n key: K,\n action: NodeAction<NodeInput, U, C, InterruptType, WriterType>,\n options?: StateGraphAddNodeOptions\n ): StateGraph<SD, S, U, N | K, I, O, C, NodeReturnType>;\n\n override addNode<K extends string, NodeInput = S, NodeOutput extends U = U>(\n ...args:\n | [\n key: K,\n action: NodeAction<\n NodeInput,\n NodeOutput,\n C,\n InterruptType,\n WriterType\n >,\n options?: StateGraphAddNodeOptions\n ]\n | [\n nodes:\n | Record<K, NodeAction<NodeInput, U, C, InterruptType, WriterType>>\n | [\n key: K,\n action: NodeAction<NodeInput, U, C, InterruptType, WriterType>,\n options?: StateGraphAddNodeOptions\n ][]\n ]\n ): StateGraph<SD, S, U, N | K, I, O, C> {\n function isMultipleNodes(\n args: unknown[]\n ): args is [\n nodes:\n | Record<K, NodeAction<NodeInput, U, C, InterruptType, WriterType>>\n | [\n key: K,\n action: NodeAction<NodeInput, U, C, InterruptType, WriterType>,\n options?: AddNodeOptions\n ][]\n ] {\n return args.length >= 1 && typeof args[0] !== \"string\";\n }\n\n const nodes = (\n isMultipleNodes(args) // eslint-disable-line no-nested-ternary\n ? Array.isArray(args[0])\n ? args[0]\n : Object.entries(args[0]).map(([key, action]) => [key, action])\n : [[args[0], args[1], args[2]]]\n ) as [\n K,\n NodeAction<NodeInput, U, C, InterruptType, WriterType>,\n StateGraphAddNodeOptions | undefined\n ][];\n\n if (nodes.length === 0) {\n throw new Error(\"No nodes provided in `addNode`\");\n }\n\n for (const [key, action, options] of nodes) {\n if (key in this.channels) {\n throw new Error(\n `${key} is already being used as a state attribute (a.k.a. a channel), cannot also be used as a node name.`\n );\n }\n\n for (const reservedChar of [\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CHECKPOINT_NAMESPACE_END,\n ]) {\n if (key.includes(reservedChar)) {\n throw new Error(\n `\"${reservedChar}\" is a reserved character and is not allowed in node names.`\n );\n }\n }\n this.warnIfCompiled(\n `Adding a node to a graph that has already been compiled. This will not be reflected in the compiled graph.`\n );\n\n if (key in this.nodes) {\n throw new Error(`Node \\`${key}\\` already present.`);\n }\n if (key === END || key === START) {\n throw new Error(`Node \\`${key}\\` is reserved.`);\n }\n\n let inputSpec: StateDefinition = this._schemaDefinition;\n if (options?.input !== undefined) {\n inputSpec = this._getChannelsFromSchema(options.input);\n }\n this._addSchema(inputSpec);\n\n let runnable;\n if (Runnable.isRunnable(action)) {\n runnable = action;\n } else if (typeof action === \"function\") {\n runnable = new RunnableCallable({\n func: action,\n name: key,\n trace: false,\n });\n } else {\n runnable = _coerceToRunnable(action);\n }\n\n let cachePolicy = options?.cachePolicy;\n if (typeof cachePolicy === \"boolean\") {\n cachePolicy = cachePolicy ? {} : undefined;\n }\n\n const nodeSpec: StateGraphNodeSpec<S, U> = {\n runnable: runnable as unknown as Runnable<S, U>,\n retryPolicy: options?.retryPolicy,\n cachePolicy,\n metadata: options?.metadata,\n input: inputSpec ?? this._schemaDefinition,\n subgraphs: isPregelLike(runnable)\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [runnable as any]\n : options?.subgraphs,\n ends: options?.ends,\n defer: options?.defer,\n };\n\n this.nodes[key as unknown as N] = nodeSpec;\n }\n\n return this as StateGraph<SD, S, U, N | K, I, O, C>;\n }\n\n override addEdge(\n startKey: typeof START | N | N[],\n endKey: N | typeof END\n ): this {\n if (typeof startKey === \"string\") {\n return super.addEdge(startKey, endKey);\n }\n\n if (this.compiled) {\n console.warn(\n \"Adding an edge to a graph that has already been compiled. This will \" +\n \"not be reflected in the compiled graph.\"\n );\n }\n\n for (const start of startKey) {\n if (start === END) {\n throw new Error(\"END cannot be a start node\");\n }\n if (!Object.keys(this.nodes).some((node) => node === start)) {\n throw new Error(`Need to add a node named \"${start}\" first`);\n }\n }\n if (endKey === END) {\n throw new Error(\"END cannot be an end node\");\n }\n if (!Object.keys(this.nodes).some((node) => node === endKey)) {\n throw new Error(`Need to add a node named \"${endKey}\" first`);\n }\n\n this.waitingEdges.add([startKey, endKey]);\n\n return this;\n }\n\n addSequence<K extends string, NodeInput = S, NodeOutput extends U = U>(\n nodes: [\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C, InterruptType, WriterType>,\n options?: StateGraphAddNodeOptions\n ][]\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n\n addSequence<\n K extends string,\n NodeMap extends Record<K, NodeAction<S, U, C, InterruptType, WriterType>>\n >(\n nodes: NodeMap\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<\n NodeReturnType,\n {\n [key in keyof NodeMap]: NodeMap[key] extends NodeAction<\n S,\n infer U,\n C,\n InterruptType,\n WriterType\n >\n ? U\n : never;\n }\n >\n >;\n\n addSequence<K extends string, NodeInput = S, NodeOutput extends U = U>(\n nodes:\n | [\n key: K,\n action: NodeAction<\n NodeInput,\n NodeOutput,\n C,\n InterruptType,\n WriterType\n >,\n options?: StateGraphAddNodeOptions\n ][]\n | Record<\n K,\n NodeAction<NodeInput, NodeOutput, C, InterruptType, WriterType>\n >\n ): StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n > {\n const parsedNodes = Array.isArray(nodes) ? nodes : Object.entries(nodes);\n\n if (parsedNodes.length === 0) {\n throw new Error(\"Sequence requires at least one node.\");\n }\n\n let previousNode: N | undefined;\n for (const [key, action, options] of parsedNodes) {\n if (key in this.nodes) {\n throw new Error(\n `Node names must be unique: node with the name \"${key}\" already exists.`\n );\n }\n\n const validKey = key as unknown as N;\n this.addNode(\n validKey,\n action as NodeAction<S, U, C, InterruptType, WriterType>,\n options\n );\n if (previousNode != null) {\n this.addEdge(previousNode, validKey);\n }\n\n previousNode = validKey;\n }\n\n return this as StateGraph<\n SD,\n S,\n U,\n N | K,\n I,\n O,\n C,\n MergeReturnType<NodeReturnType, { [key in K]: NodeOutput }>\n >;\n }\n\n override compile({\n checkpointer,\n store,\n cache,\n interruptBefore,\n interruptAfter,\n name,\n description,\n }: {\n checkpointer?: BaseCheckpointSaver | boolean;\n store?: BaseStore;\n cache?: BaseCache;\n interruptBefore?: N[] | All;\n interruptAfter?: N[] | All;\n name?: string;\n description?: string;\n } = {}): CompiledStateGraph<\n Prettify<S>,\n Prettify<U>,\n N,\n I,\n O,\n C,\n NodeReturnType,\n InterruptType,\n WriterType\n > {\n // validate the graph\n this.validate([\n ...(Array.isArray(interruptBefore) ? interruptBefore : []),\n ...(Array.isArray(interruptAfter) ? interruptAfter : []),\n ]);\n\n // prepare output channels\n const outputKeys = Object.keys(\n this._schemaDefinitions.get(this._outputDefinition)\n );\n const outputChannels =\n outputKeys.length === 1 && outputKeys[0] === ROOT ? ROOT : outputKeys;\n\n const streamKeys = Object.keys(this.channels);\n const streamChannels =\n streamKeys.length === 1 && streamKeys[0] === ROOT ? ROOT : streamKeys;\n\n const userInterrupt = this._interrupt;\n // create empty compiled graph\n const compiled = new CompiledStateGraph<\n S,\n U,\n N,\n I,\n O,\n C,\n NodeReturnType,\n InterruptType,\n WriterType\n >({\n builder: this,\n checkpointer,\n interruptAfter,\n interruptBefore,\n autoValidate: false,\n nodes: {} as Record<N | typeof START, PregelNode<S, U>>,\n channels: {\n ...this.channels,\n [START]: new EphemeralValue(),\n } as Record<N | typeof START | typeof END | string, BaseChannel>,\n inputChannels: START,\n outputChannels,\n streamChannels,\n streamMode: \"updates\",\n store,\n cache,\n name,\n description,\n userInterrupt,\n });\n\n // attach nodes, edges and branches\n compiled.attachNode(START);\n for (const [key, node] of Object.entries<StateGraphNodeSpec<S, U>>(\n this.nodes\n )) {\n compiled.attachNode(key as N, node);\n }\n compiled.attachBranch(START, SELF, _getControlBranch() as Branch<S, N>, {\n withReader: false,\n });\n for (const [key] of Object.entries<StateGraphNodeSpec<S, U>>(this.nodes)) {\n compiled.attachBranch(\n key as N,\n SELF,\n _getControlBranch() as Branch<S, N>,\n {\n withReader: false,\n }\n );\n }\n for (const [start, end] of this.edges) {\n compiled.attachEdge(start, end);\n }\n for (const [starts, end] of this.waitingEdges) {\n compiled.attachEdge(starts, end);\n }\n for (const [start, branches] of Object.entries(this.branches)) {\n for (const [name, branch] of Object.entries(branches)) {\n compiled.attachBranch(start as N, name, branch);\n }\n }\n\n return compiled.validate();\n }\n}\n\nfunction _getChannels<Channels extends Record<string, unknown> | unknown>(\n schema: StateGraphArgs<Channels>[\"channels\"]\n): Record<string, BaseChannel> {\n const channels: Record<string, BaseChannel> = {};\n for (const [name, val] of Object.entries(schema)) {\n if (name === ROOT) {\n channels[name] = getChannel<Channels>(val as SingleReducer<Channels>);\n } else {\n const key = name as keyof Channels;\n channels[name] = getChannel<Channels[typeof key]>(\n val as SingleReducer<Channels[typeof key]>\n );\n }\n }\n return channels;\n}\n\n/**\n * Final result from building and compiling a {@link StateGraph}.\n * Should not be instantiated directly, only using the StateGraph `.compile()`\n * instance method.\n */\nexport class CompiledStateGraph<\n S,\n U,\n N extends string = typeof START,\n I extends StateDefinitionInit = StateDefinition,\n O extends StateDefinitionInit = StateDefinition,\n C extends StateDefinitionInit = StateDefinition,\n NodeReturnType = unknown,\n InterruptType = unknown,\n WriterType = unknown\n> extends CompiledGraph<\n N,\n S,\n U,\n ExtractStateType<C>,\n ExtractUpdateType<I, ExtractStateType<I>>,\n ExtractStateType<O>,\n NodeReturnType,\n CommandInstance<InferInterruptResumeType<InterruptType>, Prettify<U>, N>,\n InferWriterType<WriterType>\n> {\n declare builder: StateGraph<unknown, S, U, N, I, O, C, NodeReturnType>;\n\n /**\n * The description of the compiled graph.\n * This is used by the supervisor agent to describe the handoff to the agent.\n */\n description?: string;\n\n /** @internal */\n _metaRegistry: SchemaMetaRegistry = schemaMetaRegistry;\n\n constructor({\n description,\n ...rest\n }: { description?: string } & ConstructorParameters<\n typeof CompiledGraph<\n N,\n S,\n U,\n ExtractStateType<C>,\n ExtractUpdateType<I, ExtractStateType<I>>,\n ExtractStateType<O>,\n NodeReturnType,\n CommandInstance<InferInterruptResumeType<InterruptType>, Prettify<U>, N>,\n InferWriterType<WriterType>\n >\n >[0]) {\n super(rest);\n this.description = description;\n }\n\n attachNode(key: typeof START, node?: never): void;\n\n attachNode(key: N, node: StateGraphNodeSpec<S, U>): void;\n\n attachNode(key: N | typeof START, node?: StateGraphNodeSpec<S, U>): void {\n let outputKeys: string[];\n if (key === START) {\n // Get input schema keys excluding managed values\n outputKeys = Object.entries(\n this.builder._schemaDefinitions.get(this.builder._inputDefinition)\n ).map(([k]) => k);\n } else {\n outputKeys = Object.keys(this.builder.channels);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _getRoot(input: unknown): [string, any][] | null {\n if (isCommand(input)) {\n if (input.graph === Command.PARENT) {\n return null;\n }\n return input._updateAsTuples();\n } else if (\n Array.isArray(input) &&\n input.length > 0 &&\n input.some((i) => isCommand(i))\n ) {\n const updates: [string, unknown][] = [];\n for (const i of input) {\n if (isCommand(i)) {\n if (i.graph === Command.PARENT) {\n continue;\n }\n updates.push(...i._updateAsTuples());\n } else {\n updates.push([ROOT, i]);\n }\n }\n return updates;\n } else if (input != null) {\n return [[ROOT, input]];\n }\n return null;\n }\n\n // to avoid name collision below\n const nodeKey = key;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _getUpdates(input: U): [string, any][] | null {\n if (!input) {\n return null;\n } else if (isCommand(input)) {\n if (input.graph === Command.PARENT) {\n return null;\n }\n return input._updateAsTuples().filter(([k]) => outputKeys.includes(k));\n } else if (\n Array.isArray(input) &&\n input.length > 0 &&\n input.some(isCommand)\n ) {\n const updates: [string, unknown][] = [];\n for (const item of input) {\n if (isCommand(item)) {\n if (item.graph === Command.PARENT) {\n continue;\n }\n updates.push(\n ...item._updateAsTuples().filter(([k]) => outputKeys.includes(k))\n );\n } else {\n const itemUpdates = _getUpdates(item);\n if (itemUpdates) {\n updates.push(...(itemUpdates ?? []));\n }\n }\n }\n return updates;\n } else if (typeof input === \"object\" && !Array.isArray(input)) {\n return Object.entries(input).filter(([k]) => outputKeys.includes(k));\n } else {\n const typeofInput = Array.isArray(input) ? \"array\" : typeof input;\n throw new InvalidUpdateError(\n `Expected node \"${nodeKey.toString()}\" to return an object or an array containing at least one Command object, received ${typeofInput}`,\n {\n lc_error_code: \"INVALID_GRAPH_NODE_RETURN_VALUE\",\n }\n );\n }\n }\n\n const stateWriteEntries: (ChannelWriteTupleEntry | ChannelWriteEntry)[] = [\n {\n value: PASSTHROUGH,\n mapper: new RunnableCallable({\n func:\n outputKeys.length && outputKeys[0] === ROOT\n ? _getRoot\n : _getUpdates,\n trace: false,\n recurse: false,\n }),\n },\n ];\n\n // add node and output channel\n if (key === START) {\n this.nodes[key] = new PregelNode<S, U>({\n tags: [TAG_HIDDEN],\n triggers: [START],\n channels: [START],\n writers: [new ChannelWrite(stateWriteEntries, [TAG_HIDDEN])],\n });\n } else {\n const inputDefinition = node?.input ?? this.builder._schemaDefinition;\n const inputValues = Object.fromEntries(\n Object.keys(this.builder._schemaDefinitions.get(inputDefinition)).map(\n (k) => [k, k]\n )\n );\n const isSingleInput =\n Object.keys(inputValues).length === 1 && ROOT in inputValues;\n const branchChannel = `branch:to:${key}` as string | N;\n this.channels[branchChannel] = node?.defer\n ? new LastValueAfterFinish()\n : new EphemeralValue(false);\n this.nodes[key] = new PregelNode<S, U>({\n triggers: [branchChannel],\n // read state keys\n channels: isSingleInput ? Object.keys(inputValues) : inputValues,\n // publish to state keys\n writers: [new ChannelWrite(stateWriteEntries, [TAG_HIDDEN])],\n mapper: isSingleInput\n ? undefined\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (input: Record<string, any>) => {\n return Object.fromEntries(\n Object.entries(input).filter(([k]) => k in inputValues)\n );\n },\n bound: node?.runnable,\n metadata: node?.metadata,\n retryPolicy: node?.retryPolicy,\n cachePolicy: node?.cachePolicy,\n subgraphs: node?.subgraphs,\n ends: node?.ends,\n });\n }\n }\n\n attachEdge(starts: N | N[] | \"__start__\", end: N | \"__end__\"): void {\n if (end === END) return;\n if (typeof starts === \"string\") {\n this.nodes[starts].writers.push(\n new ChannelWrite(\n [{ channel: `branch:to:${end}`, value: null }],\n [TAG_HIDDEN]\n )\n );\n } else if (Array.isArray(starts)) {\n const channelName = `join:${starts.join(\"+\")}:${end}`;\n // register channel\n this.channels[channelName as string | N] = this.builder.nodes[end].defer\n ? new NamedBarrierValueAfterFinish(new Set(starts))\n : new NamedBarrierValue(new Set(starts));\n // subscribe to channel\n this.nodes[end].triggers.push(channelName);\n // publish to channel\n for (const start of starts) {\n this.nodes[start].writers.push(\n new ChannelWrite(\n [{ channel: channelName, value: start }],\n [TAG_HIDDEN]\n )\n );\n }\n }\n }\n\n attachBranch(\n start: N | typeof START,\n _: string,\n branch: Branch<S, N>,\n options: { withReader?: boolean } = { withReader: true }\n ): void {\n const branchWriter = async (\n packets: (string | Send)[],\n config: LangGraphRunnableConfig\n ) => {\n const filteredPackets = packets.filter((p) => p !== END);\n if (!filteredPackets.length) return;\n\n const writes: (ChannelWriteEntry | Send)[] = filteredPackets.map((p) => {\n if (_isSend(p)) return p;\n return { channel: p === END ? p : `branch:to:${p}`, value: start };\n });\n await ChannelWrite.doWrite(\n { ...config, tags: (config.tags ?? []).concat([TAG_HIDDEN]) },\n writes\n );\n };\n // attach branch publisher\n this.nodes[start].writers.push(\n branch.run(\n branchWriter,\n // reader\n options.withReader\n ? (config) =>\n ChannelRead.doRead<S>(\n config,\n this.streamChannels ?? this.outputChannels,\n true\n )\n : undefined\n )\n );\n }\n\n protected async _validateInput(\n input: ExtractUpdateType<I, ExtractStateType<I>>\n ): Promise<ExtractUpdateType<I, ExtractStateType<I>>> {\n if (input == null) return input;\n\n const inputDef = this.builder._inputRuntimeDefinition;\n const schemaDef = this.builder._schemaRuntimeDefinition;\n\n // Determine which schema to use for validation\n // Priority: inputDef (if it's a validatable schema), otherwise fall back to schemaDef\n\n // Handle StateSchema validation for input schema\n if (StateSchema.isInstance(inputDef)) {\n if (isCommand(input)) {\n const parsedInput = input;\n if (input.update) {\n parsedInput.update = await inputDef.validateInput(\n Array.isArray(input.update)\n ? Object.fromEntries(input.update)\n : input.update\n );\n }\n return parsedInput;\n }\n return await inputDef.validateInput(input);\n }\n\n // Handle StateSchema validation for state schema (when input is partial state)\n if (inputDef === PartialStateSchema && StateSchema.isInstance(schemaDef)) {\n if (isCommand(input)) {\n const parsedInput = input;\n if (input.update) {\n parsedInput.update = await schemaDef.validateInput(\n Array.isArray(input.update)\n ? Object.fromEntries(input.update)\n : input.update\n );\n }\n return parsedInput;\n }\n return await schemaDef.validateInput(input);\n }\n\n // Handle InteropZodObject validation\n const schema = (() => {\n const apply = (schema: InteropZodObject | undefined) => {\n if (schema == null) return undefined;\n return this._metaRegistry.getExtendedChannelSchemas(schema, {\n withReducerSchema: true,\n });\n };\n\n if (isInteropZodObject(inputDef)) return apply(inputDef);\n if (inputDef === PartialStateSchema) {\n if (isInteropZodObject(schemaDef)) {\n return interopZodObjectPartial(apply(schemaDef)!);\n }\n return undefined;\n }\n return undefined;\n })();\n\n if (isCommand(input)) {\n const parsedInput = input;\n if (input.update && schema != null)\n parsedInput.update = interopParse(schema, input.update);\n return parsedInput;\n }\n if (schema != null) return interopParse(schema, input);\n return input;\n }\n\n public isInterrupted(input: unknown): input is {\n [INTERRUPT]: Interrupt<InferInterruptInputType<InterruptType>>[];\n } {\n return isInterrupted(input);\n }\n\n protected async _validateContext(\n config: Partial<Record<string, unknown>>\n ): Promise<Partial<Record<string, unknown>>> {\n const configSchema = this.builder._configRuntimeSchema;\n if (isInteropZodObject(configSchema)) interopParse(configSchema, config);\n return config;\n }\n}\n\n/**\n * Check if value is a legacy StateGraphArgs with channels.\n * @internal\n * @deprecated Use StateGraphInit instead\n */\nfunction isStateGraphArgs<Channels extends object | unknown>(\n obj: unknown | StateGraphArgs<Channels>\n): obj is StateGraphArgs<Channels> {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n (obj as StateGraphArgs<Channels>).channels !== undefined\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _controlBranch(value: any): (string | Send)[] {\n if (_isSend(value)) {\n return [value];\n }\n const commands = [];\n if (isCommand(value)) {\n commands.push(value);\n } else if (Array.isArray(value)) {\n commands.push(...value.filter(isCommand));\n }\n const destinations: (string | Send)[] = [];\n\n for (const command of commands) {\n if (command.graph === Command.PARENT) {\n throw new ParentCommand(command);\n }\n\n if (_isSend(command.goto)) {\n destinations.push(command.goto);\n } else if (typeof command.goto === \"string\") {\n destinations.push(command.goto);\n } else {\n if (Array.isArray(command.goto)) {\n destinations.push(...command.goto);\n }\n }\n }\n return destinations;\n}\n\nfunction _getControlBranch() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const CONTROL_BRANCH_PATH = new RunnableCallable<any, (string | Send)[]>({\n func: _controlBranch,\n tags: [TAG_HIDDEN],\n trace: false,\n recurse: false,\n name: \"<control_branch>\",\n });\n return new Branch({\n path: CONTROL_BRANCH_PATH,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA2FA,MAAM,OAAO;AAgGb,MAAM,qBAAqB,OAAO,IAAI,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0EhE,IAAa,aAAb,cAWU,MAA+D;CACvE,WAAwC,EAAE;CAG1C,+BAA8B,IAAI,KAAK;;CAGvC;;CAGA;;CAGA;;CAGA;;CAOA;;CAGA;;;;;CAMA,qCAAqB,IAAI,KAAK;;CAG9B,gBAAoC;;CAGpC;;CAGA;;CAGA;;CAGA;CA4GA,YACE,aAIA,SAWA;AACA,SAAO;EAGP,MAAM,OAAO,KAAK,2BAA2B,aAAa,QAAQ;EAGlE,MAAM,cAAc,KAAK,SAAS,KAAK,eAAe,KAAK;AAC3D,MAAI,CAAC,YACH,OAAM,IAAI,sBAAsB;EAIlC,MAAM,kBAAkB,KAAK,uBAAuB,YAAY;AAGhE,OAAK,oBAAoB;AAGzB,MAAI,YAAY,WAAW,YAAY,CACrC,MAAK,2BAA2B;WACvB,mBAAmB,YAAY,CACxC,MAAK,2BAA2B;AAIlC,MAAI,KAAK,MACP,KAAI,YAAY,WAAW,KAAK,MAAM,CACpC,MAAK,0BAA0B,KAAK;WAC3B,mBAAmB,KAAK,MAAM,CACvC,MAAK,0BAA0B,KAAK;MAEpC,MAAK,0BAA0B;MAGjC,MAAK,0BAA0B;AAIjC,MAAI,KAAK,OACP,KAAI,YAAY,WAAW,KAAK,OAAO,CACrC,MAAK,2BAA2B,KAAK;WAC5B,mBAAmB,KAAK,OAAO,CACxC,MAAK,2BAA2B,KAAK;MAErC,MAAK,2BAA2B,KAAK;MAGvC,MAAK,2BAA2B,KAAK;EAIvC,MAAM,kBAAkB,KAAK,QACzB,KAAK,uBAAuB,KAAK,MAAM,GACvC;EACJ,MAAM,mBAAmB,KAAK,SACzB,KAAK,uBAAuB,KAAK,OAAO,GACzC;AACJ,OAAK,mBAAmB;AACxB,OAAK,oBAAoB;AAGzB,OAAK,WAAW,KAAK,kBAAkB;AACvC,OAAK,WAAW,KAAK,iBAAiB;AACtC,OAAK,WAAW,KAAK,kBAAkB;AAGvC,MAAI,KAAK,SACP;OAAI,mBAAmB,KAAK,QAAQ,CAClC,MAAK,uBAAuB,KAAK;;AAKrC,OAAK,aAAa,KAAK;AACvB,OAAK,UAAU,KAAK;;;;;;CAOtB,AAAQ,2BACN,aACA,SAC8C;AAE9C,MAAI,iBAAiB,YAAY,EAAE;AAEjC,OAAI,mBAAmB,QAAQ,IAAI,eAAe,WAAW,QAAQ,CACnE,QAAO;IACL,GAAG;IACH,SAAS;IACV;GAGH,MAAM,OAAO;AACb,UAAO;IACL,GAAG;IACH,OAAO,YAAY,SAAS,MAAM;IAClC,QAAQ,YAAY,UAAU,MAAM;IACpC,SAAS,YAAY,WAAW,MAAM;IACtC,WAAW,YAAY,aAAa,MAAM;IAC1C,QAAQ,YAAY,UAAU,MAAM;IACpC,OAAO,YAAY,SAAS,MAAM;IACnC;;AAIH,MAAI,sBAAsB,YAAY,EAAE;AAEtC,OAAI,mBAAmB,QAAQ,IAAI,eAAe,WAAW,QAAQ,CACnE,QAAO;IACL,OAAO;IACP,SAAS;IACV;GAEH,MAAM,OAAO;AACb,UAAO;IACL,OAAO;IACP,OAAO,MAAM;IACb,QAAQ,MAAM;IACd,SAAS,MAAM;IACf,WAAW,MAAM;IACjB,QAAQ,MAAM;IACd,OAAO,MAAM;IACd;;AAIH,MAAI,iBAAiB,YAAiC,CAGpD,QAAO,EACL,OAFW,aADM,YACkB,SAAS,EAG7C;AAGH,QAAM,IAAI,sBAAsB;;;;;;CAOlC,AAAQ,uBAAuB,QAA8C;AAC3E,MAAI,YAAY,WAAW,OAAO,CAChC,QAAO,OAAO,aAAa;AAG7B,MAAI,mBAAmB,OAAO,CAC5B,QAAO,KAAK,cAAc,qBAAqB,OAAO;AAIxD,MACE,OAAO,WAAW,YAClB,mBAAmB,UAClB,OAAsC,kBAAkB,iBAEzD,QAAQ,OAA2C;AAIrD,MACE,OAAO,WAAW,YAClB,CAAC,MAAM,QAAQ,OAAO,IACtB,OAAO,KAAK,OAAO,CAAC,SAAS,EAE7B,QAAO;AAGT,QAAM,IAAI,qBACR,6FACD;;CAGH,IAAI,WAAkC;AACpC,SAAO,IAAI,IAAI,CACb,GAAG,KAAK,OACR,GAAG,MAAM,KAAK,KAAK,aAAa,CAAC,SAAS,CAAC,QAAQ,SACjD,OAAO,KAAK,UAAU,CAAC,OAAO,IAAI,CAAqB,CACxD,CACF,CAAC;;CAGJ,WAAW,iBAAsC;AAC/C,MAAI,KAAK,mBAAmB,IAAI,gBAAgB,CAC9C;AAGF,OAAK,mBAAmB,IAAI,iBAAiB,gBAAgB;AAC7D,OAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,gBAAgB,EAAE;GACxD,IAAI;AACJ,OAAI,OAAO,QAAQ,WACjB,WAAU,KAAK;OAEf,WAAU;AAEZ,OAAI,KAAK,SAAS,SAAS,QACzB;QAAI,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,EACrC;SAAI,QAAQ,kBAAkB,YAC5B,OAAM,IAAI,MACR,YAAY,IAAI,yCACjB;;SAIL,MAAK,SAAS,OAAO;;;CAiI3B,AAAS,QACP,GAAG,MAqBmC;EACtC,SAAS,gBACP,MASA;AACA,UAAO,KAAK,UAAU,KAAK,OAAO,KAAK,OAAO;;EAGhD,MAAM,QACJ,gBAAgB,KAAK,GACjB,MAAM,QAAQ,KAAK,GAAG,GACpB,KAAK,KACL,OAAO,QAAQ,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,KAAK,OAAO,CAAC,GAC/D,CAAC;GAAC,KAAK;GAAI,KAAK;GAAI,KAAK;GAAG,CAAC;AAOnC,MAAI,MAAM,WAAW,EACnB,OAAM,IAAI,MAAM,iCAAiC;AAGnD,OAAK,MAAM,CAAC,KAAK,QAAQ,YAAY,OAAO;AAC1C,OAAI,OAAO,KAAK,SACd,OAAM,IAAI,MACR,GAAG,IAAI,qGACR;AAGH,QAAK,MAAM,gBAAgB,CACzB,gCACA,yBACD,CACC,KAAI,IAAI,SAAS,aAAa,CAC5B,OAAM,IAAI,MACR,IAAI,aAAa,6DAClB;AAGL,QAAK,eACH,6GACD;AAED,OAAI,OAAO,KAAK,MACd,OAAM,IAAI,MAAM,UAAU,IAAI,qBAAqB;AAErD,OAAI,QAAQ,OAAO,QAAQ,MACzB,OAAM,IAAI,MAAM,UAAU,IAAI,iBAAiB;GAGjD,IAAI,YAA6B,KAAK;AACtC,OAAI,SAAS,UAAU,OACrB,aAAY,KAAK,uBAAuB,QAAQ,MAAM;AAExD,QAAK,WAAW,UAAU;GAE1B,IAAI;AACJ,OAAI,SAAS,WAAW,OAAO,CAC7B,YAAW;YACF,OAAO,WAAW,WAC3B,YAAW,IAAI,iBAAiB;IAC9B,MAAM;IACN,MAAM;IACN,OAAO;IACR,CAAC;OAEF,YAAW,kBAAkB,OAAO;GAGtC,IAAI,cAAc,SAAS;AAC3B,OAAI,OAAO,gBAAgB,UACzB,eAAc,cAAc,EAAE,GAAG;GAGnC,MAAM,WAAqC;IAC/B;IACV,aAAa,SAAS;IACtB;IACA,UAAU,SAAS;IACnB,OAAO,aAAa,KAAK;IACzB,WAAW,aAAa,SAAS,GAE7B,CAAC,SAAgB,GACjB,SAAS;IACb,MAAM,SAAS;IACf,OAAO,SAAS;IACjB;AAED,QAAK,MAAM,OAAuB;;AAGpC,SAAO;;CAGT,AAAS,QACP,UACA,QACM;AACN,MAAI,OAAO,aAAa,SACtB,QAAO,MAAM,QAAQ,UAAU,OAAO;AAGxC,MAAI,KAAK,SACP,SAAQ,KACN,8GAED;AAGH,OAAK,MAAM,SAAS,UAAU;AAC5B,OAAI,UAAU,IACZ,OAAM,IAAI,MAAM,6BAA6B;AAE/C,OAAI,CAAC,OAAO,KAAK,KAAK,MAAM,CAAC,MAAM,SAAS,SAAS,MAAM,CACzD,OAAM,IAAI,MAAM,6BAA6B,MAAM,SAAS;;AAGhE,MAAI,WAAW,IACb,OAAM,IAAI,MAAM,4BAA4B;AAE9C,MAAI,CAAC,OAAO,KAAK,KAAK,MAAM,CAAC,MAAM,SAAS,SAAS,OAAO,CAC1D,OAAM,IAAI,MAAM,6BAA6B,OAAO,SAAS;AAG/D,OAAK,aAAa,IAAI,CAAC,UAAU,OAAO,CAAC;AAEzC,SAAO;;CAiDT,YACE,OAyBA;EACA,MAAM,cAAc,MAAM,QAAQ,MAAM,GAAG,QAAQ,OAAO,QAAQ,MAAM;AAExE,MAAI,YAAY,WAAW,EACzB,OAAM,IAAI,MAAM,uCAAuC;EAGzD,IAAI;AACJ,OAAK,MAAM,CAAC,KAAK,QAAQ,YAAY,aAAa;AAChD,OAAI,OAAO,KAAK,MACd,OAAM,IAAI,MACR,kDAAkD,IAAI,mBACvD;GAGH,MAAM,WAAW;AACjB,QAAK,QACH,UACA,QACA,QACD;AACD,OAAI,gBAAgB,KAClB,MAAK,QAAQ,cAAc,SAAS;AAGtC,kBAAe;;AAGjB,SAAO;;CAYT,AAAS,QAAQ,EACf,cACA,OACA,OACA,iBACA,gBACA,MACA,gBASE,EAAE,EAUJ;AAEA,OAAK,SAAS,CACZ,GAAI,MAAM,QAAQ,gBAAgB,GAAG,kBAAkB,EAAE,EACzD,GAAI,MAAM,QAAQ,eAAe,GAAG,iBAAiB,EAAE,CACxD,CAAC;EAGF,MAAM,aAAa,OAAO,KACxB,KAAK,mBAAmB,IAAI,KAAK,kBAAkB,CACpD;EACD,MAAM,iBACJ,WAAW,WAAW,KAAK,WAAW,OAAO,OAAO,OAAO;EAE7D,MAAM,aAAa,OAAO,KAAK,KAAK,SAAS;EAC7C,MAAM,iBACJ,WAAW,WAAW,KAAK,WAAW,OAAO,OAAO,OAAO;EAE7D,MAAM,gBAAgB,KAAK;EAE3B,MAAM,WAAW,IAAI,mBAUnB;GACA,SAAS;GACT;GACA;GACA;GACA,cAAc;GACd,OAAO,EAAE;GACT,UAAU;IACR,GAAG,KAAK;KACP,QAAQ,IAAI,gBAAgB;IAC9B;GACD,eAAe;GACf;GACA;GACA,YAAY;GACZ;GACA;GACA;GACA;GACA;GACD,CAAC;AAGF,WAAS,WAAW,MAAM;AAC1B,OAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAC/B,KAAK,MACN,CACC,UAAS,WAAW,KAAU,KAAK;AAErC,WAAS,aAAa,OAAO,MAAM,mBAAmB,EAAkB,EACtE,YAAY,OACb,CAAC;AACF,OAAK,MAAM,CAAC,QAAQ,OAAO,QAAkC,KAAK,MAAM,CACtE,UAAS,aACP,KACA,MACA,mBAAmB,EACnB,EACE,YAAY,OACb,CACF;AAEH,OAAK,MAAM,CAAC,OAAO,QAAQ,KAAK,MAC9B,UAAS,WAAW,OAAO,IAAI;AAEjC,OAAK,MAAM,CAAC,QAAQ,QAAQ,KAAK,aAC/B,UAAS,WAAW,QAAQ,IAAI;AAElC,OAAK,MAAM,CAAC,OAAO,aAAa,OAAO,QAAQ,KAAK,SAAS,CAC3D,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,SAAS,CACnD,UAAS,aAAa,OAAY,MAAM,OAAO;AAInD,SAAO,SAAS,UAAU;;;AAI9B,SAAS,aACP,QAC6B;CAC7B,MAAM,WAAwC,EAAE;AAChD,MAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,OAAO,CAC9C,KAAI,SAAS,KACX,UAAS,QAAQ,WAAqB,IAA+B;KAGrE,UAAS,QAAQ,WACf,IACD;AAGL,QAAO;;;;;;;AAQT,IAAa,qBAAb,cAUU,cAUR;;;;;CAOA;;CAGA,gBAAoC;CAEpC,YAAY,EACV,aACA,GAAG,QAaC;AACJ,QAAM,KAAK;AACX,OAAK,cAAc;;CAOrB,WAAW,KAAuB,MAAuC;EACvE,IAAI;AACJ,MAAI,QAAQ,MAEV,cAAa,OAAO,QAClB,KAAK,QAAQ,mBAAmB,IAAI,KAAK,QAAQ,iBAAiB,CACnE,CAAC,KAAK,CAAC,OAAO,EAAE;MAEjB,cAAa,OAAO,KAAK,KAAK,QAAQ,SAAS;EAIjD,SAAS,SAAS,OAAwC;AACxD,OAAI,UAAU,MAAM,EAAE;AACpB,QAAI,MAAM,UAAU,QAAQ,OAC1B,QAAO;AAET,WAAO,MAAM,iBAAiB;cAE9B,MAAM,QAAQ,MAAM,IACpB,MAAM,SAAS,KACf,MAAM,MAAM,MAAM,UAAU,EAAE,CAAC,EAC/B;IACA,MAAM,UAA+B,EAAE;AACvC,SAAK,MAAM,KAAK,MACd,KAAI,UAAU,EAAE,EAAE;AAChB,SAAI,EAAE,UAAU,QAAQ,OACtB;AAEF,aAAQ,KAAK,GAAG,EAAE,iBAAiB,CAAC;UAEpC,SAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;AAG3B,WAAO;cACE,SAAS,KAClB,QAAO,CAAC,CAAC,MAAM,MAAM,CAAC;AAExB,UAAO;;EAIT,MAAM,UAAU;EAGhB,SAAS,YAAY,OAAkC;AACrD,OAAI,CAAC,MACH,QAAO;YACE,UAAU,MAAM,EAAE;AAC3B,QAAI,MAAM,UAAU,QAAQ,OAC1B,QAAO;AAET,WAAO,MAAM,iBAAiB,CAAC,QAAQ,CAAC,OAAO,WAAW,SAAS,EAAE,CAAC;cAEtE,MAAM,QAAQ,MAAM,IACpB,MAAM,SAAS,KACf,MAAM,KAAK,UAAU,EACrB;IACA,MAAM,UAA+B,EAAE;AACvC,SAAK,MAAM,QAAQ,MACjB,KAAI,UAAU,KAAK,EAAE;AACnB,SAAI,KAAK,UAAU,QAAQ,OACzB;AAEF,aAAQ,KACN,GAAG,KAAK,iBAAiB,CAAC,QAAQ,CAAC,OAAO,WAAW,SAAS,EAAE,CAAC,CAClE;WACI;KACL,MAAM,cAAc,YAAY,KAAK;AACrC,SAAI,YACF,SAAQ,KAAK,GAAI,eAAe,EAAE,CAAE;;AAI1C,WAAO;cACE,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,CAC3D,QAAO,OAAO,QAAQ,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW,SAAS,EAAE,CAAC;QAC/D;IACL,MAAM,cAAc,MAAM,QAAQ,MAAM,GAAG,UAAU,OAAO;AAC5D,UAAM,IAAI,mBACR,kBAAkB,QAAQ,UAAU,CAAC,qFAAqF,eAC1H,EACE,eAAe,mCAChB,CACF;;;EAIL,MAAM,oBAAoE,CACxE;GACE,OAAO;GACP,QAAQ,IAAI,iBAAiB;IAC3B,MACE,WAAW,UAAU,WAAW,OAAO,OACnC,WACA;IACN,OAAO;IACP,SAAS;IACV,CAAC;GACH,CACF;AAGD,MAAI,QAAQ,MACV,MAAK,MAAM,OAAO,IAAI,WAAiB;GACrC,MAAM,CAAC,WAAW;GAClB,UAAU,CAAC,MAAM;GACjB,UAAU,CAAC,MAAM;GACjB,SAAS,CAAC,IAAI,aAAa,mBAAmB,CAAC,WAAW,CAAC,CAAC;GAC7D,CAAC;OACG;GACL,MAAM,kBAAkB,MAAM,SAAS,KAAK,QAAQ;GACpD,MAAM,cAAc,OAAO,YACzB,OAAO,KAAK,KAAK,QAAQ,mBAAmB,IAAI,gBAAgB,CAAC,CAAC,KAC/D,MAAM,CAAC,GAAG,EAAE,CACd,CACF;GACD,MAAM,gBACJ,OAAO,KAAK,YAAY,CAAC,WAAW,KAAK,QAAQ;GACnD,MAAM,gBAAgB,aAAa;AACnC,QAAK,SAAS,iBAAiB,MAAM,QACjC,IAAI,sBAAsB,GAC1B,IAAI,eAAe,MAAM;AAC7B,QAAK,MAAM,OAAO,IAAI,WAAiB;IACrC,UAAU,CAAC,cAAc;IAEzB,UAAU,gBAAgB,OAAO,KAAK,YAAY,GAAG;IAErD,SAAS,CAAC,IAAI,aAAa,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5D,QAAQ,gBACJ,UAEC,UAA+B;AAC9B,YAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK,YAAY,CACxD;;IAEP,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,aAAa,MAAM;IACnB,aAAa,MAAM;IACnB,WAAW,MAAM;IACjB,MAAM,MAAM;IACb,CAAC;;;CAIN,WAAW,QAA+B,KAA0B;AAClE,MAAI,QAAQ,IAAK;AACjB,MAAI,OAAO,WAAW,SACpB,MAAK,MAAM,QAAQ,QAAQ,KACzB,IAAI,aACF,CAAC;GAAE,SAAS,aAAa;GAAO,OAAO;GAAM,CAAC,EAC9C,CAAC,WAAW,CACb,CACF;WACQ,MAAM,QAAQ,OAAO,EAAE;GAChC,MAAM,cAAc,QAAQ,OAAO,KAAK,IAAI,CAAC,GAAG;AAEhD,QAAK,SAAS,eAA6B,KAAK,QAAQ,MAAM,KAAK,QAC/D,IAAI,6BAA6B,IAAI,IAAI,OAAO,CAAC,GACjD,IAAI,kBAAkB,IAAI,IAAI,OAAO,CAAC;AAE1C,QAAK,MAAM,KAAK,SAAS,KAAK,YAAY;AAE1C,QAAK,MAAM,SAAS,OAClB,MAAK,MAAM,OAAO,QAAQ,KACxB,IAAI,aACF,CAAC;IAAE,SAAS;IAAa,OAAO;IAAO,CAAC,EACxC,CAAC,WAAW,CACb,CACF;;;CAKP,aACE,OACA,GACA,QACA,UAAoC,EAAE,YAAY,MAAM,EAClD;EACN,MAAM,eAAe,OACnB,SACA,WACG;GACH,MAAM,kBAAkB,QAAQ,QAAQ,MAAM,MAAM,IAAI;AACxD,OAAI,CAAC,gBAAgB,OAAQ;GAE7B,MAAM,SAAuC,gBAAgB,KAAK,MAAM;AACtE,QAAI,QAAQ,EAAE,CAAE,QAAO;AACvB,WAAO;KAAE,SAAS,MAAM,MAAM,IAAI,aAAa;KAAK,OAAO;KAAO;KAClE;AACF,SAAM,aAAa,QACjB;IAAE,GAAG;IAAQ,OAAO,OAAO,QAAQ,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC;IAAE,EAC7D,OACD;;AAGH,OAAK,MAAM,OAAO,QAAQ,KACxB,OAAO,IACL,cAEA,QAAQ,cACH,WACC,YAAY,OACV,QACA,KAAK,kBAAkB,KAAK,gBAC5B,KACD,GACH,OACL,CACF;;CAGH,MAAgB,eACd,OACoD;AACpD,MAAI,SAAS,KAAM,QAAO;EAE1B,MAAM,WAAW,KAAK,QAAQ;EAC9B,MAAM,YAAY,KAAK,QAAQ;AAM/B,MAAI,YAAY,WAAW,SAAS,EAAE;AACpC,OAAI,UAAU,MAAM,EAAE;IACpB,MAAM,cAAc;AACpB,QAAI,MAAM,OACR,aAAY,SAAS,MAAM,SAAS,cAClC,MAAM,QAAQ,MAAM,OAAO,GACvB,OAAO,YAAY,MAAM,OAAO,GAChC,MAAM,OACX;AAEH,WAAO;;AAET,UAAO,MAAM,SAAS,cAAc,MAAM;;AAI5C,MAAI,aAAa,sBAAsB,YAAY,WAAW,UAAU,EAAE;AACxE,OAAI,UAAU,MAAM,EAAE;IACpB,MAAM,cAAc;AACpB,QAAI,MAAM,OACR,aAAY,SAAS,MAAM,UAAU,cACnC,MAAM,QAAQ,MAAM,OAAO,GACvB,OAAO,YAAY,MAAM,OAAO,GAChC,MAAM,OACX;AAEH,WAAO;;AAET,UAAO,MAAM,UAAU,cAAc,MAAM;;EAI7C,MAAM,gBAAgB;GACpB,MAAM,SAAS,WAAyC;AACtD,QAAI,UAAU,KAAM,QAAO;AAC3B,WAAO,KAAK,cAAc,0BAA0B,QAAQ,EAC1D,mBAAmB,MACpB,CAAC;;AAGJ,OAAI,mBAAmB,SAAS,CAAE,QAAO,MAAM,SAAS;AACxD,OAAI,aAAa,oBAAoB;AACnC,QAAI,mBAAmB,UAAU,CAC/B,QAAO,wBAAwB,MAAM,UAAU,CAAE;AAEnD;;MAGA;AAEJ,MAAI,UAAU,MAAM,EAAE;GACpB,MAAM,cAAc;AACpB,OAAI,MAAM,UAAU,UAAU,KAC5B,aAAY,SAAS,aAAa,QAAQ,MAAM,OAAO;AACzD,UAAO;;AAET,MAAI,UAAU,KAAM,QAAO,aAAa,QAAQ,MAAM;AACtD,SAAO;;CAGT,AAAO,cAAc,OAEnB;AACA,SAAO,cAAc,MAAM;;CAG7B,MAAgB,iBACd,QAC2C;EAC3C,MAAM,eAAe,KAAK,QAAQ;AAClC,MAAI,mBAAmB,aAAa,CAAE,cAAa,cAAc,OAAO;AACxE,SAAO;;;;;;;;AASX,SAAS,iBACP,KACiC;AACjC,QACE,OAAO,QAAQ,YACf,QAAQ,QACP,IAAiC,aAAa;;AAKnD,SAAS,eAAe,OAA+B;AACrD,KAAI,QAAQ,MAAM,CAChB,QAAO,CAAC,MAAM;CAEhB,MAAM,WAAW,EAAE;AACnB,KAAI,UAAU,MAAM,CAClB,UAAS,KAAK,MAAM;UACX,MAAM,QAAQ,MAAM,CAC7B,UAAS,KAAK,GAAG,MAAM,OAAO,UAAU,CAAC;CAE3C,MAAM,eAAkC,EAAE;AAE1C,MAAK,MAAM,WAAW,UAAU;AAC9B,MAAI,QAAQ,UAAU,QAAQ,OAC5B,OAAM,IAAI,cAAc,QAAQ;AAGlC,MAAI,QAAQ,QAAQ,KAAK,CACvB,cAAa,KAAK,QAAQ,KAAK;WACtB,OAAO,QAAQ,SAAS,SACjC,cAAa,KAAK,QAAQ,KAAK;WAE3B,MAAM,QAAQ,QAAQ,KAAK,CAC7B,cAAa,KAAK,GAAG,QAAQ,KAAK;;AAIxC,QAAO;;AAGT,SAAS,oBAAoB;AAS3B,QAAO,IAAI,OAAO,EAChB,MAR0B,IAAI,iBAAyC;EACvE,MAAM;EACN,MAAM,CAAC,WAAW;EAClB,OAAO;EACP,SAAS;EACT,MAAM;EACP,CAAC,EAGD,CAAC"}
@@ -0,0 +1,41 @@
1
+ const require_base = require('../channels/base.cjs');
2
+ const require_constants = require('../constants.cjs');
3
+ const require_schema = require('../state/schema.cjs');
4
+ let _langchain_core_utils_types = require("@langchain/core/utils/types");
5
+
6
+ //#region src/graph/types.ts
7
+ /**
8
+ * Check if a value is a valid StateDefinitionInit type.
9
+ * Supports: StateSchema, InteropZodObject (Zod), AnnotationRoot, StateDefinition
10
+ *
11
+ * @internal
12
+ */
13
+ function isStateDefinitionInit(value) {
14
+ if (value == null) return false;
15
+ if (require_schema.StateSchema.isInstance(value)) return true;
16
+ if ((0, _langchain_core_utils_types.isInteropZodObject)(value)) return true;
17
+ if (typeof value === "object" && "lc_graph_name" in value && value.lc_graph_name === "AnnotationRoot") return true;
18
+ if (typeof value === "object" && !Array.isArray(value) && Object.keys(value).length > 0 && Object.values(value).every((v) => typeof v === "function" || require_base.isBaseChannel(v))) return true;
19
+ return false;
20
+ }
21
+ /**
22
+ * Check if a value is a StateGraphInit object (has state, stateSchema, or input with valid schema).
23
+ *
24
+ * @internal
25
+ */
26
+ function isStateGraphInit(value) {
27
+ if (typeof value !== "object" || value == null) return false;
28
+ const obj = value;
29
+ const hasState = "state" in obj && isStateDefinitionInit(obj.state);
30
+ const hasStateSchema = "stateSchema" in obj && isStateDefinitionInit(obj.stateSchema);
31
+ const hasInput = "input" in obj && isStateDefinitionInit(obj.input);
32
+ if (!hasState && !hasStateSchema && !hasInput) return false;
33
+ if ("input" in obj && obj.input != null && !isStateDefinitionInit(obj.input)) return false;
34
+ if ("output" in obj && obj.output != null && !isStateDefinitionInit(obj.output)) return false;
35
+ return true;
36
+ }
37
+
38
+ //#endregion
39
+ exports.isStateDefinitionInit = isStateDefinitionInit;
40
+ exports.isStateGraphInit = isStateGraphInit;
41
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.cjs","names":["StateSchema","isBaseChannel"],"sources":["../../src/graph/types.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n isInteropZodObject,\n type InteropZodObject,\n} from \"@langchain/core/utils/types\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { LangGraphRunnableConfig } from \"../pregel/runnable_types.js\";\nimport type { CommandInstance, Send } from \"../constants.js\";\nimport { END } from \"../constants.js\";\nimport type {\n AnnotationRoot,\n StateDefinition,\n StateType,\n UpdateType as AnnotationUpdateType,\n} from \"./annotation.js\";\nimport {\n AnyStateSchema,\n StateSchema,\n StateSchemaFieldsToStateDefinition,\n} from \"../state/schema.js\";\nimport type { InteropZodToStateDefinition } from \"./zod/meta.js\";\nimport { isBaseChannel } from \"../channels/base.js\";\n\n// Re-export END for use in ConditionalEdgeRouter return types\nexport { END };\n\n/**\n * Convert any supported schema type to a StateDefinition.\n *\n * @internal\n */\nexport type ToStateDefinition<T> = T extends StateSchema<infer TInit>\n ? StateSchemaFieldsToStateDefinition<TInit>\n : T extends AnnotationRoot<infer SD>\n ? SD\n : T extends InteropZodObject\n ? InteropZodToStateDefinition<T>\n : T extends StateDefinition\n ? T\n : never;\n\n/**\n * Type for schema types that can be used to initialize state.\n * Supports all valid schema types: StateDefinition, Zod objects, StateSchema, and AnnotationRoot.\n *\n * @internal\n */\nexport type StateDefinitionInit =\n | StateDefinition\n | InteropZodObject\n | AnyStateSchema\n | AnnotationRoot<any>;\n\n/**\n * Check if a value is a valid StateDefinitionInit type.\n * Supports: StateSchema, InteropZodObject (Zod), AnnotationRoot, StateDefinition\n *\n * @internal\n */\nexport function isStateDefinitionInit(\n value: unknown\n): value is StateDefinitionInit {\n if (value == null) return false;\n\n // StateSchema\n if (StateSchema.isInstance(value)) return true;\n\n // InteropZodObject (Zod v3/v4 object schemas)\n if (isInteropZodObject(value)) return true;\n\n // AnnotationRoot\n if (\n typeof value === \"object\" &&\n \"lc_graph_name\" in value &&\n (value as { lc_graph_name: unknown }).lc_graph_name === \"AnnotationRoot\"\n ) {\n return true;\n }\n\n // StateDefinition (raw channel map)\n if (\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every(\n (v) => typeof v === \"function\" || isBaseChannel(v)\n )\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Valid types for context schema.\n * Context doesn't have channels/reducers, so StateSchema is NOT supported.\n * Supports StandardSchemaV1 (Zod, Valibot, etc.) and AnnotationRoot (backward compat).\n *\n * @internal\n */\nexport type ContextSchemaInit =\n | StandardSchemaV1\n | AnnotationRoot<StateDefinition>;\n\n/**\n * Initialization options for StateGraph.\n * Accepts any combination of schema types for state/input/output.\n *\n * Supports both `state` and `stateSchema` as aliases for backward compatibility.\n * If only `input` is provided (no state/stateSchema), `input` is used as the state schema.\n *\n * @template SD - State definition type\n * @template I - Input definition type (defaults to undefined)\n * @template O - Output definition type (defaults to undefined)\n * @template C - Context schema type (defaults to undefined)\n * @template N - Node name union type (defaults to string)\n * @template InterruptType - Interrupt type (defaults to unknown)\n * @template WriterType - Writer type (defaults to unknown)\n */\nexport type StateGraphInit<\n SD extends StateDefinitionInit = StateDefinitionInit,\n I extends StateDefinitionInit | undefined = undefined,\n O extends StateDefinitionInit | undefined = undefined,\n C extends StateDefinitionInit | undefined = undefined,\n N extends string = string,\n InterruptType = unknown,\n WriterType = unknown\n> = {\n /** Primary key for state schema */\n state?: SD;\n\n /**\n * @deprecated Use `state` instead. Will be removed in a future version.\n */\n stateSchema?: SD;\n\n input?: I;\n output?: O;\n\n /** Context schema for runtime configuration validation. Does not support StateSchema. */\n context?: C;\n\n interrupt?: InterruptType;\n writer?: WriterType;\n nodes?: N[];\n};\n\n/**\n * Options for the second argument when passing a direct schema.\n * Excludes `state` and `stateSchema` since those come from the first arg.\n *\n * @internal\n */\nexport type StateGraphOptions<\n I extends StateDefinitionInit | undefined = undefined,\n O extends StateDefinitionInit | undefined = undefined,\n C extends StateDefinitionInit | undefined = undefined,\n N extends string = string,\n InterruptType = unknown,\n WriterType = unknown\n> = Omit<\n StateGraphInit<StateDefinitionInit, I, O, C, N, InterruptType, WriterType>,\n \"state\" | \"stateSchema\"\n>;\n\n/**\n * Check if a value is a StateGraphInit object (has state, stateSchema, or input with valid schema).\n *\n * @internal\n */\nexport function isStateGraphInit(\n value: unknown\n): value is StateGraphInit<StateDefinitionInit> {\n if (typeof value !== \"object\" || value == null) return false;\n\n const obj = value as Record<string, unknown>;\n\n // Must have at least one of: state, stateSchema, or input\n const hasState = \"state\" in obj && isStateDefinitionInit(obj.state);\n const hasStateSchema =\n \"stateSchema\" in obj && isStateDefinitionInit(obj.stateSchema);\n const hasInput = \"input\" in obj && isStateDefinitionInit(obj.input);\n\n if (!hasState && !hasStateSchema && !hasInput) return false;\n\n // Validate input/output if provided\n if (\"input\" in obj && obj.input != null && !isStateDefinitionInit(obj.input))\n return false;\n if (\n \"output\" in obj &&\n obj.output != null &&\n !isStateDefinitionInit(obj.output)\n )\n return false;\n\n return true;\n}\n\n/**\n * Extract the State type from any supported schema type.\n *\n * Supports:\n * - StateSchema\n * - AnnotationRoot\n * - StateDefinition (internal channel definitions)\n * - InteropZodObject (Zod v3/v4 object schemas)\n *\n * @template Schema - The schema type to extract state from\n * @template Fallback - Type to return if schema doesn't match (default: never)\n */\nexport type ExtractStateType<\n Schema,\n Fallback = Schema\n> = Schema extends AnnotationRoot<infer SD>\n ? StateType<SD>\n : StateType<ToStateDefinition<Schema>> extends infer S\n ? [S] extends [never]\n ? Fallback\n : S\n : Fallback;\n\n/**\n * Extract the Update type from any supported schema type.\n *\n * The Update type represents what a node can return to update the state.\n * All fields are optional since nodes only need to return the fields they modify.\n *\n * Supports:\n * - StateSchema\n * - AnnotationRoot\n * - StateDefinition (internal channel definitions)\n * - InteropZodObject (Zod v3/v4 object schemas)\n *\n * @template Schema - The schema type to extract update type from\n * @template FallbackBase - Base type for fallback (will be partialized), defaults to Schema\n */\nexport type ExtractUpdateType<\n Schema,\n FallbackBase = Schema\n> = Schema extends AnnotationRoot<infer SD>\n ? AnnotationUpdateType<SD>\n : AnnotationUpdateType<ToStateDefinition<Schema>> extends infer U\n ? [U] extends [never]\n ? Partial<FallbackBase>\n : U\n : Partial<FallbackBase>;\n\n/**\n * Extract the input type from a type bag, using ExtractStateType on the InputSchema.\n * Falls back to Default if InputSchema is not provided.\n * @internal\n */\ntype ExtractBagInput<Bag, Default> = Bag extends {\n InputSchema: infer I;\n}\n ? ExtractStateType<I>\n : Default;\n\n/**\n * Extract the output type from a type bag, using ExtractUpdateType on the OutputSchema.\n * Falls back to Default if OutputSchema is not provided.\n * @internal\n */\ntype ExtractBagOutput<Bag, Default> = Bag extends {\n OutputSchema: infer O;\n}\n ? ExtractUpdateType<O>\n : Default;\n\n/**\n * Extract the context type from a type bag, using ExtractStateType on the ContextSchema.\n * Falls back to Default if ContextSchema is not provided.\n * Ensures result extends Record<string, unknown> for LangGraphRunnableConfig compatibility.\n * @internal\n */\ntype ExtractBagContext<\n Bag,\n Default extends Record<string, unknown>\n> = Bag extends {\n ContextSchema: infer C;\n}\n ? ExtractStateType<C> extends infer Ctx\n ? Ctx extends Record<string, unknown>\n ? Ctx\n : Default\n : Default\n : Default;\n\n/**\n * Extract the Nodes type from a type bag.\n * Falls back to Default if Nodes is not provided.\n * @internal\n */\ntype ExtractBagNodes<Bag, Default extends string> = Bag extends {\n Nodes: infer N extends string;\n}\n ? N\n : Default;\n\n/**\n * Type bag for GraphNode that accepts schema types.\n * All fields are optional - unspecified fields use defaults.\n *\n * This enables separate input/output schemas for nodes, which is useful when\n * a node receives a subset of state fields and returns different fields.\n *\n * @example\n * ```typescript\n * const node: GraphNode<{\n * InputSchema: typeof NodeInputSchema;\n * OutputSchema: typeof NodeOutputSchema;\n * ContextSchema: typeof ContextSchema;\n * Nodes: \"agent\" | \"tool\";\n * }> = (state, runtime) => {\n * return { answer: `Response to: ${state.query}` };\n * };\n * ```\n */\nexport interface GraphNodeTypes<\n InputSchema = unknown,\n OutputSchema = unknown,\n ContextSchema = unknown,\n Nodes extends string = string\n> {\n /** Schema for node input state (uses ExtractStateType) */\n InputSchema?: InputSchema;\n /** Schema for node output/update (uses ExtractUpdateType) */\n OutputSchema?: OutputSchema;\n /** Schema for runtime context (uses ExtractStateType) */\n ContextSchema?: ContextSchema;\n /** Union of valid node names for Command.goto */\n Nodes?: Nodes;\n}\n\n/**\n * Detect if T is a type bag (has InputSchema or OutputSchema) or a direct schema.\n * @internal\n */\ntype IsGraphNodeTypeBag<T> = T extends { InputSchema: unknown }\n ? true\n : T extends { OutputSchema: unknown }\n ? true\n : false;\n\n/**\n * Return value type for GraphNode functions.\n * Nodes can return an update object, a Command, or a Promise of either.\n *\n * @template Update - The update type (what fields can be returned)\n * @template Nodes - Union of valid node names for Command.goto\n */\nexport type GraphNodeReturnValue<Update, Nodes extends string = string> =\n | Update\n | CommandInstance<unknown, Update, Nodes>\n | Promise<Update | CommandInstance<unknown, Update, Nodes>>;\n\n/**\n * Strongly-typed utility for authoring graph nodes outside of the StateGraph builder,\n * supporting inference for both state (from Schema) and config context (from Context type).\n *\n * This type enables you to define graph node functions with full type safety—both\n * for the evolving state and for additional context that may be passed in at runtime.\n * Typing the context parameter allows for better code organization and precise editor support.\n *\n * Works with StateSchema, AnnotationRoot, and Zod object schemas for state, and\n * with a user-defined object shape for context.\n *\n * **Supports two patterns:**\n *\n * 1. **Single schema usage** - Single schema for both input and output:\n * `GraphNode<Schema, Context, Nodes>`\n *\n * 2. **Type bag pattern** - Separate schemas for input, output, context:\n * `GraphNode<{ InputSchema; OutputSchema; ContextSchema; Nodes }>`\n *\n * @template Schema - The state schema type (StateSchema, AnnotationRoot, InteropZodObject) OR a type bag\n * @template Context - The type of the context passed into this node (default: Record<string, unknown>)\n * @template Nodes - An optional union of valid node names for Command.goto, used for type-safe routing (default: string)\n *\n * @example Single schema usage\n * ```typescript\n * import { StateSchema, GraphNode } from \"@langchain/langgraph\";\n * import { z } from \"zod/v4\";\n *\n * const AgentState = new StateSchema({\n * messages: MessagesValue,\n * step: z.number().default(0),\n * });\n *\n * // Context shape for custom node logic (optional)\n * type MyContext = { userId: string };\n *\n * // Node receiving state and config\n * const processNode: GraphNode<typeof AgentState, MyContext> = (state, config) => {\n * const userId = config.configurable?.userId; // type-safe context access\n * return { step: state.step + 1 };\n * };\n *\n * // Node with type-safe graph routing\n * const routerNode: GraphNode<typeof AgentState, MyContext, \"agent\" | \"tool\"> = (state, config) => {\n * if (state.needsTool) {\n * return new Command({ goto: \"tool\", update: { step: state.step + 1 } });\n * }\n * return new Command({ goto: \"agent\" });\n * };\n *\n * // Use in graph\n * const graph = new StateGraph(AgentState)\n * .addNode(\"process\", processNode)\n * .addNode(\"router\", routerNode)\n * .compile();\n * ```\n *\n * @example Type bag pattern - separate input/output schemas\n * ```typescript\n * const InputSchema = new StateSchema({\n * messages: z.array(z.string()),\n * query: z.string(),\n * });\n *\n * const OutputSchema = new StateSchema({\n * answer: z.string(),\n * });\n *\n * const ContextSchema = z.object({ userId: z.string() });\n *\n * const node: GraphNode<{\n * InputSchema: typeof InputSchema;\n * OutputSchema: typeof OutputSchema;\n * ContextSchema: typeof ContextSchema;\n * Nodes: \"agent\" | \"tool\";\n * }> = (state, config) => {\n * // state is { messages: string[]; query: string }\n * // config.configurable is { userId: string } | undefined\n * return { answer: `Response to: ${state.query}` };\n * };\n * ```\n */\nexport type GraphNode<\n Schema,\n Context extends Record<string, any> = Record<string, any>,\n Nodes extends string = string\n> = IsGraphNodeTypeBag<Schema> extends true\n ? // Type bag pattern - extract types from schemas\n (\n state: ExtractBagInput<Schema, unknown>,\n config: LangGraphRunnableConfig<\n ExtractBagContext<Schema, Record<string, unknown>>\n >\n ) => GraphNodeReturnValue<\n ExtractBagOutput<Schema, Partial<ExtractBagInput<Schema, unknown>>>,\n ExtractBagNodes<Schema, string>\n >\n : // Single schema pattern (backward compatible)\n (\n state: ExtractStateType<Schema>,\n config: LangGraphRunnableConfig<Context>\n ) => GraphNodeReturnValue<ExtractUpdateType<Schema>, Nodes>;\n\n/**\n * Type bag for ConditionalEdgeRouter that accepts schema types.\n * Unlike GraphNodeTypes, conditional edges don't have separate input/output -\n * they just read state and return routing decisions.\n *\n * @example\n * ```typescript\n * const router: ConditionalEdgeRouter<{\n * Schema: typeof StateSchema;\n * ContextSchema: typeof ContextSchema;\n * Nodes: \"agent\" | \"tool\";\n * }> = (state, config) => {\n * return state.done ? END : \"agent\";\n * };\n * ```\n */\nexport interface ConditionalEdgeRouterTypes<\n InputSchema = unknown,\n ContextSchema = unknown,\n Nodes extends string = string\n> {\n /** Schema for router state (uses ExtractStateType) */\n InputSchema?: InputSchema;\n /** Schema for runtime context (uses ExtractStateType) */\n ContextSchema?: ContextSchema;\n /** Union of valid node names that can be routed to */\n Nodes?: Nodes;\n}\n\n/**\n * Detect if T is a ConditionalEdgeRouterTypes bag.\n * @internal\n */\ntype IsConditionalEdgeRouterTypeBag<T> = T extends { InputSchema: unknown }\n ? true\n : T extends { ContextSchema: unknown }\n ? true\n : false;\n\n/**\n * Return type for conditional edge routing functions.\n */\ntype ConditionalEdgeRouterReturnValue<Nodes extends string, State> =\n | Nodes\n | typeof END\n | Send<Nodes, State>\n | Array<Nodes | Send<Nodes, State>>;\n\n/**\n * Type for conditional edge routing functions.\n *\n * Use this to type functions passed to `addConditionalEdges` for\n * full type safety on state, runtime context, and return values.\n *\n * **Supports two patterns:**\n *\n * 1. **Single schema pattern** - Single schema:\n * `ConditionalEdgeRouter<Schema, Context, Nodes>`\n *\n * 2. **Type bag pattern** - Separate schemas for state, context:\n * `ConditionalEdgeRouter<{ Schema; ContextSchema; Nodes }>`\n *\n * @template Schema - The state schema type OR a type bag\n * @template Context - The runtime context type available to node logic\n * @template Nodes - Union of valid node names that can be routed to\n *\n * @example Single schema pattern\n * ```typescript\n * type MyContext = { userId: string };\n * const router: ConditionalEdgeRouter<typeof AgentState, MyContext, \"agent\" | \"tool\"> =\n * (state, config) => {\n * const userId = config.context?.userId;\n * if (state.done) return END;\n * return state.needsTool ? \"tool\" : \"agent\";\n * };\n *\n * graph.addConditionalEdges(\"router\", router, [\"agent\", \"tool\"]);\n * ```\n *\n * @example Type bag pattern\n * ```typescript\n * const router: ConditionalEdgeRouter<{\n * Schema: typeof StateSchema;\n * ContextSchema: typeof ContextSchema;\n * Nodes: \"agent\" | \"tool\";\n * }> = (state, config) => {\n * if (state.done) return END;\n * return \"agent\";\n * };\n * ```\n */\nexport type ConditionalEdgeRouter<\n Schema,\n Context extends Record<string, any> = Record<string, any>,\n Nodes extends string = string\n> = IsConditionalEdgeRouterTypeBag<Schema> extends true\n ? // Type bag pattern - extract types from schemas\n (\n state: ExtractBagInput<Schema, unknown>,\n config: LangGraphRunnableConfig<\n ExtractBagContext<Schema, Record<string, unknown>>\n >\n ) =>\n | ConditionalEdgeRouterReturnValue<\n ExtractBagNodes<Schema, string>,\n ExtractBagInput<Schema, unknown>\n >\n | Promise<\n ConditionalEdgeRouterReturnValue<\n ExtractBagNodes<Schema, string>,\n ExtractBagInput<Schema, unknown>\n >\n >\n : // Single schema pattern (backward compatible)\n (\n state: ExtractStateType<Schema>,\n config: LangGraphRunnableConfig<Context>\n ) =>\n | ConditionalEdgeRouterReturnValue<Nodes, ExtractStateType<Schema>>\n | Promise<\n ConditionalEdgeRouterReturnValue<Nodes, ExtractStateType<Schema>>\n >;\n"],"mappings":";;;;;;;;;;;;AA2DA,SAAgB,sBACd,OAC8B;AAC9B,KAAI,SAAS,KAAM,QAAO;AAG1B,KAAIA,2BAAY,WAAW,MAAM,CAAE,QAAO;AAG1C,yDAAuB,MAAM,CAAE,QAAO;AAGtC,KACE,OAAO,UAAU,YACjB,mBAAmB,SAClB,MAAqC,kBAAkB,iBAExD,QAAO;AAIT,KACE,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,MAAM,IACrB,OAAO,KAAK,MAAM,CAAC,SAAS,KAC5B,OAAO,OAAO,MAAM,CAAC,OAClB,MAAM,OAAO,MAAM,cAAcC,2BAAc,EAAE,CACnD,CAED,QAAO;AAGT,QAAO;;;;;;;AAgFT,SAAgB,iBACd,OAC8C;AAC9C,KAAI,OAAO,UAAU,YAAY,SAAS,KAAM,QAAO;CAEvD,MAAM,MAAM;CAGZ,MAAM,WAAW,WAAW,OAAO,sBAAsB,IAAI,MAAM;CACnE,MAAM,iBACJ,iBAAiB,OAAO,sBAAsB,IAAI,YAAY;CAChE,MAAM,WAAW,WAAW,OAAO,sBAAsB,IAAI,MAAM;AAEnE,KAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAU,QAAO;AAGtD,KAAI,WAAW,OAAO,IAAI,SAAS,QAAQ,CAAC,sBAAsB,IAAI,MAAM,CAC1E,QAAO;AACT,KACE,YAAY,OACZ,IAAI,UAAU,QACd,CAAC,sBAAsB,IAAI,OAAO,CAElC,QAAO;AAET,QAAO"}