@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,109 @@
1
+ /**
2
+ * CompressionStats — 压缩统计服务
3
+ *
4
+ * 收集和报告压缩相关的指标:
5
+ * - 压缩次数
6
+ * - 压缩率(Token 减少比例)
7
+ * - 压缩耗时
8
+ * - 策略使用分布
9
+ *
10
+ * @see message-compression.service.ts 压缩接口
11
+ */
12
+ import type { CompressionStrategy, CompressionRecord } from '../message-compression.service.js';
13
+ /**
14
+ * 压缩统计指标
15
+ */
16
+ export interface CompressionMetrics {
17
+ /** 总压缩次数 */
18
+ totalCompressions: number;
19
+ /** 总原始 Token 数 */
20
+ totalOriginalTokens: number;
21
+ /** 总压缩后 Token 数 */
22
+ totalCompressedTokens: number;
23
+ /** 平均压缩率(0-1,越小越好) */
24
+ averageCompressionRatio: number;
25
+ /** 平均压缩耗时(毫秒) */
26
+ averageDurationMs: number;
27
+ /** 策略使用分布 */
28
+ strategyDistribution: Record<CompressionStrategy, number>;
29
+ /** 最近 N 次压缩的详细记录 */
30
+ recentCompressions: CompressionRecord[];
31
+ }
32
+ /**
33
+ * 单次压缩统计
34
+ */
35
+ export interface CompressionStatEntry {
36
+ /** 会话 ID */
37
+ sessionId: string;
38
+ /** 任务 ID */
39
+ taskId: string | null;
40
+ /** 原始消息数 */
41
+ originalMessageCount: number;
42
+ /** 压缩后消息数 */
43
+ compressedMessageCount: number;
44
+ /** 原始 Token 数 */
45
+ originalTokens: number;
46
+ /** 压缩后 Token 数 */
47
+ compressedTokens: number;
48
+ /** 压缩率 */
49
+ compressionRatio: number;
50
+ /** 使用的策略 */
51
+ strategy: CompressionStrategy;
52
+ /** 压缩耗时(毫秒) */
53
+ durationMs: number;
54
+ /** 时间戳 */
55
+ timestamp: string;
56
+ }
57
+ /**
58
+ * CompressionStatsService — 压缩统计服务
59
+ */
60
+ export declare class CompressionStatsService {
61
+ private readonly entries;
62
+ private readonly maxEntries;
63
+ constructor(maxEntries?: number);
64
+ /**
65
+ * 记录一次压缩
66
+ *
67
+ * @param entry - 压缩统计条目
68
+ */
69
+ record(entry: CompressionStatEntry): void;
70
+ /**
71
+ * 获取压缩指标
72
+ *
73
+ * @param sessionId - 可选,按会话过滤
74
+ * @returns 压缩指标
75
+ */
76
+ getMetrics(sessionId?: string): CompressionMetrics;
77
+ /**
78
+ * 获取所有条目(调试用)
79
+ */
80
+ getEntries(): CompressionStatEntry[];
81
+ /**
82
+ * 清空统计
83
+ */
84
+ clear(): void;
85
+ /**
86
+ * 导出统计报告
87
+ */
88
+ exportReport(): string;
89
+ }
90
+ /**
91
+ * 全局压缩统计服务实例
92
+ */
93
+ export declare const globalCompressionStats: CompressionStatsService;
94
+ /**
95
+ * 创建压缩统计条目
96
+ *
97
+ * @param params - 参数
98
+ * @returns 压缩统计条目
99
+ */
100
+ export declare function createCompressionStatEntry(params: {
101
+ sessionId: string;
102
+ taskId?: string;
103
+ originalMessageCount: number;
104
+ compressedMessageCount: number;
105
+ originalTokens: number;
106
+ compressedTokens: number;
107
+ strategy: CompressionStrategy;
108
+ durationMs: number;
109
+ }): CompressionStatEntry;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * CompressionStats — 压缩统计服务
3
+ *
4
+ * 收集和报告压缩相关的指标:
5
+ * - 压缩次数
6
+ * - 压缩率(Token 减少比例)
7
+ * - 压缩耗时
8
+ * - 策略使用分布
9
+ *
10
+ * @see message-compression.service.ts 压缩接口
11
+ */
12
+ // ─────────────────────────────────────────────
13
+ // CompressionStatsService
14
+ // ─────────────────────────────────────────────
15
+ /**
16
+ * CompressionStatsService — 压缩统计服务
17
+ */
18
+ export class CompressionStatsService {
19
+ entries = [];
20
+ maxEntries;
21
+ constructor(maxEntries = 1000) {
22
+ this.maxEntries = maxEntries;
23
+ }
24
+ /**
25
+ * 记录一次压缩
26
+ *
27
+ * @param entry - 压缩统计条目
28
+ */
29
+ record(entry) {
30
+ this.entries.push(entry);
31
+ // 限制记录数量
32
+ if (this.entries.length > this.maxEntries) {
33
+ this.entries.shift();
34
+ }
35
+ }
36
+ /**
37
+ * 获取压缩指标
38
+ *
39
+ * @param sessionId - 可选,按会话过滤
40
+ * @returns 压缩指标
41
+ */
42
+ getMetrics(sessionId) {
43
+ const filtered = sessionId
44
+ ? this.entries.filter((e) => e.sessionId === sessionId)
45
+ : this.entries;
46
+ if (filtered.length === 0) {
47
+ return {
48
+ totalCompressions: 0,
49
+ totalOriginalTokens: 0,
50
+ totalCompressedTokens: 0,
51
+ averageCompressionRatio: 0,
52
+ averageDurationMs: 0,
53
+ strategyDistribution: {},
54
+ recentCompressions: [],
55
+ };
56
+ }
57
+ // 计算总和
58
+ const totalOriginalTokens = filtered.reduce((sum, e) => sum + e.originalTokens, 0);
59
+ const totalCompressedTokens = filtered.reduce((sum, e) => sum + e.compressedTokens, 0);
60
+ const totalDuration = filtered.reduce((sum, e) => sum + e.durationMs, 0);
61
+ // 计算策略分布
62
+ const strategyDistribution = {};
63
+ for (const entry of filtered) {
64
+ strategyDistribution[entry.strategy] = (strategyDistribution[entry.strategy] || 0) + 1;
65
+ }
66
+ // 获取最近 10 次压缩记录
67
+ const recentCompressions = filtered
68
+ .slice(-10)
69
+ .map((e) => ({
70
+ sessionId: e.sessionId,
71
+ taskId: e.taskId,
72
+ originalMessageCount: e.originalMessageCount,
73
+ compressedMessageCount: e.compressedMessageCount,
74
+ originalTokens: e.originalTokens,
75
+ compressedTokens: e.compressedTokens,
76
+ strategy: e.strategy,
77
+ summaryContent: '',
78
+ createdBy: 'system',
79
+ createdAt: e.timestamp,
80
+ }));
81
+ return {
82
+ totalCompressions: filtered.length,
83
+ totalOriginalTokens,
84
+ totalCompressedTokens,
85
+ averageCompressionRatio: totalOriginalTokens > 0
86
+ ? totalCompressedTokens / totalOriginalTokens
87
+ : 0,
88
+ averageDurationMs: totalDuration / filtered.length,
89
+ strategyDistribution: strategyDistribution,
90
+ recentCompressions,
91
+ };
92
+ }
93
+ /**
94
+ * 获取所有条目(调试用)
95
+ */
96
+ getEntries() {
97
+ return [...this.entries];
98
+ }
99
+ /**
100
+ * 清空统计
101
+ */
102
+ clear() {
103
+ this.entries.length = 0;
104
+ }
105
+ /**
106
+ * 导出统计报告
107
+ */
108
+ exportReport() {
109
+ const metrics = this.getMetrics();
110
+ return JSON.stringify(metrics, null, 2);
111
+ }
112
+ }
113
+ // ─────────────────────────────────────────────
114
+ // 全局实例
115
+ // ─────────────────────────────────────────────
116
+ /**
117
+ * 全局压缩统计服务实例
118
+ */
119
+ export const globalCompressionStats = new CompressionStatsService();
120
+ // ─────────────────────────────────────────────
121
+ // 工具函数
122
+ // ─────────────────────────────────────────────
123
+ /**
124
+ * 创建压缩统计条目
125
+ *
126
+ * @param params - 参数
127
+ * @returns 压缩统计条目
128
+ */
129
+ export function createCompressionStatEntry(params) {
130
+ return {
131
+ sessionId: params.sessionId,
132
+ taskId: params.taskId ?? null,
133
+ originalMessageCount: params.originalMessageCount,
134
+ compressedMessageCount: params.compressedMessageCount,
135
+ originalTokens: params.originalTokens,
136
+ compressedTokens: params.compressedTokens,
137
+ compressionRatio: params.originalTokens > 0
138
+ ? params.compressedTokens / params.originalTokens
139
+ : 0,
140
+ strategy: params.strategy,
141
+ durationMs: params.durationMs,
142
+ timestamp: new Date().toISOString(),
143
+ };
144
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * 压缩审计记录 Repository
3
+ *
4
+ * 记录消息压缩的审计信息,用于追踪压缩历史。
5
+ *
6
+ * @see message-compression.service.ts CompressionRecord 类型定义
7
+ */
8
+ import type { CompressionRecord } from '../message-compression.service.js';
9
+ /** pg Pool 抽象接口 */
10
+ export interface IPgPool {
11
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{
12
+ rows: T[];
13
+ }>;
14
+ }
15
+ /**
16
+ * CREATE TABLE compression_records (
17
+ * id VARCHAR(36) PRIMARY KEY,
18
+ * session_id VARCHAR(36) NOT NULL,
19
+ * task_id VARCHAR(36) NULL,
20
+ * original_message_count INT NOT NULL,
21
+ * compressed_message_count INT NOT NULL,
22
+ * original_tokens INT NOT NULL,
23
+ * compressed_tokens INT NOT NULL,
24
+ * strategy VARCHAR(20) NOT NULL,
25
+ * summary_content TEXT NOT NULL,
26
+ * created_by VARCHAR(36) NOT NULL DEFAULT 'system',
27
+ * created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
28
+ * INDEX idx_compression_session (session_id),
29
+ * INDEX idx_compression_task (task_id)
30
+ * );
31
+ */
32
+ /**
33
+ * ICompressionRepository — 压缩记录持久化接口
34
+ */
35
+ export interface ICompressionRepository {
36
+ /**
37
+ * 保存压缩记录
38
+ */
39
+ save(record: CompressionRecord): Promise<void>;
40
+ /**
41
+ * 按 sessionId 查询压缩记录
42
+ */
43
+ findBySessionId(sessionId: string): Promise<CompressionRecord[]>;
44
+ }
45
+ /**
46
+ * PostgresCompressionRepository — PostgreSQL 实现
47
+ */
48
+ export declare class PostgresCompressionRepository implements ICompressionRepository {
49
+ private readonly pool;
50
+ constructor(pool: IPgPool);
51
+ save(record: CompressionRecord): Promise<void>;
52
+ findBySessionId(sessionId: string): Promise<CompressionRecord[]>;
53
+ private rowToRecord;
54
+ }
55
+ /**
56
+ * InMemoryCompressionRepository — 内存实现(测试用)
57
+ */
58
+ export declare class InMemoryCompressionRepository implements ICompressionRepository {
59
+ private readonly store;
60
+ save(record: CompressionRecord): Promise<void>;
61
+ findBySessionId(sessionId: string): Promise<CompressionRecord[]>;
62
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * 压缩审计记录 Repository
3
+ *
4
+ * 记录消息压缩的审计信息,用于追踪压缩历史。
5
+ *
6
+ * @see message-compression.service.ts CompressionRecord 类型定义
7
+ */
8
+ /**
9
+ * PostgresCompressionRepository — PostgreSQL 实现
10
+ */
11
+ export class PostgresCompressionRepository {
12
+ pool;
13
+ constructor(pool) {
14
+ this.pool = pool;
15
+ }
16
+ async save(record) {
17
+ const { randomUUID } = await import('node:crypto');
18
+ const id = randomUUID();
19
+ const sql = `
20
+ INSERT INTO compression_records (id, session_id, task_id, original_message_count, compressed_message_count, original_tokens, compressed_tokens, strategy, summary_content, created_by, created_at)
21
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
22
+ `;
23
+ await this.pool.query(sql, [
24
+ id,
25
+ record.sessionId,
26
+ record.taskId,
27
+ record.originalMessageCount,
28
+ record.compressedMessageCount,
29
+ record.originalTokens,
30
+ record.compressedTokens,
31
+ record.strategy,
32
+ record.summaryContent,
33
+ record.createdBy || 'system',
34
+ record.createdAt,
35
+ ]);
36
+ }
37
+ async findBySessionId(sessionId) {
38
+ const sql = `SELECT * FROM compression_records WHERE session_id = $1 ORDER BY created_at DESC`;
39
+ const { rows } = await this.pool.query(sql, [sessionId]);
40
+ return rows.map((row) => this.rowToRecord(row));
41
+ }
42
+ rowToRecord(row) {
43
+ return {
44
+ sessionId: row.session_id,
45
+ taskId: row.task_id,
46
+ originalMessageCount: row.original_message_count,
47
+ compressedMessageCount: row.compressed_message_count,
48
+ originalTokens: row.original_tokens,
49
+ compressedTokens: row.compressed_tokens,
50
+ strategy: row.strategy,
51
+ summaryContent: row.summary_content,
52
+ createdBy: row.created_by,
53
+ createdAt: row.created_at.toISOString(),
54
+ };
55
+ }
56
+ }
57
+ // ─────────────────────────────────────────────
58
+ // In-Memory Implementation (for testing)
59
+ // ─────────────────────────────────────────────
60
+ /**
61
+ * InMemoryCompressionRepository — 内存实现(测试用)
62
+ */
63
+ export class InMemoryCompressionRepository {
64
+ store = [];
65
+ async save(record) {
66
+ this.store.push({ ...record });
67
+ }
68
+ async findBySessionId(sessionId) {
69
+ return this.store.filter((r) => r.sessionId === sessionId);
70
+ }
71
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 消息压缩模块
3
+ *
4
+ * 提供多种压缩策略用于处理长对话历史。
5
+ */
6
+ export { type CompressionConfig, type CompressionResult, type CompressionRecord, type CompressionStrategy, type CompressionReason, type IMessageCompressionService, DEFAULT_COMPRESSION_CONFIG, estimateTokenCount, estimateMessagesTokens, countRounds, } from '../message-compression.service.js';
7
+ export { SlidingWindowCompression, TruncateCompression, type SummarizeFunction, } from './sliding-window.compression.js';
8
+ export { createLLMSummarize, createSimpleSummarize, type LLMCallFunction, } from './llm-summarize.js';
9
+ export { PostgresCompressionRepository, InMemoryCompressionRepository, type ICompressionRepository, } from './compression.repository.js';
10
+ export { CompressionStatsService, globalCompressionStats, createCompressionStatEntry, type CompressionMetrics, type CompressionStatEntry, } from './compression-stats.js';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 消息压缩模块
3
+ *
4
+ * 提供多种压缩策略用于处理长对话历史。
5
+ */
6
+ // 压缩接口和工具函数
7
+ export { DEFAULT_COMPRESSION_CONFIG, estimateTokenCount, estimateMessagesTokens, countRounds, } from '../message-compression.service.js';
8
+ // 滑动窗口压缩策略
9
+ export { SlidingWindowCompression, TruncateCompression, } from './sliding-window.compression.js';
10
+ // LLM 摘要函数
11
+ export { createLLMSummarize, createSimpleSummarize, } from './llm-summarize.js';
12
+ // 压缩记录 Repository
13
+ export { PostgresCompressionRepository, InMemoryCompressionRepository, } from './compression.repository.js';
14
+ // 压缩统计
15
+ export { CompressionStatsService, globalCompressionStats, createCompressionStatEntry, } from './compression-stats.js';
@@ -0,0 +1,58 @@
1
+ /**
2
+ * LLM 摘要函数实现
3
+ *
4
+ * 使用 LLM 对历史消息进行摘要压缩。
5
+ * 支持注入不同的 LLM 调用方式。
6
+ *
7
+ * @see sliding-window.compression.ts 压缩策略
8
+ * @see requirements.md Requirement 4.3
9
+ */
10
+ import type { ILLMProvider, LLMNodeConfig } from '../../graph/nodes/llm-node.js';
11
+ import type { SummarizeFunction } from './sliding-window.compression.js';
12
+ /**
13
+ * LLM 调用接口(简单版本,向后兼容)
14
+ */
15
+ export type LLMCallFunction = (prompt: string) => Promise<string>;
16
+ /**
17
+ * 创建基于 ILLMProvider 的摘要函数
18
+ *
19
+ * 这是推荐的方式,使用项目统一的 LLM 调用接口。
20
+ *
21
+ * @param provider - ILLMProvider 实例
22
+ * @param config - LLM 配置(模型、温度等)
23
+ * @param concise - 是否使用精简 Prompt(默认 false)
24
+ * @returns 摘要函数
25
+ */
26
+ export declare function createLLMSummarizeWithProvider(provider: ILLMProvider, config?: Partial<LLMNodeConfig>, concise?: boolean): SummarizeFunction;
27
+ /**
28
+ * 创建基于简单 LLM 调用函数的摘要函数(向后兼容)
29
+ *
30
+ * @param llmCall - 简单的 LLM 调用函数
31
+ * @returns 摘要函数
32
+ */
33
+ export declare function createLLMSummarize(llmCall?: LLMCallFunction): SummarizeFunction;
34
+ /**
35
+ * 简单摘要函数(不依赖 LLM)
36
+ *
37
+ * 基于规则的简单摘要,适用于 LLM 不可用的场景。
38
+ */
39
+ export declare function createSimpleSummarize(): SummarizeFunction;
40
+ /**
41
+ * 创建摘要函数(自动选择最佳可用方式)
42
+ *
43
+ * 优先级:
44
+ * 1. ILLMProvider(推荐)
45
+ * 2. LLMCallFunction(向后兼容)
46
+ * 3. 简单摘要(降级)
47
+ *
48
+ * @param options - 配置选项
49
+ * @returns 摘要函数
50
+ */
51
+ export declare function createSummarize(options?: {
52
+ provider?: ILLMProvider;
53
+ llmCall?: LLMCallFunction;
54
+ model?: string;
55
+ temperature?: number;
56
+ maxTokens?: number;
57
+ concise?: boolean;
58
+ }): SummarizeFunction;
@@ -0,0 +1,192 @@
1
+ /**
2
+ * LLM 摘要函数实现
3
+ *
4
+ * 使用 LLM 对历史消息进行摘要压缩。
5
+ * 支持注入不同的 LLM 调用方式。
6
+ *
7
+ * @see sliding-window.compression.ts 压缩策略
8
+ * @see requirements.md Requirement 4.3
9
+ */
10
+ // ─────────────────────────────────────────────
11
+ // 摘要 Prompt 模板
12
+ // ─────────────────────────────────────────────
13
+ /**
14
+ * 摘要 Prompt 模板
15
+ */
16
+ const SUMMARY_PROMPT_TEMPLATE = `请将以下对话历史压缩为简洁的摘要,保留关键信息:
17
+
18
+ 对话历史:
19
+ {messages}
20
+
21
+ 要求:
22
+ 1. 保留用户的核心需求和关键决策
23
+ 2. 保留重要的数据和结论
24
+ 3. 保留未完成的任务或待解决的问题
25
+ 4. 压缩到原来的 30% 左右
26
+ 5. 使用中文输出
27
+
28
+ 摘要:`;
29
+ /**
30
+ * 精简版 Prompt(用于 Token 受限场景)
31
+ */
32
+ const CONCISE_SUMMARY_PROMPT = `请用 3-5 句话概括以下对话的核心内容:
33
+
34
+ {messages}
35
+
36
+ 核心摘要:`;
37
+ // ─────────────────────────────────────────────
38
+ // 创建摘要函数
39
+ // ─────────────────────────────────────────────
40
+ /**
41
+ * 创建基于 ILLMProvider 的摘要函数
42
+ *
43
+ * 这是推荐的方式,使用项目统一的 LLM 调用接口。
44
+ *
45
+ * @param provider - ILLMProvider 实例
46
+ * @param config - LLM 配置(模型、温度等)
47
+ * @param concise - 是否使用精简 Prompt(默认 false)
48
+ * @returns 摘要函数
49
+ */
50
+ export function createLLMSummarizeWithProvider(provider, config, concise = false) {
51
+ const llmConfig = {
52
+ model: config?.model ?? 'DeepSeek-V4-Pro',
53
+ temperature: config?.temperature ?? 0.3,
54
+ maxTokens: config?.maxTokens ?? 1024,
55
+ };
56
+ const promptTemplate = concise ? CONCISE_SUMMARY_PROMPT : SUMMARY_PROMPT_TEMPLATE;
57
+ return async (messages) => {
58
+ // 格式化消息为文本
59
+ const formattedMessages = messages
60
+ .map((m) => {
61
+ const role = m.role === 'user' ? '用户' : m.role === 'assistant' ? '助手' : m.role;
62
+ const content = m.content.length > 500
63
+ ? m.content.substring(0, 500) + '...'
64
+ : m.content;
65
+ return `${role}: ${content}`;
66
+ })
67
+ .join('\n');
68
+ // 构造 Prompt
69
+ const prompt = promptTemplate.replace('{messages}', formattedMessages);
70
+ // 构造 GraphMessage 格式的请求
71
+ const requestMessages = [
72
+ {
73
+ role: 'system',
74
+ content: '你是一个专业的对话摘要助手,擅长提取关键信息并生成简洁的摘要。',
75
+ },
76
+ {
77
+ role: 'user',
78
+ content: prompt,
79
+ },
80
+ ];
81
+ try {
82
+ // 调用 LLM 生成摘要
83
+ const response = await provider.invoke(requestMessages, llmConfig);
84
+ return response.content;
85
+ }
86
+ catch (error) {
87
+ console.error('[LLM Summarize] LLM call failed, falling back to simple summarize:', error);
88
+ // 降级到简单摘要
89
+ return simpleSummarize(messages);
90
+ }
91
+ };
92
+ }
93
+ /**
94
+ * 创建基于简单 LLM 调用函数的摘要函数(向后兼容)
95
+ *
96
+ * @param llmCall - 简单的 LLM 调用函数
97
+ * @returns 摘要函数
98
+ */
99
+ export function createLLMSummarize(llmCall) {
100
+ if (!llmCall) {
101
+ return createSimpleSummarize();
102
+ }
103
+ return async (messages) => {
104
+ // 格式化消息为文本
105
+ const formattedMessages = messages
106
+ .map((m) => {
107
+ const role = m.role === 'user' ? '用户' : m.role === 'assistant' ? '助手' : m.role;
108
+ return `${role}: ${m.content}`;
109
+ })
110
+ .join('\n');
111
+ // 构造 Prompt
112
+ const prompt = SUMMARY_PROMPT_TEMPLATE.replace('{messages}', formattedMessages);
113
+ try {
114
+ // 调用 LLM 生成摘要
115
+ const summary = await llmCall(prompt);
116
+ return summary;
117
+ }
118
+ catch (error) {
119
+ console.error('[LLM Summarize] LLM call failed, falling back to simple summarize:', error);
120
+ return simpleSummarize(messages);
121
+ }
122
+ };
123
+ }
124
+ /**
125
+ * 简单摘要函数(不依赖 LLM)
126
+ *
127
+ * 基于规则的简单摘要,适用于 LLM 不可用的场景。
128
+ */
129
+ export function createSimpleSummarize() {
130
+ return async (messages) => {
131
+ return simpleSummarize(messages);
132
+ };
133
+ }
134
+ // ─────────────────────────────────────────────
135
+ // 内部工具函数
136
+ // ─────────────────────────────────────────────
137
+ /**
138
+ * 简单摘要实现(纯函数,可复用)
139
+ */
140
+ function simpleSummarize(messages) {
141
+ const userMessages = messages.filter((m) => m.role === 'user');
142
+ const assistantMessages = messages.filter((m) => m.role === 'assistant');
143
+ // 提取用户问题(取前 200 字符)
144
+ const userQuestions = userMessages
145
+ .map((m) => m.content.length > 200 ? m.content.substring(0, 200) + '...' : m.content)
146
+ .join(';');
147
+ // 提取助手回答要点(取前 150 字符)
148
+ const assistantPoints = assistantMessages
149
+ .map((m) => m.content.length > 150 ? m.content.substring(0, 150) + '...' : m.content)
150
+ .join(';');
151
+ // 统计信息
152
+ const totalMessages = messages.length;
153
+ const timeRange = messages.length > 0
154
+ ? `共 ${totalMessages} 条消息`
155
+ : '';
156
+ return [
157
+ `【对话摘要】${timeRange}`,
158
+ `用户主要问题:${userQuestions}`,
159
+ `助手回答要点:${assistantPoints}`,
160
+ ].join('\n');
161
+ }
162
+ // ─────────────────────────────────────────────
163
+ // 工厂函数(推荐使用)
164
+ // ─────────────────────────────────────────────
165
+ /**
166
+ * 创建摘要函数(自动选择最佳可用方式)
167
+ *
168
+ * 优先级:
169
+ * 1. ILLMProvider(推荐)
170
+ * 2. LLMCallFunction(向后兼容)
171
+ * 3. 简单摘要(降级)
172
+ *
173
+ * @param options - 配置选项
174
+ * @returns 摘要函数
175
+ */
176
+ export function createSummarize(options) {
177
+ // 优先使用 ILLMProvider
178
+ if (options?.provider) {
179
+ return createLLMSummarizeWithProvider(options.provider, {
180
+ model: options.model,
181
+ temperature: options.temperature,
182
+ maxTokens: options.maxTokens,
183
+ }, options.concise);
184
+ }
185
+ // 其次使用简单 LLM 调用函数
186
+ if (options?.llmCall) {
187
+ return createLLMSummarize(options.llmCall);
188
+ }
189
+ // 降级到简单摘要
190
+ console.warn('[Summarize] No LLM provider configured, using simple summarize');
191
+ return createSimpleSummarize();
192
+ }