@falai/agent 0.8.1 → 0.9.0-alpha-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (652) hide show
  1. package/README.md +306 -133
  2. package/dist/{adapters → cjs/src/adapters}/MemoryAdapter.d.ts +4 -4
  3. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
  4. package/dist/cjs/{adapters → src/adapters}/MemoryAdapter.js +41 -21
  5. package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
  6. package/dist/{adapters → cjs/src/adapters}/MongoAdapter.d.ts +3 -3
  7. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
  8. package/dist/cjs/{adapters → src/adapters}/MongoAdapter.js +2 -1
  9. package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
  10. package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
  11. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  12. package/dist/cjs/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
  13. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
  14. package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
  15. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  16. package/dist/cjs/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
  17. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
  18. package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
  19. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
  20. package/dist/cjs/{adapters → src/adapters}/PrismaAdapter.js +35 -5
  21. package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
  22. package/dist/cjs/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
  23. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
  24. package/dist/cjs/{adapters → src/adapters}/RedisAdapter.js +3 -2
  25. package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
  26. package/dist/{adapters → cjs/src/adapters}/SQLiteAdapter.d.ts +3 -3
  27. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  28. package/dist/cjs/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
  29. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
  30. package/dist/cjs/src/adapters/index.d.ts.map +1 -0
  31. package/dist/cjs/src/adapters/index.js.map +1 -0
  32. package/dist/cjs/src/constants/index.d.ts.map +1 -0
  33. package/dist/cjs/src/constants/index.js.map +1 -0
  34. package/dist/{core → cjs/src/core}/Agent.d.ts +65 -67
  35. package/dist/cjs/src/core/Agent.d.ts.map +1 -0
  36. package/dist/cjs/src/core/Agent.js +1433 -0
  37. package/dist/cjs/src/core/Agent.js.map +1 -0
  38. package/dist/cjs/src/core/Events.d.ts +26 -0
  39. package/dist/cjs/src/core/Events.d.ts.map +1 -0
  40. package/dist/cjs/src/core/Events.js +144 -0
  41. package/dist/cjs/src/core/Events.js.map +1 -0
  42. package/dist/{core → cjs/src/core}/PersistenceManager.d.ts +21 -19
  43. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  44. package/dist/cjs/{core → src/core}/PersistenceManager.js +50 -20
  45. package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
  46. package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
  47. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
  48. package/dist/cjs/src/core/PromptComposer.js +157 -0
  49. package/dist/cjs/src/core/PromptComposer.js.map +1 -0
  50. package/dist/cjs/src/core/ResponseEngine.d.ts +31 -0
  51. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
  52. package/dist/cjs/src/core/ResponseEngine.js +84 -0
  53. package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
  54. package/dist/cjs/src/core/ResponsePipeline.d.ts +143 -0
  55. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
  56. package/dist/cjs/src/core/ResponsePipeline.js +446 -0
  57. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
  58. package/dist/cjs/src/core/Route.d.ts +126 -0
  59. package/dist/cjs/src/core/Route.d.ts.map +1 -0
  60. package/dist/cjs/{core → src/core}/Route.js +116 -20
  61. package/dist/cjs/src/core/Route.js.map +1 -0
  62. package/dist/{core → cjs/src/core}/RoutingEngine.d.ts +33 -38
  63. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
  64. package/dist/cjs/{core → src/core}/RoutingEngine.js +102 -108
  65. package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
  66. package/dist/cjs/src/core/SessionManager.d.ts +76 -0
  67. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
  68. package/dist/cjs/src/core/SessionManager.js +197 -0
  69. package/dist/cjs/src/core/SessionManager.js.map +1 -0
  70. package/dist/cjs/src/core/Step.d.ts +96 -0
  71. package/dist/cjs/src/core/Step.d.ts.map +1 -0
  72. package/dist/cjs/src/core/Step.js +206 -0
  73. package/dist/cjs/src/core/Step.js.map +1 -0
  74. package/dist/cjs/src/core/ToolExecutor.d.ts +43 -0
  75. package/dist/cjs/src/core/ToolExecutor.d.ts.map +1 -0
  76. package/dist/cjs/{core → src/core}/ToolExecutor.js +19 -18
  77. package/dist/cjs/src/core/ToolExecutor.js.map +1 -0
  78. package/dist/{index.d.ts → cjs/src/index.d.ts} +7 -15
  79. package/dist/cjs/src/index.d.ts.map +1 -0
  80. package/dist/cjs/{index.js → src/index.js} +21 -19
  81. package/dist/cjs/src/index.js.map +1 -0
  82. package/dist/cjs/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
  83. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
  84. package/dist/cjs/{providers → src/providers}/AnthropicProvider.js +54 -2
  85. package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
  86. package/dist/{providers → cjs/src/providers}/GeminiProvider.d.ts +1 -1
  87. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
  88. package/dist/cjs/{providers → src/providers}/GeminiProvider.js +65 -0
  89. package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
  90. package/dist/cjs/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
  91. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
  92. package/dist/cjs/{providers → src/providers}/OpenAIProvider.js +70 -1
  93. package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
  94. package/dist/{providers → cjs/src/providers}/OpenRouterProvider.d.ts +1 -1
  95. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
  96. package/dist/cjs/{providers → src/providers}/OpenRouterProvider.js +76 -0
  97. package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
  98. package/dist/cjs/src/providers/index.d.ts.map +1 -0
  99. package/dist/cjs/src/providers/index.js.map +1 -0
  100. package/dist/cjs/{types → src/types}/agent.d.ts +52 -33
  101. package/dist/cjs/src/types/agent.d.ts.map +1 -0
  102. package/dist/cjs/src/types/agent.js.map +1 -0
  103. package/dist/cjs/{types → src/types}/ai.d.ts +7 -0
  104. package/dist/cjs/src/types/ai.d.ts.map +1 -0
  105. package/dist/cjs/src/types/ai.js.map +1 -0
  106. package/dist/{types → cjs/src/types}/history.d.ts +76 -18
  107. package/dist/cjs/src/types/history.d.ts.map +1 -0
  108. package/dist/cjs/src/types/history.js +33 -0
  109. package/dist/cjs/src/types/history.js.map +1 -0
  110. package/dist/cjs/src/types/index.d.ts +20 -0
  111. package/dist/cjs/src/types/index.d.ts.map +1 -0
  112. package/dist/cjs/src/types/index.js +30 -0
  113. package/dist/cjs/src/types/index.js.map +1 -0
  114. package/dist/{types → cjs/src/types}/persistence.d.ts +39 -23
  115. package/dist/cjs/src/types/persistence.d.ts.map +1 -0
  116. package/dist/cjs/src/types/persistence.js.map +1 -0
  117. package/dist/cjs/{types → src/types}/route.d.ts +85 -31
  118. package/dist/cjs/src/types/route.d.ts.map +1 -0
  119. package/dist/cjs/{types → src/types}/route.js.map +1 -1
  120. package/dist/cjs/src/types/routing.d.ts.map +1 -0
  121. package/dist/{types → cjs/src/types}/routing.js.map +1 -1
  122. package/dist/cjs/src/types/schema.d.ts.map +1 -0
  123. package/dist/{types → cjs/src/types}/schema.js.map +1 -1
  124. package/dist/cjs/src/types/session.d.ts +70 -0
  125. package/dist/cjs/src/types/session.d.ts.map +1 -0
  126. package/dist/cjs/src/types/session.js +6 -0
  127. package/dist/cjs/src/types/session.js.map +1 -0
  128. package/dist/cjs/src/types/template.d.ts +30 -0
  129. package/dist/cjs/src/types/template.d.ts.map +1 -0
  130. package/dist/cjs/src/types/template.js +3 -0
  131. package/dist/cjs/src/types/template.js.map +1 -0
  132. package/dist/cjs/{types → src/types}/tool.d.ts +6 -8
  133. package/dist/cjs/src/types/tool.d.ts.map +1 -0
  134. package/dist/cjs/{types → src/types}/tool.js.map +1 -1
  135. package/dist/cjs/src/utils/clone.d.ts +8 -0
  136. package/dist/cjs/src/utils/clone.d.ts.map +1 -0
  137. package/dist/cjs/src/utils/clone.js +36 -0
  138. package/dist/cjs/src/utils/clone.js.map +1 -0
  139. package/dist/{utils → cjs/src/utils}/event.d.ts +1 -1
  140. package/dist/cjs/src/utils/event.d.ts.map +1 -0
  141. package/dist/cjs/{utils → src/utils}/event.js +2 -2
  142. package/dist/cjs/src/utils/event.js.map +1 -0
  143. package/dist/cjs/src/utils/history.d.ts +31 -0
  144. package/dist/cjs/src/utils/history.d.ts.map +1 -0
  145. package/dist/cjs/src/utils/history.js +128 -0
  146. package/dist/cjs/src/utils/history.js.map +1 -0
  147. package/dist/cjs/src/utils/id.d.ts.map +1 -0
  148. package/dist/cjs/src/utils/id.js.map +1 -0
  149. package/dist/cjs/src/utils/index.d.ts +13 -0
  150. package/dist/cjs/src/utils/index.d.ts.map +1 -0
  151. package/dist/cjs/src/utils/index.js +49 -0
  152. package/dist/cjs/src/utils/index.js.map +1 -0
  153. package/dist/cjs/src/utils/logger.d.ts.map +1 -0
  154. package/dist/cjs/src/utils/logger.js.map +1 -0
  155. package/dist/cjs/src/utils/retry.d.ts.map +1 -0
  156. package/dist/cjs/src/utils/retry.js.map +1 -0
  157. package/dist/cjs/src/utils/session.d.ts +51 -0
  158. package/dist/cjs/src/utils/session.d.ts.map +1 -0
  159. package/dist/cjs/{types → src/utils}/session.js +34 -11
  160. package/dist/cjs/src/utils/session.js.map +1 -0
  161. package/dist/cjs/src/utils/template.d.ts +107 -0
  162. package/dist/cjs/src/utils/template.d.ts.map +1 -0
  163. package/dist/cjs/src/utils/template.js +283 -0
  164. package/dist/cjs/src/utils/template.js.map +1 -0
  165. package/dist/{cjs → src}/adapters/MemoryAdapter.d.ts +4 -4
  166. package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
  167. package/dist/{adapters → src/adapters}/MemoryAdapter.js +41 -21
  168. package/dist/src/adapters/MemoryAdapter.js.map +1 -0
  169. package/dist/{cjs → src}/adapters/MongoAdapter.d.ts +3 -3
  170. package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
  171. package/dist/{adapters → src/adapters}/MongoAdapter.js +2 -1
  172. package/dist/src/adapters/MongoAdapter.js.map +1 -0
  173. package/dist/{adapters → src/adapters}/OpenSearchAdapter.d.ts +3 -3
  174. package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  175. package/dist/{adapters → src/adapters}/OpenSearchAdapter.js +10 -13
  176. package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
  177. package/dist/{adapters → src/adapters}/PostgreSQLAdapter.d.ts +3 -3
  178. package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  179. package/dist/{adapters → src/adapters}/PostgreSQLAdapter.js +1 -1
  180. package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
  181. package/dist/{adapters → src/adapters}/PrismaAdapter.d.ts +3 -3
  182. package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
  183. package/dist/{adapters → src/adapters}/PrismaAdapter.js +35 -5
  184. package/dist/src/adapters/PrismaAdapter.js.map +1 -0
  185. package/dist/{adapters → src/adapters}/RedisAdapter.d.ts +3 -3
  186. package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
  187. package/dist/{adapters → src/adapters}/RedisAdapter.js +3 -2
  188. package/dist/src/adapters/RedisAdapter.js.map +1 -0
  189. package/dist/{cjs → src}/adapters/SQLiteAdapter.d.ts +3 -3
  190. package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  191. package/dist/{adapters → src/adapters}/SQLiteAdapter.js +2 -1
  192. package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
  193. package/dist/src/adapters/index.js.map +1 -0
  194. package/dist/src/constants/index.js.map +1 -0
  195. package/dist/{cjs → src}/core/Agent.d.ts +65 -67
  196. package/dist/src/core/Agent.d.ts.map +1 -0
  197. package/dist/src/core/Agent.js +1429 -0
  198. package/dist/src/core/Agent.js.map +1 -0
  199. package/dist/src/core/Events.d.ts +26 -0
  200. package/dist/src/core/Events.d.ts.map +1 -0
  201. package/dist/src/core/Events.js +137 -0
  202. package/dist/src/core/Events.js.map +1 -0
  203. package/dist/{cjs → src}/core/PersistenceManager.d.ts +21 -19
  204. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  205. package/dist/{core → src/core}/PersistenceManager.js +47 -17
  206. package/dist/src/core/PersistenceManager.js.map +1 -0
  207. package/dist/src/core/PromptComposer.d.ts +27 -0
  208. package/dist/src/core/PromptComposer.d.ts.map +1 -0
  209. package/dist/src/core/PromptComposer.js +153 -0
  210. package/dist/src/core/PromptComposer.js.map +1 -0
  211. package/dist/src/core/ResponseEngine.d.ts +31 -0
  212. package/dist/src/core/ResponseEngine.d.ts.map +1 -0
  213. package/dist/src/core/ResponseEngine.js +80 -0
  214. package/dist/src/core/ResponseEngine.js.map +1 -0
  215. package/dist/src/core/ResponsePipeline.d.ts +143 -0
  216. package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
  217. package/dist/src/core/ResponsePipeline.js +442 -0
  218. package/dist/src/core/ResponsePipeline.js.map +1 -0
  219. package/dist/src/core/Route.d.ts +126 -0
  220. package/dist/src/core/Route.d.ts.map +1 -0
  221. package/dist/{core → src/core}/Route.js +116 -20
  222. package/dist/src/core/Route.js.map +1 -0
  223. package/dist/{cjs → src}/core/RoutingEngine.d.ts +33 -38
  224. package/dist/src/core/RoutingEngine.d.ts.map +1 -0
  225. package/dist/{core → src/core}/RoutingEngine.js +98 -104
  226. package/dist/src/core/RoutingEngine.js.map +1 -0
  227. package/dist/src/core/SessionManager.d.ts +76 -0
  228. package/dist/src/core/SessionManager.d.ts.map +1 -0
  229. package/dist/src/core/SessionManager.js +193 -0
  230. package/dist/src/core/SessionManager.js.map +1 -0
  231. package/dist/src/core/Step.d.ts +96 -0
  232. package/dist/src/core/Step.d.ts.map +1 -0
  233. package/dist/src/core/Step.js +202 -0
  234. package/dist/src/core/Step.js.map +1 -0
  235. package/dist/src/core/ToolExecutor.d.ts +43 -0
  236. package/dist/src/core/ToolExecutor.d.ts.map +1 -0
  237. package/dist/src/core/ToolExecutor.js +70 -0
  238. package/dist/src/core/ToolExecutor.js.map +1 -0
  239. package/dist/{cjs → src}/index.d.ts +7 -15
  240. package/dist/src/index.d.ts.map +1 -0
  241. package/dist/{index.js → src/index.js} +6 -7
  242. package/dist/src/index.js.map +1 -0
  243. package/dist/{providers → src/providers}/AnthropicProvider.d.ts +1 -1
  244. package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
  245. package/dist/{providers → src/providers}/AnthropicProvider.js +54 -2
  246. package/dist/src/providers/AnthropicProvider.js.map +1 -0
  247. package/dist/{cjs → src}/providers/GeminiProvider.d.ts +1 -1
  248. package/dist/{cjs → src}/providers/GeminiProvider.d.ts.map +1 -1
  249. package/dist/{providers → src/providers}/GeminiProvider.js +65 -0
  250. package/dist/src/providers/GeminiProvider.js.map +1 -0
  251. package/dist/{providers → src/providers}/OpenAIProvider.d.ts +1 -1
  252. package/dist/{cjs → src}/providers/OpenAIProvider.d.ts.map +1 -1
  253. package/dist/{providers → src/providers}/OpenAIProvider.js +70 -1
  254. package/dist/src/providers/OpenAIProvider.js.map +1 -0
  255. package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts +1 -1
  256. package/dist/{cjs → src}/providers/OpenRouterProvider.d.ts.map +1 -1
  257. package/dist/{providers → src/providers}/OpenRouterProvider.js +76 -0
  258. package/dist/src/providers/OpenRouterProvider.js.map +1 -0
  259. package/dist/src/providers/index.js.map +1 -0
  260. package/dist/{types → src/types}/agent.d.ts +52 -33
  261. package/dist/src/types/agent.d.ts.map +1 -0
  262. package/dist/src/types/agent.js.map +1 -0
  263. package/dist/{types → src/types}/ai.d.ts +7 -0
  264. package/dist/src/types/ai.d.ts.map +1 -0
  265. package/dist/{cjs → src}/types/ai.js.map +1 -1
  266. package/dist/{cjs → src}/types/history.d.ts +76 -18
  267. package/dist/src/types/history.d.ts.map +1 -0
  268. package/dist/src/types/history.js +30 -0
  269. package/dist/src/types/history.js.map +1 -0
  270. package/dist/src/types/index.d.ts +20 -0
  271. package/dist/src/types/index.d.ts.map +1 -0
  272. package/dist/src/types/index.js +10 -0
  273. package/dist/src/types/index.js.map +1 -0
  274. package/dist/{cjs → src}/types/persistence.d.ts +39 -23
  275. package/dist/src/types/persistence.d.ts.map +1 -0
  276. package/dist/src/types/persistence.js.map +1 -0
  277. package/dist/{types → src/types}/route.d.ts +85 -31
  278. package/dist/src/types/route.d.ts.map +1 -0
  279. package/dist/{types → src/types}/route.js.map +1 -1
  280. package/dist/src/types/session.d.ts +70 -0
  281. package/dist/src/types/session.d.ts.map +1 -0
  282. package/dist/src/types/session.js +5 -0
  283. package/dist/src/types/session.js.map +1 -0
  284. package/dist/src/types/template.d.ts +30 -0
  285. package/dist/src/types/template.d.ts.map +1 -0
  286. package/dist/src/types/template.js +2 -0
  287. package/dist/src/types/template.js.map +1 -0
  288. package/dist/{types → src/types}/tool.d.ts +6 -8
  289. package/dist/{cjs → src}/types/tool.d.ts.map +1 -1
  290. package/dist/{types → src/types}/tool.js.map +1 -1
  291. package/dist/src/utils/clone.d.ts +8 -0
  292. package/dist/src/utils/clone.d.ts.map +1 -0
  293. package/dist/src/utils/clone.js +33 -0
  294. package/dist/src/utils/clone.js.map +1 -0
  295. package/dist/{cjs → src}/utils/event.d.ts +1 -1
  296. package/dist/{cjs → src}/utils/event.d.ts.map +1 -1
  297. package/dist/{utils → src/utils}/event.js +1 -1
  298. package/dist/src/utils/event.js.map +1 -0
  299. package/dist/src/utils/history.d.ts +31 -0
  300. package/dist/src/utils/history.d.ts.map +1 -0
  301. package/dist/src/utils/history.js +121 -0
  302. package/dist/src/utils/history.js.map +1 -0
  303. package/dist/src/utils/id.js.map +1 -0
  304. package/dist/src/utils/index.d.ts +13 -0
  305. package/dist/src/utils/index.d.ts.map +1 -0
  306. package/dist/src/utils/index.js +19 -0
  307. package/dist/src/utils/index.js.map +1 -0
  308. package/dist/src/utils/logger.js.map +1 -0
  309. package/dist/src/utils/retry.js.map +1 -0
  310. package/dist/src/utils/session.d.ts +51 -0
  311. package/dist/src/utils/session.d.ts.map +1 -0
  312. package/dist/{types → src/utils}/session.js +32 -11
  313. package/dist/src/utils/session.js.map +1 -0
  314. package/dist/src/utils/template.d.ts +107 -0
  315. package/dist/src/utils/template.d.ts.map +1 -0
  316. package/dist/src/utils/template.js +276 -0
  317. package/dist/src/utils/template.js.map +1 -0
  318. package/docs/README.md +174 -68
  319. package/docs/{API_REFERENCE.md → api/README.md} +890 -251
  320. package/docs/api/overview.md +798 -0
  321. package/docs/core/agent/README.md +642 -0
  322. package/docs/{CONTEXT_MANAGEMENT.md → core/agent/context-management.md} +143 -94
  323. package/docs/{ARCHITECTURE.md → core/agent/session-management.md} +74 -59
  324. package/docs/core/ai-integration/prompt-composition.md +196 -0
  325. package/docs/core/ai-integration/providers.md +515 -0
  326. package/docs/core/ai-integration/response-processing.md +165 -0
  327. package/docs/core/conversation-flows/data-collection.md +545 -0
  328. package/docs/core/conversation-flows/route-dsl.md +479 -0
  329. package/docs/core/conversation-flows/routes.md +61 -0
  330. package/docs/core/conversation-flows/step-transitions.md +595 -0
  331. package/docs/core/conversation-flows/steps.md +130 -0
  332. package/docs/{ADAPTERS.md → core/persistence/adapters.md} +1 -1
  333. package/docs/core/persistence/session-storage.md +644 -0
  334. package/docs/core/routing/intelligent-routing.md +339 -0
  335. package/docs/core/tools/tool-definition.md +346 -0
  336. package/docs/core/tools/tool-execution.md +815 -0
  337. package/docs/core/tools/tool-scoping.md +628 -0
  338. package/docs/guides/getting-started/README.md +384 -0
  339. package/examples/{company-qna-agent.ts → advanced-patterns/knowledge-based-agent.ts} +104 -69
  340. package/examples/{persistent-onboarding.ts → advanced-patterns/persistent-onboarding.ts} +181 -103
  341. package/examples/{rules-prohibitions.ts → advanced-patterns/route-lifecycle-hooks.ts} +102 -82
  342. package/examples/{streaming-agent.ts → advanced-patterns/streaming-responses.ts} +90 -69
  343. package/examples/ai-providers/anthropic-integration.ts +377 -0
  344. package/examples/{openai-agent.ts → ai-providers/openai-integration.ts} +37 -43
  345. package/examples/{route-transitions.ts → conversation-flows/completion-transitions.ts} +112 -105
  346. package/examples/{declarative-agent.ts → core-concepts/basic-agent.ts} +175 -131
  347. package/examples/core-concepts/schema-driven-extraction.ts +301 -0
  348. package/examples/core-concepts/session-management.ts +394 -0
  349. package/examples/integrations/database-integration.ts +615 -0
  350. package/examples/{healthcare-agent.ts → integrations/healthcare-integration.ts} +204 -111
  351. package/examples/{opensearch-persistence.ts → integrations/search-integration.ts} +159 -128
  352. package/examples/integrations/server-session-management.ts +299 -0
  353. package/examples/persistence/custom-adapter.ts +529 -0
  354. package/examples/{prisma-persistence.ts → persistence/database-persistence.ts} +168 -241
  355. package/examples/persistence/memory-sessions.ts +506 -0
  356. package/examples/{prisma-schema.example.prisma → persistence/prisma-schema.example.prisma} +1 -1
  357. package/examples/{redis-persistence.ts → persistence/redis-persistence.ts} +152 -173
  358. package/examples/tools/basic-tools.ts +550 -0
  359. package/examples/{extracted-data-modification.ts → tools/data-enrichment-tools.ts} +82 -79
  360. package/package.json +14 -10
  361. package/src/adapters/MemoryAdapter.ts +74 -46
  362. package/src/adapters/MongoAdapter.ts +33 -24
  363. package/src/adapters/OpenSearchAdapter.ts +41 -37
  364. package/src/adapters/PostgreSQLAdapter.ts +35 -24
  365. package/src/adapters/PrismaAdapter.ts +69 -27
  366. package/src/adapters/RedisAdapter.ts +38 -26
  367. package/src/adapters/SQLiteAdapter.ts +32 -22
  368. package/src/core/Agent.ts +1093 -478
  369. package/src/core/Events.ts +100 -112
  370. package/src/core/PersistenceManager.ts +77 -47
  371. package/src/core/PromptComposer.ts +158 -85
  372. package/src/core/ResponseEngine.ts +118 -38
  373. package/src/core/ResponsePipeline.ts +715 -0
  374. package/src/core/Route.ts +168 -51
  375. package/src/core/RoutingEngine.ts +178 -209
  376. package/src/core/SessionManager.ts +241 -0
  377. package/src/core/Step.ts +149 -67
  378. package/src/core/ToolExecutor.ts +37 -42
  379. package/src/index.ts +31 -37
  380. package/src/providers/AnthropicProvider.ts +71 -5
  381. package/src/providers/GeminiProvider.ts +83 -2
  382. package/src/providers/OpenAIProvider.ts +95 -3
  383. package/src/providers/OpenRouterProvider.ts +102 -2
  384. package/src/types/agent.ts +48 -36
  385. package/src/types/ai.ts +7 -0
  386. package/src/types/history.ts +91 -18
  387. package/src/types/index.ts +43 -7
  388. package/src/types/persistence.ts +46 -28
  389. package/src/types/route.ts +104 -45
  390. package/src/types/session.ts +19 -213
  391. package/src/types/template.ts +36 -0
  392. package/src/types/tool.ts +9 -11
  393. package/src/utils/clone.ts +36 -0
  394. package/src/utils/event.ts +1 -1
  395. package/src/utils/history.ts +143 -0
  396. package/src/utils/index.ts +53 -0
  397. package/src/utils/session.ts +229 -0
  398. package/src/utils/template.ts +335 -0
  399. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  400. package/dist/adapters/MemoryAdapter.js.map +0 -1
  401. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  402. package/dist/adapters/MongoAdapter.js.map +0 -1
  403. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  404. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  405. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  406. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  407. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  408. package/dist/adapters/PrismaAdapter.js.map +0 -1
  409. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  410. package/dist/adapters/RedisAdapter.js.map +0 -1
  411. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  412. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  413. package/dist/adapters/index.d.ts.map +0 -1
  414. package/dist/adapters/index.js.map +0 -1
  415. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  416. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  417. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  418. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  419. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  420. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  421. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  422. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  423. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  424. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  425. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  426. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  427. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  428. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  429. package/dist/cjs/adapters/index.js.map +0 -1
  430. package/dist/cjs/constants/index.js.map +0 -1
  431. package/dist/cjs/core/Agent.d.ts.map +0 -1
  432. package/dist/cjs/core/Agent.js +0 -966
  433. package/dist/cjs/core/Agent.js.map +0 -1
  434. package/dist/cjs/core/DomainRegistry.d.ts +0 -36
  435. package/dist/cjs/core/DomainRegistry.d.ts.map +0 -1
  436. package/dist/cjs/core/DomainRegistry.js +0 -72
  437. package/dist/cjs/core/DomainRegistry.js.map +0 -1
  438. package/dist/cjs/core/Events.d.ts +0 -41
  439. package/dist/cjs/core/Events.d.ts.map +0 -1
  440. package/dist/cjs/core/Events.js +0 -99
  441. package/dist/cjs/core/Events.js.map +0 -1
  442. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  443. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  444. package/dist/cjs/core/PromptComposer.d.ts +0 -24
  445. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  446. package/dist/cjs/core/PromptComposer.js +0 -127
  447. package/dist/cjs/core/PromptComposer.js.map +0 -1
  448. package/dist/cjs/core/ResponseEngine.d.ts +0 -14
  449. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  450. package/dist/cjs/core/ResponseEngine.js +0 -56
  451. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  452. package/dist/cjs/core/Route.d.ts +0 -90
  453. package/dist/cjs/core/Route.d.ts.map +0 -1
  454. package/dist/cjs/core/Route.js.map +0 -1
  455. package/dist/cjs/core/RoutingEngine.d.ts.map +0 -1
  456. package/dist/cjs/core/RoutingEngine.js.map +0 -1
  457. package/dist/cjs/core/Step.d.ts +0 -72
  458. package/dist/cjs/core/Step.d.ts.map +0 -1
  459. package/dist/cjs/core/Step.js +0 -150
  460. package/dist/cjs/core/Step.js.map +0 -1
  461. package/dist/cjs/core/Tool.d.ts +0 -39
  462. package/dist/cjs/core/Tool.d.ts.map +0 -1
  463. package/dist/cjs/core/Tool.js +0 -34
  464. package/dist/cjs/core/Tool.js.map +0 -1
  465. package/dist/cjs/core/ToolExecutor.d.ts +0 -29
  466. package/dist/cjs/core/ToolExecutor.d.ts.map +0 -1
  467. package/dist/cjs/core/ToolExecutor.js.map +0 -1
  468. package/dist/cjs/core/Transition.d.ts +0 -32
  469. package/dist/cjs/core/Transition.d.ts.map +0 -1
  470. package/dist/cjs/core/Transition.js +0 -89
  471. package/dist/cjs/core/Transition.js.map +0 -1
  472. package/dist/cjs/index.d.ts.map +0 -1
  473. package/dist/cjs/index.js.map +0 -1
  474. package/dist/cjs/providers/AnthropicProvider.d.ts.map +0 -1
  475. package/dist/cjs/providers/AnthropicProvider.js.map +0 -1
  476. package/dist/cjs/providers/GeminiProvider.js.map +0 -1
  477. package/dist/cjs/providers/OpenAIProvider.js.map +0 -1
  478. package/dist/cjs/providers/OpenRouterProvider.js.map +0 -1
  479. package/dist/cjs/providers/index.js.map +0 -1
  480. package/dist/cjs/types/agent.d.ts.map +0 -1
  481. package/dist/cjs/types/agent.js.map +0 -1
  482. package/dist/cjs/types/ai.d.ts.map +0 -1
  483. package/dist/cjs/types/history.d.ts.map +0 -1
  484. package/dist/cjs/types/history.js +0 -37
  485. package/dist/cjs/types/history.js.map +0 -1
  486. package/dist/cjs/types/index.d.ts +0 -12
  487. package/dist/cjs/types/index.d.ts.map +0 -1
  488. package/dist/cjs/types/index.js +0 -12
  489. package/dist/cjs/types/index.js.map +0 -1
  490. package/dist/cjs/types/persistence.d.ts.map +0 -1
  491. package/dist/cjs/types/persistence.js.map +0 -1
  492. package/dist/cjs/types/route.d.ts.map +0 -1
  493. package/dist/cjs/types/session.d.ts +0 -104
  494. package/dist/cjs/types/session.d.ts.map +0 -1
  495. package/dist/cjs/types/session.js.map +0 -1
  496. package/dist/cjs/utils/event.js.map +0 -1
  497. package/dist/cjs/utils/id.js.map +0 -1
  498. package/dist/cjs/utils/logger.js.map +0 -1
  499. package/dist/cjs/utils/retry.js.map +0 -1
  500. package/dist/constants/index.d.ts.map +0 -1
  501. package/dist/constants/index.js.map +0 -1
  502. package/dist/core/Agent.d.ts.map +0 -1
  503. package/dist/core/Agent.js +0 -962
  504. package/dist/core/Agent.js.map +0 -1
  505. package/dist/core/DomainRegistry.d.ts +0 -36
  506. package/dist/core/DomainRegistry.d.ts.map +0 -1
  507. package/dist/core/DomainRegistry.js +0 -68
  508. package/dist/core/DomainRegistry.js.map +0 -1
  509. package/dist/core/Events.d.ts +0 -41
  510. package/dist/core/Events.d.ts.map +0 -1
  511. package/dist/core/Events.js +0 -94
  512. package/dist/core/Events.js.map +0 -1
  513. package/dist/core/PersistenceManager.d.ts.map +0 -1
  514. package/dist/core/PersistenceManager.js.map +0 -1
  515. package/dist/core/PromptComposer.d.ts +0 -24
  516. package/dist/core/PromptComposer.d.ts.map +0 -1
  517. package/dist/core/PromptComposer.js +0 -123
  518. package/dist/core/PromptComposer.js.map +0 -1
  519. package/dist/core/ResponseEngine.d.ts +0 -14
  520. package/dist/core/ResponseEngine.d.ts.map +0 -1
  521. package/dist/core/ResponseEngine.js +0 -52
  522. package/dist/core/ResponseEngine.js.map +0 -1
  523. package/dist/core/Route.d.ts +0 -90
  524. package/dist/core/Route.d.ts.map +0 -1
  525. package/dist/core/Route.js.map +0 -1
  526. package/dist/core/RoutingEngine.d.ts.map +0 -1
  527. package/dist/core/RoutingEngine.js.map +0 -1
  528. package/dist/core/Step.d.ts +0 -72
  529. package/dist/core/Step.d.ts.map +0 -1
  530. package/dist/core/Step.js +0 -146
  531. package/dist/core/Step.js.map +0 -1
  532. package/dist/core/Tool.d.ts +0 -39
  533. package/dist/core/Tool.d.ts.map +0 -1
  534. package/dist/core/Tool.js +0 -31
  535. package/dist/core/Tool.js.map +0 -1
  536. package/dist/core/ToolExecutor.d.ts +0 -29
  537. package/dist/core/ToolExecutor.d.ts.map +0 -1
  538. package/dist/core/ToolExecutor.js +0 -69
  539. package/dist/core/ToolExecutor.js.map +0 -1
  540. package/dist/core/Transition.d.ts +0 -32
  541. package/dist/core/Transition.d.ts.map +0 -1
  542. package/dist/core/Transition.js +0 -85
  543. package/dist/core/Transition.js.map +0 -1
  544. package/dist/index.d.ts.map +0 -1
  545. package/dist/index.js.map +0 -1
  546. package/dist/providers/AnthropicProvider.d.ts.map +0 -1
  547. package/dist/providers/AnthropicProvider.js.map +0 -1
  548. package/dist/providers/GeminiProvider.d.ts.map +0 -1
  549. package/dist/providers/GeminiProvider.js.map +0 -1
  550. package/dist/providers/OpenAIProvider.d.ts.map +0 -1
  551. package/dist/providers/OpenAIProvider.js.map +0 -1
  552. package/dist/providers/OpenRouterProvider.d.ts.map +0 -1
  553. package/dist/providers/OpenRouterProvider.js.map +0 -1
  554. package/dist/providers/index.d.ts.map +0 -1
  555. package/dist/providers/index.js.map +0 -1
  556. package/dist/types/agent.d.ts.map +0 -1
  557. package/dist/types/agent.js.map +0 -1
  558. package/dist/types/ai.d.ts.map +0 -1
  559. package/dist/types/ai.js.map +0 -1
  560. package/dist/types/history.d.ts.map +0 -1
  561. package/dist/types/history.js +0 -34
  562. package/dist/types/history.js.map +0 -1
  563. package/dist/types/index.d.ts +0 -12
  564. package/dist/types/index.d.ts.map +0 -1
  565. package/dist/types/index.js +0 -6
  566. package/dist/types/index.js.map +0 -1
  567. package/dist/types/persistence.d.ts.map +0 -1
  568. package/dist/types/persistence.js.map +0 -1
  569. package/dist/types/route.d.ts.map +0 -1
  570. package/dist/types/routing.d.ts.map +0 -1
  571. package/dist/types/schema.d.ts.map +0 -1
  572. package/dist/types/session.d.ts +0 -104
  573. package/dist/types/session.d.ts.map +0 -1
  574. package/dist/types/session.js.map +0 -1
  575. package/dist/types/tool.d.ts.map +0 -1
  576. package/dist/utils/event.d.ts.map +0 -1
  577. package/dist/utils/event.js.map +0 -1
  578. package/dist/utils/id.d.ts.map +0 -1
  579. package/dist/utils/id.js.map +0 -1
  580. package/dist/utils/logger.d.ts.map +0 -1
  581. package/dist/utils/logger.js.map +0 -1
  582. package/dist/utils/retry.d.ts.map +0 -1
  583. package/dist/utils/retry.js.map +0 -1
  584. package/docs/AGENT.md +0 -535
  585. package/docs/DOCS.md +0 -263
  586. package/docs/DOMAINS.md +0 -735
  587. package/docs/EXAMPLES.md +0 -467
  588. package/docs/GETTING_STARTED.md +0 -424
  589. package/docs/PERSISTENCE.md +0 -815
  590. package/docs/PROVIDERS.md +0 -612
  591. package/docs/ROUTES.md +0 -1085
  592. package/docs/STEPS.md +0 -883
  593. package/examples/business-onboarding.ts +0 -791
  594. package/examples/custom-database-persistence.ts +0 -574
  595. package/examples/domain-scoping.ts +0 -366
  596. package/examples/travel-agent.ts +0 -584
  597. package/src/core/DomainRegistry.ts +0 -80
  598. package/src/core/Tool.ts +0 -112
  599. package/src/core/Transition.ts +0 -115
  600. /package/dist/{adapters → cjs/src/adapters}/index.d.ts +0 -0
  601. /package/dist/cjs/{adapters → src/adapters}/index.js +0 -0
  602. /package/dist/cjs/{constants → src/constants}/index.d.ts +0 -0
  603. /package/dist/cjs/{constants → src/constants}/index.js +0 -0
  604. /package/dist/cjs/{providers → src/providers}/index.d.ts +0 -0
  605. /package/dist/cjs/{providers → src/providers}/index.js +0 -0
  606. /package/dist/cjs/{types → src/types}/agent.js +0 -0
  607. /package/dist/cjs/{types → src/types}/ai.js +0 -0
  608. /package/dist/cjs/{types → src/types}/persistence.js +0 -0
  609. /package/dist/cjs/{types → src/types}/route.js +0 -0
  610. /package/dist/cjs/{types → src/types}/routing.d.ts +0 -0
  611. /package/dist/cjs/{types → src/types}/routing.js +0 -0
  612. /package/dist/cjs/{types → src/types}/schema.d.ts +0 -0
  613. /package/dist/cjs/{types → src/types}/schema.js +0 -0
  614. /package/dist/cjs/{types → src/types}/tool.js +0 -0
  615. /package/dist/cjs/{utils → src/utils}/id.d.ts +0 -0
  616. /package/dist/cjs/{utils → src/utils}/id.js +0 -0
  617. /package/dist/cjs/{utils → src/utils}/logger.d.ts +0 -0
  618. /package/dist/cjs/{utils → src/utils}/logger.js +0 -0
  619. /package/dist/cjs/{utils → src/utils}/retry.d.ts +0 -0
  620. /package/dist/cjs/{utils → src/utils}/retry.js +0 -0
  621. /package/dist/{cjs → src}/adapters/index.d.ts +0 -0
  622. /package/dist/{cjs → src}/adapters/index.d.ts.map +0 -0
  623. /package/dist/{adapters → src/adapters}/index.js +0 -0
  624. /package/dist/{constants → src/constants}/index.d.ts +0 -0
  625. /package/dist/{cjs → src}/constants/index.d.ts.map +0 -0
  626. /package/dist/{constants → src/constants}/index.js +0 -0
  627. /package/dist/{providers → src/providers}/index.d.ts +0 -0
  628. /package/dist/{cjs → src}/providers/index.d.ts.map +0 -0
  629. /package/dist/{providers → src/providers}/index.js +0 -0
  630. /package/dist/{types → src/types}/agent.js +0 -0
  631. /package/dist/{types → src/types}/ai.js +0 -0
  632. /package/dist/{types → src/types}/persistence.js +0 -0
  633. /package/dist/{types → src/types}/route.js +0 -0
  634. /package/dist/{types → src/types}/routing.d.ts +0 -0
  635. /package/dist/{cjs → src}/types/routing.d.ts.map +0 -0
  636. /package/dist/{types → src/types}/routing.js +0 -0
  637. /package/dist/{cjs → src}/types/routing.js.map +0 -0
  638. /package/dist/{types → src/types}/schema.d.ts +0 -0
  639. /package/dist/{cjs → src}/types/schema.d.ts.map +0 -0
  640. /package/dist/{types → src/types}/schema.js +0 -0
  641. /package/dist/{cjs → src}/types/schema.js.map +0 -0
  642. /package/dist/{types → src/types}/tool.js +0 -0
  643. /package/dist/{utils → src/utils}/id.d.ts +0 -0
  644. /package/dist/{cjs → src}/utils/id.d.ts.map +0 -0
  645. /package/dist/{utils → src/utils}/id.js +0 -0
  646. /package/dist/{utils → src/utils}/logger.d.ts +0 -0
  647. /package/dist/{cjs → src}/utils/logger.d.ts.map +0 -0
  648. /package/dist/{utils → src/utils}/logger.js +0 -0
  649. /package/dist/{utils → src/utils}/retry.d.ts +0 -0
  650. /package/dist/{cjs → src}/utils/retry.d.ts.map +0 -0
  651. /package/dist/{utils → src/utils}/retry.js +0 -0
  652. /package/docs/{PUBLISHING.md → guides/advanced-patterns/publishing.md} +0 -0
