@falai/agent 0.1.0-alpha2

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 (499) hide show
  1. package/README.md +797 -0
  2. package/dist/cjs/package.json +1 -0
  3. package/dist/cjs/src/adapters/MemoryAdapter.d.ts +47 -0
  4. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
  5. package/dist/cjs/src/adapters/MemoryAdapter.js +202 -0
  6. package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
  7. package/dist/cjs/src/adapters/MongoAdapter.d.ts +97 -0
  8. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
  9. package/dist/cjs/src/adapters/MongoAdapter.js +168 -0
  10. package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
  11. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts +169 -0
  12. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  13. package/dist/cjs/src/adapters/OpenSearchAdapter.js +458 -0
  14. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
  15. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts +71 -0
  16. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  17. package/dist/cjs/src/adapters/PostgreSQLAdapter.js +260 -0
  18. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
  19. package/dist/cjs/src/adapters/PrismaAdapter.d.ts +115 -0
  20. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
  21. package/dist/cjs/src/adapters/PrismaAdapter.js +366 -0
  22. package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
  23. package/dist/cjs/src/adapters/RedisAdapter.d.ts +71 -0
  24. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
  25. package/dist/cjs/src/adapters/RedisAdapter.js +231 -0
  26. package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
  27. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts +69 -0
  28. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  29. package/dist/cjs/src/adapters/SQLiteAdapter.js +312 -0
  30. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
  31. package/dist/cjs/src/adapters/index.d.ts +17 -0
  32. package/dist/cjs/src/adapters/index.d.ts.map +1 -0
  33. package/dist/cjs/src/adapters/index.js +21 -0
  34. package/dist/cjs/src/adapters/index.js.map +1 -0
  35. package/dist/cjs/src/constants/index.d.ts +10 -0
  36. package/dist/cjs/src/constants/index.d.ts.map +1 -0
  37. package/dist/cjs/src/constants/index.js +13 -0
  38. package/dist/cjs/src/constants/index.js.map +1 -0
  39. package/dist/cjs/src/core/Agent.d.ts +232 -0
  40. package/dist/cjs/src/core/Agent.d.ts.map +1 -0
  41. package/dist/cjs/src/core/Agent.js +741 -0
  42. package/dist/cjs/src/core/Agent.js.map +1 -0
  43. package/dist/cjs/src/core/Events.d.ts +26 -0
  44. package/dist/cjs/src/core/Events.d.ts.map +1 -0
  45. package/dist/cjs/src/core/Events.js +144 -0
  46. package/dist/cjs/src/core/Events.js.map +1 -0
  47. package/dist/cjs/src/core/PersistenceManager.d.ts +98 -0
  48. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  49. package/dist/cjs/src/core/PersistenceManager.js +261 -0
  50. package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
  51. package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
  52. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
  53. package/dist/cjs/src/core/PromptComposer.js +194 -0
  54. package/dist/cjs/src/core/PromptComposer.js.map +1 -0
  55. package/dist/cjs/src/core/ResponseEngine.d.ts +32 -0
  56. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
  57. package/dist/cjs/src/core/ResponseEngine.js +202 -0
  58. package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
  59. package/dist/cjs/src/core/ResponseModal.d.ts +222 -0
  60. package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
  61. package/dist/cjs/src/core/ResponseModal.js +1588 -0
  62. package/dist/cjs/src/core/ResponseModal.js.map +1 -0
  63. package/dist/cjs/src/core/ResponsePipeline.d.ts +175 -0
  64. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
  65. package/dist/cjs/src/core/ResponsePipeline.js +549 -0
  66. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
  67. package/dist/cjs/src/core/Route.d.ts +181 -0
  68. package/dist/cjs/src/core/Route.d.ts.map +1 -0
  69. package/dist/cjs/src/core/Route.js +541 -0
  70. package/dist/cjs/src/core/Route.js.map +1 -0
  71. package/dist/cjs/src/core/RoutingEngine.d.ts +159 -0
  72. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
  73. package/dist/cjs/src/core/RoutingEngine.js +961 -0
  74. package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
  75. package/dist/cjs/src/core/SessionManager.d.ts +94 -0
  76. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
  77. package/dist/cjs/src/core/SessionManager.js +239 -0
  78. package/dist/cjs/src/core/SessionManager.js.map +1 -0
  79. package/dist/cjs/src/core/Step.d.ts +170 -0
  80. package/dist/cjs/src/core/Step.d.ts.map +1 -0
  81. package/dist/cjs/src/core/Step.js +448 -0
  82. package/dist/cjs/src/core/Step.js.map +1 -0
  83. package/dist/cjs/src/core/ToolManager.d.ts +234 -0
  84. package/dist/cjs/src/core/ToolManager.d.ts.map +1 -0
  85. package/dist/cjs/src/core/ToolManager.js +1117 -0
  86. package/dist/cjs/src/core/ToolManager.js.map +1 -0
  87. package/dist/cjs/src/index.d.ts +44 -0
  88. package/dist/cjs/src/index.d.ts.map +1 -0
  89. package/dist/cjs/src/index.js +88 -0
  90. package/dist/cjs/src/index.js.map +1 -0
  91. package/dist/cjs/src/providers/AnthropicProvider.d.ts +43 -0
  92. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
  93. package/dist/cjs/src/providers/AnthropicProvider.js +377 -0
  94. package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
  95. package/dist/cjs/src/providers/GeminiProvider.d.ts +58 -0
  96. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
  97. package/dist/cjs/src/providers/GeminiProvider.js +489 -0
  98. package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
  99. package/dist/cjs/src/providers/OpenAIProvider.d.ts +52 -0
  100. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
  101. package/dist/cjs/src/providers/OpenAIProvider.js +395 -0
  102. package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
  103. package/dist/cjs/src/providers/OpenRouterProvider.d.ts +56 -0
  104. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
  105. package/dist/cjs/src/providers/OpenRouterProvider.js +409 -0
  106. package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
  107. package/dist/cjs/src/providers/index.d.ts +13 -0
  108. package/dist/cjs/src/providers/index.d.ts.map +1 -0
  109. package/dist/cjs/src/providers/index.js +16 -0
  110. package/dist/cjs/src/providers/index.js.map +1 -0
  111. package/dist/cjs/src/types/agent.d.ts +181 -0
  112. package/dist/cjs/src/types/agent.d.ts.map +1 -0
  113. package/dist/cjs/src/types/agent.js +21 -0
  114. package/dist/cjs/src/types/agent.js.map +1 -0
  115. package/dist/cjs/src/types/ai.d.ts +143 -0
  116. package/dist/cjs/src/types/ai.d.ts.map +1 -0
  117. package/dist/cjs/src/types/ai.js +6 -0
  118. package/dist/cjs/src/types/ai.js.map +1 -0
  119. package/dist/cjs/src/types/history.d.ts +178 -0
  120. package/dist/cjs/src/types/history.d.ts.map +1 -0
  121. package/dist/cjs/src/types/history.js +33 -0
  122. package/dist/cjs/src/types/history.js.map +1 -0
  123. package/dist/cjs/src/types/index.d.ts +22 -0
  124. package/dist/cjs/src/types/index.d.ts.map +1 -0
  125. package/dist/cjs/src/types/index.js +37 -0
  126. package/dist/cjs/src/types/index.js.map +1 -0
  127. package/dist/cjs/src/types/persistence.d.ts +209 -0
  128. package/dist/cjs/src/types/persistence.d.ts.map +1 -0
  129. package/dist/cjs/src/types/persistence.js +7 -0
  130. package/dist/cjs/src/types/persistence.js.map +1 -0
  131. package/dist/cjs/src/types/route.d.ts +238 -0
  132. package/dist/cjs/src/types/route.d.ts.map +1 -0
  133. package/dist/cjs/src/types/route.js +6 -0
  134. package/dist/cjs/src/types/route.js.map +1 -0
  135. package/dist/cjs/src/types/routing.d.ts +16 -0
  136. package/dist/cjs/src/types/routing.d.ts.map +1 -0
  137. package/dist/cjs/src/types/routing.js +3 -0
  138. package/dist/cjs/src/types/routing.js.map +1 -0
  139. package/dist/cjs/src/types/schema.d.ts +22 -0
  140. package/dist/cjs/src/types/schema.d.ts.map +1 -0
  141. package/dist/cjs/src/types/schema.js +3 -0
  142. package/dist/cjs/src/types/schema.js.map +1 -0
  143. package/dist/cjs/src/types/session.d.ts +65 -0
  144. package/dist/cjs/src/types/session.d.ts.map +1 -0
  145. package/dist/cjs/src/types/session.js +6 -0
  146. package/dist/cjs/src/types/session.js.map +1 -0
  147. package/dist/cjs/src/types/template.d.ts +88 -0
  148. package/dist/cjs/src/types/template.d.ts.map +1 -0
  149. package/dist/cjs/src/types/template.js +3 -0
  150. package/dist/cjs/src/types/template.js.map +1 -0
  151. package/dist/cjs/src/types/tool.d.ts +130 -0
  152. package/dist/cjs/src/types/tool.d.ts.map +1 -0
  153. package/dist/cjs/src/types/tool.js +19 -0
  154. package/dist/cjs/src/types/tool.js.map +1 -0
  155. package/dist/cjs/src/utils/clone.d.ts +8 -0
  156. package/dist/cjs/src/utils/clone.d.ts.map +1 -0
  157. package/dist/cjs/src/utils/clone.js +32 -0
  158. package/dist/cjs/src/utils/clone.js.map +1 -0
  159. package/dist/cjs/src/utils/condition.d.ts +38 -0
  160. package/dist/cjs/src/utils/condition.d.ts.map +1 -0
  161. package/dist/cjs/src/utils/condition.js +168 -0
  162. package/dist/cjs/src/utils/condition.js.map +1 -0
  163. package/dist/cjs/src/utils/event.d.ts +6 -0
  164. package/dist/cjs/src/utils/event.d.ts.map +1 -0
  165. package/dist/cjs/src/utils/event.js +20 -0
  166. package/dist/cjs/src/utils/event.js.map +1 -0
  167. package/dist/cjs/src/utils/history.d.ts +60 -0
  168. package/dist/cjs/src/utils/history.d.ts.map +1 -0
  169. package/dist/cjs/src/utils/history.js +274 -0
  170. package/dist/cjs/src/utils/history.js.map +1 -0
  171. package/dist/cjs/src/utils/id.d.ts +25 -0
  172. package/dist/cjs/src/utils/id.d.ts.map +1 -0
  173. package/dist/cjs/src/utils/id.js +70 -0
  174. package/dist/cjs/src/utils/id.js.map +1 -0
  175. package/dist/cjs/src/utils/index.d.ts +15 -0
  176. package/dist/cjs/src/utils/index.d.ts.map +1 -0
  177. package/dist/cjs/src/utils/index.js +64 -0
  178. package/dist/cjs/src/utils/index.js.map +1 -0
  179. package/dist/cjs/src/utils/json.d.ts +16 -0
  180. package/dist/cjs/src/utils/json.d.ts.map +1 -0
  181. package/dist/cjs/src/utils/json.js +47 -0
  182. package/dist/cjs/src/utils/json.js.map +1 -0
  183. package/dist/cjs/src/utils/logger.d.ts +10 -0
  184. package/dist/cjs/src/utils/logger.d.ts.map +1 -0
  185. package/dist/cjs/src/utils/logger.js +23 -0
  186. package/dist/cjs/src/utils/logger.js.map +1 -0
  187. package/dist/cjs/src/utils/retry.d.ts +10 -0
  188. package/dist/cjs/src/utils/retry.d.ts.map +1 -0
  189. package/dist/cjs/src/utils/retry.js +76 -0
  190. package/dist/cjs/src/utils/retry.js.map +1 -0
  191. package/dist/cjs/src/utils/session.d.ts +51 -0
  192. package/dist/cjs/src/utils/session.d.ts.map +1 -0
  193. package/dist/cjs/src/utils/session.js +170 -0
  194. package/dist/cjs/src/utils/session.js.map +1 -0
  195. package/dist/cjs/src/utils/template.d.ts +155 -0
  196. package/dist/cjs/src/utils/template.d.ts.map +1 -0
  197. package/dist/cjs/src/utils/template.js +383 -0
  198. package/dist/cjs/src/utils/template.js.map +1 -0
  199. package/dist/src/adapters/MemoryAdapter.d.ts +47 -0
  200. package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
  201. package/dist/src/adapters/MemoryAdapter.js +198 -0
  202. package/dist/src/adapters/MemoryAdapter.js.map +1 -0
  203. package/dist/src/adapters/MongoAdapter.d.ts +97 -0
  204. package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
  205. package/dist/src/adapters/MongoAdapter.js +164 -0
  206. package/dist/src/adapters/MongoAdapter.js.map +1 -0
  207. package/dist/src/adapters/OpenSearchAdapter.d.ts +169 -0
  208. package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  209. package/dist/src/adapters/OpenSearchAdapter.js +454 -0
  210. package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
  211. package/dist/src/adapters/PostgreSQLAdapter.d.ts +71 -0
  212. package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  213. package/dist/src/adapters/PostgreSQLAdapter.js +256 -0
  214. package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
  215. package/dist/src/adapters/PrismaAdapter.d.ts +115 -0
  216. package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
  217. package/dist/src/adapters/PrismaAdapter.js +362 -0
  218. package/dist/src/adapters/PrismaAdapter.js.map +1 -0
  219. package/dist/src/adapters/RedisAdapter.d.ts +71 -0
  220. package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
  221. package/dist/src/adapters/RedisAdapter.js +227 -0
  222. package/dist/src/adapters/RedisAdapter.js.map +1 -0
  223. package/dist/src/adapters/SQLiteAdapter.d.ts +69 -0
  224. package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  225. package/dist/src/adapters/SQLiteAdapter.js +308 -0
  226. package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
  227. package/dist/src/adapters/index.d.ts +17 -0
  228. package/dist/src/adapters/index.d.ts.map +1 -0
  229. package/dist/src/adapters/index.js +11 -0
  230. package/dist/src/adapters/index.js.map +1 -0
  231. package/dist/src/constants/index.d.ts +10 -0
  232. package/dist/src/constants/index.d.ts.map +1 -0
  233. package/dist/src/constants/index.js +10 -0
  234. package/dist/src/constants/index.js.map +1 -0
  235. package/dist/src/core/Agent.d.ts +232 -0
  236. package/dist/src/core/Agent.d.ts.map +1 -0
  237. package/dist/src/core/Agent.js +737 -0
  238. package/dist/src/core/Agent.js.map +1 -0
  239. package/dist/src/core/Events.d.ts +26 -0
  240. package/dist/src/core/Events.d.ts.map +1 -0
  241. package/dist/src/core/Events.js +137 -0
  242. package/dist/src/core/Events.js.map +1 -0
  243. package/dist/src/core/PersistenceManager.d.ts +98 -0
  244. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  245. package/dist/src/core/PersistenceManager.js +257 -0
  246. package/dist/src/core/PersistenceManager.js.map +1 -0
  247. package/dist/src/core/PromptComposer.d.ts +27 -0
  248. package/dist/src/core/PromptComposer.d.ts.map +1 -0
  249. package/dist/src/core/PromptComposer.js +190 -0
  250. package/dist/src/core/PromptComposer.js.map +1 -0
  251. package/dist/src/core/ResponseEngine.d.ts +32 -0
  252. package/dist/src/core/ResponseEngine.d.ts.map +1 -0
  253. package/dist/src/core/ResponseEngine.js +198 -0
  254. package/dist/src/core/ResponseEngine.js.map +1 -0
  255. package/dist/src/core/ResponseModal.d.ts +222 -0
  256. package/dist/src/core/ResponseModal.d.ts.map +1 -0
  257. package/dist/src/core/ResponseModal.js +1583 -0
  258. package/dist/src/core/ResponseModal.js.map +1 -0
  259. package/dist/src/core/ResponsePipeline.d.ts +175 -0
  260. package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
  261. package/dist/src/core/ResponsePipeline.js +545 -0
  262. package/dist/src/core/ResponsePipeline.js.map +1 -0
  263. package/dist/src/core/Route.d.ts +181 -0
  264. package/dist/src/core/Route.d.ts.map +1 -0
  265. package/dist/src/core/Route.js +537 -0
  266. package/dist/src/core/Route.js.map +1 -0
  267. package/dist/src/core/RoutingEngine.d.ts +159 -0
  268. package/dist/src/core/RoutingEngine.d.ts.map +1 -0
  269. package/dist/src/core/RoutingEngine.js +957 -0
  270. package/dist/src/core/RoutingEngine.js.map +1 -0
  271. package/dist/src/core/SessionManager.d.ts +94 -0
  272. package/dist/src/core/SessionManager.d.ts.map +1 -0
  273. package/dist/src/core/SessionManager.js +235 -0
  274. package/dist/src/core/SessionManager.js.map +1 -0
  275. package/dist/src/core/Step.d.ts +170 -0
  276. package/dist/src/core/Step.d.ts.map +1 -0
  277. package/dist/src/core/Step.js +444 -0
  278. package/dist/src/core/Step.js.map +1 -0
  279. package/dist/src/core/ToolManager.d.ts +234 -0
  280. package/dist/src/core/ToolManager.d.ts.map +1 -0
  281. package/dist/src/core/ToolManager.js +1111 -0
  282. package/dist/src/core/ToolManager.js.map +1 -0
  283. package/dist/src/index.d.ts +44 -0
  284. package/dist/src/index.d.ts.map +1 -0
  285. package/dist/src/index.js +37 -0
  286. package/dist/src/index.js.map +1 -0
  287. package/dist/src/providers/AnthropicProvider.d.ts +43 -0
  288. package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
  289. package/dist/src/providers/AnthropicProvider.js +370 -0
  290. package/dist/src/providers/AnthropicProvider.js.map +1 -0
  291. package/dist/src/providers/GeminiProvider.d.ts +58 -0
  292. package/dist/src/providers/GeminiProvider.d.ts.map +1 -0
  293. package/dist/src/providers/GeminiProvider.js +485 -0
  294. package/dist/src/providers/GeminiProvider.js.map +1 -0
  295. package/dist/src/providers/OpenAIProvider.d.ts +52 -0
  296. package/dist/src/providers/OpenAIProvider.d.ts.map +1 -0
  297. package/dist/src/providers/OpenAIProvider.js +388 -0
  298. package/dist/src/providers/OpenAIProvider.js.map +1 -0
  299. package/dist/src/providers/OpenRouterProvider.d.ts +56 -0
  300. package/dist/src/providers/OpenRouterProvider.d.ts.map +1 -0
  301. package/dist/src/providers/OpenRouterProvider.js +402 -0
  302. package/dist/src/providers/OpenRouterProvider.js.map +1 -0
  303. package/dist/src/providers/index.d.ts +13 -0
  304. package/dist/src/providers/index.d.ts.map +1 -0
  305. package/dist/src/providers/index.js +9 -0
  306. package/dist/src/providers/index.js.map +1 -0
  307. package/dist/src/types/agent.d.ts +181 -0
  308. package/dist/src/types/agent.d.ts.map +1 -0
  309. package/dist/src/types/agent.js +18 -0
  310. package/dist/src/types/agent.js.map +1 -0
  311. package/dist/src/types/ai.d.ts +143 -0
  312. package/dist/src/types/ai.d.ts.map +1 -0
  313. package/dist/src/types/ai.js +5 -0
  314. package/dist/src/types/ai.js.map +1 -0
  315. package/dist/src/types/history.d.ts +178 -0
  316. package/dist/src/types/history.d.ts.map +1 -0
  317. package/dist/src/types/history.js +30 -0
  318. package/dist/src/types/history.js.map +1 -0
  319. package/dist/src/types/index.d.ts +22 -0
  320. package/dist/src/types/index.d.ts.map +1 -0
  321. package/dist/src/types/index.js +12 -0
  322. package/dist/src/types/index.js.map +1 -0
  323. package/dist/src/types/persistence.d.ts +209 -0
  324. package/dist/src/types/persistence.d.ts.map +1 -0
  325. package/dist/src/types/persistence.js +6 -0
  326. package/dist/src/types/persistence.js.map +1 -0
  327. package/dist/src/types/route.d.ts +238 -0
  328. package/dist/src/types/route.d.ts.map +1 -0
  329. package/dist/src/types/route.js +5 -0
  330. package/dist/src/types/route.js.map +1 -0
  331. package/dist/src/types/routing.d.ts +16 -0
  332. package/dist/src/types/routing.d.ts.map +1 -0
  333. package/dist/src/types/routing.js +2 -0
  334. package/dist/src/types/routing.js.map +1 -0
  335. package/dist/src/types/schema.d.ts +22 -0
  336. package/dist/src/types/schema.d.ts.map +1 -0
  337. package/dist/src/types/schema.js +2 -0
  338. package/dist/src/types/schema.js.map +1 -0
  339. package/dist/src/types/session.d.ts +65 -0
  340. package/dist/src/types/session.d.ts.map +1 -0
  341. package/dist/src/types/session.js +5 -0
  342. package/dist/src/types/session.js.map +1 -0
  343. package/dist/src/types/template.d.ts +88 -0
  344. package/dist/src/types/template.d.ts.map +1 -0
  345. package/dist/src/types/template.js +2 -0
  346. package/dist/src/types/template.js.map +1 -0
  347. package/dist/src/types/tool.d.ts +130 -0
  348. package/dist/src/types/tool.d.ts.map +1 -0
  349. package/dist/src/types/tool.js +16 -0
  350. package/dist/src/types/tool.js.map +1 -0
  351. package/dist/src/utils/clone.d.ts +8 -0
  352. package/dist/src/utils/clone.d.ts.map +1 -0
  353. package/dist/src/utils/clone.js +29 -0
  354. package/dist/src/utils/clone.js.map +1 -0
  355. package/dist/src/utils/condition.d.ts +38 -0
  356. package/dist/src/utils/condition.d.ts.map +1 -0
  357. package/dist/src/utils/condition.js +161 -0
  358. package/dist/src/utils/condition.js.map +1 -0
  359. package/dist/src/utils/event.d.ts +6 -0
  360. package/dist/src/utils/event.d.ts.map +1 -0
  361. package/dist/src/utils/event.js +17 -0
  362. package/dist/src/utils/event.js.map +1 -0
  363. package/dist/src/utils/history.d.ts +60 -0
  364. package/dist/src/utils/history.d.ts.map +1 -0
  365. package/dist/src/utils/history.js +263 -0
  366. package/dist/src/utils/history.js.map +1 -0
  367. package/dist/src/utils/id.d.ts +25 -0
  368. package/dist/src/utils/id.d.ts.map +1 -0
  369. package/dist/src/utils/id.js +64 -0
  370. package/dist/src/utils/id.js.map +1 -0
  371. package/dist/src/utils/index.d.ts +15 -0
  372. package/dist/src/utils/index.d.ts.map +1 -0
  373. package/dist/src/utils/index.js +23 -0
  374. package/dist/src/utils/index.js.map +1 -0
  375. package/dist/src/utils/json.d.ts +16 -0
  376. package/dist/src/utils/json.d.ts.map +1 -0
  377. package/dist/src/utils/json.js +43 -0
  378. package/dist/src/utils/json.js.map +1 -0
  379. package/dist/src/utils/logger.d.ts +10 -0
  380. package/dist/src/utils/logger.d.ts.map +1 -0
  381. package/dist/src/utils/logger.js +17 -0
  382. package/dist/src/utils/logger.js.map +1 -0
  383. package/dist/src/utils/retry.d.ts +10 -0
  384. package/dist/src/utils/retry.d.ts.map +1 -0
  385. package/dist/src/utils/retry.js +71 -0
  386. package/dist/src/utils/retry.js.map +1 -0
  387. package/dist/src/utils/session.d.ts +51 -0
  388. package/dist/src/utils/session.d.ts.map +1 -0
  389. package/dist/src/utils/session.js +160 -0
  390. package/dist/src/utils/session.js.map +1 -0
  391. package/dist/src/utils/template.d.ts +155 -0
  392. package/dist/src/utils/template.d.ts.map +1 -0
  393. package/dist/src/utils/template.js +374 -0
  394. package/dist/src/utils/template.js.map +1 -0
  395. package/docs/CONTRIBUTING.md +521 -0
  396. package/docs/README.md +228 -0
  397. package/docs/api/README.md +3258 -0
  398. package/docs/api/overview.md +1134 -0
  399. package/docs/architecture/data-extraction-flow.md +363 -0
  400. package/docs/core/agent/README.md +902 -0
  401. package/docs/core/agent/context-management.md +796 -0
  402. package/docs/core/agent/session-management.md +641 -0
  403. package/docs/core/ai-integration/prompt-composition.md +220 -0
  404. package/docs/core/ai-integration/providers.md +515 -0
  405. package/docs/core/ai-integration/response-processing.md +287 -0
  406. package/docs/core/conversation-flows/data-collection.md +623 -0
  407. package/docs/core/conversation-flows/route-dsl.md +502 -0
  408. package/docs/core/conversation-flows/routes.md +247 -0
  409. package/docs/core/conversation-flows/step-transitions.md +595 -0
  410. package/docs/core/conversation-flows/steps.md +154 -0
  411. package/docs/core/error-handling.md +638 -0
  412. package/docs/core/persistence/adapters.md +255 -0
  413. package/docs/core/persistence/session-storage.md +644 -0
  414. package/docs/core/routing/intelligent-routing.md +466 -0
  415. package/docs/core/tools/tool-definition.md +970 -0
  416. package/docs/core/tools/tool-scoping.md +819 -0
  417. package/docs/guides/advanced-patterns/publishing.md +186 -0
  418. package/docs/guides/error-handling-patterns.md +578 -0
  419. package/docs/guides/getting-started/README.md +696 -0
  420. package/docs/guides/migration/README.md +72 -0
  421. package/docs/guides/migration/flexible-routing-conditions.md +375 -0
  422. package/docs/guides/migration/response-modal-refactor.md +518 -0
  423. package/examples/advanced-patterns/knowledge-based-agent.ts +735 -0
  424. package/examples/advanced-patterns/persistent-onboarding.ts +728 -0
  425. package/examples/advanced-patterns/route-lifecycle-hooks.ts +556 -0
  426. package/examples/advanced-patterns/streaming-responses.ts +578 -0
  427. package/examples/ai-providers/anthropic-integration.ts +388 -0
  428. package/examples/ai-providers/openai-integration.ts +228 -0
  429. package/examples/condition-patterns/function-only-conditions.ts +365 -0
  430. package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
  431. package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
  432. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  433. package/examples/condition-patterns/string-only-conditions.ts +296 -0
  434. package/examples/conversation-flows/completion-transitions.ts +318 -0
  435. package/examples/core-concepts/basic-agent.ts +503 -0
  436. package/examples/core-concepts/modern-streaming-api.ts +309 -0
  437. package/examples/core-concepts/schema-driven-extraction.ts +332 -0
  438. package/examples/core-concepts/session-management.ts +494 -0
  439. package/examples/integrations/database-integration.ts +630 -0
  440. package/examples/integrations/healthcare-integration.ts +595 -0
  441. package/examples/integrations/search-integration.ts +530 -0
  442. package/examples/integrations/server-session-management.ts +307 -0
  443. package/examples/persistence/custom-adapter.ts +529 -0
  444. package/examples/persistence/database-persistence.ts +583 -0
  445. package/examples/persistence/memory-sessions.ts +495 -0
  446. package/examples/persistence/prisma-schema.example.prisma +74 -0
  447. package/examples/persistence/redis-persistence.ts +488 -0
  448. package/examples/tools/basic-tools.ts +765 -0
  449. package/examples/tools/data-enrichment-tools.ts +593 -0
  450. package/package.json +125 -0
  451. package/src/adapters/MemoryAdapter.ts +273 -0
  452. package/src/adapters/MongoAdapter.ts +304 -0
  453. package/src/adapters/OpenSearchAdapter.ts +670 -0
  454. package/src/adapters/PostgreSQLAdapter.ts +428 -0
  455. package/src/adapters/PrismaAdapter.ts +553 -0
  456. package/src/adapters/RedisAdapter.ts +377 -0
  457. package/src/adapters/SQLiteAdapter.ts +459 -0
  458. package/src/adapters/index.ts +43 -0
  459. package/src/constants/index.ts +10 -0
  460. package/src/core/Agent.ts +970 -0
  461. package/src/core/Events.ts +164 -0
  462. package/src/core/PersistenceManager.ts +353 -0
  463. package/src/core/PromptComposer.ts +253 -0
  464. package/src/core/ResponseEngine.ts +306 -0
  465. package/src/core/ResponseModal.ts +2050 -0
  466. package/src/core/ResponsePipeline.ts +864 -0
  467. package/src/core/Route.ts +677 -0
  468. package/src/core/RoutingEngine.ts +1396 -0
  469. package/src/core/SessionManager.ts +297 -0
  470. package/src/core/Step.ts +593 -0
  471. package/src/core/ToolManager.ts +1394 -0
  472. package/src/index.ts +155 -0
  473. package/src/providers/AnthropicProvider.ts +560 -0
  474. package/src/providers/GeminiProvider.ts +683 -0
  475. package/src/providers/OpenAIProvider.ts +602 -0
  476. package/src/providers/OpenRouterProvider.ts +613 -0
  477. package/src/providers/index.ts +16 -0
  478. package/src/types/agent.ts +196 -0
  479. package/src/types/ai.ts +158 -0
  480. package/src/types/history.ts +206 -0
  481. package/src/types/index.ts +119 -0
  482. package/src/types/persistence.ts +251 -0
  483. package/src/types/route.ts +272 -0
  484. package/src/types/routing.ts +18 -0
  485. package/src/types/schema.ts +23 -0
  486. package/src/types/session.ts +74 -0
  487. package/src/types/template.ts +104 -0
  488. package/src/types/tool.ts +174 -0
  489. package/src/utils/clone.ts +34 -0
  490. package/src/utils/condition.ts +190 -0
  491. package/src/utils/event.ts +16 -0
  492. package/src/utils/history.ts +306 -0
  493. package/src/utils/id.ts +73 -0
  494. package/src/utils/index.ts +69 -0
  495. package/src/utils/json.ts +46 -0
  496. package/src/utils/logger.ts +19 -0
  497. package/src/utils/retry.ts +97 -0
  498. package/src/utils/session.ts +204 -0
  499. package/src/utils/template.ts +444 -0
