@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,204 @@
1
+ import { cloneDeep } from "./clone";
2
+ import type { SessionState } from "../types/session";
3
+ import type { CollectedStateData } from "../types/persistence";
4
+
5
+ /**
6
+ * Helper to create a new session
7
+ * @param sessionId - Optional session ID (e.g., from database)
8
+ * @param metadata - Optional metadata to attach
9
+ */
10
+ export function createSession<TData = Record<string, unknown>>(
11
+ sessionId?: string,
12
+ metadata?: SessionState<TData>["metadata"]
13
+ ): SessionState<TData> {
14
+ const id =
15
+ sessionId || `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
16
+
17
+ return {
18
+ id,
19
+ data: {} as Partial<TData>, // Agent-level data structure
20
+ routeHistory: [],
21
+ metadata: {
22
+ ...metadata,
23
+ createdAt: new Date(),
24
+ lastUpdatedAt: new Date(),
25
+ },
26
+ };
27
+ }
28
+
29
+ /**
30
+ * Helper to create a new session ID
31
+ */
32
+ export function createSessionId(): string {
33
+ return `session_${Date.now()}_${Math.random().toString(36).slice(2)}`;
34
+ }
35
+ /**
36
+ * Clones a session to prevent mutation
37
+ */
38
+ export function cloneSession<TData>(
39
+ session: SessionState<TData>
40
+ ): SessionState<TData> {
41
+ return cloneDeep(session);
42
+ }
43
+
44
+ /**
45
+ * Helper to update session with new route
46
+ * With agent-level data, routes share the same data structure
47
+ */
48
+ export function enterRoute<TData = Record<string, unknown>>(
49
+ session: SessionState<TData>,
50
+ routeId: string,
51
+ routeTitle: string
52
+ ): SessionState<TData> {
53
+ // Exit current route if exists
54
+ const routeHistory = [...(session.routeHistory || [])];
55
+ if (session.currentRoute) {
56
+ const lastRouteIndex = routeHistory.findIndex(
57
+ (r) => r.routeId === session.currentRoute?.id && !r.exitedAt
58
+ );
59
+ if (lastRouteIndex >= 0) {
60
+ routeHistory[lastRouteIndex].exitedAt = new Date();
61
+ }
62
+ }
63
+
64
+ // Enter new route - data persists across routes at agent level
65
+ const now = new Date();
66
+ return {
67
+ ...session,
68
+ currentRoute: {
69
+ id: routeId,
70
+ title: routeTitle,
71
+ enteredAt: now,
72
+ },
73
+ currentStep: undefined,
74
+ // data remains the same - shared across all routes
75
+ routeHistory: [
76
+ ...routeHistory,
77
+ {
78
+ routeId,
79
+ enteredAt: now,
80
+ completed: false,
81
+ },
82
+ ],
83
+ metadata: {
84
+ ...session.metadata,
85
+ lastUpdatedAt: now,
86
+ },
87
+ };
88
+ }
89
+
90
+ /**
91
+ * Helper to update session with new step
92
+ */
93
+ export function enterStep<TData = Record<string, unknown>>(
94
+ session: SessionState<TData>,
95
+ stepId: string,
96
+ stepDescription?: string
97
+ ): SessionState<TData> {
98
+ return {
99
+ ...session,
100
+ currentStep: {
101
+ id: stepId,
102
+ description: stepDescription,
103
+ enteredAt: new Date(),
104
+ },
105
+ metadata: {
106
+ ...session.metadata,
107
+ lastUpdatedAt: new Date(),
108
+ },
109
+ };
110
+ }
111
+
112
+ /**
113
+ * Helper to merge collected data into session
114
+ * Updates agent-level data structure
115
+ */
116
+ export function mergeCollected<TData = Record<string, unknown>>(
117
+ session: SessionState<TData>,
118
+ data: Partial<unknown>
119
+ ): SessionState<TData> {
120
+ const newCollected = {
121
+ ...session.data,
122
+ ...data,
123
+ } as Partial<TData>;
124
+
125
+ return {
126
+ ...session,
127
+ data: newCollected, // Agent-level data update
128
+ metadata: {
129
+ ...session.metadata,
130
+ lastUpdatedAt: new Date(),
131
+ },
132
+ };
133
+ }
134
+
135
+ /**
136
+ * Helper to convert SessionState to persistence-friendly format
137
+ * Used when saving to database
138
+ */
139
+ export function sessionStepToData<TData = Record<string, unknown>>(
140
+ session: SessionState<TData>
141
+ ): {
142
+ currentRoute?: string;
143
+ currentStep?: string;
144
+ collectedData: CollectedStateData<TData>;
145
+ } {
146
+ return {
147
+ currentRoute: session.currentRoute?.id,
148
+ currentStep: session.currentStep?.id,
149
+ collectedData: {
150
+ data: session.data || {},
151
+ routeHistory: session.routeHistory,
152
+ history: session.history, // Include conversation history
153
+ currentRouteTitle: session.currentRoute?.title,
154
+ currentStepDescription: session.currentStep?.description,
155
+ metadata: session.metadata,
156
+ },
157
+ };
158
+ }
159
+
160
+ /**
161
+ * Helper to convert database SessionData back to SessionState
162
+ * Used when loading from database
163
+ * @param sessionId - The database session ID
164
+ * @param data - The database session data
165
+ */
166
+ export function sessionDataToStep<TData = Record<string, unknown>>(
167
+ sessionId: string,
168
+ data: {
169
+ currentRoute?: string;
170
+ currentStep?: string;
171
+ collectedData?: CollectedStateData<TData>;
172
+ }
173
+ ): SessionState<TData> {
174
+ const collectedData: CollectedStateData<TData> = data.collectedData || {
175
+ data: {},
176
+ routeHistory: [],
177
+ history: [],
178
+ metadata: {},
179
+ currentRouteTitle: undefined,
180
+ currentStepDescription: undefined,
181
+ };
182
+
183
+ return {
184
+ id: sessionId,
185
+ currentRoute: data.currentRoute
186
+ ? {
187
+ id: data.currentRoute,
188
+ title: collectedData.currentRouteTitle || data.currentRoute,
189
+ enteredAt: new Date(),
190
+ }
191
+ : undefined,
192
+ currentStep: data.currentStep
193
+ ? {
194
+ id: data.currentStep,
195
+ description: collectedData.currentStepDescription || undefined,
196
+ enteredAt: new Date(),
197
+ }
198
+ : undefined,
199
+ data: collectedData.data || {},
200
+ routeHistory: collectedData.routeHistory || [],
201
+ history: collectedData.history || [],
202
+ metadata: collectedData.metadata || {},
203
+ };
204
+ }
@@ -0,0 +1,444 @@
1
+ import type { Template, TemplateContext } from "../types";
2
+ import type { Event, MessageEventData } from "../types/history";
3
+ import { MessageRole, EventKind } from "../types/history";
4
+
5
+ /**
6
+ * Renders a template, which can be a string or a function, using the provided context.
7
+ * This function is asynchronous to support template functions that perform async operations.
8
+ *
9
+ * @param template - The template to render (string or function).
10
+ * @param params - The context object to pass to the template function.
11
+ * @returns A promise that resolves to the rendered string.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // With a string template
16
+ * const result1 = await render("Hello {{name}}", { context: { name: "Alice" } });
17
+ * // Result: "Hello Alice"
18
+ *
19
+ * // With a function template
20
+ * const fnTemplate = ({ context }) => `Hello ${context.name}`;
21
+ * const result2 = await render(fnTemplate, { context: { name: "Bob" } });
22
+ * // Result: "Hello Bob"
23
+ * ```
24
+ */
25
+ export async function render<TContext = unknown, TData = unknown>(
26
+ template: Template<TContext, TData> | undefined,
27
+ params: TemplateContext<TContext, TData>
28
+ ): Promise<string> {
29
+ if (typeof template === "function") {
30
+ // Execute the function and await the result if it's a promise
31
+ const result = await Promise.resolve(template(params));
32
+ return result;
33
+ }
34
+
35
+ if (typeof template === "string") {
36
+ // Fallback to the old renderTemplate logic for string-based templates
37
+ return renderTemplate(template, params.context as Record<string, unknown>);
38
+ }
39
+
40
+ // Return empty string if template is undefined or not a supported type
41
+ return "";
42
+ }
43
+
44
+ /**
45
+ * Renders an array of templates.
46
+ *
47
+ * @param templates - An array of templates to render.
48
+ * @param params - The context object.
49
+ * @returns A promise that resolves to an array of rendered strings.
50
+ */
51
+ export async function renderMany<TContext = unknown, TData = unknown>(
52
+ templates: Template<TContext, TData>[] | undefined,
53
+ params: TemplateContext<TContext, TData>
54
+ ): Promise<string[]> {
55
+ if (!templates) {
56
+ return [];
57
+ }
58
+ return Promise.all(templates.map((t) => render(t, params)));
59
+ }
60
+
61
+ /**
62
+ * @deprecated Use the asynchronous `render` function instead.
63
+ * Renders template variables in a string using the provided context.
64
+ * Supports {{variable}} and {{object.property}} syntax for property access.
65
+ *
66
+ * @param template - The template string containing {{variable}} placeholders
67
+ * @param context - The context object to pull values from
68
+ * @returns The rendered string with variables replaced
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * const template = "Hello {{user.name}}, welcome to {{company.name}}!";
73
+ * const context = {
74
+ * user: { name: "Alice", age: 30 },
75
+ * company: { name: "Acme Corp", location: "NYC" }
76
+ * };
77
+ * const result = renderTemplate(template, context);
78
+ * // Result: "Hello Alice, welcome to Acme Corp!"
79
+ *
80
+ * // Array handling
81
+ * const template2 = "Items: {{items}}";
82
+ * const context2 = { items: ["apple", "banana", "cherry"] };
83
+ * const result2 = renderTemplate(template2, context2);
84
+ * // Result: "Items: apple, banana, cherry"
85
+ * ```
86
+ */
87
+ export function renderTemplate(
88
+ template: string,
89
+ context: Record<string, unknown> | undefined
90
+ ): string {
91
+ if (!template || !context) {
92
+ return template;
93
+ }
94
+
95
+ return template.replace(
96
+ /\{\{([^}]+)\}\}/g,
97
+ (match: string, path: string): string => {
98
+ const value = getValueByPath(context, path.trim());
99
+ if (value === undefined || value === null) {
100
+ return match; // Keep the original placeholder if value not found
101
+ }
102
+ return valueToString(value);
103
+ }
104
+ );
105
+ }
106
+
107
+ /**
108
+ * Gets a value from an object using dot notation path.
109
+ * Supports nested property access like "user.name" or "user.address.city".
110
+ *
111
+ * @param obj - The object to search in
112
+ * @param path - The dot-separated path to the property
113
+ * @returns The value at the path, or undefined if not found
114
+ */
115
+ function getValueByPath(obj: Record<string, unknown>, path: string): unknown {
116
+ const keys = path.split(".");
117
+ let current: unknown = obj;
118
+
119
+ for (const key of keys) {
120
+ if (
121
+ current === null ||
122
+ current === undefined ||
123
+ typeof current !== "object"
124
+ ) {
125
+ return undefined;
126
+ }
127
+ current = (current as Record<string, unknown>)[key];
128
+ }
129
+
130
+ return current;
131
+ }
132
+
133
+ /**
134
+ * Converts a value to its string representation for template rendering.
135
+ * Handles different types appropriately.
136
+ *
137
+ * @param value - The value to convert to string
138
+ * @returns String representation of the value
139
+ */
140
+ function valueToString(value: unknown): string {
141
+ if (value === null || value === undefined) {
142
+ return "";
143
+ }
144
+
145
+ if (typeof value === "string") {
146
+ return value;
147
+ }
148
+
149
+ if (typeof value === "number" || typeof value === "boolean") {
150
+ return String(value);
151
+ }
152
+
153
+ if (Array.isArray(value)) {
154
+ // For arrays, join with commas by default
155
+ // Users can override this by using JSON.stringify in their templates if needed
156
+ return value.map((item) => valueToString(item)).join(", ");
157
+ }
158
+
159
+ if (typeof value === "object") {
160
+ // For objects, convert to JSON string
161
+ // This provides a readable representation while being safe
162
+ try {
163
+ return JSON.stringify(value);
164
+ } catch {
165
+ return "[object Object]";
166
+ }
167
+ }
168
+
169
+ // Fallback for any other type
170
+ return JSON.stringify(value);
171
+ }
172
+
173
+ /**
174
+ * @deprecated This function does not support async template functions.
175
+ * Renders template variables in an object recursively.
176
+ * Handles nested objects and arrays.
177
+ *
178
+ * @param obj - The object to render templates in
179
+ * @param context - The context object to pull values from
180
+ * @returns The object with all string templates rendered
181
+ */
182
+ export function renderTemplateObject(
183
+ obj: unknown,
184
+ context: Record<string, unknown> | undefined
185
+ ): unknown {
186
+ if (obj === null || obj === undefined) {
187
+ return obj;
188
+ }
189
+
190
+ if (typeof obj === "string") {
191
+ return renderTemplate(obj, context);
192
+ }
193
+
194
+ if (Array.isArray(obj)) {
195
+ return obj.map((item) => renderTemplateObject(item, context));
196
+ }
197
+
198
+ if (typeof obj === "object") {
199
+ const result: Record<string, unknown> = {};
200
+ for (const [key, value] of Object.entries(obj)) {
201
+ result[key] = renderTemplateObject(value, context);
202
+ }
203
+ return result;
204
+ }
205
+
206
+ return obj;
207
+ }
208
+
209
+ /**
210
+ * Creates helper functions for working with history and context in templates.
211
+ * These helpers make it easier to access message content and perform common operations.
212
+ *
213
+ * @param history - The event history array
214
+ * @returns Object containing helper functions
215
+ */
216
+ export function createTemplateHelpers(history?: Event[]) {
217
+ const helpers = {
218
+ /**
219
+ * Get the last message from history, optionally filtered by role.
220
+ * @param role - Optional role to filter by (user, assistant, etc.)
221
+ * @returns The message content or undefined if not found
222
+ */
223
+ getLastMessage(role?: MessageRole): string | undefined {
224
+ if (!history || history.length === 0) return undefined;
225
+
226
+ // Search backwards through history for the most recent message
227
+ for (let i = history.length - 1; i >= 0; i--) {
228
+ const event = history[i];
229
+ if (event.kind === EventKind.MESSAGE) {
230
+ // If no role specified, return the first message found
231
+ if (!role || event.source === role) {
232
+ const messageData = event.data as MessageEventData;
233
+ return messageData.message;
234
+ }
235
+ }
236
+ }
237
+ return undefined;
238
+ },
239
+
240
+ /**
241
+ * Get the last user message from history.
242
+ * @returns The user message content or undefined if not found
243
+ */
244
+ getLastUserMessage(): string | undefined {
245
+ return helpers.getLastMessage(MessageRole.USER);
246
+ },
247
+
248
+ /**
249
+ * Get the last assistant message from history.
250
+ * @returns The assistant message content or undefined if not found
251
+ */
252
+ getLastAssistantMessage(): string | undefined {
253
+ return helpers.getLastMessage(MessageRole.ASSISTANT);
254
+ },
255
+
256
+ /**
257
+ * Get all messages from history, optionally filtered by role.
258
+ * @param role - Optional role to filter by
259
+ * @returns Array of message contents
260
+ */
261
+ getMessages(role?: MessageRole): string[] {
262
+ if (!history || history.length === 0) return [];
263
+
264
+ const messages: string[] = [];
265
+ for (const event of history) {
266
+ if (event.kind === EventKind.MESSAGE) {
267
+ if (!role || event.source === role) {
268
+ const messageData = event.data as MessageEventData;
269
+ messages.push(messageData.message);
270
+ }
271
+ }
272
+ }
273
+ return messages;
274
+ },
275
+
276
+ /**
277
+ * Check if the last message contains any of the given keywords.
278
+ * @param keywords - Keywords to search for
279
+ * @param caseSensitive - Whether to perform case-sensitive search (default: false)
280
+ * @returns True if any keyword is found
281
+ */
282
+ lastMessageContains(keywords: string | string[], caseSensitive: boolean = false): boolean {
283
+ const lastMessage = helpers.getLastMessage();
284
+ if (!lastMessage) return false;
285
+
286
+ const searchText = caseSensitive ? lastMessage : lastMessage.toLowerCase();
287
+ const keywordArray = Array.isArray(keywords) ? keywords : [keywords];
288
+
289
+ return keywordArray.some(keyword => {
290
+ const searchKeyword = caseSensitive ? keyword : keyword.toLowerCase();
291
+ return searchText.includes(searchKeyword);
292
+ });
293
+ },
294
+ };
295
+
296
+ return helpers;
297
+ }
298
+
299
+ /**
300
+ * Creates a complete TemplateContext with helpers included.
301
+ * This is a convenience function for creating template contexts with all the helper methods.
302
+ *
303
+ * @param params - The base template context parameters
304
+ * @returns Complete TemplateContext with helpers
305
+ */
306
+ export function createTemplateContext<TContext = unknown, TData = unknown>(
307
+ params: Omit<Partial<TemplateContext<TContext, TData>>, 'helpers'>
308
+ ): TemplateContext<TContext, TData> {
309
+ return {
310
+ ...params,
311
+ data: params.data || {},
312
+ helpers: createTemplateHelpers(params.history),
313
+ };
314
+ }
315
+
316
+ /**
317
+ * Formats a JSON structure into readable markdown format.
318
+ * Handles nested objects, arrays, and primitive values.
319
+ *
320
+ * @param data - The JSON data to format
321
+ * @param title - Optional title for the knowledge base section
322
+ * @param maxDepth - Maximum nesting depth (default: 3)
323
+ * @returns Formatted markdown string
324
+ *
325
+ * @example
326
+ * ```typescript
327
+ * const knowledge = {
328
+ * company: {
329
+ * name: "Acme Corp",
330
+ * products: ["Widget A", "Widget B"],
331
+ * locations: {
332
+ * headquarters: "NYC",
333
+ * branches: ["LA", "Chicago"]
334
+ * }
335
+ * }
336
+ * };
337
+ *
338
+ * const markdown = formatKnowledgeBase(knowledge, "Company Information");
339
+ * // Output:
340
+ * // ## Company Information
341
+ * //
342
+ * // ### company
343
+ * // - **name**: Acme Corp
344
+ * // - **products**:
345
+ * // - Widget A
346
+ * // - Widget B
347
+ * // - **locations**:
348
+ * // - **headquarters**: NYC
349
+ * // - **branches**:
350
+ * // - LA
351
+ * // - Chicago
352
+ * ```
353
+ */
354
+ export function formatKnowledgeBase(
355
+ data: Record<string, unknown>,
356
+ title?: string,
357
+ maxDepth: number = 3
358
+ ): string {
359
+ const lines: string[] = [];
360
+
361
+ if (title) {
362
+ lines.push(`## ${title}`);
363
+ lines.push("");
364
+ }
365
+
366
+ if (!data || typeof data !== "object") {
367
+ lines.push("*No knowledge base data available*");
368
+ return lines.join("\n");
369
+ }
370
+
371
+ formatObject(data, lines, 0, maxDepth);
372
+
373
+ return lines.join("\n");
374
+ }
375
+
376
+ /**
377
+ * Recursively formats an object into markdown format
378
+ */
379
+ function formatObject(
380
+ obj: Record<string, unknown>,
381
+ lines: string[],
382
+ depth: number,
383
+ maxDepth: number,
384
+ prefix: string = ""
385
+ ): void {
386
+ const entries = Object.entries(obj);
387
+
388
+ if (entries.length === 0) {
389
+ lines.push(`${prefix}*Empty*`);
390
+ return;
391
+ }
392
+
393
+ for (const [key, value] of entries) {
394
+ const currentPrefix = prefix ? `${prefix} ` : "";
395
+
396
+ if (value === null || value === undefined) {
397
+ lines.push(`${currentPrefix}- **${key}**: *Not specified*`);
398
+ } else if (
399
+ typeof value === "string" ||
400
+ typeof value === "number" ||
401
+ typeof value === "boolean"
402
+ ) {
403
+ lines.push(`${currentPrefix}- **${key}**: ${value}`);
404
+ } else if (Array.isArray(value)) {
405
+ if (value.length === 0) {
406
+ lines.push(`${currentPrefix}- **${key}**: *Empty list*`);
407
+ } else {
408
+ lines.push(`${currentPrefix}- **${key}**:`);
409
+ for (const item of value) {
410
+ if (
411
+ typeof item === "string" ||
412
+ typeof item === "number" ||
413
+ typeof item === "boolean"
414
+ ) {
415
+ lines.push(`${currentPrefix} - ${item}`);
416
+ } else if (
417
+ depth < maxDepth &&
418
+ typeof item === "object" &&
419
+ item !== null
420
+ ) {
421
+ lines.push(`${currentPrefix} - ${JSON.stringify(item)}`);
422
+ } else {
423
+ lines.push(`${currentPrefix} - ${JSON.stringify(item)}`);
424
+ }
425
+ }
426
+ }
427
+ } else if (typeof value === "object") {
428
+ if (depth < maxDepth) {
429
+ lines.push(`${currentPrefix}- **${key}**:`);
430
+ formatObject(
431
+ value as Record<string, unknown>,
432
+ lines,
433
+ depth + 1,
434
+ maxDepth,
435
+ currentPrefix
436
+ );
437
+ } else {
438
+ lines.push(`${currentPrefix}- **${key}**: ${JSON.stringify(value)}`);
439
+ }
440
+ } else {
441
+ lines.push(`${currentPrefix}- **${key}**: ${JSON.stringify(value)}`);
442
+ }
443
+ }
444
+ }