@falai/agent 0.9.2 → 1.0.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 (628) hide show
  1. package/README.md +281 -42
  2. package/dist/adapters/MemoryAdapter.d.ts.map +1 -0
  3. package/dist/adapters/MemoryAdapter.js.map +1 -0
  4. package/dist/adapters/MongoAdapter.d.ts.map +1 -0
  5. package/dist/adapters/MongoAdapter.js.map +1 -0
  6. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -0
  7. package/dist/adapters/OpenSearchAdapter.js.map +1 -0
  8. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  9. package/dist/adapters/PostgreSQLAdapter.js.map +1 -0
  10. package/dist/adapters/PrismaAdapter.d.ts.map +1 -0
  11. package/dist/{src/adapters → adapters}/PrismaAdapter.js +3 -2
  12. package/dist/adapters/PrismaAdapter.js.map +1 -0
  13. package/dist/adapters/RedisAdapter.d.ts.map +1 -0
  14. package/dist/{src/adapters → adapters}/RedisAdapter.js +3 -3
  15. package/dist/adapters/RedisAdapter.js.map +1 -0
  16. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -0
  17. package/dist/adapters/SQLiteAdapter.js.map +1 -0
  18. package/dist/adapters/index.d.ts.map +1 -0
  19. package/dist/adapters/index.js.map +1 -0
  20. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -0
  21. package/dist/cjs/adapters/MongoAdapter.js.map +1 -0
  22. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -0
  23. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -0
  24. package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts.map +1 -1
  25. package/dist/cjs/{src/adapters → adapters}/PrismaAdapter.js +3 -2
  26. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -0
  27. package/dist/cjs/{src/adapters → adapters}/RedisAdapter.js +2 -2
  28. package/dist/cjs/adapters/RedisAdapter.js.map +1 -0
  29. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -0
  30. package/dist/cjs/adapters/index.js.map +1 -0
  31. package/dist/cjs/constants/index.js.map +1 -0
  32. package/dist/cjs/{src/core → core}/Agent.d.ts +16 -1
  33. package/dist/cjs/core/Agent.d.ts.map +1 -0
  34. package/dist/cjs/{src/core → core}/Agent.js +63 -2
  35. package/dist/cjs/core/Agent.js.map +1 -0
  36. package/dist/cjs/core/BatchExecutor.d.ts +353 -0
  37. package/dist/cjs/core/BatchExecutor.d.ts.map +1 -0
  38. package/dist/cjs/core/BatchExecutor.js +850 -0
  39. package/dist/cjs/core/BatchExecutor.js.map +1 -0
  40. package/dist/cjs/core/BatchPromptBuilder.d.ts +86 -0
  41. package/dist/cjs/core/BatchPromptBuilder.d.ts.map +1 -0
  42. package/dist/cjs/core/BatchPromptBuilder.js +217 -0
  43. package/dist/cjs/core/BatchPromptBuilder.js.map +1 -0
  44. package/dist/cjs/core/Events.js.map +1 -0
  45. package/dist/cjs/core/PersistenceManager.js.map +1 -0
  46. package/dist/{src → cjs}/core/PromptComposer.d.ts +1 -1
  47. package/dist/cjs/core/PromptComposer.d.ts.map +1 -0
  48. package/dist/cjs/{src/core → core}/PromptComposer.js +44 -7
  49. package/dist/cjs/core/PromptComposer.js.map +1 -0
  50. package/dist/{src → cjs}/core/ResponseEngine.d.ts.map +1 -1
  51. package/dist/cjs/core/ResponseEngine.js +211 -0
  52. package/dist/cjs/core/ResponseEngine.js.map +1 -0
  53. package/dist/{src → cjs}/core/ResponseModal.d.ts +45 -0
  54. package/dist/cjs/core/ResponseModal.d.ts.map +1 -0
  55. package/dist/cjs/{src/core → core}/ResponseModal.js +752 -74
  56. package/dist/cjs/core/ResponseModal.js.map +1 -0
  57. package/dist/{src → cjs}/core/ResponsePipeline.d.ts +2 -2
  58. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -0
  59. package/dist/cjs/{src/core → core}/ResponsePipeline.js +13 -6
  60. package/dist/cjs/core/ResponsePipeline.js.map +1 -0
  61. package/dist/{src → cjs}/core/Route.d.ts +34 -5
  62. package/dist/cjs/core/Route.d.ts.map +1 -0
  63. package/dist/cjs/{src/core → core}/Route.js +196 -19
  64. package/dist/cjs/core/Route.js.map +1 -0
  65. package/dist/cjs/{src/core → core}/RoutingEngine.d.ts +30 -5
  66. package/dist/cjs/core/RoutingEngine.d.ts.map +1 -0
  67. package/dist/cjs/{src/core → core}/RoutingEngine.js +330 -80
  68. package/dist/cjs/core/RoutingEngine.js.map +1 -0
  69. package/dist/cjs/core/SessionManager.js.map +1 -0
  70. package/dist/{src → cjs}/core/Step.d.ts +31 -10
  71. package/dist/cjs/core/Step.d.ts.map +1 -0
  72. package/dist/cjs/{src/core → core}/Step.js +105 -10
  73. package/dist/cjs/core/Step.js.map +1 -0
  74. package/dist/cjs/core/ToolManager.js.map +1 -0
  75. package/dist/{src → cjs}/index.d.ts +4 -1
  76. package/dist/cjs/index.d.ts.map +1 -0
  77. package/dist/cjs/{src/index.js → index.js} +12 -1
  78. package/dist/cjs/index.js.map +1 -0
  79. package/dist/cjs/{src/providers → providers}/AnthropicProvider.js +18 -18
  80. package/dist/cjs/providers/AnthropicProvider.js.map +1 -0
  81. package/dist/{src → cjs}/providers/GeminiProvider.d.ts.map +1 -1
  82. package/dist/cjs/{src/providers → providers}/GeminiProvider.js +123 -51
  83. package/dist/cjs/providers/GeminiProvider.js.map +1 -0
  84. package/dist/cjs/{src/providers → providers}/OpenAIProvider.js +19 -19
  85. package/dist/cjs/providers/OpenAIProvider.js.map +1 -0
  86. package/dist/cjs/{src/providers → providers}/OpenRouterProvider.js +19 -19
  87. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -0
  88. package/dist/cjs/providers/index.js.map +1 -0
  89. package/dist/cjs/{src/types → types}/agent.d.ts +15 -3
  90. package/dist/cjs/types/agent.d.ts.map +1 -0
  91. package/dist/cjs/types/agent.js.map +1 -0
  92. package/dist/{src → cjs}/types/ai.js.map +1 -1
  93. package/dist/cjs/types/history.js.map +1 -0
  94. package/dist/cjs/{src/types → types}/index.d.ts +2 -1
  95. package/dist/{src → cjs}/types/index.d.ts.map +1 -1
  96. package/dist/cjs/{src/types → types}/index.js +6 -1
  97. package/dist/cjs/types/index.js.map +1 -0
  98. package/dist/cjs/types/persistence.js.map +1 -0
  99. package/dist/cjs/{src/types → types}/route.d.ts +111 -12
  100. package/dist/cjs/types/route.d.ts.map +1 -0
  101. package/dist/cjs/{src/types → types}/route.js.map +1 -1
  102. package/dist/cjs/types/session.js.map +1 -0
  103. package/dist/cjs/types/template.d.ts +88 -0
  104. package/dist/cjs/types/template.d.ts.map +1 -0
  105. package/dist/cjs/types/tool.js.map +1 -0
  106. package/dist/cjs/utils/clone.js.map +1 -0
  107. package/dist/cjs/utils/condition.d.ts +38 -0
  108. package/dist/cjs/utils/condition.d.ts.map +1 -0
  109. package/dist/cjs/utils/condition.js +168 -0
  110. package/dist/cjs/utils/condition.js.map +1 -0
  111. package/dist/cjs/utils/event.js.map +1 -0
  112. package/dist/cjs/utils/history.js.map +1 -0
  113. package/dist/cjs/utils/id.js.map +1 -0
  114. package/dist/cjs/{src/utils → utils}/index.d.ts +3 -1
  115. package/dist/cjs/utils/index.d.ts.map +1 -0
  116. package/dist/cjs/{src/utils → utils}/index.js +12 -1
  117. package/dist/cjs/utils/index.js.map +1 -0
  118. package/dist/cjs/utils/json.d.ts +16 -0
  119. package/dist/cjs/utils/json.d.ts.map +1 -0
  120. package/dist/cjs/utils/json.js +47 -0
  121. package/dist/cjs/utils/json.js.map +1 -0
  122. package/dist/cjs/utils/logger.js.map +1 -0
  123. package/dist/{src → cjs}/utils/retry.d.ts +0 -3
  124. package/dist/cjs/utils/retry.d.ts.map +1 -0
  125. package/dist/cjs/{src/utils → utils}/retry.js +8 -7
  126. package/dist/cjs/utils/retry.js.map +1 -0
  127. package/dist/cjs/utils/session.js.map +1 -0
  128. package/dist/{src → cjs}/utils/template.d.ts +48 -0
  129. package/dist/cjs/utils/template.d.ts.map +1 -0
  130. package/dist/cjs/{src/utils → utils}/template.js +100 -0
  131. package/dist/cjs/utils/template.js.map +1 -0
  132. package/dist/constants/index.d.ts.map +1 -0
  133. package/dist/constants/index.js.map +1 -0
  134. package/dist/{src/core → core}/Agent.d.ts +16 -1
  135. package/dist/core/Agent.d.ts.map +1 -0
  136. package/dist/{src/core → core}/Agent.js +64 -3
  137. package/dist/core/Agent.js.map +1 -0
  138. package/dist/core/BatchExecutor.d.ts +353 -0
  139. package/dist/core/BatchExecutor.d.ts.map +1 -0
  140. package/dist/core/BatchExecutor.js +845 -0
  141. package/dist/core/BatchExecutor.js.map +1 -0
  142. package/dist/core/BatchPromptBuilder.d.ts +86 -0
  143. package/dist/core/BatchPromptBuilder.d.ts.map +1 -0
  144. package/dist/core/BatchPromptBuilder.js +213 -0
  145. package/dist/core/BatchPromptBuilder.js.map +1 -0
  146. package/dist/core/Events.d.ts.map +1 -0
  147. package/dist/core/Events.js.map +1 -0
  148. package/dist/core/PersistenceManager.d.ts.map +1 -0
  149. package/dist/core/PersistenceManager.js.map +1 -0
  150. package/dist/{cjs/src/core → core}/PromptComposer.d.ts +1 -1
  151. package/dist/core/PromptComposer.d.ts.map +1 -0
  152. package/dist/{src/core → core}/PromptComposer.js +45 -8
  153. package/dist/core/PromptComposer.js.map +1 -0
  154. package/dist/core/ResponseEngine.d.ts.map +1 -0
  155. package/dist/core/ResponseEngine.js +207 -0
  156. package/dist/core/ResponseEngine.js.map +1 -0
  157. package/dist/{cjs/src/core → core}/ResponseModal.d.ts +45 -0
  158. package/dist/core/ResponseModal.d.ts.map +1 -0
  159. package/dist/{src/core → core}/ResponseModal.js +752 -74
  160. package/dist/core/ResponseModal.js.map +1 -0
  161. package/dist/{cjs/src/core → core}/ResponsePipeline.d.ts +2 -2
  162. package/dist/core/ResponsePipeline.d.ts.map +1 -0
  163. package/dist/{src/core → core}/ResponsePipeline.js +13 -6
  164. package/dist/core/ResponsePipeline.js.map +1 -0
  165. package/dist/{cjs/src/core → core}/Route.d.ts +34 -5
  166. package/dist/core/Route.d.ts.map +1 -0
  167. package/dist/{src/core → core}/Route.js +195 -18
  168. package/dist/core/Route.js.map +1 -0
  169. package/dist/{src/core → core}/RoutingEngine.d.ts +30 -5
  170. package/dist/core/RoutingEngine.d.ts.map +1 -0
  171. package/dist/{src/core → core}/RoutingEngine.js +310 -60
  172. package/dist/core/RoutingEngine.js.map +1 -0
  173. package/dist/core/SessionManager.d.ts.map +1 -0
  174. package/dist/core/SessionManager.js.map +1 -0
  175. package/dist/{cjs/src/core → core}/Step.d.ts +31 -10
  176. package/dist/core/Step.d.ts.map +1 -0
  177. package/dist/{src/core → core}/Step.js +104 -9
  178. package/dist/core/Step.js.map +1 -0
  179. package/dist/core/ToolManager.d.ts.map +1 -0
  180. package/dist/core/ToolManager.js.map +1 -0
  181. package/dist/{cjs/src/index.d.ts → index.d.ts} +4 -1
  182. package/dist/index.d.ts.map +1 -0
  183. package/dist/{src/index.js → index.js} +3 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  186. package/dist/{src/providers → providers}/AnthropicProvider.js +17 -17
  187. package/dist/providers/AnthropicProvider.js.map +1 -0
  188. package/dist/providers/GeminiProvider.d.ts.map +1 -0
  189. package/dist/{src/providers → providers}/GeminiProvider.js +123 -51
  190. package/dist/providers/GeminiProvider.js.map +1 -0
  191. package/dist/providers/OpenAIProvider.d.ts.map +1 -0
  192. package/dist/{src/providers → providers}/OpenAIProvider.js +18 -18
  193. package/dist/providers/OpenAIProvider.js.map +1 -0
  194. package/dist/providers/OpenRouterProvider.d.ts.map +1 -0
  195. package/dist/{src/providers → providers}/OpenRouterProvider.js +18 -18
  196. package/dist/providers/OpenRouterProvider.js.map +1 -0
  197. package/dist/providers/index.d.ts.map +1 -0
  198. package/dist/providers/index.js.map +1 -0
  199. package/dist/{src/types → types}/agent.d.ts +15 -3
  200. package/dist/types/agent.d.ts.map +1 -0
  201. package/dist/types/agent.js.map +1 -0
  202. package/dist/types/ai.d.ts.map +1 -0
  203. package/dist/types/ai.js.map +1 -0
  204. package/dist/types/history.d.ts.map +1 -0
  205. package/dist/types/history.js.map +1 -0
  206. package/dist/{src/types → types}/index.d.ts +2 -1
  207. package/dist/types/index.d.ts.map +1 -0
  208. package/dist/{src/types → types}/index.js +1 -0
  209. package/dist/types/index.js.map +1 -0
  210. package/dist/types/persistence.d.ts.map +1 -0
  211. package/dist/types/persistence.js.map +1 -0
  212. package/dist/{src/types → types}/route.d.ts +111 -12
  213. package/dist/types/route.d.ts.map +1 -0
  214. package/dist/{src/types → types}/route.js.map +1 -1
  215. package/dist/types/routing.d.ts.map +1 -0
  216. package/dist/{cjs/src/types → types}/routing.js.map +1 -1
  217. package/dist/types/schema.d.ts.map +1 -0
  218. package/dist/{cjs/src/types → types}/schema.js.map +1 -1
  219. package/dist/types/session.d.ts.map +1 -0
  220. package/dist/{src/types → types}/session.js.map +1 -1
  221. package/dist/types/template.d.ts +88 -0
  222. package/dist/types/template.d.ts.map +1 -0
  223. package/dist/{cjs/src/types → types}/template.js.map +1 -1
  224. package/dist/types/tool.d.ts.map +1 -0
  225. package/dist/types/tool.js.map +1 -0
  226. package/dist/utils/clone.d.ts.map +1 -0
  227. package/dist/utils/clone.js.map +1 -0
  228. package/dist/utils/condition.d.ts +38 -0
  229. package/dist/utils/condition.d.ts.map +1 -0
  230. package/dist/utils/condition.js +161 -0
  231. package/dist/utils/condition.js.map +1 -0
  232. package/dist/utils/event.d.ts.map +1 -0
  233. package/dist/utils/event.js.map +1 -0
  234. package/dist/utils/history.d.ts.map +1 -0
  235. package/dist/utils/history.js.map +1 -0
  236. package/dist/utils/id.d.ts.map +1 -0
  237. package/dist/utils/id.js.map +1 -0
  238. package/dist/{src/utils → utils}/index.d.ts +3 -1
  239. package/dist/utils/index.d.ts.map +1 -0
  240. package/dist/{src/utils → utils}/index.js +5 -1
  241. package/dist/utils/index.js.map +1 -0
  242. package/dist/utils/json.d.ts +16 -0
  243. package/dist/utils/json.d.ts.map +1 -0
  244. package/dist/utils/json.js +43 -0
  245. package/dist/utils/json.js.map +1 -0
  246. package/dist/utils/logger.d.ts.map +1 -0
  247. package/dist/utils/logger.js.map +1 -0
  248. package/dist/{cjs/src/utils → utils}/retry.d.ts +0 -3
  249. package/dist/utils/retry.d.ts.map +1 -0
  250. package/dist/{src/utils → utils}/retry.js +5 -4
  251. package/dist/utils/retry.js.map +1 -0
  252. package/dist/utils/session.d.ts.map +1 -0
  253. package/dist/utils/session.js.map +1 -0
  254. package/dist/{cjs/src/utils → utils}/template.d.ts +48 -0
  255. package/dist/utils/template.d.ts.map +1 -0
  256. package/dist/{src/utils → utils}/template.js +98 -0
  257. package/dist/utils/template.js.map +1 -0
  258. package/docs/README.md +1 -0
  259. package/docs/api/README.md +237 -12
  260. package/docs/api/overview.md +206 -3
  261. package/docs/architecture/data-extraction-flow.md +363 -0
  262. package/docs/architecture/multi-step-execution.md +243 -0
  263. package/docs/core/agent/README.md +156 -5
  264. package/docs/core/agent/rules-and-prohibitions.md +113 -0
  265. package/docs/core/agent/session-management.md +1 -1
  266. package/docs/core/ai-integration/prompt-composition.md +135 -0
  267. package/docs/core/ai-integration/response-processing.md +146 -0
  268. package/docs/core/conversation-flows/data-collection.md +143 -0
  269. package/docs/core/conversation-flows/routes.md +2 -2
  270. package/docs/core/conversation-flows/step-transitions.md +132 -0
  271. package/docs/core/conversation-flows/steps.md +112 -0
  272. package/docs/core/error-handling.md +193 -0
  273. package/docs/core/routing/intelligent-routing.md +118 -0
  274. package/docs/guides/getting-started/README.md +284 -3
  275. package/docs/guides/migration/README.md +27 -0
  276. package/docs/guides/migration/flexible-routing-conditions.md +375 -0
  277. package/docs/guides/migration/multi-step-execution.md +373 -0
  278. package/examples/advanced-patterns/knowledge-based-agent.ts +101 -24
  279. package/examples/advanced-patterns/persistent-onboarding.ts +40 -5
  280. package/examples/advanced-patterns/route-lifecycle-hooks.ts +82 -12
  281. package/examples/advanced-patterns/streaming-responses.ts +2 -2
  282. package/examples/ai-providers/anthropic-integration.ts +4 -4
  283. package/examples/ai-providers/openai-integration.ts +1 -1
  284. package/examples/condition-patterns/function-only-conditions.ts +365 -0
  285. package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
  286. package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
  287. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  288. package/examples/condition-patterns/string-only-conditions.ts +296 -0
  289. package/examples/conversation-flows/completion-transitions.ts +48 -7
  290. package/examples/core-concepts/basic-agent.ts +54 -33
  291. package/examples/core-concepts/schema-driven-extraction.ts +33 -9
  292. package/examples/core-concepts/session-management.ts +51 -16
  293. package/examples/integrations/database-integration.ts +6 -6
  294. package/examples/integrations/healthcare-integration.ts +10 -10
  295. package/examples/integrations/search-integration.ts +8 -8
  296. package/examples/integrations/server-session-management.ts +8 -8
  297. package/examples/persistence/database-persistence.ts +15 -15
  298. package/examples/persistence/memory-sessions.ts +3 -3
  299. package/examples/persistence/redis-persistence.ts +7 -9
  300. package/examples/tools/data-enrichment-tools.ts +4 -4
  301. package/package.json +6 -4
  302. package/src/adapters/PrismaAdapter.ts +3 -2
  303. package/src/adapters/RedisAdapter.ts +3 -3
  304. package/src/core/Agent.ts +78 -2
  305. package/src/core/BatchExecutor.ts +1166 -0
  306. package/src/core/BatchPromptBuilder.ts +293 -0
  307. package/src/core/PromptComposer.ts +53 -16
  308. package/src/core/ResponseEngine.ts +168 -29
  309. package/src/core/ResponseModal.ts +954 -74
  310. package/src/core/ResponsePipeline.ts +17 -9
  311. package/src/core/Route.ts +223 -22
  312. package/src/core/RoutingEngine.ts +426 -83
  313. package/src/core/Step.ts +144 -16
  314. package/src/index.ts +19 -0
  315. package/src/providers/AnthropicProvider.ts +17 -17
  316. package/src/providers/GeminiProvider.ts +129 -60
  317. package/src/providers/OpenAIProvider.ts +18 -18
  318. package/src/providers/OpenRouterProvider.ts +18 -18
  319. package/src/types/agent.ts +15 -3
  320. package/src/types/index.ts +12 -1
  321. package/src/types/route.ts +131 -12
  322. package/src/types/template.ts +70 -2
  323. package/src/utils/condition.ts +190 -0
  324. package/src/utils/index.ts +12 -0
  325. package/src/utils/json.ts +46 -0
  326. package/src/utils/retry.ts +5 -4
  327. package/src/utils/template.ts +109 -0
  328. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +0 -1
  329. package/dist/cjs/src/adapters/MemoryAdapter.js.map +0 -1
  330. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +0 -1
  331. package/dist/cjs/src/adapters/MongoAdapter.js.map +0 -1
  332. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +0 -1
  333. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +0 -1
  334. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  335. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +0 -1
  336. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +0 -1
  337. package/dist/cjs/src/adapters/PrismaAdapter.js.map +0 -1
  338. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +0 -1
  339. package/dist/cjs/src/adapters/RedisAdapter.js.map +0 -1
  340. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +0 -1
  341. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +0 -1
  342. package/dist/cjs/src/adapters/index.d.ts.map +0 -1
  343. package/dist/cjs/src/adapters/index.js.map +0 -1
  344. package/dist/cjs/src/constants/index.d.ts.map +0 -1
  345. package/dist/cjs/src/constants/index.js.map +0 -1
  346. package/dist/cjs/src/core/Agent.d.ts.map +0 -1
  347. package/dist/cjs/src/core/Agent.js.map +0 -1
  348. package/dist/cjs/src/core/Events.d.ts.map +0 -1
  349. package/dist/cjs/src/core/Events.js.map +0 -1
  350. package/dist/cjs/src/core/PersistenceManager.d.ts.map +0 -1
  351. package/dist/cjs/src/core/PersistenceManager.js.map +0 -1
  352. package/dist/cjs/src/core/PromptComposer.d.ts.map +0 -1
  353. package/dist/cjs/src/core/PromptComposer.js.map +0 -1
  354. package/dist/cjs/src/core/ResponseEngine.d.ts.map +0 -1
  355. package/dist/cjs/src/core/ResponseEngine.js +0 -84
  356. package/dist/cjs/src/core/ResponseEngine.js.map +0 -1
  357. package/dist/cjs/src/core/ResponseModal.d.ts.map +0 -1
  358. package/dist/cjs/src/core/ResponseModal.js.map +0 -1
  359. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +0 -1
  360. package/dist/cjs/src/core/ResponsePipeline.js.map +0 -1
  361. package/dist/cjs/src/core/Route.d.ts.map +0 -1
  362. package/dist/cjs/src/core/Route.js.map +0 -1
  363. package/dist/cjs/src/core/RoutingEngine.d.ts.map +0 -1
  364. package/dist/cjs/src/core/RoutingEngine.js.map +0 -1
  365. package/dist/cjs/src/core/SessionManager.d.ts.map +0 -1
  366. package/dist/cjs/src/core/SessionManager.js.map +0 -1
  367. package/dist/cjs/src/core/Step.d.ts.map +0 -1
  368. package/dist/cjs/src/core/Step.js.map +0 -1
  369. package/dist/cjs/src/core/ToolManager.d.ts.map +0 -1
  370. package/dist/cjs/src/core/ToolManager.js.map +0 -1
  371. package/dist/cjs/src/index.d.ts.map +0 -1
  372. package/dist/cjs/src/index.js.map +0 -1
  373. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +0 -1
  374. package/dist/cjs/src/providers/AnthropicProvider.js.map +0 -1
  375. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +0 -1
  376. package/dist/cjs/src/providers/GeminiProvider.js.map +0 -1
  377. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +0 -1
  378. package/dist/cjs/src/providers/OpenAIProvider.js.map +0 -1
  379. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +0 -1
  380. package/dist/cjs/src/providers/OpenRouterProvider.js.map +0 -1
  381. package/dist/cjs/src/providers/index.d.ts.map +0 -1
  382. package/dist/cjs/src/providers/index.js.map +0 -1
  383. package/dist/cjs/src/types/agent.d.ts.map +0 -1
  384. package/dist/cjs/src/types/agent.js.map +0 -1
  385. package/dist/cjs/src/types/ai.d.ts.map +0 -1
  386. package/dist/cjs/src/types/ai.js.map +0 -1
  387. package/dist/cjs/src/types/history.d.ts.map +0 -1
  388. package/dist/cjs/src/types/history.js.map +0 -1
  389. package/dist/cjs/src/types/index.d.ts.map +0 -1
  390. package/dist/cjs/src/types/index.js.map +0 -1
  391. package/dist/cjs/src/types/persistence.d.ts.map +0 -1
  392. package/dist/cjs/src/types/persistence.js.map +0 -1
  393. package/dist/cjs/src/types/route.d.ts.map +0 -1
  394. package/dist/cjs/src/types/routing.d.ts.map +0 -1
  395. package/dist/cjs/src/types/schema.d.ts.map +0 -1
  396. package/dist/cjs/src/types/session.d.ts.map +0 -1
  397. package/dist/cjs/src/types/session.js.map +0 -1
  398. package/dist/cjs/src/types/template.d.ts +0 -30
  399. package/dist/cjs/src/types/template.d.ts.map +0 -1
  400. package/dist/cjs/src/types/tool.d.ts.map +0 -1
  401. package/dist/cjs/src/types/tool.js.map +0 -1
  402. package/dist/cjs/src/utils/clone.d.ts.map +0 -1
  403. package/dist/cjs/src/utils/clone.js.map +0 -1
  404. package/dist/cjs/src/utils/event.d.ts.map +0 -1
  405. package/dist/cjs/src/utils/event.js.map +0 -1
  406. package/dist/cjs/src/utils/history.d.ts.map +0 -1
  407. package/dist/cjs/src/utils/history.js.map +0 -1
  408. package/dist/cjs/src/utils/id.d.ts.map +0 -1
  409. package/dist/cjs/src/utils/id.js.map +0 -1
  410. package/dist/cjs/src/utils/index.d.ts.map +0 -1
  411. package/dist/cjs/src/utils/index.js.map +0 -1
  412. package/dist/cjs/src/utils/logger.d.ts.map +0 -1
  413. package/dist/cjs/src/utils/logger.js.map +0 -1
  414. package/dist/cjs/src/utils/retry.d.ts.map +0 -1
  415. package/dist/cjs/src/utils/retry.js.map +0 -1
  416. package/dist/cjs/src/utils/session.d.ts.map +0 -1
  417. package/dist/cjs/src/utils/session.js.map +0 -1
  418. package/dist/cjs/src/utils/template.d.ts.map +0 -1
  419. package/dist/cjs/src/utils/template.js.map +0 -1
  420. package/dist/src/adapters/MemoryAdapter.js.map +0 -1
  421. package/dist/src/adapters/MongoAdapter.js.map +0 -1
  422. package/dist/src/adapters/OpenSearchAdapter.js.map +0 -1
  423. package/dist/src/adapters/PostgreSQLAdapter.js.map +0 -1
  424. package/dist/src/adapters/PrismaAdapter.js.map +0 -1
  425. package/dist/src/adapters/RedisAdapter.js.map +0 -1
  426. package/dist/src/adapters/SQLiteAdapter.js.map +0 -1
  427. package/dist/src/adapters/index.js.map +0 -1
  428. package/dist/src/constants/index.js.map +0 -1
  429. package/dist/src/core/Agent.d.ts.map +0 -1
  430. package/dist/src/core/Agent.js.map +0 -1
  431. package/dist/src/core/Events.js.map +0 -1
  432. package/dist/src/core/PersistenceManager.js.map +0 -1
  433. package/dist/src/core/PromptComposer.d.ts.map +0 -1
  434. package/dist/src/core/PromptComposer.js.map +0 -1
  435. package/dist/src/core/ResponseEngine.js +0 -80
  436. package/dist/src/core/ResponseEngine.js.map +0 -1
  437. package/dist/src/core/ResponseModal.d.ts.map +0 -1
  438. package/dist/src/core/ResponseModal.js.map +0 -1
  439. package/dist/src/core/ResponsePipeline.d.ts.map +0 -1
  440. package/dist/src/core/ResponsePipeline.js.map +0 -1
  441. package/dist/src/core/Route.d.ts.map +0 -1
  442. package/dist/src/core/Route.js.map +0 -1
  443. package/dist/src/core/RoutingEngine.d.ts.map +0 -1
  444. package/dist/src/core/RoutingEngine.js.map +0 -1
  445. package/dist/src/core/SessionManager.js.map +0 -1
  446. package/dist/src/core/Step.d.ts.map +0 -1
  447. package/dist/src/core/Step.js.map +0 -1
  448. package/dist/src/core/ToolManager.js.map +0 -1
  449. package/dist/src/index.d.ts.map +0 -1
  450. package/dist/src/index.js.map +0 -1
  451. package/dist/src/providers/AnthropicProvider.js.map +0 -1
  452. package/dist/src/providers/GeminiProvider.js.map +0 -1
  453. package/dist/src/providers/OpenAIProvider.js.map +0 -1
  454. package/dist/src/providers/OpenRouterProvider.js.map +0 -1
  455. package/dist/src/providers/index.js.map +0 -1
  456. package/dist/src/types/agent.d.ts.map +0 -1
  457. package/dist/src/types/agent.js.map +0 -1
  458. package/dist/src/types/history.js.map +0 -1
  459. package/dist/src/types/index.js.map +0 -1
  460. package/dist/src/types/persistence.js.map +0 -1
  461. package/dist/src/types/route.d.ts.map +0 -1
  462. package/dist/src/types/template.d.ts +0 -30
  463. package/dist/src/types/template.d.ts.map +0 -1
  464. package/dist/src/types/tool.js.map +0 -1
  465. package/dist/src/utils/clone.js.map +0 -1
  466. package/dist/src/utils/event.js.map +0 -1
  467. package/dist/src/utils/history.js.map +0 -1
  468. package/dist/src/utils/id.js.map +0 -1
  469. package/dist/src/utils/index.d.ts.map +0 -1
  470. package/dist/src/utils/index.js.map +0 -1
  471. package/dist/src/utils/logger.js.map +0 -1
  472. package/dist/src/utils/retry.d.ts.map +0 -1
  473. package/dist/src/utils/retry.js.map +0 -1
  474. package/dist/src/utils/session.js.map +0 -1
  475. package/dist/src/utils/template.d.ts.map +0 -1
  476. package/dist/src/utils/template.js.map +0 -1
  477. /package/dist/{cjs/src/adapters → adapters}/MemoryAdapter.d.ts +0 -0
  478. /package/dist/{src/adapters → adapters}/MemoryAdapter.js +0 -0
  479. /package/dist/{cjs/src/adapters → adapters}/MongoAdapter.d.ts +0 -0
  480. /package/dist/{src/adapters → adapters}/MongoAdapter.js +0 -0
  481. /package/dist/{cjs/src/adapters → adapters}/OpenSearchAdapter.d.ts +0 -0
  482. /package/dist/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
  483. /package/dist/{cjs/src/adapters → adapters}/PostgreSQLAdapter.d.ts +0 -0
  484. /package/dist/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
  485. /package/dist/{cjs/src/adapters → adapters}/PrismaAdapter.d.ts +0 -0
  486. /package/dist/{cjs/src/adapters → adapters}/RedisAdapter.d.ts +0 -0
  487. /package/dist/{cjs/src/adapters → adapters}/SQLiteAdapter.d.ts +0 -0
  488. /package/dist/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
  489. /package/dist/{cjs/src/adapters → adapters}/index.d.ts +0 -0
  490. /package/dist/{src/adapters → adapters}/index.js +0 -0
  491. /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts +0 -0
  492. /package/dist/{src → cjs}/adapters/MemoryAdapter.d.ts.map +0 -0
  493. /package/dist/cjs/{src/adapters → adapters}/MemoryAdapter.js +0 -0
  494. /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts +0 -0
  495. /package/dist/{src → cjs}/adapters/MongoAdapter.d.ts.map +0 -0
  496. /package/dist/cjs/{src/adapters → adapters}/MongoAdapter.js +0 -0
  497. /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts +0 -0
  498. /package/dist/{src → cjs}/adapters/OpenSearchAdapter.d.ts.map +0 -0
  499. /package/dist/cjs/{src/adapters → adapters}/OpenSearchAdapter.js +0 -0
  500. /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts +0 -0
  501. /package/dist/{src → cjs}/adapters/PostgreSQLAdapter.d.ts.map +0 -0
  502. /package/dist/cjs/{src/adapters → adapters}/PostgreSQLAdapter.js +0 -0
  503. /package/dist/{src → cjs}/adapters/PrismaAdapter.d.ts +0 -0
  504. /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts +0 -0
  505. /package/dist/{src → cjs}/adapters/RedisAdapter.d.ts.map +0 -0
  506. /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts +0 -0
  507. /package/dist/{src → cjs}/adapters/SQLiteAdapter.d.ts.map +0 -0
  508. /package/dist/cjs/{src/adapters → adapters}/SQLiteAdapter.js +0 -0
  509. /package/dist/{src → cjs}/adapters/index.d.ts +0 -0
  510. /package/dist/{src → cjs}/adapters/index.d.ts.map +0 -0
  511. /package/dist/cjs/{src/adapters → adapters}/index.js +0 -0
  512. /package/dist/cjs/{src/constants → constants}/index.d.ts +0 -0
  513. /package/dist/{src → cjs}/constants/index.d.ts.map +0 -0
  514. /package/dist/cjs/{src/constants → constants}/index.js +0 -0
  515. /package/dist/cjs/{src/core → core}/Events.d.ts +0 -0
  516. /package/dist/{src → cjs}/core/Events.d.ts.map +0 -0
  517. /package/dist/cjs/{src/core → core}/Events.js +0 -0
  518. /package/dist/cjs/{src/core → core}/PersistenceManager.d.ts +0 -0
  519. /package/dist/{src → cjs}/core/PersistenceManager.d.ts.map +0 -0
  520. /package/dist/cjs/{src/core → core}/PersistenceManager.js +0 -0
  521. /package/dist/cjs/{src/core → core}/ResponseEngine.d.ts +0 -0
  522. /package/dist/cjs/{src/core → core}/SessionManager.d.ts +0 -0
  523. /package/dist/{src → cjs}/core/SessionManager.d.ts.map +0 -0
  524. /package/dist/cjs/{src/core → core}/SessionManager.js +0 -0
  525. /package/dist/cjs/{src/core → core}/ToolManager.d.ts +0 -0
  526. /package/dist/{src → cjs}/core/ToolManager.d.ts.map +0 -0
  527. /package/dist/cjs/{src/core → core}/ToolManager.js +0 -0
  528. /package/dist/cjs/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
  529. /package/dist/{src → cjs}/providers/AnthropicProvider.d.ts.map +0 -0
  530. /package/dist/cjs/{src/providers → providers}/GeminiProvider.d.ts +0 -0
  531. /package/dist/cjs/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
  532. /package/dist/{src → cjs}/providers/OpenAIProvider.d.ts.map +0 -0
  533. /package/dist/cjs/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
  534. /package/dist/{src → cjs}/providers/OpenRouterProvider.d.ts.map +0 -0
  535. /package/dist/cjs/{src/providers → providers}/index.d.ts +0 -0
  536. /package/dist/{src → cjs}/providers/index.d.ts.map +0 -0
  537. /package/dist/cjs/{src/providers → providers}/index.js +0 -0
  538. /package/dist/cjs/{src/types → types}/agent.js +0 -0
  539. /package/dist/cjs/{src/types → types}/ai.d.ts +0 -0
  540. /package/dist/{src → cjs}/types/ai.d.ts.map +0 -0
  541. /package/dist/cjs/{src/types → types}/ai.js +0 -0
  542. /package/dist/cjs/{src/types → types}/history.d.ts +0 -0
  543. /package/dist/{src → cjs}/types/history.d.ts.map +0 -0
  544. /package/dist/cjs/{src/types → types}/history.js +0 -0
  545. /package/dist/cjs/{src/types → types}/persistence.d.ts +0 -0
  546. /package/dist/{src → cjs}/types/persistence.d.ts.map +0 -0
  547. /package/dist/cjs/{src/types → types}/persistence.js +0 -0
  548. /package/dist/cjs/{src/types → types}/route.js +0 -0
  549. /package/dist/cjs/{src/types → types}/routing.d.ts +0 -0
  550. /package/dist/{src → cjs}/types/routing.d.ts.map +0 -0
  551. /package/dist/cjs/{src/types → types}/routing.js +0 -0
  552. /package/dist/{src → cjs}/types/routing.js.map +0 -0
  553. /package/dist/cjs/{src/types → types}/schema.d.ts +0 -0
  554. /package/dist/{src → cjs}/types/schema.d.ts.map +0 -0
  555. /package/dist/cjs/{src/types → types}/schema.js +0 -0
  556. /package/dist/{src → cjs}/types/schema.js.map +0 -0
  557. /package/dist/cjs/{src/types → types}/session.d.ts +0 -0
  558. /package/dist/{src → cjs}/types/session.d.ts.map +0 -0
  559. /package/dist/cjs/{src/types → types}/session.js +0 -0
  560. /package/dist/cjs/{src/types → types}/template.js +0 -0
  561. /package/dist/{src → cjs}/types/template.js.map +0 -0
  562. /package/dist/cjs/{src/types → types}/tool.d.ts +0 -0
  563. /package/dist/{src → cjs}/types/tool.d.ts.map +0 -0
  564. /package/dist/cjs/{src/types → types}/tool.js +0 -0
  565. /package/dist/cjs/{src/utils → utils}/clone.d.ts +0 -0
  566. /package/dist/{src → cjs}/utils/clone.d.ts.map +0 -0
  567. /package/dist/cjs/{src/utils → utils}/clone.js +0 -0
  568. /package/dist/cjs/{src/utils → utils}/event.d.ts +0 -0
  569. /package/dist/{src → cjs}/utils/event.d.ts.map +0 -0
  570. /package/dist/cjs/{src/utils → utils}/event.js +0 -0
  571. /package/dist/cjs/{src/utils → utils}/history.d.ts +0 -0
  572. /package/dist/{src → cjs}/utils/history.d.ts.map +0 -0
  573. /package/dist/cjs/{src/utils → utils}/history.js +0 -0
  574. /package/dist/cjs/{src/utils → utils}/id.d.ts +0 -0
  575. /package/dist/{src → cjs}/utils/id.d.ts.map +0 -0
  576. /package/dist/cjs/{src/utils → utils}/id.js +0 -0
  577. /package/dist/cjs/{src/utils → utils}/logger.d.ts +0 -0
  578. /package/dist/{src → cjs}/utils/logger.d.ts.map +0 -0
  579. /package/dist/cjs/{src/utils → utils}/logger.js +0 -0
  580. /package/dist/cjs/{src/utils → utils}/session.d.ts +0 -0
  581. /package/dist/{src → cjs}/utils/session.d.ts.map +0 -0
  582. /package/dist/cjs/{src/utils → utils}/session.js +0 -0
  583. /package/dist/{src/constants → constants}/index.d.ts +0 -0
  584. /package/dist/{src/constants → constants}/index.js +0 -0
  585. /package/dist/{src/core → core}/Events.d.ts +0 -0
  586. /package/dist/{src/core → core}/Events.js +0 -0
  587. /package/dist/{src/core → core}/PersistenceManager.d.ts +0 -0
  588. /package/dist/{src/core → core}/PersistenceManager.js +0 -0
  589. /package/dist/{src/core → core}/ResponseEngine.d.ts +0 -0
  590. /package/dist/{src/core → core}/SessionManager.d.ts +0 -0
  591. /package/dist/{src/core → core}/SessionManager.js +0 -0
  592. /package/dist/{src/core → core}/ToolManager.d.ts +0 -0
  593. /package/dist/{src/core → core}/ToolManager.js +0 -0
  594. /package/dist/{src/providers → providers}/AnthropicProvider.d.ts +0 -0
  595. /package/dist/{src/providers → providers}/GeminiProvider.d.ts +0 -0
  596. /package/dist/{src/providers → providers}/OpenAIProvider.d.ts +0 -0
  597. /package/dist/{src/providers → providers}/OpenRouterProvider.d.ts +0 -0
  598. /package/dist/{src/providers → providers}/index.d.ts +0 -0
  599. /package/dist/{src/providers → providers}/index.js +0 -0
  600. /package/dist/{src/types → types}/agent.js +0 -0
  601. /package/dist/{src/types → types}/ai.d.ts +0 -0
  602. /package/dist/{src/types → types}/ai.js +0 -0
  603. /package/dist/{src/types → types}/history.d.ts +0 -0
  604. /package/dist/{src/types → types}/history.js +0 -0
  605. /package/dist/{src/types → types}/persistence.d.ts +0 -0
  606. /package/dist/{src/types → types}/persistence.js +0 -0
  607. /package/dist/{src/types → types}/route.js +0 -0
  608. /package/dist/{src/types → types}/routing.d.ts +0 -0
  609. /package/dist/{src/types → types}/routing.js +0 -0
  610. /package/dist/{src/types → types}/schema.d.ts +0 -0
  611. /package/dist/{src/types → types}/schema.js +0 -0
  612. /package/dist/{src/types → types}/session.d.ts +0 -0
  613. /package/dist/{src/types → types}/session.js +0 -0
  614. /package/dist/{src/types → types}/template.js +0 -0
  615. /package/dist/{src/types → types}/tool.d.ts +0 -0
  616. /package/dist/{src/types → types}/tool.js +0 -0
  617. /package/dist/{src/utils → utils}/clone.d.ts +0 -0
  618. /package/dist/{src/utils → utils}/clone.js +0 -0
  619. /package/dist/{src/utils → utils}/event.d.ts +0 -0
  620. /package/dist/{src/utils → utils}/event.js +0 -0
  621. /package/dist/{src/utils → utils}/history.d.ts +0 -0
  622. /package/dist/{src/utils → utils}/history.js +0 -0
  623. /package/dist/{src/utils → utils}/id.d.ts +0 -0
  624. /package/dist/{src/utils → utils}/id.js +0 -0
  625. /package/dist/{src/utils → utils}/logger.d.ts +0 -0
  626. /package/dist/{src/utils → utils}/logger.js +0 -0
  627. /package/dist/{src/utils → utils}/session.d.ts +0 -0
  628. /package/dist/{src/utils → utils}/session.js +0 -0
