@bowenqt/qiniu-ai-sdk 0.13.0 → 0.15.0

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 (67) hide show
  1. package/dist/ai/agent-graph.d.ts +5 -0
  2. package/dist/ai/agent-graph.d.ts.map +1 -1
  3. package/dist/ai/agent-graph.js +3 -1
  4. package/dist/ai/agent-graph.js.map +1 -1
  5. package/dist/ai/agent-graph.mjs +3 -1
  6. package/dist/ai/create-agent.d.ts +98 -0
  7. package/dist/ai/create-agent.d.ts.map +1 -0
  8. package/dist/ai/create-agent.js +87 -0
  9. package/dist/ai/create-agent.js.map +1 -0
  10. package/dist/ai/create-agent.mjs +84 -0
  11. package/dist/ai/generate-object.d.ts +99 -0
  12. package/dist/ai/generate-object.d.ts.map +1 -0
  13. package/dist/ai/generate-object.js +231 -0
  14. package/dist/ai/generate-object.js.map +1 -0
  15. package/dist/ai/generate-object.mjs +195 -0
  16. package/dist/ai/generate-text.d.ts +16 -0
  17. package/dist/ai/generate-text.d.ts.map +1 -1
  18. package/dist/ai/generate-text.js +53 -6
  19. package/dist/ai/generate-text.js.map +1 -1
  20. package/dist/ai/generate-text.mjs +53 -6
  21. package/dist/ai/graph/checkpointer.d.ts +72 -2
  22. package/dist/ai/graph/checkpointer.d.ts.map +1 -1
  23. package/dist/ai/graph/checkpointer.js +99 -1
  24. package/dist/ai/graph/checkpointer.js.map +1 -1
  25. package/dist/ai/graph/checkpointer.mjs +96 -1
  26. package/dist/ai/graph/index.d.ts +2 -2
  27. package/dist/ai/graph/index.d.ts.map +1 -1
  28. package/dist/ai/graph/index.js +5 -1
  29. package/dist/ai/graph/index.js.map +1 -1
  30. package/dist/ai/graph/index.mjs +3 -1
  31. package/dist/ai/graph/postgres-checkpointer.d.ts +1 -1
  32. package/dist/ai/graph/postgres-checkpointer.d.ts.map +1 -1
  33. package/dist/ai/graph/postgres-checkpointer.js +13 -3
  34. package/dist/ai/graph/postgres-checkpointer.js.map +1 -1
  35. package/dist/ai/graph/postgres-checkpointer.mjs +13 -3
  36. package/dist/ai/graph/redis-checkpointer.d.ts +1 -1
  37. package/dist/ai/graph/redis-checkpointer.d.ts.map +1 -1
  38. package/dist/ai/graph/redis-checkpointer.js +6 -2
  39. package/dist/ai/graph/redis-checkpointer.js.map +1 -1
  40. package/dist/ai/graph/redis-checkpointer.mjs +6 -2
  41. package/dist/ai/internal-types.d.ts +3 -0
  42. package/dist/ai/internal-types.d.ts.map +1 -1
  43. package/dist/ai/internal-types.js.map +1 -1
  44. package/dist/ai/nodes/execute-node.d.ts +2 -1
  45. package/dist/ai/nodes/execute-node.d.ts.map +1 -1
  46. package/dist/ai/nodes/execute-node.js +11 -33
  47. package/dist/ai/nodes/execute-node.js.map +1 -1
  48. package/dist/ai/nodes/execute-node.mjs +11 -33
  49. package/dist/ai/tool-approval.d.ts +90 -0
  50. package/dist/ai/tool-approval.d.ts.map +1 -0
  51. package/dist/ai/tool-approval.js +151 -0
  52. package/dist/ai/tool-approval.js.map +1 -0
  53. package/dist/ai/tool-approval.mjs +147 -0
  54. package/dist/index.d.ts +9 -3
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +14 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/index.mjs +9 -3
  59. package/dist/lib/errors.d.ts +15 -0
  60. package/dist/lib/errors.d.ts.map +1 -1
  61. package/dist/lib/errors.js +13 -1
  62. package/dist/lib/errors.js.map +1 -1
  63. package/dist/lib/errors.mjs +11 -0
  64. package/dist/lib/tool-registry.d.ts +21 -0
  65. package/dist/lib/tool-registry.d.ts.map +1 -1
  66. package/dist/lib/tool-registry.js.map +1 -1
  67. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { MaxStepsExceededError, ToolExecutionError } from '../lib/errors.mjs';
