@langchain/langgraph 1.0.7 → 1.0.12
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.
- package/package.json +7 -7
- package/CHANGELOG.md +0 -286
- package/dist/_virtual/rolldown_runtime.cjs +0 -25
- package/dist/channels/any_value.cjs +0 -46
- package/dist/channels/any_value.cjs.map +0 -1
- package/dist/channels/any_value.d.cts +0 -24
- package/dist/channels/any_value.d.cts.map +0 -1
- package/dist/channels/any_value.d.ts +0 -24
- package/dist/channels/any_value.d.ts.map +0 -1
- package/dist/channels/any_value.js +0 -46
- package/dist/channels/any_value.js.map +0 -1
- package/dist/channels/base.cjs +0 -102
- package/dist/channels/base.cjs.map +0 -1
- package/dist/channels/base.d.cts +0 -79
- package/dist/channels/base.d.cts.map +0 -1
- package/dist/channels/base.d.ts +0 -79
- package/dist/channels/base.d.ts.map +0 -1
- package/dist/channels/base.js +0 -97
- package/dist/channels/base.js.map +0 -1
- package/dist/channels/binop.cjs +0 -49
- package/dist/channels/binop.cjs.map +0 -1
- package/dist/channels/binop.d.cts +0 -22
- package/dist/channels/binop.d.cts.map +0 -1
- package/dist/channels/binop.d.ts +0 -22
- package/dist/channels/binop.d.ts.map +0 -1
- package/dist/channels/binop.js +0 -49
- package/dist/channels/binop.js.map +0 -1
- package/dist/channels/dynamic_barrier_value.cjs +0 -76
- package/dist/channels/dynamic_barrier_value.cjs.map +0 -1
- package/dist/channels/dynamic_barrier_value.d.cts +0 -42
- package/dist/channels/dynamic_barrier_value.d.cts.map +0 -1
- package/dist/channels/dynamic_barrier_value.d.ts +0 -42
- package/dist/channels/dynamic_barrier_value.d.ts.map +0 -1
- package/dist/channels/dynamic_barrier_value.js +0 -76
- package/dist/channels/dynamic_barrier_value.js.map +0 -1
- package/dist/channels/ephemeral_value.cjs +0 -46
- package/dist/channels/ephemeral_value.cjs.map +0 -1
- package/dist/channels/ephemeral_value.d.cts +0 -22
- package/dist/channels/ephemeral_value.d.cts.map +0 -1
- package/dist/channels/ephemeral_value.d.ts +0 -22
- package/dist/channels/ephemeral_value.d.ts.map +0 -1
- package/dist/channels/ephemeral_value.js +0 -46
- package/dist/channels/ephemeral_value.js.map +0 -1
- package/dist/channels/index.cjs +0 -21
- package/dist/channels/index.d.cts +0 -9
- package/dist/channels/index.d.ts +0 -9
- package/dist/channels/index.js +0 -10
- package/dist/channels/last_value.cjs +0 -98
- package/dist/channels/last_value.cjs.map +0 -1
- package/dist/channels/last_value.d.cts +0 -44
- package/dist/channels/last_value.d.cts.map +0 -1
- package/dist/channels/last_value.d.ts +0 -44
- package/dist/channels/last_value.d.ts.map +0 -1
- package/dist/channels/last_value.js +0 -97
- package/dist/channels/last_value.js.map +0 -1
- package/dist/channels/named_barrier_value.cjs +0 -118
- package/dist/channels/named_barrier_value.cjs.map +0 -1
- package/dist/channels/named_barrier_value.d.cts +0 -46
- package/dist/channels/named_barrier_value.d.cts.map +0 -1
- package/dist/channels/named_barrier_value.d.ts +0 -46
- package/dist/channels/named_barrier_value.d.ts.map +0 -1
- package/dist/channels/named_barrier_value.js +0 -116
- package/dist/channels/named_barrier_value.js.map +0 -1
- package/dist/channels/topic.cjs +0 -65
- package/dist/channels/topic.cjs.map +0 -1
- package/dist/channels/topic.d.cts +0 -32
- package/dist/channels/topic.d.cts.map +0 -1
- package/dist/channels/topic.d.ts +0 -32
- package/dist/channels/topic.d.ts.map +0 -1
- package/dist/channels/topic.js +0 -65
- package/dist/channels/topic.js.map +0 -1
- package/dist/constants.cjs +0 -406
- package/dist/constants.cjs.map +0 -1
- package/dist/constants.d.cts +0 -285
- package/dist/constants.d.cts.map +0 -1
- package/dist/constants.d.ts +0 -285
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -362
- package/dist/constants.js.map +0 -1
- package/dist/errors.cjs +0 -163
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.d.cts +0 -81
- package/dist/errors.d.cts.map +0 -1
- package/dist/errors.d.ts +0 -81
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -146
- package/dist/errors.js.map +0 -1
- package/dist/func/index.cjs +0 -301
- package/dist/func/index.cjs.map +0 -1
- package/dist/func/index.d.cts +0 -293
- package/dist/func/index.d.cts.map +0 -1
- package/dist/func/index.d.ts +0 -293
- package/dist/func/index.d.ts.map +0 -1
- package/dist/func/index.js +0 -298
- package/dist/func/index.js.map +0 -1
- package/dist/func/types.d.cts +0 -64
- package/dist/func/types.d.cts.map +0 -1
- package/dist/func/types.d.ts +0 -64
- package/dist/func/types.d.ts.map +0 -1
- package/dist/graph/annotation.cjs +0 -101
- package/dist/graph/annotation.cjs.map +0 -1
- package/dist/graph/annotation.d.cts +0 -116
- package/dist/graph/annotation.d.cts.map +0 -1
- package/dist/graph/annotation.d.ts +0 -116
- package/dist/graph/annotation.d.ts.map +0 -1
- package/dist/graph/annotation.js +0 -99
- package/dist/graph/annotation.js.map +0 -1
- package/dist/graph/graph.cjs +0 -423
- package/dist/graph/graph.cjs.map +0 -1
- package/dist/graph/graph.d.cts +0 -132
- package/dist/graph/graph.d.cts.map +0 -1
- package/dist/graph/graph.d.ts +0 -132
- package/dist/graph/graph.d.ts.map +0 -1
- package/dist/graph/graph.js +0 -420
- package/dist/graph/graph.js.map +0 -1
- package/dist/graph/index.cjs +0 -5
- package/dist/graph/index.js +0 -7
- package/dist/graph/message.cjs +0 -99
- package/dist/graph/message.cjs.map +0 -1
- package/dist/graph/message.d.cts +0 -40
- package/dist/graph/message.d.cts.map +0 -1
- package/dist/graph/message.d.ts +0 -40
- package/dist/graph/message.d.ts.map +0 -1
- package/dist/graph/message.js +0 -95
- package/dist/graph/message.js.map +0 -1
- package/dist/graph/messages_annotation.cjs +0 -110
- package/dist/graph/messages_annotation.cjs.map +0 -1
- package/dist/graph/messages_annotation.d.cts +0 -112
- package/dist/graph/messages_annotation.d.cts.map +0 -1
- package/dist/graph/messages_annotation.d.ts +0 -112
- package/dist/graph/messages_annotation.d.ts.map +0 -1
- package/dist/graph/messages_annotation.js +0 -107
- package/dist/graph/messages_annotation.js.map +0 -1
- package/dist/graph/state.cjs +0 -501
- package/dist/graph/state.cjs.map +0 -1
- package/dist/graph/state.d.cts +0 -236
- package/dist/graph/state.d.cts.map +0 -1
- package/dist/graph/state.d.ts +0 -236
- package/dist/graph/state.d.ts.map +0 -1
- package/dist/graph/state.js +0 -499
- package/dist/graph/state.js.map +0 -1
- package/dist/graph/zod/index.cjs +0 -10
- package/dist/graph/zod/index.d.cts +0 -3
- package/dist/graph/zod/index.d.ts +0 -3
- package/dist/graph/zod/index.js +0 -5
- package/dist/graph/zod/meta.cjs +0 -145
- package/dist/graph/zod/meta.cjs.map +0 -1
- package/dist/graph/zod/meta.d.cts +0 -116
- package/dist/graph/zod/meta.d.cts.map +0 -1
- package/dist/graph/zod/meta.d.ts +0 -116
- package/dist/graph/zod/meta.d.ts.map +0 -1
- package/dist/graph/zod/meta.js +0 -141
- package/dist/graph/zod/meta.js.map +0 -1
- package/dist/graph/zod/plugin.cjs +0 -41
- package/dist/graph/zod/plugin.cjs.map +0 -1
- package/dist/graph/zod/plugin.js +0 -41
- package/dist/graph/zod/plugin.js.map +0 -1
- package/dist/graph/zod/schema.cjs +0 -99
- package/dist/graph/zod/schema.cjs.map +0 -1
- package/dist/graph/zod/schema.d.cts +0 -38
- package/dist/graph/zod/schema.d.cts.map +0 -1
- package/dist/graph/zod/schema.d.ts +0 -38
- package/dist/graph/zod/schema.d.ts.map +0 -1
- package/dist/graph/zod/schema.js +0 -94
- package/dist/graph/zod/schema.js.map +0 -1
- package/dist/graph/zod/zod-registry.cjs +0 -43
- package/dist/graph/zod/zod-registry.cjs.map +0 -1
- package/dist/graph/zod/zod-registry.d.cts +0 -51
- package/dist/graph/zod/zod-registry.d.cts.map +0 -1
- package/dist/graph/zod/zod-registry.d.ts +0 -51
- package/dist/graph/zod/zod-registry.d.ts.map +0 -1
- package/dist/graph/zod/zod-registry.js +0 -41
- package/dist/graph/zod/zod-registry.js.map +0 -1
- package/dist/hash.cjs +0 -271
- package/dist/hash.cjs.map +0 -1
- package/dist/hash.js +0 -269
- package/dist/hash.js.map +0 -1
- package/dist/index.cjs +0 -112
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -26
- package/dist/index.d.ts +0 -26
- package/dist/index.js +0 -22
- package/dist/index.js.map +0 -1
- package/dist/interrupt.cjs +0 -82
- package/dist/interrupt.cjs.map +0 -1
- package/dist/interrupt.d.cts +0 -58
- package/dist/interrupt.d.cts.map +0 -1
- package/dist/interrupt.d.ts +0 -58
- package/dist/interrupt.d.ts.map +0 -1
- package/dist/interrupt.js +0 -81
- package/dist/interrupt.js.map +0 -1
- package/dist/prebuilt/agentName.cjs +0 -153
- package/dist/prebuilt/agentName.cjs.map +0 -1
- package/dist/prebuilt/agentName.d.cts +0 -42
- package/dist/prebuilt/agentName.d.cts.map +0 -1
- package/dist/prebuilt/agentName.d.ts +0 -42
- package/dist/prebuilt/agentName.d.ts.map +0 -1
- package/dist/prebuilt/agentName.js +0 -152
- package/dist/prebuilt/agentName.js.map +0 -1
- package/dist/prebuilt/agent_executor.cjs +0 -44
- package/dist/prebuilt/agent_executor.cjs.map +0 -1
- package/dist/prebuilt/agent_executor.d.cts +0 -58
- package/dist/prebuilt/agent_executor.d.cts.map +0 -1
- package/dist/prebuilt/agent_executor.d.ts +0 -58
- package/dist/prebuilt/agent_executor.d.ts.map +0 -1
- package/dist/prebuilt/agent_executor.js +0 -44
- package/dist/prebuilt/agent_executor.js.map +0 -1
- package/dist/prebuilt/chat_agent_executor.cjs +0 -68
- package/dist/prebuilt/chat_agent_executor.cjs.map +0 -1
- package/dist/prebuilt/chat_agent_executor.d.cts +0 -23
- package/dist/prebuilt/chat_agent_executor.d.cts.map +0 -1
- package/dist/prebuilt/chat_agent_executor.d.ts +0 -23
- package/dist/prebuilt/chat_agent_executor.d.ts.map +0 -1
- package/dist/prebuilt/chat_agent_executor.js +0 -67
- package/dist/prebuilt/chat_agent_executor.js.map +0 -1
- package/dist/prebuilt/index.cjs +0 -15
- package/dist/prebuilt/index.d.cts +0 -8
- package/dist/prebuilt/index.d.ts +0 -8
- package/dist/prebuilt/index.js +0 -8
- package/dist/prebuilt/interrupt.d.cts +0 -61
- package/dist/prebuilt/interrupt.d.cts.map +0 -1
- package/dist/prebuilt/interrupt.d.ts +0 -61
- package/dist/prebuilt/interrupt.d.ts.map +0 -1
- package/dist/prebuilt/react_agent_executor.cjs +0 -344
- package/dist/prebuilt/react_agent_executor.cjs.map +0 -1
- package/dist/prebuilt/react_agent_executor.d.cts +0 -230
- package/dist/prebuilt/react_agent_executor.d.cts.map +0 -1
- package/dist/prebuilt/react_agent_executor.d.ts +0 -230
- package/dist/prebuilt/react_agent_executor.d.ts.map +0 -1
- package/dist/prebuilt/react_agent_executor.js +0 -342
- package/dist/prebuilt/react_agent_executor.js.map +0 -1
- package/dist/prebuilt/tool_executor.cjs +0 -48
- package/dist/prebuilt/tool_executor.cjs.map +0 -1
- package/dist/prebuilt/tool_executor.d.cts +0 -42
- package/dist/prebuilt/tool_executor.d.cts.map +0 -1
- package/dist/prebuilt/tool_executor.d.ts +0 -42
- package/dist/prebuilt/tool_executor.d.ts.map +0 -1
- package/dist/prebuilt/tool_executor.js +0 -47
- package/dist/prebuilt/tool_executor.js.map +0 -1
- package/dist/prebuilt/tool_node.cjs +0 -248
- package/dist/prebuilt/tool_node.cjs.map +0 -1
- package/dist/prebuilt/tool_node.d.cts +0 -182
- package/dist/prebuilt/tool_node.d.cts.map +0 -1
- package/dist/prebuilt/tool_node.d.ts +0 -182
- package/dist/prebuilt/tool_node.d.ts.map +0 -1
- package/dist/prebuilt/tool_node.js +0 -246
- package/dist/prebuilt/tool_node.js.map +0 -1
- package/dist/pregel/algo.cjs +0 -573
- package/dist/pregel/algo.cjs.map +0 -1
- package/dist/pregel/algo.d.cts +0 -13
- package/dist/pregel/algo.d.cts.map +0 -1
- package/dist/pregel/algo.d.ts +0 -13
- package/dist/pregel/algo.d.ts.map +0 -1
- package/dist/pregel/algo.js +0 -567
- package/dist/pregel/algo.js.map +0 -1
- package/dist/pregel/call.cjs +0 -53
- package/dist/pregel/call.cjs.map +0 -1
- package/dist/pregel/call.js +0 -50
- package/dist/pregel/call.js.map +0 -1
- package/dist/pregel/debug.cjs +0 -175
- package/dist/pregel/debug.cjs.map +0 -1
- package/dist/pregel/debug.js +0 -169
- package/dist/pregel/debug.js.map +0 -1
- package/dist/pregel/index.cjs +0 -1170
- package/dist/pregel/index.cjs.map +0 -1
- package/dist/pregel/index.d.cts +0 -546
- package/dist/pregel/index.d.cts.map +0 -1
- package/dist/pregel/index.d.ts +0 -546
- package/dist/pregel/index.d.ts.map +0 -1
- package/dist/pregel/index.js +0 -1168
- package/dist/pregel/index.js.map +0 -1
- package/dist/pregel/io.cjs +0 -140
- package/dist/pregel/io.cjs.map +0 -1
- package/dist/pregel/io.js +0 -135
- package/dist/pregel/io.js.map +0 -1
- package/dist/pregel/loop.cjs +0 -548
- package/dist/pregel/loop.cjs.map +0 -1
- package/dist/pregel/loop.js +0 -547
- package/dist/pregel/loop.js.map +0 -1
- package/dist/pregel/messages.cjs +0 -108
- package/dist/pregel/messages.cjs.map +0 -1
- package/dist/pregel/messages.js +0 -107
- package/dist/pregel/messages.js.map +0 -1
- package/dist/pregel/read.cjs +0 -152
- package/dist/pregel/read.cjs.map +0 -1
- package/dist/pregel/read.d.cts +0 -51
- package/dist/pregel/read.d.cts.map +0 -1
- package/dist/pregel/read.d.ts +0 -51
- package/dist/pregel/read.d.ts.map +0 -1
- package/dist/pregel/read.js +0 -150
- package/dist/pregel/read.js.map +0 -1
- package/dist/pregel/remote.cjs +0 -349
- package/dist/pregel/remote.cjs.map +0 -1
- package/dist/pregel/remote.d.cts +0 -123
- package/dist/pregel/remote.d.cts.map +0 -1
- package/dist/pregel/remote.d.ts +0 -123
- package/dist/pregel/remote.d.ts.map +0 -1
- package/dist/pregel/remote.js +0 -348
- package/dist/pregel/remote.js.map +0 -1
- package/dist/pregel/retry.cjs +0 -92
- package/dist/pregel/retry.cjs.map +0 -1
- package/dist/pregel/retry.js +0 -92
- package/dist/pregel/retry.js.map +0 -1
- package/dist/pregel/runnable_types.d.cts +0 -49
- package/dist/pregel/runnable_types.d.cts.map +0 -1
- package/dist/pregel/runnable_types.d.ts +0 -49
- package/dist/pregel/runnable_types.d.ts.map +0 -1
- package/dist/pregel/runner.cjs +0 -228
- package/dist/pregel/runner.cjs.map +0 -1
- package/dist/pregel/runner.js +0 -228
- package/dist/pregel/runner.js.map +0 -1
- package/dist/pregel/stream.cjs +0 -199
- package/dist/pregel/stream.cjs.map +0 -1
- package/dist/pregel/stream.js +0 -196
- package/dist/pregel/stream.js.map +0 -1
- package/dist/pregel/types.cjs +0 -27
- package/dist/pregel/types.cjs.map +0 -1
- package/dist/pregel/types.d.cts +0 -453
- package/dist/pregel/types.d.cts.map +0 -1
- package/dist/pregel/types.d.ts +0 -453
- package/dist/pregel/types.d.ts.map +0 -1
- package/dist/pregel/types.js +0 -25
- package/dist/pregel/types.js.map +0 -1
- package/dist/pregel/utils/config.cjs +0 -122
- package/dist/pregel/utils/config.cjs.map +0 -1
- package/dist/pregel/utils/config.d.cts +0 -36
- package/dist/pregel/utils/config.d.cts.map +0 -1
- package/dist/pregel/utils/config.d.ts +0 -36
- package/dist/pregel/utils/config.d.ts.map +0 -1
- package/dist/pregel/utils/config.js +0 -115
- package/dist/pregel/utils/config.js.map +0 -1
- package/dist/pregel/utils/index.cjs +0 -103
- package/dist/pregel/utils/index.cjs.map +0 -1
- package/dist/pregel/utils/index.d.cts +0 -51
- package/dist/pregel/utils/index.d.cts.map +0 -1
- package/dist/pregel/utils/index.d.ts +0 -51
- package/dist/pregel/utils/index.d.ts.map +0 -1
- package/dist/pregel/utils/index.js +0 -97
- package/dist/pregel/utils/index.js.map +0 -1
- package/dist/pregel/utils/subgraph.cjs +0 -19
- package/dist/pregel/utils/subgraph.cjs.map +0 -1
- package/dist/pregel/utils/subgraph.js +0 -17
- package/dist/pregel/utils/subgraph.js.map +0 -1
- package/dist/pregel/validate.cjs +0 -45
- package/dist/pregel/validate.cjs.map +0 -1
- package/dist/pregel/validate.js +0 -44
- package/dist/pregel/validate.js.map +0 -1
- package/dist/pregel/write.cjs +0 -97
- package/dist/pregel/write.cjs.map +0 -1
- package/dist/pregel/write.d.cts +0 -35
- package/dist/pregel/write.d.cts.map +0 -1
- package/dist/pregel/write.d.ts +0 -35
- package/dist/pregel/write.d.ts.map +0 -1
- package/dist/pregel/write.js +0 -95
- package/dist/pregel/write.js.map +0 -1
- package/dist/remote.cjs +0 -3
- package/dist/remote.d.cts +0 -2
- package/dist/remote.d.ts +0 -2
- package/dist/remote.js +0 -3
- package/dist/setup/async_local_storage.cjs +0 -12
- package/dist/setup/async_local_storage.cjs.map +0 -1
- package/dist/setup/async_local_storage.js +0 -11
- package/dist/setup/async_local_storage.js.map +0 -1
- package/dist/utils.cjs +0 -88
- package/dist/utils.cjs.map +0 -1
- package/dist/utils.d.cts +0 -32
- package/dist/utils.d.cts.map +0 -1
- package/dist/utils.d.ts +0 -32
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -81
- package/dist/utils.js.map +0 -1
- package/dist/web.cjs +0 -96
- package/dist/web.d.cts +0 -23
- package/dist/web.d.ts +0 -23
- package/dist/web.js +0 -15
- package/dist/writer.cjs +0 -15
- package/dist/writer.cjs.map +0 -1
- package/dist/writer.d.cts +0 -7
- package/dist/writer.d.cts.map +0 -1
- package/dist/writer.d.ts +0 -7
- package/dist/writer.d.ts.map +0 -1
- package/dist/writer.js +0 -14
- package/dist/writer.js.map +0 -1
package/dist/pregel/call.cjs
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
-
const require_constants = require('../constants.cjs');
|
|
3
|
-
const require_utils = require('../utils.cjs');
|
|
4
|
-
const require_write = require('./write.cjs');
|
|
5
|
-
const __langchain_core_singletons = require_rolldown_runtime.__toESM(require("@langchain/core/singletons"));
|
|
6
|
-
const __langchain_core_runnables = require_rolldown_runtime.__toESM(require("@langchain/core/runnables"));
|
|
7
|
-
|
|
8
|
-
//#region src/pregel/call.ts
|
|
9
|
-
/**
|
|
10
|
-
* Wraps a user function in a Runnable that writes the returned value to the RETURN channel.
|
|
11
|
-
*/
|
|
12
|
-
function getRunnableForFunc(name, func) {
|
|
13
|
-
const run = new require_utils.RunnableCallable({
|
|
14
|
-
func: (input) => func(...input),
|
|
15
|
-
name,
|
|
16
|
-
trace: false,
|
|
17
|
-
recurse: false
|
|
18
|
-
});
|
|
19
|
-
return new __langchain_core_runnables.RunnableSequence({
|
|
20
|
-
name,
|
|
21
|
-
first: run,
|
|
22
|
-
last: new require_write.ChannelWrite([{
|
|
23
|
-
channel: require_constants.RETURN,
|
|
24
|
-
value: require_write.PASSTHROUGH
|
|
25
|
-
}], [require_constants.TAG_HIDDEN])
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
function getRunnableForEntrypoint(name, func) {
|
|
29
|
-
const run = new require_utils.RunnableCallable({
|
|
30
|
-
func: (input, config) => {
|
|
31
|
-
return func(input, config);
|
|
32
|
-
},
|
|
33
|
-
name,
|
|
34
|
-
trace: false,
|
|
35
|
-
recurse: false
|
|
36
|
-
});
|
|
37
|
-
return run;
|
|
38
|
-
}
|
|
39
|
-
function call({ func, name, cache, retry }, ...args) {
|
|
40
|
-
const config = __langchain_core_singletons.AsyncLocalStorageProviderSingleton.getRunnableConfig();
|
|
41
|
-
if (typeof config.configurable?.[require_constants.CONFIG_KEY_CALL] === "function") return config.configurable[require_constants.CONFIG_KEY_CALL](func, name, args, {
|
|
42
|
-
retry,
|
|
43
|
-
cache,
|
|
44
|
-
callbacks: config.callbacks
|
|
45
|
-
});
|
|
46
|
-
throw new Error("Async local storage not initialized. Please call initializeAsyncLocalStorageSingleton() before using this function.");
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
//#endregion
|
|
50
|
-
exports.call = call;
|
|
51
|
-
exports.getRunnableForEntrypoint = getRunnableForEntrypoint;
|
|
52
|
-
exports.getRunnableForFunc = getRunnableForFunc;
|
|
53
|
-
//# sourceMappingURL=call.cjs.map
|
package/dist/pregel/call.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"call.cjs","names":["RunnableCallable","RunnableSequence","ChannelWrite","RETURN","PASSTHROUGH","TAG_HIDDEN","AsyncLocalStorageProviderSingleton","CONFIG_KEY_CALL"],"sources":["../../src/pregel/call.ts"],"sourcesContent":["import {\n Runnable,\n RunnableConfig,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { AsyncLocalStorageProviderSingleton } from \"@langchain/core/singletons\";\nimport { CONFIG_KEY_CALL, RETURN, TAG_HIDDEN } from \"../constants.js\";\nimport { ChannelWrite, PASSTHROUGH } from \"./write.js\";\nimport { CachePolicy, RetryPolicy } from \"./utils/index.js\";\nimport { RunnableCallable, type RunnableCallableArgs } from \"../utils.js\";\nimport { EntrypointFunc, EntrypointReturnT, TaskFunc } from \"../func/types.js\";\nimport { LangGraphRunnableConfig } from \"./runnable_types.js\";\n\n/**\n * Wraps a user function in a Runnable that writes the returned value to the RETURN channel.\n */\nexport function getRunnableForFunc<ArgsT extends unknown[], OutputT>(\n name: string,\n func: TaskFunc<ArgsT, OutputT>\n): Runnable<ArgsT, OutputT, LangGraphRunnableConfig> {\n const run = new RunnableCallable<ArgsT, OutputT>({\n func: (input: ArgsT) => func(...input),\n name,\n trace: false,\n recurse: false,\n } as RunnableCallableArgs);\n\n return new RunnableSequence<ArgsT, OutputT>({\n name,\n first: run,\n last: new ChannelWrite<OutputT>(\n [{ channel: RETURN, value: PASSTHROUGH }],\n [TAG_HIDDEN]\n ),\n });\n}\n\nexport function getRunnableForEntrypoint<InputT, OutputT>(\n name: string,\n func: EntrypointFunc<InputT, OutputT>\n): Runnable<InputT, EntrypointReturnT<OutputT>, LangGraphRunnableConfig> {\n const run = new RunnableCallable<InputT, EntrypointReturnT<OutputT>>({\n func: (input: InputT, config: LangGraphRunnableConfig) => {\n return func(input, config);\n },\n name,\n trace: false,\n recurse: false,\n });\n\n return run;\n}\n\nexport type CallWrapperOptions<ArgsT extends unknown[], OutputT> = {\n func: TaskFunc<ArgsT, OutputT>;\n name: string;\n retry?: RetryPolicy;\n cache?: CachePolicy;\n};\n\nexport function call<ArgsT extends unknown[], OutputT>(\n { func, name, cache, retry }: CallWrapperOptions<ArgsT, OutputT>,\n ...args: ArgsT\n): Promise<OutputT> {\n const config =\n AsyncLocalStorageProviderSingleton.getRunnableConfig() as RunnableConfig;\n if (typeof config.configurable?.[CONFIG_KEY_CALL] === \"function\") {\n return config.configurable[CONFIG_KEY_CALL](func, name, args, {\n retry,\n cache,\n callbacks: config.callbacks,\n });\n }\n throw new Error(\n \"Async local storage not initialized. Please call initializeAsyncLocalStorageSingleton() before using this function.\"\n );\n}\n"],"mappings":";;;;;;;;;;;AAgBA,SAAgB,mBACd,MACA,MACmD;CACnD,MAAM,MAAM,IAAIA,+BAAiC;EAC/C,OAAO,UAAiB,KAAK,GAAG;EAChC;EACA,OAAO;EACP,SAAS;;AAGX,QAAO,IAAIC,4CAAiC;EAC1C;EACA,OAAO;EACP,MAAM,IAAIC,2BACR,CAAC;GAAE,SAASC;GAAQ,OAAOC;MAC3B,CAACC;;;AAKP,SAAgB,yBACd,MACA,MACuE;CACvE,MAAM,MAAM,IAAIL,+BAAqD;EACnE,OAAO,OAAe,WAAoC;AACxD,UAAO,KAAK,OAAO;;EAErB;EACA,OAAO;EACP,SAAS;;AAGX,QAAO;;AAUT,SAAgB,KACd,EAAE,MAAM,MAAM,OAAO,SACrB,GAAG,MACe;CAClB,MAAM,SACJM,+DAAmC;AACrC,KAAI,OAAO,OAAO,eAAeC,uCAAqB,WACpD,QAAO,OAAO,aAAaA,mCAAiB,MAAM,MAAM,MAAM;EAC5D;EACA;EACA,WAAW,OAAO;;AAGtB,OAAM,IAAI,MACR"}
|
package/dist/pregel/call.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { CONFIG_KEY_CALL, RETURN, TAG_HIDDEN } from "../constants.js";
|
|
2
|
-
import { RunnableCallable } from "../utils.js";
|
|
3
|
-
import { ChannelWrite, PASSTHROUGH } from "./write.js";
|
|
4
|
-
import { AsyncLocalStorageProviderSingleton } from "@langchain/core/singletons";
|
|
5
|
-
import { RunnableSequence } from "@langchain/core/runnables";
|
|
6
|
-
|
|
7
|
-
//#region src/pregel/call.ts
|
|
8
|
-
/**
|
|
9
|
-
* Wraps a user function in a Runnable that writes the returned value to the RETURN channel.
|
|
10
|
-
*/
|
|
11
|
-
function getRunnableForFunc(name, func) {
|
|
12
|
-
const run = new RunnableCallable({
|
|
13
|
-
func: (input) => func(...input),
|
|
14
|
-
name,
|
|
15
|
-
trace: false,
|
|
16
|
-
recurse: false
|
|
17
|
-
});
|
|
18
|
-
return new RunnableSequence({
|
|
19
|
-
name,
|
|
20
|
-
first: run,
|
|
21
|
-
last: new ChannelWrite([{
|
|
22
|
-
channel: RETURN,
|
|
23
|
-
value: PASSTHROUGH
|
|
24
|
-
}], [TAG_HIDDEN])
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
function getRunnableForEntrypoint(name, func) {
|
|
28
|
-
const run = new RunnableCallable({
|
|
29
|
-
func: (input, config) => {
|
|
30
|
-
return func(input, config);
|
|
31
|
-
},
|
|
32
|
-
name,
|
|
33
|
-
trace: false,
|
|
34
|
-
recurse: false
|
|
35
|
-
});
|
|
36
|
-
return run;
|
|
37
|
-
}
|
|
38
|
-
function call({ func, name, cache, retry }, ...args) {
|
|
39
|
-
const config = AsyncLocalStorageProviderSingleton.getRunnableConfig();
|
|
40
|
-
if (typeof config.configurable?.[CONFIG_KEY_CALL] === "function") return config.configurable[CONFIG_KEY_CALL](func, name, args, {
|
|
41
|
-
retry,
|
|
42
|
-
cache,
|
|
43
|
-
callbacks: config.callbacks
|
|
44
|
-
});
|
|
45
|
-
throw new Error("Async local storage not initialized. Please call initializeAsyncLocalStorageSingleton() before using this function.");
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
//#endregion
|
|
49
|
-
export { call, getRunnableForEntrypoint, getRunnableForFunc };
|
|
50
|
-
//# sourceMappingURL=call.js.map
|
package/dist/pregel/call.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","names":[],"sources":["../../src/pregel/call.ts"],"sourcesContent":["import {\n Runnable,\n RunnableConfig,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { AsyncLocalStorageProviderSingleton } from \"@langchain/core/singletons\";\nimport { CONFIG_KEY_CALL, RETURN, TAG_HIDDEN } from \"../constants.js\";\nimport { ChannelWrite, PASSTHROUGH } from \"./write.js\";\nimport { CachePolicy, RetryPolicy } from \"./utils/index.js\";\nimport { RunnableCallable, type RunnableCallableArgs } from \"../utils.js\";\nimport { EntrypointFunc, EntrypointReturnT, TaskFunc } from \"../func/types.js\";\nimport { LangGraphRunnableConfig } from \"./runnable_types.js\";\n\n/**\n * Wraps a user function in a Runnable that writes the returned value to the RETURN channel.\n */\nexport function getRunnableForFunc<ArgsT extends unknown[], OutputT>(\n name: string,\n func: TaskFunc<ArgsT, OutputT>\n): Runnable<ArgsT, OutputT, LangGraphRunnableConfig> {\n const run = new RunnableCallable<ArgsT, OutputT>({\n func: (input: ArgsT) => func(...input),\n name,\n trace: false,\n recurse: false,\n } as RunnableCallableArgs);\n\n return new RunnableSequence<ArgsT, OutputT>({\n name,\n first: run,\n last: new ChannelWrite<OutputT>(\n [{ channel: RETURN, value: PASSTHROUGH }],\n [TAG_HIDDEN]\n ),\n });\n}\n\nexport function getRunnableForEntrypoint<InputT, OutputT>(\n name: string,\n func: EntrypointFunc<InputT, OutputT>\n): Runnable<InputT, EntrypointReturnT<OutputT>, LangGraphRunnableConfig> {\n const run = new RunnableCallable<InputT, EntrypointReturnT<OutputT>>({\n func: (input: InputT, config: LangGraphRunnableConfig) => {\n return func(input, config);\n },\n name,\n trace: false,\n recurse: false,\n });\n\n return run;\n}\n\nexport type CallWrapperOptions<ArgsT extends unknown[], OutputT> = {\n func: TaskFunc<ArgsT, OutputT>;\n name: string;\n retry?: RetryPolicy;\n cache?: CachePolicy;\n};\n\nexport function call<ArgsT extends unknown[], OutputT>(\n { func, name, cache, retry }: CallWrapperOptions<ArgsT, OutputT>,\n ...args: ArgsT\n): Promise<OutputT> {\n const config =\n AsyncLocalStorageProviderSingleton.getRunnableConfig() as RunnableConfig;\n if (typeof config.configurable?.[CONFIG_KEY_CALL] === \"function\") {\n return config.configurable[CONFIG_KEY_CALL](func, name, args, {\n retry,\n cache,\n callbacks: config.callbacks,\n });\n }\n throw new Error(\n \"Async local storage not initialized. Please call initializeAsyncLocalStorageSingleton() before using this function.\"\n );\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,mBACd,MACA,MACmD;CACnD,MAAM,MAAM,IAAI,iBAAiC;EAC/C,OAAO,UAAiB,KAAK,GAAG;EAChC;EACA,OAAO;EACP,SAAS;;AAGX,QAAO,IAAI,iBAAiC;EAC1C;EACA,OAAO;EACP,MAAM,IAAI,aACR,CAAC;GAAE,SAAS;GAAQ,OAAO;MAC3B,CAAC;;;AAKP,SAAgB,yBACd,MACA,MACuE;CACvE,MAAM,MAAM,IAAI,iBAAqD;EACnE,OAAO,OAAe,WAAoC;AACxD,UAAO,KAAK,OAAO;;EAErB;EACA,OAAO;EACP,SAAS;;AAGX,QAAO;;AAUT,SAAgB,KACd,EAAE,MAAM,MAAM,OAAO,SACrB,GAAG,MACe;CAClB,MAAM,SACJ,mCAAmC;AACrC,KAAI,OAAO,OAAO,eAAe,qBAAqB,WACpD,QAAO,OAAO,aAAa,iBAAiB,MAAM,MAAM,MAAM;EAC5D;EACA;EACA,WAAW,OAAO;;AAGtB,OAAM,IAAI,MACR"}
|
package/dist/pregel/debug.cjs
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
const require_constants = require('../constants.cjs');
|
|
2
|
-
const require_io = require('./io.cjs');
|
|
3
|
-
const require_subgraph = require('./utils/subgraph.cjs');
|
|
4
|
-
|
|
5
|
-
//#region src/pregel/debug.ts
|
|
6
|
-
const COLORS_MAP = {
|
|
7
|
-
blue: {
|
|
8
|
-
start: "\x1B[34m",
|
|
9
|
-
end: "\x1B[0m"
|
|
10
|
-
},
|
|
11
|
-
green: {
|
|
12
|
-
start: "\x1B[32m",
|
|
13
|
-
end: "\x1B[0m"
|
|
14
|
-
},
|
|
15
|
-
yellow: {
|
|
16
|
-
start: "\x1B[33;1m",
|
|
17
|
-
end: "\x1B[0m"
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Wrap some text in a color for printing to the console.
|
|
22
|
-
*/
|
|
23
|
-
const wrap = (color, text) => `${color.start}${text}${color.end}`;
|
|
24
|
-
function* mapDebugTasks(tasks) {
|
|
25
|
-
for (const { id, name, input, config, triggers, writes } of tasks) {
|
|
26
|
-
if (config?.tags?.includes(require_constants.TAG_HIDDEN)) continue;
|
|
27
|
-
const interrupts = writes.filter(([writeId, n]) => {
|
|
28
|
-
return writeId === id && n === require_constants.INTERRUPT;
|
|
29
|
-
}).map(([, v]) => {
|
|
30
|
-
return v;
|
|
31
|
-
});
|
|
32
|
-
yield {
|
|
33
|
-
id,
|
|
34
|
-
name,
|
|
35
|
-
input,
|
|
36
|
-
triggers,
|
|
37
|
-
interrupts
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
function isMultipleChannelWrite(value) {
|
|
42
|
-
if (typeof value !== "object" || value === null) return false;
|
|
43
|
-
return "$writes" in value && Array.isArray(value.$writes);
|
|
44
|
-
}
|
|
45
|
-
function mapTaskResultWrites(writes) {
|
|
46
|
-
const result = {};
|
|
47
|
-
for (const [channel, value] of writes) {
|
|
48
|
-
const strChannel = String(channel);
|
|
49
|
-
if (strChannel in result) {
|
|
50
|
-
const channelWrites = isMultipleChannelWrite(result[strChannel]) ? result[strChannel].$writes : [result[strChannel]];
|
|
51
|
-
channelWrites.push(value);
|
|
52
|
-
result[strChannel] = { $writes: channelWrites };
|
|
53
|
-
} else result[strChannel] = value;
|
|
54
|
-
}
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
function* mapDebugTaskResults(tasks, streamChannels) {
|
|
58
|
-
for (const [{ id, name, config }, writes] of tasks) {
|
|
59
|
-
if (config?.tags?.includes(require_constants.TAG_HIDDEN)) continue;
|
|
60
|
-
yield {
|
|
61
|
-
id,
|
|
62
|
-
name,
|
|
63
|
-
result: mapTaskResultWrites(writes.filter(([channel]) => {
|
|
64
|
-
return Array.isArray(streamChannels) ? streamChannels.includes(channel) : channel === streamChannels;
|
|
65
|
-
})),
|
|
66
|
-
interrupts: writes.filter((w) => w[0] === require_constants.INTERRUPT).map((w) => w[1])
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
function* mapDebugCheckpoint(config, channels, streamChannels, metadata, tasks, pendingWrites, parentConfig, outputKeys) {
|
|
71
|
-
function formatConfig(config$1) {
|
|
72
|
-
const pyConfig = {};
|
|
73
|
-
if (config$1.callbacks != null) pyConfig.callbacks = config$1.callbacks;
|
|
74
|
-
if (config$1.configurable != null) pyConfig.configurable = config$1.configurable;
|
|
75
|
-
if (config$1.maxConcurrency != null) pyConfig.max_concurrency = config$1.maxConcurrency;
|
|
76
|
-
if (config$1.metadata != null) pyConfig.metadata = config$1.metadata;
|
|
77
|
-
if (config$1.recursionLimit != null) pyConfig.recursion_limit = config$1.recursionLimit;
|
|
78
|
-
if (config$1.runId != null) pyConfig.run_id = config$1.runId;
|
|
79
|
-
if (config$1.runName != null) pyConfig.run_name = config$1.runName;
|
|
80
|
-
if (config$1.tags != null) pyConfig.tags = config$1.tags;
|
|
81
|
-
return pyConfig;
|
|
82
|
-
}
|
|
83
|
-
const parentNs = config.configurable?.checkpoint_ns;
|
|
84
|
-
const taskStates = {};
|
|
85
|
-
for (const task of tasks) {
|
|
86
|
-
const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];
|
|
87
|
-
if (!candidates.find(require_subgraph.findSubgraphPregel)) continue;
|
|
88
|
-
let taskNs = `${task.name}:${task.id}`;
|
|
89
|
-
if (parentNs) taskNs = `${parentNs}|${taskNs}`;
|
|
90
|
-
taskStates[task.id] = { configurable: {
|
|
91
|
-
thread_id: config.configurable?.thread_id,
|
|
92
|
-
checkpoint_ns: taskNs
|
|
93
|
-
} };
|
|
94
|
-
}
|
|
95
|
-
yield {
|
|
96
|
-
config: formatConfig(config),
|
|
97
|
-
values: require_io.readChannels(channels, streamChannels),
|
|
98
|
-
metadata,
|
|
99
|
-
next: tasks.map((task) => task.name),
|
|
100
|
-
tasks: tasksWithWrites(tasks, pendingWrites, taskStates, outputKeys),
|
|
101
|
-
parentConfig: parentConfig ? formatConfig(parentConfig) : void 0
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
function tasksWithWrites(tasks, pendingWrites, states, outputKeys) {
|
|
105
|
-
return tasks.map((task) => {
|
|
106
|
-
const error = pendingWrites.find(([id, n]) => id === task.id && n === require_constants.ERROR)?.[2];
|
|
107
|
-
const interrupts = pendingWrites.filter(([id, n]) => id === task.id && n === require_constants.INTERRUPT).map(([, , v]) => v);
|
|
108
|
-
const result = (() => {
|
|
109
|
-
if (error || interrupts.length || !pendingWrites.length) return void 0;
|
|
110
|
-
const idx = pendingWrites.findIndex(([tid, n]) => tid === task.id && n === require_constants.RETURN);
|
|
111
|
-
if (idx >= 0) return pendingWrites[idx][2];
|
|
112
|
-
if (typeof outputKeys === "string") return pendingWrites.find(([tid, n]) => tid === task.id && n === outputKeys)?.[2];
|
|
113
|
-
if (Array.isArray(outputKeys)) {
|
|
114
|
-
const results = pendingWrites.filter(([tid, n]) => tid === task.id && outputKeys.includes(n)).map(([, n, v]) => [n, v]);
|
|
115
|
-
if (!results.length) return void 0;
|
|
116
|
-
return mapTaskResultWrites(results);
|
|
117
|
-
}
|
|
118
|
-
return void 0;
|
|
119
|
-
})();
|
|
120
|
-
if (error) return {
|
|
121
|
-
id: task.id,
|
|
122
|
-
name: task.name,
|
|
123
|
-
path: task.path,
|
|
124
|
-
error,
|
|
125
|
-
interrupts,
|
|
126
|
-
result
|
|
127
|
-
};
|
|
128
|
-
const taskState = states?.[task.id];
|
|
129
|
-
return {
|
|
130
|
-
id: task.id,
|
|
131
|
-
name: task.name,
|
|
132
|
-
path: task.path,
|
|
133
|
-
interrupts,
|
|
134
|
-
...taskState !== void 0 ? { state: taskState } : {},
|
|
135
|
-
result
|
|
136
|
-
};
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
function printStepCheckpoint(step, channels, whitelist) {
|
|
140
|
-
console.log([
|
|
141
|
-
`${wrap(COLORS_MAP.blue, `[${step}:checkpoint]`)}`,
|
|
142
|
-
`\x1b[1m State at the end of step ${step}:\x1b[0m\n`,
|
|
143
|
-
JSON.stringify(require_io.readChannels(channels, whitelist), null, 2)
|
|
144
|
-
].join(""));
|
|
145
|
-
}
|
|
146
|
-
function printStepTasks(step, nextTasks) {
|
|
147
|
-
const nTasks = nextTasks.length;
|
|
148
|
-
console.log([
|
|
149
|
-
`${wrap(COLORS_MAP.blue, `[${step}:tasks]`)}`,
|
|
150
|
-
`\x1b[1m Starting step ${step} with ${nTasks} task${nTasks === 1 ? "" : "s"}:\x1b[0m\n`,
|
|
151
|
-
nextTasks.map((task) => `- ${wrap(COLORS_MAP.green, String(task.name))} -> ${JSON.stringify(task.input, null, 2)}`).join("\n")
|
|
152
|
-
].join(""));
|
|
153
|
-
}
|
|
154
|
-
function printStepWrites(step, writes, whitelist) {
|
|
155
|
-
const byChannel = {};
|
|
156
|
-
for (const [channel, value] of writes) if (whitelist.includes(channel)) {
|
|
157
|
-
if (!byChannel[channel]) byChannel[channel] = [];
|
|
158
|
-
byChannel[channel].push(value);
|
|
159
|
-
}
|
|
160
|
-
console.log([
|
|
161
|
-
`${wrap(COLORS_MAP.blue, `[${step}:writes]`)}`,
|
|
162
|
-
`\x1b[1m Finished step ${step} with writes to ${Object.keys(byChannel).length} channel${Object.keys(byChannel).length !== 1 ? "s" : ""}:\x1b[0m\n`,
|
|
163
|
-
Object.entries(byChannel).map(([name, vals]) => `- ${wrap(COLORS_MAP.yellow, name)} -> ${vals.map((v) => JSON.stringify(v)).join(", ")}`).join("\n")
|
|
164
|
-
].join(""));
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
//#endregion
|
|
168
|
-
exports.mapDebugCheckpoint = mapDebugCheckpoint;
|
|
169
|
-
exports.mapDebugTaskResults = mapDebugTaskResults;
|
|
170
|
-
exports.mapDebugTasks = mapDebugTasks;
|
|
171
|
-
exports.printStepCheckpoint = printStepCheckpoint;
|
|
172
|
-
exports.printStepTasks = printStepTasks;
|
|
173
|
-
exports.printStepWrites = printStepWrites;
|
|
174
|
-
exports.tasksWithWrites = tasksWithWrites;
|
|
175
|
-
//# sourceMappingURL=debug.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug.cjs","names":["COLORS_MAP: ConsoleColorMap","TAG_HIDDEN","INTERRUPT","result: Record<string, unknown>","pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n >","config","taskStates: Record<string, RunnableConfig | StateSnapshot>","findSubgraphPregel","readChannels","ERROR","RETURN","byChannel: Record<string, any[]>"],"sources":["../../src/pregel/debug.ts"],"sourcesContent":["import { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n CheckpointMetadata,\n CheckpointPendingWrite,\n PendingWrite,\n} from \"@langchain/langgraph-checkpoint\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport {\n ERROR,\n Interrupt,\n INTERRUPT,\n RETURN,\n TAG_HIDDEN,\n} from \"../constants.js\";\nimport { EmptyChannelError } from \"../errors.js\";\nimport {\n PregelExecutableTask,\n PregelTaskDescription,\n StateSnapshot,\n} from \"./types.js\";\nimport { readChannels } from \"./io.js\";\nimport { findSubgraphPregel } from \"./utils/subgraph.js\";\n\ntype ConsoleColors = {\n start: string;\n end: string;\n};\n\ntype ConsoleColorMap = {\n [key: string]: ConsoleColors;\n};\n\nconst COLORS_MAP: ConsoleColorMap = {\n blue: {\n start: \"\\x1b[34m\",\n end: \"\\x1b[0m\",\n },\n green: {\n start: \"\\x1b[32m\",\n end: \"\\x1b[0m\",\n },\n yellow: {\n start: \"\\x1b[33;1m\",\n end: \"\\x1b[0m\",\n },\n};\n\n/**\n * Wrap some text in a color for printing to the console.\n */\nexport const wrap = (color: ConsoleColors, text: string): string =>\n `${color.start}${text}${color.end}`;\n\nexport function printCheckpoint<Value>(\n step: number,\n channels: Record<string, BaseChannel<Value>>\n) {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, \"[langgraph/checkpoint]\")}`,\n `Finishing step ${step}. Channel values:\\n`,\n `\\n${JSON.stringify(\n Object.fromEntries(_readChannels<Value>(channels)),\n null,\n 2\n )}`,\n ].join(\"\")\n );\n}\n\nexport function* _readChannels<Value>(\n channels: Record<string, BaseChannel<Value>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): IterableIterator<[string, any]> {\n for (const [name, channel] of Object.entries(channels)) {\n try {\n yield [name, channel.get()];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.name === EmptyChannelError.unminifiable_name) {\n // Skip the channel if it's empty\n continue;\n } else {\n throw error; // Re-throw the error if it's not an EmptyChannelError\n }\n }\n }\n}\n\nexport function* mapDebugTasks<N extends PropertyKey, C extends PropertyKey>(\n tasks: readonly PregelExecutableTask<N, C>[]\n) {\n for (const { id, name, input, config, triggers, writes } of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n\n const interrupts = writes\n .filter(([writeId, n]) => {\n return writeId === id && n === INTERRUPT;\n })\n .map(([, v]) => {\n return v;\n });\n yield { id, name, input, triggers, interrupts };\n }\n}\n\nfunction isMultipleChannelWrite(\n value: unknown\n): value is { $writes: unknown[] } {\n if (typeof value !== \"object\" || value === null) return false;\n return \"$writes\" in value && Array.isArray(value.$writes);\n}\n\nfunction mapTaskResultWrites(writes: PendingWrite<unknown>[]) {\n const result: Record<string, unknown> = {};\n\n for (const [channel, value] of writes) {\n const strChannel = String(channel);\n\n if (strChannel in result) {\n const channelWrites = isMultipleChannelWrite(result[strChannel])\n ? result[strChannel].$writes\n : [result[strChannel]];\n\n channelWrites.push(value);\n result[strChannel] = { $writes: channelWrites };\n } else {\n result[strChannel] = value;\n }\n }\n return result;\n}\n\nexport function* mapDebugTaskResults<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n tasks: readonly [PregelExecutableTask<N, C>, PendingWrite<C>[]][],\n streamChannels: PropertyKey | Array<PropertyKey>\n) {\n for (const [{ id, name, config }, writes] of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n yield {\n id,\n name,\n result: mapTaskResultWrites(\n writes.filter(([channel]) => {\n return Array.isArray(streamChannels)\n ? streamChannels.includes(channel)\n : channel === streamChannels;\n })\n ),\n interrupts: writes.filter((w) => w[0] === INTERRUPT).map((w) => w[1]),\n };\n }\n}\n\ntype ChannelKey = string | number | symbol;\n\nexport function* mapDebugCheckpoint<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n config: RunnableConfig,\n channels: Record<string, BaseChannel>,\n streamChannels: string | string[],\n metadata: CheckpointMetadata,\n tasks: readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n parentConfig: RunnableConfig | undefined,\n outputKeys: ChannelKey | ChannelKey[]\n) {\n function formatConfig(config: RunnableConfig) {\n // https://stackoverflow.com/a/78298178\n type CamelToSnake<\n T extends string,\n A extends string = \"\"\n > = T extends `${infer F}${infer R}`\n ? CamelToSnake<\n R,\n `${A}${F extends Lowercase<F> ? F : `_${Lowercase<F>}`}`\n >\n : A;\n\n // make sure the config is consistent with Python\n const pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n > = {};\n\n if (config.callbacks != null) pyConfig.callbacks = config.callbacks;\n if (config.configurable != null)\n pyConfig.configurable = config.configurable;\n if (config.maxConcurrency != null)\n pyConfig.max_concurrency = config.maxConcurrency;\n\n if (config.metadata != null) pyConfig.metadata = config.metadata;\n if (config.recursionLimit != null)\n pyConfig.recursion_limit = config.recursionLimit;\n if (config.runId != null) pyConfig.run_id = config.runId;\n if (config.runName != null) pyConfig.run_name = config.runName;\n if (config.tags != null) pyConfig.tags = config.tags;\n\n return pyConfig;\n }\n\n const parentNs = config.configurable?.checkpoint_ns;\n const taskStates: Record<string, RunnableConfig | StateSnapshot> = {};\n\n for (const task of tasks) {\n const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];\n if (!candidates.find(findSubgraphPregel)) continue;\n\n let taskNs = `${task.name as string}:${task.id}`;\n if (parentNs) taskNs = `${parentNs}|${taskNs}`;\n\n taskStates[task.id] = {\n configurable: {\n thread_id: config.configurable?.thread_id,\n checkpoint_ns: taskNs,\n },\n };\n }\n\n yield {\n config: formatConfig(config),\n values: readChannels(channels, streamChannels),\n metadata,\n next: tasks.map((task) => task.name),\n tasks: tasksWithWrites(tasks, pendingWrites, taskStates, outputKeys),\n parentConfig: parentConfig ? formatConfig(parentConfig) : undefined,\n };\n}\n\nexport function tasksWithWrites<N extends PropertyKey, C extends PropertyKey>(\n tasks: PregelTaskDescription[] | readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n states: Record<string, RunnableConfig | StateSnapshot> | undefined,\n outputKeys: ChannelKey[] | ChannelKey\n): PregelTaskDescription[] {\n return tasks.map((task): PregelTaskDescription => {\n const error = pendingWrites.find(\n ([id, n]) => id === task.id && n === ERROR\n )?.[2];\n\n const interrupts = pendingWrites\n .filter(([id, n]) => id === task.id && n === INTERRUPT)\n .map(([, , v]) => v) as Interrupt[];\n\n const result = (() => {\n if (error || interrupts.length || !pendingWrites.length) return undefined;\n\n const idx = pendingWrites.findIndex(\n ([tid, n]) => tid === task.id && n === RETURN\n );\n\n if (idx >= 0) return pendingWrites[idx][2];\n\n if (typeof outputKeys === \"string\") {\n return pendingWrites.find(\n ([tid, n]) => tid === task.id && n === outputKeys\n )?.[2];\n }\n\n if (Array.isArray(outputKeys)) {\n const results = pendingWrites\n .filter(([tid, n]) => tid === task.id && outputKeys.includes(n))\n .map(([, n, v]) => [n, v] as PendingWrite<C>);\n\n if (!results.length) return undefined;\n return mapTaskResultWrites(results);\n }\n\n return undefined;\n })();\n\n if (error) {\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n error,\n interrupts,\n result,\n };\n }\n\n const taskState = states?.[task.id];\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n interrupts,\n ...(taskState !== undefined ? { state: taskState } : {}),\n result,\n };\n });\n}\n\nexport function printStepCheckpoint(\n step: number,\n channels: Record<string, BaseChannel<unknown>>,\n whitelist: string[]\n): void {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:checkpoint]`)}`,\n `\\x1b[1m State at the end of step ${step}:\\x1b[0m\\n`,\n JSON.stringify(readChannels(channels, whitelist), null, 2),\n ].join(\"\")\n );\n}\n\nexport function printStepTasks<N extends PropertyKey, C extends PropertyKey>(\n step: number,\n nextTasks: readonly PregelExecutableTask<N, C>[]\n): void {\n const nTasks = nextTasks.length;\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:tasks]`)}`,\n `\\x1b[1m Starting step ${step} with ${nTasks} task${\n nTasks === 1 ? \"\" : \"s\"\n }:\\x1b[0m\\n`,\n nextTasks\n .map(\n (task) =>\n `- ${wrap(COLORS_MAP.green, String(task.name))} -> ${JSON.stringify(\n task.input,\n null,\n 2\n )}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n\nexport function printStepWrites(\n step: number,\n writes: PendingWrite[],\n whitelist: string[]\n): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const byChannel: Record<string, any[]> = {};\n\n for (const [channel, value] of writes) {\n if (whitelist.includes(channel)) {\n if (!byChannel[channel]) {\n byChannel[channel] = [];\n }\n byChannel[channel].push(value);\n }\n }\n\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:writes]`)}`,\n `\\x1b[1m Finished step ${step} with writes to ${\n Object.keys(byChannel).length\n } channel${Object.keys(byChannel).length !== 1 ? \"s\" : \"\"}:\\x1b[0m\\n`,\n Object.entries(byChannel)\n .map(\n ([name, vals]) =>\n `- ${wrap(COLORS_MAP.yellow, name)} -> ${vals\n .map((v) => JSON.stringify(v))\n .join(\", \")}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n"],"mappings":"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"}
|
package/dist/pregel/debug.js
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { ERROR, INTERRUPT, RETURN, TAG_HIDDEN } from "../constants.js";
|
|
2
|
-
import { readChannels } from "./io.js";
|
|
3
|
-
import { findSubgraphPregel } from "./utils/subgraph.js";
|
|
4
|
-
|
|
5
|
-
//#region src/pregel/debug.ts
|
|
6
|
-
const COLORS_MAP = {
|
|
7
|
-
blue: {
|
|
8
|
-
start: "\x1B[34m",
|
|
9
|
-
end: "\x1B[0m"
|
|
10
|
-
},
|
|
11
|
-
green: {
|
|
12
|
-
start: "\x1B[32m",
|
|
13
|
-
end: "\x1B[0m"
|
|
14
|
-
},
|
|
15
|
-
yellow: {
|
|
16
|
-
start: "\x1B[33;1m",
|
|
17
|
-
end: "\x1B[0m"
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Wrap some text in a color for printing to the console.
|
|
22
|
-
*/
|
|
23
|
-
const wrap = (color, text) => `${color.start}${text}${color.end}`;
|
|
24
|
-
function* mapDebugTasks(tasks) {
|
|
25
|
-
for (const { id, name, input, config, triggers, writes } of tasks) {
|
|
26
|
-
if (config?.tags?.includes(TAG_HIDDEN)) continue;
|
|
27
|
-
const interrupts = writes.filter(([writeId, n]) => {
|
|
28
|
-
return writeId === id && n === INTERRUPT;
|
|
29
|
-
}).map(([, v]) => {
|
|
30
|
-
return v;
|
|
31
|
-
});
|
|
32
|
-
yield {
|
|
33
|
-
id,
|
|
34
|
-
name,
|
|
35
|
-
input,
|
|
36
|
-
triggers,
|
|
37
|
-
interrupts
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
function isMultipleChannelWrite(value) {
|
|
42
|
-
if (typeof value !== "object" || value === null) return false;
|
|
43
|
-
return "$writes" in value && Array.isArray(value.$writes);
|
|
44
|
-
}
|
|
45
|
-
function mapTaskResultWrites(writes) {
|
|
46
|
-
const result = {};
|
|
47
|
-
for (const [channel, value] of writes) {
|
|
48
|
-
const strChannel = String(channel);
|
|
49
|
-
if (strChannel in result) {
|
|
50
|
-
const channelWrites = isMultipleChannelWrite(result[strChannel]) ? result[strChannel].$writes : [result[strChannel]];
|
|
51
|
-
channelWrites.push(value);
|
|
52
|
-
result[strChannel] = { $writes: channelWrites };
|
|
53
|
-
} else result[strChannel] = value;
|
|
54
|
-
}
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
function* mapDebugTaskResults(tasks, streamChannels) {
|
|
58
|
-
for (const [{ id, name, config }, writes] of tasks) {
|
|
59
|
-
if (config?.tags?.includes(TAG_HIDDEN)) continue;
|
|
60
|
-
yield {
|
|
61
|
-
id,
|
|
62
|
-
name,
|
|
63
|
-
result: mapTaskResultWrites(writes.filter(([channel]) => {
|
|
64
|
-
return Array.isArray(streamChannels) ? streamChannels.includes(channel) : channel === streamChannels;
|
|
65
|
-
})),
|
|
66
|
-
interrupts: writes.filter((w) => w[0] === INTERRUPT).map((w) => w[1])
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
function* mapDebugCheckpoint(config, channels, streamChannels, metadata, tasks, pendingWrites, parentConfig, outputKeys) {
|
|
71
|
-
function formatConfig(config$1) {
|
|
72
|
-
const pyConfig = {};
|
|
73
|
-
if (config$1.callbacks != null) pyConfig.callbacks = config$1.callbacks;
|
|
74
|
-
if (config$1.configurable != null) pyConfig.configurable = config$1.configurable;
|
|
75
|
-
if (config$1.maxConcurrency != null) pyConfig.max_concurrency = config$1.maxConcurrency;
|
|
76
|
-
if (config$1.metadata != null) pyConfig.metadata = config$1.metadata;
|
|
77
|
-
if (config$1.recursionLimit != null) pyConfig.recursion_limit = config$1.recursionLimit;
|
|
78
|
-
if (config$1.runId != null) pyConfig.run_id = config$1.runId;
|
|
79
|
-
if (config$1.runName != null) pyConfig.run_name = config$1.runName;
|
|
80
|
-
if (config$1.tags != null) pyConfig.tags = config$1.tags;
|
|
81
|
-
return pyConfig;
|
|
82
|
-
}
|
|
83
|
-
const parentNs = config.configurable?.checkpoint_ns;
|
|
84
|
-
const taskStates = {};
|
|
85
|
-
for (const task of tasks) {
|
|
86
|
-
const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];
|
|
87
|
-
if (!candidates.find(findSubgraphPregel)) continue;
|
|
88
|
-
let taskNs = `${task.name}:${task.id}`;
|
|
89
|
-
if (parentNs) taskNs = `${parentNs}|${taskNs}`;
|
|
90
|
-
taskStates[task.id] = { configurable: {
|
|
91
|
-
thread_id: config.configurable?.thread_id,
|
|
92
|
-
checkpoint_ns: taskNs
|
|
93
|
-
} };
|
|
94
|
-
}
|
|
95
|
-
yield {
|
|
96
|
-
config: formatConfig(config),
|
|
97
|
-
values: readChannels(channels, streamChannels),
|
|
98
|
-
metadata,
|
|
99
|
-
next: tasks.map((task) => task.name),
|
|
100
|
-
tasks: tasksWithWrites(tasks, pendingWrites, taskStates, outputKeys),
|
|
101
|
-
parentConfig: parentConfig ? formatConfig(parentConfig) : void 0
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
function tasksWithWrites(tasks, pendingWrites, states, outputKeys) {
|
|
105
|
-
return tasks.map((task) => {
|
|
106
|
-
const error = pendingWrites.find(([id, n]) => id === task.id && n === ERROR)?.[2];
|
|
107
|
-
const interrupts = pendingWrites.filter(([id, n]) => id === task.id && n === INTERRUPT).map(([, , v]) => v);
|
|
108
|
-
const result = (() => {
|
|
109
|
-
if (error || interrupts.length || !pendingWrites.length) return void 0;
|
|
110
|
-
const idx = pendingWrites.findIndex(([tid, n]) => tid === task.id && n === RETURN);
|
|
111
|
-
if (idx >= 0) return pendingWrites[idx][2];
|
|
112
|
-
if (typeof outputKeys === "string") return pendingWrites.find(([tid, n]) => tid === task.id && n === outputKeys)?.[2];
|
|
113
|
-
if (Array.isArray(outputKeys)) {
|
|
114
|
-
const results = pendingWrites.filter(([tid, n]) => tid === task.id && outputKeys.includes(n)).map(([, n, v]) => [n, v]);
|
|
115
|
-
if (!results.length) return void 0;
|
|
116
|
-
return mapTaskResultWrites(results);
|
|
117
|
-
}
|
|
118
|
-
return void 0;
|
|
119
|
-
})();
|
|
120
|
-
if (error) return {
|
|
121
|
-
id: task.id,
|
|
122
|
-
name: task.name,
|
|
123
|
-
path: task.path,
|
|
124
|
-
error,
|
|
125
|
-
interrupts,
|
|
126
|
-
result
|
|
127
|
-
};
|
|
128
|
-
const taskState = states?.[task.id];
|
|
129
|
-
return {
|
|
130
|
-
id: task.id,
|
|
131
|
-
name: task.name,
|
|
132
|
-
path: task.path,
|
|
133
|
-
interrupts,
|
|
134
|
-
...taskState !== void 0 ? { state: taskState } : {},
|
|
135
|
-
result
|
|
136
|
-
};
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
function printStepCheckpoint(step, channels, whitelist) {
|
|
140
|
-
console.log([
|
|
141
|
-
`${wrap(COLORS_MAP.blue, `[${step}:checkpoint]`)}`,
|
|
142
|
-
`\x1b[1m State at the end of step ${step}:\x1b[0m\n`,
|
|
143
|
-
JSON.stringify(readChannels(channels, whitelist), null, 2)
|
|
144
|
-
].join(""));
|
|
145
|
-
}
|
|
146
|
-
function printStepTasks(step, nextTasks) {
|
|
147
|
-
const nTasks = nextTasks.length;
|
|
148
|
-
console.log([
|
|
149
|
-
`${wrap(COLORS_MAP.blue, `[${step}:tasks]`)}`,
|
|
150
|
-
`\x1b[1m Starting step ${step} with ${nTasks} task${nTasks === 1 ? "" : "s"}:\x1b[0m\n`,
|
|
151
|
-
nextTasks.map((task) => `- ${wrap(COLORS_MAP.green, String(task.name))} -> ${JSON.stringify(task.input, null, 2)}`).join("\n")
|
|
152
|
-
].join(""));
|
|
153
|
-
}
|
|
154
|
-
function printStepWrites(step, writes, whitelist) {
|
|
155
|
-
const byChannel = {};
|
|
156
|
-
for (const [channel, value] of writes) if (whitelist.includes(channel)) {
|
|
157
|
-
if (!byChannel[channel]) byChannel[channel] = [];
|
|
158
|
-
byChannel[channel].push(value);
|
|
159
|
-
}
|
|
160
|
-
console.log([
|
|
161
|
-
`${wrap(COLORS_MAP.blue, `[${step}:writes]`)}`,
|
|
162
|
-
`\x1b[1m Finished step ${step} with writes to ${Object.keys(byChannel).length} channel${Object.keys(byChannel).length !== 1 ? "s" : ""}:\x1b[0m\n`,
|
|
163
|
-
Object.entries(byChannel).map(([name, vals]) => `- ${wrap(COLORS_MAP.yellow, name)} -> ${vals.map((v) => JSON.stringify(v)).join(", ")}`).join("\n")
|
|
164
|
-
].join(""));
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
//#endregion
|
|
168
|
-
export { mapDebugCheckpoint, mapDebugTaskResults, mapDebugTasks, printStepCheckpoint, printStepTasks, printStepWrites, tasksWithWrites };
|
|
169
|
-
//# sourceMappingURL=debug.js.map
|
package/dist/pregel/debug.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","names":["COLORS_MAP: ConsoleColorMap","result: Record<string, unknown>","pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n >","config","taskStates: Record<string, RunnableConfig | StateSnapshot>","byChannel: Record<string, any[]>"],"sources":["../../src/pregel/debug.ts"],"sourcesContent":["import { RunnableConfig } from \"@langchain/core/runnables\";\nimport {\n CheckpointMetadata,\n CheckpointPendingWrite,\n PendingWrite,\n} from \"@langchain/langgraph-checkpoint\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport {\n ERROR,\n Interrupt,\n INTERRUPT,\n RETURN,\n TAG_HIDDEN,\n} from \"../constants.js\";\nimport { EmptyChannelError } from \"../errors.js\";\nimport {\n PregelExecutableTask,\n PregelTaskDescription,\n StateSnapshot,\n} from \"./types.js\";\nimport { readChannels } from \"./io.js\";\nimport { findSubgraphPregel } from \"./utils/subgraph.js\";\n\ntype ConsoleColors = {\n start: string;\n end: string;\n};\n\ntype ConsoleColorMap = {\n [key: string]: ConsoleColors;\n};\n\nconst COLORS_MAP: ConsoleColorMap = {\n blue: {\n start: \"\\x1b[34m\",\n end: \"\\x1b[0m\",\n },\n green: {\n start: \"\\x1b[32m\",\n end: \"\\x1b[0m\",\n },\n yellow: {\n start: \"\\x1b[33;1m\",\n end: \"\\x1b[0m\",\n },\n};\n\n/**\n * Wrap some text in a color for printing to the console.\n */\nexport const wrap = (color: ConsoleColors, text: string): string =>\n `${color.start}${text}${color.end}`;\n\nexport function printCheckpoint<Value>(\n step: number,\n channels: Record<string, BaseChannel<Value>>\n) {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, \"[langgraph/checkpoint]\")}`,\n `Finishing step ${step}. Channel values:\\n`,\n `\\n${JSON.stringify(\n Object.fromEntries(_readChannels<Value>(channels)),\n null,\n 2\n )}`,\n ].join(\"\")\n );\n}\n\nexport function* _readChannels<Value>(\n channels: Record<string, BaseChannel<Value>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): IterableIterator<[string, any]> {\n for (const [name, channel] of Object.entries(channels)) {\n try {\n yield [name, channel.get()];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.name === EmptyChannelError.unminifiable_name) {\n // Skip the channel if it's empty\n continue;\n } else {\n throw error; // Re-throw the error if it's not an EmptyChannelError\n }\n }\n }\n}\n\nexport function* mapDebugTasks<N extends PropertyKey, C extends PropertyKey>(\n tasks: readonly PregelExecutableTask<N, C>[]\n) {\n for (const { id, name, input, config, triggers, writes } of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n\n const interrupts = writes\n .filter(([writeId, n]) => {\n return writeId === id && n === INTERRUPT;\n })\n .map(([, v]) => {\n return v;\n });\n yield { id, name, input, triggers, interrupts };\n }\n}\n\nfunction isMultipleChannelWrite(\n value: unknown\n): value is { $writes: unknown[] } {\n if (typeof value !== \"object\" || value === null) return false;\n return \"$writes\" in value && Array.isArray(value.$writes);\n}\n\nfunction mapTaskResultWrites(writes: PendingWrite<unknown>[]) {\n const result: Record<string, unknown> = {};\n\n for (const [channel, value] of writes) {\n const strChannel = String(channel);\n\n if (strChannel in result) {\n const channelWrites = isMultipleChannelWrite(result[strChannel])\n ? result[strChannel].$writes\n : [result[strChannel]];\n\n channelWrites.push(value);\n result[strChannel] = { $writes: channelWrites };\n } else {\n result[strChannel] = value;\n }\n }\n return result;\n}\n\nexport function* mapDebugTaskResults<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n tasks: readonly [PregelExecutableTask<N, C>, PendingWrite<C>[]][],\n streamChannels: PropertyKey | Array<PropertyKey>\n) {\n for (const [{ id, name, config }, writes] of tasks) {\n if (config?.tags?.includes(TAG_HIDDEN)) continue;\n yield {\n id,\n name,\n result: mapTaskResultWrites(\n writes.filter(([channel]) => {\n return Array.isArray(streamChannels)\n ? streamChannels.includes(channel)\n : channel === streamChannels;\n })\n ),\n interrupts: writes.filter((w) => w[0] === INTERRUPT).map((w) => w[1]),\n };\n }\n}\n\ntype ChannelKey = string | number | symbol;\n\nexport function* mapDebugCheckpoint<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n config: RunnableConfig,\n channels: Record<string, BaseChannel>,\n streamChannels: string | string[],\n metadata: CheckpointMetadata,\n tasks: readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n parentConfig: RunnableConfig | undefined,\n outputKeys: ChannelKey | ChannelKey[]\n) {\n function formatConfig(config: RunnableConfig) {\n // https://stackoverflow.com/a/78298178\n type CamelToSnake<\n T extends string,\n A extends string = \"\"\n > = T extends `${infer F}${infer R}`\n ? CamelToSnake<\n R,\n `${A}${F extends Lowercase<F> ? F : `_${Lowercase<F>}`}`\n >\n : A;\n\n // make sure the config is consistent with Python\n const pyConfig: Partial<\n Record<CamelToSnake<keyof RunnableConfig>, unknown>\n > = {};\n\n if (config.callbacks != null) pyConfig.callbacks = config.callbacks;\n if (config.configurable != null)\n pyConfig.configurable = config.configurable;\n if (config.maxConcurrency != null)\n pyConfig.max_concurrency = config.maxConcurrency;\n\n if (config.metadata != null) pyConfig.metadata = config.metadata;\n if (config.recursionLimit != null)\n pyConfig.recursion_limit = config.recursionLimit;\n if (config.runId != null) pyConfig.run_id = config.runId;\n if (config.runName != null) pyConfig.run_name = config.runName;\n if (config.tags != null) pyConfig.tags = config.tags;\n\n return pyConfig;\n }\n\n const parentNs = config.configurable?.checkpoint_ns;\n const taskStates: Record<string, RunnableConfig | StateSnapshot> = {};\n\n for (const task of tasks) {\n const candidates = task.subgraphs?.length ? task.subgraphs : [task.proc];\n if (!candidates.find(findSubgraphPregel)) continue;\n\n let taskNs = `${task.name as string}:${task.id}`;\n if (parentNs) taskNs = `${parentNs}|${taskNs}`;\n\n taskStates[task.id] = {\n configurable: {\n thread_id: config.configurable?.thread_id,\n checkpoint_ns: taskNs,\n },\n };\n }\n\n yield {\n config: formatConfig(config),\n values: readChannels(channels, streamChannels),\n metadata,\n next: tasks.map((task) => task.name),\n tasks: tasksWithWrites(tasks, pendingWrites, taskStates, outputKeys),\n parentConfig: parentConfig ? formatConfig(parentConfig) : undefined,\n };\n}\n\nexport function tasksWithWrites<N extends PropertyKey, C extends PropertyKey>(\n tasks: PregelTaskDescription[] | readonly PregelExecutableTask<N, C>[],\n pendingWrites: CheckpointPendingWrite[],\n states: Record<string, RunnableConfig | StateSnapshot> | undefined,\n outputKeys: ChannelKey[] | ChannelKey\n): PregelTaskDescription[] {\n return tasks.map((task): PregelTaskDescription => {\n const error = pendingWrites.find(\n ([id, n]) => id === task.id && n === ERROR\n )?.[2];\n\n const interrupts = pendingWrites\n .filter(([id, n]) => id === task.id && n === INTERRUPT)\n .map(([, , v]) => v) as Interrupt[];\n\n const result = (() => {\n if (error || interrupts.length || !pendingWrites.length) return undefined;\n\n const idx = pendingWrites.findIndex(\n ([tid, n]) => tid === task.id && n === RETURN\n );\n\n if (idx >= 0) return pendingWrites[idx][2];\n\n if (typeof outputKeys === \"string\") {\n return pendingWrites.find(\n ([tid, n]) => tid === task.id && n === outputKeys\n )?.[2];\n }\n\n if (Array.isArray(outputKeys)) {\n const results = pendingWrites\n .filter(([tid, n]) => tid === task.id && outputKeys.includes(n))\n .map(([, n, v]) => [n, v] as PendingWrite<C>);\n\n if (!results.length) return undefined;\n return mapTaskResultWrites(results);\n }\n\n return undefined;\n })();\n\n if (error) {\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n error,\n interrupts,\n result,\n };\n }\n\n const taskState = states?.[task.id];\n return {\n id: task.id,\n name: task.name as string,\n path: task.path,\n interrupts,\n ...(taskState !== undefined ? { state: taskState } : {}),\n result,\n };\n });\n}\n\nexport function printStepCheckpoint(\n step: number,\n channels: Record<string, BaseChannel<unknown>>,\n whitelist: string[]\n): void {\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:checkpoint]`)}`,\n `\\x1b[1m State at the end of step ${step}:\\x1b[0m\\n`,\n JSON.stringify(readChannels(channels, whitelist), null, 2),\n ].join(\"\")\n );\n}\n\nexport function printStepTasks<N extends PropertyKey, C extends PropertyKey>(\n step: number,\n nextTasks: readonly PregelExecutableTask<N, C>[]\n): void {\n const nTasks = nextTasks.length;\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:tasks]`)}`,\n `\\x1b[1m Starting step ${step} with ${nTasks} task${\n nTasks === 1 ? \"\" : \"s\"\n }:\\x1b[0m\\n`,\n nextTasks\n .map(\n (task) =>\n `- ${wrap(COLORS_MAP.green, String(task.name))} -> ${JSON.stringify(\n task.input,\n null,\n 2\n )}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n\nexport function printStepWrites(\n step: number,\n writes: PendingWrite[],\n whitelist: string[]\n): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const byChannel: Record<string, any[]> = {};\n\n for (const [channel, value] of writes) {\n if (whitelist.includes(channel)) {\n if (!byChannel[channel]) {\n byChannel[channel] = [];\n }\n byChannel[channel].push(value);\n }\n }\n\n console.log(\n [\n `${wrap(COLORS_MAP.blue, `[${step}:writes]`)}`,\n `\\x1b[1m Finished step ${step} with writes to ${\n Object.keys(byChannel).length\n } channel${Object.keys(byChannel).length !== 1 ? \"s\" : \"\"}:\\x1b[0m\\n`,\n Object.entries(byChannel)\n .map(\n ([name, vals]) =>\n `- ${wrap(COLORS_MAP.yellow, name)} -> ${vals\n .map((v) => JSON.stringify(v))\n .join(\", \")}`\n )\n .join(\"\\n\"),\n ].join(\"\")\n );\n}\n"],"mappings":"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"}
|