@cicctencent/agent-core 0.1.1 → 0.1.3

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 (439) hide show
  1. package/dist/cjs/agent/engine.d.ts.map +1 -0
  2. package/dist/cjs/agent/engine.js +766 -0
  3. package/dist/cjs/agent/engine.js.map +1 -0
  4. package/dist/cjs/agent/history-manager.d.ts.map +1 -0
  5. package/dist/cjs/agent/history-manager.js +271 -0
  6. package/dist/cjs/agent/history-manager.js.map +1 -0
  7. package/dist/cjs/agent/llm-caller.d.ts.map +1 -0
  8. package/dist/cjs/agent/llm-caller.js +307 -0
  9. package/dist/cjs/agent/llm-caller.js.map +1 -0
  10. package/dist/cjs/agent/tool-executor.d.ts.map +1 -0
  11. package/dist/cjs/agent/tool-executor.js +568 -0
  12. package/dist/cjs/agent/tool-executor.js.map +1 -0
  13. package/dist/cjs/agent/types.d.ts.map +1 -0
  14. package/dist/cjs/agent/types.js +6 -0
  15. package/dist/cjs/agent/types.js.map +1 -0
  16. package/dist/cjs/agent/workflow.d.ts.map +1 -0
  17. package/dist/cjs/agent/workflow.js +262 -0
  18. package/dist/cjs/agent/workflow.js.map +1 -0
  19. package/dist/cjs/context/collector.d.ts.map +1 -0
  20. package/dist/cjs/context/collector.js +94 -0
  21. package/dist/cjs/context/collector.js.map +1 -0
  22. package/dist/cjs/context/manager.d.ts.map +1 -0
  23. package/dist/cjs/context/manager.js +36 -0
  24. package/dist/cjs/context/manager.js.map +1 -0
  25. package/dist/cjs/context/types.d.ts.map +1 -0
  26. package/dist/cjs/context/types.js +6 -0
  27. package/dist/cjs/context/types.js.map +1 -0
  28. package/dist/cjs/hooks/types.d.ts.map +1 -0
  29. package/dist/cjs/hooks/types.js +6 -0
  30. package/dist/cjs/hooks/types.js.map +1 -0
  31. package/dist/cjs/index.d.ts.map +1 -0
  32. package/dist/cjs/index.js +98 -0
  33. package/dist/cjs/index.js.map +1 -0
  34. package/dist/cjs/llm/anthropic-provider.d.ts.map +1 -0
  35. package/dist/cjs/llm/anthropic-provider.js +356 -0
  36. package/dist/cjs/llm/anthropic-provider.js.map +1 -0
  37. package/dist/cjs/llm/factory.d.ts.map +1 -0
  38. package/dist/cjs/llm/factory.js +34 -0
  39. package/dist/cjs/llm/factory.js.map +1 -0
  40. package/dist/cjs/llm/ollama-provider.d.ts.map +1 -0
  41. package/dist/cjs/llm/ollama-provider.js +34 -0
  42. package/dist/cjs/llm/ollama-provider.js.map +1 -0
  43. package/dist/cjs/llm/openai-provider.d.ts.map +1 -0
  44. package/dist/cjs/llm/openai-provider.js +186 -0
  45. package/dist/cjs/llm/openai-provider.js.map +1 -0
  46. package/dist/cjs/llm/provider.d.ts.map +1 -0
  47. package/dist/cjs/llm/provider.js +18 -0
  48. package/dist/cjs/llm/provider.js.map +1 -0
  49. package/dist/cjs/llm/types.d.ts.map +1 -0
  50. package/dist/cjs/llm/types.js +6 -0
  51. package/dist/cjs/llm/types.js.map +1 -0
  52. package/dist/cjs/mcp/base-client.d.ts.map +1 -0
  53. package/dist/cjs/mcp/base-client.js +112 -0
  54. package/dist/cjs/mcp/base-client.js.map +1 -0
  55. package/dist/cjs/mcp/client.d.ts.map +1 -0
  56. package/dist/cjs/mcp/client.js +76 -0
  57. package/dist/cjs/mcp/client.js.map +1 -0
  58. package/dist/cjs/mcp/factory.d.ts.map +1 -0
  59. package/dist/cjs/mcp/factory.js +43 -0
  60. package/dist/cjs/mcp/factory.js.map +1 -0
  61. package/dist/cjs/mcp/http-client.d.ts.map +1 -0
  62. package/dist/cjs/mcp/http-client.js +142 -0
  63. package/dist/cjs/mcp/http-client.js.map +1 -0
  64. package/dist/cjs/mcp/proxy-agent.d.ts.map +1 -0
  65. package/dist/cjs/mcp/proxy-agent.js +195 -0
  66. package/dist/cjs/mcp/proxy-agent.js.map +1 -0
  67. package/dist/cjs/mcp/stdio-client.d.ts.map +1 -0
  68. package/dist/cjs/mcp/stdio-client.js +95 -0
  69. package/dist/cjs/mcp/stdio-client.js.map +1 -0
  70. package/dist/cjs/mcp/types.d.ts.map +1 -0
  71. package/dist/cjs/mcp/types.js +6 -0
  72. package/dist/cjs/mcp/types.js.map +1 -0
  73. package/dist/cjs/memory/checkpoint.d.ts.map +1 -0
  74. package/dist/cjs/memory/checkpoint.js +160 -0
  75. package/dist/cjs/memory/checkpoint.js.map +1 -0
  76. package/dist/cjs/memory/extractor.d.ts.map +1 -0
  77. package/dist/cjs/memory/extractor.js +121 -0
  78. package/dist/cjs/memory/extractor.js.map +1 -0
  79. package/dist/cjs/memory/persona.d.ts.map +1 -0
  80. package/dist/cjs/memory/persona.js +79 -0
  81. package/dist/cjs/memory/persona.js.map +1 -0
  82. package/dist/cjs/memory/pipeline.d.ts.map +1 -0
  83. package/dist/cjs/memory/pipeline.js +148 -0
  84. package/dist/cjs/memory/pipeline.js.map +1 -0
  85. package/dist/cjs/memory/prompts.d.ts.map +1 -0
  86. package/dist/cjs/memory/prompts.js +70 -0
  87. package/dist/cjs/memory/prompts.js.map +1 -0
  88. package/dist/cjs/memory/recall.d.ts.map +1 -0
  89. package/dist/cjs/memory/recall.js +164 -0
  90. package/dist/cjs/memory/recall.js.map +1 -0
  91. package/dist/cjs/memory/scene.d.ts.map +1 -0
  92. package/dist/cjs/memory/scene.js +101 -0
  93. package/dist/cjs/memory/scene.js.map +1 -0
  94. package/dist/cjs/memory/types.d.ts.map +1 -0
  95. package/dist/cjs/memory/types.js +6 -0
  96. package/dist/cjs/memory/types.js.map +1 -0
  97. package/dist/cjs/middleware/types.d.ts.map +1 -0
  98. package/dist/cjs/middleware/types.js +6 -0
  99. package/dist/cjs/middleware/types.js.map +1 -0
  100. package/dist/cjs/package.json +3 -0
  101. package/dist/cjs/sandbox/types.d.ts.map +1 -0
  102. package/dist/cjs/sandbox/types.js +128 -0
  103. package/dist/cjs/sandbox/types.js.map +1 -0
  104. package/dist/cjs/security/guard.d.ts.map +1 -0
  105. package/dist/cjs/security/guard.js +229 -0
  106. package/dist/cjs/security/guard.js.map +1 -0
  107. package/dist/cjs/security/types.d.ts.map +1 -0
  108. package/dist/cjs/security/types.js +6 -0
  109. package/dist/cjs/security/types.js.map +1 -0
  110. package/dist/cjs/skill/manager.d.ts.map +1 -0
  111. package/dist/cjs/skill/manager.js +413 -0
  112. package/dist/cjs/skill/manager.js.map +1 -0
  113. package/dist/cjs/skill/router.d.ts.map +1 -0
  114. package/dist/cjs/skill/router.js +139 -0
  115. package/dist/cjs/skill/router.js.map +1 -0
  116. package/dist/cjs/skill/types.d.ts.map +1 -0
  117. package/dist/cjs/skill/types.js +6 -0
  118. package/dist/cjs/skill/types.js.map +1 -0
  119. package/dist/cjs/tool/delegate.d.ts.map +1 -0
  120. package/dist/cjs/tool/delegate.js +78 -0
  121. package/dist/cjs/tool/delegate.js.map +1 -0
  122. package/dist/cjs/tool/registry.d.ts.map +1 -0
  123. package/dist/cjs/tool/registry.js +57 -0
  124. package/dist/cjs/tool/registry.js.map +1 -0
  125. package/dist/cjs/tool/types.d.ts.map +1 -0
  126. package/dist/cjs/tool/types.js +6 -0
  127. package/dist/cjs/tool/types.js.map +1 -0
  128. package/dist/cjs/types.d.ts.map +1 -0
  129. package/dist/cjs/types.js +6 -0
  130. package/dist/cjs/types.js.map +1 -0
  131. package/dist/cjs/utils/token-counter.d.ts.map +1 -0
  132. package/dist/cjs/utils/token-counter.js +104 -0
  133. package/dist/cjs/utils/token-counter.js.map +1 -0
  134. package/dist/esm/agent/engine.d.ts +113 -0
  135. package/dist/esm/agent/engine.d.ts.map +1 -0
  136. package/dist/esm/agent/engine.js +762 -0
  137. package/dist/esm/agent/engine.js.map +1 -0
  138. package/dist/esm/agent/history-manager.d.ts +78 -0
  139. package/dist/esm/agent/history-manager.d.ts.map +1 -0
  140. package/dist/esm/agent/history-manager.js +267 -0
  141. package/dist/esm/agent/history-manager.js.map +1 -0
  142. package/dist/esm/agent/llm-caller.d.ts +58 -0
  143. package/dist/esm/agent/llm-caller.d.ts.map +1 -0
  144. package/dist/esm/agent/llm-caller.js +303 -0
  145. package/dist/esm/agent/llm-caller.js.map +1 -0
  146. package/dist/esm/agent/tool-executor.d.ts +95 -0
  147. package/dist/esm/agent/tool-executor.d.ts.map +1 -0
  148. package/dist/esm/agent/tool-executor.js +564 -0
  149. package/dist/esm/agent/tool-executor.js.map +1 -0
  150. package/dist/esm/agent/types.d.ts +128 -0
  151. package/dist/esm/agent/types.d.ts.map +1 -0
  152. package/dist/esm/agent/types.js +5 -0
  153. package/dist/esm/agent/types.js.map +1 -0
  154. package/dist/esm/agent/workflow.d.ts +74 -0
  155. package/dist/esm/agent/workflow.d.ts.map +1 -0
  156. package/dist/esm/agent/workflow.js +248 -0
  157. package/dist/esm/agent/workflow.js.map +1 -0
  158. package/dist/esm/context/collector.d.ts +12 -0
  159. package/dist/esm/context/collector.d.ts.map +1 -0
  160. package/dist/esm/context/collector.js +57 -0
  161. package/dist/esm/context/collector.js.map +1 -0
  162. package/dist/esm/context/manager.d.ts +16 -0
  163. package/dist/esm/context/manager.d.ts.map +1 -0
  164. package/dist/esm/context/manager.js +32 -0
  165. package/dist/esm/context/manager.js.map +1 -0
  166. package/dist/esm/context/types.d.ts +39 -0
  167. package/dist/esm/context/types.d.ts.map +1 -0
  168. package/dist/esm/context/types.js +5 -0
  169. package/dist/esm/context/types.js.map +1 -0
  170. package/dist/esm/hooks/types.d.ts +47 -0
  171. package/dist/esm/hooks/types.d.ts.map +1 -0
  172. package/dist/esm/hooks/types.js +5 -0
  173. package/dist/esm/hooks/types.js.map +1 -0
  174. package/{src/index.ts → dist/esm/index.d.ts} +15 -140
  175. package/dist/esm/index.d.ts.map +1 -0
  176. package/dist/esm/index.js +39 -0
  177. package/dist/esm/index.js.map +1 -0
  178. package/dist/esm/llm/anthropic-provider.d.ts +28 -0
  179. package/dist/esm/llm/anthropic-provider.d.ts.map +1 -0
  180. package/dist/esm/llm/anthropic-provider.js +352 -0
  181. package/dist/esm/llm/anthropic-provider.js.map +1 -0
  182. package/{src/llm/factory.ts → dist/esm/llm/factory.d.ts} +3 -18
  183. package/dist/esm/llm/factory.d.ts.map +1 -0
  184. package/dist/esm/llm/factory.js +30 -0
  185. package/dist/esm/llm/factory.js.map +1 -0
  186. package/dist/esm/llm/ollama-provider.d.ts +13 -0
  187. package/dist/esm/llm/ollama-provider.d.ts.map +1 -0
  188. package/dist/esm/llm/ollama-provider.js +30 -0
  189. package/dist/esm/llm/ollama-provider.js.map +1 -0
  190. package/dist/esm/llm/openai-provider.d.ts +18 -0
  191. package/dist/esm/llm/openai-provider.d.ts.map +1 -0
  192. package/dist/esm/llm/openai-provider.js +182 -0
  193. package/dist/esm/llm/openai-provider.js.map +1 -0
  194. package/{src/llm/provider.ts → dist/esm/llm/provider.d.ts} +1 -9
  195. package/dist/esm/llm/provider.d.ts.map +1 -0
  196. package/dist/esm/llm/provider.js +10 -0
  197. package/dist/esm/llm/provider.js.map +1 -0
  198. package/dist/esm/llm/types.d.ts +78 -0
  199. package/dist/esm/llm/types.d.ts.map +1 -0
  200. package/dist/esm/llm/types.js +5 -0
  201. package/dist/esm/llm/types.js.map +1 -0
  202. package/dist/esm/mcp/base-client.d.ts +50 -0
  203. package/dist/esm/mcp/base-client.d.ts.map +1 -0
  204. package/dist/esm/mcp/base-client.js +108 -0
  205. package/dist/esm/mcp/base-client.js.map +1 -0
  206. package/dist/esm/mcp/client.d.ts +27 -0
  207. package/dist/esm/mcp/client.d.ts.map +1 -0
  208. package/dist/esm/mcp/client.js +70 -0
  209. package/dist/esm/mcp/client.js.map +1 -0
  210. package/dist/esm/mcp/factory.d.ts +16 -0
  211. package/dist/esm/mcp/factory.d.ts.map +1 -0
  212. package/dist/esm/mcp/factory.js +39 -0
  213. package/dist/esm/mcp/factory.js.map +1 -0
  214. package/dist/esm/mcp/http-client.d.ts +24 -0
  215. package/dist/esm/mcp/http-client.d.ts.map +1 -0
  216. package/dist/esm/mcp/http-client.js +138 -0
  217. package/dist/esm/mcp/http-client.js.map +1 -0
  218. package/dist/esm/mcp/proxy-agent.d.ts +49 -0
  219. package/dist/esm/mcp/proxy-agent.d.ts.map +1 -0
  220. package/dist/esm/mcp/proxy-agent.js +187 -0
  221. package/dist/esm/mcp/proxy-agent.js.map +1 -0
  222. package/dist/esm/mcp/stdio-client.d.ts +16 -0
  223. package/dist/esm/mcp/stdio-client.d.ts.map +1 -0
  224. package/dist/esm/mcp/stdio-client.js +91 -0
  225. package/dist/esm/mcp/stdio-client.js.map +1 -0
  226. package/dist/esm/mcp/types.d.ts +60 -0
  227. package/dist/esm/mcp/types.d.ts.map +1 -0
  228. package/dist/esm/mcp/types.js +5 -0
  229. package/dist/esm/mcp/types.js.map +1 -0
  230. package/dist/esm/memory/checkpoint.d.ts +62 -0
  231. package/dist/esm/memory/checkpoint.d.ts.map +1 -0
  232. package/dist/esm/memory/checkpoint.js +121 -0
  233. package/dist/esm/memory/checkpoint.js.map +1 -0
  234. package/dist/esm/memory/extractor.d.ts +59 -0
  235. package/dist/esm/memory/extractor.d.ts.map +1 -0
  236. package/dist/esm/memory/extractor.js +117 -0
  237. package/dist/esm/memory/extractor.js.map +1 -0
  238. package/dist/esm/memory/persona.d.ts +38 -0
  239. package/dist/esm/memory/persona.d.ts.map +1 -0
  240. package/dist/esm/memory/persona.js +75 -0
  241. package/dist/esm/memory/persona.js.map +1 -0
  242. package/dist/esm/memory/pipeline.d.ts +50 -0
  243. package/dist/esm/memory/pipeline.d.ts.map +1 -0
  244. package/dist/esm/memory/pipeline.js +144 -0
  245. package/dist/esm/memory/pipeline.js.map +1 -0
  246. package/dist/esm/memory/prompts.d.ts +9 -0
  247. package/dist/esm/memory/prompts.d.ts.map +1 -0
  248. package/{src/memory/prompts.ts → dist/esm/memory/prompts.js} +6 -13
  249. package/dist/esm/memory/prompts.js.map +1 -0
  250. package/dist/esm/memory/recall.d.ts +66 -0
  251. package/dist/esm/memory/recall.d.ts.map +1 -0
  252. package/dist/esm/memory/recall.js +159 -0
  253. package/dist/esm/memory/recall.js.map +1 -0
  254. package/dist/esm/memory/scene.d.ts +49 -0
  255. package/dist/esm/memory/scene.d.ts.map +1 -0
  256. package/dist/esm/memory/scene.js +97 -0
  257. package/dist/esm/memory/scene.js.map +1 -0
  258. package/dist/esm/memory/types.d.ts +43 -0
  259. package/dist/esm/memory/types.d.ts.map +1 -0
  260. package/dist/esm/memory/types.js +5 -0
  261. package/dist/esm/memory/types.js.map +1 -0
  262. package/dist/esm/middleware/types.d.ts +52 -0
  263. package/dist/esm/middleware/types.d.ts.map +1 -0
  264. package/dist/esm/middleware/types.js +5 -0
  265. package/dist/esm/middleware/types.js.map +1 -0
  266. package/dist/esm/package.json +3 -0
  267. package/dist/esm/sandbox/types.d.ts +59 -0
  268. package/dist/esm/sandbox/types.d.ts.map +1 -0
  269. package/dist/esm/sandbox/types.js +125 -0
  270. package/dist/esm/sandbox/types.js.map +1 -0
  271. package/dist/esm/security/guard.d.ts +41 -0
  272. package/dist/esm/security/guard.d.ts.map +1 -0
  273. package/dist/esm/security/guard.js +225 -0
  274. package/dist/esm/security/guard.js.map +1 -0
  275. package/dist/esm/security/types.d.ts +36 -0
  276. package/dist/esm/security/types.d.ts.map +1 -0
  277. package/dist/esm/security/types.js +5 -0
  278. package/dist/esm/security/types.js.map +1 -0
  279. package/dist/esm/skill/manager.d.ts +95 -0
  280. package/dist/esm/skill/manager.d.ts.map +1 -0
  281. package/dist/esm/skill/manager.js +376 -0
  282. package/dist/esm/skill/manager.js.map +1 -0
  283. package/dist/esm/skill/router.d.ts +26 -0
  284. package/dist/esm/skill/router.d.ts.map +1 -0
  285. package/dist/esm/skill/router.js +135 -0
  286. package/dist/esm/skill/router.js.map +1 -0
  287. package/dist/esm/skill/types.d.ts +55 -0
  288. package/dist/esm/skill/types.d.ts.map +1 -0
  289. package/dist/esm/skill/types.js +5 -0
  290. package/dist/esm/skill/types.js.map +1 -0
  291. package/dist/esm/tool/delegate.d.ts +34 -0
  292. package/dist/esm/tool/delegate.d.ts.map +1 -0
  293. package/dist/esm/tool/delegate.js +75 -0
  294. package/dist/esm/tool/delegate.js.map +1 -0
  295. package/dist/esm/tool/registry.d.ts +24 -0
  296. package/dist/esm/tool/registry.d.ts.map +1 -0
  297. package/dist/esm/tool/registry.js +53 -0
  298. package/dist/esm/tool/registry.js.map +1 -0
  299. package/dist/esm/tool/types.d.ts +101 -0
  300. package/dist/esm/tool/types.d.ts.map +1 -0
  301. package/dist/esm/tool/types.js +5 -0
  302. package/dist/esm/tool/types.js.map +1 -0
  303. package/dist/esm/types.d.ts +150 -0
  304. package/dist/esm/types.d.ts.map +1 -0
  305. package/dist/esm/types.js +5 -0
  306. package/dist/esm/types.js.map +1 -0
  307. package/dist/esm/utils/token-counter.d.ts +22 -0
  308. package/dist/esm/utils/token-counter.d.ts.map +1 -0
  309. package/dist/esm/utils/token-counter.js +99 -0
  310. package/dist/esm/utils/token-counter.js.map +1 -0
  311. package/package.json +16 -10
  312. package/dist/agent/engine.d.ts.map +0 -1
  313. package/dist/agent/history-manager.d.ts.map +0 -1
  314. package/dist/agent/llm-caller.d.ts.map +0 -1
  315. package/dist/agent/tool-executor.d.ts.map +0 -1
  316. package/dist/agent/types.d.ts.map +0 -1
  317. package/dist/agent/workflow.d.ts.map +0 -1
  318. package/dist/context/collector.d.ts.map +0 -1
  319. package/dist/context/manager.d.ts.map +0 -1
  320. package/dist/context/types.d.ts.map +0 -1
  321. package/dist/hooks/types.d.ts.map +0 -1
  322. package/dist/index.d.ts.map +0 -1
  323. package/dist/llm/anthropic-provider.d.ts.map +0 -1
  324. package/dist/llm/factory.d.ts.map +0 -1
  325. package/dist/llm/ollama-provider.d.ts.map +0 -1
  326. package/dist/llm/openai-provider.d.ts.map +0 -1
  327. package/dist/llm/provider.d.ts.map +0 -1
  328. package/dist/llm/types.d.ts.map +0 -1
  329. package/dist/mcp/base-client.d.ts.map +0 -1
  330. package/dist/mcp/client.d.ts.map +0 -1
  331. package/dist/mcp/factory.d.ts.map +0 -1
  332. package/dist/mcp/http-client.d.ts.map +0 -1
  333. package/dist/mcp/proxy-agent.d.ts.map +0 -1
  334. package/dist/mcp/stdio-client.d.ts.map +0 -1
  335. package/dist/mcp/types.d.ts.map +0 -1
  336. package/dist/memory/checkpoint.d.ts.map +0 -1
  337. package/dist/memory/extractor.d.ts.map +0 -1
  338. package/dist/memory/persona.d.ts.map +0 -1
  339. package/dist/memory/pipeline.d.ts.map +0 -1
  340. package/dist/memory/prompts.d.ts.map +0 -1
  341. package/dist/memory/recall.d.ts.map +0 -1
  342. package/dist/memory/scene.d.ts.map +0 -1
  343. package/dist/memory/types.d.ts.map +0 -1
  344. package/dist/middleware/types.d.ts.map +0 -1
  345. package/dist/sandbox/types.d.ts.map +0 -1
  346. package/dist/security/guard.d.ts.map +0 -1
  347. package/dist/security/types.d.ts.map +0 -1
  348. package/dist/skill/manager.d.ts.map +0 -1
  349. package/dist/skill/router.d.ts.map +0 -1
  350. package/dist/skill/types.d.ts.map +0 -1
  351. package/dist/tool/delegate.d.ts.map +0 -1
  352. package/dist/tool/registry.d.ts.map +0 -1
  353. package/dist/tool/types.d.ts.map +0 -1
  354. package/dist/types.d.ts.map +0 -1
  355. package/dist/utils/token-counter.d.ts.map +0 -1
  356. package/src/agent/engine.ts +0 -875
  357. package/src/agent/history-manager.ts +0 -323
  358. package/src/agent/llm-caller.ts +0 -383
  359. package/src/agent/tool-executor.ts +0 -713
  360. package/src/agent/types.ts +0 -136
  361. package/src/agent/workflow.ts +0 -339
  362. package/src/context/collector.ts +0 -59
  363. package/src/context/manager.ts +0 -40
  364. package/src/context/types.ts +0 -51
  365. package/src/hooks/types.ts +0 -77
  366. package/src/llm/anthropic-provider.ts +0 -412
  367. package/src/llm/ollama-provider.ts +0 -39
  368. package/src/llm/openai-provider.ts +0 -200
  369. package/src/llm/types.ts +0 -91
  370. package/src/mcp/base-client.ts +0 -159
  371. package/src/mcp/client.ts +0 -81
  372. package/src/mcp/factory.ts +0 -45
  373. package/src/mcp/http-client.ts +0 -149
  374. package/src/mcp/proxy-agent.ts +0 -227
  375. package/src/mcp/stdio-client.ts +0 -104
  376. package/src/mcp/types.ts +0 -65
  377. package/src/memory/checkpoint.ts +0 -146
  378. package/src/memory/extractor.ts +0 -164
  379. package/src/memory/persona.ts +0 -106
  380. package/src/memory/pipeline.ts +0 -192
  381. package/src/memory/recall.ts +0 -217
  382. package/src/memory/scene.ts +0 -137
  383. package/src/memory/types.ts +0 -54
  384. package/src/middleware/types.ts +0 -62
  385. package/src/sandbox/types.ts +0 -185
  386. package/src/security/guard.ts +0 -249
  387. package/src/security/types.ts +0 -46
  388. package/src/skill/manager.ts +0 -420
  389. package/src/skill/router.ts +0 -158
  390. package/src/skill/types.ts +0 -67
  391. package/src/tool/delegate.ts +0 -105
  392. package/src/tool/registry.ts +0 -64
  393. package/src/tool/types.ts +0 -124
  394. package/src/types.ts +0 -188
  395. package/src/utils/token-counter.ts +0 -108
  396. /package/dist/{agent → cjs/agent}/engine.d.ts +0 -0
  397. /package/dist/{agent → cjs/agent}/history-manager.d.ts +0 -0
  398. /package/dist/{agent → cjs/agent}/llm-caller.d.ts +0 -0
  399. /package/dist/{agent → cjs/agent}/tool-executor.d.ts +0 -0
  400. /package/dist/{agent → cjs/agent}/types.d.ts +0 -0
  401. /package/dist/{agent → cjs/agent}/workflow.d.ts +0 -0
  402. /package/dist/{context → cjs/context}/collector.d.ts +0 -0
  403. /package/dist/{context → cjs/context}/manager.d.ts +0 -0
  404. /package/dist/{context → cjs/context}/types.d.ts +0 -0
  405. /package/dist/{hooks → cjs/hooks}/types.d.ts +0 -0
  406. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  407. /package/dist/{llm → cjs/llm}/anthropic-provider.d.ts +0 -0
  408. /package/dist/{llm → cjs/llm}/factory.d.ts +0 -0
  409. /package/dist/{llm → cjs/llm}/ollama-provider.d.ts +0 -0
  410. /package/dist/{llm → cjs/llm}/openai-provider.d.ts +0 -0
  411. /package/dist/{llm → cjs/llm}/provider.d.ts +0 -0
  412. /package/dist/{llm → cjs/llm}/types.d.ts +0 -0
  413. /package/dist/{mcp → cjs/mcp}/base-client.d.ts +0 -0
  414. /package/dist/{mcp → cjs/mcp}/client.d.ts +0 -0
  415. /package/dist/{mcp → cjs/mcp}/factory.d.ts +0 -0
  416. /package/dist/{mcp → cjs/mcp}/http-client.d.ts +0 -0
  417. /package/dist/{mcp → cjs/mcp}/proxy-agent.d.ts +0 -0
  418. /package/dist/{mcp → cjs/mcp}/stdio-client.d.ts +0 -0
  419. /package/dist/{mcp → cjs/mcp}/types.d.ts +0 -0
  420. /package/dist/{memory → cjs/memory}/checkpoint.d.ts +0 -0
  421. /package/dist/{memory → cjs/memory}/extractor.d.ts +0 -0
  422. /package/dist/{memory → cjs/memory}/persona.d.ts +0 -0
  423. /package/dist/{memory → cjs/memory}/pipeline.d.ts +0 -0
  424. /package/dist/{memory → cjs/memory}/prompts.d.ts +0 -0
  425. /package/dist/{memory → cjs/memory}/recall.d.ts +0 -0
  426. /package/dist/{memory → cjs/memory}/scene.d.ts +0 -0
  427. /package/dist/{memory → cjs/memory}/types.d.ts +0 -0
  428. /package/dist/{middleware → cjs/middleware}/types.d.ts +0 -0
  429. /package/dist/{sandbox → cjs/sandbox}/types.d.ts +0 -0
  430. /package/dist/{security → cjs/security}/guard.d.ts +0 -0
  431. /package/dist/{security → cjs/security}/types.d.ts +0 -0
  432. /package/dist/{skill → cjs/skill}/manager.d.ts +0 -0
  433. /package/dist/{skill → cjs/skill}/router.d.ts +0 -0
  434. /package/dist/{skill → cjs/skill}/types.d.ts +0 -0
  435. /package/dist/{tool → cjs/tool}/delegate.d.ts +0 -0
  436. /package/dist/{tool → cjs/tool}/registry.d.ts +0 -0
  437. /package/dist/{tool → cjs/tool}/types.d.ts +0 -0
  438. /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
  439. /package/dist/{utils → cjs/utils}/token-counter.d.ts +0 -0
