@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,569 @@
1
+ import { GraphFlow } from "../execution/index";
2
+ import { GraphContext } from "../types";
3
+ import { AgentContext, AgentContextSchema, ScratchpadEntry } from "../types/agent";
4
+ import { AgentLogger } from "./tools/logger";
5
+ import { BaseAgent } from "./base";
6
+
7
+ export interface CognitiveNodeContext {
8
+ executor: {
9
+ makeDecision: (context: AgentContext) => Promise<{ actions: any[]; response: string; thought?: string }>;
10
+ executeActions: (actions: any[], context: AgentContext) => Promise<void>;
11
+ updateDynamicGoal: (context: AgentContext) => Promise<string>;
12
+ reflect: (context: AgentContext) => Promise<{ learning: string; adjustedGoal?: string }>;
13
+ scheduleTask?: (cron: string, request: string) => Promise<string | null>;
14
+ decomposeTask?: (actions: any[], context: AgentContext) => Promise<{ groups: any[][]; response: string }>;
15
+ };
16
+ baseAgent: BaseAgent;
17
+ logger: AgentLogger;
18
+ maxIterations: number;
19
+ enableClone?: boolean;
20
+ entityResolver?: {
21
+ resolve: (ctx: any) => any;
22
+ getIndex: () => any;
23
+ };
24
+ exploreStrategy?: {
25
+ plan: (candidates: any[], cwd: string) => { type: string; path: string; reason: string }[];
26
+ };
27
+ }
28
+
29
+ export function buildAgentWorkflow(ctx: CognitiveNodeContext): GraphFlow<typeof AgentContextSchema> {
30
+ return new GraphFlow({
31
+ name: "assistant",
32
+ schema: AgentContextSchema,
33
+ context: {
34
+ input: { raw: "" },
35
+ actions: [],
36
+ response: "",
37
+ executedActions: [],
38
+ iteration: 0,
39
+ progressed: false,
40
+ messages: [],
41
+ toolResults: {},
42
+ scratchpad: [],
43
+ memories: [],
44
+ entityState: {
45
+ currentTarget: undefined,
46
+ lastEntityType: null,
47
+ pendingResolutions: [],
48
+ resolutionTrace: [],
49
+ explored: false,
50
+ },
51
+ explorationBudget: {
52
+ maxSteps: 12,
53
+ maxExplorations: 2,
54
+ maxToolCalls: 8,
55
+ stepsUsed: 0,
56
+ explorationsUsed: 0,
57
+ toolCallsUsed: 0,
58
+ },
59
+ conversationState: {
60
+ currentGoal: "",
61
+ currentTarget: null,
62
+ lastResolvedEntity: null,
63
+ lastResolvedType: null,
64
+ pendingTask: null,
65
+ turnCount: 0,
66
+ pendingIntent: null,
67
+ },
68
+ },
69
+ nodes: [
70
+ {
71
+ name: "defineGoal",
72
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
73
+ const agentContext = context as unknown as AgentContext;
74
+ await ctx.executor.updateDynamicGoal(agentContext);
75
+ ctx.logger.info("workflow", "Goal defined");
76
+ },
77
+ next: ["recall"],
78
+ },
79
+ {
80
+ name: "recall",
81
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
82
+ const agentContext = context as unknown as AgentContext;
83
+ const query = agentContext.input?.raw || "";
84
+ const memories = await ctx.baseAgent.recall(query);
85
+ agentContext.memories = memories || [];
86
+ if (memories.length > 0) {
87
+ ctx.logger.info("recall", `Retrieved ${memories.length} relevant memories`);
88
+ }
89
+ },
90
+ next: ["resolve"],
91
+ },
92
+ {
93
+ name: "resolve",
94
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
95
+ const agentContext = context as unknown as AgentContext;
96
+ const input = agentContext.input?.raw || "";
97
+ if (!input || !ctx.entityResolver) {
98
+ agentContext.entityState = {
99
+ currentTarget: undefined,
100
+ lastEntityType: null,
101
+ pendingResolutions: [],
102
+ resolutionTrace: [],
103
+ explored: false,
104
+ };
105
+ return;
106
+ }
107
+
108
+ const cwd = process.cwd();
109
+ const resolverCtx = {
110
+ userMessage: input,
111
+ conversationHistory: agentContext.messages || [],
112
+ conversationState: agentContext.conversationState || {
113
+ currentGoal: "", currentTarget: null, lastResolvedEntity: null,
114
+ lastResolvedType: null, pendingTask: null, turnCount: 0, pendingIntent: null,
115
+ },
116
+ cwd,
117
+ entityIndex: ctx.entityResolver.getIndex(),
118
+ };
119
+
120
+ const result = ctx.entityResolver.resolve(resolverCtx);
121
+ const trace = result.trace;
122
+ const confidence = result.confidence;
123
+
124
+ // Merge new handles with existing ones from previous turn
125
+ const existingHandles = agentContext.entityState?.handles || {};
126
+ const mergedHandles = { ...existingHandles };
127
+ let handleIdx = Object.keys(mergedHandles).length;
128
+ for (const [, h] of Object.entries(result.handles || {})) {
129
+ const entry = h as { id: string; label: string; path: string; category: string };
130
+ const key = Object.keys(mergedHandles).find(
131
+ k => mergedHandles[k].path === entry.path
132
+ );
133
+ if (key) {
134
+ mergedHandles[key] = entry;
135
+ } else {
136
+ mergedHandles[`ent_${handleIdx++}`] = entry;
137
+ }
138
+ }
139
+
140
+ // Always ensure at least a cwd handle so LLM can list files
141
+ if (Object.keys(mergedHandles).length === 0) {
142
+ mergedHandles.ent_0 = {
143
+ id: "ent_0",
144
+ label: cwd.split("/").pop() || "cwd",
145
+ path: cwd,
146
+ category: "dir",
147
+ };
148
+ }
149
+
150
+ agentContext.entityState = {
151
+ currentTarget: result.resolution.resolved[0]?.resolved?.id || undefined,
152
+ lastEntityType: result.resolution.resolved[0]?.resolved?.category || null,
153
+ pendingResolutions: result.resolution.references,
154
+ resolutionTrace: trace,
155
+ explored: agentContext.entityState?.explored || false,
156
+ handles: mergedHandles,
157
+ };
158
+
159
+ if (agentContext.explorationBudget) {
160
+ agentContext.explorationBudget.stepsUsed++;
161
+ }
162
+
163
+ if (confidence.level !== "high") {
164
+ const refs = result.resolution.ambiguous;
165
+ if (refs.length > 0) {
166
+ ctx.logger.info("resolve", `Confidence ${confidence.level} (${confidence.score.toFixed(2)}): ${refs.length} ambiguous reference(s)`);
167
+ for (const r of refs) {
168
+ const handleIds = r.candidates.map((c: any) => {
169
+ const found = Object.entries(result.handles || {}).find(([, h]: any) => h.label === c.entity.filename);
170
+ return found ? found[0] : "?";
171
+ });
172
+ ctx.logger.info("resolve", ` "${r.raw}" → ${r.candidates.map((c: any, i: number) => `${handleIds[i]}=${c.entity.filename}(${(c.breakdown.total * 100).toFixed(0)}%)`).join(", ")}`);
173
+ }
174
+ }
175
+ } else {
176
+ ctx.logger.info("resolve", `High confidence: ${result.resolution.resolved.map((r: any) => r.resolved?.filename).join(", ") || "no refs"}`);
177
+ }
178
+ },
179
+ next: (context: GraphContext<typeof AgentContextSchema>): any => {
180
+ const agentContext = context as unknown as AgentContext;
181
+ const es = agentContext.entityState;
182
+ const budget = agentContext.explorationBudget;
183
+ const trace = es?.resolutionTrace as any[] || [];
184
+ const lastTrace = trace[trace.length - 1];
185
+
186
+ if (!lastTrace) return ["think"];
187
+
188
+ if (es?.explored && lastTrace.action !== "explored") {
189
+ const prevConfidence = trace[trace.length - 2]?.confidence;
190
+ const currConfidence = lastTrace.confidence;
191
+ if (prevConfidence !== undefined && currConfidence !== undefined && currConfidence <= prevConfidence) {
192
+ ctx.logger.info("resolve", "Exploration did not improve confidence, proceeding to think");
193
+ return ["think"];
194
+ }
195
+ }
196
+
197
+ const isLow = lastTrace.action === "failed" ||
198
+ (lastTrace.candidates.length > 0 && lastTrace.confidence !== undefined && lastTrace.confidence < 0.3);
199
+
200
+ if (isLow && budget && budget.explorationsUsed < budget.maxExplorations) {
201
+ return ["explore"];
202
+ }
203
+
204
+ if (isLow && budget && budget.explorationsUsed >= budget.maxExplorations) {
205
+ ctx.logger.info("resolve", "Max explorations reached, proceeding with ambiguity");
206
+ }
207
+
208
+ return ["think"];
209
+ },
210
+ },
211
+ {
212
+ name: "explore",
213
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
214
+ const agentContext = context as unknown as AgentContext;
215
+ const entityState = agentContext.entityState;
216
+ if (!entityState?.pendingResolutions?.length || !ctx.exploreStrategy || !ctx.entityResolver) {
217
+ ctx.logger.info("explore", "Nothing to explore");
218
+ return;
219
+ }
220
+
221
+ const allCandidates = entityState.pendingResolutions.flatMap((r: any) => r.candidates || []);
222
+ const cwd = process.cwd();
223
+ const plans = ctx.exploreStrategy.plan(allCandidates, cwd);
224
+
225
+ if (plans.length === 0) {
226
+ ctx.logger.info("explore", "No exploration actions planned");
227
+ return;
228
+ }
229
+
230
+ const fs = await import("fs/promises");
231
+ const index = ctx.entityResolver.getIndex();
232
+
233
+ ctx.logger.info("explore", `Exploring ${plans.length} location(s): ${plans.map((p: any) => p.path).join(", ")}`);
234
+
235
+ for (const plan of plans) {
236
+ if (plan.type !== "directory_lister") continue;
237
+ try {
238
+ const entries = await fs.readdir(plan.path, { withFileTypes: true });
239
+ const entryList = entries.map((e: any) => ({
240
+ name: e.name,
241
+ type: e.isDirectory() ? "directory" : "file",
242
+ }));
243
+ index.ingestDirectory(plan.path, entryList);
244
+ ctx.logger.info("explore", `Listed ${plan.path}: ${entryList.length} entries`);
245
+ } catch (e: any) {
246
+ ctx.logger.warn("explore", `Failed to list ${plan.path}: ${e.message}`);
247
+ }
248
+ }
249
+
250
+ if (agentContext.explorationBudget) {
251
+ agentContext.explorationBudget.explorationsUsed++;
252
+ }
253
+ entityState.explored = true;
254
+ ctx.logger.info("explore", "Exploration complete, re-resolving...");
255
+ },
256
+ next: ["resolve"],
257
+ },
258
+ {
259
+ name: "think",
260
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
261
+ const agentContext = context as unknown as AgentContext;
262
+ const iter = (agentContext.iteration ?? 0) + 1;
263
+ agentContext.iteration = iter;
264
+ if (iter >= ctx.maxIterations) {
265
+ context.response = context.response || "Max iterations reached.";
266
+ ctx.logger.warn("workflow", `Max iterations (${ctx.maxIterations}) reached`);
267
+ return;
268
+ }
269
+
270
+ const pendingActions = agentContext.actions || [];
271
+ const executedKeys = new Set(
272
+ (agentContext.executedActions || []).map((a: any) => {
273
+ const p = a.parameters || {};
274
+ const normalized = Array.isArray(p) ? Object.fromEntries(p.map((x: any) => [x.name, x.value])) : p;
275
+ return `${a.name}:${JSON.stringify(normalized)}`;
276
+ })
277
+ );
278
+ const allAlreadyDone = pendingActions.length > 0 && pendingActions.every((a: any) => {
279
+ const params = a.parameters || {};
280
+ const normalized = Array.isArray(params) ? Object.fromEntries(params.map((x: any) => [x.name, x.value])) : params;
281
+ return executedKeys.has(`${a.name}:${JSON.stringify(normalized)}`);
282
+ });
283
+
284
+ if (allAlreadyDone) {
285
+ ctx.logger.info("think", `All ${pendingActions.length} action(s) already executed, generating final response from tool results`);
286
+ agentContext.actions = [];
287
+ const decision = await ctx.executor.makeDecision(agentContext);
288
+ context.response = decision.response;
289
+ context.actions = [];
290
+ const entry: ScratchpadEntry = {
291
+ turn: iter,
292
+ thought: decision.thought || "All actions already done, generating final response.",
293
+ action: "final_response",
294
+ observation: decision.response,
295
+ timestamp: new Date().toISOString(),
296
+ };
297
+ if (!agentContext.scratchpad) agentContext.scratchpad = [];
298
+ agentContext.scratchpad.push(entry);
299
+ ctx.logger.think("think", `Decision: 0 actions`, decision.response);
300
+ return;
301
+ }
302
+
303
+ ctx.logger.info("think", `Iteration ${iter}: Analyzing context...`);
304
+ const decision = await ctx.executor.makeDecision(agentContext);
305
+ context.actions = decision.actions;
306
+ context.response = decision.response;
307
+ (context as any)._parallelGroups = undefined;
308
+
309
+ const entry: ScratchpadEntry = {
310
+ turn: iter,
311
+ thought: decision.thought || "No explicit reasoning.",
312
+ action: decision.actions.length > 0
313
+ ? decision.actions.map((a: any) => a.name).join(", ")
314
+ : "direct_response",
315
+ observation: decision.response,
316
+ timestamp: new Date().toISOString(),
317
+ };
318
+ if (!agentContext.scratchpad) agentContext.scratchpad = [];
319
+ agentContext.scratchpad.push(entry);
320
+
321
+ ctx.logger.think("think", `Decision: ${decision.actions.length} actions`, decision.response);
322
+ },
323
+ next: (context: GraphContext<typeof AgentContextSchema>): any => {
324
+ const agentContext = context as unknown as AgentContext;
325
+ const iter = agentContext.iteration ?? 0;
326
+ if (agentContext.actions.length === 0 || iter >= ctx.maxIterations) {
327
+ return ["reply"];
328
+ }
329
+ if (ctx.enableClone && ctx.executor.decomposeTask && agentContext.actions.length > 1) {
330
+ return ["decompose"];
331
+ }
332
+ return ["execute"];
333
+ },
334
+ },
335
+ {
336
+ name: "decompose",
337
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
338
+ const agentContext = context as unknown as AgentContext;
339
+ ctx.logger.info("decompose", `Analyzing ${agentContext.actions.length} actions for parallelization...`);
340
+ const result = await ctx.executor.decomposeTask!(agentContext.actions, agentContext);
341
+ if (result.groups.length > 1) {
342
+ (context as any)._parallelGroups = result.groups;
343
+ ctx.logger.info("decompose", `Split into ${result.groups.length} parallel groups`);
344
+ }
345
+ context.response = result.response;
346
+ },
347
+ next: ["execute"],
348
+ },
349
+ {
350
+ name: "execute",
351
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
352
+ const timestamp = new Date().toISOString();
353
+ const agentContext = context as unknown as AgentContext;
354
+
355
+ const normalizeParams = (p: any): Record<string, any> => {
356
+ if (Array.isArray(p)) {
357
+ const obj: Record<string, any> = {};
358
+ for (const item of p) obj[item.name] = item.value;
359
+ return obj;
360
+ }
361
+ return p || {};
362
+ };
363
+
364
+ const makeKey = (name: string, params: any): string =>
365
+ `${name}:${JSON.stringify(normalizeParams(params))}`;
366
+
367
+ const executedKeys = new Set(
368
+ (agentContext.executedActions || []).map((a: any) => makeKey(a.name, a.parameters))
369
+ );
370
+
371
+ const newActions = (agentContext.actions || []).filter((a: any) => {
372
+ if (executedKeys.has(makeKey(a.name, a.parameters))) {
373
+ ctx.logger.info("dedup", `Skipping: ${a.name} (already executed)`);
374
+ return false;
375
+ }
376
+ return true;
377
+ });
378
+
379
+ if (newActions.length === 0) {
380
+ agentContext.actions = [];
381
+ agentContext.progressed = false;
382
+ ctx.logger.info("execute", "No actions to execute");
383
+ return;
384
+ }
385
+ agentContext.progressed = true;
386
+
387
+ ctx.logger.info("execute", `Executing ${newActions.length} tools...`);
388
+
389
+ const results = (agentContext.executedActions || []).map((a: any) =>
390
+ `${a.name}: ${JSON.stringify(a.result)}`
391
+ ).join('\n');
392
+ agentContext.knowledge = `Date: ${timestamp}\n${results}`;
393
+
394
+ if (ctx.entityResolver) {
395
+ const index = ctx.entityResolver.getIndex();
396
+ for (const action of newActions) {
397
+ const params = normalizeParams(action.parameters || {});
398
+ if (params.path) {
399
+ index.ingestFile(params.path);
400
+ }
401
+ }
402
+ }
403
+
404
+ const parallelGroups = (context as any)._parallelGroups;
405
+ if (parallelGroups && parallelGroups.length > 1) {
406
+ ctx.logger.info("execute", `Executing ${parallelGroups.length} groups in parallel...`);
407
+ await Promise.all(parallelGroups.map((group: any[]) =>
408
+ ctx.executor.executeActions(group, agentContext)
409
+ ));
410
+ } else {
411
+ await ctx.executor.executeActions(newActions, agentContext);
412
+ }
413
+
414
+ if (ctx.entityResolver) {
415
+ const index = ctx.entityResolver.getIndex();
416
+ for (const a of newActions) {
417
+ const params = normalizeParams(a.parameters || {});
418
+ if (a.name === "directory_lister" && params.path) {
419
+ const found = agentContext.executedActions?.slice().reverse().find(e => e.name === "directory_lister");
420
+ const entries = found?.result?.entries;
421
+ if (entries) {
422
+ index.ingestDirectory(params.path, entries);
423
+ }
424
+ }
425
+ }
426
+ }
427
+
428
+ for (const a of newActions) {
429
+ const found = agentContext.executedActions?.slice().reverse().find(e => e.name === a.name);
430
+ if (found) {
431
+ if (!agentContext.toolResults) agentContext.toolResults = {};
432
+ agentContext.toolResults[a.name] = found.result;
433
+ }
434
+ }
435
+
436
+ // Detect if all newly executed actions failed → halt loop
437
+ const newlyExecuted = agentContext.executedActions?.slice(-newActions.length) || [];
438
+ const allFailed = newlyExecuted.length > 0 && newlyExecuted.every(a => {
439
+ const r = a.result || {};
440
+ return (
441
+ (typeof r.content === 'string' && r.content.startsWith('Error:')) ||
442
+ r.success === false ||
443
+ (a.name === 'directory_lister' && r.entries && Array.isArray(r.entries) && r.entries.length === 0) ||
444
+ (['shell', 'node_code', 'python_code'].includes(a.name) && (r.exitCode > 0 || r.error))
445
+ );
446
+ });
447
+ if (allFailed) {
448
+ agentContext.progressed = false;
449
+ ctx.logger.warn("execute", "All actions failed, halting planning loop");
450
+ }
451
+
452
+ agentContext.actions = [];
453
+ (context as any)._parallelGroups = undefined;
454
+ },
455
+ next: (context: GraphContext<typeof AgentContextSchema>): any => {
456
+ const agentContext = context as unknown as AgentContext;
457
+ const iter = agentContext.iteration ?? 0;
458
+ if (iter >= ctx.maxIterations || !agentContext.progressed) {
459
+ return ["reply"];
460
+ }
461
+ return ["reflect"];
462
+ },
463
+ },
464
+ {
465
+ name: "reflect",
466
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
467
+ const agentContext = context as unknown as AgentContext;
468
+ ctx.logger.info("reflect", "Reflecting on last actions...");
469
+ const reflection = await ctx.executor.reflect(agentContext);
470
+
471
+ const entry: ScratchpadEntry = {
472
+ turn: agentContext.iteration ?? 0,
473
+ thought: "Post-action reflection",
474
+ action: "reflection",
475
+ observation: reflection.learning,
476
+ timestamp: new Date().toISOString(),
477
+ };
478
+ if (!agentContext.scratchpad) agentContext.scratchpad = [];
479
+ agentContext.scratchpad.push(entry);
480
+
481
+ if (reflection.learning && ctx.baseAgent) {
482
+ try {
483
+ await ctx.baseAgent.execute({
484
+ type: "reflection",
485
+ content: reflection.learning,
486
+ metadata: {
487
+ turn: agentContext.iteration,
488
+ timestamp: new Date().toISOString(),
489
+ },
490
+ });
491
+ ctx.logger.info("reflect", "Reflection stored in memory");
492
+ } catch {
493
+ ctx.logger.warn("reflect", "Failed to store reflection in memory");
494
+ }
495
+ }
496
+ },
497
+ next: ["think"],
498
+ },
499
+ {
500
+ name: "plan",
501
+ execute: async () => {
502
+ ctx.logger.info("plan", "Planning next steps...");
503
+ },
504
+ next: ["think"],
505
+ },
506
+ {
507
+ name: "schedule",
508
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
509
+ ctx.logger.info("schedule", "Scheduling a task...");
510
+ const scheduledTask = (context as any).scheduledTask;
511
+ if (scheduledTask?.cronExpression && scheduledTask?.request && ctx.executor.scheduleTask) {
512
+ await ctx.executor.scheduleTask(scheduledTask.cronExpression, scheduledTask.request);
513
+ context.response = "Tâche planifiée avec succès.";
514
+ } else {
515
+ context.response = "Pas de tâche à planifier.";
516
+ }
517
+ },
518
+ next: ["think"],
519
+ },
520
+ {
521
+ name: "reply",
522
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
523
+ const agentContext = context as unknown as AgentContext;
524
+ ctx.logger.info("reply", `Response: ${context.response?.substring(0, 50)}...`);
525
+ const messages = agentContext.messages || [];
526
+ const userMsg = agentContext.input?.raw;
527
+ const lastMsg = messages[messages.length - 1];
528
+ if (userMsg && (lastMsg?.role !== "user" || lastMsg.content !== userMsg)) {
529
+ messages.push({ role: "user", content: userMsg });
530
+ }
531
+ if (context.response) {
532
+ const afterUser = messages[messages.length - 1];
533
+ if (afterUser?.role !== "assistant" || afterUser.content !== context.response) {
534
+ messages.push({ role: "assistant", content: context.response });
535
+ }
536
+ }
537
+ agentContext.messages = messages;
538
+
539
+ const pad = agentContext.scratchpad || [];
540
+ const thoughtLog = pad.map(e => `[T${e.turn}] ${e.thought} → ${e.action}: ${e.observation}`).join("\n");
541
+ if (ctx.baseAgent) {
542
+ try {
543
+ await ctx.baseAgent.execute({
544
+ type: "episode",
545
+ content: `User: ${userMsg || ""}\nAgent: ${context.response || ""}\nThoughts:\n${thoughtLog}`,
546
+ metadata: {
547
+ turn: agentContext.iteration,
548
+ timestamp: new Date().toISOString(),
549
+ },
550
+ });
551
+ ctx.logger.info("reply", "Episode stored in memory");
552
+ } catch {
553
+ ctx.logger.warn("reply", "Failed to store episode in memory");
554
+ }
555
+ }
556
+ },
557
+ next: [],
558
+ },
559
+ {
560
+ name: "ask",
561
+ execute: async (context: GraphContext<typeof AgentContextSchema>) => {
562
+ ctx.logger.info("ask", "Asking clarification question...");
563
+ context.response = context.response || "Avez-vous besoin de précisions ?";
564
+ },
565
+ next: ["think"],
566
+ },
567
+ ],
568
+ });
569
+ }