@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,360 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Structured result returned by an intent classification pass.
5
+ */
6
+ export interface IntentResult {
7
+ /** Canonical intent label (one of the registered intents, or `"UNKNOWN"`). */
8
+ intent: string;
9
+ /** Confidence score in [0, 1]. Values below the configured threshold trigger clarification. */
10
+ confidence: number;
11
+ /** Free-form entity map extracted alongside the intent. */
12
+ entities: Record<string, any>;
13
+ /** Turn history that was fed to the classifier, useful for debugging. */
14
+ turnHistory?: string[];
15
+ /**
16
+ * Optional list of multiple intents when the message contains several actions.
17
+ * Each entry has its own intent label and confidence.
18
+ * When present, the orchestrator will execute them sequentially.
19
+ */
20
+ intents?: Array<{ intent: string; confidence: number; entities?: Record<string, any> }>;
21
+ }
22
+
23
+ /**
24
+ * Function-form of an intent classifier, compatible with `CortexFlowOrchestrator.setIntentClassifier`.
25
+ *
26
+ * @param message - Raw user message.
27
+ * @param context - Optional context carrying recent turn history.
28
+ * @returns Resolved intent result.
29
+ */
30
+ export type IntentClassifierFn = (
31
+ message: string,
32
+ context?: { turnHistory?: string[] }
33
+ ) => Promise<IntentResult>;
34
+
35
+ /**
36
+ * Shared interface implemented by both `IntentClassifier` (LLM-backed) and
37
+ * `HybridIntentClassifier` (rules-first, LLM fallback).
38
+ *
39
+ * The orchestrator depends only on this interface, never on a concrete class.
40
+ */
41
+ export interface IIntentClassifier {
42
+ classify(message: string, context?: { turnHistory?: string[] }): Promise<IntentResult>;
43
+ generateClarification(originalMessage: string): Promise<string>;
44
+ getConfidenceThreshold(): number;
45
+ }
46
+
47
+ // ---------------------------------------------------------------------------
48
+ // Keyword rule type (used by HybridIntentClassifier)
49
+ // ---------------------------------------------------------------------------
50
+
51
+ /**
52
+ * A single keyword rule used by `HybridIntentClassifier`.
53
+ *
54
+ * A rule fires when at least one keyword matches. The confidence is scaled by
55
+ * the fraction of keywords that matched, so rules with more keywords and more
56
+ * matches score higher — making partial matches detectable but less trusted.
57
+ */
58
+ export interface KeywordRule {
59
+ /** Intent label to return when this rule matches. */
60
+ intent: string;
61
+ /** Keywords or phrases to look for (case-insensitive substring match). */
62
+ keywords: string[];
63
+ /**
64
+ * Base confidence when ALL keywords match. Partial matches are scored
65
+ * proportionally: `baseConfidence × (matchedCount / keywords.length)`.
66
+ * Defaults to `0.95`.
67
+ */
68
+ confidence?: number;
69
+ /**
70
+ * Optional negation terms. If any negation term is found in the message,
71
+ * this rule is skipped entirely.
72
+ */
73
+ negations?: string[];
74
+ }
75
+
76
+ // ---------------------------------------------------------------------------
77
+ // Zod schema for LLM response validation
78
+ // ---------------------------------------------------------------------------
79
+
80
+ /** Zod schema used to validate the raw JSON returned by the LLM. */
81
+ const IntentSchema = z.object({
82
+ intent: z.string(),
83
+ confidence: z.number().min(0).max(1),
84
+ entities: z.record(z.string(), z.any()).optional(),
85
+ intents: z.array(z.object({
86
+ intent: z.string(),
87
+ confidence: z.number().min(0).max(1),
88
+ entities: z.record(z.string(), z.any()).optional(),
89
+ })).optional(),
90
+ });
91
+
92
+ // ---------------------------------------------------------------------------
93
+ // IntentClassifier — pure LLM-backed classifier
94
+ // ---------------------------------------------------------------------------
95
+
96
+ /**
97
+ * LLM-backed intent classifier for the CortexFlow orchestration layer.
98
+ *
99
+ * The classifier sends a single prompt to an LLM and expects a JSON reply
100
+ * conforming to `{ intent, confidence, entities }`. The response is validated
101
+ * with Zod; any parse failure falls back to `UNKNOWN` with zero confidence.
102
+ *
103
+ * Keeping classification to **one LLM call per user turn** is a core design
104
+ * principle — all subsequent routing is done deterministically by the Petri net.
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * const classifier = new IntentClassifier(llmFn, {
109
+ * intents: ['FETCH_MAILS', 'SUMMARIZE', 'ARCHIVE'],
110
+ * confidenceThreshold: 0.7,
111
+ * });
112
+ *
113
+ * const result = await classifier.classify('Please fetch my latest 5 emails');
114
+ * // { intent: 'FETCH_MAILS', confidence: 0.95, entities: { maxMails: 5 } }
115
+ * ```
116
+ */
117
+ export class IntentClassifier implements IIntentClassifier {
118
+ private llmCall: (prompt: string) => Promise<string>;
119
+ private intents: string[];
120
+ private confidenceThreshold: number;
121
+
122
+ /**
123
+ * @param llmCall - Function that forwards a prompt to an LLM and returns its text response.
124
+ * @param options.intents - List of valid intent labels the LLM must choose from.
125
+ * @param options.confidenceThreshold - Minimum confidence to avoid triggering clarification.
126
+ * Defaults to `0.6`.
127
+ */
128
+ constructor(
129
+ llmCall: (prompt: string) => Promise<string>,
130
+ options?: { intents?: string[]; confidenceThreshold?: number }
131
+ ) {
132
+ this.llmCall = llmCall;
133
+ this.intents = options?.intents || [
134
+ 'CREATE', 'APPROVE', 'REJECT', 'QUERY', 'CANCEL', 'ESCALATE', 'UNKNOWN',
135
+ ];
136
+ this.confidenceThreshold = options?.confidenceThreshold ?? 0.6;
137
+ }
138
+
139
+ /**
140
+ * Classifies a user message into one of the registered intents via one LLM call.
141
+ *
142
+ * Supports multi-intent detection: if the LLM returns an `intents` array,
143
+ * the result will include multiple intents to be executed sequentially.
144
+ *
145
+ * On JSON parse failure or Zod validation error, returns a safe fallback
146
+ * `{ intent: "UNKNOWN", confidence: 0, entities: {} }` rather than throwing.
147
+ */
148
+ async classify(
149
+ message: string,
150
+ context?: { turnHistory?: string[] }
151
+ ): Promise<IntentResult> {
152
+ const turnHistory = context?.turnHistory || [];
153
+
154
+ const prompt = `You are an intent classifier for a workflow system.
155
+ Available intents: ${this.intents.join(', ')}
156
+
157
+ Respond with JSON only in this format:
158
+ {"intent": "INTENT_NAME", "confidence": 0.0-1.0, "entities": {}}
159
+
160
+ If the user message contains MULTIPLE actions, also include an "intents" array:
161
+ {"intent": "MAIN_INTENT", "confidence": 0.0-1.0, "entities": {}, "intents": [{"intent": "ACTION1", "confidence": 0.0-1.0, "entities": {}}, {"intent": "ACTION2", "confidence": 0.0-1.0, "entities": {}}]}
162
+
163
+ User message: ${message}
164
+ ${turnHistory.length > 0 ? `Recent history: ${JSON.stringify(turnHistory.slice(-5))}` : ''}
165
+
166
+ JSON response:`;
167
+
168
+ try {
169
+ const response = await this.llmCall(prompt);
170
+ const parsed = JSON.parse(response);
171
+ const result = IntentSchema.parse(parsed);
172
+
173
+ const intentResult: IntentResult = {
174
+ intent: result.intent,
175
+ confidence: result.confidence,
176
+ entities: result.entities || {},
177
+ turnHistory,
178
+ };
179
+
180
+ if (result.intents && result.intents.length > 0) {
181
+ intentResult.intents = result.intents.map(i => ({
182
+ intent: i.intent,
183
+ confidence: i.confidence,
184
+ entities: i.entities || {},
185
+ }));
186
+ }
187
+
188
+ return intentResult;
189
+ } catch {
190
+ return { intent: 'UNKNOWN', confidence: 0, entities: {}, turnHistory };
191
+ }
192
+ }
193
+
194
+ /** Returns the current confidence threshold. */
195
+ getConfidenceThreshold(): number { return this.confidenceThreshold; }
196
+
197
+ /** Overrides the confidence threshold at runtime. */
198
+ setConfidenceThreshold(threshold: number): void { this.confidenceThreshold = threshold; }
199
+
200
+ /**
201
+ * Converts this classifier instance into a plain `IntentClassifierFn`
202
+ * suitable for `CortexFlowOrchestrator.setIntentClassifier`.
203
+ */
204
+ static toFn(classifier: IIntentClassifier): IntentClassifierFn {
205
+ return (message, context) => classifier.classify(message, context);
206
+ }
207
+
208
+ /**
209
+ * Generates a short clarifying question when the user's intent is ambiguous.
210
+ *
211
+ * Falls back to a generic question listing available intents if the LLM call fails.
212
+ */
213
+ async generateClarification(originalMessage: string): Promise<string> {
214
+ const prompt = `User said: "${originalMessage}". Possible intents: ${this.intents.join(', ')}.
215
+ Ask a short clarifying question to understand which action the user wants. Only return the question, nothing else.`;
216
+
217
+ try {
218
+ return (await this.llmCall(prompt)).trim();
219
+ } catch {
220
+ const options = this.intents.filter(i => i !== 'UNKNOWN').join(', ');
221
+ return `I didn't understand. Possible actions: ${options}. Which one do you want?`;
222
+ }
223
+ }
224
+ }
225
+
226
+ // ---------------------------------------------------------------------------
227
+ // HybridIntentClassifier — keyword-first, LLM fallback
228
+ // ---------------------------------------------------------------------------
229
+
230
+ /**
231
+ * A hybrid intent classifier that tries keyword rules first and only invokes
232
+ * the LLM when no rule reaches the configured confidence threshold.
233
+ *
234
+ * **Why this matters for performance**: intent classification is on the
235
+ * critical path of every user turn. For well-defined, unambiguous commands
236
+ * ("fetch my mails", "archive all newsletters") keyword rules resolve in
237
+ * microseconds at confidence ≥ 0.9, eliminating the first LLM call entirely.
238
+ * The LLM is reserved for genuinely ambiguous messages.
239
+ *
240
+ * The confidence of a rule is computed as:
241
+ * `baseConfidence × (matchedKeywords / totalKeywords)`.
242
+ * This means a rule with 4 keywords where 3 match scores 0.95 × 0.75 = 0.71,
243
+ * which may still exceed the threshold for coarse intents.
244
+ *
245
+ * @example
246
+ * ```ts
247
+ * const classifier = new HybridIntentClassifier(
248
+ * [
249
+ * { intent: 'TRIAGE_MAILS', keywords: ['fetch', 'mail', 'urgent', 'archive'], confidence: 0.95 },
250
+ * { intent: 'FETCH_MAILS', keywords: ['fetch', 'email'], confidence: 0.90 },
251
+ * ],
252
+ * { intents: ['TRIAGE_MAILS', 'FETCH_MAILS', 'UNKNOWN'], confidenceThreshold: 0.6 },
253
+ * llmFn, // optional — omit for pure keyword mode
254
+ * );
255
+ *
256
+ * // "Fetch my 5 mails and flag the urgent ones" → keyword match, 0 LLM calls
257
+ * // "Do the thing with the emails maybe?" → LLM fallback
258
+ * ```
259
+ */
260
+ export class HybridIntentClassifier implements IIntentClassifier {
261
+ private rules: KeywordRule[];
262
+ private confidenceThreshold: number;
263
+ private intents: string[];
264
+ private llmClassifier?: IntentClassifier;
265
+
266
+ /**
267
+ * @param rules - Ordered list of keyword rules. Rules are evaluated in order;
268
+ * the highest-scoring match wins.
269
+ * @param options.intents - Valid intent labels (used for LLM fallback prompt and clarification).
270
+ * @param options.confidenceThreshold - Minimum confidence to accept a result without LLM fallback.
271
+ * @param llmFn - Optional LLM function. If omitted, unmatched messages return `UNKNOWN`.
272
+ */
273
+ constructor(
274
+ rules: KeywordRule[],
275
+ options: { intents: string[]; confidenceThreshold?: number },
276
+ llmFn?: (prompt: string) => Promise<string>
277
+ ) {
278
+ this.rules = rules;
279
+ this.intents = options.intents;
280
+ this.confidenceThreshold = options.confidenceThreshold ?? 0.6;
281
+ if (llmFn) {
282
+ this.llmClassifier = new IntentClassifier(llmFn, options);
283
+ }
284
+ }
285
+
286
+ /** Returns the current confidence threshold. */
287
+ getConfidenceThreshold(): number { return this.confidenceThreshold; }
288
+
289
+ /**
290
+ * Classifies a message using keyword rules first.
291
+ *
292
+ * If the best keyword rule score meets the threshold, the result is returned
293
+ * immediately — no LLM call is made. Otherwise, the LLM classifier is invoked
294
+ * as a fallback (if configured). Messages that match no rule and have no LLM
295
+ * fallback return `UNKNOWN` with confidence 0.
296
+ */
297
+ async classify(
298
+ message: string,
299
+ context?: { turnHistory?: string[] }
300
+ ): Promise<IntentResult> {
301
+ const ruleResult = this.applyRules(message, context?.turnHistory ?? []);
302
+
303
+ if (ruleResult && ruleResult.confidence >= this.confidenceThreshold) {
304
+ return ruleResult;
305
+ }
306
+
307
+ if (this.llmClassifier) {
308
+ return this.llmClassifier.classify(message, context);
309
+ }
310
+
311
+ return ruleResult ?? { intent: 'UNKNOWN', confidence: 0, entities: {}, turnHistory: context?.turnHistory ?? [] };
312
+ }
313
+
314
+ /**
315
+ * Generates a clarifying question for ambiguous messages.
316
+ * Delegates to the LLM classifier if available; otherwise returns a generic
317
+ * question listing the known intents.
318
+ */
319
+ async generateClarification(originalMessage: string): Promise<string> {
320
+ if (this.llmClassifier) {
321
+ return this.llmClassifier.generateClarification(originalMessage);
322
+ }
323
+ const options = this.intents.filter(i => i !== 'UNKNOWN').join(', ');
324
+ return `I didn't understand. Possible actions: ${options}. Which one do you want?`;
325
+ }
326
+
327
+ /**
328
+ * Converts this classifier into a plain `IntentClassifierFn`.
329
+ * Works identically to `IntentClassifier.toFn`.
330
+ */
331
+ static toFn(classifier: IIntentClassifier): IntentClassifierFn {
332
+ return (message, context) => classifier.classify(message, context);
333
+ }
334
+
335
+ // ---------------------------------------------------------------------------
336
+ // Private helpers
337
+ // ---------------------------------------------------------------------------
338
+
339
+ private applyRules(message: string, turnHistory: string[]): IntentResult | null {
340
+ const lower = message.toLowerCase();
341
+ let best: { intent: string; score: number } | null = null;
342
+
343
+ for (const rule of this.rules) {
344
+ // Skip if any negation term is present
345
+ if (rule.negations?.some(n => lower.includes(n.toLowerCase()))) continue;
346
+
347
+ const matched = rule.keywords.filter(kw => lower.includes(kw.toLowerCase()));
348
+ if (matched.length === 0) continue;
349
+
350
+ // Partial match: score scales with the fraction of keywords matched
351
+ const score = (rule.confidence ?? 0.95) * (matched.length / rule.keywords.length);
352
+ if (!best || score > best.score) {
353
+ best = { intent: rule.intent, score };
354
+ }
355
+ }
356
+
357
+ if (!best) return null;
358
+ return { intent: best.intent, confidence: best.score, entities: {}, turnHistory };
359
+ }
360
+ }
@@ -0,0 +1,138 @@
1
+ export function matrixZeros(rows: number, cols: number): number[][] {
2
+ return Array.from({ length: rows }, () => new Array(cols).fill(0));
3
+ }
4
+
5
+ export function matrixSubtract(a: number[][], b: number[][]): number[][] {
6
+ const rows = a.length;
7
+ const cols = a[0].length;
8
+ const result = matrixZeros(rows, cols);
9
+ for (let i = 0; i < rows; i++) {
10
+ for (let j = 0; j < cols; j++) {
11
+ result[i][j] = a[i][j] - b[i][j];
12
+ }
13
+ }
14
+ return result;
15
+ }
16
+
17
+ export function transpose(matrix: number[][]): number[][] {
18
+ const rows = matrix.length;
19
+ const cols = matrix[0].length;
20
+ const result = matrixZeros(cols, rows);
21
+ for (let i = 0; i < rows; i++) {
22
+ for (let j = 0; j < cols; j++) {
23
+ result[j][i] = matrix[i][j];
24
+ }
25
+ }
26
+ return result;
27
+ }
28
+
29
+ function rref(matrix: number[][]): { result: number[][]; pivots: number[] } {
30
+ const m = matrix.length;
31
+ if (m === 0) return { result: [], pivots: [] };
32
+ const n = matrix[0].length;
33
+ const A = matrix.map(row => [...row]);
34
+ const pivots: number[] = [];
35
+ let row = 0;
36
+
37
+ for (let col = 0; col < n && row < m; col++) {
38
+ let pivotRow = row;
39
+ while (pivotRow < m && Math.abs(A[pivotRow][col]) < 1e-10) {
40
+ pivotRow++;
41
+ }
42
+ if (pivotRow === m) continue;
43
+
44
+ if (pivotRow !== row) {
45
+ [A[row], A[pivotRow]] = [A[pivotRow], A[row]];
46
+ }
47
+
48
+ const pivotVal = A[row][col];
49
+ for (let j = 0; j < n; j++) {
50
+ A[row][j] /= pivotVal;
51
+ }
52
+
53
+ for (let i = 0; i < m; i++) {
54
+ if (i !== row && Math.abs(A[i][col]) > 1e-10) {
55
+ const factor = A[i][col];
56
+ for (let j = 0; j < n; j++) {
57
+ A[i][j] -= factor * A[row][j];
58
+ }
59
+ }
60
+ }
61
+
62
+ pivots.push(col);
63
+ row++;
64
+ }
65
+
66
+ return { result: A, pivots };
67
+ }
68
+
69
+ export function findNullSpace(A: number[][]): number[][] {
70
+ const m = A.length;
71
+ if (m === 0) return [];
72
+ const n = A[0].length;
73
+ if (n === 0) return [];
74
+
75
+ const { result: R, pivots } = rref(A);
76
+ const pivotSet = new Set(pivots);
77
+
78
+ const freeCols = Array.from({ length: n }, (_, i) => i).filter(
79
+ i => !pivotSet.has(i)
80
+ );
81
+
82
+ const basis: number[][] = [];
83
+
84
+ for (const freeCol of freeCols) {
85
+ const vec = new Array(n).fill(0);
86
+ vec[freeCol] = 1;
87
+
88
+ for (let i = 0; i < R.length; i++) {
89
+ let pivotCol = -1;
90
+ for (let j = 0; j < n; j++) {
91
+ if (Math.abs(R[i][j]) > 1e-10) {
92
+ pivotCol = j;
93
+ break;
94
+ }
95
+ }
96
+ if (pivotCol !== -1 && pivotSet.has(pivotCol)) {
97
+ let sum = 0;
98
+ for (let j = 0; j < n; j++) {
99
+ if (j !== pivotCol) {
100
+ sum += R[i][j] * vec[j];
101
+ }
102
+ }
103
+ vec[pivotCol] = -sum;
104
+ }
105
+ }
106
+
107
+ basis.push(vec);
108
+ }
109
+
110
+ return basis;
111
+ }
112
+
113
+ export function hasPositiveNullVector(C: number[][]): boolean {
114
+ const CT = transpose(C);
115
+ if (CT.length === 0 || CT[0].length === 0) return true;
116
+
117
+ const basis = findNullSpace(CT);
118
+ if (basis.length === 0) {
119
+ return true;
120
+ }
121
+
122
+ for (const vec of basis) {
123
+ if (vec.every(v => v > 1e-10)) return true;
124
+ if (vec.every(v => v < -1e-10)) return true;
125
+ }
126
+
127
+ if (basis.length >= 2) {
128
+ for (let i = 0; i < basis.length; i++) {
129
+ for (let j = i + 1; j < basis.length; j++) {
130
+ const sum = basis[i].map((v, k) => v + basis[j][k]);
131
+ if (sum.every(v => v > 1e-10)) return true;
132
+ if (sum.every(v => v < -1e-10)) return true;
133
+ }
134
+ }
135
+ }
136
+
137
+ return false;
138
+ }