@falai/agent 3.4.5 → 4.0.0-alpha.10

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 (865) hide show
  1. package/README.md +41 -34
  2. package/dist/cjs/core/Agent.d.ts +29 -378
  3. package/dist/cjs/core/Agent.d.ts.map +1 -1
  4. package/dist/cjs/core/Agent.js +113 -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 +573 -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 +149 -0
  20. package/dist/cjs/core/Prompt.js.map +1 -0
  21. package/dist/cjs/core/Runner.d.ts +171 -0
  22. package/dist/cjs/core/Runner.d.ts.map +1 -0
  23. package/dist/cjs/core/Runner.js +1158 -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 +373 -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 +357 -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 +163 -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/phrases.d.ts +25 -0
  158. package/dist/cjs/utils/phrases.d.ts.map +1 -0
  159. package/dist/cjs/utils/phrases.js +38 -0
  160. package/dist/cjs/utils/phrases.js.map +1 -0
  161. package/dist/cjs/utils/schema.d.ts +50 -0
  162. package/dist/cjs/utils/schema.d.ts.map +1 -0
  163. package/dist/cjs/utils/schema.js +138 -0
  164. package/dist/cjs/utils/schema.js.map +1 -0
  165. package/dist/cjs/utils/streamingMessage.d.ts +3 -2
  166. package/dist/cjs/utils/streamingMessage.d.ts.map +1 -1
  167. package/dist/cjs/utils/streamingMessage.js +38 -4
  168. package/dist/cjs/utils/streamingMessage.js.map +1 -1
  169. package/dist/cjs/utils/template.d.ts +22 -150
  170. package/dist/cjs/utils/template.d.ts.map +1 -1
  171. package/dist/cjs/utils/template.js +64 -359
  172. package/dist/cjs/utils/template.js.map +1 -1
  173. package/dist/cjs/utils/usage.d.ts +19 -0
  174. package/dist/cjs/utils/usage.d.ts.map +1 -0
  175. package/dist/cjs/utils/usage.js +35 -0
  176. package/dist/cjs/utils/usage.js.map +1 -0
  177. package/dist/core/Agent.d.ts +29 -378
  178. package/dist/core/Agent.d.ts.map +1 -1
  179. package/dist/core/Agent.js +116 -1181
  180. package/dist/core/Agent.js.map +1 -1
  181. package/dist/core/CompactionEngine.d.ts.map +1 -1
  182. package/dist/core/CompactionEngine.js +5 -3
  183. package/dist/core/CompactionEngine.js.map +1 -1
  184. package/dist/core/FlowSpec.d.ts +136 -0
  185. package/dist/core/FlowSpec.d.ts.map +1 -0
  186. package/dist/core/FlowSpec.js +567 -0
  187. package/dist/core/FlowSpec.js.map +1 -0
  188. package/dist/core/Migrate.d.ts +38 -0
  189. package/dist/core/Migrate.d.ts.map +1 -0
  190. package/dist/core/Migrate.js +264 -0
  191. package/dist/core/Migrate.js.map +1 -0
  192. package/dist/core/Prompt.d.ts +54 -0
  193. package/dist/core/Prompt.d.ts.map +1 -0
  194. package/dist/core/Prompt.js +139 -0
  195. package/dist/core/Prompt.js.map +1 -0
  196. package/dist/core/Runner.d.ts +171 -0
  197. package/dist/core/Runner.d.ts.map +1 -0
  198. package/dist/core/Runner.js +1154 -0
  199. package/dist/core/Runner.js.map +1 -0
  200. package/dist/core/Speak.d.ts +37 -0
  201. package/dist/core/Speak.d.ts.map +1 -0
  202. package/dist/core/Speak.js +369 -0
  203. package/dist/core/Speak.js.map +1 -0
  204. package/dist/core/Understand.d.ts +28 -0
  205. package/dist/core/Understand.d.ts.map +1 -0
  206. package/dist/core/Understand.js +353 -0
  207. package/dist/core/Understand.js.map +1 -0
  208. package/dist/core/contracts.d.ts +122 -0
  209. package/dist/core/contracts.d.ts.map +1 -0
  210. package/dist/core/contracts.js +10 -0
  211. package/dist/core/contracts.js.map +1 -0
  212. package/dist/core/falai.d.ts +57 -0
  213. package/dist/core/falai.d.ts.map +1 -0
  214. package/dist/core/falai.js +40 -0
  215. package/dist/core/falai.js.map +1 -0
  216. package/dist/core/predicate.d.ts +9 -0
  217. package/dist/core/predicate.d.ts.map +1 -0
  218. package/dist/core/predicate.js +54 -0
  219. package/dist/core/predicate.js.map +1 -0
  220. package/dist/index.d.ts +26 -31
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +19 -24
  223. package/dist/index.js.map +1 -1
  224. package/dist/persistence/MemoryStore.d.ts +15 -0
  225. package/dist/persistence/MemoryStore.d.ts.map +1 -0
  226. package/dist/persistence/MemoryStore.js +35 -0
  227. package/dist/persistence/MemoryStore.js.map +1 -0
  228. package/dist/persistence/MongoStore.d.ts +42 -0
  229. package/dist/persistence/MongoStore.d.ts.map +1 -0
  230. package/dist/persistence/MongoStore.js +56 -0
  231. package/dist/persistence/MongoStore.js.map +1 -0
  232. package/dist/persistence/OpenSearchStore.d.ts +86 -0
  233. package/dist/persistence/OpenSearchStore.d.ts.map +1 -0
  234. package/dist/persistence/OpenSearchStore.js +116 -0
  235. package/dist/persistence/OpenSearchStore.js.map +1 -0
  236. package/dist/persistence/PostgresStore.d.ts +41 -0
  237. package/dist/persistence/PostgresStore.d.ts.map +1 -0
  238. package/dist/persistence/PostgresStore.js +54 -0
  239. package/dist/persistence/PostgresStore.js.map +1 -0
  240. package/dist/persistence/PrismaStore.d.ts +65 -0
  241. package/dist/persistence/PrismaStore.d.ts.map +1 -0
  242. package/dist/persistence/PrismaStore.js +91 -0
  243. package/dist/persistence/PrismaStore.js.map +1 -0
  244. package/dist/persistence/RedisStore.d.ts +34 -0
  245. package/dist/persistence/RedisStore.d.ts.map +1 -0
  246. package/dist/persistence/RedisStore.js +57 -0
  247. package/dist/persistence/RedisStore.js.map +1 -0
  248. package/dist/persistence/SQLiteStore.d.ts +45 -0
  249. package/dist/persistence/SQLiteStore.d.ts.map +1 -0
  250. package/dist/persistence/SQLiteStore.js +70 -0
  251. package/dist/persistence/SQLiteStore.js.map +1 -0
  252. package/dist/persistence/sessionRow.d.ts +14 -0
  253. package/dist/persistence/sessionRow.d.ts.map +1 -0
  254. package/dist/persistence/sessionRow.js +45 -0
  255. package/dist/persistence/sessionRow.js.map +1 -0
  256. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  257. package/dist/providers/DeepSeekProvider.js +8 -3
  258. package/dist/providers/DeepSeekProvider.js.map +1 -1
  259. package/dist/providers/GeminiProvider.d.ts +4 -3
  260. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  261. package/dist/providers/GeminiProvider.js +4 -3
  262. package/dist/providers/GeminiProvider.js.map +1 -1
  263. package/dist/providers/OpenAICompatibleProvider.d.ts +4 -0
  264. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  265. package/dist/providers/OpenAICompatibleProvider.js +2 -0
  266. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  267. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  268. package/dist/providers/OpenRouterProvider.js +2 -4
  269. package/dist/providers/OpenRouterProvider.js.map +1 -1
  270. package/dist/providers/ProviderAdapter.d.ts +11 -6
  271. package/dist/providers/ProviderAdapter.d.ts.map +1 -1
  272. package/dist/providers/ProviderAdapter.js +34 -11
  273. package/dist/providers/ProviderAdapter.js.map +1 -1
  274. package/dist/providers/ZaiProvider.d.ts +6 -4
  275. package/dist/providers/ZaiProvider.d.ts.map +1 -1
  276. package/dist/providers/ZaiProvider.js +6 -4
  277. package/dist/providers/ZaiProvider.js.map +1 -1
  278. package/dist/types/agent.d.ts +163 -383
  279. package/dist/types/agent.d.ts.map +1 -1
  280. package/dist/types/agent.js +1 -1
  281. package/dist/types/ai.d.ts +32 -1
  282. package/dist/types/ai.d.ts.map +1 -1
  283. package/dist/types/compaction.d.ts +3 -1
  284. package/dist/types/compaction.d.ts.map +1 -1
  285. package/dist/types/errors.d.ts +9 -12
  286. package/dist/types/errors.d.ts.map +1 -1
  287. package/dist/types/errors.js +12 -15
  288. package/dist/types/errors.js.map +1 -1
  289. package/dist/types/flow.d.ts +265 -513
  290. package/dist/types/flow.d.ts.map +1 -1
  291. package/dist/types/flow.js +7 -1
  292. package/dist/types/flow.js.map +1 -1
  293. package/dist/types/history.d.ts +7 -18
  294. package/dist/types/history.d.ts.map +1 -1
  295. package/dist/types/history.js.map +1 -1
  296. package/dist/types/index.d.ts +9 -15
  297. package/dist/types/index.d.ts.map +1 -1
  298. package/dist/types/index.js +2 -7
  299. package/dist/types/index.js.map +1 -1
  300. package/dist/types/session.d.ts +94 -64
  301. package/dist/types/session.d.ts.map +1 -1
  302. package/dist/types/session.js +5 -1
  303. package/dist/types/session.js.map +1 -1
  304. package/dist/types/tool.d.ts +37 -207
  305. package/dist/types/tool.d.ts.map +1 -1
  306. package/dist/types/tool.js +6 -13
  307. package/dist/types/tool.js.map +1 -1
  308. package/dist/utils/clock.d.ts +28 -0
  309. package/dist/utils/clock.d.ts.map +1 -0
  310. package/dist/utils/clock.js +59 -0
  311. package/dist/utils/clock.js.map +1 -0
  312. package/dist/utils/duration.d.ts +11 -0
  313. package/dist/utils/duration.d.ts.map +1 -0
  314. package/dist/utils/duration.js +26 -0
  315. package/dist/utils/duration.js.map +1 -0
  316. package/dist/utils/history.d.ts +4 -1
  317. package/dist/utils/history.d.ts.map +1 -1
  318. package/dist/utils/history.js +2 -2
  319. package/dist/utils/history.js.map +1 -1
  320. package/dist/utils/index.d.ts +4 -10
  321. package/dist/utils/index.d.ts.map +1 -1
  322. package/dist/utils/index.js +4 -21
  323. package/dist/utils/index.js.map +1 -1
  324. package/dist/utils/json.d.ts +2 -0
  325. package/dist/utils/json.d.ts.map +1 -1
  326. package/dist/utils/json.js +4 -0
  327. package/dist/utils/json.js.map +1 -1
  328. package/dist/utils/outcomes.d.ts +48 -0
  329. package/dist/utils/outcomes.d.ts.map +1 -0
  330. package/dist/utils/outcomes.js +48 -0
  331. package/dist/utils/outcomes.js.map +1 -0
  332. package/dist/utils/phrases.d.ts +25 -0
  333. package/dist/utils/phrases.d.ts.map +1 -0
  334. package/dist/utils/phrases.js +35 -0
  335. package/dist/utils/phrases.js.map +1 -0
  336. package/dist/utils/schema.d.ts +50 -0
  337. package/dist/utils/schema.d.ts.map +1 -0
  338. package/dist/utils/schema.js +129 -0
  339. package/dist/utils/schema.js.map +1 -0
  340. package/dist/utils/streamingMessage.d.ts +3 -2
  341. package/dist/utils/streamingMessage.d.ts.map +1 -1
  342. package/dist/utils/streamingMessage.js +38 -4
  343. package/dist/utils/streamingMessage.js.map +1 -1
  344. package/dist/utils/template.d.ts +22 -150
  345. package/dist/utils/template.d.ts.map +1 -1
  346. package/dist/utils/template.js +61 -351
  347. package/dist/utils/template.js.map +1 -1
  348. package/dist/utils/usage.d.ts +19 -0
  349. package/dist/utils/usage.d.ts.map +1 -0
  350. package/dist/utils/usage.js +31 -0
  351. package/dist/utils/usage.js.map +1 -0
  352. package/docs/README.md +37 -19
  353. package/docs/concepts/architecture.md +117 -239
  354. package/docs/concepts/collection.md +170 -0
  355. package/docs/concepts/pipeline.md +132 -378
  356. package/docs/concepts/runs-and-waits.md +192 -0
  357. package/docs/guides/actions-and-events.md +276 -0
  358. package/docs/guides/branching.md +119 -208
  359. package/docs/guides/compaction.md +63 -158
  360. package/docs/guides/conditions.md +164 -128
  361. package/docs/guides/error-handling.md +170 -164
  362. package/docs/guides/flow-control.md +210 -349
  363. package/docs/guides/flows-from-json.md +224 -0
  364. package/docs/guides/instructions.md +125 -161
  365. package/docs/guides/persistence.md +182 -206
  366. package/docs/guides/streaming.md +50 -114
  367. package/docs/guides/testing.md +284 -0
  368. package/docs/guides/triggers.md +401 -0
  369. package/docs/migration/README.md +8 -15
  370. package/docs/migration/v1-to-v2.md +1 -1
  371. package/docs/migration/v2-3-to-v2-4.md +2 -2
  372. package/docs/migration/v2-6-to-v2-7.md +4 -4
  373. package/docs/migration/v3-to-v4.md +457 -0
  374. package/docs/reference/actions-events-conditions.md +396 -0
  375. package/docs/reference/agent.md +248 -0
  376. package/docs/reference/branches.md +75 -203
  377. package/docs/reference/errors.md +188 -144
  378. package/docs/reference/fields.md +125 -0
  379. package/docs/reference/flow-spec.md +248 -0
  380. package/docs/reference/flow.md +104 -192
  381. package/docs/reference/instruction.md +83 -137
  382. package/docs/reference/outcomes.md +273 -0
  383. package/docs/reference/providers.md +525 -302
  384. package/docs/reference/session.md +210 -0
  385. package/docs/reference/step.md +194 -312
  386. package/docs/reference/stores.md +496 -0
  387. package/docs/reference/tool.md +162 -231
  388. package/docs/reference/trigger.md +200 -0
  389. package/docs/rfc/v4-one-flow.md +477 -0
  390. package/docs/start/01-install.md +59 -44
  391. package/docs/start/02-first-agent.md +97 -147
  392. package/docs/start/03-collect-data.md +78 -183
  393. package/docs/start/04-add-tools.md +159 -227
  394. package/docs/start/05-go-to-production.md +181 -163
  395. package/examples/01-quickstart.ts +26 -16
  396. package/examples/02-fields.ts +75 -0
  397. package/examples/03-tools.ts +79 -119
  398. package/examples/04-instructions.ts +60 -87
  399. package/examples/05-branches.ts +78 -0
  400. package/examples/06-triggers-and-waits.ts +149 -0
  401. package/examples/07-streaming.ts +34 -60
  402. package/examples/08-store-and-migration.ts +97 -0
  403. package/examples/09-flows-from-json.ts +107 -0
  404. package/package.json +11 -6
  405. package/src/core/Agent.ts +126 -1512
  406. package/src/core/CompactionEngine.ts +7 -4
  407. package/src/core/FlowSpec.ts +778 -0
  408. package/src/core/Migrate.ts +256 -0
  409. package/src/core/Prompt.ts +162 -0
  410. package/src/core/Runner.ts +1214 -0
  411. package/src/core/Speak.ts +460 -0
  412. package/src/core/Understand.ts +423 -0
  413. package/src/core/contracts.ts +111 -0
  414. package/src/core/falai.ts +86 -0
  415. package/src/core/predicate.ts +56 -0
  416. package/src/index.ts +120 -147
  417. package/src/persistence/MemoryStore.ts +37 -0
  418. package/src/persistence/MongoStore.ts +89 -0
  419. package/src/persistence/OpenSearchStore.ts +153 -0
  420. package/src/persistence/PostgresStore.ts +89 -0
  421. package/src/persistence/PrismaStore.ts +127 -0
  422. package/src/persistence/RedisStore.ts +90 -0
  423. package/src/persistence/SQLiteStore.ts +103 -0
  424. package/src/persistence/sessionRow.ts +45 -0
  425. package/src/providers/DeepSeekProvider.ts +8 -3
  426. package/src/providers/GeminiProvider.ts +4 -3
  427. package/src/providers/OpenAICompatibleProvider.ts +6 -0
  428. package/src/providers/OpenRouterProvider.ts +2 -4
  429. package/src/providers/ProviderAdapter.ts +46 -13
  430. package/src/providers/ZaiProvider.ts +6 -4
  431. package/src/types/agent.ts +135 -397
  432. package/src/types/ai.ts +33 -1
  433. package/src/types/compaction.ts +3 -1
  434. package/src/types/errors.ts +13 -16
  435. package/src/types/flow.ts +249 -550
  436. package/src/types/history.ts +7 -20
  437. package/src/types/index.ts +88 -139
  438. package/src/types/session.ts +135 -70
  439. package/src/types/tool.ts +42 -267
  440. package/src/utils/clock.ts +70 -0
  441. package/src/utils/duration.ts +33 -0
  442. package/src/utils/history.ts +3 -2
  443. package/src/utils/index.ts +8 -66
  444. package/src/utils/json.ts +5 -0
  445. package/src/utils/outcomes.ts +56 -0
  446. package/src/utils/phrases.ts +40 -0
  447. package/src/utils/schema.ts +145 -0
  448. package/src/utils/streamingMessage.ts +34 -4
  449. package/src/utils/template.ts +63 -418
  450. package/src/utils/usage.ts +37 -0
  451. package/dist/adapters/MemoryAdapter.d.ts +0 -47
  452. package/dist/adapters/MemoryAdapter.d.ts.map +0 -1
  453. package/dist/adapters/MemoryAdapter.js +0 -204
  454. package/dist/adapters/MemoryAdapter.js.map +0 -1
  455. package/dist/adapters/MongoAdapter.d.ts +0 -97
  456. package/dist/adapters/MongoAdapter.d.ts.map +0 -1
  457. package/dist/adapters/MongoAdapter.js +0 -196
  458. package/dist/adapters/MongoAdapter.js.map +0 -1
  459. package/dist/adapters/OpenSearchAdapter.d.ts +0 -169
  460. package/dist/adapters/OpenSearchAdapter.d.ts.map +0 -1
  461. package/dist/adapters/OpenSearchAdapter.js +0 -471
  462. package/dist/adapters/OpenSearchAdapter.js.map +0 -1
  463. package/dist/adapters/PostgreSQLAdapter.d.ts +0 -85
  464. package/dist/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  465. package/dist/adapters/PostgreSQLAdapter.js +0 -308
  466. package/dist/adapters/PostgreSQLAdapter.js.map +0 -1
  467. package/dist/adapters/PrismaAdapter.d.ts +0 -115
  468. package/dist/adapters/PrismaAdapter.d.ts.map +0 -1
  469. package/dist/adapters/PrismaAdapter.js +0 -406
  470. package/dist/adapters/PrismaAdapter.js.map +0 -1
  471. package/dist/adapters/RedisAdapter.d.ts +0 -72
  472. package/dist/adapters/RedisAdapter.d.ts.map +0 -1
  473. package/dist/adapters/RedisAdapter.js +0 -286
  474. package/dist/adapters/RedisAdapter.js.map +0 -1
  475. package/dist/adapters/SQLiteAdapter.d.ts +0 -86
  476. package/dist/adapters/SQLiteAdapter.d.ts.map +0 -1
  477. package/dist/adapters/SQLiteAdapter.js +0 -337
  478. package/dist/adapters/SQLiteAdapter.js.map +0 -1
  479. package/dist/adapters/index.d.ts +0 -17
  480. package/dist/adapters/index.d.ts.map +0 -1
  481. package/dist/adapters/index.js +0 -11
  482. package/dist/adapters/index.js.map +0 -1
  483. package/dist/adapters/sessionRow.d.ts +0 -22
  484. package/dist/adapters/sessionRow.d.ts.map +0 -1
  485. package/dist/adapters/sessionRow.js +0 -48
  486. package/dist/adapters/sessionRow.js.map +0 -1
  487. package/dist/cjs/adapters/MemoryAdapter.d.ts +0 -47
  488. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +0 -1
  489. package/dist/cjs/adapters/MemoryAdapter.js +0 -208
  490. package/dist/cjs/adapters/MemoryAdapter.js.map +0 -1
  491. package/dist/cjs/adapters/MongoAdapter.d.ts +0 -97
  492. package/dist/cjs/adapters/MongoAdapter.d.ts.map +0 -1
  493. package/dist/cjs/adapters/MongoAdapter.js +0 -200
  494. package/dist/cjs/adapters/MongoAdapter.js.map +0 -1
  495. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +0 -169
  496. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +0 -1
  497. package/dist/cjs/adapters/OpenSearchAdapter.js +0 -475
  498. package/dist/cjs/adapters/OpenSearchAdapter.js.map +0 -1
  499. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +0 -85
  500. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +0 -1
  501. package/dist/cjs/adapters/PostgreSQLAdapter.js +0 -312
  502. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +0 -1
  503. package/dist/cjs/adapters/PrismaAdapter.d.ts +0 -115
  504. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +0 -1
  505. package/dist/cjs/adapters/PrismaAdapter.js +0 -410
  506. package/dist/cjs/adapters/PrismaAdapter.js.map +0 -1
  507. package/dist/cjs/adapters/RedisAdapter.d.ts +0 -72
  508. package/dist/cjs/adapters/RedisAdapter.d.ts.map +0 -1
  509. package/dist/cjs/adapters/RedisAdapter.js +0 -290
  510. package/dist/cjs/adapters/RedisAdapter.js.map +0 -1
  511. package/dist/cjs/adapters/SQLiteAdapter.d.ts +0 -86
  512. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +0 -1
  513. package/dist/cjs/adapters/SQLiteAdapter.js +0 -341
  514. package/dist/cjs/adapters/SQLiteAdapter.js.map +0 -1
  515. package/dist/cjs/adapters/index.d.ts +0 -17
  516. package/dist/cjs/adapters/index.d.ts.map +0 -1
  517. package/dist/cjs/adapters/index.js +0 -21
  518. package/dist/cjs/adapters/index.js.map +0 -1
  519. package/dist/cjs/adapters/sessionRow.d.ts +0 -22
  520. package/dist/cjs/adapters/sessionRow.d.ts.map +0 -1
  521. package/dist/cjs/adapters/sessionRow.js +0 -52
  522. package/dist/cjs/adapters/sessionRow.js.map +0 -1
  523. package/dist/cjs/constants/index.d.ts +0 -1
  524. package/dist/cjs/constants/index.d.ts.map +0 -1
  525. package/dist/cjs/constants/index.js +0 -4
  526. package/dist/cjs/constants/index.js.map +0 -1
  527. package/dist/cjs/core/AutoChainExecutor.d.ts +0 -97
  528. package/dist/cjs/core/AutoChainExecutor.d.ts.map +0 -1
  529. package/dist/cjs/core/AutoChainExecutor.js +0 -288
  530. package/dist/cjs/core/AutoChainExecutor.js.map +0 -1
  531. package/dist/cjs/core/BranchEvaluator.d.ts +0 -55
  532. package/dist/cjs/core/BranchEvaluator.d.ts.map +0 -1
  533. package/dist/cjs/core/BranchEvaluator.js +0 -125
  534. package/dist/cjs/core/BranchEvaluator.js.map +0 -1
  535. package/dist/cjs/core/DirectiveChainTracker.d.ts +0 -49
  536. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +0 -1
  537. package/dist/cjs/core/DirectiveChainTracker.js +0 -121
  538. package/dist/cjs/core/DirectiveChainTracker.js.map +0 -1
  539. package/dist/cjs/core/Events.d.ts +0 -26
  540. package/dist/cjs/core/Events.d.ts.map +0 -1
  541. package/dist/cjs/core/Events.js +0 -144
  542. package/dist/cjs/core/Events.js.map +0 -1
  543. package/dist/cjs/core/Flow.d.ts +0 -183
  544. package/dist/cjs/core/Flow.d.ts.map +0 -1
  545. package/dist/cjs/core/Flow.js +0 -551
  546. package/dist/cjs/core/Flow.js.map +0 -1
  547. package/dist/cjs/core/FlowRouter.d.ts +0 -183
  548. package/dist/cjs/core/FlowRouter.d.ts.map +0 -1
  549. package/dist/cjs/core/FlowRouter.js +0 -1047
  550. package/dist/cjs/core/FlowRouter.js.map +0 -1
  551. package/dist/cjs/core/PersistenceManager.d.ts +0 -114
  552. package/dist/cjs/core/PersistenceManager.d.ts.map +0 -1
  553. package/dist/cjs/core/PersistenceManager.js +0 -336
  554. package/dist/cjs/core/PersistenceManager.js.map +0 -1
  555. package/dist/cjs/core/PromptComposer.d.ts +0 -47
  556. package/dist/cjs/core/PromptComposer.d.ts.map +0 -1
  557. package/dist/cjs/core/PromptComposer.js +0 -397
  558. package/dist/cjs/core/PromptComposer.js.map +0 -1
  559. package/dist/cjs/core/PromptSectionCache.d.ts +0 -48
  560. package/dist/cjs/core/PromptSectionCache.d.ts.map +0 -1
  561. package/dist/cjs/core/PromptSectionCache.js +0 -108
  562. package/dist/cjs/core/PromptSectionCache.js.map +0 -1
  563. package/dist/cjs/core/ResponseEngine.d.ts +0 -43
  564. package/dist/cjs/core/ResponseEngine.d.ts.map +0 -1
  565. package/dist/cjs/core/ResponseEngine.js +0 -235
  566. package/dist/cjs/core/ResponseEngine.js.map +0 -1
  567. package/dist/cjs/core/ResponseGenerationError.d.ts +0 -30
  568. package/dist/cjs/core/ResponseGenerationError.d.ts.map +0 -1
  569. package/dist/cjs/core/ResponseGenerationError.js +0 -35
  570. package/dist/cjs/core/ResponseGenerationError.js.map +0 -1
  571. package/dist/cjs/core/ResponseModal.d.ts +0 -305
  572. package/dist/cjs/core/ResponseModal.d.ts.map +0 -1
  573. package/dist/cjs/core/ResponseModal.js +0 -1414
  574. package/dist/cjs/core/ResponseModal.js.map +0 -1
  575. package/dist/cjs/core/ResponsePipeline.d.ts +0 -220
  576. package/dist/cjs/core/ResponsePipeline.d.ts.map +0 -1
  577. package/dist/cjs/core/ResponsePipeline.js +0 -1040
  578. package/dist/cjs/core/ResponsePipeline.js.map +0 -1
  579. package/dist/cjs/core/SessionFinalizer.d.ts +0 -34
  580. package/dist/cjs/core/SessionFinalizer.d.ts.map +0 -1
  581. package/dist/cjs/core/SessionFinalizer.js +0 -88
  582. package/dist/cjs/core/SessionFinalizer.js.map +0 -1
  583. package/dist/cjs/core/SessionManager.d.ts +0 -112
  584. package/dist/cjs/core/SessionManager.d.ts.map +0 -1
  585. package/dist/cjs/core/SessionManager.js +0 -308
  586. package/dist/cjs/core/SessionManager.js.map +0 -1
  587. package/dist/cjs/core/SignalCoordinator.d.ts +0 -103
  588. package/dist/cjs/core/SignalCoordinator.d.ts.map +0 -1
  589. package/dist/cjs/core/SignalCoordinator.js +0 -207
  590. package/dist/cjs/core/SignalCoordinator.js.map +0 -1
  591. package/dist/cjs/core/SignalEvaluator.d.ts +0 -86
  592. package/dist/cjs/core/SignalEvaluator.d.ts.map +0 -1
  593. package/dist/cjs/core/SignalEvaluator.js +0 -319
  594. package/dist/cjs/core/SignalEvaluator.js.map +0 -1
  595. package/dist/cjs/core/SignalProcessor.d.ts +0 -152
  596. package/dist/cjs/core/SignalProcessor.d.ts.map +0 -1
  597. package/dist/cjs/core/SignalProcessor.js +0 -505
  598. package/dist/cjs/core/SignalProcessor.js.map +0 -1
  599. package/dist/cjs/core/Step.d.ts +0 -184
  600. package/dist/cjs/core/Step.d.ts.map +0 -1
  601. package/dist/cjs/core/Step.js +0 -599
  602. package/dist/cjs/core/Step.js.map +0 -1
  603. package/dist/cjs/core/StepLifecycle.d.ts +0 -43
  604. package/dist/cjs/core/StepLifecycle.d.ts.map +0 -1
  605. package/dist/cjs/core/StepLifecycle.js +0 -180
  606. package/dist/cjs/core/StepLifecycle.js.map +0 -1
  607. package/dist/cjs/core/StreamingToolExecutor.d.ts +0 -142
  608. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +0 -1
  609. package/dist/cjs/core/StreamingToolExecutor.js +0 -490
  610. package/dist/cjs/core/StreamingToolExecutor.js.map +0 -1
  611. package/dist/cjs/core/ToolLoopExecutor.d.ts +0 -133
  612. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +0 -1
  613. package/dist/cjs/core/ToolLoopExecutor.js +0 -568
  614. package/dist/cjs/core/ToolLoopExecutor.js.map +0 -1
  615. package/dist/cjs/core/ToolManager.d.ts +0 -250
  616. package/dist/cjs/core/ToolManager.d.ts.map +0 -1
  617. package/dist/cjs/core/ToolManager.js +0 -1104
  618. package/dist/cjs/core/ToolManager.js.map +0 -1
  619. package/dist/cjs/core/createAgent.d.ts +0 -35
  620. package/dist/cjs/core/createAgent.d.ts.map +0 -1
  621. package/dist/cjs/core/createAgent.js +0 -39
  622. package/dist/cjs/core/createAgent.js.map +0 -1
  623. package/dist/cjs/core/flow-namespace.d.ts +0 -64
  624. package/dist/cjs/core/flow-namespace.d.ts.map +0 -1
  625. package/dist/cjs/core/flow-namespace.js +0 -182
  626. package/dist/cjs/core/flow-namespace.js.map +0 -1
  627. package/dist/cjs/core/toolGates.d.ts +0 -24
  628. package/dist/cjs/core/toolGates.d.ts.map +0 -1
  629. package/dist/cjs/core/toolGates.js +0 -52
  630. package/dist/cjs/core/toolGates.js.map +0 -1
  631. package/dist/cjs/types/persistence.d.ts +0 -254
  632. package/dist/cjs/types/persistence.d.ts.map +0 -1
  633. package/dist/cjs/types/persistence.js +0 -7
  634. package/dist/cjs/types/persistence.js.map +0 -1
  635. package/dist/cjs/types/prompt-cache.d.ts +0 -15
  636. package/dist/cjs/types/prompt-cache.d.ts.map +0 -1
  637. package/dist/cjs/types/prompt-cache.js +0 -6
  638. package/dist/cjs/types/prompt-cache.js.map +0 -1
  639. package/dist/cjs/types/signals.d.ts +0 -263
  640. package/dist/cjs/types/signals.d.ts.map +0 -1
  641. package/dist/cjs/types/signals.js +0 -11
  642. package/dist/cjs/types/signals.js.map +0 -1
  643. package/dist/cjs/types/template.d.ts +0 -84
  644. package/dist/cjs/types/template.d.ts.map +0 -1
  645. package/dist/cjs/types/template.js +0 -3
  646. package/dist/cjs/types/template.js.map +0 -1
  647. package/dist/cjs/utils/condition.d.ts +0 -63
  648. package/dist/cjs/utils/condition.d.ts.map +0 -1
  649. package/dist/cjs/utils/condition.js +0 -239
  650. package/dist/cjs/utils/condition.js.map +0 -1
  651. package/dist/cjs/utils/event.d.ts +0 -6
  652. package/dist/cjs/utils/event.d.ts.map +0 -1
  653. package/dist/cjs/utils/event.js +0 -20
  654. package/dist/cjs/utils/event.js.map +0 -1
  655. package/dist/cjs/utils/id.d.ts +0 -33
  656. package/dist/cjs/utils/id.d.ts.map +0 -1
  657. package/dist/cjs/utils/id.js +0 -84
  658. package/dist/cjs/utils/id.js.map +0 -1
  659. package/dist/cjs/utils/serialize.d.ts +0 -36
  660. package/dist/cjs/utils/serialize.d.ts.map +0 -1
  661. package/dist/cjs/utils/serialize.js +0 -77
  662. package/dist/cjs/utils/serialize.js.map +0 -1
  663. package/dist/cjs/utils/session.d.ts +0 -124
  664. package/dist/cjs/utils/session.d.ts.map +0 -1
  665. package/dist/cjs/utils/session.js +0 -396
  666. package/dist/cjs/utils/session.js.map +0 -1
  667. package/dist/constants/index.d.ts +0 -2
  668. package/dist/constants/index.d.ts.map +0 -1
  669. package/dist/constants/index.js +0 -4
  670. package/dist/constants/index.js.map +0 -1
  671. package/dist/core/AutoChainExecutor.d.ts +0 -97
  672. package/dist/core/AutoChainExecutor.d.ts.map +0 -1
  673. package/dist/core/AutoChainExecutor.js +0 -284
  674. package/dist/core/AutoChainExecutor.js.map +0 -1
  675. package/dist/core/BranchEvaluator.d.ts +0 -55
  676. package/dist/core/BranchEvaluator.d.ts.map +0 -1
  677. package/dist/core/BranchEvaluator.js +0 -121
  678. package/dist/core/BranchEvaluator.js.map +0 -1
  679. package/dist/core/DirectiveChainTracker.d.ts +0 -49
  680. package/dist/core/DirectiveChainTracker.d.ts.map +0 -1
  681. package/dist/core/DirectiveChainTracker.js +0 -117
  682. package/dist/core/DirectiveChainTracker.js.map +0 -1
  683. package/dist/core/Events.d.ts +0 -26
  684. package/dist/core/Events.d.ts.map +0 -1
  685. package/dist/core/Events.js +0 -137
  686. package/dist/core/Events.js.map +0 -1
  687. package/dist/core/Flow.d.ts +0 -183
  688. package/dist/core/Flow.d.ts.map +0 -1
  689. package/dist/core/Flow.js +0 -547
  690. package/dist/core/Flow.js.map +0 -1
  691. package/dist/core/FlowRouter.d.ts +0 -183
  692. package/dist/core/FlowRouter.d.ts.map +0 -1
  693. package/dist/core/FlowRouter.js +0 -1043
  694. package/dist/core/FlowRouter.js.map +0 -1
  695. package/dist/core/PersistenceManager.d.ts +0 -114
  696. package/dist/core/PersistenceManager.d.ts.map +0 -1
  697. package/dist/core/PersistenceManager.js +0 -332
  698. package/dist/core/PersistenceManager.js.map +0 -1
  699. package/dist/core/PromptComposer.d.ts +0 -47
  700. package/dist/core/PromptComposer.d.ts.map +0 -1
  701. package/dist/core/PromptComposer.js +0 -393
  702. package/dist/core/PromptComposer.js.map +0 -1
  703. package/dist/core/PromptSectionCache.d.ts +0 -48
  704. package/dist/core/PromptSectionCache.d.ts.map +0 -1
  705. package/dist/core/PromptSectionCache.js +0 -104
  706. package/dist/core/PromptSectionCache.js.map +0 -1
  707. package/dist/core/ResponseEngine.d.ts +0 -43
  708. package/dist/core/ResponseEngine.d.ts.map +0 -1
  709. package/dist/core/ResponseEngine.js +0 -231
  710. package/dist/core/ResponseEngine.js.map +0 -1
  711. package/dist/core/ResponseGenerationError.d.ts +0 -30
  712. package/dist/core/ResponseGenerationError.d.ts.map +0 -1
  713. package/dist/core/ResponseGenerationError.js +0 -31
  714. package/dist/core/ResponseGenerationError.js.map +0 -1
  715. package/dist/core/ResponseModal.d.ts +0 -305
  716. package/dist/core/ResponseModal.d.ts.map +0 -1
  717. package/dist/core/ResponseModal.js +0 -1410
  718. package/dist/core/ResponseModal.js.map +0 -1
  719. package/dist/core/ResponsePipeline.d.ts +0 -220
  720. package/dist/core/ResponsePipeline.d.ts.map +0 -1
  721. package/dist/core/ResponsePipeline.js +0 -1035
  722. package/dist/core/ResponsePipeline.js.map +0 -1
  723. package/dist/core/SessionFinalizer.d.ts +0 -34
  724. package/dist/core/SessionFinalizer.d.ts.map +0 -1
  725. package/dist/core/SessionFinalizer.js +0 -84
  726. package/dist/core/SessionFinalizer.js.map +0 -1
  727. package/dist/core/SessionManager.d.ts +0 -112
  728. package/dist/core/SessionManager.d.ts.map +0 -1
  729. package/dist/core/SessionManager.js +0 -301
  730. package/dist/core/SessionManager.js.map +0 -1
  731. package/dist/core/SignalCoordinator.d.ts +0 -103
  732. package/dist/core/SignalCoordinator.d.ts.map +0 -1
  733. package/dist/core/SignalCoordinator.js +0 -203
  734. package/dist/core/SignalCoordinator.js.map +0 -1
  735. package/dist/core/SignalEvaluator.d.ts +0 -86
  736. package/dist/core/SignalEvaluator.d.ts.map +0 -1
  737. package/dist/core/SignalEvaluator.js +0 -312
  738. package/dist/core/SignalEvaluator.js.map +0 -1
  739. package/dist/core/SignalProcessor.d.ts +0 -152
  740. package/dist/core/SignalProcessor.d.ts.map +0 -1
  741. package/dist/core/SignalProcessor.js +0 -498
  742. package/dist/core/SignalProcessor.js.map +0 -1
  743. package/dist/core/Step.d.ts +0 -184
  744. package/dist/core/Step.d.ts.map +0 -1
  745. package/dist/core/Step.js +0 -594
  746. package/dist/core/Step.js.map +0 -1
  747. package/dist/core/StepLifecycle.d.ts +0 -43
  748. package/dist/core/StepLifecycle.d.ts.map +0 -1
  749. package/dist/core/StepLifecycle.js +0 -176
  750. package/dist/core/StepLifecycle.js.map +0 -1
  751. package/dist/core/StreamingToolExecutor.d.ts +0 -142
  752. package/dist/core/StreamingToolExecutor.d.ts.map +0 -1
  753. package/dist/core/StreamingToolExecutor.js +0 -483
  754. package/dist/core/StreamingToolExecutor.js.map +0 -1
  755. package/dist/core/ToolLoopExecutor.d.ts +0 -133
  756. package/dist/core/ToolLoopExecutor.d.ts.map +0 -1
  757. package/dist/core/ToolLoopExecutor.js +0 -564
  758. package/dist/core/ToolLoopExecutor.js.map +0 -1
  759. package/dist/core/ToolManager.d.ts +0 -250
  760. package/dist/core/ToolManager.d.ts.map +0 -1
  761. package/dist/core/ToolManager.js +0 -1098
  762. package/dist/core/ToolManager.js.map +0 -1
  763. package/dist/core/createAgent.d.ts +0 -35
  764. package/dist/core/createAgent.d.ts.map +0 -1
  765. package/dist/core/createAgent.js +0 -36
  766. package/dist/core/createAgent.js.map +0 -1
  767. package/dist/core/flow-namespace.d.ts +0 -64
  768. package/dist/core/flow-namespace.d.ts.map +0 -1
  769. package/dist/core/flow-namespace.js +0 -179
  770. package/dist/core/flow-namespace.js.map +0 -1
  771. package/dist/core/toolGates.d.ts +0 -24
  772. package/dist/core/toolGates.d.ts.map +0 -1
  773. package/dist/core/toolGates.js +0 -49
  774. package/dist/core/toolGates.js.map +0 -1
  775. package/dist/types/persistence.d.ts +0 -254
  776. package/dist/types/persistence.d.ts.map +0 -1
  777. package/dist/types/persistence.js +0 -6
  778. package/dist/types/persistence.js.map +0 -1
  779. package/dist/types/prompt-cache.d.ts +0 -15
  780. package/dist/types/prompt-cache.d.ts.map +0 -1
  781. package/dist/types/prompt-cache.js +0 -5
  782. package/dist/types/prompt-cache.js.map +0 -1
  783. package/dist/types/signals.d.ts +0 -263
  784. package/dist/types/signals.d.ts.map +0 -1
  785. package/dist/types/signals.js +0 -10
  786. package/dist/types/signals.js.map +0 -1
  787. package/dist/types/template.d.ts +0 -84
  788. package/dist/types/template.d.ts.map +0 -1
  789. package/dist/types/template.js +0 -2
  790. package/dist/types/template.js.map +0 -1
  791. package/dist/utils/condition.d.ts +0 -63
  792. package/dist/utils/condition.d.ts.map +0 -1
  793. package/dist/utils/condition.js +0 -230
  794. package/dist/utils/condition.js.map +0 -1
  795. package/dist/utils/event.d.ts +0 -6
  796. package/dist/utils/event.d.ts.map +0 -1
  797. package/dist/utils/event.js +0 -17
  798. package/dist/utils/event.js.map +0 -1
  799. package/dist/utils/id.d.ts +0 -33
  800. package/dist/utils/id.d.ts.map +0 -1
  801. package/dist/utils/id.js +0 -77
  802. package/dist/utils/id.js.map +0 -1
  803. package/dist/utils/serialize.d.ts +0 -36
  804. package/dist/utils/serialize.d.ts.map +0 -1
  805. package/dist/utils/serialize.js +0 -72
  806. package/dist/utils/serialize.js.map +0 -1
  807. package/dist/utils/session.d.ts +0 -124
  808. package/dist/utils/session.d.ts.map +0 -1
  809. package/dist/utils/session.js +0 -379
  810. package/dist/utils/session.js.map +0 -1
  811. package/docs/concepts/directives.md +0 -369
  812. package/docs/reference/adapters.md +0 -543
  813. package/docs/reference/create-agent.md +0 -216
  814. package/docs/reference/directive.md +0 -242
  815. package/docs/reference/signals.md +0 -368
  816. package/examples/02-data-extraction.ts +0 -90
  817. package/examples/05-branching.ts +0 -140
  818. package/examples/06-flow-control.ts +0 -103
  819. package/examples/08-persistence.ts +0 -98
  820. package/examples/09-signals.ts +0 -144
  821. package/src/adapters/MemoryAdapter.ts +0 -281
  822. package/src/adapters/MongoAdapter.ts +0 -341
  823. package/src/adapters/OpenSearchAdapter.ts +0 -693
  824. package/src/adapters/PostgreSQLAdapter.ts +0 -487
  825. package/src/adapters/PrismaAdapter.ts +0 -617
  826. package/src/adapters/RedisAdapter.ts +0 -439
  827. package/src/adapters/SQLiteAdapter.ts +0 -496
  828. package/src/adapters/index.ts +0 -43
  829. package/src/adapters/sessionRow.ts +0 -57
  830. package/src/constants/index.ts +0 -2
  831. package/src/core/AutoChainExecutor.ts +0 -397
  832. package/src/core/BranchEvaluator.ts +0 -161
  833. package/src/core/DirectiveChainTracker.ts +0 -144
  834. package/src/core/Events.ts +0 -164
  835. package/src/core/Flow.ts +0 -665
  836. package/src/core/FlowRouter.ts +0 -1540
  837. package/src/core/PersistenceManager.ts +0 -446
  838. package/src/core/PromptComposer.ts +0 -448
  839. package/src/core/PromptSectionCache.ts +0 -125
  840. package/src/core/ResponseEngine.ts +0 -338
  841. package/src/core/ResponseGenerationError.ts +0 -53
  842. package/src/core/ResponseModal.ts +0 -1902
  843. package/src/core/ResponsePipeline.ts +0 -1404
  844. package/src/core/SessionFinalizer.ts +0 -108
  845. package/src/core/SessionManager.ts +0 -372
  846. package/src/core/SignalCoordinator.ts +0 -263
  847. package/src/core/SignalEvaluator.ts +0 -404
  848. package/src/core/SignalProcessor.ts +0 -663
  849. package/src/core/Step.ts +0 -782
  850. package/src/core/StepLifecycle.ts +0 -242
  851. package/src/core/StreamingToolExecutor.ts +0 -609
  852. package/src/core/ToolLoopExecutor.ts +0 -749
  853. package/src/core/ToolManager.ts +0 -1379
  854. package/src/core/createAgent.ts +0 -40
  855. package/src/core/flow-namespace.ts +0 -227
  856. package/src/core/toolGates.ts +0 -72
  857. package/src/types/persistence.ts +0 -303
  858. package/src/types/prompt-cache.ts +0 -17
  859. package/src/types/signals.ts +0 -338
  860. package/src/types/template.ts +0 -98
  861. package/src/utils/condition.ts +0 -296
  862. package/src/utils/event.ts +0 -16
  863. package/src/utils/id.ts +0 -91
  864. package/src/utils/serialize.ts +0 -86
  865. package/src/utils/session.ts +0 -501
