@bowenqt/qiniu-ai-sdk 0.14.0 → 0.16.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 (107) hide show
  1. package/dist/ai/agent-graph.d.ts +8 -0
  2. package/dist/ai/agent-graph.d.ts.map +1 -1
  3. package/dist/ai/agent-graph.js +23 -3
  4. package/dist/ai/agent-graph.js.map +1 -1
  5. package/dist/ai/agent-graph.mjs +23 -3
  6. package/dist/ai/create-agent.d.ts +101 -0
  7. package/dist/ai/create-agent.d.ts.map +1 -0
  8. package/dist/ai/create-agent.js +88 -0
  9. package/dist/ai/create-agent.js.map +1 -0
  10. package/dist/ai/create-agent.mjs +85 -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 +237 -0
  14. package/dist/ai/generate-object.js.map +1 -0
  15. package/dist/ai/generate-object.mjs +201 -0
  16. package/dist/ai/generate-text.d.ts +13 -1
  17. package/dist/ai/generate-text.d.ts.map +1 -1
  18. package/dist/ai/generate-text.js +35 -5
  19. package/dist/ai/generate-text.js.map +1 -1
  20. package/dist/ai/generate-text.mjs +35 -5
  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 +14 -0
  42. package/dist/ai/internal-types.d.ts.map +1 -1
  43. package/dist/ai/internal-types.js +15 -0
  44. package/dist/ai/internal-types.js.map +1 -1
  45. package/dist/ai/internal-types.mjs +13 -0
  46. package/dist/ai/memory/index.d.ts +147 -0
  47. package/dist/ai/memory/index.d.ts.map +1 -0
  48. package/dist/ai/memory/index.js +240 -0
  49. package/dist/ai/memory/index.js.map +1 -0
  50. package/dist/ai/memory/index.mjs +234 -0
  51. package/dist/ai/nodes/execute-node.d.ts +2 -1
  52. package/dist/ai/nodes/execute-node.d.ts.map +1 -1
  53. package/dist/ai/nodes/execute-node.js +11 -33
  54. package/dist/ai/nodes/execute-node.js.map +1 -1
  55. package/dist/ai/nodes/execute-node.mjs +11 -33
  56. package/dist/ai/nodes/memory-node.d.ts.map +1 -1
  57. package/dist/ai/nodes/memory-node.js +14 -16
  58. package/dist/ai/nodes/memory-node.js.map +1 -1
  59. package/dist/ai/nodes/memory-node.mjs +15 -17
  60. package/dist/ai/stream-object.d.ts +109 -0
  61. package/dist/ai/stream-object.d.ts.map +1 -0
  62. package/dist/ai/stream-object.js +383 -0
  63. package/dist/ai/stream-object.js.map +1 -0
  64. package/dist/ai/stream-object.mjs +347 -0
  65. package/dist/ai/tool-approval.d.ts +90 -0
  66. package/dist/ai/tool-approval.d.ts.map +1 -0
  67. package/dist/ai/tool-approval.js +151 -0
  68. package/dist/ai/tool-approval.js.map +1 -0
  69. package/dist/ai/tool-approval.mjs +147 -0
  70. package/dist/index.d.ts +17 -5
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +28 -3
  73. package/dist/index.js.map +1 -1
  74. package/dist/index.mjs +16 -4
  75. package/dist/lib/capability-cache.d.ts +72 -0
  76. package/dist/lib/capability-cache.d.ts.map +1 -0
  77. package/dist/lib/capability-cache.js +117 -0
  78. package/dist/lib/capability-cache.js.map +1 -0
  79. package/dist/lib/capability-cache.mjs +113 -0
  80. package/dist/lib/content-converter.d.ts +33 -0
  81. package/dist/lib/content-converter.d.ts.map +1 -0
  82. package/dist/lib/content-converter.js +166 -0
  83. package/dist/lib/content-converter.js.map +1 -0
  84. package/dist/lib/content-converter.mjs +161 -0
  85. package/dist/lib/errors.d.ts +15 -0
  86. package/dist/lib/errors.d.ts.map +1 -1
  87. package/dist/lib/errors.js +13 -1
  88. package/dist/lib/errors.js.map +1 -1
  89. package/dist/lib/errors.mjs +11 -0
  90. package/dist/lib/messages.js +4 -3
  91. package/dist/lib/messages.js.map +1 -1
  92. package/dist/lib/messages.mjs +4 -3
  93. package/dist/lib/partial-json-parser.d.ts +63 -0
  94. package/dist/lib/partial-json-parser.d.ts.map +1 -0
  95. package/dist/lib/partial-json-parser.js +142 -0
  96. package/dist/lib/partial-json-parser.js.map +1 -0
  97. package/dist/lib/partial-json-parser.mjs +137 -0
  98. package/dist/lib/token-estimator.d.ts.map +1 -1
  99. package/dist/lib/token-estimator.js +3 -2
  100. package/dist/lib/token-estimator.js.map +1 -1
  101. package/dist/lib/token-estimator.mjs +3 -2
  102. package/dist/lib/tool-registry.d.ts +21 -0
  103. package/dist/lib/tool-registry.d.ts.map +1 -1
  104. package/dist/lib/tool-registry.js.map +1 -1
  105. package/dist/lib/types.d.ts +20 -4
  106. package/dist/lib/types.d.ts.map +1 -1
  107. package/package.json +1 -1