2
+ import { checkApproval } from './tool-approval.mjs';
2
3
  export async function generateText(options) {
3
- const { client, model, tools, maxSteps = 1, onStepFinish, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, } = options;
4
+ const { client, model, tools, maxSteps = 1, onStepFinish, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, approvalConfig, } = options;
4
5
  const messages = normalizeMessages(options);
5
6
  const steps = [];
6
7
  let lastNonToolText = ''; // Only capture text from non-tool-call steps
@@ -57,7 +58,7 @@ export async function generateText(options) {
57
58
  toolCalls: [toolCall],
58
59
  }));
59
60
  steps.push(...toolCallSteps);
60
- const toolResults = await executeTools(streamResult.toolCalls, tools, messages, abortSignal);
61
+ const toolResults = await executeTools(streamResult.toolCalls, tools, messages, abortSignal, approvalConfig);
61
62
  const toolResultSteps = toolResults.map((toolResult) => ({
62
63
  type: 'tool_result',
63
64
  content: toolResult.result,
@@ -273,7 +274,7 @@ function toolResultsToMessages(toolCalls, results) {
273
274
  };
274
275
  });
275
276
  }
276
- async function executeTools(toolCalls, tools, messages, abortSignal) {
277
+ async function executeTools(toolCalls, tools, messages, abortSignal, approvalConfig) {
277
278
  const results = [];
278
279
  for (const toolCall of toolCalls) {
279
280
  const tool = tools[toolCall.function.name];
@@ -281,6 +282,26 @@ async function executeTools(toolCalls, tools, messages, abortSignal) {
281
282
  throw new ToolExecutionError(toolCall.function.name, 'Tool is not implemented.');
282
283
  }
283
284
  const args = parseToolArguments(toolCall.function.arguments);
285
+ // Check approval if tool requires it
286
+ if (tool.requiresApproval) {
287
+ // Create a minimal RegisteredTool-compatible object for checkApproval
288
+ const toolForApproval = {
289
+ name: toolCall.function.name,
290
+ description: tool.description ?? '',
291
+ parameters: (tool.parameters ?? {}),
292
+ source: { type: 'builtin', namespace: 'user' },
293
+ requiresApproval: tool.requiresApproval,
294
+ approvalHandler: tool.approvalHandler,
295
+ };
296
+ const approvalResult = await checkApproval(toolForApproval, toolCall, args, messages, approvalConfig);
297
+ if (!approvalResult.approved) {
298
+ results.push({
299
+ toolCallId: toolCall.id,
300
+ result: approvalResult.rejectionMessage ?? '[Approval Rejected] Tool execution was denied.',
301
+ });
302
+ continue;
303
+ }
304
+ }
284
305
  const value = await tool.execute(args, {
285
306
  toolCallId: toolCall.id,
286
307
  messages,
@@ -329,9 +350,30 @@ import { AgentGraph } from './agent-graph.mjs';
329
350
  * ```
330
351
  */
331
352
  export async function generateTextWithGraph(options) {
332
- const { client, model, tools, skills, maxSteps = 10, maxContextTokens, onStepFinish, onNodeEnter, onNodeExit, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, } = options;
333
- // Normalize messages
334
- const messages = normalizeMessages(options);
353
+ const { client, model, tools, skills, maxSteps = 10, maxContextTokens, onStepFinish, onNodeEnter, onNodeExit, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, checkpointer, threadId, resumeFromCheckpoint = true, } = options;
354
+ // Validate checkpointer + threadId combination
355
+ if (checkpointer && !threadId) {
356
+ throw new Error('threadId is required when checkpointer is provided');
357
+ }
358
+ // Try to resume from checkpoint if available
359
+ let resumedMessages = null;
360
+ if (checkpointer && threadId && resumeFromCheckpoint) {
361
+ const checkpoint = await checkpointer.load(threadId);
362
+ if (checkpoint) {
363
+ // Extract historical messages and append new input
364
+ const historicalMessages = checkpoint.state.messages;
365
+ const newMessages = normalizeMessages(options);
366
+ // Only append new messages if there are any (avoid duplicating history)
367
+ if (newMessages.length > 0) {
368
+ resumedMessages = [...historicalMessages, ...newMessages];
369
+ }
370
+ else {
371
+ resumedMessages = historicalMessages;
372
+ }
373
+ }
374
+ }
375
+ // Normalize messages - use resumed messages if available, otherwise input
376
+ const messages = resumedMessages ?? normalizeMessages(options);
335
377
  // Track current messages for tool context (will be updated during execution)
336
378
  let currentMessages = [...messages];
337
379
  // Convert tools to RegisteredTool format
@@ -409,9 +451,14 @@ export async function generateTextWithGraph(options) {
409
451
  },
410
452
  onNodeExit: onNodeExit,
411
453
  },
454
+ approvalConfig: options.approvalConfig,
412
455
  });
413
456
  // Execute graph
414
457
  const graphResult = await graph.invoke(messages);
458
+ // Save checkpoint if checkpointer provided
459
+ if (checkpointer && threadId) {
460
+ await checkpointer.save(threadId, graphResult.state);
461
+ }
415
462
  // Build result
416
463
  return {
417
464
  text: graphResult.text,
@@ -4,6 +4,29 @@
4
4
  * Provides save/load capabilities for resumable agent sessions.
5
5
  */
6
6
  import type { AgentState } from '../internal-types';
7
+ /**
8
+ * Checkpoint status.
9
+ */
10
+ export type CheckpointStatus = 'active' | 'pending_approval' | 'completed';
11
+ /**
12
+ * Pending approval information.
13
+ */
14
+ export interface PendingApproval {
15
+ /** Tool call awaiting approval */
16
+ toolCall: {
17
+ id: string;
18
+ function: {
19
+ name: string;
20
+ arguments: string;
21
+ };
22
+ };
23
+ /** Tool name */
24
+ toolName: string;
25
+ /** Parsed arguments */
26
+ args: Record<string, unknown>;
27
+ /** Timestamp when approval was requested */
28
+ requestedAt: number;
29
+ }
7
30
  /**
8
31
  * Checkpoint metadata.
9
32
  */
@@ -16,6 +39,10 @@ export interface CheckpointMetadata {
16
39
  createdAt: number;
17
40
  /** Step count at checkpoint */
18
41
  stepCount: number;
42
+ /** Checkpoint status */
43
+ status?: CheckpointStatus;
44
+ /** Pending approval info (if status is 'pending_approval') */
45
+ pendingApproval?: PendingApproval;
19
46
  /** Optional user-provided metadata */
20
47
  custom?: Record<string, unknown>;
21
48
  }
@@ -54,6 +81,15 @@ export interface SerializedAgentState {
54
81
  total_tokens: number;
55
82
  };
56
83
  }
84
+ /** Options for saving a checkpoint */
85
+ export interface CheckpointSaveOptions {
86
+ /** Custom user metadata */
87
+ custom?: Record<string, unknown>;
88
+ /** Checkpoint status (default: 'active') */
89
+ status?: CheckpointStatus;
90
+ /** Pending approval info for async approval flow */
91
+ pendingApproval?: PendingApproval;
92
+ }
57
93
  /**
58
94
  * Checkpointer interface.
59
95
  */
@@ -61,7 +97,7 @@ export interface Checkpointer {
61
97
  /**
62
98
  * Save a checkpoint.
63
99
  */
64
- save(threadId: string, state: AgentState, custom?: Record<string, unknown>): Promise<CheckpointMetadata>;
100
+ save(threadId: string, state: AgentState, options?: CheckpointSaveOptions | Record<string, unknown>): Promise<CheckpointMetadata>;
65
101
  /**
66
102
  * Load the latest checkpoint for a thread.
67
103
  */
@@ -89,7 +125,7 @@ export declare class MemoryCheckpointer implements Checkpointer {
89
125
  constructor(options?: {
90
126
  maxItems?: number;
91
127
  });
92
- save(threadId: string, state: AgentState, custom?: Record<string, unknown>): Promise<CheckpointMetadata>;
128
+ save(threadId: string, state: AgentState, options?: CheckpointSaveOptions | Record<string, unknown>): Promise<CheckpointMetadata>;
93
129
  load(threadId: string): Promise<Checkpoint | null>;
94
130
  list(threadId: string): Promise<CheckpointMetadata[]>;
95
131
  delete(checkpointId: string): Promise<boolean>;
@@ -109,4 +145,38 @@ export declare class MemoryCheckpointer implements Checkpointer {
109
145
  * Note: Tools must be re-provided, abortSignal reset to undefined.
110
146
  */
111
147
  export declare function deserializeCheckpoint(checkpoint: Checkpoint, tools?: Map<string, any>): AgentState;
148
+ /**
149
+ * Check if a checkpoint is pending approval.
150
+ */
151
+ export declare function isPendingApproval(checkpoint: Checkpoint): boolean;
152
+ /**
153
+ * Get pending approval info from checkpoint.
154
+ */
155
+ export declare function getPendingApproval(checkpoint: Checkpoint): PendingApproval | null;
156
+ /** Result of resuming with approval */
157
+ export interface ResumeWithApprovalResult {
158
+ /** Whether approval was granted */
159
+ approved: boolean;
160
+ /** Updated state with tool result added */
161
+ state: AgentState;
162
+ /** Tool result (executed result or rejection message) */
163
+ toolResult: string;
164
+ /** Whether the tool was actually executed */
165
+ toolExecuted: boolean;
166
+ }
167
+ /** Tool executor function */
168
+ export type ToolExecutor = (toolName: string, args: Record<string, unknown>, abortSignal?: AbortSignal) => Promise<unknown>;
169
+ /**
170
+ * Resume a pending approval checkpoint with user's decision.
171
+ *
172
+ * If approved and toolExecutor is provided, the tool will be executed.
173
+ * Otherwise, a synthetic approval result will be used.
174
+ *
175
+ * @param checkpoint - The pending approval checkpoint
176
+ * @param approved - Whether the user approved
177
+ * @param toolExecutor - Optional function to execute the approved tool
178
+ * @param tools - Tool map for state deserialization
179
+ * @param abortSignal - Abort signal for tool execution
180
+ */
181
+ export declare function resumeWithApproval(checkpoint: Checkpoint, approved: boolean, toolExecutor?: ToolExecutor, tools?: Map<string, any>, abortSignal?: AbortSignal): Promise<ResumeWithApprovalResult>;
112
182
  //# sourceMappingURL=checkpointer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkpointer.d.ts","sourceRoot":"","sources":["../../../src/ai/graph/checkpointer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkpointer.d.ts","sourceRoot":"","sources":["../../../src/ai/graph/checkpointer.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,9 @@
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.MemoryCheckpointer = void 0;
9
9
  exports.deserializeCheckpoint = deserializeCheckpoint;
10
+ exports.isPendingApproval = isPendingApproval;
11
+ exports.getPendingApproval = getPendingApproval;
12
+ exports.resumeWithApproval = resumeWithApproval;
10
13
  /**
11
14
  * In-memory checkpointer implementation.
12
15
  * Suitable for testing and short-lived sessions.
@@ -16,13 +19,32 @@ class MemoryCheckpointer {
16
19
  this.checkpoints = new Map();
17
20
  this.maxItems = options?.maxItems ?? 100;
18
21
  }
19
- async save(threadId, state, custom) {
22
+ async save(threadId, state, options) {
20
23
  const id = `ckpt_${threadId}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
24
+ // Extract options - handle both new CheckpointSaveOptions and legacy custom object
25
+ let status = 'active';
26
+ let pendingApproval;
27
+ let custom;
28
+ if (options) {
29
+ if ('status' in options || 'pendingApproval' in options || 'custom' in options) {
30
+ // New CheckpointSaveOptions format
31
+ const opts = options;
32
+ status = opts.status ?? 'active';
33
+ pendingApproval = opts.pendingApproval;
34
+ custom = opts.custom;
35
+ }
36
+ else {
37
+ // Legacy: treat entire object as custom metadata
38
+ custom = options;
39
+ }
40
+ }
21
41
  const metadata = {
22
42
  id,
23
43
  threadId,
24
44
  createdAt: Date.now(),
25
45
  stepCount: state.stepCount,
46
+ status,
47
+ pendingApproval,
26
48
  custom,
27
49
  };
28
50
  const serialized = this.serializeState(state);
@@ -128,4 +150,80 @@ function deserializeCheckpoint(checkpoint, tools) {
128
150
  abortSignal: undefined,
129
151
  };
130
152
  }
153
+ /**
154
+ * Check if a checkpoint is pending approval.
155
+ */
156
+ function isPendingApproval(checkpoint) {
157
+ return checkpoint.metadata.status === 'pending_approval' &&
158
+ checkpoint.metadata.pendingApproval != null;
159
+ }
160
+ /**
161
+ * Get pending approval info from checkpoint.
162
+ */
163
+ function getPendingApproval(checkpoint) {
164
+ if (!isPendingApproval(checkpoint)) {
165
+ return null;
166
+ }
167
+ return checkpoint.metadata.pendingApproval ?? null;
168
+ }
169
+ /**
170
+ * Resume a pending approval checkpoint with user's decision.
171
+ *
172
+ * If approved and toolExecutor is provided, the tool will be executed.
173
+ * Otherwise, a synthetic approval result will be used.
174
+ *
175
+ * @param checkpoint - The pending approval checkpoint
176
+ * @param approved - Whether the user approved
177
+ * @param toolExecutor - Optional function to execute the approved tool
178
+ * @param tools - Tool map for state deserialization
179
+ * @param abortSignal - Abort signal for tool execution
180
+ */
181
+ async function resumeWithApproval(checkpoint, approved, toolExecutor, tools, abortSignal) {
182
+ const pending = checkpoint.metadata.pendingApproval;
183
+ if (!pending) {
184
+ throw new Error('Checkpoint does not have pending approval');
185
+ }
186
+ // Deserialize state
187
+ const state = deserializeCheckpoint(checkpoint, tools);
188
+ let toolResult;
189
+ let toolExecuted = false;
190
+ if (approved) {
191
+ if (toolExecutor) {
192
+ // Execute the actual tool
193
+ try {
194
+ const result = await toolExecutor(pending.toolName, pending.args, abortSignal);
195
+ toolResult = typeof result === 'string' ? result : JSON.stringify(result ?? { success: true });
196
+ toolExecuted = true;
197
+ }
198
+ catch (error) {
199
+ const errorMessage = error instanceof Error ? error.message : String(error);
200
+ toolResult = `[Execution Error] ${errorMessage}`;
201
+ toolExecuted = true; // Attempted execution
202
+ }
203
+ }
204
+ else {
205
+ // No executor provided - return synthetic success
206
+ toolResult = JSON.stringify({ approved: true, args: pending.args });
207
+ toolExecuted = false;
208
+ }
209
+ }
210
+ else {
211
+ // Rejected
212
+ toolResult = '[Approval Rejected] Tool execution was denied by user.';
213
+ toolExecuted = false;
214
+ }
215
+ // Add tool result message to state
216
+ const toolResultMessage = {
217
+ role: 'tool',
218
+ content: toolResult,
219
+ tool_call_id: pending.toolCall.id,
220
+ };
221
+ state.messages = [...state.messages, toolResultMessage];
222
+ return {
223
+ approved,
224
+ state,
225
+ toolResult,
226
+ toolExecuted,
227
+ };
228
+ }
131
229
  //# sourceMappingURL=checkpointer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkpointer.js","sourceRoot":"","sources":["../../../src/ai/graph/checkpointer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkpointer.js","sourceRoot":"","sources":["../../../src/ai/graph/checkpointer.ts"],"names":[],"mappings":"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"}
@@ -12,13 +12,32 @@ export class MemoryCheckpointer {
12
12
  this.checkpoints = new Map();
13
13
  this.maxItems = options?.maxItems ?? 100;
14
14
  }
15
- async save(threadId, state, custom) {
15
+ async save(threadId, state, options) {
16
16
  const id = `ckpt_${threadId}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
17
+ // Extract options - handle both new CheckpointSaveOptions and legacy custom object
18
+ let status = 'active';
19
+ let pendingApproval;
20
+ let custom;
21
+ if (options) {
22
+ if ('status' in options || 'pendingApproval' in options || 'custom' in options) {
23
+ // New CheckpointSaveOptions format
24
+ const opts = options;
25
+ status = opts.status ?? 'active';
26
+ pendingApproval = opts.pendingApproval;
27
+ custom = opts.custom;
28
+ }
29
+ else {
30
+ // Legacy: treat entire object as custom metadata
31
+ custom = options;
32
+ }
33
+ }
17
34
  const metadata = {
18
35
  id,
19
36
  threadId,
20
37
  createdAt: Date.now(),
21
38
  stepCount: state.stepCount,
39
+ status,
40
+ pendingApproval,
22
41
  custom,
23
42
  };
24
43
  const serialized = this.serializeState(state);
@@ -123,4 +142,80 @@ export function deserializeCheckpoint(checkpoint, tools) {
123
142
  abortSignal: undefined,
124
143
  };
125
144
  }
145
+ /**
146
+ * Check if a checkpoint is pending approval.
147
+ */
148
+ export function isPendingApproval(checkpoint) {
149
+ return checkpoint.metadata.status === 'pending_approval' &&
150
+ checkpoint.metadata.pendingApproval != null;
151
+ }
152
+ /**
153
+ * Get pending approval info from checkpoint.
154
+ */
155
+ export function getPendingApproval(checkpoint) {
156
+ if (!isPendingApproval(checkpoint)) {
157
+ return null;
158
+ }
159
+ return checkpoint.metadata.pendingApproval ?? null;
160
+ }
161
+ /**
162
+ * Resume a pending approval checkpoint with user's decision.
163
+ *
164
+ * If approved and toolExecutor is provided, the tool will be executed.
165
+ * Otherwise, a synthetic approval result will be used.
166
+ *
167
+ * @param checkpoint - The pending approval checkpoint
168
+ * @param approved - Whether the user approved
169
+ * @param toolExecutor - Optional function to execute the approved tool
170
+ * @param tools - Tool map for state deserialization
171
+ * @param abortSignal - Abort signal for tool execution
172
+ */
173
+ export async function resumeWithApproval(checkpoint, approved, toolExecutor, tools, abortSignal) {
174
+ const pending = checkpoint.metadata.pendingApproval;
175
+ if (!pending) {
176
+ throw new Error('Checkpoint does not have pending approval');
177
+ }
178
+ // Deserialize state
179
+ const state = deserializeCheckpoint(checkpoint, tools);
180
+ let toolResult;
181
+ let toolExecuted = false;
182
+ if (approved) {
183
+ if (toolExecutor) {
184
+ // Execute the actual tool
185
+ try {
186
+ const result = await toolExecutor(pending.toolName, pending.args, abortSignal);
187
+ toolResult = typeof result === 'string' ? result : JSON.stringify(result ?? { success: true });
188
+ toolExecuted = true;
189
+ }
190
+ catch (error) {
191
+ const errorMessage = error instanceof Error ? error.message : String(error);
192
+ toolResult = `[Execution Error] ${errorMessage}`;
193
+ toolExecuted = true; // Attempted execution
194
+ }
195
+ }
196
+ else {
197
+ // No executor provided - return synthetic success
198
+ toolResult = JSON.stringify({ approved: true, args: pending.args });
199
+ toolExecuted = false;
200
+ }
201
+ }
202
+ else {
203
+ // Rejected
204
+ toolResult = '[Approval Rejected] Tool execution was denied by user.';
205
+ toolExecuted = false;
206
+ }
207
+ // Add tool result message to state
208
+ const toolResultMessage = {
209
+ role: 'tool',
210
+ content: toolResult,
211
+ tool_call_id: pending.toolCall.id,
212
+ };
213
+ state.messages = [...state.messages, toolResultMessage];
214
+ return {
215
+ approved,
216
+ state,
217
+ toolResult,
218
+ toolExecuted,
219
+ };
220
+ }
126
221
  //# sourceMappingURL=checkpointer.js.map
@@ -4,8 +4,8 @@
4
4
  export { StateGraph, MaxGraphStepsError } from './state-graph';
5
5
  export { END } from './types';
6
6
  export type { NodeFunction, EdgeResolver, GraphNode, GraphEdge, CompiledGraph, InvokeOptions, StateGraphConfig, } from './types';
7
- export { MemoryCheckpointer, deserializeCheckpoint, } from './checkpointer';
8
- export type { Checkpointer, Checkpoint, CheckpointMetadata, SerializedAgentState, } from './checkpointer';
7
+ export { MemoryCheckpointer, deserializeCheckpoint, isPendingApproval, getPendingApproval, resumeWithApproval, } from './checkpointer';
8
+ export type { Checkpointer, Checkpoint, CheckpointMetadata, SerializedAgentState, CheckpointStatus, CheckpointSaveOptions, PendingApproval, ResumeWithApprovalResult, ToolExecutor, } from './checkpointer';
9
9
  export { RedisCheckpointer } from './redis-checkpointer';
10
10
  export type { RedisClient, RedisCheckpointerConfig } from './redis-checkpointer';
11
11
  export { PostgresCheckpointer } from './postgres-checkpointer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/graph/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,YAAY,EACR,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACH,kBAAkB,EAClB,qBAAqB,GACxB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACR,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,oBAAoB,GACvB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/graph/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,YAAY,EACR,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACH,kBAAkB,EAClB,qBAAqB,EAErB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACrB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACR,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EAEpB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,wBAAwB,EACxB,YAAY,GACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC"}
@@ -3,7 +3,7 @@
3
3
  * Graph Runtime public exports.
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PostgresCheckpointer = exports.RedisCheckpointer = exports.deserializeCheckpoint = exports.MemoryCheckpointer = exports.END = exports.MaxGraphStepsError = exports.StateGraph = void 0;
6
+ exports.PostgresCheckpointer = exports.RedisCheckpointer = exports.resumeWithApproval = exports.getPendingApproval = exports.isPendingApproval = exports.deserializeCheckpoint = exports.MemoryCheckpointer = exports.END = exports.MaxGraphStepsError = exports.StateGraph = void 0;
7
7
  var state_graph_1 = require("./state-graph");
8
8
  Object.defineProperty(exports, "StateGraph", { enumerable: true, get: function () { return state_graph_1.StateGraph; } });
9
9
  Object.defineProperty(exports, "MaxGraphStepsError", { enumerable: true, get: function () { return state_graph_1.MaxGraphStepsError; } });
@@ -13,6 +13,10 @@ Object.defineProperty(exports, "END", { enumerable: true, get: function () { ret
13
13
  var checkpointer_1 = require("./checkpointer");
14
14
  Object.defineProperty(exports, "MemoryCheckpointer", { enumerable: true, get: function () { return checkpointer_1.MemoryCheckpointer; } });
15
15
  Object.defineProperty(exports, "deserializeCheckpoint", { enumerable: true, get: function () { return checkpointer_1.deserializeCheckpoint; } });
16
+ // Phase 5: Async Approval helpers
17
+ Object.defineProperty(exports, "isPendingApproval", { enumerable: true, get: function () { return checkpointer_1.isPendingApproval; } });
18
+ Object.defineProperty(exports, "getPendingApproval", { enumerable: true, get: function () { return checkpointer_1.getPendingApproval; } });
19
+ Object.defineProperty(exports, "resumeWithApproval", { enumerable: true, get: function () { return checkpointer_1.resumeWithApproval; } });
16
20
  // Redis Checkpointer (optional - requires ioredis)
17
21
  var redis_checkpointer_1 = require("./redis-checkpointer");
18
22
  Object.defineProperty(exports, "RedisCheckpointer", { enumerable: true, get: function () { return redis_checkpointer_1.RedisCheckpointer; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/graph/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6CAA+D;AAAtD,yGAAA,UAAU,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AACvC,iCAA8B;AAArB,4FAAA,GAAG,OAAA;AAWZ,gBAAgB;AAChB,+CAGwB;AAFpB,kHAAA,kBAAkB,OAAA;AAClB,qHAAA,qBAAqB,OAAA;AASzB,mDAAmD;AACnD,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAG1B,iDAAiD;AACjD,iEAA+D;AAAtD,6HAAA,oBAAoB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/graph/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6CAA+D;AAAtD,yGAAA,UAAU,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AACvC,iCAA8B;AAArB,4FAAA,GAAG,OAAA;AAWZ,gBAAgB;AAChB,+CAOwB;AANpB,kHAAA,kBAAkB,OAAA;AAClB,qHAAA,qBAAqB,OAAA;AACrB,kCAAkC;AAClC,iHAAA,iBAAiB,OAAA;AACjB,kHAAA,kBAAkB,OAAA;AAClB,kHAAA,kBAAkB,OAAA;AAetB,mDAAmD;AACnD,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAG1B,iDAAiD;AACjD,iEAA+D;AAAtD,6HAAA,oBAAoB,OAAA"}
@@ -4,7 +4,9 @@
4
4
  export { StateGraph, MaxGraphStepsError } from './state-graph.mjs';
5
5
  export { END } from './types.mjs';
6
6
  // Checkpointers
7
- export { MemoryCheckpointer, deserializeCheckpoint, } from './checkpointer.mjs';
7
+ export { MemoryCheckpointer, deserializeCheckpoint,
8
+ // Phase 5: Async Approval helpers
9
+ isPendingApproval, getPendingApproval, resumeWithApproval, } from './checkpointer.mjs';
8
10
  // Redis Checkpointer (optional - requires ioredis)
9
11
  export { RedisCheckpointer } from './redis-checkpointer.mjs';
10
12
  // Postgres Checkpointer (optional - requires pg)
@@ -44,7 +44,7 @@ export declare class PostgresCheckpointer implements Checkpointer {
44
44
  * Run this during application setup.
45
45
  */
46
46
  createTable(): Promise<void>;
47
- save(threadId: string, state: AgentState, custom?: Record<string, unknown>): Promise<CheckpointMetadata>;
47
+ save(threadId: string, state: AgentState, options?: Record<string, unknown>): Promise<CheckpointMetadata>;
48
48
  load(threadId: string): Promise<Checkpoint | null>;
49
49
  list(threadId: string): Promise<CheckpointMetadata[]>;
50
50
  delete(checkpointId: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-checkpointer.d.ts","sourceRoot":"","sources":["../../../src/ai/graph/postgres-checkpointer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAwB,MAAM,gBAAgB,CAAC;AAEzG,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;CAChF;AAED,0CAA0C;AAC1C,MAAM,WAAW,0BAA0B;IACvC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,cAAc,EAAE,MAAM,GAAE,0BAA+B;IAM3E,OAAO,KAAK,KAAK,GAEhB;IAED;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,IAAI,CACN,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,kBAAkB,CAAC;IAuBxB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkClD,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA0BrD,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9C,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ9C,OAAO,CAAC,cAAc;CAkBzB"}
1
+ {"version":3,"file":"postgres-checkpointer.d.ts","sourceRoot":"","sources":["../../../src/ai/graph/postgres-checkpointer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAwB,MAAM,gBAAgB,CAAC;AAEzG,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;CAChF;AAED,0CAA0C;AAC1C,MAAM,WAAW,0BAA0B;IACvC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,cAAc,EAAE,MAAM,GAAE,0BAA+B;IAM3E,OAAO,KAAK,KAAK,GAEhB;IAED;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,IAAI,CACN,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,UAAU,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,kBAAkB,CAAC;IAmCxB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkClD,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA0BrD,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9C,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ9C,OAAO,CAAC,cAAc;CAkBzB"}
@@ -55,19 +55,29 @@ class PostgresCheckpointer {
55
55
  ON ${this.table} (created_at DESC)
56
56
  `);
57
57
  }
58
- async save(threadId, state, custom) {
58
+ async save(threadId, state, options) {
59
59
  const id = `ckpt_${threadId}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
60
60
  const createdAt = Date.now();
61
+ // Extract options (compatible with both old and new API)
62
+ const opts = options;
61
63
  const metadata = {
62
64
  id,
63
65
  threadId,
64
66
  createdAt,
65
67
  stepCount: state.stepCount,
66
- custom,
68
+ status: opts?.status ?? 'active',
69
+ pendingApproval: opts?.pendingApproval,
70
+ custom: opts?.custom ?? (opts && !('status' in opts) ? opts : undefined),
67
71
  };
68
72
  const serializedState = this.serializeState(state);
73
+ // Store status and pendingApproval in custom field for Postgres (schema migration needed for full support)
74
+ const fullCustom = {
75
+ ...metadata.custom,
76
+ ...(metadata.status !== 'active' ? { __status: metadata.status } : {}),
77
+ ...(metadata.pendingApproval ? { __pendingApproval: metadata.pendingApproval } : {}),
78
+ };
69
79
  await this.client.query(`INSERT INTO ${this.table} (id, thread_id, created_at, step_count, custom, state)
70
- VALUES ($1, $2, $3, $4, $5, $6)`, [id, threadId, createdAt, state.stepCount, JSON.stringify(custom ?? {}), JSON.stringify(serializedState)]);
80
+ VALUES ($1, $2, $3, $4, $5, $6)`, [id, threadId, createdAt, state.stepCount, JSON.stringify(fullCustom), JSON.stringify(serializedState)]);
71
81
  return metadata;
72
82
  }
73
83
  async load(threadId) {
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-checkpointer.js","sourceRoot":"","sources":["../../../src/ai/graph/postgres-checkpointer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres-checkpointer.js","sourceRoot":"","sources":["../../../src/ai/graph/postgres-checkpointer.ts"],"names":[],"mappings":"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"}