@cicctencent/agent-core 0.1.1 → 0.1.4

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 (441) hide show
  1. package/README.md +14 -927
  2. package/dist/cjs/agent/engine.d.ts.map +1 -0
  3. package/dist/cjs/agent/engine.js +766 -0
  4. package/dist/cjs/agent/engine.js.map +1 -0
  5. package/dist/cjs/agent/history-manager.d.ts.map +1 -0
  6. package/dist/cjs/agent/history-manager.js +271 -0
  7. package/dist/cjs/agent/history-manager.js.map +1 -0
  8. package/dist/cjs/agent/llm-caller.d.ts.map +1 -0
  9. package/dist/cjs/agent/llm-caller.js +307 -0
  10. package/dist/cjs/agent/llm-caller.js.map +1 -0
  11. package/dist/cjs/agent/tool-executor.d.ts.map +1 -0
  12. package/dist/cjs/agent/tool-executor.js +568 -0
  13. package/dist/cjs/agent/tool-executor.js.map +1 -0
  14. package/dist/cjs/agent/types.d.ts.map +1 -0
  15. package/dist/cjs/agent/types.js +6 -0
  16. package/dist/cjs/agent/types.js.map +1 -0
  17. package/dist/cjs/agent/workflow.d.ts.map +1 -0
  18. package/dist/cjs/agent/workflow.js +262 -0
  19. package/dist/cjs/agent/workflow.js.map +1 -0
  20. package/dist/cjs/context/collector.d.ts.map +1 -0
  21. package/dist/cjs/context/collector.js +94 -0
  22. package/dist/cjs/context/collector.js.map +1 -0
  23. package/dist/cjs/context/manager.d.ts.map +1 -0
  24. package/dist/cjs/context/manager.js +36 -0
  25. package/dist/cjs/context/manager.js.map +1 -0
  26. package/dist/cjs/context/types.d.ts.map +1 -0
  27. package/dist/cjs/context/types.js +6 -0
  28. package/dist/cjs/context/types.js.map +1 -0
  29. package/dist/cjs/hooks/types.d.ts.map +1 -0
  30. package/dist/cjs/hooks/types.js +6 -0
  31. package/dist/cjs/hooks/types.js.map +1 -0
  32. package/dist/{index.d.ts → cjs/index.d.ts} +1 -0
  33. package/dist/cjs/index.d.ts.map +1 -0
  34. package/dist/cjs/index.js +98 -0
  35. package/dist/cjs/index.js.map +1 -0
  36. package/dist/cjs/llm/anthropic-provider.d.ts.map +1 -0
  37. package/dist/cjs/llm/anthropic-provider.js +356 -0
  38. package/dist/cjs/llm/anthropic-provider.js.map +1 -0
  39. package/dist/cjs/llm/factory.d.ts.map +1 -0
  40. package/dist/cjs/llm/factory.js +34 -0
  41. package/dist/cjs/llm/factory.js.map +1 -0
  42. package/dist/cjs/llm/ollama-provider.d.ts.map +1 -0
  43. package/dist/cjs/llm/ollama-provider.js +34 -0
  44. package/dist/cjs/llm/ollama-provider.js.map +1 -0
  45. package/dist/cjs/llm/openai-provider.d.ts.map +1 -0
  46. package/dist/cjs/llm/openai-provider.js +186 -0
  47. package/dist/cjs/llm/openai-provider.js.map +1 -0
  48. package/dist/cjs/llm/provider.d.ts.map +1 -0
  49. package/dist/cjs/llm/provider.js +18 -0
  50. package/dist/cjs/llm/provider.js.map +1 -0
  51. package/dist/cjs/llm/types.d.ts.map +1 -0
  52. package/dist/cjs/llm/types.js +6 -0
  53. package/dist/cjs/llm/types.js.map +1 -0
  54. package/dist/cjs/mcp/base-client.d.ts.map +1 -0
  55. package/dist/cjs/mcp/base-client.js +112 -0
  56. package/dist/cjs/mcp/base-client.js.map +1 -0
  57. package/dist/cjs/mcp/client.d.ts.map +1 -0
  58. package/dist/cjs/mcp/client.js +76 -0
  59. package/dist/cjs/mcp/client.js.map +1 -0
  60. package/dist/cjs/mcp/factory.d.ts.map +1 -0
  61. package/dist/cjs/mcp/factory.js +43 -0
  62. package/dist/cjs/mcp/factory.js.map +1 -0
  63. package/dist/cjs/mcp/http-client.d.ts.map +1 -0
  64. package/dist/cjs/mcp/http-client.js +142 -0
  65. package/dist/cjs/mcp/http-client.js.map +1 -0
  66. package/dist/cjs/mcp/proxy-agent.d.ts.map +1 -0
  67. package/dist/cjs/mcp/proxy-agent.js +195 -0
  68. package/dist/cjs/mcp/proxy-agent.js.map +1 -0
  69. package/dist/cjs/mcp/stdio-client.d.ts.map +1 -0
  70. package/dist/cjs/mcp/stdio-client.js +95 -0
  71. package/dist/cjs/mcp/stdio-client.js.map +1 -0
  72. package/dist/cjs/mcp/types.d.ts.map +1 -0
  73. package/dist/cjs/mcp/types.js +6 -0
  74. package/dist/cjs/mcp/types.js.map +1 -0
  75. package/dist/cjs/memory/checkpoint.d.ts.map +1 -0
  76. package/dist/cjs/memory/checkpoint.js +160 -0
  77. package/dist/cjs/memory/checkpoint.js.map +1 -0
  78. package/dist/cjs/memory/extractor.d.ts.map +1 -0
  79. package/dist/cjs/memory/extractor.js +121 -0
  80. package/dist/cjs/memory/extractor.js.map +1 -0
  81. package/dist/cjs/memory/persona.d.ts.map +1 -0
  82. package/dist/cjs/memory/persona.js +79 -0
  83. package/dist/cjs/memory/persona.js.map +1 -0
  84. package/dist/cjs/memory/pipeline.d.ts.map +1 -0
  85. package/dist/cjs/memory/pipeline.js +148 -0
  86. package/dist/cjs/memory/pipeline.js.map +1 -0
  87. package/dist/cjs/memory/prompts.d.ts.map +1 -0
  88. package/dist/cjs/memory/prompts.js +70 -0
  89. package/dist/cjs/memory/prompts.js.map +1 -0
  90. package/dist/cjs/memory/recall.d.ts.map +1 -0
  91. package/dist/cjs/memory/recall.js +164 -0
  92. package/dist/cjs/memory/recall.js.map +1 -0
  93. package/dist/cjs/memory/scene.d.ts.map +1 -0
  94. package/dist/cjs/memory/scene.js +101 -0
  95. package/dist/cjs/memory/scene.js.map +1 -0
  96. package/dist/cjs/memory/types.d.ts.map +1 -0
  97. package/dist/cjs/memory/types.js +6 -0
  98. package/dist/cjs/memory/types.js.map +1 -0
  99. package/dist/cjs/middleware/types.d.ts.map +1 -0
  100. package/dist/cjs/middleware/types.js +6 -0
  101. package/dist/cjs/middleware/types.js.map +1 -0
  102. package/dist/cjs/package.json +3 -0
  103. package/dist/cjs/sandbox/types.d.ts.map +1 -0
  104. package/dist/cjs/sandbox/types.js +128 -0
  105. package/dist/cjs/sandbox/types.js.map +1 -0
  106. package/dist/{security → cjs/security}/guard.d.ts +1 -6
  107. package/dist/cjs/security/guard.d.ts.map +1 -0
  108. package/dist/cjs/security/guard.js +291 -0
  109. package/dist/cjs/security/guard.js.map +1 -0
  110. package/dist/{security → cjs/security}/types.d.ts +6 -2
  111. package/dist/cjs/security/types.d.ts.map +1 -0
  112. package/dist/cjs/security/types.js +6 -0
  113. package/dist/cjs/security/types.js.map +1 -0
  114. package/dist/cjs/skill/manager.d.ts.map +1 -0
  115. package/dist/cjs/skill/manager.js +413 -0
  116. package/dist/cjs/skill/manager.js.map +1 -0
  117. package/dist/cjs/skill/router.d.ts.map +1 -0
  118. package/dist/cjs/skill/router.js +139 -0
  119. package/dist/cjs/skill/router.js.map +1 -0
  120. package/dist/cjs/skill/types.d.ts.map +1 -0
  121. package/dist/cjs/skill/types.js +6 -0
  122. package/dist/cjs/skill/types.js.map +1 -0
  123. package/dist/cjs/tool/delegate.d.ts.map +1 -0
  124. package/dist/cjs/tool/delegate.js +78 -0
  125. package/dist/cjs/tool/delegate.js.map +1 -0
  126. package/dist/cjs/tool/registry.d.ts +49 -0
  127. package/dist/cjs/tool/registry.d.ts.map +1 -0
  128. package/dist/cjs/tool/registry.js +87 -0
  129. package/dist/cjs/tool/registry.js.map +1 -0
  130. package/dist/cjs/tool/types.d.ts.map +1 -0
  131. package/dist/cjs/tool/types.js +6 -0
  132. package/dist/cjs/tool/types.js.map +1 -0
  133. package/dist/cjs/types.d.ts.map +1 -0
  134. package/dist/cjs/types.js +6 -0
  135. package/dist/cjs/types.js.map +1 -0
  136. package/dist/cjs/utils/token-counter.d.ts.map +1 -0
  137. package/dist/cjs/utils/token-counter.js +104 -0
  138. package/dist/cjs/utils/token-counter.js.map +1 -0
  139. package/dist/esm/agent/engine.d.ts +113 -0
  140. package/dist/esm/agent/engine.d.ts.map +1 -0
  141. package/dist/esm/agent/engine.js +762 -0
  142. package/dist/esm/agent/engine.js.map +1 -0
  143. package/dist/esm/agent/history-manager.d.ts +78 -0
  144. package/dist/esm/agent/history-manager.d.ts.map +1 -0
  145. package/dist/esm/agent/history-manager.js +267 -0
  146. package/dist/esm/agent/history-manager.js.map +1 -0
  147. package/dist/esm/agent/llm-caller.d.ts +58 -0
  148. package/dist/esm/agent/llm-caller.d.ts.map +1 -0
  149. package/dist/esm/agent/llm-caller.js +303 -0
  150. package/dist/esm/agent/llm-caller.js.map +1 -0
  151. package/dist/esm/agent/tool-executor.d.ts +95 -0
  152. package/dist/esm/agent/tool-executor.d.ts.map +1 -0
  153. package/dist/esm/agent/tool-executor.js +564 -0
  154. package/dist/esm/agent/tool-executor.js.map +1 -0
  155. package/dist/esm/agent/types.d.ts +128 -0
  156. package/dist/esm/agent/types.d.ts.map +1 -0
  157. package/dist/esm/agent/types.js +5 -0
  158. package/dist/esm/agent/types.js.map +1 -0
  159. package/dist/esm/agent/workflow.d.ts +74 -0
  160. package/dist/esm/agent/workflow.d.ts.map +1 -0
  161. package/dist/esm/agent/workflow.js +248 -0
  162. package/dist/esm/agent/workflow.js.map +1 -0
  163. package/dist/esm/context/collector.d.ts +12 -0
  164. package/dist/esm/context/collector.d.ts.map +1 -0
  165. package/dist/esm/context/collector.js +57 -0
  166. package/dist/esm/context/collector.js.map +1 -0
  167. package/dist/esm/context/manager.d.ts +16 -0
  168. package/dist/esm/context/manager.d.ts.map +1 -0
  169. package/dist/esm/context/manager.js +32 -0
  170. package/dist/esm/context/manager.js.map +1 -0
  171. package/dist/esm/context/types.d.ts +39 -0
  172. package/dist/esm/context/types.d.ts.map +1 -0
  173. package/dist/esm/context/types.js +5 -0
  174. package/dist/esm/context/types.js.map +1 -0
  175. package/dist/esm/hooks/types.d.ts +47 -0
  176. package/dist/esm/hooks/types.d.ts.map +1 -0
  177. package/dist/esm/hooks/types.js +5 -0
  178. package/dist/esm/hooks/types.js.map +1 -0
  179. package/{src/index.ts → dist/esm/index.d.ts} +16 -140
  180. package/dist/esm/index.d.ts.map +1 -0
  181. package/dist/esm/index.js +39 -0
  182. package/dist/esm/index.js.map +1 -0
  183. package/dist/esm/llm/anthropic-provider.d.ts +28 -0
  184. package/dist/esm/llm/anthropic-provider.d.ts.map +1 -0
  185. package/dist/esm/llm/anthropic-provider.js +352 -0
  186. package/dist/esm/llm/anthropic-provider.js.map +1 -0
  187. package/{src/llm/factory.ts → dist/esm/llm/factory.d.ts} +3 -18
  188. package/dist/esm/llm/factory.d.ts.map +1 -0
  189. package/dist/esm/llm/factory.js +30 -0
  190. package/dist/esm/llm/factory.js.map +1 -0
  191. package/dist/esm/llm/ollama-provider.d.ts +13 -0
  192. package/dist/esm/llm/ollama-provider.d.ts.map +1 -0
  193. package/dist/esm/llm/ollama-provider.js +30 -0
  194. package/dist/esm/llm/ollama-provider.js.map +1 -0
  195. package/dist/esm/llm/openai-provider.d.ts +18 -0
  196. package/dist/esm/llm/openai-provider.d.ts.map +1 -0
  197. package/dist/esm/llm/openai-provider.js +182 -0
  198. package/dist/esm/llm/openai-provider.js.map +1 -0
  199. package/{src/llm/provider.ts → dist/esm/llm/provider.d.ts} +1 -9
  200. package/dist/esm/llm/provider.d.ts.map +1 -0
  201. package/dist/esm/llm/provider.js +10 -0
  202. package/dist/esm/llm/provider.js.map +1 -0
  203. package/dist/esm/llm/types.d.ts +78 -0
  204. package/dist/esm/llm/types.d.ts.map +1 -0
  205. package/dist/esm/llm/types.js +5 -0
  206. package/dist/esm/llm/types.js.map +1 -0
  207. package/dist/esm/mcp/base-client.d.ts +50 -0
  208. package/dist/esm/mcp/base-client.d.ts.map +1 -0
  209. package/dist/esm/mcp/base-client.js +108 -0
  210. package/dist/esm/mcp/base-client.js.map +1 -0
  211. package/dist/esm/mcp/client.d.ts +27 -0
  212. package/dist/esm/mcp/client.d.ts.map +1 -0
  213. package/dist/esm/mcp/client.js +70 -0
  214. package/dist/esm/mcp/client.js.map +1 -0
  215. package/dist/esm/mcp/factory.d.ts +16 -0
  216. package/dist/esm/mcp/factory.d.ts.map +1 -0
  217. package/dist/esm/mcp/factory.js +39 -0
  218. package/dist/esm/mcp/factory.js.map +1 -0
  219. package/dist/esm/mcp/http-client.d.ts +24 -0
  220. package/dist/esm/mcp/http-client.d.ts.map +1 -0
  221. package/dist/esm/mcp/http-client.js +138 -0
  222. package/dist/esm/mcp/http-client.js.map +1 -0
  223. package/dist/esm/mcp/proxy-agent.d.ts +49 -0
  224. package/dist/esm/mcp/proxy-agent.d.ts.map +1 -0
  225. package/dist/esm/mcp/proxy-agent.js +187 -0
  226. package/dist/esm/mcp/proxy-agent.js.map +1 -0
  227. package/dist/esm/mcp/stdio-client.d.ts +16 -0
  228. package/dist/esm/mcp/stdio-client.d.ts.map +1 -0
  229. package/dist/esm/mcp/stdio-client.js +91 -0
  230. package/dist/esm/mcp/stdio-client.js.map +1 -0
  231. package/dist/esm/mcp/types.d.ts +60 -0
  232. package/dist/esm/mcp/types.d.ts.map +1 -0
  233. package/dist/esm/mcp/types.js +5 -0
  234. package/dist/esm/mcp/types.js.map +1 -0
  235. package/dist/esm/memory/checkpoint.d.ts +62 -0
  236. package/dist/esm/memory/checkpoint.d.ts.map +1 -0
  237. package/dist/esm/memory/checkpoint.js +121 -0
  238. package/dist/esm/memory/checkpoint.js.map +1 -0
  239. package/dist/esm/memory/extractor.d.ts +59 -0
  240. package/dist/esm/memory/extractor.d.ts.map +1 -0
  241. package/dist/esm/memory/extractor.js +117 -0
  242. package/dist/esm/memory/extractor.js.map +1 -0
  243. package/dist/esm/memory/persona.d.ts +38 -0
  244. package/dist/esm/memory/persona.d.ts.map +1 -0
  245. package/dist/esm/memory/persona.js +75 -0
  246. package/dist/esm/memory/persona.js.map +1 -0
  247. package/dist/esm/memory/pipeline.d.ts +50 -0
  248. package/dist/esm/memory/pipeline.d.ts.map +1 -0
  249. package/dist/esm/memory/pipeline.js +144 -0
  250. package/dist/esm/memory/pipeline.js.map +1 -0
  251. package/dist/esm/memory/prompts.d.ts +9 -0
  252. package/dist/esm/memory/prompts.d.ts.map +1 -0
  253. package/{src/memory/prompts.ts → dist/esm/memory/prompts.js} +6 -13
  254. package/dist/esm/memory/prompts.js.map +1 -0
  255. package/dist/esm/memory/recall.d.ts +66 -0
  256. package/dist/esm/memory/recall.d.ts.map +1 -0
  257. package/dist/esm/memory/recall.js +159 -0
  258. package/dist/esm/memory/recall.js.map +1 -0
  259. package/dist/esm/memory/scene.d.ts +49 -0
  260. package/dist/esm/memory/scene.d.ts.map +1 -0
  261. package/dist/esm/memory/scene.js +97 -0
  262. package/dist/esm/memory/scene.js.map +1 -0
  263. package/dist/esm/memory/types.d.ts +43 -0
  264. package/dist/esm/memory/types.d.ts.map +1 -0
  265. package/dist/esm/memory/types.js +5 -0
  266. package/dist/esm/memory/types.js.map +1 -0
  267. package/dist/esm/middleware/types.d.ts +52 -0
  268. package/dist/esm/middleware/types.d.ts.map +1 -0
  269. package/dist/esm/middleware/types.js +5 -0
  270. package/dist/esm/middleware/types.js.map +1 -0
  271. package/dist/esm/package.json +3 -0
  272. package/dist/esm/sandbox/types.d.ts +59 -0
  273. package/dist/esm/sandbox/types.d.ts.map +1 -0
  274. package/dist/esm/sandbox/types.js +125 -0
  275. package/dist/esm/sandbox/types.js.map +1 -0
  276. package/dist/esm/security/guard.d.ts +36 -0
  277. package/dist/esm/security/guard.d.ts.map +1 -0
  278. package/dist/esm/security/guard.js +287 -0
  279. package/dist/esm/security/guard.js.map +1 -0
  280. package/dist/esm/security/types.d.ts +40 -0
  281. package/dist/esm/security/types.d.ts.map +1 -0
  282. package/dist/esm/security/types.js +5 -0
  283. package/dist/esm/security/types.js.map +1 -0
  284. package/dist/esm/skill/manager.d.ts +95 -0
  285. package/dist/esm/skill/manager.d.ts.map +1 -0
  286. package/dist/esm/skill/manager.js +376 -0
  287. package/dist/esm/skill/manager.js.map +1 -0
  288. package/dist/esm/skill/router.d.ts +26 -0
  289. package/dist/esm/skill/router.d.ts.map +1 -0
  290. package/dist/esm/skill/router.js +135 -0
  291. package/dist/esm/skill/router.js.map +1 -0
  292. package/dist/esm/skill/types.d.ts +55 -0
  293. package/dist/esm/skill/types.d.ts.map +1 -0
  294. package/dist/esm/skill/types.js +5 -0
  295. package/dist/esm/skill/types.js.map +1 -0
  296. package/dist/esm/tool/delegate.d.ts +34 -0
  297. package/dist/esm/tool/delegate.d.ts.map +1 -0
  298. package/dist/esm/tool/delegate.js +75 -0
  299. package/dist/esm/tool/delegate.js.map +1 -0
  300. package/dist/esm/tool/registry.d.ts +49 -0
  301. package/dist/esm/tool/registry.d.ts.map +1 -0
  302. package/dist/esm/tool/registry.js +83 -0
  303. package/dist/esm/tool/registry.js.map +1 -0
  304. package/dist/esm/tool/types.d.ts +101 -0
  305. package/dist/esm/tool/types.d.ts.map +1 -0
  306. package/dist/esm/tool/types.js +5 -0
  307. package/dist/esm/tool/types.js.map +1 -0
  308. package/dist/esm/types.d.ts +150 -0
  309. package/dist/esm/types.d.ts.map +1 -0
  310. package/dist/esm/types.js +5 -0
  311. package/dist/esm/types.js.map +1 -0
  312. package/dist/esm/utils/token-counter.d.ts +22 -0
  313. package/dist/esm/utils/token-counter.d.ts.map +1 -0
  314. package/dist/esm/utils/token-counter.js +99 -0
  315. package/dist/esm/utils/token-counter.js.map +1 -0
  316. package/package.json +16 -10
  317. package/dist/agent/engine.d.ts.map +0 -1
  318. package/dist/agent/history-manager.d.ts.map +0 -1
  319. package/dist/agent/llm-caller.d.ts.map +0 -1
  320. package/dist/agent/tool-executor.d.ts.map +0 -1
  321. package/dist/agent/types.d.ts.map +0 -1
  322. package/dist/agent/workflow.d.ts.map +0 -1
  323. package/dist/context/collector.d.ts.map +0 -1
  324. package/dist/context/manager.d.ts.map +0 -1
  325. package/dist/context/types.d.ts.map +0 -1
  326. package/dist/hooks/types.d.ts.map +0 -1
  327. package/dist/index.d.ts.map +0 -1
  328. package/dist/llm/anthropic-provider.d.ts.map +0 -1
  329. package/dist/llm/factory.d.ts.map +0 -1
  330. package/dist/llm/ollama-provider.d.ts.map +0 -1
  331. package/dist/llm/openai-provider.d.ts.map +0 -1
  332. package/dist/llm/provider.d.ts.map +0 -1
  333. package/dist/llm/types.d.ts.map +0 -1
  334. package/dist/mcp/base-client.d.ts.map +0 -1
  335. package/dist/mcp/client.d.ts.map +0 -1
  336. package/dist/mcp/factory.d.ts.map +0 -1
  337. package/dist/mcp/http-client.d.ts.map +0 -1
  338. package/dist/mcp/proxy-agent.d.ts.map +0 -1
  339. package/dist/mcp/stdio-client.d.ts.map +0 -1
  340. package/dist/mcp/types.d.ts.map +0 -1
  341. package/dist/memory/checkpoint.d.ts.map +0 -1
  342. package/dist/memory/extractor.d.ts.map +0 -1
  343. package/dist/memory/persona.d.ts.map +0 -1
  344. package/dist/memory/pipeline.d.ts.map +0 -1
  345. package/dist/memory/prompts.d.ts.map +0 -1
  346. package/dist/memory/recall.d.ts.map +0 -1
  347. package/dist/memory/scene.d.ts.map +0 -1
  348. package/dist/memory/types.d.ts.map +0 -1
  349. package/dist/middleware/types.d.ts.map +0 -1
  350. package/dist/sandbox/types.d.ts.map +0 -1
  351. package/dist/security/guard.d.ts.map +0 -1
  352. package/dist/security/types.d.ts.map +0 -1
  353. package/dist/skill/manager.d.ts.map +0 -1
  354. package/dist/skill/router.d.ts.map +0 -1
  355. package/dist/skill/types.d.ts.map +0 -1
  356. package/dist/tool/delegate.d.ts.map +0 -1
  357. package/dist/tool/registry.d.ts +0 -24
  358. package/dist/tool/registry.d.ts.map +0 -1
  359. package/dist/tool/types.d.ts.map +0 -1
  360. package/dist/types.d.ts.map +0 -1
  361. package/dist/utils/token-counter.d.ts.map +0 -1
  362. package/src/agent/engine.ts +0 -875
  363. package/src/agent/history-manager.ts +0 -323
  364. package/src/agent/llm-caller.ts +0 -383
  365. package/src/agent/tool-executor.ts +0 -713
  366. package/src/agent/types.ts +0 -136
  367. package/src/agent/workflow.ts +0 -339
  368. package/src/context/collector.ts +0 -59
  369. package/src/context/manager.ts +0 -40
  370. package/src/context/types.ts +0 -51
  371. package/src/hooks/types.ts +0 -77
  372. package/src/llm/anthropic-provider.ts +0 -412
  373. package/src/llm/ollama-provider.ts +0 -39
  374. package/src/llm/openai-provider.ts +0 -200
  375. package/src/llm/types.ts +0 -91
  376. package/src/mcp/base-client.ts +0 -159
  377. package/src/mcp/client.ts +0 -81
  378. package/src/mcp/factory.ts +0 -45
  379. package/src/mcp/http-client.ts +0 -149
  380. package/src/mcp/proxy-agent.ts +0 -227
  381. package/src/mcp/stdio-client.ts +0 -104
  382. package/src/mcp/types.ts +0 -65
  383. package/src/memory/checkpoint.ts +0 -146
  384. package/src/memory/extractor.ts +0 -164
  385. package/src/memory/persona.ts +0 -106
  386. package/src/memory/pipeline.ts +0 -192
  387. package/src/memory/recall.ts +0 -217
  388. package/src/memory/scene.ts +0 -137
  389. package/src/memory/types.ts +0 -54
  390. package/src/middleware/types.ts +0 -62
  391. package/src/sandbox/types.ts +0 -185
  392. package/src/security/guard.ts +0 -249
  393. package/src/security/types.ts +0 -46
  394. package/src/skill/manager.ts +0 -420
  395. package/src/skill/router.ts +0 -158
  396. package/src/skill/types.ts +0 -67
  397. package/src/tool/delegate.ts +0 -105
  398. package/src/tool/registry.ts +0 -64
  399. package/src/tool/types.ts +0 -124
  400. package/src/types.ts +0 -188
  401. package/src/utils/token-counter.ts +0 -108
  402. /package/dist/{agent → cjs/agent}/engine.d.ts +0 -0
  403. /package/dist/{agent → cjs/agent}/history-manager.d.ts +0 -0
  404. /package/dist/{agent → cjs/agent}/llm-caller.d.ts +0 -0
  405. /package/dist/{agent → cjs/agent}/tool-executor.d.ts +0 -0
  406. /package/dist/{agent → cjs/agent}/types.d.ts +0 -0
  407. /package/dist/{agent → cjs/agent}/workflow.d.ts +0 -0
  408. /package/dist/{context → cjs/context}/collector.d.ts +0 -0
  409. /package/dist/{context → cjs/context}/manager.d.ts +0 -0
  410. /package/dist/{context → cjs/context}/types.d.ts +0 -0
  411. /package/dist/{hooks → cjs/hooks}/types.d.ts +0 -0
  412. /package/dist/{llm → cjs/llm}/anthropic-provider.d.ts +0 -0
  413. /package/dist/{llm → cjs/llm}/factory.d.ts +0 -0
  414. /package/dist/{llm → cjs/llm}/ollama-provider.d.ts +0 -0
  415. /package/dist/{llm → cjs/llm}/openai-provider.d.ts +0 -0
  416. /package/dist/{llm → cjs/llm}/provider.d.ts +0 -0
  417. /package/dist/{llm → cjs/llm}/types.d.ts +0 -0
  418. /package/dist/{mcp → cjs/mcp}/base-client.d.ts +0 -0
  419. /package/dist/{mcp → cjs/mcp}/client.d.ts +0 -0
  420. /package/dist/{mcp → cjs/mcp}/factory.d.ts +0 -0
  421. /package/dist/{mcp → cjs/mcp}/http-client.d.ts +0 -0
  422. /package/dist/{mcp → cjs/mcp}/proxy-agent.d.ts +0 -0
  423. /package/dist/{mcp → cjs/mcp}/stdio-client.d.ts +0 -0
  424. /package/dist/{mcp → cjs/mcp}/types.d.ts +0 -0
  425. /package/dist/{memory → cjs/memory}/checkpoint.d.ts +0 -0
  426. /package/dist/{memory → cjs/memory}/extractor.d.ts +0 -0
  427. /package/dist/{memory → cjs/memory}/persona.d.ts +0 -0
  428. /package/dist/{memory → cjs/memory}/pipeline.d.ts +0 -0
  429. /package/dist/{memory → cjs/memory}/prompts.d.ts +0 -0
  430. /package/dist/{memory → cjs/memory}/recall.d.ts +0 -0
  431. /package/dist/{memory → cjs/memory}/scene.d.ts +0 -0
  432. /package/dist/{memory → cjs/memory}/types.d.ts +0 -0
  433. /package/dist/{middleware → cjs/middleware}/types.d.ts +0 -0
  434. /package/dist/{sandbox → cjs/sandbox}/types.d.ts +0 -0
  435. /package/dist/{skill → cjs/skill}/manager.d.ts +0 -0
  436. /package/dist/{skill → cjs/skill}/router.d.ts +0 -0
  437. /package/dist/{skill → cjs/skill}/types.d.ts +0 -0
  438. /package/dist/{tool → cjs/tool}/delegate.d.ts +0 -0
  439. /package/dist/{tool → cjs/tool}/types.d.ts +0 -0
  440. /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
  441. /package/dist/{utils → cjs/utils}/token-counter.d.ts +0 -0
