@wundr.io/langgraph-orchestrator 1.0.3

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 (57) hide show
  1. package/README.md +842 -0
  2. package/dist/checkpointing.d.ts +265 -0
  3. package/dist/checkpointing.d.ts.map +1 -0
  4. package/dist/checkpointing.js +577 -0
  5. package/dist/checkpointing.js.map +1 -0
  6. package/dist/edges/conditional-edge.d.ts +230 -0
  7. package/dist/edges/conditional-edge.d.ts.map +1 -0
  8. package/dist/edges/conditional-edge.js +439 -0
  9. package/dist/edges/conditional-edge.js.map +1 -0
  10. package/dist/edges/loop-edge.d.ts +290 -0
  11. package/dist/edges/loop-edge.d.ts.map +1 -0
  12. package/dist/edges/loop-edge.js +503 -0
  13. package/dist/edges/loop-edge.js.map +1 -0
  14. package/dist/index.d.ts +125 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +269 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/nodes/decision-node.d.ts +276 -0
  19. package/dist/nodes/decision-node.d.ts.map +1 -0
  20. package/dist/nodes/decision-node.js +403 -0
  21. package/dist/nodes/decision-node.js.map +1 -0
  22. package/dist/nodes/human-node.d.ts +272 -0
  23. package/dist/nodes/human-node.d.ts.map +1 -0
  24. package/dist/nodes/human-node.js +394 -0
  25. package/dist/nodes/human-node.js.map +1 -0
  26. package/dist/nodes/llm-node.d.ts +173 -0
  27. package/dist/nodes/llm-node.d.ts.map +1 -0
  28. package/dist/nodes/llm-node.js +325 -0
  29. package/dist/nodes/llm-node.js.map +1 -0
  30. package/dist/nodes/tool-node.d.ts +151 -0
  31. package/dist/nodes/tool-node.d.ts.map +1 -0
  32. package/dist/nodes/tool-node.js +373 -0
  33. package/dist/nodes/tool-node.js.map +1 -0
  34. package/dist/prebuilt-graphs/plan-execute-refine.d.ts +149 -0
  35. package/dist/prebuilt-graphs/plan-execute-refine.d.ts.map +1 -0
  36. package/dist/prebuilt-graphs/plan-execute-refine.js +600 -0
  37. package/dist/prebuilt-graphs/plan-execute-refine.js.map +1 -0
  38. package/dist/state-graph.d.ts +158 -0
  39. package/dist/state-graph.d.ts.map +1 -0
  40. package/dist/state-graph.js +756 -0
  41. package/dist/state-graph.js.map +1 -0
  42. package/dist/types.d.ts +762 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +73 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +57 -0
  47. package/src/checkpointing.ts +702 -0
  48. package/src/edges/conditional-edge.ts +518 -0
  49. package/src/edges/loop-edge.ts +623 -0
  50. package/src/index.ts +416 -0
  51. package/src/nodes/decision-node.ts +538 -0
  52. package/src/nodes/human-node.ts +572 -0
  53. package/src/nodes/llm-node.ts +448 -0
  54. package/src/nodes/tool-node.ts +525 -0
  55. package/src/prebuilt-graphs/plan-execute-refine.ts +769 -0
  56. package/src/state-graph.ts +990 -0
  57. package/src/types.ts +729 -0
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+ /**
3
+ * Tool Node - Tool execution node for agent workflows
4
+ * @module @wundr.io/langgraph-orchestrator
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ToolNodeConfigSchema = void 0;
8
+ exports.createToolNode = createToolNode;
9
+ exports.createToolRegistry = createToolRegistry;
10
+ exports.createTool = createTool;
11
+ exports.createBatchToolNode = createBatchToolNode;
12
+ const uuid_1 = require("uuid");
13
+ const zod_1 = require("zod");
14
+ /**
15
+ * Schema for tool node configuration validation
16
+ */
17
+ exports.ToolNodeConfigSchema = zod_1.z.object({
18
+ parallel: zod_1.z.boolean().optional(),
19
+ maxConcurrency: zod_1.z.number().min(1).optional(),
20
+ toolTimeout: zod_1.z.number().min(0).optional(),
21
+ continueOnError: zod_1.z.boolean().optional(),
22
+ });
23
+ /**
24
+ * Create a tool execution node
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const toolNode = createToolNode({
29
+ * id: 'tools',
30
+ * name: 'Tool Executor',
31
+ * config: {
32
+ * parallel: true,
33
+ * maxConcurrency: 3,
34
+ * continueOnError: true
35
+ * }
36
+ * });
37
+ *
38
+ * graph.addNode('tools', toolNode);
39
+ * ```
40
+ *
41
+ * @param options - Node creation options
42
+ * @returns NodeDefinition for use in StateGraph
43
+ */
44
+ function createToolNode(options) {
45
+ const { id, name, config = {}, nodeConfig = {} } = options;
46
+ return {
47
+ id,
48
+ name,
49
+ type: 'tool',
50
+ config: nodeConfig,
51
+ execute: async (state, context) => {
52
+ // Get pending tool calls from state
53
+ const pendingToolCalls = state.data['pendingToolCalls'];
54
+ if (!pendingToolCalls || pendingToolCalls.length === 0) {
55
+ context.services.logger.warn('Tool node executed with no pending tool calls');
56
+ return { state };
57
+ }
58
+ context.services.logger.debug('Executing tool calls', {
59
+ count: pendingToolCalls.length,
60
+ tools: pendingToolCalls.map(tc => tc.name),
61
+ });
62
+ // Get tools from config or registry
63
+ const tools = config.tools ?? getToolsFromRegistry(context.services.toolRegistry);
64
+ const toolMap = new Map(tools.map(t => [t.name, t]));
65
+ // Execute tool calls
66
+ const results = await executeToolCalls(pendingToolCalls, toolMap, config, context);
67
+ // Build tool result messages
68
+ const toolMessages = results.map(result => ({
69
+ id: (0, uuid_1.v4)(),
70
+ role: 'tool',
71
+ content: result.content,
72
+ toolResult: result,
73
+ timestamp: new Date(),
74
+ }));
75
+ // Build updated state
76
+ let newData = { ...state.data };
77
+ delete newData['pendingToolCalls']; // Clear pending calls
78
+ // Store results in state
79
+ newData['lastToolResults'] = results;
80
+ // Apply post-processing if configured
81
+ if (config.postProcess) {
82
+ const processed = config.postProcess(results, state);
83
+ newData = { ...newData, ...processed };
84
+ }
85
+ const newState = {
86
+ ...state,
87
+ messages: [...state.messages, ...toolMessages],
88
+ data: newData,
89
+ };
90
+ // Check if all tools succeeded
91
+ const _allSucceeded = results.every(r => r.success);
92
+ const hasErrors = results.some(r => !r.success);
93
+ context.services.logger.debug('Tool execution complete', {
94
+ total: results.length,
95
+ succeeded: results.filter(r => r.success).length,
96
+ failed: results.filter(r => !r.success).length,
97
+ });
98
+ return {
99
+ state: newState,
100
+ // If there were errors and we're not continuing, route to error handler
101
+ next: hasErrors && !config.continueOnError ? 'error' : undefined,
102
+ metadata: {
103
+ duration: 0,
104
+ toolCalls: pendingToolCalls,
105
+ },
106
+ };
107
+ },
108
+ };
109
+ }
110
+ /**
111
+ * Execute tool calls with concurrency control
112
+ */
113
+ async function executeToolCalls(toolCalls, toolMap, config, context) {
114
+ if (config.parallel) {
115
+ return executeParallel(toolCalls, toolMap, config, context);
116
+ }
117
+ return executeSequential(toolCalls, toolMap, config, context);
118
+ }
119
+ /**
120
+ * Execute tool calls sequentially
121
+ */
122
+ async function executeSequential(toolCalls, toolMap, config, context) {
123
+ const results = [];
124
+ for (const toolCall of toolCalls) {
125
+ const result = await executeSingleTool(toolCall, toolMap, config, context);
126
+ results.push(result);
127
+ // Stop if there's an error and we're not continuing on error
128
+ if (!result.success && !config.continueOnError) {
129
+ break;
130
+ }
131
+ }
132
+ return results;
133
+ }
134
+ /**
135
+ * Execute tool calls in parallel with concurrency limit
136
+ */
137
+ async function executeParallel(toolCalls, toolMap, config, context) {
138
+ const maxConcurrency = config.maxConcurrency ?? 5;
139
+ const results = [];
140
+ const executing = [];
141
+ for (const toolCall of toolCalls) {
142
+ const promise = executeSingleTool(toolCall, toolMap, config, context);
143
+ executing.push(promise);
144
+ if (executing.length >= maxConcurrency) {
145
+ const result = await Promise.race(executing);
146
+ results.push(result);
147
+ const index = executing.indexOf(promise);
148
+ if (index > -1) {
149
+ executing.splice(index, 1);
150
+ }
151
+ }
152
+ }
153
+ // Wait for remaining executions
154
+ const remaining = await Promise.all(executing);
155
+ results.push(...remaining);
156
+ return results;
157
+ }
158
+ /**
159
+ * Execute a single tool call
160
+ */
161
+ async function executeSingleTool(toolCall, toolMap, config, context) {
162
+ const tool = toolMap.get(toolCall.name);
163
+ if (!tool) {
164
+ const error = new Error(`Tool "${toolCall.name}" not found`);
165
+ if (config.onError) {
166
+ return config.onError(error, toolCall);
167
+ }
168
+ return {
169
+ toolCallId: toolCall.id,
170
+ content: `Error: Tool "${toolCall.name}" not found`,
171
+ success: false,
172
+ error: error.message,
173
+ };
174
+ }
175
+ try {
176
+ // Validate input if schema provided
177
+ if (tool.inputSchema) {
178
+ tool.inputSchema.parse(toolCall.arguments);
179
+ }
180
+ // Execute with timeout if configured
181
+ const result = config.toolTimeout
182
+ ? await executeWithTimeout(tool, toolCall.arguments, config.toolTimeout)
183
+ : await tool.execute(toolCall.arguments);
184
+ // Validate output if schema provided
185
+ if (tool.outputSchema) {
186
+ tool.outputSchema.parse(result);
187
+ }
188
+ context.services.logger.debug('Tool executed successfully', {
189
+ tool: toolCall.name,
190
+ callId: toolCall.id,
191
+ });
192
+ return {
193
+ toolCallId: toolCall.id,
194
+ content: typeof result === 'string' ? result : JSON.stringify(result),
195
+ success: true,
196
+ };
197
+ }
198
+ catch (error) {
199
+ const err = error instanceof Error ? error : new Error(String(error));
200
+ context.services.logger.error('Tool execution failed', {
201
+ tool: toolCall.name,
202
+ callId: toolCall.id,
203
+ error: err.message,
204
+ });
205
+ if (config.onError) {
206
+ return config.onError(err, toolCall);
207
+ }
208
+ return {
209
+ toolCallId: toolCall.id,
210
+ content: `Error executing tool "${toolCall.name}": ${err.message}`,
211
+ success: false,
212
+ error: err.message,
213
+ };
214
+ }
215
+ }
216
+ /**
217
+ * Execute tool with timeout
218
+ */
219
+ async function executeWithTimeout(tool, args, timeout) {
220
+ return Promise.race([
221
+ tool.execute(args),
222
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Tool execution timed out after ${timeout}ms`)), timeout)),
223
+ ]);
224
+ }
225
+ /**
226
+ * Get tools from registry
227
+ */
228
+ function getToolsFromRegistry(registry) {
229
+ if (!registry) {
230
+ return [];
231
+ }
232
+ return registry.list();
233
+ }
234
+ /**
235
+ * Create a simple in-memory tool registry
236
+ *
237
+ * @example
238
+ * ```typescript
239
+ * const registry = createToolRegistry();
240
+ * registry.register({
241
+ * name: 'search',
242
+ * description: 'Search the web',
243
+ * inputSchema: z.object({ query: z.string() }),
244
+ * execute: async ({ query }) => searchWeb(query)
245
+ * });
246
+ *
247
+ * graph.setServices({ toolRegistry: registry });
248
+ * ```
249
+ *
250
+ * @returns ToolRegistry implementation
251
+ */
252
+ function createToolRegistry() {
253
+ const tools = new Map();
254
+ return {
255
+ get(name) {
256
+ return tools.get(name);
257
+ },
258
+ list() {
259
+ return Array.from(tools.values());
260
+ },
261
+ register(tool) {
262
+ if (tools.has(tool.name)) {
263
+ throw new Error(`Tool "${tool.name}" is already registered`);
264
+ }
265
+ tools.set(tool.name, tool);
266
+ },
267
+ unregister(name) {
268
+ tools.delete(name);
269
+ },
270
+ };
271
+ }
272
+ /**
273
+ * Create a tool definition with type-safe input/output
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * const searchTool = createTool({
278
+ * name: 'search',
279
+ * description: 'Search the web for information',
280
+ * inputSchema: z.object({
281
+ * query: z.string(),
282
+ * maxResults: z.number().optional()
283
+ * }),
284
+ * outputSchema: z.array(z.object({
285
+ * title: z.string(),
286
+ * url: z.string(),
287
+ * snippet: z.string()
288
+ * })),
289
+ * execute: async ({ query, maxResults = 10 }) => {
290
+ * return await searchWeb(query, maxResults);
291
+ * }
292
+ * });
293
+ * ```
294
+ *
295
+ * @param options - Tool definition options
296
+ * @returns Tool definition
297
+ */
298
+ function createTool(options) {
299
+ return {
300
+ name: options.name,
301
+ description: options.description,
302
+ inputSchema: options.inputSchema,
303
+ outputSchema: options.outputSchema,
304
+ execute: async (input) => {
305
+ const parsed = options.inputSchema.parse(input);
306
+ return options.execute(parsed);
307
+ },
308
+ };
309
+ }
310
+ /**
311
+ * Create a batch tool node that groups tool calls
312
+ *
313
+ * @example
314
+ * ```typescript
315
+ * const batchToolNode = createBatchToolNode({
316
+ * id: 'batch-tools',
317
+ * name: 'Batch Tool Executor',
318
+ * config: {
319
+ * batchSize: 5,
320
+ * batchTimeout: 1000
321
+ * }
322
+ * });
323
+ * ```
324
+ *
325
+ * @param options - Node creation options
326
+ * @returns NodeDefinition for use in StateGraph
327
+ */
328
+ function createBatchToolNode(options) {
329
+ const { id, name, config = {}, nodeConfig = {} } = options;
330
+ const batchSize = config.batchSize ?? 10;
331
+ return {
332
+ id,
333
+ name,
334
+ type: 'tool',
335
+ config: nodeConfig,
336
+ execute: async (state, context) => {
337
+ const pendingToolCalls = state.data['pendingToolCalls'];
338
+ if (!pendingToolCalls || pendingToolCalls.length === 0) {
339
+ return { state };
340
+ }
341
+ const tools = config.tools ?? getToolsFromRegistry(context.services.toolRegistry);
342
+ const toolMap = new Map(tools.map(t => [t.name, t]));
343
+ // Process in batches
344
+ const batches = [];
345
+ for (let i = 0; i < pendingToolCalls.length; i += batchSize) {
346
+ batches.push(pendingToolCalls.slice(i, i + batchSize));
347
+ }
348
+ const allResults = [];
349
+ for (const batch of batches) {
350
+ const results = await executeParallel(batch, toolMap, config, context);
351
+ allResults.push(...results);
352
+ }
353
+ // Build tool result messages
354
+ const toolMessages = allResults.map(result => ({
355
+ id: (0, uuid_1.v4)(),
356
+ role: 'tool',
357
+ content: result.content,
358
+ toolResult: result,
359
+ timestamp: new Date(),
360
+ }));
361
+ const newData = { ...state.data };
362
+ delete newData['pendingToolCalls'];
363
+ newData['lastToolResults'] = allResults;
364
+ const newState = {
365
+ ...state,
366
+ messages: [...state.messages, ...toolMessages],
367
+ data: newData,
368
+ };
369
+ return { state: newState };
370
+ },
371
+ };
372
+ }
373
+ //# sourceMappingURL=tool-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-node.js","sourceRoot":"","sources":["../../src/nodes/tool-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Plan-Execute-Refine Graph - Ready-to-use workflow pattern
3
+ * @module @wundr.io/langgraph-orchestrator
4
+ */
5
+ import { z } from 'zod';
6
+ import { StateGraph } from '../state-graph';
7
+ import type { HumanInputHandler } from '../nodes/human-node';
8
+ import type { AgentState, Tool, LLMProvider } from '../types';
9
+ /**
10
+ * Extended state for plan-execute-refine workflow
11
+ */
12
+ export interface PlanExecuteState extends AgentState {
13
+ /** The current plan */
14
+ readonly data: AgentState['data'] & {
15
+ /** Original task/goal */
16
+ task?: string;
17
+ /** Generated plan steps */
18
+ plan?: PlanStep[];
19
+ /** Current step being executed */
20
+ currentStepIndex?: number;
21
+ /** Execution results for each step */
22
+ stepResults?: StepResult[];
23
+ /** Overall execution status */
24
+ executionStatus?: 'planning' | 'executing' | 'refining' | 'complete' | 'failed';
25
+ /** Number of refinement iterations */
26
+ refinementCount?: number;
27
+ /** Maximum refinement iterations */
28
+ maxRefinements?: number;
29
+ /** Final result */
30
+ finalResult?: unknown;
31
+ };
32
+ }
33
+ /**
34
+ * A step in the plan
35
+ */
36
+ export interface PlanStep {
37
+ /** Step identifier */
38
+ id: string;
39
+ /** Step description */
40
+ description: string;
41
+ /** Tool to use (if any) */
42
+ tool?: string;
43
+ /** Tool arguments */
44
+ toolArgs?: Record<string, unknown>;
45
+ /** Dependencies on other steps */
46
+ dependsOn?: string[];
47
+ /** Expected output description */
48
+ expectedOutput?: string;
49
+ }
50
+ /**
51
+ * Result of executing a step
52
+ */
53
+ export interface StepResult {
54
+ /** Step ID */
55
+ stepId: string;
56
+ /** Whether step succeeded */
57
+ success: boolean;
58
+ /** Result data */
59
+ result?: unknown;
60
+ /** Error message if failed */
61
+ error?: string;
62
+ /** Execution timestamp */
63
+ timestamp: Date;
64
+ }
65
+ /**
66
+ * Configuration for plan-execute-refine graph
67
+ */
68
+ export interface PlanExecuteRefineConfig {
69
+ /** LLM provider for planning and refinement */
70
+ llmProvider: LLMProvider;
71
+ /** Available tools */
72
+ tools?: Tool[];
73
+ /** Human input handler for approval steps */
74
+ humanHandler?: HumanInputHandler;
75
+ /** Maximum refinement iterations */
76
+ maxRefinements?: number;
77
+ /** Whether to require human approval before execution */
78
+ requireApproval?: boolean;
79
+ /** Custom planner prompt */
80
+ plannerPrompt?: string;
81
+ /** Custom executor prompt */
82
+ executorPrompt?: string;
83
+ /** Custom refiner prompt */
84
+ refinerPrompt?: string;
85
+ /** Model to use */
86
+ model?: string;
87
+ }
88
+ /**
89
+ * Schema for plan validation
90
+ */
91
+ export declare const PlanSchema: z.ZodArray<z.ZodObject<{
92
+ id: z.ZodString;
93
+ description: z.ZodString;
94
+ tool: z.ZodOptional<z.ZodString>;
95
+ toolArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
96
+ dependsOn: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
97
+ expectedOutput: z.ZodOptional<z.ZodString>;
98
+ }, "strip", z.ZodTypeAny, {
99
+ id: string;
100
+ description: string;
101
+ tool?: string | undefined;
102
+ toolArgs?: Record<string, unknown> | undefined;
103
+ dependsOn?: string[] | undefined;
104
+ expectedOutput?: string | undefined;
105
+ }, {
106
+ id: string;
107
+ description: string;
108
+ tool?: string | undefined;
109
+ toolArgs?: Record<string, unknown> | undefined;
110
+ dependsOn?: string[] | undefined;
111
+ expectedOutput?: string | undefined;
112
+ }>, "many">;
113
+ /**
114
+ * Create a plan-execute-refine workflow graph
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * const graph = createPlanExecuteRefineGraph({
119
+ * llmProvider: myLLMProvider,
120
+ * tools: [searchTool, calculatorTool],
121
+ * maxRefinements: 3,
122
+ * requireApproval: true,
123
+ * humanHandler: myHumanHandler
124
+ * });
125
+ *
126
+ * const result = await graph.execute({
127
+ * initialState: {
128
+ * data: { task: 'Research and summarize the latest AI developments' }
129
+ * }
130
+ * });
131
+ * ```
132
+ *
133
+ * @param config - Graph configuration
134
+ * @returns Configured StateGraph
135
+ */
136
+ export declare function createPlanExecuteRefineGraph(config: PlanExecuteRefineConfig): StateGraph<PlanExecuteState>;
137
+ /**
138
+ * Create a simple task executor graph (simplified version)
139
+ *
140
+ * @example
141
+ * ```typescript
142
+ * const graph = createSimpleTaskGraph({
143
+ * llmProvider: myProvider,
144
+ * tools: [searchTool]
145
+ * });
146
+ * ```
147
+ */
148
+ export declare function createSimpleTaskGraph(config: Omit<PlanExecuteRefineConfig, 'requireApproval' | 'humanHandler'>): StateGraph<PlanExecuteState>;
149
+ //# sourceMappingURL=plan-execute-refine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-execute-refine.d.ts","sourceRoot":"","sources":["../../src/prebuilt-graphs/plan-execute-refine.ts"],"names":[],"mappings":"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"}