@falai/agent 3.4.5 → 4.0.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 (847) hide show
  1. package/README.md +41 -34
  2. package/dist/cjs/core/Agent.d.ts +22 -378
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +104 -1178
  5. package/dist/cjs/core/Agent.js.map +1 -1
  6. package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
  7. package/dist/cjs/core/CompactionEngine.js +5 -3
  8. package/dist/cjs/core/CompactionEngine.js.map +1 -1
  9. package/dist/cjs/core/FlowSpec.d.ts +136 -0
  10. package/dist/cjs/core/FlowSpec.d.ts.map +1 -0
  11. package/dist/cjs/core/FlowSpec.js +522 -0
  12. package/dist/cjs/core/FlowSpec.js.map +1 -0
  13. package/dist/cjs/core/Migrate.d.ts +38 -0
  14. package/dist/cjs/core/Migrate.d.ts.map +1 -0
  15. package/dist/cjs/core/Migrate.js +270 -0
  16. package/dist/cjs/core/Migrate.js.map +1 -0
  17. package/dist/cjs/core/Prompt.d.ts +54 -0
  18. package/dist/cjs/core/Prompt.d.ts.map +1 -0
  19. package/dist/cjs/core/Prompt.js +143 -0
  20. package/dist/cjs/core/Prompt.js.map +1 -0
  21. package/dist/cjs/core/Runner.d.ts +160 -0
  22. package/dist/cjs/core/Runner.d.ts.map +1 -0
  23. package/dist/cjs/core/Runner.js +1131 -0
  24. package/dist/cjs/core/Runner.js.map +1 -0
  25. package/dist/cjs/core/Speak.d.ts +37 -0
  26. package/dist/cjs/core/Speak.d.ts.map +1 -0
  27. package/dist/cjs/core/Speak.js +364 -0
  28. package/dist/cjs/core/Speak.js.map +1 -0
  29. package/dist/cjs/core/Understand.d.ts +28 -0
  30. package/dist/cjs/core/Understand.d.ts.map +1 -0
  31. package/dist/cjs/core/Understand.js +353 -0
  32. package/dist/cjs/core/Understand.js.map +1 -0
  33. package/dist/cjs/core/contracts.d.ts +122 -0
  34. package/dist/cjs/core/contracts.d.ts.map +1 -0
  35. package/dist/cjs/core/contracts.js +11 -0
  36. package/dist/cjs/core/contracts.js.map +1 -0
  37. package/dist/cjs/core/falai.d.ts +57 -0
  38. package/dist/cjs/core/falai.d.ts.map +1 -0
  39. package/dist/cjs/core/falai.js +43 -0
  40. package/dist/cjs/core/falai.js.map +1 -0
  41. package/dist/cjs/core/predicate.d.ts +9 -0
  42. package/dist/cjs/core/predicate.d.ts.map +1 -0
  43. package/dist/cjs/core/predicate.js +58 -0
  44. package/dist/cjs/core/predicate.js.map +1 -0
  45. package/dist/cjs/index.d.ts +26 -31
  46. package/dist/cjs/index.d.ts.map +1 -1
  47. package/dist/cjs/index.js +46 -68
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/persistence/MemoryStore.d.ts +15 -0
  50. package/dist/cjs/persistence/MemoryStore.d.ts.map +1 -0
  51. package/dist/cjs/persistence/MemoryStore.js +39 -0
  52. package/dist/cjs/persistence/MemoryStore.js.map +1 -0
  53. package/dist/cjs/persistence/MongoStore.d.ts +42 -0
  54. package/dist/cjs/persistence/MongoStore.d.ts.map +1 -0
  55. package/dist/cjs/persistence/MongoStore.js +60 -0
  56. package/dist/cjs/persistence/MongoStore.js.map +1 -0
  57. package/dist/cjs/persistence/OpenSearchStore.d.ts +86 -0
  58. package/dist/cjs/persistence/OpenSearchStore.d.ts.map +1 -0
  59. package/dist/cjs/persistence/OpenSearchStore.js +120 -0
  60. package/dist/cjs/persistence/OpenSearchStore.js.map +1 -0
  61. package/dist/cjs/persistence/PostgresStore.d.ts +41 -0
  62. package/dist/cjs/persistence/PostgresStore.d.ts.map +1 -0
  63. package/dist/cjs/persistence/PostgresStore.js +58 -0
  64. package/dist/cjs/persistence/PostgresStore.js.map +1 -0
  65. package/dist/cjs/persistence/PrismaStore.d.ts +65 -0
  66. package/dist/cjs/persistence/PrismaStore.d.ts.map +1 -0
  67. package/dist/cjs/persistence/PrismaStore.js +95 -0
  68. package/dist/cjs/persistence/PrismaStore.js.map +1 -0
  69. package/dist/cjs/persistence/RedisStore.d.ts +34 -0
  70. package/dist/cjs/persistence/RedisStore.d.ts.map +1 -0
  71. package/dist/cjs/persistence/RedisStore.js +61 -0
  72. package/dist/cjs/persistence/RedisStore.js.map +1 -0
  73. package/dist/cjs/persistence/SQLiteStore.d.ts +45 -0
  74. package/dist/cjs/persistence/SQLiteStore.d.ts.map +1 -0
  75. package/dist/cjs/persistence/SQLiteStore.js +74 -0
  76. package/dist/cjs/persistence/SQLiteStore.js.map +1 -0
  77. package/dist/cjs/persistence/sessionRow.d.ts +14 -0
  78. package/dist/cjs/persistence/sessionRow.d.ts.map +1 -0
  79. package/dist/cjs/persistence/sessionRow.js +50 -0
  80. package/dist/cjs/persistence/sessionRow.js.map +1 -0
  81. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  82. package/dist/cjs/providers/DeepSeekProvider.js +8 -3
  83. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  84. package/dist/cjs/providers/GeminiProvider.d.ts +4 -3
  85. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  86. package/dist/cjs/providers/GeminiProvider.js +4 -3
  87. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  88. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +4 -0
  89. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  90. package/dist/cjs/providers/OpenAICompatibleProvider.js +2 -0
  91. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  92. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  93. package/dist/cjs/providers/OpenRouterProvider.js +2 -4
  94. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  95. package/dist/cjs/providers/ProviderAdapter.d.ts +1 -1
  96. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -1
  97. package/dist/cjs/providers/ProviderAdapter.js +33 -10
  98. package/dist/cjs/providers/ProviderAdapter.js.map +1 -1
  99. package/dist/cjs/types/agent.d.ts +153 -383
  100. package/dist/cjs/types/agent.d.ts.map +1 -1
  101. package/dist/cjs/types/agent.js +1 -1
  102. package/dist/cjs/types/ai.d.ts +32 -1
  103. package/dist/cjs/types/ai.d.ts.map +1 -1
  104. package/dist/cjs/types/compaction.d.ts +3 -1
  105. package/dist/cjs/types/compaction.d.ts.map +1 -1
  106. package/dist/cjs/types/errors.d.ts +9 -12
  107. package/dist/cjs/types/errors.d.ts.map +1 -1
  108. package/dist/cjs/types/errors.js +14 -17
  109. package/dist/cjs/types/errors.js.map +1 -1
  110. package/dist/cjs/types/flow.d.ts +265 -513
  111. package/dist/cjs/types/flow.d.ts.map +1 -1
  112. package/dist/cjs/types/flow.js +7 -1
  113. package/dist/cjs/types/flow.js.map +1 -1
  114. package/dist/cjs/types/history.d.ts +7 -18
  115. package/dist/cjs/types/history.d.ts.map +1 -1
  116. package/dist/cjs/types/history.js.map +1 -1
  117. package/dist/cjs/types/index.d.ts +9 -15
  118. package/dist/cjs/types/index.d.ts.map +1 -1
  119. package/dist/cjs/types/index.js +4 -14
  120. package/dist/cjs/types/index.js.map +1 -1
  121. package/dist/cjs/types/session.d.ts +94 -64
  122. package/dist/cjs/types/session.d.ts.map +1 -1
  123. package/dist/cjs/types/session.js +5 -1
  124. package/dist/cjs/types/session.js.map +1 -1
  125. package/dist/cjs/types/tool.d.ts +37 -207
  126. package/dist/cjs/types/tool.d.ts.map +1 -1
  127. package/dist/cjs/types/tool.js +5 -14
  128. package/dist/cjs/types/tool.js.map +1 -1
  129. package/dist/cjs/utils/clock.d.ts +28 -0
  130. package/dist/cjs/utils/clock.d.ts.map +1 -0
  131. package/dist/cjs/utils/clock.js +64 -0
  132. package/dist/cjs/utils/clock.js.map +1 -0
  133. package/dist/cjs/utils/duration.d.ts +11 -0
  134. package/dist/cjs/utils/duration.d.ts.map +1 -0
  135. package/dist/cjs/utils/duration.js +31 -0
  136. package/dist/cjs/utils/duration.js.map +1 -0
  137. package/dist/cjs/utils/history.d.ts +4 -1
  138. package/dist/cjs/utils/history.d.ts.map +1 -1
  139. package/dist/cjs/utils/history.js +2 -2
  140. package/dist/cjs/utils/history.js.map +1 -1
  141. package/dist/cjs/utils/index.d.ts +4 -10
  142. package/dist/cjs/utils/index.d.ts.map +1 -1
  143. package/dist/cjs/utils/index.js +14 -61
  144. package/dist/cjs/utils/index.js.map +1 -1
  145. package/dist/cjs/utils/json.d.ts +2 -0
  146. package/dist/cjs/utils/json.d.ts.map +1 -1
  147. package/dist/cjs/utils/json.js +5 -0
  148. package/dist/cjs/utils/json.js.map +1 -1
  149. package/dist/cjs/utils/outcomes.d.ts +48 -0
  150. package/dist/cjs/utils/outcomes.d.ts.map +1 -0
  151. package/dist/cjs/utils/outcomes.js +51 -0
  152. package/dist/cjs/utils/outcomes.js.map +1 -0
  153. package/dist/cjs/utils/schema.d.ts +50 -0
  154. package/dist/cjs/utils/schema.d.ts.map +1 -0
  155. package/dist/cjs/utils/schema.js +138 -0
  156. package/dist/cjs/utils/schema.js.map +1 -0
  157. package/dist/cjs/utils/streamingMessage.d.ts +3 -2
  158. package/dist/cjs/utils/streamingMessage.d.ts.map +1 -1
  159. package/dist/cjs/utils/streamingMessage.js +38 -4
  160. package/dist/cjs/utils/streamingMessage.js.map +1 -1
  161. package/dist/cjs/utils/template.d.ts +13 -149
  162. package/dist/cjs/utils/template.d.ts.map +1 -1
  163. package/dist/cjs/utils/template.js +31 -363
  164. package/dist/cjs/utils/template.js.map +1 -1
  165. package/dist/cjs/utils/usage.d.ts +19 -0
  166. package/dist/cjs/utils/usage.d.ts.map +1 -0
  167. package/dist/cjs/utils/usage.js +35 -0
  168. package/dist/cjs/utils/usage.js.map +1 -0
  169. package/dist/core/Agent.d.ts +22 -378
  170. package/dist/core/Agent.d.ts.map +1 -1
  171. package/dist/core/Agent.js +107 -1181
  172. package/dist/core/Agent.js.map +1 -1
  173. package/dist/core/CompactionEngine.d.ts.map +1 -1
  174. package/dist/core/CompactionEngine.js +5 -3
  175. package/dist/core/CompactionEngine.js.map +1 -1
  176. package/dist/core/FlowSpec.d.ts +136 -0
  177. package/dist/core/FlowSpec.d.ts.map +1 -0
  178. package/dist/core/FlowSpec.js +516 -0
  179. package/dist/core/FlowSpec.js.map +1 -0
  180. package/dist/core/Migrate.d.ts +38 -0
  181. package/dist/core/Migrate.d.ts.map +1 -0
  182. package/dist/core/Migrate.js +264 -0
  183. package/dist/core/Migrate.js.map +1 -0
  184. package/dist/core/Prompt.d.ts +54 -0
  185. package/dist/core/Prompt.d.ts.map +1 -0
  186. package/dist/core/Prompt.js +133 -0
  187. package/dist/core/Prompt.js.map +1 -0
  188. package/dist/core/Runner.d.ts +160 -0
  189. package/dist/core/Runner.d.ts.map +1 -0
  190. package/dist/core/Runner.js +1127 -0
  191. package/dist/core/Runner.js.map +1 -0
  192. package/dist/core/Speak.d.ts +37 -0
  193. package/dist/core/Speak.d.ts.map +1 -0
  194. package/dist/core/Speak.js +360 -0
  195. package/dist/core/Speak.js.map +1 -0
  196. package/dist/core/Understand.d.ts +28 -0
  197. package/dist/core/Understand.d.ts.map +1 -0
  198. package/dist/core/Understand.js +349 -0
  199. package/dist/core/Understand.js.map +1 -0
  200. package/dist/core/contracts.d.ts +122 -0
  201. package/dist/core/contracts.d.ts.map +1 -0
  202. package/dist/core/contracts.js +10 -0
  203. package/dist/core/contracts.js.map +1 -0
  204. package/dist/core/falai.d.ts +57 -0
  205. package/dist/core/falai.d.ts.map +1 -0
  206. package/dist/core/falai.js +40 -0
  207. package/dist/core/falai.js.map +1 -0
  208. package/dist/core/predicate.d.ts +9 -0
  209. package/dist/core/predicate.d.ts.map +1 -0
  210. package/dist/core/predicate.js +54 -0
  211. package/dist/core/predicate.js.map +1 -0
  212. package/dist/index.d.ts +26 -31
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js +19 -24
  215. package/dist/index.js.map +1 -1
  216. package/dist/persistence/MemoryStore.d.ts +15 -0
  217. package/dist/persistence/MemoryStore.d.ts.map +1 -0
  218. package/dist/persistence/MemoryStore.js +35 -0
  219. package/dist/persistence/MemoryStore.js.map +1 -0
  220. package/dist/persistence/MongoStore.d.ts +42 -0
  221. package/dist/persistence/MongoStore.d.ts.map +1 -0
  222. package/dist/persistence/MongoStore.js +56 -0
  223. package/dist/persistence/MongoStore.js.map +1 -0
  224. package/dist/persistence/OpenSearchStore.d.ts +86 -0
  225. package/dist/persistence/OpenSearchStore.d.ts.map +1 -0
  226. package/dist/persistence/OpenSearchStore.js +116 -0
  227. package/dist/persistence/OpenSearchStore.js.map +1 -0
  228. package/dist/persistence/PostgresStore.d.ts +41 -0
  229. package/dist/persistence/PostgresStore.d.ts.map +1 -0
  230. package/dist/persistence/PostgresStore.js +54 -0
  231. package/dist/persistence/PostgresStore.js.map +1 -0
  232. package/dist/persistence/PrismaStore.d.ts +65 -0
  233. package/dist/persistence/PrismaStore.d.ts.map +1 -0
  234. package/dist/persistence/PrismaStore.js +91 -0
  235. package/dist/persistence/PrismaStore.js.map +1 -0
  236. package/dist/persistence/RedisStore.d.ts +34 -0
  237. package/dist/persistence/RedisStore.d.ts.map +1 -0
  238. package/dist/persistence/RedisStore.js +57 -0
  239. package/dist/persistence/RedisStore.js.map +1 -0
  240. package/dist/persistence/SQLiteStore.d.ts +45 -0
  241. package/dist/persistence/SQLiteStore.d.ts.map +1 -0
  242. package/dist/persistence/SQLiteStore.js +70 -0
  243. package/dist/persistence/SQLiteStore.js.map +1 -0
  244. package/dist/persistence/sessionRow.d.ts +14 -0
  245. package/dist/persistence/sessionRow.d.ts.map +1 -0
  246. package/dist/persistence/sessionRow.js +45 -0
  247. package/dist/persistence/sessionRow.js.map +1 -0
  248. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  249. package/dist/providers/DeepSeekProvider.js +8 -3
  250. package/dist/providers/DeepSeekProvider.js.map +1 -1
  251. package/dist/providers/GeminiProvider.d.ts +4 -3
  252. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  253. package/dist/providers/GeminiProvider.js +4 -3
  254. package/dist/providers/GeminiProvider.js.map +1 -1
  255. package/dist/providers/OpenAICompatibleProvider.d.ts +4 -0
  256. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  257. package/dist/providers/OpenAICompatibleProvider.js +2 -0
  258. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  259. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  260. package/dist/providers/OpenRouterProvider.js +2 -4
  261. package/dist/providers/OpenRouterProvider.js.map +1 -1
  262. package/dist/providers/ProviderAdapter.d.ts +1 -1
  263. package/dist/providers/ProviderAdapter.d.ts.map +1 -1
  264. package/dist/providers/ProviderAdapter.js +34 -11
  265. package/dist/providers/ProviderAdapter.js.map +1 -1
  266. package/dist/types/agent.d.ts +153 -383
  267. package/dist/types/agent.d.ts.map +1 -1
  268. package/dist/types/agent.js +1 -1
  269. package/dist/types/ai.d.ts +32 -1
  270. package/dist/types/ai.d.ts.map +1 -1
  271. package/dist/types/compaction.d.ts +3 -1
  272. package/dist/types/compaction.d.ts.map +1 -1
  273. package/dist/types/errors.d.ts +9 -12
  274. package/dist/types/errors.d.ts.map +1 -1
  275. package/dist/types/errors.js +12 -15
  276. package/dist/types/errors.js.map +1 -1
  277. package/dist/types/flow.d.ts +265 -513
  278. package/dist/types/flow.d.ts.map +1 -1
  279. package/dist/types/flow.js +7 -1
  280. package/dist/types/flow.js.map +1 -1
  281. package/dist/types/history.d.ts +7 -18
  282. package/dist/types/history.d.ts.map +1 -1
  283. package/dist/types/history.js.map +1 -1
  284. package/dist/types/index.d.ts +9 -15
  285. package/dist/types/index.d.ts.map +1 -1
  286. package/dist/types/index.js +2 -7
  287. package/dist/types/index.js.map +1 -1
  288. package/dist/types/session.d.ts +94 -64
  289. package/dist/types/session.d.ts.map +1 -1
  290. package/dist/types/session.js +5 -1
  291. package/dist/types/session.js.map +1 -1
  292. package/dist/types/tool.d.ts +37 -207
  293. package/dist/types/tool.d.ts.map +1 -1
  294. package/dist/types/tool.js +6 -13
  295. package/dist/types/tool.js.map +1 -1
  296. package/dist/utils/clock.d.ts +28 -0
  297. package/dist/utils/clock.d.ts.map +1 -0
  298. package/dist/utils/clock.js +59 -0
  299. package/dist/utils/clock.js.map +1 -0
  300. package/dist/utils/duration.d.ts +11 -0
  301. package/dist/utils/duration.d.ts.map +1 -0
  302. package/dist/utils/duration.js +26 -0
  303. package/dist/utils/duration.js.map +1 -0
  304. package/dist/utils/history.d.ts +4 -1
  305. package/dist/utils/history.d.ts.map +1 -1
  306. package/dist/utils/history.js +2 -2
  307. package/dist/utils/history.js.map +1 -1
  308. package/dist/utils/index.d.ts +4 -10
  309. package/dist/utils/index.d.ts.map +1 -1
  310. package/dist/utils/index.js +4 -21
  311. package/dist/utils/index.js.map +1 -1
  312. package/dist/utils/json.d.ts +2 -0
  313. package/dist/utils/json.d.ts.map +1 -1
  314. package/dist/utils/json.js +4 -0
  315. package/dist/utils/json.js.map +1 -1
  316. package/dist/utils/outcomes.d.ts +48 -0
  317. package/dist/utils/outcomes.d.ts.map +1 -0
  318. package/dist/utils/outcomes.js +48 -0
  319. package/dist/utils/outcomes.js.map +1 -0
  320. package/dist/utils/schema.d.ts +50 -0
  321. package/dist/utils/schema.d.ts.map +1 -0
  322. package/dist/utils/schema.js +129 -0
  323. package/dist/utils/schema.js.map +1 -0
  324. package/dist/utils/streamingMessage.d.ts +3 -2
  325. package/dist/utils/streamingMessage.d.ts.map +1 -1
  326. package/dist/utils/streamingMessage.js +38 -4
  327. package/dist/utils/streamingMessage.js.map +1 -1
  328. package/dist/utils/template.d.ts +13 -149
  329. package/dist/utils/template.d.ts.map +1 -1
  330. package/dist/utils/template.js +28 -355
  331. package/dist/utils/template.js.map +1 -1
  332. package/dist/utils/usage.d.ts +19 -0
  333. package/dist/utils/usage.d.ts.map +1 -0
  334. package/dist/utils/usage.js +31 -0
  335. package/dist/utils/usage.js.map +1 -0
  336. package/docs/README.md +37 -19
  337. package/docs/concepts/architecture.md +117 -239
  338. package/docs/concepts/collection.md +170 -0
  339. package/docs/concepts/pipeline.md +132 -378
  340. package/docs/concepts/runs-and-waits.md +192 -0
  341. package/docs/guides/actions-and-events.md +276 -0
  342. package/docs/guides/branching.md +119 -208
  343. package/docs/guides/compaction.md +63 -158
  344. package/docs/guides/conditions.md +164 -128
  345. package/docs/guides/error-handling.md +168 -164
  346. package/docs/guides/flow-control.md +210 -349
  347. package/docs/guides/flows-from-json.md +224 -0
  348. package/docs/guides/instructions.md +125 -161
  349. package/docs/guides/persistence.md +182 -206
  350. package/docs/guides/streaming.md +50 -114
  351. package/docs/guides/testing.md +284 -0
  352. package/docs/guides/triggers.md +401 -0
  353. package/docs/migration/README.md +8 -15
  354. package/docs/migration/v1-to-v2.md +1 -1
  355. package/docs/migration/v2-3-to-v2-4.md +2 -2
  356. package/docs/migration/v2-6-to-v2-7.md +4 -4
  357. package/docs/migration/v3-to-v4.md +452 -0
  358. package/docs/reference/actions-events-conditions.md +396 -0
  359. package/docs/reference/agent.md +244 -0
  360. package/docs/reference/branches.md +75 -203
  361. package/docs/reference/errors.md +188 -144
  362. package/docs/reference/fields.md +125 -0
  363. package/docs/reference/flow-spec.md +248 -0
  364. package/docs/reference/flow.md +104 -192
  365. package/docs/reference/instruction.md +83 -137
  366. package/docs/reference/outcomes.md +273 -0
  367. package/docs/reference/providers.md +525 -302
  368. package/docs/reference/session.md +210 -0
  369. package/docs/reference/step.md +194 -312
  370. package/docs/reference/stores.md +496 -0
  371. package/docs/reference/tool.md +162 -231
  372. package/docs/reference/trigger.md +180 -0
  373. package/docs/rfc/v4-one-flow.md +477 -0
  374. package/docs/start/01-install.md +59 -44
  375. package/docs/start/02-first-agent.md +97 -147
  376. package/docs/start/03-collect-data.md +78 -183
  377. package/docs/start/04-add-tools.md +159 -227
  378. package/docs/start/05-go-to-production.md +167 -164
  379. package/examples/01-quickstart.ts +26 -16
  380. package/examples/02-fields.ts +75 -0
  381. package/examples/03-tools.ts +79 -119
  382. package/examples/04-instructions.ts +60 -87
  383. package/examples/05-branches.ts +78 -0
  384. package/examples/06-triggers-and-waits.ts +148 -0
  385. package/examples/07-streaming.ts +34 -60
  386. package/examples/08-store-and-migration.ts +97 -0
  387. package/examples/09-flows-from-json.ts +107 -0
  388. package/package.json +9 -6
  389. package/src/core/Agent.ts +116 -1512
  390. package/src/core/CompactionEngine.ts +7 -4
  391. package/src/core/FlowSpec.ts +712 -0
  392. package/src/core/Migrate.ts +256 -0
  393. package/src/core/Prompt.ts +156 -0
  394. package/src/core/Runner.ts +1181 -0
  395. package/src/core/Speak.ts +451 -0
  396. package/src/core/Understand.ts +422 -0
  397. package/src/core/contracts.ts +111 -0
  398. package/src/core/falai.ts +86 -0
  399. package/src/core/predicate.ts +56 -0
  400. package/src/index.ts +119 -147
  401. package/src/persistence/MemoryStore.ts +37 -0
  402. package/src/persistence/MongoStore.ts +89 -0
  403. package/src/persistence/OpenSearchStore.ts +153 -0
  404. package/src/persistence/PostgresStore.ts +89 -0
  405. package/src/persistence/PrismaStore.ts +127 -0
  406. package/src/persistence/RedisStore.ts +90 -0
  407. package/src/persistence/SQLiteStore.ts +103 -0
  408. package/src/persistence/sessionRow.ts +45 -0
  409. package/src/providers/DeepSeekProvider.ts +8 -3
  410. package/src/providers/GeminiProvider.ts +4 -3
  411. package/src/providers/OpenAICompatibleProvider.ts +6 -0
  412. package/src/providers/OpenRouterProvider.ts +2 -4
  413. package/src/providers/ProviderAdapter.ts +36 -8
  414. package/src/types/agent.ts +124 -397
  415. package/src/types/ai.ts +33 -1
  416. package/src/types/compaction.ts +3 -1
  417. package/src/types/errors.ts +13 -16
  418. package/src/types/flow.ts +249 -550
  419. package/src/types/history.ts +7 -20
  420. package/src/types/index.ts +87 -139
  421. package/src/types/session.ts +135 -70
  422. package/src/types/tool.ts +42 -267
  423. package/src/utils/clock.ts +70 -0
  424. package/src/utils/duration.ts +33 -0
  425. package/src/utils/history.ts +3 -2
  426. package/src/utils/index.ts +8 -66
  427. package/src/utils/json.ts +5 -0
  428. package/src/utils/outcomes.ts +56 -0
  429. package/src/utils/schema.ts +145 -0
  430. package/src/utils/streamingMessage.ts +34 -4
  431. package/src/utils/template.ts +32 -423
  432. package/src/utils/usage.ts +37 -0
  433. package/dist/adapters/MemoryAdapter.d.ts +0 -47
  434. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  435. package/dist/adapters/MemoryAdapter.js +0 -204
  436. package/dist/adapters/MemoryAdapter.js.map +0 -1
  437. package/dist/adapters/MongoAdapter.d.ts +0 -97
  438. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  439. package/dist/adapters/MongoAdapter.js +0 -196
  440. package/dist/adapters/MongoAdapter.js.map +0 -1
  441. package/dist/adapters/OpenSearchAdapter.d.ts +0 -169
  442. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  443. package/dist/adapters/OpenSearchAdapter.js +0 -471
  444. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  445. package/dist/adapters/PostgreSQLAdapter.d.ts +0 -85
  446. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  447. package/dist/adapters/PostgreSQLAdapter.js +0 -308
  448. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  449. package/dist/adapters/PrismaAdapter.d.ts +0 -115
  450. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  451. package/dist/adapters/PrismaAdapter.js +0 -406
  452. package/dist/adapters/PrismaAdapter.js.map +0 -1
  453. package/dist/adapters/RedisAdapter.d.ts +0 -72
  454. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  455. package/dist/adapters/RedisAdapter.js +0 -286
  456. package/dist/adapters/RedisAdapter.js.map +0 -1
  457. package/dist/adapters/SQLiteAdapter.d.ts +0 -86
  458. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  459. package/dist/adapters/SQLiteAdapter.js +0 -337
  460. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  461. package/dist/adapters/index.d.ts +0 -17
  462. package/dist/adapters/index.d.ts.map +0 -1
  463. package/dist/adapters/index.js +0 -11
  464. package/dist/adapters/index.js.map +0 -1
  465. package/dist/adapters/sessionRow.d.ts +0 -22
  466. package/dist/adapters/sessionRow.d.ts.map +0 -1
  467. package/dist/adapters/sessionRow.js +0 -48
  468. package/dist/adapters/sessionRow.js.map +0 -1
  469. package/dist/cjs/adapters/MemoryAdapter.d.ts +0 -47
  470. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  471. package/dist/cjs/adapters/MemoryAdapter.js +0 -208
  472. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  473. package/dist/cjs/adapters/MongoAdapter.d.ts +0 -97
  474. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  475. package/dist/cjs/adapters/MongoAdapter.js +0 -200
  476. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  477. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +0 -169
  478. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  479. package/dist/cjs/adapters/OpenSearchAdapter.js +0 -475
  480. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  481. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +0 -85
  482. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  483. package/dist/cjs/adapters/PostgreSQLAdapter.js +0 -312
  484. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  485. package/dist/cjs/adapters/PrismaAdapter.d.ts +0 -115
  486. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  487. package/dist/cjs/adapters/PrismaAdapter.js +0 -410
  488. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  489. package/dist/cjs/adapters/RedisAdapter.d.ts +0 -72
  490. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  491. package/dist/cjs/adapters/RedisAdapter.js +0 -290
  492. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  493. package/dist/cjs/adapters/SQLiteAdapter.d.ts +0 -86
  494. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  495. package/dist/cjs/adapters/SQLiteAdapter.js +0 -341
  496. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  497. package/dist/cjs/adapters/index.d.ts +0 -17
  498. package/dist/cjs/adapters/index.d.ts.map +0 -1
  499. package/dist/cjs/adapters/index.js +0 -21
  500. package/dist/cjs/adapters/index.js.map +0 -1
  501. package/dist/cjs/adapters/sessionRow.d.ts +0 -22
  502. package/dist/cjs/adapters/sessionRow.d.ts.map +0 -1
  503. package/dist/cjs/adapters/sessionRow.js +0 -52
  504. package/dist/cjs/adapters/sessionRow.js.map +0 -1
  505. package/dist/cjs/constants/index.d.ts +0 -1
  506. package/dist/cjs/constants/index.d.ts.map +0 -1
  507. package/dist/cjs/constants/index.js +0 -4
  508. package/dist/cjs/constants/index.js.map +0 -1
  509. package/dist/cjs/core/AutoChainExecutor.d.ts +0 -97
  510. package/dist/cjs/core/AutoChainExecutor.d.ts.map +0 -1
  511. package/dist/cjs/core/AutoChainExecutor.js +0 -288
  512. package/dist/cjs/core/AutoChainExecutor.js.map +0 -1
  513. package/dist/cjs/core/BranchEvaluator.d.ts +0 -55
  514. package/dist/cjs/core/BranchEvaluator.d.ts.map +0 -1
  515. package/dist/cjs/core/BranchEvaluator.js +0 -125
  516. package/dist/cjs/core/BranchEvaluator.js.map +0 -1
  517. package/dist/cjs/core/DirectiveChainTracker.d.ts +0 -49
  518. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +0 -1
  519. package/dist/cjs/core/DirectiveChainTracker.js +0 -121
  520. package/dist/cjs/core/DirectiveChainTracker.js.map +0 -1
  521. package/dist/cjs/core/Events.d.ts +0 -26
  522. package/dist/cjs/core/Events.d.ts.map +0 -1
  523. package/dist/cjs/core/Events.js +0 -144
  524. package/dist/cjs/core/Events.js.map +0 -1
  525. package/dist/cjs/core/Flow.d.ts +0 -183
  526. package/dist/cjs/core/Flow.d.ts.map +0 -1
  527. package/dist/cjs/core/Flow.js +0 -551
  528. package/dist/cjs/core/Flow.js.map +0 -1
  529. package/dist/cjs/core/FlowRouter.d.ts +0 -183
  530. package/dist/cjs/core/FlowRouter.d.ts.map +0 -1
  531. package/dist/cjs/core/FlowRouter.js +0 -1047
  532. package/dist/cjs/core/FlowRouter.js.map +0 -1
  533. package/dist/cjs/core/PersistenceManager.d.ts +0 -114
  534. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  535. package/dist/cjs/core/PersistenceManager.js +0 -336
  536. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  537. package/dist/cjs/core/PromptComposer.d.ts +0 -47
  538. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  539. package/dist/cjs/core/PromptComposer.js +0 -397
  540. package/dist/cjs/core/PromptComposer.js.map +0 -1
  541. package/dist/cjs/core/PromptSectionCache.d.ts +0 -48
  542. package/dist/cjs/core/PromptSectionCache.d.ts.map +0 -1
  543. package/dist/cjs/core/PromptSectionCache.js +0 -108
  544. package/dist/cjs/core/PromptSectionCache.js.map +0 -1
  545. package/dist/cjs/core/ResponseEngine.d.ts +0 -43
  546. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  547. package/dist/cjs/core/ResponseEngine.js +0 -235
  548. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  549. package/dist/cjs/core/ResponseGenerationError.d.ts +0 -30
  550. package/dist/cjs/core/ResponseGenerationError.d.ts.map +0 -1
  551. package/dist/cjs/core/ResponseGenerationError.js +0 -35
  552. package/dist/cjs/core/ResponseGenerationError.js.map +0 -1
  553. package/dist/cjs/core/ResponseModal.d.ts +0 -305
  554. package/dist/cjs/core/ResponseModal.d.ts.map +0 -1
  555. package/dist/cjs/core/ResponseModal.js +0 -1414
  556. package/dist/cjs/core/ResponseModal.js.map +0 -1
  557. package/dist/cjs/core/ResponsePipeline.d.ts +0 -220
  558. package/dist/cjs/core/ResponsePipeline.d.ts.map +0 -1
  559. package/dist/cjs/core/ResponsePipeline.js +0 -1040
  560. package/dist/cjs/core/ResponsePipeline.js.map +0 -1
  561. package/dist/cjs/core/SessionFinalizer.d.ts +0 -34
  562. package/dist/cjs/core/SessionFinalizer.d.ts.map +0 -1
  563. package/dist/cjs/core/SessionFinalizer.js +0 -88
  564. package/dist/cjs/core/SessionFinalizer.js.map +0 -1
  565. package/dist/cjs/core/SessionManager.d.ts +0 -112
  566. package/dist/cjs/core/SessionManager.d.ts.map +0 -1
  567. package/dist/cjs/core/SessionManager.js +0 -308
  568. package/dist/cjs/core/SessionManager.js.map +0 -1
  569. package/dist/cjs/core/SignalCoordinator.d.ts +0 -103
  570. package/dist/cjs/core/SignalCoordinator.d.ts.map +0 -1
  571. package/dist/cjs/core/SignalCoordinator.js +0 -207
  572. package/dist/cjs/core/SignalCoordinator.js.map +0 -1
  573. package/dist/cjs/core/SignalEvaluator.d.ts +0 -86
  574. package/dist/cjs/core/SignalEvaluator.d.ts.map +0 -1
  575. package/dist/cjs/core/SignalEvaluator.js +0 -319
  576. package/dist/cjs/core/SignalEvaluator.js.map +0 -1
  577. package/dist/cjs/core/SignalProcessor.d.ts +0 -152
  578. package/dist/cjs/core/SignalProcessor.d.ts.map +0 -1
  579. package/dist/cjs/core/SignalProcessor.js +0 -505
  580. package/dist/cjs/core/SignalProcessor.js.map +0 -1
  581. package/dist/cjs/core/Step.d.ts +0 -184
  582. package/dist/cjs/core/Step.d.ts.map +0 -1
  583. package/dist/cjs/core/Step.js +0 -599
  584. package/dist/cjs/core/Step.js.map +0 -1
  585. package/dist/cjs/core/StepLifecycle.d.ts +0 -43
  586. package/dist/cjs/core/StepLifecycle.d.ts.map +0 -1
  587. package/dist/cjs/core/StepLifecycle.js +0 -180
  588. package/dist/cjs/core/StepLifecycle.js.map +0 -1
  589. package/dist/cjs/core/StreamingToolExecutor.d.ts +0 -142
  590. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +0 -1
  591. package/dist/cjs/core/StreamingToolExecutor.js +0 -490
  592. package/dist/cjs/core/StreamingToolExecutor.js.map +0 -1
  593. package/dist/cjs/core/ToolLoopExecutor.d.ts +0 -133
  594. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +0 -1
  595. package/dist/cjs/core/ToolLoopExecutor.js +0 -568
  596. package/dist/cjs/core/ToolLoopExecutor.js.map +0 -1
  597. package/dist/cjs/core/ToolManager.d.ts +0 -250
  598. package/dist/cjs/core/ToolManager.d.ts.map +0 -1
  599. package/dist/cjs/core/ToolManager.js +0 -1104
  600. package/dist/cjs/core/ToolManager.js.map +0 -1
  601. package/dist/cjs/core/createAgent.d.ts +0 -35
  602. package/dist/cjs/core/createAgent.d.ts.map +0 -1
  603. package/dist/cjs/core/createAgent.js +0 -39
  604. package/dist/cjs/core/createAgent.js.map +0 -1
  605. package/dist/cjs/core/flow-namespace.d.ts +0 -64
  606. package/dist/cjs/core/flow-namespace.d.ts.map +0 -1
  607. package/dist/cjs/core/flow-namespace.js +0 -182
  608. package/dist/cjs/core/flow-namespace.js.map +0 -1
  609. package/dist/cjs/core/toolGates.d.ts +0 -24
  610. package/dist/cjs/core/toolGates.d.ts.map +0 -1
  611. package/dist/cjs/core/toolGates.js +0 -52
  612. package/dist/cjs/core/toolGates.js.map +0 -1
  613. package/dist/cjs/types/persistence.d.ts +0 -254
  614. package/dist/cjs/types/persistence.d.ts.map +0 -1
  615. package/dist/cjs/types/persistence.js +0 -7
  616. package/dist/cjs/types/persistence.js.map +0 -1
  617. package/dist/cjs/types/prompt-cache.d.ts +0 -15
  618. package/dist/cjs/types/prompt-cache.d.ts.map +0 -1
  619. package/dist/cjs/types/prompt-cache.js +0 -6
  620. package/dist/cjs/types/prompt-cache.js.map +0 -1
  621. package/dist/cjs/types/signals.d.ts +0 -263
  622. package/dist/cjs/types/signals.d.ts.map +0 -1
  623. package/dist/cjs/types/signals.js +0 -11
  624. package/dist/cjs/types/signals.js.map +0 -1
  625. package/dist/cjs/types/template.d.ts +0 -84
  626. package/dist/cjs/types/template.d.ts.map +0 -1
  627. package/dist/cjs/types/template.js +0 -3
  628. package/dist/cjs/types/template.js.map +0 -1
  629. package/dist/cjs/utils/condition.d.ts +0 -63
  630. package/dist/cjs/utils/condition.d.ts.map +0 -1
  631. package/dist/cjs/utils/condition.js +0 -239
  632. package/dist/cjs/utils/condition.js.map +0 -1
  633. package/dist/cjs/utils/event.d.ts +0 -6
  634. package/dist/cjs/utils/event.d.ts.map +0 -1
  635. package/dist/cjs/utils/event.js +0 -20
  636. package/dist/cjs/utils/event.js.map +0 -1
  637. package/dist/cjs/utils/id.d.ts +0 -33
  638. package/dist/cjs/utils/id.d.ts.map +0 -1
  639. package/dist/cjs/utils/id.js +0 -84
  640. package/dist/cjs/utils/id.js.map +0 -1
  641. package/dist/cjs/utils/serialize.d.ts +0 -36
  642. package/dist/cjs/utils/serialize.d.ts.map +0 -1
  643. package/dist/cjs/utils/serialize.js +0 -77
  644. package/dist/cjs/utils/serialize.js.map +0 -1
  645. package/dist/cjs/utils/session.d.ts +0 -124
  646. package/dist/cjs/utils/session.d.ts.map +0 -1
  647. package/dist/cjs/utils/session.js +0 -396
  648. package/dist/cjs/utils/session.js.map +0 -1
  649. package/dist/constants/index.d.ts +0 -2
  650. package/dist/constants/index.d.ts.map +0 -1
  651. package/dist/constants/index.js +0 -4
  652. package/dist/constants/index.js.map +0 -1
  653. package/dist/core/AutoChainExecutor.d.ts +0 -97
  654. package/dist/core/AutoChainExecutor.d.ts.map +0 -1
  655. package/dist/core/AutoChainExecutor.js +0 -284
  656. package/dist/core/AutoChainExecutor.js.map +0 -1
  657. package/dist/core/BranchEvaluator.d.ts +0 -55
  658. package/dist/core/BranchEvaluator.d.ts.map +0 -1
  659. package/dist/core/BranchEvaluator.js +0 -121
  660. package/dist/core/BranchEvaluator.js.map +0 -1
  661. package/dist/core/DirectiveChainTracker.d.ts +0 -49
  662. package/dist/core/DirectiveChainTracker.d.ts.map +0 -1
  663. package/dist/core/DirectiveChainTracker.js +0 -117
  664. package/dist/core/DirectiveChainTracker.js.map +0 -1
  665. package/dist/core/Events.d.ts +0 -26
  666. package/dist/core/Events.d.ts.map +0 -1
  667. package/dist/core/Events.js +0 -137
  668. package/dist/core/Events.js.map +0 -1
  669. package/dist/core/Flow.d.ts +0 -183
  670. package/dist/core/Flow.d.ts.map +0 -1
  671. package/dist/core/Flow.js +0 -547
  672. package/dist/core/Flow.js.map +0 -1
  673. package/dist/core/FlowRouter.d.ts +0 -183
  674. package/dist/core/FlowRouter.d.ts.map +0 -1
  675. package/dist/core/FlowRouter.js +0 -1043
  676. package/dist/core/FlowRouter.js.map +0 -1
  677. package/dist/core/PersistenceManager.d.ts +0 -114
  678. package/dist/core/PersistenceManager.d.ts.map +0 -1
  679. package/dist/core/PersistenceManager.js +0 -332
  680. package/dist/core/PersistenceManager.js.map +0 -1
  681. package/dist/core/PromptComposer.d.ts +0 -47
  682. package/dist/core/PromptComposer.d.ts.map +0 -1
  683. package/dist/core/PromptComposer.js +0 -393
  684. package/dist/core/PromptComposer.js.map +0 -1
  685. package/dist/core/PromptSectionCache.d.ts +0 -48
  686. package/dist/core/PromptSectionCache.d.ts.map +0 -1
  687. package/dist/core/PromptSectionCache.js +0 -104
  688. package/dist/core/PromptSectionCache.js.map +0 -1
  689. package/dist/core/ResponseEngine.d.ts +0 -43
  690. package/dist/core/ResponseEngine.d.ts.map +0 -1
  691. package/dist/core/ResponseEngine.js +0 -231
  692. package/dist/core/ResponseEngine.js.map +0 -1
  693. package/dist/core/ResponseGenerationError.d.ts +0 -30
  694. package/dist/core/ResponseGenerationError.d.ts.map +0 -1
  695. package/dist/core/ResponseGenerationError.js +0 -31
  696. package/dist/core/ResponseGenerationError.js.map +0 -1
  697. package/dist/core/ResponseModal.d.ts +0 -305
  698. package/dist/core/ResponseModal.d.ts.map +0 -1
  699. package/dist/core/ResponseModal.js +0 -1410
  700. package/dist/core/ResponseModal.js.map +0 -1
  701. package/dist/core/ResponsePipeline.d.ts +0 -220
  702. package/dist/core/ResponsePipeline.d.ts.map +0 -1
  703. package/dist/core/ResponsePipeline.js +0 -1035
  704. package/dist/core/ResponsePipeline.js.map +0 -1
  705. package/dist/core/SessionFinalizer.d.ts +0 -34
  706. package/dist/core/SessionFinalizer.d.ts.map +0 -1
  707. package/dist/core/SessionFinalizer.js +0 -84
  708. package/dist/core/SessionFinalizer.js.map +0 -1
  709. package/dist/core/SessionManager.d.ts +0 -112
  710. package/dist/core/SessionManager.d.ts.map +0 -1
  711. package/dist/core/SessionManager.js +0 -301
  712. package/dist/core/SessionManager.js.map +0 -1
  713. package/dist/core/SignalCoordinator.d.ts +0 -103
  714. package/dist/core/SignalCoordinator.d.ts.map +0 -1
  715. package/dist/core/SignalCoordinator.js +0 -203
  716. package/dist/core/SignalCoordinator.js.map +0 -1
  717. package/dist/core/SignalEvaluator.d.ts +0 -86
  718. package/dist/core/SignalEvaluator.d.ts.map +0 -1
  719. package/dist/core/SignalEvaluator.js +0 -312
  720. package/dist/core/SignalEvaluator.js.map +0 -1
  721. package/dist/core/SignalProcessor.d.ts +0 -152
  722. package/dist/core/SignalProcessor.d.ts.map +0 -1
  723. package/dist/core/SignalProcessor.js +0 -498
  724. package/dist/core/SignalProcessor.js.map +0 -1
  725. package/dist/core/Step.d.ts +0 -184
  726. package/dist/core/Step.d.ts.map +0 -1
  727. package/dist/core/Step.js +0 -594
  728. package/dist/core/Step.js.map +0 -1
  729. package/dist/core/StepLifecycle.d.ts +0 -43
  730. package/dist/core/StepLifecycle.d.ts.map +0 -1
  731. package/dist/core/StepLifecycle.js +0 -176
  732. package/dist/core/StepLifecycle.js.map +0 -1
  733. package/dist/core/StreamingToolExecutor.d.ts +0 -142
  734. package/dist/core/StreamingToolExecutor.d.ts.map +0 -1
  735. package/dist/core/StreamingToolExecutor.js +0 -483
  736. package/dist/core/StreamingToolExecutor.js.map +0 -1
  737. package/dist/core/ToolLoopExecutor.d.ts +0 -133
  738. package/dist/core/ToolLoopExecutor.d.ts.map +0 -1
  739. package/dist/core/ToolLoopExecutor.js +0 -564
  740. package/dist/core/ToolLoopExecutor.js.map +0 -1
  741. package/dist/core/ToolManager.d.ts +0 -250
  742. package/dist/core/ToolManager.d.ts.map +0 -1
  743. package/dist/core/ToolManager.js +0 -1098
  744. package/dist/core/ToolManager.js.map +0 -1
  745. package/dist/core/createAgent.d.ts +0 -35
  746. package/dist/core/createAgent.d.ts.map +0 -1
  747. package/dist/core/createAgent.js +0 -36
  748. package/dist/core/createAgent.js.map +0 -1
  749. package/dist/core/flow-namespace.d.ts +0 -64
  750. package/dist/core/flow-namespace.d.ts.map +0 -1
  751. package/dist/core/flow-namespace.js +0 -179
  752. package/dist/core/flow-namespace.js.map +0 -1
  753. package/dist/core/toolGates.d.ts +0 -24
  754. package/dist/core/toolGates.d.ts.map +0 -1
  755. package/dist/core/toolGates.js +0 -49
  756. package/dist/core/toolGates.js.map +0 -1
  757. package/dist/types/persistence.d.ts +0 -254
  758. package/dist/types/persistence.d.ts.map +0 -1
  759. package/dist/types/persistence.js +0 -6
  760. package/dist/types/persistence.js.map +0 -1
  761. package/dist/types/prompt-cache.d.ts +0 -15
  762. package/dist/types/prompt-cache.d.ts.map +0 -1
  763. package/dist/types/prompt-cache.js +0 -5
  764. package/dist/types/prompt-cache.js.map +0 -1
  765. package/dist/types/signals.d.ts +0 -263
  766. package/dist/types/signals.d.ts.map +0 -1
  767. package/dist/types/signals.js +0 -10
  768. package/dist/types/signals.js.map +0 -1
  769. package/dist/types/template.d.ts +0 -84
  770. package/dist/types/template.d.ts.map +0 -1
  771. package/dist/types/template.js +0 -2
  772. package/dist/types/template.js.map +0 -1
  773. package/dist/utils/condition.d.ts +0 -63
  774. package/dist/utils/condition.d.ts.map +0 -1
  775. package/dist/utils/condition.js +0 -230
  776. package/dist/utils/condition.js.map +0 -1
  777. package/dist/utils/event.d.ts +0 -6
  778. package/dist/utils/event.d.ts.map +0 -1
  779. package/dist/utils/event.js +0 -17
  780. package/dist/utils/event.js.map +0 -1
  781. package/dist/utils/id.d.ts +0 -33
  782. package/dist/utils/id.d.ts.map +0 -1
  783. package/dist/utils/id.js +0 -77
  784. package/dist/utils/id.js.map +0 -1
  785. package/dist/utils/serialize.d.ts +0 -36
  786. package/dist/utils/serialize.d.ts.map +0 -1
  787. package/dist/utils/serialize.js +0 -72
  788. package/dist/utils/serialize.js.map +0 -1
  789. package/dist/utils/session.d.ts +0 -124
  790. package/dist/utils/session.d.ts.map +0 -1
  791. package/dist/utils/session.js +0 -379
  792. package/dist/utils/session.js.map +0 -1
  793. package/docs/concepts/directives.md +0 -369
  794. package/docs/reference/adapters.md +0 -543
  795. package/docs/reference/create-agent.md +0 -216
  796. package/docs/reference/directive.md +0 -242
  797. package/docs/reference/signals.md +0 -368
  798. package/examples/02-data-extraction.ts +0 -90
  799. package/examples/05-branching.ts +0 -140
  800. package/examples/06-flow-control.ts +0 -103
  801. package/examples/08-persistence.ts +0 -98
  802. package/examples/09-signals.ts +0 -144
  803. package/src/adapters/MemoryAdapter.ts +0 -281
  804. package/src/adapters/MongoAdapter.ts +0 -341
  805. package/src/adapters/OpenSearchAdapter.ts +0 -693
  806. package/src/adapters/PostgreSQLAdapter.ts +0 -487
  807. package/src/adapters/PrismaAdapter.ts +0 -617
  808. package/src/adapters/RedisAdapter.ts +0 -439
  809. package/src/adapters/SQLiteAdapter.ts +0 -496
  810. package/src/adapters/index.ts +0 -43
  811. package/src/adapters/sessionRow.ts +0 -57
  812. package/src/constants/index.ts +0 -2
  813. package/src/core/AutoChainExecutor.ts +0 -397
  814. package/src/core/BranchEvaluator.ts +0 -161
  815. package/src/core/DirectiveChainTracker.ts +0 -144
  816. package/src/core/Events.ts +0 -164
  817. package/src/core/Flow.ts +0 -665
  818. package/src/core/FlowRouter.ts +0 -1540
  819. package/src/core/PersistenceManager.ts +0 -446
  820. package/src/core/PromptComposer.ts +0 -448
  821. package/src/core/PromptSectionCache.ts +0 -125
  822. package/src/core/ResponseEngine.ts +0 -338
  823. package/src/core/ResponseGenerationError.ts +0 -53
  824. package/src/core/ResponseModal.ts +0 -1902
  825. package/src/core/ResponsePipeline.ts +0 -1404
  826. package/src/core/SessionFinalizer.ts +0 -108
  827. package/src/core/SessionManager.ts +0 -372
  828. package/src/core/SignalCoordinator.ts +0 -263
  829. package/src/core/SignalEvaluator.ts +0 -404
  830. package/src/core/SignalProcessor.ts +0 -663
  831. package/src/core/Step.ts +0 -782
  832. package/src/core/StepLifecycle.ts +0 -242
  833. package/src/core/StreamingToolExecutor.ts +0 -609
  834. package/src/core/ToolLoopExecutor.ts +0 -749
  835. package/src/core/ToolManager.ts +0 -1379
  836. package/src/core/createAgent.ts +0 -40
  837. package/src/core/flow-namespace.ts +0 -227
  838. package/src/core/toolGates.ts +0 -72
  839. package/src/types/persistence.ts +0 -303
  840. package/src/types/prompt-cache.ts +0 -17
  841. package/src/types/signals.ts +0 -338
  842. package/src/types/template.ts +0 -98
  843. package/src/utils/condition.ts +0 -296
  844. package/src/utils/event.ts +0 -16
  845. package/src/utils/id.ts +0 -91
  846. package/src/utils/serialize.ts +0 -86
  847. package/src/utils/session.ts +0 -501
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Fields: what is known, what is still pending, what the model may see, and
3
+ * how a raw extracted value becomes a typed one.
4
+ */
5
+
6
+ import { FlowConfigurationError } from "../types/errors.js";
7
+ import type { FieldDef, FieldDefs, ParamDef, ParamDefs, ScalarDef } from "../types/flow.js";
8
+ import type { StructuredSchema } from "../types/schema.js";
9
+
10
+ /** The default number of times a field is asked before it is skipped. */
11
+ export const DEFAULT_MAX_ASKS = 3;
12
+
13
+ /** A value counts as known unless it is `undefined`, `null` or `''`. */
14
+ export function isKnown(value: unknown): boolean {
15
+ return value !== undefined && value !== null && value !== "";
16
+ }
17
+
18
+ /** The step's `collect` fields that are still unknown and not yet at `maxAsks`, in order. */
19
+ export function pendingFields(
20
+ step: { collect?: readonly string[]; maxAsks?: number },
21
+ data: Record<string, unknown>,
22
+ asked: Record<string, number>,
23
+ ): string[] {
24
+ const maxAsks = step.maxAsks ?? DEFAULT_MAX_ASKS;
25
+ return (step.collect ?? []).filter((field) => !isKnown(data[field]) && (asked[field] ?? 0) < maxAsks);
26
+ }
27
+
28
+ /** How a field may be harvested when the definition does not say: booleans only when asked. */
29
+ export function extractMode(def: FieldDef): "anywhere" | "asked" {
30
+ return def.extract ?? (def.type === "boolean" ? "asked" : "anywhere");
31
+ }
32
+
33
+ export type Coerced = { ok: true; value: string | number | boolean } | { ok: false; code: "bad-value" | "not-in-enum" };
34
+
35
+ /**
36
+ * Turn a raw value from the model into the field's type. Strings are coerced
37
+ * to numbers and booleans; enum membership is enforced. The `detail` is the
38
+ * outcome line the host shows when a value is dropped.
39
+ */
40
+ export function coerceField(def: ScalarDef, raw: unknown): Coerced {
41
+ const value = coerceScalar(def, raw);
42
+ if (value === undefined) return { ok: false, code: "bad-value" };
43
+ if (def.enum && !def.enum.includes(value as string | number)) {
44
+ return { ok: false, code: "not-in-enum" };
45
+ }
46
+ return { ok: true, value };
47
+ }
48
+
49
+ function coerceScalar(def: ScalarDef, raw: unknown): string | number | boolean | undefined {
50
+ switch (def.type) {
51
+ case "string":
52
+ if (typeof raw === "string") return raw;
53
+ if (typeof raw === "number" || typeof raw === "boolean") return String(raw);
54
+ return undefined;
55
+ case "number":
56
+ case "integer": {
57
+ const n = typeof raw === "number" ? raw : typeof raw === "string" ? Number(raw.trim().replace(",", ".")) : NaN;
58
+ if (!Number.isFinite(n)) return undefined;
59
+ return def.type === "integer" ? Math.trunc(n) : n;
60
+ }
61
+ case "boolean":
62
+ if (typeof raw === "boolean") return raw;
63
+ if (typeof raw === "string") {
64
+ const s = raw.trim().toLowerCase();
65
+ if (["true", "sim", "yes", "1"].includes(s)) return true;
66
+ if (["false", "não", "nao", "no", "0"].includes(s)) return false;
67
+ }
68
+ return undefined;
69
+ }
70
+ }
71
+
72
+ export interface WireOptions {
73
+ /** Every property is required and accepts `null`. The envelope style. */
74
+ nullable?: boolean;
75
+ }
76
+
77
+ /**
78
+ * The JSON schema a provider sees: an allow-list of JSON-schema keys, with
79
+ * `ask`, `extract` and `optional` stripped. Closed (`additionalProperties:
80
+ * false`); every property required unless a parameter says `optional`.
81
+ */
82
+ export function toWireSchema(defs: FieldDefs | ParamDefs, options: WireOptions = {}): StructuredSchema {
83
+ const properties: Record<string, StructuredSchema> = {};
84
+ const required: string[] = [];
85
+ const entries: Array<[string, FieldDef | ParamDef]> = Object.entries(defs);
86
+ for (const [name, def] of entries) {
87
+ properties[name] = wireProperty(def, options.nullable ?? false);
88
+ if (options.nullable || !("optional" in def && def.optional)) required.push(name);
89
+ }
90
+ return { type: "object", properties, required, additionalProperties: false };
91
+ }
92
+
93
+ function wireProperty(def: FieldDef | ParamDef, nullable: boolean): StructuredSchema {
94
+ const out: StructuredSchema = def.type === "array"
95
+ ? { type: "array", items: wireProperty(def.items, false) }
96
+ : { type: def.type };
97
+ if (def.description) out.description = def.description;
98
+ if (def.type !== "array" && def.enum) out.enum = [...def.enum];
99
+ if (nullable) out.type = [def.type, "null"];
100
+ return out;
101
+ }
102
+
103
+ /**
104
+ * Merge field rows authored per flow into the agent's one field set. Two
105
+ * rows for one slug must agree on type and enum; the first non-empty `ask`
106
+ * and `description` win.
107
+ */
108
+ export function buildSchema(groups: Array<{ id: string; fields: FieldDefs }>): FieldDefs {
109
+ const merged: FieldDefs = {};
110
+ const owner: Record<string, string> = {};
111
+ for (const group of groups) {
112
+ for (const [slug, def] of Object.entries(group.fields)) {
113
+ const seen = merged[slug];
114
+ if (!seen) {
115
+ merged[slug] = { ...def };
116
+ owner[slug] = group.id;
117
+ continue;
118
+ }
119
+ if (seen.type !== def.type) {
120
+ throw new FlowConfigurationError(
121
+ `[FlowConfigurationError] field "${slug}" has two types: "${seen.type}" in "${owner[slug]}", ` +
122
+ `"${def.type}" in "${group.id}". Give one slug one type.`,
123
+ );
124
+ }
125
+ if (seen.enum && def.enum && !sameList(seen.enum, def.enum)) {
126
+ throw new FlowConfigurationError(
127
+ `[FlowConfigurationError] field "${slug}" has two option lists: in "${owner[slug]}" and "${group.id}". ` +
128
+ `Give one slug one list.`,
129
+ );
130
+ }
131
+ merged[slug] = {
132
+ ...seen,
133
+ enum: seen.enum ?? def.enum,
134
+ ask: seen.ask ?? def.ask,
135
+ description: seen.description ?? def.description,
136
+ extract: seen.extract ?? def.extract,
137
+ };
138
+ }
139
+ }
140
+ return merged;
141
+ }
142
+
143
+ function sameList(a: readonly (string | number)[], b: readonly (string | number)[]): boolean {
144
+ return a.length === b.length && a.every((v, i) => v === b[i]);
145
+ }
@@ -13,8 +13,9 @@
13
13
  * (tracking object depth and string context, so a nested decoy `"message"` key
14
14
  * or a `"message"` substring inside another value is never mistaken for it),
