@falai/agent 3.4.5 → 4.0.0-alpha.2

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 (856) 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 +11 -6
  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/providers/ZaiProvider.d.ts +6 -4
  100. package/dist/cjs/providers/ZaiProvider.d.ts.map +1 -1
  101. package/dist/cjs/providers/ZaiProvider.js +6 -4
  102. package/dist/cjs/providers/ZaiProvider.js.map +1 -1
  103. package/dist/cjs/types/agent.d.ts +153 -383
  104. package/dist/cjs/types/agent.d.ts.map +1 -1
  105. package/dist/cjs/types/agent.js +1 -1
  106. package/dist/cjs/types/ai.d.ts +32 -1
  107. package/dist/cjs/types/ai.d.ts.map +1 -1
  108. package/dist/cjs/types/compaction.d.ts +3 -1
  109. package/dist/cjs/types/compaction.d.ts.map +1 -1
  110. package/dist/cjs/types/errors.d.ts +9 -12
  111. package/dist/cjs/types/errors.d.ts.map +1 -1
  112. package/dist/cjs/types/errors.js +14 -17
  113. package/dist/cjs/types/errors.js.map +1 -1
  114. package/dist/cjs/types/flow.d.ts +265 -513
  115. package/dist/cjs/types/flow.d.ts.map +1 -1
  116. package/dist/cjs/types/flow.js +7 -1
  117. package/dist/cjs/types/flow.js.map +1 -1
  118. package/dist/cjs/types/history.d.ts +7 -18
  119. package/dist/cjs/types/history.d.ts.map +1 -1
  120. package/dist/cjs/types/history.js.map +1 -1
  121. package/dist/cjs/types/index.d.ts +9 -15
  122. package/dist/cjs/types/index.d.ts.map +1 -1
  123. package/dist/cjs/types/index.js +4 -14
  124. package/dist/cjs/types/index.js.map +1 -1
  125. package/dist/cjs/types/session.d.ts +94 -64
  126. package/dist/cjs/types/session.d.ts.map +1 -1
  127. package/dist/cjs/types/session.js +5 -1
  128. package/dist/cjs/types/session.js.map +1 -1
  129. package/dist/cjs/types/tool.d.ts +37 -207
  130. package/dist/cjs/types/tool.d.ts.map +1 -1
  131. package/dist/cjs/types/tool.js +5 -14
  132. package/dist/cjs/types/tool.js.map +1 -1
  133. package/dist/cjs/utils/clock.d.ts +28 -0
  134. package/dist/cjs/utils/clock.d.ts.map +1 -0
  135. package/dist/cjs/utils/clock.js +64 -0
  136. package/dist/cjs/utils/clock.js.map +1 -0
  137. package/dist/cjs/utils/duration.d.ts +11 -0
  138. package/dist/cjs/utils/duration.d.ts.map +1 -0
  139. package/dist/cjs/utils/duration.js +31 -0
  140. package/dist/cjs/utils/duration.js.map +1 -0
  141. package/dist/cjs/utils/history.d.ts +4 -1
  142. package/dist/cjs/utils/history.d.ts.map +1 -1
  143. package/dist/cjs/utils/history.js +2 -2
  144. package/dist/cjs/utils/history.js.map +1 -1
  145. package/dist/cjs/utils/index.d.ts +4 -10
  146. package/dist/cjs/utils/index.d.ts.map +1 -1
  147. package/dist/cjs/utils/index.js +14 -61
  148. package/dist/cjs/utils/index.js.map +1 -1
  149. package/dist/cjs/utils/json.d.ts +2 -0
  150. package/dist/cjs/utils/json.d.ts.map +1 -1
  151. package/dist/cjs/utils/json.js +5 -0
  152. package/dist/cjs/utils/json.js.map +1 -1
  153. package/dist/cjs/utils/outcomes.d.ts +48 -0
  154. package/dist/cjs/utils/outcomes.d.ts.map +1 -0
  155. package/dist/cjs/utils/outcomes.js +51 -0
  156. package/dist/cjs/utils/outcomes.js.map +1 -0
  157. package/dist/cjs/utils/schema.d.ts +50 -0
  158. package/dist/cjs/utils/schema.d.ts.map +1 -0
  159. package/dist/cjs/utils/schema.js +138 -0
  160. package/dist/cjs/utils/schema.js.map +1 -0
  161. package/dist/cjs/utils/streamingMessage.d.ts +3 -2
  162. package/dist/cjs/utils/streamingMessage.d.ts.map +1 -1
  163. package/dist/cjs/utils/streamingMessage.js +38 -4
  164. package/dist/cjs/utils/streamingMessage.js.map +1 -1
  165. package/dist/cjs/utils/template.d.ts +13 -149
  166. package/dist/cjs/utils/template.d.ts.map +1 -1
  167. package/dist/cjs/utils/template.js +31 -363
  168. package/dist/cjs/utils/template.js.map +1 -1
  169. package/dist/cjs/utils/usage.d.ts +19 -0
  170. package/dist/cjs/utils/usage.d.ts.map +1 -0
  171. package/dist/cjs/utils/usage.js +35 -0
  172. package/dist/cjs/utils/usage.js.map +1 -0
  173. package/dist/core/Agent.d.ts +22 -378
  174. package/dist/core/Agent.d.ts.map +1 -1
  175. package/dist/core/Agent.js +107 -1181
  176. package/dist/core/Agent.js.map +1 -1
  177. package/dist/core/CompactionEngine.d.ts.map +1 -1
  178. package/dist/core/CompactionEngine.js +5 -3
  179. package/dist/core/CompactionEngine.js.map +1 -1
  180. package/dist/core/FlowSpec.d.ts +136 -0
  181. package/dist/core/FlowSpec.d.ts.map +1 -0
  182. package/dist/core/FlowSpec.js +516 -0
  183. package/dist/core/FlowSpec.js.map +1 -0
  184. package/dist/core/Migrate.d.ts +38 -0
  185. package/dist/core/Migrate.d.ts.map +1 -0
  186. package/dist/core/Migrate.js +264 -0
  187. package/dist/core/Migrate.js.map +1 -0
  188. package/dist/core/Prompt.d.ts +54 -0
  189. package/dist/core/Prompt.d.ts.map +1 -0
  190. package/dist/core/Prompt.js +133 -0
  191. package/dist/core/Prompt.js.map +1 -0
  192. package/dist/core/Runner.d.ts +160 -0
  193. package/dist/core/Runner.d.ts.map +1 -0
  194. package/dist/core/Runner.js +1127 -0
  195. package/dist/core/Runner.js.map +1 -0
  196. package/dist/core/Speak.d.ts +37 -0
  197. package/dist/core/Speak.d.ts.map +1 -0
  198. package/dist/core/Speak.js +360 -0
  199. package/dist/core/Speak.js.map +1 -0
  200. package/dist/core/Understand.d.ts +28 -0
  201. package/dist/core/Understand.d.ts.map +1 -0
  202. package/dist/core/Understand.js +349 -0
  203. package/dist/core/Understand.js.map +1 -0
  204. package/dist/core/contracts.d.ts +122 -0
  205. package/dist/core/contracts.d.ts.map +1 -0
  206. package/dist/core/contracts.js +10 -0
  207. package/dist/core/contracts.js.map +1 -0
  208. package/dist/core/falai.d.ts +57 -0
  209. package/dist/core/falai.d.ts.map +1 -0
  210. package/dist/core/falai.js +40 -0
  211. package/dist/core/falai.js.map +1 -0
  212. package/dist/core/predicate.d.ts +9 -0
  213. package/dist/core/predicate.d.ts.map +1 -0
  214. package/dist/core/predicate.js +54 -0
  215. package/dist/core/predicate.js.map +1 -0
  216. package/dist/index.d.ts +26 -31
  217. package/dist/index.d.ts.map +1 -1
  218. package/dist/index.js +19 -24
  219. package/dist/index.js.map +1 -1
  220. package/dist/persistence/MemoryStore.d.ts +15 -0
  221. package/dist/persistence/MemoryStore.d.ts.map +1 -0
  222. package/dist/persistence/MemoryStore.js +35 -0
  223. package/dist/persistence/MemoryStore.js.map +1 -0
  224. package/dist/persistence/MongoStore.d.ts +42 -0
  225. package/dist/persistence/MongoStore.d.ts.map +1 -0
  226. package/dist/persistence/MongoStore.js +56 -0
  227. package/dist/persistence/MongoStore.js.map +1 -0
  228. package/dist/persistence/OpenSearchStore.d.ts +86 -0
  229. package/dist/persistence/OpenSearchStore.d.ts.map +1 -0
  230. package/dist/persistence/OpenSearchStore.js +116 -0
  231. package/dist/persistence/OpenSearchStore.js.map +1 -0
  232. package/dist/persistence/PostgresStore.d.ts +41 -0
  233. package/dist/persistence/PostgresStore.d.ts.map +1 -0
  234. package/dist/persistence/PostgresStore.js +54 -0
  235. package/dist/persistence/PostgresStore.js.map +1 -0
  236. package/dist/persistence/PrismaStore.d.ts +65 -0
  237. package/dist/persistence/PrismaStore.d.ts.map +1 -0
  238. package/dist/persistence/PrismaStore.js +91 -0
  239. package/dist/persistence/PrismaStore.js.map +1 -0
  240. package/dist/persistence/RedisStore.d.ts +34 -0
  241. package/dist/persistence/RedisStore.d.ts.map +1 -0
  242. package/dist/persistence/RedisStore.js +57 -0
  243. package/dist/persistence/RedisStore.js.map +1 -0
  244. package/dist/persistence/SQLiteStore.d.ts +45 -0
  245. package/dist/persistence/SQLiteStore.d.ts.map +1 -0
  246. package/dist/persistence/SQLiteStore.js +70 -0
  247. package/dist/persistence/SQLiteStore.js.map +1 -0
  248. package/dist/persistence/sessionRow.d.ts +14 -0
  249. package/dist/persistence/sessionRow.d.ts.map +1 -0
  250. package/dist/persistence/sessionRow.js +45 -0
  251. package/dist/persistence/sessionRow.js.map +1 -0
  252. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  253. package/dist/providers/DeepSeekProvider.js +8 -3
  254. package/dist/providers/DeepSeekProvider.js.map +1 -1
  255. package/dist/providers/GeminiProvider.d.ts +4 -3
  256. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  257. package/dist/providers/GeminiProvider.js +4 -3
  258. package/dist/providers/GeminiProvider.js.map +1 -1
  259. package/dist/providers/OpenAICompatibleProvider.d.ts +4 -0
  260. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  261. package/dist/providers/OpenAICompatibleProvider.js +2 -0
  262. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  263. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  264. package/dist/providers/OpenRouterProvider.js +2 -4
  265. package/dist/providers/OpenRouterProvider.js.map +1 -1
  266. package/dist/providers/ProviderAdapter.d.ts +11 -6
  267. package/dist/providers/ProviderAdapter.d.ts.map +1 -1
  268. package/dist/providers/ProviderAdapter.js +34 -11
  269. package/dist/providers/ProviderAdapter.js.map +1 -1
  270. package/dist/providers/ZaiProvider.d.ts +6 -4
  271. package/dist/providers/ZaiProvider.d.ts.map +1 -1
  272. package/dist/providers/ZaiProvider.js +6 -4
  273. package/dist/providers/ZaiProvider.js.map +1 -1
  274. package/dist/types/agent.d.ts +153 -383
  275. package/dist/types/agent.d.ts.map +1 -1
  276. package/dist/types/agent.js +1 -1
  277. package/dist/types/ai.d.ts +32 -1
  278. package/dist/types/ai.d.ts.map +1 -1
  279. package/dist/types/compaction.d.ts +3 -1
  280. package/dist/types/compaction.d.ts.map +1 -1
  281. package/dist/types/errors.d.ts +9 -12
  282. package/dist/types/errors.d.ts.map +1 -1
  283. package/dist/types/errors.js +12 -15
  284. package/dist/types/errors.js.map +1 -1
  285. package/dist/types/flow.d.ts +265 -513
  286. package/dist/types/flow.d.ts.map +1 -1
  287. package/dist/types/flow.js +7 -1
  288. package/dist/types/flow.js.map +1 -1
  289. package/dist/types/history.d.ts +7 -18
  290. package/dist/types/history.d.ts.map +1 -1
  291. package/dist/types/history.js.map +1 -1
  292. package/dist/types/index.d.ts +9 -15
  293. package/dist/types/index.d.ts.map +1 -1
  294. package/dist/types/index.js +2 -7
  295. package/dist/types/index.js.map +1 -1
  296. package/dist/types/session.d.ts +94 -64
  297. package/dist/types/session.d.ts.map +1 -1
  298. package/dist/types/session.js +5 -1
  299. package/dist/types/session.js.map +1 -1
  300. package/dist/types/tool.d.ts +37 -207
  301. package/dist/types/tool.d.ts.map +1 -1
  302. package/dist/types/tool.js +6 -13
  303. package/dist/types/tool.js.map +1 -1
  304. package/dist/utils/clock.d.ts +28 -0
  305. package/dist/utils/clock.d.ts.map +1 -0
  306. package/dist/utils/clock.js +59 -0
  307. package/dist/utils/clock.js.map +1 -0
  308. package/dist/utils/duration.d.ts +11 -0
  309. package/dist/utils/duration.d.ts.map +1 -0
  310. package/dist/utils/duration.js +26 -0
  311. package/dist/utils/duration.js.map +1 -0
  312. package/dist/utils/history.d.ts +4 -1
  313. package/dist/utils/history.d.ts.map +1 -1
  314. package/dist/utils/history.js +2 -2
  315. package/dist/utils/history.js.map +1 -1
  316. package/dist/utils/index.d.ts +4 -10
  317. package/dist/utils/index.d.ts.map +1 -1
  318. package/dist/utils/index.js +4 -21
  319. package/dist/utils/index.js.map +1 -1
  320. package/dist/utils/json.d.ts +2 -0
  321. package/dist/utils/json.d.ts.map +1 -1
  322. package/dist/utils/json.js +4 -0
  323. package/dist/utils/json.js.map +1 -1
  324. package/dist/utils/outcomes.d.ts +48 -0
  325. package/dist/utils/outcomes.d.ts.map +1 -0
  326. package/dist/utils/outcomes.js +48 -0
  327. package/dist/utils/outcomes.js.map +1 -0
  328. package/dist/utils/schema.d.ts +50 -0
  329. package/dist/utils/schema.d.ts.map +1 -0
  330. package/dist/utils/schema.js +129 -0
  331. package/dist/utils/schema.js.map +1 -0
  332. package/dist/utils/streamingMessage.d.ts +3 -2
  333. package/dist/utils/streamingMessage.d.ts.map +1 -1
  334. package/dist/utils/streamingMessage.js +38 -4
  335. package/dist/utils/streamingMessage.js.map +1 -1
  336. package/dist/utils/template.d.ts +13 -149
  337. package/dist/utils/template.d.ts.map +1 -1
  338. package/dist/utils/template.js +28 -355
  339. package/dist/utils/template.js.map +1 -1
  340. package/dist/utils/usage.d.ts +19 -0
  341. package/dist/utils/usage.d.ts.map +1 -0
  342. package/dist/utils/usage.js +31 -0
  343. package/dist/utils/usage.js.map +1 -0
  344. package/docs/README.md +37 -19
  345. package/docs/concepts/architecture.md +117 -239
  346. package/docs/concepts/collection.md +170 -0
  347. package/docs/concepts/pipeline.md +132 -378
  348. package/docs/concepts/runs-and-waits.md +192 -0
  349. package/docs/guides/actions-and-events.md +276 -0
  350. package/docs/guides/branching.md +119 -208
  351. package/docs/guides/compaction.md +63 -158
  352. package/docs/guides/conditions.md +164 -128
  353. package/docs/guides/error-handling.md +168 -164
  354. package/docs/guides/flow-control.md +210 -349
  355. package/docs/guides/flows-from-json.md +224 -0
  356. package/docs/guides/instructions.md +125 -161
  357. package/docs/guides/persistence.md +182 -206
  358. package/docs/guides/streaming.md +50 -114
  359. package/docs/guides/testing.md +284 -0
  360. package/docs/guides/triggers.md +401 -0
  361. package/docs/migration/README.md +8 -15
  362. package/docs/migration/v1-to-v2.md +1 -1
  363. package/docs/migration/v2-3-to-v2-4.md +2 -2
  364. package/docs/migration/v2-6-to-v2-7.md +4 -4
  365. package/docs/migration/v3-to-v4.md +452 -0
  366. package/docs/reference/actions-events-conditions.md +396 -0
  367. package/docs/reference/agent.md +244 -0
  368. package/docs/reference/branches.md +75 -203
  369. package/docs/reference/errors.md +188 -144
  370. package/docs/reference/fields.md +125 -0
  371. package/docs/reference/flow-spec.md +248 -0
  372. package/docs/reference/flow.md +104 -192
  373. package/docs/reference/instruction.md +83 -137
  374. package/docs/reference/outcomes.md +273 -0
  375. package/docs/reference/providers.md +525 -302
  376. package/docs/reference/session.md +210 -0
  377. package/docs/reference/step.md +194 -312
  378. package/docs/reference/stores.md +496 -0
  379. package/docs/reference/tool.md +162 -231
  380. package/docs/reference/trigger.md +180 -0
  381. package/docs/rfc/v4-one-flow.md +477 -0
  382. package/docs/start/01-install.md +59 -44
  383. package/docs/start/02-first-agent.md +97 -147
  384. package/docs/start/03-collect-data.md +78 -183
  385. package/docs/start/04-add-tools.md +159 -227
  386. package/docs/start/05-go-to-production.md +167 -164
  387. package/examples/01-quickstart.ts +26 -16
  388. package/examples/02-fields.ts +75 -0
  389. package/examples/03-tools.ts +79 -119
  390. package/examples/04-instructions.ts +60 -87
  391. package/examples/05-branches.ts +78 -0
  392. package/examples/06-triggers-and-waits.ts +148 -0
  393. package/examples/07-streaming.ts +34 -60
  394. package/examples/08-store-and-migration.ts +97 -0
  395. package/examples/09-flows-from-json.ts +107 -0
  396. package/package.json +9 -6
  397. package/src/core/Agent.ts +116 -1512
  398. package/src/core/CompactionEngine.ts +7 -4
  399. package/src/core/FlowSpec.ts +712 -0
  400. package/src/core/Migrate.ts +256 -0
  401. package/src/core/Prompt.ts +156 -0
  402. package/src/core/Runner.ts +1181 -0
  403. package/src/core/Speak.ts +451 -0
  404. package/src/core/Understand.ts +422 -0
  405. package/src/core/contracts.ts +111 -0
  406. package/src/core/falai.ts +86 -0
  407. package/src/core/predicate.ts +56 -0
  408. package/src/index.ts +119 -147
  409. package/src/persistence/MemoryStore.ts +37 -0
  410. package/src/persistence/MongoStore.ts +89 -0
  411. package/src/persistence/OpenSearchStore.ts +153 -0
  412. package/src/persistence/PostgresStore.ts +89 -0
  413. package/src/persistence/PrismaStore.ts +127 -0
  414. package/src/persistence/RedisStore.ts +90 -0
  415. package/src/persistence/SQLiteStore.ts +103 -0
  416. package/src/persistence/sessionRow.ts +45 -0
  417. package/src/providers/DeepSeekProvider.ts +8 -3
  418. package/src/providers/GeminiProvider.ts +4 -3
  419. package/src/providers/OpenAICompatibleProvider.ts +6 -0
  420. package/src/providers/OpenRouterProvider.ts +2 -4
  421. package/src/providers/ProviderAdapter.ts +46 -13
  422. package/src/providers/ZaiProvider.ts +6 -4
  423. package/src/types/agent.ts +124 -397
  424. package/src/types/ai.ts +33 -1
  425. package/src/types/compaction.ts +3 -1
  426. package/src/types/errors.ts +13 -16
  427. package/src/types/flow.ts +249 -550
  428. package/src/types/history.ts +7 -20
  429. package/src/types/index.ts +87 -139
  430. package/src/types/session.ts +135 -70
  431. package/src/types/tool.ts +42 -267
  432. package/src/utils/clock.ts +70 -0
  433. package/src/utils/duration.ts +33 -0
  434. package/src/utils/history.ts +3 -2
  435. package/src/utils/index.ts +8 -66
  436. package/src/utils/json.ts +5 -0
  437. package/src/utils/outcomes.ts +56 -0
  438. package/src/utils/schema.ts +145 -0
  439. package/src/utils/streamingMessage.ts +34 -4
  440. package/src/utils/template.ts +32 -423
  441. package/src/utils/usage.ts +37 -0
  442. package/dist/adapters/MemoryAdapter.d.ts +0 -47
  443. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  444. package/dist/adapters/MemoryAdapter.js +0 -204
  445. package/dist/adapters/MemoryAdapter.js.map +0 -1
  446. package/dist/adapters/MongoAdapter.d.ts +0 -97
  447. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  448. package/dist/adapters/MongoAdapter.js +0 -196
  449. package/dist/adapters/MongoAdapter.js.map +0 -1
  450. package/dist/adapters/OpenSearchAdapter.d.ts +0 -169
  451. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  452. package/dist/adapters/OpenSearchAdapter.js +0 -471
  453. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  454. package/dist/adapters/PostgreSQLAdapter.d.ts +0 -85
  455. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  456. package/dist/adapters/PostgreSQLAdapter.js +0 -308
  457. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  458. package/dist/adapters/PrismaAdapter.d.ts +0 -115
  459. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  460. package/dist/adapters/PrismaAdapter.js +0 -406
  461. package/dist/adapters/PrismaAdapter.js.map +0 -1
  462. package/dist/adapters/RedisAdapter.d.ts +0 -72
  463. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  464. package/dist/adapters/RedisAdapter.js +0 -286
  465. package/dist/adapters/RedisAdapter.js.map +0 -1
  466. package/dist/adapters/SQLiteAdapter.d.ts +0 -86
  467. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  468. package/dist/adapters/SQLiteAdapter.js +0 -337
  469. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  470. package/dist/adapters/index.d.ts +0 -17
  471. package/dist/adapters/index.d.ts.map +0 -1
  472. package/dist/adapters/index.js +0 -11
  473. package/dist/adapters/index.js.map +0 -1
  474. package/dist/adapters/sessionRow.d.ts +0 -22
  475. package/dist/adapters/sessionRow.d.ts.map +0 -1
  476. package/dist/adapters/sessionRow.js +0 -48
  477. package/dist/adapters/sessionRow.js.map +0 -1
  478. package/dist/cjs/adapters/MemoryAdapter.d.ts +0 -47
  479. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  480. package/dist/cjs/adapters/MemoryAdapter.js +0 -208
  481. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  482. package/dist/cjs/adapters/MongoAdapter.d.ts +0 -97
  483. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  484. package/dist/cjs/adapters/MongoAdapter.js +0 -200
  485. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  486. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +0 -169
  487. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  488. package/dist/cjs/adapters/OpenSearchAdapter.js +0 -475
  489. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  490. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +0 -85
  491. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  492. package/dist/cjs/adapters/PostgreSQLAdapter.js +0 -312
  493. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  494. package/dist/cjs/adapters/PrismaAdapter.d.ts +0 -115
  495. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  496. package/dist/cjs/adapters/PrismaAdapter.js +0 -410
  497. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  498. package/dist/cjs/adapters/RedisAdapter.d.ts +0 -72
  499. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  500. package/dist/cjs/adapters/RedisAdapter.js +0 -290
  501. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  502. package/dist/cjs/adapters/SQLiteAdapter.d.ts +0 -86
  503. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  504. package/dist/cjs/adapters/SQLiteAdapter.js +0 -341
  505. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  506. package/dist/cjs/adapters/index.d.ts +0 -17
  507. package/dist/cjs/adapters/index.d.ts.map +0 -1
  508. package/dist/cjs/adapters/index.js +0 -21
  509. package/dist/cjs/adapters/index.js.map +0 -1
  510. package/dist/cjs/adapters/sessionRow.d.ts +0 -22
  511. package/dist/cjs/adapters/sessionRow.d.ts.map +0 -1
  512. package/dist/cjs/adapters/sessionRow.js +0 -52
  513. package/dist/cjs/adapters/sessionRow.js.map +0 -1
  514. package/dist/cjs/constants/index.d.ts +0 -1
  515. package/dist/cjs/constants/index.d.ts.map +0 -1
  516. package/dist/cjs/constants/index.js +0 -4
  517. package/dist/cjs/constants/index.js.map +0 -1
  518. package/dist/cjs/core/AutoChainExecutor.d.ts +0 -97
  519. package/dist/cjs/core/AutoChainExecutor.d.ts.map +0 -1
  520. package/dist/cjs/core/AutoChainExecutor.js +0 -288
  521. package/dist/cjs/core/AutoChainExecutor.js.map +0 -1
  522. package/dist/cjs/core/BranchEvaluator.d.ts +0 -55
  523. package/dist/cjs/core/BranchEvaluator.d.ts.map +0 -1
  524. package/dist/cjs/core/BranchEvaluator.js +0 -125
  525. package/dist/cjs/core/BranchEvaluator.js.map +0 -1
  526. package/dist/cjs/core/DirectiveChainTracker.d.ts +0 -49
  527. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +0 -1
  528. package/dist/cjs/core/DirectiveChainTracker.js +0 -121
  529. package/dist/cjs/core/DirectiveChainTracker.js.map +0 -1
  530. package/dist/cjs/core/Events.d.ts +0 -26
  531. package/dist/cjs/core/Events.d.ts.map +0 -1
  532. package/dist/cjs/core/Events.js +0 -144
  533. package/dist/cjs/core/Events.js.map +0 -1
  534. package/dist/cjs/core/Flow.d.ts +0 -183
  535. package/dist/cjs/core/Flow.d.ts.map +0 -1
  536. package/dist/cjs/core/Flow.js +0 -551
  537. package/dist/cjs/core/Flow.js.map +0 -1
  538. package/dist/cjs/core/FlowRouter.d.ts +0 -183
  539. package/dist/cjs/core/FlowRouter.d.ts.map +0 -1
  540. package/dist/cjs/core/FlowRouter.js +0 -1047
  541. package/dist/cjs/core/FlowRouter.js.map +0 -1
  542. package/dist/cjs/core/PersistenceManager.d.ts +0 -114
  543. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  544. package/dist/cjs/core/PersistenceManager.js +0 -336
  545. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  546. package/dist/cjs/core/PromptComposer.d.ts +0 -47
  547. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  548. package/dist/cjs/core/PromptComposer.js +0 -397
  549. package/dist/cjs/core/PromptComposer.js.map +0 -1
  550. package/dist/cjs/core/PromptSectionCache.d.ts +0 -48
  551. package/dist/cjs/core/PromptSectionCache.d.ts.map +0 -1
  552. package/dist/cjs/core/PromptSectionCache.js +0 -108
  553. package/dist/cjs/core/PromptSectionCache.js.map +0 -1
  554. package/dist/cjs/core/ResponseEngine.d.ts +0 -43
  555. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  556. package/dist/cjs/core/ResponseEngine.js +0 -235
  557. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  558. package/dist/cjs/core/ResponseGenerationError.d.ts +0 -30
  559. package/dist/cjs/core/ResponseGenerationError.d.ts.map +0 -1
  560. package/dist/cjs/core/ResponseGenerationError.js +0 -35
  561. package/dist/cjs/core/ResponseGenerationError.js.map +0 -1
  562. package/dist/cjs/core/ResponseModal.d.ts +0 -305
  563. package/dist/cjs/core/ResponseModal.d.ts.map +0 -1
  564. package/dist/cjs/core/ResponseModal.js +0 -1414
  565. package/dist/cjs/core/ResponseModal.js.map +0 -1
  566. package/dist/cjs/core/ResponsePipeline.d.ts +0 -220
  567. package/dist/cjs/core/ResponsePipeline.d.ts.map +0 -1
  568. package/dist/cjs/core/ResponsePipeline.js +0 -1040
  569. package/dist/cjs/core/ResponsePipeline.js.map +0 -1
  570. package/dist/cjs/core/SessionFinalizer.d.ts +0 -34
  571. package/dist/cjs/core/SessionFinalizer.d.ts.map +0 -1
  572. package/dist/cjs/core/SessionFinalizer.js +0 -88
  573. package/dist/cjs/core/SessionFinalizer.js.map +0 -1
  574. package/dist/cjs/core/SessionManager.d.ts +0 -112
  575. package/dist/cjs/core/SessionManager.d.ts.map +0 -1
  576. package/dist/cjs/core/SessionManager.js +0 -308
  577. package/dist/cjs/core/SessionManager.js.map +0 -1
  578. package/dist/cjs/core/SignalCoordinator.d.ts +0 -103
  579. package/dist/cjs/core/SignalCoordinator.d.ts.map +0 -1
  580. package/dist/cjs/core/SignalCoordinator.js +0 -207
  581. package/dist/cjs/core/SignalCoordinator.js.map +0 -1
  582. package/dist/cjs/core/SignalEvaluator.d.ts +0 -86
  583. package/dist/cjs/core/SignalEvaluator.d.ts.map +0 -1
  584. package/dist/cjs/core/SignalEvaluator.js +0 -319
  585. package/dist/cjs/core/SignalEvaluator.js.map +0 -1
  586. package/dist/cjs/core/SignalProcessor.d.ts +0 -152
  587. package/dist/cjs/core/SignalProcessor.d.ts.map +0 -1
  588. package/dist/cjs/core/SignalProcessor.js +0 -505
  589. package/dist/cjs/core/SignalProcessor.js.map +0 -1
  590. package/dist/cjs/core/Step.d.ts +0 -184
  591. package/dist/cjs/core/Step.d.ts.map +0 -1
  592. package/dist/cjs/core/Step.js +0 -599
  593. package/dist/cjs/core/Step.js.map +0 -1
  594. package/dist/cjs/core/StepLifecycle.d.ts +0 -43
  595. package/dist/cjs/core/StepLifecycle.d.ts.map +0 -1
  596. package/dist/cjs/core/StepLifecycle.js +0 -180
  597. package/dist/cjs/core/StepLifecycle.js.map +0 -1
  598. package/dist/cjs/core/StreamingToolExecutor.d.ts +0 -142
  599. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +0 -1
  600. package/dist/cjs/core/StreamingToolExecutor.js +0 -490
  601. package/dist/cjs/core/StreamingToolExecutor.js.map +0 -1
  602. package/dist/cjs/core/ToolLoopExecutor.d.ts +0 -133
  603. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +0 -1
  604. package/dist/cjs/core/ToolLoopExecutor.js +0 -568
  605. package/dist/cjs/core/ToolLoopExecutor.js.map +0 -1
  606. package/dist/cjs/core/ToolManager.d.ts +0 -250
  607. package/dist/cjs/core/ToolManager.d.ts.map +0 -1
  608. package/dist/cjs/core/ToolManager.js +0 -1104
  609. package/dist/cjs/core/ToolManager.js.map +0 -1
  610. package/dist/cjs/core/createAgent.d.ts +0 -35
  611. package/dist/cjs/core/createAgent.d.ts.map +0 -1
  612. package/dist/cjs/core/createAgent.js +0 -39
  613. package/dist/cjs/core/createAgent.js.map +0 -1
  614. package/dist/cjs/core/flow-namespace.d.ts +0 -64
  615. package/dist/cjs/core/flow-namespace.d.ts.map +0 -1
  616. package/dist/cjs/core/flow-namespace.js +0 -182
  617. package/dist/cjs/core/flow-namespace.js.map +0 -1
  618. package/dist/cjs/core/toolGates.d.ts +0 -24
  619. package/dist/cjs/core/toolGates.d.ts.map +0 -1
  620. package/dist/cjs/core/toolGates.js +0 -52
  621. package/dist/cjs/core/toolGates.js.map +0 -1
  622. package/dist/cjs/types/persistence.d.ts +0 -254
  623. package/dist/cjs/types/persistence.d.ts.map +0 -1
  624. package/dist/cjs/types/persistence.js +0 -7
  625. package/dist/cjs/types/persistence.js.map +0 -1
  626. package/dist/cjs/types/prompt-cache.d.ts +0 -15
  627. package/dist/cjs/types/prompt-cache.d.ts.map +0 -1
  628. package/dist/cjs/types/prompt-cache.js +0 -6
  629. package/dist/cjs/types/prompt-cache.js.map +0 -1
  630. package/dist/cjs/types/signals.d.ts +0 -263
  631. package/dist/cjs/types/signals.d.ts.map +0 -1
  632. package/dist/cjs/types/signals.js +0 -11
  633. package/dist/cjs/types/signals.js.map +0 -1
  634. package/dist/cjs/types/template.d.ts +0 -84
  635. package/dist/cjs/types/template.d.ts.map +0 -1
  636. package/dist/cjs/types/template.js +0 -3
  637. package/dist/cjs/types/template.js.map +0 -1
  638. package/dist/cjs/utils/condition.d.ts +0 -63
  639. package/dist/cjs/utils/condition.d.ts.map +0 -1
  640. package/dist/cjs/utils/condition.js +0 -239
  641. package/dist/cjs/utils/condition.js.map +0 -1
  642. package/dist/cjs/utils/event.d.ts +0 -6
  643. package/dist/cjs/utils/event.d.ts.map +0 -1
  644. package/dist/cjs/utils/event.js +0 -20
  645. package/dist/cjs/utils/event.js.map +0 -1
  646. package/dist/cjs/utils/id.d.ts +0 -33
  647. package/dist/cjs/utils/id.d.ts.map +0 -1
  648. package/dist/cjs/utils/id.js +0 -84
  649. package/dist/cjs/utils/id.js.map +0 -1
  650. package/dist/cjs/utils/serialize.d.ts +0 -36
  651. package/dist/cjs/utils/serialize.d.ts.map +0 -1
  652. package/dist/cjs/utils/serialize.js +0 -77
  653. package/dist/cjs/utils/serialize.js.map +0 -1
  654. package/dist/cjs/utils/session.d.ts +0 -124
  655. package/dist/cjs/utils/session.d.ts.map +0 -1
  656. package/dist/cjs/utils/session.js +0 -396
  657. package/dist/cjs/utils/session.js.map +0 -1
  658. package/dist/constants/index.d.ts +0 -2
  659. package/dist/constants/index.d.ts.map +0 -1
  660. package/dist/constants/index.js +0 -4
  661. package/dist/constants/index.js.map +0 -1
  662. package/dist/core/AutoChainExecutor.d.ts +0 -97
  663. package/dist/core/AutoChainExecutor.d.ts.map +0 -1
  664. package/dist/core/AutoChainExecutor.js +0 -284
  665. package/dist/core/AutoChainExecutor.js.map +0 -1
  666. package/dist/core/BranchEvaluator.d.ts +0 -55
  667. package/dist/core/BranchEvaluator.d.ts.map +0 -1
  668. package/dist/core/BranchEvaluator.js +0 -121
  669. package/dist/core/BranchEvaluator.js.map +0 -1
  670. package/dist/core/DirectiveChainTracker.d.ts +0 -49
  671. package/dist/core/DirectiveChainTracker.d.ts.map +0 -1
  672. package/dist/core/DirectiveChainTracker.js +0 -117
  673. package/dist/core/DirectiveChainTracker.js.map +0 -1
  674. package/dist/core/Events.d.ts +0 -26
  675. package/dist/core/Events.d.ts.map +0 -1
  676. package/dist/core/Events.js +0 -137
  677. package/dist/core/Events.js.map +0 -1
  678. package/dist/core/Flow.d.ts +0 -183
  679. package/dist/core/Flow.d.ts.map +0 -1
  680. package/dist/core/Flow.js +0 -547
  681. package/dist/core/Flow.js.map +0 -1
  682. package/dist/core/FlowRouter.d.ts +0 -183
  683. package/dist/core/FlowRouter.d.ts.map +0 -1
  684. package/dist/core/FlowRouter.js +0 -1043
  685. package/dist/core/FlowRouter.js.map +0 -1
  686. package/dist/core/PersistenceManager.d.ts +0 -114
  687. package/dist/core/PersistenceManager.d.ts.map +0 -1
  688. package/dist/core/PersistenceManager.js +0 -332
  689. package/dist/core/PersistenceManager.js.map +0 -1
  690. package/dist/core/PromptComposer.d.ts +0 -47
  691. package/dist/core/PromptComposer.d.ts.map +0 -1
  692. package/dist/core/PromptComposer.js +0 -393
  693. package/dist/core/PromptComposer.js.map +0 -1
  694. package/dist/core/PromptSectionCache.d.ts +0 -48
  695. package/dist/core/PromptSectionCache.d.ts.map +0 -1
  696. package/dist/core/PromptSectionCache.js +0 -104
  697. package/dist/core/PromptSectionCache.js.map +0 -1
  698. package/dist/core/ResponseEngine.d.ts +0 -43
  699. package/dist/core/ResponseEngine.d.ts.map +0 -1
  700. package/dist/core/ResponseEngine.js +0 -231
  701. package/dist/core/ResponseEngine.js.map +0 -1
  702. package/dist/core/ResponseGenerationError.d.ts +0 -30
  703. package/dist/core/ResponseGenerationError.d.ts.map +0 -1
  704. package/dist/core/ResponseGenerationError.js +0 -31
  705. package/dist/core/ResponseGenerationError.js.map +0 -1
  706. package/dist/core/ResponseModal.d.ts +0 -305
  707. package/dist/core/ResponseModal.d.ts.map +0 -1
  708. package/dist/core/ResponseModal.js +0 -1410
  709. package/dist/core/ResponseModal.js.map +0 -1
  710. package/dist/core/ResponsePipeline.d.ts +0 -220
  711. package/dist/core/ResponsePipeline.d.ts.map +0 -1
  712. package/dist/core/ResponsePipeline.js +0 -1035
  713. package/dist/core/ResponsePipeline.js.map +0 -1
  714. package/dist/core/SessionFinalizer.d.ts +0 -34
  715. package/dist/core/SessionFinalizer.d.ts.map +0 -1
  716. package/dist/core/SessionFinalizer.js +0 -84
  717. package/dist/core/SessionFinalizer.js.map +0 -1
  718. package/dist/core/SessionManager.d.ts +0 -112
  719. package/dist/core/SessionManager.d.ts.map +0 -1
  720. package/dist/core/SessionManager.js +0 -301
  721. package/dist/core/SessionManager.js.map +0 -1
  722. package/dist/core/SignalCoordinator.d.ts +0 -103
  723. package/dist/core/SignalCoordinator.d.ts.map +0 -1
  724. package/dist/core/SignalCoordinator.js +0 -203
  725. package/dist/core/SignalCoordinator.js.map +0 -1
  726. package/dist/core/SignalEvaluator.d.ts +0 -86
  727. package/dist/core/SignalEvaluator.d.ts.map +0 -1
  728. package/dist/core/SignalEvaluator.js +0 -312
  729. package/dist/core/SignalEvaluator.js.map +0 -1
  730. package/dist/core/SignalProcessor.d.ts +0 -152
  731. package/dist/core/SignalProcessor.d.ts.map +0 -1
  732. package/dist/core/SignalProcessor.js +0 -498
  733. package/dist/core/SignalProcessor.js.map +0 -1
  734. package/dist/core/Step.d.ts +0 -184
  735. package/dist/core/Step.d.ts.map +0 -1
  736. package/dist/core/Step.js +0 -594
  737. package/dist/core/Step.js.map +0 -1
  738. package/dist/core/StepLifecycle.d.ts +0 -43
  739. package/dist/core/StepLifecycle.d.ts.map +0 -1
  740. package/dist/core/StepLifecycle.js +0 -176
  741. package/dist/core/StepLifecycle.js.map +0 -1
  742. package/dist/core/StreamingToolExecutor.d.ts +0 -142
  743. package/dist/core/StreamingToolExecutor.d.ts.map +0 -1
  744. package/dist/core/StreamingToolExecutor.js +0 -483
  745. package/dist/core/StreamingToolExecutor.js.map +0 -1
  746. package/dist/core/ToolLoopExecutor.d.ts +0 -133
  747. package/dist/core/ToolLoopExecutor.d.ts.map +0 -1
  748. package/dist/core/ToolLoopExecutor.js +0 -564
  749. package/dist/core/ToolLoopExecutor.js.map +0 -1
  750. package/dist/core/ToolManager.d.ts +0 -250
  751. package/dist/core/ToolManager.d.ts.map +0 -1
  752. package/dist/core/ToolManager.js +0 -1098
  753. package/dist/core/ToolManager.js.map +0 -1
  754. package/dist/core/createAgent.d.ts +0 -35
  755. package/dist/core/createAgent.d.ts.map +0 -1
  756. package/dist/core/createAgent.js +0 -36
  757. package/dist/core/createAgent.js.map +0 -1
  758. package/dist/core/flow-namespace.d.ts +0 -64
  759. package/dist/core/flow-namespace.d.ts.map +0 -1
  760. package/dist/core/flow-namespace.js +0 -179
  761. package/dist/core/flow-namespace.js.map +0 -1
  762. package/dist/core/toolGates.d.ts +0 -24
  763. package/dist/core/toolGates.d.ts.map +0 -1
  764. package/dist/core/toolGates.js +0 -49
  765. package/dist/core/toolGates.js.map +0 -1
  766. package/dist/types/persistence.d.ts +0 -254
  767. package/dist/types/persistence.d.ts.map +0 -1
  768. package/dist/types/persistence.js +0 -6
  769. package/dist/types/persistence.js.map +0 -1
  770. package/dist/types/prompt-cache.d.ts +0 -15
  771. package/dist/types/prompt-cache.d.ts.map +0 -1
  772. package/dist/types/prompt-cache.js +0 -5
  773. package/dist/types/prompt-cache.js.map +0 -1
  774. package/dist/types/signals.d.ts +0 -263
  775. package/dist/types/signals.d.ts.map +0 -1
  776. package/dist/types/signals.js +0 -10
  777. package/dist/types/signals.js.map +0 -1
  778. package/dist/types/template.d.ts +0 -84
  779. package/dist/types/template.d.ts.map +0 -1
  780. package/dist/types/template.js +0 -2
  781. package/dist/types/template.js.map +0 -1
  782. package/dist/utils/condition.d.ts +0 -63
  783. package/dist/utils/condition.d.ts.map +0 -1
  784. package/dist/utils/condition.js +0 -230
  785. package/dist/utils/condition.js.map +0 -1
  786. package/dist/utils/event.d.ts +0 -6
  787. package/dist/utils/event.d.ts.map +0 -1
  788. package/dist/utils/event.js +0 -17
  789. package/dist/utils/event.js.map +0 -1
  790. package/dist/utils/id.d.ts +0 -33
  791. package/dist/utils/id.d.ts.map +0 -1
  792. package/dist/utils/id.js +0 -77
  793. package/dist/utils/id.js.map +0 -1
  794. package/dist/utils/serialize.d.ts +0 -36
  795. package/dist/utils/serialize.d.ts.map +0 -1
  796. package/dist/utils/serialize.js +0 -72
  797. package/dist/utils/serialize.js.map +0 -1
  798. package/dist/utils/session.d.ts +0 -124
  799. package/dist/utils/session.d.ts.map +0 -1
  800. package/dist/utils/session.js +0 -379
  801. package/dist/utils/session.js.map +0 -1
  802. package/docs/concepts/directives.md +0 -369
  803. package/docs/reference/adapters.md +0 -543
  804. package/docs/reference/create-agent.md +0 -216
  805. package/docs/reference/directive.md +0 -242
  806. package/docs/reference/signals.md +0 -368
  807. package/examples/02-data-extraction.ts +0 -90
  808. package/examples/05-branching.ts +0 -140
  809. package/examples/06-flow-control.ts +0 -103
  810. package/examples/08-persistence.ts +0 -98
  811. package/examples/09-signals.ts +0 -144
  812. package/src/adapters/MemoryAdapter.ts +0 -281
  813. package/src/adapters/MongoAdapter.ts +0 -341
  814. package/src/adapters/OpenSearchAdapter.ts +0 -693
  815. package/src/adapters/PostgreSQLAdapter.ts +0 -487
  816. package/src/adapters/PrismaAdapter.ts +0 -617
  817. package/src/adapters/RedisAdapter.ts +0 -439
  818. package/src/adapters/SQLiteAdapter.ts +0 -496
  819. package/src/adapters/index.ts +0 -43
  820. package/src/adapters/sessionRow.ts +0 -57
  821. package/src/constants/index.ts +0 -2
  822. package/src/core/AutoChainExecutor.ts +0 -397
  823. package/src/core/BranchEvaluator.ts +0 -161
  824. package/src/core/DirectiveChainTracker.ts +0 -144
  825. package/src/core/Events.ts +0 -164
  826. package/src/core/Flow.ts +0 -665
  827. package/src/core/FlowRouter.ts +0 -1540
  828. package/src/core/PersistenceManager.ts +0 -446
  829. package/src/core/PromptComposer.ts +0 -448
  830. package/src/core/PromptSectionCache.ts +0 -125
  831. package/src/core/ResponseEngine.ts +0 -338
  832. package/src/core/ResponseGenerationError.ts +0 -53
  833. package/src/core/ResponseModal.ts +0 -1902
  834. package/src/core/ResponsePipeline.ts +0 -1404
  835. package/src/core/SessionFinalizer.ts +0 -108
  836. package/src/core/SessionManager.ts +0 -372
  837. package/src/core/SignalCoordinator.ts +0 -263
  838. package/src/core/SignalEvaluator.ts +0 -404
  839. package/src/core/SignalProcessor.ts +0 -663
  840. package/src/core/Step.ts +0 -782
  841. package/src/core/StepLifecycle.ts +0 -242
  842. package/src/core/StreamingToolExecutor.ts +0 -609
  843. package/src/core/ToolLoopExecutor.ts +0 -749
  844. package/src/core/ToolManager.ts +0 -1379
  845. package/src/core/createAgent.ts +0 -40
  846. package/src/core/flow-namespace.ts +0 -227
  847. package/src/core/toolGates.ts +0 -72
  848. package/src/types/persistence.ts +0 -303
  849. package/src/types/prompt-cache.ts +0 -17
  850. package/src/types/signals.ts +0 -338
  851. package/src/types/template.ts +0 -98
  852. package/src/utils/condition.ts +0 -296
  853. package/src/utils/event.ts +0 -16
  854. package/src/utils/id.ts +0 -91
  855. package/src/utils/serialize.ts +0 -86
  856. package/src/utils/session.ts +0 -501