@@ -1,137 +0,0 @@
1
- // ============================================================
2
- // SceneAggregator — L2 场景聚合器
3
- // ============================================================
4
- // 将 L1 原子事实聚合为主题场景块(L2 Scene),
5
- // 便于召回时按主题整体命中,提升上下文注入效率
6
-
7
- import type { LLMProvider } from '../llm/types.ts';
8
- import type { Message } from '../types.ts';
9
- import { SCENE_AGGREGATION_SYSTEM_PROMPT } from './prompts.ts';
10
-
11
- /** 场景块(L2) */
12
- export interface SceneBlock {
13
- /** 场景 ID(snake_case) */
14
- sceneId: string;
15
- /** 场景标题 */
16
- title: string;
17
- /** 场景描述 */
18
- description: string;
19
- /** 归属的原子事实 ID 列表 */
20
- atomIds: string[];
21
- }
22
-
23
- /** 聚合器配置 */
24
- export interface SceneAggregatorOptions {
25
- llmProvider: LLMProvider;
26
- /** 最大场景数,默认 15 */
27
- maxScenes?: number;
28
- /** 超时(毫秒),默认 30000 */
29
- timeoutMs?: number;
30
- }
31
-
32
- /**
33
- * L2 场景聚合器
34
- *
35
- * 工作流程:
36
- * 1. 收集所有 L1 原子事实
37
- * 2. 通过 LLM 将相关事实分组为场景块
38
- * 3. 输出 SceneBlock[],供 MemoryService 更新 L2 条目
39
- */
40
- export class SceneAggregator {
41
- private llmProvider: LLMProvider;
42
- private maxScenes: number;
43
- private timeoutMs: number;
44
-
45
- constructor(opts: SceneAggregatorOptions) {
46
- this.llmProvider = opts.llmProvider;
47
- this.maxScenes = opts.maxScenes ?? 15;
48
- this.timeoutMs = opts.timeoutMs ?? 30000;
49
- }
50
-
51
- /**
52
- * 聚合原子事实为场景块
53
- * @param atoms L1 原子事实列表(key + content + id)
54
- * @param existingScenes 已有场景(用于增量更新)
55
- */
56
- async aggregate(
57
- atoms: Array<{ id: string; key: string; content: string; category: string }>,
58
- existingScenes: SceneBlock[] = [],
59
- ): Promise<SceneBlock[]> {
60
- if (atoms.length === 0) return existingScenes;
61
-
62
- const userPrompt = this.buildUserPrompt(atoms, existingScenes);
63
-
64
- try {
65
- const raw = await this.callLLM(userPrompt);
66
- return this.parseScenes(raw);
67
- } catch (err: any) {
68
- console.warn(`[SceneAggregator] Aggregation failed: ${err?.message || err}`);
69
- return existingScenes;
70
- }
71
- }
72
-
73
- private buildUserPrompt(
74
- atoms: Array<{ id: string; key: string; content: string; category: string }>,
75
- existingScenes: SceneBlock[],
76
- ): string {
77
- const atomsText = atoms
78
- .map(a => `- [${a.id}] (${a.category}) ${a.key}: ${a.content}`)
79
- .join('\n');
80
-
81
- let prompt = `**Atomic facts to organize:**\n${atomsText}\n`;
82
-
83
- if (existingScenes.length > 0) {
84
- const scenesText = existingScenes
85
- .map(s => `- ${s.sceneId}: ${s.title} (${s.atomIds.length} atoms)`)
86
- .join('\n');
87
- prompt += `\n**Existing scenes (merge/update as needed):**\n${scenesText}\n`;
88
- }
89
-
90
- prompt += `\nGroup these facts into at most ${this.maxScenes} thematic scenarios. Output ONLY a JSON array.`;
91
- return prompt;
92
- }
93
-
94
- private async callLLM(userPrompt: string): Promise<string> {
95
- const messages: Message[] = [
96
- { role: 'system', content: SCENE_AGGREGATION_SYSTEM_PROMPT },
97
- { role: 'user', content: userPrompt },
98
- ];
99
-
100
- const chunks: string[] = [];
101
- const stream = this.llmProvider.chatStream({
102
- messages,
103
- abortSignal: AbortSignal.timeout(this.timeoutMs),
104
- });
105
-
106
- for await (const chunk of stream) {
107
- if (chunk.delta.content) {
108
- chunks.push(chunk.delta.content);
109
- }
110
- }
111
-
112
- return chunks.join('');
113
- }
114
-
115
- private parseScenes(raw: string): SceneBlock[] {
116
- const jsonMatch = raw.match(/\[[\s\S]*\]/);
117
- if (!jsonMatch) return [];
118
-
119
- try {
120
- const parsed = JSON.parse(jsonMatch[0]);
121
- if (!Array.isArray(parsed)) return [];
122
-
123
- return parsed
124
- .filter((item: any) => item.sceneId && item.title)
125
- .slice(0, this.maxScenes)
126
- .map((item: any) => ({
127
- sceneId: String(item.sceneId).replace(/[^a-z0-9_]/g, '_').toLowerCase(),
128
- title: String(item.title),
129
- description: String(item.description || ''),
130
- atomIds: Array.isArray(item.atomIds) ? item.atomIds.map(String) : [],
131
- }));
132
- } catch {
133
- console.warn('[SceneAggregator] Failed to parse LLM output');
134
- return [];
135
- }
136
- }
137
- }
@@ -1,54 +0,0 @@
1
- // ============================================================
2
- // Memory 模块类型定义(独立于上层 MemoryService 实现)
3
- // ============================================================
4
-
5
- /** 记忆层级 */
6
- export type MemoryLayer = 'L0' | 'L1' | 'L2' | 'L3';
7
-
8
- /** 记忆条目(与上层 MemoryService 的 MemoryEntry 保持一致,上层负责转换) */
9
- export interface MemoryEntry {
10
- /** 唯一标识(基于 key 生成) */
11
- id: string;
12
- /** 记忆分类:user_preference / project_knowledge / learned_fact / custom / scene / persona */
13
- category: string;
14
- /** 记忆键(用于 upsert) */
15
- key: string;
16
- /** 记忆内容 */
17
- content: string;
18
- /** 重要程度 1-5,默认 3 */
19
- importance: number;
20
- /** 创建时间(ISO 字符串) */
21
- createdAt: string;
22
- /** 最后更新时间(ISO 字符串) */
23
- updatedAt: string;
24
- /** 记忆层级:L0=原始对话 L1=原子事实 L2=场景块 L3=用户画像,默认 L1 */
25
- memoryLayer: MemoryLayer;
26
- /** 来源会话 ID(自动提取时记录) */
27
- sourceSessionId?: string;
28
- /** 提取时间戳(ISO 字符串) */
29
- sourceTimestamp?: string;
30
- /** L2 场景 ID(归属场景块) */
31
- sceneId?: string;
32
- /** L3 画像维度(如 coding_style, tool_preference) */
33
- personaFacet?: string;
34
- /** 来源层级(该条目从哪一层提炼而来) */
35
- sourceLayer?: MemoryLayer;
36
- /** 来源条目 ID 列表(溯源链) */
37
- sourceIds?: string[];
38
- }
39
-
40
- /**
41
- * MemoryServiceLike — 管道调度器所需的 MemoryService 最小接口
42
- * 上层(server 侧)的 MemoryService 实现此接口即可接入管道
43
- */
44
- export interface MemoryServiceLike {
45
- getKeys(): string[];
46
- getAllEntries(layer?: MemoryLayer): MemoryEntry[];
47
- save(
48
- key: string,
49
- content: string,
50
- category: string,
51
- importance: number,
52
- extras?: Partial<Pick<MemoryEntry, 'memoryLayer' | 'sourceSessionId' | 'sourceTimestamp' | 'sceneId' | 'sourceLayer' | 'sourceIds'>>,
53
- ): MemoryEntry;
54
- }
@@ -1,62 +0,0 @@
1
- // ============================================================
2
- // Middleware — 中间件管道类型定义
3
- // ============================================================
4
-
5
- import type { HookContext, HookResult } from '../hooks/types.ts';
6
-
7
- // ---- MiddlewareContext — 中间件接收的迭代上下文 ----
8
-
9
- /**
10
- * 中间件 before/after 接收的上下文信息
11
- * 包含当前迭代的关键状态快照,中间件可读取但不应直接修改
12
- */
13
- export interface MiddlewareContext {
14
- /** 会话 ID */
15
- sessionId: string;
16
- /** 当前迭代轮次 */
17
- iteration: number;
18
- /** 当前消息列表(只读快照) */
19
- messages: ReadonlyArray<{ role: string; content: string | null }>;
20
- /** 当前可用工具数量 */
21
- toolCount: number;
22
- }
23
-
24
- // ---- Middleware 接口 ----
25
-
26
- /**
27
- * 中间件接口 — Hook 系统的结构化增强层
28
- *
29
- * 与 Hook 共存,提供更清晰的 before/after 生命周期:
30
- * - `before` / `after`:在每轮迭代的开始/结束执行
31
- * - `onToolBefore` / `onToolAfter`:在工具执行前/后执行(与 before_tool/after_tool Hook 并行)
32
- *
33
- * 执行顺序:Middleware.before → Hook.on_iteration_start → ... → Hook.before_tool → Middleware.onToolBefore → 工具执行 → Hook.after_tool → Middleware.onToolAfter → ... → Middleware.after
34
- */
35
- export interface Middleware {
36
- /** 中间件名称(用于日志和调试) */
37
- name: string;
38
-
39
- /**
40
- * 每轮迭代开始前调用
41
- * 适合:预检查、上下文注入、状态审计
42
- */
43
- before?(ctx: MiddlewareContext): Promise<void>;
44
-
45
- /**
46
- * 每轮迭代结束后调用
47
- * 适合:后处理、指标收集、日志记录
48
- */
49
- after?(ctx: MiddlewareContext): Promise<void>;
50
-
51
- /**
52
- * 工具执行前调用(与 before_tool Hook 同层)
53
- * 返回值与 Hook 的 before_tool 合并(block/modify 均生效)
54
- */
55
- onToolBefore?(ctx: HookContext): Promise<HookResult | void>;
56
-
57
- /**
58
- * 工具执行后调用(与 after_tool Hook 同层)
59
- * 返回值与 Hook 的 after_tool 合并(inject 均生效)
60
- */
61
- onToolAfter?(ctx: HookContext): Promise<HookResult | void>;
62
- }
@@ -1,185 +0,0 @@
1
- // ============================================================
2
- // Sandbox — 脚本沙箱类型定义 + 内置安全规则
3
- // ============================================================
4
-
5
- import type { SecurityRule } from '../security/types.ts';
6
- import type { ShellExecutor, FileSystemExecutor } from '../tool/types.ts';
7
-
8
- // ---- SandboxConfig ----
9
-
10
- /** 沙箱配置 */
11
- export interface SandboxConfig {
12
- /** 沙箱根目录(默认 ~/.workagent/sandboxes/{id}) */
13
- rootDir: string;
14
- /** 允许的文件扩展名(脚本执行用),空 = 不限制 */
15
- allowedExtensions?: string[];
16
- /** 最大文件大小 (bytes),默认 10MB */
17
- maxFileSize?: number;
18
- /** 执行超时 (ms),默认 30000 */
19
- execTimeout?: number;
20
- /** 是否启用命令限制(默认 true) */
21
- commandRestriction?: boolean;
22
- }
23
-
24
- /** 默认沙箱配置 */
25
- export const DEFAULT_SANDBOX_CONFIG: Partial<SandboxConfig> = {
26
- maxFileSize: 10 * 1024 * 1024, // 10MB
27
- execTimeout: 30000,
28
- commandRestriction: true,
29
- };
30
-
31
- // ---- Sandbox ----
32
-
33
- /** 脚本语言类型 */
34
- export type ScriptLanguage = 'python' | 'nodejs' | 'shell';
35
-
36
- /** 沙箱实例接口 */
37
- export interface Sandbox {
38
- readonly id: string;
39
- readonly rootDir: string;
40
- /** 获取受限的 Shell 执行器 */
41
- getShellExecutor(): ShellExecutor;
42
- /** 获取受限的文件系统执行器 */
43
- getFileSystemExecutor(): FileSystemExecutor;
44
- /**
45
- * 运行脚本(写入临时文件并执行)
46
- * @param language 脚本语言:python / nodejs / shell
47
- * @param code 脚本代码
48
- * @param timeout 执行超时 (ms)
49
- */
50
- runScript(language: ScriptLanguage, code: string, timeout?: number): Promise<string>;
51
- /** 销毁沙箱(清理临时文件) */
52
- destroy(): Promise<void>;
53
- }
54
-
55
- // ---- SandboxManager ----
56
-
57
- /** 沙箱管理器接口 */
58
- export interface SandboxManager {
59
- /** 创建沙箱 */
60
- create(id: string, config?: Partial<SandboxConfig>): Promise<Sandbox>;
61
- /** 获取已创建的沙箱 */
62
- get(id: string): Sandbox | undefined;
63
- /** 销毁指定沙箱 */
64
- destroy(id: string): Promise<void>;
65
- /** 销毁所有沙箱 */
66
- destroyAll(): Promise<void>;
67
- }
68
-
69
- // ---- 沙箱内置安全规则 ----
70
-
71
- /**
72
- * 沙箱专用命令黑名单(在 SecurityGuard 基础上扩展)
73
- * 这些规则阻止任何试图突破沙箱隔离的操作
74
- */
75
- export const SANDBOX_BLOCKED_COMMANDS: SecurityRule[] = [
76
- // 禁止提权
77
- {
78
- name: 'sandbox-block-sudo',
79
- pattern: /^(sudo|su)\s/,
80
- severity: 'blocked',
81
- action: 'block',
82
- description: 'Sandbox: privilege escalation blocked',
83
- },
84
- // 禁止修改系统目录
85
- {
86
- name: 'sandbox-block-system-write',
87
- pattern: /\b(write|tee|cp|mv)\s+.*\s+\/(etc|usr|bin|sbin|var|sys|proc)\b/,
88
- severity: 'blocked',
89
- action: 'block',
90
- description: 'Sandbox: system directory write blocked',
91
- },
92
- // 禁止修改文件权限
93
- {
94
- name: 'sandbox-block-chmod',
95
- pattern: /^(chmod|chown|chgrp)\s/,
96
- severity: 'blocked',
97
- action: 'block',
98
- description: 'Sandbox: permission change blocked',
99
- },
100
- // 禁止修改防火墙
101
- {
102
- name: 'sandbox-block-iptables',
103
- pattern: /^(iptables|nftables|ufw)\s/,
104
- severity: 'blocked',
105
- action: 'block',
106
- description: 'Sandbox: firewall modification blocked',
107
- },
108
- // 禁止篡改关键环境变量
109
- {
110
- name: 'sandbox-block-env-export',
111
- pattern: /^(export|setx)\s+(HOME|PATH|SHELL)/i,
112
- severity: 'blocked',
113
- action: 'block',
114
- description: 'Sandbox: critical env modification blocked',
115
- },
116
- // 禁止挂载
117
- {
118
- name: 'sandbox-block-mount',
119
- pattern: /^(mount|umount)\s/,
120
- severity: 'blocked',
121
- action: 'block',
122
- description: 'Sandbox: mount operation blocked',
123
- },
124
- // 禁止内核模块操作
125
- {
126
- name: 'sandbox-block-kernel',
127
- pattern: /^(insmod|rmmod|modprobe)\s/,
128
- severity: 'blocked',
129
- action: 'block',
130
- description: 'Sandbox: kernel module operation blocked',
131
- },
132
- // 禁止全局文件系统搜索(find / 等绝对路径搜索)
133
- {
134
- name: 'sandbox-block-find-global',
135
- pattern: /\bfind\s+\//,
136
- severity: 'blocked',
137
- action: 'block',
138
- description: 'Sandbox: global filesystem search blocked. Use relative paths (find . -name "...") within the sandbox.',
139
- },
140
- // 禁止 locate 命令(系统级文件索引搜索)
141
- {
142
- name: 'sandbox-block-locate',
143
- pattern: /^(locate|updatedb)\s/,
144
- severity: 'blocked',
145
- action: 'block',
146
- description: 'Sandbox: locate command blocked. Use find with relative paths.',
147
- },
148
- // 禁止 grep/ripgrep 从绝对路径递归搜索
149
- {
150
- name: 'sandbox-block-grep-absolute',
151
- pattern: /\b(grep|rg|ag)\s+(-[a-zA-Z]*\s+)*.*\s+\/(?!\/)(?:etc|usr|bin|sbin|var|sys|proc|home|opt|lib|tmp)(?:\/|$)/,
152
- severity: 'blocked',
153
- action: 'block',
154
- description: 'Sandbox: recursive search on system paths blocked. Search within sandbox directory only.',
155
- },
156
- // 禁止向用户主目录写入文件(绝对路径写操作)
157
- {
158
- name: 'sandbox-block-write-user-dir',
159
- pattern: /(?:writeFile|writeFileSync)\s*\([\s\S]*?['"]?\/(Users|home)\/|\b(cp|mv|tee)\s+[^|;&]*\s+['"]?\/(Users|home)\//,
160
- severity: 'blocked',
161
- action: 'block',
162
- description: 'Sandbox: writing to user directory blocked. Use relative paths (e.g. "output.pptx") within the sandbox.',
163
- },
164
- ];
165
-
166
- /**
167
- * 沙箱允许的环境变量白名单
168
- * 只保留脚本运行所需的最小环境变量集合
169
- */
170
- export const SANDBOX_SAFE_ENV_KEYS: string[] = [
171
- // 基础环境
172
- 'PATH', 'HOME', 'USER', 'USERNAME',
173
- // 本地化
174
- 'LANG', 'LC_ALL', 'LC_CTYPE', 'TERM',
175
- // Python
176
- 'PYTHONIOENCODING', 'PYTHONUTF8', 'PYTHONPATH',
177
- // Node.js
178
- 'NODE_PATH', 'NODE_ENV',
179
- // 临时目录
180
- 'TMPDIR', 'TEMP', 'TMP',
181
- // Windows 系统
182
- 'SystemRoot', 'windir', 'COMSPEC',
183
- // 系统标识
184
- 'OS', 'PROCESSOR_ARCHITECTURE',
185
- ];
@@ -1,249 +0,0 @@
1
- // ============================================================
2
- // SecurityGuard — 命令安全检查 + 凭证泄露检测(带规则编译缓存)
3
- // ============================================================
4
-
5
- import type { SanitizeResult, SecurityRule, SecurityPolicy } from './types.ts';
6
-
7
- /** 凭证泄露检测模式 */
8
- const CREDENTIAL_PATTERNS: Array<{ name: string; pattern: RegExp }> = [
9
- { name: 'openai-key', pattern: /sk-[a-zA-Z0-9]{20,}/g },
10
- { name: 'anthropic-key', pattern: /sk-ant-[a-zA-Z0-9-]{20,}/g },
11
- { name: 'aws-access-key', pattern: /AKIA[0-9A-Z]{16}/g },
12
- { name: 'aws-secret-key', pattern: /(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])/g },
13
- { name: 'github-token', pattern: /ghp_[a-zA-Z0-9]{36}/g },
14
- { name: 'github-fine-grained', pattern: /github_pat_[a-zA-Z0-9_]{82}/g },
15
- { name: 'generic-bearer', pattern: /Bearer\s+[a-zA-Z0-9._-]+/gi },
16
- { name: 'generic-secret', pattern: /(?:password|secret|token|api_key|apikey)\s*[:=]\s*['"][^'"]{8,}['"]/gi },
17
- { name: 'private-key', pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |DSA )?PRIVATE KEY-----/g },
18
- ];
19
-
20
- /** 默认安全策略 */
21
- const DEFAULT_POLICY: SecurityPolicy = {
22
- deleteProtection: true,
23
- trashDir: '~/.workagent/.trash',
24
- blacklistEnabled: true,
25
- rules: [],
26
- };
27
-
28
- /** 内置黑名单规则 */
29
- const BUILTIN_BLACKLIST: SecurityRule[] = [
30
- {
31
- name: 'block-rm-root',
32
- pattern: /^rm\s+(-[a-zA-Z]*\s+)*\/$/m,
33
- severity: 'blocked',
34
- action: 'block',
35
- description: 'Block rm -rf / (destroy root filesystem)',
36
- },
37
- {
38
- name: 'block-dd-disk',
39
- pattern: /^dd\s+.*of=\/dev\/[sh]d/m,
40
- severity: 'blocked',
41
- action: 'block',
42
- description: 'Block dd to disk device',
43
- },
44
- {
45
- name: 'block-mkfs',
46
- pattern: /^mkfs\./,
47
- severity: 'blocked',
48
- action: 'block',
49
- description: 'Block filesystem format commands',
50
- },
51
- {
52
- name: 'block-fork-bomb',
53
- pattern: /^:\(\)\s*\{\s*:\|:\s*&\s*\}\s*;\s*:/,
54
- severity: 'blocked',
55
- action: 'block',
56
- description: 'Block fork bomb',
57
- },
58
- ];
59
-
60
- /** 内置删除保护规则(rm → mv 到回收站,回收站路径通过 policy.trashDir 配置) */
61
- function createDeleteProtectionRule(trashDir: string): SecurityRule {
62
- return {
63
- name: 'delete-protection',
64
- pattern: /^(sudo\s+)?rm\s+((?:-[a-zA-Z]+\s+)*)(.+)$/s,
65
- severity: 'warn',
66
- action: 'rewrite',
67
- rewriter: (command: string) => {
68
- const match = command.match(/^(sudo\s+)?rm\s+((?:-[a-zA-Z]+\s+)*)(.+)$/s);
69
- if (!match) return command;
70
- const targets = match[3];
71
- const ts = Date.now();
72
- return `mkdir -p ${trashDir} && mv ${targets} ${trashDir}/_del_${ts}`;
73
- },
74
- description: 'Rewrite rm to mv trash for delete protection',
75
- };
76
- }
77
-
78
- export class SecurityGuard {
79
- private policy: SecurityPolicy;
80
-
81
- /** 已编译的正则规则缓存(避免每次 sanitize 重复遍历数组) */
82
- private compiledBlacklist: SecurityRule[] | null = null;
83
- private compiledCustomRewrite: SecurityRule[] | null = null;
84
- private compiledCustomWarn: SecurityRule[] | null = null;
85
- /** 删除保护规则(使用 policy.trashDir) */
86
- private deleteProtectionRule: SecurityRule;
87
-
88
- constructor(policy?: Partial<SecurityPolicy>) {
89
- this.policy = { ...DEFAULT_POLICY, ...policy };
90
- this.deleteProtectionRule = createDeleteProtectionRule(this.policy.trashDir);
91
- this.invalidateCompiledRules();
92
- }
93
-
94
- /** 编译规则缓存(policy 变更时调用) */
95
- private invalidateCompiledRules(): void {
96
- this.compiledBlacklist = null;
97
- this.compiledCustomRewrite = null;
98
- this.compiledCustomWarn = null;
99
- }
100
-
101
- private getCompiledBlacklist(): SecurityRule[] {
102
- if (!this.compiledBlacklist) {
103
- this.compiledBlacklist = [...BUILTIN_BLACKLIST, ...this.policy.rules.filter((r) => r.action === 'block')];
104
- }
105
- return this.compiledBlacklist;
106
- }
107
-
108
- private getCompiledCustomRewrite(): SecurityRule[] {
109
- if (!this.compiledCustomRewrite) {
110
- this.compiledCustomRewrite = this.policy.rules.filter((r) => r.action === 'rewrite' && r.rewriter);
111
- }
112
- return this.compiledCustomRewrite;
113
- }
114
-
115
- private getCompiledCustomWarn(): SecurityRule[] {
116
- if (!this.compiledCustomWarn) {
117
- this.compiledCustomWarn = this.policy.rules.filter((r) => r.action === 'warn');
118
- }
119
- return this.compiledCustomWarn;
120
- }
121
-
122
- /** 检查命令安全性 */
123
- sanitize(command: string): SanitizeResult {
124
- const trimmedCmd = command.trim();
125
-
126
- // ① 黑名单检查
127
- if (this.policy.blacklistEnabled) {
128
- for (const rule of this.getCompiledBlacklist()) {
129
- if (this.matchRule(trimmedCmd, rule)) {
130
- return {
131
- safe: false,
132
- reason: `BLOCKED: ${rule.description || rule.name}`,
133
- severity: rule.severity,
134
- };
135
- }
136
- }
137
- }
138
-
139
- // ② 删除保护(rm → mv 回收站)
140
- if (this.policy.deleteProtection) {
141
- if (this.matchRule(trimmedCmd, this.deleteProtectionRule)) {
142
- const rewritten = this.deleteProtectionRule.rewriter!(trimmedCmd);
143
- return {
144
- safe: true,
145
- rewritten,
146
- reason: 'Delete protection: rm rewritten to mv trash',
147
- severity: 'warn',
148
- };
149
- }
150
- }
151
-
152
- // ③ 自定义 rewrite 规则
153
- for (const rule of this.getCompiledCustomRewrite()) {
154
- if (!this.matchRule(trimmedCmd, rule)) continue;
155
- return {
156
- safe: true,
157
- rewritten: rule.rewriter!(trimmedCmd),
158
- reason: `Rewritten by rule: ${rule.name}`,
159
- severity: rule.severity,
160
- };
161
- }
162
-
163
- // ④ 自定义 warn 规则
164
- for (const rule of this.getCompiledCustomWarn()) {
165
- if (this.matchRule(trimmedCmd, rule)) {
166
- return {
167
- safe: true,
168
- reason: `Warning: ${rule.description || rule.name}`,
169
- severity: rule.severity,
170
- };
171
- }
172
- }
173
-
174
- // ⑤ 安全
175
- return { safe: true, severity: 'safe' };
176
- }
177
-
178
- /** 添加自定义安全规则 */
179
- addRule(rule: SecurityRule): void {
180
- this.policy.rules.push(rule);
181
- this.invalidateCompiledRules();
182
- }
183
-
184
- /** 移除规则 */
185
- removeRule(name: string): void {
186
- this.policy.rules = this.policy.rules.filter((r) => r.name !== name);
187
- this.invalidateCompiledRules();
188
- }
189
-
190
- /** 更新安全策略 */
191
- setPolicy(policy: Partial<SecurityPolicy>): void {
192
- this.policy = { ...this.policy, ...policy };
193
- if (policy.trashDir) {
194
- this.deleteProtectionRule = createDeleteProtectionRule(this.policy.trashDir);
195
- }
196
- this.invalidateCompiledRules();
197
- }
198
-
199
- /** 获取当前策略 */
200
- getPolicy(): SecurityPolicy {
201
- return { ...this.policy };
202
- }
203
-
204
- // ---- 凭证泄露检测 ----
205
-
206
- /**
207
- * 扫描并脱敏文本中的敏感信息
208
- * 将检测到的 API Key、Token、密码等替换为 [REDACTED:xxx]
209
- * @param text 输入文本(通常是工具结果)
210
- * @returns 脱敏后的文本
211
- */
212
- sanitizeCredentials(text: string): string {
213
- if (!text || text.length < 10) return text;
214
-
215
- let result = text;
216
- for (const { name, pattern } of CREDENTIAL_PATTERNS) {
217
- // 重置正则 lastIndex(全局标志下)
218
- pattern.lastIndex = 0;
219
- result = result.replace(pattern, `[REDACTED:${name}]`);
220
- }
221
- return result;
222
- }
223
-
224
- /**
225
- * 检测文本是否包含敏感信息
226
- * @param text 输入文本
227
- * @returns 检测到的敏感信息类型列表
228
- */
229
- detectCredentials(text: string): string[] {
230
- if (!text) return [];
231
- const detected: string[] = [];
232
- for (const { name, pattern } of CREDENTIAL_PATTERNS) {
233
- pattern.lastIndex = 0;
234
- if (pattern.test(text)) {
235
- detected.push(name);
236
- }
237
- }
238
- return detected;
239
- }
240
-
241
- // ---- 内部辅助 ----
242
-
243
- private matchRule(command: string, rule: SecurityRule): boolean {
244
- if (rule.pattern instanceof RegExp) {
245
- return rule.pattern.test(command);
246
- }
247
- return rule.pattern(command);
248
- }
249
- }