@ai.ntellect/core 1.0.0 → 1.1.1

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 +363 -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,690 @@
1
+ import { expect, use } from "chai";
2
+ import chaiAsPromised from "chai-as-promised";
3
+ import EventEmitter from "events";
4
+ import sinon from "sinon";
5
+ import { z } from "zod";
6
+ import { GraphController } from "../../execution/controller";
7
+ import { GraphFlow } from "../../execution/index";
8
+ import { GraphConfig, GraphContext, GraphNodeConfig } from "../../types";
9
+
10
+ use(chaiAsPromised);
11
+
12
+ /**
13
+ * Test schema definition using Zod for graph context validation
14
+ * Defines a schema with:
15
+ * - value: numeric value for tracking state changes
16
+ * - counter: numeric value for tracking state changes
17
+ * - message: string for tracking state changes
18
+ * - eventPayload: optional object containing transaction metadata
19
+ */
20
+ const TestSchema = z.object({
21
+ value: z.number().min(0).default(0),
22
+ counter: z.number().default(0),
23
+ message: z.string().default(""),
24
+ eventPayload: z
25
+ .object({
26
+ transactionId: z.string().optional(),
27
+ status: z.string().optional(),
28
+ })
29
+ .optional(),
30
+ });
31
+
32
+ type TestSchema = typeof TestSchema;
33
+
34
+ /**
35
+ * Test suite for the Graph Flow implementation
36
+ * This suite validates the core functionality of the graph-based workflow system:
37
+ * - Node execution and state management through context
38
+ * - Event handling (emission, correlation, waiting)
39
+ * - Error handling and retry mechanisms
40
+ * - Input/Output validation using Zod schemas
41
+ * - Complex workflows with multiple branches and conditions
42
+ * - Parallel and sequential execution patterns
43
+ *
44
+ * The tests use a simple numeric value-based context to demonstrate state changes
45
+ * and a transaction-based event payload for testing event correlation.
46
+ */
47
+ describe("GraphFlow", function () {
48
+ let graph: GraphFlow<TestSchema>;
49
+ let eventEmitter: EventEmitter;
50
+
51
+ beforeEach(() => {
52
+ eventEmitter = new EventEmitter();
53
+ graph = new GraphFlow({
54
+ name: "TestGraph",
55
+ schema: TestSchema,
56
+ nodes: [],
57
+ context: { value: 0, counter: 0, message: "" },
58
+ eventEmitter: eventEmitter,
59
+ });
60
+ });
61
+
62
+ /**
63
+ * Tests basic node execution and context update functionality
64
+ * Validates that:
65
+ * - A node can be added to the graph
66
+ * - The node's execute function is called
67
+ * - The context is properly updated
68
+ * - The updated context is accessible after execution
69
+ */
70
+ it("should execute a simple node and update the context", async function () {
71
+ const simpleNode: GraphNodeConfig<TestSchema> = {
72
+ name: "simpleNode",
73
+ execute: async (context) => {
74
+ context.value = (context.value ?? 0) + 1;
75
+ },
76
+ next: [],
77
+ };
78
+
79
+ graph.addNode(simpleNode);
80
+ await graph.execute("simpleNode");
81
+
82
+ const context = graph.getContext();
83
+ expect(context.value).to.equal(1);
84
+ });
85
+
86
+ /**
87
+ * Tests event emission for node lifecycle events
88
+ * Validates that the graph properly emits events for:
89
+ * - Node execution start (nodeStarted)
90
+ * - Node execution completion (nodeCompleted)
91
+ * This is crucial for monitoring and debugging workflow execution
92
+ */
93
+ it("should trigger `nodeStarted` and `nodeCompleted` events", async function () {
94
+ const nodeStartedSpy = sinon.spy();
95
+ const nodeCompletedSpy = sinon.spy();
96
+
97
+ graph.on("nodeStarted", nodeStartedSpy);
98
+ graph.on("nodeCompleted", nodeCompletedSpy);
99
+
100
+ const testNode: GraphNodeConfig<TestSchema> = {
101
+ name: "testNode",
102
+ execute: async (context) => {
103
+ context.value = (context.value ?? 0) + 1;
104
+ },
105
+ next: [],
106
+ };
107
+
108
+ graph.addNode(testNode);
109
+ await graph.execute("testNode");
110
+
111
+ expect(nodeStartedSpy.calledOnce).to.be.true;
112
+ expect(nodeCompletedSpy.calledOnce).to.be.true;
113
+ });
114
+
115
+ /**
116
+ * Tests error handling and error event emission
117
+ * Validates that:
118
+ * - Errors in node execution are properly caught
119
+ * - The nodeError event is emitted
120
+ * - The error message is preserved
121
+ * This ensures robust error handling in the workflow
122
+ */
123
+ it("should handle errors and trigger `nodeError` event", async function () {
124
+ const errorNode: GraphNodeConfig<TestSchema> = {
125
+ name: "errorNode",
126
+ execute: async () => {
127
+ throw new Error("Test error");
128
+ },
129
+ next: [],
130
+ };
131
+
132
+ graph.addNode(errorNode);
133
+ const nodeErrorSpy = sinon.spy();
134
+ graph.on("nodeError", nodeErrorSpy);
135
+
136
+ try {
137
+ await graph.execute("errorNode");
138
+ } catch (error) {
139
+ expect((error as Error).message).to.equal("Test error");
140
+ }
141
+
142
+ expect(nodeErrorSpy.calledOnce).to.be.true;
143
+ });
144
+
145
+ /**
146
+ * Tests context validation using Zod schema
147
+ * Validates that:
148
+ * - Invalid context values are rejected
149
+ * - Proper error messages are generated
150
+ * - Type safety is maintained during execution
151
+ * This ensures data integrity throughout the workflow
152
+ */
153
+ it("should validate context with Zod", async function () {
154
+ const invalidContext = { value: "invalid_string" };
155
+
156
+ try {
157
+ const simpleNode: GraphNodeConfig<TestSchema> = {
158
+ name: "simpleNode",
159
+ execute: async (context) => {
160
+ context.value = (context.value ?? 0) + 1;
161
+ },
162
+ next: [],
163
+ };
164
+
165
+ graph.addNode(simpleNode);
166
+ await graph.execute("simpleNode", invalidContext as any);
167
+ expect.fail("Should have thrown an error");
168
+ } catch (error: any) {
169
+ // Zod v4 changed validation error wording
170
+ expect(error.message).to.satisfy(
171
+ (msg: string) => msg.includes("Expected number") || msg.includes("Invalid input")
172
+ );
173
+ }
174
+ });
175
+
176
+ /**
177
+ * Tests node execution with input/output validation
178
+ * Demonstrates:
179
+ * - Input parameter validation
180
+ * - Output state validation
181
+ * - Integration between node execution and validation
182
+ * Ensures type safety and data consistency in node interactions
183
+ */
184
+ it("should execute a node with validated params and outputs", async function () {
185
+ const graph = new GraphFlow({
186
+ name: "test",
187
+ schema: TestSchema,
188
+ nodes: [
189
+ {
190
+ name: "validatedNode",
191
+ execute: async (context: GraphContext<TestSchema>) => {
192
+ context.value = 5;
193
+ },
194
+ },
195
+ ],
196
+ context: { value: 0, counter: 0, message: "" },
197
+ });
198
+
199
+ await graph.execute("validatedNode");
200
+ expect(graph.getContext().value).to.equal(5);
201
+ });
202
+
203
+ /**
204
+ * Tests conditional node execution
205
+ * Validates that:
206
+ * - Nodes can have conditional execution logic
207
+ * - Conditions are evaluated against current context
208
+ * - Nodes are skipped when conditions are not met
209
+ * This enables dynamic workflow paths based on state
210
+ */
211
+ it("should not execute a node when condition is false", async function () {
212
+ const conditionalNode: GraphNodeConfig<TestSchema> = {
213
+ name: "conditionalNode",
214
+ condition: (context) => (context.value ?? 0) > 0,
215
+ execute: async (context) => {
216
+ context.value = (context.value ?? 0) + 10;
217
+ },
218
+ next: [],
219
+ };
220
+
221
+ graph.addNode(conditionalNode);
222
+ await graph.execute("conditionalNode");
223
+
224
+ const context = graph.getContext();
225
+ expect(context.value).to.equal(0);
226
+ });
227
+
228
+ /**
229
+ * Tests node retry functionality
230
+ * Validates the retry mechanism:
231
+ * - Maximum attempt limits
232
+ * - Retry delays
233
+ * - Success after retry
234
+ * - Context preservation between attempts
235
+ * Essential for handling transient failures in workflows
236
+ */
237
+ it("should retry a node execution when it fails", async () => {
238
+ let attempts = 0;
239
+ const retryNode: GraphNodeConfig<TestSchema> = {
240
+ name: "retryNode",
241
+ execute: async (context) => {
242
+ attempts++;
243
+ if (attempts < 3) {
244
+ throw new Error("Temporary failure");
245
+ }
246
+ context.value = 42;
247
+ },
248
+ retry: {
249
+ maxAttempts: 3,
250
+ delay: 100,
251
+ },
252
+ };
253
+
254
+ const graph = new GraphFlow({
255
+ name: "retryGraph",
256
+ schema: TestSchema,
257
+ context: { value: 0, counter: 0, message: "" },
258
+ nodes: [retryNode],
259
+ });
260
+
261
+ await graph.execute("retryNode");
262
+ expect(attempts).to.equal(3);
263
+ expect(graph.getContext().value).to.equal(42);
264
+ });
265
+
266
+ /**
267
+ * Tests node removal functionality
268
+ */
269
+ it("should remove a node from the graph", function () {
270
+ const testNode: GraphNodeConfig<TestSchema> = {
271
+ name: "testNode",
272
+ execute: async () => {},
273
+ };
274
+ graph.addNode(testNode);
275
+ graph.removeNode("testNode");
276
+
277
+ expect(graph.getNodes().length).to.equal(0);
278
+ });
279
+
280
+ /**
281
+ * Tests graph reloading functionality
282
+ */
283
+ it("should clear and reload the graph using `load`", function () {
284
+ const nodeA: GraphNodeConfig<TestSchema> = {
285
+ name: "A",
286
+ execute: async () => {},
287
+ };
288
+ const nodeB: GraphNodeConfig<TestSchema> = {
289
+ name: "B",
290
+ execute: async () => {},
291
+ };
292
+
293
+ const newDefinition: GraphConfig<TestSchema> = {
294
+ name: "TestGraph",
295
+ schema: TestSchema,
296
+ nodes: [nodeA, nodeB],
297
+ context: { value: 0, counter: 0, message: "" },
298
+ entryNode: "A",
299
+ };
300
+
301
+ graph.load(newDefinition);
302
+ expect(graph.getNodes().length).to.equal(2);
303
+ expect(graph.getNodes().map((n) => n.name)).to.include.members(["A", "B"]);
304
+ });
305
+
306
+ /**
307
+ * Tests input validation error handling
308
+ */
309
+ it("should throw error when node input validation fails", async () => {
310
+ const graph = new GraphFlow({
311
+ name: "test",
312
+ schema: TestSchema,
313
+ nodes: [
314
+ {
315
+ name: "test",
316
+ execute: async (context: GraphContext<TestSchema>) => {
317
+ context.value = -1;
318
+ },
319
+ },
320
+ ],
321
+ context: { value: 0, counter: 0, message: "" },
322
+ });
323
+
324
+ try {
325
+ await graph.execute("test", { value: -1 });
326
+ expect.fail("Should have thrown an error");
327
+ } catch (error: any) {
328
+ // Zod v4 changed validation error wording
329
+ expect(error.message).to.satisfy(
330
+ (msg: string) =>
331
+ msg.includes("Number must be greater than or equal to 0") ||
332
+ msg.includes("Too small")
333
+ );
334
+ }
335
+ });
336
+
337
+ /**
338
+ * Tests successful input/output validation flow
339
+ */
340
+ it("should execute a node with validated context", async function () {
341
+ const graph = new GraphFlow({
342
+ name: "test",
343
+ schema: TestSchema,
344
+ nodes: [
345
+ {
346
+ name: "validatedNode",
347
+ execute: async (context: GraphContext<TestSchema>) => {
348
+ context.value = 5;
349
+ },
350
+ },
351
+ ],
352
+ context: { value: 0, counter: 0, message: "" },
353
+ });
354
+
355
+ await graph.execute("validatedNode");
356
+ expect(graph.getContext().value).to.equal(5);
357
+ });
358
+
359
+ it("should throw error when required context values are missing", async function () {
360
+ const graph = new GraphFlow({
361
+ name: "test",
362
+ schema: TestSchema,
363
+ nodes: [
364
+ {
365
+ name: "requiredInputNode",
366
+ execute: async (context: GraphContext<TestSchema>) => {
367
+ if (context.value === undefined) {
368
+ throw new Error("Value is required");
369
+ }
370
+ context.counter = context.value;
371
+ },
372
+ },
373
+ ],
374
+ context: { value: 0, counter: 0, message: "" },
375
+ });
376
+
377
+ try {
378
+ graph["context"].value = undefined;
379
+ await graph.execute("requiredInputNode");
380
+ throw new Error("Should have thrown an error");
381
+ } catch (error: any) {
382
+ expect(error.message).to.equal("Value is required");
383
+ }
384
+ });
385
+
386
+ it("should validate context against schema constraints", async () => {
387
+ const graph = new GraphFlow({
388
+ name: "test",
389
+ schema: TestSchema,
390
+ nodes: [
391
+ {
392
+ name: "validationNode",
393
+ execute: async (context: GraphContext<TestSchema>) => {
394
+ const newContext = { ...context, value: -1 };
395
+ const validationResult = TestSchema.safeParse(newContext);
396
+ if (!validationResult.success) {
397
+ throw new Error(validationResult.error.issues[0].message);
398
+ }
399
+ graph["context"] = newContext;
400
+ },
401
+ },
402
+ ],
403
+ context: { value: 0, counter: 0, message: "" },
404
+ });
405
+
406
+ try {
407
+ await graph.execute("validationNode");
408
+ throw new Error("Should have thrown an error");
409
+ } catch (error: any) {
410
+ // Zod v4 changed validation error wording
411
+ expect(error.message).to.satisfy(
412
+ (msg: string) =>
413
+ msg.includes("Number must be greater than or equal to 0") ||
414
+ msg.includes("Too small")
415
+ );
416
+ }
417
+ });
418
+
419
+ /**
420
+ * Tests complex workflow execution with multiple branches
421
+ * Demonstrates:
422
+ * - Multiple execution paths
423
+ * - Node chaining
424
+ * - Parallel branch execution
425
+ * - Context accumulation across branches
426
+ * This validates the graph's ability to handle complex business processes
427
+ */
428
+ it("should execute a complex workflow with multiple nodes and accumulate the value", async function () {
429
+ const nodeA: GraphNodeConfig<TestSchema> = {
430
+ name: "nodeA",
431
+ execute: async (context) => {
432
+ context.value = (context.value ?? 0) + 1;
433
+ },
434
+ next: ["nodeB1", "nodeB2"],
435
+ };
436
+
437
+ const nodeB1: GraphNodeConfig<TestSchema> = {
438
+ name: "nodeB1",
439
+ execute: async (context) => {
440
+ context.value = (context.value ?? 0) * 2;
441
+ },
442
+ next: ["nodeC"],
443
+ };
444
+
445
+ const nodeB2: GraphNodeConfig<TestSchema> = {
446
+ name: "nodeB2",
447
+ execute: async (context) => {
448
+ context.value = (context.value ?? 0) + 3;
449
+ },
450
+ next: ["nodeC"],
451
+ };
452
+
453
+ const nodeC: GraphNodeConfig<TestSchema> = {
454
+ name: "nodeC",
455
+ execute: async (context) => {
456
+ context.value = (context.value ?? 0) + 5;
457
+ },
458
+ };
459
+
460
+ [nodeA, nodeB1, nodeB2, nodeC].forEach((node) => graph.addNode(node));
461
+
462
+ await graph.execute("nodeA");
463
+ expect(graph.getContext().value).to.equal(15);
464
+ });
465
+
466
+ /**
467
+ * Tests conditional branching in workflows
468
+ */
469
+ it("should execute different branches based on conditions", async function () {
470
+ const startNode: GraphNodeConfig<TestSchema> = {
471
+ name: "start",
472
+ execute: async (context) => {
473
+ context.value = (context.value ?? 0) + 5;
474
+ },
475
+ next: ["end"],
476
+ };
477
+
478
+ const endNode: GraphNodeConfig<TestSchema> = {
479
+ name: "end",
480
+ execute: async (context) => {
481
+ if ((context.value ?? 0) < 10) {
482
+ context.value = (context.value ?? 0) * 2;
483
+ } else {
484
+ context.value = (context.value ?? 0) + 1;
485
+ }
486
+ },
487
+ };
488
+
489
+ [startNode, endNode].forEach((node) => graph.addNode(node));
490
+
491
+ await graph.execute("start");
492
+ expect(graph.getContext().value).to.equal(10);
493
+ });
494
+
495
+ /**
496
+ * Tests parallel workflow execution using GraphController
497
+ * Validates:
498
+ * - Multiple graph execution in parallel
499
+ * - Independent context maintenance
500
+ * - Proper result aggregation
501
+ * - Concurrency control
502
+ * Essential for scaling workflow processing
503
+ */
504
+ it("should handle parallel workflows using GraphController", async function () {
505
+ // Graph 1
506
+ const graph1 = new GraphFlow({
507
+ name: "Graph1",
508
+ schema: TestSchema,
509
+ context: { value: 0, counter: 0, message: "" },
510
+ nodes: [],
511
+ });
512
+
513
+ const processNode1: GraphNodeConfig<TestSchema> = {
514
+ name: "process1",
515
+ execute: async (context) => {
516
+ context.value = 1;
517
+ },
518
+ next: ["finalize1"],
519
+ };
520
+
521
+ const finalizeNode1: GraphNodeConfig<TestSchema> = {
522
+ name: "finalize1",
523
+ execute: async (context) => {
524
+ context.value = (context.value ?? 0) * 2;
525
+ },
526
+ };
527
+
528
+ // Graph 2
529
+ const graph2 = new GraphFlow({
530
+ name: "Graph2",
531
+ schema: TestSchema,
532
+ context: { value: 0, counter: 0, message: "" },
533
+ nodes: [],
534
+ });
535
+
536
+ const processNode2: GraphNodeConfig<TestSchema> = {
537
+ name: "process2",
538
+ execute: async (context) => {
539
+ context.value = 2;
540
+ },
541
+ next: ["finalize2"],
542
+ };
543
+
544
+ const finalizeNode2: GraphNodeConfig<TestSchema> = {
545
+ name: "finalize2",
546
+ execute: async (context) => {
547
+ context.value = (context.value ?? 0) + 3;
548
+ },
549
+ };
550
+
551
+ graph1.addNode(processNode1);
552
+ graph1.addNode(finalizeNode1);
553
+ graph2.addNode(processNode2);
554
+ graph2.addNode(finalizeNode2);
555
+
556
+ const results = await GraphController.executeParallel(
557
+ [graph1, graph2],
558
+ ["process1", "process2"],
559
+ 2,
560
+ [{}, {}]
561
+ );
562
+
563
+ expect(results[0].context.value).to.equal(2); // Graph1: 1 * 2
564
+ expect(results[1].context.value).to.equal(5); // Graph2: 2 + 3
565
+ });
566
+
567
+ /**
568
+ * Tests sequential workflow execution using GraphController
569
+ */
570
+ it("should handle sequential workflows using GraphController", async function () {
571
+ // Graph 1
572
+ const graph1 = new GraphFlow({
573
+ name: "Graph1",
574
+ schema: TestSchema,
575
+ context: { value: 1, counter: 0, message: "" },
576
+ nodes: [],
577
+ });
578
+
579
+ const startNode1: GraphNodeConfig<TestSchema> = {
580
+ name: "start1",
581
+ execute: async (context) => {
582
+ context.value = (context.value ?? 0) * 2;
583
+ },
584
+ };
585
+
586
+ // Graph 2
587
+ const graph2 = new GraphFlow({
588
+ name: "Graph2",
589
+ schema: TestSchema,
590
+ context: { value: 3, counter: 0, message: "" },
591
+ nodes: [],
592
+ });
593
+
594
+ const startNode2: GraphNodeConfig<TestSchema> = {
595
+ name: "start2",
596
+ execute: async (context) => {
597
+ context.value = (context.value ?? 0) + 2;
598
+ },
599
+ };
600
+
601
+ graph1.addNode(startNode1);
602
+ graph2.addNode(startNode2);
603
+
604
+ const results = await GraphController.executeSequential(
605
+ [graph1, graph2],
606
+ ["start1", "start2"],
607
+ [{}, {}]
608
+ );
609
+
610
+ expect(results[0].context.value).to.equal(2); // Graph1: 1 * 2
611
+ expect(results[1].context.value).to.equal(5); // Graph2: 3 + 2
612
+ });
613
+
614
+ /**
615
+ * Tests single event waiting functionality
616
+ */
617
+ it("should wait for a single event before continuing", async function () {
618
+ const waitingNode: GraphNodeConfig<TestSchema> = {
619
+ name: "waitingNode",
620
+ execute: async (context: GraphContext<typeof TestSchema>) => {
621
+ context.value = 1;
622
+ },
623
+ when: {
624
+ events: ["someEvent"],
625
+ timeout: 1000,
626
+ strategy: { type: "single" },
627
+ },
628
+ next: ["finalNode"],
629
+ };
630
+
631
+ const finalNode: GraphNodeConfig<TestSchema> = {
632
+ name: "finalNode",
633
+ execute: async (context: GraphContext<typeof TestSchema>) => {
634
+ context.value = (context.value ?? 0) + 5;
635
+ },
636
+ };
637
+
638
+ [waitingNode, finalNode].forEach((node) => graph.addNode(node));
639
+
640
+ const resultPromise = graph.execute("waitingNode");
641
+
642
+ // Wait a bit to ensure the node is ready
643
+ await new Promise((resolve) => setTimeout(resolve, 500));
644
+
645
+ // Emit the event
646
+ await graph.emit("someEvent");
647
+
648
+ const result = await resultPromise;
649
+ expect(result.value).to.equal(6); // 1 (waitingNode) + 5 (finalNode)
650
+ });
651
+
652
+ it("should wait for correlated events", async function () {
653
+ const graph = new GraphFlow({
654
+ name: "test",
655
+ schema: TestSchema,
656
+ nodes: [
657
+ {
658
+ name: "correlatedEventsNode",
659
+ when: {
660
+ events: ["eventA", "eventB"],
661
+ timeout: 1000,
662
+ strategy: {
663
+ type: "correlate",
664
+ correlation: (events) => {
665
+ const eventA = events.find((e) => e.type === "eventA");
666
+ const eventB = events.find((e) => e.type === "eventB");
667
+ return eventA?.payload?.id === eventB?.payload?.id;
668
+ },
669
+ },
670
+ },
671
+ execute: async (context: GraphContext<TestSchema>) => {
672
+ context.message = "Correlated events received";
673
+ },
674
+ },
675
+ ],
676
+ context: { value: 0, counter: 0, message: "" },
677
+ });
678
+
679
+ const execution = graph.execute("correlatedEventsNode");
680
+
681
+ // Émettre les événements corrélés
682
+ setTimeout(() => {
683
+ graph.emit("eventA", { id: "123", status: "completed" });
684
+ graph.emit("eventB", { id: "123", status: "available" });
685
+ }, 100);
686
+
687
+ await execution;
688
+ expect(graph.getContext().message).to.equal("Correlated events received");
689
+ });
690
+ });