@@ -0,0 +1,293 @@
1
+ /**
2
+ * BatchPromptBuilder - Combines multiple Step prompts into a single coherent prompt
3
+ *
4
+ * Responsible for building a combined prompt for batch execution of multiple Steps
5
+ * in a single LLM call.
6
+ *
7
+ * **Validates: Requirements 4.1, 4.2, 4.3, 4.4**
8
+ */
9
+
10
+ import type { StepOptions } from '../types/route';
11
+ import type { AgentOptions } from '../types/agent';
12
+ import type { SessionState } from '../types/session';
13
+ import type { Event } from '../types/history';
14
+ import type { Route } from './Route';
15
+ import { render, renderMany, createTemplateContext } from '../utils/template';
16
+ import { PromptComposer } from './PromptComposer';
17
+
18
+ /**
19
+ * Parameters for building a batch prompt
20
+ */
21
+ export interface BuildBatchPromptParams<TContext, TData> {
22
+ /** Steps included in this batch */
23
+ steps: StepOptions<TContext, TData>[];
24
+ /** The route containing the steps */
25
+ route: Route<TContext, TData>;
26
+ /** Conversation history */
27
+ history: Event[];
28
+ /** Agent context */
29
+ context: TContext;
30
+ /** Current session state */
31
+ session: SessionState<TData>;
32
+ /** Agent options for identity/personality */
33
+ agentOptions: AgentOptions<TContext, TData>;
34
+ }
35
+
36
+ /**
37
+ * Result of building a batch prompt
38
+ */
39
+ export interface BatchPromptResult {
40
+ /** The combined prompt string */
41
+ prompt: string;
42
+ /** All collect fields from all steps in the batch */
43
+ collectFields: string[];
44
+ /** Number of steps included in the prompt */
45
+ stepCount: number;
46
+ }
47
+
48
+ /**
49
+ * BatchPromptBuilder class - builds combined prompts for batch execution
50
+ *
51
+ * Combines multiple Step prompts into a single coherent prompt that:
52
+ * - Preserves the intent of each Step's individual prompt
53
+ * - Includes data collection instructions for all collect fields
54
+ * - Produces a single LLM call regardless of the number of Steps
55
+ *
56
+ * **Validates: Requirements 4.1, 4.2, 4.3, 4.4**
57
+ */
58
+ export class BatchPromptBuilder<TContext = unknown, TData = unknown> {
59
+ /**
60
+ * Build a combined prompt for a batch of Steps
61
+ *
62
+ * @param params - Parameters for building the batch prompt
63
+ * @returns BatchPromptResult with the combined prompt and metadata
64
+ *
65
+ * **Validates: Requirements 4.1, 4.2, 4.3, 4.4**
66
+ */
67
+ async buildBatchPrompt(params: BuildBatchPromptParams<TContext, TData>): Promise<BatchPromptResult> {
68
+ const { steps, route, history, context, session, agentOptions } = params;
69
+
70
+ // Create template context for rendering
71
+ const templateContext = createTemplateContext<TContext, TData>({
72
+ context,
73
+ data: session.data,
74
+ session,
75
+ history,
76
+ });
77
+
78
+ // Collect all collect fields from all steps
79
+ const collectFields: string[] = [];
80
+ for (const step of steps) {
81
+ if (step.collect && step.collect.length > 0) {
82
+ for (const field of step.collect) {
83
+ const fieldStr = String(field);
84
+ if (!collectFields.includes(fieldStr)) {
85
+ collectFields.push(fieldStr);
86
+ }
87
+ }
88
+ }
89
+ }
90
+
91
+ // Build the combined prompt using PromptComposer for consistency
92
+ const composer = new PromptComposer<TContext, TData>(templateContext);
93
+
94
+ // Add agent meta information
95
+ await composer.addAgentMeta(agentOptions);
96
+
97
+ // Add route-specific identity/personality if available
98
+ if (route.identity) {
99
+ const identity = await render(route.identity, templateContext);
100
+ if (identity) {
101
+ await composer.addInstruction(`**Route Identity:** ${identity}`);
102
+ }
103
+ }
104
+
105
+ if (route.personality) {
106
+ const personality = await render(route.personality, templateContext);
107
+ if (personality) {
108
+ await composer.addInstruction(`**Route Personality:** ${personality}`);
109
+ }
110
+ }
111
+
112
+ // Add knowledge base if available
113
+ await composer.addKnowledgeBase(agentOptions.knowledgeBase, route.getKnowledgeBase());
114
+
115
+ // Add glossary terms
116
+ const allTerms = [...(agentOptions.terms || []), ...route.getTerms()];
117
+ await composer.addGlossary(allTerms);
118
+
119
+ // Add guidelines
120
+ const allGuidelines = [...(agentOptions.guidelines || []), ...route.getGuidelines()];
121
+ await composer.addGuidelines(allGuidelines);
122
+
123
+ // Add combined rules (agent + route)
124
+ const allRules = [...(agentOptions.rules || []), ...route.getRules()];
125
+ if (allRules.length > 0) {
126
+ const renderedRules = await renderMany(allRules, templateContext);
127
+ if (renderedRules.length > 0) {
128
+ await composer.addInstruction(`Rules:\n- ${renderedRules.join('\n- ')}`);
129
+ }
130
+ }
131
+
132
+ // Add combined prohibitions (agent + route)
133
+ const allProhibitions = [...(agentOptions.prohibitions || []), ...route.getProhibitions()];
134
+ if (allProhibitions.length > 0) {
135
+ const renderedProhibitions = await renderMany(allProhibitions, templateContext);
136
+ if (renderedProhibitions.length > 0) {
137
+ await composer.addInstruction(`Prohibitions:\n- ${renderedProhibitions.join('\n- ')}`);
138
+ }
139
+ }
140
+
141
+ // Add interaction history
142
+ await composer.addInteractionHistory(history, 'Recent conversation context:');
143
+
144
+ // Build the step sections
145
+ const stepSections = await this.buildStepSections(steps, templateContext);
146
+
147
+ // Add the conversation flow section
148
+ if (steps.length > 1) {
149
+ await composer.addInstruction(
150
+ `## Current Conversation Flow\n\n` +
151
+ `You are handling multiple aspects of this conversation in a single response.\n\n` +
152
+ stepSections
153
+ );
154
+ } else if (steps.length === 1) {
155
+ await composer.addInstruction(
156
+ `## Current Step\n\n` +
157
+ stepSections
158
+ );
159
+ }
160
+
161
+ // Add data collection section if there are fields to collect
162
+ if (collectFields.length > 0) {
163
+ const collectionSection = this.buildDataCollectionSection(collectFields, agentOptions);
164
+ await composer.addInstruction(collectionSection);
165
+ }
166
+
167
+ // Add response format instructions
168
+ const responseFormat = this.buildResponseFormatSection(collectFields);
169
+ await composer.addInstruction(responseFormat);
170
+
171
+ // Build the final prompt
172
+ const prompt = await composer.build();
173
+
174
+ return {
175
+ prompt,
176
+ collectFields,
177
+ stepCount: steps.length,
178
+ };
179
+ }
180
+
181
+ /**
182
+ * Build the step sections of the prompt
183
+ *
184
+ * @param steps - Steps to include in the prompt
185
+ * @param templateContext - Template context for rendering
186
+ * @returns Formatted step sections string
187
+ */
188
+ private async buildStepSections(
189
+ steps: StepOptions<TContext, TData>[],
190
+ templateContext: ReturnType<typeof createTemplateContext<TContext, TData>>
191
+ ): Promise<string> {
192
+ const sections: string[] = [];
193
+
194
+ for (let i = 0; i < steps.length; i++) {
195
+ const step = steps[i];
196
+ const stepNumber = i + 1;
197
+
198
+ // Build step header
199
+ const description = step.description || `Step ${stepNumber}`;
200
+ let section = `### Step ${stepNumber}: ${description}\n`;
201
+
202
+ // Render and add step prompt if available
203
+ if (step.prompt) {
204
+ const renderedPrompt = await render(step.prompt, templateContext);
205
+ if (renderedPrompt) {
206
+ section += `\n${renderedPrompt}\n`;
207
+ }
208
+ }
209
+
210
+ // Add collect fields for this step if any
211
+ if (step.collect && step.collect.length > 0) {
212
+ const collectList = step.collect.map(f => `\`${String(f)}\``).join(', ');
213
+ section += `\n**Collect:** ${collectList}\n`;
214
+ }
215
+
216
+ sections.push(section);
217
+ }
218
+
219
+ return sections.join('\n');
220
+ }
221
+
222
+ /**
223
+ * Build the data collection section of the prompt
224
+ *
225
+ * @param collectFields - Fields to collect from the response
226
+ * @param agentOptions - Agent options containing schema information
227
+ * @returns Formatted data collection section string
228
+ */
229
+ private buildDataCollectionSection(
230
+ collectFields: string[],
231
+ agentOptions: AgentOptions<TContext, TData>
232
+ ): string {
233
+ const lines: string[] = [
234
+ '## Data Collection',
235
+ '',
236
+ 'Extract the following information from your response:',
237
+ ''
238
+ ];
239
+
240
+ // Get schema information if available
241
+ const schema = agentOptions.schema;
242
+
243
+ for (const field of collectFields) {
244
+ let fieldDescription = field;
245
+
246
+ // Try to get field type/description from schema
247
+ if (schema?.properties && schema.properties[field]) {
248
+ const fieldSchema = schema.properties[field] as Record<string, unknown>;
249
+ const rawType = fieldSchema.type;
250
+ const rawDescription = fieldSchema.description;
251
+
252
+ // Safely convert to string, handling objects and primitives
253
+ const type = typeof rawType === 'string' ? rawType : 'string';
254
+ const description = typeof rawDescription === 'string' ? rawDescription : '';
255
+
256
+ if (description) {
257
+ fieldDescription = `${field} (${type}): ${description}`;
258
+ } else {
259
+ fieldDescription = `${field} (${type})`;
260
+ }
261
+ }
262
+
263
+ lines.push(`- ${fieldDescription}`);
264
+ }
265
+
266
+ return lines.join('\n');
267
+ }
268
+
269
+ /**
270
+ * Build the response format section of the prompt
271
+ *
272
+ * @param collectFields - Fields to collect from the response
273
+ * @returns Formatted response format section string
274
+ */
275
+ private buildResponseFormatSection(collectFields: string[]): string {
276
+ const lines: string[] = [
277
+ '## Response Format',
278
+ '',
279
+ 'Return JSON with:',
280
+ '- `message`: Your response to the user'
281
+ ];
282
+
283
+ if (collectFields.length > 0) {
284
+ lines.push('');
285
+ lines.push('Include the following collected fields as top-level properties:');
286
+ for (const field of collectFields) {
287
+ lines.push(`- \`${field}\``);
288
+ }
289
+ }
290
+
291
+ return lines.join('\n');
292
+ }
293
+ }
@@ -1,13 +1,14 @@
1
1
  import type { Event, Term, Guideline, AgentOptions } from "../types";