@@ -1,1198 +1,133 @@
1
1
  "use strict";
2
2
  /**
3
- * Core Agent implementation
3
+ * Agent: immutable configuration plus one entry point, `turn`.
4
+ *
5
+ * One instance serves every session; context and history arrive per turn.
6
+ * A turn is the eight phases of docs/rfc/v4-one-flow.md §4 in one line each:
7
+ * Runner moves the runs by code, Understand and Speak spend at most one
8
+ * provider call apiece, and Runner settles what they returned.
4
9
  */
5
10
  Object.defineProperty(exports, "__esModule", { value: true });
6
11
  exports.Agent = void 0;
7
12
  const errors_js_1 = require("../types/errors.js");
8
- const SignalProcessor_js_1 = require("./SignalProcessor.js");
9
- const SignalEvaluator_js_1 = require("./SignalEvaluator.js");
10
- const index_js_1 = require("../utils/index.js");
11
- const Flow_js_1 = require("./Flow.js");
12
- const Step_js_1 = require("./Step.js");
13
- const PersistenceManager_js_1 = require("./PersistenceManager.js");
14
- const SessionManager_js_1 = require("./SessionManager.js");
15
- const FlowRouter_js_1 = require("./FlowRouter.js");
16
- const PromptSectionCache_js_1 = require("./PromptSectionCache.js");
17
- const ResponseModal_js_1 = require("./ResponseModal.js");
18
- const ToolManager_js_1 = require("./ToolManager.js");
13
+ const logger_js_1 = require("../utils/logger.js");
14
+ const usage_js_1 = require("../utils/usage.js");
19
15
  const CompactionEngine_js_1 = require("./CompactionEngine.js");
