@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
@@ -0,0 +1,307 @@
1
+ import { expect } from "chai";
2
+ import sinon from "sinon";
3
+ import { Agenda } from "../../../modules/agenda";
4
+ import { NodeCronAdapter } from "../../../modules/agenda/adapters/node-cron";
5
+ import { Memory } from "../../../modules/memory";
6
+ import { InMemoryAdapter } from "../../../modules/memory/adapters/in-memory";
7
+
8
+ before(function () {
9
+ this.timeout(10000);
10
+ });
11
+
12
+ describe("Agenda Service", () => {
13
+ let agenda: Agenda;
14
+ const scheduledIds: string[] = []; // Track all scheduled request IDs
15
+
16
+ beforeEach(() => {
17
+ const cronService = new NodeCronAdapter();
18
+ const inMemory = new InMemoryAdapter();
19
+ const memory = new Memory(inMemory);
20
+ agenda = new Agenda(cronService, memory);
21
+ });
22
+
23
+ afterEach(async () => {
24
+ // Cancel all scheduled requests by their IDs
25
+ scheduledIds.forEach((id) => agenda.cancelScheduledRequest(id));
26
+ scheduledIds.length = 0; // Clear the array
27
+
28
+ // Ensure all tasks are stopped
29
+ await agenda.stop();
30
+
31
+ await agenda.cancel({});
32
+
33
+ await new Promise((resolve) => setTimeout(resolve, 100));
34
+ });
35
+
36
+ describe("Request Scheduling", () => {
37
+ it("should schedule a new request and return an id", async () => {
38
+ const request = {
39
+ originalRequest: "test request",
40
+ cronExpression: "0 0 * * *",
41
+ };
42
+
43
+ const id = await agenda.scheduleRequest(request);
44
+ scheduledIds.push(id); // Track the ID
45
+
46
+ expect(id).to.be.a("string");
47
+ expect(await agenda.getScheduledRequests()).to.have.lengthOf(1);
48
+
49
+ const scheduledRequest = (await agenda.getScheduledRequests())[0];
50
+ expect(scheduledRequest.originalRequest).to.equal(
51
+ request.originalRequest
52
+ );
53
+ expect(scheduledRequest.cronExpression).to.equal(request.cronExpression);
54
+ expect(scheduledRequest.isRecurring).to.be.false;
55
+
56
+ agenda.cancelScheduledRequest(id);
57
+ });
58
+
59
+ it("should execute callbacks when scheduling and executing", async function () {
60
+ this.timeout(5000);
61
+
62
+ const onScheduledSpy = sinon.spy();
63
+ const onExecutedSpy = sinon.spy();
64
+
65
+ const request = {
66
+ originalRequest: "test request",
67
+ cronExpression: `${(new Date().getSeconds() + 1) % 60} * * * * *`,
68
+ };
69
+
70
+ const id = await agenda.scheduleRequest(request, {
71
+ onScheduled: onScheduledSpy,
72
+ onExecuted: onExecutedSpy,
73
+ });
74
+ scheduledIds.push(id);
75
+
76
+ expect(onScheduledSpy.calledOnce).to.be.true;
77
+
78
+ await new Promise<void>((resolve, reject) => {
79
+ const timeout = setTimeout(() => {
80
+ reject(new Error("Callback execution timeout"));
81
+ }, 4000);
82
+
83
+ const checkExecution = () => {
84
+ if (onExecutedSpy.calledOnce) {
85
+ clearTimeout(timeout);
86
+ agenda.cancelScheduledRequest(id);
87
+ resolve();
88
+ return;
89
+ }
90
+ setTimeout(checkExecution, 100);
91
+ };
92
+ checkExecution();
93
+ });
94
+
95
+ expect(onExecutedSpy.calledOnce).to.be.true;
96
+ });
97
+ });
98
+
99
+ describe("Request Management", () => {
100
+ it("should cancel a scheduled request", async () => {
101
+ const request = {
102
+ originalRequest: "test request",
103
+ cronExpression: "*/1 * * * *",
104
+ };
105
+
106
+ const id = await agenda.scheduleRequest(request);
107
+ scheduledIds.push(id);
108
+ expect(await agenda.getScheduledRequests()).to.have.lengthOf(1);
109
+
110
+ const cancelled = await agenda.cancelScheduledRequest(id);
111
+ expect(cancelled).to.be.true;
112
+ expect(await agenda.getScheduledRequests()).to.have.lengthOf(0);
113
+ });
114
+
115
+ it("should return false when cancelling non-existent request", async () => {
116
+ const cancelled = await agenda.cancelScheduledRequest("non-existent-id");
117
+ expect(cancelled).to.be.false;
118
+ });
119
+
120
+ it("should get all scheduled requests", async () => {
121
+ const requests = [
122
+ {
123
+ originalRequest: "request 1",
124
+ cronExpression: "*/1 * * * *",
125
+ },
126
+ {
127
+ originalRequest: "request 2",
128
+ cronExpression: "*/5 * * * *",
129
+ },
130
+ ];
131
+
132
+ for (const request of requests) {
133
+ const id = await agenda.scheduleRequest(request);
134
+ scheduledIds.push(id);
135
+ }
136
+
137
+ const scheduledRequests = await agenda.getScheduledRequests();
138
+ expect(scheduledRequests).to.have.lengthOf(2);
139
+ expect(scheduledRequests[0].originalRequest).to.equal("request 1");
140
+ expect(scheduledRequests[1].originalRequest).to.equal("request 2");
141
+ });
142
+
143
+ it("should stop all scheduled requests", async () => {
144
+ const requests = [
145
+ {
146
+ originalRequest: "request 1",
147
+ cronExpression: "*/1 * * * *",
148
+ },
149
+ {
150
+ originalRequest: "request 2",
151
+ cronExpression: "*/5 * * * *",
152
+ },
153
+ ];
154
+
155
+ for (const request of requests) {
156
+ await agenda.scheduleRequest(request);
157
+ }
158
+
159
+ expect(await agenda.getScheduledRequests()).to.have.lengthOf(2);
160
+
161
+ await agenda.stopAll();
162
+ expect(await agenda.getScheduledRequests()).to.have.lengthOf(0);
163
+ });
164
+ });
165
+
166
+ describe("Global Management", () => {
167
+ it("should stop all scheduled requests", async () => {
168
+ const requests = [
169
+ {
170
+ originalRequest: "request 1",
171
+ cronExpression: "*/1 * * * *",
172
+ },
173
+ {
174
+ originalRequest: "request 2",
175
+ cronExpression: "*/5 * * * *",
176
+ },
177
+ ];
178
+
179
+ for (const request of requests) {
180
+ await agenda.scheduleRequest(request);
181
+ }
182
+
183
+ expect(await agenda.getScheduledRequests()).to.have.lengthOf(2);
184
+
185
+ await agenda.stopAll();
186
+ expect(await agenda.getScheduledRequests()).to.have.lengthOf(0);
187
+ });
188
+ });
189
+
190
+ describe("Error Handling", () => {
191
+ it("should handle execution errors gracefully", async () => {
192
+ const consoleSpy = sinon.spy(console, "error");
193
+
194
+ const request = {
195
+ originalRequest: "error request",
196
+ cronExpression: "0 0 * * *",
197
+ };
198
+
199
+ const id = await agenda.scheduleRequest(request);
200
+
201
+ // Wait for execution
202
+ await new Promise((resolve) => setTimeout(resolve, 1100));
203
+
204
+ expect(consoleSpy.called).to.be.false;
205
+
206
+ agenda.cancelScheduledRequest(id);
207
+ consoleSpy.restore();
208
+ });
209
+ });
210
+
211
+ describe("Request Execution", () => {
212
+ it("should execute non-recurring requests only once", async function () {
213
+ this.timeout(5000);
214
+ const onExecutedSpy = sinon.spy();
215
+
216
+ const request = {
217
+ originalRequest: "single execution",
218
+ cronExpression: `${new Date().getSeconds() + 1} * * * * *`,
219
+ };
220
+
221
+ const id = await agenda.scheduleRequest(request, {
222
+ onExecuted: onExecutedSpy,
223
+ });
224
+
225
+ try {
226
+ await new Promise<void>((resolve, reject) => {
227
+ const timeout = setTimeout(
228
+ () => reject(new Error("Test timeout")),
229
+ 4000
230
+ );
231
+ const checkExecution = () => {
232
+ if (onExecutedSpy.calledOnce) {
233
+ clearTimeout(timeout);
234
+ resolve();
235
+ return;
236
+ }
237
+ setTimeout(checkExecution, 100);
238
+ };
239
+ checkExecution();
240
+ });
241
+ } finally {
242
+ agenda.cancelScheduledRequest(id);
243
+ }
244
+
245
+ expect(onExecutedSpy.calledOnce).to.be.true;
246
+ expect(await agenda.getScheduledRequests()).to.have.lengthOf(0);
247
+ });
248
+
249
+ it("should log execution status", async function () {
250
+ this.timeout(10000);
251
+ const consoleLogSpy = sinon.spy(console, "log");
252
+
253
+ const request = {
254
+ originalRequest: "test request",
255
+ cronExpression: `${new Date().getSeconds() + 1} * * * * *`,
256
+ };
257
+
258
+ const id = await agenda.scheduleRequest(request);
259
+
260
+ await new Promise<void>((resolve) => {
261
+ const checkExecution = () => {
262
+ if (
263
+ consoleLogSpy.calledWith(`🔄 Executing scheduled request: ${id}`) &&
264
+ consoleLogSpy.calledWith(
265
+ `✅ Scheduled request executed successfully: ${id}`
266
+ )
267
+ ) {
268
+ agenda.cancelScheduledRequest(id);
269
+ resolve();
270
+ return;
271
+ }
272
+ setTimeout(checkExecution, 100);
273
+ };
274
+ checkExecution();
275
+ });
276
+
277
+ expect(consoleLogSpy.calledWith(`🔄 Executing scheduled request: ${id}`))
278
+ .to.be.true;
279
+ expect(
280
+ consoleLogSpy.calledWith(
281
+ `✅ Scheduled request executed successfully: ${id}`
282
+ )
283
+ ).to.be.true;
284
+
285
+ consoleLogSpy.restore();
286
+ });
287
+ });
288
+ });
289
+
290
+ let globalAgenda: Agenda;
291
+ before(() => {
292
+ const cronService = new NodeCronAdapter();
293
+ const inMemoryAdapter = new InMemoryAdapter();
294
+ const memory = new Memory(inMemoryAdapter);
295
+ globalAgenda = new Agenda(cronService, memory);
296
+ });
297
+
298
+ after(async () => {
299
+ if (globalAgenda) {
300
+ globalAgenda.stopAll();
301
+ await new Promise((resolve) => setTimeout(resolve, 100));
302
+ }
303
+
304
+ await globalAgenda.stop();
305
+ await globalAgenda.cancel({});
306
+ await new Promise((resolve) => setTimeout(resolve, 100));
307
+ });
@@ -0,0 +1,125 @@
1
+ import { expect, use } from "chai";
2
+ import chaiAsPromised from "chai-as-promised";
3
+ import { runCLI, CLIConfig } from "../../../modules/cli/index";
4
+ import { Agent, Memory } from "../../../index";
5
+ import { InMemoryAdapter } from "../../../modules/memory/adapters/in-memory";
6
+ import { LLMProvider } from "../../../types/agent";
7
+
8
+ use(chaiAsPromised);
9
+
10
+ describe("CLI Module", function () {
11
+ describe("runCLI", function () {
12
+ it("should create an agent with ollama provider", async function () {
13
+ const config: CLIConfig = {
14
+ provider: "ollama" as LLMProvider,
15
+ model: "llama3.2:1b",
16
+ baseUrl: "http://localhost:11434",
17
+ role: "Test Assistant",
18
+ goal: "Test the CLI",
19
+ verbose: false,
20
+ };
21
+
22
+ const memory = new Memory(new InMemoryAdapter());
23
+ await memory.init();
24
+
25
+ const agent = new Agent({
26
+ role: config.role || "Helpful Assistant",
27
+ goal: config.goal || "Assist the user",
28
+ backstory: `You are a ${config.role || "assistant"}. Be concise.`,
29
+ tools: [],
30
+ llmConfig: {
31
+ provider: config.provider,
32
+ model: config.model,
33
+ baseUrl: config.baseUrl,
34
+ },
35
+ memory,
36
+ verbose: config.verbose,
37
+ });
38
+
39
+ expect(agent).to.exist;
40
+ expect(agent.constructor.name).to.equal("Agent");
41
+ });
42
+
43
+ it("should create an agent with openai provider", async function () {
44
+ const config: CLIConfig = {
45
+ provider: "openai" as LLMProvider,
46
+ model: "gpt-4o-mini",
47
+ apiKey: process.env.OPENAI_API_KEY || "test-key",
48
+ role: "OpenAI Assistant",
49
+ goal: "Test OpenAI provider",
50
+ verbose: false,
51
+ };
52
+
53
+ const memory = new Memory(new InMemoryAdapter());
54
+ await memory.init();
55
+
56
+ const agent = new Agent({
57
+ role: config.role!,
58
+ goal: config.goal!,
59
+ backstory: `You are a ${config.role}. Be concise.`,
60
+ tools: [],
61
+ llmConfig: {
62
+ provider: config.provider,
63
+ model: config.model,
64
+ apiKey: config.apiKey,
65
+ },
66
+ memory,
67
+ verbose: config.verbose,
68
+ });
69
+
70
+ expect(agent).to.exist;
71
+ expect(agent.constructor.name).to.equal("Agent");
72
+ });
73
+
74
+ it("should handle missing API key for OpenAI", function () {
75
+ const originalKey = process.env.OPENAI_API_KEY;
76
+ delete process.env.OPENAI_API_KEY;
77
+
78
+ const config: CLIConfig = {
79
+ provider: "openai" as LLMProvider,
80
+ model: "gpt-4o-mini",
81
+ role: "Test",
82
+ };
83
+
84
+ let errorThrown = false;
85
+ try {
86
+ if (!process.env.OPENAI_API_KEY && config.provider === "openai" && !config.apiKey) {
87
+ errorThrown = true;
88
+ }
89
+ } finally {
90
+ if (originalKey) {
91
+ process.env.OPENAI_API_KEY = originalKey;
92
+ }
93
+ }
94
+
95
+ expect(errorThrown).to.be.true;
96
+ });
97
+ });
98
+
99
+ describe("CLIConfig interface", function () {
100
+ it("should accept valid provider types", function () {
101
+ const providers: LLMProvider[] = ["openai", "anthropic", "ollama", "custom"];
102
+
103
+ providers.forEach((provider) => {
104
+ const config: CLIConfig = {
105
+ provider,
106
+ model: "test-model",
107
+ };
108
+ expect(config.provider).to.equal(provider);
109
+ });
110
+ });
111
+
112
+ it("should have optional fields", function () {
113
+ const config: CLIConfig = {
114
+ provider: "ollama" as LLMProvider,
115
+ model: "test-model",
116
+ };
117
+
118
+ expect(config.apiKey).to.be.undefined;
119
+ expect(config.baseUrl).to.be.undefined;
120
+ expect(config.role).to.be.undefined;
121
+ expect(config.goal).to.be.undefined;
122
+ expect(config.verbose).to.be.undefined;
123
+ });
124
+ });
125
+ });
@@ -0,0 +1,96 @@
1
+ import { expect } from "chai";
2
+ import { EventEmitter } from "events";
3
+ import { Neo4jExecutionTracer } from "../../persistence/neo4j/execution-tracer";
4
+
5
+ class MockSession {
6
+ queries: { query: string; params: any }[] = [];
7
+ records: any[] = [];
8
+ async run(query: string, params?: Record<string, any>): Promise<{ records: any[] }> {
9
+ this.queries.push({ query, params });
10
+ return { records: this.records };
11
+ }
12
+ async close(): Promise<void> {}
13
+ }
14
+
15
+ class MockDriver {
16
+ lastSession?: MockSession;
17
+ session() {
18
+ this.lastSession = new MockSession();
19
+ return this.lastSession;
20
+ }
21
+ async close() {}
22
+ }
23
+
24
+ class MockGraph extends EventEmitter {}
25
+
26
+ describe("Neo4jExecutionTracer", () => {
27
+ let driver: MockDriver;
28
+ let graph: MockGraph;
29
+ let tracer: Neo4jExecutionTracer;
30
+
31
+ beforeEach(() => {
32
+ driver = new MockDriver();
33
+ graph = new MockGraph();
34
+ tracer = Neo4jExecutionTracer.attach(graph as any, driver as any, "exec-1");
35
+ });
36
+
37
+ afterEach(() => {
38
+ tracer.detach();
39
+ });
40
+
41
+ it("should initialize execution", async () => {
42
+ await tracer.initExecution("my-graph");
43
+ expect(driver.lastSession?.queries.length).to.equal(1);
44
+ expect(driver.lastSession?.queries[0].query).to.include("MERGE (e:Execution {id: $id})");
45
+ expect(driver.lastSession?.queries[0].params.graphName).to.equal("my-graph");
46
+ });
47
+
48
+ it("should complete execution", async () => {
49
+ await tracer.completeExecution("completed");
50
+ expect(driver.lastSession?.queries.length).to.equal(1);
51
+ expect(driver.lastSession?.queries[0].query).to.include("SET e.status = $status");
52
+ expect(driver.lastSession?.queries[0].params.status).to.equal("completed");
53
+ });
54
+
55
+ it("should trace node started event", async () => {
56
+ // We mock driver session explicitly before emitting
57
+ const mockSession = new MockSession();
58
+ driver.session = () => { driver.lastSession = mockSession; return mockSession; };
59
+
60
+ graph.emit("nodeStarted", { name: "node-1" });
61
+
62
+ // give time for async handler
63
+ await new Promise(r => setTimeout(r, 10));
64
+
65
+ expect(mockSession.queries.length).to.equal(1);
66
+ expect(mockSession.queries[0].query).to.include("MERGE (n:NodeRun {id: $nodeRunId})");
67
+ expect(mockSession.queries[0].params.name).to.equal("node-1");
68
+ });
69
+
70
+ it("should trace node completed event", async () => {
71
+ const mockSession = new MockSession();
72
+ driver.session = () => { driver.lastSession = mockSession; return mockSession; };
73
+
74
+ graph.emit("nodeCompleted", { name: "node-1" });
75
+
76
+ await new Promise(r => setTimeout(r, 10));
77
+
78
+ expect(mockSession.queries.length).to.equal(1);
79
+ expect(mockSession.queries[0].query).to.include("SET n.status = \"completed\"");
80
+ expect(mockSession.queries[0].params.nodeRunId).to.equal("exec-1-node-1");
81
+ });
82
+
83
+ it("should trace node error event", async () => {
84
+ const mockSession = new MockSession();
85
+ driver.session = () => { driver.lastSession = mockSession; return mockSession; };
86
+
87
+ graph.emit("nodeError", { payload: { name: "node-2", error: new Error("Test err") } });
88
+
89
+ await new Promise(r => setTimeout(r, 10));
90
+
91
+ expect(mockSession.queries.length).to.equal(1);
92
+ expect(mockSession.queries[0].query).to.include("SET n.status = \"error\"");
93
+ expect(mockSession.queries[0].params.nodeRunId).to.equal("exec-1-node-2");
94
+ expect(mockSession.queries[0].params.error).to.equal("Test err");
95
+ });
96
+ });
@@ -0,0 +1,107 @@
1
+ import { expect } from "chai";
2
+ import { Neo4jMemoryAdapter } from "../../persistence/neo4j/memory-adapter";
3
+
4
+ class MockSession {
5
+ queries: { query: string; params: any }[] = [];
6
+ records: any[] = [];
7
+ shouldFail: boolean = false;
8
+
9
+ async run(query: string, params?: Record<string, any>): Promise<{ records: any[] }> {
10
+ this.queries.push({ query, params });
11
+ if (this.shouldFail) throw new Error("Mocked failure");
12
+ return { records: this.records };
13
+ }
14
+
15
+ async close(): Promise<void> {}
16
+ }
17
+
18
+ class MockDriver {
19
+ lastSession?: MockSession;
20
+ session(config?: { database?: string }) {
21
+ this.lastSession = new MockSession();
22
+ return this.lastSession;
23
+ }
24
+ async close() {}
25
+ }
26
+
27
+ describe("Neo4jMemoryAdapter", () => {
28
+ let driver: MockDriver;
29
+ let adapter: Neo4jMemoryAdapter;
30
+
31
+ beforeEach(() => {
32
+ driver = new MockDriver();
33
+ adapter = new Neo4jMemoryAdapter(driver as any);
34
+ });
35
+
36
+ it("should initialize and create a room", async () => {
37
+ await adapter.init("room1");
38
+ expect(driver.lastSession?.queries.length).to.equal(1);
39
+ expect(driver.lastSession?.queries[0].query).to.include("MERGE (:Room {id: $roomId})");
40
+ expect(driver.lastSession?.queries[0].params.roomId).to.equal("room1");
41
+ });
42
+
43
+ it("should create memory without embedding", async () => {
44
+ const memory = await adapter.createMemory({
45
+ id: "mem1",
46
+ content: "hello",
47
+ roomId: "room1",
48
+ metadata: { source: "test" }
49
+ });
50
+
51
+ expect(memory?.id).to.equal("mem1");
52
+ expect(driver.lastSession?.queries.length).to.equal(1);
53
+ expect(driver.lastSession?.queries[0].query).to.include("CREATE (m:Memory");
54
+ expect(driver.lastSession?.queries[0].params.roomId).to.equal("room1");
55
+ expect(driver.lastSession?.queries[0].params.metadata).to.equal('{"source":"test"}');
56
+ });
57
+
58
+ it("should create memory with embedding", async () => {
59
+ const memory = await adapter.createMemory({
60
+ id: "mem2",
61
+ content: "hello",
62
+ roomId: "room1",
63
+ embedding: [0.1, 0.2]
64
+ });
65
+
66
+ expect(memory?.embedding).to.deep.equal([0.1, 0.2]);
67
+ expect(driver.lastSession?.queries.length).to.equal(2);
68
+ expect(driver.lastSession?.queries[1].query).to.include("SET m.embedding = $embedding");
69
+ expect(driver.lastSession?.queries[1].params.embedding).to.deep.equal([0.1, 0.2]);
70
+ });
71
+
72
+ it("should get memory by ID", async () => {
73
+ if (driver.lastSession) {
74
+ driver.lastSession.records = [{
75
+ get: () => ({ properties: { id: "mem1", content: "hello", roomId: "room1", createdAt: new Date().toISOString() } })
76
+ }];
77
+ }
78
+
79
+ // Workaround to prepopulate session for the next call
80
+ const mockSession = new MockSession();
81
+ mockSession.records = [{
82
+ get: () => ({ properties: { id: "mem1", content: "hello", roomId: "room1", createdAt: new Date().toISOString() } })
83
+ }];
84
+ driver.session = () => mockSession;
85
+
86
+ const memory = await adapter.getMemoryById("mem1", "room1");
87
+ expect(memory?.content).to.equal("hello");
88
+ expect(mockSession.queries.length).to.equal(1);
89
+ expect(mockSession.queries[0].query).to.include("MATCH (m:Memory {id: $id})-[:IN_ROOM]->(:Room {id: $roomId})");
90
+ });
91
+
92
+ it("should add relation", async () => {
93
+ await adapter.addRelation({
94
+ fromId: "m1",
95
+ toId: "m2",
96
+ type: "SIMILAR",
97
+ roomId: "room1",
98
+ properties: { weight: 0.8 }
99
+ });
100
+
101
+ expect(driver.lastSession?.queries.length).to.equal(1);
102
+ expect(driver.lastSession?.queries[0].query).to.include("MERGE (from)-[r:RELATES_TO {type: $type}]->(to)");
103
+ expect(driver.lastSession?.queries[0].params.fromId).to.equal("m1");
104
+ expect(driver.lastSession?.queries[0].params.toId).to.equal("m2");
105
+ expect(driver.lastSession?.queries[0].params.weight).to.equal(0.8);
106
+ });
107
+ });