@chances-ai/engine 24.0.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 (389) hide show
  1. package/dist/agents/discover.d.ts +30 -0
  2. package/dist/agents/discover.d.ts.map +1 -0
  3. package/dist/agents/discover.js +183 -0
  4. package/dist/agents/discover.js.map +1 -0
  5. package/dist/agents/index.d.ts +20 -0
  6. package/dist/agents/index.d.ts.map +1 -0
  7. package/dist/agents/index.js +52 -0
  8. package/dist/agents/index.js.map +1 -0
  9. package/dist/agents/parse.d.ts +61 -0
  10. package/dist/agents/parse.d.ts.map +1 -0
  11. package/dist/agents/parse.js +527 -0
  12. package/dist/agents/parse.js.map +1 -0
  13. package/dist/agents/types.d.ts +52 -0
  14. package/dist/agents/types.d.ts.map +1 -0
  15. package/dist/agents/types.js +8 -0
  16. package/dist/agents/types.js.map +1 -0
  17. package/dist/ai/adapters/ai-sdk-stream.d.ts +19 -0
  18. package/dist/ai/adapters/ai-sdk-stream.d.ts.map +1 -0
  19. package/dist/ai/adapters/ai-sdk-stream.js +125 -0
  20. package/dist/ai/adapters/ai-sdk-stream.js.map +1 -0
  21. package/dist/ai/adapters/ai-sdk.d.ts +56 -0
  22. package/dist/ai/adapters/ai-sdk.d.ts.map +1 -0
  23. package/dist/ai/adapters/ai-sdk.js +112 -0
  24. package/dist/ai/adapters/ai-sdk.js.map +1 -0
  25. package/dist/ai/adapters/mock.d.ts +13 -0
  26. package/dist/ai/adapters/mock.d.ts.map +1 -0
  27. package/dist/ai/adapters/mock.js +54 -0
  28. package/dist/ai/adapters/mock.js.map +1 -0
  29. package/dist/ai/adapters/openai-compatible.d.ts +23 -0
  30. package/dist/ai/adapters/openai-compatible.d.ts.map +1 -0
  31. package/dist/ai/adapters/openai-compatible.js +45 -0
  32. package/dist/ai/adapters/openai-compatible.js.map +1 -0
  33. package/dist/ai/cost.d.ts +3 -0
  34. package/dist/ai/cost.d.ts.map +1 -0
  35. package/dist/ai/cost.js +5 -0
  36. package/dist/ai/cost.js.map +1 -0
  37. package/dist/ai/index.d.ts +12 -0
  38. package/dist/ai/index.d.ts.map +1 -0
  39. package/dist/ai/index.js +11 -0
  40. package/dist/ai/index.js.map +1 -0
  41. package/dist/ai/known-models.d.ts +20 -0
  42. package/dist/ai/known-models.d.ts.map +1 -0
  43. package/dist/ai/known-models.js +129 -0
  44. package/dist/ai/known-models.js.map +1 -0
  45. package/dist/ai/registry.d.ts +12 -0
  46. package/dist/ai/registry.d.ts.map +1 -0
  47. package/dist/ai/registry.js +24 -0
  48. package/dist/ai/registry.js.map +1 -0
  49. package/dist/ai/retry.d.ts +11 -0
  50. package/dist/ai/retry.d.ts.map +1 -0
  51. package/dist/ai/retry.js +14 -0
  52. package/dist/ai/retry.js.map +1 -0
  53. package/dist/ai/router.d.ts +25 -0
  54. package/dist/ai/router.d.ts.map +1 -0
  55. package/dist/ai/router.js +36 -0
  56. package/dist/ai/router.js.map +1 -0
  57. package/dist/ai/setup.d.ts +23 -0
  58. package/dist/ai/setup.d.ts.map +1 -0
  59. package/dist/ai/setup.js +47 -0
  60. package/dist/ai/setup.js.map +1 -0
  61. package/dist/ai/summarizer.d.ts +24 -0
  62. package/dist/ai/summarizer.d.ts.map +1 -0
  63. package/dist/ai/summarizer.js +56 -0
  64. package/dist/ai/summarizer.js.map +1 -0
  65. package/dist/ai/types.d.ts +83 -0
  66. package/dist/ai/types.d.ts.map +1 -0
  67. package/dist/ai/types.js +2 -0
  68. package/dist/ai/types.js.map +1 -0
  69. package/dist/core/compaction/circuit-breaker.d.ts +32 -0
  70. package/dist/core/compaction/circuit-breaker.d.ts.map +1 -0
  71. package/dist/core/compaction/circuit-breaker.js +42 -0
  72. package/dist/core/compaction/circuit-breaker.js.map +1 -0
  73. package/dist/core/compaction/compactor.d.ts +75 -0
  74. package/dist/core/compaction/compactor.d.ts.map +1 -0
  75. package/dist/core/compaction/compactor.js +261 -0
  76. package/dist/core/compaction/compactor.js.map +1 -0
  77. package/dist/core/compaction/estimate.d.ts +39 -0
  78. package/dist/core/compaction/estimate.d.ts.map +1 -0
  79. package/dist/core/compaction/estimate.js +74 -0
  80. package/dist/core/compaction/estimate.js.map +1 -0
  81. package/dist/core/compaction/index.d.ts +5 -0
  82. package/dist/core/compaction/index.d.ts.map +1 -0
  83. package/dist/core/compaction/index.js +5 -0
  84. package/dist/core/compaction/index.js.map +1 -0
  85. package/dist/core/compaction/prune.d.ts +43 -0
  86. package/dist/core/compaction/prune.d.ts.map +1 -0
  87. package/dist/core/compaction/prune.js +51 -0
  88. package/dist/core/compaction/prune.js.map +1 -0
  89. package/dist/core/engine.d.ts +268 -0
  90. package/dist/core/engine.d.ts.map +1 -0
  91. package/dist/core/engine.js +767 -0
  92. package/dist/core/engine.js.map +1 -0
  93. package/dist/core/index.d.ts +6 -0
  94. package/dist/core/index.d.ts.map +1 -0
  95. package/dist/core/index.js +6 -0
  96. package/dist/core/index.js.map +1 -0
  97. package/dist/core/task-tool.d.ts +175 -0
  98. package/dist/core/task-tool.d.ts.map +1 -0
  99. package/dist/core/task-tool.js +901 -0
  100. package/dist/core/task-tool.js.map +1 -0
  101. package/dist/core/workspace-query.d.ts +83 -0
  102. package/dist/core/workspace-query.d.ts.map +1 -0
  103. package/dist/core/workspace-query.js +217 -0
  104. package/dist/core/workspace-query.js.map +1 -0
  105. package/dist/core/worktree/active-marker.d.ts +31 -0
  106. package/dist/core/worktree/active-marker.d.ts.map +1 -0
  107. package/dist/core/worktree/active-marker.js +109 -0
  108. package/dist/core/worktree/active-marker.js.map +1 -0
  109. package/dist/core/worktree/create.d.ts +40 -0
  110. package/dist/core/worktree/create.d.ts.map +1 -0
  111. package/dist/core/worktree/create.js +121 -0
  112. package/dist/core/worktree/create.js.map +1 -0
  113. package/dist/core/worktree/errors.d.ts +7 -0
  114. package/dist/core/worktree/errors.d.ts.map +1 -0
  115. package/dist/core/worktree/errors.js +11 -0
  116. package/dist/core/worktree/errors.js.map +1 -0
  117. package/dist/core/worktree/gc.d.ts +39 -0
  118. package/dist/core/worktree/gc.d.ts.map +1 -0
  119. package/dist/core/worktree/gc.js +146 -0
  120. package/dist/core/worktree/gc.js.map +1 -0
  121. package/dist/core/worktree/git.d.ts +53 -0
  122. package/dist/core/worktree/git.d.ts.map +1 -0
  123. package/dist/core/worktree/git.js +166 -0
  124. package/dist/core/worktree/git.js.map +1 -0
  125. package/dist/core/worktree/index.d.ts +8 -0
  126. package/dist/core/worktree/index.d.ts.map +1 -0
  127. package/dist/core/worktree/index.js +8 -0
  128. package/dist/core/worktree/index.js.map +1 -0
  129. package/dist/core/worktree/paths.d.ts +26 -0
  130. package/dist/core/worktree/paths.d.ts.map +1 -0
  131. package/dist/core/worktree/paths.js +57 -0
  132. package/dist/core/worktree/paths.js.map +1 -0
  133. package/dist/core/worktree/slug.d.ts +6 -0
  134. package/dist/core/worktree/slug.d.ts.map +1 -0
  135. package/dist/core/worktree/slug.js +21 -0
  136. package/dist/core/worktree/slug.js.map +1 -0
  137. package/dist/local-vault/file-store.d.ts +64 -0
  138. package/dist/local-vault/file-store.d.ts.map +1 -0
  139. package/dist/local-vault/file-store.js +225 -0
  140. package/dist/local-vault/file-store.js.map +1 -0
  141. package/dist/local-vault/index.d.ts +57 -0
  142. package/dist/local-vault/index.d.ts.map +1 -0
  143. package/dist/local-vault/index.js +68 -0
  144. package/dist/local-vault/index.js.map +1 -0
  145. package/dist/local-vault/keychain.d.ts +58 -0
  146. package/dist/local-vault/keychain.d.ts.map +1 -0
  147. package/dist/local-vault/keychain.js +200 -0
  148. package/dist/local-vault/keychain.js.map +1 -0
  149. package/dist/local-vault/mutex.d.ts +20 -0
  150. package/dist/local-vault/mutex.d.ts.map +1 -0
  151. package/dist/local-vault/mutex.js +44 -0
  152. package/dist/local-vault/mutex.js.map +1 -0
  153. package/dist/local-vault/passphrase.d.ts +30 -0
  154. package/dist/local-vault/passphrase.d.ts.map +1 -0
  155. package/dist/local-vault/passphrase.js +72 -0
  156. package/dist/local-vault/passphrase.js.map +1 -0
  157. package/dist/lsp/config.d.ts +34 -0
  158. package/dist/lsp/config.d.ts.map +1 -0
  159. package/dist/lsp/config.js +68 -0
  160. package/dist/lsp/config.js.map +1 -0
  161. package/dist/lsp/detect.d.ts +7 -0
  162. package/dist/lsp/detect.d.ts.map +1 -0
  163. package/dist/lsp/detect.js +78 -0
  164. package/dist/lsp/detect.js.map +1 -0
  165. package/dist/lsp/errors.d.ts +11 -0
  166. package/dist/lsp/errors.d.ts.map +1 -0
  167. package/dist/lsp/errors.js +11 -0
  168. package/dist/lsp/errors.js.map +1 -0
  169. package/dist/lsp/formatters.d.ts +147 -0
  170. package/dist/lsp/formatters.d.ts.map +1 -0
  171. package/dist/lsp/formatters.js +259 -0
  172. package/dist/lsp/formatters.js.map +1 -0
  173. package/dist/lsp/index.d.ts +31 -0
  174. package/dist/lsp/index.d.ts.map +1 -0
  175. package/dist/lsp/index.js +31 -0
  176. package/dist/lsp/index.js.map +1 -0
  177. package/dist/lsp/instance.d.ts +72 -0
  178. package/dist/lsp/instance.d.ts.map +1 -0
  179. package/dist/lsp/instance.js +489 -0
  180. package/dist/lsp/instance.js.map +1 -0
  181. package/dist/lsp/lazy-load.d.ts +27 -0
  182. package/dist/lsp/lazy-load.d.ts.map +1 -0
  183. package/dist/lsp/lazy-load.js +57 -0
  184. package/dist/lsp/lazy-load.js.map +1 -0
  185. package/dist/lsp/manager.d.ts +59 -0
  186. package/dist/lsp/manager.d.ts.map +1 -0
  187. package/dist/lsp/manager.js +242 -0
  188. package/dist/lsp/manager.js.map +1 -0
  189. package/dist/lsp/ops.d.ts +13 -0
  190. package/dist/lsp/ops.d.ts.map +1 -0
  191. package/dist/lsp/ops.js +225 -0
  192. package/dist/lsp/ops.js.map +1 -0
  193. package/dist/lsp/rpc.d.ts +47 -0
  194. package/dist/lsp/rpc.d.ts.map +1 -0
  195. package/dist/lsp/rpc.js +134 -0
  196. package/dist/lsp/rpc.js.map +1 -0
  197. package/dist/lsp/safe-uri.d.ts +18 -0
  198. package/dist/lsp/safe-uri.d.ts.map +1 -0
  199. package/dist/lsp/safe-uri.js +96 -0
  200. package/dist/lsp/safe-uri.js.map +1 -0
  201. package/dist/lsp/types.d.ts +70 -0
  202. package/dist/lsp/types.d.ts.map +1 -0
  203. package/dist/lsp/types.js +16 -0
  204. package/dist/lsp/types.js.map +1 -0
  205. package/dist/mcp/bridge.d.ts +57 -0
  206. package/dist/mcp/bridge.d.ts.map +1 -0
  207. package/dist/mcp/bridge.js +98 -0
  208. package/dist/mcp/bridge.js.map +1 -0
  209. package/dist/mcp/category.d.ts +22 -0
  210. package/dist/mcp/category.d.ts.map +1 -0
  211. package/dist/mcp/category.js +11 -0
  212. package/dist/mcp/category.js.map +1 -0
  213. package/dist/mcp/client.d.ts +228 -0
  214. package/dist/mcp/client.d.ts.map +1 -0
  215. package/dist/mcp/client.js +352 -0
  216. package/dist/mcp/client.js.map +1 -0
  217. package/dist/mcp/content.d.ts +86 -0
  218. package/dist/mcp/content.d.ts.map +1 -0
  219. package/dist/mcp/content.js +147 -0
  220. package/dist/mcp/content.js.map +1 -0
  221. package/dist/mcp/env.d.ts +19 -0
  222. package/dist/mcp/env.d.ts.map +1 -0
  223. package/dist/mcp/env.js +50 -0
  224. package/dist/mcp/env.js.map +1 -0
  225. package/dist/mcp/host.d.ts +199 -0
  226. package/dist/mcp/host.d.ts.map +1 -0
  227. package/dist/mcp/host.js +530 -0
  228. package/dist/mcp/host.js.map +1 -0
  229. package/dist/mcp/index.d.ts +18 -0
  230. package/dist/mcp/index.d.ts.map +1 -0
  231. package/dist/mcp/index.js +17 -0
  232. package/dist/mcp/index.js.map +1 -0
  233. package/dist/mcp/load-mcp-host.d.ts +32 -0
  234. package/dist/mcp/load-mcp-host.d.ts.map +1 -0
  235. package/dist/mcp/load-mcp-host.js +49 -0
  236. package/dist/mcp/load-mcp-host.js.map +1 -0
  237. package/dist/mcp/oauth/callback-server.d.ts +73 -0
  238. package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
  239. package/dist/mcp/oauth/callback-server.js +280 -0
  240. package/dist/mcp/oauth/callback-server.js.map +1 -0
  241. package/dist/mcp/oauth/config-hash.d.ts +24 -0
  242. package/dist/mcp/oauth/config-hash.d.ts.map +1 -0
  243. package/dist/mcp/oauth/config-hash.js +55 -0
  244. package/dist/mcp/oauth/config-hash.js.map +1 -0
  245. package/dist/mcp/oauth/error-normalize.d.ts +39 -0
  246. package/dist/mcp/oauth/error-normalize.d.ts.map +1 -0
  247. package/dist/mcp/oauth/error-normalize.js +91 -0
  248. package/dist/mcp/oauth/error-normalize.js.map +1 -0
  249. package/dist/mcp/oauth/provider.d.ts +190 -0
  250. package/dist/mcp/oauth/provider.d.ts.map +1 -0
  251. package/dist/mcp/oauth/provider.js +305 -0
  252. package/dist/mcp/oauth/provider.js.map +1 -0
  253. package/dist/mcp/oauth/refresh-coalescer.d.ts +46 -0
  254. package/dist/mcp/oauth/refresh-coalescer.d.ts.map +1 -0
  255. package/dist/mcp/oauth/refresh-coalescer.js +77 -0
  256. package/dist/mcp/oauth/refresh-coalescer.js.map +1 -0
  257. package/dist/mcp/oauth/sdk-shapes.d.ts +77 -0
  258. package/dist/mcp/oauth/sdk-shapes.d.ts.map +1 -0
  259. package/dist/mcp/oauth/sdk-shapes.js +21 -0
  260. package/dist/mcp/oauth/sdk-shapes.js.map +1 -0
  261. package/dist/mcp/parse.d.ts +28 -0
  262. package/dist/mcp/parse.d.ts.map +1 -0
  263. package/dist/mcp/parse.js +209 -0
  264. package/dist/mcp/parse.js.map +1 -0
  265. package/dist/mcp/prompts.d.ts +31 -0
  266. package/dist/mcp/prompts.d.ts.map +1 -0
  267. package/dist/mcp/prompts.js +71 -0
  268. package/dist/mcp/prompts.js.map +1 -0
  269. package/dist/mcp/redact.d.ts +62 -0
  270. package/dist/mcp/redact.d.ts.map +1 -0
  271. package/dist/mcp/redact.js +87 -0
  272. package/dist/mcp/redact.js.map +1 -0
  273. package/dist/mcp/resources.d.ts +70 -0
  274. package/dist/mcp/resources.d.ts.map +1 -0
  275. package/dist/mcp/resources.js +170 -0
  276. package/dist/mcp/resources.js.map +1 -0
  277. package/dist/mcp/types.d.ts +123 -0
  278. package/dist/mcp/types.d.ts.map +1 -0
  279. package/dist/mcp/types.js +2 -0
  280. package/dist/mcp/types.js.map +1 -0
  281. package/dist/memory/frontmatter.d.ts +18 -0
  282. package/dist/memory/frontmatter.d.ts.map +1 -0
  283. package/dist/memory/frontmatter.js +81 -0
  284. package/dist/memory/frontmatter.js.map +1 -0
  285. package/dist/memory/index.d.ts +5 -0
  286. package/dist/memory/index.d.ts.map +1 -0
  287. package/dist/memory/index.js +5 -0
  288. package/dist/memory/index.js.map +1 -0
  289. package/dist/memory/store.d.ts +44 -0
  290. package/dist/memory/store.d.ts.map +1 -0
  291. package/dist/memory/store.js +237 -0
  292. package/dist/memory/store.js.map +1 -0
  293. package/dist/memory/tools.d.ts +11 -0
  294. package/dist/memory/tools.d.ts.map +1 -0
  295. package/dist/memory/tools.js +159 -0
  296. package/dist/memory/tools.js.map +1 -0
  297. package/dist/memory/types.d.ts +32 -0
  298. package/dist/memory/types.d.ts.map +1 -0
  299. package/dist/memory/types.js +20 -0
  300. package/dist/memory/types.js.map +1 -0
  301. package/dist/plugin-api/index.d.ts +167 -0
  302. package/dist/plugin-api/index.d.ts.map +1 -0
  303. package/dist/plugin-api/index.js +151 -0
  304. package/dist/plugin-api/index.js.map +1 -0
  305. package/dist/plugin-logger/index.d.ts +21 -0
  306. package/dist/plugin-logger/index.d.ts.map +1 -0
  307. package/dist/plugin-logger/index.js +59 -0
  308. package/dist/plugin-logger/index.js.map +1 -0
  309. package/dist/session/index.d.ts +125 -0
  310. package/dist/session/index.d.ts.map +1 -0
  311. package/dist/session/index.js +202 -0
  312. package/dist/session/index.js.map +1 -0
  313. package/dist/tools/approval.d.ts +33 -0
  314. package/dist/tools/approval.d.ts.map +1 -0
  315. package/dist/tools/approval.js +53 -0
  316. package/dist/tools/approval.js.map +1 -0
  317. package/dist/tools/builtins/_shared.d.ts +94 -0
  318. package/dist/tools/builtins/_shared.d.ts.map +1 -0
  319. package/dist/tools/builtins/_shared.js +246 -0
  320. package/dist/tools/builtins/_shared.js.map +1 -0
  321. package/dist/tools/builtins/ask-user-question.d.ts +27 -0
  322. package/dist/tools/builtins/ask-user-question.d.ts.map +1 -0
  323. package/dist/tools/builtins/ask-user-question.js +191 -0
  324. package/dist/tools/builtins/ask-user-question.js.map +1 -0
  325. package/dist/tools/builtins/bash.d.ts +3 -0
  326. package/dist/tools/builtins/bash.d.ts.map +1 -0
  327. package/dist/tools/builtins/bash.js +158 -0
  328. package/dist/tools/builtins/bash.js.map +1 -0
  329. package/dist/tools/builtins/diff.d.ts +3 -0
  330. package/dist/tools/builtins/diff.d.ts.map +1 -0
  331. package/dist/tools/builtins/diff.js +83 -0
  332. package/dist/tools/builtins/diff.js.map +1 -0
  333. package/dist/tools/builtins/edit.d.ts +3 -0
  334. package/dist/tools/builtins/edit.d.ts.map +1 -0
  335. package/dist/tools/builtins/edit.js +40 -0
  336. package/dist/tools/builtins/edit.js.map +1 -0
  337. package/dist/tools/builtins/glob.d.ts +3 -0
  338. package/dist/tools/builtins/glob.d.ts.map +1 -0
  339. package/dist/tools/builtins/glob.js +37 -0
  340. package/dist/tools/builtins/glob.js.map +1 -0
  341. package/dist/tools/builtins/grep.d.ts +3 -0
  342. package/dist/tools/builtins/grep.d.ts.map +1 -0
  343. package/dist/tools/builtins/grep.js +81 -0
  344. package/dist/tools/builtins/grep.js.map +1 -0
  345. package/dist/tools/builtins/lsp.d.ts +3 -0
  346. package/dist/tools/builtins/lsp.d.ts.map +1 -0
  347. package/dist/tools/builtins/lsp.js +102 -0
  348. package/dist/tools/builtins/lsp.js.map +1 -0
  349. package/dist/tools/builtins/pty.d.ts +64 -0
  350. package/dist/tools/builtins/pty.d.ts.map +1 -0
  351. package/dist/tools/builtins/pty.js +536 -0
  352. package/dist/tools/builtins/pty.js.map +1 -0
  353. package/dist/tools/builtins/read.d.ts +3 -0
  354. package/dist/tools/builtins/read.d.ts.map +1 -0
  355. package/dist/tools/builtins/read.js +18 -0
  356. package/dist/tools/builtins/read.js.map +1 -0
  357. package/dist/tools/builtins/web-fetch.d.ts +4 -0
  358. package/dist/tools/builtins/web-fetch.d.ts.map +1 -0
  359. package/dist/tools/builtins/web-fetch.js +353 -0
  360. package/dist/tools/builtins/web-fetch.js.map +1 -0
  361. package/dist/tools/builtins/write.d.ts +3 -0
  362. package/dist/tools/builtins/write.d.ts.map +1 -0
  363. package/dist/tools/builtins/write.js +48 -0
  364. package/dist/tools/builtins/write.js.map +1 -0
  365. package/dist/tools/builtins.d.ts +9 -0
  366. package/dist/tools/builtins.d.ts.map +1 -0
  367. package/dist/tools/builtins.js +29 -0
  368. package/dist/tools/builtins.js.map +1 -0
  369. package/dist/tools/diff.d.ts +18 -0
  370. package/dist/tools/diff.d.ts.map +1 -0
  371. package/dist/tools/diff.js +57 -0
  372. package/dist/tools/diff.js.map +1 -0
  373. package/dist/tools/index.d.ts +10 -0
  374. package/dist/tools/index.d.ts.map +1 -0
  375. package/dist/tools/index.js +9 -0
  376. package/dist/tools/index.js.map +1 -0
  377. package/dist/tools/permission.d.ts +120 -0
  378. package/dist/tools/permission.d.ts.map +1 -0
  379. package/dist/tools/permission.js +208 -0
  380. package/dist/tools/permission.js.map +1 -0
  381. package/dist/tools/registry.d.ts +12 -0
  382. package/dist/tools/registry.d.ts.map +1 -0
  383. package/dist/tools/registry.js +19 -0
  384. package/dist/tools/registry.js.map +1 -0
  385. package/dist/tools/types.d.ts +244 -0
  386. package/dist/tools/types.d.ts.map +1 -0
  387. package/dist/tools/types.js +15 -0
  388. package/dist/tools/types.js.map +1 -0
  389. package/package.json +109 -0
