@gt-fe/eap-runtime 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +323 -0
- package/dist/api/handlers/index.d.ts +3 -0
- package/dist/api/handlers/index.js +4 -0
- package/dist/api/handlers/invoke.handler.d.ts +77 -0
- package/dist/api/handlers/invoke.handler.js +411 -0
- package/dist/api/handlers/messages.handler.d.ts +53 -0
- package/dist/api/handlers/messages.handler.js +80 -0
- package/dist/api/handlers/stream.handler.d.ts +92 -0
- package/dist/api/handlers/stream.handler.js +432 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.js +4 -0
- package/dist/api/middleware/auth.middleware.d.ts +96 -0
- package/dist/api/middleware/auth.middleware.js +158 -0
- package/dist/api/middleware/index.d.ts +1 -0
- package/dist/api/middleware/index.js +2 -0
- package/dist/api/routes/agent.routes.d.ts +44 -0
- package/dist/api/routes/agent.routes.js +204 -0
- package/dist/api/routes/index.d.ts +3 -0
- package/dist/api/routes/index.js +4 -0
- package/dist/api/routes/session.routes.d.ts +82 -0
- package/dist/api/routes/session.routes.js +169 -0
- package/dist/api/routes/task.routes.d.ts +75 -0
- package/dist/api/routes/task.routes.js +108 -0
- package/dist/checkpoint/checkpoint-serializer.d.ts +58 -0
- package/dist/checkpoint/checkpoint-serializer.js +81 -0
- package/dist/checkpoint/composite-checkpoint-saver.d.ts +42 -0
- package/dist/checkpoint/composite-checkpoint-saver.js +118 -0
- package/dist/checkpoint/contracts/checkpoint-saver.contract.d.ts +65 -0
- package/dist/checkpoint/contracts/checkpoint-saver.contract.js +12 -0
- package/dist/checkpoint/contracts/index.d.ts +1 -0
- package/dist/checkpoint/contracts/index.js +1 -0
- package/dist/checkpoint/file-checkpoint-saver.d.ts +19 -0
- package/dist/checkpoint/file-checkpoint-saver.js +98 -0
- package/dist/checkpoint/hybrid-checkpoint-saver.d.ts +130 -0
- package/dist/checkpoint/hybrid-checkpoint-saver.js +211 -0
- package/dist/checkpoint/in-memory-checkpoint-saver.d.ts +14 -0
- package/dist/checkpoint/in-memory-checkpoint-saver.js +46 -0
- package/dist/checkpoint/index.d.ts +16 -0
- package/dist/checkpoint/index.js +13 -0
- package/dist/checkpoint/mongo-checkpoint-saver.d.ts +38 -0
- package/dist/checkpoint/mongo-checkpoint-saver.js +56 -0
- package/dist/checkpoint/pg-checkpoint-saver.d.ts +59 -0
- package/dist/checkpoint/pg-checkpoint-saver.js +140 -0
- package/dist/checkpoint/redis-checkpoint-saver.d.ts +68 -0
- package/dist/checkpoint/redis-checkpoint-saver.js +173 -0
- package/dist/checkpoint/restore-checkpoint.d.ts +33 -0
- package/dist/checkpoint/restore-checkpoint.js +33 -0
- package/dist/common/agent-code.d.ts +10 -0
- package/dist/common/agent-code.js +12 -0
- package/dist/common/concurrency.d.ts +79 -0
- package/dist/common/concurrency.js +121 -0
- package/dist/common/health.d.ts +40 -0
- package/dist/common/health.js +37 -0
- package/dist/common/index.d.ts +5 -0
- package/dist/common/index.js +5 -0
- package/dist/common/logger.d.ts +34 -0
- package/dist/common/logger.js +38 -0
- package/dist/common/queue-consumer.d.ts +125 -0
- package/dist/common/queue-consumer.js +159 -0
- package/dist/common/trace-id.d.ts +2 -0
- package/dist/common/trace-id.js +8 -0
- package/dist/common/types.d.ts +104 -0
- package/dist/common/types.js +14 -0
- package/dist/contracts/index.d.ts +11 -0
- package/dist/contracts/index.js +10 -0
- package/dist/contracts/permission-checker.d.ts +10 -0
- package/dist/contracts/permission-checker.js +4 -0
- package/dist/contracts/trace-collector.d.ts +211 -0
- package/dist/contracts/trace-collector.js +13 -0
- package/dist/governance/governance-client.d.ts +38 -0
- package/dist/governance/governance-client.js +95 -0
- package/dist/governance/index.d.ts +7 -0
- package/dist/governance/index.js +5 -0
- package/dist/governance/permission-guard.d.ts +19 -0
- package/dist/governance/permission-guard.js +59 -0
- package/dist/graph/adapters/index.d.ts +3 -0
- package/dist/graph/adapters/index.js +3 -0
- package/dist/graph/adapters/langgraph-checkpointer.d.ts +40 -0
- package/dist/graph/adapters/langgraph-checkpointer.js +211 -0
- package/dist/graph/adapters/langgraph.adapter.d.ts +190 -0
- package/dist/graph/adapters/langgraph.adapter.js +1303 -0
- package/dist/graph/adapters/subgraph-compiler.d.ts +39 -0
- package/dist/graph/adapters/subgraph-compiler.js +248 -0
- package/dist/graph/condition-evaluator.d.ts +57 -0
- package/dist/graph/condition-evaluator.js +162 -0
- package/dist/graph/contracts/executable-graph.d.ts +340 -0
- package/dist/graph/contracts/executable-graph.js +10 -0
- package/dist/graph/contracts/index.d.ts +2 -0
- package/dist/graph/contracts/index.js +2 -0
- package/dist/graph/contracts/state-graph.contract.d.ts +76 -0
- package/dist/graph/contracts/state-graph.contract.js +11 -0
- package/dist/graph/hitl/hitl-handler.d.ts +199 -0
- package/dist/graph/hitl/hitl-handler.js +480 -0
- package/dist/graph/hitl/index.d.ts +1 -0
- package/dist/graph/hitl/index.js +1 -0
- package/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.js +7 -0
- package/dist/graph/nodes/index.d.ts +2 -0
- package/dist/graph/nodes/index.js +2 -0
- package/dist/graph/nodes/llm-node.d.ts +182 -0
- package/dist/graph/nodes/llm-node.js +281 -0
- package/dist/graph/nodes/skill-bind-node.d.ts +32 -0
- package/dist/graph/nodes/skill-bind-node.js +116 -0
- package/dist/graph/nodes/tool-node.d.ts +75 -0
- package/dist/graph/nodes/tool-node.js +324 -0
- package/dist/graph/resolve-graph-prompt.d.ts +5 -0
- package/dist/graph/resolve-graph-prompt.js +75 -0
- package/dist/graph/retry/budget-aware-retry.d.ts +91 -0
- package/dist/graph/retry/budget-aware-retry.js +126 -0
- package/dist/graph/retry/index.d.ts +9 -0
- package/dist/graph/retry/index.js +8 -0
- package/dist/graph/retry/node-retry.d.ts +123 -0
- package/dist/graph/retry/node-retry.js +235 -0
- package/dist/graph/skill-audit-recorder.d.ts +126 -0
- package/dist/graph/skill-audit-recorder.js +114 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +32 -0
- package/dist/memory/compression/compression-stats.d.ts +109 -0
- package/dist/memory/compression/compression-stats.js +144 -0
- package/dist/memory/compression/compression.repository.d.ts +62 -0
- package/dist/memory/compression/compression.repository.js +71 -0
- package/dist/memory/compression/index.d.ts +10 -0
- package/dist/memory/compression/index.js +15 -0
- package/dist/memory/compression/llm-summarize.d.ts +58 -0
- package/dist/memory/compression/llm-summarize.js +192 -0
- package/dist/memory/compression/sliding-window.compression.d.ts +60 -0
- package/dist/memory/compression/sliding-window.compression.js +175 -0
- package/dist/memory/index.d.ts +4 -0
- package/dist/memory/index.js +7 -0
- package/dist/memory/long-term-memory.service.d.ts +94 -0
- package/dist/memory/long-term-memory.service.js +120 -0
- package/dist/memory/message-compression.service.d.ts +128 -0
- package/dist/memory/message-compression.service.js +69 -0
- package/dist/memory/pg-memory.repository.d.ts +44 -0
- package/dist/memory/pg-memory.repository.js +108 -0
- package/dist/memory/semantic-retrieval.service.d.ts +148 -0
- package/dist/memory/semantic-retrieval.service.js +238 -0
- package/dist/providers/echo-llm-provider.d.ts +10 -0
- package/dist/providers/echo-llm-provider.js +87 -0
- package/dist/providers/http-llm-provider.d.ts +35 -0
- package/dist/providers/http-llm-provider.js +404 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/local-llm-provider.d.ts +27 -0
- package/dist/providers/local-llm-provider.js +105 -0
- package/dist/providers/resolve-llm-model.d.ts +13 -0
- package/dist/providers/resolve-llm-model.js +30 -0
- package/dist/providers/routing-llm-provider.d.ts +28 -0
- package/dist/providers/routing-llm-provider.js +79 -0
- package/dist/registry/agent-models.d.ts +1 -0
- package/dist/registry/agent-models.js +1 -0
- package/dist/registry/agent-registry-client.d.ts +56 -0
- package/dist/registry/agent-registry-client.js +36 -0
- package/dist/registry/definition-cache.d.ts +37 -0
- package/dist/registry/definition-cache.js +82 -0
- package/dist/registry/deployment-snapshot.d.ts +99 -0
- package/dist/registry/deployment-snapshot.js +542 -0
- package/dist/registry/graph-loader.d.ts +134 -0
- package/dist/registry/graph-loader.js +985 -0
- package/dist/registry/index.d.ts +9 -0
- package/dist/registry/index.js +9 -0
- package/dist/registry/preload-errors.d.ts +13 -0
- package/dist/registry/preload-errors.js +35 -0
- package/dist/registry/preload-flags.d.ts +22 -0
- package/dist/registry/preload-flags.js +44 -0
- package/dist/registry/skill-io-guard.d.ts +25 -0
- package/dist/registry/skill-io-guard.js +98 -0
- package/dist/registry/skill-tree.d.ts +27 -0
- package/dist/registry/skill-tree.js +183 -0
- package/dist/runtime/agent-runtime.d.ts +106 -0
- package/dist/runtime/agent-runtime.js +777 -0
- package/dist/runtime/dev-runtime.d.ts +69 -0
- package/dist/runtime/dev-runtime.js +199 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/storage-profile.d.ts +50 -0
- package/dist/runtime/storage-profile.js +138 -0
- package/dist/runtime/types.d.ts +120 -0
- package/dist/runtime/types.js +9 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.js +161 -0
- package/dist/session/compression-middleware.d.ts +126 -0
- package/dist/session/compression-middleware.js +230 -0
- package/dist/session/file-message.repository.d.ts +25 -0
- package/dist/session/file-message.repository.js +78 -0
- package/dist/session/file-session.repository.d.ts +72 -0
- package/dist/session/file-session.repository.js +212 -0
- package/dist/session/index.d.ts +13 -0
- package/dist/session/index.js +12 -0
- package/dist/session/message.service.d.ts +80 -0
- package/dist/session/message.service.js +128 -0
- package/dist/session/persist-turn-messages.d.ts +145 -0
- package/dist/session/persist-turn-messages.js +325 -0
- package/dist/session/pg-message.repository.d.ts +49 -0
- package/dist/session/pg-message.repository.js +149 -0
- package/dist/session/pg-session.repository.d.ts +46 -0
- package/dist/session/pg-session.repository.js +117 -0
- package/dist/session/session-context.service.d.ts +49 -0
- package/dist/session/session-context.service.js +66 -0
- package/dist/session/session.service.d.ts +194 -0
- package/dist/session/session.service.js +166 -0
- package/dist/sse/connection-event-logger.d.ts +21 -0
- package/dist/sse/connection-event-logger.js +33 -0
- package/dist/sse/contracts/index.d.ts +1 -0
- package/dist/sse/contracts/index.js +1 -0
- package/dist/sse/contracts/sse-emitter.contract.d.ts +74 -0
- package/dist/sse/contracts/sse-emitter.contract.js +11 -0
- package/dist/sse/event-buffer.d.ts +20 -0
- package/dist/sse/event-buffer.js +45 -0
- package/dist/sse/events/code-events.d.ts +19 -0
- package/dist/sse/events/code-events.js +9 -0
- package/dist/sse/events/collaboration-events.d.ts +37 -0
- package/dist/sse/events/collaboration-events.js +11 -0
- package/dist/sse/events/connection-events.d.ts +13 -0
- package/dist/sse/events/connection-events.js +9 -0
- package/dist/sse/events/file-events.d.ts +29 -0
- package/dist/sse/events/file-events.js +10 -0
- package/dist/sse/events/hitl-events.d.ts +33 -0
- package/dist/sse/events/hitl-events.js +10 -0
- package/dist/sse/events/index.d.ts +107 -0
- package/dist/sse/events/index.js +96 -0
- package/dist/sse/events/plan-events.d.ts +38 -0
- package/dist/sse/events/plan-events.js +11 -0
- package/dist/sse/events/reasoning-events.d.ts +35 -0
- package/dist/sse/events/reasoning-events.js +13 -0
- package/dist/sse/events/response-events.d.ts +25 -0
- package/dist/sse/events/response-events.js +12 -0
- package/dist/sse/events/session-events.d.ts +43 -0
- package/dist/sse/events/session-events.js +12 -0
- package/dist/sse/events/skill-events.d.ts +48 -0
- package/dist/sse/events/skill-events.js +11 -0
- package/dist/sse/events/stats-events.d.ts +44 -0
- package/dist/sse/events/stats-events.js +12 -0
- package/dist/sse/events/tool-events.d.ts +68 -0
- package/dist/sse/events/tool-events.js +14 -0
- package/dist/sse/index.d.ts +8 -0
- package/dist/sse/index.js +8 -0
- package/dist/sse/sse-connection-manager.d.ts +116 -0
- package/dist/sse/sse-connection-manager.js +185 -0
- package/dist/sse/sse-emitter.d.ts +108 -0
- package/dist/sse/sse-emitter.js +210 -0
- package/dist/sse/sse-heartbeat.d.ts +58 -0
- package/dist/sse/sse-heartbeat.js +76 -0
- package/dist/sse/trace-collector.d.ts +60 -0
- package/dist/sse/trace-collector.js +107 -0
- package/dist/task/contracts/index.d.ts +2 -0
- package/dist/task/contracts/index.js +1 -0
- package/dist/task/contracts/task-manager.contract.d.ts +160 -0
- package/dist/task/contracts/task-manager.contract.js +10 -0
- package/dist/task/index.d.ts +7 -0
- package/dist/task/index.js +5 -0
- package/dist/task/pg-task.repository.d.ts +47 -0
- package/dist/task/pg-task.repository.js +131 -0
- package/dist/task/task-progress-tracker.d.ts +67 -0
- package/dist/task/task-progress-tracker.js +80 -0
- package/dist/task/task-timeout.d.ts +70 -0
- package/dist/task/task-timeout.js +116 -0
- package/dist/task/task.service.d.ts +84 -0
- package/dist/task/task.service.js +233 -0
- package/dist/token/compression-budget-integration.d.ts +145 -0
- package/dist/token/compression-budget-integration.js +185 -0
- package/dist/token/context-window-budget.d.ts +113 -0
- package/dist/token/context-window-budget.js +134 -0
- package/dist/token/contracts/index.d.ts +1 -0
- package/dist/token/contracts/index.js +1 -0
- package/dist/token/contracts/token-budget.contract.d.ts +77 -0
- package/dist/token/contracts/token-budget.contract.js +11 -0
- package/dist/token/index.d.ts +12 -0
- package/dist/token/index.js +10 -0
- package/dist/token/pg-token-budget.repository.d.ts +39 -0
- package/dist/token/pg-token-budget.repository.js +116 -0
- package/dist/token/session-budget-checker.d.ts +54 -0
- package/dist/token/session-budget-checker.js +72 -0
- package/dist/token/token-budget-guard.d.ts +66 -0
- package/dist/token/token-budget-guard.js +97 -0
- package/dist/token/token-budget.service.d.ts +86 -0
- package/dist/token/token-budget.service.js +130 -0
- package/dist/token/token-detail-mode.d.ts +73 -0
- package/dist/token/token-detail-mode.js +107 -0
- package/dist/token/token-estimator.d.ts +80 -0
- package/dist/token/token-estimator.js +134 -0
- package/dist/token/token-stats.service.d.ts +88 -0
- package/dist/token/token-stats.service.js +94 -0
- package/dist/tool/create-tool-executor.d.ts +33 -0
- package/dist/tool/create-tool-executor.js +60 -0
- package/dist/tool/dev-http-executor.d.ts +18 -0
- package/dist/tool/dev-http-executor.js +96 -0
- package/dist/tool/dev-mcp-executor.d.ts +29 -0
- package/dist/tool/dev-mcp-executor.js +84 -0
- package/dist/tool/dev-tool-executor.d.ts +23 -0
- package/dist/tool/dev-tool-executor.js +55 -0
- package/dist/tool/file-artifact.d.ts +11 -0
- package/dist/tool/file-artifact.js +90 -0
- package/dist/tool/http-tool-executor.d.ts +17 -0
- package/dist/tool/http-tool-executor.js +158 -0
- package/dist/tool/index.d.ts +18 -0
- package/dist/tool/index.js +17 -0
- package/dist/tool/loaded-tool-definition.d.ts +35 -0
- package/dist/tool/loaded-tool-definition.js +9 -0
- package/dist/tool/local-mcp-client.d.ts +23 -0
- package/dist/tool/local-mcp-client.js +225 -0
- package/dist/tool/local-tool-executor.d.ts +37 -0
- package/dist/tool/local-tool-executor.js +249 -0
- package/dist/tool/mcp-tool-executor.d.ts +23 -0
- package/dist/tool/mcp-tool-executor.js +160 -0
- package/dist/tool/mock-tool-executor.d.ts +28 -0
- package/dist/tool/mock-tool-executor.js +65 -0
- package/dist/tool/system-prompt-builder.d.ts +114 -0
- package/dist/tool/system-prompt-builder.js +213 -0
- package/dist/tool/tool-confirmation.d.ts +29 -0
- package/dist/tool/tool-confirmation.js +81 -0
- package/dist/tool/tool-event-emitter.d.ts +58 -0
- package/dist/tool/tool-event-emitter.js +154 -0
- package/dist/tool/tool-execution-router.d.ts +25 -0
- package/dist/tool/tool-execution-router.js +50 -0
- package/dist/tool/tool-executor.interface.d.ts +85 -0
- package/dist/tool/tool-executor.interface.js +7 -0
- package/dist/tool/tool-orchestrator.d.ts +22 -0
- package/dist/tool/tool-orchestrator.js +104 -0
- package/dist/tool/tool-result-injector.d.ts +64 -0
- package/dist/tool/tool-result-injector.js +65 -0
- package/dist/utils/format-error.d.ts +4 -0
- package/dist/utils/format-error.js +4 -0
- package/dist/utils/http-error.d.ts +11 -0
- package/dist/utils/http-error.js +24 -0
- package/package.json +56 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HybridCheckpointSaver — 混合 Checkpoint 存储策略
|
|
3
|
+
*
|
|
4
|
+
* 实现定期全量 + 增量的混合存储策略:
|
|
5
|
+
* - 每 N 次 checkpoint 存一次全量快照
|
|
6
|
+
* - 其余存增量(state_diff + message_ids)
|
|
7
|
+
* - 恢复时从最近全量快照 + 后续增量重建
|
|
8
|
+
*
|
|
9
|
+
* @see design.md §7.6 Checkpoint 策略
|
|
10
|
+
* @see checkpoint/contracts/checkpoint-saver.contract.ts
|
|
11
|
+
*/
|
|
12
|
+
import type { ICheckpointSaver } from './contracts/checkpoint-saver.contract.js';
|
|
13
|
+
import type { CheckpointData } from '../graph/contracts/executable-graph.js';
|
|
14
|
+
/**
|
|
15
|
+
* Checkpoint 类型
|
|
16
|
+
*/
|
|
17
|
+
export type CheckpointType = 'full' | 'incremental';
|
|
18
|
+
/**
|
|
19
|
+
* 增量 Checkpoint 数据
|
|
20
|
+
*/
|
|
21
|
+
export interface IncrementalCheckpointData {
|
|
22
|
+
/** Checkpoint ID */
|
|
23
|
+
checkpointId: string;
|
|
24
|
+
/** 线程 ID */
|
|
25
|
+
threadId: string;
|
|
26
|
+
/** Checkpoint 类型 */
|
|
27
|
+
type: CheckpointType;
|
|
28
|
+
/** 状态差异(仅增量) */
|
|
29
|
+
stateDiff?: Record<string, unknown>;
|
|
30
|
+
/** 消息 ID 列表(仅增量) */
|
|
31
|
+
messageIds?: string[];
|
|
32
|
+
/** 完整状态(仅全量) */
|
|
33
|
+
fullState?: Record<string, unknown>;
|
|
34
|
+
/** 元数据 */
|
|
35
|
+
metadata: {
|
|
36
|
+
/** 父 Checkpoint ID */
|
|
37
|
+
parentCheckpointId?: string;
|
|
38
|
+
/** 当前节点 ID */
|
|
39
|
+
currentNodeId: string;
|
|
40
|
+
/** 历史路径 */
|
|
41
|
+
historyPath: string[];
|
|
42
|
+
/** 创建时间 */
|
|
43
|
+
createdAt: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 混合存储配置
|
|
48
|
+
*/
|
|
49
|
+
export interface HybridCheckpointConfig {
|
|
50
|
+
/** 全量快照频率(每 N 次 checkpoint) */
|
|
51
|
+
fullSnapshotFrequency: number;
|
|
52
|
+
/** 是否启用压缩(state_diff 最小化) */
|
|
53
|
+
enableCompression: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 默认配置
|
|
57
|
+
*/
|
|
58
|
+
export declare const DEFAULT_HYBRID_CONFIG: HybridCheckpointConfig;
|
|
59
|
+
/**
|
|
60
|
+
* HybridCheckpointSaver — 混合 Checkpoint 存储
|
|
61
|
+
*
|
|
62
|
+
* 组合全量和增量存储,优化存储空间和恢复速度。
|
|
63
|
+
*/
|
|
64
|
+
export declare class HybridCheckpointSaver implements ICheckpointSaver {
|
|
65
|
+
private readonly db;
|
|
66
|
+
private readonly config;
|
|
67
|
+
private checkpointCount;
|
|
68
|
+
private lastFullCheckpointId;
|
|
69
|
+
constructor(db: ICheckpointSaver, config?: Partial<HybridCheckpointConfig>);
|
|
70
|
+
/**
|
|
71
|
+
* 保存 Checkpoint(自动判断全量/增量)
|
|
72
|
+
*/
|
|
73
|
+
save(threadId: string, data: CheckpointData): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* 加载最新 Checkpoint
|
|
76
|
+
*/
|
|
77
|
+
load(threadId: string): Promise<CheckpointData | null>;
|
|
78
|
+
/**
|
|
79
|
+
* 按 Checkpoint ID 加载
|
|
80
|
+
*/
|
|
81
|
+
loadByCheckpointId(checkpointId: string): Promise<CheckpointData | null>;
|
|
82
|
+
/**
|
|
83
|
+
* 列出所有 Checkpoint
|
|
84
|
+
*/
|
|
85
|
+
list(threadId: string): Promise<CheckpointData[]>;
|
|
86
|
+
/**
|
|
87
|
+
* 重建完整状态(从全量快照 + 增量)
|
|
88
|
+
*
|
|
89
|
+
* @param threadId - 线程 ID
|
|
90
|
+
* @param targetCheckpointId - 目标 Checkpoint ID
|
|
91
|
+
* @returns 重建的 Checkpoint 数据
|
|
92
|
+
*/
|
|
93
|
+
rebuild(threadId: string, targetCheckpointId: string): Promise<CheckpointData | null>;
|
|
94
|
+
/**
|
|
95
|
+
* 获取配置
|
|
96
|
+
*/
|
|
97
|
+
getConfig(): HybridCheckpointConfig;
|
|
98
|
+
/**
|
|
99
|
+
* 获取 Checkpoint 计数
|
|
100
|
+
*/
|
|
101
|
+
getCheckpointCount(): number;
|
|
102
|
+
/**
|
|
103
|
+
* 保存全量快照
|
|
104
|
+
*/
|
|
105
|
+
private saveFull;
|
|
106
|
+
/**
|
|
107
|
+
* 保存增量快照
|
|
108
|
+
*/
|
|
109
|
+
private saveIncremental;
|
|
110
|
+
/**
|
|
111
|
+
* 获取最新的 Checkpoint
|
|
112
|
+
*/
|
|
113
|
+
private getLatestCheckpoint;
|
|
114
|
+
/**
|
|
115
|
+
* 计算状态差异(简单实现)
|
|
116
|
+
*
|
|
117
|
+
* 实际应用中可能需要使用 deep-diff 库或自定义 diff 算法。
|
|
118
|
+
*/
|
|
119
|
+
private calculateDiff;
|
|
120
|
+
/**
|
|
121
|
+
* 合并状态(简单实现)
|
|
122
|
+
*
|
|
123
|
+
* 实际应用中可能需要使用 deepmerge 库。
|
|
124
|
+
*/
|
|
125
|
+
private mergeState;
|
|
126
|
+
/**
|
|
127
|
+
* Fork: 从指定 Checkpoint 创建新的执行线程
|
|
128
|
+
*/
|
|
129
|
+
fork(sourceCheckpointId: string, newThreadId: string, overrides?: Record<string, unknown>): Promise<import('../graph/contracts/executable-graph.js').CheckpointData>;
|
|
130
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HybridCheckpointSaver — 混合 Checkpoint 存储策略
|
|
3
|
+
*
|
|
4
|
+
* 实现定期全量 + 增量的混合存储策略:
|
|
5
|
+
* - 每 N 次 checkpoint 存一次全量快照
|
|
6
|
+
* - 其余存增量(state_diff + message_ids)
|
|
7
|
+
* - 恢复时从最近全量快照 + 后续增量重建
|
|
8
|
+
*
|
|
9
|
+
* @see design.md §7.6 Checkpoint 策略
|
|
10
|
+
* @see checkpoint/contracts/checkpoint-saver.contract.ts
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* 默认配置
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_HYBRID_CONFIG = {
|
|
16
|
+
fullSnapshotFrequency: 10,
|
|
17
|
+
enableCompression: true,
|
|
18
|
+
};
|
|
19
|
+
// ─────────────────────────────────────────────
|
|
20
|
+
// HybridCheckpointSaver
|
|
21
|
+
// ─────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* HybridCheckpointSaver — 混合 Checkpoint 存储
|
|
24
|
+
*
|
|
25
|
+
* 组合全量和增量存储,优化存储空间和恢复速度。
|
|
26
|
+
*/
|
|
27
|
+
export class HybridCheckpointSaver {
|
|
28
|
+
db;
|
|
29
|
+
config;
|
|
30
|
+
checkpointCount = 0;
|
|
31
|
+
lastFullCheckpointId = null;
|
|
32
|
+
constructor(db, config) {
|
|
33
|
+
this.db = db;
|
|
34
|
+
this.config = { ...DEFAULT_HYBRID_CONFIG, ...config };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 保存 Checkpoint(自动判断全量/增量)
|
|
38
|
+
*/
|
|
39
|
+
async save(threadId, data) {
|
|
40
|
+
this.checkpointCount++;
|
|
41
|
+
// 判断是否需要全量快照
|
|
42
|
+
const isFullSnapshot = this.checkpointCount % this.config.fullSnapshotFrequency === 0
|
|
43
|
+
|| this.lastFullCheckpointId === null;
|
|
44
|
+
if (isFullSnapshot) {
|
|
45
|
+
// 全量快照
|
|
46
|
+
await this.saveFull(threadId, data);
|
|
47
|
+
this.lastFullCheckpointId = data.checkpointId;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// 增量快照
|
|
51
|
+
await this.saveIncremental(threadId, data);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 加载最新 Checkpoint
|
|
56
|
+
*/
|
|
57
|
+
async load(threadId) {
|
|
58
|
+
return this.db.load(threadId);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 按 Checkpoint ID 加载
|
|
62
|
+
*/
|
|
63
|
+
async loadByCheckpointId(checkpointId) {
|
|
64
|
+
return this.db.loadByCheckpointId(checkpointId);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 列出所有 Checkpoint
|
|
68
|
+
*/
|
|
69
|
+
async list(threadId) {
|
|
70
|
+
return this.db.list(threadId);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 重建完整状态(从全量快照 + 增量)
|
|
74
|
+
*
|
|
75
|
+
* @param threadId - 线程 ID
|
|
76
|
+
* @param targetCheckpointId - 目标 Checkpoint ID
|
|
77
|
+
* @returns 重建的 Checkpoint 数据
|
|
78
|
+
*/
|
|
79
|
+
async rebuild(threadId, targetCheckpointId) {
|
|
80
|
+
// 获取所有 Checkpoint
|
|
81
|
+
const checkpoints = await this.db.list(threadId);
|
|
82
|
+
if (checkpoints.length === 0) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
// 找到目标 Checkpoint
|
|
86
|
+
const targetIndex = checkpoints.findIndex((cp) => cp.checkpointId === targetCheckpointId);
|
|
87
|
+
if (targetIndex === -1) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
// 向前找到最近的全量快照
|
|
91
|
+
let fullSnapshotIndex = targetIndex;
|
|
92
|
+
while (fullSnapshotIndex >= 0) {
|
|
93
|
+
const cp = checkpoints[fullSnapshotIndex];
|
|
94
|
+
// 全量快照有完整的 state
|
|
95
|
+
if (cp.state && Object.keys(cp.state).length > 0) {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
fullSnapshotIndex--;
|
|
99
|
+
}
|
|
100
|
+
if (fullSnapshotIndex < 0) {
|
|
101
|
+
// 没有找到全量快照,返回目标 Checkpoint(可能是全量的)
|
|
102
|
+
return checkpoints[targetIndex];
|
|
103
|
+
}
|
|
104
|
+
// 从全量快照开始重建
|
|
105
|
+
const fullSnapshot = checkpoints[fullSnapshotIndex];
|
|
106
|
+
let currentState = { ...fullSnapshot.state };
|
|
107
|
+
// 应用后续的增量更新
|
|
108
|
+
for (let i = fullSnapshotIndex + 1; i <= targetIndex; i++) {
|
|
109
|
+
const incremental = checkpoints[i];
|
|
110
|
+
// 合并增量状态(简单合并,实际可能需要更复杂的 diff/patch 逻辑)
|
|
111
|
+
currentState = this.mergeState(currentState, incremental.state);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
...checkpoints[targetIndex],
|
|
115
|
+
state: currentState,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 获取配置
|
|
120
|
+
*/
|
|
121
|
+
getConfig() {
|
|
122
|
+
return { ...this.config };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 获取 Checkpoint 计数
|
|
126
|
+
*/
|
|
127
|
+
getCheckpointCount() {
|
|
128
|
+
return this.checkpointCount;
|
|
129
|
+
}
|
|
130
|
+
// ─────────────────────────────────────────────
|
|
131
|
+
// Private
|
|
132
|
+
// ─────────────────────────────────────────────
|
|
133
|
+
/**
|
|
134
|
+
* 保存全量快照
|
|
135
|
+
*/
|
|
136
|
+
async saveFull(threadId, data) {
|
|
137
|
+
// 全量快照直接保存
|
|
138
|
+
await this.db.save(threadId, data);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 保存增量快照
|
|
142
|
+
*/
|
|
143
|
+
async saveIncremental(threadId, data) {
|
|
144
|
+
// 获取上一个 Checkpoint 的状态
|
|
145
|
+
const previousCheckpoint = await this.getLatestCheckpoint(threadId);
|
|
146
|
+
// 计算 state diff(简单实现:只保存变化的部分)
|
|
147
|
+
const stateDiff = previousCheckpoint
|
|
148
|
+
? this.calculateDiff(previousCheckpoint.state, data.state)
|
|
149
|
+
: data.state;
|
|
150
|
+
// 保存增量(使用原始接口,但标记为增量)
|
|
151
|
+
const incrementalData = {
|
|
152
|
+
...data,
|
|
153
|
+
state: stateDiff,
|
|
154
|
+
};
|
|
155
|
+
await this.db.save(threadId, incrementalData);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 获取最新的 Checkpoint
|
|
159
|
+
*/
|
|
160
|
+
async getLatestCheckpoint(threadId) {
|
|
161
|
+
const checkpoints = await this.db.list(threadId);
|
|
162
|
+
return checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : null;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 计算状态差异(简单实现)
|
|
166
|
+
*
|
|
167
|
+
* 实际应用中可能需要使用 deep-diff 库或自定义 diff 算法。
|
|
168
|
+
*/
|
|
169
|
+
calculateDiff(previous, current) {
|
|
170
|
+
const diff = {};
|
|
171
|
+
for (const key of Object.keys(current)) {
|
|
172
|
+
if (JSON.stringify(previous[key]) !== JSON.stringify(current[key])) {
|
|
173
|
+
diff[key] = current[key];
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return diff;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 合并状态(简单实现)
|
|
180
|
+
*
|
|
181
|
+
* 实际应用中可能需要使用 deepmerge 库。
|
|
182
|
+
*/
|
|
183
|
+
mergeState(base, overlay) {
|
|
184
|
+
return { ...base, ...overlay };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Fork: 从指定 Checkpoint 创建新的执行线程
|
|
188
|
+
*/
|
|
189
|
+
async fork(sourceCheckpointId, newThreadId, overrides) {
|
|
190
|
+
const source = await this.loadByCheckpointId(sourceCheckpointId);
|
|
191
|
+
if (!source) {
|
|
192
|
+
throw new Error(`Source checkpoint not found: ${sourceCheckpointId}`);
|
|
193
|
+
}
|
|
194
|
+
const now = new Date().toISOString();
|
|
195
|
+
const { randomUUID } = await import('node:crypto');
|
|
196
|
+
const newData = {
|
|
197
|
+
checkpointId: randomUUID(),
|
|
198
|
+
threadId: newThreadId,
|
|
199
|
+
currentNodeId: source.currentNodeId,
|
|
200
|
+
historyPath: source.historyPath,
|
|
201
|
+
state: overrides ? { ...source.state, ...overrides } : source.state,
|
|
202
|
+
createdBy: 'fork',
|
|
203
|
+
createdAt: now,
|
|
204
|
+
updatedBy: 'fork',
|
|
205
|
+
updatedAt: now,
|
|
206
|
+
isDeleted: false,
|
|
207
|
+
};
|
|
208
|
+
await this.save(newThreadId, newData);
|
|
209
|
+
return newData;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InMemoryCheckpointSaver — 测试用内存 Checkpoint 存储
|
|
3
|
+
*/
|
|
4
|
+
import type { ICheckpointSaver } from './contracts/checkpoint-saver.contract.js';
|
|
5
|
+
import type { CheckpointData } from '../graph/contracts/executable-graph.js';
|
|
6
|
+
export declare class InMemoryCheckpointSaver implements ICheckpointSaver {
|
|
7
|
+
private readonly byThread;
|
|
8
|
+
private readonly byId;
|
|
9
|
+
save(threadId: string, data: CheckpointData): Promise<void>;
|
|
10
|
+
load(threadId: string): Promise<CheckpointData | null>;
|
|
11
|
+
loadByCheckpointId(checkpointId: string): Promise<CheckpointData | null>;
|
|
12
|
+
list(threadId: string): Promise<CheckpointData[]>;
|
|
13
|
+
fork(checkpointId: string, newThreadId: string): Promise<CheckpointData>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InMemoryCheckpointSaver — 测试用内存 Checkpoint 存储
|
|
3
|
+
*/
|
|
4
|
+
export class InMemoryCheckpointSaver {
|
|
5
|
+
byThread = new Map();
|
|
6
|
+
byId = new Map();
|
|
7
|
+
async save(threadId, data) {
|
|
8
|
+
const list = this.byThread.get(threadId) ?? [];
|
|
9
|
+
const idx = list.findIndex((c) => c.checkpointId === data.checkpointId);
|
|
10
|
+
if (idx >= 0) {
|
|
11
|
+
list[idx] = data;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
list.push(data);
|
|
15
|
+
}
|
|
16
|
+
this.byThread.set(threadId, list);
|
|
17
|
+
this.byId.set(data.checkpointId, data);
|
|
18
|
+
}
|
|
19
|
+
async load(threadId) {
|
|
20
|
+
const list = this.byThread.get(threadId);
|
|
21
|
+
if (!list || list.length === 0)
|
|
22
|
+
return null;
|
|
23
|
+
return list[list.length - 1] ?? null;
|
|
24
|
+
}
|
|
25
|
+
async loadByCheckpointId(checkpointId) {
|
|
26
|
+
return this.byId.get(checkpointId) ?? null;
|
|
27
|
+
}
|
|
28
|
+
async list(threadId) {
|
|
29
|
+
return [...(this.byThread.get(threadId) ?? [])];
|
|
30
|
+
}
|
|
31
|
+
async fork(checkpointId, newThreadId) {
|
|
32
|
+
const source = await this.loadByCheckpointId(checkpointId);
|
|
33
|
+
if (!source) {
|
|
34
|
+
throw new Error(`Checkpoint not found: ${checkpointId}`);
|
|
35
|
+
}
|
|
36
|
+
const forked = {
|
|
37
|
+
...source,
|
|
38
|
+
checkpointId: `cp-fork-${Date.now()}`,
|
|
39
|
+
threadId: newThreadId,
|
|
40
|
+
createdAt: new Date().toISOString(),
|
|
41
|
+
updatedAt: new Date().toISOString(),
|
|
42
|
+
};
|
|
43
|
+
await this.save(newThreadId, forked);
|
|
44
|
+
return forked;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from './contracts/index.js';
|
|
2
|
+
export { RedisCheckpointSaver } from './redis-checkpoint-saver.js';
|
|
3
|
+
export type { RedisCheckpointSaverOptions } from './redis-checkpoint-saver.js';
|
|
4
|
+
export { CompositeCheckpointSaver } from './composite-checkpoint-saver.js';
|
|
5
|
+
export { restoreCheckpoint } from './restore-checkpoint.js';
|
|
6
|
+
export { createCheckpointData, serializeCheckpoint, deserializeCheckpoint, } from './checkpoint-serializer.js';
|
|
7
|
+
export type { CreateCheckpointParams } from './checkpoint-serializer.js';
|
|
8
|
+
export { FileCheckpointSaver } from './file-checkpoint-saver.js';
|
|
9
|
+
export { InMemoryCheckpointSaver } from './in-memory-checkpoint-saver.js';
|
|
10
|
+
export { MongoCheckpointSaver } from './mongo-checkpoint-saver.js';
|
|
11
|
+
export type { IMongoCollection, CheckpointDocument } from './mongo-checkpoint-saver.js';
|
|
12
|
+
export { PostgresCheckpointSaver } from './pg-checkpoint-saver.js';
|
|
13
|
+
export type { IPgPool } from './pg-checkpoint-saver.js';
|
|
14
|
+
export { HybridCheckpointSaver } from './hybrid-checkpoint-saver.js';
|
|
15
|
+
export type { HybridCheckpointConfig, CheckpointType, IncrementalCheckpointData, } from './hybrid-checkpoint-saver.js';
|
|
16
|
+
export { DEFAULT_HYBRID_CONFIG } from './hybrid-checkpoint-saver.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Checkpoint — 状态快照持久化模块
|
|
2
|
+
export * from './contracts/index.js';
|
|
3
|
+
export { RedisCheckpointSaver } from './redis-checkpoint-saver.js';
|
|
4
|
+
export { CompositeCheckpointSaver } from './composite-checkpoint-saver.js';
|
|
5
|
+
export { restoreCheckpoint } from './restore-checkpoint.js';
|
|
6
|
+
export { createCheckpointData, serializeCheckpoint, deserializeCheckpoint, } from './checkpoint-serializer.js';
|
|
7
|
+
export { FileCheckpointSaver } from './file-checkpoint-saver.js';
|
|
8
|
+
export { InMemoryCheckpointSaver } from './in-memory-checkpoint-saver.js';
|
|
9
|
+
export { MongoCheckpointSaver } from './mongo-checkpoint-saver.js';
|
|
10
|
+
export { PostgresCheckpointSaver } from './pg-checkpoint-saver.js';
|
|
11
|
+
// 混合 Checkpoint 策略
|
|
12
|
+
export { HybridCheckpointSaver } from './hybrid-checkpoint-saver.js';
|
|
13
|
+
export { DEFAULT_HYBRID_CONFIG } from './hybrid-checkpoint-saver.js';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoCheckpointSaver — MongoDB 存储
|
|
3
|
+
* 适用场景:NoSQL 存储需求
|
|
4
|
+
*
|
|
5
|
+
* 使用接口抽象,不引入 mongodb 依赖。
|
|
6
|
+
*/
|
|
7
|
+
import type { ICheckpointSaver } from './contracts/checkpoint-saver.contract.js';
|
|
8
|
+
import type { CheckpointData } from '../graph/contracts/executable-graph.js';
|
|
9
|
+
/** MongoDB collection 抽象接口 */
|
|
10
|
+
export interface IMongoCollection<T> {
|
|
11
|
+
insertOne(doc: T): Promise<{
|
|
12
|
+
insertedId: unknown;
|
|
13
|
+
}>;
|
|
14
|
+
findOne(filter: Record<string, unknown>): Promise<T | null>;
|
|
15
|
+
find(filter: Record<string, unknown>): {
|
|
16
|
+
sort(s: Record<string, unknown>): {
|
|
17
|
+
toArray(): Promise<T[]>;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
deleteOne(filter: Record<string, unknown>): Promise<{
|
|
21
|
+
deletedCount: number;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export interface CheckpointDocument extends CheckpointData {
|
|
25
|
+
_id?: unknown;
|
|
26
|
+
}
|
|
27
|
+
export declare class MongoCheckpointSaver implements ICheckpointSaver {
|
|
28
|
+
private readonly collection;
|
|
29
|
+
constructor(collection: IMongoCollection<CheckpointDocument>);
|
|
30
|
+
save(threadId: string, data: CheckpointData): Promise<void>;
|
|
31
|
+
load(threadId: string): Promise<CheckpointData | null>;
|
|
32
|
+
loadByCheckpointId(checkpointId: string): Promise<CheckpointData | null>;
|
|
33
|
+
list(threadId: string): Promise<CheckpointData[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Fork: 从指定 Checkpoint 创建新的执行线程
|
|
36
|
+
*/
|
|
37
|
+
fork(sourceCheckpointId: string, newThreadId: string, overrides?: Record<string, unknown>): Promise<import('../graph/contracts/executable-graph.js').CheckpointData>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoCheckpointSaver — MongoDB 存储
|
|
3
|
+
* 适用场景:NoSQL 存储需求
|
|
4
|
+
*
|
|
5
|
+
* 使用接口抽象,不引入 mongodb 依赖。
|
|
6
|
+
*/
|
|
7
|
+
export class MongoCheckpointSaver {
|
|
8
|
+
collection;
|
|
9
|
+
constructor(collection) {
|
|
10
|
+
this.collection = collection;
|
|
11
|
+
}
|
|
12
|
+
async save(threadId, data) {
|
|
13
|
+
await this.collection.insertOne({ ...data, threadId });
|
|
14
|
+
}
|
|
15
|
+
async load(threadId) {
|
|
16
|
+
const docs = await this.collection
|
|
17
|
+
.find({ threadId })
|
|
18
|
+
.sort({ createdAt: -1 })
|
|
19
|
+
.toArray();
|
|
20
|
+
return docs[0] ?? null;
|
|
21
|
+
}
|
|
22
|
+
async loadByCheckpointId(checkpointId) {
|
|
23
|
+
return this.collection.findOne({ checkpointId });
|
|
24
|
+
}
|
|
25
|
+
async list(threadId) {
|
|
26
|
+
return this.collection
|
|
27
|
+
.find({ threadId })
|
|
28
|
+
.sort({ createdAt: 1 })
|
|
29
|
+
.toArray();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Fork: 从指定 Checkpoint 创建新的执行线程
|
|
33
|
+
*/
|
|
34
|
+
async fork(sourceCheckpointId, newThreadId, overrides) {
|
|
35
|
+
const source = await this.loadByCheckpointId(sourceCheckpointId);
|
|
36
|
+
if (!source) {
|
|
37
|
+
throw new Error(`Source checkpoint not found: ${sourceCheckpointId}`);
|
|
38
|
+
}
|
|
39
|
+
const now = new Date().toISOString();
|
|
40
|
+
const { randomUUID } = await import('node:crypto');
|
|
41
|
+
const newData = {
|
|
42
|
+
checkpointId: randomUUID(),
|
|
43
|
+
threadId: newThreadId,
|
|
44
|
+
currentNodeId: source.currentNodeId,
|
|
45
|
+
historyPath: source.historyPath,
|
|
46
|
+
state: overrides ? { ...source.state, ...overrides } : source.state,
|
|
47
|
+
createdBy: 'fork',
|
|
48
|
+
createdAt: now,
|
|
49
|
+
updatedBy: 'fork',
|
|
50
|
+
updatedAt: now,
|
|
51
|
+
isDeleted: false,
|
|
52
|
+
};
|
|
53
|
+
await this.save(newThreadId, newData);
|
|
54
|
+
return newData;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgresCheckpointSaver — PostgreSQL 存储(主存储)
|
|
3
|
+
*
|
|
4
|
+
* 使用接口抽象,不引入 pg 依赖。参数占位符用 $1/$2 替代 MySQL 的 ?。
|
|
5
|
+
* 支持审计字段和软删除。
|
|
6
|
+
*
|
|
7
|
+
* @see design.md §1.3 checkpoints 数据模型
|
|
8
|
+
* @see checkpoint-saver.contract.ts ICheckpointSaver 接口定义
|
|
9
|
+
*/
|
|
10
|
+
import type { ICheckpointSaver } from './contracts/checkpoint-saver.contract.js';
|
|
11
|
+
import type { CheckpointData } from '../graph/contracts/executable-graph.js';
|
|
12
|
+
/** pg Pool 抽象接口 */
|
|
13
|
+
export interface IPgPool {
|
|
14
|
+
query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{
|
|
15
|
+
rows: T[];
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export declare class PostgresCheckpointSaver implements ICheckpointSaver {
|
|
19
|
+
private readonly pool;
|
|
20
|
+
constructor(pool: IPgPool);
|
|
21
|
+
/**
|
|
22
|
+
* 持久化 Checkpoint(INSERT or UPDATE)
|
|
23
|
+
*/
|
|
24
|
+
save(threadId: string, data: CheckpointData): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* 加载指定 thread 的最新 Checkpoint
|
|
27
|
+
* Excludes soft-deleted records
|
|
28
|
+
*/
|
|
29
|
+
load(threadId: string): Promise<CheckpointData | null>;
|
|
30
|
+
/**
|
|
31
|
+
* 按 checkpointId 加载特定 Checkpoint
|
|
32
|
+
* Excludes soft-deleted records
|
|
33
|
+
*/
|
|
34
|
+
loadByCheckpointId(checkpointId: string): Promise<CheckpointData | null>;
|
|
35
|
+
/**
|
|
36
|
+
* 列出指定 thread 的所有 Checkpoint
|
|
37
|
+
* Excludes soft-deleted records
|
|
38
|
+
*/
|
|
39
|
+
list(threadId: string): Promise<CheckpointData[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Soft delete checkpoint
|
|
42
|
+
*/
|
|
43
|
+
softDelete(checkpointId: string, deletedBy: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Fork:从指定 Checkpoint 创建新的执行线程
|
|
46
|
+
*
|
|
47
|
+
* 用于用户调试场景,从某个 Checkpoint 恢复执行,支持修改参数后重新执行。
|
|
48
|
+
*
|
|
49
|
+
* @param sourceCheckpointId - 源 Checkpoint ID
|
|
50
|
+
* @param newThreadId - 新线程 ID
|
|
51
|
+
* @param overrides - 覆盖的参数(可选)
|
|
52
|
+
* @returns 新的 CheckpointData
|
|
53
|
+
*/
|
|
54
|
+
fork(sourceCheckpointId: string, newThreadId: string, overrides?: Record<string, unknown>): Promise<CheckpointData>;
|
|
55
|
+
/**
|
|
56
|
+
* 将 PostgreSQL 行数据转换为 CheckpointData
|
|
57
|
+
*/
|
|
58
|
+
private toCheckpointData;
|
|
59
|
+
}
|