@@ -1,323 +0,0 @@
1
- // ============================================================
2
- // HistoryManager — 会话历史管理(滑动窗口 + 智能压缩)
3
- // ============================================================
4
-
5
- import type { Message, ToolCall } from '../types.ts';
6
- import type { ToolResultStore, OffloadEntry } from './types.ts';
7
- import { countMessageTokens } from '../utils/token-counter.ts';
8
-
9
- /** 历史管理配置 */
10
- export interface HistoryManagerConfig {
11
- /** 消息历史上限(滑动窗口),默认 50 */
12
- maxMessages: number;
13
- /** 上下文压缩配置 */
14
- contextBudget?: {
15
- maxToolOutput?: number;
16
- compactThreshold?: number;
17
- maxContextTokens?: number;
18
- };
19
- /** 工具结果存储(可选) */
20
- toolResultStore?: ToolResultStore;
21
- }
22
-
23
- /**
24
- * 会话历史管理器
25
- *
26
- * 职责:
27
- * - 维护 per-session 的消息历史(滑动窗口)
28
- * - 多级智能压缩(token 感知)
29
- * - Offload 大工具结果到外部存储
30
- */
31
- export class HistoryManager {
32
- private config: HistoryManagerConfig;
33
- /** sessionId → Message[](会话历史,滑动窗口) */
34
- private historyMap = new Map<string, Message[]>();
35
- /** sessionId → 当前 token 总数(增量维护,避免全量重算) */
36
- private tokenCountMap = new Map<string, number>();
37
-
38
- constructor(config: HistoryManagerConfig) {
39
- this.config = config;
40
- }
41
-
42
- // ---- 公开接口 ----
43
-
44
- /** 注入会话历史(从外部恢复,如持久化存储) */
45
- setHistory(sessionId: string, messages: Message[]): void {
46
- this.historyMap.set(sessionId, [...messages]);
47
- // 重建 token 计数
48
- this.tokenCountMap.set(sessionId, countMessageTokens(messages));
49
- }
50
-
51
- /** 获取会话历史副本(用于持久化保存) */
52
- getHistorySnapshot(sessionId: string): Message[] {
53
- return [...(this.historyMap.get(sessionId) || [])];
54
- }
55
-
56
- /** 获取会话历史副本(用于构建 LLM 请求) */
57
- getHistory(sessionId: string): Message[] {
58
- return [...(this.historyMap.get(sessionId) || [])];
59
- }
60
-
61
- /** 追加消息到会话历史(含自动压缩) */
62
- addHistory(sessionId: string, msg: Message): void {
63
- if (!this.historyMap.has(sessionId)) {
64
- this.historyMap.set(sessionId, []);
65
- }
66
- const history = this.historyMap.get(sessionId)!;
67
- history.push(msg);
68
-
69
- // 增量 token 计数
70
- const addedTokens = countMessageTokens([msg]);
71
- const currentTokens = (this.tokenCountMap.get(sessionId) || 0) + addedTokens;
72
- this.tokenCountMap.set(sessionId, currentTokens);
73
-
74
- // Level 1: token 预算压缩
75
- const maxTokens = this.config.contextBudget?.maxContextTokens ?? 100000;
76
- if (currentTokens > maxTokens) {
77
- this.compactHistorySmart(history, maxTokens, sessionId);
78
- // 压缩后重算 token 数
79
- this.tokenCountMap.set(sessionId, countMessageTokens(history));
80
- }
81
-
82
- // Level 2: 成对裁剪(消息数超过阈值时触发)
83
- const threshold = this.config.contextBudget?.compactThreshold
84
- ?? Math.floor(this.config.maxMessages * 0.8);
85
- if (history.length > threshold) {
86
- this.compactHistoryPairs(history);
87
- }
88
-
89
- // 安全兜底:极端情况下仍使用滑动窗口
90
- while (history.length > this.config.maxMessages) {
91
- history.shift();
92
- }
93
- }
94
-
95
- /** 清理指定会话的历史 */
96
- clearHistory(sessionId: string): void {
97
- this.historyMap.delete(sessionId);
98
- this.tokenCountMap.delete(sessionId);
99
- }
100
-
101
- /** 清理所有会话历史 */
102
- clearAll(): void {
103
- this.historyMap.clear();
104
- this.tokenCountMap.clear();
105
- }
106
-
107
- // ---- 工具输出处理(智能截断 + 文件化)----
108
-
109
- /** 不应被 offload 的读取类工具(避免 offload → read → offload 无限链) */
110
- private static READ_THROUGH_TOOLS = new Set(['read_offload', 'read_tool_result']);
111
-
112
- /**
113
- * 处理工具输出:
114
- * - 小结果直接返回
115
- * - 大结果写入 OffloadStore,返回摘要标签(保留 100% 可溯源)
116
- * - 无 OffloadStore 时回退到截断
117
- */
118
- processToolOutput(output: string, callId: string, toolName?: string, sessionId?: string): string {
119
- const max = this.config.contextBudget?.maxToolOutput ?? 8000;
120
-
121
- // 读取类工具:直接返回完整内容,不做 offload(避免无限链)
122
- if (toolName && HistoryManager.READ_THROUGH_TOOLS.has(toolName)) {
123
- return output.length <= max ? output : this.truncateOutput(output);
124
- }
125
-
126
- // 普通工具:在 maxToolOutput 预算内直接返回,超出则 offload
127
- const offloadThreshold = max;
128
- if (output.length <= offloadThreshold) return output;
129
-
130
- // 优先使用 OffloadStore(非破坏性卸载)
131
- const store = this.config.toolResultStore;
132
- if (store && sessionId) {
133
- const nodeId = `${toolName || 'tool'}_${Date.now()}_${Math.abs(HistoryManager.simpleHash(output)).toString(36)}`;
134
- const preview = output.slice(0, 300).replace(/\n/g, ' ').trim();
135
- store.writeOffload(
136
- { nodeId, toolName: toolName || 'unknown', summary: preview, createdAt: Date.now(), charCount: output.length, sessionId },
137
- output
138
- );
139
- // 同时写入 toolResultStore(按 callId),让 read_tool_result 也能找到
140
- store.write(callId, output);
141
- return (
142
- `[offload:${nodeId}] ${toolName || 'tool'}: ${preview.slice(0, 150)}... ` +
143
- `(${output.length} chars offloaded, use read_offload(node_id="${nodeId}") or read_tool_result(call_id="${callId}") to retrieve) [/offload]`
144
- );
145
- }
146
-
147
- // 回退:超大结果写入文件
148
- if (output.length > max && store) {
149
- const filePath = store.write(callId, output);
150
- const previewLen = Math.min(200, Math.floor(max * 0.1));
151
- const preview = output.slice(0, previewLen);
152
- return (
153
- `[Result saved to file: ${output.length} chars → ${filePath}]\n` +
154
- `Preview:\n${preview}...\n\n` +
155
- `Use read_tool_result(call_id="${callId}") to read full content.`
156
- );
157
- }
158
-
159
- // 无 store 时回退到截断
160
- return this.truncateOutput(output);
161
- }
162
-
163
- /**
164
- * 压缩消息列表(公开接口,供 LLMCaller 在上下文过长时调用)
165
- *
166
- * 使用与 addHistory 相同的多级压缩策略,但直接作用于传入的 messages 数组。
167
- * 返回压缩后的 token 估算值。
168
- */
169
- compressMessages(messages: Message[], targetTokens?: number): number {
170
- const maxTokens = targetTokens ?? this.config.contextBudget?.maxContextTokens ?? 100000;
171
- // 更激进的目标:压缩到 70% 的预算,给 system prompt + tool defs 留空间
172
- const aggressiveTarget = Math.floor(maxTokens * 0.7);
173
- this.compactHistorySmart(messages, aggressiveTarget, '__compress__');
174
- return countMessageTokens(messages);
175
- }
176
-
177
- // ---- 内部方法:智能压缩 ----
178
-
179
- /** Level 1: 智能压缩(token 感知多级压缩管道) */
180
- private compactHistorySmart(history: Message[], targetTokens: number, sessionId: string): void {
181
- // 阶段 1: 卸载超长工具参数
182
- this.offloadToolArguments(history);
183
- if (countMessageTokens(history) <= targetTokens) return;
184
-
185
- // 阶段 2: 卸载 base64 数据块
186
- this.offloadBase64Content(history);
187
- if (countMessageTokens(history) <= targetTokens) return;
188
-
189
- // 阶段 3: 将大工具结果卸载到 OffloadStore(非破坏性,保留溯源)
190
- this.offloadLargeToolResults(history, sessionId);
191
- if (countMessageTokens(history) <= targetTokens) return;
192
-
193
- // 阶段 4: 截断大工具结果(无 OffloadStore 时回退)
194
- this.truncateLargeToolResults(history);
195
- if (countMessageTokens(history) <= targetTokens) return;
196
-
197
- // 阶段 5: 消息对裁剪(兜底)
198
- this.compactHistoryPairs(history);
199
- }
200
-
201
- /** 压缩阶段 1: 卸载超长工具参数 */
202
- private offloadToolArguments(history: Message[]): void {
203
- const maxArgsLen = 500;
204
- for (const msg of history) {
205
- if (msg.role === 'assistant' && msg.tool_calls) {
206
- for (const tc of msg.tool_calls) {
207
- if (tc.function.arguments && tc.function.arguments.length > maxArgsLen) {
208
- try {
209
- const parsed = JSON.parse(tc.function.arguments);
210
- const summary: Record<string, string> = {};
211
- for (const [key, value] of Object.entries(parsed)) {
212
- const val = typeof value === 'string' ? value : JSON.stringify(value);
213
- summary[key] = val.length > 50 ? val.slice(0, 50) + '...' : val;
214
- }
215
- tc.function.arguments = JSON.stringify(summary);
216
- } catch {
217
- tc.function.arguments = `[args: ${tc.function.arguments.length} chars]`;
218
- }
219
- }
220
- }
221
- }
222
- }
223
- }
224
-
225
- /** 压缩阶段 2: 卸载 base64 数据块 */
226
- private offloadBase64Content(history: Message[]): void {
227
- const base64Pattern = /[A-Za-z0-9+/]{200,}={0,2}/g;
228
- for (const msg of history) {
229
- if (msg.role === 'tool' && typeof msg.content === 'string' && msg.content.length > 500) {
230
- msg.content = msg.content.replace(base64Pattern, (match) => {
231
- return `[base64: ${match.length} chars]`;
232
- });
233
- }
234
- }
235
- }
236
-
237
- /** 压缩阶段 3: 非破坏性卸载大工具结果 */
238
- private offloadLargeToolResults(history: Message[], sessionId: string): void {
239
- const store = this.config.toolResultStore;
240
- if (!store) return;
241
-
242
- const offloadThreshold = 2000;
243
- for (const msg of history) {
244
- if (msg.role !== 'tool' || typeof msg.content !== 'string') continue;
245
- if (msg.content.length <= offloadThreshold) continue;
246
- if (/^\[offload:/.test(msg.content)) continue;
247
-
248
- const toolName = HistoryManager.findToolNameForCallId(msg.tool_call_id || '', history);
249
- const nodeId = `${toolName}_${Date.now()}_${Math.abs(HistoryManager.simpleHash(msg.content)).toString(36)}`;
250
- const preview = msg.content.slice(0, 300).replace(/\n/g, ' ').trim();
251
-
252
- store.writeOffload(
253
- { nodeId, toolName, summary: preview, createdAt: Date.now(), charCount: msg.content.length, sessionId },
254
- msg.content
255
- );
256
-
257
- msg.content = (
258
- `[offload:${nodeId}] ${toolName}: ${preview.slice(0, 150)}... ` +
259
- `(${msg.content.length} chars offloaded, use read_offload(node_id="${nodeId}") to retrieve) [/offload]`
260
- );
261
- }
262
- }
263
-
264
- /** 压缩阶段 4: 截断大工具结果 */
265
- private truncateLargeToolResults(history: Message[]): void {
266
- const maxResultLen = this.config.contextBudget?.maxToolOutput ?? 8000;
267
- for (const msg of history) {
268
- if (msg.role === 'tool' && typeof msg.content === 'string' && msg.content.length > maxResultLen) {
269
- const headLen = Math.floor(maxResultLen * 0.4);
270
- const tailLen = Math.floor(maxResultLen * 0.4);
271
- msg.content = msg.content.slice(0, headLen)
272
- + `\n\n... [${msg.content.length - headLen - tailLen} characters truncated] ...\n\n`
273
- + msg.content.slice(-tailLen);
274
- }
275
- }
276
- }
277
-
278
- /** Level 2: 成对裁剪历史(移除最早的 assistant + 关联 tool 消息) */
279
- private compactHistoryPairs(history: Message[]): void {
280
- const keepCount = Math.floor(this.config.maxMessages * 0.5);
281
- while (history.length > keepCount) {
282
- const idx = history.findIndex(m => m.role === 'assistant');
283
- if (idx === -1) break;
284
- history.splice(idx, 1);
285
- while (idx < history.length && history[idx]?.role === 'tool') {
286
- history.splice(idx, 1);
287
- }
288
- }
289
- }
290
-
291
- /** 截断工具输出(保留首尾,中间省略) */
292
- private truncateOutput(output: string): string {
293
- const max = this.config.contextBudget?.maxToolOutput ?? 8000;
294
- if (output.length <= max) return output;
295
- const headLen = Math.floor(max * 0.4);
296
- const tailLen = Math.floor(max * 0.4);
297
- return output.slice(0, headLen)
298
- + `\n\n... [${output.length - headLen - tailLen} characters omitted] ...\n\n`
299
- + output.slice(-tailLen);
300
- }
301
-
302
- // ---- 静态辅助 ----
303
-
304
- /** 根据 tool_call_id 从历史中查找工具名 */
305
- static findToolNameForCallId(callId: string, history: Message[]): string {
306
- for (const msg of history) {
307
- if (msg.role === 'assistant' && msg.tool_calls) {
308
- const match = msg.tool_calls.find(tc => tc.id === callId);
309
- if (match) return match.function.name;
310
- }
311
- }
312
- return 'unknown_tool';
313
- }
314
-
315
- /** DJB2 哈希(用于生成短 nodeId) */
316
- static simpleHash(str: string): number {
317
- let hash = 5381;
318
- for (let i = 0; i < str.length; i++) {
319
- hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;
320
- }
321
- return hash;
322
- }
323
- }
@@ -1,383 +0,0 @@
1
- // ============================================================
2
- // LLMCaller — LLM 调用 + 重试 + 降级
3
- // ============================================================
4
-
5
- import type { AgentEvent, Message, ToolCall, TokenUsage } from '../types.ts';
6
- import type { LLMProvider } from '../llm/types.ts';
7
- import type { ToolDefinition } from '../tool/types.ts';
8
- import type { RetryPolicy } from './types.ts';
9
- import type { HookEvent, HookContext, HookResult } from '../hooks/types.ts';
10
- import type { HistoryManager } from './history-manager.ts';
11
-
12
- /** LLM 调用配置 */
13
- export interface LLMCallerConfig {
14
- /** 主 LLM Provider */
15
- llmProvider: LLMProvider;
16
- /** 降级 LLM Provider(可选) */
17
- fallbackProvider?: LLMProvider;
18
- /** 重试策略 */
19
- retryPolicy?: RetryPolicy;
20
- /** LLM 推理超时(毫秒) */
21
- llmTimeout: number;
22
- /** Hook 执行器(由 Engine 注入) */
23
- runHooks: (event: HookEvent, ctx: HookContext) => Promise<HookResult[]>;
24
- /** 事件创建辅助(由 Engine 注入) */
25
- createEvent: (sessionId: string, event: Record<string, unknown>) => AgentEvent;
26
- /** 历史管理器(可选,用于上下文过长时压缩) */
27
- historyManager?: HistoryManager;
28
- }
29
-
30
- /** 单次 LLM 调用结果 */
31
- export interface LLMCallResult {
32
- /** 完整的 assistant message */
33
- assistant: Message;
34
- /** 本次调用消耗的 token */
35
- usage?: TokenUsage;
36
- }
37
-
38
- /**
39
- * LLM 调用管理器
40
- *
41
- * 职责:
42
- * - 流式调用 LLM(支持 tool_calls 累积)
43
- * - 重试 + 指数退避
44
- * - 主 Provider → Fallback Provider 降级
45
- */
46
- export class LLMCaller {
47
- private config: LLMCallerConfig;
48
-
49
- constructor(config: LLMCallerConfig) {
50
- this.config = config;
51
- }
52
-
53
- /** 更新主 Provider(热更新场景) */
54
- updateProvider(provider: LLMProvider): void {
55
- this.config.llmProvider = provider;
56
- }
57
-
58
- /**
59
- * 带重试和降级的 LLM 调用
60
- * 返回 assistant message 或 null(所有尝试失败)
61
- *
62
- * 特殊处理:当 API 返回“输入过长”错误时,自动压缩历史并重试(最多一次)
63
- */
64
- async *callWithRetry(
65
- sessionId: string,
66
- messages: Message[],
67
- toolDefs: ToolDefinition[],
68
- abortSignal: AbortSignal,
69
- ): AsyncGenerator<AgentEvent, Message | null> {
70
- const policy = this.config.retryPolicy;
71
- const maxRetries = policy?.maxRetries ?? 0;
72
- const initialDelay = policy?.initialDelay ?? 1000;
73
- const maxDelay = policy?.maxDelay ?? 30000;
74
- const backoffFactor = policy?.backoffFactor ?? 2;
75
-
76
- // 尝试主 Provider
77
- const { result: firstResult, contextTooLong } = yield* this.callOnceWithDiag(sessionId, messages, toolDefs, abortSignal, this.config.llmProvider, false);
78
- if (firstResult !== null) return firstResult;
79
-
80
- // 上下文过长:压缩后重试(仅一次)
81
- if (contextTooLong && this.config.historyManager) {
82
- const tokensAfter = this.config.historyManager.compressMessages(messages);
83
- console.log(`[LLMCaller] Context too long, compressed to ~${tokensAfter} tokens, retrying...`);
84
- yield this.config.createEvent(sessionId, {
85
- type: 'thinking',
86
- content: `🔄 Context too long, compressed history and retrying...`,
87
- });
88
- const { result } = yield* this.callOnceWithDiag(sessionId, messages, toolDefs, abortSignal, this.config.llmProvider, false);
89
- if (result !== null) return result;
90
- }
91
-
92
- // 重试主 Provider
93
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
94
- if (abortSignal.aborted) return null;
95
-
96
- const delay = Math.min(initialDelay * Math.pow(backoffFactor, attempt - 1), maxDelay);
97
- const providerName = this.config.llmProvider.getModel().provider || 'primary';
98
-
99
- yield this.config.createEvent(sessionId, {
100
- type: 'retry',
101
- attempt,
102
- maxRetries,
103
- delay,
104
- error: `LLM call failed, retrying...`,
105
- provider: providerName,
106
- });
107
-
108
- await sleep(delay);
109
- if (abortSignal.aborted) return null;
110
-
111
- const { result } = yield* this.callOnceWithDiag(sessionId, messages, toolDefs, abortSignal, this.config.llmProvider, false);
112
- if (result !== null) return result;
113
- }
114
-
115
- // 主 Provider 重试耗尽,尝试 fallback
116
- if (this.config.fallbackProvider) {
117
- const fallbackName = this.config.fallbackProvider.getModel().provider || 'fallback';
118
- console.log(`[LLMCaller] Primary provider exhausted retries, switching to fallback: ${fallbackName}`);
119
-
120
- yield this.config.createEvent(sessionId, {
121
- type: 'retry',
122
- attempt: maxRetries + 1,
123
- maxRetries,
124
- delay: 0,
125
- error: `Switching to fallback provider: ${fallbackName}`,
126
- provider: fallbackName,
127
- });
128
-
129
- const { result } = yield* this.callOnceWithDiag(sessionId, messages, toolDefs, abortSignal, this.config.fallbackProvider, true);
130
- if (result !== null) return result;
131
- }
132
-
133
- // 所有尝试失败
134
- const errorMsg = 'All LLM providers failed after retries';
135
- await this.config.runHooks('on_error', { sessionId, iteration: 0, error: errorMsg, recoverable: false });
136
- yield this.config.createEvent(sessionId, { type: 'error', error: errorMsg, recoverable: false });
137
- return null;
138
- }
139
-
140
- /** 是否为“上下文过长”错误 */
141
- private isContextTooLongError(err: any): boolean {
142
- const msg = (err?.message || '').toLowerCase();
143
- return msg.includes('too long') || msg.includes('input length') ||
144
- msg.includes('context length') || msg.includes('too many tokens') ||
145
- msg.includes('maximum context') || msg.includes('max_tokens');
146
- }
147
-
148
- /** 单次 LLM 调用(流式),带诊断信息 */
149
- private async *callOnceWithDiag(
150
- sessionId: string,
151
- messages: Message[],
152
- toolDefs: ToolDefinition[],
153
- abortSignal: AbortSignal,
154
- provider: LLMProvider,
155
- isFallback: boolean,
156
- ): AsyncGenerator<AgentEvent, { result: Message | null; contextTooLong: boolean }> {
157
- try {
158
- // Hook: before_ll_call(仅主 Provider 首次调用时触发)
159
- if (!isFallback) {
160
- await this.config.runHooks('before_ll_call', {
161
- sessionId,
162
- iteration: 0,
163
- messages,
164
- tools: toolDefs,
165
- });
166
- }
167
-
168
- // 使用流式 API
169
- const stream = provider.chatStream({
170
- messages,
171
- tools: toolDefs.length > 0 ? toolDefs : undefined,
172
- toolChoice: toolDefs.length > 0 ? 'auto' : undefined,
173
- abortSignal,
174
- });
175
-
176
- // 累积流式数据
177
- let contentParts: string[] = [];
178
- let reasoningParts: string[] = [];
179
- const toolCallsMap = new Map<number, { id: string; name: string; args: string }>();
180
- let role: 'system' | 'user' | 'assistant' | 'tool' = 'assistant';
181
- let chunkUsage: TokenUsage | undefined;
182
- let toolStreamingLastEmit = 0;
183
-
184
- for await (const chunk of stream) {
185
- if (abortSignal.aborted) break;
186
-
187
- if (chunk.usage) {
188
- chunkUsage = chunk.usage;
189
- }
190
-
191
- const delta = chunk.delta;
192
-
193
- if (delta.reasoning_content) {
194
- reasoningParts.push(delta.reasoning_content);
195
- yield this.config.createEvent(sessionId, { type: 'thinking', content: delta.reasoning_content });
196
- }
197
-
198
- if (delta.content) {
199
- contentParts.push(delta.content);
200
- yield this.config.createEvent(sessionId, { type: 'message', content: delta.content, delta: true });
201
- }
202
-
203
- if (delta.tool_calls) {
204
- for (const tc of delta.tool_calls as any[]) {
205
- const idx = tc.index ?? 0;
206
- if (!toolCallsMap.has(idx)) {
207
- toolCallsMap.set(idx, { id: '', name: '', args: '' });
208
- }
209
- const entry = toolCallsMap.get(idx)!;
210
- if (tc.id) entry.id = tc.id;
211
- if (tc.function?.name) entry.name = tc.function.name;
212
- if (tc.function?.arguments) entry.args += tc.function.arguments;
213
- }
214
- const totalLen = Array.from(toolCallsMap.values()).reduce((s, e) => s + e.args.length, 0);
215
- const threshold = Math.max(toolStreamingLastEmit * 2, 500);
216
- if (totalLen - toolStreamingLastEmit >= threshold) {
217
- toolStreamingLastEmit = totalLen;
218
- const names = Array.from(toolCallsMap.values()).map(e => e.name || 'tool').join(', ');
219
- yield this.config.createEvent(sessionId, {
220
- type: 'thinking',
221
- content: `⏳ Generating ${names} parameters (${totalLen} chars)...`,
222
- });
223
- }
224
- }
225
-
226
- if (delta.role) role = delta.role;
227
- }
228
-
229
- const fullContent = contentParts.join('') || null;
230
- const fullReasoning = reasoningParts.join('') || null;
231
- const toolCalls: ToolCall[] = [];
232
-
233
- const sortedEntries = Array.from(toolCallsMap.entries()).sort((a, b) => a[0] - b[0]);
234
- for (const [, entry] of sortedEntries) {
235
- if (entry.id && entry.name) {
236
- toolCalls.push({
237
- id: entry.id,
238
- type: 'function',
239
- function: { name: entry.name, arguments: entry.args },
240
- });
241
- }
242
- }
243
-
244
- const assistant: Message = {
245
- role,
246
- content: fullContent,
247
- ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),
248
- ...(fullReasoning ? { reasoning_content: fullReasoning } : {}),
249
- };
250
-
251
- if (!fullContent && toolCalls.length === 0) {
252
- return { result: null, contextTooLong: false };
253
- }
254
-
255
- return { result: assistant, contextTooLong: false };
256
- } catch (err: any) {
257
- const contextTooLong = this.isContextTooLongError(err);
258
- console.warn(`[LLMCaller] LLM call failed (${isFallback ? 'fallback' : 'primary'})${contextTooLong ? ' [CONTEXT_TOO_LONG]' : ''}:`, err?.message || err);
259
- return { result: null, contextTooLong };
260
- }
261
- }
262
-
263
- /** 单次 LLM 调用(流式),返回 assistant message 或 null(保留向后兼容) */
264
- private async *callOnce(
265
- sessionId: string,
266
- messages: Message[],
267
- toolDefs: ToolDefinition[],
268
- abortSignal: AbortSignal,
269
- provider: LLMProvider,
270
- isFallback: boolean,
271
- ): AsyncGenerator<AgentEvent, Message | null> {
272
- try {
273
- // Hook: before_ll_call(仅主 Provider 首次调用时触发)
274
- if (!isFallback) {
275
- await this.config.runHooks('before_ll_call', {
276
- sessionId,
277
- iteration: 0,
278
- messages,
279
- tools: toolDefs,
280
- });
281
- }
282
-
283
- // 使用流式 API
284
- const stream = provider.chatStream({
285
- messages,
286
- tools: toolDefs.length > 0 ? toolDefs : undefined,
287
- toolChoice: toolDefs.length > 0 ? 'auto' : undefined,
288
- abortSignal,
289
- });
290
-
291
- // 累积流式数据
292
- let contentParts: string[] = [];
293
- let reasoningParts: string[] = [];
294
- const toolCallsMap = new Map<number, { id: string; name: string; args: string }>();
295
- let role: 'system' | 'user' | 'assistant' | 'tool' = 'assistant';
296
- let chunkUsage: TokenUsage | undefined;
297
- let toolStreamingLastEmit = 0; // 工具参数流式生成进度追踪
298
-
299
- for await (const chunk of stream) {
300
- if (abortSignal.aborted) break;
301
-
302
- if (chunk.usage) {
303
- chunkUsage = chunk.usage;
304
- }
305
-
306
- const delta = chunk.delta;
307
-
308
- if (delta.reasoning_content) {
309
- reasoningParts.push(delta.reasoning_content);
310
- yield this.config.createEvent(sessionId, { type: 'thinking', content: delta.reasoning_content });
311
- }
312
-
313
- if (delta.content) {
314
- contentParts.push(delta.content);
315
- yield this.config.createEvent(sessionId, { type: 'message', content: delta.content, delta: true });
316
- }
317
-
318
- if (delta.tool_calls) {
319
- for (const tc of delta.tool_calls as any[]) {
320
- const idx = tc.index ?? 0;
321
- if (!toolCallsMap.has(idx)) {
322
- toolCallsMap.set(idx, { id: '', name: '', args: '' });
323
- }
324
- const entry = toolCallsMap.get(idx)!;
325
- if (tc.id) entry.id = tc.id;
326
- if (tc.function?.name) entry.name = tc.function.name;
327
- if (tc.function?.arguments) entry.args += tc.function.arguments;
328
- }
329
- // 工具参数流式生成时,定期发出 thinking 事件让 UI 有可见进度
330
- const totalLen = Array.from(toolCallsMap.values()).reduce((s, e) => s + e.args.length, 0);
331
- const threshold = Math.max(toolStreamingLastEmit * 2, 500);
332
- if (totalLen - toolStreamingLastEmit >= threshold) {
333
- toolStreamingLastEmit = totalLen;
334
- const names = Array.from(toolCallsMap.values()).map(e => e.name || 'tool').join(', ');
335
- yield this.config.createEvent(sessionId, {
336
- type: 'thinking',
337
- content: `⏳ Generating ${names} parameters (${totalLen} chars)...`,
338
- });
339
- }
340
- }
341
-
342
- if (delta.role) role = delta.role;
343
- }
344
-
345
- // 组装完整 assistant message
346
- const fullContent = contentParts.join('') || null;
347
- const fullReasoning = reasoningParts.join('') || null;
348
- const toolCalls: ToolCall[] = [];
349
-
350
- const sortedEntries = Array.from(toolCallsMap.entries()).sort((a, b) => a[0] - b[0]);
351
- for (const [, entry] of sortedEntries) {
352
- if (entry.id && entry.name) {
353
- toolCalls.push({
354
- id: entry.id,
355
- type: 'function',
356
- function: { name: entry.name, arguments: entry.args },
357
- });
358
- }
359
- }
360
-
361
- const assistant: Message = {
362
- role,
363
- content: fullContent,
364
- ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),
365
- ...(fullReasoning ? { reasoning_content: fullReasoning } : {}),
366
- };
367
-
368
- if (!fullContent && toolCalls.length === 0) {
369
- return null; // 空响应,由重试逻辑处理
370
- }
371
-
372
- return assistant;
373
- } catch (err: any) {
374
- console.warn(`[LLMCaller] LLM call failed (${isFallback ? 'fallback' : 'primary'}):`, err?.message || err);
375
- return null;
376
- }
377
- }
378
- }
379
-
380
- /** 辅助:异步延迟 */
381
- function sleep(ms: number): Promise<void> {
382
- return new Promise(resolve => setTimeout(resolve, ms));
383
- }