@clinebot/core 0.0.35 → 0.0.36

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 (335) hide show
  1. package/README.md +1 -2
  2. package/dist/ClineCore.d.ts +53 -39
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/index.d.ts +1 -1
  5. package/dist/account/index.d.ts.map +1 -1
  6. package/dist/account/rpc.d.ts +6 -6
  7. package/dist/account/rpc.d.ts.map +1 -1
  8. package/dist/cron/index.d.ts +6 -0
  9. package/dist/cron/index.d.ts.map +1 -0
  10. package/dist/cron/resource-limiter.d.ts +9 -0
  11. package/dist/cron/resource-limiter.d.ts.map +1 -0
  12. package/dist/cron/schedule-command-service.d.ts +10 -0
  13. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  14. package/dist/cron/schedule-service.d.ts +100 -0
  15. package/dist/cron/schedule-service.d.ts.map +1 -0
  16. package/dist/cron/scheduler.d.ts +66 -0
  17. package/dist/cron/scheduler.d.ts.map +1 -0
  18. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  19. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  20. package/dist/extensions/config/agent-config-loader.d.ts +4 -3
  21. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  23. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  24. package/dist/extensions/config/user-instruction-config-loader.d.ts +1 -0
  25. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  27. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  28. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  29. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  30. package/dist/extensions/context/compaction.d.ts.map +1 -1
  31. package/dist/extensions/plugin/plugin-config-loader.d.ts +9 -2
  32. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  33. package/dist/extensions/plugin/plugin-loader.d.ts +5 -3
  34. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  35. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  36. package/dist/extensions/plugin/plugin-sandbox.d.ts +15 -2
  37. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  38. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  39. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  40. package/dist/extensions/plugin-sandbox-bootstrap.js +211 -211
  41. package/dist/extensions/tools/definitions.d.ts +1 -1
  42. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  43. package/dist/extensions/tools/executors/apply-patch.d.ts +3 -1
  44. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -1
  45. package/dist/extensions/tools/executors/search.d.ts +1 -1
  46. package/dist/extensions/tools/executors/search.d.ts.map +1 -1
  47. package/dist/extensions/tools/index.d.ts +2 -0
  48. package/dist/extensions/tools/index.d.ts.map +1 -1
  49. package/dist/extensions/tools/presets.d.ts +26 -43
  50. package/dist/extensions/tools/presets.d.ts.map +1 -1
  51. package/dist/extensions/tools/runtime.d.ts +25 -0
  52. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  53. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  54. package/dist/extensions/tools/team/team-tools.d.ts +1 -0
  55. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  56. package/dist/hooks/hook-file-hooks.d.ts +4 -1
  57. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  58. package/dist/hooks/index.d.ts +0 -1
  59. package/dist/hooks/index.d.ts.map +1 -1
  60. package/dist/hooks/subprocess.d.ts +8 -1
  61. package/dist/hooks/subprocess.d.ts.map +1 -1
  62. package/dist/hub/browser-websocket.d.ts +18 -0
  63. package/dist/hub/browser-websocket.d.ts.map +1 -0
  64. package/dist/hub/client.d.ts +45 -0
  65. package/dist/hub/client.d.ts.map +1 -0
  66. package/dist/hub/connect.d.ts +15 -0
  67. package/dist/hub/connect.d.ts.map +1 -0
  68. package/dist/hub/daemon-entry.d.ts +2 -0
  69. package/dist/hub/daemon-entry.d.ts.map +1 -0
  70. package/dist/hub/daemon-entry.js +1045 -0
  71. package/dist/hub/daemon.d.ts +5 -0
  72. package/dist/hub/daemon.d.ts.map +1 -0
  73. package/dist/hub/defaults.d.ts +13 -0
  74. package/dist/hub/defaults.d.ts.map +1 -0
  75. package/dist/hub/discovery.d.ts +29 -0
  76. package/dist/hub/discovery.d.ts.map +1 -0
  77. package/dist/hub/index.d.ts +15 -0
  78. package/dist/hub/index.d.ts.map +1 -0
  79. package/dist/hub/index.js +1044 -0
  80. package/dist/hub/native-transport.d.ts +17 -0
  81. package/dist/hub/native-transport.d.ts.map +1 -0
  82. package/dist/hub/runtime-handlers.d.ts +11 -0
  83. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  84. package/dist/hub/server.d.ts +86 -0
  85. package/dist/hub/server.d.ts.map +1 -0
  86. package/dist/hub/session-client.d.ts +87 -0
  87. package/dist/hub/session-client.d.ts.map +1 -0
  88. package/dist/hub/start-shared-server.d.ts +19 -0
  89. package/dist/hub/start-shared-server.d.ts.map +1 -0
  90. package/dist/hub/transport.d.ts +8 -0
  91. package/dist/hub/transport.d.ts.map +1 -0
  92. package/dist/hub/ui-client.d.ts +44 -0
  93. package/dist/hub/ui-client.d.ts.map +1 -0
  94. package/dist/hub/workspace.d.ts +4 -0
  95. package/dist/hub/workspace.d.ts.map +1 -0
  96. package/dist/index.d.ts +26 -15
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +498 -476
  99. package/dist/llms/configured-provider-registry.d.ts +28 -0
  100. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  101. package/dist/llms/provider-defaults.d.ts +27 -0
  102. package/dist/llms/provider-defaults.d.ts.map +1 -0
  103. package/dist/llms/provider-settings.d.ts +202 -0
  104. package/dist/llms/provider-settings.d.ts.map +1 -0
  105. package/dist/llms/runtime-config.d.ts +4 -0
  106. package/dist/llms/runtime-config.d.ts.map +1 -0
  107. package/dist/llms/runtime-registry.d.ts +20 -0
  108. package/dist/llms/runtime-registry.d.ts.map +1 -0
  109. package/dist/llms/runtime-types.d.ts +85 -0
  110. package/dist/llms/runtime-types.d.ts.map +1 -0
  111. package/dist/runtime/host.d.ts +1 -2
  112. package/dist/runtime/host.d.ts.map +1 -1
  113. package/dist/runtime/rules.d.ts +1 -0
  114. package/dist/runtime/rules.d.ts.map +1 -1
  115. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  116. package/dist/runtime/runtime-host.d.ts +22 -24
  117. package/dist/runtime/runtime-host.d.ts.map +1 -1
  118. package/dist/runtime/runtime-oauth-token-manager.d.ts.map +1 -1
  119. package/dist/runtime/session-runtime.d.ts +1 -19
  120. package/dist/runtime/session-runtime.d.ts.map +1 -1
  121. package/dist/services/global-settings.d.ts +12 -0
  122. package/dist/services/global-settings.d.ts.map +1 -0
  123. package/dist/services/local-runtime-bootstrap.d.ts +9 -3
  124. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  125. package/dist/services/plugin-tools.d.ts +16 -0
  126. package/dist/services/plugin-tools.d.ts.map +1 -0
  127. package/dist/services/providers/local-provider-registry.d.ts +4 -4
  128. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  129. package/dist/services/providers/local-provider-service.d.ts +13 -13
  130. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  131. package/dist/services/session-data.d.ts +1 -1
  132. package/dist/services/session-data.d.ts.map +1 -1
  133. package/dist/services/storage/provider-settings-legacy-migration.d.ts +1 -1
  134. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  135. package/dist/services/telemetry/index.js +28 -15
  136. package/dist/services/workspace-manifest.d.ts +11 -0
  137. package/dist/services/workspace-manifest.d.ts.map +1 -1
  138. package/dist/session/persistence-service.d.ts +11 -23
  139. package/dist/session/persistence-service.d.ts.map +1 -1
  140. package/dist/session/session-manifest-store.d.ts +22 -0
  141. package/dist/session/session-manifest-store.d.ts.map +1 -0
  142. package/dist/session/session-row.d.ts +93 -0
  143. package/dist/session/session-row.d.ts.map +1 -0
  144. package/dist/session/session-service.d.ts +2 -102
  145. package/dist/session/session-service.d.ts.map +1 -1
  146. package/dist/session/subagent-session-manager.d.ts +36 -0
  147. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  148. package/dist/session/team-persistence-store.d.ts +24 -0
  149. package/dist/session/team-persistence-store.d.ts.map +1 -0
  150. package/dist/transports/hub.d.ts +47 -0
  151. package/dist/transports/hub.d.ts.map +1 -0
  152. package/dist/transports/local.d.ts +10 -6
  153. package/dist/transports/local.d.ts.map +1 -1
  154. package/dist/transports/remote.d.ts +10 -0
  155. package/dist/transports/remote.d.ts.map +1 -0
  156. package/dist/transports/runtime-host-support.d.ts +3 -2
  157. package/dist/transports/runtime-host-support.d.ts.map +1 -1
  158. package/dist/types/chat-schema.d.ts +10 -12
  159. package/dist/types/chat-schema.d.ts.map +1 -1
  160. package/dist/types/config.d.ts +8 -7
  161. package/dist/types/config.d.ts.map +1 -1
  162. package/dist/types/provider-settings.d.ts +4 -5
  163. package/dist/types/provider-settings.d.ts.map +1 -1
  164. package/dist/types/session.d.ts +2 -1
  165. package/dist/types/session.d.ts.map +1 -1
  166. package/dist/types.d.ts +8 -1
  167. package/dist/types.d.ts.map +1 -1
  168. package/package.json +20 -6
  169. package/src/ClineCore.ts +68 -40
  170. package/src/account/index.ts +3 -3
  171. package/src/account/rpc.ts +12 -12
  172. package/src/cron/index.ts +5 -0
  173. package/src/cron/resource-limiter.ts +46 -0
  174. package/src/cron/schedule-command-service.ts +193 -0
  175. package/src/cron/schedule-service.ts +703 -0
  176. package/src/cron/scheduler.ts +637 -0
  177. package/src/cron/sqlite-schedule-store.ts +708 -0
  178. package/src/extensions/config/agent-config-loader.ts +17 -7
  179. package/src/extensions/config/runtime-commands.ts +6 -0
  180. package/src/extensions/config/user-instruction-config-loader.ts +1 -0
  181. package/src/extensions/context/agentic-compaction.ts +3 -3
  182. package/src/extensions/context/basic-compaction.ts +2 -2
  183. package/src/extensions/context/compaction-shared.ts +5 -4
  184. package/src/extensions/context/compaction.ts +3 -3
  185. package/src/extensions/plugin/plugin-config-loader.ts +17 -2
  186. package/src/extensions/plugin/plugin-loader.ts +48 -4
  187. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  188. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +93 -39
  189. package/src/extensions/plugin/plugin-sandbox.ts +47 -27
  190. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  191. package/src/extensions/tools/definitions.ts +30 -49
  192. package/src/extensions/tools/executors/apply-patch.ts +69 -80
  193. package/src/extensions/tools/executors/search.ts +195 -3
  194. package/src/extensions/tools/index.ts +10 -0
  195. package/src/extensions/tools/presets.ts +31 -46
  196. package/src/extensions/tools/runtime.ts +261 -0
  197. package/src/extensions/tools/schemas.ts +4 -2
  198. package/src/extensions/tools/team/team-tools.ts +21 -0
  199. package/src/hooks/hook-file-hooks.ts +8 -2
  200. package/src/hooks/index.ts +0 -7
  201. package/src/hooks/subprocess-runner.ts +1 -1
  202. package/src/hooks/subprocess.ts +9 -0
  203. package/src/hub/browser-websocket.ts +137 -0
  204. package/src/hub/client.ts +574 -0
  205. package/src/hub/connect.ts +156 -0
  206. package/src/hub/daemon-entry.ts +87 -0
  207. package/src/hub/daemon.ts +181 -0
  208. package/src/hub/defaults.ts +43 -0
  209. package/src/hub/discovery.ts +247 -0
  210. package/src/hub/index.ts +14 -0
  211. package/src/hub/native-transport.ts +31 -0
  212. package/src/hub/runtime-handlers.ts +140 -0
  213. package/src/hub/server.ts +1888 -0
  214. package/src/hub/session-client.ts +460 -0
  215. package/src/hub/start-shared-server.ts +58 -0
  216. package/src/hub/transport.ts +14 -0
  217. package/src/hub/ui-client.ts +122 -0
  218. package/src/hub/workspace.ts +19 -0
  219. package/src/index.ts +124 -68
  220. package/src/llms/configured-provider-registry.ts +193 -0
  221. package/src/llms/provider-defaults.ts +637 -0
  222. package/src/llms/provider-settings.ts +263 -0
  223. package/src/llms/runtime-config.ts +43 -0
  224. package/src/llms/runtime-registry.ts +171 -0
  225. package/src/llms/runtime-types.ts +121 -0
  226. package/src/runtime/host.ts +107 -269
  227. package/src/runtime/index.ts +1 -0
  228. package/src/runtime/rules.ts +12 -0
  229. package/src/runtime/runtime-builder.ts +24 -8
  230. package/src/runtime/runtime-host.ts +89 -61
  231. package/src/runtime/runtime-oauth-token-manager.ts +11 -15
  232. package/src/runtime/session-runtime.ts +0 -24
  233. package/src/services/global-settings.ts +122 -0
  234. package/src/services/local-runtime-bootstrap.ts +51 -13
  235. package/src/services/plugin-tools.ts +85 -0
  236. package/src/services/providers/local-provider-registry.ts +6 -6
  237. package/src/services/providers/local-provider-service.ts +42 -37
  238. package/src/services/session-data.ts +15 -9
  239. package/src/services/storage/provider-settings-legacy-migration.ts +6 -4
  240. package/src/services/storage/provider-settings-manager.ts +1 -1
  241. package/src/services/workspace-manifest.ts +18 -0
  242. package/src/session/file-session-service.ts +1 -1
  243. package/src/session/index.ts +6 -27
  244. package/src/session/persistence-service.ts +119 -504
  245. package/src/session/session-manifest-store.ts +158 -0
  246. package/src/session/session-row.ts +199 -0
  247. package/src/session/session-service.ts +17 -376
  248. package/src/session/session-team-coordination.ts +1 -1
  249. package/src/session/subagent-session-manager.ts +397 -0
  250. package/src/session/team-persistence-store.ts +176 -0
  251. package/src/transports/hub.ts +656 -0
  252. package/src/transports/local.ts +135 -40
  253. package/src/transports/remote.ts +26 -0
  254. package/src/transports/runtime-host-support.ts +63 -9
  255. package/src/types/chat-schema.ts +4 -5
  256. package/src/types/config.ts +8 -7
  257. package/src/types/provider-settings.ts +11 -7
  258. package/src/types/session.ts +2 -4
  259. package/src/types.ts +27 -1
  260. package/dist/hooks/persistent.d.ts +0 -64
  261. package/dist/hooks/persistent.d.ts.map +0 -1
  262. package/dist/runtime/rpc-runtime-ensure.d.ts +0 -65
  263. package/dist/runtime/rpc-runtime-ensure.d.ts.map +0 -1
  264. package/dist/runtime/rpc-spawn-lease.d.ts +0 -8
  265. package/dist/runtime/rpc-spawn-lease.d.ts.map +0 -1
  266. package/dist/session/rpc-session-service.d.ts +0 -16
  267. package/dist/session/rpc-session-service.d.ts.map +0 -1
  268. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  269. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  270. package/dist/transports/rpc.d.ts +0 -51
  271. package/dist/transports/rpc.d.ts.map +0 -1
  272. package/src/ClineCore.test.ts +0 -226
  273. package/src/account/cline-account-service.test.ts +0 -185
  274. package/src/account/featurebase-token.test.ts +0 -175
  275. package/src/account/rpc.test.ts +0 -63
  276. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  277. package/src/auth/client.test.ts +0 -69
  278. package/src/auth/cline.test.ts +0 -267
  279. package/src/auth/codex.test.ts +0 -170
  280. package/src/auth/oca.test.ts +0 -340
  281. package/src/auth/server.test.ts +0 -287
  282. package/src/auth/utils.test.ts +0 -128
  283. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  284. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  285. package/src/extensions/config/runtime-commands.test.ts +0 -115
  286. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  287. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  288. package/src/extensions/context/compaction.test.ts +0 -483
  289. package/src/extensions/mcp/config-loader.test.ts +0 -238
  290. package/src/extensions/mcp/manager.test.ts +0 -105
  291. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -184
  292. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  293. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  294. package/src/extensions/tools/definitions.test.ts +0 -780
  295. package/src/extensions/tools/executors/bash.test.ts +0 -87
  296. package/src/extensions/tools/executors/editor.test.ts +0 -35
  297. package/src/extensions/tools/executors/file-read.test.ts +0 -125
  298. package/src/extensions/tools/model-tool-routing.test.ts +0 -86
  299. package/src/extensions/tools/presets.test.ts +0 -70
  300. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +0 -455
  301. package/src/extensions/tools/team/spawn-agent-tool.test.ts +0 -381
  302. package/src/extensions/tools/team/team-tools.test.ts +0 -918
  303. package/src/hooks/checkpoint-hooks.test.ts +0 -168
  304. package/src/hooks/hook-file-hooks.test.ts +0 -311
  305. package/src/hooks/persistent.ts +0 -661
  306. package/src/runtime/history.test.ts +0 -114
  307. package/src/runtime/host.test.ts +0 -230
  308. package/src/runtime/rpc-runtime-ensure.test.ts +0 -123
  309. package/src/runtime/rpc-runtime-ensure.ts +0 -659
  310. package/src/runtime/rpc-spawn-lease.test.ts +0 -81
  311. package/src/runtime/rpc-spawn-lease.ts +0 -156
  312. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -245
  313. package/src/runtime/runtime-builder.test.ts +0 -615
  314. package/src/runtime/runtime-oauth-token-manager.test.ts +0 -137
  315. package/src/runtime/runtime-parity.test.ts +0 -143
  316. package/src/services/providers/local-provider-service.test.ts +0 -1062
  317. package/src/services/session-data.test.ts +0 -160
  318. package/src/services/storage/provider-settings-legacy-migration.test.ts +0 -424
  319. package/src/services/storage/provider-settings-manager.test.ts +0 -191
  320. package/src/services/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  321. package/src/services/telemetry/OpenTelemetryProvider.test.ts +0 -326
  322. package/src/services/telemetry/TelemetryLoggerSink.test.ts +0 -42
  323. package/src/services/telemetry/TelemetryService.test.ts +0 -134
  324. package/src/services/telemetry/distinct-id.test.ts +0 -57
  325. package/src/services/workspace/file-indexer.d.ts +0 -11
  326. package/src/services/workspace/file-indexer.test.ts +0 -156
  327. package/src/services/workspace/mention-enricher.test.ts +0 -106
  328. package/src/session/persistence-service.test.ts +0 -300
  329. package/src/session/rpc-session-service.ts +0 -114
  330. package/src/session/session-service.team-persistence.test.ts +0 -48
  331. package/src/session/sqlite-rpc-session-backend.ts +0 -301
  332. package/src/transports/local.e2e.test.ts +0 -380
  333. package/src/transports/local.test.ts +0 -2559
  334. package/src/transports/rpc.test.ts +0 -82
  335. package/src/transports/rpc.ts +0 -665
