@ai.ntellect/core 1.0.0 → 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 (435) hide show
  1. package/.mocharc.json +6 -0
  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 +411 -142
  7. package/agent/agent-workflow.ts +569 -0
  8. package/agent/agent.ts +183 -0
  9. package/agent/base/executor.ts +103 -0
  10. package/agent/base/index.ts +87 -0
  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/agent/prompt-builder.ts +78 -0
  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/agent/base/executor.d.ts +51 -0
  44. package/dist/agent/base/executor.d.ts.map +1 -0
  45. package/dist/agent/base/executor.js +69 -0
  46. package/dist/agent/base/executor.js.map +1 -0
  47. package/dist/agent/base/index.d.ts +30 -0
  48. package/dist/agent/base/index.d.ts.map +1 -0
  49. package/dist/agent/base/index.js +88 -0
  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/agent/generic-executor.d.ts +68 -0
  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 +19 -0
  96. package/dist/agent/llm-factory.d.ts.map +1 -0
  97. package/dist/agent/llm-factory.js +297 -0
  98. package/dist/agent/llm-factory.js.map +1 -0
  99. package/dist/agent/orchestrator.d.ts +18 -0
  100. package/dist/agent/orchestrator.d.ts.map +1 -0
  101. package/dist/agent/orchestrator.js +44 -0
  102. package/dist/agent/orchestrator.js.map +1 -0
  103. package/dist/agent/prompt-builder.d.ts +35 -0
  104. package/dist/agent/prompt-builder.d.ts.map +1 -0
  105. package/dist/agent/prompt-builder.js +76 -0
  106. package/dist/agent/prompt-builder.js.map +1 -0
  107. package/dist/agent/registry.d.ts +19 -0
  108. package/dist/agent/registry.d.ts.map +1 -0
  109. package/dist/agent/registry.js +48 -0
  110. package/dist/agent/registry.js.map +1 -0
  111. package/dist/agent/tools/file-system.d.ts +11 -0
  112. package/dist/agent/tools/file-system.d.ts.map +1 -0
  113. package/dist/agent/tools/file-system.js +528 -0
  114. package/dist/agent/tools/file-system.js.map +1 -0
  115. package/dist/agent/tools/index.d.ts +4 -0
  116. package/dist/agent/tools/index.d.ts.map +1 -0
  117. package/dist/agent/tools/index.js +20 -0
  118. package/dist/agent/tools/index.js.map +1 -0
  119. package/dist/agent/tools/logger.d.ts +33 -0
  120. package/dist/agent/tools/logger.d.ts.map +1 -0
  121. package/dist/agent/tools/logger.js +86 -0
  122. package/dist/agent/tools/logger.js.map +1 -0
  123. package/dist/agent/tools/tool-resolver.d.ts +7 -0
  124. package/dist/agent/tools/tool-resolver.d.ts.map +1 -0
  125. package/dist/agent/tools/tool-resolver.js +122 -0
  126. package/dist/agent/tools/tool-resolver.js.map +1 -0
  127. package/dist/execution/adapters/in-memory-checkpoint.d.ts +11 -0
  128. package/dist/execution/adapters/in-memory-checkpoint.d.ts.map +1 -0
  129. package/dist/execution/adapters/in-memory-checkpoint.js +54 -0
  130. package/dist/execution/adapters/in-memory-checkpoint.js.map +1 -0
  131. package/dist/execution/compiler.d.ts +8 -0
  132. package/dist/execution/compiler.d.ts.map +1 -0
  133. package/dist/execution/compiler.js +50 -0
  134. package/dist/execution/compiler.js.map +1 -0
  135. package/dist/execution/controller.d.ts +30 -0
  136. package/dist/execution/controller.d.ts.map +1 -0
  137. package/dist/execution/controller.js +80 -0
  138. package/dist/execution/controller.js.map +1 -0
  139. package/dist/execution/event-manager.d.ts +29 -0
  140. package/dist/execution/event-manager.d.ts.map +1 -0
  141. package/dist/execution/event-manager.js +264 -0
  142. package/dist/execution/event-manager.js.map +1 -0
  143. package/dist/execution/index.d.ts +221 -0
  144. package/dist/execution/index.d.ts.map +1 -0
  145. package/dist/execution/index.js +638 -0
  146. package/dist/execution/index.js.map +1 -0
  147. package/dist/execution/logger.d.ts +46 -0
  148. package/dist/execution/logger.d.ts.map +1 -0
  149. package/dist/execution/logger.js +69 -0
  150. package/dist/execution/logger.js.map +1 -0
  151. package/dist/execution/node.d.ts +65 -0
  152. package/dist/execution/node.d.ts.map +1 -0
  153. package/dist/execution/node.js +250 -0
  154. package/dist/execution/node.js.map +1 -0
  155. package/dist/execution/observer.d.ts +38 -0
  156. package/dist/execution/observer.d.ts.map +1 -0
  157. package/dist/execution/observer.js +111 -0
  158. package/dist/execution/observer.js.map +1 -0
  159. package/dist/execution/planner.d.ts +14 -0
  160. package/dist/execution/planner.d.ts.map +1 -0
  161. package/dist/execution/planner.js +43 -0
  162. package/dist/execution/planner.js.map +1 -0
  163. package/dist/execution/reducer.d.ts +19 -0
  164. package/dist/execution/reducer.d.ts.map +1 -0
  165. package/dist/execution/reducer.js +61 -0
  166. package/dist/execution/reducer.js.map +1 -0
  167. package/dist/execution/registry.d.ts +38 -0
  168. package/dist/execution/registry.d.ts.map +1 -0
  169. package/dist/execution/registry.js +63 -0
  170. package/dist/execution/registry.js.map +1 -0
  171. package/dist/execution/send-api.d.ts +24 -0
  172. package/dist/execution/send-api.d.ts.map +1 -0
  173. package/dist/execution/send-api.js +52 -0
  174. package/dist/execution/send-api.js.map +1 -0
  175. package/dist/execution/types.parallel.d.ts +61 -0
  176. package/dist/execution/types.parallel.d.ts.map +1 -0
  177. package/dist/execution/types.parallel.js +3 -0
  178. package/dist/execution/types.parallel.js.map +1 -0
  179. package/dist/execution/visualizer.d.ts +35 -0
  180. package/dist/execution/visualizer.d.ts.map +1 -0
  181. package/dist/execution/visualizer.js +131 -0
  182. package/dist/execution/visualizer.js.map +1 -0
  183. package/dist/index.d.ts +47 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +78 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/interfaces/index.d.ts +487 -0
  188. package/dist/interfaces/index.d.ts.map +1 -0
  189. package/dist/interfaces/index.js +75 -0
  190. package/dist/interfaces/index.js.map +1 -0
  191. package/dist/modules/agenda/adapters/node-cron/index.d.ts +17 -0
  192. package/dist/modules/agenda/adapters/node-cron/index.d.ts.map +1 -0
  193. package/dist/modules/agenda/adapters/node-cron/index.js +30 -0
  194. package/dist/modules/agenda/adapters/node-cron/index.js.map +1 -0
  195. package/dist/modules/agenda/index.d.ts +63 -0
  196. package/dist/modules/agenda/index.d.ts.map +1 -0
  197. package/dist/modules/agenda/index.js +141 -0
  198. package/dist/modules/agenda/index.js.map +1 -0
  199. package/dist/modules/cli/index.d.ts +13 -0
  200. package/dist/modules/cli/index.d.ts.map +1 -0
  201. package/dist/modules/cli/index.js +672 -0
  202. package/dist/modules/cli/index.js.map +1 -0
  203. package/dist/modules/embedding/adapters/ai/index.d.ts +29 -0
  204. package/dist/modules/embedding/adapters/ai/index.d.ts.map +1 -0
  205. package/dist/modules/embedding/adapters/ai/index.js +58 -0
  206. package/dist/modules/embedding/adapters/ai/index.js.map +1 -0
  207. package/dist/modules/embedding/index.d.ts +36 -0
  208. package/dist/modules/embedding/index.d.ts.map +1 -0
  209. package/dist/modules/embedding/index.js +60 -0
  210. package/dist/modules/embedding/index.js.map +1 -0
  211. package/dist/modules/nlp/engine.d.ts +126 -0
  212. package/dist/modules/nlp/engine.d.ts.map +1 -0
  213. package/dist/modules/nlp/engine.js +299 -0
  214. package/dist/modules/nlp/engine.js.map +1 -0
  215. package/dist/modules/nlp/index.d.ts +27 -0
  216. package/dist/modules/nlp/index.d.ts.map +1 -0
  217. package/dist/modules/nlp/index.js +56 -0
  218. package/dist/modules/nlp/index.js.map +1 -0
  219. package/dist/persistence/index.d.ts +12 -0
  220. package/dist/persistence/index.d.ts.map +1 -0
  221. package/dist/persistence/index.js +24 -0
  222. package/dist/persistence/index.js.map +1 -0
  223. package/dist/persistence/neo4j/driver.d.ts +26 -0
  224. package/dist/persistence/neo4j/driver.d.ts.map +1 -0
  225. package/dist/persistence/neo4j/driver.js +64 -0
  226. package/dist/persistence/neo4j/driver.js.map +1 -0
  227. package/dist/persistence/neo4j/entity-store.d.ts +15 -0
  228. package/dist/persistence/neo4j/entity-store.d.ts.map +1 -0
  229. package/dist/persistence/neo4j/entity-store.js +136 -0
  230. package/dist/persistence/neo4j/entity-store.js.map +1 -0
  231. package/dist/persistence/neo4j/execution-tracer.d.ts +19 -0
  232. package/dist/persistence/neo4j/execution-tracer.d.ts.map +1 -0
  233. package/dist/persistence/neo4j/execution-tracer.js +166 -0
  234. package/dist/persistence/neo4j/execution-tracer.js.map +1 -0
  235. package/dist/persistence/neo4j/memory-adapter.d.ts +35 -0
  236. package/dist/persistence/neo4j/memory-adapter.d.ts.map +1 -0
  237. package/dist/persistence/neo4j/memory-adapter.js +252 -0
  238. package/dist/persistence/neo4j/memory-adapter.js.map +1 -0
  239. package/dist/persistence/neo4j/petri-checkpoint-adapter.d.ts +22 -0
  240. package/dist/persistence/neo4j/petri-checkpoint-adapter.d.ts.map +1 -0
  241. package/dist/persistence/neo4j/petri-checkpoint-adapter.js +141 -0
  242. package/dist/persistence/neo4j/petri-checkpoint-adapter.js.map +1 -0
  243. package/dist/pipeline/agent-pipeline.d.ts +99 -0
  244. package/dist/pipeline/agent-pipeline.d.ts.map +1 -0
  245. package/dist/pipeline/agent-pipeline.js +356 -0
  246. package/dist/pipeline/agent-pipeline.js.map +1 -0
  247. package/dist/routing/checkpoint-adapter.d.ts +30 -0
  248. package/dist/routing/checkpoint-adapter.d.ts.map +1 -0
  249. package/dist/routing/checkpoint-adapter.js +83 -0
  250. package/dist/routing/checkpoint-adapter.js.map +1 -0
  251. package/dist/routing/documentation-generator.d.ts +47 -0
  252. package/dist/routing/documentation-generator.d.ts.map +1 -0
  253. package/dist/routing/documentation-generator.js +320 -0
  254. package/dist/routing/documentation-generator.js.map +1 -0
  255. package/dist/routing/index.d.ts +38 -0
  256. package/dist/routing/index.d.ts.map +1 -0
  257. package/dist/routing/index.js +375 -0
  258. package/dist/routing/index.js.map +1 -0
  259. package/dist/routing/intent-classifier.d.ts +206 -0
  260. package/dist/routing/intent-classifier.d.ts.map +1 -0
  261. package/dist/routing/intent-classifier.js +267 -0
  262. package/dist/routing/intent-classifier.js.map +1 -0
  263. package/dist/routing/matrix.d.ts +6 -0
  264. package/dist/routing/matrix.d.ts.map +1 -0
  265. package/dist/routing/matrix.js +131 -0
  266. package/dist/routing/matrix.js.map +1 -0
  267. package/dist/routing/orchestrator.d.ts +87 -0
  268. package/dist/routing/orchestrator.d.ts.map +1 -0
  269. package/dist/routing/orchestrator.js +425 -0
  270. package/dist/routing/orchestrator.js.map +1 -0
  271. package/dist/routing/postgres-checkpoint-adapter.d.ts +32 -0
  272. package/dist/routing/postgres-checkpoint-adapter.d.ts.map +1 -0
  273. package/dist/routing/postgres-checkpoint-adapter.js +167 -0
  274. package/dist/routing/postgres-checkpoint-adapter.js.map +1 -0
  275. package/dist/routing/redis-checkpoint-adapter.d.ts +34 -0
  276. package/dist/routing/redis-checkpoint-adapter.d.ts.map +1 -0
  277. package/dist/routing/redis-checkpoint-adapter.js +170 -0
  278. package/dist/routing/redis-checkpoint-adapter.js.map +1 -0
  279. package/dist/routing/types.d.ts +49 -0
  280. package/dist/routing/types.d.ts.map +1 -0
  281. package/dist/routing/types.js +3 -0
  282. package/dist/routing/types.js.map +1 -0
  283. package/dist/types/agent.d.ts +289 -0
  284. package/dist/types/agent.d.ts.map +1 -0
  285. package/dist/types/agent.js +78 -0
  286. package/dist/types/agent.js.map +1 -0
  287. package/dist/types/index.d.ts +343 -0
  288. package/dist/types/index.d.ts.map +1 -0
  289. package/dist/types/index.js +3 -0
  290. package/dist/types/index.js.map +1 -0
  291. package/dist/utils/generate-action-schema.d.ts +4 -0
  292. package/dist/utils/generate-action-schema.d.ts.map +1 -0
  293. package/dist/utils/generate-action-schema.js +46 -0
  294. package/dist/utils/generate-action-schema.js.map +1 -0
  295. package/dist/utils/header-builder.d.ts +12 -0
  296. package/dist/utils/header-builder.d.ts.map +1 -0
  297. package/dist/utils/header-builder.js +35 -0
  298. package/dist/utils/header-builder.js.map +1 -0
  299. package/dist/utils/logger.d.ts +27 -0
  300. package/dist/utils/logger.d.ts.map +1 -0
  301. package/dist/utils/logger.js +45 -0
  302. package/dist/utils/logger.js.map +1 -0
  303. package/docs/.gitbook/assets/image (1).png +0 -0
  304. package/docs/.gitbook/assets/image (2).png +0 -0
  305. package/docs/.gitbook/assets/image (3).png +0 -0
  306. package/docs/.gitbook/assets/image (4).png +0 -0
  307. package/docs/.gitbook/assets/image (5).png +0 -0
  308. package/docs/.gitbook/assets/image (6).png +0 -0
  309. package/docs/.gitbook/assets/image.png +0 -0
  310. package/docs/README.md +57 -0
  311. package/docs/SUMMARY.md +34 -0
  312. package/docs/cas-dusages.md +69 -0
  313. package/docs/cli/README.md +65 -0
  314. package/docs/concepts-cles.md +50 -0
  315. package/docs/core/architecture.md +87 -0
  316. package/docs/core/benchmark.md +59 -0
  317. package/docs/core/checkpoint.md +72 -0
  318. package/docs/core/documentation.md +55 -0
  319. package/docs/core/graphcontroller.md +63 -0
  320. package/docs/core/graphflow.md +137 -0
  321. package/docs/core/introduction.md +41 -0
  322. package/docs/core/les-evenements.md +95 -0
  323. package/docs/modules/agenda/README.md +63 -0
  324. package/docs/modules/agenda/interface-iagenda.md +170 -0
  325. package/docs/modules/agenda/les-adaptateurs/README.md +237 -0
  326. package/docs/modules/agenda/les-adaptateurs/nodecronadapter.md +91 -0
  327. package/docs/modules/introduction.md +55 -0
  328. package/docs/modules/les-adaptateurs.md +52 -0
  329. package/docs/modules/memoire/README.md +68 -0
  330. package/docs/modules/memoire/interface-imemory.md +183 -0
  331. package/docs/modules/memoire/les-adaptateurs/README.md +209 -0
  332. package/docs/modules/memoire/les-adaptateurs/inmemoryadapter.md +110 -0
  333. package/docs/modules/memoire/les-adaptateurs/meilisearchadapter.md +147 -0
  334. package/docs/modules/memoire/les-adaptateurs/redisadapter.md +212 -0
  335. package/docs/modules/nlp/README.md +44 -0
  336. package/docs/philosophie.md +51 -0
  337. package/docs/tutoriels/ajouter-des-conditions.md +150 -0
  338. package/docs/tutoriels/branching.md +194 -0
  339. package/docs/tutoriels/checkpoint-usage.md +99 -0
  340. package/docs/tutoriels/creer-agent-onchain.md +1041 -0
  341. package/docs/tutoriels/creer-un-agent.md +108 -0
  342. package/docs/tutoriels/creer-un-graphe-simple.md +92 -0
  343. package/docs/tutoriels/gerer-les-erreurs.md +124 -0
  344. package/docs/tutoriels/pour-commencer.md +73 -0
  345. package/docs/tutoriels/retry.md +166 -0
  346. package/execution/adapters/in-memory-checkpoint.ts +35 -0
  347. package/execution/compiler.ts +47 -0
  348. package/execution/controller.ts +84 -0
  349. package/execution/event-manager.ts +331 -0
  350. package/execution/index.ts +800 -0
  351. package/execution/logger.ts +70 -0
  352. package/execution/node.ts +315 -0
  353. package/execution/observer.ts +192 -0
  354. package/execution/planner.ts +40 -0
  355. package/execution/reducer.ts +73 -0
  356. package/execution/registry.ts +86 -0
  357. package/execution/send-api.ts +58 -0
  358. package/execution/types.parallel.ts +81 -0
  359. package/execution/visualizer.ts +158 -0
  360. package/index.ts +55 -465
  361. package/interfaces/index.ts +597 -0
  362. package/modules/agenda/adapters/node-cron/index.ts +25 -0
  363. package/modules/agenda/index.ts +146 -0
  364. package/modules/cli/index.ts +580 -0
  365. package/modules/embedding/adapters/ai/index.ts +42 -0
  366. package/modules/embedding/index.ts +45 -0
  367. package/modules/nlp/engine.ts +324 -0
  368. package/modules/nlp/index.ts +45 -0
  369. package/package.json +81 -9
  370. package/persistence/index.ts +27 -0
  371. package/persistence/neo4j/driver.ts +34 -0
  372. package/persistence/neo4j/entity-store.ts +141 -0
  373. package/persistence/neo4j/execution-tracer.ts +194 -0
  374. package/persistence/neo4j/memory-adapter.ts +281 -0
  375. package/persistence/neo4j/petri-checkpoint-adapter.ts +153 -0
  376. package/pipeline/agent-pipeline.ts +426 -0
  377. package/routing/checkpoint-adapter.ts +79 -0
  378. package/routing/documentation-generator.ts +358 -0
  379. package/routing/index.ts +459 -0
  380. package/routing/intent-classifier.ts +360 -0
  381. package/routing/matrix.ts +138 -0
  382. package/routing/orchestrator.ts +498 -0
  383. package/routing/patterns/data-extraction.json +79 -0
  384. package/routing/patterns/human-approval.json +64 -0
  385. package/routing/patterns/rag-search.json +68 -0
  386. package/routing/postgres-checkpoint-adapter.ts +172 -0
  387. package/routing/redis-checkpoint-adapter.ts +187 -0
  388. package/routing/types.ts +59 -0
  389. package/routing/web-server.ts +260 -0
  390. package/scripts/generate-petri-docs.ts +70 -0
  391. package/scripts/get-gmail-token.js +65 -0
  392. package/scripts/get-gmail-token.ts +65 -0
  393. package/test/agent/agent.test.ts +92 -0
  394. package/test/agent/clone.test.ts +143 -0
  395. package/test/agent/cognitive-handler.test.ts +78 -0
  396. package/test/agent/entity-store.test.ts +80 -0
  397. package/test/agent/generic-executor.test.ts +230 -0
  398. package/test/agent/handoff.test.ts +163 -0
  399. package/test/agent/llm-factory.test.ts +40 -0
  400. package/test/agent/orchestrator.test.ts +156 -0
  401. package/test/agent/registry.test.ts +97 -0
  402. package/test/agent/tools.test.ts +267 -0
  403. package/test/execution/checkpoint.test.ts +811 -0
  404. package/test/execution/controller.test.ts +236 -0
  405. package/test/execution/event-manager.test.ts +118 -0
  406. package/test/execution/index.test.ts +690 -0
  407. package/test/execution/node.test.ts +464 -0
  408. package/test/execution/observer.test.ts +393 -0
  409. package/test/execution/parallel.test.ts +135 -0
  410. package/test/execution/plan-llm-integration.test.ts +290 -0
  411. package/test/execution/plan-real-onchain.test.ts +226 -0
  412. package/test/execution/send-api.test.ts +121 -0
  413. package/test/modules/agenda/node-cron.test.ts +307 -0
  414. package/test/modules/cli/index.test.ts +125 -0
  415. package/test/persistence/neo4j-execution-tracer.test.ts +96 -0
  416. package/test/persistence/neo4j-memory-adapter.test.ts +107 -0
  417. package/test/persistence/neo4j-petri-checkpoint.test.ts +89 -0
  418. package/test/pipeline/agent-pipeline.test.ts +118 -0
  419. package/test/routing/checkpoint-persistence.test.ts +58 -0
  420. package/test/routing/documentation-generator.test.ts +76 -0
  421. package/test/routing/integration.test.ts +261 -0
  422. package/test/routing/intent-classifier.test.ts +102 -0
  423. package/test/routing/petri.test.ts +156 -0
  424. package/test/routing/real-llm.test.ts +260 -0
  425. package/test-petri-features.ts +218 -0
  426. package/test-pipeline-api.ts +163 -0
  427. package/tsconfig.json +30 -108
  428. package/types/agent.ts +296 -0
  429. package/types/index.ts +387 -0
  430. package/utils/generate-action-schema.ts +47 -0
  431. package/utils/header-builder.ts +40 -0
  432. package/utils/logger.ts +40 -0
  433. package/package copy.json +0 -21
  434. package/types.ts +0 -62
  435. package/utils/executor.ts +0 -42
