@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,712 @@
1
+ /**
2
+ * FlowSpec: a Flow as JSON, and the checks that make a stored flow safe to run.
3
+ *
4
+ * Stored flows, flows an editor saves and flows an LLM generates are all
5
+ * FlowSpecs: the same object as `Flow` with a flat step that carries a `kind`
6
+ * and predicates only in their JSON form (`ConditionSpec`). No functions
7
+ * anywhere, so it survives `JSON.stringify`.
8
+ *
9
+ * Kind rule: a talk step is `collect` whenever it has a `collect` list, with
10
+ * or without a `prompt` beside it; it is `prompt` when it has a guideline
11
+ * alone. A wait with a duration is `wait`; a wait on an event is `waitEvent`.
12
+ *
13
+ * `fromSpec` treats `null` as absent for every optional value, because the
14
+ * generation schema (`flowSpecSchema`) says null where the type says optional.
15
+ * `toSpec` never writes null, so `toSpec(fromSpec(spec))` is the spec with its
16
+ * nulls dropped, and the identity on a spec that had none.
17
+ */
18
+
19
+ import type { AgentOptions } from "../types/agent.js";
20
+ import { FlowConfigurationError } from "../types/errors.js";
21
+ import type {
22
+ Branch,
23
+ ConditionSpec,
24
+ DoStep,
25
+ Duration,
26
+ FieldDefs,
27
+ Flow,
28
+ InferData,
29
+ Instruction,
30
+ Next,
31
+ ParamDef,
32
+ ParamDefs,
33
+ Pred,
34
+ Repeat,
35
+ SayStep,
36
+ ScalarDef,
37
+ Step,
38
+ StepBase,
39
+ Template,
40
+ Trigger,
41
+ WaitEventStep,
42
+ WaitStep,
43
+ } from "../types/flow.js";
44
+ import type { StructuredSchema } from "../types/schema.js";
45
+ import { isDuration } from "../utils/duration.js";
46
+ import { toWireSchema } from "../utils/schema.js";
47
+
48
+ // ── The JSON form ───────────────────────────────────────────────────────
49
+
50
+ /** The collected-data type of a toolkit without bound fields: slugs are plain strings. */
51
+ type LooseData = InferData<FieldDefs>;
52
+
53
+ export type StepKind = "prompt" | "collect" | "say" | "do" | "wait" | "waitEvent" | "if";
54
+
55
+ export type BranchSpec = { then: Next<LooseData> } & ({ when: string } | { if: ConditionSpec<LooseData> });
56
+
57
+ export type InstructionSpec = Omit<Instruction, "if"> & { if?: ConditionSpec<LooseData> };
58
+
59
+ /** A trigger with its `if` in JSON form. Same shape as `Trigger` otherwise. */
60
+ export type TriggerSpec = { repeat?: Repeat } & (
61
+ | { message: string[]; if?: ConditionSpec<LooseData> }
62
+ | { mention: string[]; extract?: ParamDefs; if?: ConditionSpec<LooseData> }
63
+ | { silence: Duration; if?: ConditionSpec<LooseData>; businessHours?: boolean }
64
+ | { event: string; if?: ConditionSpec<LooseData>; after?: Duration; businessHours?: boolean }
65
+ );
66
+
67
+ interface TalkSpecExtras {
68
+ ask?: Partial<Record<string, string>>;
69
+ maxAsks?: number;
70
+ branches?: BranchSpec[];
71
+ tools?: string[];
72
+ instructions?: InstructionSpec[];
73
+ }
74
+
75
+ /** A flat step: `kind` plus the kind's own properties. */
76
+ export type StepSpec = StepBase<LooseData> &
77
+ (
78
+ | ({ kind: "prompt"; prompt: Template; collect?: undefined } & TalkSpecExtras)
79
+ | ({ kind: "collect"; collect: string[]; prompt?: Template } & TalkSpecExtras)
80
+ | ({ kind: "say" } & SayStep)
81
+ | ({ kind: "do" } & DoStep<LooseData>)
82
+ | { kind: "wait"; wait: Duration; businessHours?: boolean; else?: Next<LooseData>; branches?: BranchSpec[] }
83
+ | ({ kind: "waitEvent" } & WaitEventStep<LooseData>)
84
+ | { kind: "if"; if: ConditionSpec<LooseData>; else?: Next<LooseData> }
85
+ );
86
+
87
+ export interface FlowSpec {
88
+ id: string;
89
+ name: string;
90
+ description?: string;
91
+ on?: TriggerSpec[];
92
+ anchor?: string;
93
+ while?: ConditionSpec<LooseData>;
94
+ clearOnStart?: string[];
95
+ steps: StepSpec[];
96
+ onEnd?: "end" | "stay" | "reset";
97
+ instructions?: InstructionSpec[];
98
+ tools?: string[];
99
+ }
100
+
101
+ /** What a flow's names resolve against: the agent's fields, actions, events, conditions and tools. */
102
+ export type Registries = Pick<AgentOptions, "fields" | "actions" | "events" | "conditions" | "tools">;
103
+
104
+ // ── fromSpec / toSpec ───────────────────────────────────────────────────
105
+
106
+ /**
107
+ * A spec as a typed flow. The slugs and names inside a spec are strings from
108
+ * storage, so the result is typed by claim: `validateFlow` (which the agent
109
+ * runs on every flow it is built with) is what makes the claim true. The
110
+ * bound toolkit's `f.fromSpec(spec)` fills `C` and `D` in.
111
+ */
112
+ export function fromSpec<C = unknown, D = LooseData>(spec: FlowSpec): Flow<C, D> {
113
+ const clean = stripNulls(spec);
114
+ if (!Array.isArray(clean.steps)) {
115
+ throw problem(`flow "${clean.id}"`, "has no steps list", "Write steps as a list, even an empty one.");
116
+ }
117
+ const { steps, ...rest } = clean;
118
+ const flow: Flow<unknown, LooseData> = { ...rest, steps: steps.map(fromStepSpec) };
119
+ return flow as Flow<C, D>;
120
+ }
121
+
122
+ function fromStepSpec(step: StepSpec): Step<unknown, LooseData> {
123
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- `kind` is the one property the Flow form drops
124
+ const { kind, ...body } = step;
125
+ return body;
126
+ }
127
+
128
+ /** Throws `FlowConfigurationError` when the flow carries a function predicate: it cannot be stored. */
129
+ export function toSpec<C, D extends LooseData>(flow: Flow<C, D>): FlowSpec {
130
+ const at = (where: string) => `flow "${flow.id}", ${where}`;
131
+ return compact<FlowSpec>({
132
+ id: flow.id,
133
+ name: flow.name,
134
+ description: flow.description,
135
+ on: flow.on?.map((trigger, i) => triggerToSpec(trigger, at(`trigger #${i + 1}`))),
136
+ anchor: flow.anchor,
137
+ while: jsonPred(flow.while, at("while")),
138
+ clearOnStart: flow.clearOnStart,
139
+ steps: flow.steps.map((step) => stepToSpec(step, at(`step "${step.id}"`))),
140
+ onEnd: flow.onEnd,
141
+ instructions: flow.instructions?.map((ins, i) => instructionToSpec(ins, at(`instructions[${i}]`))),
142
+ tools: flow.tools,
143
+ });
144
+ }
145
+
146
+ function triggerToSpec<C, D extends LooseData>(trigger: Trigger<C, D>, at: string): TriggerSpec {
147
+ return compact<TriggerSpec>({ ...trigger, if: jsonPred(trigger.if, `${at} if`) });
148
+ }
149
+
150
+ function instructionToSpec<C, D extends LooseData>(ins: Instruction<C, D>, at: string): InstructionSpec {
151
+ return compact<InstructionSpec>({ ...ins, if: jsonPred(ins.if, `${at}.if`) });
152
+ }
153
+
154
+ function branchesToSpec<C, D extends LooseData>(branches: Branch<C, D>[] | undefined, at: string): BranchSpec[] | undefined {
155
+ return branches?.map((branch, i) =>
156
+ "if" in branch ? { ...branch, if: jsonPredRequired(branch.if, `${at} branches[${i}].if`) } : branch,
157
+ );
158
+ }
159
+
160
+ function stepToSpec<C, D extends LooseData>(step: Step<C, D>, at: string): StepSpec {
161
+ const base = { id: step.id, label: step.label, then: step.then, ui: step.ui };
162
+ if ("say" in step) {
163
+ return compact<StepSpec>({ ...base, kind: "say", say: step.say, media: step.media, once: step.once });
164
+ }
165
+ if ("do" in step) {
166
+ return compact<StepSpec>({ ...base, kind: "do", do: step.do, with: step.with, onFail: step.onFail });
167
+ }
168
+ if ("wait" in step) {
169
+ return isTimedWait(step)
170
+ ? compact<StepSpec>({
171
+ ...base,
172
+ kind: "wait",
173
+ wait: step.wait,
174
+ businessHours: step.businessHours,
175
+ else: step.else,
176
+ branches: branchesToSpec(step.branches, at),
177
+ })
178
+ : compact<StepSpec>({ ...base, kind: "waitEvent", wait: step.wait, else: step.else });
179
+ }
180
+ if ("if" in step) {
181
+ return compact<StepSpec>({ ...base, kind: "if", if: jsonPredRequired(step.if, `${at} if`), else: step.else });
182
+ }
183
+ const talk = {
184
+ ask: step.ask,
185
+ maxAsks: step.maxAsks,
186
+ branches: branchesToSpec(step.branches, at),
187
+ tools: step.tools,
188
+ instructions: step.instructions?.map((ins, i) => instructionToSpec(ins, `${at} instructions[${i}]`)),
189
+ };
190
+ if (step.collect !== undefined) {
191
+ return compact<StepSpec>({ ...base, kind: "collect", collect: step.collect, prompt: step.prompt, ...talk });
192
+ }
193
+ if (step.prompt === undefined) {
194
+ throw problem(at, "has neither prompt nor collect", "A talk step needs a guideline, fields to collect, or both.");
195
+ }
196
+ return compact<StepSpec>({ ...base, kind: "prompt", prompt: step.prompt, ...talk });
197
+ }
198
+
199
+ /** `typeof step.wait` alone does not narrow the union for tsc; this does. */
200
+ function isTimedWait<C, D>(
201
+ step: StepBase<D> & (WaitStep<C, D> | WaitEventStep<D>),
202
+ ): step is StepBase<D> & WaitStep<C, D> {
203
+ return typeof step.wait === "string";
204
+ }
205
+
206
+ function jsonPred<C, D extends LooseData>(pred: Pred<C, D> | undefined, at: string): ConditionSpec<LooseData> | undefined {
207
+ return pred === undefined ? undefined : jsonPredRequired(pred, at);
208
+ }
209
+
210
+ function jsonPredRequired<C, D extends LooseData>(pred: Pred<C, D>, at: string): ConditionSpec<LooseData> {
211
+ if (typeof pred === "function") {
212
+ throw problem(
213
+ at,
214
+ "is a function, which cannot be stored as JSON",
215
+ "Write it as a condition ({ equals }, { known }, { silenced } or a named condition) to store this flow.",
216
+ );
217
+ }
218
+ return pred;
219
+ }
220
+
221
+ // ── validateFlow ────────────────────────────────────────────────────────
222
+
223
+ /** A read-only view that a typed Flow and a spec-derived Flow both fit; the validator only reads. */
224
+ // A typed flow's ConditionSpec<D> and a spec's JSON both read as a name → argument map here.
225
+ type LoosePred = ((ctx: never) => boolean) | Record<string, unknown>;
226
+ interface LooseBranch {
227
+ then: Next<LooseData>;
228
+ when?: string;
229
+ if?: LoosePred;
230
+ }
231
+ interface LooseInstruction {
232
+ if?: LoosePred;
233
+ }
234
+ interface LooseTrigger {
235
+ repeat?: Repeat;
236
+ event?: string;
237
+ silence?: Duration;
238
+ after?: Duration;
239
+ if?: LoosePred;
240
+ }
241
+ interface LooseStep {
242
+ id: string;
243
+ then?: Next<LooseData>;
244
+ else?: Next<LooseData>;
245
+ onFail?: Next<LooseData>;
246
+ prompt?: Template;
247
+ collect?: string[];
248
+ ask?: Partial<Record<string, string>>;
249
+ branches?: LooseBranch[];
250
+ instructions?: LooseInstruction[];
251
+ do?: string;
252
+ with?: Record<string, unknown>;
253
+ wait?: Duration | { event: string; upTo?: Duration };
254
+ if?: LoosePred;
255
+ tools?: string[];
256
+ }
257
+ interface LooseFlow {
258
+ id: string;
259
+ on?: LooseTrigger[];
260
+ while?: LoosePred;
261
+ clearOnStart?: string[];
262
+ steps: LooseStep[];
263
+ instructions?: LooseInstruction[];
264
+ tools?: string[];
265
+ }
266
+
267
+ const BUILT_IN_CONDITIONS = ["equals", "known", "silenced"];
268
+
269
+ const DURATION_HINT = 'Write a number and a unit: "30s", "5m", "24h" or "3d".';
270
+
271
+ /**
272
+ * Check a flow, typed or as a spec, against the agent's registries. Throws
273
+ * `FlowConfigurationError` on the first problem that would break at runtime;
274
+ * returns warnings for what runs but probably not as intended.
275
+ */
276
+ export function validateFlow<C = unknown, D = LooseData>(
277
+ input: Flow<C, D> | FlowSpec,
278
+ registries: Registries,
279
+ ): { warnings: string[] } {
280
+ // Nulls mean "not set" in a spec; a typed flow has none, so one pass serves both forms.
281
+ const flow: LooseFlow = stripNulls(input);
282
+ const { fields, actions = {}, events = {}, conditions = {}, tools = [] } = registries;
283
+ const toolIds = new Set(tools.map((tool) => tool.id));
284
+ const warnings: string[] = [];
285
+
286
+ if (typeof flow.id !== "string" || flow.id === "") {
287
+ throw problem("flow", "has no id", "Give the flow a short unique id.");
288
+ }
289
+ const flowAt = `flow "${flow.id}"`;
290
+ if (!Array.isArray(flow.steps)) {
291
+ throw problem(flowAt, "has no steps list", "Write steps as a list, even an empty one.");
292
+ }
293
+
294
+ const index = new Map<string, number>();
295
+ flow.steps.forEach((step, i) => {
296
+ if (typeof step.id !== "string" || step.id === "") {
297
+ throw problem(`${flowAt}, step #${i + 1}`, "has no id", "Give every step a unique id.");
298
+ }
299
+ if (step.id === "end") {
300
+ throw problem(`${flowAt}, step "end"`, 'uses the reserved id "end"', '"end" ends the run; pick another id.');
301
+ }
302
+ if (index.has(step.id)) {
303
+ throw problem(`${flowAt}, step "${step.id}"`, "duplicates an earlier step id", "Give each step its own id.");
304
+ }
305
+ index.set(step.id, i);
306
+ });
307
+ if (flow.on?.length && flow.steps.length === 0) {
308
+ throw problem(flowAt, "has triggers but no steps", "Add at least one step or remove `on`.");
309
+ }
310
+
311
+ const slug = (name: string, at: string, where: string): void => {
312
+ if (!own(fields, name)) {
313
+ throw problem(at, `unknown field "${name}" in ${where}`, "Add it to the agent's fields or fix the slug.");
314
+ }
315
+ };
316
+
317
+ const toolNames = (names: string[] | undefined, at: string): void => {
318
+ for (const name of names ?? []) {
319
+ if (!toolIds.has(name)) throw problem(at, `unknown tool "${name}"`, "Register it in the agent's tools or fix the name.");
320
+ }
321
+ };
322
+
323
+ const pred = (value: LoosePred | undefined, at: string, where: string): void => {
324
+ if (value === undefined || typeof value === "function") return;
325
+ for (const [name, arg] of Object.entries(value)) {
326
+ if (name === "equals") {
327
+ if (arg === null || typeof arg !== "object" || Array.isArray(arg)) {
328
+ throw problem(at, `${where}.equals is not an object`, "Write equals as { field: value }.");
329
+ }
330
+ for (const [field, given] of Object.entries(arg)) {
331
+ slug(field, at, `${where}.equals`);
332
+ const def = fields[field];
333
+ if (!matches(def, given)) {
334
+ throw problem(
335
+ at,
336
+ `${where}.equals gives "${field}" a ${describe(given)}, but the field is a ${def.type}`,
337
+ `Write a ${def.type}; values are not coerced.`,
338
+ );
339
+ }
340
+ }
341
+ } else if (name === "known") {
342
+ if (!Array.isArray(arg)) throw problem(at, `${where}.known is not a list`, "Write known as [field, ...].");
343
+ for (const field of arg) slug(String(field), at, `${where}.known`);
344
+ } else if (name === "silenced") {
345
+ if (typeof arg !== "boolean") throw problem(at, `${where}.silenced is not a boolean`, "Write true or false.");
346
+ } else if (!own(conditions, name)) {
347
+ throw problem(
348
+ at,
349
+ `unknown condition "${name}" in ${where}`,
350
+ `Register it in conditions or use ${BUILT_IN_CONDITIONS.join(", ")}.`,
351
+ );
352
+ }
353
+ }
354
+ };
355
+
356
+ const duration = (value: string | undefined, at: string, where: string): void => {
357
+ if (value !== undefined && !isDuration(value)) {
358
+ throw problem(at, `${where} has duration "${value}", which does not parse`, DURATION_HINT);
359
+ }
360
+ };
361
+
362
+ /** The step index a `Next` lands on; `'end'` and `{ flow }` land nowhere. */
363
+ const target = (next: Next<LooseData>, at: string, where: string): number | undefined => {
364
+ if (typeof next === "string") {
365
+ if (next === "end") return undefined;
366
+ const to = index.get(next);
367
+ if (to === undefined) {
368
+ throw problem(at, `${where} points at step "${next}", which does not exist`, 'Use an existing step id or "end".');
369
+ }
370
+ return to;
371
+ }
372
+ if ("flow" in next) return undefined;
373
+ const to = index.get(next.step);
374
+ if (to === undefined) {
375
+ throw problem(at, `${where} points at step "${next.step}", which does not exist`, 'Use an existing step id or "end".');
376
+ }
377
+ for (const field of next.clear ?? []) slug(field, at, `${where}.clear`);
378
+ return to;
379
+ };
380
+
381
+ /** `target`, warning when the edge goes backward without clearing anything. */
382
+ const edge = (from: number, next: Next<LooseData> | undefined, at: string, where: string): number | undefined => {
383
+ if (next === undefined) return undefined;
384
+ const to = target(next, at, where);
385
+ const clears = typeof next !== "string" && "clear" in next && (next.clear?.length ?? 0) > 0;
386
+ if (to !== undefined && to <= from && !clears) {
387
+ warnings.push(
388
+ `${at}: ${where} jumps back to "${flow.steps[to].id}" without clear; the fields collected since stay known ` +
389
+ "and those steps skip. Add clear: [...] to re-ask them.",
390
+ );
391
+ }
392
+ return to;
393
+ };
394
+
395
+ const checkWith = (at: string, name: string, params: ParamDefs, given: Record<string, unknown> = {}): void => {
396
+ for (const [param, def] of Object.entries(params)) {
397
+ const value = given[param];
398
+ if (value === undefined) {
399
+ if (!def.optional) throw problem(at, `action "${name}" needs parameter "${param}"`, "Add it to `with`.");
400
+ continue;
401
+ }
402
+ if (!matchesParam(def, value)) {
403
+ throw problem(
404
+ at,
405
+ `parameter "${param}" of action "${name}" must be ${describeDef(def)}, got ${describe(value)}`,
406
+ "Values are not coerced; write the right type.",
407
+ );
408
+ }
409
+ }
410
+ for (const param of Object.keys(given)) {
411
+ if (!own(params, param)) {
412
+ throw problem(at, `action "${name}" has no parameter "${param}"`, "Remove it or fix the name.");
413
+ }
414
+ }
415
+ };
416
+
417
+ for (const field of flow.clearOnStart ?? []) slug(field, flowAt, "clearOnStart");
418
+ pred(flow.while, flowAt, "while");
419
+ toolNames(flow.tools, flowAt);
420
+ flow.instructions?.forEach((ins, i) => pred(ins.if, flowAt, `instructions[${i}].if`));
421
+
422
+ flow.on?.forEach((trigger, i) => {
423
+ const at = `${flowAt}, trigger #${i + 1}`;
424
+ if (trigger.event !== undefined && !own(events, trigger.event)) {
425
+ throw problem(at, `unknown event "${trigger.event}"`, "Register it in events or fix the name.");
426
+ }
427
+ duration(trigger.silence, at, "silence");
428
+ duration(trigger.after, at, "after");
429
+ if (typeof trigger.repeat === "object") duration(trigger.repeat.cooldown, at, "repeat.cooldown");
430
+ pred(trigger.if, at, "if");
431
+ });
432
+
433
+ flow.steps.forEach((step, i) => {
434
+ const at = `${flowAt}, step "${step.id}"`;
435
+ const thenTo = edge(i, step.then, at, "then");
436
+ edge(i, step.else, at, "else");
437
+
438
+ if (step.collect !== undefined || step.prompt !== undefined) {
439
+ for (const field of step.collect ?? []) slug(field, at, "collect");
440
+ for (const field of Object.keys(step.ask ?? {})) slug(field, at, "ask");
441
+ const fields_ = step.collect ?? [];
442
+ if (step.prompt === undefined && fields_.length > 0 && fields_.every((f) => !step.ask?.[f] && !fields[f].ask)) {
443
+ warnings.push(
444
+ `${at}: collects ${fields_.map((f) => `"${f}"`).join(", ")} with no prompt and no ask; the AI has nothing ` +
445
+ "to go on. Add a prompt or an ask per field.",
446
+ );
447
+ }
448
+ }
449
+ step.branches?.forEach((branch, j) => {
450
+ const where = `branches[${j}]`;
451
+ if (branch.when === undefined && branch.if === undefined) {
452
+ throw problem(at, `${where} has neither when nor if`, "Give the branch an AI condition (when) or a code one (if).");
453
+ }
454
+ pred(branch.if, at, `${where}.if`);
455
+ edge(i, branch.then, at, `${where}.then`);
456
+ });
457
+ step.instructions?.forEach((ins, j) => pred(ins.if, at, `instructions[${j}].if`));
458
+ toolNames(step.tools, at);
459
+
460
+ if (step.do !== undefined) {
461
+ if (!own(actions, step.do)) {
462
+ throw problem(at, `unknown action "${step.do}"`, "Register it in actions or fix the name.");
463
+ }
464
+ checkWith(at, step.do, actions[step.do].parameters, step.with);
465
+ edge(i, step.onFail, at, "onFail");
466
+ }
467
+ if (typeof step.wait === "string") {
468
+ duration(step.wait, at, "wait");
469
+ } else if (step.wait !== undefined) {
470
+ if (!own(events, step.wait.event)) {
471
+ throw problem(at, `unknown event "${step.wait.event}" in wait`, "Register it in events or fix the name.");
472
+ }
473
+ duration(step.wait.upTo, at, "wait.upTo");
474
+ }
475
+ if (step.if !== undefined) {
476
+ pred(step.if, at, "if");
477
+ if (thenTo !== undefined && thenTo <= i && step.else === undefined) {
478
+ throw problem(
479
+ at,
480
+ `"if" jumps back to "${flow.steps[thenTo].id}" with no else`,
481
+ "Add else so the false branch has somewhere to go.",
482
+ );
483
+ }
484
+ }
485
+ });
486
+
487
+ return { warnings };
488
+ }
489
+
490
+ function matchesParam(def: ParamDef, value: unknown): boolean {
491
+ if (def.type === "array") return Array.isArray(value) && value.every((item) => matches(def.items, item));
492
+ return matches(def, value);
493
+ }
494
+
495
+ /** Strict: a string is not a number here. Enum membership is checked unless the string is a template. */
496
+ function matches(def: ScalarDef, value: unknown): boolean {
497
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") return false;
498
+ const typeOk =
499
+ def.type === "string"
500
+ ? typeof value === "string"
501
+ : def.type === "boolean"
502
+ ? typeof value === "boolean"
503
+ : typeof value === "number" && (def.type === "number" ? Number.isFinite(value) : Number.isInteger(value));
504
+ if (!typeOk) return false;
505
+ if (!def.enum || (typeof value === "string" && value.includes("{{"))) return true;
506
+ return typeof value !== "boolean" && def.enum.includes(value);
507
+ }
508
+
509
+ function describe(value: unknown): string {
510
+ return Array.isArray(value) ? "list" : value === null ? "null" : typeof value;
511
+ }
512
+
513
+ function describeDef(def: ParamDef): string {
514
+ return def.type === "array" ? `a list of ${def.items.type}` : `a ${def.type}`;
515
+ }
516
+
517
+ // ── flowSpecSchema ──────────────────────────────────────────────────────
518
+
519
+ const STRING: StructuredSchema = { type: "string" };
520
+ const NUMBER: StructuredSchema = { type: "number" };
521
+ const INTEGER: StructuredSchema = { type: "integer" };
522
+ const BOOLEAN: StructuredSchema = { type: "boolean" };
523
+ const NULL: StructuredSchema = { type: "null" };
524
+
525
+ /**
526
+ * FlowSpec's JSON schema with this workspace's actions (each with its
527
+ * parameter schema), events, conditions and field slugs as enums. Every
528
+ * object is closed and every property required, null standing for "not set",
529
+ * so Gemini accepts it as a response schema. Steps are an `anyOf` (the union
530
+ * keyword both Gemini and OpenAI strict schemas accept; `oneOf` is not)
531
+ * discriminated by `kind`, one `do` variant per action.
532
+ *
533
+ * Left out on purpose, because a model should not write them: `ui`, `tools`,
534
+ * step-level `instructions` and `ask`, a mention trigger's `extract`, and the
535
+ * `input` of `{ flow }`. A variant whose registry is empty is left out too
536
+ * (no actions: no `do` step). Condition arguments are typed loosely (string,
537
+ * number, boolean or list of strings) because conditions carry no argument
538
+ * schema yet.
539
+ */
540
+ export function flowSpecSchema(registries: Registries): StructuredSchema {
541
+ const { fields, actions = {}, events = {}, conditions = {} } = registries;
542
+ const slugs = Object.keys(fields);
543
+ const eventNames = Object.keys(events);
544
+
545
+ const slugList = slugs.length ? list(enumOf(slugs)) : undefined;
546
+ const duration = { type: "string", description: "A number and a unit: 30s, 5m, 24h, 3d" };
547
+ const condition = closed({
548
+ equals: slugs.length
549
+ ? orNull({ ...toWireSchema(fields, { nullable: true }), description: "Fields that must hold these values" })
550
+ : undefined,
551
+ known: slugList && orNull({ ...slugList, description: "Fields that must be known" }),
552
+ silenced: orNull({ ...BOOLEAN, description: "Whether the host gate is closed" }),
553
+ ...Object.fromEntries(
554
+ Object.keys(conditions).map((name) => [
555
+ name,
556
+ union([STRING, NUMBER, BOOLEAN, list(STRING)], { nullable: true, description: `Argument for condition "${name}"` }),
557
+ ]),
558
+ ),
559
+ });
560
+ const nextBranches = [
561
+ { type: "string", description: 'A step id, or "end"' },
562
+ closed({ step: STRING, clear: slugList && orNull({ ...slugList, description: "Fields to forget before jumping" }) }),
563
+ closed({ flow: { type: "string", description: "Another flow to start; this run ends" } }),
564
+ ];
565
+ const next = union(nextBranches);
566
+ const nextOrNull = union(nextBranches, { nullable: true });
567
+ const repeat = union(
568
+ [enumOf(["once", "always"]), closed({ cooldown: duration })],
569
+ { nullable: true, description: "How often a run may start: once per session or anchor, always, or after a cooldown" },
570
+ );
571
+ const triggerBase = { if: orNull(condition), repeat };
572
+ const trigger = union([
573
+ closed({ message: list(STRING, "What the lead asks for, one phrase each; [] = catch-all"), ...triggerBase }),
574
+ closed({ mention: list(STRING, "What the lead mentions, one phrase each"), ...triggerBase }),
575
+ closed({ silence: { ...duration, description: "How long the lead has been quiet" }, businessHours: orNull(BOOLEAN), ...triggerBase }),
576
+ eventNames.length
577
+ ? closed({ event: enumOf(eventNames), after: orNull(duration), businessHours: orNull(BOOLEAN), ...triggerBase })
578
+ : undefined,
579
+ ]);
580
+ const branches = orNull(
581
+ list(union([closed({ when: STRING, then: next }), closed({ if: condition, then: next })]), "Exits judged while the step asks"),
582
+ );
583
+ const stepBase = { id: STRING, label: orNull(STRING), then: nextOrNull };
584
+ const step = union([
585
+ closed({ ...stepBase, kind: enumOf(["prompt"]), prompt: { type: "string", description: "Guideline for the AI's next message" }, branches }),
586
+ slugList &&
587
+ closed({
588
+ ...stepBase,
589
+ kind: enumOf(["collect"]),
590
+ collect: { ...slugList, description: "Fields the AI asks for until they are known" },
591
+ prompt: orNull(STRING),
592
+ maxAsks: orNull({ ...INTEGER, description: "Times a field may be asked before it is skipped; default 3" }),
593
+ branches,
594
+ }),
595
+ closed({ ...stepBase, kind: enumOf(["say"]), say: { type: "string", description: "Sent verbatim" }, media: orNull(closed({ slug: STRING })), once: orNull(BOOLEAN) }),
596
+ ...Object.entries(actions).map(([name, action]) =>
597
+ closed({
598
+ ...stepBase,
599
+ kind: enumOf(["do"]),
600
+ do: enumOf([name]),
601
+ with: Object.keys(action.parameters).length ? paramsSchema(action.parameters) : undefined,
602
+ onFail: nextOrNull,
603
+ }),
604
+ ),
605
+ closed({
606
+ ...stepBase,
607
+ kind: enumOf(["wait"]),
608
+ wait: { ...duration, description: "Park this long; then = time passed, else = the lead replied" },
609
+ businessHours: orNull(BOOLEAN),
610
+ else: nextOrNull,
611
+ branches,
612
+ }),
613
+ eventNames.length
614
+ ? closed({
615
+ ...stepBase,
616
+ kind: enumOf(["waitEvent"]),
617
+ wait: closed({ event: enumOf(eventNames), upTo: orNull({ ...duration, description: "Give up after this long; default 30d" }) }),
618
+ else: nextOrNull,
619
+ })
620
+ : undefined,
621
+ closed({ ...stepBase, kind: enumOf(["if"]), if: condition, else: nextOrNull }),
622
+ ]);
623
+ const instruction = closed({
624
+ kind: orNull(enumOf(["must", "never", "should"])),
625
+ when: orNull(list(STRING, "When the rule applies, judged by the AI")),
626
+ if: orNull(condition),
627
+ prompt: STRING,
628
+ });
629
+
630
+ return closed({
631
+ id: { type: "string", description: "Short slug, unique in the workspace" },
632
+ name: STRING,
633
+ description: orNull({ type: "string", description: "When this flow should be used; the AI reads it when routing" }),
634
+ on: orNull(list(trigger, "What starts a run; null = started by hand")),
635
+ anchor: orNull({ type: "string", description: "'session' (default) or a host anchor such as 'lead'" }),
636
+ while: orNull({ ...condition, description: "The run ends when this stops holding" }),
637
+ clearOnStart: slugList && orNull({ ...slugList, description: "Fields to forget when a run starts" }),
638
+ steps: list(step, "In order; a run moves to the next step unless `then` says otherwise"),
639
+ onEnd: orNull(enumOf(["end", "stay", "reset"], "After the last step: end the run, stay on it, or reset to the first")),
640
+ instructions: orNull(list(instruction, "Rules that apply only inside this flow")),
641
+ });
642
+ }
643
+
644
+ /**
645
+ * An action's `with`: required parameters stay non-null so the model cannot
646
+ * skip them; optional ones are listed as required-but-nullable, the envelope
647
+ * style, so the object stays closed and fully required.
648
+ */
649
+ function paramsSchema(params: ParamDefs): StructuredSchema {
650
+ const wire = toWireSchema(params);
651
+ const properties = wire.properties ?? {};
652
+ for (const [name, def] of Object.entries(params)) {
653
+ if (def.optional) properties[name] = orNull(properties[name]);
654
+ }
655
+ return { ...wire, properties, required: Object.keys(params) };
656
+ }
657
+
658
+ function enumOf(values: readonly string[], description?: string): StructuredSchema {
659
+ return compact({ type: "string", enum: [...values], description });
660
+ }
661
+
662
+ function list(items: StructuredSchema, description?: string): StructuredSchema {
663
+ return compact({ type: "array", items, description });
664
+ }
665
+
666
+ /** A closed object requiring every property it lists; `undefined` entries are left out. */
667
+ function closed(properties: Record<string, StructuredSchema | undefined>): StructuredSchema {
668
+ const present: Record<string, StructuredSchema> = {};
669
+ for (const [name, schema] of Object.entries(properties)) if (schema) present[name] = schema;
670
+ return { type: "object", properties: present, required: Object.keys(present), additionalProperties: false };
671
+ }
672
+
673
+ function union(
674
+ branches: Array<StructuredSchema | undefined>,
675
+ options: { nullable?: boolean; description?: string } = {},
676
+ ): StructuredSchema {
677
+ const anyOf = branches.filter((branch): branch is StructuredSchema => branch !== undefined);
678
+ return compact({ anyOf: options.nullable ? [...anyOf, NULL] : anyOf, description: options.description });
679
+ }
680
+
681
+ /** The same schema, also accepting null. Single-typed schemas only; unions take `{ nullable: true }`. */
682
+ function orNull(schema: StructuredSchema): StructuredSchema {
683
+ return typeof schema.type === "string" ? { ...schema, type: [schema.type, "null"] } : { anyOf: [schema, NULL] };
684
+ }
685
+
686
+ // ── Shared helpers ──────────────────────────────────────────────────────
687
+
688
+ function problem(at: string, what: string, fix: string): FlowConfigurationError {
689
+ return new FlowConfigurationError(`[FlowConfigurationError] ${at}: ${what}. ${fix}`);
690
+ }
691
+
692
+ function own(record: object, key: string): boolean {
693
+ return Object.prototype.hasOwnProperty.call(record, key);
694
+ }
695
+
696
+ /** Drop `undefined` values so a spec carries only what was written. */
697
+ function compact<T extends object>(value: T): T {
698
+ return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined)) as T;
699
+ }
700
+
701
+ /** `null` means "not set" on the way in from JSON; drop it everywhere. */
702
+ function stripNulls<T>(value: T): T {
703
+ if (Array.isArray(value)) return value.map((item: unknown) => stripNulls(item)) as T;
704
+ if (value !== null && typeof value === "object") {
705
+ return Object.fromEntries(
706
+ Object.entries(value)
707
+ .filter(([, v]) => v !== null)
708
+ .map(([k, v]) => [k, stripNulls(v)]),
709
+ ) as T;
710
+ }
711
+ return value;
712
+ }