@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,212 @@
1
+ /**
2
+ * FileSessionRepository — Session 持久化文件存储实现
3
+ *
4
+ * 基于本地 JSON 文件实现 ISessionRepository 接口。
5
+ * 适用于生产环境中的会话信息存储,支持审计字段和软删除。
6
+ *
7
+ * 文件结构:
8
+ * - 每个 Session 存储为独立的 JSON 文件
9
+ * - 文件路径:{baseDir}/{sessionId}.json
10
+ * - 支持索引文件用于快速查询
11
+ *
12
+ * @see design.md §1.3 数据模型 — sessions 表
13
+ * @see session.service.ts ISessionRepository 接口定义
14
+ */
15
+ import { join } from 'node:path';
16
+ import { readFile, writeFile, mkdir, access } from 'node:fs/promises';
17
+ // ─────────────────────────────────────────────
18
+ // FileSessionRepository
19
+ // ─────────────────────────────────────────────
20
+ export class FileSessionRepository {
21
+ baseDir;
22
+ enableIndex;
23
+ fileExtension;
24
+ indexFile;
25
+ constructor(options) {
26
+ this.baseDir = options.baseDir;
27
+ this.enableIndex = options.enableIndex ?? true;
28
+ this.fileExtension = options.fileExtension ?? '.json';
29
+ this.indexFile = join(this.baseDir, '_index.json');
30
+ }
31
+ /**
32
+ * 保存 Session 到 JSON 文件
33
+ */
34
+ async save(session) {
35
+ const filePath = this.getFilePath(session.id);
36
+ const content = JSON.stringify(session, null, 2);
37
+ // 确保目录存在
38
+ await this.ensureDir(this.baseDir);
39
+ // 写入文件
40
+ await writeFile(filePath, content, 'utf-8');
41
+ // 更新索引
42
+ if (this.enableIndex) {
43
+ await this.updateIndex(session);
44
+ }
45
+ }
46
+ /**
47
+ * 从 JSON 文件加载 Session
48
+ * Excludes soft-deleted records
49
+ */
50
+ async findById(id) {
51
+ const filePath = this.getFilePath(id);
52
+ try {
53
+ // 检查文件是否存在
54
+ await access(filePath);
55
+ // 读取文件
56
+ const content = await readFile(filePath, 'utf-8');
57
+ const session = JSON.parse(content);
58
+ // 检查是否已软删除
59
+ if (session.isDeleted) {
60
+ return null;
61
+ }
62
+ return session;
63
+ }
64
+ catch (error) {
65
+ // 文件不存在或解析错误
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * 更新 Session 文件
71
+ */
72
+ async update(session) {
73
+ const filePath = this.getFilePath(session.id);
74
+ // 检查文件是否存在
75
+ try {
76
+ await access(filePath);
77
+ }
78
+ catch {
79
+ throw new Error(`Session file not found: ${session.id}`);
80
+ }
81
+ // 更新文件
82
+ const content = JSON.stringify(session, null, 2);
83
+ await writeFile(filePath, content, 'utf-8');
84
+ // 更新索引
85
+ if (this.enableIndex) {
86
+ await this.updateIndex(session);
87
+ }
88
+ }
89
+ /**
90
+ * 软删除 Session
91
+ */
92
+ async softDelete(id, deletedBy) {
93
+ const session = await this.findById(id);
94
+ if (!session) {
95
+ throw new Error(`Session not found: ${id}`);
96
+ }
97
+ session.isDeleted = true;
98
+ session.deletedBy = deletedBy;
99
+ session.deletedAt = new Date().toISOString();
100
+ session.updatedBy = deletedBy;
101
+ session.updatedAt = new Date().toISOString();
102
+ await this.update(session);
103
+ }
104
+ /**
105
+ * 列出所有 Session(从索引文件)
106
+ * Excludes soft-deleted records
107
+ */
108
+ async listAll() {
109
+ if (!this.enableIndex) {
110
+ throw new Error('Index is disabled. Use findById for individual queries.');
111
+ }
112
+ try {
113
+ // 检查索引文件是否存在
114
+ await access(this.indexFile);
115
+ // 读取索引文件
116
+ const content = await readFile(this.indexFile, 'utf-8');
117
+ const index = JSON.parse(content);
118
+ // 加载完整的 Session 记录
119
+ const sessions = [];
120
+ for (const entry of index) {
121
+ const session = await this.findById(entry.id);
122
+ if (session) {
123
+ sessions.push(session);
124
+ }
125
+ }
126
+ return sessions;
127
+ }
128
+ catch (error) {
129
+ return [];
130
+ }
131
+ }
132
+ /**
133
+ * 按 userId 查询 Session
134
+ * Excludes soft-deleted records
135
+ */
136
+ async findByUserId(userId) {
137
+ if (!this.enableIndex) {
138
+ throw new Error('Index is disabled. Use findById for individual queries.');
139
+ }
140
+ try {
141
+ // 检查索引文件是否存在
142
+ await access(this.indexFile);
143
+ // 读取索引文件
144
+ const content = await readFile(this.indexFile, 'utf-8');
145
+ const index = JSON.parse(content);
146
+ // 过滤指定用户的 Session
147
+ const userEntries = index.filter(entry => entry.userId === userId);
148
+ // 加载完整的 Session 记录
149
+ const sessions = [];
150
+ for (const entry of userEntries) {
151
+ const session = await this.findById(entry.id);
152
+ if (session) {
153
+ sessions.push(session);
154
+ }
155
+ }
156
+ return sessions;
157
+ }
158
+ catch (error) {
159
+ return [];
160
+ }
161
+ }
162
+ // ─────────────────────────────────────────────
163
+ // Private Helpers
164
+ // ─────────────────────────────────────────────
165
+ /**
166
+ * 获取 Session 文件路径
167
+ */
168
+ getFilePath(sessionId) {
169
+ return join(this.baseDir, `${sessionId}${this.fileExtension}`);
170
+ }
171
+ /**
172
+ * 确保目录存在
173
+ */
174
+ async ensureDir(dir) {
175
+ await mkdir(dir, { recursive: true });
176
+ }
177
+ /**
178
+ * 更新索引文件
179
+ */
180
+ async updateIndex(session) {
181
+ let index = [];
182
+ try {
183
+ // 检查索引文件是否存在
184
+ await access(this.indexFile);
185
+ // 读取索引文件
186
+ const content = await readFile(this.indexFile, 'utf-8');
187
+ index = JSON.parse(content);
188
+ }
189
+ catch (error) {
190
+ // 索引文件不存在或解析错误,使用空数组
191
+ }
192
+ // 查找并更新或添加条目
193
+ const existingIndex = index.findIndex(entry => entry.id === session.id);
194
+ const entry = {
195
+ id: session.id,
196
+ userId: session.userId,
197
+ agentId: session.agentId,
198
+ status: session.status,
199
+ createdAt: session.createdAt,
200
+ updatedAt: session.updatedAt,
201
+ };
202
+ if (existingIndex >= 0) {
203
+ index[existingIndex] = entry;
204
+ }
205
+ else {
206
+ index.push(entry);
207
+ }
208
+ // 写入索引文件
209
+ const content = JSON.stringify(index, null, 2);
210
+ await writeFile(this.indexFile, content, 'utf-8');
211
+ }
212
+ }
@@ -0,0 +1,13 @@
1
+ export { SessionService, InMemorySessionRepository, InMemoryMessageRepository, } from './session.service.js';
2
+ export type { SessionRecord, CreateSessionParams, LoadHistoryOptions, MessageRecord, ISessionRepository, IMessageRepository, } from './session.service.js';
3
+ export { PostgresSessionRepository } from './pg-session.repository.js';
4
+ export { FileSessionRepository } from './file-session.repository.js';
5
+ export { MessageService, InMemoryFullMessageRepository, } from './message.service.js';
6
+ export type { AddMessageParams, PaginationOptions, IFullMessageRepository, } from './message.service.js';
7
+ export { PostgresMessageRepository } from './pg-message.repository.js';
8
+ export { FileMessageRepository } from './file-message.repository.js';
9
+ export type { FileMessageRepositoryOptions } from './file-message.repository.js';
10
+ export { SessionContextService } from './session-context.service.js';
11
+ export type { ResolveSessionParams, SessionContext, } from './session-context.service.js';
12
+ export { CompressionMiddleware, createCompressionMiddleware } from './compression-middleware.js';
13
+ export type { CompressionMiddlewareConfig } from './compression-middleware.js';
@@ -0,0 +1,12 @@
1
+ // Session Module — 会话管理
2
+ export { SessionService, InMemorySessionRepository, InMemoryMessageRepository, } from './session.service.js';
3
+ export { PostgresSessionRepository } from './pg-session.repository.js';
4
+ export { FileSessionRepository } from './file-session.repository.js';
5
+ // Message Module — 消息管理
6
+ export { MessageService, InMemoryFullMessageRepository, } from './message.service.js';
7
+ export { PostgresMessageRepository } from './pg-message.repository.js';
8
+ export { FileMessageRepository } from './file-message.repository.js';
9
+ // Session Context — 会话上下文解析
10
+ export { SessionContextService } from './session-context.service.js';
11
+ // 压缩中间件
12
+ export { CompressionMiddleware, createCompressionMiddleware } from './compression-middleware.js';
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Message Service — 消息持久化服务
3
+ *
4
+ * 提供消息的 CRUD 操作,支持分页查询。
5
+ */
6
+ import type { MessageRecord } from './session.service.js';
7
+ export type { MessageRecord };
8
+ export interface AddMessageParams {
9
+ sessionId: string;
10
+ taskId?: string;
11
+ correlationId?: string;
12
+ role: 'system' | 'user' | 'assistant' | 'tool';
13
+ content: string;
14
+ toolCalls?: unknown[];
15
+ tokenCount: number;
16
+ reasoning?: unknown | null;
17
+ durationMs?: number | null;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ export interface PaginationOptions {
21
+ limit?: number;
22
+ offset?: number;
23
+ }
24
+ /**
25
+ * IFullMessageRepository — 完整的 Message 持久化接口
26
+ *
27
+ * 扩展 IMessageRepository,增加 save 和 findByTaskId 方法。
28
+ * MessageService 通过此接口访问存储层。
29
+ */
30
+ export interface IFullMessageRepository {
31
+ /** 按 sessionId 查询消息 */
32
+ findBySessionId(sessionId: string, limit?: number, offset?: number): Promise<MessageRecord[]>;
33
+ /** 保存单条消息 */
34
+ save(message: MessageRecord): Promise<void>;
35
+ /** 批量保存消息 */
36
+ saveMany(messages: MessageRecord[]): Promise<void>;
37
+ /** 标记消息为已压缩 */
38
+ markAsCompressed(messageIds: string[], compressedBy: string, compressedAt: string): Promise<void>;
39
+ /** 按 taskId 查询关联消息 */
40
+ findByTaskId(taskId: string): Promise<MessageRecord[]>;
41
+ }
42
+ /**
43
+ * InMemoryFullMessageRepository — 内存完整 Message 存储
44
+ *
45
+ * 实现 IFullMessageRepository,用于开发/测试阶段。
46
+ */
47
+ export declare class InMemoryFullMessageRepository implements IFullMessageRepository {
48
+ private readonly store;
49
+ save(message: MessageRecord): Promise<void>;
50
+ saveMany(messages: MessageRecord[]): Promise<void>;
51
+ markAsCompressed(messageIds: string[], compressedBy: string, compressedAt: string): Promise<void>;
52
+ findBySessionId(sessionId: string, limit?: number, offset?: number): Promise<MessageRecord[]>;
53
+ findByTaskId(taskId: string): Promise<MessageRecord[]>;
54
+ }
55
+ export declare class MessageService {
56
+ private readonly repository;
57
+ constructor(repository?: IFullMessageRepository);
58
+ /**
59
+ * 添加消息到 Session
60
+ *
61
+ * 生成唯一 ID 和时间戳,持久化后返回完整 MessageRecord。
62
+ */
63
+ addMessage(params: AddMessageParams): Promise<MessageRecord>;
64
+ /**
65
+ * 批量添加消息
66
+ */
67
+ addMessages(params: AddMessageParams[]): Promise<MessageRecord[]>;
68
+ /**
69
+ * 获取 Session 的消息列表(按 createdAt 排序,支持分页)
70
+ */
71
+ getMessages(sessionId: string, options?: PaginationOptions): Promise<MessageRecord[]>;
72
+ /**
73
+ * 获取与指定 Task 关联的所有消息
74
+ */
75
+ getMessagesByTask(taskId: string): Promise<MessageRecord[]>;
76
+ /**
77
+ * 标记消息为已压缩
78
+ */
79
+ markAsCompressed(messageIds: string[], compressedBy: string): Promise<void>;
80
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Message Service — 消息持久化服务
3
+ *
4
+ * 提供消息的 CRUD 操作,支持分页查询。
5
+ */
6
+ import { randomUUID } from 'crypto';
7
+ // ─────────────────────────────────────────────
8
+ // In-Memory Full Message Repository
9
+ // ─────────────────────────────────────────────
10
+ /**
11
+ * InMemoryFullMessageRepository — 内存完整 Message 存储
12
+ *
13
+ * 实现 IFullMessageRepository,用于开发/测试阶段。
14
+ */
15
+ export class InMemoryFullMessageRepository {
16
+ store = [];
17
+ async save(message) {
18
+ this.store.push({ ...message });
19
+ }
20
+ async saveMany(messages) {
21
+ for (const message of messages) {
22
+ this.store.push({ ...message });
23
+ }
24
+ }
25
+ async markAsCompressed(messageIds, compressedBy, compressedAt) {
26
+ for (const message of this.store) {
27
+ if (messageIds.includes(message.id)) {
28
+ message.updatedBy = compressedBy;
29
+ message.updatedAt = compressedAt;
30
+ }
31
+ }
32
+ }
33
+ async findBySessionId(sessionId, limit, offset) {
34
+ const filtered = this.store
35
+ .filter((m) => m.sessionId === sessionId && !m.isDeleted)
36
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
37
+ const start = offset ?? 0;
38
+ const end = limit !== undefined ? start + limit : undefined;
39
+ return filtered.slice(start, end);
40
+ }
41
+ async findByTaskId(taskId) {
42
+ return this.store
43
+ .filter((m) => m.taskId === taskId && !m.isDeleted)
44
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
45
+ }
46
+ }
47
+ // ─────────────────────────────────────────────
48
+ // MessageService Implementation
49
+ // ─────────────────────────────────────────────
50
+ export class MessageService {
51
+ repository;
52
+ constructor(repository) {
53
+ this.repository = repository ?? new InMemoryFullMessageRepository();
54
+ }
55
+ /**
56
+ * 添加消息到 Session
57
+ *
58
+ * 生成唯一 ID 和时间戳,持久化后返回完整 MessageRecord。
59
+ */
60
+ async addMessage(params) {
61
+ const now = new Date().toISOString();
62
+ const message = {
63
+ id: randomUUID(),
64
+ sessionId: params.sessionId,
65
+ taskId: params.taskId ?? null,
66
+ correlationId: params.correlationId ?? null,
67
+ role: params.role,
68
+ content: params.content,
69
+ toolCalls: params.toolCalls ?? null,
70
+ tokenCount: params.tokenCount,
71
+ reasoning: params.reasoning ?? null,
72
+ durationMs: params.durationMs ?? null,
73
+ metadata: params.metadata ?? {},
74
+ createdBy: 'system',
75
+ createdAt: now,
76
+ updatedBy: 'system',
77
+ updatedAt: now,
78
+ isDeleted: false,
79
+ };
80
+ await this.repository.save(message);
81
+ return message;
82
+ }
83
+ /**
84
+ * 批量添加消息
85
+ */
86
+ async addMessages(params) {
87
+ const now = new Date().toISOString();
88
+ const messages = params.map((p) => ({
89
+ id: randomUUID(),
90
+ sessionId: p.sessionId,
91
+ taskId: p.taskId ?? null,
92
+ correlationId: p.correlationId ?? null,
93
+ role: p.role,
94
+ content: p.content,
95
+ toolCalls: p.toolCalls ?? null,
96
+ tokenCount: p.tokenCount,
97
+ reasoning: p.reasoning ?? null,
98
+ durationMs: p.durationMs ?? null,
99
+ metadata: p.metadata ?? {},
100
+ createdBy: 'system',
101
+ createdAt: now,
102
+ updatedBy: 'system',
103
+ updatedAt: now,
104
+ isDeleted: false,
105
+ }));
106
+ await this.repository.saveMany(messages);
107
+ return messages;
108
+ }
109
+ /**
110
+ * 获取 Session 的消息列表(按 createdAt 排序,支持分页)
111
+ */
112
+ async getMessages(sessionId, options) {
113
+ return this.repository.findBySessionId(sessionId, options?.limit, options?.offset);
114
+ }
115
+ /**
116
+ * 获取与指定 Task 关联的所有消息
117
+ */
118
+ async getMessagesByTask(taskId) {
119
+ return this.repository.findByTaskId(taskId);
120
+ }
121
+ /**
122
+ * 标记消息为已压缩
123
+ */
124
+ async markAsCompressed(messageIds, compressedBy) {
125
+ const now = new Date().toISOString();
126
+ await this.repository.markAsCompressed(messageIds, compressedBy, now);
127
+ }
128
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * 多轮对话 Message 写回辅助
3
+ *
4
+ * invoke / stream 主路径在执行前后调用,保证 Session 短期记忆可被下一轮加载。
5
+ */
6
+ import type { MessageService } from './message.service.js';
7
+ import type { MessageRecord } from './session.service.js';
8
+ import type { GraphMessage } from '../graph/contracts/executable-graph.js';
9
+ export declare function persistUserTurnMessage(messageService: MessageService | undefined, params: {
10
+ sessionId: string;
11
+ taskId: string;
12
+ correlationId?: string;
13
+ content: string;
14
+ }): Promise<void>;
15
+ export declare function persistAssistantTurnMessage(messageService: MessageService | undefined, params: {
16
+ sessionId: string;
17
+ taskId: string;
18
+ correlationId?: string;
19
+ content: string;
20
+ tokenCount?: number;
21
+ toolCalls?: unknown[];
22
+ /** DeepSeek thinking:多轮回传用 */
23
+ reasoningContent?: string;
24
+ }): Promise<void>;
25
+ /**
26
+ * HITL 等待态占位消息:避免早退时本轮只有 user、历史偏薄
27
+ *
28
+ * 以 assistant 写入确认问题;metadata.hitlWaiting=true 供后续过滤/展示。
29
+ */
30
+ export declare function persistHitlWaitingPlaceholder(messageService: MessageService | undefined, params: {
31
+ sessionId: string;
32
+ taskId: string;
33
+ correlationId?: string;
34
+ question: string;
35
+ options: string[];
36
+ threadId: string;
37
+ }): Promise<void>;
38
+ export declare function persistToolTurnMessage(messageService: MessageService | undefined, params: {
39
+ sessionId: string;
40
+ taskId: string;
41
+ correlationId?: string;
42
+ toolCallId: string;
43
+ toolName: string;
44
+ content: unknown;
45
+ success: boolean;
46
+ }): Promise<void>;
47
+ /** 从流式 RuntimeEvent payload 抽取文本增量 */
48
+ export declare function extractStreamTextDelta(eventType: string, payload: unknown): string;
49
+ /**
50
+ * 从流式事件抽取 assistant reasoning。
51
+ * 子图在 skill.completed 上回传(父图不再为 subgraph 节点发空 response.chunk)。
52
+ */
53
+ export declare function extractStreamReasoning(eventType: string, payload: unknown): string | undefined;
54
+ /** 历史 MessageRecord → GraphMessage(保留 tool 元数据与 reasoning) */
55
+ export declare function messageRecordsToGraphMessages(records: MessageRecord[]): GraphMessage[];
56
+ /**
57
+ * 组装本轮送入 Graph 的 messages。
58
+ *
59
+ * 契约:
60
+ * - Session 消息是产品侧短期记忆(展示/落库)
61
+ * - Session 级 Checkpoint 持有图内 messages(含 reasoning)
62
+ * - 当 Checkpoint 已有历史时,只追加本轮 user,避免双重 append
63
+ * - Checkpoint 缺失/无 messages 时,回退 Session 全量历史
64
+ */
65
+ export declare function buildTurnGraphMessages(params: {
66
+ history: GraphMessage[];
67
+ input: string;
68
+ checkpointSaver?: {
69
+ load(threadId: string): Promise<{
70
+ state?: {
71
+ messages?: unknown;
72
+ };
73
+ engineSnapshot?: Record<string, unknown>;
74
+ } | null>;
75
+ } | null;
76
+ /** 与 LangGraph configurable.thread_id 一致(通常为 sessionId) */
77
+ threadId?: string;
78
+ }): Promise<GraphMessage[]>;
79
+ /**
80
+ * HITL 等待态写入 Task.output 的结构化载荷。
81
+ * 冷恢复时优先读 `hitlThreadId`,避免误用 correlationId。
82
+ */
83
+ export interface HitlWaitingTaskOutput {
84
+ hitlWaiting: true;
85
+ hitlThreadId: string;
86
+ question: string;
87
+ options: string[];
88
+ }
89
+ export declare function buildHitlWaitingTaskOutput(params: {
90
+ threadId: string;
91
+ question: string;
92
+ options: string[];
93
+ }): HitlWaitingTaskOutput;
94
+ /** 从 Task.output 解析 Checkpoint thread_id(含嵌套 hitl.threadId) */
95
+ export declare function extractHitlThreadId(output: unknown): string | undefined;
96
+ /**
97
+ * Checkpoint thread_id 契约:HITL/多轮优先且应唯一等于 sessionId;
98
+ * 无 session 时退到 `task-${taskId}`。勿用 correlationId 作为 Checkpoint key。
99
+ *
100
+ * 注意:session 级 thread + 全量 Session 历史同时注入会导致 messages 双重 append。
101
+ * 组装本轮 Graph 输入请用 {@link buildTurnGraphMessages}(有 Checkpoint 历史则只追加 user)。
102
+ */
103
+ export declare function resolveCheckpointThreadId(params: {
104
+ sessionId?: string;
105
+ taskId?: string;
106
+ graphId?: string;
107
+ }): string;
108
+ export type StreamToolCall = {
109
+ id: string;
110
+ name: string;
111
+ arguments: Record<string, unknown>;
112
+ };
113
+ export type StreamToolResult = {
114
+ toolCallId: string;
115
+ toolName: string;
116
+ content: unknown;
117
+ success: boolean;
118
+ };
119
+ /**
120
+ * 将 stream 侧累加的 tool 事件规范为与 invoke GraphState 增量同序的 messages:
121
+ * assistant(tool_calls) → tool* → assistant(text)
122
+ */
123
+ export declare function buildTurnTranscriptFromStreamEvents(params: {
124
+ pendingToolCalls?: StreamToolCall[];
125
+ toolResults?: StreamToolResult[];
126
+ assistantText?: string;
127
+ /** 带 tool_calls 的那条 assistant 的 reasoning(thinking 回传) */
128
+ toolCallReasoningContent?: string;
129
+ /** 最终文本 assistant 的 reasoning */
130
+ assistantReasoningContent?: string;
131
+ /** 无 tool、也无文本时是否仍写一条空 assistant(默认否) */
132
+ persistEmptyAssistant?: boolean;
133
+ }): GraphMessage[];
134
+ /**
135
+ * 统一落库本轮 transcript(invoke / stream / AgentRuntime.stream 共用)
136
+ */
137
+ export declare function persistTurnTranscript(messageService: MessageService | undefined, params: {
138
+ sessionId: string;
139
+ taskId: string;
140
+ correlationId?: string;
141
+ messages: GraphMessage[];
142
+ /** 无 assistant 文本消息时的兜底(invoke 的 graphResult.output) */
143
+ fallbackAssistantContent?: string;
144
+ assistantTokenCount?: number;
145
+ }): Promise<void>;