@@ -0,0 +1,637 @@
1
+ /** biome-ignore-all lint/style/noNonNullAssertion: static */
2
+
3
+ import * as Llms from "@clinebot/llms";
4
+ import type {
5
+ ModelCatalogConfig,
6
+ ModelInfo,
7
+ ProviderCapability,
8
+ ProviderConfig,
9
+ } from "./provider-settings";
10
+
11
+ export interface BuiltInProviderManifest {
12
+ id: string;
13
+ baseUrl: string;
14
+ modelId: string;
15
+ knownModels?: Record<string, ModelInfo>;
16
+ capabilities?: Llms.CatalogProviderCapability[];
17
+ env?: readonly string[];
18
+ client: Llms.ProviderClient;
19
+ protocol?: Llms.ProviderProtocol;
20
+ }
21
+
22
+ function cloneKnownModels(
23
+ models: Record<string, ModelInfo>,
24
+ ): Record<string, ModelInfo> {
25
+ return Object.fromEntries(
26
+ Object.entries(models).map(([id, info]) => [id, { ...info }]),
27
+ ) as Record<string, ModelInfo>;
28
+ }
29
+
30
+ function isOpenAICompatibleManifest(
31
+ manifest: BuiltInProviderManifest,
32
+ ): boolean {
33
+ if (manifest.baseUrl.length === 0) {
34
+ return false;
35
+ }
36
+ switch (manifest.client) {
37
+ case "openai-compatible":
38
+ case "openai":
39
+ case "openai-r1":
40
+ case "fetch":
41
+ return true;
42
+ default:
43
+ return manifest.protocol === "openai-chat";
44
+ }
45
+ }
46
+
47
+ const BUILTIN_PROVIDER_MANIFESTS: BuiltInProviderManifest[] = Object.values(
48
+ Llms.MODEL_COLLECTIONS_BY_PROVIDER_ID,
49
+ ).map((collection) => ({
50
+ id: collection.provider.id,
51
+ baseUrl: collection.provider.baseUrl ?? "",
52
+ modelId: collection.provider.defaultModelId,
53
+ knownModels: cloneKnownModels(collection.models),
54
+ capabilities: collection.provider.capabilities
55
+ ? [...collection.provider.capabilities]
56
+ : undefined,
57
+ env: collection.provider.env ? [...collection.provider.env] : undefined,
58
+ client: collection.provider.client,
59
+ protocol: collection.provider.protocol,
60
+ }));
61
+
62
+ const BUILTIN_PROVIDER_MANIFESTS_BY_ID: Record<
63
+ string,
64
+ BuiltInProviderManifest
65
+ > = Object.fromEntries(
66
+ BUILTIN_PROVIDER_MANIFESTS.map((manifest) => [manifest.id, manifest]),
67
+ );
68
+
69
+ function getBuiltInProviderManifest(
70
+ providerId: string,
71
+ ): BuiltInProviderManifest | undefined {
72
+ return BUILTIN_PROVIDER_MANIFESTS_BY_ID[providerId];
73
+ }
74
+
75
+ function getOpenAICompatibleProviderManifests(): Record<
76
+ string,
77
+ BuiltInProviderManifest
78
+ > {
79
+ return Object.fromEntries(
80
+ Object.entries(BUILTIN_PROVIDER_MANIFESTS_BY_ID).filter(([, manifest]) =>
81
+ isOpenAICompatibleManifest(manifest),
82
+ ),
83
+ );
84
+ }
85
+
86
+ export interface ProviderDefaults {
87
+ baseUrl: string;
88
+ modelId: string;
89
+ knownModels?: Record<string, ModelInfo>;
90
+ capabilities?: ProviderCapability[];
91
+ }
92
+
93
+ function toRuntimeCapabilities(
94
+ capabilities: readonly Llms.CatalogProviderCapability[] = [],
95
+ ): ProviderCapability[] | undefined {
96
+ const next = capabilities.flatMap((capability) => {
97
+ switch (capability) {
98
+ case "reasoning":
99
+ case "prompt-cache":
100
+ case "tools":
101
+ case "oauth":
102
+ return [capability satisfies ProviderCapability];
103
+ default:
104
+ return [];
105
+ }
106
+ });
107
+ return next.length > 0 ? next : undefined;
108
+ }
109
+
110
+ export const DEFAULT_MODELS_CATALOG_URL = "https://models.dev/api.json";
111
+ const DEFAULT_MODELS_CATALOG_CACHE_TTL_MS = 10 * 60 * 1000;
112
+ const DEFAULT_PRIVATE_MODELS_CACHE_TTL_MS = 5 * 60 * 1000;
113
+ const DEFAULT_PRIVATE_MODELS_REQUEST_TIMEOUT_MS = 5_000;
114
+
115
+ const MODELS_CATALOG_CACHE = new Map<
116
+ string,
117
+ { expiresAt: number; data: Record<string, Record<string, ModelInfo>> }
118
+ >();
119
+ const MODELS_CATALOG_IN_FLIGHT = new Map<
120
+ string,
121
+ Promise<Record<string, Record<string, ModelInfo>>>
122
+ >();
123
+ const PRIVATE_MODELS_CACHE = new Map<
124
+ string,
125
+ { expiresAt: number; data: Record<string, ModelInfo> }
126
+ >();
127
+ const PRIVATE_MODELS_IN_FLIGHT = new Map<
128
+ string,
129
+ Promise<Record<string, ModelInfo>>
130
+ >();
131
+
132
+ async function loadGeneratedProviderModels(): Promise<
133
+ Record<string, Record<string, ModelInfo>>
134
+ > {
135
+ return Llms.getGeneratedProviderModels();
136
+ }
137
+
138
+ async function mergeKnownModels(
139
+ providerId: string,
140
+ defaultKnownModels: Record<string, ModelInfo> = {},
141
+ liveModels: Record<string, ModelInfo> = {},
142
+ privateModels: Record<string, ModelInfo> = {},
143
+ userKnownModels: Record<string, ModelInfo> = {},
144
+ ): Promise<Record<string, ModelInfo>> {
145
+ const generatedProviderModels = await loadGeneratedProviderModels();
146
+ const generatedKeys = Llms.resolveProviderModelCatalogKeys(providerId);
147
+ const generated = Object.assign(
148
+ {},
149
+ ...generatedKeys.map(
150
+ (generatedKey) => generatedProviderModels[generatedKey] ?? {},
151
+ ),
152
+ );
153
+ return Llms.sortModelsByReleaseDate({
154
+ ...generated,
155
+ ...defaultKnownModels,
156
+ ...liveModels,
157
+ ...privateModels,
158
+ ...userKnownModels,
159
+ });
160
+ }
161
+
162
+ function normalizeBaseUrl(baseUrl: string | undefined): string {
163
+ const value = baseUrl?.trim();
164
+ return value && value.length > 0 ? value : "";
165
+ }
166
+
167
+ function resolveAuthToken(
168
+ config: Pick<ProviderConfig, "apiKey" | "accessToken">,
169
+ ): string | undefined {
170
+ const token = config.apiKey?.trim() || config.accessToken?.trim();
171
+ return token && token.length > 0 ? token : undefined;
172
+ }
173
+
174
+ function fingerprint(value: string): string {
175
+ let hash = 2166136261;
176
+ for (let i = 0; i < value.length; i += 1) {
177
+ hash ^= value.charCodeAt(i);
178
+ hash +=
179
+ (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
180
+ }
181
+ return (hash >>> 0).toString(16);
182
+ }
183
+
184
+ function resolvePrivateCacheKey(
185
+ providerId: string,
186
+ config: ProviderConfig,
187
+ ): string {
188
+ return `${providerId}:${normalizeBaseUrl(config.baseUrl)}:${fingerprint(resolveAuthToken(config) ?? "")}`;
189
+ }
190
+
191
+ async function fetchWithTimeout(
192
+ input: string,
193
+ init: RequestInit,
194
+ timeoutMs = DEFAULT_PRIVATE_MODELS_REQUEST_TIMEOUT_MS,
195
+ ): Promise<Response> {
196
+ const controller = new AbortController();
197
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
198
+ try {
199
+ return await fetch(input, {
200
+ ...init,
201
+ signal: controller.signal,
202
+ });
203
+ } finally {
204
+ clearTimeout(timer);
205
+ }
206
+ }
207
+
208
+ function includeCapability(
209
+ capabilities: NonNullable<ModelInfo["capabilities"]>,
210
+ capability: NonNullable<ModelInfo["capabilities"]>[number],
211
+ when: boolean,
212
+ ): void {
213
+ if (when && !capabilities.includes(capability)) {
214
+ capabilities.push(capability);
215
+ }
216
+ }
217
+
218
+ function buildModelFromPrivateSource(
219
+ id: string,
220
+ input: {
221
+ name?: string;
222
+ contextWindow?: number;
223
+ maxTokens?: number;
224
+ supportsImages?: boolean;
225
+ supportsPromptCache?: boolean;
226
+ supportsReasoning?: boolean;
227
+ releaseDate?: string;
228
+ },
229
+ ): ModelInfo {
230
+ const capabilities: NonNullable<ModelInfo["capabilities"]> = [
231
+ "streaming",
232
+ "tools",
233
+ ];
234
+ includeCapability(capabilities, "images", Boolean(input.supportsImages));
235
+ includeCapability(
236
+ capabilities,
237
+ "prompt-cache",
238
+ Boolean(input.supportsPromptCache),
239
+ );
240
+ includeCapability(
241
+ capabilities,
242
+ "reasoning",
243
+ Boolean(input.supportsReasoning),
244
+ );
245
+ return {
246
+ id,
247
+ name: input.name ?? id,
248
+ contextWindow: input.contextWindow,
249
+ maxTokens: input.maxTokens,
250
+ capabilities,
251
+ releaseDate: input.releaseDate,
252
+ status: "active",
253
+ };
254
+ }
255
+
256
+ interface BasetenModelResponse {
257
+ id?: string;
258
+ object?: string;
259
+ supported_features?: string[];
260
+ context_length?: number;
261
+ max_completion_tokens?: number;
262
+ }
263
+
264
+ async function fetchBasetenPrivateModels(
265
+ _config: ProviderConfig,
266
+ token: string,
267
+ ): Promise<Record<string, ModelInfo>> {
268
+ const response = await fetchWithTimeout(
269
+ "https://inference.baseten.co/v1/models",
270
+ {
271
+ method: "GET",
272
+ headers: {
273
+ Authorization: `Bearer ${token}`,
274
+ "Content-Type": "application/json",
275
+ },
276
+ },
277
+ );
278
+ if (!response.ok) {
279
+ throw new Error(`Baseten model refresh failed: HTTP ${response.status}`);
280
+ }
281
+
282
+ const payload = (await response.json()) as { data?: BasetenModelResponse[] };
283
+ const entries = payload?.data ?? [];
284
+ const models: Record<string, ModelInfo> = {};
285
+ for (const model of entries) {
286
+ const id = model.id?.trim();
287
+ if (!id) {
288
+ continue;
289
+ }
290
+ if (
291
+ id.includes("whisper") ||
292
+ id.includes("tts") ||
293
+ id.includes("embedding")
294
+ ) {
295
+ continue;
296
+ }
297
+ const features = model.supported_features ?? [];
298
+ models[id] = buildModelFromPrivateSource(id, {
299
+ name: id,
300
+ contextWindow: model.context_length,
301
+ maxTokens: model.max_completion_tokens,
302
+ supportsReasoning:
303
+ features.includes("reasoning") || features.includes("reasoning_effort"),
304
+ supportsImages: false,
305
+ });
306
+ }
307
+ return models;
308
+ }
309
+
310
+ interface HicapModelResponse {
311
+ id?: string;
312
+ }
313
+
314
+ async function fetchHicapPrivateModels(
315
+ _config: ProviderConfig,
316
+ token: string,
317
+ ): Promise<Record<string, ModelInfo>> {
318
+ const response = await fetchWithTimeout(
319
+ "https://api.hicap.ai/v2/openai/models",
320
+ {
321
+ method: "GET",
322
+ headers: {
323
+ "api-key": token,
324
+ },
325
+ },
326
+ );
327
+ if (!response.ok) {
328
+ throw new Error(`Hicap model refresh failed: HTTP ${response.status}`);
329
+ }
330
+
331
+ const payload = (await response.json()) as { data?: HicapModelResponse[] };
332
+ const entries = payload?.data ?? [];
333
+ const models: Record<string, ModelInfo> = {};
334
+ for (const model of entries) {
335
+ const id = model.id?.trim();
336
+ if (!id) {
337
+ continue;
338
+ }
339
+ models[id] = buildModelFromPrivateSource(id, {
340
+ name: id,
341
+ contextWindow: 128_000,
342
+ supportsImages: true,
343
+ supportsPromptCache: true,
344
+ });
345
+ }
346
+ return models;
347
+ }
348
+
349
+ interface LiteLlmModelInfoResponse {
350
+ model_name?: string;
351
+ litellm_params?: {
352
+ model?: string;
353
+ };
354
+ model_info?: {
355
+ max_output_tokens?: number;
356
+ max_tokens?: number;
357
+ max_input_tokens?: number;
358
+ supports_vision?: boolean;
359
+ supports_prompt_caching?: boolean;
360
+ supports_reasoning?: boolean;
361
+ };
362
+ }
363
+
364
+ function normalizeLiteLlmBaseUrl(baseUrl: string | undefined): string {
365
+ const normalized = normalizeBaseUrl(baseUrl);
366
+ if (!normalized) {
367
+ return "http://localhost:4000";
368
+ }
369
+ return normalized.endsWith("/v1") ? normalized.slice(0, -3) : normalized;
370
+ }
371
+
372
+ async function fetchLiteLlmPrivateModels(
373
+ config: ProviderConfig,
374
+ token: string,
375
+ ): Promise<Record<string, ModelInfo>> {
376
+ const baseUrl = normalizeLiteLlmBaseUrl(config.baseUrl);
377
+ const endpoint = `${baseUrl}/v1/model/info`;
378
+
379
+ const fetchWithHeaders = async (
380
+ headers: Record<string, string>,
381
+ ): Promise<Response> =>
382
+ fetchWithTimeout(endpoint, {
383
+ method: "GET",
384
+ headers: {
385
+ accept: "application/json",
386
+ ...headers,
387
+ },
388
+ });
389
+
390
+ let response = await fetchWithHeaders({ "x-litellm-api-key": token });
391
+ if (!response.ok) {
392
+ response = await fetchWithHeaders({ Authorization: `Bearer ${token}` });
393
+ }
394
+ if (!response.ok) {
395
+ throw new Error(`LiteLLM model refresh failed: HTTP ${response.status}`);
396
+ }
397
+
398
+ const payload = (await response.json()) as {
399
+ data?: LiteLlmModelInfoResponse[];
400
+ };
401
+ const entries = payload?.data ?? [];
402
+ const models: Record<string, ModelInfo> = {};
403
+ for (const model of entries) {
404
+ const displayName = model.model_name?.trim();
405
+ const actualModelId = model.litellm_params?.model?.trim();
406
+ const modelId = actualModelId || displayName;
407
+ if (!modelId) {
408
+ continue;
409
+ }
410
+ const info = model.model_info;
411
+ const converted = buildModelFromPrivateSource(modelId, {
412
+ name: displayName ?? modelId,
413
+ maxTokens: info?.max_output_tokens ?? info?.max_tokens,
414
+ contextWindow: info?.max_input_tokens ?? info?.max_tokens,
415
+ supportsImages: info?.supports_vision,
416
+ supportsPromptCache: info?.supports_prompt_caching,
417
+ supportsReasoning: info?.supports_reasoning,
418
+ });
419
+ models[modelId] = converted;
420
+ if (displayName) {
421
+ models[displayName] = {
422
+ ...converted,
423
+ id: displayName,
424
+ name: displayName,
425
+ };
426
+ }
427
+ }
428
+ return models;
429
+ }
430
+
431
+ type PrivateProviderModelFetcher = (
432
+ config: ProviderConfig,
433
+ token: string,
434
+ ) => Promise<Record<string, ModelInfo>>;
435
+
436
+ const PRIVATE_PROVIDER_MODEL_FETCHERS: Record<
437
+ string,
438
+ PrivateProviderModelFetcher
439
+ > = {
440
+ baseten: fetchBasetenPrivateModels,
441
+ hicap: fetchHicapPrivateModels,
442
+ litellm: fetchLiteLlmPrivateModels,
443
+ };
444
+
445
+ async function fetchPrivateProviderModels(
446
+ providerId: string,
447
+ config: ProviderConfig,
448
+ ): Promise<Record<string, ModelInfo>> {
449
+ const token = resolveAuthToken(config);
450
+ if (!token) {
451
+ return {};
452
+ }
453
+
454
+ const fetcher = PRIVATE_PROVIDER_MODEL_FETCHERS[providerId];
455
+ if (!fetcher) {
456
+ return {};
457
+ }
458
+ return fetcher(config, token);
459
+ }
460
+
461
+ function shouldLoadPrivateModels(
462
+ providerId: string,
463
+ modelCatalog: ModelCatalogConfig | undefined,
464
+ config: ProviderConfig | undefined,
465
+ ): boolean {
466
+ if (!config) {
467
+ return false;
468
+ }
469
+ if (!PRIVATE_PROVIDER_MODEL_FETCHERS[providerId]) {
470
+ return false;
471
+ }
472
+ if (modelCatalog?.loadPrivateOnAuth === false) {
473
+ return false;
474
+ }
475
+ return Boolean(resolveAuthToken(config));
476
+ }
477
+
478
+ async function getPrivateProviderModels(
479
+ providerId: string,
480
+ modelCatalog: ModelCatalogConfig | undefined,
481
+ config: ProviderConfig,
482
+ ): Promise<Record<string, ModelInfo>> {
483
+ const cacheTtlMs =
484
+ modelCatalog?.cacheTtlMs ?? DEFAULT_PRIVATE_MODELS_CACHE_TTL_MS;
485
+ const cacheKey = resolvePrivateCacheKey(providerId, config);
486
+ const now = Date.now();
487
+
488
+ const cached = PRIVATE_MODELS_CACHE.get(cacheKey);
489
+ if (cached && cached.expiresAt > now) {
490
+ return cached.data;
491
+ }
492
+
493
+ const inFlight = PRIVATE_MODELS_IN_FLIGHT.get(cacheKey);
494
+ if (inFlight) {
495
+ return inFlight;
496
+ }
497
+
498
+ const request = fetchPrivateProviderModels(providerId, config)
499
+ .then((data) => {
500
+ PRIVATE_MODELS_CACHE.set(cacheKey, {
501
+ data,
502
+ expiresAt: now + cacheTtlMs,
503
+ });
504
+ return data;
505
+ })
506
+ .finally(() => {
507
+ PRIVATE_MODELS_IN_FLIGHT.delete(cacheKey);
508
+ });
509
+
510
+ PRIVATE_MODELS_IN_FLIGHT.set(cacheKey, request);
511
+ return request;
512
+ }
513
+
514
+ async function fetchLiveModelsCatalog(
515
+ url: string,
516
+ ): Promise<Record<string, Record<string, ModelInfo>>> {
517
+ return Llms.fetchModelsDevProviderModels(url);
518
+ }
519
+
520
+ export async function getLiveModelsCatalog(
521
+ options: Pick<ModelCatalogConfig, "url" | "cacheTtlMs"> = {},
522
+ ): Promise<Record<string, Record<string, ModelInfo>>> {
523
+ const url = options.url ?? DEFAULT_MODELS_CATALOG_URL;
524
+ const cacheTtlMs = options.cacheTtlMs ?? DEFAULT_MODELS_CATALOG_CACHE_TTL_MS;
525
+ const now = Date.now();
526
+
527
+ const cached = MODELS_CATALOG_CACHE.get(url);
528
+ if (cached && cached.expiresAt > now) {
529
+ return cached.data;
530
+ }
531
+
532
+ const inFlight = MODELS_CATALOG_IN_FLIGHT.get(url);
533
+ if (inFlight) {
534
+ return inFlight;
535
+ }
536
+
537
+ const request = fetchLiveModelsCatalog(url)
538
+ .then((data) => {
539
+ MODELS_CATALOG_CACHE.set(url, { data, expiresAt: now + cacheTtlMs });
540
+ return data;
541
+ })
542
+ .finally(() => {
543
+ MODELS_CATALOG_IN_FLIGHT.delete(url);
544
+ });
545
+
546
+ MODELS_CATALOG_IN_FLIGHT.set(url, request);
547
+ return request;
548
+ }
549
+
550
+ export function clearLiveModelsCatalogCache(url?: string): void {
551
+ if (url) {
552
+ MODELS_CATALOG_CACHE.delete(url);
553
+ MODELS_CATALOG_IN_FLIGHT.delete(url);
554
+ return;
555
+ }
556
+
557
+ MODELS_CATALOG_CACHE.clear();
558
+ MODELS_CATALOG_IN_FLIGHT.clear();
559
+ }
560
+
561
+ export function clearPrivateModelsCatalogCache(): void {
562
+ PRIVATE_MODELS_CACHE.clear();
563
+ PRIVATE_MODELS_IN_FLIGHT.clear();
564
+ }
565
+
566
+ function toRuntimeProviderDefaults(
567
+ manifests: ReturnType<typeof getOpenAICompatibleProviderManifests>,
568
+ ): Record<string, ProviderDefaults> {
569
+ return Object.fromEntries(
570
+ Object.entries(manifests).map(([providerId, manifest]) => [
571
+ providerId,
572
+ {
573
+ baseUrl: manifest.baseUrl,
574
+ modelId: manifest.modelId,
575
+ capabilities: toRuntimeCapabilities(manifest.capabilities),
576
+ },
577
+ ]),
578
+ );
579
+ }
580
+
581
+ export const OPENAI_COMPATIBLE_PROVIDERS: Record<string, ProviderDefaults> =
582
+ toRuntimeProviderDefaults(getOpenAICompatibleProviderManifests());
583
+
584
+ export function getProviderConfig(
585
+ providerId: string,
586
+ ): ProviderDefaults | undefined {
587
+ const manifest = getBuiltInProviderManifest(providerId);
588
+ if (!manifest || !manifest.baseUrl) {
589
+ return undefined;
590
+ }
591
+
592
+ return {
593
+ baseUrl: manifest.baseUrl,
594
+ modelId: manifest.modelId,
595
+ knownModels: manifest.knownModels,
596
+ capabilities: toRuntimeCapabilities(manifest.capabilities),
597
+ };
598
+ }
599
+
600
+ export async function resolveProviderConfig(
601
+ providerId: string,
602
+ modelCatalog?: ModelCatalogConfig,
603
+ config?: ProviderConfig,
604
+ ): Promise<ProviderDefaults | undefined> {
605
+ const defaults = getProviderConfig(providerId);
606
+ if (!defaults) {
607
+ return undefined;
608
+ }
609
+
610
+ try {
611
+ const liveCatalog = modelCatalog?.loadLatestOnInit
612
+ ? await getLiveModelsCatalog(modelCatalog)
613
+ : undefined;
614
+ const liveModels = liveCatalog?.[providerId] ?? {};
615
+ const privateModels =
616
+ config && shouldLoadPrivateModels(providerId, modelCatalog, config)
617
+ ? await getPrivateProviderModels(providerId, modelCatalog, config)
618
+ : {};
619
+ const knownModels = await mergeKnownModels(
620
+ providerId,
621
+ defaults.knownModels,
622
+ liveModels,
623
+ privateModels,
624
+ config?.knownModels,
625
+ );
626
+
627
+ return {
628
+ ...defaults,
629
+ knownModels,
630
+ };
631
+ } catch (error) {
632
+ if (modelCatalog?.failOnError) {
633
+ throw error;
634
+ }
635
+ return defaults;
636
+ }
637
+ }