@falai/agent 3.4.4 → 4.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (847) hide show
  1. package/README.md +41 -34
  2. package/dist/cjs/core/Agent.d.ts +22 -378
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +104 -1178
  5. package/dist/cjs/core/Agent.js.map +1 -1
  6. package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
  7. package/dist/cjs/core/CompactionEngine.js +5 -3
  8. package/dist/cjs/core/CompactionEngine.js.map +1 -1
  9. package/dist/cjs/core/FlowSpec.d.ts +136 -0
  10. package/dist/cjs/core/FlowSpec.d.ts.map +1 -0
  11. package/dist/cjs/core/FlowSpec.js +522 -0
  12. package/dist/cjs/core/FlowSpec.js.map +1 -0
  13. package/dist/cjs/core/Migrate.d.ts +38 -0
  14. package/dist/cjs/core/Migrate.d.ts.map +1 -0
  15. package/dist/cjs/core/Migrate.js +270 -0
  16. package/dist/cjs/core/Migrate.js.map +1 -0
  17. package/dist/cjs/core/Prompt.d.ts +54 -0
  18. package/dist/cjs/core/Prompt.d.ts.map +1 -0
  19. package/dist/cjs/core/Prompt.js +143 -0
  20. package/dist/cjs/core/Prompt.js.map +1 -0
  21. package/dist/cjs/core/Runner.d.ts +160 -0
  22. package/dist/cjs/core/Runner.d.ts.map +1 -0
  23. package/dist/cjs/core/Runner.js +1131 -0
  24. package/dist/cjs/core/Runner.js.map +1 -0
  25. package/dist/cjs/core/Speak.d.ts +37 -0
  26. package/dist/cjs/core/Speak.d.ts.map +1 -0
  27. package/dist/cjs/core/Speak.js +364 -0
  28. package/dist/cjs/core/Speak.js.map +1 -0
  29. package/dist/cjs/core/Understand.d.ts +28 -0
  30. package/dist/cjs/core/Understand.d.ts.map +1 -0
  31. package/dist/cjs/core/Understand.js +353 -0
  32. package/dist/cjs/core/Understand.js.map +1 -0
  33. package/dist/cjs/core/contracts.d.ts +122 -0
  34. package/dist/cjs/core/contracts.d.ts.map +1 -0
  35. package/dist/cjs/core/contracts.js +11 -0
  36. package/dist/cjs/core/contracts.js.map +1 -0
  37. package/dist/cjs/core/falai.d.ts +57 -0
  38. package/dist/cjs/core/falai.d.ts.map +1 -0
  39. package/dist/cjs/core/falai.js +43 -0
  40. package/dist/cjs/core/falai.js.map +1 -0
  41. package/dist/cjs/core/predicate.d.ts +9 -0
  42. package/dist/cjs/core/predicate.d.ts.map +1 -0
  43. package/dist/cjs/core/predicate.js +58 -0
  44. package/dist/cjs/core/predicate.js.map +1 -0
  45. package/dist/cjs/index.d.ts +26 -31
  46. package/dist/cjs/index.d.ts.map +1 -1
  47. package/dist/cjs/index.js +46 -68
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/persistence/MemoryStore.d.ts +15 -0
  50. package/dist/cjs/persistence/MemoryStore.d.ts.map +1 -0
  51. package/dist/cjs/persistence/MemoryStore.js +39 -0
  52. package/dist/cjs/persistence/MemoryStore.js.map +1 -0
  53. package/dist/cjs/persistence/MongoStore.d.ts +42 -0
  54. package/dist/cjs/persistence/MongoStore.d.ts.map +1 -0
  55. package/dist/cjs/persistence/MongoStore.js +60 -0
  56. package/dist/cjs/persistence/MongoStore.js.map +1 -0
  57. package/dist/cjs/persistence/OpenSearchStore.d.ts +86 -0
  58. package/dist/cjs/persistence/OpenSearchStore.d.ts.map +1 -0
  59. package/dist/cjs/persistence/OpenSearchStore.js +120 -0
  60. package/dist/cjs/persistence/OpenSearchStore.js.map +1 -0
  61. package/dist/cjs/persistence/PostgresStore.d.ts +41 -0
  62. package/dist/cjs/persistence/PostgresStore.d.ts.map +1 -0
  63. package/dist/cjs/persistence/PostgresStore.js +58 -0
  64. package/dist/cjs/persistence/PostgresStore.js.map +1 -0
  65. package/dist/cjs/persistence/PrismaStore.d.ts +65 -0
  66. package/dist/cjs/persistence/PrismaStore.d.ts.map +1 -0
  67. package/dist/cjs/persistence/PrismaStore.js +95 -0
  68. package/dist/cjs/persistence/PrismaStore.js.map +1 -0
  69. package/dist/cjs/persistence/RedisStore.d.ts +34 -0
  70. package/dist/cjs/persistence/RedisStore.d.ts.map +1 -0
  71. package/dist/cjs/persistence/RedisStore.js +61 -0
  72. package/dist/cjs/persistence/RedisStore.js.map +1 -0
  73. package/dist/cjs/persistence/SQLiteStore.d.ts +45 -0
  74. package/dist/cjs/persistence/SQLiteStore.d.ts.map +1 -0
  75. package/dist/cjs/persistence/SQLiteStore.js +74 -0
  76. package/dist/cjs/persistence/SQLiteStore.js.map +1 -0
  77. package/dist/cjs/persistence/sessionRow.d.ts +14 -0
  78. package/dist/cjs/persistence/sessionRow.d.ts.map +1 -0
  79. package/dist/cjs/persistence/sessionRow.js +50 -0
  80. package/dist/cjs/persistence/sessionRow.js.map +1 -0
  81. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  82. package/dist/cjs/providers/DeepSeekProvider.js +8 -3
  83. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  84. package/dist/cjs/providers/GeminiProvider.d.ts +4 -3
  85. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  86. package/dist/cjs/providers/GeminiProvider.js +4 -3
  87. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  88. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +4 -0
  89. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  90. package/dist/cjs/providers/OpenAICompatibleProvider.js +2 -0
  91. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  92. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  93. package/dist/cjs/providers/OpenRouterProvider.js +2 -4
  94. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  95. package/dist/cjs/providers/ProviderAdapter.d.ts +1 -1
  96. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -1
  97. package/dist/cjs/providers/ProviderAdapter.js +33 -10
  98. package/dist/cjs/providers/ProviderAdapter.js.map +1 -1
  99. package/dist/cjs/types/agent.d.ts +153 -383
  100. package/dist/cjs/types/agent.d.ts.map +1 -1
  101. package/dist/cjs/types/agent.js +1 -1
  102. package/dist/cjs/types/ai.d.ts +32 -1
  103. package/dist/cjs/types/ai.d.ts.map +1 -1
  104. package/dist/cjs/types/compaction.d.ts +3 -1
  105. package/dist/cjs/types/compaction.d.ts.map +1 -1
  106. package/dist/cjs/types/errors.d.ts +9 -12
  107. package/dist/cjs/types/errors.d.ts.map +1 -1
  108. package/dist/cjs/types/errors.js +14 -17
  109. package/dist/cjs/types/errors.js.map +1 -1
  110. package/dist/cjs/types/flow.d.ts +265 -513
  111. package/dist/cjs/types/flow.d.ts.map +1 -1
  112. package/dist/cjs/types/flow.js +7 -1
  113. package/dist/cjs/types/flow.js.map +1 -1
  114. package/dist/cjs/types/history.d.ts +7 -18
  115. package/dist/cjs/types/history.d.ts.map +1 -1
  116. package/dist/cjs/types/history.js.map +1 -1
  117. package/dist/cjs/types/index.d.ts +9 -15
  118. package/dist/cjs/types/index.d.ts.map +1 -1
  119. package/dist/cjs/types/index.js +4 -14
  120. package/dist/cjs/types/index.js.map +1 -1
  121. package/dist/cjs/types/session.d.ts +94 -64
  122. package/dist/cjs/types/session.d.ts.map +1 -1
  123. package/dist/cjs/types/session.js +5 -1
  124. package/dist/cjs/types/session.js.map +1 -1
  125. package/dist/cjs/types/tool.d.ts +37 -207
  126. package/dist/cjs/types/tool.d.ts.map +1 -1
  127. package/dist/cjs/types/tool.js +5 -14
  128. package/dist/cjs/types/tool.js.map +1 -1
  129. package/dist/cjs/utils/clock.d.ts +28 -0
  130. package/dist/cjs/utils/clock.d.ts.map +1 -0
  131. package/dist/cjs/utils/clock.js +64 -0
  132. package/dist/cjs/utils/clock.js.map +1 -0
  133. package/dist/cjs/utils/duration.d.ts +11 -0
  134. package/dist/cjs/utils/duration.d.ts.map +1 -0
  135. package/dist/cjs/utils/duration.js +31 -0
  136. package/dist/cjs/utils/duration.js.map +1 -0
  137. package/dist/cjs/utils/history.d.ts +4 -1
  138. package/dist/cjs/utils/history.d.ts.map +1 -1
  139. package/dist/cjs/utils/history.js +2 -2
  140. package/dist/cjs/utils/history.js.map +1 -1
  141. package/dist/cjs/utils/index.d.ts +4 -10
  142. package/dist/cjs/utils/index.d.ts.map +1 -1
  143. package/dist/cjs/utils/index.js +14 -61
  144. package/dist/cjs/utils/index.js.map +1 -1
  145. package/dist/cjs/utils/json.d.ts +2 -0
  146. package/dist/cjs/utils/json.d.ts.map +1 -1
  147. package/dist/cjs/utils/json.js +5 -0
  148. package/dist/cjs/utils/json.js.map +1 -1
  149. package/dist/cjs/utils/outcomes.d.ts +48 -0
  150. package/dist/cjs/utils/outcomes.d.ts.map +1 -0
  151. package/dist/cjs/utils/outcomes.js +51 -0
  152. package/dist/cjs/utils/outcomes.js.map +1 -0
  153. package/dist/cjs/utils/schema.d.ts +50 -0
  154. package/dist/cjs/utils/schema.d.ts.map +1 -0
  155. package/dist/cjs/utils/schema.js +138 -0
  156. package/dist/cjs/utils/schema.js.map +1 -0
  157. package/dist/cjs/utils/streamingMessage.d.ts +3 -2
  158. package/dist/cjs/utils/streamingMessage.d.ts.map +1 -1
  159. package/dist/cjs/utils/streamingMessage.js +38 -4
  160. package/dist/cjs/utils/streamingMessage.js.map +1 -1
  161. package/dist/cjs/utils/template.d.ts +13 -149
  162. package/dist/cjs/utils/template.d.ts.map +1 -1
  163. package/dist/cjs/utils/template.js +31 -363
  164. package/dist/cjs/utils/template.js.map +1 -1
  165. package/dist/cjs/utils/usage.d.ts +19 -0
  166. package/dist/cjs/utils/usage.d.ts.map +1 -0
  167. package/dist/cjs/utils/usage.js +35 -0
  168. package/dist/cjs/utils/usage.js.map +1 -0
  169. package/dist/core/Agent.d.ts +22 -378
  170. package/dist/core/Agent.d.ts.map +1 -1
  171. package/dist/core/Agent.js +107 -1181
  172. package/dist/core/Agent.js.map +1 -1
  173. package/dist/core/CompactionEngine.d.ts.map +1 -1
  174. package/dist/core/CompactionEngine.js +5 -3
  175. package/dist/core/CompactionEngine.js.map +1 -1
  176. package/dist/core/FlowSpec.d.ts +136 -0
  177. package/dist/core/FlowSpec.d.ts.map +1 -0
  178. package/dist/core/FlowSpec.js +516 -0
  179. package/dist/core/FlowSpec.js.map +1 -0
  180. package/dist/core/Migrate.d.ts +38 -0
  181. package/dist/core/Migrate.d.ts.map +1 -0
  182. package/dist/core/Migrate.js +264 -0
  183. package/dist/core/Migrate.js.map +1 -0
  184. package/dist/core/Prompt.d.ts +54 -0
  185. package/dist/core/Prompt.d.ts.map +1 -0
  186. package/dist/core/Prompt.js +133 -0
  187. package/dist/core/Prompt.js.map +1 -0
  188. package/dist/core/Runner.d.ts +160 -0
  189. package/dist/core/Runner.d.ts.map +1 -0
  190. package/dist/core/Runner.js +1127 -0
  191. package/dist/core/Runner.js.map +1 -0
  192. package/dist/core/Speak.d.ts +37 -0
  193. package/dist/core/Speak.d.ts.map +1 -0
  194. package/dist/core/Speak.js +360 -0
  195. package/dist/core/Speak.js.map +1 -0
  196. package/dist/core/Understand.d.ts +28 -0
  197. package/dist/core/Understand.d.ts.map +1 -0
  198. package/dist/core/Understand.js +349 -0
  199. package/dist/core/Understand.js.map +1 -0
  200. package/dist/core/contracts.d.ts +122 -0
  201. package/dist/core/contracts.d.ts.map +1 -0
  202. package/dist/core/contracts.js +10 -0
  203. package/dist/core/contracts.js.map +1 -0
  204. package/dist/core/falai.d.ts +57 -0
  205. package/dist/core/falai.d.ts.map +1 -0
  206. package/dist/core/falai.js +40 -0
  207. package/dist/core/falai.js.map +1 -0
  208. package/dist/core/predicate.d.ts +9 -0
  209. package/dist/core/predicate.d.ts.map +1 -0
  210. package/dist/core/predicate.js +54 -0
  211. package/dist/core/predicate.js.map +1 -0
  212. package/dist/index.d.ts +26 -31
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js +19 -24
  215. package/dist/index.js.map +1 -1
  216. package/dist/persistence/MemoryStore.d.ts +15 -0
  217. package/dist/persistence/MemoryStore.d.ts.map +1 -0
  218. package/dist/persistence/MemoryStore.js +35 -0
  219. package/dist/persistence/MemoryStore.js.map +1 -0
  220. package/dist/persistence/MongoStore.d.ts +42 -0
  221. package/dist/persistence/MongoStore.d.ts.map +1 -0
  222. package/dist/persistence/MongoStore.js +56 -0
  223. package/dist/persistence/MongoStore.js.map +1 -0
  224. package/dist/persistence/OpenSearchStore.d.ts +86 -0
  225. package/dist/persistence/OpenSearchStore.d.ts.map +1 -0
  226. package/dist/persistence/OpenSearchStore.js +116 -0
  227. package/dist/persistence/OpenSearchStore.js.map +1 -0
  228. package/dist/persistence/PostgresStore.d.ts +41 -0
  229. package/dist/persistence/PostgresStore.d.ts.map +1 -0
  230. package/dist/persistence/PostgresStore.js +54 -0
  231. package/dist/persistence/PostgresStore.js.map +1 -0
  232. package/dist/persistence/PrismaStore.d.ts +65 -0
  233. package/dist/persistence/PrismaStore.d.ts.map +1 -0
  234. package/dist/persistence/PrismaStore.js +91 -0
  235. package/dist/persistence/PrismaStore.js.map +1 -0
  236. package/dist/persistence/RedisStore.d.ts +34 -0
  237. package/dist/persistence/RedisStore.d.ts.map +1 -0
  238. package/dist/persistence/RedisStore.js +57 -0
  239. package/dist/persistence/RedisStore.js.map +1 -0
  240. package/dist/persistence/SQLiteStore.d.ts +45 -0
  241. package/dist/persistence/SQLiteStore.d.ts.map +1 -0
  242. package/dist/persistence/SQLiteStore.js +70 -0
  243. package/dist/persistence/SQLiteStore.js.map +1 -0
  244. package/dist/persistence/sessionRow.d.ts +14 -0
  245. package/dist/persistence/sessionRow.d.ts.map +1 -0
  246. package/dist/persistence/sessionRow.js +45 -0
  247. package/dist/persistence/sessionRow.js.map +1 -0
  248. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  249. package/dist/providers/DeepSeekProvider.js +8 -3
  250. package/dist/providers/DeepSeekProvider.js.map +1 -1
  251. package/dist/providers/GeminiProvider.d.ts +4 -3
  252. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  253. package/dist/providers/GeminiProvider.js +4 -3
  254. package/dist/providers/GeminiProvider.js.map +1 -1
  255. package/dist/providers/OpenAICompatibleProvider.d.ts +4 -0
  256. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  257. package/dist/providers/OpenAICompatibleProvider.js +2 -0
  258. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  259. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  260. package/dist/providers/OpenRouterProvider.js +2 -4
  261. package/dist/providers/OpenRouterProvider.js.map +1 -1
  262. package/dist/providers/ProviderAdapter.d.ts +1 -1
  263. package/dist/providers/ProviderAdapter.d.ts.map +1 -1
  264. package/dist/providers/ProviderAdapter.js +34 -11
  265. package/dist/providers/ProviderAdapter.js.map +1 -1
  266. package/dist/types/agent.d.ts +153 -383
  267. package/dist/types/agent.d.ts.map +1 -1
  268. package/dist/types/agent.js +1 -1
  269. package/dist/types/ai.d.ts +32 -1
  270. package/dist/types/ai.d.ts.map +1 -1
  271. package/dist/types/compaction.d.ts +3 -1
  272. package/dist/types/compaction.d.ts.map +1 -1
  273. package/dist/types/errors.d.ts +9 -12
  274. package/dist/types/errors.d.ts.map +1 -1
  275. package/dist/types/errors.js +12 -15
  276. package/dist/types/errors.js.map +1 -1
  277. package/dist/types/flow.d.ts +265 -513
  278. package/dist/types/flow.d.ts.map +1 -1
  279. package/dist/types/flow.js +7 -1
  280. package/dist/types/flow.js.map +1 -1
  281. package/dist/types/history.d.ts +7 -18
  282. package/dist/types/history.d.ts.map +1 -1
  283. package/dist/types/history.js.map +1 -1
  284. package/dist/types/index.d.ts +9 -15
  285. package/dist/types/index.d.ts.map +1 -1
  286. package/dist/types/index.js +2 -7
  287. package/dist/types/index.js.map +1 -1
  288. package/dist/types/session.d.ts +94 -64
  289. package/dist/types/session.d.ts.map +1 -1
  290. package/dist/types/session.js +5 -1
  291. package/dist/types/session.js.map +1 -1
  292. package/dist/types/tool.d.ts +37 -207
  293. package/dist/types/tool.d.ts.map +1 -1
  294. package/dist/types/tool.js +6 -13
  295. package/dist/types/tool.js.map +1 -1
  296. package/dist/utils/clock.d.ts +28 -0
  297. package/dist/utils/clock.d.ts.map +1 -0
  298. package/dist/utils/clock.js +59 -0
  299. package/dist/utils/clock.js.map +1 -0
  300. package/dist/utils/duration.d.ts +11 -0
  301. package/dist/utils/duration.d.ts.map +1 -0
  302. package/dist/utils/duration.js +26 -0
  303. package/dist/utils/duration.js.map +1 -0
  304. package/dist/utils/history.d.ts +4 -1
  305. package/dist/utils/history.d.ts.map +1 -1
  306. package/dist/utils/history.js +2 -2
  307. package/dist/utils/history.js.map +1 -1
  308. package/dist/utils/index.d.ts +4 -10
  309. package/dist/utils/index.d.ts.map +1 -1
  310. package/dist/utils/index.js +4 -21
  311. package/dist/utils/index.js.map +1 -1
  312. package/dist/utils/json.d.ts +2 -0
  313. package/dist/utils/json.d.ts.map +1 -1
  314. package/dist/utils/json.js +4 -0
  315. package/dist/utils/json.js.map +1 -1
  316. package/dist/utils/outcomes.d.ts +48 -0
  317. package/dist/utils/outcomes.d.ts.map +1 -0
  318. package/dist/utils/outcomes.js +48 -0
  319. package/dist/utils/outcomes.js.map +1 -0
  320. package/dist/utils/schema.d.ts +50 -0
  321. package/dist/utils/schema.d.ts.map +1 -0
  322. package/dist/utils/schema.js +129 -0
  323. package/dist/utils/schema.js.map +1 -0
  324. package/dist/utils/streamingMessage.d.ts +3 -2
  325. package/dist/utils/streamingMessage.d.ts.map +1 -1
  326. package/dist/utils/streamingMessage.js +38 -4
  327. package/dist/utils/streamingMessage.js.map +1 -1
  328. package/dist/utils/template.d.ts +13 -149
  329. package/dist/utils/template.d.ts.map +1 -1
  330. package/dist/utils/template.js +28 -355
  331. package/dist/utils/template.js.map +1 -1
  332. package/dist/utils/usage.d.ts +19 -0
  333. package/dist/utils/usage.d.ts.map +1 -0
  334. package/dist/utils/usage.js +31 -0
  335. package/dist/utils/usage.js.map +1 -0
  336. package/docs/README.md +37 -19
  337. package/docs/concepts/architecture.md +117 -239
  338. package/docs/concepts/collection.md +170 -0
  339. package/docs/concepts/pipeline.md +132 -378
  340. package/docs/concepts/runs-and-waits.md +192 -0
  341. package/docs/guides/actions-and-events.md +276 -0
  342. package/docs/guides/branching.md +119 -208
  343. package/docs/guides/compaction.md +63 -158
  344. package/docs/guides/conditions.md +164 -128
  345. package/docs/guides/error-handling.md +168 -164
  346. package/docs/guides/flow-control.md +210 -349
  347. package/docs/guides/flows-from-json.md +224 -0
  348. package/docs/guides/instructions.md +125 -161
  349. package/docs/guides/persistence.md +182 -206
  350. package/docs/guides/streaming.md +50 -114
  351. package/docs/guides/testing.md +284 -0
  352. package/docs/guides/triggers.md +401 -0
  353. package/docs/migration/README.md +8 -15
  354. package/docs/migration/v1-to-v2.md +1 -1
  355. package/docs/migration/v2-3-to-v2-4.md +2 -2
  356. package/docs/migration/v2-6-to-v2-7.md +4 -4
  357. package/docs/migration/v3-to-v4.md +452 -0
  358. package/docs/reference/actions-events-conditions.md +396 -0
  359. package/docs/reference/agent.md +244 -0
  360. package/docs/reference/branches.md +75 -203
  361. package/docs/reference/errors.md +188 -144
  362. package/docs/reference/fields.md +125 -0
  363. package/docs/reference/flow-spec.md +248 -0
  364. package/docs/reference/flow.md +104 -192
  365. package/docs/reference/instruction.md +83 -137
  366. package/docs/reference/outcomes.md +273 -0
  367. package/docs/reference/providers.md +525 -302
  368. package/docs/reference/session.md +210 -0
  369. package/docs/reference/step.md +194 -312
  370. package/docs/reference/stores.md +496 -0
  371. package/docs/reference/tool.md +162 -231
  372. package/docs/reference/trigger.md +180 -0
  373. package/docs/rfc/v4-one-flow.md +477 -0
  374. package/docs/start/01-install.md +59 -44
  375. package/docs/start/02-first-agent.md +97 -147
  376. package/docs/start/03-collect-data.md +78 -183
  377. package/docs/start/04-add-tools.md +159 -227
  378. package/docs/start/05-go-to-production.md +167 -164
  379. package/examples/01-quickstart.ts +26 -16
  380. package/examples/02-fields.ts +75 -0
  381. package/examples/03-tools.ts +79 -119
  382. package/examples/04-instructions.ts +60 -87
  383. package/examples/05-branches.ts +78 -0
  384. package/examples/06-triggers-and-waits.ts +148 -0
  385. package/examples/07-streaming.ts +34 -60
  386. package/examples/08-store-and-migration.ts +97 -0
  387. package/examples/09-flows-from-json.ts +107 -0
  388. package/package.json +9 -6
  389. package/src/core/Agent.ts +116 -1512
  390. package/src/core/CompactionEngine.ts +7 -4
  391. package/src/core/FlowSpec.ts +712 -0
  392. package/src/core/Migrate.ts +256 -0
  393. package/src/core/Prompt.ts +156 -0
  394. package/src/core/Runner.ts +1181 -0
  395. package/src/core/Speak.ts +451 -0
  396. package/src/core/Understand.ts +422 -0
  397. package/src/core/contracts.ts +111 -0
  398. package/src/core/falai.ts +86 -0
  399. package/src/core/predicate.ts +56 -0
  400. package/src/index.ts +119 -147
  401. package/src/persistence/MemoryStore.ts +37 -0
  402. package/src/persistence/MongoStore.ts +89 -0
  403. package/src/persistence/OpenSearchStore.ts +153 -0
  404. package/src/persistence/PostgresStore.ts +89 -0
  405. package/src/persistence/PrismaStore.ts +127 -0
  406. package/src/persistence/RedisStore.ts +90 -0
  407. package/src/persistence/SQLiteStore.ts +103 -0
  408. package/src/persistence/sessionRow.ts +45 -0
  409. package/src/providers/DeepSeekProvider.ts +8 -3
  410. package/src/providers/GeminiProvider.ts +4 -3
  411. package/src/providers/OpenAICompatibleProvider.ts +6 -0
  412. package/src/providers/OpenRouterProvider.ts +2 -4
  413. package/src/providers/ProviderAdapter.ts +36 -8
  414. package/src/types/agent.ts +124 -397
  415. package/src/types/ai.ts +33 -1
  416. package/src/types/compaction.ts +3 -1
  417. package/src/types/errors.ts +13 -16
  418. package/src/types/flow.ts +249 -550
  419. package/src/types/history.ts +7 -20
  420. package/src/types/index.ts +87 -139
  421. package/src/types/session.ts +135 -70
  422. package/src/types/tool.ts +42 -267
  423. package/src/utils/clock.ts +70 -0
  424. package/src/utils/duration.ts +33 -0
  425. package/src/utils/history.ts +3 -2
  426. package/src/utils/index.ts +8 -66
  427. package/src/utils/json.ts +5 -0
  428. package/src/utils/outcomes.ts +56 -0
  429. package/src/utils/schema.ts +145 -0
  430. package/src/utils/streamingMessage.ts +34 -4
  431. package/src/utils/template.ts +32 -423
  432. package/src/utils/usage.ts +37 -0
  433. package/dist/adapters/MemoryAdapter.d.ts +0 -47
  434. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  435. package/dist/adapters/MemoryAdapter.js +0 -204
  436. package/dist/adapters/MemoryAdapter.js.map +0 -1
  437. package/dist/adapters/MongoAdapter.d.ts +0 -97
  438. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  439. package/dist/adapters/MongoAdapter.js +0 -196
  440. package/dist/adapters/MongoAdapter.js.map +0 -1
  441. package/dist/adapters/OpenSearchAdapter.d.ts +0 -169
  442. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  443. package/dist/adapters/OpenSearchAdapter.js +0 -471
  444. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  445. package/dist/adapters/PostgreSQLAdapter.d.ts +0 -85
  446. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  447. package/dist/adapters/PostgreSQLAdapter.js +0 -308
  448. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  449. package/dist/adapters/PrismaAdapter.d.ts +0 -115
  450. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  451. package/dist/adapters/PrismaAdapter.js +0 -406
  452. package/dist/adapters/PrismaAdapter.js.map +0 -1
  453. package/dist/adapters/RedisAdapter.d.ts +0 -72
  454. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  455. package/dist/adapters/RedisAdapter.js +0 -286
  456. package/dist/adapters/RedisAdapter.js.map +0 -1
  457. package/dist/adapters/SQLiteAdapter.d.ts +0 -86
  458. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  459. package/dist/adapters/SQLiteAdapter.js +0 -337
  460. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  461. package/dist/adapters/index.d.ts +0 -17
  462. package/dist/adapters/index.d.ts.map +0 -1
  463. package/dist/adapters/index.js +0 -11
  464. package/dist/adapters/index.js.map +0 -1
  465. package/dist/adapters/sessionRow.d.ts +0 -22
  466. package/dist/adapters/sessionRow.d.ts.map +0 -1
  467. package/dist/adapters/sessionRow.js +0 -48
  468. package/dist/adapters/sessionRow.js.map +0 -1
  469. package/dist/cjs/adapters/MemoryAdapter.d.ts +0 -47
  470. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  471. package/dist/cjs/adapters/MemoryAdapter.js +0 -208
  472. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  473. package/dist/cjs/adapters/MongoAdapter.d.ts +0 -97
  474. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  475. package/dist/cjs/adapters/MongoAdapter.js +0 -200
  476. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  477. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +0 -169
  478. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  479. package/dist/cjs/adapters/OpenSearchAdapter.js +0 -475
  480. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  481. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +0 -85
  482. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  483. package/dist/cjs/adapters/PostgreSQLAdapter.js +0 -312
  484. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  485. package/dist/cjs/adapters/PrismaAdapter.d.ts +0 -115
  486. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  487. package/dist/cjs/adapters/PrismaAdapter.js +0 -410
  488. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  489. package/dist/cjs/adapters/RedisAdapter.d.ts +0 -72
  490. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  491. package/dist/cjs/adapters/RedisAdapter.js +0 -290
  492. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  493. package/dist/cjs/adapters/SQLiteAdapter.d.ts +0 -86
  494. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  495. package/dist/cjs/adapters/SQLiteAdapter.js +0 -341
  496. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  497. package/dist/cjs/adapters/index.d.ts +0 -17
  498. package/dist/cjs/adapters/index.d.ts.map +0 -1
  499. package/dist/cjs/adapters/index.js +0 -21
  500. package/dist/cjs/adapters/index.js.map +0 -1
  501. package/dist/cjs/adapters/sessionRow.d.ts +0 -22
  502. package/dist/cjs/adapters/sessionRow.d.ts.map +0 -1
  503. package/dist/cjs/adapters/sessionRow.js +0 -52
  504. package/dist/cjs/adapters/sessionRow.js.map +0 -1
  505. package/dist/cjs/constants/index.d.ts +0 -1
  506. package/dist/cjs/constants/index.d.ts.map +0 -1
  507. package/dist/cjs/constants/index.js +0 -4
  508. package/dist/cjs/constants/index.js.map +0 -1
  509. package/dist/cjs/core/AutoChainExecutor.d.ts +0 -97
  510. package/dist/cjs/core/AutoChainExecutor.d.ts.map +0 -1
  511. package/dist/cjs/core/AutoChainExecutor.js +0 -288
  512. package/dist/cjs/core/AutoChainExecutor.js.map +0 -1
  513. package/dist/cjs/core/BranchEvaluator.d.ts +0 -55
  514. package/dist/cjs/core/BranchEvaluator.d.ts.map +0 -1
  515. package/dist/cjs/core/BranchEvaluator.js +0 -125
  516. package/dist/cjs/core/BranchEvaluator.js.map +0 -1
  517. package/dist/cjs/core/DirectiveChainTracker.d.ts +0 -49
  518. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +0 -1
  519. package/dist/cjs/core/DirectiveChainTracker.js +0 -121
  520. package/dist/cjs/core/DirectiveChainTracker.js.map +0 -1
  521. package/dist/cjs/core/Events.d.ts +0 -26
  522. package/dist/cjs/core/Events.d.ts.map +0 -1
  523. package/dist/cjs/core/Events.js +0 -144
  524. package/dist/cjs/core/Events.js.map +0 -1
  525. package/dist/cjs/core/Flow.d.ts +0 -183
  526. package/dist/cjs/core/Flow.d.ts.map +0 -1
  527. package/dist/cjs/core/Flow.js +0 -551
  528. package/dist/cjs/core/Flow.js.map +0 -1
  529. package/dist/cjs/core/FlowRouter.d.ts +0 -183
  530. package/dist/cjs/core/FlowRouter.d.ts.map +0 -1
  531. package/dist/cjs/core/FlowRouter.js +0 -1047
  532. package/dist/cjs/core/FlowRouter.js.map +0 -1
  533. package/dist/cjs/core/PersistenceManager.d.ts +0 -114
  534. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  535. package/dist/cjs/core/PersistenceManager.js +0 -336
  536. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  537. package/dist/cjs/core/PromptComposer.d.ts +0 -47
  538. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  539. package/dist/cjs/core/PromptComposer.js +0 -397
  540. package/dist/cjs/core/PromptComposer.js.map +0 -1
  541. package/dist/cjs/core/PromptSectionCache.d.ts +0 -48
  542. package/dist/cjs/core/PromptSectionCache.d.ts.map +0 -1
  543. package/dist/cjs/core/PromptSectionCache.js +0 -108
  544. package/dist/cjs/core/PromptSectionCache.js.map +0 -1
  545. package/dist/cjs/core/ResponseEngine.d.ts +0 -43
  546. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  547. package/dist/cjs/core/ResponseEngine.js +0 -235
  548. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  549. package/dist/cjs/core/ResponseGenerationError.d.ts +0 -30
  550. package/dist/cjs/core/ResponseGenerationError.d.ts.map +0 -1
  551. package/dist/cjs/core/ResponseGenerationError.js +0 -35
  552. package/dist/cjs/core/ResponseGenerationError.js.map +0 -1
  553. package/dist/cjs/core/ResponseModal.d.ts +0 -305
  554. package/dist/cjs/core/ResponseModal.d.ts.map +0 -1
  555. package/dist/cjs/core/ResponseModal.js +0 -1414
  556. package/dist/cjs/core/ResponseModal.js.map +0 -1
  557. package/dist/cjs/core/ResponsePipeline.d.ts +0 -220
  558. package/dist/cjs/core/ResponsePipeline.d.ts.map +0 -1
  559. package/dist/cjs/core/ResponsePipeline.js +0 -1040
  560. package/dist/cjs/core/ResponsePipeline.js.map +0 -1
  561. package/dist/cjs/core/SessionFinalizer.d.ts +0 -34
  562. package/dist/cjs/core/SessionFinalizer.d.ts.map +0 -1
  563. package/dist/cjs/core/SessionFinalizer.js +0 -88
  564. package/dist/cjs/core/SessionFinalizer.js.map +0 -1
  565. package/dist/cjs/core/SessionManager.d.ts +0 -112
  566. package/dist/cjs/core/SessionManager.d.ts.map +0 -1
  567. package/dist/cjs/core/SessionManager.js +0 -308
  568. package/dist/cjs/core/SessionManager.js.map +0 -1
  569. package/dist/cjs/core/SignalCoordinator.d.ts +0 -103
  570. package/dist/cjs/core/SignalCoordinator.d.ts.map +0 -1
  571. package/dist/cjs/core/SignalCoordinator.js +0 -207
  572. package/dist/cjs/core/SignalCoordinator.js.map +0 -1
  573. package/dist/cjs/core/SignalEvaluator.d.ts +0 -86
  574. package/dist/cjs/core/SignalEvaluator.d.ts.map +0 -1
  575. package/dist/cjs/core/SignalEvaluator.js +0 -319
  576. package/dist/cjs/core/SignalEvaluator.js.map +0 -1
  577. package/dist/cjs/core/SignalProcessor.d.ts +0 -152
  578. package/dist/cjs/core/SignalProcessor.d.ts.map +0 -1
  579. package/dist/cjs/core/SignalProcessor.js +0 -505
  580. package/dist/cjs/core/SignalProcessor.js.map +0 -1
  581. package/dist/cjs/core/Step.d.ts +0 -184
  582. package/dist/cjs/core/Step.d.ts.map +0 -1
  583. package/dist/cjs/core/Step.js +0 -599
  584. package/dist/cjs/core/Step.js.map +0 -1
  585. package/dist/cjs/core/StepLifecycle.d.ts +0 -43
  586. package/dist/cjs/core/StepLifecycle.d.ts.map +0 -1
  587. package/dist/cjs/core/StepLifecycle.js +0 -180
  588. package/dist/cjs/core/StepLifecycle.js.map +0 -1
  589. package/dist/cjs/core/StreamingToolExecutor.d.ts +0 -142
  590. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +0 -1
  591. package/dist/cjs/core/StreamingToolExecutor.js +0 -490
  592. package/dist/cjs/core/StreamingToolExecutor.js.map +0 -1
  593. package/dist/cjs/core/ToolLoopExecutor.d.ts +0 -133
  594. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +0 -1
  595. package/dist/cjs/core/ToolLoopExecutor.js +0 -568
  596. package/dist/cjs/core/ToolLoopExecutor.js.map +0 -1
  597. package/dist/cjs/core/ToolManager.d.ts +0 -250
  598. package/dist/cjs/core/ToolManager.d.ts.map +0 -1
  599. package/dist/cjs/core/ToolManager.js +0 -1104
  600. package/dist/cjs/core/ToolManager.js.map +0 -1
  601. package/dist/cjs/core/createAgent.d.ts +0 -35
  602. package/dist/cjs/core/createAgent.d.ts.map +0 -1
  603. package/dist/cjs/core/createAgent.js +0 -39
  604. package/dist/cjs/core/createAgent.js.map +0 -1
  605. package/dist/cjs/core/flow-namespace.d.ts +0 -64
  606. package/dist/cjs/core/flow-namespace.d.ts.map +0 -1
  607. package/dist/cjs/core/flow-namespace.js +0 -182
  608. package/dist/cjs/core/flow-namespace.js.map +0 -1
  609. package/dist/cjs/core/toolGates.d.ts +0 -24
  610. package/dist/cjs/core/toolGates.d.ts.map +0 -1
  611. package/dist/cjs/core/toolGates.js +0 -52
  612. package/dist/cjs/core/toolGates.js.map +0 -1
  613. package/dist/cjs/types/persistence.d.ts +0 -254
  614. package/dist/cjs/types/persistence.d.ts.map +0 -1
  615. package/dist/cjs/types/persistence.js +0 -7
  616. package/dist/cjs/types/persistence.js.map +0 -1
  617. package/dist/cjs/types/prompt-cache.d.ts +0 -15
  618. package/dist/cjs/types/prompt-cache.d.ts.map +0 -1
  619. package/dist/cjs/types/prompt-cache.js +0 -6
  620. package/dist/cjs/types/prompt-cache.js.map +0 -1
  621. package/dist/cjs/types/signals.d.ts +0 -263
  622. package/dist/cjs/types/signals.d.ts.map +0 -1
  623. package/dist/cjs/types/signals.js +0 -11
  624. package/dist/cjs/types/signals.js.map +0 -1
  625. package/dist/cjs/types/template.d.ts +0 -84
  626. package/dist/cjs/types/template.d.ts.map +0 -1
  627. package/dist/cjs/types/template.js +0 -3
  628. package/dist/cjs/types/template.js.map +0 -1
  629. package/dist/cjs/utils/condition.d.ts +0 -63
  630. package/dist/cjs/utils/condition.d.ts.map +0 -1
  631. package/dist/cjs/utils/condition.js +0 -239
  632. package/dist/cjs/utils/condition.js.map +0 -1
  633. package/dist/cjs/utils/event.d.ts +0 -6
  634. package/dist/cjs/utils/event.d.ts.map +0 -1
  635. package/dist/cjs/utils/event.js +0 -20
  636. package/dist/cjs/utils/event.js.map +0 -1
  637. package/dist/cjs/utils/id.d.ts +0 -33
  638. package/dist/cjs/utils/id.d.ts.map +0 -1
  639. package/dist/cjs/utils/id.js +0 -84
  640. package/dist/cjs/utils/id.js.map +0 -1
  641. package/dist/cjs/utils/serialize.d.ts +0 -36
  642. package/dist/cjs/utils/serialize.d.ts.map +0 -1
  643. package/dist/cjs/utils/serialize.js +0 -77
  644. package/dist/cjs/utils/serialize.js.map +0 -1
  645. package/dist/cjs/utils/session.d.ts +0 -124
  646. package/dist/cjs/utils/session.d.ts.map +0 -1
  647. package/dist/cjs/utils/session.js +0 -396
  648. package/dist/cjs/utils/session.js.map +0 -1
  649. package/dist/constants/index.d.ts +0 -2
  650. package/dist/constants/index.d.ts.map +0 -1
  651. package/dist/constants/index.js +0 -4
  652. package/dist/constants/index.js.map +0 -1
  653. package/dist/core/AutoChainExecutor.d.ts +0 -97
  654. package/dist/core/AutoChainExecutor.d.ts.map +0 -1
  655. package/dist/core/AutoChainExecutor.js +0 -284
  656. package/dist/core/AutoChainExecutor.js.map +0 -1
  657. package/dist/core/BranchEvaluator.d.ts +0 -55
  658. package/dist/core/BranchEvaluator.d.ts.map +0 -1
  659. package/dist/core/BranchEvaluator.js +0 -121
  660. package/dist/core/BranchEvaluator.js.map +0 -1
  661. package/dist/core/DirectiveChainTracker.d.ts +0 -49
  662. package/dist/core/DirectiveChainTracker.d.ts.map +0 -1
  663. package/dist/core/DirectiveChainTracker.js +0 -117
  664. package/dist/core/DirectiveChainTracker.js.map +0 -1
  665. package/dist/core/Events.d.ts +0 -26
  666. package/dist/core/Events.d.ts.map +0 -1
  667. package/dist/core/Events.js +0 -137
  668. package/dist/core/Events.js.map +0 -1
  669. package/dist/core/Flow.d.ts +0 -183
  670. package/dist/core/Flow.d.ts.map +0 -1
  671. package/dist/core/Flow.js +0 -547
  672. package/dist/core/Flow.js.map +0 -1
  673. package/dist/core/FlowRouter.d.ts +0 -183
  674. package/dist/core/FlowRouter.d.ts.map +0 -1
  675. package/dist/core/FlowRouter.js +0 -1043
  676. package/dist/core/FlowRouter.js.map +0 -1
  677. package/dist/core/PersistenceManager.d.ts +0 -114
  678. package/dist/core/PersistenceManager.d.ts.map +0 -1
  679. package/dist/core/PersistenceManager.js +0 -332
  680. package/dist/core/PersistenceManager.js.map +0 -1
  681. package/dist/core/PromptComposer.d.ts +0 -47
  682. package/dist/core/PromptComposer.d.ts.map +0 -1
  683. package/dist/core/PromptComposer.js +0 -393
  684. package/dist/core/PromptComposer.js.map +0 -1
  685. package/dist/core/PromptSectionCache.d.ts +0 -48
  686. package/dist/core/PromptSectionCache.d.ts.map +0 -1
  687. package/dist/core/PromptSectionCache.js +0 -104
  688. package/dist/core/PromptSectionCache.js.map +0 -1
  689. package/dist/core/ResponseEngine.d.ts +0 -43
  690. package/dist/core/ResponseEngine.d.ts.map +0 -1
  691. package/dist/core/ResponseEngine.js +0 -231
  692. package/dist/core/ResponseEngine.js.map +0 -1
  693. package/dist/core/ResponseGenerationError.d.ts +0 -30
  694. package/dist/core/ResponseGenerationError.d.ts.map +0 -1
  695. package/dist/core/ResponseGenerationError.js +0 -31
  696. package/dist/core/ResponseGenerationError.js.map +0 -1
  697. package/dist/core/ResponseModal.d.ts +0 -305
  698. package/dist/core/ResponseModal.d.ts.map +0 -1
  699. package/dist/core/ResponseModal.js +0 -1410
  700. package/dist/core/ResponseModal.js.map +0 -1
  701. package/dist/core/ResponsePipeline.d.ts +0 -220
  702. package/dist/core/ResponsePipeline.d.ts.map +0 -1
  703. package/dist/core/ResponsePipeline.js +0 -1035
  704. package/dist/core/ResponsePipeline.js.map +0 -1
  705. package/dist/core/SessionFinalizer.d.ts +0 -34
  706. package/dist/core/SessionFinalizer.d.ts.map +0 -1
  707. package/dist/core/SessionFinalizer.js +0 -84
  708. package/dist/core/SessionFinalizer.js.map +0 -1
  709. package/dist/core/SessionManager.d.ts +0 -112
  710. package/dist/core/SessionManager.d.ts.map +0 -1
  711. package/dist/core/SessionManager.js +0 -301
  712. package/dist/core/SessionManager.js.map +0 -1
  713. package/dist/core/SignalCoordinator.d.ts +0 -103
  714. package/dist/core/SignalCoordinator.d.ts.map +0 -1
  715. package/dist/core/SignalCoordinator.js +0 -203
  716. package/dist/core/SignalCoordinator.js.map +0 -1
  717. package/dist/core/SignalEvaluator.d.ts +0 -86
  718. package/dist/core/SignalEvaluator.d.ts.map +0 -1
  719. package/dist/core/SignalEvaluator.js +0 -312
  720. package/dist/core/SignalEvaluator.js.map +0 -1
  721. package/dist/core/SignalProcessor.d.ts +0 -152
  722. package/dist/core/SignalProcessor.d.ts.map +0 -1
  723. package/dist/core/SignalProcessor.js +0 -498
  724. package/dist/core/SignalProcessor.js.map +0 -1
  725. package/dist/core/Step.d.ts +0 -184
  726. package/dist/core/Step.d.ts.map +0 -1
  727. package/dist/core/Step.js +0 -594
  728. package/dist/core/Step.js.map +0 -1
  729. package/dist/core/StepLifecycle.d.ts +0 -43
  730. package/dist/core/StepLifecycle.d.ts.map +0 -1
  731. package/dist/core/StepLifecycle.js +0 -176
  732. package/dist/core/StepLifecycle.js.map +0 -1
  733. package/dist/core/StreamingToolExecutor.d.ts +0 -142
  734. package/dist/core/StreamingToolExecutor.d.ts.map +0 -1
  735. package/dist/core/StreamingToolExecutor.js +0 -483
  736. package/dist/core/StreamingToolExecutor.js.map +0 -1
  737. package/dist/core/ToolLoopExecutor.d.ts +0 -133
  738. package/dist/core/ToolLoopExecutor.d.ts.map +0 -1
  739. package/dist/core/ToolLoopExecutor.js +0 -564
  740. package/dist/core/ToolLoopExecutor.js.map +0 -1
  741. package/dist/core/ToolManager.d.ts +0 -250
  742. package/dist/core/ToolManager.d.ts.map +0 -1
  743. package/dist/core/ToolManager.js +0 -1098
  744. package/dist/core/ToolManager.js.map +0 -1
  745. package/dist/core/createAgent.d.ts +0 -35
  746. package/dist/core/createAgent.d.ts.map +0 -1
  747. package/dist/core/createAgent.js +0 -36
  748. package/dist/core/createAgent.js.map +0 -1
  749. package/dist/core/flow-namespace.d.ts +0 -64
  750. package/dist/core/flow-namespace.d.ts.map +0 -1
  751. package/dist/core/flow-namespace.js +0 -179
  752. package/dist/core/flow-namespace.js.map +0 -1
  753. package/dist/core/toolGates.d.ts +0 -24
  754. package/dist/core/toolGates.d.ts.map +0 -1
  755. package/dist/core/toolGates.js +0 -49
  756. package/dist/core/toolGates.js.map +0 -1
  757. package/dist/types/persistence.d.ts +0 -254
  758. package/dist/types/persistence.d.ts.map +0 -1
  759. package/dist/types/persistence.js +0 -6
  760. package/dist/types/persistence.js.map +0 -1
  761. package/dist/types/prompt-cache.d.ts +0 -15
  762. package/dist/types/prompt-cache.d.ts.map +0 -1
  763. package/dist/types/prompt-cache.js +0 -5
  764. package/dist/types/prompt-cache.js.map +0 -1
  765. package/dist/types/signals.d.ts +0 -263
  766. package/dist/types/signals.d.ts.map +0 -1
  767. package/dist/types/signals.js +0 -10
  768. package/dist/types/signals.js.map +0 -1
  769. package/dist/types/template.d.ts +0 -84
  770. package/dist/types/template.d.ts.map +0 -1
  771. package/dist/types/template.js +0 -2
  772. package/dist/types/template.js.map +0 -1
  773. package/dist/utils/condition.d.ts +0 -63
  774. package/dist/utils/condition.d.ts.map +0 -1
  775. package/dist/utils/condition.js +0 -230
  776. package/dist/utils/condition.js.map +0 -1
  777. package/dist/utils/event.d.ts +0 -6
  778. package/dist/utils/event.d.ts.map +0 -1
  779. package/dist/utils/event.js +0 -17
  780. package/dist/utils/event.js.map +0 -1
  781. package/dist/utils/id.d.ts +0 -33
  782. package/dist/utils/id.d.ts.map +0 -1
  783. package/dist/utils/id.js +0 -77
  784. package/dist/utils/id.js.map +0 -1
  785. package/dist/utils/serialize.d.ts +0 -36
  786. package/dist/utils/serialize.d.ts.map +0 -1
  787. package/dist/utils/serialize.js +0 -72
  788. package/dist/utils/serialize.js.map +0 -1
  789. package/dist/utils/session.d.ts +0 -124
  790. package/dist/utils/session.d.ts.map +0 -1
  791. package/dist/utils/session.js +0 -379
  792. package/dist/utils/session.js.map +0 -1
  793. package/docs/concepts/directives.md +0 -369
  794. package/docs/reference/adapters.md +0 -543
  795. package/docs/reference/create-agent.md +0 -216
  796. package/docs/reference/directive.md +0 -242
  797. package/docs/reference/signals.md +0 -368
  798. package/examples/02-data-extraction.ts +0 -90
  799. package/examples/05-branching.ts +0 -140
  800. package/examples/06-flow-control.ts +0 -103
  801. package/examples/08-persistence.ts +0 -98
  802. package/examples/09-signals.ts +0 -144
  803. package/src/adapters/MemoryAdapter.ts +0 -281
  804. package/src/adapters/MongoAdapter.ts +0 -341
  805. package/src/adapters/OpenSearchAdapter.ts +0 -693
  806. package/src/adapters/PostgreSQLAdapter.ts +0 -487
  807. package/src/adapters/PrismaAdapter.ts +0 -617
  808. package/src/adapters/RedisAdapter.ts +0 -439
  809. package/src/adapters/SQLiteAdapter.ts +0 -496
  810. package/src/adapters/index.ts +0 -43
  811. package/src/adapters/sessionRow.ts +0 -57
  812. package/src/constants/index.ts +0 -2
  813. package/src/core/AutoChainExecutor.ts +0 -397
  814. package/src/core/BranchEvaluator.ts +0 -161
  815. package/src/core/DirectiveChainTracker.ts +0 -144
  816. package/src/core/Events.ts +0 -164
  817. package/src/core/Flow.ts +0 -665
  818. package/src/core/FlowRouter.ts +0 -1540
  819. package/src/core/PersistenceManager.ts +0 -446
  820. package/src/core/PromptComposer.ts +0 -448
  821. package/src/core/PromptSectionCache.ts +0 -125
  822. package/src/core/ResponseEngine.ts +0 -338
  823. package/src/core/ResponseGenerationError.ts +0 -53
  824. package/src/core/ResponseModal.ts +0 -1902
  825. package/src/core/ResponsePipeline.ts +0 -1404
  826. package/src/core/SessionFinalizer.ts +0 -108
  827. package/src/core/SessionManager.ts +0 -372
  828. package/src/core/SignalCoordinator.ts +0 -263
  829. package/src/core/SignalEvaluator.ts +0 -404
  830. package/src/core/SignalProcessor.ts +0 -663
  831. package/src/core/Step.ts +0 -782
  832. package/src/core/StepLifecycle.ts +0 -242
  833. package/src/core/StreamingToolExecutor.ts +0 -609
  834. package/src/core/ToolLoopExecutor.ts +0 -749
  835. package/src/core/ToolManager.ts +0 -1379
  836. package/src/core/createAgent.ts +0 -40
  837. package/src/core/flow-namespace.ts +0 -227
  838. package/src/core/toolGates.ts +0 -72
  839. package/src/types/persistence.ts +0 -303
  840. package/src/types/prompt-cache.ts +0 -17
  841. package/src/types/signals.ts +0 -338
  842. package/src/types/template.ts +0 -98
  843. package/src/utils/condition.ts +0 -296
  844. package/src/utils/event.ts +0 -16
  845. package/src/utils/id.ts +0 -91
  846. package/src/utils/serialize.ts +0 -86
  847. package/src/utils/session.ts +0 -501
@@ -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
- }