@ebowwa/coder 0.7.63 → 0.7.65

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 (364) hide show
  1. package/dist/core/__tests__/permissions.test.d.ts +12 -0
  2. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  3. package/dist/core/__tests__/permissions.test.js +851 -0
  4. package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
  5. package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
  6. package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
  7. package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
  8. package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
  9. package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
  10. package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
  11. package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
  12. package/dist/core/agent-loop/__tests__/index.test.js +121 -0
  13. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
  14. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
  15. package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
  16. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
  17. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
  18. package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
  19. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
  20. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
  21. package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
  22. package/dist/core/agent-loop/compaction.d.ts +39 -0
  23. package/dist/core/agent-loop/compaction.d.ts.map +1 -0
  24. package/dist/core/agent-loop/compaction.js +51 -0
  25. package/dist/core/agent-loop/formatters.d.ts +21 -0
  26. package/dist/core/agent-loop/formatters.d.ts.map +1 -0
  27. package/dist/core/agent-loop/formatters.js +42 -0
  28. package/dist/core/agent-loop/index.d.ts +25 -0
  29. package/dist/core/agent-loop/index.d.ts.map +1 -0
  30. package/dist/core/agent-loop/index.js +83 -0
  31. package/dist/core/agent-loop/loop-state.d.ts +74 -0
  32. package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
  33. package/dist/core/agent-loop/loop-state.js +147 -0
  34. package/dist/core/agent-loop/message-builder.d.ts +13 -0
  35. package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
  36. package/dist/core/agent-loop/message-builder.js +49 -0
  37. package/dist/core/agent-loop/tool-executor.d.ts +23 -0
  38. package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
  39. package/dist/core/agent-loop/tool-executor.js +152 -0
  40. package/dist/core/agent-loop/turn-executor.d.ts +57 -0
  41. package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
  42. package/dist/core/agent-loop/turn-executor.js +124 -0
  43. package/dist/core/agent-loop/types.d.ts +141 -0
  44. package/dist/core/agent-loop/types.d.ts.map +1 -0
  45. package/dist/core/agent-loop/types.js +4 -0
  46. package/dist/core/agent-loop.d.ts +17 -0
  47. package/dist/core/agent-loop.d.ts.map +1 -0
  48. package/dist/core/agent-loop.js +16 -0
  49. package/dist/core/api-client-impl.d.ts +62 -0
  50. package/dist/core/api-client-impl.d.ts.map +1 -0
  51. package/dist/core/api-client-impl.js +479 -0
  52. package/dist/core/api-client.d.ts +6 -0
  53. package/dist/core/api-client.d.ts.map +1 -0
  54. package/dist/core/api-client.js +5 -0
  55. package/dist/core/checkpoints.d.ts +128 -0
  56. package/dist/core/checkpoints.d.ts.map +1 -0
  57. package/dist/core/checkpoints.js +438 -0
  58. package/dist/core/claude-md.d.ts +71 -0
  59. package/dist/core/claude-md.d.ts.map +1 -0
  60. package/dist/core/claude-md.js +198 -0
  61. package/dist/core/cognitive-security/hooks.d.ts +138 -0
  62. package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
  63. package/dist/core/cognitive-security/hooks.js +389 -0
  64. package/dist/core/cognitive-security/index.d.ts +751 -0
  65. package/dist/core/cognitive-security/index.d.ts.map +1 -0
  66. package/dist/core/cognitive-security/index.js +1123 -0
  67. package/dist/core/cognitive-security/middleware.d.ts +136 -0
  68. package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
  69. package/dist/core/cognitive-security/middleware.js +376 -0
  70. package/dist/core/config-loader.d.ts +127 -0
  71. package/dist/core/config-loader.d.ts.map +1 -0
  72. package/dist/core/config-loader.js +219 -0
  73. package/dist/core/context-compaction.d.ts +87 -0
  74. package/dist/core/context-compaction.d.ts.map +1 -0
  75. package/dist/core/context-compaction.js +428 -0
  76. package/dist/core/git-status.d.ts +25 -0
  77. package/dist/core/git-status.d.ts.map +1 -0
  78. package/dist/core/git-status.js +204 -0
  79. package/dist/core/image.d.ts +69 -0
  80. package/dist/core/image.d.ts.map +1 -0
  81. package/dist/core/image.js +290 -0
  82. package/dist/core/image.test.d.ts +2 -0
  83. package/dist/core/image.test.d.ts.map +1 -0
  84. package/dist/core/image.test.js +149 -0
  85. package/dist/core/models.d.ts +123 -0
  86. package/dist/core/models.d.ts.map +1 -0
  87. package/dist/core/models.js +325 -0
  88. package/dist/core/permissions.d.ts +81 -0
  89. package/dist/core/permissions.d.ts.map +1 -0
  90. package/dist/core/permissions.js +327 -0
  91. package/dist/core/retry.d.ts +25 -0
  92. package/dist/core/retry.d.ts.map +1 -0
  93. package/dist/core/retry.js +121 -0
  94. package/dist/core/session-store.d.ts +9 -0
  95. package/dist/core/session-store.d.ts.map +1 -0
  96. package/dist/core/session-store.js +10 -0
  97. package/dist/core/sessions/export.d.ts +47 -0
  98. package/dist/core/sessions/export.d.ts.map +1 -0
  99. package/dist/core/sessions/export.js +256 -0
  100. package/dist/core/sessions/index.d.ts +132 -0
  101. package/dist/core/sessions/index.d.ts.map +1 -0
  102. package/dist/core/sessions/index.js +442 -0
  103. package/dist/core/sessions/metadata.d.ts +77 -0
  104. package/dist/core/sessions/metadata.d.ts.map +1 -0
  105. package/dist/core/sessions/metadata.js +233 -0
  106. package/dist/core/sessions/persistence.d.ts +72 -0
  107. package/dist/core/sessions/persistence.d.ts.map +1 -0
  108. package/dist/core/sessions/persistence.js +201 -0
  109. package/dist/core/sessions/types.d.ts +110 -0
  110. package/dist/core/sessions/types.d.ts.map +1 -0
  111. package/dist/core/sessions/types.js +4 -0
  112. package/dist/core/stream-highlighter.d.ts +18 -0
  113. package/dist/core/stream-highlighter.d.ts.map +1 -0
  114. package/dist/core/stream-highlighter.js +916 -0
  115. package/dist/core/system-reminders.d.ts +89 -0
  116. package/dist/core/system-reminders.d.ts.map +1 -0
  117. package/dist/core/system-reminders.js +285 -0
  118. package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
  119. package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
  120. package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
  121. package/dist/ecosystem/hooks/index.d.ts +59 -0
  122. package/dist/ecosystem/hooks/index.d.ts.map +1 -0
  123. package/dist/ecosystem/hooks/index.js +294 -0
  124. package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
  125. package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
  126. package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
  127. package/dist/ecosystem/skills/index.d.ts +55 -0
  128. package/dist/ecosystem/skills/index.d.ts.map +1 -0
  129. package/dist/ecosystem/skills/index.js +258 -0
  130. package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
  131. package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
  132. package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
  133. package/dist/ecosystem/tools/index.d.ts +24 -0
  134. package/dist/ecosystem/tools/index.d.ts.map +1 -0
  135. package/dist/ecosystem/tools/index.js +1709 -0
  136. package/dist/index.d.ts +24 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +33688 -49712
  139. package/dist/interfaces/mcp/client.d.ts +40 -0
  140. package/dist/interfaces/mcp/client.d.ts.map +1 -0
  141. package/dist/interfaces/mcp/client.js +309 -0
  142. package/dist/interfaces/ui/index.d.ts +36 -0
  143. package/dist/interfaces/ui/index.d.ts.map +1 -0
  144. package/dist/interfaces/ui/index.js +61 -0
  145. package/dist/interfaces/ui/spinner.d.ts +140 -0
  146. package/dist/interfaces/ui/spinner.d.ts.map +1 -0
  147. package/dist/interfaces/ui/spinner.js +342 -0
  148. package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
  149. package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
  150. package/dist/interfaces/ui/terminal/cli/index.js +32012 -50526
  151. package/dist/interfaces/ui/terminal/native/README.md +53 -0
  152. package/dist/interfaces/ui/terminal/native/claude_code_native.darwin-x64.node +0 -0
  153. package/dist/interfaces/ui/terminal/native/claude_code_native.dylib +0 -0
  154. package/dist/interfaces/ui/terminal/native/index.d.ts +0 -0
  155. package/dist/interfaces/ui/terminal/native/index.darwin-arm64.node +0 -0
  156. package/dist/interfaces/ui/terminal/native/index.js +43 -0
  157. package/dist/interfaces/ui/terminal/native/index.node +0 -0
  158. package/dist/interfaces/ui/terminal/native/package.json +34 -0
  159. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  160. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  161. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  162. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  163. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  164. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  165. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  166. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  167. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  168. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  169. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  170. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  171. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  172. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  173. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  174. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  175. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  176. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  177. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  178. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  179. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  180. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  181. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  182. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  183. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  184. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  185. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  186. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  187. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  188. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  189. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  190. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  191. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  192. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  193. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  194. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  195. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  196. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  197. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  198. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  199. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  200. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  201. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  202. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  203. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  204. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  205. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  206. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  207. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  208. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  209. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  210. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  211. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  212. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  213. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  214. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  215. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  216. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  217. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  218. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  219. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  220. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  221. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  222. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  223. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  224. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  225. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  226. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  227. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  228. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  229. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  230. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  231. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  232. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  233. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  234. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  235. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  236. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  237. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  238. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  239. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  240. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  241. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  242. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  243. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  244. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  245. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  246. package/dist/native/README.md +53 -0
  247. package/dist/native/claude_code_native.darwin-x64.node +0 -0
  248. package/dist/native/claude_code_native.dylib +0 -0
  249. package/dist/native/index.d.ts +0 -0
  250. package/dist/native/index.d.ts.map +1 -0
  251. package/dist/native/index.darwin-arm64.node +0 -0
  252. package/dist/native/index.js +43 -0
  253. package/dist/native/index.node +0 -0
  254. package/dist/native/package.json +34 -0
  255. package/dist/teammates/index.d.ts +161 -0
  256. package/dist/teammates/index.d.ts.map +1 -0
  257. package/dist/teammates/index.js +827 -0
  258. package/dist/types/index.d.ts +482 -0
  259. package/dist/types/index.d.ts.map +1 -0
  260. package/dist/types/index.js +52 -0
  261. package/native/index.darwin-arm64.node +0 -0
  262. package/native/index.js +33 -19
  263. package/package.json +6 -3
  264. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  265. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +283 -0
  266. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  267. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  268. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  269. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  270. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  271. package/packages/src/core/agent-loop/compaction.ts +92 -0
  272. package/packages/src/core/agent-loop/formatters.ts +50 -0
  273. package/packages/src/core/agent-loop/index.ts +137 -0
  274. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  275. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  276. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  277. package/packages/src/core/agent-loop/turn-executor.ts +226 -0
  278. package/packages/src/core/agent-loop/types.ts +152 -0
  279. package/packages/src/core/agent-loop.ts +18 -0
  280. package/packages/src/core/api-client-impl.ts +729 -0
  281. package/packages/src/core/api-client.ts +6 -0
  282. package/packages/src/core/checkpoints.ts +606 -0
  283. package/packages/src/core/claude-md.ts +272 -0
  284. package/packages/src/core/cognitive-security/hooks.ts +591 -0
  285. package/packages/src/core/cognitive-security/index.ts +2041 -0
  286. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  287. package/packages/src/core/config/todo +7 -0
  288. package/packages/src/core/config-loader.ts +324 -0
  289. package/packages/src/core/context/__tests__/integration.test.ts +334 -0
  290. package/packages/src/core/context/compaction.ts +170 -0
  291. package/packages/src/core/context/constants.ts +58 -0
  292. package/packages/src/core/context/extraction.ts +85 -0
  293. package/packages/src/core/context/index.ts +66 -0
  294. package/packages/src/core/context/summarization.ts +251 -0
  295. package/packages/src/core/context/token-estimation.ts +98 -0
  296. package/packages/src/core/context/types.ts +59 -0
  297. package/packages/src/core/git-status.ts +262 -0
  298. package/packages/src/core/image.test.ts +180 -0
  299. package/packages/src/core/image.ts +350 -0
  300. package/packages/src/core/lmdb.db +0 -0
  301. package/packages/src/core/lmdb.db-lock +0 -0
  302. package/packages/src/core/models.ts +507 -0
  303. package/packages/src/core/normalizers/todo +8 -0
  304. package/packages/src/core/permissions.ts +431 -0
  305. package/packages/src/core/providers/README.md +230 -0
  306. package/packages/src/core/providers/__tests__/providers.test.ts +135 -0
  307. package/packages/src/core/providers/index.ts +419 -0
  308. package/packages/src/core/providers/types.ts +132 -0
  309. package/packages/src/core/retry.ts +180 -0
  310. package/packages/src/core/session-store.ts +36 -0
  311. package/packages/src/core/sessions/export.ts +329 -0
  312. package/packages/src/core/sessions/index.ts +587 -0
  313. package/packages/src/core/sessions/metadata.ts +309 -0
  314. package/packages/src/core/sessions/persistence.ts +244 -0
  315. package/packages/src/core/sessions/types.ts +169 -0
  316. package/packages/src/core/stream-highlighter.ts +1123 -0
  317. package/packages/src/core/system-reminders.ts +402 -0
  318. package/packages/src/core/todo +8 -0
  319. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  320. package/packages/src/ecosystem/hooks/index.ts +341 -0
  321. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  322. package/packages/src/ecosystem/skills/index.ts +295 -0
  323. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  324. package/packages/src/ecosystem/tools/index.ts +2051 -0
  325. package/packages/src/index.ts +141 -0
  326. package/packages/src/interfaces/mcp/client.ts +389 -0
  327. package/packages/src/interfaces/ui/index.ts +158 -0
  328. package/packages/src/interfaces/ui/lmdb.db +0 -0
  329. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  330. package/packages/src/interfaces/ui/spinner.ts +451 -0
  331. package/packages/src/interfaces/ui/terminal/bridge/index.ts +370 -0
  332. package/packages/src/interfaces/ui/terminal/bridge/ipc.ts +829 -0
  333. package/packages/src/interfaces/ui/terminal/bridge/screen-export.ts +968 -0
  334. package/packages/src/interfaces/ui/terminal/bridge/types.ts +226 -0
  335. package/packages/src/interfaces/ui/terminal/bridge/useBridge.ts +210 -0
  336. package/packages/src/interfaces/ui/terminal/cli/bootstrap.ts +132 -0
  337. package/packages/src/interfaces/ui/terminal/cli/index.ts +415 -0
  338. package/packages/src/interfaces/ui/terminal/cli/interactive/index.ts +110 -0
  339. package/packages/src/interfaces/ui/terminal/cli/interactive/input-handler.ts +393 -0
  340. package/packages/src/interfaces/ui/terminal/cli/interactive/interactive-runner.ts +820 -0
  341. package/packages/src/interfaces/ui/terminal/cli/interactive/message-store.ts +299 -0
  342. package/packages/src/interfaces/ui/terminal/cli/interactive/types.ts +274 -0
  343. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  344. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  345. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  346. package/packages/src/interfaces/ui/terminal/shared/index.ts +84 -0
  347. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  348. package/packages/src/interfaces/ui/terminal/shared/query.ts +152 -0
  349. package/packages/src/interfaces/ui/terminal/shared/setup.ts +299 -0
  350. package/packages/src/interfaces/ui/terminal/shared/spinner-frames.ts +73 -0
  351. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +366 -0
  352. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  353. package/packages/src/lmdb.db +0 -0
  354. package/packages/src/lmdb.db-lock +0 -0
  355. package/packages/src/native/index.ts +2722 -0
  356. package/packages/src/native/tui_v2_types.ts +39 -0
  357. package/packages/src/teammates/coordination.test.ts +279 -0
  358. package/packages/src/teammates/coordination.ts +646 -0
  359. package/packages/src/teammates/index.ts +1052 -0
  360. package/packages/src/teammates/integration.test.ts +272 -0
  361. package/packages/src/teammates/runner.test.ts +235 -0
  362. package/packages/src/teammates/runner.ts +750 -0
  363. package/packages/src/teammates/schemas.ts +673 -0
  364. package/packages/src/types/index.ts +723 -0
