@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,663 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- /**
3
- * SignalProcessor — Orchestration for signal phase execution.
4
- *
5
- * Owns:
6
- * - `behaviorAllowsExecution`: Behavior gating (Algorithm 2)
7
- * - `recordTrigger`: Immutable session update for trigger state
8
- * - `buildSignalContext`: Constructs the handler context (D-Q12 writers)
9
- * - `runPhase` / `runPreSignalPhase` / `runPostSignalPhase`: Phase orchestration (Algorithm 1)
10
- *
11
- * @module SignalProcessor
12
- */
13
-
14
- import type { AiProvider } from "../types/ai.js";
15
- import type { Event } from "../types/history.js";
16
- import { MessageRole as MessageRoleEnum } from "../types/history.js";
17
- import type { SessionState } from "../types/session.js";
18
- import type { Directive } from "../types/flow.js";
19
- import type {
20
- Signal,
21
- SignalContext,
22
- SignalDirective,
23
- SignalFiring,
24
- SignalPredicateContext,
25
- SignalTriggerState,
26
- } from "../types/signals.js";
27
- import type { SignalEvaluator } from "./SignalEvaluator.js";
28
- import { flow } from "./flow-namespace.js";
29
- import { logger } from "../utils/index.js";
30
-
31
- /** Recorded on `SignalFiring.extractionError` when a matched extraction-mode
32
- * signal yields no payload (model omitted the field or returned null). */
33
- const EXTRACTION_MISSING_MESSAGE =
34
- "Signal matched in extraction mode but the classifier returned no extracted payload.";
35
-
36
- // ──────────────────────────────────────────────────────────────────────────────
37
- // behaviorAllowsExecution — Algorithm 2
38
- // ──────────────────────────────────────────────────────────────────────────────
39
-
40
- /**
41
- * Determines whether a signal's behavior gating allows execution this turn.
42
- *
43
- * Algorithm 2 from the design document:
44
- * - `'always'` (or unset) → always allowed
45
- * - `'once'` → allowed only if no prior trigger exists
46
- * - `'cooldown'` → allowed when elapsed time since last trigger >= cooldownMs;
47
- * when `cooldownMs` is missing, treated as `'always'` (misconfigured)
48
- * - Missing trigger (first-time) → allowed regardless of behavior
49
- *
50
- * Pure function; no I/O.
51
- *
52
- * @param signal - The signal definition (with id, behavior, cooldownMs)
53
- * @param trigger - The existing trigger state from `session.signals.triggers[signal.id]`, or undefined
54
- * @returns true if the signal is allowed to execute
55
- *
56
- * @requirements 5.1, 5.2, 5.3, 5.4
57
- */
58
- export function behaviorAllowsExecution<TContext = unknown, TData = unknown>(
59
- signal: Signal<TContext, TData, any>,
60
- trigger: SignalTriggerState | undefined,
61
- ): boolean {
62
- // No prior trigger → always allowed (first-time execution)
63
- if (trigger == null) return true;
64
-
65
- const behavior = signal.behavior ?? 'always';
66
-
67
- if (behavior === 'always') return true;
68
- if (behavior === 'once') return false;
69
-
70
- if (behavior === 'cooldown') {
71
- // Misconfigured: cooldown without cooldownMs → treat as 'always'
72
- if (signal.cooldownMs == null) return true;
73
-
74
- const lastTriggeredTime = trigger.lastTriggeredAt instanceof Date
75
- ? trigger.lastTriggeredAt.getTime()
76
- : new Date(trigger.lastTriggeredAt).getTime();
77
-
78
- const elapsedMs = Date.now() - lastTriggeredTime;
79
- return elapsedMs >= signal.cooldownMs;
80
- }
81
-
82
- // Unknown behavior value → allow (defensive)
83
- return true;
84
- }
85
-
86
- // ──────────────────────────────────────────────────────────────────────────────
87
- // recordTrigger — Immutable session update
88
- // ──────────────────────────────────────────────────────────────────────────────
89
-
90
- /**
91
- * Records a signal trigger on the session, returning a new session object
92
- * (immutable update — never mutates input).
93
- *
94
- * - On first trigger: sets `firstTriggeredAt` and `lastTriggeredAt` to now,
95
- * `count = 1`, plus `lastReason` and `lastPhase`.
96
- * - On subsequent triggers: leaves `firstTriggeredAt` unchanged, increments
97
- * `count`, updates `lastTriggeredAt`, `lastReason`, `lastPhase`.
98
- *
99
- * @param session - Current session state (not mutated)
100
- * @param signal - The signal that fired
101
- * @param reason - The match reason (AI rationale, 'code-only', or 'unconditional')
102
- * @param phase - The phase in which the signal fired
103
- * @returns A new session with updated `signals.triggers[signal.id]`
104
- *
105
- * @requirements 10.1, 10.2
106
- */
107
- export function recordTrigger<TData = unknown>(
108
- session: SessionState<TData>,
109
- signal: Signal<any, TData, any>,
110
- reason: string,
111
- phase: 'pre' | 'post',
112
- ): SessionState<TData> {
113
- const signalId = signal.id ?? 'unknown';
114
- const now = new Date();
115
-
116
- const existingTriggers = session.signals?.triggers ?? {};
117
- const existingTrigger = existingTriggers[signalId];
118
-
119
- let updatedTrigger: SignalTriggerState;
120
-
121
- if (existingTrigger == null) {
122
- // First trigger
123
- updatedTrigger = {
124
- firstTriggeredAt: now,
125
- lastTriggeredAt: now,
126
- count: 1,
127
- lastReason: reason,
128
- lastPhase: phase,
129
- };
130
- } else {
131
- // Subsequent trigger — preserve firstTriggeredAt, increment count
132
- updatedTrigger = {
133
- firstTriggeredAt: existingTrigger.firstTriggeredAt,
134
- lastTriggeredAt: now,
135
- count: existingTrigger.count + 1,
136
- lastReason: reason,
137
- lastPhase: phase,
138
- };
139
- }
140
-
141
- return {
142
- ...session,
143
- signals: {
144
- ...session.signals,
145
- triggers: {
146
- ...existingTriggers,
147
- [signalId]: updatedTrigger,
148
- },
149
- },
150
- };
151
- }
152
-
153
- // ──────────────────────────────────────────────────────────────────────────────
154
- // buildSignalContext — Constructs the handler context
155
- // ──────────────────────────────────────────────────────────────────────────────
156
-
157
- /**
158
- * Parameters for building the SignalContext.
159
- */
160
- export interface BuildSignalContextParams<TContext = unknown, TData = unknown, TExtract = void> {
161
- signal: Signal<TContext, TData, TExtract>;
162
- reason: string;
163
- extracted: TExtract extends void ? undefined : TExtract;
164
- phase: 'pre' | 'post';
165
- session: SessionState<TData>;
166
- context: TContext;
167
- history: Event[];
168
- /** Turn-local directive bus — `dispatch` pushes onto this array. */
169
- directiveBus: SignalDirective<TContext, TData>[];
170
- /** Session updater — called when handler invokes `updateContext`. */
171
- onUpdateSession: (updatedSession: SessionState<TData>) => void;
172
- }
173
-
174
- /**
175
- * Builds the `SignalContext` passed to signal handlers.
176
- *
177
- * - `updateContext` and `updateData` replicate the ToolContext D-Q12 writer
178
- * pattern: shallow-merge partial updates into the session, call the
179
- * `onUpdateSession` callback so the processor can track mutations.
180
- * - `dispatch` pushes a `SignalDirective` onto the turn-local bus.
181
- * - `lastUserMessage` is derived from the last user-role event in history.
182
- * - `triggeredAt` is set to `new Date()` at construction time.
183
- * - `matched` is always `true` (literal type).
184
- *
185
- * @requirements 6.1, 6.2, 6.3
186
- */
187
- export function buildSignalContext<TContext = unknown, TData = unknown, TExtract = void>(
188
- params: BuildSignalContextParams<TContext, TData, TExtract>,
189
- ): SignalContext<TContext, TData, TExtract> {
190
- const {
191
- signal,
192
- reason,
193
- extracted,
194
- phase,
195
- session,
196
- context,
197
- history,
198
- directiveBus,
199
- onUpdateSession,
200
- } = params;
201
-
202
- // Derive lastUserMessage from the last user-role event
203
- const lastUserMessage = deriveLastUserMessage(history);
204
-
205
- // D-Q12 contract writers — same signature as ToolContext
206
- const updateContext = (updates: Partial<TContext>): Promise<void> => {
207
- // Context is agent-level (not on session directly). Push a contextUpdate
208
- // directive so the pipeline applies the merge after handler returns.
209
- directiveBus.push({ contextUpdate: updates } as SignalDirective<TContext, TData>);
210
- return Promise.resolve();
211
- };
212
-
213
- const updateData = (updates: Partial<TData>): Promise<void> => {
214
- const updatedData = { ...session.data, ...updates };
215
- const updatedSession: SessionState<TData> = {
216
- ...session,
217
- data: updatedData,
218
- };
219
- onUpdateSession(updatedSession);
220
- // Also push a dataUpdate directive for the pipeline
221
- directiveBus.push({ dataUpdate: updates } as SignalDirective<TContext, TData>);
222
- return Promise.resolve();
223
- };
224
-
225
- const dispatch = (directive: SignalDirective<TContext, TData>): void => {
226
- directiveBus.push(directive);
227
- };
228
-
229
- return {
230
- signal,
231
- phase,
232
- matched: true,
233
- reason,
234
- extracted,
235
- session,
236
- context,
237
- data: session.data,
238
- history,
239
- lastUserMessage,
240
- triggeredAt: new Date(),
241
- updateContext,
242
- updateData,
243
- dispatch,
244
- } as SignalContext<TContext, TData, TExtract>;
245
- }
246
-
247
- // ──────────────────────────────────────────────────────────────────────────────
248
- // Internal helpers
249
- // ──────────────────────────────────────────────────────────────────────────────
250
-
251
- /**
252
- * Extracts the last user message from history events.
253
- * Walks backward to find the most recent user-role message event.
254
- */
255
- function deriveLastUserMessage(history: Event[]): string | undefined {
256
- for (let i = history.length - 1; i >= 0; i--) {
257
- const event = history[i];
258
- // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
259
- if (event.source === MessageRoleEnum.USER && event.kind === 'message') {
260
- const data = event.data as { message?: string; participant?: { display_name?: string } };
261
- if (data?.message) {
262
- return data.message;
263
- }
264
- }
265
- }
266
- return undefined;
267
- }
268
-
269
- // ──────────────────────────────────────────────────────────────────────────────
270
- // SignalProcessor — Full Algorithm 1 implementation
271
- // ──────────────────────────────────────────────────────────────────────────────
272
-
273
- /** Internal matched-signal entry carried through the pipeline. */
274
- interface MatchedEntry<TContext, TData> {
275
- signal: Signal<TContext, TData, any>;
276
- reason: string;
277
- extracted?: unknown;
278
- /** Original index in the signals array (declaration order). */
279
- declarationIndex: number;
280
- }
281
-
282
- /**
283
- * SignalProcessor — Orchestrates signal phase execution.
284
- *
285
- * Constructed only when `options.signals` is non-empty (Requirement 2.3).
286
- * Owns the full Algorithm 1 lifecycle: filtering, gating, evaluation,
287
- * handler invocation, directive collection, and state persistence.
288
- */
289
- export class SignalProcessor<TContext = unknown, TData = unknown> {
290
- constructor(
291
- private readonly signals: Signal<TContext, TData, any>[],
292
- private readonly provider: AiProvider,
293
- private readonly evaluator: SignalEvaluator<TContext, TData>,
294
- private readonly options: { batchSize: number },
295
- ) { }
296
-
297
- /** @internal Expose internals for testability. */
298
- get _internals() {
299
- return { signals: this.signals, provider: this.provider, evaluator: this.evaluator, options: this.options };
300
- }
301
-
302
- /**
303
- * Pre-signal phase. Delegates to `runPhase('pre', ...)`.
304
- * Return type narrows `mergedDirective` to `Directive | undefined`.
305
- */
306
- async runPreSignalPhase(params: {
307
- session: SessionState<TData>;
308
- history: Event[];
309
- context: TContext;
310
- }): Promise<{
311
- mergedDirective?: Directive<TContext, TData>;
312
- firings: SignalFiring<TContext, TData>[];
313
- updatedSession: SessionState<TData>;
314
- }> {
315
- return await this.runPhase('pre', params);
316
- }
317
-
318
- /**
319
- * Post-signal phase. Delegates to `runPhase('post', ...)`.
320
- * Return type narrows `mergedDirective` to `Directive | undefined`.
321
- * Pre-LLM-only fields (`appendPrompt`, `injectTools`, `halt`) are
322
- * already dropped inside `runPhase` for the post phase.
323
- */
324
- async runPostSignalPhase(params: {
325
- session: SessionState<TData>;
326
- history: Event[];
327
- context: TContext;
328
- }): Promise<{
329
- mergedDirective?: Directive<TContext, TData>;
330
- firings: SignalFiring<TContext, TData>[];
331
- updatedSession: SessionState<TData>;
332
- }> {
333
- return await this.runPhase('post', params);
334
- }
335
-
336
- // ──────────────────────────────────────────────────────────────────────────
337
- // Private: Algorithm 1 — Phase orchestration
338
- // ──────────────────────────────────────────────────────────────────────────
339
-
340
- private async runPhase(
341
- phase: 'pre' | 'post',
342
- params: { session: SessionState<TData>; history: Event[]; context: TContext },
343
- ): Promise<{
344
- mergedDirective?: Directive<TContext, TData>;
345
- firings: SignalFiring<TContext, TData>[];
346
- updatedSession: SessionState<TData>;
347
- }> {
348
- const { session, history, context } = params;
349
-
350
- // ── STEP 0: zero-cost fast path ──────────────────────────────────────
351
- if (this.signals.length === 0) {
352
- return { firings: [], updatedSession: session };
353
- }
354
-
355
- // ── STEP 1: filter eligible signals for this phase ───────────────────
356
- const eligible = this.signals.filter(
357
- (s) => s.enabled !== false && (s.phase === phase || s.phase === 'both'),
358
- );
359
- if (eligible.length === 0) {
360
- return { firings: [], updatedSession: session };
361
- }
362
-
363
- logger.debug(`[Signals] Phase "${phase}" eligible signals: [${eligible.map(s => s.id ?? 'unknown').join(', ')}]`);
364
-
365
- // ── STEP 2: filter by behavior gating ────────────────────────────────
366
- const gated = eligible.filter((s) =>
367
- behaviorAllowsExecution(s, session.signals?.triggers?.[s.id ?? 'unknown']),
368
- );
369
- if (gated.length === 0) {
370
- return { firings: [], updatedSession: session };
371
- }
372
-
373
- logger.debug(`[Signals] Phase "${phase}" after behavior gating: [${gated.map(s => s.id ?? 'unknown').join(', ')}]`);
374
-
375
- // ── STEP 3: partition by evaluation mode ─────────────────────────────
376
- const unconditional: Signal<TContext, TData, any>[] = [];
377
- const codeOnly: Signal<TContext, TData, any>[] = [];
378
- const llmConditioned: Signal<TContext, TData, any>[] = [];
379
-
380
- for (const s of gated) {
381
- if (s.when != null) {
382
- llmConditioned.push(s);
383
- } else if (s.if != null) {
384
- codeOnly.push(s);
385
- } else {
386
- unconditional.push(s);
387
- }
388
- }
389
-
390
- // Build predicate context (shared across code-only and if-gating)
391
- const predicateCtx: SignalPredicateContext<TContext, TData> = {
392
- data: session.data,
393
- context,
394
- session,
395
- history,
396
- };
397
-
398
- // ── STEP 4: unconditional signals — always match ─────────────────────
399
- const matched: MatchedEntry<TContext, TData>[] = [];
400
-
401
- for (const s of unconditional) {
402
- matched.push({
403
- signal: s,
404
- reason: 'unconditional',
405
- declarationIndex: this.signals.indexOf(s),
406
- });
407
- }
408
-
409
- // ── STEP 5: code-only signals → evaluateIf ──────────────────────────
410
- for (const s of codeOnly) {
411
- const passes = await this.evaluator.evaluateIf(s.if!, predicateCtx);
412
- if (passes) {
413
- matched.push({
414
- signal: s,
415
- reason: 'code-only',
416
- declarationIndex: this.signals.indexOf(s),
417
- });
418
- }
419
- }
420
-
421
- // ── STEP 6: LLM-conditioned signals ─────────────────────────────────
422
- if (llmConditioned.length > 0) {
423
- // Gate by `if` first to skip token cost
424
- const ifGated: Signal<TContext, TData, any>[] = [];
425
- for (const s of llmConditioned) {
426
- if (s.if == null) {
427
- ifGated.push(s);
428
- } else {
429
- const passes = await this.evaluator.evaluateIf(s.if, predicateCtx);
430
- if (passes) {
431
- ifGated.push(s);
432
- }
433
- }
434
- }
435
-
436
- if (ifGated.length > 0) {
437
- const classifierStart = performance.now();
438
- const classifierResults = await this.evaluator.evaluateSignalsBatched({
439
- signals: ifGated,
440
- batchSize: this.options.batchSize,
441
- session,
442
- history,
443
- context,
444
- });
445
- const classifierDurationMs = performance.now() - classifierStart;
446
- logger.debug(`[Signals] Phase "${phase}" classifier call duration: ${classifierDurationMs.toFixed(1)}ms for ${ifGated.length} LLM-conditioned signals`);
447
-
448
- for (const s of ifGated) {
449
- const id = s.id ?? 'unknown';
450
- const result = classifierResults[id];
451
- if (result?.matched) {
452
- matched.push({
453
- signal: s,
454
- reason: result.reason ?? 'matched',
455
- extracted: result.extracted,
456
- declarationIndex: this.signals.indexOf(s),
457
- });
458
- }
459
- }
460
- }
461
- }
462
-
463
- // ── STEP 6b: extraction for code-matched signals ─────────────────────
464
- // Signals matched by code — unconditional (no `when`/`if`) or code-only
465
- // (`if` without `when`) — that carry an `extract` schema still need a
466
- // dedicated extraction call. LLM-conditioned signals already had their
467
- // extraction merged into the STEP 6 classifier batch, so they are
468
- // excluded here by identity. Without this, an `if` + `extract` signal
469
- // (e.g. the documented `leadStage` example) would reach its handler with
470
- // `ctx.extracted` permanently undefined.
471
- const codeMatchedWithExtract = matched.filter(
472
- (m) => m.signal.extract != null && !llmConditioned.includes(m.signal),
473
- );
474
- if (codeMatchedWithExtract.length > 0) {
475
- const extractResults = await this.evaluator.evaluateSignals({
476
- signals: codeMatchedWithExtract.map((m) => m.signal),
477
- session,
478
- history,
479
- context,
480
- });
481
-
482
- // Attach extracted data back onto the already-matched entries.
483
- for (const m of codeMatchedWithExtract) {
484
- const id = m.signal.id ?? 'unknown';
485
- m.extracted = extractResults[id]?.extracted;
486
- }
487
- }
488
-
489
- // ── STEP 7: sort by priority desc, declaration order tiebreaker ──────
490
- matched.sort((a, b) => {
491
- const priorityDiff = (b.signal.priority ?? 0) - (a.signal.priority ?? 0);
492
- if (priorityDiff !== 0) return priorityDiff;
493
- return a.declarationIndex - b.declarationIndex;
494
- });
495
-
496
- // ── STEP 8: invoke handlers; collect directives; track state ─────────
497
- const bus: SignalDirective<TContext, TData>[] = [];
498
- const firings: SignalFiring<TContext, TData>[] = [];
499
- let updatedSession = session;
500
-
501
- for (const m of matched) {
502
- // Turn-local directive bus for this handler (captures dispatch calls)
503
- const handlerBus: SignalDirective<TContext, TData>[] = [];
504
-
505
- // A signal in extraction mode that matched but produced no payload
506
- // would otherwise pass `extracted: undefined` to the handler with no
507
- // trace. Surface the miss on the firing and in logs instead.
508
- const extractionMissing = m.signal.extract != null && m.extracted == null;
509
- if (extractionMissing) {
510
- logger.warn(
511
- `[Signals] Signal "${m.signal.id ?? 'unknown'}" matched in extraction mode ` +
512
- `but the classifier returned no extracted payload; handler receives extracted: undefined.`,
513
- );
514
- }
515
-
516
- const sigCtx = buildSignalContext<TContext, TData, any>({
517
- signal: m.signal,
518
- reason: m.reason,
519
- extracted: m.extracted,
520
- phase,
521
- session: updatedSession,
522
- context,
523
- history,
524
- directiveBus: handlerBus,
525
- onUpdateSession: (s) => { updatedSession = s; },
526
- });
527
-
528
- const start = performance.now();
529
-
530
- try {
531
-
532
- const handlerResult = await m.signal.handler(sigCtx);
533
-
534
- // Collect directives from dispatch calls
535
- for (const d of handlerBus) {
536
- bus.push(d);
537
- }
538
-
539
- let resolvedDirective: SignalDirective<TContext, TData> | undefined;
540
-
541
- if (handlerResult != null && typeof handlerResult === 'object') {
542
- resolvedDirective = { ...handlerResult } as SignalDirective<TContext, TData>;
543
-
544
- // Resolve replyWith → reply
545
- if (resolvedDirective.replyWith != null) {
546
- if (typeof resolvedDirective.replyWith === 'function') {
547
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
548
- resolvedDirective.reply = resolvedDirective.replyWith(sigCtx);
549
- } else {
550
- resolvedDirective.reply = resolvedDirective.replyWith;
551
- }
552
- delete resolvedDirective.replyWith;
553
- }
554
-
555
- bus.push(resolvedDirective);
556
- }
557
-
558
- // Record trigger only after the handler has completed successfully.
559
- updatedSession = recordTrigger(updatedSession, m.signal, m.reason, phase);
560
-
561
- const handlerDurationMs = performance.now() - start;
562
-
563
- // Debug: per-handler duration and emitted directive fields
564
- const directiveFields = resolvedDirective
565
- ? Object.keys(resolvedDirective).filter(k => resolvedDirective[k as keyof typeof resolvedDirective] !== undefined)
566
- : [];
567
- logger.debug(
568
- `[Signals] Phase "${phase}" handler "${m.signal.id ?? 'unknown'}" completed in ${handlerDurationMs.toFixed(1)}ms` +
569
- (directiveFields.length > 0 ? `, directive fields: [${directiveFields.join(', ')}]` : ', no directive'),
570
- );
571
-
572
- // Record firing
573
- firings.push({
574
- id: m.signal.id ?? 'unknown',
575
- phase,
576
- reason: m.reason,
577
- extracted: m.extracted,
578
- directive: resolvedDirective,
579
- durationMs: handlerDurationMs,
580
- ...(extractionMissing ? { extractionError: EXTRACTION_MISSING_MESSAGE } : {}),
581
- });
582
-
583
- // stopOtherSignals → break iteration
584
- if (resolvedDirective?.stopOtherSignals === true) {
585
- break;
586
- }
587
- } catch (error) {
588
- const errorMessage = error instanceof Error ? error.message : String(error);
589
- const handlerDurationMs = performance.now() - start;
590
-
591
- // Handler errors logged at ERROR regardless of debug flag (Requirement 13.2)
592
- logger.error(`[Signals] Handler threw for signal "${m.signal.id ?? 'unknown'}": ${errorMessage}`);
593
-
594
- firings.push({
595
- id: m.signal.id ?? 'unknown',
596
- phase,
597
- reason: m.reason,
598
- handlerError: errorMessage,
599
- durationMs: handlerDurationMs,
600
- ...(extractionMissing ? { extractionError: EXTRACTION_MISSING_MESSAGE } : {}),
601
- });
602
-
603
- // Continue iteration — handler errors never break the turn
604
- }
605
- }
606
-
607
- // ── STEP 9: merge directives ─────────────────────────────────────────
608
- let mergedDirective: Directive<TContext, TData> | undefined;
609
-
610
- if (bus.length > 0) {
611
- mergedDirective = this.mergeDirectives(bus);
612
-
613
- // For post-phase, drop pre-LLM-only fields with debug warning
614
- if (phase === 'post') {
615
- if (mergedDirective.appendPrompt != null) {
616
- logger.debug('[Signals] Dropping appendPrompt from post-phase signal directive (pre-LLM-only field)');
617
- delete mergedDirective.appendPrompt;
618
- }
619
- if (mergedDirective.injectTools != null) {
620
- logger.debug('[Signals] Dropping injectTools from post-phase signal directive (pre-LLM-only field)');
621
- delete mergedDirective.injectTools;
622
- }
623
- if (mergedDirective.halt != null) {
624
- logger.debug('[Signals] Dropping halt from post-phase signal directive (pre-LLM-only field)');
625
- delete mergedDirective.halt;
626
- }
627
- }
628
-
629
- // Check if merged directive is now empty after stripping
630
- const hasFields = Object.keys(mergedDirective).length > 0;
631
- if (!hasFields) {
632
- mergedDirective = undefined;
633
- }
634
- }
635
-
636
- return { mergedDirective, firings, updatedSession };
637
- }
638
-
639
- // ──────────────────────────────────────────────────────────────────────────
640
- // Directive merging — Algorithm 4 pattern
641
- // ──────────────────────────────────────────────────────────────────────────
642
-
643
- /**
644
- * Merges an array of signal directives into a single directive.
645
- *
646
- * Merge strategy (matches Algorithm 4 / AutoChainExecutor pattern):
647
- * - Position fields (`goTo`, `goToStep`, `complete`, `abort`, `reset`, `halt`): last-write-wins
648
- * - `reply`: last-write-wins
649
- * - `appendPrompt`: array-concat
650
- * - `injectTools`: array-concat
651
- * - `dataUpdate`: shallow-merge (later values overwrite earlier for same key)
652
- * - `contextUpdate`: shallow-merge
653
- * - `stopOtherSignals`: OR (any true → true)
654
- */
655
- private mergeDirectives(
656
- directives: SignalDirective<TContext, TData>[],
657
- ): Directive<TContext, TData> {
658
- // Canonical Algorithm 4 merge — one algorithm shared with tools and
659
- // step hooks (position precedence, reply last-wins, state shallow-merge,
660
- // halt OR). Empty in, empty ({}) out.
661
- return flow.mergeAll(directives) ?? {};
662
- }
663
- }