@@ -1,6 +1,8 @@
1
1
  import { MaxStepsExceededError, ToolExecutionError } from '../lib/errors.mjs';
2
+ import { checkApproval } from './tool-approval.mjs';
3
+ import { normalizeContent } from '../lib/content-converter.mjs';
2
4
  export async function generateText(options) {
3
- const { client, model, tools, maxSteps = 1, onStepFinish, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, } = options;
5
+ const { client, model, tools, maxSteps = 1, onStepFinish, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, approvalConfig, } = options;
4
6
  const messages = normalizeMessages(options);
5
7
  const steps = [];
6
8
  let lastNonToolText = ''; // Only capture text from non-tool-call steps
@@ -57,7 +59,7 @@ export async function generateText(options) {
57
59
  toolCalls: [toolCall],
58
60
  }));
59
61
  steps.push(...toolCallSteps);
60
- const toolResults = await executeTools(streamResult.toolCalls, tools, messages, abortSignal);
62
+ const toolResults = await executeTools(streamResult.toolCalls, tools, messages, abortSignal, approvalConfig);
61
63
  const toolResultSteps = toolResults.map((toolResult) => ({
62
64
  type: 'tool_result',
63
65
  content: toolResult.result,
@@ -106,9 +108,14 @@ function normalizeMessages(options) {
106
108
  }
107
109
  function buildChatRequest(params) {
108
110
  const { model, messages, tools, temperature, topP, maxTokens, responseFormat, toolChoice } = params;
111
+ // Normalize multimodal content (image -> image_url) for API compatibility
112
+ const normalizedMessages = messages.map(msg => ({
113
+ ...msg,
114
+ content: normalizeContent(msg.content),
115
+ }));
109
116
  return {
110
117
  model,
111
- messages,
118
+ messages: normalizedMessages,
112
119
  temperature,
113
120
  top_p: topP,
114
121
  max_tokens: maxTokens,
@@ -273,7 +280,7 @@ function toolResultsToMessages(toolCalls, results) {
273
280
  };
274
281
  });
275
282
  }
276
- async function executeTools(toolCalls, tools, messages, abortSignal) {
283
+ async function executeTools(toolCalls, tools, messages, abortSignal, approvalConfig) {
277
284
  const results = [];
278
285
  for (const toolCall of toolCalls) {
279
286
  const tool = tools[toolCall.function.name];
@@ -281,6 +288,26 @@ async function executeTools(toolCalls, tools, messages, abortSignal) {
281
288
  throw new ToolExecutionError(toolCall.function.name, 'Tool is not implemented.');
282
289
  }
283
290
  const args = parseToolArguments(toolCall.function.arguments);
291
+ // Check approval if tool requires it
292
+ if (tool.requiresApproval) {
293
+ // Create a minimal RegisteredTool-compatible object for checkApproval
294
+ const toolForApproval = {
295
+ name: toolCall.function.name,
296
+ description: tool.description ?? '',
297
+ parameters: (tool.parameters ?? {}),
298
+ source: { type: 'builtin', namespace: 'user' },
299
+ requiresApproval: tool.requiresApproval,
300
+ approvalHandler: tool.approvalHandler,
301
+ };
302
+ const approvalResult = await checkApproval(toolForApproval, toolCall, args, messages, approvalConfig);
303
+ if (!approvalResult.approved) {
304
+ results.push({
305
+ toolCallId: toolCall.id,
306
+ result: approvalResult.rejectionMessage ?? '[Approval Rejected] Tool execution was denied.',
307
+ });
308
+ continue;
309
+ }
310
+ }
284
311
  const value = await tool.execute(args, {
285
312
  toolCallId: toolCall.id,
286
313
  messages,
@@ -329,7 +356,7 @@ import { AgentGraph } from './agent-graph.mjs';
329
356
  * ```
330
357
  */
331
358
  export async function generateTextWithGraph(options) {
332
- const { client, model, tools, skills, maxSteps = 10, maxContextTokens, onStepFinish, onNodeEnter, onNodeExit, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, checkpointer, threadId, resumeFromCheckpoint = true, } = options;
359
+ const { client, model, tools, skills, maxSteps = 10, maxContextTokens, onStepFinish, onNodeEnter, onNodeExit, abortSignal, temperature, topP, maxTokens, responseFormat, toolChoice, checkpointer, threadId, resumeFromCheckpoint = true, memory, } = options;
333
360
  // Validate checkpointer + threadId combination
334
361
  if (checkpointer && !threadId) {
335
362
  throw new Error('threadId is required when checkpointer is provided');
@@ -430,6 +457,9 @@ export async function generateTextWithGraph(options) {
430
457
  },
431
458
  onNodeExit: onNodeExit,
432
459
  },
460
+ approvalConfig: options.approvalConfig,
461
+ memory,
462
+ threadId,
433
463
  });
434
464
  // Execute graph
435
465
  const graphResult = await graph.invoke(messages);
@@ -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":";AAAA;;;;GAIG;;;AAyRH,sDAmBC;AAKD,8CAGC;AAKD,gDAKC;AAiCD,gDAyDC;AAtRD;;;GAGG;AACH,MAAa,kBAAkB;IAI3B,YAAY,OAA+B;QAH1B,gBAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;QAIzD,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI,CACN,QAAgB,EAChB,KAAiB,EACjB,OAAyD;QAEzD,MAAM,EAAE,GAAG,QAAQ,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAEtF,mFAAmF;QACnF,IAAI,MAAM,GAAqB,QAAQ,CAAC;QACxC,IAAI,eAA4C,CAAC;QACjD,IAAI,MAA2C,CAAC;QAEhD,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,QAAQ,IAAI,OAAO,IAAI,iBAAiB,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;gBAC7E,mCAAmC;gBACnC,MAAM,IAAI,GAAG,OAAgC,CAAC;gBAC9C,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC;gBACjC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;gBACvC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,iDAAiD;gBACjD,MAAM,GAAG,OAAkC,CAAC;YAChD,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAuB;YACjC,EAAE;YACF,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM;YACN,eAAe;YACf,MAAM;SACT,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE;YACrB,QAAQ;YACR,KAAK,EAAE,UAAU;SACpB,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACvB,oCAAoC;QACpC,IAAI,MAAM,GAAsB,IAAI,CAAC;QAErC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC5C,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBACvE,MAAM,GAAG,UAAU,CAAC;gBACxB,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACvB,MAAM,MAAM,GAAyB,EAAE,CAAC;QAExC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB;QACxB,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC5C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5B,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,KAAiB;QACpC,OAAO;YACH,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,KAAK,EAAE,GAAG,CAAC,KAAK;aACnB,CAAC,CAAC;YACH,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,KAAK,EAAE,KAAK,CAAC,KAAK;SACrB,CAAC;IACN,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACjB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,OAAO;QACX,CAAC;QAED,uCAAuC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;aAChD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEvE,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxE,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;IACL,CAAC;CACJ;AA7ID,gDA6IC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CACjC,UAAsB,EACtB,KAAwB;IAExB,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;IAE3B,OAAO;QACH,QAAQ,EAAE,CAAC,CAAC,QAAe;QAC3B,MAAM,EAAE,EAAE,EAAE,gDAAgD;QAC5D,KAAK,EAAE,KAAK,IAAI,IAAI,GAAG,EAAE;QACzB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,WAAW,EAAE,SAAS;KACzB,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,UAAsB;IACpD,OAAO,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,kBAAkB;QACpD,UAAU,CAAC,QAAQ,CAAC,eAAe,IAAI,IAAI,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,UAAsB;IACrD,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,eAAe,IAAI,IAAI,CAAC;AACvD,CAAC;AAqBD;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,kBAAkB,CACpC,UAAsB,EACtB,QAAiB,EACjB,YAA2B,EAC3B,KAAwB,EACxB,WAAyB;IAEzB,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC;IAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACjE,CAAC;IAED,oBAAoB;IACpB,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEvD,IAAI,UAAkB,CAAC;IACvB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,IAAI,QAAQ,EAAE,CAAC;QACX,IAAI,YAAY,EAAE,CAAC;YACf,0BAA0B;YAC1B,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC/E,UAAU,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/F,YAAY,GAAG,IAAI,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,UAAU,GAAG,qBAAqB,YAAY,EAAE,CAAC;gBACjD,YAAY,GAAG,IAAI,CAAC,CAAC,sBAAsB;YAC/C,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,kDAAkD;YAClD,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,YAAY,GAAG,KAAK,CAAC;QACzB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,WAAW;QACX,UAAU,GAAG,wDAAwD,CAAC;QACtE,YAAY,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,mCAAmC;IACnC,MAAM,iBAAiB,GAAG;QACtB,IAAI,EAAE,MAAe;QACrB,OAAO,EAAE,UAAU;QACnB,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;KACpC,CAAC;IAEF,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,iBAAwB,CAAC,CAAC;IAE/D,OAAO;QACH,QAAQ;QACR,KAAK;QACL,UAAU;QACV,YAAY;KACf,CAAC;AACN,CAAC"}
@@ -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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"}
@@ -52,19 +52,29 @@ export class PostgresCheckpointer {
52
52
  ON ${this.table} (created_at DESC)
53
53
  `);
54
54
  }
55
- async save(threadId, state, custom) {
55
+ async save(threadId, state, options) {
56
56
  const id = `ckpt_${threadId}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
57
57
  const createdAt = Date.now();
58
+ // Extract options (compatible with both old and new API)
59
+ const opts = options;
58
60
  const metadata = {
59
61
  id,
60
62
  threadId,
61
63
  createdAt,
62
64
  stepCount: state.stepCount,
63
- custom,
65
+ status: opts?.status ?? 'active',
66
+ pendingApproval: opts?.pendingApproval,
67
+ custom: opts?.custom ?? (opts && !('status' in opts) ? opts : undefined),
64
68
  };
65
69
  const serializedState = this.serializeState(state);
70
+ // Store status and pendingApproval in custom field for Postgres (schema migration needed for full support)
71
+ const fullCustom = {
72
+ ...metadata.custom,
73
+ ...(metadata.status !== 'active' ? { __status: metadata.status } : {}),
74
+ ...(metadata.pendingApproval ? { __pendingApproval: metadata.pendingApproval } : {}),
75
+ };
66
76
  await this.client.query(`INSERT INTO ${this.table} (id, thread_id, created_at, step_count, custom, state)
67
- VALUES ($1, $2, $3, $4, $5, $6)`, [id, threadId, createdAt, state.stepCount, JSON.stringify(custom ?? {}), JSON.stringify(serializedState)]);
77
+ VALUES ($1, $2, $3, $4, $5, $6)`, [id, threadId, createdAt, state.stepCount, JSON.stringify(fullCustom), JSON.stringify(serializedState)]);
68
78
  return metadata;
69
79
  }
70
80
  async load(threadId) {