@@ -0,0 +1,135 @@
1
+ import { describe, test, expect } from "bun:test";
2
+ import {
3
+ getProvider,
4
+ getProviderForModel,
5
+ resolveProvider,
6
+ isProviderHealthy,
7
+ getHealthyProviders,
8
+ getNextHealthyProvider,
9
+ PROVIDERS,
10
+ type ProviderName,
11
+ } from "../index.js";
12
+
13
+ describe("Provider Registry", () => {
14
+ describe("getProvider", () => {
15
+ test("returns zhipu provider config", () => {
16
+ const provider = getProvider("zhipu");
17
+ expect(provider).toBeDefined();
18
+ expect(provider?.name).toBe("zhipu");
19
+ expect(provider?.displayName).toBe("Z.AI (GLM)");
20
+ expect(provider?.format).toBe("openai");
21
+ });
22
+
23
+ test("returns minimax provider config", () => {
24
+ const provider = getProvider("minimax");
25
+ expect(provider).toBeDefined();
26
+ expect(provider?.name).toBe("minimax");
27
+ expect(provider?.displayName).toBe("MiniMax");
28
+ expect(provider?.format).toBe("anthropic");
29
+ });
30
+
31
+ test("returns undefined for unknown provider", () => {
32
+ const provider = getProvider("unknown" as any);
33
+ expect(provider).toBeUndefined();
34
+ });
35
+ });
36
+
37
+ describe("getProviderForModel", () => {
38
+ test("detects zhipu from glm-5", () => {
39
+ expect(getProviderForModel("glm-5")).toBe("zhipu");
40
+ });
41
+
42
+ test("detects zhipu from GLM-4.7 (case insensitive)", () => {
43
+ expect(getProviderForModel("GLM-4.7")).toBe("zhipu");
44
+ });
45
+
46
+ test("detects minimax from minimax-m2.5", () => {
47
+ expect(getProviderForModel("minimax-m2.5")).toBe("minimax");
48
+ });
49
+
50
+ test("detects minimax from MiniMax-M2.5 (case insensitive)", () => {
51
+ expect(getProviderForModel("MiniMax-M2.5")).toBe("minimax");
52
+ });
53
+
54
+ test("defaults to zhipu for unknown models", () => {
55
+ expect(getProviderForModel("unknown-model")).toBe("zhipu");
56
+ });
57
+ });
58
+
59
+ describe("isProviderHealthy", () => {
60
+ test("zhipu starts healthy", () => {
61
+ expect(isProviderHealthy("zhipu")).toBe(true);
62
+ });
63
+
64
+ test("minimax starts healthy", () => {
65
+ expect(isProviderHealthy("minimax")).toBe(true);
66
+ });
67
+
68
+ test("anthropic is marked unhealthy (not implemented)", () => {
69
+ expect(isProviderHealthy("anthropic")).toBe(false);
70
+ });
71
+ });
72
+
73
+ describe("getHealthyProviders", () => {
74
+ test("returns list of healthy providers", () => {
75
+ const healthy = getHealthyProviders();
76
+ expect(healthy).toContain("zhipu");
77
+ expect(healthy).toContain("minimax");
78
+ expect(healthy).not.toContain("anthropic");
79
+ });
80
+ });
81
+
82
+ describe("getNextHealthyProvider", () => {
83
+ test("returns first healthy provider from fallback chain", () => {
84
+ const provider = getNextHealthyProvider();
85
+ expect(provider).toBe("zhipu");
86
+ });
87
+
88
+ test("can exclude provider", () => {
89
+ const provider = getNextHealthyProvider("zhipu");
90
+ expect(provider).toBe("minimax");
91
+ });
92
+ });
93
+
94
+ describe("resolveProvider", () => {
95
+ test("returns null when no API key configured", () => {
96
+ // Clear env for this test
97
+ const originalKey = process.env.Z_AI_API_KEY;
98
+ delete process.env.Z_AI_API_KEY;
99
+
100
+ const result = resolveProvider("glm-5");
101
+ // May return null or use fallback
102
+ // This depends on whether keys are loaded
103
+
104
+ // Restore
105
+ if (originalKey) {
106
+ process.env.Z_AI_API_KEY = originalKey;
107
+ }
108
+ });
109
+ });
110
+ });
111
+
112
+ describe("Provider Configuration", () => {
113
+ test("zhipu uses OpenAI format", () => {
114
+ expect(PROVIDERS.zhipu.format).toBe("openai");
115
+ expect(PROVIDERS.zhipu.endpoint).toContain("z.ai");
116
+ });
117
+
118
+ test("minimax uses Anthropic format", () => {
119
+ expect(PROVIDERS.minimax.format).toBe("anthropic");
120
+ expect(PROVIDERS.minimax.endpoint).toContain("minimax");
121
+ });
122
+
123
+ test("providers have required fields", () => {
124
+ for (const name of Object.keys(PROVIDERS) as ProviderName[]) {
125
+ const config = PROVIDERS[name];
126
+ expect(config.name).toBe(name);
127
+ expect(config.displayName).toBeTruthy();
128
+ expect(config.endpoint).toBeTruthy();
129
+ expect(config.apiKeyEnv).toBeInstanceOf(Array);
130
+ expect(config.apiKeyEnv.length).toBeGreaterThan(0);
131
+ expect(config.defaultModel).toBeTruthy();
132
+ expect(config.models).toBeInstanceOf(Array);
133
+ }
134
+ });
135
+ });
@@ -0,0 +1,419 @@
1
+ /**
2
+ * Provider Registry - Central registry for all LLM providers
3
+ *
4
+ * Exports:
5
+ * - PROVIDERS: All provider configurations
6
+ * - getProvider(): Get provider by name
7
+ * - getProviderForModel(): Detect provider from model name
8
+ * - resolveProvider(): Resolve provider with API key
9
+ * - RollingKeysManager integration for multi-key rotation
10
+ */
11
+
12
+ import type {
13
+ ProviderName,
14
+ ProviderConfig,
15
+ ProviderHealth,
16
+ ResolvedProvider,
17
+ } from "./types.js";
18
+ import { DEFAULT_ROUTING_CONFIG, BACKOFF_CONFIG } from "./types.js";
19
+ import { RollingKeyManager } from "@ebowwa/rolling-keys";
20
+
21
+ // ============================================================
22
+ // Provider Configurations
23
+ // ============================================================
24
+
25
+ /**
26
+ * All available provider configurations
27
+ */
28
+ export const PROVIDERS: Record<ProviderName, ProviderConfig> = {
29
+ // ============================================================
30
+ // Z.AI / Zhipu (GLM Models)
31
+ // ============================================================
32
+ zhipu: {
33
+ name: "zhipu",
34
+ displayName: "Z.AI (GLM)",
35
+ endpoint: process.env.ZHIPU_BASE_URL || "https://api.z.ai/api/coding/paas/v4",
36
+ authHeader: "Authorization",
37
+ apiKeyEnv: ["Z_AI_API_KEY", "ZAI_API_KEY", "GLM_API_KEY", "ZHIPU_API_KEY"],
38
+ format: "openai",
39
+ defaultModel: "GLM-4.7",
40
+ models: [
41
+ // GLM-5 (quota: 3x peak, 2x off-peak)
42
+ "GLM-5", "glm-5",
43
+ // GLM-4.x series (shared quota)
44
+ "GLM-4.7", "glm-4.7",
45
+ "GLM-4.6", "glm-4.6",
46
+ "GLM-4.5V", "glm-4.5v", // Vision variant
47
+ "GLM-4.5", "glm-4.5",
48
+ "GLM-4.5-Air", "glm-4.5-air",
49
+ ],
50
+ supportsStreaming: true,
51
+ supportsToolCalling: true,
52
+ supportsVision: true,
53
+ supportsThinking: true,
54
+ },
55
+
56
+ // ============================================================
57
+ // MiniMax (M2.5 Model)
58
+ // ============================================================
59
+ minimax: {
60
+ name: "minimax",
61
+ displayName: "MiniMax",
62
+ endpoint: process.env.MINIMAX_BASE_URL || "https://api.minimax.io/anthropic",
63
+ authHeader: "ANTHROPIC_AUTH_TOKEN", // Anthropic-compatible
64
+ apiKeyEnv: ["MINIMAX_API_KEY"],
65
+ format: "anthropic",
66
+ defaultModel: "MiniMax-M2.5",
67
+ models: ["MiniMax-M2.5", "minimax-m2.5"],
68
+ supportsStreaming: true,
69
+ supportsToolCalling: true,
70
+ supportsVision: true,
71
+ supportsThinking: false,
72
+ },
73
+
74
+ // ============================================================
75
+ // OpenAI (Future)
76
+ // ============================================================
77
+ openai: {
78
+ name: "openai",
79
+ displayName: "OpenAI",
80
+ endpoint: process.env.OPENAI_BASE_URL || "https://api.openai.com/v1",
81
+ authHeader: "Authorization",
82
+ apiKeyEnv: ["OPENAI_API_KEY"],
83
+ format: "openai",
84
+ defaultModel: "gpt-4-turbo",
85
+ models: ["gpt-4-turbo", "gpt-4", "gpt-3.5-turbo"],
86
+ supportsStreaming: true,
87
+ supportsToolCalling: true,
88
+ supportsVision: true,
89
+ supportsThinking: false,
90
+ },
91
+
92
+ // ============================================================
93
+ // Anthropic (Stub - Not Implemented)
94
+ // ============================================================
95
+ anthropic: {
96
+ name: "anthropic",
97
+ displayName: "Anthropic (Not Implemented)",
98
+ endpoint: process.env.ANTHROPIC_BASE_URL || "https://api.anthropic.com",
99
+ authHeader: "x-api-key",
100
+ apiKeyEnv: ["ANTHROPIC_API_KEY"],
101
+ format: "anthropic",
102
+ defaultModel: "claude-sonnet-4-6",
103
+ models: ["claude-opus-4-6", "claude-sonnet-4-6", "claude-haiku-4-5"],
104
+ supportsStreaming: true,
105
+ supportsToolCalling: true,
106
+ supportsVision: true,
107
+ supportsThinking: true,
108
+ },
109
+ };
110
+
111
+ // ============================================================
112
+ // Provider Health Tracking
113
+ // ============================================================
114
+
115
+ /**
116
+ * Health status for each provider
117
+ */
118
+ const providerHealth: Record<ProviderName, ProviderHealth> = {
119
+ zhipu: { name: "zhipu", healthy: true, failureCount: 0, avgLatencyMs: 0, totalRequests: 0 },
120
+ minimax: { name: "minimax", healthy: true, failureCount: 0, avgLatencyMs: 0, totalRequests: 0 },
121
+ openai: { name: "openai", healthy: true, failureCount: 0, avgLatencyMs: 0, totalRequests: 0 },
122
+ anthropic: { name: "anthropic", healthy: false, failureCount: 999, avgLatencyMs: 0, totalRequests: 0 },
123
+ };
124
+
125
+ // ============================================================
126
+ // Rolling Keys Support (using @ebowwa/rolling-keys)
127
+ // ============================================================
128
+
129
+ /**
130
+ * Rolling key managers for each provider
131
+ */
132
+ const keyManagers: Partial<Record<ProviderName, RollingKeyManager>> = {};
133
+
134
+ /**
135
+ * Get or create rolling key manager for a provider
136
+ */
137
+ function getKeyManager(provider: ProviderName): RollingKeyManager | null {
138
+ if (keyManagers[provider]) {
139
+ return keyManagers[provider]!;
140
+ }
141
+
142
+ const config = PROVIDERS[provider];
143
+ if (!config || config.apiKeyEnv.length === 0) {
144
+ return null;
145
+ }
146
+
147
+ try {
148
+ // Create manager with first env var as primary, optional plural for array
149
+ const manager = new RollingKeyManager({
150
+ keysEnvVar: config.apiKeyEnv[0] + "S", // e.g., Z_AI_API_KEYS
151
+ singleKeyEnvVar: config.apiKeyEnv[0], // e.g., Z_AI_API_KEY
152
+ });
153
+
154
+ // Only cache if it has keys
155
+ if (manager.getKeyCount() > 0) {
156
+ keyManagers[provider] = manager;
157
+ return manager;
158
+ }
159
+ } catch {
160
+ // No keys configured for this provider
161
+ return null;
162
+ }
163
+
164
+ return null;
165
+ }
166
+
167
+ /**
168
+ * Get next API key using round-robin rotation with health tracking
169
+ */
170
+ function getNextKey(provider: ProviderName): string | null {
171
+ const manager = getKeyManager(provider);
172
+ if (!manager) {
173
+ return null;
174
+ }
175
+
176
+ const result = manager.getNextKey();
177
+ return result?.key ?? null;
178
+ }
179
+
180
+ /**
181
+ * Record key success (for health tracking)
182
+ * Note: RollingKeyManager tracks success internally via key rotation
183
+ */
184
+ function recordKeySuccess(_provider: ProviderName): void {
185
+ // Success is tracked implicitly through continued key usage
186
+ // RollingKeyManager handles health recovery automatically
187
+ }
188
+
189
+ /**
190
+ * Record key failure (triggers backoff)
191
+ */
192
+ function recordKeyFailure(provider: ProviderName, error?: unknown): void {
193
+ const manager = getKeyManager(provider);
194
+ if (manager && error) {
195
+ manager.handleError(error);
196
+ }
197
+ }
198
+
199
+ // ============================================================
200
+ // Provider Resolution
201
+ // ============================================================
202
+
203
+ /**
204
+ * Model name to provider mapping
205
+ */
206
+ const MODEL_TO_PROVIDER: Record<string, ProviderName> = {
207
+ // Zhipu / Z.AI models (coding plan - shared quota)
208
+ "glm-5": "zhipu", // 3x peak, 2x off-peak
209
+ "glm-4.7": "zhipu",
210
+ "glm-4.6": "zhipu",
211
+ "glm-4.5v": "zhipu", // Vision variant
212
+ "glm-4.5-air": "zhipu",
213
+ "glm-4.5": "zhipu",
214
+ "glm-4-plus": "zhipu",
215
+
216
+ // MiniMax models
217
+ "minimax-m2.5": "minimax",
218
+ "minimax-m2": "minimax",
219
+ "abab6.5-chat": "minimax",
220
+
221
+ // OpenAI models
222
+ "gpt-4": "openai",
223
+ "gpt-4-turbo": "openai",
224
+ "gpt-3.5-turbo": "openai",
225
+ "gpt-4o": "openai",
226
+
227
+ // Anthropic models (stub)
228
+ "claude-opus-4-6": "anthropic",
229
+ "claude-sonnet-4-6": "anthropic",
230
+ "claude-haiku-4-5": "anthropic",
231
+ };
232
+
233
+ /**
234
+ * Get provider configuration by name
235
+ */
236
+ export function getProvider(name: ProviderName): ProviderConfig | undefined {
237
+ return PROVIDERS[name];
238
+ }
239
+
240
+ /**
241
+ * Detect provider from model name
242
+ */
243
+ export function getProviderForModel(model: string): ProviderName {
244
+ // Normalize model name
245
+ const normalizedModel = model.toLowerCase();
246
+
247
+ // Direct lookup
248
+ if (MODEL_TO_PROVIDER[normalizedModel]) {
249
+ return MODEL_TO_PROVIDER[normalizedModel];
250
+ }
251
+
252
+ // Partial match
253
+ for (const [modelPrefix, provider] of Object.entries(MODEL_TO_PROVIDER)) {
254
+ if (normalizedModel.includes(modelPrefix) || modelPrefix.includes(normalizedModel)) {
255
+ return provider;
256
+ }
257
+ }
258
+
259
+ // Check provider model lists
260
+ for (const [providerName, config] of Object.entries(PROVIDERS)) {
261
+ if (config.models.some((m) => m.toLowerCase() === normalizedModel)) {
262
+ return providerName as ProviderName;
263
+ }
264
+ }
265
+
266
+ // Default to zhipu
267
+ return "zhipu";
268
+ }
269
+
270
+ /**
271
+ * Resolve provider with API key and endpoint
272
+ */
273
+ export function resolveProvider(
274
+ model: string,
275
+ preferredProvider?: ProviderName
276
+ ): ResolvedProvider | null {
277
+ // Determine provider
278
+ const providerName = preferredProvider || getProviderForModel(model);
279
+ const config = PROVIDERS[providerName];
280
+
281
+ if (!config) {
282
+ console.error(`Unknown provider: ${providerName}`);
283
+ return null;
284
+ }
285
+
286
+ // Get API key
287
+ const apiKey = getNextKey(providerName);
288
+ if (!apiKey) {
289
+ console.error(`No API key found for provider: ${providerName}`);
290
+ return null;
291
+ }
292
+
293
+ // Build endpoint URL
294
+ let endpoint = config.endpoint;
295
+ if (config.format === "openai") {
296
+ endpoint = `${endpoint}/chat/completions`;
297
+ } else {
298
+ endpoint = `${endpoint}/v1/messages`;
299
+ }
300
+
301
+ // Resolve model name
302
+ const resolvedModel = config.models.includes(model)
303
+ ? model
304
+ : config.defaultModel;
305
+
306
+ return {
307
+ config,
308
+ apiKey,
309
+ endpoint,
310
+ model: resolvedModel,
311
+ };
312
+ }
313
+
314
+ /**
315
+ * Check if provider is healthy
316
+ */
317
+ export function isProviderHealthy(provider: ProviderName): boolean {
318
+ const health = providerHealth[provider];
319
+ if (!health) return false;
320
+
321
+ // Check if in backoff period
322
+ if (health.backoffUntil && health.backoffUntil > Date.now()) {
323
+ return false;
324
+ }
325
+
326
+ return health.healthy;
327
+ }
328
+
329
+ /**
330
+ * Record provider success
331
+ */
332
+ export function recordProviderSuccess(provider: ProviderName, latencyMs: number): void {
333
+ const health = providerHealth[provider];
334
+ if (!health) return;
335
+
336
+ health.healthy = true;
337
+ health.lastSuccess = Date.now();
338
+ health.failureCount = 0;
339
+ health.backoffUntil = undefined;
340
+ health.totalRequests++;
341
+
342
+ // Update average latency
343
+ health.avgLatencyMs = Math.round(
344
+ (health.avgLatencyMs * (health.totalRequests - 1) + latencyMs) / health.totalRequests
345
+ );
346
+ }
347
+
348
+ /**
349
+ * Record provider failure
350
+ */
351
+ export function recordProviderFailure(provider: ProviderName): void {
352
+ const health = providerHealth[provider];
353
+ if (!health) return;
354
+
355
+ health.failureCount++;
356
+ health.lastFailure = Date.now();
357
+ health.totalRequests++;
358
+
359
+ // Apply backoff after threshold
360
+ if (health.failureCount >= BACKOFF_CONFIG.failureThreshold) {
361
+ health.healthy = false;
362
+ const backoffMs = Math.min(
363
+ BACKOFF_CONFIG.baseMs * Math.pow(2, health.failureCount - BACKOFF_CONFIG.failureThreshold),
364
+ BACKOFF_CONFIG.maxMs
365
+ );
366
+ health.backoffUntil = Date.now() + backoffMs;
367
+ console.warn(
368
+ `[Provider] ${provider} unhealthy after ${health.failureCount} failures, ` +
369
+ `backoff for ${Math.round(backoffMs / 1000)}s`
370
+ );
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Get health status for all providers
376
+ */
377
+ export function getProviderHealth(): Record<ProviderName, ProviderHealth> {
378
+ return { ...providerHealth };
379
+ }
380
+
381
+ /**
382
+ * Get list of healthy providers
383
+ */
384
+ export function getHealthyProviders(): ProviderName[] {
385
+ return (Object.keys(PROVIDERS) as ProviderName[]).filter(isProviderHealthy);
386
+ }
387
+
388
+ /**
389
+ * Get next healthy provider from fallback chain
390
+ */
391
+ export function getNextHealthyProvider(
392
+ excludeProvider?: ProviderName
393
+ ): ProviderName | null {
394
+ const chain = DEFAULT_ROUTING_CONFIG.fallbackChain;
395
+
396
+ for (const provider of chain) {
397
+ if (excludeProvider && provider === excludeProvider) continue;
398
+ if (isProviderHealthy(provider)) {
399
+ return provider;
400
+ }
401
+ }
402
+
403
+ return null;
404
+ }
405
+
406
+ // ============================================================
407
+ // Initialization
408
+ // ============================================================
409
+
410
+ // Key pools are loaded lazily via getKeyManager()
411
+
412
+ // Re-export types
413
+ export type {
414
+ ProviderName,
415
+ ProviderConfig,
416
+ ProviderHealth,
417
+ ResolvedProvider,
418
+ ProviderRoutingConfig,
419
+ } from "./types.js";
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Provider Types - Generic LLM Provider Abstraction
3
+ *
4
+ * Supports multiple providers:
5
+ * - zhipu (Z.AI / GLM models)
6
+ * - minimax (MiniMax M2.5)
7
+ * - openai (future)
8
+ * - anthropic (stub/commented only)
9
+ */
10
+
11
+ // ============================================================
12
+ // Provider Types
13
+ // ============================================================
14
+
15
+ /**
16
+ * Supported provider names
17
+ */
18
+ export type ProviderName = "zhipu" | "minimax" | "openai" | "anthropic";
19
+
20
+ /**
21
+ * API format type - determines request/response format
22
+ */
23
+ export type APIFormat = "anthropic" | "openai";
24
+
25
+ /**
26
+ * Provider configuration
27
+ */
28
+ export interface ProviderConfig {
29
+ /** Provider identifier */
30
+ name: ProviderName;
31
+ /** Human-readable display name */
32
+ displayName: string;
33
+ /** API endpoint base URL */
34
+ endpoint: string;
35
+ /** Authentication header name */
36
+ authHeader: string;
37
+ /** Environment variable names for API keys (checked in order) */
38
+ apiKeyEnv: string[];
39
+ /** API format (anthropic or openai compatible) */
40
+ format: APIFormat;
41
+ /** Default model for this provider */
42
+ defaultModel: string;
43
+ /** List of supported model IDs */
44
+ models: string[];
45
+ /** Whether provider supports streaming */
46
+ supportsStreaming: boolean;
47
+ /** Whether provider supports tool calling */
48
+ supportsToolCalling: boolean;
49
+ /** Whether provider supports vision/images */
50
+ supportsVision: boolean;
51
+ /** Whether provider supports extended thinking */
52
+ supportsThinking: boolean;
53
+ }
54
+
55
+ /**
56
+ * Provider health status
57
+ */
58
+ export interface ProviderHealth {
59
+ /** Provider name */
60
+ name: ProviderName;
61
+ /** Whether provider is healthy */
62
+ healthy: boolean;
63
+ /** Last successful request timestamp */
64
+ lastSuccess?: number;
65
+ /** Last failure timestamp */
66
+ lastFailure?: number;
67
+ /** Consecutive failure count */
68
+ failureCount: number;
69
+ /** Backoff until timestamp (if in cooldown) */
70
+ backoffUntil?: number;
71
+ /** Average latency in ms */
72
+ avgLatencyMs: number;
73
+ /** Total requests made */
74
+ totalRequests: number;
75
+ }
76
+
77
+ /**
78
+ * Provider routing configuration
79
+ */
80
+ export interface ProviderRoutingConfig {
81
+ /** Enable fallback between providers */
82
+ fallbackEnabled: boolean;
83
+ /** Fallback chain (order of providers to try) */
84
+ fallbackChain: ProviderName[];
85
+ /** Latency threshold in ms before trying next provider */
86
+ latencyThresholdMs: number;
87
+ /** Enable health tracking */
88
+ healthTracking: boolean;
89
+ /** Enable load balancing across healthy providers */
90
+ loadBalancing: boolean;
91
+ }
92
+
93
+ /**
94
+ * Resolved provider info for a request
95
+ */
96
+ export interface ResolvedProvider {
97
+ /** Provider configuration */
98
+ config: ProviderConfig;
99
+ /** API key to use */
100
+ apiKey: string;
101
+ /** Full endpoint URL */
102
+ endpoint: string;
103
+ /** Model to use (may be mapped from requested model) */
104
+ model: string;
105
+ }
106
+
107
+ // ============================================================
108
+ // Default Configuration
109
+ // ============================================================
110
+
111
+ /**
112
+ * Default provider routing configuration
113
+ */
114
+ export const DEFAULT_ROUTING_CONFIG: ProviderRoutingConfig = {
115
+ fallbackEnabled: true,
116
+ fallbackChain: ["zhipu", "minimax"],
117
+ latencyThresholdMs: 30000, // 30 seconds
118
+ healthTracking: true,
119
+ loadBalancing: false, // Disabled by default - use primary provider
120
+ };
121
+
122
+ /**
123
+ * Backoff configuration for health tracking
124
+ */
125
+ export const BACKOFF_CONFIG = {
126
+ /** Base backoff in ms */
127
+ baseMs: 60000, // 1 minute
128
+ /** Maximum backoff in ms */
129
+ maxMs: 3600000, // 1 hour
130
+ /** Number of failures before backoff */
131
+ failureThreshold: 3,
132
+ } as const;