@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
+ * TiktokenEstimator — 基于 tiktoken 的 Token 估算器
3
+ *
4
+ * 提供更精确的 Token 计数,支持多种模型的 tokenizer。
5
+ * 当 tiktoken 不可用时,回退到基于字符的估算。
6
+ *
7
+ * @see message-compression.service.ts Token 估算
8
+ */
9
+ // ─────────────────────────────────────────────
10
+ // 基于字符的估算器(默认)
11
+ // ─────────────────────────────────────────────
12
+ /**
13
+ * 基于字符的 Token 估算器
14
+ *
15
+ * 粗略但快速,适用于:
16
+ * - tiktoken 不可用时的回退方案
17
+ * - 对精度要求不高的场景
18
+ */
19
+ export class CharBasedTokenEstimator {
20
+ /**
21
+ * 估算文本的 Token 数
22
+ *
23
+ * 基于字符数估算:
24
+ * - 中文约 1.5 字符 = 1 Token
25
+ * - 英文约 4 字符 = 1 Token
26
+ */
27
+ estimateTokens(text) {
28
+ if (!text)
29
+ return 0;
30
+ // 统计中文字符数
31
+ const chineseChars = (text.match(/[\u4e00-\u9fff]/g) || []).length;
32
+ // 统计非中文字符数
33
+ const otherChars = text.length - chineseChars;
34
+ // 中文 1.5 字符 ≈ 1 Token,英文 4 字符 ≈ 1 Token
35
+ return Math.ceil(chineseChars / 1.5 + otherChars / 4);
36
+ }
37
+ estimateMessagesTokens(messages) {
38
+ let totalTokens = 0;
39
+ for (const msg of messages) {
40
+ // 基础开销(role、格式等)
41
+ totalTokens += 4;
42
+ // 内容 Token
43
+ if (msg.content) {
44
+ totalTokens += this.estimateTokens(msg.content);
45
+ }
46
+ // toolCalls 额外开销
47
+ if (msg.toolCalls) {
48
+ totalTokens += this.estimateTokens(JSON.stringify(msg.toolCalls));
49
+ }
50
+ }
51
+ return totalTokens;
52
+ }
53
+ }
54
+ // ─────────────────────────────────────────────
55
+ // 基于模型的估算器(更精确)
56
+ // ─────────────────────────────────────────────
57
+ /**
58
+ * 模型特定的 Token 估算器
59
+ *
60
+ * 基于不同模型的 tokenizer 特性进行更精确的估算。
61
+ */
62
+ export class ModelBasedTokenEstimator {
63
+ model;
64
+ charsPerToken;
65
+ constructor(model = 'gpt-4') {
66
+ this.model = model;
67
+ this.charsPerToken = this.getCharsPerToken(model);
68
+ }
69
+ estimateTokens(text) {
70
+ if (!text)
71
+ return 0;
72
+ return Math.ceil(text.length / this.charsPerToken);
73
+ }
74
+ estimateMessagesTokens(messages) {
75
+ let totalTokens = 0;
76
+ for (const msg of messages) {
77
+ // 基础开销(role、格式等)
78
+ totalTokens += 4;
79
+ // 内容 Token
80
+ if (msg.content) {
81
+ totalTokens += this.estimateTokens(msg.content);
82
+ }
83
+ // toolCalls 额外开销
84
+ if (msg.toolCalls) {
85
+ totalTokens += this.estimateTokens(JSON.stringify(msg.toolCalls));
86
+ }
87
+ }
88
+ return totalTokens;
89
+ }
90
+ /**
91
+ * 获取模型的字符/Token 比率
92
+ */
93
+ getCharsPerToken(model) {
94
+ // 不同模型的字符/Token 比率
95
+ const ratios = {
96
+ 'gpt-4': 4,
97
+ 'gpt-4-turbo': 4,
98
+ 'gpt-4o': 4,
99
+ 'gpt-3.5-turbo': 4,
100
+ 'claude-3-opus': 3.5,
101
+ 'claude-3-sonnet': 3.5,
102
+ 'claude-3-haiku': 3.5,
103
+ 'claude-2': 3.5,
104
+ 'gemini-pro': 4,
105
+ 'gemini-ultra': 4,
106
+ 'llama-2': 4,
107
+ 'llama-3': 4,
108
+ 'mistral': 4,
109
+ };
110
+ // 查找模型对应的比率
111
+ for (const [key, ratio] of Object.entries(ratios)) {
112
+ if (model.toLowerCase().includes(key.toLowerCase())) {
113
+ return ratio;
114
+ }
115
+ }
116
+ // 默认比率
117
+ return 4;
118
+ }
119
+ }
120
+ // ─────────────────────────────────────────────
121
+ // 工厂函数
122
+ // ─────────────────────────────────────────────
123
+ /**
124
+ * 创建 Token 估算器
125
+ *
126
+ * @param model - 模型名称(可选)
127
+ * @returns Token 估算器实例
128
+ */
129
+ export function createTokenEstimator(model) {
130
+ if (model) {
131
+ return new ModelBasedTokenEstimator(model);
132
+ }
133
+ return new CharBasedTokenEstimator();
134
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * TokenStatsService — Token 统计服务
3
+ *
4
+ * 收集每次 LLM 调用的 Token 消耗,按 taskId 聚合统计。
5
+ * 提供 total/byNode/byModel 多维度汇总能力。
6
+ *
7
+ * @see design.md §1.6 stats.token_usage / stats.node_token 事件
8
+ * @see requirements.md Requirement 6 AC1-AC4
9
+ */
10
+ /**
11
+ * NodeTokenUsage — 单次 LLM 调用的 Token 消耗数据
12
+ *
13
+ * 对应 SSE 事件 stats.node_token 的 payload 结构。
14
+ */
15
+ export interface NodeTokenUsage {
16
+ /** 产生消耗的节点 ID */
17
+ nodeId: string;
18
+ /** 使用的模型标识 */
19
+ model: string;
20
+ /** 输入 Token 数 */
21
+ inputTokens: number;
22
+ /** 输出 Token 数 */
23
+ outputTokens: number;
24
+ /** 预估成本(美元) */
25
+ costEstimate: number;
26
+ }
27
+ /**
28
+ * TokenBreakdown — Token 消耗分组统计
29
+ */
30
+ export interface TokenBreakdown {
31
+ /** 输入 Token 总数 */
32
+ input: number;
33
+ /** 输出 Token 总数 */
34
+ output: number;
35
+ /** 输入 + 输出 总计 */
36
+ total: number;
37
+ }
38
+ /**
39
+ * TaskTokenSummary — Task 级 Token 消耗聚合汇总
40
+ *
41
+ * 对应 SSE 事件 stats.token_usage 的 payload 结构。
42
+ */
43
+ export interface TaskTokenSummary {
44
+ /** 全局合计 */
45
+ total: TokenBreakdown;
46
+ /** 按节点 ID 分组的 Token 消耗 */
47
+ byNode: Record<string, TokenBreakdown>;
48
+ /** 按模型分组的 Token 消耗 */
49
+ byModel: Record<string, TokenBreakdown>;
50
+ /** 累计预估成本(美元) */
51
+ costEstimate: number;
52
+ }
53
+ /**
54
+ * TokenStatsService — 收集与聚合 Token 统计
55
+ *
56
+ * - record(): 记录单次 LLM 调用的 Token 消耗
57
+ * - getTaskStats(): 计算 Task 级聚合统计
58
+ * - clear(): 清除已完成 Task 的统计数据(释放内存)
59
+ */
60
+ export declare class TokenStatsService {
61
+ /** 内存存储:taskId → 该 Task 的所有调用记录 */
62
+ private readonly usageStore;
63
+ /**
64
+ * 记录单次 LLM 调用的 Token 消耗
65
+ *
66
+ * @param taskId - 所属 Task ID
67
+ * @param usage - 本次调用的 Token 消耗数据
68
+ */
69
+ record(taskId: string, usage: NodeTokenUsage): void;
70
+ /**
71
+ * 获取 Task 级聚合统计
72
+ *
73
+ * 自动计算 total / byNode / byModel / costEstimate。
74
+ * 若 taskId 无记录,返回空统计(全零值)。
75
+ *
76
+ * @param taskId - Task ID
77
+ * @returns 聚合后的 TaskTokenSummary
78
+ */
79
+ getTaskStats(taskId: string): TaskTokenSummary;
80
+ /**
81
+ * 清除指定 Task 的统计数据
82
+ *
83
+ * Task 完成后调用,释放内存。
84
+ *
85
+ * @param taskId - Task ID
86
+ */
87
+ clear(taskId: string): void;
88
+ }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * TokenStatsService — Token 统计服务
3
+ *
4
+ * 收集每次 LLM 调用的 Token 消耗,按 taskId 聚合统计。
5
+ * 提供 total/byNode/byModel 多维度汇总能力。
6
+ *
7
+ * @see design.md §1.6 stats.token_usage / stats.node_token 事件
8
+ * @see requirements.md Requirement 6 AC1-AC4
9
+ */
10
+ // ─────────────────────────────────────────────
11
+ // TokenStatsService
12
+ // ─────────────────────────────────────────────
13
+ /**
14
+ * TokenStatsService — 收集与聚合 Token 统计
15
+ *
16
+ * - record(): 记录单次 LLM 调用的 Token 消耗
17
+ * - getTaskStats(): 计算 Task 级聚合统计
18
+ * - clear(): 清除已完成 Task 的统计数据(释放内存)
19
+ */
20
+ export class TokenStatsService {
21
+ /** 内存存储:taskId → 该 Task 的所有调用记录 */
22
+ usageStore = new Map();
23
+ /**
24
+ * 记录单次 LLM 调用的 Token 消耗
25
+ *
26
+ * @param taskId - 所属 Task ID
27
+ * @param usage - 本次调用的 Token 消耗数据
28
+ */
29
+ record(taskId, usage) {
30
+ const records = this.usageStore.get(taskId);
31
+ if (records) {
32
+ records.push(usage);
33
+ }
34
+ else {
35
+ this.usageStore.set(taskId, [usage]);
36
+ }
37
+ }
38
+ /**
39
+ * 获取 Task 级聚合统计
40
+ *
41
+ * 自动计算 total / byNode / byModel / costEstimate。
42
+ * 若 taskId 无记录,返回空统计(全零值)。
43
+ *
44
+ * @param taskId - Task ID
45
+ * @returns 聚合后的 TaskTokenSummary
46
+ */
47
+ getTaskStats(taskId) {
48
+ const records = this.usageStore.get(taskId) ?? [];
49
+ let totalInput = 0;
50
+ let totalOutput = 0;
51
+ let totalCost = 0;
52
+ const byNode = {};
53
+ const byModel = {};
54
+ for (const record of records) {
55
+ totalInput += record.inputTokens;
56
+ totalOutput += record.outputTokens;
57
+ totalCost += record.costEstimate;
58
+ // 按节点聚合
59
+ if (!byNode[record.nodeId]) {
60
+ byNode[record.nodeId] = { input: 0, output: 0, total: 0 };
61
+ }
62
+ byNode[record.nodeId].input += record.inputTokens;
63
+ byNode[record.nodeId].output += record.outputTokens;
64
+ byNode[record.nodeId].total += record.inputTokens + record.outputTokens;
65
+ // 按模型聚合
66
+ if (!byModel[record.model]) {
67
+ byModel[record.model] = { input: 0, output: 0, total: 0 };
68
+ }
69
+ byModel[record.model].input += record.inputTokens;
70
+ byModel[record.model].output += record.outputTokens;
71
+ byModel[record.model].total += record.inputTokens + record.outputTokens;
72
+ }
73
+ return {
74
+ total: {
75
+ input: totalInput,
76
+ output: totalOutput,
77
+ total: totalInput + totalOutput,
78
+ },
79
+ byNode,
80
+ byModel,
81
+ costEstimate: totalCost,
82
+ };
83
+ }
84
+ /**
85
+ * 清除指定 Task 的统计数据
86
+ *
87
+ * Task 完成后调用,释放内存。
88
+ *
89
+ * @param taskId - Task ID
90
+ */
91
+ clear(taskId) {
92
+ this.usageStore.delete(taskId);
93
+ }
94
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * createToolExecutor — 按部署上下文组装 Router + Gateway/Local 执行器
3
+ *
4
+ * server / hosting:**默认 MCP**(McpToolExecutor → POST /api/v1/mcp);
5
+ * `EAP_TOOL_GATEWAY_TRANSPORT=http` 时用 HttpToolExecutor(仅调试)。
6
+ * desktop 经 ToolExecutionRouter 分流 Local / Gateway。
7
+ */
8
+ import type { ILocalToolInstallStore, LocalToolInstallRecord } from '@gt-fe/eap-contracts';
9
+ import { type DeploymentContext } from './tool-execution-router.js';
10
+ import type { IToolExecutor } from './tool-executor.interface.js';
11
+ export declare class EmptyInstallStore implements ILocalToolInstallStore {
12
+ get(): null;
13
+ listReady(): LocalToolInstallRecord[];
14
+ }
15
+ export type ToolGatewayTransport = 'mcp' | 'http';
16
+ export interface CreateToolExecutorOptions {
17
+ foundationUrl: string;
18
+ deploymentContext?: DeploymentContext;
19
+ installStore?: ILocalToolInstallStore;
20
+ forceToolServer?: string[];
21
+ httpTimeout?: number;
22
+ toolTypes?: Map<string, string>;
23
+ toolRuntimes?: Map<string, 'local' | 'server' | 'both'>;
24
+ /**
25
+ * Gateway 出站协议。默认 mcp;设 http 仅用于调试口联调。
26
+ * 也可用环境变量 EAP_TOOL_GATEWAY_TRANSPORT=http|mcp。
27
+ */
28
+ gatewayTransport?: ToolGatewayTransport;
29
+ }
30
+ /**
31
+ * 创建经 ToolExecutionRouter 包装的 IToolExecutor(生产装配入口)
32
+ */
33
+ export declare function createToolExecutor(options: CreateToolExecutorOptions): IToolExecutor;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * createToolExecutor — 按部署上下文组装 Router + Gateway/Local 执行器
3
+ *
4
+ * server / hosting:**默认 MCP**(McpToolExecutor → POST /api/v1/mcp);
5
+ * `EAP_TOOL_GATEWAY_TRANSPORT=http` 时用 HttpToolExecutor(仅调试)。
6
+ * desktop 经 ToolExecutionRouter 分流 Local / Gateway。
7
+ */
8
+ import { HttpToolExecutor } from './http-tool-executor.js';
9
+ import { McpToolExecutor } from './mcp-tool-executor.js';
10
+ import { LocalToolExecutor } from './local-tool-executor.js';
11
+ import { ToolExecutionRouter, } from './tool-execution-router.js';
12
+ export class EmptyInstallStore {
13
+ get() {
14
+ return null;
15
+ }
16
+ listReady() {
17
+ return [];
18
+ }
19
+ }
20
+ function resolveDeploymentContext(explicit) {
21
+ if (explicit)
22
+ return explicit;
23
+ const fromEnv = process.env.EAP_DEPLOYMENT_CONTEXT;
24
+ if (fromEnv === 'desktop' || fromEnv === 'dev' || fromEnv === 'server') {
25
+ return fromEnv;
26
+ }
27
+ return 'server';
28
+ }
29
+ function resolveGatewayTransport(explicit) {
30
+ if (explicit)
31
+ return explicit;
32
+ const fromEnv = process.env.EAP_TOOL_GATEWAY_TRANSPORT;
33
+ if (fromEnv === 'http' || fromEnv === 'mcp')
34
+ return fromEnv;
35
+ return 'mcp';
36
+ }
37
+ function createServerExecutor(foundationUrl, transport, timeout) {
38
+ if (transport === 'http') {
39
+ return new HttpToolExecutor({ baseUrl: foundationUrl, timeout });
40
+ }
41
+ return new McpToolExecutor({ baseUrl: foundationUrl, timeout });
42
+ }
43
+ /**
44
+ * 创建经 ToolExecutionRouter 包装的 IToolExecutor(生产装配入口)
45
+ */
46
+ export function createToolExecutor(options) {
47
+ const installStore = options.installStore ?? new EmptyInstallStore();
48
+ const transport = resolveGatewayTransport(options.gatewayTransport);
49
+ const serverExecutor = createServerExecutor(options.foundationUrl, transport, options.httpTimeout);
50
+ const localExecutor = new LocalToolExecutor({ installStore });
51
+ return new ToolExecutionRouter({
52
+ httpExecutor: serverExecutor,
53
+ localExecutor,
54
+ installStore,
55
+ deploymentContext: resolveDeploymentContext(options.deploymentContext),
56
+ toolTypes: options.toolTypes,
57
+ toolRuntimes: options.toolRuntimes,
58
+ forceToolServer: options.forceToolServer,
59
+ });
60
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Dev 下按 type:http 清单直连出站(gateway.baseUrl + pathTemplate)。
3
+ * URL 拼接与 host 白名单与 Tool Gateway 共用 @gt-fe/eap-contracts http-outbound。
4
+ */
5
+ import type { IToolExecutor, ToolCallRequest, ToolCallResult } from './tool-executor.interface.js';
6
+ export interface DevHttpExecution {
7
+ protocol: 'http';
8
+ method?: string;
9
+ baseUrl?: string;
10
+ pathTemplate?: string;
11
+ allowedHosts?: string[];
12
+ timeout?: number;
13
+ }
14
+ export declare function resolveHttpExecutionFromRequest(request: ToolCallRequest): DevHttpExecution | null;
15
+ export declare function buildHttpToolUrl(spec: DevHttpExecution, args: Record<string, unknown>): URL;
16
+ export declare class DevHttpExecutor implements IToolExecutor {
17
+ execute(request: ToolCallRequest): Promise<ToolCallResult>;
18
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Dev 下按 type:http 清单直连出站(gateway.baseUrl + pathTemplate)。
3
+ * URL 拼接与 host 白名单与 Tool Gateway 共用 @gt-fe/eap-contracts http-outbound。
4
+ */
5
+ import { assertHttpHostAllowlisted, buildHttpToolUrl as buildSharedHttpToolUrl } from '@gt-fe/eap-contracts';
6
+ export function resolveHttpExecutionFromRequest(request) {
7
+ const raw = request.execution;
8
+ if (!raw || typeof raw !== 'object')
9
+ return null;
10
+ const e = raw;
11
+ if (e.protocol !== 'http')
12
+ return null;
13
+ const baseUrl = typeof e.baseUrl === 'string' ? e.baseUrl : '';
14
+ const pathTemplate = typeof e.pathTemplate === 'string' ? e.pathTemplate : '';
15
+ if (!baseUrl || !pathTemplate)
16
+ return null;
17
+ return {
18
+ protocol: 'http',
19
+ method: typeof e.method === 'string' ? e.method : 'GET',
20
+ baseUrl,
21
+ pathTemplate,
22
+ allowedHosts: Array.isArray(e.allowedHosts)
23
+ ? e.allowedHosts.filter((item) => typeof item === 'string')
24
+ : [],
25
+ timeout: typeof e.timeout === 'number' ? e.timeout : 10000,
26
+ };
27
+ }
28
+ export function buildHttpToolUrl(spec, args) {
29
+ const url = buildSharedHttpToolUrl(spec.baseUrl ?? '', spec.pathTemplate ?? '', args);
30
+ assertHttpHostAllowlisted(url, spec.allowedHosts ?? []);
31
+ return url;
32
+ }
33
+ export class DevHttpExecutor {
34
+ async execute(request) {
35
+ const spec = resolveHttpExecutionFromRequest(request);
36
+ if (!spec) {
37
+ return {
38
+ toolCallId: request.toolCallId,
39
+ toolName: request.toolName,
40
+ content: '',
41
+ success: false,
42
+ error: `Dev HTTP: tool "${request.toolName}" has no gateway.baseUrl / pathTemplate`,
43
+ errorCode: 'NOT_CONFIGURED',
44
+ runtime: 'local',
45
+ };
46
+ }
47
+ try {
48
+ const args = request.arguments ?? {};
49
+ const url = buildHttpToolUrl(spec, args);
50
+ const method = (spec.method ?? 'GET').toUpperCase();
51
+ const controller = new AbortController();
52
+ const timer = setTimeout(() => controller.abort(), spec.timeout ?? 10000);
53
+ const headers = {
54
+ Accept: 'application/json, text/plain;q=0.9',
55
+ };
56
+ const init = { method, headers, signal: controller.signal };
57
+ if (method !== 'GET' && method !== 'HEAD') {
58
+ headers['Content-Type'] = 'application/json';
59
+ init.body = JSON.stringify(args);
60
+ }
61
+ const response = await fetch(url, init);
62
+ clearTimeout(timer);
63
+ const text = await response.text();
64
+ if (!response.ok) {
65
+ return {
66
+ toolCallId: request.toolCallId,
67
+ toolName: request.toolName,
68
+ content: text,
69
+ success: false,
70
+ error: `HTTP ${response.status}: ${response.statusText}`,
71
+ errorCode: 'EXECUTION_FAILED',
72
+ runtime: 'local',
73
+ };
74
+ }
75
+ return {
76
+ toolCallId: request.toolCallId,
77
+ toolName: request.toolName,
78
+ content: text,
79
+ success: true,
80
+ runtime: 'local',
81
+ };
82
+ }
83
+ catch (err) {
84
+ const message = err instanceof Error ? err.message : String(err);
85
+ return {
86
+ toolCallId: request.toolCallId,
87
+ toolName: request.toolName,
88
+ content: '',
89
+ success: false,
90
+ error: message,
91
+ errorCode: 'EXECUTION_FAILED',
92
+ runtime: 'local',
93
+ };
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * DevMcpExecutor — dev 上下文本地 MCP 直连执行器
3
+ *
4
+ * 定位:`eap dev --tool-mode mcp` 场景(deploymentContext=dev)下替代 McpToolExecutor / LocalToolExecutor,
5
+ * 让 Agent 开发者在 **无 foundation-service、无桌面 installStore** 的前提下直连真实 MCP Server。
6
+ *
7
+ * 与另两个 MCP 执行器的差异:
8
+ * - `McpToolExecutor`(server 上下文):HTTP POST `foundation/api/v1/mcp/tools/call` → Tool Gateway 出站
9
+ * ↳ 生产 K8s 内路径,foundation 不对外,dev 场景不可用
10
+ * - `LocalToolExecutor` + `LocalMcpClient`(desktop 上下文):直连 stdio / streamable_http
11
+ * ↳ 强依赖 `installStore.resolveReadyInstallByToolName`(gt-agent 预装记录),dev 场景没有该记录
12
+ * - `DevMcpExecutor`(dev 上下文,本文件):直连 stdio / streamable_http
13
+ * ↳ 从 `request.execution`(tool.manifest.execution)规范化读取,无 installStore 依赖
14
+ *
15
+ * 读取来源:`GraphLoader` 已将 `tool.manifest.execution` 沿 LoadedToolDefinition → ToolCallRequest 传下来。
16
+ *
17
+ * @see docs/workflows/local-agent-dev-loop.md
18
+ * @see runtime/src/tool/local-mcp-client.ts
19
+ */
20
+ import { type ILocalMcpClient } from './local-mcp-client.js';
21
+ import type { IToolExecutor, ToolCallRequest, ToolCallResult } from './tool-executor.interface.js';
22
+ export interface DevMcpExecutorOptions {
23
+ client?: ILocalMcpClient;
24
+ }
25
+ export declare class DevMcpExecutor implements IToolExecutor {
26
+ private readonly client;
27
+ constructor(options?: DevMcpExecutorOptions);
28
+ execute(request: ToolCallRequest): Promise<ToolCallResult>;
29
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * DevMcpExecutor — dev 上下文本地 MCP 直连执行器
3
+ *
4
+ * 定位:`eap dev --tool-mode mcp` 场景(deploymentContext=dev)下替代 McpToolExecutor / LocalToolExecutor,
5
+ * 让 Agent 开发者在 **无 foundation-service、无桌面 installStore** 的前提下直连真实 MCP Server。
6
+ *
7
+ * 与另两个 MCP 执行器的差异:
8
+ * - `McpToolExecutor`(server 上下文):HTTP POST `foundation/api/v1/mcp/tools/call` → Tool Gateway 出站
9
+ * ↳ 生产 K8s 内路径,foundation 不对外,dev 场景不可用
10
+ * - `LocalToolExecutor` + `LocalMcpClient`(desktop 上下文):直连 stdio / streamable_http
11
+ * ↳ 强依赖 `installStore.resolveReadyInstallByToolName`(gt-agent 预装记录),dev 场景没有该记录
12
+ * - `DevMcpExecutor`(dev 上下文,本文件):直连 stdio / streamable_http
13
+ * ↳ 从 `request.execution`(tool.manifest.execution)规范化读取,无 installStore 依赖
14
+ *
15
+ * 读取来源:`GraphLoader` 已将 `tool.manifest.execution` 沿 LoadedToolDefinition → ToolCallRequest 传下来。
16
+ *
17
+ * @see docs/workflows/local-agent-dev-loop.md
18
+ * @see runtime/src/tool/local-mcp-client.ts
19
+ */
20
+ import { LocalMcpClient } from './local-mcp-client.js';
21
+ export class DevMcpExecutor {
22
+ client;
23
+ constructor(options = {}) {
24
+ this.client = options.client ?? new LocalMcpClient();
25
+ }
26
+ async execute(request) {
27
+ const execution = normalizeExecution(request.execution, request.toolName);
28
+ if (!execution) {
29
+ return {
30
+ toolCallId: request.toolCallId,
31
+ toolName: request.toolName,
32
+ content: '',
33
+ success: false,
34
+ error: `Dev MCP: tool "${request.toolName}" has no valid mcp execution config (expect manifest.execution.protocol="mcp")`,
35
+ errorCode: 'NOT_CONFIGURED',
36
+ runtime: 'local',
37
+ };
38
+ }
39
+ try {
40
+ const { content, file } = await this.client.invoke(execution, request.arguments, {
41
+ userId: request.authContext?.userId,
42
+ });
43
+ return {
44
+ toolCallId: request.toolCallId,
45
+ toolName: request.toolName,
46
+ content,
47
+ success: true,
48
+ runtime: 'local',
49
+ file,
50
+ };
51
+ }
52
+ catch (err) {
53
+ const message = err instanceof Error ? err.message : String(err);
54
+ return {
55
+ toolCallId: request.toolCallId,
56
+ toolName: request.toolName,
57
+ content: '',
58
+ success: false,
59
+ error: message,
60
+ errorCode: 'EXECUTION_FAILED',
61
+ runtime: 'local',
62
+ };
63
+ }
64
+ }
65
+ }
66
+ /**
67
+ * 把 tool.manifest.execution(McpExecution 结构,transport 可为 stdio/sse/streamable_http)
68
+ * 规范化为 LocalMcpClient 消费的 McpRuntimeExecution(transport 只支持 stdio/streamable_http)。
69
+ *
70
+ * sse 归并到 streamable_http(LocalMcpClient 的 http 分支已能解析 SSE 响应)。
71
+ */
72
+ function normalizeExecution(raw, fallbackToolName) {
73
+ if (!raw || typeof raw !== 'object')
74
+ return null;
75
+ const e = raw;
76
+ if (e.protocol !== 'mcp')
77
+ return null;
78
+ const rawTransport = e.transport;
79
+ const transport = rawTransport === 'stdio' ? 'stdio' : 'streamable_http';
80
+ const server = (e.server ?? {});
81
+ const toolName = typeof e.toolName === 'string' && e.toolName ? e.toolName : fallbackToolName;
82
+ const timeout = typeof e.timeout === 'number' ? e.timeout : undefined;
83
+ return { protocol: 'mcp', transport, server, toolName, timeout };
84
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * DevToolExecutor — 本地 dev 总入口(不是 code 专用)
3
+ *
4
+ * 仅在 `EAP_TOOL_EXECUTION_MODE=mcp` 且 `deploymentContext=dev` 装配。
5
+ * 按清单分流,缺配置则失败,不回落 mock。
6
+ *
7
+ * - execution.protocol=mcp → DevMcpExecutor
8
+ * - execution.protocol=http → DevHttpExecutor
9
+ * - 能解析出 code handler → LocalToolExecutor
10
+ * - 其余 → NOT_CONFIGURED(mock 只走显式 `--tool-mode mock`)
11
+ */
12
+ import { DevMcpExecutor } from './dev-mcp-executor.js';
13
+ import type { IToolExecutor, ToolCallRequest, ToolCallResult } from './tool-executor.interface.js';
14
+ export interface DevToolExecutorOptions {
15
+ mcp?: ConstructorParameters<typeof DevMcpExecutor>[0];
16
+ }
17
+ export declare class DevToolExecutor implements IToolExecutor {
18
+ private readonly mcp;
19
+ private readonly http;
20
+ private readonly local;
21
+ constructor(options?: DevToolExecutorOptions);
22
+ execute(request: ToolCallRequest): Promise<ToolCallResult>;
23
+ }