20
- /**
21
- * Error thrown when data validation fails
22
- */
23
- class DataValidationError extends Error {
24
- constructor(errors, message) {
25
- super(message || "Data validation failed");
26
- this.errors = errors;
27
- this.name = "DataValidationError";
28
- }
29
- }
30
- /**
31
- * Error thrown when flow configuration is invalid
32
- */
33
- class FlowConfigurationError extends Error {
34
- constructor(flowTitle, invalidFields, message) {
35
- super(message || `Flow configuration error in '${flowTitle}'`);
36
- this.flowTitle = flowTitle;
37
- this.invalidFields = invalidFields;
38
- this.name = "FlowConfigurationError";
39
- }
40
- }
41
- /**
42
- * Main Agent class with generic context and data support
43
- */
16
+ const FlowSpec_js_1 = require("./FlowSpec.js");
17
+ const Runner_js_1 = require("./Runner.js");
18
+ const Speak_js_1 = require("./Speak.js");
19
+ const Understand_js_1 = require("./Understand.js");
44
20
  class Agent {
45
21
  constructor(options) {
46
22
  this.options = options;
47
- this._terms = [];
48
- this._instructions = [];
49
- this._tools = [];
50
- this._flows = [];
51
- this._knowledgeBase = {};
52
- /**
53
- * Staging buffer for data set before any session exists (initialData and
54
- * pre-session updateCollectedData calls). Consumed when a session is
55
- * created; once a session exists, `session.data` is the single source of
56
- * truth and this buffer stays empty.
57
- */
58
- this._pendingData = {};
59
- this.maxAutoStepsPerTurn = options.maxAutoStepsPerTurn ?? 10;
60
- this.maxDirectiveChain = options.maxDirectiveChain ?? 10;
61
- // Validate routerMode reservation — only 'ai' is supported in v2.0
62
- if (options.routerMode !== undefined && options.routerMode !== 'ai') {
63
- throw new errors_js_1.NotImplementedError(`[NotImplementedError] routerMode "${String(options.routerMode)}" is not implemented: only "ai" is supported in v2.0. ` +
64
- `Set routerMode to "ai" or omit the option.`);
65
- }
66
- // ─── Signal construction-time validation (Requirements 1.4, 1.5, 1.6, 1.9, 2.3) ───
67
- const rawSignals = options.signals ?? [];
68
- // Auto-generate stable ids for entries without `id`
69
- for (let i = 0; i < rawSignals.length; i++) {
70
- if (!rawSignals[i].id) {
71
- rawSignals[i] = {
72
- ...rawSignals[i],
73
- id: (0, index_js_1.generateSignalId)(rawSignals[i].title, rawSignals[i].description, i),
74
- };
75
- }
76
- }
77
- // Validate unique ids (Requirement 1.4)
78
- const idCounts = new Map();
79
- for (const signal of rawSignals) {
80
- const id = signal.id;
81
- idCounts.set(id, (idCounts.get(id) ?? 0) + 1);
82
- }
83
- const duplicateIds = [...idCounts.entries()]
84
- .filter(([, count]) => count > 1)
85
- .map(([id]) => id);
86
- if (duplicateIds.length > 0) {
87
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Duplicate signal ids: ${duplicateIds.join(', ')}. ` +
88
- `Each signal must have a unique id.`);
89
- }
90
- // Validate signalBatchSize (positive integer when set)
91
- if (options.signalBatchSize !== undefined) {
92
- if (!Number.isInteger(options.signalBatchSize) ||
93
- options.signalBatchSize <= 0) {
94
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] signalBatchSize must be a positive integer, got: ${options.signalBatchSize}.`);
95
- }
96
- }
97
- // Validate each signal's configuration
98
- for (const signal of rawSignals) {
99
- // Requirement 1.5: cooldown without cooldownMs → debug warning, treat as 'always'
100
- if (signal.behavior === 'cooldown' && signal.cooldownMs == null) {
101
- index_js_1.logger.debug(`[Agent] Signal "${signal.id}" has behavior 'cooldown' but no cooldownMs. Treating as 'always'.`);
102
- signal.behavior = 'always';
103
- }
104
- // Requirement 1.9: validate extract schema is a JSON Schema object
105
- if (signal.extract !== undefined) {
106
- if (signal.extract === null ||
107
- typeof signal.extract !== 'object' ||
108
- Array.isArray(signal.extract)) {
109
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Signal "${signal.id}" has an invalid extract schema. ` +
110
- `Expected a JSON Schema object, got: ${typeof signal.extract}.`);
111
- }
112
- }
113
- }
114
- this._signals = rawSignals;
115
- // Requirement 2.3: Only instantiate SignalProcessor when signals are present
116
- if (rawSignals.length > 0) {
117
- const evaluator = new SignalEvaluator_js_1.SignalEvaluator(options.provider);
118
- this.signalProcessor = new SignalProcessor_js_1.SignalProcessor(rawSignals, options.provider, evaluator, { batchSize: options.signalBatchSize ?? 10 });
119
- }
120
- else {
121
- this.signalProcessor = undefined;
122
- }
123
- // Set log level based on debug option. NOTE: loglevel's default logger is
124
- // process-global — one agent enabling debug turns on DEBUG for every agent
125
- // in the process. Warned so multi-tenant embedders aren't surprised.
126
- if (options.debug) {
127
- index_js_1.logger.warn(`[Agent] "${options.name}" enabled debug logging via the PROCESS-GLOBAL loglevel level. ` +
128
- `Every agent in this process now logs at DEBUG. Scope logging in your host if needed.`);
129
- index_js_1.logger.setLevel(index_js_1.LoggerLevel.DEBUG);
130
- }
131
- // Validate context configuration
132
- if (options.context !== undefined && options.contextProvider) {
133
- throw new Error("Cannot provide both 'context' and 'contextProvider'. Choose one.");
134
- }
135
- // Initialize and validate agent-level schema if provided
136
- if (options.schema) {
137
- this._schema = options.schema;
138
- this.validateSchema(this._schema);
139
- index_js_1.logger.debug("[Agent] Agent-level schema initialized and validated");
140
- }
141
- // Initialize context if provided
142
- this._context = options.context;
143
- // Initialize collected data with initial data if provided
144
- if (options.initialData) {
145
- if (this._schema) {
146
- const validation = this.validateData(options.initialData);
147
- if (!validation.valid) {
148
- throw new Error(`Initial data validation failed: ${validation.errors.map(e => e.message).join(', ')}`);
149
- }
150
- }
151
- this._pendingData = { ...options.initialData };
152
- index_js_1.logger.debug("[Agent] Initial data set:", this._pendingData);
153
- }
154
- // Initialize prompt section cache
155
- this._promptSectionCache = new PromptSectionCache_js_1.PromptSectionCache(options.promptCache);
156
- // Initialize flow router
157
- this._routingEngine = new FlowRouter_js_1.FlowRouter({
158
- flowSwitchMargin: options.flowSwitchMargin,
159
- onFlowSwitch: () => this.invalidateFlowSections(),
160
- promptSectionCache: this._promptSectionCache,
161
- });
162
- // Initialize tool manager BEFORE ResponseModal (it reads agent.tool in constructor)
163
- this.tool = new ToolManager_js_1.ToolManager(this);
164
- // Initialize ResponseModal for handling all response generation
165
- this._responseModal = new ResponseModal_js_1.ResponseModal(this, {
166
- maxToolLoops: options.maxToolLoops,
167
- });
168
- // Initialize persistence if configured
169
- if (options.persistence) {
170
- try {
171
- // Validate persistence configuration
172
- if (!options.persistence.adapter) {
173
- throw new Error("Persistence adapter is required when persistence is configured");
174
- }
175
- if (!options.persistence.adapter.sessionRepository) {
176
- throw new Error("Persistence adapter must provide a sessionRepository");
177
- }
178
- if (!options.persistence.adapter.messageRepository) {
179
- throw new Error("Persistence adapter must provide a messageRepository");
180
- }
181
- this._persistenceManager = new PersistenceManager_js_1.PersistenceManager(options.persistence);
182
- // Initialize the adapter if it has an initialize method
183
- if (options.persistence.adapter.initialize) {
184
- options.persistence.adapter.initialize().catch((error) => {
185
- index_js_1.logger.error("[Agent] Persistence adapter initialization failed:", error instanceof Error ? error.message : String(error));
186
- });
187
- }
188
- }
189
- catch (error) {
190
- const errorMessage = error instanceof Error ? error.message : String(error);
191
- index_js_1.logger.error("[Agent] Failed to initialize persistence:", errorMessage);
192
- throw new Error(`Failed to initialize persistence: ${errorMessage}`);
193
- }
194
- }
195
- // Initialize from options - use create methods for consistency
196
- if (options.terms) {
197
- options.terms.forEach((term) => {
198
- this.createTerm(term);
199
- });
200
- }
201
- // Initialize instructions (new unified form)
202
- if (options.instructions) {
203
- options.instructions.forEach((instruction) => {
204
- this.createInstruction(instruction);
205
- });
206
- }
207
- if (options.tools) {
208
- options.tools.forEach((tool) => {
209
- this.addTool(tool);
210
- });
211
- }
212
- if (options.flows) {
213
- options.flows.forEach((flowOptions) => {
214
- this.createFlow(flowOptions);
215
- });
216
- }
217
- // Validate deferred branch `then` string references against the flow registry.
218
- // This catches strings that don't match a local step id AND don't match any flow id/title.
219
- this.validateBranchReferences();
220
- // Initialize knowledge base
221
- if (options.knowledgeBase) {
222
- this._knowledgeBase = { ...options.knowledgeBase };
223
- }
224
- // Initialize compaction options if configured
225
- if (options.compaction && options.compaction.enabled !== false) {
226
- const compactionOptions = {
227
- maxTokens: options.compaction.maxTokens,
228
- compactionThreshold: options.compaction.compactionThreshold ?? 0.8,
229
- preserveRecentCount: options.compaction.preserveRecentCount ?? 4,
230
- maxToolResultChars: options.compaction.maxToolResultChars ?? 5000,
231
- provider: options.provider,
232
- };
233
- CompactionEngine_js_1.CompactionEngine.validateOptions(compactionOptions);
234
- this._compactionOptions = compactionOptions;
235
- index_js_1.logger.debug("[Agent] Compaction options initialized and validated");
236
- }
237
- // Initialize session manager — the single owner of the live session
238
- this.session = new SessionManager_js_1.SessionManager(this._persistenceManager, this);
239
- // Adopt an explicitly provided session
240
- if (options.session) {
241
- this.session.syncSession(options.session);
242
- }
243
- // Store sessionId for later use in getOrCreate calls
244
- if (options.sessionId) {
245
- this.session.setDefaultSessionId(options.sessionId);
246
- // The session will be loaded on first getOrCreate call; session.data
247
- // is the source of truth, so no data sync is needed here
248
- this.session.getOrCreate(options.sessionId).catch((err) => {
249
- index_js_1.logger.error("Failed to start session", err);
250
- });
251
- }
252
- }
253
- /**
254
- * Drain the pre-session data staging buffer.
255
- * @internal Called by SessionManager when a session is created or loaded.
256
- */
257
- consumePendingData() {
258
- const pending = this._pendingData;
259
- this._pendingData = {};
260
- return pending;
261
- }
262
- /**
263
- * Validate the agent-level schema structure
264
- * @private
265
- */
266
- validateSchema(schema) {
267
- if (!schema || typeof schema !== 'object') {
268
- throw new Error("Agent schema must be a valid JSON Schema object. " +
269
- "Provide a schema with 'type': 'object' and 'properties' to define the data structure.");
270
- }
271
- if (schema.type !== 'object') {
272
- throw new Error(`Agent schema must be of type 'object', but received '${String(schema.type)}'. ` +
273
- "Agent-level schemas must define object structures for data collection.");
274
- }
275
- if (!schema.properties || typeof schema.properties !== 'object') {
276
- throw new Error("Agent schema must have a 'properties' field defining the data fields. " +
277
- "Example: { type: 'object', properties: { name: { type: 'string' }, email: { type: 'string' } } }");
278
- }
279
- index_js_1.logger.debug("[Agent] Schema validation passed");
280
- }
281
- /**
282
- * Walk every flow's steps and resolve deferred string `then` values in branches
283
- * against the agent's flow registry. Strings that match neither a local step id
284
- * nor any flow id/title throw FlowConfigurationError.
285
- * @private
286
- */
287
- validateBranchReferences() {
288
- for (const flow of this._flows) {
289
- this.validateFlowBranchReferences(flow);
290
- }
291
- }
292
- /**
293
- * Validate branch `then` string references for a single flow against the agent's
294
- * flow registry. Throws FlowConfigurationError for unresolved references.
295
- * @private
296
- */
297
- validateFlowBranchReferences(flow) {
298
- const steps = flow.getAllSteps();
299
- const localStepIds = new Set(steps.map(s => s.id));
300
- for (const step of steps) {
301
- if (!step.branches)
302
- continue;
303
- for (const entry of step.branches) {
304
- if (typeof entry.then !== 'string')
305
- continue;
306
- // Already matches a local step id — no deferred resolution needed
307
- if (localStepIds.has(entry.then))
308
- continue;
309
- // Check against the agent's flow registry (id or title)
310
- const matchesFlow = this._flows.some(f => f.id === entry.then || f.title === entry.then);
311
- if (!matchesFlow) {
312
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Unresolved branch target: "${entry.then}" in ${flow.id}.${step.id} does not match any step in the flow or any flow in the agent. ` +
313
- `Fix the branch "then" value to reference a valid step id or flow id/title.`);
314
- }
315
- }
316
- }
317
- }
318
- /**
319
- * Validate that every step's `collect` fields in a flow reference valid keys
320
- * from the agent-level schema. Throws FlowConfigurationError at construction
321
- * time if any collect field is not a valid schema key.
322
- *
323
- * This enforces Requirement 14.5: generic inference is preserved AND every
324
- * `collect` field reference is a valid key of the inferred TData.
325
- * @private
326
- */
327
- validateFlowCollectFields(flow) {
328
- const schemaKeys = Object.keys(this._schema.properties);
329
- const schemaKeySet = new Set(schemaKeys);
330
- const steps = flow.getAllSteps();
331
- for (const step of steps) {
332
- if (!step.collect || step.collect.length === 0)
333
- continue;
334
- const invalidFields = step.collect.filter(field => !schemaKeySet.has(String(field)));
335
- if (invalidFields.length > 0) {
336
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Step "${step.id}" in flow "${flow.title}" references invalid collect fields: ${invalidFields.map(f => String(f)).join(', ')}. ` +
337
- `Must be valid keys from agent schema. Available fields: ${schemaKeys.join(', ')}.`);
338
- }
339
- }
340
- }
341
- /**
342
- * Validate data against the agent-level schema.
343
- *
344
- * A field the schema does not declare is a warning, not an error: a model
345
- * can extract a key nobody asked for, and `updateCollectedData` drops it
346
- * instead of failing the turn. `valid` is false only when `errors` is not empty.
347
- */
348
- validateData(data) {
349
- if (!this._schema) {
350
- // No schema defined, consider all data valid
351
- return { valid: true, errors: [], warnings: [] };
352
- }
353
- const errors = [];
354
- const warnings = [];
355
- // Undeclared fields are warnings — updateCollectedData drops them
356
- if (this._schema.properties) {
357
- for (const [key, value] of Object.entries(data)) {
358
- if (!(key in this._schema.properties)) {
359
- warnings.push({
360
- field: key,
361
- value,
362
- message: `Field '${key}' is not defined in agent schema`,
363
- schemaPath: `properties.${key}`
364
- });
365
- }
366
- }
367
- }
368
- // Check required fields if specified
369
- if (this._schema.required && Array.isArray(this._schema.required)) {
370
- for (const requiredField of this._schema.required) {
371
- if (!(requiredField in data) || data[requiredField] === undefined) {
372
- warnings.push({
373
- field: requiredField,
374
- value: undefined,
375
- message: `Required field '${requiredField}' is missing`,
376
- schemaPath: `required`
377
- });
378
- }
379
- }
380
- }
381
- return {
382
- valid: errors.length === 0,
383
- errors,
384
- warnings
385
- };
386
- }
387
- /**
388
- * Check if a field is valid according to the agent schema
389
- * @param field - The field key to validate
390
- * @returns true if field exists in schema or no schema is defined, false otherwise
391
- */
392
- isValidSchemaField(field) {
393
- if (!this._schema || !this._schema.properties) {
394
- // No schema defined, consider all fields valid
395
- return true;
396
- }
397
- return field in this._schema.properties;
398
- }
399
- /**
400
- * Get the current collected data.
401
- * Reads from the live session when one exists; otherwise from the
402
- * pre-session staging buffer.
403
- */
404
- getCollectedData() {
405
- const session = this.session.current;
406
- return session ? { ...session.data } : { ...this._pendingData };
407
- }
408
- /**
409
- * Update collected data with validation.
410
- * Writes to the live session when one exists; otherwise stages the data
411
- * for the session that will be created. Fields the agent schema does not
412
- * declare are dropped with a warning, never stored.
413
- */
414
- async updateCollectedData(updates) {
415
- const declaredUpdates = (0, index_js_1.dropUndeclaredFields)(updates, this._schema);
416
- // Validate the updates
417
- const validation = this.validateData(declaredUpdates);
418
- if (!validation.valid) {
419
- const errorMessages = validation.errors.map(e => e.message).join(', ');
420
- throw new DataValidationError(validation.errors, `[DataValidationError] Data validation failed: fields [${errorMessages}] did not pass schema validation. Fix the offending values to match the declared schema.`);
421
- }
422
- // Log warnings if any
423
- if (validation.warnings.length > 0) {
424
- const warningMessages = validation.warnings.map(w => w.message).join(', ');
425
- index_js_1.logger.warn(`[Agent] Data validation warnings: ${warningMessages}`);
426
- }
427
- const session = this.session.current;
428
- const previousData = session ? { ...session.data } : { ...this._pendingData };
429
- let newData = {
430
- ...previousData,
431
- ...declaredUpdates
432
- };
433
- // Trigger agent-level lifecycle hook if configured
434
- if (this.options.hooks?.onDataUpdate) {
435
- newData = await this.options.hooks.onDataUpdate(newData, previousData);
436
- }
437
- if (session) {
438
- session.data = newData;
439
- session.metadata.lastUpdatedAt = new Date();
440
- }
441
- else {
442
- this._pendingData = newData;
443
- }
444
- index_js_1.logger.debug("[Agent] Collected data updated:", declaredUpdates);
445
- }
446
- // ---------------------------------------------------------------------------
447
- // Property accessors (get / set)
448
- // ---------------------------------------------------------------------------
449
- /**
450
- * Get agent name
451
- */
452
- get name() {
453
- return this.options.name;
454
- }
455
- /**
456
- * Set agent name
457
- */
458
- set name(value) {
459
- this.options.name = value;
460
- }
461
- /**
462
- * Get agent persona
463
- */
464
- get persona() {
465
- return this.options.persona;
466
- }
467
- /**
468
- * Set agent persona
469
- */
470
- set persona(value) {
471
- this.options.persona = value;
472
- }
473
- /**
474
- * Get agent goal
475
- */
476
- get goal() {
477
- return this.options.goal;
478
- }
479
- /**
480
- * Set agent goal
481
- */
482
- set goal(value) {
483
- this.options.goal = value;
484
- }
485
- /**
486
- * Get whether debug mode is enabled
487
- */
488
- get debug() {
489
- return this.options.debug ?? false;
490
- }
491
- /**
492
- * Set debug mode (also updates logger level)
493
- */
494
- set debug(value) {
495
- this.options.debug = value;
496
- index_js_1.logger.setLevel(value ? index_js_1.LoggerLevel.DEBUG : index_js_1.LoggerLevel.INFO);
497
- }
498
- /**
499
- * Get the AI provider
500
- */
501
- get provider() {
502
- return this.options.provider;
503
- }
504
- /**
505
- * Set the AI provider
506
- */
507
- set provider(value) {
508
- this.options.provider = value;
509
- }
510
- /**
511
- * Get the flow switch margin
512
- * @default 15
513
- */
514
- get flowSwitchMargin() {
515
- return this.options.flowSwitchMargin ?? 15;
516
- }
517
- /**
518
- * Set the flow switch margin
519
- */
520
- set flowSwitchMargin(value) {
521
- this.options.flowSwitchMargin = value;
522
- }
523
- /**
524
- * Get the prompt section cache instance
525
- */
526
- get promptSectionCache() {
527
- return this._promptSectionCache;
528
- }
529
- /**
530
- * Get all terms
531
- */
532
- get terms() {
533
- return [...this._terms];
534
- }
535
- /**
536
- * Get all instructions
537
- */
538
- get instructions() {
539
- return [...this._instructions];
540
- }
541
- /**
542
- * Get all tools
543
- */
544
- get tools() {
545
- return [...this._tools];
546
- }
547
- /**
548
- * Get all flows
549
- */
550
- get flows() {
551
- return [...this._flows];
552
- }
553
- /**
554
- * Get current schema
555
- */
556
- get schema() {
557
- return this._schema;
558
- }
559
- /**
560
- * Set schema (validates structure)
561
- */
562
- set schema(value) {
563
- if (value) {
564
- this.validateSchema(value);
565
- }
566
- this._schema = value;
567
- }
568
- /**
569
- * Get the configured signals.
570
- */
571
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
572
- get signals() {
573
- return this._signals;
574
- }
575
- /**
576
- * Get the agent's knowledge base
577
- */
578
- get knowledgeBase() {
579
- return { ...this._knowledgeBase };
580
- }
581
- /**
582
- * Set the agent's knowledge base
583
- */
584
- set knowledgeBase(value) {
585
- this._knowledgeBase = { ...value };
586
- }
587
- /**
588
- * Get the current session (if set). Delegates to the SessionManager —
589
- * the single owner of the live session.
590
- */
591
- get currentSession() {
592
- return this.session.current;
593
- }
594
- /**
595
- * Set the current session for convenience methods
596
- * Set to undefined to clear the current session
597
- */
598
- set currentSession(value) {
599
- this.session.syncSession(value);
600
- this._promptSectionCache.invalidateAll();
601
- }
602
- /**
603
- * Get all flows
604
- */
605
- getFlows() {
606
- return this.flows;
607
- }
608
- /**
609
- * Get all terms
610
- */
611
- getTerms() {
612
- return this.terms;
613
- }
614
- /**
615
- * Get all tools
616
- */
617
- getTools() {
618
- return this.tools;
619
- }
620
- /**
621
- * Get all instructions
622
- */
623
- getInstructions() {
624
- return this.instructions;
625
- }
626
- /**
627
- * Invalidate flow-dependent prompt cache sections.
628
- * Called automatically when the active flow changes.
629
- */
630
- invalidateFlowSections() {
631
- this._promptSectionCache.invalidate('activeFlows');
632
- this._promptSectionCache.invalidate('flowKnowledgeBase');
633
- this._promptSectionCache.invalidate('instructionsFlow');
634
- }
635
- /**
636
- * Get the persistence manager (if configured)
637
- */
638
- getPersistenceManager() {
639
- return this._persistenceManager;
640
- }
641
- /**
642
- * Check if persistence is enabled
643
- */
644
- hasPersistence() {
645
- return this._persistenceManager !== undefined;
646
- }
647
- /**
648
- * Get the resolved compaction options (if compaction is configured)
649
- */
650
- getCompactionOptions() {
651
- return this._compactionOptions;
652
- }
653
- // ---------------------------------------------------------------------------
654
- // Core methods
655
- // ---------------------------------------------------------------------------
656
- /**
657
- * Create a new flow (journey) using agent-level data type
658
- */
659
- createFlow(options) {
660
- // Validate that requiredFields exist in agent schema
661
- if (options.requiredFields && this._schema?.properties) {
662
- const invalidRequiredFields = options.requiredFields.filter(field => !(String(field) in this._schema.properties));
663
- if (invalidRequiredFields.length > 0) {
664
- throw new FlowConfigurationError(options.title, invalidRequiredFields.map(f => String(f)), `[FlowConfigurationError] Invalid required fields in flow "${options.title}": [${invalidRequiredFields.join(', ')}] are not declared in the agent schema. ` +
665
- `Use valid schema keys. Available fields: ${Object.keys(this._schema.properties).join(', ')}.`);
666
- }
667
- }
668
- // Validate that optionalFields exist in agent schema
669
- if (options.optionalFields && this._schema?.properties) {
670
- const invalidOptionalFields = options.optionalFields.filter(field => !(String(field) in this._schema.properties));
671
- if (invalidOptionalFields.length > 0) {
672
- throw new FlowConfigurationError(options.title, invalidOptionalFields.map(f => String(f)), `[FlowConfigurationError] Invalid optional fields in flow "${options.title}": [${invalidOptionalFields.join(', ')}] are not declared in the agent schema. ` +
673
- `Use valid schema keys. Available fields: ${Object.keys(this._schema.properties).join(', ')}.`);
674
- }
675
- }
676
- // Overlap detection: warn (don't throw) when the incoming flow's
677
- // requiredFields intersect another registered flow's — the schema is
678
- // agent-level, so both flows complete together and one is silently
679
- // excluded from routing.
680
- if (options.requiredFields && options.requiredFields.length > 0) {
681
- const incoming = new Set(options.requiredFields.map(String));
682
- for (const existing of this._flows) {
683
- const shared = (existing.requiredFields ?? [])
684
- .map(String)
685
- .filter((f) => incoming.has(f));
686
- if (shared.length > 0) {
687
- index_js_1.logger.warn(`[FlowConfigurationError] Overlapping requiredFields: flows "${existing.title}" and "${options.title}" share [${shared.join(', ')}]. ` +
688
- `The schema is agent-level, so data collected for one flow marks the other complete and excludes it from routing. ` +
689
- `Give each flow distinct requiredFields, or set \`reentrant: true\` on flows that legitimately share fields.`);
690
- }
691
- }
692
- }
693
- const flow = new Flow_js_1.Flow(options, this);
694
- // Validate that step collect fields reference valid schema keys
695
- if (this._schema?.properties) {
696
- this.validateFlowCollectFields(flow);
697
- }
698
- this._flows.push(flow);
699
- return flow;
700
- }
701
- /**
702
- * Create a domain term for the glossary
703
- */
704
- createTerm(term) {
705
- this._terms.push(term);
706
- return this;
707
- }
708
- /**
709
- * Create an instruction (unified behavioral primitive).
710
- */
711
- createInstruction(instruction) {
712
- const instructionWithId = {
713
- ...instruction,
714
- kind: instruction.kind || 'should',
715
- id: instruction.id || `instruction_${this._instructions.length}`,
716
- enabled: instruction.enabled !== false, // Default to true
717
- };
718
- this._instructions.push(instructionWithId);
719
- this._promptSectionCache.invalidate('instructionsGlobal');
720
- return this;
721
- }
722
- /**
723
- * Add a tool to the agent using the unified Tool interface
724
- * Creates and adds the tool to agent scope in one operation
725
- */
726
- addTool(tool) {
727
- // Validate tool before adding
728
- if (!tool || !tool.id || !tool.handler) {
729
- throw new Error('Invalid tool: must have id and handler properties');
730
- }
731
- // Add directly to agent's tools array, preserving the TResult type
732
- this._tools.push(tool);
733
- index_js_1.logger.debug(`[Agent] Added tool to agent scope: ${tool.id}`);
734
- return this;
735
- }
736
- /**
737
- * Register multiple tools at the agent level
738
- */
739
- registerTools(tools) {
740
- tools.forEach((tool) => {
741
- // Validate each tool before adding
742
- if (!tool || !tool.id || !tool.handler) {
743
- throw new Error(`Invalid tool in batch: must have id and handler properties (tool: ${tool?.id || 'unknown'})`);
744
- }
745
- this._tools.push(tool);
746
- });
747
- index_js_1.logger.debug(`[Agent] Registered ${tools.length} tools`);
748
- return this;
749
- }
750
- /**
751
- * Update the agent's context
752
- * Triggers both agent-level and flow-specific onContextUpdate lifecycle hooks if configured
753
- */
754
- async updateContext(updates) {
755
- const previousContext = this._context;
756
- // Merge updates with current context
757
- this._context = {
758
- ...this._context,
759
- ...updates,
760
- };
761
- // Trigger flow-specific lifecycle hook if configured and session has current flow
762
- const activeSession = this.session.current;
763
- if (activeSession?.currentFlow) {
764
- const currentFlow = this._flows.find((r) => r.id === activeSession.currentFlow?.id);
765
- if (currentFlow?.hooks?.onContextUpdate &&
766
- previousContext !== undefined) {
767
- await currentFlow.handleContextUpdate(this._context, previousContext);
768
- }
769
- }
770
- // Trigger agent-level lifecycle hook if configured
771
- if (this.options.hooks?.onContextUpdate && previousContext !== undefined) {
772
- await this.options.hooks.onContextUpdate(this._context, previousContext);
773
- }
774
- // Invalidate context-dependent prompt cache sections
775
- this._promptSectionCache.invalidate('agentMeta');
776
- this._promptSectionCache.invalidate('knowledgeBase');
777
- this._promptSectionCache.invalidate('instructionsGlobal');
778
- }
779
- /**
780
- * Update collected data in session with lifecycle hook support
781
- * Triggers both agent-level and flow-specific onDataUpdate lifecycle hooks if configured
782
- * @internal
783
- */
784
- async updateData(session, dataUpdate) {
785
- const previousCollected = { ...session.data };
786
- // Merge new collected data
787
- let newCollected = {
788
- ...session.data,
789
- ...dataUpdate,
790
- };
791
- // Trigger flow-specific lifecycle hook if configured and session has a current flow
792
- if (session.currentFlow) {
793
- const currentFlow = this._flows.find((r) => r.id === session.currentFlow?.id);
794
- if (currentFlow?.hooks?.onDataUpdate) {
795
- newCollected = await currentFlow.handleDataUpdate(newCollected, previousCollected);
796
- }
797
- }
798
- // Trigger agent-level lifecycle hook if configured
799
- if (this.options.hooks?.onDataUpdate) {
800
- newCollected = (await this.options.hooks.onDataUpdate(newCollected, previousCollected));
801
- }
802
- // Return updated session — session.data is the single source of truth,
803
- // so no agent-side copy is kept
804
- return (0, index_js_1.mergeCollected)(session, newCollected);
805
- }
806
- /**
807
- * Get current context (fetches from provider if configured)
808
- */
809
- async getContext() {
810
- // If context provider is configured, use it to fetch fresh context
811
- if (this.options.contextProvider) {
812
- return await this.options.contextProvider();
813
- }
814
- // Otherwise return the stored context
815
- return this._context;
816
- }
817
- /**
818
- * Generate a response based on history and context as a stream
819
- */
820
- async *respondStream(params) {
821
- // Delegate to ResponseModal
822
- yield* this._responseModal.respondStream(params);
823
- }
824
- /**
825
- * Generate a response based on history and context
826
- */
827
- async respond(params) {
828
- // Delegate to ResponseModal
829
- return this._responseModal.respond(params);
830
- }
831
- /**
832
- * Get agent options
833
- * @internal Used by ResponseModal
834
- */
835
- getAgentOptions() {
836
- return this.options;
837
- }
838
- /**
839
- * Get flow router
840
- * @internal Used by ResponseModal
841
- */
842
- getFlowRouter() {
843
- return this._routingEngine;
844
- }
845
- /**
846
- * Get the updateData method bound to this agent
847
- * @internal Used by ResponseModal
848
- */
849
- getUpdateDataMethod() {
850
- return this.updateData.bind(this);
851
- }
852
- /**
853
- * Execute a prepare or finalize function/tool
854
- * @internal Used by ResponseModal
855
- */
856
- async executePrepareFinalize(prepareOrFinalize, context, data, flow, step) {
857
- if (!prepareOrFinalize)
858
- return;
859
- if (typeof prepareOrFinalize === "function") {
860
- // It's a function - call it directly
861
- await prepareOrFinalize(context, data);
862
- }
863
- else {
864
- // It's a tool reference - find and execute the tool
865
- let tool;
866
- if (typeof prepareOrFinalize === "string") {
867
- // Tool ID - use ToolManager to find it across all scopes
868
- tool = this.tool.find(prepareOrFinalize, undefined, step, flow);
869
- }
870
- else {
871
- // Tool object - validate it has required properties
872
- if (prepareOrFinalize.id && typeof prepareOrFinalize.handler === 'function') {
873
- tool = prepareOrFinalize;
874
- }
875
- else {
876
- index_js_1.logger.error(`[Agent] Invalid tool object for prepare/finalize: missing id or invalid handler`);
877
- return;
878
- }
879
- }
880
- if (tool) {
881
- // Use ToolManager for execution
882
- const result = await this.tool.executeTool({
883
- tool,
884
- context,
885
- updateContext: this.updateContext.bind(this),
886
- updateData: this.updateCollectedData.bind(this),
887
- history: [], // Empty history for prepare/finalize
888
- data,
889
- });
890
- if (!result.success) {
891
- index_js_1.logger.error(`[Agent] Tool execution failed in prepare/finalize: ${result.error}`);
892
- throw new Error(`Tool execution failed: ${result.error}`);
893
- }
894
- }
895
- else {
896
- index_js_1.logger.warn(`[Agent] Tool not found for prepare/finalize: ${typeof prepareOrFinalize === "string"
897
- ? prepareOrFinalize
898
- : "inline tool"}`);
899
- }
900
- }
901
- }
902
- /**
903
- * Get collected data from the current session (or the pre-session staging
904
- * buffer when no session exists yet). Alias of getCollectedData().
905
- */
906
- getData() {
907
- return this.getCollectedData();
23
+ if (options.debug)
24
+ logger_js_1.logger.setLevel(logger_js_1.LoggerLevel.DEBUG);
25
+ validate(options);
26
+ this.compaction = compactionOptions(options);
27
+ this.runner = new Runner_js_1.Runner(options);
28
+ this.understand = new Understand_js_1.Understand(options);
29
+ this.speak = new Speak_js_1.Speak(options);
30
+ }
31
+ /** Take whatever just happened and return the messages to send and the timers to set. */
32
+ async turn(input) {
33
+ const { turn, talk } = await this.open(input);
34
+ await this.runner.settle(turn, talk ? await this.speak.run(this.runner.speakRequest(turn, talk)) : null);
35
+ return this.runner.finish(turn);
36
+ }
37
+ /** `turn`, streaming the spoken text as it is generated; the last chunk carries the result. */
38
+ async *turnStream(input) {
39
+ const { turn, talk } = await this.open(input);
40
+ let outcome = null;
41
+ if (talk) {
42
+ for await (const chunk of this.speak.stream(this.runner.speakRequest(turn, talk))) {
43
+ if ("delta" in chunk)
44
+ yield { delta: chunk.delta };
45
+ else
46
+ outcome = chunk.outcome;
47
+ }
48
+ }
49
+ await this.runner.settle(turn, outcome);
50
+ yield { done: true, result: this.runner.finish(turn) };
51
+ }
52
+ /**
53
+ * Every wake a saved session is waiting on, as its turns scheduled them: each parked run's,
54
+ * and each silence flow's since the assistant last spoke. For a queue that lost its jobs, and
55
+ * for sessions no turn has armed yet, such as blobs lifted by `migrateSession`. It changes
56
+ * nothing and spends no call: enqueue the entries as you would a turn's `schedule[]`.
57
+ */
58
+ pendingWakes(input) {
59
+ return this.runner.pendingWakes(input);
60
+ }
61
+ /** Load, Ingest, Understand, Decide and Run: everything before the one speaker is known. */
62
+ async open(input) {
63
+ const { runner } = this;
64
+ const compacted = await this.compacted(input);
65
+ const turn = runner.begin(compacted.input);
66
+ turn.llmCalls += compacted.llmCalls;
67
+ turn.usage = (0, usage_js_1.addUsage)(turn.usage, compacted.usage);
68
+ const request = runner.understandRequest(turn);
69
+ runner.decide(turn, request ? await this.understand.run(request) : null);
70
+ return { turn, talk: await runner.advance(turn) };
71
+ }
72
+ /** With `compaction` set, the history both calls see is trimmed once per turn; a summarization is one model call. */
73
+ async compacted(input) {
74
+ const history = input.history ?? input.session?.history;
75
+ if (!this.compaction || !history?.length)
76
+ return { input, llmCalls: 0 };
77
+ const result = await CompactionEngine_js_1.CompactionEngine.checkAndCompact(history, this.compaction);
78
+ const llmCalls = result.strategy === "auto_compact" ? 1 : 0;
79
+ const usage = result.usage ? { usage: result.usage } : {};
80
+ if (result.history === history)
81
+ return { input, llmCalls, ...usage };
82
+ const trimmed = Object.assign({}, input);
83
+ trimmed.history = result.history;
84
+ return { input: trimmed, llmCalls, ...usage };
908
85
  }