package/agent/agent.ts ADDED
@@ -0,0 +1,183 @@
1
+ import { Checkpoint, CheckpointConfig } from "@/types";
2
+ import { GraphFlow } from "../execution/index";
3
+ import { ICheckpointAdapter } from "../interfaces";
4
+ import {
5
+ AgentConfig,
6
+ AgentContext,
7
+ AgentContextSchema,
8
+ } from "../types/agent";
9
+ import { BaseAgent } from "./base";
10
+ import { GenericExecutor } from "./generic-executor";
11
+ import { AgentLogger } from "./tools/logger";
12
+ import { buildAgentWorkflow } from "./agent-workflow";
13
+ import { EntityIndex } from "./entity-resolver/entity-index";
14
+ import { EntityResolver } from "./entity-resolver/resolver";
15
+ import { ExploreStrategy } from "./entity-resolver/explore-strategy";
16
+
17
+ /**
18
+ * A generic assistant that can be configured with different roles, goals, and personalities
19
+ * @class Agent
20
+ * @example
21
+ * const assistant = new Agent({
22
+ * role: "Email Assistant",
23
+ * goal: "Help users send emails efficiently",
24
+ * backstory: "I am a professional and friendly assistant who specializes in email communication",
25
+ * llmConfig: { provider: "openai", model: "gpt-4" }
26
+ * tools: []
27
+ * });
28
+ */
29
+ export class Agent {
30
+ private executor: GenericExecutor;
31
+ private workflow: GraphFlow<typeof AgentContextSchema>;
32
+ public logger: AgentLogger;
33
+
34
+ constructor(config: AgentConfig) {
35
+ const agent = new BaseAgent({
36
+ role: config.role,
37
+ goal: config.goal,
38
+ backstory: config.backstory,
39
+ tools: config.tools,
40
+ memory: config.memory,
41
+ llmConfig: config.llmConfig,
42
+ });
43
+
44
+ const maxIterations = config.maxIterations || 5;
45
+ this.logger = new AgentLogger(config.verbose ?? true);
46
+
47
+ this.executor = new GenericExecutor(agent, config.tools, {
48
+ llmConfig: config.llmConfig,
49
+ verbose: config.verbose,
50
+ }, this.logger, {
51
+ dynamicGoal: config.dynamicGoal,
52
+ dynamicGoalPrompt: config.dynamicGoalPrompt,
53
+ dynamicNext: config.dynamicNext,
54
+ dynamicNextPrompt: config.dynamicNextPrompt,
55
+ enableSchedule: config.enableSchedule,
56
+ agenda: config.agenda,
57
+ });
58
+ this.executor.setLogger(this.logger);
59
+
60
+ const entityIndex = new EntityIndex(config.entityStore);
61
+ if (config.entityStore) {
62
+ entityIndex.hydrate().catch((err: any) =>
63
+ this.logger.log("warn", "agent", `Entity store hydration failed: ${err}`)
64
+ );
65
+ }
66
+ const entityResolver = new EntityResolver(entityIndex);
67
+ const exploreStrategy = new ExploreStrategy(entityIndex);
68
+ this.executor.setEntityIndex(entityIndex);
69
+
70
+ this.workflow = buildAgentWorkflow({
71
+ executor: this.executor,
72
+ baseAgent: agent,
73
+ logger: this.logger,
74
+ maxIterations,
75
+ enableClone: config.enableClone ?? false,
76
+ entityResolver: {
77
+ resolve: (ctx: any) => entityResolver.resolve(ctx),
78
+ getIndex: () => entityIndex,
79
+ },
80
+ exploreStrategy: {
81
+ plan: (candidates: any[], cwd: string) => exploreStrategy.plan(candidates, cwd),
82
+ },
83
+ });
84
+ }
85
+
86
+ /**
87
+ * Processes an input string through the agent's workflow
88
+ * @param {string} input - The input string to process
89
+ * @returns {Promise<AgentContext>} The resulting context after processing
90
+ */
91
+ public async process(input: string): Promise<AgentContext> {
92
+ await this.workflow.execute("defineGoal", {
93
+ input: { raw: input },
94
+ cwd: process.cwd(),
95
+ actions: [],
96
+ response: "",
97
+ scratchpad: [],
98
+ memories: [],
99
+ });
100
+
101
+ return this.workflow.getContext() as unknown as AgentContext;
102
+ }
103
+
104
+ public getWorkflow(): GraphFlow<typeof AgentContextSchema> {
105
+ return this.workflow;
106
+ }
107
+
108
+ public async processWithCheckpoint(
109
+ input: string,
110
+ adapter: ICheckpointAdapter,
111
+ config: CheckpointConfig = {}
112
+ ): Promise<{ context: AgentContext; checkpointId: string }> {
113
+ const result = await this.workflow.executeWithCheckpoint(
114
+ "defineGoal",
115
+ adapter,
116
+ {
117
+ ...config,
118
+ breakpoints: config.breakpoints || ["execute"],
119
+ initialContext: {
120
+ input: { raw: input },
121
+ cwd: process.cwd(),
122
+ scratchpad: [],
123
+ memories: [],
124
+ entityState: config.initialContext?.entityState || {
125
+ currentTarget: undefined,
126
+ lastEntityType: null,
127
+ pendingResolutions: [],
128
+ resolutionTrace: [],
129
+ explored: false,
130
+ },
131
+ conversationState: config.initialContext?.conversationState || {
132
+ currentGoal: "",
133
+ currentTarget: null,
134
+ lastResolvedEntity: null,
135
+ lastResolvedType: null,
136
+ pendingTask: null,
137
+ turnCount: 0,
138
+ pendingIntent: null,
139
+ },
140
+ explorationBudget: config.initialContext?.explorationBudget || {
141
+ maxSteps: 12,
142
+ maxExplorations: 2,
143
+ maxToolCalls: 8,
144
+ stepsUsed: 0,
145
+ explorationsUsed: 0,
146
+ toolCallsUsed: 0,
147
+ },
148
+ ...config.initialContext,
149
+ },
150
+ }
151
+ );
152
+ return {
153
+ context: result.context as unknown as AgentContext,
154
+ checkpointId: result.checkpointId,
155
+ };
156
+ }
157
+
158
+ public async resumeFromCheckpoint(
159
+ checkpointId: string,
160
+ adapter: ICheckpointAdapter,
161
+ contextModifications?: Record<string, any>
162
+ ): Promise<AgentContext> {
163
+ const result = await this.workflow.resumeFromCheckpoint(
164
+ checkpointId,
165
+ adapter,
166
+ contextModifications
167
+ );
168
+ return result as unknown as AgentContext;
169
+ }
170
+
171
+ public async listCheckpoints(
172
+ adapter: ICheckpointAdapter
173
+ ): Promise<Checkpoint<typeof AgentContextSchema>[]> {
174
+ return this.workflow.listCheckpoints(adapter);
175
+ }
176
+
177
+ public async getCheckpointHistory(
178
+ runId: string,
179
+ adapter: ICheckpointAdapter
180
+ ): Promise<Checkpoint<typeof AgentContextSchema>[]> {
181
+ return this.workflow.getCheckpointHistory(runId, adapter);
182
+ }
183
+ }
@@ -0,0 +1,103 @@
1
+ import { BaseAgent } from ".";
2
+ import { GraphFlow } from "../../execution";
3
+ import {
4
+ ActionSchema,
5
+ AgentContext,
6
+ DecisionOutput,
7
+ } from "../../types/agent";
8
+
9
+ /**
10
+ * Abstract base class for agent executors that handle action execution
11
+ * @abstract
12
+ * @class AgentExecutor
13
+ */
14
+ export abstract class AgentExecutor {
15
+ protected agent: BaseAgent;
16
+ protected availableGraphs: Map<string, GraphFlow<any>>;
17
+
18
+ /**
19
+ * Creates an instance of AgentExecutor
20
+ * @param {BaseAgent} agent - The agent instance this executor is tied to
21
+ * @param {GraphFlow<any>[]} graphs - Array of available graph flows that can be executed
22
+ */
23
+ constructor(agent: BaseAgent, graphs: GraphFlow<any>[]) {
24
+ this.agent = agent;
25
+ this.availableGraphs = new Map(graphs.map((g) => [g.name, g]));
26
+ }
27
+
28
+ /**
29
+ * Makes a decision based on the current context
30
+ * @abstract
31
+ * @param {any} context - The context to base the decision on
32
+ * @returns {Promise<DecisionOutput>} The decision output containing actions and response
33
+ */
34
+ abstract makeDecision(context: any): Promise<DecisionOutput>;
35
+
36
+ /**
37
+ * Executes a list of actions in the given context
38
+ * @param {ActionSchema[]} actions - Array of actions to execute
39
+ * @param {AgentContext} context - The context in which to execute the actions
40
+ * @returns {Promise<void>}
41
+ */
42
+ async executeActions(
43
+ actions: ActionSchema[],
44
+ context: AgentContext
45
+ ): Promise<void> {
46
+ const workflowsToExecute: GraphFlow<any>[] = [];
47
+ const startNodes: string[] = [];
48
+ const inputs: any[] = [];
49
+
50
+ for (const action of actions) {
51
+ const workflow = this.availableGraphs.get(action.name);
52
+ if (!workflow) continue;
53
+
54
+ workflowsToExecute.push(workflow);
55
+ startNodes.push(workflow.getNodes()[0].name);
56
+ inputs.push(this.prepareActionInputs(action.parameters));
57
+ }
58
+
59
+ if (workflowsToExecute.length > 0) {
60
+ await this.executeWorkflows(
61
+ workflowsToExecute,
62
+ startNodes,
63
+ inputs,
64
+ context
65
+ );
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Prepares the input parameters for an action
71
+ * @private
72
+ * @param {Array<{name: string, value: any}> | Record<string, any>} parameters - Array of parameter objects or direct object
73
+ * @returns {Record<string, any>} Object with parameter names as keys and their values
74
+ */
75
+ private prepareActionInputs(
76
+ parameters: Array<{ name: string; value: any }> | Record<string, any>
77
+ ): Record<string, any> {
78
+ if (Array.isArray(parameters)) {
79
+ return parameters.reduce((acc, param) => {
80
+ acc[param.name] = param.value;
81
+ return acc;
82
+ }, {} as Record<string, any>);
83
+ }
84
+ return parameters as Record<string, any>;
85
+ }
86
+
87
+ /**
88
+ * Executes multiple workflows with their respective inputs
89
+ * @protected
90
+ * @abstract
91
+ * @param {GraphFlow<any>[]} workflows - Array of workflows to execute
92
+ * @param {string[]} startNodes - Array of starting node names for each workflow
93
+ * @param {any[]} inputs - Array of inputs for each workflow
94
+ * @param {AgentContext} context - The context in which to execute the workflows
95
+ * @returns {Promise<void>}
96
+ */
97
+ protected abstract executeWorkflows(
98
+ workflows: GraphFlow<any>[],
99
+ startNodes: string[],
100
+ inputs: any[],
101
+ context: AgentContext
102
+ ): Promise<void>;
103
+ }
@@ -0,0 +1,87 @@
1
+ import { AgentConfig } from "@/types/agent";
2
+ import { BaseMemoryType } from "../../types";
3
+ import { Memory } from "../../modules/memory";
4
+
5
+ /**
6
+ * Base agent class that handles role, goal, and personality management
7
+ * @class BaseAgent
8
+ */
9
+ export class BaseAgent {
10
+ private config: AgentConfig;
11
+ private memory?: Memory;
12
+
13
+ constructor(config: AgentConfig) {
14
+ this.config = config;
15
+ this.memory = config.memory;
16
+ }
17
+
18
+ async execute(context: any, inputs?: any): Promise<any> {
19
+ // Log execution if verbose
20
+ if (this.config.verbose) {
21
+ console.log(`Agent ${this.config.role} executing...`);
22
+ console.log("Context:", context);
23
+ console.log("Inputs:", inputs);
24
+ }
25
+
26
+ // Store context in memory if available
27
+ if (this.memory) {
28
+ await this.storeInMemory({
29
+ type: "execution",
30
+ content: JSON.stringify({ context, inputs }),
31
+ metadata: {
32
+ role: this.config.role,
33
+ timestamp: new Date().toISOString(),
34
+ },
35
+ });
36
+ }
37
+
38
+ return context;
39
+ }
40
+
41
+ private async storeInMemory(data: {
42
+ type: string;
43
+ content: string;
44
+ metadata?: Record<string, any>;
45
+ }): Promise<BaseMemoryType | undefined> {
46
+ if (!this.memory) return;
47
+
48
+ return this.memory.createMemory({
49
+ content: data.content,
50
+ metadata: data.metadata,
51
+ roomId: "default",
52
+ });
53
+ }
54
+
55
+ public async recall(query: string): Promise<BaseMemoryType[]> {
56
+ if (!this.memory) return [];
57
+
58
+ return this.memory.getMemoryByIndex(query, {
59
+ roomId: "default",
60
+ limit: 10,
61
+ });
62
+ }
63
+
64
+ /**
65
+ * Get the agent's role - what function/job it performs
66
+ * @returns {string} The agent's role
67
+ */
68
+ public getRole(): string {
69
+ return this.config.role;
70
+ }
71
+
72
+ /**
73
+ * Get the agent's goal - what it tries to achieve
74
+ * @returns {string} The agent's goal
75
+ */
76
+ public getGoal(): string {
77
+ return this.config.goal;
78
+ }
79
+
80
+ /**
81
+ * Get the agent's backstory - its personality and behavioral traits
82
+ * @returns {string} The agent's backstory
83
+ */
84
+ public getBackstory(): string {
85
+ return this.config.backstory;
86
+ }
87
+ }
@@ -0,0 +1,54 @@
1
+ import { ScoredCandidate, Confidence } from "./types";
2
+
3
+ const HIGH_GAP = 0.3;
4
+ const MEDIUM_GAP = 0.15;
5
+
6
+ export function computeConfidence(candidates: ScoredCandidate[]): Confidence {
7
+ if (candidates.length === 0) {
8
+ return { level: "low", score: 0, gap: 0, reason: "no candidates found" };
9
+ }
10
+
11
+ if (candidates.length === 1) {
12
+ const score = candidates[0].breakdown.total;
13
+ if (score >= 0.7) {
14
+ return { level: "high", score, gap: 1, reason: "single candidate with high score" };
15
+ }
16
+ return { level: "medium", score, gap: 1, reason: "single candidate but low score" };
17
+ }
18
+
19
+ const top = candidates[0].breakdown.total;
20
+ const second = candidates[1].breakdown.total;
21
+ const gap = top - second;
22
+
23
+ if (gap >= HIGH_GAP) {
24
+ return {
25
+ level: "high",
26
+ score: top,
27
+ gap,
28
+ reason: `gap ${gap.toFixed(2)} >= ${HIGH_GAP}, clear winner: ${candidates[0].entity.filename}`,
29
+ };
30
+ }
31
+
32
+ if (gap >= MEDIUM_GAP) {
33
+ return {
34
+ level: "medium",
35
+ score: top,
36
+ gap,
37
+ reason: `gap ${gap.toFixed(2)} >= ${MEDIUM_GAP}, ambiguous: ${candidates[0].entity.filename} vs ${candidates[1].entity.filename}`,
38
+ };
39
+ }
40
+
41
+ return {
42
+ level: "low",
43
+ score: top,
44
+ gap,
45
+ reason: `gap ${gap.toFixed(2)} < ${MEDIUM_GAP}, too close: ${candidates.map(c => c.entity.filename).join(", ")}`,
46
+ };
47
+ }
48
+
49
+ export function confidenceImproved(
50
+ before: Confidence,
51
+ after: Confidence
52
+ ): boolean {
53
+ return after.score > before.score;
54
+ }
@@ -0,0 +1,241 @@
1
+ import * as path from "path";
2
+ import * as fs from "fs";
3
+ import { Entity, EntityCategory } from "./types";
4
+
5
+ export interface IEntityStore {
6
+ upsertMany(entities: Entity[]): Promise<void>;
7
+ loadAll(scope?: string): Promise<Entity[]>;
8
+ recordResolution(entityId: string, query: string, confidence: number): Promise<void>;
9
+ clear(scope?: string): Promise<void>;
10
+ }
11
+
12
+ function computeStem(filename: string): { stem: string; extension: string | null } {
13
+ const dotIdx = filename.lastIndexOf(".");
14
+ if (dotIdx <= 0) return { stem: filename, extension: null };
15
+ return { stem: filename.slice(0, dotIdx), extension: filename.slice(dotIdx) };
16
+ }
17
+
18
+ function computeTokens(stem: string): string[] {
19
+ const parts = stem.split(/[-._\s]+/).filter(Boolean);
20
+ return [...new Set(parts.map(p => p.toLowerCase()))];
21
+ }
22
+
23
+ function determineCategory(
24
+ name: string,
25
+ isDir: boolean,
26
+ _entries?: { name: string; type: string }[]
27
+ ): EntityCategory {
28
+ if (isDir) return "dir";
29
+ const ext = name.includes(".") ? name.slice(name.lastIndexOf(".")).toLowerCase() : "";
30
+ if (ext === ".test.ts" || ext === ".spec.ts" || name.includes(".test.") || name.includes(".spec."))
31
+ return "test";
32
+ return "file";
33
+ }
34
+
35
+ export type TargetResolution = {
36
+ target: string;
37
+ resolvedEntity: Entity | null;
38
+ path: string | null;
39
+ entityId: string | null;
40
+ };
41
+
42
+ export type LookupMode = "exact" | "fuzzy";
43
+
44
+ export class EntityIndex {
45
+ private entities = new Map<string, Entity[]>();
46
+ private byId = new Map<string, Entity>();
47
+ private allEntities: Entity[] = [];
48
+
49
+ constructor(private store?: IEntityStore) {}
50
+
51
+ async hydrate(scope?: string): Promise<void> {
52
+ if (!this.store) return;
53
+ const stored = await this.store.loadAll(scope);
54
+ for (const entity of stored) {
55
+ if (!this.allEntities.some(e => e.id === entity.id)) {
56
+ this.addEntity(entity);
57
+ }
58
+ }
59
+ }
60
+
61
+ private addEntity(entity: Entity): void {
62
+ const dir = path.dirname(entity.path);
63
+ if (!this.entities.has(dir)) this.entities.set(dir, []);
64
+ this.entities.get(dir)!.push(entity);
65
+
66
+ this.byId.set(entity.id, entity);
67
+ this.allEntities.push(entity);
68
+ }
69
+
70
+ ingestDirectory(dirPath: string, entries: { name: string; type: string }[]): void {
71
+ const absDir = path.resolve(dirPath);
72
+ const newEntities: Entity[] = [];
73
+ for (const entry of entries) {
74
+ const isDir = entry.type === "directory";
75
+ const fullPath = path.join(absDir, entry.name);
76
+ const { stem, extension } = computeStem(entry.name);
77
+ const id = path.relative(process.cwd(), fullPath);
78
+
79
+ if (this.allEntities.some(e => e.id === id)) continue;
80
+
81
+ const entity: Entity = {
82
+ id,
83
+ category: determineCategory(entry.name, isDir),
84
+ filename: entry.name,
85
+ stem,
86
+ extension,
87
+ tokens: computeTokens(stem),
88
+ path: fullPath,
89
+ };
90
+ this.addEntity(entity);
91
+ newEntities.push(entity);
92
+ }
93
+ if (newEntities.length > 0 && this.store) {
94
+ this.store.upsertMany(newEntities).catch(() => {});
95
+ }
96
+ }
97
+
98
+ ingestFile(filePath: string): void {
99
+ const absPath = path.resolve(filePath);
100
+ const name = path.basename(absPath);
101
+ const { stem, extension } = computeStem(name);
102
+ const isDir = fs.existsSync(absPath) && fs.statSync(absPath).isDirectory();
103
+ const id = path.relative(process.cwd(), absPath);
104
+
105
+ if (this.allEntities.some(e => e.id === id)) return;
106
+
107
+ const entity: Entity = {
108
+ id,
109
+ category: determineCategory(name, isDir),
110
+ filename: name,
111
+ stem,
112
+ extension,
113
+ tokens: computeTokens(stem),
114
+ path: absPath,
115
+ };
116
+ this.addEntity(entity);
117
+ if (this.store) {
118
+ this.store.upsertMany([entity]).catch(() => {});
119
+ }
120
+ }
121
+
122
+ lookup(query: string, options: { mode?: LookupMode } = {}): Entity[] {
123
+ const lower = query.toLowerCase();
124
+ const mode = options.mode ?? "fuzzy";
125
+ const results = new Map<string, Entity>();
126
+
127
+ for (const entity of this.allEntities) {
128
+ if (entity.filename.toLowerCase() === lower) {
129
+ results.set(entity.id, entity);
130
+ if (mode === "exact") break;
131
+ continue;
132
+ }
133
+ if (mode === "exact") continue;
134
+ if (entity.stem.toLowerCase() === lower) {
135
+ results.set(entity.id, entity);
136
+ continue;
137
+ }
138
+ for (const token of entity.tokens) {
139
+ if (token === lower || token.startsWith(lower) || lower.startsWith(token)) {
140
+ results.set(entity.id, entity);
141
+ break;
142
+ }
143
+ }
144
+ }
145
+ return Array.from(results.values());
146
+ }
147
+
148
+ resolveByTarget(target: string): Entity | null {
149
+ const lower = target.toLowerCase();
150
+ const exact = this.allEntities.find(e => e.filename.toLowerCase() === lower);
151
+ if (exact) return exact;
152
+
153
+ const stemMatch = this.allEntities.find(e => e.stem.toLowerCase() === lower);
154
+ if (stemMatch) return stemMatch;
155
+
156
+ const tokenMatch = this.allEntities.find(e => e.tokens.some(t => t === lower));
157
+ if (tokenMatch) return tokenMatch;
158
+
159
+ const anyMatch = this.allEntities.find(e =>
160
+ e.filename.toLowerCase().includes(lower) ||
161
+ e.stem.toLowerCase().includes(lower) ||
162
+ e.tokens.some(t => t.includes(lower) || lower.includes(t))
163
+ );
164
+ return anyMatch || null;
165
+ }
166
+
167
+ resolve(target: string, _toolName?: string): TargetResolution {
168
+ const clean = target.trim();
169
+
170
+ if (!clean) {
171
+ return { target: clean, resolvedEntity: null, path: null, entityId: null };
172
+ }
173
+
174
+ const resolved = this.resolveByTarget(clean);
175
+
176
+ if (resolved) {
177
+ return {
178
+ target: clean,
179
+ resolvedEntity: resolved,
180
+ path: resolved.path,
181
+ entityId: resolved.id,
182
+ };
183
+ }
184
+
185
+ return {
186
+ target: clean,
187
+ resolvedEntity: null,
188
+ path: clean,
189
+ entityId: null,
190
+ };
191
+ }
192
+
193
+ resolveToolParams(
194
+ params: Record<string, any>,
195
+ toolName: string
196
+ ): Record<string, any> {
197
+ const result = { ...params };
198
+
199
+ if (result.target) {
200
+ const resolution = this.resolve(result.target, toolName);
201
+ result.entityId = resolution.entityId;
202
+ if (resolution.path) {
203
+ result.path = resolution.path;
204
+ }
205
+ result._entityRef = result.target;
206
+ delete result.target;
207
+ }
208
+
209
+ if (!result.path && result.entityId) {
210
+ const entity = this.getById(result.entityId);
211
+ if (entity) {
212
+ result.path = entity.path;
213
+ }
214
+ }
215
+
216
+ return result;
217
+ }
218
+
219
+ getByDir(dirPath: string): Entity[] {
220
+ const absDir = path.resolve(dirPath);
221
+ return this.entities.get(absDir) || [];
222
+ }
223
+
224
+ getAll(): Entity[] {
225
+ return [...this.allEntities];
226
+ }
227
+
228
+ getById(id: string): Entity | undefined {
229
+ return this.byId.get(id) || this.allEntities.find(e => e.id === id);
230
+ }
231
+
232
+ clear(): void {
233
+ this.entities.clear();
234
+ this.byId.clear();
235
+ this.allEntities = [];
236
+ }
237
+
238
+ size(): number {
239
+ return this.allEntities.length;
240
+ }
241
+ }