@@ -1,962 +0,0 @@
1
- /**
2
- * Core Agent implementation
3
- */
4
- import { createSession, enterRoute, enterStep, mergeCollected, } from "../types/session";
5
- import { PromptComposer } from "./PromptComposer";
6
- import { logger, LoggerLevel } from "../utils/logger";
7
- import { Route } from "./Route";
8
- import { Step } from "./Step";
9
- import { DomainRegistry } from "./DomainRegistry";
10
- import { PersistenceManager } from "./PersistenceManager";
11
- import { RoutingEngine } from "./RoutingEngine";
12
- import { ResponseEngine } from "./ResponseEngine";
13
- import { ToolExecutor } from "./ToolExecutor";
14
- import { getLastMessageFromHistory } from "../utils/event";
15
- import { END_ROUTE_ID } from "../constants";
16
- /**
17
- * Main Agent class with generic context support
18
- */
19
- export class Agent {
20
- constructor(options) {
21
- this.options = options;
22
- this.terms = [];
23
- this.guidelines = [];
24
- this.capabilities = [];
25
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
- this.routes = [];
27
- this.domainRegistry = new DomainRegistry();
28
- /**
29
- * Dynamic domain property - populated via addDomain
30
- */
31
- this.domain = {};
32
- // Set log level based on debug option
33
- if (options.debug) {
34
- logger.setLevel(LoggerLevel.DEBUG);
35
- }
36
- // Validate context configuration
37
- if (options.context !== undefined && options.contextProvider) {
38
- throw new Error("Cannot provide both 'context' and 'contextProvider'. Choose one.");
39
- }
40
- // Initialize context if provided
41
- this.context = options.context;
42
- // Initialize current session if provided
43
- this.currentSession = options.session;
44
- // Initialize routing and response engines
45
- this.routingEngine = new RoutingEngine({
46
- maxCandidates: 5,
47
- allowRouteSwitch: true,
48
- switchThreshold: 70,
49
- });
50
- this.responseEngine = new ResponseEngine();
51
- // Initialize persistence if configured
52
- if (options.persistence) {
53
- this.persistenceManager = new PersistenceManager(options.persistence);
54
- // Initialize the adapter if it has an initialize method
55
- if (options.persistence.adapter.initialize) {
56
- options.persistence.adapter.initialize().catch((error) => {
57
- logger.error("[Agent] Persistence adapter initialization failed:", error);
58
- });
59
- }
60
- }
61
- // Initialize from options
62
- if (options.terms) {
63
- this.terms = [...options.terms];
64
- }
65
- if (options.guidelines) {
66
- options.guidelines.forEach((guideline) => {
67
- this.createGuideline(guideline);
68
- });
69
- }
70
- if (options.capabilities) {
71
- options.capabilities.forEach((capability) => {
72
- this.createCapability(capability);
73
- });
74
- }
75
- if (options.routes) {
76
- options.routes.forEach((routeOptions) => {
77
- this.createRoute(routeOptions);
78
- });
79
- }
80
- }
81
- /**
82
- * Get agent name
83
- */
84
- get name() {
85
- return this.options.name;
86
- }
87
- /**
88
- * Get agent description
89
- */
90
- get description() {
91
- return this.options.description;
92
- }
93
- /**
94
- * Get agent goal
95
- */
96
- get goal() {
97
- return this.options.goal;
98
- }
99
- /**
100
- * Create a new route (journey)
101
- * @template TData - Type of data collected throughout the route
102
- */
103
- createRoute(options) {
104
- const route = new Route(options);
105
- this.routes.push(route);
106
- return route;
107
- }
108
- /**
109
- * Create a domain term for the glossary
110
- */
111
- createTerm(term) {
112
- this.terms.push(term);
113
- return this;
114
- }
115
- /**
116
- * Create a behavioral guideline
117
- */
118
- createGuideline(guideline) {
119
- const guidelineWithId = {
120
- ...guideline,
121
- id: guideline.id || `guideline_${this.guidelines.length}`,
122
- enabled: guideline.enabled !== false, // Default to true
123
- };
124
- this.guidelines.push(guidelineWithId);
125
- return this;
126
- }
127
- /**
128
- * Add a capability
129
- */
130
- createCapability(capability) {
131
- const capabilityWithId = {
132
- ...capability,
133
- id: capability.id || `capability_${this.capabilities.length}`,
134
- };
135
- this.capabilities.push(capabilityWithId);
136
- return this;
137
- }
138
- /**
139
- * Add a domain with its tools/methods
140
- * Automatically tags all ToolRef objects with their domain name for security enforcement
141
- */
142
- addDomain(name, domainObject) {
143
- // Tag all tools in this domain with the domain name for security enforcement
144
- const taggedDomain = { ...domainObject };
145
- for (const key in taggedDomain) {
146
- const value = taggedDomain[key];
147
- // Check if value is a ToolRef (has handler, id, name properties)
148
- if (value &&
149
- typeof value === "object" &&
150
- "handler" in value &&
151
- "id" in value &&
152
- "name" in value) {
153
- // Tag the tool with its domain name
154
- value.domainName = name;
155
- }
156
- }
157
- this.domainRegistry.register(name, taggedDomain);
158
- // Attach to the domain property for easy access
159
- this.domain[name] = taggedDomain;
160
- }
161
- /**
162
- * Update the agent's context
163
- * Triggers the onContextUpdate lifecycle hook if configured
164
- */
165
- async updateContext(updates) {
166
- const previousContext = this.context;
167
- // Merge updates with current context
168
- this.context = {
169
- ...this.context,
170
- ...updates,
171
- };
172
- // Trigger lifecycle hook if configured
173
- if (this.options.hooks?.onContextUpdate && previousContext !== undefined) {
174
- await this.options.hooks.onContextUpdate(this.context, previousContext);
175
- }
176
- }
177
- /**
178
- * Update collected data in session with lifecycle hook support
179
- * Triggers the onDataUpdate lifecycle hook if configured
180
- * @internal
181
- */
182
- async updateData(session, collectedUpdate) {
183
- const previousCollected = { ...session.data };
184
- // Merge new collected data
185
- let newCollected = {
186
- ...session.data,
187
- ...collectedUpdate,
188
- };
189
- // Trigger lifecycle hook if configured
190
- if (this.options.hooks?.onDataUpdate) {
191
- newCollected = (await this.options.hooks.onDataUpdate(newCollected, previousCollected));
192
- }
193
- // Return updated session
194
- return mergeCollected(session, newCollected);
195
- }
196
- /**
197
- * Get current context (fetches from provider if configured)
198
- * @internal
199
- */
200
- async getContext() {
201
- // If context provider is configured, use it to fetch fresh context
202
- if (this.options.contextProvider) {
203
- return await this.options.contextProvider();
204
- }
205
- // Otherwise return the stored context
206
- return this.context;
207
- }
208
- /**
209
- * Generate a response based on history and context as a stream
210
- */
211
- async *respondStream(params) {
212
- const { history, contextOverride, signal } = params;
213
- // Get current context (may fetch from provider)
214
- let currentContext = await this.getContext();
215
- // Call beforeRespond hook if configured
216
- if (this.options.hooks?.beforeRespond && currentContext !== undefined) {
217
- currentContext = await this.options.hooks.beforeRespond(currentContext);
218
- // Update stored context with the result from beforeRespond
219
- this.context = currentContext;
220
- }
221
- // Merge context with override
222
- const effectiveContext = {
223
- ...currentContext,
224
- ...contextOverride,
225
- };
226
- // Initialize or get session (use current session if available)
227
- let session = params.session || this.currentSession || createSession();
228
- // PHASE 1: TOOL EXECUTION - Execute tools if current step has tool
229
- if (session.currentRoute && session.currentStep) {
230
- const currentRoute = this.routes.find((r) => r.id === session.currentRoute?.id);
231
- if (currentRoute) {
232
- const currentStep = currentRoute.getStep(session.currentStep.id);
233
- if (currentStep) {
234
- const transitions = currentStep.getTransitions();
235
- const toolTransition = transitions.find((t) => t.spec.tool);
236
- if (toolTransition?.spec.tool) {
237
- const toolExecutor = new ToolExecutor();
238
- // Get allowed domains from current route for security enforcement
239
- const allowedDomains = currentRoute.getDomains();
240
- const result = await toolExecutor.executeTool(toolTransition.spec.tool, effectiveContext, this.updateContext.bind(this), history, session.data, allowedDomains);
241
- // Update context with tool results
242
- if (result.contextUpdate) {
243
- await this.updateContext(result.contextUpdate);
244
- }
245
- // Update collected data with tool results
246
- if (result.collectedUpdate) {
247
- session = await this.updateData(session, result.collectedUpdate);
248
- logger.debug(`[Agent] Tool updated collected data:`, result.collectedUpdate);
249
- }
250
- logger.debug(`[Agent] Executed tool: ${result.toolName} (success: ${result.success})`);
251
- }
252
- }
253
- }
254
- }
255
- // PHASE 2: ROUTING + STEP SELECTION - Determine which route and step to use (combined)
256
- let selectedRoute;
257
- let responseDirectives;
258
- let selectedStep;
259
- let isRouteComplete = false;
260
- // Check for pending transition from previous route completion
261
- if (session.pendingTransition) {
262
- const targetRoute = this.routes.find((r) => r.id === session.pendingTransition?.targetRouteId);
263
- if (targetRoute) {
264
- logger.debug(`[Agent] Auto-transitioning from pending transition to route: ${targetRoute.title}`);
265
- // Clear pending transition and enter new route
266
- session = {
267
- ...session,
268
- pendingTransition: undefined,
269
- };
270
- session = enterRoute(session, targetRoute.id, targetRoute.title);
271
- // Merge initial data if available
272
- if (targetRoute.initialData) {
273
- session = mergeCollected(session, targetRoute.initialData);
274
- }
275
- selectedRoute = targetRoute;
276
- }
277
- else {
278
- logger.warn(`[Agent] Pending transition target route not found: ${session.pendingTransition.targetRouteId}`);
279
- // Clear invalid transition
280
- session = {
281
- ...session,
282
- pendingTransition: undefined,
283
- };
284
- }
285
- }
286
- // If no pending transition or transition handled, do normal routing
287
- if (this.routes.length > 0 && !selectedRoute) {
288
- const orchestration = await this.routingEngine.decideRouteAndStep({
289
- routes: this.routes,
290
- session,
291
- history,
292
- agentMeta: {
293
- name: this.options.name,
294
- goal: this.options.goal,
295
- description: this.options.description,
296
- personality: this.options.personality,
297
- },
298
- provider: this.options.provider,
299
- context: effectiveContext,
300
- signal,
301
- });
302
- selectedRoute = orchestration.selectedRoute;
303
- selectedStep = orchestration.selectedStep;
304
- responseDirectives = orchestration.responseDirectives;
305
- session = orchestration.session;
306
- isRouteComplete = orchestration.isRouteComplete || false;
307
- // Log if route is complete
308
- if (isRouteComplete) {
309
- logger.debug(`[Agent] Route complete: all required data collected, END_ROUTE reached`);
310
- }
311
- }
312
- // PHASE 3: DETERMINE NEXT STEP - Use step from combined decision or get initial step
313
- if (selectedRoute && !isRouteComplete) {
314
- let nextStep;
315
- // If we have a selected step from the combined routing decision, use it
316
- if (selectedStep) {
317
- nextStep = selectedStep;
318
- }
319
- else {
320
- // New route or no step selected - get initial step or first valid step
321
- const candidates = this.routingEngine.getCandidateSteps(selectedRoute, undefined, session.data || {});
322
- if (candidates.length > 0) {
323
- nextStep = candidates[0].step;
324
- logger.debug(`[Agent] Using first valid step: ${nextStep.id} for new route`);
325
- }
326
- else {
327
- // Fallback to initial step even if it should be skipped
328
- nextStep = selectedRoute.initialStep;
329
- logger.warn(`[Agent] No valid steps found, using initial step: ${nextStep.id}`);
330
- }
331
- }
332
- // Update session with next step
333
- session = enterStep(session, nextStep.id, nextStep.description);
334
- logger.debug(`[Agent] Entered step: ${nextStep.id}`);
335
- // PHASE 4: RESPONSE GENERATION - Stream message using selected route and step
336
- // Get last user message
337
- const lastUserMessage = getLastMessageFromHistory(history);
338
- // Build response schema for this route (with collect fields from step)
339
- const responseSchema = this.responseEngine.responseSchemaForRoute(selectedRoute, nextStep);
340
- // Build response prompt
341
- const responsePrompt = this.responseEngine.buildResponsePrompt(selectedRoute, nextStep, selectedRoute.getRules(), selectedRoute.getProhibitions(), responseDirectives, history, lastUserMessage, {
342
- name: this.options.name,
343
- goal: this.options.goal,
344
- description: this.options.description,
345
- personality: this.options.personality,
346
- });
347
- // Generate message stream using AI provider
348
- const stream = this.options.provider.generateMessageStream({
349
- prompt: responsePrompt,
350
- history,
351
- context: effectiveContext,
352
- signal,
353
- parameters: {
354
- jsonSchema: responseSchema,
355
- schemaName: "response_stream_output",
356
- },
357
- });
358
- // Stream chunks to caller
359
- for await (const chunk of stream) {
360
- const toolCalls = undefined;
361
- // Extract collected data on final chunk
362
- if (chunk.done && chunk.structured && nextStep.collectFields) {
363
- const collectedData = {};
364
- // The structured response includes both base fields and collected extraction fields
365
- const structuredData = chunk.structured;
366
- for (const field of nextStep.collectFields) {
367
- if (field in structuredData) {
368
- collectedData[field] = structuredData[field];
369
- }
370
- }
371
- // Merge collected data into session
372
- if (Object.keys(collectedData).length > 0) {
373
- session = await this.updateData(session, collectedData);
374
- logger.debug(`[Agent] Collected data:`, collectedData);
375
- }
376
- }
377
- // Extract any additional data from structured response on final chunk
378
- if (chunk.done &&
379
- chunk.structured &&
380
- typeof chunk.structured === "object" &&
381
- "contextUpdate" in chunk.structured) {
382
- await this.updateContext(chunk.structured
383
- .contextUpdate);
384
- }
385
- // Auto-save session step on final chunk
386
- if (chunk.done &&
387
- this.persistenceManager &&
388
- session.id &&
389
- this.options.persistence?.autoSave !== false) {
390
- await this.persistenceManager.saveSessionState(session.id, session);
391
- logger.debug(`[Agent] Auto-saved session step to persistence: ${session.id}`);
392
- }
393
- // Update current session if we have one
394
- if (chunk.done && this.currentSession) {
395
- this.currentSession = session;
396
- }
397
- yield {
398
- delta: chunk.delta,
399
- accumulated: chunk.accumulated,
400
- done: chunk.done,
401
- session, // Return updated session
402
- toolCalls,
403
- isRouteComplete,
404
- };
405
- }
406
- }
407
- else if (isRouteComplete && selectedRoute) {
408
- // Route is complete - generate completion message then check for onComplete transition
409
- const lastUserMessage = getLastMessageFromHistory(history);
410
- // Get endStep spec from route
411
- const endStepSpec = selectedRoute.endStepSpec;
412
- // Create a temporary step for completion message generation using endStep configuration
413
- const completionStep = new Step(selectedRoute.id, endStepSpec.instructions ||
414
- "Summarize what was accomplished and confirm completion", endStepSpec.id || END_ROUTE_ID, endStepSpec.collect, undefined, endStepSpec.requires, endStepSpec.instructions ||
415
- "Summarize what was accomplished and confirm completion based on the conversation history and collected data");
416
- // Build response schema for completion
417
- const responseSchema = this.responseEngine.responseSchemaForRoute(selectedRoute, completionStep);
418
- // Build completion response prompt
419
- const completionPrompt = this.responseEngine.buildResponsePrompt(selectedRoute, completionStep, selectedRoute.getRules(), selectedRoute.getProhibitions(), undefined, // No directives for completion
420
- history, lastUserMessage, {
421
- name: this.options.name,
422
- goal: this.options.goal,
423
- description: this.options.description,
424
- personality: this.options.personality,
425
- });
426
- // Stream completion message using AI provider
427
- const stream = this.options.provider.generateMessageStream({
428
- prompt: completionPrompt,
429
- history,
430
- context: effectiveContext,
431
- signal,
432
- parameters: {
433
- jsonSchema: responseSchema,
434
- schemaName: "completion_message_stream",
435
- },
436
- });
437
- logger.debug(`[Agent] Streaming completion message for route: ${selectedRoute.title}`);
438
- // Check for onComplete transition
439
- const transitionConfig = await selectedRoute.evaluateOnComplete({ data: session.data }, effectiveContext);
440
- if (transitionConfig) {
441
- // Find target route by ID or title
442
- const targetRoute = this.routes.find((r) => r.id === transitionConfig.nextStep ||
443
- r.title === transitionConfig.nextStep);
444
- if (targetRoute) {
445
- // Set pending transition in session
446
- session = {
447
- ...session,
448
- pendingTransition: {
449
- targetRouteId: targetRoute.id,
450
- condition: transitionConfig.condition,
451
- reason: "route_complete",
452
- },
453
- };
454
- logger.debug(`[Agent] Route ${selectedRoute.title} completed with pending transition to: ${targetRoute.title}`);
455
- }
456
- else {
457
- logger.warn(`[Agent] Route ${selectedRoute.title} completed but target route not found: ${transitionConfig.nextStep}`);
458
- }
459
- }
460
- // Set step to END_ROUTE marker
461
- session = enterStep(session, END_ROUTE_ID, "Route completed");
462
- logger.debug(`[Agent] Route ${selectedRoute.title} completed. Entered END_ROUTE step.`);
463
- // Stream completion chunks
464
- for await (const chunk of stream) {
465
- // Update current session if we have one
466
- if (chunk.done && this.currentSession) {
467
- this.currentSession = session;
468
- }
469
- yield {
470
- delta: chunk.delta,
471
- accumulated: chunk.accumulated,
472
- done: chunk.done,
473
- session,
474
- toolCalls: undefined,
475
- isRouteComplete: true,
476
- };
477
- }
478
- }
479
- else {
480
- // Fallback: No routes defined, stream a simple response
481
- const fallbackPrompt = new PromptComposer()
482
- .addAgentMeta({
483
- name: this.options.name,
484
- goal: this.options.goal,
485
- description: this.options.description,
486
- })
487
- .addPersonality(this.options.personality)
488
- .addInteractionHistory(history)
489
- .addGlossary(this.terms)
490
- .addGuidelines(this.guidelines)
491
- .addCapabilities(this.capabilities)
492
- .build();
493
- const stream = this.options.provider.generateMessageStream({
494
- prompt: fallbackPrompt,
495
- history,
496
- context: effectiveContext,
497
- signal,
498
- parameters: {
499
- jsonSchema: {
500
- type: "object",
501
- properties: {
502
- message: { type: "string" },
503
- },
504
- required: ["message"],
505
- additionalProperties: false,
506
- },
507
- schemaName: "fallback_stream_response",
508
- },
509
- });
510
- for await (const chunk of stream) {
511
- // Update current session if we have one
512
- if (chunk.done && this.currentSession) {
513
- this.currentSession = session;
514
- }
515
- yield {
516
- delta: chunk.delta,
517
- accumulated: chunk.accumulated,
518
- done: chunk.done,
519
- session, // Return updated session
520
- toolCalls: undefined,
521
- isRouteComplete: false,
522
- };
523
- }
524
- }
525
- }
526
- /**
527
- * Generate a response based on history and context
528
- */
529
- async respond(params) {
530
- const { history, contextOverride, signal } = params;
531
- // Get current context (may fetch from provider)
532
- let currentContext = await this.getContext();
533
- // Call beforeRespond hook if configured
534
- if (this.options.hooks?.beforeRespond && currentContext !== undefined) {
535
- currentContext = await this.options.hooks.beforeRespond(currentContext);
536
- // Update stored context with the result from beforeRespond
537
- this.context = currentContext;
538
- }
539
- // Merge context with override
540
- const effectiveContext = {
541
- ...currentContext,
542
- ...contextOverride,
543
- };
544
- // Initialize or get session (use current session if available)
545
- let session = params.session || this.currentSession || createSession();
546
- // PHASE 1: TOOL EXECUTION - Execute tools if current step has tool
547
- if (session.currentRoute && session.currentStep) {
548
- const currentRoute = this.routes.find((r) => r.id === session.currentRoute?.id);
549
- if (currentRoute) {
550
- const currentStep = currentRoute.getStep(session.currentStep.id);
551
- if (currentStep) {
552
- const transitions = currentStep.getTransitions();
553
- const toolTransition = transitions.find((t) => t.spec.tool);
554
- if (toolTransition?.spec.tool) {
555
- const toolExecutor = new ToolExecutor();
556
- // Get allowed domains from current route for security enforcement
557
- const allowedDomains = currentRoute.getDomains();
558
- const result = await toolExecutor.executeTool(toolTransition.spec.tool, effectiveContext, this.updateContext.bind(this), history, session.data, allowedDomains);
559
- // Update context with tool results
560
- if (result.contextUpdate) {
561
- await this.updateContext(result.contextUpdate);
562
- }
563
- // Update collected data with tool results
564
- if (result.collectedUpdate) {
565
- session = await this.updateData(session, result.collectedUpdate);
566
- logger.debug(`[Agent] Tool updated collected data:`, result.collectedUpdate);
567
- }
568
- logger.debug(`[Agent] Executed tool: ${result.toolName} (success: ${result.success})`);
569
- }
570
- }
571
- }
572
- }
573
- // PHASE 2: ROUTING + STEP SELECTION - Determine which route and step to use (combined)
574
- let selectedRoute;
575
- let responseDirectives;
576
- let selectedStep;
577
- let isRouteComplete = false;
578
- // Check for pending transition from previous route completion
579
- if (session.pendingTransition) {
580
- const targetRoute = this.routes.find((r) => r.id === session.pendingTransition?.targetRouteId);
581
- if (targetRoute) {
582
- logger.debug(`[Agent] Auto-transitioning from pending transition to route: ${targetRoute.title}`);
583
- // Clear pending transition and enter new route
584
- session = {
585
- ...session,
586
- pendingTransition: undefined,
587
- };
588
- session = enterRoute(session, targetRoute.id, targetRoute.title);
589
- // Merge initial data if available
590
- if (targetRoute.initialData) {
591
- session = mergeCollected(session, targetRoute.initialData);
592
- }
593
- selectedRoute = targetRoute;
594
- }
595
- else {
596
- logger.warn(`[Agent] Pending transition target route not found: ${session.pendingTransition.targetRouteId}`);
597
- // Clear invalid transition
598
- session = {
599
- ...session,
600
- pendingTransition: undefined,
601
- };
602
- }
603
- }
604
- // If no pending transition or transition handled, do normal routing
605
- if (this.routes.length > 0 && !selectedRoute) {
606
- const orchestration = await this.routingEngine.decideRouteAndStep({
607
- routes: this.routes,
608
- session,
609
- history,
610
- agentMeta: {
611
- name: this.options.name,
612
- goal: this.options.goal,
613
- description: this.options.description,
614
- personality: this.options.personality,
615
- },
616
- provider: this.options.provider,
617
- context: effectiveContext,
618
- signal,
619
- });
620
- selectedRoute = orchestration.selectedRoute;
621
- selectedStep = orchestration.selectedStep;
622
- responseDirectives = orchestration.responseDirectives;
623
- session = orchestration.session;
624
- isRouteComplete = orchestration.isRouteComplete || false;
625
- // Log if route is complete
626
- if (isRouteComplete) {
627
- logger.debug(`[Agent] Route complete: all required data collected, END_ROUTE reached`);
628
- }
629
- }
630
- // PHASE 3: DETERMINE NEXT STEP - Use step from combined decision or get initial step
631
- let message;
632
- const toolCalls = undefined;
633
- if (selectedRoute && !isRouteComplete) {
634
- let nextStep;
635
- // If we have a selected step from the combined routing decision, use it
636
- if (selectedStep) {
637
- nextStep = selectedStep;
638
- }
639
- else {
640
- // New route or no step selected - get initial step or first valid step
641
- const candidates = this.routingEngine.getCandidateSteps(selectedRoute, undefined, session.data || {});
642
- if (candidates.length > 0) {
643
- nextStep = candidates[0].step;
644
- logger.debug(`[Agent] Using first valid step: ${nextStep.id} for new route`);
645
- }
646
- else {
647
- // Fallback to initial step even if it should be skipped
648
- nextStep = selectedRoute.initialStep;
649
- logger.warn(`[Agent] No valid steps found, using initial step: ${nextStep.id}`);
650
- }
651
- }
652
- // Update session with next step
653
- session = enterStep(session, nextStep.id, nextStep.description);
654
- logger.debug(`[Agent] Entered step: ${nextStep.id}`);
655
- // PHASE 4: RESPONSE GENERATION - Generate message using selected route and step
656
- // Get last user message
657
- const lastUserMessage = getLastMessageFromHistory(history);
658
- // Build response schema for this route (with collect fields from step)
659
- const responseSchema = this.responseEngine.responseSchemaForRoute(selectedRoute, nextStep);
660
- // Build response prompt
661
- const responsePrompt = this.responseEngine.buildResponsePrompt(selectedRoute, nextStep, selectedRoute.getRules(), selectedRoute.getProhibitions(), responseDirectives, history, lastUserMessage, {
662
- name: this.options.name,
663
- goal: this.options.goal,
664
- description: this.options.description,
665
- personality: this.options.personality,
666
- });
667
- // Generate message using AI provider
668
- const result = await this.options.provider.generateMessage({
669
- prompt: responsePrompt,
670
- history,
671
- context: effectiveContext,
672
- signal,
673
- parameters: {
674
- jsonSchema: responseSchema,
675
- schemaName: "response_output",
676
- },
677
- });
678
- message = result.structured?.message || result.message;
679
- // Extract collected data from response
680
- if (result.structured && nextStep.collectFields) {
681
- const collectedData = {};
682
- // The structured response includes both base fields and collected extraction fields
683
- const structuredData = result.structured;
684
- for (const field of nextStep.collectFields) {
685
- if (field in structuredData) {
686
- collectedData[field] = structuredData[field];
687
- }
688
- }
689
- // Merge collected data into session
690
- if (Object.keys(collectedData).length > 0) {
691
- session = await this.updateData(session, collectedData);
692
- logger.debug(`[Agent] Collected data:`, collectedData);
693
- }
694
- }
695
- // Extract any additional data from structured response
696
- if (result.structured &&
697
- typeof result.structured === "object" &&
698
- "contextUpdate" in result.structured) {
699
- await this.updateContext(result.structured
700
- .contextUpdate);
701
- }
702
- }
703
- else if (isRouteComplete && selectedRoute) {
704
- // Route is complete - generate completion message then check for onComplete transition
705
- const lastUserMessage = getLastMessageFromHistory(history);
706
- // Get endStep spec from route
707
- const endStepSpec = selectedRoute.endStepSpec;
708
- // Create a temporary step for completion message generation using endStep configuration
709
- const completionStep = new Step(selectedRoute.id, endStepSpec.instructions ||
710
- "Summarize what was accomplished and confirm completion", endStepSpec.id || END_ROUTE_ID, endStepSpec.collect, undefined, endStepSpec.requires, endStepSpec.instructions ||
711
- "Summarize what was accomplished and confirm completion based on the conversation history and collected data");
712
- // Build response schema for completion
713
- const responseSchema = this.responseEngine.responseSchemaForRoute(selectedRoute, completionStep);
714
- // Build completion response prompt
715
- const completionPrompt = this.responseEngine.buildResponsePrompt(selectedRoute, completionStep, selectedRoute.getRules(), selectedRoute.getProhibitions(), undefined, // No directives for completion
716
- history, lastUserMessage, {
717
- name: this.options.name,
718
- goal: this.options.goal,
719
- description: this.options.description,
720
- personality: this.options.personality,
721
- });
722
- // Generate completion message using AI provider
723
- const completionResult = await this.options.provider.generateMessage({
724
- prompt: completionPrompt,
725
- history,
726
- context: effectiveContext,
727
- signal,
728
- parameters: {
729
- jsonSchema: responseSchema,
730
- schemaName: "completion_message",
731
- },
732
- });
733
- message =
734
- completionResult.structured?.message || completionResult.message;
735
- logger.debug(`[Agent] Generated completion message for route: ${selectedRoute.title}`);
736
- // Check for onComplete transition
737
- const transitionConfig = await selectedRoute.evaluateOnComplete({ data: session.data }, effectiveContext);
738
- if (transitionConfig) {
739
- // Find target route by ID or title
740
- const targetRoute = this.routes.find((r) => r.id === transitionConfig.nextStep ||
741
- r.title === transitionConfig.nextStep);
742
- if (targetRoute) {
743
- // Set pending transition in session
744
- session = {
745
- ...session,
746
- pendingTransition: {
747
- targetRouteId: targetRoute.id,
748
- condition: transitionConfig.condition,
749
- reason: "route_complete",
750
- },
751
- };
752
- logger.debug(`[Agent] Route ${selectedRoute.title} completed with pending transition to: ${targetRoute.title}`);
753
- }
754
- else {
755
- logger.warn(`[Agent] Route ${selectedRoute.title} completed but target route not found: ${transitionConfig.nextStep}`);
756
- }
757
- }
758
- // Set step to END_ROUTE marker
759
- session = enterStep(session, END_ROUTE_ID, "Route completed");
760
- logger.debug(`[Agent] Route ${selectedRoute.title} completed. Entered END_ROUTE step.`);
761
- }
762
- else {
763
- // Fallback: No routes defined, generate a simple response
764
- const fallbackPrompt = new PromptComposer()
765
- .addAgentMeta({
766
- name: this.options.name,
767
- goal: this.options.goal,
768
- description: this.options.description,
769
- })
770
- .addPersonality(this.options.personality)
771
- .addInteractionHistory(history)
772
- .addGlossary(this.terms)
773
- .addGuidelines(this.guidelines)
774
- .addCapabilities(this.capabilities)
775
- .build();
776
- const result = await this.options.provider.generateMessage({
777
- prompt: fallbackPrompt,
778
- history,
779
- context: effectiveContext,
780
- signal,
781
- parameters: {
782
- jsonSchema: {
783
- type: "object",
784
- properties: {
785
- message: { type: "string" },
786
- },
787
- required: ["message"],
788
- additionalProperties: false,
789
- },
790
- schemaName: "fallback_response",
791
- },
792
- });
793
- message = result.structured?.message || result.message;
794
- }
795
- // Auto-save session step to persistence if configured
796
- if (this.persistenceManager &&
797
- session.id &&
798
- this.options.persistence?.autoSave !== false) {
799
- await this.persistenceManager.saveSessionState(session.id, session);
800
- logger.debug(`[Agent] Auto-saved session step to persistence: ${session.id}`);
801
- }
802
- // Update current session if we have one
803
- if (this.currentSession) {
804
- this.currentSession = session;
805
- }
806
- return {
807
- message,
808
- session, // Return updated session with route/step info
809
- toolCalls,
810
- isRouteComplete, // Indicates if the route has reached END_ROUTE with all data collected
811
- };
812
- }
813
- /**
814
- * Get all routes
815
- */
816
- getRoutes() {
817
- return [...this.routes];
818
- }
819
- /**
820
- * Get all terms
821
- */
822
- getTerms() {
823
- return [...this.terms];
824
- }
825
- /**
826
- * Get all guidelines
827
- */
828
- getGuidelines() {
829
- return [...this.guidelines];
830
- }
831
- /**
832
- * Get all capabilities
833
- */
834
- getCapabilities() {
835
- return [...this.capabilities];
836
- }
837
- /**
838
- * Get the domain registry
839
- */
840
- getDomainRegistry() {
841
- return this.domainRegistry;
842
- }
843
- /**
844
- * Get the persistence manager (if configured)
845
- */
846
- getPersistenceManager() {
847
- return this.persistenceManager;
848
- }
849
- /**
850
- * Check if persistence is enabled
851
- */
852
- hasPersistence() {
853
- return this.persistenceManager !== undefined;
854
- }
855
- /**
856
- * Get allowed domains for a specific route
857
- * @param routeId - Route ID to check
858
- * @returns Filtered domains object, or all domains if route has no restrictions
859
- */
860
- getDomainsForRoute(routeId) {
861
- const route = this.routes.find((r) => r.id === routeId);
862
- if (!route) {
863
- // Route not found, return all domains
864
- return this.domainRegistry.all();
865
- }
866
- const allowedDomains = route.getDomains();
867
- return this.domainRegistry.getFiltered(allowedDomains);
868
- }
869
- /**
870
- * Get allowed domains for a specific route by title
871
- * @param routeTitle - Route title to check
872
- * @returns Filtered domains object, or all domains if route has no restrictions
873
- */
874
- getDomainsForRouteByTitle(routeTitle) {
875
- const route = this.routes.find((r) => r.title === routeTitle);
876
- if (!route) {
877
- // Route not found, return all domains
878
- return this.domainRegistry.all();
879
- }
880
- const allowedDomains = route.getDomains();
881
- return this.domainRegistry.getFiltered(allowedDomains);
882
- }
883
- /**
884
- * Set the current session for convenience methods
885
- * @param session - Session step to use for subsequent calls
886
- */
887
- setCurrentSession(session) {
888
- this.currentSession = session;
889
- }
890
- /**
891
- * Get the current session (if set)
892
- */
893
- getCurrentSession() {
894
- return this.currentSession;
895
- }
896
- /**
897
- * Clear the current session
898
- */
899
- clearCurrentSession() {
900
- this.currentSession = undefined;
901
- }
902
- /**
903
- * Get collected data from current session
904
- * @param routeId - Optional route ID to get data for (uses current route if not provided)
905
- * @returns The collected data from the current session
906
- */
907
- getData(routeId) {
908
- if (!this.currentSession) {
909
- return {};
910
- }
911
- if (routeId) {
912
- return (this.currentSession.dataByRoute?.[routeId] ||
913
- {});
914
- }
915
- return this.currentSession.data || {};
916
- }
917
- /**
918
- * Manually transition to a different route
919
- * Sets a pending transition that will be executed on the next respond() call
920
- *
921
- * @param routeIdOrTitle - Route ID or title to transition to
922
- * @param session - Session step to update (uses current session if not provided)
923
- * @param condition - Optional AI-evaluated condition for the transition
924
- * @returns Updated session with pending transition
925
- *
926
- * @example
927
- * // After route completes
928
- * if (response.isRouteComplete && response.session) {
929
- * const updatedSession = agent.nextStepRoute("feedback-collection", response.session);
930
- * // Next respond() call will automatically transition to feedback route
931
- * const nextResponse = await agent.respond({ history, session: updatedSession });
932
- * }
933
- */
934
- nextStepRoute(routeIdOrTitle, session, condition) {
935
- const targetSession = session || this.currentSession;
936
- if (!targetSession) {
937
- throw new Error("No session provided and no current session available. Please provide a session to transition.");
938
- }
939
- // Find target route by ID or title
940
- const targetRoute = this.routes.find((r) => r.id === routeIdOrTitle || r.title === routeIdOrTitle);
941
- if (!targetRoute) {
942
- throw new Error(`Route not found: ${routeIdOrTitle}. Available routes: ${this.routes
943
- .map((r) => r.title)
944
- .join(", ")}`);
945
- }
946
- const updatedSession = {
947
- ...targetSession,
948
- pendingTransition: {
949
- targetRouteId: targetRoute.id,
950
- condition,
951
- reason: "manual",
952
- },
953
- };
954
- // Update current session if using it
955
- if (!session && this.currentSession) {
956
- this.currentSession = updatedSession;
957
- }
958
- logger.debug(`[Agent] Set pending manual transition to route: ${targetRoute.title}`);
959
- return updatedSession;
960
- }
961
- }
962
- //# sourceMappingURL=Agent.js.map