15
15
  * and is tolerant of truncation at any byte — a dangling escape sequence is
16
- * held back rather than emitted half-decoded. Input that is not a JSON object
17
- * (e.g. a provider streaming plain text) is passed through verbatim.
16
+ * held back rather than emitted half-decoded. A markdown fence around the
17
+ * object is skipped, and input that is not a JSON object (e.g. a provider
18
+ * streaming plain text) is passed through verbatim.
18
19
  */
19
20
 
20
21
  const WHITESPACE = " \t\n\r";
@@ -140,6 +141,28 @@ function skipJsonValue(s: string, i: number): ValueSkip {
140
141
  return j < n ? { end: j, complete: true } : { end: n, complete: false };
141
142
  }
142
143
 
144
+ /**
145
+ * Index just past a leading markdown fence, `i` when there is none, or -1 when
146
+ * the text starts with backticks whose opening line has not arrived yet.
147
+ *
148
+ * A schema the model was merely ASKED for — which is how one rides on any call
149
+ * that also carries tools — comes back fenced from some models:
150
+ * ```json\n{"message":"…"}\n```. The non-streaming parser strips that fence;
151
+ * without the same step here the whole envelope streams to the customer
152
+ * verbatim, which is the leak this module exists to prevent. While the opener
153
+ * is still arriving there is no telling a fence from prose, so the caller holds
154
+ * the text back rather than guess.
155
+ */
156
+ function fenceEnd(s: string, i: number): number {
157
+ if (s[i] !== "`") return i;
158
+ let j = i;
159
+ while (j < s.length && s[j] === "`") j++;
160
+ if (j === s.length) return -1; // still arriving: "`", "``", "```"
161
+ if (j - i < 3) return i; // one or two backticks: inline code in prose
162
+ const newline = s.indexOf("\n", j);
163
+ return newline === -1 ? -1 : newline + 1;
164
+ }
165
+
143
166
  /**
144
167
  * Extract the decoded value of the top-level `message` string field from a
145
168
  * (possibly partial) JSON object string, returning the text available so far.
@@ -154,8 +177,15 @@ export function extractMessageSoFar(accumulated: string): string {
154
177
  let i = 0;
155
178
  while (i < n && WHITESPACE.includes(s[i])) i++;
156
179
 
157
- // Not a JSON object — a plain-text stream; emit verbatim.
158
- if (i >= n || s[i] !== "{") return accumulated;
180
+ const afterFence = fenceEnd(s, i);
181
+ if (afterFence === -1) return ""; // backticks arriving: a fence may be opening
182
+ const fenced = afterFence !== i;
183
+ i = afterFence;
184
+ while (i < n && WHITESPACE.includes(s[i])) i++;
185
+
186
+ // Not a JSON object — a plain-text stream; emit verbatim. Behind a fence it
187
+ // is an envelope whatever it holds, so nothing is emitted.
188
+ if (i >= n || s[i] !== "{") return fenced ? "" : accumulated;
159
189
  i++; // skip '{'
160
190
 
161
191
  while (i < n) {
@@ -1,442 +1,51 @@
1
- import type { Template, TemplateContext } from "../types/index.js";
2
- import type { Event, MessageEventData } from "../types/history.js";
3
- import { MessageRole, EventKind } from "../types/history.js";
4
-
5
1
  /**
6
- * Renders a template, which can be a string or a function, using the provided context.
7
- * This function is asynchronous to support template functions that perform async operations.
8
- *
9
- * @param template - The template to render (string or function).
10
- * @param params - The context object to pass to the template function.
11
- * @returns A promise that resolves to the rendered string.
12
- *
13
- * @example
14
- * ```typescript
15
- * // With a string template
16
- * const result1 = await render("Hello {{name}}", { context: { name: "Alice" } });
17
- * // Result: "Hello Alice"
2
+ * `{{path}}` substitution for prompts, `say` texts and action parameters.
18
3
  *
19
- * // With a function template
20
- * const fnTemplate = ({ context }) => `Hello ${context.name}`;
21
- * const result2 = await render(fnTemplate, { context: { name: "Bob" } });
22
- * // Result: "Hello Bob"
23
- * ```
4
+ * The scope has three roots: `data` (collected fields), `context` (the host's
5
+ * per-turn context) and `input` (the run's trigger payload). A path that
6
+ * resolves to nothing keeps its placeholder, so a typo stays visible instead
7
+ * of vanishing into an empty string.
24
8
  */
