@amodalai/runtime 0.1.25 → 0.2.0

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 (367) hide show
  1. package/dist/src/__fixtures__/README.md +84 -0
  2. package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
  3. package/dist/src/__fixtures__/smoke-agent/automations/test-auto.md +5 -0
  4. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/access.json +11 -0
  5. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/spec.json +4 -0
  6. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/surface.md +9 -0
  7. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/access.json +3 -0
  8. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +8 -0
  9. package/dist/src/__fixtures__/smoke-agent/evals/basic-eval.md +12 -0
  10. package/dist/src/__fixtures__/smoke-agent/knowledge/test-knowledge.md +3 -0
  11. package/dist/src/__fixtures__/smoke-agent/skills/test-skill/SKILL.md +11 -0
  12. package/dist/src/__fixtures__/smoke-agent/stores/test-items.json +11 -0
  13. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.d.ts +18 -0
  14. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js +22 -0
  15. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js.map +1 -0
  16. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/tool.json +17 -0
  17. package/dist/src/__fixtures__/smoke.test.js +718 -0
  18. package/dist/src/__fixtures__/smoke.test.js.map +1 -0
  19. package/dist/src/{agent/stores-e2e.test.d.ts → __tests__/providers.test.d.ts} +1 -1
  20. package/dist/src/__tests__/providers.test.js +209 -0
  21. package/dist/src/__tests__/providers.test.js.map +1 -0
  22. package/dist/src/__tests__/test-providers.d.ts +40 -0
  23. package/dist/src/__tests__/test-providers.js +61 -0
  24. package/dist/src/__tests__/test-providers.js.map +1 -0
  25. package/dist/src/agent/agent-types.d.ts +2 -2
  26. package/dist/src/agent/config-watcher.test.js +18 -14
  27. package/dist/src/agent/config-watcher.test.js.map +1 -1
  28. package/dist/src/agent/local-server.d.ts +3 -3
  29. package/dist/src/agent/local-server.js +213 -122
  30. package/dist/src/agent/local-server.js.map +1 -1
  31. package/dist/src/agent/local-server.test.js +17 -13
  32. package/dist/src/agent/local-server.test.js.map +1 -1
  33. package/dist/src/agent/loop-types.d.ts +175 -0
  34. package/dist/src/agent/loop-types.js +20 -0
  35. package/dist/src/agent/loop-types.js.map +1 -0
  36. package/dist/src/agent/loop.d.ts +31 -0
  37. package/dist/src/agent/loop.js +139 -0
  38. package/dist/src/agent/loop.js.map +1 -0
  39. package/dist/src/agent/{tool-context-builder.test.d.ts → loop.test.d.ts} +1 -1
  40. package/dist/src/agent/loop.test.js +1030 -0
  41. package/dist/src/agent/loop.test.js.map +1 -0
  42. package/dist/src/agent/mcp-config.d.ts +28 -0
  43. package/dist/src/agent/mcp-config.js +57 -0
  44. package/dist/src/agent/mcp-config.js.map +1 -0
  45. package/dist/src/agent/page-builder.js +6 -1
  46. package/dist/src/agent/page-builder.js.map +1 -1
  47. package/dist/src/agent/proactive/proactive-runner.d.ts +24 -8
  48. package/dist/src/agent/proactive/proactive-runner.js +36 -33
  49. package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
  50. package/dist/src/agent/proactive/proactive-runner.test.d.ts +1 -1
  51. package/dist/src/agent/proactive/proactive-runner.test.js +75 -87
  52. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
  53. package/dist/src/agent/routes/admin-chat.d.ts +15 -3
  54. package/dist/src/agent/routes/admin-chat.js +63 -17
  55. package/dist/src/agent/routes/admin-chat.js.map +1 -1
  56. package/dist/src/agent/routes/automations.js +5 -4
  57. package/dist/src/agent/routes/automations.js.map +1 -1
  58. package/dist/src/agent/routes/evals.d.ts +3 -2
  59. package/dist/src/agent/routes/evals.js +25 -11
  60. package/dist/src/agent/routes/evals.js.map +1 -1
  61. package/dist/src/agent/routes/files.js +7 -6
  62. package/dist/src/agent/routes/files.js.map +1 -1
  63. package/dist/src/agent/routes/inspect.d.ts +6 -2
  64. package/dist/src/agent/routes/inspect.js +32 -15
  65. package/dist/src/agent/routes/inspect.js.map +1 -1
  66. package/dist/src/agent/routes/inspect.test.js +18 -42
  67. package/dist/src/agent/routes/inspect.test.js.map +1 -1
  68. package/dist/src/agent/routes/stores.js +9 -8
  69. package/dist/src/agent/routes/stores.js.map +1 -1
  70. package/dist/src/agent/routes/task.d.ts +15 -3
  71. package/dist/src/agent/routes/task.js +16 -6
  72. package/dist/src/agent/routes/task.js.map +1 -1
  73. package/dist/src/agent/routes/task.test.d.ts +1 -1
  74. package/dist/src/agent/routes/task.test.js +70 -53
  75. package/dist/src/agent/routes/task.test.js.map +1 -1
  76. package/dist/src/agent/routes/webhooks.js +12 -2
  77. package/dist/src/agent/routes/webhooks.js.map +1 -1
  78. package/dist/src/agent/session-store.d.ts +11 -2
  79. package/dist/src/agent/session-store.js +1 -1
  80. package/dist/src/agent/session-store.js.map +1 -1
  81. package/dist/src/agent/snapshot-server.d.ts +2 -22
  82. package/dist/src/agent/snapshot-server.js +50 -27
  83. package/dist/src/agent/snapshot-server.js.map +1 -1
  84. package/dist/src/agent/states/compacting.d.ts +14 -0
  85. package/dist/src/agent/states/compacting.js +258 -0
  86. package/dist/src/agent/states/compacting.js.map +1 -0
  87. package/dist/src/agent/states/confirming.d.ts +10 -0
  88. package/dist/src/agent/states/confirming.js +76 -0
  89. package/dist/src/agent/states/confirming.js.map +1 -0
  90. package/dist/src/agent/states/dispatching.d.ts +18 -0
  91. package/dist/src/agent/states/dispatching.js +241 -0
  92. package/dist/src/agent/states/dispatching.js.map +1 -0
  93. package/dist/src/agent/states/executing.d.ts +21 -0
  94. package/dist/src/agent/states/executing.js +308 -0
  95. package/dist/src/agent/states/executing.js.map +1 -0
  96. package/dist/src/agent/states/streaming.d.ts +10 -0
  97. package/dist/src/agent/states/streaming.js +155 -0
  98. package/dist/src/agent/states/streaming.js.map +1 -0
  99. package/dist/src/agent/states/thinking.d.ts +13 -0
  100. package/dist/src/agent/states/thinking.js +233 -0
  101. package/dist/src/agent/states/thinking.js.map +1 -0
  102. package/dist/src/agent/token-estimate.d.ts +17 -0
  103. package/dist/src/agent/token-estimate.js +13 -0
  104. package/dist/src/agent/token-estimate.js.map +1 -0
  105. package/dist/src/agent/tool-executor-local.js +9 -18
  106. package/dist/src/agent/tool-executor-local.js.map +1 -1
  107. package/dist/src/agent/tool-executor-local.test.js +3 -5
  108. package/dist/src/agent/tool-executor-local.test.js.map +1 -1
  109. package/dist/src/api/create-agent.d.ts +15 -0
  110. package/dist/src/api/create-agent.js +137 -0
  111. package/dist/src/api/create-agent.js.map +1 -0
  112. package/dist/src/api/types.d.ts +68 -0
  113. package/dist/src/api/types.js +7 -0
  114. package/dist/src/api/types.js.map +1 -0
  115. package/dist/src/config.d.ts +96 -0
  116. package/dist/src/config.js +221 -0
  117. package/dist/src/config.js.map +1 -0
  118. package/dist/src/{agent/custom-tools-e2e.test.d.ts → config.test.d.ts} +1 -1
  119. package/dist/src/config.test.js +235 -0
  120. package/dist/src/config.test.js.map +1 -0
  121. package/dist/src/context/compiler.d.ts +13 -0
  122. package/dist/src/context/compiler.js +358 -0
  123. package/dist/src/context/compiler.js.map +1 -0
  124. package/dist/src/context/compiler.test.d.ts +6 -0
  125. package/dist/src/context/compiler.test.js +532 -0
  126. package/dist/src/context/compiler.test.js.map +1 -0
  127. package/dist/src/context/types.d.ts +110 -0
  128. package/dist/src/context/types.js +7 -0
  129. package/dist/src/context/types.js.map +1 -0
  130. package/dist/src/errors.d.ts +145 -0
  131. package/dist/src/errors.js +218 -0
  132. package/dist/src/errors.js.map +1 -0
  133. package/dist/src/errors.test.d.ts +6 -0
  134. package/dist/src/errors.test.js +203 -0
  135. package/dist/src/errors.test.js.map +1 -0
  136. package/dist/src/index.d.ts +38 -6
  137. package/dist/src/index.js +40 -22
  138. package/dist/src/index.js.map +1 -1
  139. package/dist/src/logger.d.ts +15 -31
  140. package/dist/src/logger.js +19 -78
  141. package/dist/src/logger.js.map +1 -1
  142. package/dist/src/logger.test.d.ts +6 -0
  143. package/dist/src/logger.test.js +198 -0
  144. package/dist/src/logger.test.js.map +1 -0
  145. package/dist/src/providers/create-provider.d.ts +23 -0
  146. package/dist/src/providers/create-provider.js +185 -0
  147. package/dist/src/providers/create-provider.js.map +1 -0
  148. package/dist/src/providers/create-provider.test.d.ts +6 -0
  149. package/dist/src/providers/create-provider.test.js +95 -0
  150. package/dist/src/providers/create-provider.test.js.map +1 -0
  151. package/dist/src/providers/failover.d.ts +38 -0
  152. package/dist/src/providers/failover.js +147 -0
  153. package/dist/src/providers/failover.js.map +1 -0
  154. package/dist/src/providers/failover.test.d.ts +6 -0
  155. package/dist/src/providers/failover.test.js +169 -0
  156. package/dist/src/providers/failover.test.js.map +1 -0
  157. package/dist/src/providers/types.d.ts +110 -0
  158. package/dist/src/providers/types.js +7 -0
  159. package/dist/src/providers/types.js.map +1 -0
  160. package/dist/src/routes/ai-stream.d.ts +13 -10
  161. package/dist/src/routes/ai-stream.js +76 -38
  162. package/dist/src/routes/ai-stream.js.map +1 -1
  163. package/dist/src/routes/chat-new.test.d.ts +6 -0
  164. package/dist/src/routes/chat-new.test.js +107 -0
  165. package/dist/src/routes/chat-new.test.js.map +1 -0
  166. package/dist/src/routes/chat-stream-new.test.d.ts +6 -0
  167. package/dist/src/routes/chat-stream-new.test.js +135 -0
  168. package/dist/src/routes/chat-stream-new.test.js.map +1 -0
  169. package/dist/src/routes/chat-stream.d.ts +14 -4
  170. package/dist/src/routes/chat-stream.js +47 -27
  171. package/dist/src/routes/chat-stream.js.map +1 -1
  172. package/dist/src/routes/chat.d.ts +13 -4
  173. package/dist/src/routes/chat.js +60 -22
  174. package/dist/src/routes/chat.js.map +1 -1
  175. package/dist/src/routes/health.d.ts +3 -2
  176. package/dist/src/routes/health.js.map +1 -1
  177. package/dist/src/routes/route-helpers.d.ts +50 -0
  178. package/dist/src/routes/route-helpers.js +80 -0
  179. package/dist/src/routes/route-helpers.js.map +1 -0
  180. package/dist/src/routes/session-resolver.d.ts +72 -0
  181. package/dist/src/routes/session-resolver.js +123 -0
  182. package/dist/src/routes/session-resolver.js.map +1 -0
  183. package/dist/src/routes/session-resolver.test.d.ts +6 -0
  184. package/dist/src/routes/session-resolver.test.js +206 -0
  185. package/dist/src/routes/session-resolver.test.js.map +1 -0
  186. package/dist/src/routes/webhooks.d.ts +3 -1
  187. package/dist/src/routes/webhooks.js +12 -2
  188. package/dist/src/routes/webhooks.js.map +1 -1
  189. package/dist/src/security/permission-checker.d.ts +80 -0
  190. package/dist/src/security/permission-checker.js +75 -0
  191. package/dist/src/security/permission-checker.js.map +1 -0
  192. package/dist/src/security/permission-checker.test.d.ts +6 -0
  193. package/dist/src/security/permission-checker.test.js +208 -0
  194. package/dist/src/security/permission-checker.test.js.map +1 -0
  195. package/dist/src/server.d.ts +12 -11
  196. package/dist/src/server.js +44 -46
  197. package/dist/src/server.js.map +1 -1
  198. package/dist/src/server.test.d.ts +1 -1
  199. package/dist/src/server.test.js +6 -140
  200. package/dist/src/server.test.js.map +1 -1
  201. package/dist/src/session/manager.d.ts +98 -0
  202. package/dist/src/session/manager.js +364 -0
  203. package/dist/src/session/manager.js.map +1 -0
  204. package/dist/src/session/manager.test.d.ts +6 -0
  205. package/dist/src/session/manager.test.js +315 -0
  206. package/dist/src/session/manager.test.js.map +1 -0
  207. package/dist/src/session/session-builder.d.ts +71 -0
  208. package/dist/src/session/session-builder.js +364 -0
  209. package/dist/src/session/session-builder.js.map +1 -0
  210. package/dist/src/session/session-builder.test.d.ts +6 -0
  211. package/dist/src/session/session-builder.test.js +352 -0
  212. package/dist/src/session/session-builder.test.js.map +1 -0
  213. package/dist/src/session/store.d.ts +57 -0
  214. package/dist/src/session/store.js +167 -0
  215. package/dist/src/session/store.js.map +1 -0
  216. package/dist/src/session/store.test.d.ts +6 -0
  217. package/dist/src/session/store.test.js +145 -0
  218. package/dist/src/session/store.test.js.map +1 -0
  219. package/dist/src/session/stream-hooks.d.ts +39 -0
  220. package/dist/src/session/stream-hooks.js +7 -0
  221. package/dist/src/session/stream-hooks.js.map +1 -0
  222. package/dist/src/session/tool-context-factory.d.ts +60 -0
  223. package/dist/src/session/tool-context-factory.js +190 -0
  224. package/dist/src/session/tool-context-factory.js.map +1 -0
  225. package/dist/src/session/tool-context-factory.test.d.ts +6 -0
  226. package/dist/src/session/tool-context-factory.test.js +287 -0
  227. package/dist/src/session/tool-context-factory.test.js.map +1 -0
  228. package/dist/src/session/types.d.ts +188 -0
  229. package/dist/src/session/types.js +7 -0
  230. package/dist/src/session/types.js.map +1 -0
  231. package/dist/src/stores/drizzle-store-backend.d.ts +49 -0
  232. package/dist/src/stores/drizzle-store-backend.js +306 -0
  233. package/dist/src/stores/drizzle-store-backend.js.map +1 -0
  234. package/dist/src/stores/drizzle-store-backend.test.d.ts +6 -0
  235. package/dist/src/stores/drizzle-store-backend.test.js +215 -0
  236. package/dist/src/stores/drizzle-store-backend.test.js.map +1 -0
  237. package/dist/src/stores/index.d.ts +4 -0
  238. package/dist/src/stores/index.js +2 -0
  239. package/dist/src/stores/index.js.map +1 -1
  240. package/dist/src/stores/pglite-store-backend.d.ts +16 -19
  241. package/dist/src/stores/pglite-store-backend.js +85 -233
  242. package/dist/src/stores/pglite-store-backend.js.map +1 -1
  243. package/dist/src/stores/postgres-store-backend.d.ts +30 -0
  244. package/dist/src/stores/postgres-store-backend.js +100 -0
  245. package/dist/src/stores/postgres-store-backend.js.map +1 -0
  246. package/dist/src/stores/schema.d.ts +491 -0
  247. package/dist/src/stores/schema.js +57 -0
  248. package/dist/src/stores/schema.js.map +1 -0
  249. package/dist/src/tools/admin-file-tools.d.ts +13 -0
  250. package/dist/src/tools/admin-file-tools.js +200 -0
  251. package/dist/src/tools/admin-file-tools.js.map +1 -0
  252. package/dist/src/tools/admin-file-tools.test.d.ts +6 -0
  253. package/dist/src/tools/admin-file-tools.test.js +152 -0
  254. package/dist/src/tools/admin-file-tools.test.js.map +1 -0
  255. package/dist/src/tools/custom-tool-adapter.d.ts +41 -0
  256. package/dist/src/tools/custom-tool-adapter.js +190 -0
  257. package/dist/src/tools/custom-tool-adapter.js.map +1 -0
  258. package/dist/src/tools/custom-tool-adapter.test.d.ts +6 -0
  259. package/dist/src/tools/custom-tool-adapter.test.js +244 -0
  260. package/dist/src/tools/custom-tool-adapter.test.js.map +1 -0
  261. package/dist/src/tools/dispatch-tool.d.ts +52 -0
  262. package/dist/src/tools/dispatch-tool.js +71 -0
  263. package/dist/src/tools/dispatch-tool.js.map +1 -0
  264. package/dist/src/tools/dispatch-tool.test.d.ts +6 -0
  265. package/dist/src/tools/dispatch-tool.test.js +75 -0
  266. package/dist/src/tools/dispatch-tool.test.js.map +1 -0
  267. package/dist/src/tools/mcp-tool-adapter.d.ts +18 -0
  268. package/dist/src/tools/mcp-tool-adapter.js +135 -0
  269. package/dist/src/tools/mcp-tool-adapter.js.map +1 -0
  270. package/dist/src/tools/mcp-tool-adapter.test.d.ts +6 -0
  271. package/dist/src/tools/mcp-tool-adapter.test.js +227 -0
  272. package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -0
  273. package/dist/src/tools/registry.d.ts +25 -0
  274. package/dist/src/tools/registry.js +72 -0
  275. package/dist/src/tools/registry.js.map +1 -0
  276. package/dist/src/tools/registry.test.d.ts +6 -0
  277. package/dist/src/tools/registry.test.js +121 -0
  278. package/dist/src/tools/registry.test.js.map +1 -0
  279. package/dist/src/tools/request-tool.d.ts +42 -0
  280. package/dist/src/tools/request-tool.js +190 -0
  281. package/dist/src/tools/request-tool.js.map +1 -0
  282. package/dist/src/tools/request-tool.test.d.ts +6 -0
  283. package/dist/src/tools/request-tool.test.js +254 -0
  284. package/dist/src/tools/request-tool.test.js.map +1 -0
  285. package/dist/src/tools/store-tools.d.ts +29 -0
  286. package/dist/src/tools/store-tools.js +224 -0
  287. package/dist/src/tools/store-tools.js.map +1 -0
  288. package/dist/src/tools/store-tools.test.d.ts +6 -0
  289. package/dist/src/tools/store-tools.test.js +216 -0
  290. package/dist/src/tools/store-tools.test.js.map +1 -0
  291. package/dist/src/tools/types.d.ts +111 -0
  292. package/dist/src/tools/types.js +7 -0
  293. package/dist/src/tools/types.js.map +1 -0
  294. package/dist/src/types.d.ts +20 -12
  295. package/dist/src/types.js +3 -2
  296. package/dist/src/types.js.map +1 -1
  297. package/dist/tsconfig.tsbuildinfo +1 -1
  298. package/package.json +13 -3
  299. package/dist/src/agent/agent-runner.d.ts +0 -33
  300. package/dist/src/agent/agent-runner.js +0 -1040
  301. package/dist/src/agent/agent-runner.js.map +0 -1
  302. package/dist/src/agent/custom-tools-e2e.test.js +0 -566
  303. package/dist/src/agent/custom-tools-e2e.test.js.map +0 -1
  304. package/dist/src/agent/request-helper.d.ts +0 -16
  305. package/dist/src/agent/request-helper.js +0 -96
  306. package/dist/src/agent/request-helper.js.map +0 -1
  307. package/dist/src/agent/stores-e2e.test.js +0 -433
  308. package/dist/src/agent/stores-e2e.test.js.map +0 -1
  309. package/dist/src/agent/tool-context-builder.d.ts +0 -11
  310. package/dist/src/agent/tool-context-builder.js +0 -102
  311. package/dist/src/agent/tool-context-builder.js.map +0 -1
  312. package/dist/src/agent/tool-context-builder.test.js +0 -152
  313. package/dist/src/agent/tool-context-builder.test.js.map +0 -1
  314. package/dist/src/agent/write-repo-file.test.js +0 -270
  315. package/dist/src/agent/write-repo-file.test.js.map +0 -1
  316. package/dist/src/cron/heartbeat-runner.d.ts +0 -21
  317. package/dist/src/cron/heartbeat-runner.js +0 -79
  318. package/dist/src/cron/heartbeat-runner.js.map +0 -1
  319. package/dist/src/cron/heartbeat-runner.test.d.ts +0 -6
  320. package/dist/src/cron/heartbeat-runner.test.js +0 -120
  321. package/dist/src/cron/heartbeat-runner.test.js.map +0 -1
  322. package/dist/src/cron/heartbeat-scheduler.d.ts +0 -26
  323. package/dist/src/cron/heartbeat-scheduler.js +0 -55
  324. package/dist/src/cron/heartbeat-scheduler.js.map +0 -1
  325. package/dist/src/cron/heartbeat-scheduler.test.d.ts +0 -6
  326. package/dist/src/cron/heartbeat-scheduler.test.js +0 -61
  327. package/dist/src/cron/heartbeat-scheduler.test.js.map +0 -1
  328. package/dist/src/routes/ai-stream.test.d.ts +0 -6
  329. package/dist/src/routes/ai-stream.test.js +0 -586
  330. package/dist/src/routes/ai-stream.test.js.map +0 -1
  331. package/dist/src/routes/ask-user-response.d.ts +0 -30
  332. package/dist/src/routes/ask-user-response.js +0 -61
  333. package/dist/src/routes/ask-user-response.js.map +0 -1
  334. package/dist/src/routes/ask-user-response.test.d.ts +0 -6
  335. package/dist/src/routes/ask-user-response.test.js +0 -88
  336. package/dist/src/routes/ask-user-response.test.js.map +0 -1
  337. package/dist/src/routes/chat-stream.test.d.ts +0 -6
  338. package/dist/src/routes/chat-stream.test.js +0 -155
  339. package/dist/src/routes/chat-stream.test.js.map +0 -1
  340. package/dist/src/routes/chat.test.d.ts +0 -6
  341. package/dist/src/routes/chat.test.js +0 -99
  342. package/dist/src/routes/chat.test.js.map +0 -1
  343. package/dist/src/routes/widget-actions.d.ts +0 -49
  344. package/dist/src/routes/widget-actions.js +0 -78
  345. package/dist/src/routes/widget-actions.js.map +0 -1
  346. package/dist/src/session/custom-tool-adapter.d.ts +0 -74
  347. package/dist/src/session/custom-tool-adapter.js +0 -180
  348. package/dist/src/session/custom-tool-adapter.js.map +0 -1
  349. package/dist/src/session/history-converter.d.ts +0 -21
  350. package/dist/src/session/history-converter.js +0 -59
  351. package/dist/src/session/history-converter.js.map +0 -1
  352. package/dist/src/session/history-converter.test.d.ts +0 -6
  353. package/dist/src/session/history-converter.test.js +0 -130
  354. package/dist/src/session/history-converter.test.js.map +0 -1
  355. package/dist/src/session/session-manager.d.ts +0 -219
  356. package/dist/src/session/session-manager.js +0 -915
  357. package/dist/src/session/session-manager.js.map +0 -1
  358. package/dist/src/session/session-manager.test.d.ts +0 -6
  359. package/dist/src/session/session-manager.test.js +0 -451
  360. package/dist/src/session/session-manager.test.js.map +0 -1
  361. package/dist/src/session/session-runner.d.ts +0 -45
  362. package/dist/src/session/session-runner.js +0 -719
  363. package/dist/src/session/session-runner.js.map +0 -1
  364. package/dist/src/session/session-runner.test.d.ts +0 -6
  365. package/dist/src/session/session-runner.test.js +0 -830
  366. package/dist/src/session/session-runner.test.js.map +0 -1
  367. /package/dist/src/{agent/write-repo-file.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
@@ -0,0 +1,198 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { log, createLogger, setLogLevel, setLogFormat, setSanitize, LogLevel, } from './logger.js';
8
+ describe('Logger', () => {
9
+ let stderrWrite;
10
+ let originalWrite;
11
+ beforeEach(() => {
12
+ originalWrite = process.stderr.write;
13
+ stderrWrite = vi.fn().mockReturnValue(true);
14
+ process.stderr.write = stderrWrite;
15
+ setLogLevel(LogLevel.TRACE);
16
+ setLogFormat('text');
17
+ setSanitize((data) => data);
18
+ });
19
+ afterEach(() => {
20
+ process.stderr.write = originalWrite;
21
+ setLogLevel(LogLevel.INFO);
22
+ setLogFormat('text');
23
+ });
24
+ describe('backward compatibility', () => {
25
+ it('accepts (message, tag) string arguments', () => {
26
+ log.info('Server started', 'server');
27
+ expect(stderrWrite).toHaveBeenCalledWith('[INFO] [server] Server started\n');
28
+ });
29
+ it('works with message only', () => {
30
+ log.error('Something broke');
31
+ expect(stderrWrite).toHaveBeenCalledWith('[ERROR] Something broke\n');
32
+ });
33
+ });
34
+ describe('structured data', () => {
35
+ it('includes data fields in text mode', () => {
36
+ log.info('request_completed', { method: 'GET', status: 200 });
37
+ const output = stderrWrite.mock.calls[0]?.[0];
38
+ expect(output).toContain('[INFO] request_completed');
39
+ expect(output).toContain('"method":"GET"');
40
+ expect(output).toContain('"status":200');
41
+ });
42
+ it('includes tag and data fields together', () => {
43
+ log.info('event', { tag: 'mytag', extra: 'val' });
44
+ const output = stderrWrite.mock.calls[0]?.[0];
45
+ expect(output).toContain('[mytag]');
46
+ expect(output).toContain('"extra":"val"');
47
+ });
48
+ });
49
+ describe('log levels', () => {
50
+ it('respects log level filtering', () => {
51
+ setLogLevel(LogLevel.WARN);
52
+ log.debug('should not appear');
53
+ log.info('should not appear');
54
+ log.warn('should appear');
55
+ expect(stderrWrite).toHaveBeenCalledTimes(1);
56
+ expect(stderrWrite).toHaveBeenCalledWith('[WARN] should appear\n');
57
+ });
58
+ it('NONE suppresses all output', () => {
59
+ setLogLevel(LogLevel.NONE);
60
+ log.fatal('should not appear');
61
+ expect(stderrWrite).not.toHaveBeenCalled();
62
+ });
63
+ });
64
+ describe('child()', () => {
65
+ it('creates a scoped logger with inherited bindings', () => {
66
+ const sessionLog = log.child({ session: 'sess-123', tenant: 'acme' });
67
+ sessionLog.info('message_received');
68
+ const output = stderrWrite.mock.calls[0]?.[0];
69
+ expect(output).toContain('message_received');
70
+ expect(output).toContain('"session":"sess-123"');
71
+ expect(output).toContain('"tenant":"acme"');
72
+ });
73
+ it('merges child data with call-site data', () => {
74
+ const sessionLog = log.child({ session: 'sess-123' });
75
+ sessionLog.info('tool_call', { tool: 'search', duration: 42 });
76
+ const output = stderrWrite.mock.calls[0]?.[0];
77
+ expect(output).toContain('"session":"sess-123"');
78
+ expect(output).toContain('"tool":"search"');
79
+ expect(output).toContain('"duration":42');
80
+ });
81
+ it('call-site data overrides child bindings', () => {
82
+ const sessionLog = log.child({ status: 'pending' });
83
+ sessionLog.info('updated', { status: 'done' });
84
+ const output = stderrWrite.mock.calls[0]?.[0];
85
+ expect(output).toContain('"status":"done"');
86
+ expect(output).not.toContain('"status":"pending"');
87
+ });
88
+ it('supports nested children', () => {
89
+ const sessionLog = log.child({ session: 'sess-1' });
90
+ const toolLog = sessionLog.child({ tool: 'search' });
91
+ toolLog.info('executing');
92
+ const output = stderrWrite.mock.calls[0]?.[0];
93
+ expect(output).toContain('"session":"sess-1"');
94
+ expect(output).toContain('"tool":"search"');
95
+ });
96
+ it('accepts traceId for distributed tracing', () => {
97
+ const sessionLog = log.child({ session: 'sess-1', traceId: 'abc-def-123' });
98
+ sessionLog.info('traced_event');
99
+ const output = stderrWrite.mock.calls[0]?.[0];
100
+ expect(output).toContain('"traceId":"abc-def-123"');
101
+ });
102
+ });
103
+ describe('JSON format', () => {
104
+ it('outputs valid JSON lines', () => {
105
+ setLogFormat('json');
106
+ log.info('server_started', { port: 3000 });
107
+ const output = stderrWrite.mock.calls[0]?.[0];
108
+ const parsed = JSON.parse(output);
109
+ expect(parsed['level']).toBe('info');
110
+ expect(parsed['event']).toBe('server_started');
111
+ expect(parsed['port']).toBe(3000);
112
+ expect(parsed['ts']).toBeDefined();
113
+ });
114
+ it('includes timestamp as ISO string', () => {
115
+ setLogFormat('json');
116
+ log.info('test');
117
+ const output = stderrWrite.mock.calls[0]?.[0];
118
+ const parsed = JSON.parse(output);
119
+ expect(() => new Date(parsed['ts'])).not.toThrow();
120
+ });
121
+ it('includes child bindings in JSON output', () => {
122
+ setLogFormat('json');
123
+ const sessionLog = log.child({ session: 'sess-42', tenant: 'acme' });
124
+ sessionLog.warn('rate_limited', { provider: 'anthropic' });
125
+ const output = stderrWrite.mock.calls[0]?.[0];
126
+ const parsed = JSON.parse(output);
127
+ expect(parsed['level']).toBe('warn');
128
+ expect(parsed['session']).toBe('sess-42');
129
+ expect(parsed['tenant']).toBe('acme');
130
+ expect(parsed['provider']).toBe('anthropic');
131
+ });
132
+ it('handles backward-compat tag in JSON', () => {
133
+ setLogFormat('json');
134
+ log.info('event', 'mytag');
135
+ const output = stderrWrite.mock.calls[0]?.[0];
136
+ const parsed = JSON.parse(output);
137
+ expect(parsed['tag']).toBe('mytag');
138
+ expect(parsed['event']).toBe('event');
139
+ });
140
+ });
141
+ describe('sanitize hook', () => {
142
+ it('sanitizes data before output', () => {
143
+ setSanitize((data) => {
144
+ const sanitized = { ...data };
145
+ if ('apiKey' in sanitized) {
146
+ sanitized['apiKey'] = '***';
147
+ }
148
+ return sanitized;
149
+ });
150
+ log.info('provider_init', { provider: 'anthropic', apiKey: 'sk-secret-123' });
151
+ const output = stderrWrite.mock.calls[0]?.[0];
152
+ expect(output).toContain('"apiKey":"***"');
153
+ expect(output).not.toContain('sk-secret-123');
154
+ });
155
+ it('sanitizes child bindings too', () => {
156
+ setSanitize((data) => {
157
+ const sanitized = { ...data };
158
+ if (typeof sanitized['email'] === 'string') {
159
+ sanitized['email'] = 'user_***@***.com';
160
+ }
161
+ return sanitized;
162
+ });
163
+ const userLog = log.child({ email: 'bob@example.com' });
164
+ userLog.info('user_action');
165
+ const output = stderrWrite.mock.calls[0]?.[0];
166
+ expect(output).toContain('user_***@***.com');
167
+ expect(output).not.toContain('bob@example.com');
168
+ });
169
+ });
170
+ describe('createLogger', () => {
171
+ it('creates an independent logger with bindings', () => {
172
+ const logger = createLogger({ service: 'scheduler' });
173
+ logger.info('tick');
174
+ const output = stderrWrite.mock.calls[0]?.[0];
175
+ expect(output).toContain('"service":"scheduler"');
176
+ });
177
+ });
178
+ describe('circular reference safety', () => {
179
+ it('does not throw on circular data in text mode', () => {
180
+ const circular = { a: 1 };
181
+ circular['self'] = circular;
182
+ expect(() => log.info('circular_test', circular)).not.toThrow();
183
+ expect(stderrWrite).toHaveBeenCalledTimes(1);
184
+ const output = stderrWrite.mock.calls[0]?.[0];
185
+ expect(output).toContain('_serializeError');
186
+ });
187
+ it('does not throw on circular data in JSON mode', () => {
188
+ setLogFormat('json');
189
+ const circular = { b: 2 };
190
+ circular['self'] = circular;
191
+ expect(() => log.warn('circular_json', circular)).not.toThrow();
192
+ expect(stderrWrite).toHaveBeenCalledTimes(1);
193
+ const output = stderrWrite.mock.calls[0]?.[0];
194
+ expect(output).toContain('_serializeError');
195
+ });
196
+ });
197
+ });
198
+ //# sourceMappingURL=logger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../src/logger.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { LLMProvider, ProviderConfig } from './types.js';
7
+ /**
8
+ * Create an LLMProvider from a ProviderConfig.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const provider = createProvider({
13
+ * provider: 'anthropic',
14
+ * model: 'claude-sonnet-4-20250514',
15
+ * apiKey: process.env.ANTHROPIC_API_KEY,
16
+ * });
17
+ *
18
+ * const result = provider.streamText({
19
+ * messages: [{role: 'user', content: [{type: 'text', text: 'Hello'}]}],
20
+ * });
21
+ * ```
22
+ */
23
+ export declare function createProvider(config: ProviderConfig): LLMProvider;
@@ -0,0 +1,185 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { streamText, generateText } from 'ai';
7
+ import { createAnthropic } from '@ai-sdk/anthropic';
8
+ import { createOpenAI } from '@ai-sdk/openai';
9
+ import { createGoogleGenerativeAI } from '@ai-sdk/google';
10
+ import { ConfigError } from '../errors.js';
11
+ /** Default timeout for LLM calls when no AbortSignal is provided (2 minutes). */
12
+ const DEFAULT_LLM_TIMEOUT_MS = 120_000;
13
+ // ---------------------------------------------------------------------------
14
+ // OpenAI-compatible provider base URLs
15
+ // ---------------------------------------------------------------------------
16
+ const OPENAI_COMPATIBLE_BASE_URLS = {
17
+ deepseek: 'https://api.deepseek.com/v1',
18
+ groq: 'https://api.groq.com/openai/v1',
19
+ mistral: 'https://api.mistral.ai/v1',
20
+ xai: 'https://api.x.ai/v1',
21
+ fireworks: 'https://api.fireworks.ai/inference/v1',
22
+ together: 'https://api.together.xyz/v1',
23
+ };
24
+ // ---------------------------------------------------------------------------
25
+ // createLanguageModel — resolve config to an AI SDK LanguageModel
26
+ // ---------------------------------------------------------------------------
27
+ function createLanguageModel(config) {
28
+ const { provider, model, apiKey, baseUrl } = config;
29
+ switch (provider) {
30
+ case 'anthropic': {
31
+ const anthropic = createAnthropic({
32
+ apiKey,
33
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
34
+ });
35
+ return anthropic(model);
36
+ }
37
+ case 'openai': {
38
+ const openai = createOpenAI({
39
+ apiKey,
40
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
41
+ });
42
+ return openai(model);
43
+ }
44
+ case 'google': {
45
+ const google = createGoogleGenerativeAI({
46
+ apiKey,
47
+ ...(baseUrl ? { baseURL: baseUrl } : {}),
48
+ });
49
+ return google(model);
50
+ }
51
+ default: {
52
+ // OpenAI-compatible providers (DeepSeek, Groq, Mistral, xAI, etc.)
53
+ const compatBaseUrl = baseUrl ?? OPENAI_COMPATIBLE_BASE_URLS[provider];
54
+ if (!compatBaseUrl) {
55
+ throw new ConfigError(`Unknown provider "${provider}". Use a known provider (anthropic, openai, google) or set a baseUrl for OpenAI-compatible providers.`, {
56
+ key: 'providers',
57
+ context: { provider, model },
58
+ });
59
+ }
60
+ const openai = createOpenAI({
61
+ apiKey,
62
+ baseURL: compatBaseUrl,
63
+ });
64
+ return openai(model);
65
+ }
66
+ }
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // normalizeUsage — map AI SDK LanguageModelUsage to our TokenUsage
70
+ // ---------------------------------------------------------------------------
71
+ function normalizeUsage(usage) {
72
+ return {
73
+ inputTokens: usage?.inputTokens ?? 0,
74
+ outputTokens: usage?.outputTokens ?? 0,
75
+ cachedInputTokens: usage?.inputTokenDetails?.cacheReadTokens ?? undefined,
76
+ cacheCreationInputTokens: usage?.inputTokenDetails?.cacheWriteTokens ?? undefined,
77
+ totalTokens: usage?.totalTokens ?? (usage?.inputTokens ?? 0) + (usage?.outputTokens ?? 0),
78
+ };
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // createProvider — public factory
82
+ // ---------------------------------------------------------------------------
83
+ /**
84
+ * Create an LLMProvider from a ProviderConfig.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * const provider = createProvider({
89
+ * provider: 'anthropic',
90
+ * model: 'claude-sonnet-4-20250514',
91
+ * apiKey: process.env.ANTHROPIC_API_KEY,
92
+ * });
93
+ *
94
+ * const result = provider.streamText({
95
+ * messages: [{role: 'user', content: [{type: 'text', text: 'Hello'}]}],
96
+ * });
97
+ * ```
98
+ */
99
+ export function createProvider(config) {
100
+ const languageModel = createLanguageModel(config);
101
+ return {
102
+ model: config.model,
103
+ provider: config.provider,
104
+ languageModel,
105
+ streamText(opts) {
106
+ const sdkResult = streamText({
107
+ model: languageModel,
108
+ messages: opts.messages,
109
+ system: opts.system,
110
+ tools: opts.tools,
111
+ toolChoice: opts.toolChoice,
112
+ maxOutputTokens: opts.maxOutputTokens,
113
+ temperature: opts.temperature,
114
+ abortSignal: opts.abortSignal ?? AbortSignal.timeout(DEFAULT_LLM_TIMEOUT_MS),
115
+ });
116
+ const usagePromise = sdkResult.usage.then((u) => normalizeUsage(u));
117
+ const textPromise = sdkResult.text;
118
+ return {
119
+ textStream: sdkResult.textStream,
120
+ fullStream: (async function* () {
121
+ for await (const chunk of sdkResult.fullStream) {
122
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- intentionally ignoring SDK-internal chunk types (reasoning, source, raw, etc.)
123
+ switch (chunk.type) {
124
+ case 'text-delta':
125
+ yield { type: 'text-delta', textDelta: chunk.text };
126
+ break;
127
+ case 'tool-call':
128
+ yield {
129
+ type: 'tool-call',
130
+ toolCallId: chunk.toolCallId,
131
+ toolName: chunk.toolName,
132
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- AI SDK boundary: input is tool params from provider
133
+ args: (chunk.input ?? {}),
134
+ };
135
+ break;
136
+ case 'tool-result':
137
+ yield {
138
+ type: 'tool-result',
139
+ toolCallId: chunk.toolCallId,
140
+ toolName: chunk.toolName,
141
+ result: chunk.output,
142
+ };
143
+ break;
144
+ case 'finish':
145
+ yield { type: 'finish', usage: normalizeUsage(chunk.totalUsage) };
146
+ break;
147
+ case 'error':
148
+ yield { type: 'error', error: chunk.error };
149
+ break;
150
+ default:
151
+ // Ignore other chunk types (step-start, step-finish, reasoning, source, etc.)
152
+ break;
153
+ }
154
+ }
155
+ })(),
156
+ usage: usagePromise,
157
+ text: textPromise,
158
+ };
159
+ },
160
+ async generateText(opts) {
161
+ const result = await generateText({
162
+ model: languageModel,
163
+ messages: opts.messages,
164
+ system: opts.system,
165
+ tools: opts.tools,
166
+ toolChoice: opts.toolChoice,
167
+ maxOutputTokens: opts.maxOutputTokens,
168
+ temperature: opts.temperature,
169
+ abortSignal: opts.abortSignal ?? AbortSignal.timeout(DEFAULT_LLM_TIMEOUT_MS),
170
+ });
171
+ return {
172
+ text: result.text,
173
+ toolCalls: result.toolCalls.map((tc) => ({
174
+ toolCallId: tc.toolCallId,
175
+ toolName: tc.toolName,
176
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- AI SDK boundary: input is tool params from provider
177
+ args: (tc.input ?? {}),
178
+ })),
179
+ usage: normalizeUsage(result.usage),
180
+ finishReason: result.finishReason,
181
+ };
182
+ },
183
+ };
184
+ }
185
+ //# sourceMappingURL=create-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-provider.js","sourceRoot":"","sources":["../../../src/providers/create-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { createProvider } from './create-provider.js';
8
+ import { ConfigError } from '../errors.js';
9
+ describe('createProvider', () => {
10
+ it('creates an Anthropic provider', () => {
11
+ const provider = createProvider({
12
+ provider: 'anthropic',
13
+ model: 'claude-sonnet-4-20250514',
14
+ apiKey: 'test-key',
15
+ });
16
+ expect(provider.provider).toBe('anthropic');
17
+ expect(provider.model).toBe('claude-sonnet-4-20250514');
18
+ expect(provider.languageModel).toBeDefined();
19
+ expect(typeof provider.streamText).toBe('function');
20
+ expect(typeof provider.generateText).toBe('function');
21
+ });
22
+ it('creates an OpenAI provider', () => {
23
+ const provider = createProvider({
24
+ provider: 'openai',
25
+ model: 'gpt-4o',
26
+ apiKey: 'test-key',
27
+ });
28
+ expect(provider.provider).toBe('openai');
29
+ expect(provider.model).toBe('gpt-4o');
30
+ expect(provider.languageModel).toBeDefined();
31
+ });
32
+ it('creates a Google provider', () => {
33
+ const provider = createProvider({
34
+ provider: 'google',
35
+ model: 'gemini-2.5-flash',
36
+ apiKey: 'test-key',
37
+ });
38
+ expect(provider.provider).toBe('google');
39
+ expect(provider.model).toBe('gemini-2.5-flash');
40
+ expect(provider.languageModel).toBeDefined();
41
+ });
42
+ it('creates an OpenAI-compatible provider for known providers', () => {
43
+ const providers = [
44
+ { provider: 'deepseek', model: 'deepseek-chat', apiKey: 'test-key' },
45
+ { provider: 'groq', model: 'llama-3.1-70b', apiKey: 'test-key' },
46
+ { provider: 'mistral', model: 'mistral-large', apiKey: 'test-key' },
47
+ { provider: 'xai', model: 'grok-3', apiKey: 'test-key' },
48
+ ];
49
+ for (const config of providers) {
50
+ const provider = createProvider(config);
51
+ expect(provider.provider).toBe(config.provider);
52
+ expect(provider.model).toBe(config.model);
53
+ expect(provider.languageModel).toBeDefined();
54
+ }
55
+ });
56
+ it('creates a custom OpenAI-compatible provider with baseUrl', () => {
57
+ const provider = createProvider({
58
+ provider: 'custom-llm',
59
+ model: 'my-model',
60
+ apiKey: 'test-key',
61
+ baseUrl: 'https://my-llm.example.com/v1',
62
+ });
63
+ expect(provider.provider).toBe('custom-llm');
64
+ expect(provider.model).toBe('my-model');
65
+ expect(provider.languageModel).toBeDefined();
66
+ });
67
+ it('throws ConfigError for unknown provider without baseUrl', () => {
68
+ expect(() => createProvider({
69
+ provider: 'unknown-provider',
70
+ model: 'some-model',
71
+ apiKey: 'test-key',
72
+ })).toThrow(ConfigError);
73
+ });
74
+ it('supports baseUrl override for known providers', () => {
75
+ const provider = createProvider({
76
+ provider: 'anthropic',
77
+ model: 'claude-sonnet-4-20250514',
78
+ apiKey: 'test-key',
79
+ baseUrl: 'https://proxy.example.com/anthropic',
80
+ });
81
+ expect(provider.provider).toBe('anthropic');
82
+ expect(provider.languageModel).toBeDefined();
83
+ });
84
+ it('satisfies LLMProvider interface', () => {
85
+ const provider = createProvider({
86
+ provider: 'anthropic',
87
+ model: 'claude-sonnet-4-20250514',
88
+ apiKey: 'test-key',
89
+ });
90
+ // Type-level check: assignable to LLMProvider
91
+ const _check = provider;
92
+ expect(_check).toBeDefined();
93
+ });
94
+ });
95
+ //# sourceMappingURL=create-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-provider.test.js","sourceRoot":"","sources":["../../../src/providers/create-provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Provider failover chain.
8
+ *
9
+ * Tries each provider in sequence. On failure, logs the error and moves
10
+ * to the next provider. No retries or backoff within a single provider —
11
+ * the chain itself IS the retry strategy. If you want retries on the
12
+ * primary, put the same provider config twice in the chain.
13
+ *
14
+ * All providers exhausted → throws ProviderError with context about
15
+ * every attempt.
16
+ */
17
+ import type { Logger } from '@amodalai/core';
18
+ import type { LLMProvider, ProviderConfig } from './types.js';
19
+ export interface FailoverChainConfig {
20
+ /** Primary provider (always first in the chain) */
21
+ primary: ProviderConfig;
22
+ /** Fallback providers, tried in order after primary fails */
23
+ fallbacks?: ProviderConfig[];
24
+ /** Logger for structured events */
25
+ logger: Logger;
26
+ /** Session ID for log context */
27
+ sessionId?: string;
28
+ }
29
+ /**
30
+ * Create an LLMProvider that tries a chain of providers in order.
31
+ *
32
+ * For generateText: tries each provider sequentially until one succeeds.
33
+ * For streamText: wraps the fullStream so that if a provider's stream
34
+ * fails before yielding any events, the next provider is tried. Once
35
+ * events have been yielded, mid-stream errors propagate (can't restart
36
+ * a partial stream).
37
+ */
38
+ export declare function createFailoverProvider(config: FailoverChainConfig): LLMProvider;