@@ -0,0 +1,970 @@
1
+ /**
2
+ * Core Agent implementation
3
+ */
4
+
5
+ import type {
6
+ AgentOptions,
7
+ Term,
8
+ Guideline,
9
+ GuidelineMatch,
10
+ Tool,
11
+ Event,
12
+ RouteOptions,
13
+ SessionState,
14
+ Template,
15
+ AgentResponseStreamChunk,
16
+ AgentResponse,
17
+ StructuredSchema,
18
+ ValidationError,
19
+ ValidationResult,
20
+
21
+ } from "../types";
22
+ import type { StreamOptions, GenerateOptions, RespondParams } from "./ResponseModal";
23
+ import {
24
+ mergeCollected,
25
+ logger,
26
+ LoggerLevel,
27
+ render,
28
+ createTemplateContext,
29
+ createConditionEvaluator,
30
+ } from "../utils";
31
+
32
+ import { Route } from "./Route";
33
+ import { Step } from "./Step";
34
+ import { PersistenceManager } from "./PersistenceManager";
35
+ import { SessionManager } from "./SessionManager";
36
+ import { RoutingEngine } from "./RoutingEngine";
37
+
38
+ import { ResponseModal } from "./ResponseModal";
39
+ import { ToolManager } from "./ToolManager";
40
+
41
+ /**
42
+ * Error thrown when data validation fails
43
+ */
44
+ class DataValidationError extends Error {
45
+ constructor(public errors: ValidationError[], message?: string) {
46
+ super(message || "Data validation failed");
47
+ this.name = "DataValidationError";
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Error thrown when route configuration is invalid
53
+ */
54
+ class RouteConfigurationError extends Error {
55
+ constructor(public routeTitle: string, public invalidFields: string[], message?: string) {
56
+ super(message || `Route configuration error in '${routeTitle}'`);
57
+ this.name = "RouteConfigurationError";
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Main Agent class with generic context and data support
63
+ */
64
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
+ export class Agent<TContext = any, TData = any> {
66
+ private terms: Term<TContext, TData>[] = [];
67
+ private guidelines: Guideline<TContext, TData>[] = [];
68
+ private tools: Tool<TContext, TData>[] = [];
69
+ private routes: Route<TContext, TData>[] = [];
70
+ private context: TContext | undefined;
71
+ private persistenceManager: PersistenceManager<TData> | undefined;
72
+ private routingEngine: RoutingEngine<TContext, TData>;
73
+ private responseModal: ResponseModal<TContext, TData>;
74
+ private currentSession?: SessionState<TData>;
75
+ private knowledgeBase: Record<string, unknown> = {};
76
+ private schema?: StructuredSchema;
77
+ private collectedData: Partial<TData> = {};
78
+
79
+ /** Public session manager for easy session management */
80
+ public session: SessionManager<TData>;
81
+
82
+ /** Public tool manager for simplified tool creation and management */
83
+ public tool: ToolManager<TContext, TData>;
84
+
85
+ constructor(private readonly options: AgentOptions<TContext, TData>) {
86
+ // Set log level based on debug option
87
+ if (options.debug) {
88
+ logger.setLevel(LoggerLevel.DEBUG);
89
+ }
90
+
91
+ // Validate context configuration
92
+ if (options.context !== undefined && options.contextProvider) {
93
+ throw new Error(
94
+ "Cannot provide both 'context' and 'contextProvider'. Choose one."
95
+ );
96
+ }
97
+
98
+ // Initialize and validate agent-level schema if provided
99
+ if (options.schema) {
100
+ this.schema = options.schema;
101
+ this.validateSchema(this.schema);
102
+ logger.debug("[Agent] Agent-level schema initialized and validated");
103
+ }
104
+
105
+ // Initialize context if provided
106
+ this.context = options.context;
107
+
108
+ // Initialize collected data with initial data if provided
109
+ if (options.initialData) {
110
+ if (this.schema) {
111
+ const validation = this.validateData(options.initialData);
112
+ if (!validation.valid) {
113
+ throw new Error(
114
+ `Initial data validation failed: ${validation.errors.map(e => e.message).join(', ')}`
115
+ );
116
+ }
117
+ }
118
+ this.collectedData = { ...options.initialData };
119
+ logger.debug("[Agent] Initial data set:", this.collectedData);
120
+ }
121
+
122
+ // Initialize current session if provided
123
+ this.currentSession = options.session;
124
+
125
+ // Initialize routing engine
126
+ this.routingEngine = new RoutingEngine<TContext, TData>({
127
+ maxCandidates: 5,
128
+ allowRouteSwitch: true,
129
+ switchThreshold: 70,
130
+ });
131
+
132
+ // Initialize ResponseModal for handling all response generation
133
+ this.responseModal = new ResponseModal<TContext, TData>(this);
134
+
135
+ // Initialize persistence if configured
136
+ if (options.persistence) {
137
+ try {
138
+ // Validate persistence configuration
139
+ if (!options.persistence.adapter) {
140
+ throw new Error("Persistence adapter is required when persistence is configured");
141
+ }
142
+
143
+ if (!options.persistence.adapter.sessionRepository) {
144
+ throw new Error("Persistence adapter must provide a sessionRepository");
145
+ }
146
+
147
+ if (!options.persistence.adapter.messageRepository) {
148
+ throw new Error("Persistence adapter must provide a messageRepository");
149
+ }
150
+
151
+ this.persistenceManager = new PersistenceManager<TData>(options.persistence);
152
+
153
+ // Initialize the adapter if it has an initialize method
154
+ if (options.persistence.adapter.initialize) {
155
+ options.persistence.adapter.initialize().catch((error) => {
156
+ logger.error(
157
+ "[Agent] Persistence adapter initialization failed:",
158
+ error instanceof Error ? error.message : String(error)
159
+ );
160
+ });
161
+ }
162
+ } catch (error) {
163
+ const errorMessage = error instanceof Error ? error.message : String(error);
164
+ logger.error("[Agent] Failed to initialize persistence:", errorMessage);
165
+ throw new Error(`Failed to initialize persistence: ${errorMessage}`);
166
+ }
167
+ }
168
+
169
+ // Initialize from options - use create methods for consistency
170
+ if (options.terms) {
171
+ options.terms.forEach((term) => {
172
+ this.createTerm(term);
173
+ });
174
+ }
175
+
176
+ if (options.guidelines) {
177
+ options.guidelines.forEach((guideline) => {
178
+ this.createGuideline(guideline);
179
+ });
180
+ }
181
+
182
+ if (options.tools) {
183
+ options.tools.forEach((tool) => {
184
+ this.createTool(tool);
185
+ });
186
+ }
187
+
188
+ if (options.routes) {
189
+ options.routes.forEach((routeOptions) => {
190
+ this.createRoute(routeOptions);
191
+ });
192
+ }
193
+
194
+ // Initialize knowledge base
195
+ if (options.knowledgeBase) {
196
+ this.knowledgeBase = { ...options.knowledgeBase };
197
+ }
198
+
199
+ // Initialize session manager with reference to this agent for bidirectional sync
200
+ this.session = new SessionManager<TData>(this.persistenceManager, this);
201
+
202
+ // Initialize tool manager with proper type inference
203
+ this.tool = new ToolManager<TContext, TData>(this);
204
+
205
+ // Store sessionId for later use in getOrCreate calls
206
+ if (options.sessionId) {
207
+ this.session.setDefaultSessionId(options.sessionId);
208
+ // The session will be loaded on first getOrCreate call
209
+ this.session.getOrCreate(options.sessionId).then((session) => {
210
+ // Sync session data to agent collected data
211
+ if (session.data && Object.keys(session.data).length > 0) {
212
+ this.collectedData = { ...session.data };
213
+ logger.debug("[Agent] Synced session data to collected data:", this.collectedData);
214
+ }
215
+ }).catch((err) => {
216
+ logger.error("Failed to start session", err);
217
+ });
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Validate the agent-level schema structure
223
+ * @private
224
+ */
225
+ private validateSchema(schema: StructuredSchema): void {
226
+ if (!schema || typeof schema !== 'object') {
227
+ throw new Error(
228
+ "Agent schema must be a valid JSON Schema object. " +
229
+ "Provide a schema with 'type': 'object' and 'properties' to define the data structure."
230
+ );
231
+ }
232
+
233
+ if (schema.type !== 'object') {
234
+ throw new Error(
235
+ `Agent schema must be of type 'object', but received '${String(schema.type)}'. ` +
236
+ "Agent-level schemas must define object structures for data collection."
237
+ );
238
+ }
239
+
240
+ if (!schema.properties || typeof schema.properties !== 'object') {
241
+ throw new Error(
242
+ "Agent schema must have a 'properties' field defining the data fields. " +
243
+ "Example: { type: 'object', properties: { name: { type: 'string' }, email: { type: 'string' } } }"
244
+ );
245
+ }
246
+
247
+ logger.debug("[Agent] Schema validation passed");
248
+ }
249
+
250
+ /**
251
+ * Validate data against the agent-level schema
252
+ */
253
+ validateData(data: Partial<TData>): ValidationResult {
254
+ if (!this.schema) {
255
+ // No schema defined, consider all data valid
256
+ return { valid: true, errors: [], warnings: [] };
257
+ }
258
+
259
+ const errors: ValidationError[] = [];
260
+ const warnings: ValidationError[] = [];
261
+
262
+ // Basic validation - check if provided fields exist in schema
263
+ if (this.schema.properties) {
264
+ for (const [key, value] of Object.entries(data)) {
265
+ if (!(key in this.schema.properties)) {
266
+ errors.push({
267
+ field: key,
268
+ value,
269
+ message: `Field '${key}' is not defined in agent schema`,
270
+ schemaPath: `properties.${key}`
271
+ });
272
+ }
273
+ }
274
+ }
275
+
276
+ // Check required fields if specified
277
+ if (this.schema.required && Array.isArray(this.schema.required)) {
278
+ for (const requiredField of this.schema.required) {
279
+ if (!(requiredField in data) || data[requiredField as keyof TData] === undefined) {
280
+ warnings.push({
281
+ field: requiredField,
282
+ value: undefined,
283
+ message: `Required field '${requiredField}' is missing`,
284
+ schemaPath: `required`
285
+ });
286
+ }
287
+ }
288
+ }
289
+
290
+ return {
291
+ valid: errors.length === 0,
292
+ errors,
293
+ warnings
294
+ };
295
+ }
296
+
297
+ /**
298
+ * Check if a field is valid according to the agent schema
299
+ * @param field - The field key to validate
300
+ * @returns true if field exists in schema or no schema is defined, false otherwise
301
+ */
302
+ isValidSchemaField(field: keyof TData): boolean {
303
+ if (!this.schema || !this.schema.properties) {
304
+ // No schema defined, consider all fields valid
305
+ return true;
306
+ }
307
+
308
+ return field as string in this.schema.properties;
309
+ }
310
+
311
+ /**
312
+ * Get the current collected data
313
+ */
314
+ getCollectedData(): Partial<TData> {
315
+ // Ensure agent collected data is synced with session
316
+ this.syncSessionDataToCollectedData();
317
+ return { ...this.collectedData };
318
+ }
319
+
320
+ /**
321
+ * Update collected data with validation
322
+ */
323
+ async updateCollectedData(updates: Partial<TData>): Promise<void> {
324
+ // Validate the updates
325
+ const validation = this.validateData(updates);
326
+ if (!validation.valid) {
327
+ const errorMessages = validation.errors.map(e => e.message).join(', ');
328
+ throw new DataValidationError(validation.errors, `Data validation failed: ${errorMessages}`);
329
+ }
330
+
331
+ // Log warnings if any
332
+ if (validation.warnings.length > 0) {
333
+ const warningMessages = validation.warnings.map(w => w.message).join(', ');
334
+ logger.warn(`[Agent] Data validation warnings: ${warningMessages}`);
335
+ }
336
+
337
+ // Merge updates with current data
338
+ const previousData = { ...this.collectedData };
339
+ this.collectedData = {
340
+ ...this.collectedData,
341
+ ...updates
342
+ };
343
+
344
+ // Trigger agent-level lifecycle hook if configured
345
+ if (this.options.hooks?.onDataUpdate) {
346
+ this.collectedData = await this.options.hooks.onDataUpdate(
347
+ this.collectedData,
348
+ previousData
349
+ );
350
+ }
351
+
352
+ // Update current session if it exists to keep it in sync
353
+ if (this.currentSession) {
354
+ this.currentSession = mergeCollected(this.currentSession, this.collectedData);
355
+ }
356
+
357
+ // Also update the session manager's session data (avoid circular call)
358
+ const sessionManagerSession = this.session.current;
359
+ if (sessionManagerSession) {
360
+ sessionManagerSession.data = { ...this.collectedData };
361
+ sessionManagerSession.metadata!.lastUpdatedAt = new Date();
362
+ }
363
+
364
+ logger.debug("[Agent] Collected data updated:", updates);
365
+ }
366
+
367
+ /**
368
+ * Get agent name
369
+ */
370
+ get name(): string {
371
+ return this.options.name;
372
+ }
373
+
374
+ /**
375
+ * Get agent description
376
+ */
377
+ get description(): string | undefined {
378
+ return this.options.description;
379
+ }
380
+
381
+ /**
382
+ * Get agent goal
383
+ */
384
+ get goal(): string | undefined {
385
+ return this.options.goal;
386
+ }
387
+
388
+ /**
389
+ * Get agent identity
390
+ */
391
+ get identity(): Template<TContext> | undefined {
392
+ return this.options.identity;
393
+ }
394
+
395
+ /**
396
+ * Create a new route (journey) using agent-level data type
397
+ */
398
+ createRoute(
399
+ options: RouteOptions<TContext, TData>
400
+ ): Route<TContext, TData> {
401
+ // Validate that requiredFields exist in agent schema
402
+ if (options.requiredFields && this.schema?.properties) {
403
+ const invalidRequiredFields = options.requiredFields.filter(
404
+ field => !(String(field) in this.schema!.properties!)
405
+ );
406
+ if (invalidRequiredFields.length > 0) {
407
+ throw new RouteConfigurationError(
408
+ options.title,
409
+ invalidRequiredFields.map(f => String(f)),
410
+ `Invalid required fields in route '${options.title}': ${invalidRequiredFields.join(', ')}. ` +
411
+ `Must be valid keys from agent schema. Available fields: ${Object.keys(this.schema.properties).join(', ')}.`
412
+ );
413
+ }
414
+ }
415
+
416
+ // Validate that optionalFields exist in agent schema
417
+ if (options.optionalFields && this.schema?.properties) {
418
+ const invalidOptionalFields = options.optionalFields.filter(
419
+ field => !(String(field) in this.schema!.properties!)
420
+ );
421
+ if (invalidOptionalFields.length > 0) {
422
+ throw new RouteConfigurationError(
423
+ options.title,
424
+ invalidOptionalFields.map(f => String(f)),
425
+ `Invalid optional fields in route '${options.title}': ${invalidOptionalFields.join(', ')}. ` +
426
+ `Must be valid keys from agent schema. Available fields: ${Object.keys(this.schema.properties).join(', ')}.`
427
+ );
428
+ }
429
+ }
430
+
431
+ const route = new Route<TContext, TData>(options, this);
432
+ this.routes.push(route);
433
+ return route;
434
+ }
435
+
436
+ /**
437
+ * Create a domain term for the glossary
438
+ */
439
+ createTerm(term: Term<TContext, TData>): this {
440
+ this.terms.push(term);
441
+ return this;
442
+ }
443
+
444
+ /**
445
+ * Create a behavioral guideline
446
+ */
447
+ createGuideline(guideline: Guideline<TContext, TData>): this {
448
+ const guidelineWithId = {
449
+ ...guideline,
450
+ id: guideline.id || `guideline_${this.guidelines.length}`,
451
+ enabled: guideline.enabled !== false, // Default to true
452
+ };
453
+ this.guidelines.push(guidelineWithId);
454
+ return this;
455
+ }
456
+
457
+ /**
458
+ * Add a tool to the agent using the unified Tool interface
459
+ * Creates and adds the tool to agent scope in one operation (BREAKING CHANGE: replaces createTool)
460
+ */
461
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
462
+ addTool<TResult = any>(
463
+ tool: Tool<TContext, TData, TResult>
464
+ ): this {
465
+ // Validate tool before adding
466
+ if (!tool || !tool.id || !tool.handler) {
467
+ throw new Error('Invalid tool: must have id and handler properties');
468
+ }
469
+
470
+ // Add directly to agent's tools array, preserving the TResult type
471
+ this.tools.push(tool);
472
+ logger.debug(`[Agent] Added tool to agent scope: ${tool.id}`);
473
+ return this;
474
+ }
475
+
476
+ /**
477
+ * Register a tool at the agent level (legacy method for backward compatibility)
478
+ * @deprecated Use addTool() with Tool interface instead
479
+ */
480
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
481
+ createTool<TResult = any>(tool: Tool<TContext, TData, TResult>): this {
482
+ // Validate tool before adding
483
+ if (!tool || !tool.id || !tool.handler) {
484
+ throw new Error('Invalid tool: must have id and handler properties');
485
+ }
486
+
487
+ this.tools.push(tool);
488
+ logger.debug(`[Agent] Created tool (legacy): ${tool.id}`);
489
+ return this;
490
+ }
491
+
492
+ /**
493
+ * Register multiple tools at the agent level
494
+ */
495
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
496
+ registerTools<TResult = any>(tools: Tool<TContext, TData, TResult>[]): this {
497
+ tools.forEach((tool) => {
498
+ // Validate each tool before adding
499
+ if (!tool || !tool.id || !tool.handler) {
500
+ throw new Error(`Invalid tool in batch: must have id and handler properties (tool: ${tool?.id || 'unknown'})`);
501
+ }
502
+ this.tools.push(tool);
503
+ });
504
+ logger.debug(`[Agent] Registered ${tools.length} tools`);
505
+ return this;
506
+ }
507
+
508
+ /**
509
+ * Update the agent's context
510
+ * Triggers both agent-level and route-specific onContextUpdate lifecycle hooks if configured
511
+ */
512
+ async updateContext(updates: Partial<TContext>): Promise<void> {
513
+ const previousContext = this.context;
514
+
515
+ // Merge updates with current context
516
+ this.context = {
517
+ ...(this.context as Record<string, unknown>),
518
+ ...(updates as Record<string, unknown>),
519
+ } as TContext;
520
+
521
+ // Trigger route-specific lifecycle hook if configured and session has current route
522
+ if (this.currentSession?.currentRoute) {
523
+ const currentRoute = this.routes.find(
524
+ (r) => r.id === this.currentSession!.currentRoute?.id
525
+ );
526
+ if (
527
+ currentRoute?.hooks?.onContextUpdate &&
528
+ previousContext !== undefined
529
+ ) {
530
+ await currentRoute.handleContextUpdate(this.context, previousContext);
531
+ }
532
+ }
533
+
534
+ // Trigger agent-level lifecycle hook if configured
535
+ if (this.options.hooks?.onContextUpdate && previousContext !== undefined) {
536
+ await this.options.hooks.onContextUpdate(this.context, previousContext);
537
+ }
538
+ }
539
+
540
+ /**
541
+ * Update collected data in session with lifecycle hook support
542
+ * Triggers both agent-level and route-specific onDataUpdate lifecycle hooks if configured
543
+ * @internal
544
+ */
545
+ private async updateData(
546
+ session: SessionState<TData>,
547
+ dataUpdate: Partial<TData>
548
+ ): Promise<SessionState<TData>> {
549
+ const previousCollected = { ...session.data };
550
+
551
+ // Merge new collected data
552
+ let newCollected = {
553
+ ...session.data,
554
+ ...dataUpdate,
555
+ };
556
+
557
+ // Trigger route-specific lifecycle hook if configured and session has a current route
558
+ if (session.currentRoute) {
559
+ const currentRoute = this.routes.find(
560
+ (r) => r.id === session.currentRoute?.id
561
+ );
562
+ if (currentRoute?.hooks?.onDataUpdate) {
563
+ newCollected = await currentRoute.handleDataUpdate(
564
+ newCollected,
565
+ previousCollected
566
+ );
567
+ }
568
+ }
569
+
570
+ // Trigger agent-level lifecycle hook if configured
571
+ if (this.options.hooks?.onDataUpdate) {
572
+ newCollected = (await this.options.hooks.onDataUpdate(
573
+ newCollected,
574
+ previousCollected
575
+ ));
576
+ }
577
+
578
+ // Update agent's collected data to stay in sync
579
+ this.collectedData = { ...newCollected };
580
+
581
+ // Return updated session
582
+ return mergeCollected(session, newCollected);
583
+ }
584
+
585
+ /**
586
+ * Get current context (fetches from provider if configured)
587
+ */
588
+ async getContext(): Promise<TContext | undefined> {
589
+ // If context provider is configured, use it to fetch fresh context
590
+ if (this.options.contextProvider) {
591
+ return await this.options.contextProvider();
592
+ }
593
+
594
+ // Otherwise return the stored context
595
+ return this.context;
596
+ }
597
+ /**
598
+ * Get current schema
599
+ */
600
+ getSchema(): StructuredSchema | undefined {
601
+ return this.schema;
602
+ }
603
+
604
+ /**
605
+ * Generate a response based on history and context as a stream
606
+ */
607
+ async *respondStream(params: RespondParams<TContext, TData>): AsyncGenerator<AgentResponseStreamChunk<TData>> {
608
+ // Delegate to ResponseModal
609
+ yield* this.responseModal.respondStream(params);
610
+ }
611
+
612
+ /**
613
+ * Generate a response based on history and context
614
+ */
615
+ async respond(params: RespondParams<TContext, TData>): Promise<AgentResponse<TData>> {
616
+ // Delegate to ResponseModal
617
+ return this.responseModal.respond(params);
618
+ }
619
+
620
+ /**
621
+ * Get all routes
622
+ */
623
+ getRoutes(): Route<TContext, TData>[] {
624
+ return [...this.routes];
625
+ }
626
+
627
+ /**
628
+ * Get agent options
629
+ * @internal Used by ResponseModal
630
+ */
631
+ getAgentOptions(): AgentOptions<TContext, TData> {
632
+ return this.options;
633
+ }
634
+
635
+ /**
636
+ * Get routing engine
637
+ * @internal Used by ResponseModal
638
+ */
639
+ getRoutingEngine(): RoutingEngine<TContext, TData> {
640
+ return this.routingEngine;
641
+ }
642
+
643
+ /**
644
+ * Get the updateData method bound to this agent
645
+ * @internal Used by ResponseModal
646
+ */
647
+ getUpdateDataMethod(): (session: SessionState<TData>, dataUpdate: Partial<TData>) => Promise<SessionState<TData>> {
648
+ return this.updateData.bind(this);
649
+ }
650
+
651
+
652
+
653
+ /**
654
+ * Get all terms
655
+ */
656
+ getTerms(): Term<TContext, TData>[] {
657
+ return [...this.terms];
658
+ }
659
+
660
+ /**
661
+ * Get all tools
662
+ */
663
+ getTools(): Tool<TContext, TData>[] {
664
+ return [...this.tools];
665
+ }
666
+
667
+
668
+
669
+
670
+
671
+
672
+
673
+ /**
674
+ * Get all guidelines
675
+ */
676
+ getGuidelines(): Guideline<TContext, TData>[] {
677
+ return [...this.guidelines];
678
+ }
679
+
680
+ /**
681
+ * Evaluate and match active guidelines based on their conditions
682
+ * Returns guidelines that should be active given the current context
683
+ */
684
+ async evaluateGuidelines(
685
+ context?: TContext,
686
+ session?: SessionState<TData>,
687
+ history?: Event[]
688
+ ): Promise<GuidelineMatch<TContext, TData>[]> {
689
+ const templateContext = { context, session, history, data: session?.data };
690
+ const evaluator = createConditionEvaluator(templateContext);
691
+ const matches: GuidelineMatch<TContext, TData>[] = [];
692
+
693
+ for (const guideline of this.guidelines) {
694
+ // Skip disabled guidelines
695
+ if (guideline.enabled === false) {
696
+ continue;
697
+ }
698
+
699
+ if (guideline.condition) {
700
+ const evaluation = await evaluator.evaluateCondition(guideline.condition, 'AND');
701
+
702
+ // Include guideline if:
703
+ // 1. No programmatic conditions (only strings) - always active
704
+ // 2. Programmatic conditions evaluate to true
705
+ if (!evaluation.hasProgrammaticConditions || evaluation.programmaticResult) {
706
+ const rationale = evaluation.aiContextStrings.length > 0
707
+ ? `Condition met: ${evaluation.aiContextStrings.join(" AND ")}`
708
+ : evaluation.hasProgrammaticConditions
709
+ ? "Programmatic condition evaluated to true"
710
+ : "Always active (no conditions)";
711
+
712
+ matches.push({
713
+ guideline,
714
+ rationale
715
+ });
716
+ }
717
+ } else {
718
+ // No condition means always active
719
+ matches.push({
720
+ guideline,
721
+ rationale: "Always active (no conditions)"
722
+ });
723
+ }
724
+ }
725
+
726
+ return matches;
727
+ }
728
+
729
+ /**
730
+ * Get the agent's knowledge base
731
+ */
732
+ getKnowledgeBase(): Record<string, unknown> {
733
+ return { ...this.knowledgeBase };
734
+ }
735
+
736
+
737
+
738
+ /**
739
+ * Get the persistence manager (if configured)
740
+ */
741
+ getPersistenceManager(): PersistenceManager<TData> | undefined {
742
+ return this.persistenceManager;
743
+ }
744
+
745
+ /**
746
+ * Check if persistence is enabled
747
+ */
748
+ hasPersistence(): boolean {
749
+ return this.persistenceManager !== undefined;
750
+ }
751
+
752
+ /**
753
+ * Set the current session for convenience methods
754
+ * @param session - Session step to use for subsequent calls
755
+ */
756
+ setCurrentSession(session: SessionState): void {
757
+ this.currentSession = session;
758
+ }
759
+
760
+ /**
761
+ * Get the current session (if set)
762
+ */
763
+ getCurrentSession(): SessionState | undefined {
764
+ return this.currentSession;
765
+ }
766
+
767
+ /**
768
+ * Execute a prepare or finalize function/tool
769
+ * @internal Used by ResponseModal
770
+ */
771
+ async executePrepareFinalize(
772
+ prepareOrFinalize:
773
+ | string
774
+ | Tool<TContext, TData>
775
+ | ((context: TContext, data?: Partial<TData>) => void | Promise<void>)
776
+ | undefined,
777
+ context: TContext,
778
+ data?: Partial<TData>,
779
+ route?: Route<TContext, TData>,
780
+ step?: Step<TContext, TData>
781
+ ): Promise<void> {
782
+ if (!prepareOrFinalize) return;
783
+
784
+ if (typeof prepareOrFinalize === "function") {
785
+ // It's a function - call it directly
786
+ await prepareOrFinalize(context, data);
787
+ } else {
788
+ // It's a tool reference - find and execute the tool
789
+ let tool: Tool<TContext, TData> | undefined;
790
+
791
+ if (typeof prepareOrFinalize === "string") {
792
+ // Tool ID - use ToolManager to find it across all scopes
793
+ tool = this.tool.find(prepareOrFinalize, undefined, step, route);
794
+ } else {
795
+ // Tool object - validate it has required properties
796
+ if (prepareOrFinalize.id && typeof prepareOrFinalize.handler === 'function') {
797
+ tool = prepareOrFinalize;
798
+ } else {
799
+ logger.error(`[Agent] Invalid tool object for prepare/finalize: missing id or invalid handler`);
800
+ return;
801
+ }
802
+ }
803
+
804
+ if (tool) {
805
+ // Use ToolManager for execution
806
+ const result = await this.tool.executeTool({
807
+ tool,
808
+ context,
809
+ updateContext: this.updateContext.bind(this),
810
+ updateData: this.updateCollectedData.bind(this),
811
+ history: [], // Empty history for prepare/finalize
812
+ data,
813
+ });
814
+
815
+ if (!result.success) {
816
+ logger.error(
817
+ `[Agent] Tool execution failed in prepare/finalize: ${result.error}`
818
+ );
819
+ throw new Error(`Tool execution failed: ${result.error}`);
820
+ }
821
+ } else {
822
+ logger.warn(
823
+ `[Agent] Tool not found for prepare/finalize: ${typeof prepareOrFinalize === "string"
824
+ ? prepareOrFinalize
825
+ : "inline tool"
826
+ }`
827
+ );
828
+ }
829
+ }
830
+ }
831
+
832
+ /**
833
+ * Clear the current session
834
+ */
835
+ clearCurrentSession(): void {
836
+ this.currentSession = undefined;
837
+ }
838
+
839
+ /**
840
+ * Sync session data to agent collected data
841
+ * @internal Used to keep agent and session data in sync
842
+ */
843
+ private syncSessionDataToCollectedData(): void {
844
+ const sessionData = this.session.getData();
845
+ if (sessionData && Object.keys(sessionData).length > 0) {
846
+ this.collectedData = { ...sessionData };
847
+ logger.debug("[Agent] Synced session data to collected data:", this.collectedData);
848
+ }
849
+ }
850
+
851
+ /**
852
+ * Get collected data from current session or agent-level collected data
853
+ * @param routeId - Optional route ID to get data for (uses current route if not provided)
854
+ * @returns The collected data from the current session or agent-level data
855
+ */
856
+ getData(): Partial<TData> {
857
+ // Ensure agent collected data is synced with session
858
+ this.syncSessionDataToCollectedData();
859
+
860
+ // If we have a current session, use session data
861
+ if (this.currentSession) {
862
+ // With agent-level data, all routes share the same data structure
863
+ // No need for route-specific data access
864
+ return (this.currentSession.data) || {};
865
+ }
866
+
867
+ // Otherwise, return agent-level collected data
868
+ return this.getCollectedData();
869
+ }
870
+
871
+ /**
872
+ * Manually transition to a different route
873
+ * Sets a pending transition that will be executed on the next respond() call
874
+ *
875
+ * @param routeIdOrTitle - Route ID or title to transition to
876
+ * @param session - Session step to update (uses current session if not provided)
877
+ * @param condition - Optional AI-evaluated condition for the transition
878
+ * @returns Updated session with pending transition
879
+ *
880
+ * @example
881
+ * // After route completes
882
+ * if (response.isRouteComplete && response.session) {
883
+ * const updatedSession = agent.nextStepRoute("feedback-collection", response.session);
884
+ * // Next respond() call will automatically transition to feedback route
885
+ * const nextResponse = await agent.respond({ history, session: updatedSession });
886
+ * }
887
+ */
888
+ async nextStepRoute(
889
+ routeIdOrTitle: string,
890
+ session?: SessionState<TData>,
891
+ condition?: Template<TContext, TData>,
892
+ history?: Event[]
893
+ ): Promise<SessionState<TData>> {
894
+ const targetSession = session || this.currentSession;
895
+
896
+ if (!targetSession) {
897
+ throw new Error(
898
+ "No session provided and no current session available. Please provide a session to transition."
899
+ );
900
+ }
901
+
902
+ // Find target route by ID or title
903
+ const targetRoute = this.routes.find(
904
+ (r) => r.id === routeIdOrTitle || r.title === routeIdOrTitle
905
+ );
906
+
907
+ if (!targetRoute) {
908
+ throw new Error(
909
+ `Route not found: ${routeIdOrTitle}. Available routes: ${this.routes
910
+ .map((r) => r.title)
911
+ .join(", ")}`
912
+ );
913
+ }
914
+ const templateContext = createTemplateContext({
915
+ context: this.context,
916
+ session,
917
+ history,
918
+ data: this.currentSession?.data,
919
+ });
920
+ const renderedCondition = await render(condition, templateContext);
921
+
922
+ const updatedSession: SessionState<TData> = {
923
+ ...targetSession,
924
+ pendingTransition: {
925
+ targetRouteId: targetRoute.id,
926
+ condition: renderedCondition,
927
+ reason: "route_complete",
928
+ },
929
+ };
930
+
931
+ // Update current session if using it
932
+ if (!session && this.currentSession) {
933
+ this.currentSession = updatedSession;
934
+ }
935
+
936
+ logger.debug(
937
+ `[Agent] Set pending transition to route: ${targetRoute.title}`
938
+ );
939
+
940
+ return updatedSession;
941
+ }
942
+
943
+ /**
944
+ * Simplified respond method using SessionManager
945
+ * Automatically manages conversation history through the session
946
+ */
947
+ async chat(
948
+ message?: string,
949
+ options?: GenerateOptions<TContext>
950
+ ): Promise<AgentResponse<TData>> {
951
+ // Delegate to ResponseModal.generate()
952
+ return this.responseModal.generate(message, options);
953
+ }
954
+
955
+ /**
956
+ * Modern streaming API - simple interface like chat() but returns a stream
957
+ * Automatically manages conversation history through the session
958
+ */
959
+ async *stream(
960
+ message?: string,
961
+ options?: StreamOptions<TContext>
962
+ ): AsyncGenerator<AgentResponseStreamChunk<TData>> {
963
+ // Delegate to ResponseModal with the same options structure as chat()
964
+ yield* this.responseModal.stream(message, {
965
+ history: options?.history,
966
+ contextOverride: options?.contextOverride,
967
+ signal: options?.signal,
968
+ });
969
+ }
970
+ }