25
- export async function render<TContext = unknown, TData = unknown>(
26
- template: Template<TContext, TData> | undefined,
27
- params: TemplateContext<TContext, TData>
28
- ): Promise<string> {
29
- if (typeof template === "function") {
30
- // Execute the function and await the result if it's a promise
31
- const result = await Promise.resolve(template(params));
32
- return result;
33
- }
34
-
35
- if (typeof template === "string") {
36
- // Fallback to the old renderTemplate logic for string-based templates
37
- return renderTemplate(template, params.context as Record<string, unknown>);
38
- }
39
9
 
40
- // Return empty string if template is undefined or not a supported type
41
- return "";
10
+ export interface TemplateScope {
11
+ data?: unknown;
12
+ context?: unknown;
13
+ input?: unknown;
42
14
  }
43
15
 
44
- /**
45
- * Renders an array of templates.
46
- *
47
- * @param templates - An array of templates to render.
48
- * @param params - The context object.
49
- * @returns A promise that resolves to an array of rendered strings.
50
- */
51
- export async function renderMany<TContext = unknown, TData = unknown>(
52
- templates: Template<TContext, TData>[] | undefined,
53
- params: TemplateContext<TContext, TData>
54
- ): Promise<string[]> {
55
- if (!templates) {
56
- return [];
57
- }
58
- return Promise.all(templates.map((t) => render(t, params)));
16
+ const PLACEHOLDER = /\{\{\s*([^}\s]+)\s*\}\}/g;
17
+
18
+ export function render(template: string, scope: TemplateScope): string {
19
+ return template.replace(PLACEHOLDER, (match, path: string) => {
20
+ const value = lookup(scope, path.split("."));
21
+ return value === undefined || value === null ? match : stringify(value);
22
+ });
59
23
  }
60
24
 
61
- /**
62
- * Renders template variables in a string using the provided context.
63
- * Supports {{variable}} and {{object.property}} syntax for property access.
64
- *
65
- * @param template - The template string containing {{variable}} placeholders
66
- * @param context - The context object to pull values from
67
- * @returns The rendered string with variables replaced
68
- *
69
- * @example
70
- * ```typescript
71
- * const template = "Hello {{user.name}}, welcome to {{company.name}}!";
72
- * const context = {
73
- * user: { name: "Alice", age: 30 },
74
- * company: { name: "Acme Corp", location: "NYC" }
75
- * };
76
- * const result = renderTemplate(template, context);
77
- * // Result: "Hello Alice, welcome to Acme Corp!"
78
- *
79
- * // Array handling
80
- * const template2 = "Items: {{items}}";
81
- * const context2 = { items: ["apple", "banana", "cherry"] };
82
- * const result2 = renderTemplate(template2, context2);
83
- * // Result: "Items: apple, banana, cherry"
84
- * ```
85
- */
86
- export function renderTemplate(
87
- template: string,
88
- context: Record<string, unknown> | undefined
89
- ): string {
90
- if (!template || !context) {
91
- return template;
25
+ /** `render` over every string inside a value, recursively. Non-strings pass through. */
26
+ export function renderDeep<T>(value: T, scope: TemplateScope): T {
27
+ if (typeof value === "string") return render(value, scope) as T;
28
+ if (Array.isArray(value)) return value.map((item: unknown) => renderDeep(item, scope)) as T;
29
+ if (value !== null && typeof value === "object") {
30
+ return Object.fromEntries(
31
+ Object.entries(value).map(([k, v]) => [k, renderDeep(v, scope)]),
32
+ ) as T;
92
33
  }
93
-
94
- return template.replace(
95
- /\{\{([^}]+)\}\}/g,
96
- (match: string, path: string): string => {
97
- const value = getValueByPath(context, path.trim());
98
- if (value === undefined || value === null) {
99
- return match; // Keep the original placeholder if value not found
100
- }
101
- return valueToString(value);
102
- }
103
- );
34
+ return value;
104
35
  }
105
36
 
106
- /**
107
- * Gets a value from an object using dot notation path.
108
- * Supports nested property access like "user.name" or "user.address.city".
109
- *
110
- * @param obj - The object to search in
111
- * @param path - The dot-separated path to the property
112
- * @returns The value at the path, or undefined if not found
113
- */
114
- function getValueByPath(obj: Record<string, unknown>, path: string): unknown {
115
- const keys = path.split(".");
116
- let current: unknown = obj;
117
-
37
+ function lookup(root: unknown, keys: string[]): unknown {
38
+ let current = root;
118
39
  for (const key of keys) {
119
- if (
120
- current === null ||
121
- current === undefined ||
122
- typeof current !== "object"
123
- ) {
124
- return undefined;
125
- }
40
+ if (current === null || typeof current !== "object") return undefined;
126
41
  current = (current as Record<string, unknown>)[key];
127
42
  }
128
-
129
43
  return current;
130
44
  }
131
45
 
132
- /**
133
- * Converts a value to its string representation for template rendering.
134
- * Handles different types appropriately.
135
- *
136
- * @param value - The value to convert to string
137
- * @returns String representation of the value
138
- */
139
- function valueToString(value: unknown): string {
140
- if (value === null || value === undefined) {
141
- return "";
142
- }
143
-
144
- if (typeof value === "string") {
145
- return value;
146
- }
147
-
148
- if (typeof value === "number" || typeof value === "boolean") {
149
- return String(value);
150
- }
151
-
152
- if (Array.isArray(value)) {
153
- // For arrays, join with commas by default
154
- // Users can override this by using JSON.stringify in their templates if needed
155
- return value.map((item) => valueToString(item)).join(", ");
156
- }
157
-
158
- if (typeof value === "object") {
159
- // For objects, convert to JSON string
160
- // This provides a readable representation while being safe
161
- try {
162
- return JSON.stringify(value);
163
- } catch {
164
- return "[object Object]";
165
- }
166
- }
167
-
168
- // Fallback for any other type
46
+ function stringify(value: unknown): string {
47
+ if (typeof value === "string") return value;
48
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
49
+ if (Array.isArray(value)) return value.map(stringify).join(", ");
169
50
  return JSON.stringify(value);
170
51
  }
171
-
172
- /**
173
- * Renders template variables in an object recursively.
174
- * Handles nested objects and arrays.
175
- *
176
- * @param obj - The object to render templates in
177
- * @param context - The context object to pull values from
178
- * @returns The object with all string templates rendered
179
- */
180
- export function renderTemplateObject(
181
- obj: unknown,
182
- context: Record<string, unknown> | undefined
183
- ): unknown {
184
- if (obj === null || obj === undefined) {
185
- return obj;
186
- }
187
-
188
- if (typeof obj === "string") {
189
- return renderTemplate(obj, context);
190
- }
191
-
192
- if (Array.isArray(obj)) {
193
- return obj.map((item) => renderTemplateObject(item, context));
194
- }
195
-
196
- if (typeof obj === "object") {
197
- const result: Record<string, unknown> = {};
198
- for (const [key, value] of Object.entries(obj)) {
199
- result[key] = renderTemplateObject(value, context);
200
- }
201
- return result;
202
- }
203
-
204
- return obj;
205
- }
206
-
207
- /**
208
- * Creates helper functions for working with history and context in templates.
209
- * These helpers make it easier to access message content and perform common operations.
210
- *
211
- * @param history - The event history array
212
- * @returns Object containing helper functions
213
- */
214
- export function createTemplateHelpers(history?: Event[]) {
215
- const helpers = {
216
- /**
217
- * Get the last message from history, optionally filtered by role.
218
- * @param role - Optional role to filter by (user, assistant, etc.)
219
- * @returns The message content or undefined if not found
220
- */
221
- getLastMessage(role?: MessageRole): string | undefined {
222
- if (!history || history.length === 0) return undefined;
223
-
224
- // Search backwards through history for the most recent message
225
- for (let i = history.length - 1; i >= 0; i--) {
226
- const event = history[i];
227
- if (event.kind === EventKind.MESSAGE) {
228
- // If no role specified, return the first message found
229
- if (!role || event.source === role) {
230
- const messageData = event.data as MessageEventData;
231
- return messageData.message;
232
- }
233
- }
234
- }
235
- return undefined;
236
- },
237
-
238
- /**
239
- * Get the last user message from history.
240
- * @returns The user message content or undefined if not found
241
- */
242
- getLastUserMessage(): string | undefined {
243
- return helpers.getLastMessage(MessageRole.USER);
244
- },
245
-
246
- /**
247
- * Get the last assistant message from history.
248
- * @returns The assistant message content or undefined if not found
249
- */
250
- getLastAssistantMessage(): string | undefined {
251
- return helpers.getLastMessage(MessageRole.ASSISTANT);
252
- },
253
-
254
- /**
255
- * Get all messages from history, optionally filtered by role.
256
- * @param role - Optional role to filter by
257
- * @returns Array of message contents
258
- */
259
- getMessages(role?: MessageRole): string[] {
260
- if (!history || history.length === 0) return [];
261
-
262
- const messages: string[] = [];
263
- for (const event of history) {
264
- if (event.kind === EventKind.MESSAGE) {
265
- if (!role || event.source === role) {
266
- const messageData = event.data as MessageEventData;
267
- messages.push(messageData.message);
268
- }
269
- }
270
- }
271
- return messages;
272
- },
273
-
274
- /**
275
- * Check if the last message contains any of the given keywords.
276
- * @param keywords - Keywords to search for
277
- * @param caseSensitive - Whether to perform case-sensitive search (default: false)
278
- * @returns True if any keyword is found
279
- */
280
- lastMessageContains(keywords: string | string[], caseSensitive: boolean = false): boolean {
281
- const lastMessage = helpers.getLastMessage();
282
- if (!lastMessage) return false;
283
-
284
- const searchText = caseSensitive ? lastMessage : lastMessage.toLowerCase();
285
- const keywordArray = Array.isArray(keywords) ? keywords : [keywords];
286
-
287
- return keywordArray.some(keyword => {
288
- const searchKeyword = caseSensitive ? keyword : keyword.toLowerCase();
289
- return searchText.includes(searchKeyword);
290
- });
291
- },
292
- };
293
-
294
- return helpers;
295
- }
296
-
297
- /**
298
- * Creates a complete TemplateContext with helpers included.
299
- * This is a convenience function for creating template contexts with all the helper methods.
300
- *
301
- * @param params - The base template context parameters
302
- * @returns Complete TemplateContext with helpers
303
- */
304
- export function createTemplateContext<TContext = unknown, TData = unknown>(
305
- params: Omit<Partial<TemplateContext<TContext, TData>>, 'helpers'>
306
- ): TemplateContext<TContext, TData> {
307
- return {
308
- ...params,
309
- data: params.data || {},
310
- helpers: createTemplateHelpers(params.history),
311
- };
312
- }
313
-
314
- /**
315
- * Formats a JSON structure into readable markdown format.
316
- * Handles nested objects, arrays, and primitive values.
317
- *
318
- * @param data - The JSON data to format
319
- * @param title - Optional title for the knowledge base section
320
- * @param maxDepth - Maximum nesting depth (default: 3)
321
- * @returns Formatted markdown string
322
- *
323
- * @example
324
- * ```typescript
325
- * const knowledge = {
326
- * company: {
327
- * name: "Acme Corp",
328
- * products: ["Widget A", "Widget B"],
329
- * locations: {
330
- * headquarters: "NYC",
331
- * branches: ["LA", "Chicago"]
332
- * }
333
- * }
334
- * };
335
- *
336
- * const markdown = formatKnowledgeBase(knowledge, "Company Information");
337
- * // Output:
338
- * // ## Company Information
339
- * //
340
- * // ### company
341
- * // - **name**: Acme Corp
342
- * // - **products**:
343
- * // - Widget A
344
- * // - Widget B
345
- * // - **locations**:
346
- * // - **headquarters**: NYC
347
- * // - **branches**:
348
- * // - LA
349
- * // - Chicago
350
- * ```
351
- */
352
- export function formatKnowledgeBase(
353
- data: Record<string, unknown>,
354
- title?: string,
355
- maxDepth: number = 3
356
- ): string {
357
- const lines: string[] = [];
358
-
359
- if (title) {
360
- lines.push(`## ${title}`);
361
- lines.push("");
362
- }
363
-
364
- if (!data || typeof data !== "object") {
365
- lines.push("*No knowledge base data available*");
366
- return lines.join("\n");
367
- }
368
-
369
- formatObject(data, lines, 0, maxDepth);
370
-
371
- return lines.join("\n");
372
- }
373
-
374
- /**
375
- * Recursively formats an object into markdown format
376
- */
377
- function formatObject(
378
- obj: Record<string, unknown>,
379
- lines: string[],
380
- depth: number,
381
- maxDepth: number,
382
- prefix: string = ""
383
- ): void {
384
- const entries = Object.entries(obj);
385
-
386
- if (entries.length === 0) {
387
- lines.push(`${prefix}*Empty*`);
388
- return;
389
- }
390
-
391
- for (const [key, value] of entries) {
392
- const currentPrefix = prefix ? `${prefix} ` : "";
393
-
394
- if (value === null || value === undefined) {
395
- lines.push(`${currentPrefix}- **${key}**: *Not specified*`);
396
- } else if (
397
- typeof value === "string" ||
398
- typeof value === "number" ||
399
- typeof value === "boolean"
400
- ) {
401
- lines.push(`${currentPrefix}- **${key}**: ${value}`);
402
- } else if (Array.isArray(value)) {
403
- if (value.length === 0) {
404
- lines.push(`${currentPrefix}- **${key}**: *Empty list*`);
405
- } else {
406
- lines.push(`${currentPrefix}- **${key}**:`);
407
- for (const item of value) {
408
- if (
409
- typeof item === "string" ||
410
- typeof item === "number" ||
411
- typeof item === "boolean"
412
- ) {
413
- lines.push(`${currentPrefix} - ${item}`);
414
- } else if (
415
- depth < maxDepth &&
416
- typeof item === "object" &&
417
- item !== null
418
- ) {
419
- lines.push(`${currentPrefix} - ${JSON.stringify(item)}`);
420
- } else {
421
- lines.push(`${currentPrefix} - ${JSON.stringify(item)}`);
422
- }
423
- }
424
- }
425
- } else if (typeof value === "object") {
426
- if (depth < maxDepth) {
427
- lines.push(`${currentPrefix}- **${key}**:`);
428
- formatObject(
429
- value as Record<string, unknown>,
430
- lines,
431
- depth + 1,
432
- maxDepth,
433
- currentPrefix
434
- );
435
- } else {
436
- lines.push(`${currentPrefix}- **${key}**: ${JSON.stringify(value)}`);
437
- }
438
- } else {
439
- lines.push(`${currentPrefix}- **${key}**: ${JSON.stringify(value)}`);
440
- }
441
- }
442
- }