@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.
Files changed (326) hide show
  1. package/README.md +323 -0
  2. package/dist/api/handlers/index.d.ts +3 -0
  3. package/dist/api/handlers/index.js +4 -0
  4. package/dist/api/handlers/invoke.handler.d.ts +77 -0
  5. package/dist/api/handlers/invoke.handler.js +411 -0
  6. package/dist/api/handlers/messages.handler.d.ts +53 -0
  7. package/dist/api/handlers/messages.handler.js +80 -0
  8. package/dist/api/handlers/stream.handler.d.ts +92 -0
  9. package/dist/api/handlers/stream.handler.js +432 -0
  10. package/dist/api/index.d.ts +3 -0
  11. package/dist/api/index.js +4 -0
  12. package/dist/api/middleware/auth.middleware.d.ts +96 -0
  13. package/dist/api/middleware/auth.middleware.js +158 -0
  14. package/dist/api/middleware/index.d.ts +1 -0
  15. package/dist/api/middleware/index.js +2 -0
  16. package/dist/api/routes/agent.routes.d.ts +44 -0
  17. package/dist/api/routes/agent.routes.js +204 -0
  18. package/dist/api/routes/index.d.ts +3 -0
  19. package/dist/api/routes/index.js +4 -0
  20. package/dist/api/routes/session.routes.d.ts +82 -0
  21. package/dist/api/routes/session.routes.js +169 -0
  22. package/dist/api/routes/task.routes.d.ts +75 -0
  23. package/dist/api/routes/task.routes.js +108 -0
  24. package/dist/checkpoint/checkpoint-serializer.d.ts +58 -0
  25. package/dist/checkpoint/checkpoint-serializer.js +81 -0
  26. package/dist/checkpoint/composite-checkpoint-saver.d.ts +42 -0
  27. package/dist/checkpoint/composite-checkpoint-saver.js +118 -0
  28. package/dist/checkpoint/contracts/checkpoint-saver.contract.d.ts +65 -0
  29. package/dist/checkpoint/contracts/checkpoint-saver.contract.js +12 -0
  30. package/dist/checkpoint/contracts/index.d.ts +1 -0
  31. package/dist/checkpoint/contracts/index.js +1 -0
  32. package/dist/checkpoint/file-checkpoint-saver.d.ts +19 -0
  33. package/dist/checkpoint/file-checkpoint-saver.js +98 -0
  34. package/dist/checkpoint/hybrid-checkpoint-saver.d.ts +130 -0
  35. package/dist/checkpoint/hybrid-checkpoint-saver.js +211 -0
  36. package/dist/checkpoint/in-memory-checkpoint-saver.d.ts +14 -0
  37. package/dist/checkpoint/in-memory-checkpoint-saver.js +46 -0
  38. package/dist/checkpoint/index.d.ts +16 -0
  39. package/dist/checkpoint/index.js +13 -0
  40. package/dist/checkpoint/mongo-checkpoint-saver.d.ts +38 -0
  41. package/dist/checkpoint/mongo-checkpoint-saver.js +56 -0
  42. package/dist/checkpoint/pg-checkpoint-saver.d.ts +59 -0
  43. package/dist/checkpoint/pg-checkpoint-saver.js +140 -0
  44. package/dist/checkpoint/redis-checkpoint-saver.d.ts +68 -0
  45. package/dist/checkpoint/redis-checkpoint-saver.js +173 -0
  46. package/dist/checkpoint/restore-checkpoint.d.ts +33 -0
  47. package/dist/checkpoint/restore-checkpoint.js +33 -0
  48. package/dist/common/agent-code.d.ts +10 -0
  49. package/dist/common/agent-code.js +12 -0
  50. package/dist/common/concurrency.d.ts +79 -0
  51. package/dist/common/concurrency.js +121 -0
  52. package/dist/common/health.d.ts +40 -0
  53. package/dist/common/health.js +37 -0
  54. package/dist/common/index.d.ts +5 -0
  55. package/dist/common/index.js +5 -0
  56. package/dist/common/logger.d.ts +34 -0
  57. package/dist/common/logger.js +38 -0
  58. package/dist/common/queue-consumer.d.ts +125 -0
  59. package/dist/common/queue-consumer.js +159 -0
  60. package/dist/common/trace-id.d.ts +2 -0
  61. package/dist/common/trace-id.js +8 -0
  62. package/dist/common/types.d.ts +104 -0
  63. package/dist/common/types.js +14 -0
  64. package/dist/contracts/index.d.ts +11 -0
  65. package/dist/contracts/index.js +10 -0
  66. package/dist/contracts/permission-checker.d.ts +10 -0
  67. package/dist/contracts/permission-checker.js +4 -0
  68. package/dist/contracts/trace-collector.d.ts +211 -0
  69. package/dist/contracts/trace-collector.js +13 -0
  70. package/dist/governance/governance-client.d.ts +38 -0
  71. package/dist/governance/governance-client.js +95 -0
  72. package/dist/governance/index.d.ts +7 -0
  73. package/dist/governance/index.js +5 -0
  74. package/dist/governance/permission-guard.d.ts +19 -0
  75. package/dist/governance/permission-guard.js +59 -0
  76. package/dist/graph/adapters/index.d.ts +3 -0
  77. package/dist/graph/adapters/index.js +3 -0
  78. package/dist/graph/adapters/langgraph-checkpointer.d.ts +40 -0
  79. package/dist/graph/adapters/langgraph-checkpointer.js +211 -0
  80. package/dist/graph/adapters/langgraph.adapter.d.ts +190 -0
  81. package/dist/graph/adapters/langgraph.adapter.js +1303 -0
  82. package/dist/graph/adapters/subgraph-compiler.d.ts +39 -0
  83. package/dist/graph/adapters/subgraph-compiler.js +248 -0
  84. package/dist/graph/condition-evaluator.d.ts +57 -0
  85. package/dist/graph/condition-evaluator.js +162 -0
  86. package/dist/graph/contracts/executable-graph.d.ts +340 -0
  87. package/dist/graph/contracts/executable-graph.js +10 -0
  88. package/dist/graph/contracts/index.d.ts +2 -0
  89. package/dist/graph/contracts/index.js +2 -0
  90. package/dist/graph/contracts/state-graph.contract.d.ts +76 -0
  91. package/dist/graph/contracts/state-graph.contract.js +11 -0
  92. package/dist/graph/hitl/hitl-handler.d.ts +199 -0
  93. package/dist/graph/hitl/hitl-handler.js +480 -0
  94. package/dist/graph/hitl/index.d.ts +1 -0
  95. package/dist/graph/hitl/index.js +1 -0
  96. package/dist/graph/index.d.ts +7 -0
  97. package/dist/graph/index.js +7 -0
  98. package/dist/graph/nodes/index.d.ts +2 -0
  99. package/dist/graph/nodes/index.js +2 -0
  100. package/dist/graph/nodes/llm-node.d.ts +182 -0
  101. package/dist/graph/nodes/llm-node.js +281 -0
  102. package/dist/graph/nodes/skill-bind-node.d.ts +32 -0
  103. package/dist/graph/nodes/skill-bind-node.js +116 -0
  104. package/dist/graph/nodes/tool-node.d.ts +75 -0
  105. package/dist/graph/nodes/tool-node.js +324 -0
  106. package/dist/graph/resolve-graph-prompt.d.ts +5 -0
  107. package/dist/graph/resolve-graph-prompt.js +75 -0
  108. package/dist/graph/retry/budget-aware-retry.d.ts +91 -0
  109. package/dist/graph/retry/budget-aware-retry.js +126 -0
  110. package/dist/graph/retry/index.d.ts +9 -0
  111. package/dist/graph/retry/index.js +8 -0
  112. package/dist/graph/retry/node-retry.d.ts +123 -0
  113. package/dist/graph/retry/node-retry.js +235 -0
  114. package/dist/graph/skill-audit-recorder.d.ts +126 -0
  115. package/dist/graph/skill-audit-recorder.js +114 -0
  116. package/dist/index.d.ts +21 -0
  117. package/dist/index.js +32 -0
  118. package/dist/memory/compression/compression-stats.d.ts +109 -0
  119. package/dist/memory/compression/compression-stats.js +144 -0
  120. package/dist/memory/compression/compression.repository.d.ts +62 -0
  121. package/dist/memory/compression/compression.repository.js +71 -0
  122. package/dist/memory/compression/index.d.ts +10 -0
  123. package/dist/memory/compression/index.js +15 -0
  124. package/dist/memory/compression/llm-summarize.d.ts +58 -0
  125. package/dist/memory/compression/llm-summarize.js +192 -0
  126. package/dist/memory/compression/sliding-window.compression.d.ts +60 -0
  127. package/dist/memory/compression/sliding-window.compression.js +175 -0
  128. package/dist/memory/index.d.ts +4 -0
  129. package/dist/memory/index.js +7 -0
  130. package/dist/memory/long-term-memory.service.d.ts +94 -0
  131. package/dist/memory/long-term-memory.service.js +120 -0
  132. package/dist/memory/message-compression.service.d.ts +128 -0
  133. package/dist/memory/message-compression.service.js +69 -0
  134. package/dist/memory/pg-memory.repository.d.ts +44 -0
  135. package/dist/memory/pg-memory.repository.js +108 -0
  136. package/dist/memory/semantic-retrieval.service.d.ts +148 -0
  137. package/dist/memory/semantic-retrieval.service.js +238 -0
  138. package/dist/providers/echo-llm-provider.d.ts +10 -0
  139. package/dist/providers/echo-llm-provider.js +87 -0
  140. package/dist/providers/http-llm-provider.d.ts +35 -0
  141. package/dist/providers/http-llm-provider.js +404 -0
  142. package/dist/providers/index.d.ts +7 -0
  143. package/dist/providers/index.js +5 -0
  144. package/dist/providers/local-llm-provider.d.ts +27 -0
  145. package/dist/providers/local-llm-provider.js +105 -0
  146. package/dist/providers/resolve-llm-model.d.ts +13 -0
  147. package/dist/providers/resolve-llm-model.js +30 -0
  148. package/dist/providers/routing-llm-provider.d.ts +28 -0
  149. package/dist/providers/routing-llm-provider.js +79 -0
  150. package/dist/registry/agent-models.d.ts +1 -0
  151. package/dist/registry/agent-models.js +1 -0
  152. package/dist/registry/agent-registry-client.d.ts +56 -0
  153. package/dist/registry/agent-registry-client.js +36 -0
  154. package/dist/registry/definition-cache.d.ts +37 -0
  155. package/dist/registry/definition-cache.js +82 -0
  156. package/dist/registry/deployment-snapshot.d.ts +99 -0
  157. package/dist/registry/deployment-snapshot.js +542 -0
  158. package/dist/registry/graph-loader.d.ts +134 -0
  159. package/dist/registry/graph-loader.js +985 -0
  160. package/dist/registry/index.d.ts +9 -0
  161. package/dist/registry/index.js +9 -0
  162. package/dist/registry/preload-errors.d.ts +13 -0
  163. package/dist/registry/preload-errors.js +35 -0
  164. package/dist/registry/preload-flags.d.ts +22 -0
  165. package/dist/registry/preload-flags.js +44 -0
  166. package/dist/registry/skill-io-guard.d.ts +25 -0
  167. package/dist/registry/skill-io-guard.js +98 -0
  168. package/dist/registry/skill-tree.d.ts +27 -0
  169. package/dist/registry/skill-tree.js +183 -0
  170. package/dist/runtime/agent-runtime.d.ts +106 -0
  171. package/dist/runtime/agent-runtime.js +777 -0
  172. package/dist/runtime/dev-runtime.d.ts +69 -0
  173. package/dist/runtime/dev-runtime.js +199 -0
  174. package/dist/runtime/index.d.ts +4 -0
  175. package/dist/runtime/index.js +3 -0
  176. package/dist/runtime/storage-profile.d.ts +50 -0
  177. package/dist/runtime/storage-profile.js +138 -0
  178. package/dist/runtime/types.d.ts +120 -0
  179. package/dist/runtime/types.js +9 -0
  180. package/dist/server.d.ts +12 -0
  181. package/dist/server.js +161 -0
  182. package/dist/session/compression-middleware.d.ts +126 -0
  183. package/dist/session/compression-middleware.js +230 -0
  184. package/dist/session/file-message.repository.d.ts +25 -0
  185. package/dist/session/file-message.repository.js +78 -0
  186. package/dist/session/file-session.repository.d.ts +72 -0
  187. package/dist/session/file-session.repository.js +212 -0
  188. package/dist/session/index.d.ts +13 -0
  189. package/dist/session/index.js +12 -0
  190. package/dist/session/message.service.d.ts +80 -0
  191. package/dist/session/message.service.js +128 -0
  192. package/dist/session/persist-turn-messages.d.ts +145 -0
  193. package/dist/session/persist-turn-messages.js +325 -0
  194. package/dist/session/pg-message.repository.d.ts +49 -0
  195. package/dist/session/pg-message.repository.js +149 -0
  196. package/dist/session/pg-session.repository.d.ts +46 -0
  197. package/dist/session/pg-session.repository.js +117 -0
  198. package/dist/session/session-context.service.d.ts +49 -0
  199. package/dist/session/session-context.service.js +66 -0
  200. package/dist/session/session.service.d.ts +194 -0
  201. package/dist/session/session.service.js +166 -0
  202. package/dist/sse/connection-event-logger.d.ts +21 -0
  203. package/dist/sse/connection-event-logger.js +33 -0
  204. package/dist/sse/contracts/index.d.ts +1 -0
  205. package/dist/sse/contracts/index.js +1 -0
  206. package/dist/sse/contracts/sse-emitter.contract.d.ts +74 -0
  207. package/dist/sse/contracts/sse-emitter.contract.js +11 -0
  208. package/dist/sse/event-buffer.d.ts +20 -0
  209. package/dist/sse/event-buffer.js +45 -0
  210. package/dist/sse/events/code-events.d.ts +19 -0
  211. package/dist/sse/events/code-events.js +9 -0
  212. package/dist/sse/events/collaboration-events.d.ts +37 -0
  213. package/dist/sse/events/collaboration-events.js +11 -0
  214. package/dist/sse/events/connection-events.d.ts +13 -0
  215. package/dist/sse/events/connection-events.js +9 -0
  216. package/dist/sse/events/file-events.d.ts +29 -0
  217. package/dist/sse/events/file-events.js +10 -0
  218. package/dist/sse/events/hitl-events.d.ts +33 -0
  219. package/dist/sse/events/hitl-events.js +10 -0
  220. package/dist/sse/events/index.d.ts +107 -0
  221. package/dist/sse/events/index.js +96 -0
  222. package/dist/sse/events/plan-events.d.ts +38 -0
  223. package/dist/sse/events/plan-events.js +11 -0
  224. package/dist/sse/events/reasoning-events.d.ts +35 -0
  225. package/dist/sse/events/reasoning-events.js +13 -0
  226. package/dist/sse/events/response-events.d.ts +25 -0
  227. package/dist/sse/events/response-events.js +12 -0
  228. package/dist/sse/events/session-events.d.ts +43 -0
  229. package/dist/sse/events/session-events.js +12 -0
  230. package/dist/sse/events/skill-events.d.ts +48 -0
  231. package/dist/sse/events/skill-events.js +11 -0
  232. package/dist/sse/events/stats-events.d.ts +44 -0
  233. package/dist/sse/events/stats-events.js +12 -0
  234. package/dist/sse/events/tool-events.d.ts +68 -0
  235. package/dist/sse/events/tool-events.js +14 -0
  236. package/dist/sse/index.d.ts +8 -0
  237. package/dist/sse/index.js +8 -0
  238. package/dist/sse/sse-connection-manager.d.ts +116 -0
  239. package/dist/sse/sse-connection-manager.js +185 -0
  240. package/dist/sse/sse-emitter.d.ts +108 -0
  241. package/dist/sse/sse-emitter.js +210 -0
  242. package/dist/sse/sse-heartbeat.d.ts +58 -0
  243. package/dist/sse/sse-heartbeat.js +76 -0
  244. package/dist/sse/trace-collector.d.ts +60 -0
  245. package/dist/sse/trace-collector.js +107 -0
  246. package/dist/task/contracts/index.d.ts +2 -0
  247. package/dist/task/contracts/index.js +1 -0
  248. package/dist/task/contracts/task-manager.contract.d.ts +160 -0
  249. package/dist/task/contracts/task-manager.contract.js +10 -0
  250. package/dist/task/index.d.ts +7 -0
  251. package/dist/task/index.js +5 -0
  252. package/dist/task/pg-task.repository.d.ts +47 -0
  253. package/dist/task/pg-task.repository.js +131 -0
  254. package/dist/task/task-progress-tracker.d.ts +67 -0
  255. package/dist/task/task-progress-tracker.js +80 -0
  256. package/dist/task/task-timeout.d.ts +70 -0
  257. package/dist/task/task-timeout.js +116 -0
  258. package/dist/task/task.service.d.ts +84 -0
  259. package/dist/task/task.service.js +233 -0
  260. package/dist/token/compression-budget-integration.d.ts +145 -0
  261. package/dist/token/compression-budget-integration.js +185 -0
  262. package/dist/token/context-window-budget.d.ts +113 -0
  263. package/dist/token/context-window-budget.js +134 -0
  264. package/dist/token/contracts/index.d.ts +1 -0
  265. package/dist/token/contracts/index.js +1 -0
  266. package/dist/token/contracts/token-budget.contract.d.ts +77 -0
  267. package/dist/token/contracts/token-budget.contract.js +11 -0
  268. package/dist/token/index.d.ts +12 -0
  269. package/dist/token/index.js +10 -0
  270. package/dist/token/pg-token-budget.repository.d.ts +39 -0
  271. package/dist/token/pg-token-budget.repository.js +116 -0
  272. package/dist/token/session-budget-checker.d.ts +54 -0
  273. package/dist/token/session-budget-checker.js +72 -0
  274. package/dist/token/token-budget-guard.d.ts +66 -0
  275. package/dist/token/token-budget-guard.js +97 -0
  276. package/dist/token/token-budget.service.d.ts +86 -0
  277. package/dist/token/token-budget.service.js +130 -0
  278. package/dist/token/token-detail-mode.d.ts +73 -0
  279. package/dist/token/token-detail-mode.js +107 -0
  280. package/dist/token/token-estimator.d.ts +80 -0
  281. package/dist/token/token-estimator.js +134 -0
  282. package/dist/token/token-stats.service.d.ts +88 -0
  283. package/dist/token/token-stats.service.js +94 -0
  284. package/dist/tool/create-tool-executor.d.ts +33 -0
  285. package/dist/tool/create-tool-executor.js +60 -0
  286. package/dist/tool/dev-http-executor.d.ts +18 -0
  287. package/dist/tool/dev-http-executor.js +96 -0
  288. package/dist/tool/dev-mcp-executor.d.ts +29 -0
  289. package/dist/tool/dev-mcp-executor.js +84 -0
  290. package/dist/tool/dev-tool-executor.d.ts +23 -0
  291. package/dist/tool/dev-tool-executor.js +55 -0
  292. package/dist/tool/file-artifact.d.ts +11 -0
  293. package/dist/tool/file-artifact.js +90 -0
  294. package/dist/tool/http-tool-executor.d.ts +17 -0
  295. package/dist/tool/http-tool-executor.js +158 -0
  296. package/dist/tool/index.d.ts +18 -0
  297. package/dist/tool/index.js +17 -0
  298. package/dist/tool/loaded-tool-definition.d.ts +35 -0
  299. package/dist/tool/loaded-tool-definition.js +9 -0
  300. package/dist/tool/local-mcp-client.d.ts +23 -0
  301. package/dist/tool/local-mcp-client.js +225 -0
  302. package/dist/tool/local-tool-executor.d.ts +37 -0
  303. package/dist/tool/local-tool-executor.js +249 -0
  304. package/dist/tool/mcp-tool-executor.d.ts +23 -0
  305. package/dist/tool/mcp-tool-executor.js +160 -0
  306. package/dist/tool/mock-tool-executor.d.ts +28 -0
  307. package/dist/tool/mock-tool-executor.js +65 -0
  308. package/dist/tool/system-prompt-builder.d.ts +114 -0
  309. package/dist/tool/system-prompt-builder.js +213 -0
  310. package/dist/tool/tool-confirmation.d.ts +29 -0
  311. package/dist/tool/tool-confirmation.js +81 -0
  312. package/dist/tool/tool-event-emitter.d.ts +58 -0
  313. package/dist/tool/tool-event-emitter.js +154 -0
  314. package/dist/tool/tool-execution-router.d.ts +25 -0
  315. package/dist/tool/tool-execution-router.js +50 -0
  316. package/dist/tool/tool-executor.interface.d.ts +85 -0
  317. package/dist/tool/tool-executor.interface.js +7 -0
  318. package/dist/tool/tool-orchestrator.d.ts +22 -0
  319. package/dist/tool/tool-orchestrator.js +104 -0
  320. package/dist/tool/tool-result-injector.d.ts +64 -0
  321. package/dist/tool/tool-result-injector.js +65 -0
  322. package/dist/utils/format-error.d.ts +4 -0
  323. package/dist/utils/format-error.js +4 -0
  324. package/dist/utils/http-error.d.ts +11 -0
  325. package/dist/utils/http-error.js +24 -0
  326. 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
+ }