@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,306 @@
1
+ /**
2
+ * History normalization utilities
3
+ * Convert simplified history format to internal Event format
4
+ */
5
+
6
+ import type { Event, MessageEventData, ToolEventData, StatusEventData } from "../types";
7
+ import { EventKind, MessageRole } from "../types";
8
+ import type { History, HistoryItem, UserHistoryItem, AssistantHistoryItem, ToolHistoryItem } from "../types/history";
9
+
10
+ /**
11
+ * Convert a simplified history item to an internal Event
12
+ * @param item - The HistoryItem to convert
13
+ * @returns Event with proper type-safe structure
14
+ * @throws Error if the history item is malformed or has invalid data
15
+ */
16
+ export function historyItemToEvent(item: HistoryItem): Event<MessageEventData | ToolEventData | StatusEventData> {
17
+ if (!item || typeof item !== 'object') {
18
+ throw new Error('Invalid history item: must be a non-null object');
19
+ }
20
+
21
+ if (!item.role || typeof item.role !== 'string') {
22
+ throw new Error('Invalid history item: role is required and must be a string');
23
+ }
24
+
25
+ const timestamp = new Date().toISOString();
26
+
27
+ switch (item.role) {
28
+ case "user": {
29
+ const userItem = item;
30
+ if (typeof userItem.content !== 'string') {
31
+ throw new Error('Invalid user history item: content must be a string');
32
+ }
33
+
34
+ return {
35
+ kind: EventKind.MESSAGE,
36
+ source: MessageRole.USER,
37
+ timestamp,
38
+ data: {
39
+ participant: {
40
+ display_name: userItem.name || "User",
41
+ },
42
+ message: userItem.content,
43
+ },
44
+ };
45
+ }
46
+ case "assistant": {
47
+ const assistantItem = item;
48
+ if (assistantItem.content !== null && typeof assistantItem.content !== 'string') {
49
+ throw new Error('Invalid assistant history item: content must be a string or null');
50
+ }
51
+
52
+ const event: Event<MessageEventData> = {
53
+ kind: EventKind.MESSAGE,
54
+ source: MessageRole.ASSISTANT,
55
+ timestamp,
56
+ data: {
57
+ participant: {
58
+ display_name: "Assistant",
59
+ },
60
+ message: assistantItem.content || "",
61
+ },
62
+ };
63
+
64
+ // If there are tool calls, validate and add them
65
+ if (assistantItem.tool_calls && assistantItem.tool_calls.length > 0) {
66
+ if (!Array.isArray(assistantItem.tool_calls)) {
67
+ throw new Error('Invalid assistant history item: tool_calls must be an array');
68
+ }
69
+
70
+ for (const toolCall of assistantItem.tool_calls) {
71
+ if (!toolCall.id || !toolCall.name || typeof toolCall.arguments !== 'object') {
72
+ throw new Error('Invalid tool call: id, name, and arguments are required');
73
+ }
74
+ }
75
+
76
+ event.data.toolCalls = assistantItem.tool_calls;
77
+ }
78
+
79
+ return event;
80
+ }
81
+ case "tool": {
82
+ const toolItem = item;
83
+ if (!toolItem.tool_call_id || typeof toolItem.tool_call_id !== 'string') {
84
+ throw new Error('Invalid tool history item: tool_call_id is required and must be a string');
85
+ }
86
+ if (!toolItem.name || typeof toolItem.name !== 'string') {
87
+ throw new Error('Invalid tool history item: name is required and must be a string');
88
+ }
89
+
90
+ return {
91
+ kind: EventKind.TOOL,
92
+ source: MessageRole.AGENT,
93
+ timestamp,
94
+ data: {
95
+ tool_calls: [
96
+ {
97
+ tool_id: toolItem.tool_call_id,
98
+ arguments: {}, // Tool results don't have arguments
99
+ result: {
100
+ data: toolItem.content,
101
+ },
102
+ },
103
+ ],
104
+ },
105
+ };
106
+ }
107
+ case "system": {
108
+ const systemItem = item;
109
+ if (typeof systemItem.content !== 'string') {
110
+ throw new Error('Invalid system history item: content must be a string');
111
+ }
112
+
113
+ return {
114
+ kind: EventKind.MESSAGE,
115
+ source: MessageRole.SYSTEM,
116
+ timestamp,
117
+ data: {
118
+ participant: {
119
+ display_name: "System",
120
+ },
121
+ message: systemItem.content,
122
+ },
123
+ };
124
+ }
125
+ default:
126
+ throw new Error(`Invalid history item role: ${String((item as { role?: unknown }).role)}`);
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Convert an array of HistoryItems to Events
132
+ * @param history - Array of HistoryItems to convert
133
+ * @returns Array of Events with proper type-safe structure
134
+ * @throws Error if any history item is malformed
135
+ */
136
+ export function historyToEvents(history: History): Event<MessageEventData | ToolEventData | StatusEventData>[] {
137
+ if (!Array.isArray(history)) {
138
+ throw new Error('Invalid history: must be an array');
139
+ }
140
+
141
+ return history.map((item, index) => {
142
+ try {
143
+ return historyItemToEvent(item);
144
+ } catch (error) {
145
+ throw new Error(`Error converting history item at index ${index}: ${error instanceof Error ? error.message : 'Unknown error'}`);
146
+ }
147
+ });
148
+ }
149
+
150
+ /**
151
+ * Convert an Event back to a HistoryItem
152
+ * @param event - The Event to convert
153
+ * @returns HistoryItem with simplified structure
154
+ * @throws Error if the event is malformed or has invalid data
155
+ */
156
+ export function eventToHistoryItem(event: Event): HistoryItem {
157
+ if (!event || typeof event !== 'object') {
158
+ throw new Error('Invalid event: must be a non-null object');
159
+ }
160
+
161
+ if (!event.kind || !event.source || !event.data) {
162
+ throw new Error('Invalid event: kind, source, and data are required');
163
+ }
164
+
165
+ switch (event.kind) {
166
+ case EventKind.MESSAGE: {
167
+ const messageData = event.data as MessageEventData;
168
+ if (!messageData.message && messageData.message !== '') {
169
+ throw new Error('Invalid message event: message is required');
170
+ }
171
+
172
+ switch (event.source) {
173
+ case MessageRole.USER: {
174
+ const userItem: UserHistoryItem = {
175
+ role: "user",
176
+ content: messageData.message,
177
+ };
178
+
179
+ if (messageData.participant?.display_name && messageData.participant.display_name !== "User") {
180
+ userItem.name = messageData.participant.display_name;
181
+ }
182
+
183
+ return userItem;
184
+ }
185
+ case MessageRole.ASSISTANT: {
186
+ const assistantItem: AssistantHistoryItem = {
187
+ role: "assistant",
188
+ content: messageData.message || null,
189
+ };
190
+
191
+ if (messageData.toolCalls && messageData.toolCalls.length > 0) {
192
+ assistantItem.tool_calls = messageData.toolCalls;
193
+ }
194
+
195
+ return assistantItem;
196
+ }
197
+ case MessageRole.SYSTEM: {
198
+ return {
199
+ role: "system",
200
+ content: messageData.message,
201
+ };
202
+ }
203
+ default:
204
+ throw new Error(`Unsupported message source for conversion: ${event.source}`);
205
+ }
206
+ }
207
+ case EventKind.TOOL: {
208
+ const toolData = event.data as ToolEventData;
209
+ if (!toolData.tool_calls || !Array.isArray(toolData.tool_calls) || toolData.tool_calls.length === 0) {
210
+ throw new Error('Invalid tool event: tool_calls array is required and must not be empty');
211
+ }
212
+
213
+ const firstToolCall = toolData.tool_calls[0];
214
+ if (!firstToolCall.tool_id) {
215
+ throw new Error('Invalid tool call: tool_id is required');
216
+ }
217
+
218
+ const toolItem: ToolHistoryItem = {
219
+ role: "tool",
220
+ tool_call_id: firstToolCall.tool_id,
221
+ name: firstToolCall.tool_id, // Use tool_id as name for simplicity
222
+ content: firstToolCall.result?.data,
223
+ };
224
+
225
+ return toolItem;
226
+ }
227
+ case EventKind.STATUS: {
228
+ // Status events don't have a direct HistoryItem equivalent
229
+ // Convert to system message for compatibility
230
+ const statusData = event.data as StatusEventData;
231
+ return {
232
+ role: "system",
233
+ content: statusData.status || "Status update",
234
+ };
235
+ }
236
+ default:
237
+ throw new Error(`Unsupported event kind for conversion: ${String(event.kind)}`);
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Convert an array of Events back to HistoryItems
243
+ * @param events - Array of Events to convert
244
+ * @returns Array of HistoryItems with simplified structure
245
+ * @throws Error if any event is malformed
246
+ */
247
+ export function eventsToHistory(events: Event[]): History {
248
+ if (!Array.isArray(events)) {
249
+ throw new Error('Invalid events: must be an array');
250
+ }
251
+
252
+ return events.map((event, index) => {
253
+ try {
254
+ return eventToHistoryItem(event);
255
+ } catch (error) {
256
+ throw new Error(`Error converting event at index ${index}: ${error instanceof Error ? error.message : 'Unknown error'}`);
257
+ }
258
+ });
259
+ }
260
+
261
+ /**
262
+ * Normalize a simplified history array to internal Event array
263
+ * @deprecated Use historyToEvents instead
264
+ */
265
+ export function normalizeHistory(history: History): Event[] {
266
+ return historyToEvents(history);
267
+ }
268
+
269
+ /**
270
+ * Helper function to create a user message
271
+ */
272
+ export function userMessage(content: string, name?: string): HistoryItem {
273
+ return { role: "user", content, name };
274
+ }
275
+
276
+ /**
277
+ * Helper function to create an assistant message
278
+ */
279
+ export function assistantMessage(
280
+ content: string | null,
281
+ toolCalls?: Array<{
282
+ id: string;
283
+ name: string;
284
+ arguments: Record<string, unknown>;
285
+ }>
286
+ ): HistoryItem {
287
+ return { role: "assistant", content, tool_calls: toolCalls };
288
+ }
289
+
290
+ /**
291
+ * Helper function to create a tool message
292
+ */
293
+ export function toolMessage(
294
+ toolCallId: string,
295
+ name: string,
296
+ content: unknown
297
+ ): HistoryItem {
298
+ return { role: "tool", tool_call_id: toolCallId, name, content };
299
+ }
300
+
301
+ /**
302
+ * Helper function to create a system message
303
+ */
304
+ export function systemMessage(content: string): HistoryItem {
305
+ return { role: "system", content };
306
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * ID generation utilities
3
+ * Provides deterministic ID generation to ensure consistency across server restarts
4
+ */
5
+
6
+ /**
7
+ * Generate a deterministic ID from a string by creating a simple hash
8
+ * This ensures the same input always produces the same ID
9
+ */
10
+ function simpleHash(str: string): string {
11
+ let hash = 0;
12
+ for (let i = 0; i < str.length; i++) {
13
+ const char = str.charCodeAt(i);
14
+ hash = (hash << 5) - hash + char;
15
+ hash = hash & hash; // Convert to 32-bit integer
16
+ }
17
+ return Math.abs(hash).toString(36);
18
+ }
19
+
20
+ /**
21
+ * Sanitize a string for use in an ID
22
+ */
23
+ function sanitize(str: string): string {
24
+ return str.toLowerCase().replace(/[^a-z0-9]+/g, "_");
25
+ }
26
+
27
+ /**
28
+ * Generate a deterministic route ID
29
+ * Format: route_{sanitized_title}_{hash}
30
+ */
31
+ export function generateRouteId(title: string): string {
32
+ const sanitized = sanitize(title);
33
+ const hash = simpleHash(title);
34
+ return `route_${sanitized}_${hash}`;
35
+ }
36
+
37
+ /**
38
+ * Generate a deterministic step ID
39
+ * Format: step_{sanitized_description}_{hash} or step_{routeId}_{index}
40
+ */
41
+ export function generateStepId(
42
+ routeId: string,
43
+ description?: string,
44
+ index?: number
45
+ ): string {
46
+ if (description) {
47
+ const sanitized = sanitize(description);
48
+ const hash = simpleHash(`${routeId}_${description}`);
49
+ return `step_${sanitized}_${hash}`;
50
+ }
51
+ // Fallback for steps without descriptions
52
+ const suffix = index !== undefined ? index : simpleHash(routeId);
53
+ return `step_${routeId}_${suffix}`;
54
+ }
55
+
56
+ /**
57
+ * Generate a deterministic tool ID
58
+ * Format: tool_{sanitized_name}_{hash}
59
+ */
60
+ export function generateToolId(name: string): string {
61
+ const sanitized = sanitize(name);
62
+ const hash = simpleHash(name);
63
+ return `tool_${sanitized}_${hash}`;
64
+ }
65
+
66
+ /**
67
+ * Generate a deterministic tool ID for inline tool handlers
68
+ * Format: tool_inline_{stepId}_{hash}
69
+ */
70
+ export function generateInlineToolId(stepId: string): string {
71
+ const hash = simpleHash(`${stepId}_inline_tool`);
72
+ return `tool_inline_${stepId}_${hash}`;
73
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Utility functions and helpers
3
+ */
4
+
5
+ // ID generation
6
+ export {
7
+ generateRouteId,
8
+ generateStepId,
9
+ generateToolId,
10
+ generateInlineToolId,
11
+ } from "./id";
12
+
13
+ // Session management
14
+ export {
15
+ createSession,
16
+ createSessionId,
17
+ enterRoute,
18
+ enterStep,
19
+ mergeCollected,
20
+ sessionStepToData,
21
+ sessionDataToStep,
22
+ } from "./session";
23
+
24
+ // Template rendering
25
+ export {
26
+ render,
27
+ renderMany,
28
+ renderTemplate,
29
+ renderTemplateObject,
30
+ formatKnowledgeBase,
31
+ createTemplateContext,
32
+ } from "./template";
33
+
34
+ // Cloning utilities
35
+ export { cloneDeep } from "./clone";
36
+
37
+ // Event utilities
38
+ export { getLastMessageFromHistory } from "./event";
39
+
40
+ // History utilities
41
+ export {
42
+ normalizeHistory,
43
+ historyItemToEvent,
44
+ historyToEvents,
45
+ eventToHistoryItem,
46
+ eventsToHistory,
47
+ userMessage,
48
+ assistantMessage,
49
+ toolMessage,
50
+ systemMessage,
51
+ } from "./history";
52
+
53
+ // Logging
54
+ export { LoggerLevel, logger } from "./logger";
55
+
56
+ // Retry utilities
57
+ export type { RetryOptions } from "./retry";
58
+ export { retry, withTimeoutAndRetry } from "./retry";
59
+
60
+ // Condition utilities
61
+ export {
62
+ ConditionEvaluator,
63
+ createConditionEvaluator,
64
+ extractAIContextStrings,
65
+ hasProgrammaticConditions,
66
+ } from "./condition";
67
+
68
+ // JSON utilities
69
+ export { parseJSONResponse, tryParseJSONResponse } from "./json";
@@ -0,0 +1,46 @@
1
+ /**
2
+ * JSON parsing utilities
3
+ */
4
+
5
+ /**
6
+ * Clean and parse JSON response that might be wrapped in markdown code blocks
7
+ * Handles cases like:
8
+ * - ```json\n{...}\n```
9
+ * - ```\n{...}\n```
10
+ * - Plain JSON: {...}
11
+ */
12
+ export function parseJSONResponse(text: string): unknown {
13
+ if (!text || typeof text !== 'string') {
14
+ throw new Error('Invalid JSON response: empty or non-string input');
15
+ }
16
+
17
+ // Trim whitespace
18
+ let cleaned = text.trim();
19
+
20
+ // Remove markdown code block markers
21
+ // Match: ```json or ``` at start, and ``` at end
22
+ const codeBlockRegex = /^```(?:json)?\s*\n?([\s\S]*?)\n?```$/;
23
+ const match = cleaned.match(codeBlockRegex);
24
+
25
+ if (match) {
26
+ cleaned = match[1].trim();
27
+ }
28
+
29
+ // Try to parse the cleaned JSON
30
+ try {
31
+ return JSON.parse(cleaned);
32
+ } catch (error) {
33
+ throw new Error(`Failed to parse JSON response: ${error instanceof Error ? error.message : String(error)}\nContent: ${cleaned.substring(0, 200)}...`);
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Safely parse JSON response, returning undefined on failure
39
+ */
40
+ export function tryParseJSONResponse(text: string): unknown {
41
+ try {
42
+ return parseJSONResponse(text);
43
+ } catch {
44
+ return undefined;
45
+ }
46
+ }
@@ -0,0 +1,19 @@
1
+ import log from "loglevel";
2
+
3
+ export enum LoggerLevel {
4
+ DEBUG = "debug",
5
+ INFO = "info",
6
+ WARN = "warn",
7
+ ERROR = "error",
8
+ SILENT = "silent",
9
+ }
10
+
11
+ /**
12
+ * Default log level
13
+ */
14
+ const DEFAULT_LOG_LEVEL = LoggerLevel.SILENT;
15
+
16
+ // Initialize logger
17
+ log.setLevel(DEFAULT_LOG_LEVEL);
18
+
19
+ export const logger = log;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Retry utility with exponential backoff
3
+ */
4
+ import {logger} from './logger'
5
+
6
+ export interface RetryOptions<T> {
7
+ operation: () => Promise<T>;
8
+ maxRetries: number;
9
+ delay: (attempt: number) => number;
10
+ onRetry?: (attempt: number, error: unknown) => void;
11
+ onFailure?: (error: unknown) => boolean;
12
+ }
13
+
14
+ export async function retry<T>(options: RetryOptions<T>): Promise<T> {
15
+ const { operation, maxRetries, delay, onRetry, onFailure } = options;
16
+
17
+ let lastError: unknown;
18
+
19
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
20
+ try {
21
+ return await operation();
22
+ } catch (error: unknown) {
23
+ lastError = error;
24
+
25
+ if (attempt === maxRetries) {
26
+ const shouldRethrow = onFailure ? onFailure(lastError) : true;
27
+ if (shouldRethrow) {
28
+ throw lastError;
29
+ }
30
+ break;
31
+ }
32
+
33
+ if (onRetry) {
34
+ onRetry(attempt, lastError);
35
+ }
36
+
37
+ const delayMs = delay(attempt);
38
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
39
+ }
40
+ }
41
+
42
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
43
+ throw lastError ?? new Error("Operation failed");
44
+ }
45
+
46
+ export const withTimeoutAndRetry = async <T>(
47
+ operation: () => Promise<T>,
48
+ timeoutMs: number = 60000,
49
+ maxRetries: number = 3,
50
+ operationName: string = "AI operation"
51
+ ): Promise<T> => {
52
+ const createTimeoutOperation = () => async (): Promise<T> => {
53
+ const controller = new AbortController();
54
+ const timeoutId = setTimeout(() => {
55
+ controller.abort();
56
+ }, timeoutMs);
57
+
58
+ try {
59
+ const result = await Promise.race([
60
+ operation(),
61
+ new Promise<never>((_, reject) => {
62
+ controller.signal.addEventListener("abort", () => {
63
+ reject(new Error(`Operation timed out after ${timeoutMs}ms`));
64
+ });
65
+ }),
66
+ ]);
67
+
68
+ clearTimeout(timeoutId);
69
+ return result;
70
+ } catch (error: unknown) {
71
+ clearTimeout(timeoutId);
72
+ throw error;
73
+ }
74
+ };
75
+
76
+ return retry<T>({
77
+ operation: createTimeoutOperation(),
78
+ maxRetries,
79
+ delay: (attempt: number) => Math.min(1000 * Math.pow(2, attempt), 5000),
80
+ onRetry: (attempt: number, error: unknown) => {
81
+ const message = error instanceof Error ? error.message : String(error);
82
+ logger.error(
83
+ `[${operationName}] Failed attempt ${attempt + 1}:`,
84
+ message
85
+ );
86
+ const delay = Math.min(1000 * Math.pow(2, attempt), 5000);
87
+ logger.debug(`[${operationName}] Retrying in ${delay}ms...`);
88
+ logger.debug(
89
+ `[${operationName}] Attempt ${attempt + 2}/${maxRetries + 1}`
90
+ );
91
+ },
92
+ onFailure: (_error: unknown) => {
93
+ logger.error(`[${operationName}] All ${maxRetries + 1} attempts failed`);
94
+ return true;
95
+ },
96
+ });
97
+ };