2
2
  import type { Route } from "./Route";
3
- import { render, renderMany, formatKnowledgeBase } from "../utils/template";
3
+ import { render, renderMany, formatKnowledgeBase, createTemplateContext } from "../utils/template";
4
4
  import { TemplateContext } from "../types/template";
5
+ import { extractAIContextStrings, ConditionEvaluator } from "../utils/condition";
5
6
 
6
7
  export class PromptComposer<TContext = unknown, TData = unknown> {
7
8
  private parts: string[] = [];
8
9
  private renderContext: TemplateContext<TContext, TData>;
9
10
 
10
- constructor(context: TemplateContext<TContext, TData> = {}) {
11
+ constructor(context: TemplateContext<TContext, TData> = createTemplateContext({})) {
11
12
  this.renderContext = context;
12
13
  }
13
14
 
@@ -100,22 +101,60 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
100
101
  return this;
101
102
  }
102
103
 
103
- async addGuidelines(guidelines: Guideline<TContext>[]): Promise<this> {
104
+ async addGuidelines(guidelines: Guideline<TContext, TData>[]): Promise<this> {
104
105
  const enabled = guidelines.filter((g) => g.enabled !== false);
105
106
  if (!enabled.length) return this;
106
107
 
108
+ const evaluator = new ConditionEvaluator(this.renderContext);
109
+ const activeGuidelines: Guideline<TContext, TData>[] = [];
110
+ const allAIContextStrings: string[] = [];
111
+
112
+ // Evaluate guideline conditions to determine which are active
113
+ for (const guideline of enabled) {
114
+ if (guideline.condition) {
115
+ const evaluation = await evaluator.evaluateCondition(guideline.condition, 'AND');
116
+
117
+ // Collect AI context strings for prompt
118
+ allAIContextStrings.push(...evaluation.aiContextStrings);
119
+
120
+ // Include guideline if:
121
+ // 1. No programmatic conditions (only strings) - always active
122
+ // 2. Programmatic conditions evaluate to true
123
+ if (!evaluation.hasProgrammaticConditions || evaluation.programmaticResult) {
124
+ activeGuidelines.push(guideline);
125
+ }
126
+ } else {
127
+ // No condition means always active
128
+ activeGuidelines.push(guideline);
129
+ }
130
+ }
131
+
132
+ if (!activeGuidelines.length && !allAIContextStrings.length) return this;
133
+
107
134
  const renderedGuidelines = await Promise.all(
108
- enabled.map(async (g, i) => {
135
+ activeGuidelines.map(async (g, i) => {
109
136
  const action = await render(g.action, this.renderContext);
110
137
  if (g.condition) {
111
- const condition = await render(g.condition, this.renderContext);
112
- return `- Guideline #${i + 1}: When ${condition}, then ${action}`;
138
+ // Use AI context strings if available, otherwise render the condition
139
+ const conditionStrings = extractAIContextStrings(g.condition);
140
+ if (conditionStrings.length > 0) {
141
+ const conditionText = conditionStrings.join(" AND ");
142
+ return `- Guideline #${i + 1}: When ${conditionText}, then ${action}`;
143
+ }
113
144
  }
114
145
  return `- Guideline #${i + 1}: ${action}`;
115
146
  })
116
147
  );
117
148
 
118
- this.parts.push(`## Guidelines\n\n${renderedGuidelines.join("\n")}`);
149
+ // Add any additional AI context from inactive guidelines
150
+ if (allAIContextStrings.length > 0) {
151
+ const uniqueContextStrings = Array.from(new Set(allAIContextStrings));
152
+ const contextSection = `\n\n**Additional Context:** ${uniqueContextStrings.join(", ")}`;
153
+ this.parts.push(`## Guidelines\n\n${renderedGuidelines.join("\n")}${contextSection}`);
154
+ } else {
155
+ this.parts.push(`## Guidelines\n\n${renderedGuidelines.join("\n")}`);
156
+ }
157
+
119
158
  return this;
120
159
  }
121
160
 
@@ -143,11 +182,10 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
143
182
 
144
183
  const renderedRoutes = await Promise.all(
145
184
  routes.map(async (r, i) => {
185
+ const whenContextStrings = r.when ? extractAIContextStrings(r.when) : [];
146
186
  const conditions =
147
- r.conditions.length > 0
148
- ? `\n\n **Triggered when:** ${(
149
- await renderMany(r.conditions, this.renderContext)
150
- ).join(" OR ")}`
187
+ whenContextStrings.length > 0
188
+ ? `\n\n **Triggered when:** ${whenContextStrings.join(" OR ")}`
151
189
  : "";
152
190
  const desc = r.description
153
191
  ? `\n\n **Description:** ${r.description}`
@@ -164,12 +202,11 @@ export class PromptComposer<TContext = unknown, TData = unknown> {
164
202
  const prohibitionsInfo =
165
203
  prohibitions.length > 0
166
204
  ? `\n\n **Prohibitions:**\n ${prohibitions
167
- .map((x) => ` - ${x}`)
168
- .join("\n ")}`
205
+ .map((x) => ` - ${x}`)
206
+ .join("\n ")}`
169
207
  : "";
170
- return `### Route ${i + 1}: ${
171
- r.title
172
- }${desc}${conditions}${rulesInfo}${prohibitionsInfo}`;
208
+ return `### Route ${i + 1}: ${r.title
209
+ }${desc}${conditions}${rulesInfo}${prohibitionsInfo}`;
173
210
  })
174
211
  );
175
212
 
@@ -10,7 +10,7 @@ import type {
10
10
  import type { Route } from "./Route";
11
11
  import type { Step } from "./Step";
12
12
  import { PromptComposer } from "./PromptComposer";
13
- import { render } from "../utils/template";
13
+ import { createTemplateContext, render } from "../utils/template";
14
14
 
15
15
  export interface BuildResponsePromptParams<
16
16
  TContext = unknown,
@@ -44,36 +44,47 @@ export interface BuildFallbackPromptParams<TContext = unknown, TData = unknown>
44
44
 
45
45
  export class ResponseEngine<TContext = unknown, TData = unknown> {
46
46
  responseSchemaForRoute(
47
- route: Route<TContext, TData>,
48
- currentStep?: Step<TContext, TData>,
49
- agentSchema?: StructuredSchema
50
- ): StructuredSchema {
51
- const base: StructuredSchema = {
52
- type: "object",
53
- properties: {
54
- message: { type: "string", description: "Final user-facing message" },
55
- },
56
- required: ["message"],
57
- additionalProperties: false,
58
- };
47
+ route: Route<TContext, TData>,
48
+ currentStep?: Step<TContext, TData>,
49
+ agentSchema?: StructuredSchema
50
+ ): StructuredSchema {
51
+ const base: StructuredSchema = {
52
+ type: "object",
53
+ properties: {
54
+ message: { type: "string", description: "Final user-facing message" },
55
+ },
56
+ required: ["message"],
57
+ additionalProperties: false,
58
+ };
59
59
 
60
- // Add data field only if route has responseOutputSchema
61
- if (route.responseOutputSchema) {
62
- base.properties!.data = route.responseOutputSchema;
63
- }
60
+ // Add data field only if route has responseOutputSchema
61
+ if (route.responseOutputSchema) {
62
+ base.properties!.data = route.responseOutputSchema;
63
+ }
64
64
 
65
- // Add collect fields from current step using agent-level schema
66
- if (currentStep?.collect && agentSchema?.properties) {
67
- for (const field of currentStep.collect) {
68
- const fieldSchema = agentSchema.properties[field as string];
69
- if (fieldSchema) {
70
- base.properties![field as string] = fieldSchema;
65
+ // Add collect fields from current step
66
+ if (currentStep?.collect) {
67
+ if (agentSchema?.properties) {
68
+ // Use agent schema definitions for collect fields
69
+ for (const field of currentStep.collect) {
70
+ const fieldSchema = agentSchema.properties[field as string];
71
+ if (fieldSchema) {
72
+ base.properties![field as string] = fieldSchema;
73
+ }
74
+ }
75
+ } else {
76
+ // No agent schema - generate dynamic schema from collect fields
77
+ for (const field of currentStep.collect) {
78
+ base.properties![field as string] = {
79
+ type: "string",
80
+ description: `Collected value for ${String(field)}`,
81
+ };
82
+ }
71
83
  }
72
84
  }
73
- }
74
85
 
75
- return base;
76
- }
86
+ return base;
87
+ }
77
88
 
78
89
  async buildResponsePrompt(
79
90
  params: BuildResponsePromptParams<TContext, TData>
@@ -91,8 +102,9 @@ export class ResponseEngine<TContext = unknown, TData = unknown> {
91
102
  combinedTerms,
92
103
  context,
93
104
  session,
105
+ agentSchema,
94
106
  } = params;
95
- const templateContext = { context, session, history };
107
+ const templateContext = createTemplateContext({ context, session, history });
96
108
  const pc = new PromptComposer(templateContext);
97
109
 
98
110
  // Create combined agent options with route overrides
@@ -143,9 +155,136 @@ export class ResponseEngine<TContext = unknown, TData = unknown> {
143
155
 
144
156
  await pc.addInteractionHistory(history);
145
157
  await pc.addLastMessage(lastMessage);
158
+
159
+ // Add data collection instructions - include ALL route fields, not just current step
160
+ // Collect all fields from route's required and optional fields
161
+ const allRouteFields = new Set<string>();
162
+
163
+ if (route.requiredFields) {
164
+ route.requiredFields.forEach(field => allRouteFields.add(String(field)));
165
+ }
166
+ if (route.optionalFields) {
167
+ route.optionalFields.forEach(field => allRouteFields.add(String(field)));
168
+ }
169
+ if (currentStep?.collect) {
170
+ currentStep.collect.forEach(field => allRouteFields.add(String(field)));
171
+ }
172
+
173
+ if (allRouteFields.size > 0) {
174
+ const stepCollectFields = new Set(currentStep?.collect?.map(f => String(f)) || []);
175
+ const fieldDescriptions: string[] = [];
176
+
177
+ for (const field of allRouteFields) {
178
+ if (agentSchema?.properties) {
179
+ const fieldSchema = agentSchema.properties[field];
180
+ if (fieldSchema) {
181
+ const fieldName = field;
182
+ const fieldDesc = fieldSchema.description || fieldName;
183
+ const fieldType = Array.isArray(fieldSchema.type) ? fieldSchema.type[0] : fieldSchema.type;
184
+
185
+ let fieldInfo = ` • ${fieldName} (${fieldType})`;
186
+
187
+ // Add enum values if present
188
+ if (fieldSchema.enum && Array.isArray(fieldSchema.enum)) {
189
+ fieldInfo += ` [${fieldSchema.enum.join(' | ')}]`;
190
+ }
191
+
192
+ // Add description
193
+ fieldInfo += `: ${fieldDesc}`;
194
+
195
+ // Mark if this is the current step's focus
196
+ if (stepCollectFields.has(field)) {
197
+ fieldInfo += ` ← FOCUS FOR THIS STEP`;
198
+ }
199
+
200
+ fieldDescriptions.push(fieldInfo);
201
+ }
202
+ } else {
203
+ // No agent schema - generate dynamic description from field name
204
+ let fieldInfo = ` • ${field} (string): ${field}`;
205
+ if (stepCollectFields.has(field)) {
206
+ fieldInfo += ` ← FOCUS FOR THIS STEP`;
207
+ }
208
+ fieldDescriptions.push(fieldInfo);
209
+ }
210
+ }
211
+
212
+ if (fieldDescriptions.length > 0) {
213
+ const instruction = [
214
+ `## Data Collection Rules`,
215
+ ``,
216
+ `CRITICAL: You MUST extract ALL relevant information from the user's message, not just what this step asks for.`,
217
+ ``,
218
+ `Available fields to extract:`,
219
+ ...fieldDescriptions,
220
+ ``,
221
+ `**How to collect data:**`,
222
+ `1. Read the user's message carefully`,
223
+ `2. Extract EVERY piece of information that matches ANY field above`,
224
+ `3. Users often provide multiple details at once (e.g., "I need a checkup next Tuesday at 2 PM")`,
225
+ `4. Include ALL extracted fields in your JSON response as top-level properties`,
226
+ `5. Field names must match EXACTLY as shown above`,
227
+ `6. Only include fields that the user actually mentioned`,
228
+ ``,
229
+ `**Example:** If user says "I need a checkup next Tuesday at 2 PM", extract:`,
230
+ `- appointmentType: "checkup"`,
231
+ `- preferredDate: "next Tuesday"`,
232
+ `- preferredTime: "2 PM"`,
233
+ ].join('\n');
234
+
235
+ await pc.addInstruction(instruction);
236
+ }
237
+ }
238
+
239
+ // Add response format instructions with explicit JSON structure
240
+ // Generate example JSON based on actual schema fields
241
+ const exampleFields: string[] = [' "message": "your response to the user"'];
242
+
243
+ for (const field of allRouteFields) {
244
+ if (agentSchema?.properties) {
245
+ const fieldSchema = agentSchema.properties[field];
246
+ if (fieldSchema) {
247
+ const fieldType = Array.isArray(fieldSchema.type) ? fieldSchema.type[0] : fieldSchema.type;
248
+ let exampleValue = '"value if extracted"';
249
+
250
+ // Generate type-appropriate example
251
+ if (fieldSchema.enum && Array.isArray(fieldSchema.enum) && fieldSchema.enum.length > 0) {
252
+ exampleValue = `"${fieldSchema.enum[0]}"`;
253
+ } else if (fieldType === 'string') {
254
+ exampleValue = '"extracted value"';
255
+ } else if (fieldType === 'number' || fieldType === 'integer') {
256
+ exampleValue = '0';
257
+ } else if (fieldType === 'boolean') {
258
+ exampleValue = 'true';
259
+ }
260
+
261
+ exampleFields.push(` "${field}": ${exampleValue}`);
262
+ }
263
+ } else {
264
+ // No agent schema - use string as default
265
+ exampleFields.push(` "${field}": "extracted value"`);
266
+ }
267
+ }
268
+
146
269
  await pc.addInstruction(
147
- "Return ONLY JSON matching the schema. The 'message' field is required."
270
+ [
271
+ `## Response Format`,
272
+ ``,
273
+ `You MUST return ONLY valid JSON in this exact format:`,
274
+ `{`,
275
+ ...exampleFields.map((f, i) => i < exampleFields.length - 1 ? `${f},` : f),
276
+ `}`,
277
+ ``,
278
+ `CRITICAL RULES:`,
279
+ `- Return ONLY the JSON object, no other text`,
280
+ `- The "message" field is REQUIRED and must contain your response to the user`,
281
+ `- Include ALL extracted data fields as top-level properties`,
282
+ `- Only include data fields that were actually mentioned by the user`,
283
+ `- Do not wrap the JSON in markdown code blocks`,
284
+ `- Do not add any explanatory text before or after the JSON`,
285
+ ].join('\n')
148
286
  );
287
+
149
288
  return pc.build();
150
289
  }
151
290
 
@@ -154,7 +293,7 @@ export class ResponseEngine<TContext = unknown, TData = unknown> {
154
293
  ): Promise<string> {
155
294
  const { history, agentOptions, terms, guidelines, context, session } =
156
295
  params;
157
- const templateContext = { context, session, history };
296
+ const templateContext = createTemplateContext({ context, session, history });
158
297
  const pc = new PromptComposer(templateContext);
159
298
 
160
299
  await pc.addAgentMeta(agentOptions);