@@ -1,263 +0,0 @@
1
- /**
2
- * SignalCoordinator owns the signal pre/post phase orchestration for a turn:
3
- *
4
- * - `runPrePhase()` / `runPostPhase()` — delegation to the SignalProcessor,
5
- * returning a stable empty shape when no processor is configured.
6
- * - `applyPositionDirective()` — applies a pre-phase directive's position
7
- * field (goTo, goToStep, complete, abort, reset) as the turn's routing
8
- * decision, discarding the router's result.
9
- * - `applyPostPhase()` — runs the post phase and applies its directive to
10
- * the turn result in one step: session updates, pendingDirective for
11
- * position fields (no mid-turn re-entry per D6), and the reply override
12
- * of the user-visible message.
13
- */
14
-
15
- import type { Directive, Event, SessionState } from "../types/index.js";
16
- import type { SignalFiring } from "../types/signals.js";
17
- import type { SignalProcessor } from "./SignalProcessor.js";
18
- import type { Flow } from "./Flow.js";
19
- import type { Step } from "./Step.js";
20
- import { hasDirectivePositionField } from "./ResponsePipeline.js";
21
- import { enterFlow, enterStep, mergeCollected, logger } from "../utils/index.js";
22
-
23
- /** Result of a signal phase run (pre or post). */
24
- export interface SignalPhaseResult<TContext = unknown, TData = unknown> {
25
- firings: SignalFiring<TContext, TData>[];
26
- updatedSession: SessionState<TData>;
27
- mergedDirective: Directive<TContext, TData> | undefined;
28
- }
29
-
30
- export class SignalCoordinator<TContext = unknown, TData = unknown> {
31
- constructor(
32
- private readonly deps: {
33
- getFlows: () => Flow<TContext, TData>[];
34
- signalProcessor?: SignalProcessor<TContext, TData>;
35
- }
36
- ) { }
37
-
38
- /** Whether a signal processor is configured (zero-cost path when absent). */
39
- get enabled(): boolean {
40
- return this.deps.signalProcessor !== undefined;
41
- }
42
-
43
- /**
44
- * PRE-SIGNAL PHASE — Evaluates pre/both signals in parallel with routing.
45
- *
46
- * Delegates to `signalProcessor.runPreSignalPhase(...)` when configured.
47
- * When no signal processor is present (zero-cost path), returns a stable
48
- * empty shape so callers don't need to branch.
49
- *
50
- * @requirements 2.1, 2.3, 8.6, 13.3
51
- */
52
- async runPrePhase(
53
- session: SessionState<TData>,
54
- context: TContext,
55
- history: Event[],
56
- ): Promise<SignalPhaseResult<TContext, TData>> {
57
- if (!this.deps.signalProcessor) {
58
- return { firings: [], updatedSession: session, mergedDirective: undefined };
59
- }
60
- const result = await this.deps.signalProcessor.runPreSignalPhase({ session, history, context });
61
- return {
62
- firings: result.firings,
63
- updatedSession: result.updatedSession,
64
- mergedDirective: result.mergedDirective,
65
- };
66
- }
67
-
68
- /**
69
- * POST-SIGNAL PHASE — Evaluates post/both signals after finalize/onComplete.
70
- *
71
- * Delegates to `signalProcessor.runPostSignalPhase(...)` when configured.
72
- * When no signal processor is present, returns a stable empty shape.
73
- *
74
- * Post-phase signals see the complete turn result: assistant message in history,
75
- * collected data, tool results. Position directives from this phase set
76
- * `session.pendingDirective` (no mid-turn re-entry per D6 decision).
77
- *
78
- * Pre-LLM-only fields (`appendPrompt`, `injectTools`, `halt`) are already
79
- * dropped inside `runPostSignalPhase` per Phase 4.5 — this seam does NOT
80
- * re-introduce them.
81
- *
82
- * @requirements 9.1, 9.2, 9.3, 9.4
83
- */
84
- async runPostPhase(
85
- session: SessionState<TData>,
86
- context: TContext,
87
- history: Event[],
88
- ): Promise<SignalPhaseResult<TContext, TData>> {
89
- if (!this.deps.signalProcessor) {
90
- return { firings: [], updatedSession: session, mergedDirective: undefined };
91
- }
92
- const result = await this.deps.signalProcessor.runPostSignalPhase({ session, history, context });
93
- return {
94
- firings: result.firings,
95
- updatedSession: result.updatedSession,
96
- mergedDirective: result.mergedDirective,
97
- };
98
- }
99
-
100
- /**
101
- * Run the post phase and apply its merged directive to the turn result:
102
- * session updates from the phase, `pendingDirective` for position fields
103
- * (Requirement 9.3, no mid-turn re-entry per D6), and the reply override
104
- * of the user-visible message (undefined means "leave it unchanged"; an
105
- * empty string is an explicit replacement).
106
- *
107
- * @requirements 9.1, 9.2, 9.3, 9.4
108
- */
109
- async applyPostPhase(params: {
110
- session: SessionState<TData>;
111
- context: TContext;
112
- historyEvents: Event[];
113
- message: string;
114
- }): Promise<{
115
- session: SessionState<TData>;
116
- message: string;
117
- firings: SignalFiring<TContext, TData>[];
118
- /** True when the directive's `reply` replaced the message. */
119
- replyOverridden: boolean;
120
- }> {
121
- const postResult = await this.runPostPhase(
122
- params.session, params.context, params.historyEvents,
123
- );
124
- let session = postResult.updatedSession;
125
-
126
- // Requirement 9.3: Post-phase position directive sets session.pendingDirective
127
- if (postResult.mergedDirective && hasDirectivePositionField(postResult.mergedDirective)) {
128
- session = { ...session, pendingDirective: postResult.mergedDirective };
129
- }
130
-
131
- const replyOverridden = postResult.mergedDirective?.reply !== undefined;
132
- const message = replyOverridden
133
- ? postResult.mergedDirective!.reply!
134
- : params.message;
135
-
136
- return { session, message, firings: postResult.firings, replyOverridden };
137
- }
138
-
139
- /**
140
- * Apply a signal's position directive (goTo, goToStep, complete, abort, reset).
141
- * Discards routing result and uses the signal's position decision.
142
- *
143
- * @requirements 8.3
144
- */
145
- applyPositionDirective(
146
- signalResult: {
147
- firings: SignalFiring<TContext, TData>[];
148
- updatedSession: SessionState<TData>;
149
- mergedDirective: Directive<TContext, TData> | undefined;
150
- },
151
- ): {
152
- selectedFlow?: Flow<TContext, TData>;
153
- selectedStep?: Step<TContext, TData>;
154
- responseDirectives?: string[];
155
- session: SessionState<TData>;
156
- isFlowComplete: boolean;
157
- signalFirings?: SignalFiring<TContext, TData>[];
158
- signalPreDirective?: Directive<TContext, TData>;
159
- signalHalted?: boolean;
160
- signalHaltReply?: string;
161
- } {
162
- const directive = signalResult.mergedDirective!;
163
- let session = signalResult.updatedSession;
164
- const flows = this.deps.getFlows();
165
- let selectedFlow: Flow<TContext, TData> | undefined;
166
- let selectedStep: Step<TContext, TData> | undefined;
167
- let isFlowComplete = false;
168
-
169
- // Apply data updates if present alongside position
170
- if (directive.dataUpdate) {
171
- session = mergeCollected(session, directive.dataUpdate);
172
- }
173
-
174
- if (directive.goTo) {
175
- const flowTarget = typeof directive.goTo === 'string'
176
- ? directive.goTo
177
- : directive.goTo.flow ?? directive.goTo.step;
178
-
179
- if (flowTarget) {
180
- const targetFlow = flows.find(f => f.id === flowTarget || f.title === flowTarget);
181
- if (targetFlow) {
182
- session = enterFlow(session, targetFlow.id, targetFlow.title);
183
- selectedFlow = targetFlow;
184
-
185
- if (typeof directive.goTo === 'object' && directive.goTo.step) {
186
- const targetStep = targetFlow.getStep(directive.goTo.step);
187
- if (targetStep) {
188
- session = enterStep(session, targetStep.id, targetStep.description);
189
- selectedStep = targetStep;
190
- }
191
- }
192
- } else {
193
- logger.warn(`[Signals] Pre-phase goTo target not found: "${flowTarget}". Falling back to no flow.`);
194
- }
195
- }
196
- } else if (directive.goToStep) {
197
- const stepTarget = typeof directive.goToStep === 'string'
198
- ? directive.goToStep
199
- : directive.goToStep.step;
200
- const flowTarget = typeof directive.goToStep === 'object'
201
- ? directive.goToStep.flow
202
- : undefined;
203
-
204
- if (flowTarget) {
205
- const targetFlow = flows.find(f => f.id === flowTarget || f.title === flowTarget);
206
- if (targetFlow) {
207
- session = enterFlow(session, targetFlow.id, targetFlow.title);
208
- selectedFlow = targetFlow;
209
- const targetStep = targetFlow.getStep(stepTarget);
210
- if (targetStep) {
211
- session = enterStep(session, targetStep.id, targetStep.description);
212
- selectedStep = targetStep;
213
- }
214
- }
215
- } else if (session.currentFlow) {
216
- const currentFlow = flows.find(f => f.id === session.currentFlow?.id);
217
- if (currentFlow) {
218
- selectedFlow = currentFlow;
219
- const targetStep = currentFlow.getStep(stepTarget);
220
- if (targetStep) {
221
- session = enterStep(session, targetStep.id, targetStep.description);
222
- selectedStep = targetStep;
223
- }
224
- }
225
- }
226
- } else if (directive.complete) {
227
- isFlowComplete = true;
228
- } else if (directive.abort) {
229
- // Abort — no flow, session cleared or marked
230
- isFlowComplete = true;
231
- } else if (directive.reset) {
232
- if (session.currentFlow) {
233
- const currentFlow = flows.find(f => f.id === session.currentFlow?.id);
234
- if (currentFlow) {
235
- selectedFlow = currentFlow;
236
- const resetStep = typeof directive.reset === 'object' && directive.reset.step
237
- ? directive.reset.step
238
- : undefined;
239
- if (resetStep) {
240
- const targetStep = currentFlow.getStep(resetStep);
241
- if (targetStep) {
242
- session = enterStep(session, targetStep.id, targetStep.description);
243
- selectedStep = targetStep;
244
- }
245
- } else {
246
- const initialStep = currentFlow.initialStep;
247
- session = enterStep(session, initialStep.id, initialStep.description);
248
- selectedStep = initialStep;
249
- }
250
- }
251
- }
252
- }
253
-
254
- return {
255
- selectedFlow,
256
- selectedStep,
257
- session,
258
- isFlowComplete,
259
- signalFirings: signalResult.firings,
260
- signalPreDirective: signalResult.mergedDirective || undefined,
261
- };
262
- }
263
- }
@@ -1,404 +0,0 @@
1
- /**
2
- * SignalEvaluator — Batched AI classifier + extraction for signals.
3
- *
4
- * Handles:
5
- * - `evaluateIf`: code-first predicate evaluation (AND semantics, short-circuit)
6
- * - `evaluateSignals`: single batched provider call for detection + extraction
7
- * - `buildSignalClassifierPrompt` / `buildMergedSchema`: prompt & schema construction
8
- *
9
- * @module SignalEvaluator
10
- */
11
-
12
- import type { AiProvider } from "../types/ai.js";
13
- import type { Event } from "../types/history.js";
14
- import type { SessionState } from "../types/session.js";
15
- import type {
16
- Signal,
17
- SignalPredicate,
18
- SignalPredicateContext,
19
- } from "../types/signals.js";
20
- import { eventsToHistory, logger } from "../utils/index.js";
21
- import { splitWhenConditions, evaluateIfPredicates } from "../utils/condition.js";
22
-
23
- // ──────────────────────────────────────────────────────────────────────────────
24
- // Types
25
- // ──────────────────────────────────────────────────────────────────────────────
26
-
27
- export interface SignalEvaluationResult {
28
- matched: boolean;
29
- reason?: string;
30
- extracted?: unknown;
31
- }
32
-
33
- export interface EvaluateSignalsParams<TContext = unknown, TData = unknown> {
34
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
- signals: Signal<TContext, TData, any>[];
36
- session: SessionState<TData>;
37
- history: Event[];
38
- context: TContext;
39
- }
40
-
41
- // ──────────────────────────────────────────────────────────────────────────────
42
- // Prompt builder (exported for testing)
43
- // ──────────────────────────────────────────────────────────────────────────────
44
-
45
- /**
46
- * Builds the classifier prompt for a batch of signals.
47
- *
48
- * Splits `when` entries with the shared ConditionWhen parser:
49
- * - Positive entries → "TRIGGER WHEN (ANY matches)"
50
- * - `!` entries → prefix stripped, "DO NOT TRIGGER WHEN (ANY inhibits)"
51
- *
52
- * Extraction schemas render under "WHEN MATCHED, EXTRACT".
53
- * Unconditional + extract signals render under "ALWAYS EXTRACT".
54
- */
55
- export function buildSignalClassifierPrompt<TContext = unknown, TData = unknown>(
56
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
- signals: Signal<TContext, TData, any>[],
58
- history: Event[],
59
- _context: TContext,
60
- ): string {
61
- const header = [
62
- "You are evaluating signals for this conversation.",
63
- "",
64
- "For each signal, decide whether it matched based on the most recent user message AND the conversation context. Be conservative: only mark a signal matched when there is CLEAR, EXPLICIT evidence.",
65
- "Positive TRIGGER WHEN entries are alternatives: ANY one positive entry can trigger the signal. DO NOT TRIGGER WHEN entries are exclusions: ANY one exclusion inhibits the signal.",
66
- ].join("\n");
67
-
68
- const signalBlocks: string[] = [];
69
-
70
- for (const signal of signals) {
71
- const id = signal.id ?? "unknown";
72
- const title = signal.title ?? id;
73
- const lines: string[] = [];
74
-
75
- // Header
76
- lines.push(`- SIGNAL "${id}" | "${title}"`);
77
-
78
- // Description
79
- if (signal.description) {
80
- lines.push(` DESCRIPTION: ${signal.description}`);
81
- }
82
-
83
- // Split when entries
84
- const whenConditions = splitWhenConditions(signal.when);
85
- const positiveEntries = whenConditions.positive;
86
- const negativeEntries = whenConditions.negative;
87
-
88
- const isUnconditional = positiveEntries.length === 0 && negativeEntries.length === 0;
89
-
90
- if (isUnconditional && signal.extract) {
91
- // Unconditional + extract → ALWAYS EXTRACT
92
- lines.push(` ALWAYS EXTRACT`);
93
- } else if (positiveEntries.length > 0) {
94
- lines.push(` TRIGGER WHEN (ANY matches):`);
95
- for (const entry of positiveEntries) {
96
- lines.push(` • ${entry}`);
97
- }
98
- } else if (negativeEntries.length > 0) {
99
- lines.push(` TRIGGER WHEN: no positive condition; trigger unless an exclusion matches.`);
100
- }
101
-
102
- if (negativeEntries.length > 0) {
103
- lines.push(` DO NOT TRIGGER WHEN (ANY inhibits):`);
104
- for (const entry of negativeEntries) {
105
- lines.push(` • ${entry}`);
106
- }
107
- }
108
-
109
- // Extraction schema
110
- if (signal.extract) {
111
- lines.push(` WHEN MATCHED, EXTRACT:`);
112
- const schemaLines = renderExtractionSchema(signal.extract);
113
- for (const line of schemaLines) {
114
- lines.push(` • ${line}`);
115
- }
116
- }
117
-
118
- signalBlocks.push(lines.join("\n"));
119
- }
120
-
121
- // Render conversation history
122
- const historySection = renderHistoryForClassifier(history);
123
-
124
- const outputInstructions = [
125
- "# OUTPUT",
126
- "For each signal, return:",
127
- " { id, matched, reason (required when matched=true) }",
128
- " + extracted fields (when signal defines extraction and matched=true)",
129
- ].join("\n");
130
-
131
- return [
132
- header,
133
- "",
134
- "# SIGNALS",
135
- "",
136
- signalBlocks.join("\n\n"),
137
- "",
138
- historySection,
139
- "",
140
- outputInstructions,
141
- ].join("\n");
142
- }
143
-
144
- // ──────────────────────────────────────────────────────────────────────────────
145
- // Schema builder (exported for testing)
146
- // ──────────────────────────────────────────────────────────────────────────────
147
-
148
- /**
149
- * Builds the merged JSON schema for the classifier response.
150
- *
151
- * Shape: `{ signals: [{ id, matched, reason?, extracted? }, ...] }`
152
- * where `extracted` is only present for signals with `extract` set.
153
- */
154
- export function buildMergedSchema<TContext = unknown, TData = unknown>(
155
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
156
- signals: Signal<TContext, TData, any>[],
157
- ): Record<string, unknown> {
158
- const signalEntrySchemas = signals.map(signal => {
159
- const entry: Record<string, unknown> = {
160
- type: "object",
161
- properties: {
162
- id: { type: "string", description: "Signal identifier" },
163
- matched: { type: "boolean", description: "Whether the signal matched" },
164
- reason: { type: "string", description: "Reason for the match (required when matched=true)" },
165
- },
166
- required: ["id", "matched"],
167
- additionalProperties: false,
168
- };
169
-
170
- // Add extracted field only when signal has extract schema
171
- if (signal.extract) {
172
- (entry.properties as Record<string, unknown>).extracted = signal.extract;
173
- entry.additionalProperties = false;
174
- }
175
-
176
- return entry;
177
- });
178
-
179
- return {
180
- type: "object",
181
- properties: {
182
- signals: {
183
- type: "array",
184
- items: {
185
- anyOf: signalEntrySchemas,
186
- },
187
- description: "Evaluation results for each signal",
188
- },
189
- },
190
- required: ["signals"],
191
- additionalProperties: false,
192
- };
193
- }
194
-
195
- // ──────────────────────────────────────────────────────────────────────────────
196
- // SignalEvaluator class
197
- // ──────────────────────────────────────────────────────────────────────────────
198
-
199
- export class SignalEvaluator<TContext = unknown, TData = unknown> {
200
- constructor(private readonly provider: AiProvider) { }
201
-
202
- /**
203
- * Code-first predicate evaluation with AND semantics and short-circuit.
204
- *
205
- * Normalizes predicates to an array. Awaits each; returns false on first
206
- * falsy result. Catches throws/rejections, logs at ERROR with predicate
207
- * index, and returns false (signal treated as non-match).
208
- */
209
- async evaluateIf(
210
- predicates: SignalPredicate<TContext, TData> | SignalPredicate<TContext, TData>[],
211
- ctx: SignalPredicateContext<TContext, TData>,
212
- ): Promise<boolean> {
213
- return evaluateIfPredicates<SignalPredicateContext<TContext, TData>>(
214
- predicates, ctx, "Signals"
215
- );
216
- }
217
-
218
- /**
219
- * Batched AI classifier + extraction call (Algorithm 3).
220
- *
221
- * Builds the classifier prompt and merged schema, makes a single provider
222
- * call, and parses the response into an id → result map. Any signal absent
223
- * from the response defaults to `{ matched: false }`. Provider errors are
224
- * caught and logged; all signals default to non-match.
225
- */
226
- async evaluateSignals(
227
- params: EvaluateSignalsParams<TContext, TData>,
228
- ): Promise<Record<string, SignalEvaluationResult>> {
229
- const { signals, history, context } = params;
230
-
231
- // Build prompt and schema
232
- const prompt = buildSignalClassifierPrompt(signals, history, context);
233
- const jsonSchema = buildMergedSchema(signals);
234
-
235
- try {
236
- const response = await this.provider.generateMessage<TContext, { signals: Array<{ id: string; matched: boolean; reason?: string; extracted?: unknown }> }>({
237
- prompt,
238
- history: eventsToHistory(history),
239
- context,
240
- parameters: {
241
- jsonSchema,
242
- schemaName: "signal_evaluation",
243
- },
244
- });
245
-
246
- // Parse response into id → result map
247
- const results: Record<string, SignalEvaluationResult> = {};
248
- const entries = response.structured?.signals ?? [];
249
-
250
- for (const entry of entries) {
251
- results[entry.id] = {
252
- matched: entry.matched,
253
- reason: entry.matched ? entry.reason : undefined,
254
- extracted: entry.matched ? entry.extracted : undefined,
255
- };
256
- }
257
-
258
- // Defensive defaults: any signal absent from the response → matched: false
259
- for (const signal of signals) {
260
- const id = signal.id ?? "unknown";
261
- if (!results[id]) {
262
- results[id] = { matched: false };
263
- }
264
- }
265
-
266
- return results;
267
- } catch (error) {
268
- logger.error(
269
- `[Signals] Classifier call failed: ${error instanceof Error ? error.message : String(error)}`,
270
- );
271
-
272
- // On provider error, all signals default to non-match
273
- const results: Record<string, SignalEvaluationResult> = {};
274
- for (const signal of signals) {
275
- const id = signal.id ?? "unknown";
276
- results[id] = { matched: false };
277
- }
278
- return results;
279
- }
280
- }
281
-
282
- /**
283
- * Parallel batched evaluation. Splits signals into batches of `batchSize`,
284
- * evaluates each batch via `evaluateSignals` in parallel using `Promise.all`,
285
- * and merges all result maps into a single record.
286
- *
287
- * No key collisions because signal ids are unique within a phase.
288
- */
289
- async evaluateSignalsBatched(params: {
290
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
291
- signals: Signal<TContext, TData, any>[];
292
- batchSize?: number;
293
- session: SessionState<TData>;
294
- history: Event[];
295
- context: TContext;
296
- }): Promise<Record<string, SignalEvaluationResult>> {
297
- const { signals, batchSize = 10, session, history, context } = params;
298
-
299
- if (signals.length === 0) return {};
300
-
301
- const batches = splitIntoBatches(signals, batchSize);
302
-
303
- const batchResults = await Promise.all(
304
- batches.map(batch =>
305
- this.evaluateSignals({ signals: batch, session, history, context }),
306
- ),
307
- );
308
-
309
- // Merge all batch result maps into a single record
310
- const merged: Record<string, SignalEvaluationResult> = {};
311
- for (const result of batchResults) {
312
- Object.assign(merged, result);
313
- }
314
- return merged;
315
- }
316
- }
317
-
318
- // ──────────────────────────────────────────────────────────────────────────────
319
- // Batch helper (exported for testing)
320
- // ──────────────────────────────────────────────────────────────────────────────
321
-
322
- /**
323
- * Splits an array into fixed-size chunks.
324
- *
325
- * Returns an array of sub-arrays, each of at most `batchSize` elements.
326
- * The last chunk may be shorter. Returns an empty array when `items` is empty.
327
- */
328
- export function splitIntoBatches<T>(items: T[], batchSize: number): T[][] {
329
- if (items.length === 0) return [];
330
-
331
- const batches: T[][] = [];
332
- for (let i = 0; i < items.length; i += batchSize) {
333
- batches.push(items.slice(i, i + batchSize));
334
- }
335
- return batches;
336
- }
337
-
338
- // ──────────────────────────────────────────────────────────────────────────────
339
- // Internal helpers
340
- // ──────────────────────────────────────────────────────────────────────────────
341
-
342
- /**
343
- * Render extraction schema properties as human-readable lines for the prompt.
344
- * Lists each property's name, type, and constraints (enum, min/max, format).
345
- */
346
- function renderExtractionSchema(schema: Record<string, unknown>): string[] {
347
- const lines: string[] = [];
348
- const properties = schema.properties as Record<string, Record<string, unknown>> | undefined;
349
-
350
- if (!properties) return lines;
351
-
352
- for (const [name, fieldSchema] of Object.entries(properties)) {
353
- if (!fieldSchema || typeof fieldSchema !== "object") continue;
354
-
355
- const type = (fieldSchema.type as string) ?? "unknown";
356
- let line = `${name} (${type})`;
357
-
358
- // Add constraints
359
- const constraints: string[] = [];
360
-
361
- if (fieldSchema.enum && Array.isArray(fieldSchema.enum)) {
362
- constraints.push((fieldSchema.enum as string[]).join("|"));
363
- }
364
- if (fieldSchema.minimum !== undefined || fieldSchema.maximum !== undefined) {
365
- const min = fieldSchema.minimum !== undefined ? `${fieldSchema.minimum as number}` : "";
366
- const max = fieldSchema.maximum !== undefined ? `${fieldSchema.maximum as number}` : "";
367
- constraints.push(`${min}-${max}`);
368
- }
369
- if (fieldSchema.format) {
370
- constraints.push(fieldSchema.format as string);
371
- }
372
-
373
- if (constraints.length > 0) {
374
- line += `, ${constraints.join(", ")}`;
375
- }
376
-
377
- // Add description
378
- if (fieldSchema.description) {
379
- line += `: ${fieldSchema.description as string}`;
380
- }
381
-
382
- lines.push(line);
383
- }
384
-
385
- return lines;
386
- }
387
-
388
- /**
389
- * Render conversation history into a simple text block for the classifier prompt.
390
- */
391
- function renderHistoryForClassifier(history: Event[]): string {
392
- if (history.length === 0) return "# CONVERSATION HISTORY\n(empty)";
393
-
394
- const lines: string[] = ["# CONVERSATION HISTORY"];
395
- for (const event of history) {
396
- const source = event.source ?? "unknown";
397
- const data = event.data as { message?: string } | undefined;
398
- const message = data?.message ?? "";
399
- if (message) {
400
- lines.push(`${source}: ${message}`);
401
- }
402
- }
403
- return lines.join("\n");
404
- }