@ai.ntellect/core 0.8.3 → 1.1.0

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 (460) hide show
  1. package/.mocharc.json +2 -1
  2. package/AGENTS.md +50 -0
  3. package/ARCHITECTURE.md +58 -0
  4. package/BENCHMARK.md +38 -0
  5. package/CHANGELOG.md +224 -0
  6. package/README.md +413 -199
  7. package/agent/agent-workflow.ts +569 -0
  8. package/agent/agent.ts +183 -0
  9. package/{modules/agent → agent}/base/executor.ts +11 -8
  10. package/{modules/agent → agent}/base/index.ts +2 -14
  11. package/agent/entity-resolver/confidence.ts +54 -0
  12. package/agent/entity-resolver/entity-index.ts +241 -0
  13. package/agent/entity-resolver/explore-strategy.ts +82 -0
  14. package/agent/entity-resolver/index.ts +22 -0
  15. package/agent/entity-resolver/resolver.ts +193 -0
  16. package/agent/entity-resolver/scorer.ts +211 -0
  17. package/agent/entity-resolver/types.ts +98 -0
  18. package/agent/generic-executor.ts +713 -0
  19. package/agent/handlers/cognitive-handler.ts +197 -0
  20. package/agent/handlers/index.ts +1 -0
  21. package/agent/handoff.ts +58 -0
  22. package/agent/llm-factory.ts +343 -0
  23. package/agent/orchestrator.ts +45 -0
  24. package/{modules/agent → agent}/prompt-builder.ts +1 -1
  25. package/agent/registry.ts +64 -0
  26. package/agent/tools/file-system.ts +471 -0
  27. package/agent/tools/index.ts +23 -0
  28. package/agent/tools/logger.ts +105 -0
  29. package/agent/tools/tool-resolver.ts +104 -0
  30. package/benchmark/cortexflow-workflow.ts +182 -0
  31. package/benchmark/langgraph-workflow.ts +201 -0
  32. package/benchmark/llm-client.ts +76 -0
  33. package/benchmark/run-benchmark.ts +222 -0
  34. package/cli-dev.ts +419 -0
  35. package/dist/agent/agent-workflow.d.ts +41 -0
  36. package/dist/agent/agent-workflow.d.ts.map +1 -0
  37. package/dist/agent/agent-workflow.js +560 -0
  38. package/dist/agent/agent-workflow.js.map +1 -0
  39. package/dist/agent/agent.d.ts +38 -0
  40. package/dist/agent/agent.d.ts.map +1 -0
  41. package/dist/agent/agent.js +149 -0
  42. package/dist/agent/agent.js.map +1 -0
  43. package/dist/{modules/agent → agent}/base/executor.d.ts +3 -3
  44. package/dist/agent/base/executor.d.ts.map +1 -0
  45. package/dist/{modules/agent → agent}/base/executor.js +8 -5
  46. package/dist/agent/base/executor.js.map +1 -0
  47. package/dist/{modules/agent → agent}/base/index.d.ts +1 -1
  48. package/dist/agent/base/index.d.ts.map +1 -0
  49. package/dist/{modules/agent → agent}/base/index.js +0 -12
  50. package/dist/agent/base/index.js.map +1 -0
  51. package/dist/agent/entity-resolver/confidence.d.ts +4 -0
  52. package/dist/agent/entity-resolver/confidence.d.ts.map +1 -0
  53. package/dist/agent/entity-resolver/confidence.js +47 -0
  54. package/dist/agent/entity-resolver/confidence.js.map +1 -0
  55. package/dist/agent/entity-resolver/entity-index.d.ts +40 -0
  56. package/dist/agent/entity-resolver/entity-index.d.ts.map +1 -0
  57. package/dist/agent/entity-resolver/entity-index.js +244 -0
  58. package/dist/agent/entity-resolver/entity-index.js.map +1 -0
  59. package/dist/agent/entity-resolver/explore-strategy.d.ts +13 -0
  60. package/dist/agent/entity-resolver/explore-strategy.d.ts.map +1 -0
  61. package/dist/agent/entity-resolver/explore-strategy.js +109 -0
  62. package/dist/agent/entity-resolver/explore-strategy.js.map +1 -0
  63. package/dist/agent/entity-resolver/index.d.ts +8 -0
  64. package/dist/agent/entity-resolver/index.d.ts.map +1 -0
  65. package/dist/agent/entity-resolver/index.js +16 -0
  66. package/dist/agent/entity-resolver/index.js.map +1 -0
  67. package/dist/agent/entity-resolver/resolver.d.ts +18 -0
  68. package/dist/agent/entity-resolver/resolver.d.ts.map +1 -0
  69. package/dist/agent/entity-resolver/resolver.js +158 -0
  70. package/dist/agent/entity-resolver/resolver.js.map +1 -0
  71. package/dist/agent/entity-resolver/scorer.d.ts +3 -0
  72. package/dist/agent/entity-resolver/scorer.d.ts.map +1 -0
  73. package/dist/agent/entity-resolver/scorer.js +182 -0
  74. package/dist/agent/entity-resolver/scorer.js.map +1 -0
  75. package/dist/agent/entity-resolver/types.d.ts +89 -0
  76. package/dist/agent/entity-resolver/types.d.ts.map +1 -0
  77. package/dist/agent/entity-resolver/types.js +3 -0
  78. package/dist/agent/entity-resolver/types.js.map +1 -0
  79. package/dist/{modules/agent → agent}/generic-executor.d.ts +37 -27
  80. package/dist/agent/generic-executor.d.ts.map +1 -0
  81. package/dist/agent/generic-executor.js +620 -0
  82. package/dist/agent/generic-executor.js.map +1 -0
  83. package/dist/agent/handlers/cognitive-handler.d.ts +44 -0
  84. package/dist/agent/handlers/cognitive-handler.d.ts.map +1 -0
  85. package/dist/agent/handlers/cognitive-handler.js +172 -0
  86. package/dist/agent/handlers/cognitive-handler.js.map +1 -0
  87. package/dist/agent/handlers/index.d.ts +2 -0
  88. package/dist/agent/handlers/index.d.ts.map +1 -0
  89. package/dist/agent/handlers/index.js +7 -0
  90. package/dist/agent/handlers/index.js.map +1 -0
  91. package/dist/agent/handoff.d.ts +12 -0
  92. package/dist/agent/handoff.d.ts.map +1 -0
  93. package/dist/agent/handoff.js +62 -0
  94. package/dist/agent/handoff.js.map +1 -0
  95. package/dist/agent/llm-factory.d.ts.map +1 -0
  96. package/dist/agent/llm-factory.js +297 -0
  97. package/dist/agent/llm-factory.js.map +1 -0
  98. package/dist/agent/orchestrator.d.ts +18 -0
  99. package/dist/agent/orchestrator.d.ts.map +1 -0
  100. package/dist/agent/orchestrator.js +44 -0
  101. package/dist/agent/orchestrator.js.map +1 -0
  102. package/dist/{modules/agent → agent}/prompt-builder.d.ts +1 -1
  103. package/dist/agent/prompt-builder.d.ts.map +1 -0
  104. package/dist/agent/prompt-builder.js.map +1 -0
  105. package/dist/agent/registry.d.ts +19 -0
  106. package/dist/agent/registry.d.ts.map +1 -0
  107. package/dist/agent/registry.js +48 -0
  108. package/dist/agent/registry.js.map +1 -0
  109. package/dist/agent/tools/file-system.d.ts +11 -0
  110. package/dist/agent/tools/file-system.d.ts.map +1 -0
  111. package/dist/agent/tools/file-system.js +528 -0
  112. package/dist/agent/tools/file-system.js.map +1 -0
  113. package/dist/agent/tools/index.d.ts +4 -0
  114. package/dist/agent/tools/index.d.ts.map +1 -0
  115. package/dist/agent/tools/index.js +20 -0
  116. package/dist/agent/tools/index.js.map +1 -0
  117. package/dist/agent/tools/logger.d.ts +33 -0
  118. package/dist/agent/tools/logger.d.ts.map +1 -0
  119. package/dist/agent/tools/logger.js +86 -0
  120. package/dist/agent/tools/logger.js.map +1 -0
  121. package/dist/agent/tools/tool-resolver.d.ts +7 -0
  122. package/dist/agent/tools/tool-resolver.d.ts.map +1 -0
  123. package/dist/agent/tools/tool-resolver.js +122 -0
  124. package/dist/agent/tools/tool-resolver.js.map +1 -0
  125. package/dist/execution/adapters/in-memory-checkpoint.d.ts +11 -0
  126. package/dist/execution/adapters/in-memory-checkpoint.d.ts.map +1 -0
  127. package/dist/execution/adapters/in-memory-checkpoint.js +54 -0
  128. package/dist/execution/adapters/in-memory-checkpoint.js.map +1 -0
  129. package/dist/execution/compiler.d.ts +8 -0
  130. package/dist/execution/compiler.d.ts.map +1 -0
  131. package/dist/execution/compiler.js +50 -0
  132. package/dist/execution/compiler.js.map +1 -0
  133. package/dist/execution/controller.d.ts.map +1 -0
  134. package/dist/execution/controller.js.map +1 -0
  135. package/dist/execution/event-manager.d.ts +29 -0
  136. package/dist/execution/event-manager.d.ts.map +1 -0
  137. package/dist/{graph → execution}/event-manager.js +4 -114
  138. package/dist/execution/event-manager.js.map +1 -0
  139. package/dist/{graph → execution}/index.d.ts +50 -2
  140. package/dist/execution/index.d.ts.map +1 -0
  141. package/dist/execution/index.js +638 -0
  142. package/dist/execution/index.js.map +1 -0
  143. package/dist/execution/logger.d.ts.map +1 -0
  144. package/dist/execution/logger.js.map +1 -0
  145. package/dist/{graph → execution}/node.d.ts +6 -1
  146. package/dist/execution/node.d.ts.map +1 -0
  147. package/dist/{graph → execution}/node.js +83 -10
  148. package/dist/execution/node.js.map +1 -0
  149. package/dist/execution/observer.d.ts.map +1 -0
  150. package/dist/execution/observer.js.map +1 -0
  151. package/dist/execution/planner.d.ts +14 -0
  152. package/dist/execution/planner.d.ts.map +1 -0
  153. package/dist/execution/planner.js +43 -0
  154. package/dist/execution/planner.js.map +1 -0
  155. package/dist/execution/reducer.d.ts +19 -0
  156. package/dist/execution/reducer.d.ts.map +1 -0
  157. package/dist/execution/reducer.js +61 -0
  158. package/dist/execution/reducer.js.map +1 -0
  159. package/dist/execution/registry.d.ts +38 -0
  160. package/dist/execution/registry.d.ts.map +1 -0
  161. package/dist/execution/registry.js +63 -0
  162. package/dist/execution/registry.js.map +1 -0
  163. package/dist/execution/send-api.d.ts +24 -0
  164. package/dist/execution/send-api.d.ts.map +1 -0
  165. package/dist/execution/send-api.js +52 -0
  166. package/dist/execution/send-api.js.map +1 -0
  167. package/dist/execution/types.parallel.d.ts +61 -0
  168. package/dist/execution/types.parallel.d.ts.map +1 -0
  169. package/dist/execution/types.parallel.js +3 -0
  170. package/dist/execution/types.parallel.js.map +1 -0
  171. package/dist/execution/visualizer.d.ts.map +1 -0
  172. package/dist/execution/visualizer.js.map +1 -0
  173. package/dist/index.d.ts +27 -8
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +42 -8
  176. package/dist/index.js.map +1 -1
  177. package/dist/interfaces/index.d.ts +32 -1
  178. package/dist/interfaces/index.d.ts.map +1 -1
  179. package/dist/interfaces/index.js.map +1 -1
  180. package/dist/modules/cli/index.d.ts +13 -0
  181. package/dist/modules/cli/index.d.ts.map +1 -0
  182. package/dist/modules/cli/index.js +672 -0
  183. package/dist/modules/cli/index.js.map +1 -0
  184. package/dist/modules/nlp/engine.d.ts.map +1 -1
  185. package/dist/modules/nlp/engine.js +0 -1
  186. package/dist/modules/nlp/engine.js.map +1 -1
  187. package/dist/persistence/index.d.ts +12 -0
  188. package/dist/persistence/index.d.ts.map +1 -0
  189. package/dist/persistence/index.js +24 -0
  190. package/dist/persistence/index.js.map +1 -0
  191. package/dist/persistence/neo4j/driver.d.ts +26 -0
  192. package/dist/persistence/neo4j/driver.d.ts.map +1 -0
  193. package/dist/persistence/neo4j/driver.js +64 -0
  194. package/dist/persistence/neo4j/driver.js.map +1 -0
  195. package/dist/persistence/neo4j/entity-store.d.ts +15 -0
  196. package/dist/persistence/neo4j/entity-store.d.ts.map +1 -0
  197. package/dist/persistence/neo4j/entity-store.js +136 -0
  198. package/dist/persistence/neo4j/entity-store.js.map +1 -0
  199. package/dist/persistence/neo4j/execution-tracer.d.ts +19 -0
  200. package/dist/persistence/neo4j/execution-tracer.d.ts.map +1 -0
  201. package/dist/persistence/neo4j/execution-tracer.js +166 -0
  202. package/dist/persistence/neo4j/execution-tracer.js.map +1 -0
  203. package/dist/persistence/neo4j/memory-adapter.d.ts +35 -0
  204. package/dist/persistence/neo4j/memory-adapter.d.ts.map +1 -0
  205. package/dist/persistence/neo4j/memory-adapter.js +252 -0
  206. package/dist/persistence/neo4j/memory-adapter.js.map +1 -0
  207. package/dist/persistence/neo4j/petri-checkpoint-adapter.d.ts +22 -0
  208. package/dist/persistence/neo4j/petri-checkpoint-adapter.d.ts.map +1 -0
  209. package/dist/persistence/neo4j/petri-checkpoint-adapter.js +141 -0
  210. package/dist/persistence/neo4j/petri-checkpoint-adapter.js.map +1 -0
  211. package/dist/pipeline/agent-pipeline.d.ts +99 -0
  212. package/dist/pipeline/agent-pipeline.d.ts.map +1 -0
  213. package/dist/pipeline/agent-pipeline.js +356 -0
  214. package/dist/pipeline/agent-pipeline.js.map +1 -0
  215. package/dist/routing/checkpoint-adapter.d.ts +30 -0
  216. package/dist/routing/checkpoint-adapter.d.ts.map +1 -0
  217. package/dist/routing/checkpoint-adapter.js +83 -0
  218. package/dist/routing/checkpoint-adapter.js.map +1 -0
  219. package/dist/routing/documentation-generator.d.ts +47 -0
  220. package/dist/routing/documentation-generator.d.ts.map +1 -0
  221. package/dist/routing/documentation-generator.js +320 -0
  222. package/dist/routing/documentation-generator.js.map +1 -0
  223. package/dist/routing/index.d.ts +38 -0
  224. package/dist/routing/index.d.ts.map +1 -0
  225. package/dist/routing/index.js +375 -0
  226. package/dist/routing/index.js.map +1 -0
  227. package/dist/routing/intent-classifier.d.ts +206 -0
  228. package/dist/routing/intent-classifier.d.ts.map +1 -0
  229. package/dist/routing/intent-classifier.js +267 -0
  230. package/dist/routing/intent-classifier.js.map +1 -0
  231. package/dist/routing/matrix.d.ts +6 -0
  232. package/dist/routing/matrix.d.ts.map +1 -0
  233. package/dist/routing/matrix.js +131 -0
  234. package/dist/routing/matrix.js.map +1 -0
  235. package/dist/routing/orchestrator.d.ts +87 -0
  236. package/dist/routing/orchestrator.d.ts.map +1 -0
  237. package/dist/routing/orchestrator.js +425 -0
  238. package/dist/routing/orchestrator.js.map +1 -0
  239. package/dist/routing/postgres-checkpoint-adapter.d.ts +32 -0
  240. package/dist/routing/postgres-checkpoint-adapter.d.ts.map +1 -0
  241. package/dist/routing/postgres-checkpoint-adapter.js +167 -0
  242. package/dist/routing/postgres-checkpoint-adapter.js.map +1 -0
  243. package/dist/routing/redis-checkpoint-adapter.d.ts +34 -0
  244. package/dist/routing/redis-checkpoint-adapter.d.ts.map +1 -0
  245. package/dist/routing/redis-checkpoint-adapter.js +170 -0
  246. package/dist/routing/redis-checkpoint-adapter.js.map +1 -0
  247. package/dist/routing/types.d.ts +49 -0
  248. package/dist/routing/types.d.ts.map +1 -0
  249. package/dist/routing/types.js +3 -0
  250. package/dist/routing/types.js.map +1 -0
  251. package/dist/types/agent.d.ts +144 -88
  252. package/dist/types/agent.d.ts.map +1 -1
  253. package/dist/types/agent.js +49 -0
  254. package/dist/types/agent.js.map +1 -1
  255. package/dist/types/index.d.ts +46 -4
  256. package/dist/types/index.d.ts.map +1 -1
  257. package/dist/utils/generate-action-schema.d.ts +2 -3
  258. package/dist/utils/generate-action-schema.d.ts.map +1 -1
  259. package/dist/utils/generate-action-schema.js +3 -1
  260. package/dist/utils/generate-action-schema.js.map +1 -1
  261. package/dist/utils/logger.d.ts +27 -0
  262. package/dist/utils/logger.d.ts.map +1 -0
  263. package/dist/utils/logger.js +45 -0
  264. package/dist/utils/logger.js.map +1 -0
  265. package/docs/.gitbook/assets/image (1).png +0 -0
  266. package/docs/.gitbook/assets/image (2).png +0 -0
  267. package/docs/.gitbook/assets/image (3).png +0 -0
  268. package/docs/.gitbook/assets/image (4).png +0 -0
  269. package/docs/.gitbook/assets/image (5).png +0 -0
  270. package/docs/.gitbook/assets/image (6).png +0 -0
  271. package/docs/.gitbook/assets/image.png +0 -0
  272. package/docs/README.md +57 -0
  273. package/docs/SUMMARY.md +34 -0
  274. package/docs/cas-dusages.md +69 -0
  275. package/docs/cli/README.md +65 -0
  276. package/docs/concepts-cles.md +50 -0
  277. package/docs/core/architecture.md +87 -0
  278. package/docs/core/benchmark.md +59 -0
  279. package/docs/core/checkpoint.md +72 -0
  280. package/docs/core/documentation.md +55 -0
  281. package/docs/core/graphcontroller.md +63 -0
  282. package/docs/core/graphflow.md +137 -0
  283. package/docs/core/introduction.md +41 -0
  284. package/docs/core/les-evenements.md +95 -0
  285. package/docs/modules/agenda/README.md +63 -0
  286. package/docs/modules/agenda/interface-iagenda.md +170 -0
  287. package/docs/modules/agenda/les-adaptateurs/README.md +237 -0
  288. package/docs/modules/agenda/les-adaptateurs/nodecronadapter.md +91 -0
  289. package/docs/modules/introduction.md +55 -0
  290. package/docs/modules/les-adaptateurs.md +52 -0
  291. package/docs/modules/memoire/README.md +68 -0
  292. package/docs/modules/memoire/interface-imemory.md +183 -0
  293. package/docs/modules/memoire/les-adaptateurs/README.md +209 -0
  294. package/docs/modules/memoire/les-adaptateurs/inmemoryadapter.md +110 -0
  295. package/docs/modules/memoire/les-adaptateurs/meilisearchadapter.md +147 -0
  296. package/docs/modules/memoire/les-adaptateurs/redisadapter.md +212 -0
  297. package/docs/modules/nlp/README.md +44 -0
  298. package/docs/philosophie.md +51 -0
  299. package/docs/tutoriels/ajouter-des-conditions.md +150 -0
  300. package/docs/tutoriels/branching.md +194 -0
  301. package/docs/tutoriels/checkpoint-usage.md +99 -0
  302. package/docs/tutoriels/creer-agent-onchain.md +1041 -0
  303. package/docs/tutoriels/creer-un-agent.md +108 -0
  304. package/docs/tutoriels/creer-un-graphe-simple.md +92 -0
  305. package/docs/tutoriels/gerer-les-erreurs.md +124 -0
  306. package/docs/tutoriels/pour-commencer.md +73 -0
  307. package/docs/tutoriels/retry.md +166 -0
  308. package/execution/adapters/in-memory-checkpoint.ts +35 -0
  309. package/execution/compiler.ts +47 -0
  310. package/{graph → execution}/event-manager.ts +4 -117
  311. package/{graph → execution}/index.ts +376 -8
  312. package/{graph → execution}/node.ts +116 -12
  313. package/execution/planner.ts +40 -0
  314. package/execution/reducer.ts +73 -0
  315. package/execution/registry.ts +86 -0
  316. package/execution/send-api.ts +58 -0
  317. package/execution/types.parallel.ts +81 -0
  318. package/index.ts +35 -8
  319. package/interfaces/index.ts +37 -0
  320. package/modules/cli/index.ts +580 -0
  321. package/modules/nlp/engine.ts +0 -1
  322. package/package.json +50 -16
  323. package/persistence/index.ts +27 -0
  324. package/persistence/neo4j/driver.ts +34 -0
  325. package/persistence/neo4j/entity-store.ts +141 -0
  326. package/persistence/neo4j/execution-tracer.ts +194 -0
  327. package/persistence/neo4j/memory-adapter.ts +281 -0
  328. package/persistence/neo4j/petri-checkpoint-adapter.ts +153 -0
  329. package/pipeline/agent-pipeline.ts +426 -0
  330. package/routing/checkpoint-adapter.ts +79 -0
  331. package/routing/documentation-generator.ts +358 -0
  332. package/routing/index.ts +459 -0
  333. package/routing/intent-classifier.ts +360 -0
  334. package/routing/matrix.ts +138 -0
  335. package/routing/orchestrator.ts +498 -0
  336. package/routing/patterns/data-extraction.json +79 -0
  337. package/routing/patterns/human-approval.json +64 -0
  338. package/routing/patterns/rag-search.json +68 -0
  339. package/routing/postgres-checkpoint-adapter.ts +172 -0
  340. package/routing/redis-checkpoint-adapter.ts +187 -0
  341. package/routing/types.ts +59 -0
  342. package/routing/web-server.ts +260 -0
  343. package/scripts/generate-petri-docs.ts +70 -0
  344. package/scripts/get-gmail-token.js +65 -0
  345. package/scripts/get-gmail-token.ts +65 -0
  346. package/test/agent/agent.test.ts +92 -0
  347. package/test/agent/clone.test.ts +143 -0
  348. package/test/agent/cognitive-handler.test.ts +78 -0
  349. package/test/agent/entity-store.test.ts +80 -0
  350. package/test/agent/generic-executor.test.ts +230 -0
  351. package/test/agent/handoff.test.ts +163 -0
  352. package/test/agent/llm-factory.test.ts +40 -0
  353. package/test/agent/orchestrator.test.ts +156 -0
  354. package/test/agent/registry.test.ts +97 -0
  355. package/test/agent/tools.test.ts +267 -0
  356. package/test/execution/checkpoint.test.ts +811 -0
  357. package/test/{graph → execution}/controller.test.ts +2 -2
  358. package/test/{graph → execution}/event-manager.test.ts +1 -1
  359. package/test/{graph → execution}/index.test.ts +24 -15
  360. package/test/{graph → execution}/node.test.ts +3 -3
  361. package/test/{graph → execution}/observer.test.ts +2 -2
  362. package/test/execution/parallel.test.ts +135 -0
  363. package/test/execution/plan-llm-integration.test.ts +290 -0
  364. package/test/execution/plan-real-onchain.test.ts +226 -0
  365. package/test/execution/send-api.test.ts +121 -0
  366. package/test/modules/cli/index.test.ts +125 -0
  367. package/test/persistence/neo4j-execution-tracer.test.ts +96 -0
  368. package/test/persistence/neo4j-memory-adapter.test.ts +107 -0
  369. package/test/persistence/neo4j-petri-checkpoint.test.ts +89 -0
  370. package/test/pipeline/agent-pipeline.test.ts +118 -0
  371. package/test/routing/checkpoint-persistence.test.ts +58 -0
  372. package/test/routing/documentation-generator.test.ts +76 -0
  373. package/test/routing/integration.test.ts +261 -0
  374. package/test/routing/intent-classifier.test.ts +102 -0
  375. package/test/routing/petri.test.ts +156 -0
  376. package/test/routing/real-llm.test.ts +260 -0
  377. package/test-petri-features.ts +218 -0
  378. package/test-pipeline-api.ts +163 -0
  379. package/tsconfig.json +5 -2
  380. package/types/agent.ts +126 -4
  381. package/types/index.ts +66 -5
  382. package/utils/generate-action-schema.ts +5 -4
  383. package/utils/logger.ts +40 -0
  384. package/dist/graph/controller.d.ts.map +0 -1
  385. package/dist/graph/controller.js.map +0 -1
  386. package/dist/graph/event-manager.d.ts +0 -101
  387. package/dist/graph/event-manager.d.ts.map +0 -1
  388. package/dist/graph/event-manager.js.map +0 -1
  389. package/dist/graph/index.d.ts.map +0 -1
  390. package/dist/graph/index.js +0 -340
  391. package/dist/graph/index.js.map +0 -1
  392. package/dist/graph/logger.d.ts.map +0 -1
  393. package/dist/graph/logger.js.map +0 -1
  394. package/dist/graph/node.d.ts.map +0 -1
  395. package/dist/graph/node.js.map +0 -1
  396. package/dist/graph/observer.d.ts.map +0 -1
  397. package/dist/graph/observer.js.map +0 -1
  398. package/dist/graph/visualizer.d.ts.map +0 -1
  399. package/dist/graph/visualizer.js.map +0 -1
  400. package/dist/modules/agent/agent.d.ts +0 -35
  401. package/dist/modules/agent/agent.d.ts.map +0 -1
  402. package/dist/modules/agent/agent.js +0 -103
  403. package/dist/modules/agent/agent.js.map +0 -1
  404. package/dist/modules/agent/base/executor.d.ts.map +0 -1
  405. package/dist/modules/agent/base/executor.js.map +0 -1
  406. package/dist/modules/agent/base/index.d.ts.map +0 -1
  407. package/dist/modules/agent/base/index.js.map +0 -1
  408. package/dist/modules/agent/generic-assistant.d.ts +0 -20
  409. package/dist/modules/agent/generic-assistant.d.ts.map +0 -1
  410. package/dist/modules/agent/generic-assistant.js +0 -89
  411. package/dist/modules/agent/generic-assistant.js.map +0 -1
  412. package/dist/modules/agent/generic-executor.d.ts.map +0 -1
  413. package/dist/modules/agent/generic-executor.js +0 -189
  414. package/dist/modules/agent/generic-executor.js.map +0 -1
  415. package/dist/modules/agent/llm-factory.d.ts.map +0 -1
  416. package/dist/modules/agent/llm-factory.js +0 -56
  417. package/dist/modules/agent/llm-factory.js.map +0 -1
  418. package/dist/modules/agent/prompt-builder.d.ts.map +0 -1
  419. package/dist/modules/agent/prompt-builder.js.map +0 -1
  420. package/dist/modules/memory/adapters/in-memory/index.d.ts +0 -120
  421. package/dist/modules/memory/adapters/in-memory/index.d.ts.map +0 -1
  422. package/dist/modules/memory/adapters/in-memory/index.js +0 -212
  423. package/dist/modules/memory/adapters/in-memory/index.js.map +0 -1
  424. package/dist/modules/memory/adapters/meilisearch/index.d.ts +0 -110
  425. package/dist/modules/memory/adapters/meilisearch/index.d.ts.map +0 -1
  426. package/dist/modules/memory/adapters/meilisearch/index.js +0 -324
  427. package/dist/modules/memory/adapters/meilisearch/index.js.map +0 -1
  428. package/dist/modules/memory/adapters/redis/index.d.ts +0 -82
  429. package/dist/modules/memory/adapters/redis/index.d.ts.map +0 -1
  430. package/dist/modules/memory/adapters/redis/index.js +0 -160
  431. package/dist/modules/memory/adapters/redis/index.js.map +0 -1
  432. package/dist/modules/memory/index.d.ts +0 -67
  433. package/dist/modules/memory/index.d.ts.map +0 -1
  434. package/dist/modules/memory/index.js +0 -104
  435. package/dist/modules/memory/index.js.map +0 -1
  436. package/modules/agent/agent.ts +0 -107
  437. package/modules/agent/generic-assistant.ts +0 -92
  438. package/modules/agent/generic-executor.ts +0 -252
  439. package/modules/agent/llm-factory.ts +0 -47
  440. package/modules/memory/adapters/in-memory/index.ts +0 -208
  441. package/modules/memory/adapters/meilisearch/index.ts +0 -364
  442. package/modules/memory/adapters/redis/index.ts +0 -165
  443. package/modules/memory/index.ts +0 -93
  444. package/test/modules/memory/adapters/in-memory.test.ts +0 -153
  445. package/test/modules/memory/adapters/meilisearch.test.ts +0 -287
  446. package/test/modules/memory/base.test.ts +0 -230
  447. /package/dist/{modules/agent → agent}/llm-factory.d.ts +0 -0
  448. /package/dist/{modules/agent → agent}/prompt-builder.js +0 -0
  449. /package/dist/{graph → execution}/controller.d.ts +0 -0
  450. /package/dist/{graph → execution}/controller.js +0 -0
  451. /package/dist/{graph → execution}/logger.d.ts +0 -0
  452. /package/dist/{graph → execution}/logger.js +0 -0
  453. /package/dist/{graph → execution}/observer.d.ts +0 -0
  454. /package/dist/{graph → execution}/observer.js +0 -0
  455. /package/dist/{graph → execution}/visualizer.d.ts +0 -0
  456. /package/dist/{graph → execution}/visualizer.js +0 -0
  457. /package/{graph → execution}/controller.ts +0 -0
  458. /package/{graph → execution}/logger.ts +0 -0
  459. /package/{graph → execution}/observer.ts +0 -0
  460. /package/{graph → execution}/visualizer.ts +0 -0
