@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,134 @@
1
+ /**
2
+ * ContextWindowBudget — 上下文窗口预算分配
3
+ *
4
+ * 管理上下文窗口的 Token 分配,防止单一来源占满上下文。
5
+ * 支持配置历史消息、RAG 结果、Tool Schema 各占上下文窗口的比例上限。
6
+ *
7
+ * @see requirements.md Requirement 12.5
8
+ * @see token/token-budget.service.ts Token Budget 控制
9
+ */
10
+ /**
11
+ * 默认上下文窗口预算配置
12
+ */
13
+ export const DEFAULT_CONTEXT_BUDGET_CONFIG = {
14
+ totalTokens: 128000,
15
+ sourceRatios: {
16
+ history: 0.5, // 历史消息最多占 50%
17
+ rag: 0.2, // RAG 结果最多占 20%
18
+ tools: 0.1, // Tool Schema 最多占 10%
19
+ system: 0.1, // 系统提示最多占 10%
20
+ memory: 0.1, // 长期记忆最多占 10%
21
+ },
22
+ outputReserve: 0.2, // 预留 20% 给模型输出
23
+ };
24
+ // ─────────────────────────────────────────────
25
+ // ContextWindowBudget 服务
26
+ // ─────────────────────────────────────────────
27
+ /**
28
+ * ContextWindowBudget — 上下文窗口预算管理
29
+ */
30
+ export class ContextWindowBudget {
31
+ config;
32
+ constructor(config) {
33
+ this.config = { ...DEFAULT_CONTEXT_BUDGET_CONFIG, ...config };
34
+ }
35
+ /**
36
+ * 获取指定来源的 Token 上限
37
+ *
38
+ * @param source - 来源类型
39
+ * @returns Token 上限
40
+ */
41
+ getMaxTokens(source) {
42
+ const ratio = this.config.sourceRatios[source] ?? 0;
43
+ return Math.floor(this.config.totalTokens * ratio);
44
+ }
45
+ /**
46
+ * 检查指定来源是否超限
47
+ *
48
+ * @param source - 来源类型
49
+ * @param usedTokens - 已使用的 Token 数
50
+ * @returns 是否超限
51
+ */
52
+ isExceeded(source, usedTokens) {
53
+ const maxTokens = this.getMaxTokens(source);
54
+ return usedTokens > maxTokens;
55
+ }
56
+ /**
57
+ * 计算预算分配
58
+ *
59
+ * @param usage - 各来源的已使用 Token 数
60
+ * @returns 预算分配结果
61
+ */
62
+ calculateAllocation(usage) {
63
+ const availableTokens = Math.floor(this.config.totalTokens * (1 - this.config.outputReserve));
64
+ const sources = [];
65
+ const exceededSources = [];
66
+ for (const source of Object.keys(this.config.sourceRatios)) {
67
+ const maxTokens = this.getMaxTokens(source);
68
+ const usedTokens = usage[source] ?? 0;
69
+ const remainingTokens = Math.max(0, maxTokens - usedTokens);
70
+ const usageRatio = maxTokens > 0 ? usedTokens / maxTokens : 0;
71
+ sources.push({
72
+ source,
73
+ maxTokens,
74
+ usedTokens,
75
+ remainingTokens,
76
+ usageRatio,
77
+ });
78
+ if (usedTokens > maxTokens) {
79
+ exceededSources.push(source);
80
+ }
81
+ }
82
+ return {
83
+ totalTokens: this.config.totalTokens,
84
+ availableTokens,
85
+ sources,
86
+ isExceeded: exceededSources.length > 0,
87
+ exceededSources,
88
+ };
89
+ }
90
+ /**
91
+ * 裁剪消息以符合预算
92
+ *
93
+ * 如果历史消息超出预算,从前面开始删除旧消息。
94
+ *
95
+ * @param messages - 原始消息列表
96
+ * @param maxTokens - Token 上限
97
+ * @param estimateFn - Token 估算函数
98
+ * @returns 裁剪后的消息列表
99
+ */
100
+ trimMessages(messages, maxTokens, estimateFn) {
101
+ const currentTokens = estimateFn(messages);
102
+ if (currentTokens <= maxTokens) {
103
+ return messages;
104
+ }
105
+ // 从前面开始删除旧消息
106
+ let trimmed = [...messages];
107
+ while (trimmed.length > 1 && estimateFn(trimmed) > maxTokens) {
108
+ trimmed.shift();
109
+ }
110
+ return trimmed;
111
+ }
112
+ /**
113
+ * 获取配置
114
+ */
115
+ getConfig() {
116
+ return { ...this.config };
117
+ }
118
+ }
119
+ // ─────────────────────────────────────────────
120
+ // 工厂函数
121
+ // ─────────────────────────────────────────────
122
+ /**
123
+ * 创建上下文窗口预算实例
124
+ *
125
+ * @param modelContextWindow - 模型的 context window 大小
126
+ * @param config - 可选的自定义配置
127
+ * @returns ContextWindowBudget 实例
128
+ */
129
+ export function createContextBudget(modelContextWindow, config) {
130
+ return new ContextWindowBudget({
131
+ ...config,
132
+ totalTokens: modelContextWindow,
133
+ });
134
+ }
@@ -0,0 +1 @@
1
+ export type { ITokenBudgetService, BudgetScope, BudgetPeriod, BudgetCheckResult, } from './token-budget.contract.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,77 @@
1
+ /**
2
+ * ITokenBudgetService — Token 配额控制服务接口
3
+ *
4
+ * 定义三级配额体系:per-Task 上限 / per-Session 日预算 / per-Agent 单次 cap。
5
+ * 每次 LLM/Tool 调用后累加 Token 消耗并检查配额,超限时立即终止 Graph,
6
+ * Task 标记 token_exhausted。
7
+ *
8
+ * @see design.md §1.3 token_budgets 数据模型
9
+ * @see requirements.md Requirement 12 AC1-AC3
10
+ */
11
+ /**
12
+ * BudgetScope — 配额作用域
13
+ *
14
+ * - task: 单次 Task 执行的 Token 上限
15
+ * - session: 会话级日预算(daily)
16
+ * - agent: 单次 Agent 执行 cap
17
+ */
18
+ export type BudgetScope = 'task' | 'session' | 'agent';
19
+ /**
20
+ * BudgetPeriod — 配额周期
21
+ *
22
+ * - daily: 每日重置
23
+ * - per-execution: 每次执行独立计算
24
+ */
25
+ export type BudgetPeriod = 'daily' | 'per-execution';
26
+ /**
27
+ * BudgetCheckResult — 配额检查结果
28
+ *
29
+ * 调用 check() 返回当前配额状态,包含配额上限、已消耗、剩余量和是否耗尽。
30
+ */
31
+ export interface BudgetCheckResult {
32
+ /** 配额上限 */
33
+ quota: number;
34
+ /** 已消耗 Token 数 */
35
+ consumed: number;
36
+ /** 剩余可用 Token 数 */
37
+ remaining: number;
38
+ /** 是否已耗尽(consumed >= quota) */
39
+ isExhausted: boolean;
40
+ /** 配额周期 */
41
+ period: BudgetPeriod;
42
+ }
43
+ /**
44
+ * ITokenBudgetService — Token 配额控制接口
45
+ *
46
+ * 负责三级配额的检查、消耗和耗尽判断。
47
+ * 由 TokenBudgetService 实现,贯穿 Graph 执行全过程。
48
+ */
49
+ export interface ITokenBudgetService {
50
+ /**
51
+ * 检查指定 scope 的当前配额状态
52
+ *
53
+ * @param scope - 配额作用域(task/session/agent)
54
+ * @param scopeId - 对应作用域的实体 ID(taskId/sessionId/agentId)
55
+ * @returns 配额检查结果(含 quota、consumed、remaining、isExhausted、period)
56
+ */
57
+ check(scope: BudgetScope, scopeId: string): Promise<BudgetCheckResult>;
58
+ /**
59
+ * 消耗指定 scope 的 Token 配额
60
+ *
61
+ * 每次 LLM/Tool 调用后调用此方法累加消耗。
62
+ * 若消耗后超出配额,应由调用方触发 Graph 终止流程。
63
+ *
64
+ * @param scope - 配额作用域
65
+ * @param scopeId - 对应作用域的实体 ID
66
+ * @param amount - 本次消耗的 Token 数量
67
+ */
68
+ consume(scope: BudgetScope, scopeId: string, amount: number): Promise<void>;
69
+ /**
70
+ * 判断指定 scope 的配额是否已耗尽
71
+ *
72
+ * @param scope - 配额作用域
73
+ * @param scopeId - 对应作用域的实体 ID
74
+ * @returns true 表示配额已耗尽,应终止执行
75
+ */
76
+ isExhausted(scope: BudgetScope, scopeId: string): Promise<boolean>;
77
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ITokenBudgetService — Token 配额控制服务接口
3
+ *
4
+ * 定义三级配额体系:per-Task 上限 / per-Session 日预算 / per-Agent 单次 cap。
5
+ * 每次 LLM/Tool 调用后累加 Token 消耗并检查配额,超限时立即终止 Graph,
6
+ * Task 标记 token_exhausted。
7
+ *
8
+ * @see design.md §1.3 token_budgets 数据模型
9
+ * @see requirements.md Requirement 12 AC1-AC3
10
+ */
11
+ export {};
@@ -0,0 +1,12 @@
1
+ export type { ITokenBudgetService, BudgetScope, BudgetPeriod, BudgetCheckResult, } from './contracts/index.js';
2
+ export type { BudgetRecord, ITokenBudgetRepository, TokenBudgetServiceOptions, } from './token-budget.service.js';
3
+ export { InMemoryTokenBudgetRepository, TokenBudgetService, } from './token-budget.service.js';
4
+ export { PostgresTokenBudgetRepository } from './pg-token-budget.repository.js';
5
+ export { TokenBudgetGuard, TokenBudgetExhaustedError, } from './token-budget-guard.js';
6
+ export { SessionBudgetChecker, SessionBudgetExhaustedError, } from './session-budget-checker.js';
7
+ export type { NodeTokenUsage, TokenBreakdown, TaskTokenSummary, } from './token-stats.service.js';
8
+ export { TokenStatsService } from './token-stats.service.js';
9
+ export type { TokenDetailMode } from './token-detail-mode.js';
10
+ export { TokenStatsEmitter } from './token-detail-mode.js';
11
+ export { ContextWindowBudget, createContextBudget, type ContextWindowBudgetConfig, type ContextSource, type SourceAllocation, type BudgetAllocation, DEFAULT_CONTEXT_BUDGET_CONFIG, } from './context-window-budget.js';
12
+ export { CharBasedTokenEstimator, ModelBasedTokenEstimator, createTokenEstimator, type ITokenEstimator, } from './token-estimator.js';
@@ -0,0 +1,10 @@
1
+ export { InMemoryTokenBudgetRepository, TokenBudgetService, } from './token-budget.service.js';
2
+ export { PostgresTokenBudgetRepository } from './pg-token-budget.repository.js';
3
+ export { TokenBudgetGuard, TokenBudgetExhaustedError, } from './token-budget-guard.js';
4
+ export { SessionBudgetChecker, SessionBudgetExhaustedError, } from './session-budget-checker.js';
5
+ export { TokenStatsService } from './token-stats.service.js';
6
+ export { TokenStatsEmitter } from './token-detail-mode.js';
7
+ // 上下文窗口预算分配
8
+ export { ContextWindowBudget, createContextBudget, DEFAULT_CONTEXT_BUDGET_CONFIG, } from './context-window-budget.js';
9
+ // Token 估算器
10
+ export { CharBasedTokenEstimator, ModelBasedTokenEstimator, createTokenEstimator, } from './token-estimator.js';
@@ -0,0 +1,39 @@
1
+ /**
2
+ * PostgresTokenBudgetRepository — Token 配额持久化 PostgreSQL 实现
3
+ *
4
+ * 基于 pg 连接池实现 ITokenBudgetRepository 接口。
5
+ * getOrCreate 采用 SELECT + INSERT 模式,update 仅更新 consumed/status/updated_at。
6
+ * 支持审计字段和软删除。
7
+ *
8
+ * @see design.md §1.3 数据模型 — token_budgets 表
9
+ * @see token-budget.service.ts ITokenBudgetRepository 接口定义
10
+ */
11
+ import type { BudgetScope, BudgetPeriod } from './contracts/index.js';
12
+ import type { BudgetRecord, ITokenBudgetRepository } from './token-budget.service.js';
13
+ /** pg Pool 抽象接口 */
14
+ export interface IPgPool {
15
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{
16
+ rows: T[];
17
+ }>;
18
+ }
19
+ export declare class PostgresTokenBudgetRepository implements ITokenBudgetRepository {
20
+ private readonly pool;
21
+ constructor(pool: IPgPool);
22
+ /**
23
+ * SELECT by scope + scopeId; if not found, INSERT with defaults and return.
24
+ * Excludes soft-deleted records
25
+ */
26
+ getOrCreate(scope: BudgetScope, scopeId: string, defaultQuota: number, period: BudgetPeriod): Promise<BudgetRecord>;
27
+ /**
28
+ * UPDATE consumed, status, updated_by, updated_at WHERE id = ?
29
+ */
30
+ update(record: BudgetRecord): Promise<void>;
31
+ /**
32
+ * Soft delete budget record
33
+ */
34
+ softDelete(id: string, deletedBy: string): Promise<void>;
35
+ /**
36
+ * 将 PostgreSQL 行数据转换为 BudgetRecord
37
+ */
38
+ private rowToRecord;
39
+ }
@@ -0,0 +1,116 @@
1
+ /**
2
+ * PostgresTokenBudgetRepository — Token 配额持久化 PostgreSQL 实现
3
+ *
4
+ * 基于 pg 连接池实现 ITokenBudgetRepository 接口。
5
+ * getOrCreate 采用 SELECT + INSERT 模式,update 仅更新 consumed/status/updated_at。
6
+ * 支持审计字段和软删除。
7
+ *
8
+ * @see design.md §1.3 数据模型 — token_budgets 表
9
+ * @see token-budget.service.ts ITokenBudgetRepository 接口定义
10
+ */
11
+ // ─────────────────────────────────────────────
12
+ // PostgresTokenBudgetRepository
13
+ // ─────────────────────────────────────────────
14
+ export class PostgresTokenBudgetRepository {
15
+ pool;
16
+ constructor(pool) {
17
+ this.pool = pool;
18
+ }
19
+ /**
20
+ * SELECT by scope + scopeId; if not found, INSERT with defaults and return.
21
+ * Excludes soft-deleted records
22
+ */
23
+ async getOrCreate(scope, scopeId, defaultQuota, period) {
24
+ const selectSql = `SELECT * FROM token_budgets WHERE scope = $1 AND scope_id = $2 AND is_deleted = FALSE`;
25
+ const { rows } = await this.pool.query(selectSql, [scope, scopeId]);
26
+ if (rows.length > 0) {
27
+ return this.rowToRecord(rows[0]);
28
+ }
29
+ // Not found — insert new record
30
+ const now = new Date();
31
+ const id = `budget_${scope}_${scopeId}_${now.getTime()}`;
32
+ const insertSql = `
33
+ INSERT INTO token_budgets (id, scope, scope_id, quota, consumed, period, status, created_by, created_at, updated_by, updated_at)
34
+ VALUES ($1, $2, $3, $4, 0, $5, 'active', $6, $7, $8, $9)
35
+ `;
36
+ await this.pool.query(insertSql, [
37
+ id,
38
+ scope,
39
+ scopeId,
40
+ defaultQuota,
41
+ period,
42
+ 'system',
43
+ now,
44
+ 'system',
45
+ now,
46
+ ]);
47
+ return {
48
+ id,
49
+ scope,
50
+ scopeId,
51
+ quota: defaultQuota,
52
+ consumed: 0,
53
+ period,
54
+ status: 'active',
55
+ createdBy: 'system',
56
+ createdAt: now.toISOString(),
57
+ updatedBy: 'system',
58
+ updatedAt: now.toISOString(),
59
+ isDeleted: false,
60
+ };
61
+ }
62
+ /**
63
+ * UPDATE consumed, status, updated_by, updated_at WHERE id = ?
64
+ */
65
+ async update(record) {
66
+ const sql = `
67
+ UPDATE token_budgets
68
+ SET consumed = $1, status = $2, updated_by = $3, updated_at = $4
69
+ WHERE id = $5 AND is_deleted = FALSE
70
+ `;
71
+ const now = new Date();
72
+ record.updatedAt = now.toISOString();
73
+ await this.pool.query(sql, [
74
+ record.consumed,
75
+ record.status,
76
+ record.updatedBy || 'system',
77
+ now,
78
+ record.id,
79
+ ]);
80
+ }
81
+ /**
82
+ * Soft delete budget record
83
+ */
84
+ async softDelete(id, deletedBy) {
85
+ const sql = `
86
+ UPDATE token_budgets
87
+ SET is_deleted = TRUE, deleted_by = $1, deleted_at = NOW()
88
+ WHERE id = $2 AND is_deleted = FALSE
89
+ `;
90
+ await this.pool.query(sql, [deletedBy, id]);
91
+ }
92
+ // ─────────────────────────────────────────────
93
+ // Private Helpers
94
+ // ─────────────────────────────────────────────
95
+ /**
96
+ * 将 PostgreSQL 行数据转换为 BudgetRecord
97
+ */
98
+ rowToRecord(row) {
99
+ return {
100
+ id: row.id,
101
+ scope: row.scope,
102
+ scopeId: row.scope_id,
103
+ quota: row.quota,
104
+ consumed: row.consumed,
105
+ period: row.period,
106
+ status: row.status,
107
+ createdBy: row.created_by,
108
+ createdAt: row.created_at.toISOString(),
109
+ updatedBy: row.updated_by,
110
+ updatedAt: row.updated_at.toISOString(),
111
+ isDeleted: row.is_deleted,
112
+ deletedBy: row.deleted_by,
113
+ deletedAt: row.deleted_at?.toISOString(),
114
+ };
115
+ }
116
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * SessionBudgetChecker — Session 级每日 Token 预算前置检查
3
+ *
4
+ * 在创建新 Task 前调用,检查该 Session 的每日 Token 预算是否已耗尽。
5
+ * 若已耗尽,抛出 SessionBudgetExhaustedError,拒绝新请求。
6
+ *
7
+ * 与 TokenBudgetGuard 的区别:
8
+ * - TokenBudgetGuard: 每次 LLM/Tool 调用后检查,超限终止当前 Graph
9
+ * - SessionBudgetChecker: 新请求入口前检查,超限直接拒绝(不创建 Task)
10
+ *
11
+ * @see design.md §1.2 per-Session日预算 → 超限则拒绝后续请求
12
+ * @see requirements.md Requirement 12 AC3
13
+ */
14
+ import type { ITokenBudgetService } from './contracts/index.js';
15
+ /**
16
+ * SessionBudgetExhaustedError — 当 Session 的每日 Token 配额已用完时抛出
17
+ *
18
+ * API 层捕获此错误后应返回明确的拒绝响应,提示用户次日再试或联系管理员。
19
+ */
20
+ export declare class SessionBudgetExhaustedError extends Error {
21
+ /** Session ID */
22
+ readonly sessionId: string;
23
+ /** 已消耗 Token 数 */
24
+ readonly consumed: number;
25
+ /** 配额上限 */
26
+ readonly quota: number;
27
+ constructor(sessionId: string, consumed: number, quota: number);
28
+ }
29
+ /**
30
+ * SessionBudgetChecker — 在新请求入口(Task 创建前)执行 Session 日预算检查
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const checker = new SessionBudgetChecker(budgetService);
35
+ *
36
+ * // 在 API handler 中,创建 Task 前调用
37
+ * await checker.assertBudgetAvailable(sessionId);
38
+ * // 若未抛出异常,表示预算充足,可继续创建 Task
39
+ * ```
40
+ */
41
+ export declare class SessionBudgetChecker {
42
+ private readonly budgetService;
43
+ constructor(budgetService: ITokenBudgetService);
44
+ /**
45
+ * 断言 Session 的每日 Token 预算仍有余量
46
+ *
47
+ * 若预算已耗尽,抛出 SessionBudgetExhaustedError。
48
+ * 调用方应在创建新 Task 之前调用此方法。
49
+ *
50
+ * @param sessionId - 待检查的 Session ID
51
+ * @throws {SessionBudgetExhaustedError} 当 Session 每日预算已耗尽时
52
+ */
53
+ assertBudgetAvailable(sessionId: string): Promise<void>;
54
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * SessionBudgetChecker — Session 级每日 Token 预算前置检查
3
+ *
4
+ * 在创建新 Task 前调用,检查该 Session 的每日 Token 预算是否已耗尽。
5
+ * 若已耗尽,抛出 SessionBudgetExhaustedError,拒绝新请求。
6
+ *
7
+ * 与 TokenBudgetGuard 的区别:
8
+ * - TokenBudgetGuard: 每次 LLM/Tool 调用后检查,超限终止当前 Graph
9
+ * - SessionBudgetChecker: 新请求入口前检查,超限直接拒绝(不创建 Task)
10
+ *
11
+ * @see design.md §1.2 per-Session日预算 → 超限则拒绝后续请求
12
+ * @see requirements.md Requirement 12 AC3
13
+ */
14
+ // ─────────────────────────────────────────────
15
+ // SessionBudgetExhaustedError — Session 日预算耗尽错误
16
+ // ─────────────────────────────────────────────
17
+ /**
18
+ * SessionBudgetExhaustedError — 当 Session 的每日 Token 配额已用完时抛出
19
+ *
20
+ * API 层捕获此错误后应返回明确的拒绝响应,提示用户次日再试或联系管理员。
21
+ */
22
+ export class SessionBudgetExhaustedError extends Error {
23
+ /** Session ID */
24
+ sessionId;
25
+ /** 已消耗 Token 数 */
26
+ consumed;
27
+ /** 配额上限 */
28
+ quota;
29
+ constructor(sessionId, consumed, quota) {
30
+ super(`Token预算已耗尽:Session ${sessionId} 的每日Token配额已用完,请明天再试或联系管理员提高配额。`);
31
+ this.name = 'SessionBudgetExhaustedError';
32
+ this.sessionId = sessionId;
33
+ this.consumed = consumed;
34
+ this.quota = quota;
35
+ }
36
+ }
37
+ // ─────────────────────────────────────────────
38
+ // SessionBudgetChecker — 前置预算检查器
39
+ // ─────────────────────────────────────────────
40
+ /**
41
+ * SessionBudgetChecker — 在新请求入口(Task 创建前)执行 Session 日预算检查
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * const checker = new SessionBudgetChecker(budgetService);
46
+ *
47
+ * // 在 API handler 中,创建 Task 前调用
48
+ * await checker.assertBudgetAvailable(sessionId);
49
+ * // 若未抛出异常,表示预算充足,可继续创建 Task
50
+ * ```
51
+ */
52
+ export class SessionBudgetChecker {
53
+ budgetService;
54
+ constructor(budgetService) {
55
+ this.budgetService = budgetService;
56
+ }
57
+ /**
58
+ * 断言 Session 的每日 Token 预算仍有余量
59
+ *
60
+ * 若预算已耗尽,抛出 SessionBudgetExhaustedError。
61
+ * 调用方应在创建新 Task 之前调用此方法。
62
+ *
63
+ * @param sessionId - 待检查的 Session ID
64
+ * @throws {SessionBudgetExhaustedError} 当 Session 每日预算已耗尽时
65
+ */
66
+ async assertBudgetAvailable(sessionId) {
67
+ const result = await this.budgetService.check('session', sessionId);
68
+ if (result.isExhausted) {
69
+ throw new SessionBudgetExhaustedError(sessionId, result.consumed, result.quota);
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * TokenBudgetGuard — Token 配额守卫
3
+ *
4
+ * 在每次 LLM/Tool 调用后执行配额检查:
5
+ * 1. 累加消耗到 task / session / agent 三级 scope
6
+ * 2. 检查三级配额是否耗尽
7
+ * 3. 若任一级耗尽,抛出 TokenBudgetExhaustedError,Graph 执行循环捕获后标记 Task 为 token_exhausted
8
+ *
9
+ * @see design.md §1.2 Token Budget检查(贯穿执行过程)
10
+ * @see requirements.md Requirement 12 AC2
11
+ */
12
+ import type { BudgetScope, ITokenBudgetService } from './contracts/index.js';
13
+ /**
14
+ * TokenBudgetExhaustedError — Token 配额耗尽时抛出
15
+ *
16
+ * Graph 执行循环应捕获此错误并将 Task 标记为 token_exhausted。
17
+ */
18
+ export declare class TokenBudgetExhaustedError extends Error {
19
+ /** 耗尽的配额作用域 */
20
+ readonly scope: BudgetScope;
21
+ /** 对应 scope 的实体 ID */
22
+ readonly scopeId: string;
23
+ /** 已消耗 Token 数 */
24
+ readonly consumed: number;
25
+ /** 配额上限 */
26
+ readonly quota: number;
27
+ constructor(scope: BudgetScope, scopeId: string, consumed: number, quota: number);
28
+ }
29
+ /**
30
+ * TokenBudgetGuard — 每次 LLM/Tool 调用后的配额检查守卫
31
+ *
32
+ * 使用方式:在 Graph 执行循环中,每次 LLM/Tool 调用完成后调用 checkAndConsume。
33
+ * 若配额耗尽,将抛出 TokenBudgetExhaustedError,Graph 循环捕获后终止执行。
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * const guard = new TokenBudgetGuard(budgetService);
38
+ * try {
39
+ * // ... LLM/Tool 调用 ...
40
+ * await guard.checkAndConsume(taskId, sessionId, agentCode, tokensUsed);
41
+ * } catch (e) {
42
+ * if (e instanceof TokenBudgetExhaustedError) {
43
+ * await taskService.updateStatus(taskId, 'token_exhausted');
44
+ * }
45
+ * }
46
+ * ```
47
+ */
48
+ export declare class TokenBudgetGuard {
49
+ private readonly budgetService;
50
+ constructor(budgetService: ITokenBudgetService);
51
+ /**
52
+ * 消耗并检查三级配额
53
+ *
54
+ * 执行顺序:
55
+ * 1. 对 task / session / agent 三个 scope 依次调用 consume 累加消耗
56
+ * 2. 按优先级 task → session → agent 检查是否耗尽
57
+ * 3. 任一级耗尽即抛出 TokenBudgetExhaustedError
58
+ *
59
+ * @param taskId - 当前 Task ID
60
+ * @param sessionId - 当前 Session ID
61
+ * @param agentCode - 当前 Agent ID
62
+ * @param amount - 本次调用消耗的 Token 数量
63
+ * @throws {TokenBudgetExhaustedError} 当任一级配额耗尽时
64
+ */
65
+ checkAndConsume(taskId: string, sessionId: string, agentCode: string, amount: number): Promise<void>;
66
+ }