@@ -0,0 +1,129 @@
1
+ export const KNOWN_MODELS = [
2
+ {
3
+ id: "anthropic",
4
+ api: "anthropic",
5
+ envKey: "ANTHROPIC_API_KEY",
6
+ models: [
7
+ m("claude-opus-4-7", "anthropic", "anthropic", 200_000, 15, 75, true, true),
8
+ m("claude-sonnet-4-6", "anthropic", "anthropic", 200_000, 3, 15, true, true),
9
+ m("claude-haiku-4-5", "anthropic", "anthropic", 200_000, 0.8, 4, true, false),
10
+ ],
11
+ },
12
+ {
13
+ id: "openai",
14
+ api: "openai",
15
+ envKey: "OPENAI_API_KEY",
16
+ models: [
17
+ m("gpt-4o", "openai", "openai", 128_000, 2.5, 10, true, true),
18
+ m("gpt-4o-mini", "openai", "openai", 128_000, 0.15, 0.6, true, false),
19
+ ],
20
+ },
21
+ {
22
+ id: "google",
23
+ api: "google",
24
+ envKey: "GOOGLE_GENERATIVE_AI_API_KEY",
25
+ models: [
26
+ m("gemini-2.0-flash", "google", "google", 1_048_576, 0.1, 0.4, true, true),
27
+ m("gemini-1.5-pro", "google", "google", 2_097_152, 1.25, 5, true, true),
28
+ ],
29
+ },
30
+ {
31
+ id: "xai",
32
+ api: "openai-compatible",
33
+ envKey: "XAI_API_KEY",
34
+ baseURL: "https://api.x.ai/v1",
35
+ models: [m("grok-2-latest", "xai", "openai-compatible", 131_072, 2, 10, true, false)],
36
+ },
37
+ {
38
+ id: "groq",
39
+ api: "openai-compatible",
40
+ envKey: "GROQ_API_KEY",
41
+ baseURL: "https://api.groq.com/openai/v1",
42
+ models: [
43
+ m("llama-3.3-70b-versatile", "groq", "openai-compatible", 131_072, 0.59, 0.79, true, false),
44
+ ],
45
+ },
46
+ {
47
+ id: "openrouter",
48
+ api: "openai-compatible",
49
+ envKey: "OPENROUTER_API_KEY",
50
+ baseURL: "https://openrouter.ai/api/v1",
51
+ // openrouter is a passthrough router — supportsTools depends on the
52
+ // underlying model. `openrouter/auto` picks per-request from openrouter's
53
+ // routing logic, so we cannot promise tool support and leave it `false`
54
+ // — the router will skip it for tool-required turns. Slug-specific
55
+ // models (like the claude-3.5 entry below) declare their real capability.
56
+ models: [
57
+ m("openrouter/auto", "openrouter", "openai-compatible", 200_000, 0, 0, false, false),
58
+ m("anthropic/claude-3.5-sonnet", "openrouter", "openai-compatible", 200_000, 3, 15, true, true),
59
+ ],
60
+ },
61
+ {
62
+ id: "deepseek",
63
+ api: "openai-compatible",
64
+ envKey: "DEEPSEEK_API_KEY",
65
+ baseURL: "https://api.deepseek.com",
66
+ models: [
67
+ m("deepseek-chat", "deepseek", "openai-compatible", 65_536, 0.27, 1.1, true, false),
68
+ m("deepseek-reasoner", "deepseek", "openai-compatible", 65_536, 0.55, 2.19, true, false),
69
+ ],
70
+ },
71
+ {
72
+ id: "doubao",
73
+ api: "openai-compatible",
74
+ envKey: "ARK_API_KEY",
75
+ baseURL: "https://ark.cn-beijing.volces.com/api/v3",
76
+ // Doubao 1.5 pro 32k supports function-calling; pricing is the public
77
+ // Volcengine ark list as of integration time and should be re-verified.
78
+ models: [
79
+ m("doubao-1-5-pro-32k", "doubao", "openai-compatible", 32_768, 0.11, 0.27, true, false),
80
+ m("doubao-1-5-pro-256k", "doubao", "openai-compatible", 262_144, 0.69, 1.37, true, false),
81
+ ],
82
+ },
83
+ {
84
+ id: "minimax",
85
+ api: "openai-compatible",
86
+ envKey: "MINIMAX_API_KEY",
87
+ baseURL: "https://api.minimax.chat/v1",
88
+ // Tool-use on MiniMax abab-6.5s is supported via OpenAI-compat function
89
+ // calling; older abab variants are not. Stick to the modern model.
90
+ models: [
91
+ m("abab6.5s-chat", "minimax", "openai-compatible", 245_760, 0.14, 0.14, true, false),
92
+ ],
93
+ },
94
+ {
95
+ id: "glm",
96
+ api: "openai-compatible",
97
+ envKey: "ZHIPUAI_API_KEY",
98
+ baseURL: "https://open.bigmodel.cn/api/paas/v4",
99
+ models: [
100
+ m("glm-4-plus", "glm", "openai-compatible", 131_072, 0.69, 0.69, true, false),
101
+ m("glm-4-flash", "glm", "openai-compatible", 131_072, 0, 0, true, false),
102
+ ],
103
+ },
104
+ {
105
+ id: "kimi",
106
+ api: "openai-compatible",
107
+ envKey: "MOONSHOT_API_KEY",
108
+ baseURL: "https://api.moonshot.cn/v1",
109
+ // Moonshot v1 supports function calling on 8k/32k/128k tiers. Older
110
+ // models did not — verify per-model before adding here.
111
+ models: [
112
+ m("moonshot-v1-32k", "kimi", "openai-compatible", 32_768, 3.42, 3.42, true, false),
113
+ m("moonshot-v1-128k", "kimi", "openai-compatible", 131_072, 8.22, 8.22, true, false),
114
+ ],
115
+ },
116
+ ];
117
+ function m(id, provider, api, contextWindow, inputCostPerMTok, outputCostPerMTok, supportsTools, supportsVision) {
118
+ return {
119
+ id,
120
+ provider,
121
+ api,
122
+ contextWindow,
123
+ supportsTools,
124
+ supportsVision,
125
+ inputCostPerMTok,
126
+ outputCostPerMTok,
127
+ };
128
+ }
129
+ //# sourceMappingURL=known-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-models.js","sourceRoot":"","sources":["../../src/ai/known-models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ModelDescriptor, ProviderAdapter } from "./types.js";
2
+ /** Registry pattern: aggregates the models every loaded adapter advertises. */
3
+ export declare class ModelRegistry {
4
+ private readonly models;
5
+ private readonly adapters;
6
+ register(adapter: ProviderAdapter): void;
7
+ adapterFor(modelId: string): ProviderAdapter | undefined;
8
+ get(modelId: string): ModelDescriptor | undefined;
9
+ all(): ModelDescriptor[];
10
+ providers(): string[];
11
+ }
12
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/ai/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnE,+EAA+E;AAC/E,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAE/D,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAKxC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAKxD,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIjD,GAAG,IAAI,eAAe,EAAE;IAIxB,SAAS,IAAI,MAAM,EAAE;CAGtB"}
@@ -0,0 +1,24 @@
1
+ /** Registry pattern: aggregates the models every loaded adapter advertises. */
2
+ export class ModelRegistry {
3
+ models = new Map();
4
+ adapters = new Map();
5
+ register(adapter) {
6
+ this.adapters.set(adapter.id, adapter);
7
+ for (const model of adapter.listModels())
8
+ this.models.set(model.id, model);
9
+ }
10
+ adapterFor(modelId) {
11
+ const model = this.models.get(modelId);
12
+ return model ? this.adapters.get(model.provider) : undefined;
13
+ }
14
+ get(modelId) {
15
+ return this.models.get(modelId);
16
+ }
17
+ all() {
18
+ return [...this.models.values()];
19
+ }
20
+ providers() {
21
+ return [...this.adapters.keys()];
22
+ }
23
+ }
24
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/ai/registry.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,OAAO,aAAa;IACP,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC5C,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE/D,QAAQ,CAAC,OAAwB;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7E,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export interface RetryDecision {
2
+ retryable: boolean;
3
+ reason: "rate-limit" | "server-5xx" | "network" | "non-retryable";
4
+ }
5
+ export declare function classifyProviderError(message: string): RetryDecision;
6
+ export interface RetryConfig {
7
+ /** Backoff before each retry attempt, in ms. Length caps the retry count. */
8
+ delaysMs: readonly number[];
9
+ }
10
+ export declare const defaultRetryConfig: RetryConfig;
11
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/ai/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,eAAe,CAAC;CACnE;AAMD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAKpE;AAED,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED,eAAO,MAAM,kBAAkB,EAAE,WAA6C,CAAC"}
@@ -0,0 +1,14 @@
1
+ const RATE_LIMIT_RX = /(rate.?limit|\b429\b|too\s+many\s+requests|throttl|quota\s+exceed)/i;
2
+ const SERVER_5XX_RX = /(\b5\d\d\b|service\s+unavailable|gateway\s+timeout|internal\s+server\s+error|bad\s+gateway|overloaded_error|model\s+is\s+overloaded)/i;
3
+ const NETWORK_RX = /(econnreset|econnrefused|etimedout|enotfound|socket\s+hang\s+up|connection\s+refused|network\s+error|fetch\s+failed|deadline\s+exceeded)/i;
4
+ export function classifyProviderError(message) {
5
+ if (RATE_LIMIT_RX.test(message))
6
+ return { retryable: true, reason: "rate-limit" };
7
+ if (SERVER_5XX_RX.test(message))
8
+ return { retryable: true, reason: "server-5xx" };
9
+ if (NETWORK_RX.test(message))
10
+ return { retryable: true, reason: "network" };
11
+ return { retryable: false, reason: "non-retryable" };
12
+ }
13
+ export const defaultRetryConfig = { delaysMs: [500, 1000, 2000] };
14
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/ai/retry.ts"],"names":[],"mappings":"AAKA,MAAM,aAAa,GAAG,qEAAqE,CAAC;AAC5F,MAAM,aAAa,GAAG,uIAAuI,CAAC;AAC9J,MAAM,UAAU,GAAG,2IAA2I,CAAC;AAE/J,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAClF,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAClF,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC5E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;AACvD,CAAC;AAOD,MAAM,CAAC,MAAM,kBAAkB,GAAgB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ModelRegistry } from "./registry.js";
2
+ import type { ModelDescriptor, ProviderAdapter } from "./types.js";
3
+ export interface RouteHints {
4
+ /** Caller's preferred model id (e.g. from config). */
5
+ preferredModel?: string;
6
+ /** Caller's preferred provider id. */
7
+ preferredProvider?: string;
8
+ /** True when the turn may issue tool calls. */
9
+ needsTools?: boolean;
10
+ }
11
+ export interface Route {
12
+ adapter: ProviderAdapter;
13
+ model: ModelDescriptor;
14
+ }
15
+ /**
16
+ * Strategy pattern. 1.x is rule-based: honor an explicit model, else the first
17
+ * model of the preferred provider, else the cheapest tool-capable model.
18
+ * 2.x swaps in profile/policy strategies + fallback chains without touching core.
19
+ */
20
+ export declare class ModelRouter {
21
+ private readonly registry;
22
+ constructor(registry: ModelRegistry);
23
+ pick(hints?: RouteHints): Route;
24
+ }
25
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/ai/router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,aAAa;IAEpD,IAAI,CAAC,KAAK,GAAE,UAAe,GAAG,KAAK;CAyBpC"}
@@ -0,0 +1,36 @@
1
+ import { AppError, ErrorCode } from "@chances-ai/runtime";
2
+ /**
3
+ * Strategy pattern. 1.x is rule-based: honor an explicit model, else the first
4
+ * model of the preferred provider, else the cheapest tool-capable model.
5
+ * 2.x swaps in profile/policy strategies + fallback chains without touching core.
6
+ */
7
+ export class ModelRouter {
8
+ registry;
9
+ constructor(registry) {
10
+ this.registry = registry;
11
+ }
12
+ pick(hints = {}) {
13
+ const candidates = this.registry.all();
14
+ if (candidates.length === 0) {
15
+ throw new AppError(ErrorCode.Provider, "No models registered");
16
+ }
17
+ let model;
18
+ if (hints.preferredModel)
19
+ model = this.registry.get(hints.preferredModel);
20
+ if (!model && hints.preferredProvider) {
21
+ model = candidates.find((m) => m.provider === hints.preferredProvider);
22
+ }
23
+ if (!model) {
24
+ const pool = hints.needsTools ? candidates.filter((m) => m.supportsTools) : candidates;
25
+ model = [...(pool.length ? pool : candidates)].sort((a, b) => a.inputCostPerMTok - b.inputCostPerMTok)[0];
26
+ }
27
+ if (!model)
28
+ throw new AppError(ErrorCode.Provider, "No suitable model found");
29
+ const adapter = this.registry.adapterFor(model.id);
30
+ if (!adapter) {
31
+ throw new AppError(ErrorCode.Provider, `No adapter for model ${model.id}`);
32
+ }
33
+ return { adapter, model };
34
+ }
35
+ }
36
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/ai/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAkB1D;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,QAAuB;QAAvB,aAAQ,GAAR,QAAQ,CAAe;IAAG,CAAC;IAExD,IAAI,CAAC,QAAoB,EAAE;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,KAAkC,CAAC;QACvC,IAAI,KAAK,CAAC,cAAc;YAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YACtC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YACvF,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,CAClD,CAAC,CAAC,CAAC,CAAC;QACP,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;QAE9E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,wBAAwB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ import { type ProviderEntry } from "./known-models.js";
2
+ import { ModelRegistry } from "./registry.js";
3
+ export interface RegistryOptions {
4
+ /** Resolve an API key by provider id (e.g. "deepseek"), or undefined. */
5
+ apiKeyFor: (providerId: string) => string | undefined;
6
+ /** Override KNOWN_MODELS — useful for tests and config-driven setups. */
7
+ providers?: ProviderEntry[];
8
+ }
9
+ /**
10
+ * Composition helper: always register the offline mock, then walk the
11
+ * provider table and register one adapter per provider whose key is set.
12
+ * Dispatch is data-driven by `ProviderEntry.api` — no if/else over provider
13
+ * id in callers, so adding a new OpenAI-compatible vendor is a single entry
14
+ * in {@link KNOWN_MODELS}.
15
+ */
16
+ export declare function buildRegistry(opts: RegistryOptions): ModelRegistry;
17
+ /**
18
+ * Convenience: turn the provider table into the `envByProvider` map that
19
+ * `AuthStore` needs. Used at boot so the env-name list lives in one place
20
+ * (here) rather than being duplicated in `@chances-ai/config`.
21
+ */
22
+ export declare function envByProviderFrom(providers?: ProviderEntry[]): Record<string, string>;
23
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/ai/setup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACtD,yEAAyE;IACzE,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAWlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,aAAa,EAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEnG"}
@@ -0,0 +1,47 @@
1
+ import { AiSdkAdapter } from "./adapters/ai-sdk.js";
2
+ import { MockAdapter } from "./adapters/mock.js";
3
+ import { OpenAICompatibleAdapter } from "./adapters/openai-compatible.js";
4
+ import { KNOWN_MODELS } from "./known-models.js";
5
+ import { ModelRegistry } from "./registry.js";
6
+ /**
7
+ * Composition helper: always register the offline mock, then walk the
8
+ * provider table and register one adapter per provider whose key is set.
9
+ * Dispatch is data-driven by `ProviderEntry.api` — no if/else over provider
10
+ * id in callers, so adding a new OpenAI-compatible vendor is a single entry
11
+ * in {@link KNOWN_MODELS}.
12
+ */
13
+ export function buildRegistry(opts) {
14
+ const registry = new ModelRegistry();
15
+ registry.register(new MockAdapter());
16
+ const providers = opts.providers ?? KNOWN_MODELS;
17
+ for (const entry of providers) {
18
+ const apiKey = opts.apiKeyFor(entry.id);
19
+ if (!apiKey)
20
+ continue;
21
+ registry.register(buildAdapter(entry, apiKey));
22
+ }
23
+ return registry;
24
+ }
25
+ /**
26
+ * Convenience: turn the provider table into the `envByProvider` map that
27
+ * `AuthStore` needs. Used at boot so the env-name list lives in one place
28
+ * (here) rather than being duplicated in `@chances-ai/config`.
29
+ */
30
+ export function envByProviderFrom(providers = KNOWN_MODELS) {
31
+ return Object.fromEntries(providers.map((p) => [p.id, p.envKey]));
32
+ }
33
+ function buildAdapter(entry, apiKey) {
34
+ if (entry.api === "openai-compatible") {
35
+ if (!entry.baseURL) {
36
+ throw new Error(`provider '${entry.id}' is api=openai-compatible but has no baseURL`);
37
+ }
38
+ return new OpenAICompatibleAdapter({
39
+ provider: entry.id,
40
+ baseURL: entry.baseURL,
41
+ apiKey,
42
+ models: entry.models,
43
+ });
44
+ }
45
+ return new AiSdkAdapter({ provider: entry.api, apiKey, models: entry.models });
46
+ }
47
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/ai/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAsB,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAS9C;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAqB;IACjD,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAA6B,YAAY;IACzE,OAAO,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB,EAAE,MAAc;IACxD,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,EAAE,+CAA+C,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,IAAI,uBAAuB,CAAC;YACjC,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM;YACN,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Message, ProviderAdapter } from "./types.js";
2
+ /**
3
+ * System prompt used for `/compact`. Fixed text — no per-call customization
4
+ * yet (3.x.later could let the user pass focus instructions on top). Kept
5
+ * tight on purpose so a 200-turn conversation doesn't blow the summary
6
+ * model's own context with the prompt itself.
7
+ *
8
+ * Modeled on oh-my-pi's compaction prompt structure but stripped of its
9
+ * file/edit/todo metadata sections — those depend on session-tree machinery
10
+ * we don't have. v3.0 ships text-only; the structured fields are a 3.x.later
11
+ * concern when we wire compaction into auto-trigger paths.
12
+ */
13
+ export declare const COMPACT_SUMMARY_SYSTEM: string;
14
+ /**
15
+ * Drives `adapter.stream` to summarize a message history into a single string.
16
+ *
17
+ * Returns the assembled assistant text. Tool calls emitted by the adapter
18
+ * during the summarization stream are ignored — summarization is a single
19
+ * turn that must not branch into more tool work. Any `error` event surfaces
20
+ * as `AppError(Provider)` so the caller can show a useful failure message
21
+ * instead of "Compaction failed: undefined".
22
+ */
23
+ export declare function summarizeConversation(adapter: ProviderAdapter, modelId: string, messages: Message[], signal: AbortSignal): Promise<string>;
24
+ //# sourceMappingURL=summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/ai/summarizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,QASvB,CAAC;AAEb;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
@@ -0,0 +1,56 @@
1
+ import { AppError, ErrorCode } from "@chances-ai/runtime";
2
+ /**
3
+ * System prompt used for `/compact`. Fixed text — no per-call customization
4
+ * yet (3.x.later could let the user pass focus instructions on top). Kept
5
+ * tight on purpose so a 200-turn conversation doesn't blow the summary
6
+ * model's own context with the prompt itself.
7
+ *
8
+ * Modeled on oh-my-pi's compaction prompt structure but stripped of its
9
+ * file/edit/todo metadata sections — those depend on session-tree machinery
10
+ * we don't have. v3.0 ships text-only; the structured fields are a 3.x.later
11
+ * concern when we wire compaction into auto-trigger paths.
12
+ */
13
+ export const COMPACT_SUMMARY_SYSTEM = [
14
+ "You summarize software-engineering conversations.",
15
+ "Output a compact plain-text summary that preserves:",
16
+ "- decisions reached and the rationale behind them,",
17
+ "- file paths that were read, written, or discussed,",
18
+ "- unresolved questions or pending work,",
19
+ "- key error messages or test failures encountered.",
20
+ "Do NOT include greetings, sign-offs, or markdown headings. Plain prose only.",
21
+ "Aim for under 300 words; trim ruthlessly when the conversation is longer.",
22
+ ].join("\n");
23
+ /**
24
+ * Drives `adapter.stream` to summarize a message history into a single string.
25
+ *
26
+ * Returns the assembled assistant text. Tool calls emitted by the adapter
27
+ * during the summarization stream are ignored — summarization is a single
28
+ * turn that must not branch into more tool work. Any `error` event surfaces
29
+ * as `AppError(Provider)` so the caller can show a useful failure message
30
+ * instead of "Compaction failed: undefined".
31
+ */
32
+ export async function summarizeConversation(adapter, modelId, messages, signal) {
33
+ if (messages.length === 0)
34
+ return "";
35
+ let text = "";
36
+ const stream = adapter.stream({ model: modelId, system: COMPACT_SUMMARY_SYSTEM, messages, tools: [] }, signal);
37
+ for await (const event of stream) {
38
+ switch (event.type) {
39
+ case "text-delta":
40
+ text += event.text;
41
+ break;
42
+ case "error":
43
+ throw new AppError(ErrorCode.Provider, `Summarization failed: ${event.message}`);
44
+ // Usage + done + any stray tool-call are intentionally ignored — the
45
+ // summarizer doesn't need token bookkeeping (caller can compare
46
+ // session size before/after) and tool calls during summarization are
47
+ // a provider misconfiguration, not a user-visible failure.
48
+ case "usage":
49
+ case "tool-call":
50
+ case "done":
51
+ break;
52
+ }
53
+ }
54
+ return text;
55
+ }
56
+ //# sourceMappingURL=summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/ai/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,mDAAmD;IACnD,qDAAqD;IACrD,oDAAoD;IACpD,qDAAqD;IACrD,yCAAyC;IACzC,oDAAoD;IACpD,8EAA8E;IAC9E,2EAA2E;CAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAwB,EACxB,OAAe,EACf,QAAmB,EACnB,MAAmB;IAEnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EACvE,MAAM,CACP,CAAC;IACF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,YAAY;gBACf,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;gBACnB,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnF,qEAAqE;YACrE,gEAAgE;YAChE,qEAAqE;YACrE,2DAA2D;YAC3D,KAAK,OAAO,CAAC;YACb,KAAK,WAAW,CAAC;YACjB,KAAK,MAAM;gBACT,MAAM;QACV,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { JSONValue } from "@chances-ai/runtime";
2
+ export type Role = "system" | "user" | "assistant" | "tool";
3
+ export type ContentPart = {
4
+ type: "text";
5
+ text: string;
6
+ } | {
7
+ type: "tool-call";
8
+ callId: string;
9
+ name: string;
10
+ args: JSONValue;
11
+ } | {
12
+ type: "tool-result";
13
+ callId: string;
14
+ name: string;
15
+ output: string;
16
+ ok: boolean;
17
+ };
18
+ export interface Message {
19
+ role: Role;
20
+ content: ContentPart[];
21
+ }
22
+ /** Provider-facing tool schema (no executor — execution lives in @chances-ai/tools). */
23
+ export interface ToolDefinition {
24
+ name: string;
25
+ description: string;
26
+ /** JSON Schema for the parameters object. */
27
+ parameters: JSONValue;
28
+ }
29
+ export interface ToolCallRequest {
30
+ callId: string;
31
+ name: string;
32
+ args: JSONValue;
33
+ }
34
+ export interface Usage {
35
+ inputTokens: number;
36
+ outputTokens: number;
37
+ }
38
+ /**
39
+ * Protocol family used to talk to a provider. Drives which adapter class is
40
+ * instantiated in `buildRegistry`. Chinese providers and the Western "long
41
+ * tail" (xai / groq / openrouter) all flow through `openai-compatible`.
42
+ */
43
+ export type ApiFamily = "anthropic" | "openai" | "google" | "openai-compatible";
44
+ /** Capabilities, never hard-coded model names — the registry/router decide. */
45
+ export interface ModelDescriptor {
46
+ id: string;
47
+ provider: string;
48
+ /** Wire protocol — selects which adapter handles the request. */
49
+ api: ApiFamily;
50
+ contextWindow: number;
51
+ supportsTools: boolean;
52
+ supportsVision: boolean;
53
+ inputCostPerMTok: number;
54
+ outputCostPerMTok: number;
55
+ }
56
+ export interface ChatRequest {
57
+ model: string;
58
+ system?: string;
59
+ messages: Message[];
60
+ tools: ToolDefinition[];
61
+ }
62
+ export type ProviderEvent = {
63
+ type: "text-delta";
64
+ text: string;
65
+ } | {
66
+ type: "tool-call";
67
+ call: ToolCallRequest;
68
+ } | {
69
+ type: "usage";
70
+ usage: Usage;
71
+ } | {
72
+ type: "done";
73
+ } | {
74
+ type: "error";
75
+ message: string;
76
+ };
77
+ /** The single seam every provider implements. `core` depends only on this. */
78
+ export interface ProviderAdapter {
79
+ readonly id: string;
80
+ listModels(): ModelDescriptor[];
81
+ stream(req: ChatRequest, signal: AbortSignal): AsyncIterable<ProviderEvent>;
82
+ }
83
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AAEhF,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,GAAG,EAAE,SAAS,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,UAAU,IAAI,eAAe,EAAE,CAAC;IAChC,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;CAC7E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * (3.5) 3-strike circuit breaker. Mirrors claude-code
3
+ * `autoCompact.ts:286-294`: after N consecutive failures,
4
+ * `tripped()` returns true and threshold-triggered compaction
5
+ * stops firing. Manual `/compact` and reactive overflow recovery
6
+ * still bypass via `Compactor.compact()`'s own gating; a
7
+ * successful manual/overflow run also `reset()`s the counter so
8
+ * threshold compaction re-arms.
9
+ *
10
+ * Scope: per-`Compactor` instance, which is per-engine. Survives
11
+ * `/clear`, resets on `/resume` (new engine, new compactor — a
12
+ * deliberate `/resume` is the user starting fresh).
13
+ *
14
+ * Codex Round-1 SHOULD-FIX #3 spelled out the scope honesty: we
15
+ * call it "compactor-instance scope" not "session scope" to avoid
16
+ * future readers expecting persistence across process restarts.
17
+ */
18
+ export declare class CircuitBreaker {
19
+ private failures;
20
+ private readonly limit;
21
+ constructor(limit?: number);
22
+ tripped(): boolean;
23
+ /** Records a fault. Cancelled errors should NOT be passed here —
24
+ * user-initiated cancellation is not a compactor fault. The caller
25
+ * is responsible for skipping this on `AppError(Cancelled)`. */
26
+ note(): void;
27
+ /** Called on a successful compaction OR a manual override. */
28
+ reset(): void;
29
+ /** Visible to tests / `/doctor` rendering. */
30
+ failureCount(): number;
31
+ }
32
+ //# sourceMappingURL=circuit-breaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,SAAI;IAIrB,OAAO,IAAI,OAAO;IAIlB;;oEAEgE;IAChE,IAAI,IAAI,IAAI;IAIZ,8DAA8D;IAC9D,KAAK,IAAI,IAAI;IAIb,8CAA8C;IAC9C,YAAY,IAAI,MAAM;CAGvB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * (3.5) 3-strike circuit breaker. Mirrors claude-code
3
+ * `autoCompact.ts:286-294`: after N consecutive failures,
4
+ * `tripped()` returns true and threshold-triggered compaction
5
+ * stops firing. Manual `/compact` and reactive overflow recovery
6
+ * still bypass via `Compactor.compact()`'s own gating; a
7
+ * successful manual/overflow run also `reset()`s the counter so
8
+ * threshold compaction re-arms.
9
+ *
10
+ * Scope: per-`Compactor` instance, which is per-engine. Survives
11
+ * `/clear`, resets on `/resume` (new engine, new compactor — a
12
+ * deliberate `/resume` is the user starting fresh).
13
+ *
14
+ * Codex Round-1 SHOULD-FIX #3 spelled out the scope honesty: we
15
+ * call it "compactor-instance scope" not "session scope" to avoid
16
+ * future readers expecting persistence across process restarts.
17
+ */
18
+ export class CircuitBreaker {
19
+ failures = 0;
20
+ limit;
21
+ constructor(limit = 3) {
22
+ this.limit = Math.max(1, limit);
23
+ }
24
+ tripped() {
25
+ return this.failures >= this.limit;
26
+ }
27
+ /** Records a fault. Cancelled errors should NOT be passed here —
28
+ * user-initiated cancellation is not a compactor fault. The caller
29
+ * is responsible for skipping this on `AppError(Cancelled)`. */
30
+ note() {
31
+ this.failures += 1;
32
+ }
33
+ /** Called on a successful compaction OR a manual override. */
34
+ reset() {
35
+ this.failures = 0;
36
+ }
37
+ /** Visible to tests / `/doctor` rendering. */
38
+ failureCount() {
39
+ return this.failures;
40
+ }
41
+ }
42
+ //# sourceMappingURL=circuit-breaker.js.map