909
- /**
910
- * Dispatch a directive (or a flow shorthand) into a session.
911
- * Sets `pendingDirective` on the session without triggering a `respond()` call.
912
- * The directive will be applied at the start of the next turn.
913
- *
914
- * String form desugars to `{ goTo: target }`.
915
- *
916
- * Durability: with a persistence adapter and autoSave configured (the
917
- * defaults), the queued directive is persisted immediately — safe for
918
- * out-of-process callers like webhooks or cron. Without an adapter it is
919
- * memory-only, as is `persistence.autoSave: false` (then persisting before
920
- * the next turn is the caller's job).
921
- *
922
- * @param target - Flow ID/title string (desugars to `{ goTo: target }`) or a full Directive
923
- * @param session - Session to update (uses current session if not provided)
924
- * @returns Updated session with `pendingDirective` set
925
- *
926
- * @throws FlowConfigurationError if the string target doesn't match any flow
927
- * @throws FlowConfigurationError if the directive fails validation
928
- * @throws SessionConflictError when persistence is enabled and another writer
929
- * moved the stored session since this copy was loaded
930
- *
931
- * @example
932
- * // String shorthand — desugars to { goTo: 'Feedback' }
933
- * const updated = await agent.dispatch('Feedback', session);
934
- *
935
- * @example
936
- * // Full directive
937
- * const updated = await agent.dispatch({ goTo: 'Billing', reply: 'Transferring you now.' }, session);
938
- */
939
- async dispatch(target, session) {
940
- const targetSession = session || this.session.current;
941
- if (!targetSession) {
942
- throw new Error("No session provided and no current session available. Please provide a session to dispatch into.");
943
- }
944
- // Desugar string form to { goTo: target }
945
- const directive = typeof target === 'string'
946
- ? { goTo: target }
947
- : target;
948
- // Validate the directive: check for multiple position fields, empty goTo, etc.
949
- this.validateDirective(directive);
950
- // If goTo is a string, validate it references a known flow
951
- if (typeof directive.goTo === 'string') {
952
- const flowTarget = directive.goTo;
953
- const matchesFlow = this._flows.some(f => f.id === flowTarget || f.title === flowTarget);
954
- if (!matchesFlow) {
955
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Unknown flow: "${flowTarget}" does not match any flow id or title. ` +
956
- `Available flows: ${this._flows.map(f => f.title).join(', ')}.`);
957
- }
958
- }
959
- else if (directive.goTo && typeof directive.goTo === 'object' && directive.goTo.flow) {
960
- const flowTarget = directive.goTo.flow;
961
- const matchesFlow = this._flows.some(f => f.id === flowTarget || f.title === flowTarget);
962
- if (!matchesFlow) {
963
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Unknown flow: "${flowTarget}" does not match any flow id or title. ` +
964
- `Available flows: ${this._flows.map(f => f.title).join(', ')}.`);
965
- }
966
- }
967
- // Strip pre-LLM-only fields before storing
968
- const stripped = this.stripPreDirectiveFields(directive);
969
- // Set pendingDirective on the session without applying it
970
- const updatedSession = {
971
- ...targetSession,
972
- pendingDirective: stripped,
973
- metadata: {
974
- ...targetSession.metadata,
975
- lastUpdatedAt: new Date(),
976
- },
977
- };
978
- // Durability: with an adapter + autoSave configured, dispatch persists
979
- // immediately — webhooks/cron run out-of-process from the responder, and a
980
- // memory-only queue would evaporate with this process. The save stamps the
981
- // new version back onto updatedSession, so the next turn's auto-save CAS
982
- // stays clean. Persisting BEFORE the in-memory sync keeps the existing
983
- // invariant: a throwing dispatch leaves the session untouched.
984
- if (this._persistenceManager && this.options.persistence?.autoSave !== false) {
985
- await this._persistenceManager.saveSessionState(updatedSession.id, updatedSession);
986
- index_js_1.logger.debug(`[Agent] Dispatched directive persisted to adapter for session ${updatedSession.id}`);
987
- }
988
- // Update current session in place if no explicit session was passed
989
- if (!session && this.session.current) {
990
- this.session.syncSession(updatedSession);
86
+ }
87
+ exports.Agent = Agent;
88
+ function compactionOptions(options) {
89
+ const config = options.compaction;
90
+ if (!config || config.enabled === false)
91
+ return undefined;
92
+ const resolved = {
93
+ maxTokens: config.maxTokens,
94
+ compactionThreshold: config.compactionThreshold ?? 0.8,
95
+ preserveRecentCount: config.preserveRecentCount ?? 4,
96
+ maxToolResultChars: config.maxToolResultChars ?? 5000,
97
+ provider: options.provider,
98
+ };
99
+ CompactionEngine_js_1.CompactionEngine.validateOptions(resolved);
100
+ return resolved;
101
+ }
102
+ /** Every name a flow uses must resolve now, not on the turn that first reaches it. */
103
+ function validate(options) {
104
+ const ids = new Set();
105
+ for (const flow of options.flows ?? []) {
106
+ if (ids.has(flow.id)) {
107
+ throw new errors_js_1.FlowConfigurationError(`[FlowConfigurationError] flow "${flow.id}" is declared twice: flow ids must be unique. Rename one of them.`);
991
108
  }
992
- index_js_1.logger.debug(`[Agent] Dispatched directive: pendingDirective set on session ${updatedSession.id}`);
993
- return updatedSession;
109
+ ids.add(flow.id);
110
+ for (const warning of (0, FlowSpec_js_1.validateFlow)(flow, options).warnings)
111
+ logger_js_1.logger.warn(`[Agent] ${warning}`);
994
112
  }
995
- /**
996
- * Apply a directive synchronously to a session without invoking `respond()`.
997
- * Performs in-place application: updates flow/step position, merges state writes.
998
- *
999
- * This is the synchronous counterpart to `dispatch` — it applies immediately
1000
- * rather than deferring to the next turn.
1001
- *
1002
- * @param directive - The directive to apply
1003
- * @param session - The session to apply the directive to
1004
- * @returns The updated session with the directive applied
1005
- */
1006
- applyDirective(directive, session) {
1007
- // Validate the directive
1008
- this.validateDirective(directive);
1009
- let updatedSession = { ...session };
1010
- const now = new Date();
1011
- // Apply state writes
1012
- if (directive.contextUpdate) {
1013
- // Context updates are applied to the agent, not the session
1014
- this._context = {
1015
- ...this._context,
1016
- ...directive.contextUpdate,
1017
- };
1018
- }
1019
- if (directive.dataUpdate) {
1020
- updatedSession = {
1021
- ...updatedSession,
1022
- data: {
1023
- ...updatedSession.data,
1024
- ...directive.dataUpdate,
1025
- },
1026
- };
1027
- }
1028
- // Apply position control
1029
- if (directive.goTo) {
1030
- const flowTarget = typeof directive.goTo === 'string'
1031
- ? directive.goTo
1032
- : directive.goTo.flow;
1033
- if (flowTarget) {
1034
- const targetFlow = this._flows.find(f => f.id === flowTarget || f.title === flowTarget);
1035
- if (targetFlow) {
1036
- // Merge goTo.data if present
1037
- if (typeof directive.goTo === 'object' && directive.goTo.data) {
1038
- updatedSession = {
1039
- ...updatedSession,
1040
- data: {
1041
- ...updatedSession.data,
1042
- ...directive.goTo.data,
1043
- },
1044
- };
1045
- }
1046
- updatedSession = (0, index_js_1.enterFlow)(updatedSession, targetFlow.id, targetFlow.title);
1047
- // If a specific step is targeted
1048
- if (typeof directive.goTo === 'object' && directive.goTo.step) {
1049
- updatedSession = (0, index_js_1.enterStep)(updatedSession, directive.goTo.step);
1050
- }
1051
- }
1052
- }
1053
- }
1054
- else if (directive.goToStep) {
1055
- const stepTarget = typeof directive.goToStep === 'string'
1056
- ? directive.goToStep
1057
- : directive.goToStep.step;
1058
- // Merge goToStep.data if present
1059
- if (typeof directive.goToStep === 'object' && directive.goToStep.data) {
1060
- updatedSession = {
1061
- ...updatedSession,
1062
- data: {
1063
- ...updatedSession.data,
1064
- ...directive.goToStep.data,
1065
- },
1066
- };
1067
- }
1068
- updatedSession = (0, index_js_1.enterStep)(updatedSession, stepTarget);
1069
- }
1070
- else if (directive.complete) {
1071
- updatedSession = (0, index_js_1.completeCurrentFlow)(updatedSession);
1072
- // If complete carries a chained directive, set it as pendingDirective
1073
- if (typeof directive.complete === 'object' && directive.complete.next) {
1074
- updatedSession = {
1075
- ...updatedSession,
1076
- pendingDirective: directive.complete.next,
1077
- };
1078
- }
1079
- }
1080
- else if (directive.abort) {
1081
- const clearSession = typeof directive.abort === 'object'
1082
- ? directive.abort.clearSession !== false
1083
- : true;
1084
- if (clearSession) {
1085
- updatedSession = {
1086
- ...updatedSession,
1087
- currentFlow: undefined,
1088
- currentStep: undefined,
1089
- data: {},
1090
- };
1091
- }
1092
- else {
1093
- updatedSession = {
1094
- ...updatedSession,
1095
- currentFlow: undefined,
1096
- currentStep: undefined,
1097
- };
1098
- }
1099
- }
1100
- else if (directive.reset) {
1101
- const currentFlowId = updatedSession.currentFlow?.id;
1102
- const currentFlowTitle = updatedSession.currentFlow?.title;
1103
- if (currentFlowId && currentFlowTitle) {
1104
- // Clear data if requested
1105
- if (typeof directive.reset === 'object' && directive.reset.clearData) {
1106
- const currentFlow = this._flows.find(f => f.id === currentFlowId);
1107
- if (currentFlow) {
1108
- const ownedFields = [
1109
- ...(currentFlow.requiredFields || []),
1110
- ...(currentFlow.optionalFields || []),
1111
- ];
1112
- updatedSession = (0, index_js_1.completeCurrentFlow)(updatedSession, { clearOwnedFields: ownedFields });
1113
- // Re-enter the same flow
1114
- updatedSession = (0, index_js_1.enterFlow)(updatedSession, currentFlowId, currentFlowTitle);
1115
- }
1116
- }
1117
- else {
1118
- // Re-enter the flow from the beginning (or specified step)
1119
- updatedSession = (0, index_js_1.enterFlow)(updatedSession, currentFlowId, currentFlowTitle);
1120
- }
1121
- // If a specific step is targeted for reset
1122
- if (typeof directive.reset === 'object' && directive.reset.step) {
1123
- updatedSession = (0, index_js_1.enterStep)(updatedSession, directive.reset.step);
1124
- }
1125
- }
113
+ for (const tool of options.tools ?? []) {
114
+ // A function's parameters are a JSON Schema object, so anything else is a
115
+ // mistake — most often the action's `{ name: { type } }` map written in a
116
+ // tool. Only DeepSeek rejects it on the wire; everywhere else the tool is
117
+ // simply never callable, and nothing says so.
118
+ if (tool.parameters && tool.parameters.type !== "object") {
119
+ throw new errors_js_1.FlowConfigurationError(`[FlowConfigurationError] tool "${tool.id}": parameters must be a JSON Schema object. ` +
120
+ `Write { type: "object", properties: { ... }, required: [...] }.`);
1126
121
  }
1127
- // Update metadata
1128
- updatedSession = {
1129
- ...updatedSession,
1130
- metadata: {
1131
- ...updatedSession.metadata,
1132
- lastUpdatedAt: now,
1133
- },
1134
- };
1135
- return updatedSession;
1136
122
  }
1137
- /**
1138
- * Validate a directive for structural correctness.
1139
- * Throws FlowConfigurationError for invalid combinations.
1140
- * @private
1141
- */
1142
- validateDirective(directive) {
1143
- // Check for multiple position fields
1144
- const positionFields = ['goTo', 'goToStep', 'complete', 'abort', 'reset'];
1145
- const setPositionFields = positionFields.filter(field => directive[field] !== undefined);
1146
- if (setPositionFields.length > 1) {
1147
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Multiple position fields: a Directive may set at most one position field. ` +
1148
- `Found: ${setPositionFields.join(', ')}. Remove all but one.`);
1149
- }
1150
- // Check for empty goTo object
1151
- if (directive.goTo && typeof directive.goTo === 'object') {
1152
- const goToObj = directive.goTo;
1153
- if (!goToObj.flow && !goToObj.step) {
1154
- throw new Step_js_1.FlowConfigurationError(`[FlowConfigurationError] Empty goTo: "goTo" requires at least a "flow" field. ` +
1155
- `Provide { goTo: { flow: '<id>' } } or use the string shorthand { goTo: '<id>' }.`);
123
+ const { idle } = options;
124
+ if (idle && idle !== "silent") {
125
+ const known = new Set((options.tools ?? []).map((tool) => tool.id));
126
+ for (const name of idle.tools ?? []) {
127
+ if (!known.has(name)) {
128
+ throw new errors_js_1.FlowConfigurationError(`[FlowConfigurationError] idle: unknown tool "${name}". Register it in the agent's tools or fix the name.`);
1156
129
  }
1157
130
  }
1158
131
  }
1159
- /**
1160
- * Strip pre-LLM-only fields (appendPrompt, injectTools, halt) from a directive.
1161
- * These fields are transient (one-turn lifetime) and must not be persisted.
1162
- * @private
1163
- */
1164
- stripPreDirectiveFields(directive) {
1165
- const raw = directive;
1166
- if (!raw.appendPrompt && !raw.injectTools && raw.halt === undefined) {
1167
- return directive;
1168
- }
1169
- const { appendPrompt, injectTools, halt, ...rest } = raw;
1170
- if (appendPrompt || injectTools || halt !== undefined) {
1171
- index_js_1.logger.warn(`[Agent] Ignoring pre-LLM-only fields on pendingDirective (these only take effect in onEnter/prepare hooks): ` +
1172
- `${[appendPrompt && 'appendPrompt', injectTools && 'injectTools', halt !== undefined && 'halt'].filter(Boolean).join(', ')}`);
1173
- }
1174
- return rest;
1175
- }
1176
- /**
1177
- * Simplified respond method using SessionManager
1178
- * Automatically manages conversation history through the session
1179
- */
1180
- async chat(message, options) {
1181
- // Delegate to ResponseModal.generate()
1182
- return this._responseModal.generate(message, options);
1183
- }
1184
- /**
1185
- * Modern streaming API - simple interface like chat() but returns a stream
1186
- * Automatically manages conversation history through the session
1187
- */
1188
- async *stream(message, options) {
1189
- // Delegate to ResponseModal with the same options structure as chat()
1190
- yield* this._responseModal.stream(message, {
1191
- history: options?.history,
1192
- contextOverride: options?.contextOverride,
1193
- signal: options?.signal,
1194
- });
1195
- }
1196
132
  }
1197
- exports.Agent = Agent;
1198
133
  //# sourceMappingURL=Agent.js.map