@@ -0,0 +1,64 @@
1
+ import { Agent } from "./agent";
2
+
3
+ export type AgentRegistration = {
4
+ agent: Agent;
5
+ role: string;
6
+ description: string;
7
+ capabilities?: string[];
8
+ };
9
+
10
+ export class AgentRegistry {
11
+ private agents: Map<string, AgentRegistration> = new Map();
12
+
13
+ register(
14
+ name: string,
15
+ agent: Agent,
16
+ role: string,
17
+ description: string,
18
+ capabilities?: string[]
19
+ ): void {
20
+ if (this.agents.has(name)) {
21
+ throw new Error(`Agent "${name}" is already registered`);
22
+ }
23
+ this.agents.set(name, { agent, role, description, capabilities });
24
+ }
25
+
26
+ get(name: string): AgentRegistration | undefined {
27
+ return this.agents.get(name);
28
+ }
29
+
30
+ getAgent(name: string): Agent | undefined {
31
+ return this.agents.get(name)?.agent;
32
+ }
33
+
34
+ find(query: string): AgentRegistration[] {
35
+ const q = query.toLowerCase();
36
+ const results: AgentRegistration[] = [];
37
+ for (const [, reg] of this.agents) {
38
+ if (
39
+ reg.role.toLowerCase().includes(q) ||
40
+ reg.description.toLowerCase().includes(q) ||
41
+ reg.capabilities?.some((c) => c.toLowerCase().includes(q))
42
+ ) {
43
+ results.push(reg);
44
+ }
45
+ }
46
+ return results;
47
+ }
48
+
49
+ list(): AgentRegistration[] {
50
+ return Array.from(this.agents.values());
51
+ }
52
+
53
+ remove(name: string): boolean {
54
+ return this.agents.delete(name);
55
+ }
56
+
57
+ has(name: string): boolean {
58
+ return this.agents.has(name);
59
+ }
60
+
61
+ get size(): number {
62
+ return this.agents.size;
63
+ }
64
+ }
@@ -0,0 +1,471 @@
1
+ import { GraphFlow } from "../../execution/index";
2
+ import { z } from "zod";
3
+ import { spawn, exec } from "child_process";
4
+ import { promisify } from "util";
5
+ import { resolvePath } from "./tool-resolver";
6
+
7
+ const execAsync = promisify(exec);
8
+
9
+ export function createFileReaderTool(): GraphFlow<any> {
10
+ return new GraphFlow({
11
+ name: "file_reader",
12
+ schema: z.object({
13
+ entityId: z.string().describe("Entity handle from AVAILABLE ENTITY HANDLES list (e.g. 'ent_0'). Use ONLY this for target resolution."),
14
+ path: z.string().optional(),
15
+ content: z.any().optional().describe("File content (populated by tool)"),
16
+ encoding: z.enum(["utf-8", "base64"]).optional().default("utf-8").catch("utf-8").describe("File encoding (use utf-8, NOT utf8)"),
17
+ }),
18
+ context: { path: "", encoding: "utf-8", entityId: "" },
19
+ nodes: [{
20
+ name: "read",
21
+ execute: async (ctx: any) => {
22
+ const fs = await import("fs/promises");
23
+ const cwd = process.cwd();
24
+ let targetPath = ctx.path;
25
+ try {
26
+ await fs.access(targetPath);
27
+ } catch {
28
+ const resolved = resolvePath(targetPath, cwd);
29
+ const file = resolved.find(e => e.type === "file");
30
+ if (file) {
31
+ console.log(` [TOOL:file_reader] Resolved "${targetPath}" → "${file.path}"`);
32
+ targetPath = file.path;
33
+ }
34
+ }
35
+ try {
36
+ ctx.content = await fs.readFile(targetPath, ctx.encoding as BufferEncoding);
37
+ console.log(` [TOOL:file_reader] Read ${targetPath}`);
38
+ } catch (e: any) {
39
+ console.log(` [TOOL:file_reader] Error: ${e.message}`);
40
+ ctx.content = `Error: ${e.message}`;
41
+ }
42
+ },
43
+ next: [],
44
+ }],
45
+ });
46
+ }
47
+
48
+ export function createFileWriterTool(): GraphFlow<any> {
49
+ return new GraphFlow({
50
+ name: "file_writer",
51
+ schema: z.object({
52
+ entityId: z.string().describe("Entity handle from AVAILABLE ENTITY HANDLES list. Use ONLY this for target resolution."),
53
+ path: z.string().optional(),
54
+ content: z.string().describe("Content to write"),
55
+ append: z.boolean().optional().default(false).describe("Append instead of overwrite"),
56
+ success: z.any().optional().describe("Write result (populated by tool)"),
57
+ }),
58
+ context: { path: "", content: "", append: false, entityId: "" },
59
+ nodes: [{
60
+ name: "write",
61
+ execute: async (ctx: any) => {
62
+ const fs = await import("fs/promises");
63
+ const cwd = process.cwd();
64
+ let targetPath = ctx.path;
65
+ try {
66
+ await fs.access(targetPath);
67
+ } catch {
68
+ const resolved = resolvePath(targetPath, cwd);
69
+ const file = resolved.find(e => e.type === "file");
70
+ if (file) {
71
+ console.log(` [TOOL:file_writer] Resolved "${targetPath}" → "${file.path}"`);
72
+ targetPath = file.path;
73
+ }
74
+ }
75
+ try {
76
+ const flag = ctx.append ? "a" : "w";
77
+ await fs.writeFile(targetPath, ctx.content, { flag });
78
+ ctx.success = true;
79
+ console.log(` [TOOL:file_writer] ${ctx.append ? "Appended to" : "Wrote"} ${targetPath}`);
80
+ } catch (e: any) {
81
+ console.log(` [TOOL:file_writer] Error: ${e.message}`);
82
+ ctx.success = false;
83
+ }
84
+ },
85
+ next: [],
86
+ }],
87
+ });
88
+ }
89
+
90
+ export function createFileDeleterTool(): GraphFlow<any> {
91
+ return new GraphFlow({
92
+ name: "file_deleter",
93
+ schema: z.object({
94
+ entityId: z.string().describe("Entity handle from AVAILABLE ENTITY HANDLES list. Use ONLY this for target resolution."),
95
+ path: z.string().optional(),
96
+ recursive: z.boolean().optional().default(false).describe("Delete directories recursively"),
97
+ success: z.any().optional().describe("Delete result (populated by tool)"),
98
+ }),
99
+ context: { path: "", recursive: false, entityId: "" },
100
+ nodes: [{
101
+ name: "delete",
102
+ execute: async (ctx: any) => {
103
+ const fs = await import("fs/promises");
104
+ const cwd = process.cwd();
105
+ let targetPath = ctx.path;
106
+ try {
107
+ await fs.access(targetPath);
108
+ } catch {
109
+ const resolved = resolvePath(targetPath, cwd);
110
+ const entry = resolved.find(e => e.type === "file" || e.type === "dir");
111
+ if (entry) {
112
+ console.log(` [TOOL:file_deleter] Resolved "${targetPath}" → "${entry.path}"`);
113
+ targetPath = entry.path;
114
+ }
115
+ }
116
+ try {
117
+ const stat = await fs.stat(targetPath);
118
+ if (stat.isDirectory()) {
119
+ await fs.rm(targetPath, { recursive: ctx.recursive });
120
+ } else {
121
+ await fs.unlink(targetPath);
122
+ }
123
+ ctx.success = true;
124
+ console.log(` [TOOL:file_deleter] Deleted ${targetPath}`);
125
+ } catch (e: any) {
126
+ console.log(` [TOOL:file_deleter] Error: ${e.message}`);
127
+ ctx.success = false;
128
+ }
129
+ },
130
+ next: [],
131
+ }],
132
+ });
133
+ }
134
+
135
+ export function createDirectoryCreatorTool(): GraphFlow<any> {
136
+ return new GraphFlow({
137
+ name: "directory_creator",
138
+ schema: z.object({
139
+ entityId: z.string().describe("Entity handle from AVAILABLE ENTITY HANDLES list. Use ONLY this for target resolution."),
140
+ path: z.string().optional(),
141
+ recursive: z.boolean().optional().default(true).describe("Create parent directories"),
142
+ success: z.any().optional().describe("Create result (populated by tool)"),
143
+ }),
144
+ context: { path: "", recursive: true, entityId: "" },
145
+ nodes: [{
146
+ name: "mkdir",
147
+ execute: async (ctx: any) => {
148
+ const fs = await import("fs/promises");
149
+ const cwd = process.cwd();
150
+ let targetPath = ctx.path;
151
+ try {
152
+ await fs.access(targetPath);
153
+ } catch {
154
+ const resolved = resolvePath(targetPath, cwd);
155
+ const dir = resolved.find(e => e.type === "dir");
156
+ if (dir) {
157
+ console.log(` [TOOL:directory_creator] Resolved "${targetPath}" → "${dir.path}"`);
158
+ targetPath = dir.path;
159
+ }
160
+ }
161
+ try {
162
+ await fs.mkdir(targetPath, { recursive: ctx.recursive });
163
+ ctx.success = true;
164
+ console.log(` [TOOL:directory_creator] Created ${targetPath}`);
165
+ } catch (e: any) {
166
+ console.log(` [TOOL:directory_creator] Error: ${e.message}`);
167
+ ctx.success = false;
168
+ }
169
+ },
170
+ next: [],
171
+ }],
172
+ });
173
+ }
174
+
175
+ export function createDirectoryListerTool(): GraphFlow<any> {
176
+ return new GraphFlow({
177
+ name: "directory_lister",
178
+ schema: z.object({
179
+ entityId: z.string().describe("Entity handle from AVAILABLE ENTITY HANDLES list. Use ONLY this for target resolution."),
180
+ path: z.string().optional(),
181
+ entries: z.any().optional().describe("Directory entries (populated by tool)"),
182
+ }),
183
+ context: { path: "", entityId: "" },
184
+ nodes: [{
185
+ name: "list",
186
+ execute: async (ctx: any) => {
187
+ const fs = await import("fs/promises");
188
+ const cwd = process.cwd();
189
+ let targetPath = ctx.path;
190
+ try {
191
+ await fs.access(targetPath);
192
+ } catch {
193
+ const resolved = resolvePath(targetPath, cwd);
194
+ const dir = resolved.find(e => e.type === "dir");
195
+ if (dir) {
196
+ console.log(` [TOOL:directory_lister] Resolved "${targetPath}" → "${dir.path}"`);
197
+ targetPath = dir.path;
198
+ }
199
+ }
200
+ try {
201
+ const entries = await fs.readdir(targetPath, { withFileTypes: true });
202
+ ctx.entries = entries.map((e: any) => ({
203
+ name: e.name,
204
+ type: e.isDirectory() ? "directory" : "file",
205
+ }));
206
+ console.log(` [TOOL:directory_lister] Listed ${targetPath}: ${ctx.entries.length} entries`);
207
+ } catch (e: any) {
208
+ console.log(` [TOOL:directory_lister] Error: ${e.message}`);
209
+ ctx.entries = [];
210
+ }
211
+ },
212
+ next: [],
213
+ }],
214
+ });
215
+ }
216
+
217
+ const BLOCKED_COMMANDS = [
218
+ "rm -rf /", "mkfs", "dd if=", "chmod -R 777 /",
219
+ ":(){ :|:& };:", "kill -9 -1", "shutdown", "reboot", "init ",
220
+ ];
221
+
222
+ function isCommandBlocked(command: string): boolean {
223
+ const normalized = command.toLowerCase().trim();
224
+ return BLOCKED_COMMANDS.some(b => normalized.includes(b));
225
+ }
226
+
227
+ async function isDockerAvailable(): Promise<boolean> {
228
+ try {
229
+ await execAsync("docker info", { timeout: 3000 });
230
+ return true;
231
+ } catch {
232
+ return false;
233
+ }
234
+ }
235
+
236
+ async function executeInDocker(command: string, cwd: string, timeout: number): Promise<{
237
+ stdout: string; stderr: string; exitCode: number; method: string
238
+ }> {
239
+ const safeCwd = cwd.replace(/[^a-zA-Z0-9/_.\-]/g, "");
240
+ const dockerCmd = `docker run --rm --network none --memory=256m --cpus=0.5 --security-opt no-new-privileges --timeout ${timeout / 1000}s -v ${safeCwd}:/workspace:ro -w /workspace alpine:3.19 sh -c ${JSON.stringify(command)}`;
241
+ try {
242
+ const { stdout, stderr } = await execAsync(dockerCmd, { timeout, maxBuffer: 1024 * 1024 });
243
+ return { stdout: stdout.toString(), stderr: stderr.toString(), exitCode: 0, method: "docker" };
244
+ } catch (e: any) {
245
+ return {
246
+ stdout: e.stdout || "",
247
+ stderr: e.stderr || e.message || "Docker execution failed",
248
+ exitCode: typeof e.code === 'number' ? e.code : 1,
249
+ method: "docker"
250
+ };
251
+ }
252
+ }
253
+
254
+ async function executeInProcess(command: string, cwd: string, timeout: number): Promise<{
255
+ stdout: string; stderr: string; exitCode: number; method: string
256
+ }> {
257
+ const isWindows = process.platform === "win32";
258
+ const shell = isWindows ? "cmd.exe" : "/bin/sh";
259
+ const args = isWindows ? ["/c", command] : ["-c", command];
260
+ const safeEnv = { PATH: process.env.PATH || "", HOME: process.env.HOME || "", LANG: "en_US.UTF-8" };
261
+
262
+ return new Promise((resolve) => {
263
+ const child = spawn(shell, args, { cwd, env: safeEnv });
264
+ let stdout = "";
265
+ let stderr = "";
266
+ let done = false;
267
+ let timer: ReturnType<typeof setTimeout> | null = null;
268
+
269
+ const finish = (code: number) => {
270
+ if (done) return;
271
+ done = true;
272
+ if (timer) clearTimeout(timer);
273
+ resolve({ stdout, stderr, exitCode: code, method: "process" });
274
+ };
275
+
276
+ timer = setTimeout(() => {
277
+ if (!done) {
278
+ child.kill("SIGKILL");
279
+ finish(124);
280
+ }
281
+ }, timeout);
282
+
283
+ child.stdout?.on("data", (d: Buffer) => { stdout += d.toString(); });
284
+ child.stderr?.on("data", (d: Buffer) => { stderr += d.toString(); });
285
+ child.on("close", (code: number | null) => finish(code ?? 1));
286
+ child.on("error", () => finish(1));
287
+ child.on("exit", (code: number | null, sig: NodeJS.Signals | null) => {
288
+ if (code !== null) finish(code);
289
+ });
290
+ });
291
+ }
292
+
293
+ export function createShellTool(): GraphFlow<any> {
294
+ return new GraphFlow({
295
+ name: "shell",
296
+ schema: z.object({
297
+ command: z.string().describe("Shell command to execute"),
298
+ cwd: z.string().optional().describe("Working directory (host path, only used as context)"),
299
+ timeout: z.number().optional().describe("Timeout in ms (max 60000)"),
300
+ stdout: z.string().optional().describe("Command output"),
301
+ stderr: z.string().optional().describe("Error output"),
302
+ exitCode: z.number().optional().describe("Exit code"),
303
+ isolationMethod: z.string().optional().describe("Isolation method used: docker or process"),
304
+ }),
305
+ context: { command: "", cwd: process.cwd(), timeout: 30000 },
306
+ nodes: [{
307
+ name: "execute",
308
+ execute: async (ctx: any) => {
309
+ if (!ctx.command) { ctx.exitCode = 1; ctx.stderr = "No command provided"; return; }
310
+ if (isCommandBlocked(ctx.command)) {
311
+ ctx.exitCode = 1; ctx.stderr = "Command blocked for security"; ctx.isolationMethod = "blocked";
312
+ console.log(` [TOOL:shell] Blocked: ${ctx.command}`);
313
+ return;
314
+ }
315
+ const timeout = Math.min(ctx.timeout || 30000, 60000);
316
+ const cwd = ctx.cwd || process.cwd();
317
+ const dockerAvailable = await isDockerAvailable();
318
+ console.log(` [TOOL:shell] Running: ${ctx.command} (${dockerAvailable ? "docker" : "process"} isolation)`);
319
+ const result = dockerAvailable
320
+ ? await executeInDocker(ctx.command, cwd, timeout)
321
+ : await executeInProcess(ctx.command, cwd, timeout);
322
+ ctx.stdout = result.stdout;
323
+ ctx.stderr = result.stderr;
324
+ ctx.exitCode = result.exitCode;
325
+ ctx.isolationMethod = result.method;
326
+ console.log(` [TOOL:shell] Exit code: ${ctx.exitCode} [${result.method}]`);
327
+ },
328
+ next: [],
329
+ }],
330
+ });
331
+ }
332
+
333
+ export function createNodeCodeTool(): GraphFlow<any> {
334
+ return new GraphFlow({
335
+ name: "node_code",
336
+ schema: z.object({
337
+ code: z.string().describe("JavaScript/TypeScript code to execute"),
338
+ result: z.string().optional().describe("Execution result"),
339
+ error: z.string().optional().describe("Error message"),
340
+ exitCode: z.number().optional().describe("Exit code"),
341
+ isolationMethod: z.string().optional().describe("Isolation method: docker or vm"),
342
+ }),
343
+ context: { code: "", result: "", error: "", exitCode: 0 },
344
+ nodes: [{
345
+ name: "run",
346
+ execute: async (ctx: any) => {
347
+ if (!ctx.code) { ctx.exitCode = 1; ctx.error = "No code provided"; return; }
348
+ const codePreview = ctx.code.length > 80 ? ctx.code.slice(0, 80) + "..." : ctx.code;
349
+ console.log(` [TOOL:node_code] Running: ${codePreview}`);
350
+ const dockerAvailable = await isDockerAvailable();
351
+
352
+ if (dockerAvailable) {
353
+ const result = await executeInDocker(
354
+ `node -e ${JSON.stringify(ctx.code)}`,
355
+ process.cwd(),
356
+ 30000
357
+ );
358
+ ctx.result = result.stdout;
359
+ ctx.error = result.stderr;
360
+ ctx.exitCode = result.exitCode;
361
+ ctx.isolationMethod = "docker";
362
+ if (!ctx.result && !ctx.error) ctx.result = "Code executed (no output)";
363
+ } else {
364
+ console.log(` [TOOL:node_code] Docker not available, using vm.Script (limited sandbox)`);
365
+ try {
366
+ const vm = await import("vm");
367
+ const sandbox = {
368
+ ctx,
369
+ result: undefined,
370
+ error: undefined,
371
+ console: {
372
+ log: (...args: any[]) => {
373
+ sandbox._log = (sandbox._log || []).concat(
374
+ args.map(a => typeof a === 'object' ? JSON.stringify(a, null, 2) : String(a))
375
+ );
376
+ }
377
+ },
378
+ _log: [] as string[]
379
+ };
380
+ const script = new vm.Script(`
381
+ (async () => {
382
+ ${ctx.code}
383
+ })()
384
+ `);
385
+ await script.runInNewContext(sandbox);
386
+ const logOutput = sandbox._log?.join('\n') || '';
387
+ const codeResult = sandbox.ctx?.result !== undefined ? String(sandbox.ctx.result) : '';
388
+ ctx.result = logOutput || codeResult;
389
+ ctx.exitCode = 0;
390
+ ctx.isolationMethod = "vm";
391
+ if (!ctx.result) ctx.result = "Code executed (no output)";
392
+ } catch (e: any) {
393
+ ctx.error = e.message;
394
+ ctx.exitCode = 1;
395
+ ctx.isolationMethod = "vm";
396
+ }
397
+ }
398
+ console.log(` [TOOL:node_code] Exit code: ${ctx.exitCode} [${ctx.isolationMethod}]`);
399
+ if (ctx.result) console.log(` [TOOL:node_code] Result: ${ctx.result.slice(0, 200)}`);
400
+ },
401
+ next: [],
402
+ }],
403
+ });
404
+ }
405
+
406
+ export function createPythonCodeTool(): GraphFlow<any> {
407
+ return new GraphFlow({
408
+ name: "python_code",
409
+ schema: z.object({
410
+ code: z.string().describe("Python code to execute"),
411
+ result: z.string().optional().describe("Execution result (stdout)"),
412
+ error: z.string().optional().describe("Error message (stderr)"),
413
+ exitCode: z.number().optional().describe("Exit code"),
414
+ isolationMethod: z.string().optional().describe("Isolation method: docker or process"),
415
+ }),
416
+ context: { code: "", result: "", error: "", exitCode: 0 },
417
+ nodes: [{
418
+ name: "run",
419
+ execute: async (ctx: any) => {
420
+ if (!ctx.code) {
421
+ ctx.exitCode = 1;
422
+ ctx.error = "No code provided";
423
+ return;
424
+ }
425
+ const codePreview = ctx.code.length > 80 ? ctx.code.slice(0, 80) + "..." : ctx.code;
426
+ console.log(` [TOOL:python_code] Running: ${codePreview}`);
427
+ const timeout = 30000;
428
+ const dockerAvailable = await isDockerAvailable();
429
+
430
+ if (dockerAvailable) {
431
+ const result = await executeInDocker(
432
+ `python3 -c ${JSON.stringify(ctx.code)}`,
433
+ process.cwd(),
434
+ timeout
435
+ );
436
+ ctx.result = result.stdout;
437
+ ctx.error = result.stderr;
438
+ ctx.exitCode = result.exitCode;
439
+ ctx.isolationMethod = "docker";
440
+ } else {
441
+ const result = await executeInProcess(
442
+ `python3 -c ${JSON.stringify(ctx.code)}`,
443
+ process.cwd(),
444
+ timeout
445
+ );
446
+ ctx.result = result.stdout;
447
+ ctx.error = result.stderr;
448
+ ctx.exitCode = result.exitCode;
449
+ ctx.isolationMethod = "process";
450
+ }
451
+ console.log(` [TOOL:python_code] Exit code: ${ctx.exitCode} [${ctx.isolationMethod}]`);
452
+ if (ctx.result) console.log(` [TOOL:python_code] Output: ${ctx.result.slice(0, 300)}`);
453
+ if (ctx.error) console.log(` [TOOL:python_code] Stderr: ${ctx.error.slice(0, 200)}`);
454
+ },
455
+ next: [],
456
+ }],
457
+ });
458
+ }
459
+
460
+ export function createAllAgentTools(): GraphFlow<any>[] {
461
+ return [
462
+ createFileReaderTool(),
463
+ createFileWriterTool(),
464
+ createFileDeleterTool(),
465
+ createDirectoryCreatorTool(),
466
+ createDirectoryListerTool(),
467
+ createShellTool(),
468
+ createNodeCodeTool(),
469
+ createPythonCodeTool(),
470
+ ];
471
+ }
@@ -0,0 +1,23 @@
1
+ export {
2
+ createFileReaderTool,
3
+ createFileWriterTool,
4
+ createFileDeleterTool,
5
+ createDirectoryCreatorTool,
6
+ createDirectoryListerTool,
7
+ createShellTool,
8
+ createNodeCodeTool,
9
+ createPythonCodeTool,
10
+ createAllAgentTools,
11
+ } from "./file-system";
12
+
13
+ export {
14
+ AgentLogger,
15
+ logger,
16
+ type LogLevel,
17
+ type LogEntry,
18
+ } from "./logger";
19
+
20
+ export {
21
+ resolvePath,
22
+ findInCwd,
23
+ } from "./tool-resolver";
@@ -0,0 +1,105 @@
1
+ import chalk from "chalk";
2
+
3
+ export type LogLevel = "debug" | "info" | "warn" | "error";
4
+ export type LogEntry = {
5
+ timestamp: Date;
6
+ level: LogLevel;
7
+ source: string;
8
+ message: string;
9
+ data?: any;
10
+ };
11
+
12
+ export class AgentLogger {
13
+ private logs: LogEntry[] = [];
14
+ private enabled: boolean;
15
+ private maxLogs: number;
16
+
17
+ constructor(enabled: boolean = true, maxLogs: number = 1000) {
18
+ this.enabled = enabled;
19
+ this.maxLogs = maxLogs;
20
+ }
21
+
22
+ enable(): void { this.enabled = true; }
23
+ disable(): void { this.enabled = false; }
24
+ isEnabled(): boolean { return this.enabled; }
25
+
26
+ log(level: LogLevel, source: string, message: string, data?: any): void {
27
+ const entry: LogEntry = {
28
+ timestamp: new Date(),
29
+ level,
30
+ source,
31
+ message,
32
+ data,
33
+ };
34
+
35
+ this.logs.push(entry);
36
+ if (this.logs.length > this.maxLogs) {
37
+ this.logs.shift();
38
+ }
39
+
40
+ if (!this.enabled) return;
41
+
42
+ const colors: Record<LogLevel, any> = {
43
+ debug: chalk.gray,
44
+ info: chalk.blue,
45
+ warn: chalk.yellow,
46
+ error: chalk.red,
47
+ };
48
+
49
+ const time = new Date().toLocaleTimeString("fr-FR", {hour12: false});
50
+ const prefix = colors[level](`[${time}]`);
51
+ const src = chalk.cyan(`[${source}]`);
52
+
53
+ console.log(`${prefix} ${src} ${message}`);
54
+ }
55
+
56
+ debug(source: string, message: string, data?: any): void { this.log("debug", source, message, data); }
57
+ info(source: string, message: string, data?: any): void { this.log("info", source, message, data); }
58
+ warn(source: string, message: string, data?: any): void { this.log("warn", source, message, data); }
59
+ error(source: string, message: string, data?: any): void { this.log("error", source, message, data); }
60
+
61
+ think(source: string, message: string, reasoning?: string): void {
62
+ const time = new Date().toLocaleTimeString("fr-FR", {hour12: false});
63
+ console.log(`${chalk.cyan(`[${time}]`)} ${chalk.cyan(`[${source}]`)} ${message}`);
64
+ if (reasoning) {
65
+ console.log(chalk.gray(" → ") + chalk.gray(reasoning.substring(0, 500)));
66
+ }
67
+ }
68
+
69
+ action(source: string, toolName: string, params: any): void {
70
+ const time = new Date().toLocaleTimeString("fr-FR", {hour12: false});
71
+ const p = JSON.stringify(params).substring(0, 150);
72
+ console.log(`${chalk.yellow(`[${time}]`)} ${chalk.cyan(`[${source}]`)} → ${toolName}(${p})`);
73
+ }
74
+
75
+ result(source: string, toolName: string, result: any): void {
76
+ const time = new Date().toLocaleTimeString("fr-FR", {hour12: false});
77
+ const r = JSON.stringify(result).substring(0, 150);
78
+ console.log(`${chalk.green(`[${time}]`)} ${chalk.green(`[${source}]`)} ${toolName} → ${r})`);
79
+ }
80
+
81
+ getLogs(): LogEntry[] { return [...this.logs]; }
82
+ getLogsByLevel(level: LogLevel): LogEntry[] { return this.logs.filter((l) => l.level === level); }
83
+ getLogsBySource(source: string): LogEntry[] { return this.logs.filter((l) => l.source === source); }
84
+ clearLogs(): void { this.logs = []; }
85
+
86
+ exportHistory(): string {
87
+ return this.logs.map((l) => {
88
+ const time = l.timestamp.toISOString();
89
+ const dataStr = l.data ? ` | ${JSON.stringify(l.data)}` : "";
90
+ return `[${time}] [${l.level.toUpperCase()}] [${l.source}] ${l.message}${dataStr}`;
91
+ }).join("\n");
92
+ }
93
+
94
+ printSummary(): void {
95
+ console.log(chalk.bold("\n=== Agent Log Summary ==="));
96
+ console.log(`Total logs: ${this.logs.length}`);
97
+ console.log(`Debug: ${this.getLogsByLevel("debug").length}`);
98
+ console.log(`Info: ${this.getLogsByLevel("info").length}`);
99
+ console.log(`Warn: ${this.getLogsByLevel("warn").length}`);
100
+ console.log(`Error: ${this.getLogsByLevel("error").length}`);
101
+ console.log(chalk.bold("========================\n"));
102
+ }
103
+ }
104
+
105
+ export const logger = new AgentLogger(true);