opencode-ext-connector 0.3.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 (332) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/LICENSE +29 -0
  3. package/README.md +207 -0
  4. package/THIRD_PARTY_NOTICES.md +201 -0
  5. package/dist/catalog/parse-ids.d.ts +2 -0
  6. package/dist/catalog/parse-ids.js +49 -0
  7. package/dist/core/adapter.d.ts +16 -0
  8. package/dist/core/adapter.js +20 -0
  9. package/dist/core/clock.d.ts +7 -0
  10. package/dist/core/clock.js +1 -0
  11. package/dist/core/deadline.d.ts +13 -0
  12. package/dist/core/deadline.js +54 -0
  13. package/dist/core/errors.d.ts +57 -0
  14. package/dist/core/errors.js +81 -0
  15. package/dist/core/health.d.ts +22 -0
  16. package/dist/core/health.js +30 -0
  17. package/dist/core/http.d.ts +28 -0
  18. package/dist/core/http.js +1 -0
  19. package/dist/core/ids.d.ts +7 -0
  20. package/dist/core/ids.js +23 -0
  21. package/dist/core/lifecycle.d.ts +4 -0
  22. package/dist/core/lifecycle.js +16 -0
  23. package/dist/core/logger.d.ts +21 -0
  24. package/dist/core/logger.js +61 -0
  25. package/dist/core/models.d.ts +41 -0
  26. package/dist/core/models.js +59 -0
  27. package/dist/core/options.d.ts +31 -0
  28. package/dist/core/options.js +62 -0
  29. package/dist/core/process.d.ts +20 -0
  30. package/dist/core/process.js +1 -0
  31. package/dist/http/fetch-transport.d.ts +2 -0
  32. package/dist/http/fetch-transport.js +75 -0
  33. package/dist/http/package-version.d.ts +7 -0
  34. package/dist/http/package-version.js +46 -0
  35. package/dist/http/read-body.d.ts +9 -0
  36. package/dist/http/read-body.js +22 -0
  37. package/dist/index.d.ts +6 -0
  38. package/dist/index.js +5 -0
  39. package/dist/logging/logger.d.ts +4 -0
  40. package/dist/logging/logger.js +11 -0
  41. package/dist/opencode/auth-store.d.ts +19 -0
  42. package/dist/opencode/auth-store.js +107 -0
  43. package/dist/opencode/beta-api.d.ts +3 -0
  44. package/dist/opencode/beta-api.js +1 -0
  45. package/dist/opencode/catalog-bridge.d.ts +3 -0
  46. package/dist/opencode/catalog-bridge.js +85 -0
  47. package/dist/opencode/health-refresh.d.ts +16 -0
  48. package/dist/opencode/health-refresh.js +49 -0
  49. package/dist/opencode/host-options.d.ts +2 -0
  50. package/dist/opencode/host-options.js +49 -0
  51. package/dist/opencode/language-factory.d.ts +13 -0
  52. package/dist/opencode/language-factory.js +37 -0
  53. package/dist/opencode/ollama-probe.d.ts +2 -0
  54. package/dist/opencode/ollama-probe.js +15 -0
  55. package/dist/opencode/ollama-production.d.ts +4 -0
  56. package/dist/opencode/ollama-production.js +10 -0
  57. package/dist/opencode/plugin.d.ts +33 -0
  58. package/dist/opencode/plugin.js +40 -0
  59. package/dist/opencode/process-exit.d.ts +4 -0
  60. package/dist/opencode/process-exit.js +22 -0
  61. package/dist/opencode/provider-entry.d.ts +25 -0
  62. package/dist/opencode/provider-entry.js +1 -0
  63. package/dist/opencode/providers.d.ts +16 -0
  64. package/dist/opencode/providers.js +140 -0
  65. package/dist/opencode/register-integrations.d.ts +3 -0
  66. package/dist/opencode/register-integrations.js +8 -0
  67. package/dist/opencode/reload.d.ts +9 -0
  68. package/dist/opencode/reload.js +30 -0
  69. package/dist/opencode/v1-anthropic-auth.d.ts +9 -0
  70. package/dist/opencode/v1-anthropic-auth.js +55 -0
  71. package/dist/opencode/v1-catalog.d.ts +13 -0
  72. package/dist/opencode/v1-catalog.js +80 -0
  73. package/dist/opencode/v1-language.d.ts +3 -0
  74. package/dist/opencode/v1-language.js +64 -0
  75. package/dist/opencode/v1-module.d.ts +23 -0
  76. package/dist/opencode/v1-module.js +74 -0
  77. package/dist/opencode/v1-session-auth.d.ts +5 -0
  78. package/dist/opencode/v1-session-auth.js +98 -0
  79. package/dist/providers/claude/adapter.d.ts +7 -0
  80. package/dist/providers/claude/adapter.js +37 -0
  81. package/dist/providers/claude/atomic-private-file.d.ts +13 -0
  82. package/dist/providers/claude/atomic-private-file.js +94 -0
  83. package/dist/providers/claude/auth-json.d.ts +2 -0
  84. package/dist/providers/claude/auth-json.js +14 -0
  85. package/dist/providers/claude/auth.d.ts +24 -0
  86. package/dist/providers/claude/auth.js +200 -0
  87. package/dist/providers/claude/cli-version.d.ts +10 -0
  88. package/dist/providers/claude/cli-version.js +36 -0
  89. package/dist/providers/claude/compat-betas.d.ts +5 -0
  90. package/dist/providers/claude/compat-betas.js +54 -0
  91. package/dist/providers/claude/compat-config.d.ts +8 -0
  92. package/dist/providers/claude/compat-config.js +31 -0
  93. package/dist/providers/claude/compat-request.d.ts +12 -0
  94. package/dist/providers/claude/compat-request.js +151 -0
  95. package/dist/providers/claude/compat-response.d.ts +1 -0
  96. package/dist/providers/claude/compat-response.js +54 -0
  97. package/dist/providers/claude/compat-signing.d.ts +9 -0
  98. package/dist/providers/claude/compat-signing.js +24 -0
  99. package/dist/providers/claude/compat-transform.d.ts +3 -0
  100. package/dist/providers/claude/compat-transform.js +224 -0
  101. package/dist/providers/claude/credentials.d.ts +7 -0
  102. package/dist/providers/claude/credentials.js +37 -0
  103. package/dist/providers/claude/emit-stream.d.ts +2 -0
  104. package/dist/providers/claude/emit-stream.js +62 -0
  105. package/dist/providers/claude/keychain-account.d.ts +1 -0
  106. package/dist/providers/claude/keychain-account.js +14 -0
  107. package/dist/providers/claude/language-model.d.ts +8 -0
  108. package/dist/providers/claude/language-model.js +109 -0
  109. package/dist/providers/claude/models.d.ts +9 -0
  110. package/dist/providers/claude/models.js +24 -0
  111. package/dist/providers/claude/prompt.d.ts +42 -0
  112. package/dist/providers/claude/prompt.js +134 -0
  113. package/dist/providers/claude/refresh.d.ts +19 -0
  114. package/dist/providers/claude/refresh.js +85 -0
  115. package/dist/providers/claude/sse-convert.d.ts +6 -0
  116. package/dist/providers/claude/sse-convert.js +74 -0
  117. package/dist/providers/claude/sse.d.ts +71 -0
  118. package/dist/providers/claude/sse.js +123 -0
  119. package/dist/providers/claude/transform.d.ts +32 -0
  120. package/dist/providers/claude/transform.js +52 -0
  121. package/dist/providers/claude/writeback.d.ts +18 -0
  122. package/dist/providers/claude/writeback.js +140 -0
  123. package/dist/providers/command-code/adapter.d.ts +7 -0
  124. package/dist/providers/command-code/adapter.js +37 -0
  125. package/dist/providers/command-code/auth.d.ts +5 -0
  126. package/dist/providers/command-code/auth.js +88 -0
  127. package/dist/providers/command-code/cli-version.d.ts +10 -0
  128. package/dist/providers/command-code/cli-version.js +36 -0
  129. package/dist/providers/command-code/emit-stream.d.ts +2 -0
  130. package/dist/providers/command-code/emit-stream.js +226 -0
  131. package/dist/providers/command-code/errors.d.ts +33 -0
  132. package/dist/providers/command-code/errors.js +105 -0
  133. package/dist/providers/command-code/language-model.d.ts +15 -0
  134. package/dist/providers/command-code/language-model.js +203 -0
  135. package/dist/providers/command-code/models.d.ts +3 -0
  136. package/dist/providers/command-code/models.js +18 -0
  137. package/dist/providers/command-code/record-stream.d.ts +1 -0
  138. package/dist/providers/command-code/record-stream.js +61 -0
  139. package/dist/providers/command-code/request-lifecycle.d.ts +8 -0
  140. package/dist/providers/command-code/request-lifecycle.js +33 -0
  141. package/dist/providers/command-code/request.d.ts +14 -0
  142. package/dist/providers/command-code/request.js +167 -0
  143. package/dist/providers/command-code/session.d.ts +5 -0
  144. package/dist/providers/command-code/session.js +9 -0
  145. package/dist/providers/cursor/adapter.d.ts +7 -0
  146. package/dist/providers/cursor/adapter.js +37 -0
  147. package/dist/providers/cursor/auth.d.ts +6 -0
  148. package/dist/providers/cursor/auth.js +56 -0
  149. package/dist/providers/cursor/blob-store.d.ts +26 -0
  150. package/dist/providers/cursor/blob-store.js +119 -0
  151. package/dist/providers/cursor/bridge-client.d.ts +33 -0
  152. package/dist/providers/cursor/bridge-client.js +200 -0
  153. package/dist/providers/cursor/bridge-event-sanitize.d.ts +3 -0
  154. package/dist/providers/cursor/bridge-event-sanitize.js +49 -0
  155. package/dist/providers/cursor/bridge-limits.d.ts +3 -0
  156. package/dist/providers/cursor/bridge-limits.js +10 -0
  157. package/dist/providers/cursor/bridge-process.d.ts +45 -0
  158. package/dist/providers/cursor/bridge-process.js +211 -0
  159. package/dist/providers/cursor/bridge-protocol.d.ts +68 -0
  160. package/dist/providers/cursor/bridge-protocol.js +49 -0
  161. package/dist/providers/cursor/bridge-serialize.d.ts +3 -0
  162. package/dist/providers/cursor/bridge-serialize.js +53 -0
  163. package/dist/providers/cursor/bridge-wire.d.ts +3 -0
  164. package/dist/providers/cursor/bridge-wire.js +163 -0
  165. package/dist/providers/cursor/checkpoint-store.d.ts +28 -0
  166. package/dist/providers/cursor/checkpoint-store.js +94 -0
  167. package/dist/providers/cursor/connect-frame-stream.d.ts +19 -0
  168. package/dist/providers/cursor/connect-frame-stream.js +160 -0
  169. package/dist/providers/cursor/connect-frame.d.ts +31 -0
  170. package/dist/providers/cursor/connect-frame.js +121 -0
  171. package/dist/providers/cursor/credentials.d.ts +5 -0
  172. package/dist/providers/cursor/credentials.js +22 -0
  173. package/dist/providers/cursor/direct-run-types.d.ts +33 -0
  174. package/dist/providers/cursor/direct-run-types.js +1 -0
  175. package/dist/providers/cursor/direct-run.d.ts +5 -0
  176. package/dist/providers/cursor/direct-run.js +213 -0
  177. package/dist/providers/cursor/direct-runtime.d.ts +23 -0
  178. package/dist/providers/cursor/direct-runtime.js +111 -0
  179. package/dist/providers/cursor/direct-stream.d.ts +28 -0
  180. package/dist/providers/cursor/direct-stream.js +190 -0
  181. package/dist/providers/cursor/exec-reply.d.ts +13 -0
  182. package/dist/providers/cursor/exec-reply.js +102 -0
  183. package/dist/providers/cursor/h2-bridge-response.d.ts +9 -0
  184. package/dist/providers/cursor/h2-bridge-response.js +51 -0
  185. package/dist/providers/cursor/h2-bridge-session.d.ts +24 -0
  186. package/dist/providers/cursor/h2-bridge-session.js +197 -0
  187. package/dist/providers/cursor/h2-bridge.d.ts +2 -0
  188. package/dist/providers/cursor/h2-bridge.js +12865 -0
  189. package/dist/providers/cursor/http2.d.ts +18 -0
  190. package/dist/providers/cursor/http2.js +144 -0
  191. package/dist/providers/cursor/interaction-reply.d.ts +6 -0
  192. package/dist/providers/cursor/interaction-reply.js +52 -0
  193. package/dist/providers/cursor/language-generate.d.ts +2 -0
  194. package/dist/providers/cursor/language-generate.js +35 -0
  195. package/dist/providers/cursor/language-model.d.ts +13 -0
  196. package/dist/providers/cursor/language-model.js +77 -0
  197. package/dist/providers/cursor/legacy-stream.d.ts +11 -0
  198. package/dist/providers/cursor/legacy-stream.js +115 -0
  199. package/dist/providers/cursor/mcp-tools.d.ts +7 -0
  200. package/dist/providers/cursor/mcp-tools.js +15 -0
  201. package/dist/providers/cursor/models.d.ts +14 -0
  202. package/dist/providers/cursor/models.js +116 -0
  203. package/dist/providers/cursor/ndjson.d.ts +3 -0
  204. package/dist/providers/cursor/ndjson.js +100 -0
  205. package/dist/providers/cursor/prompt.d.ts +4 -0
  206. package/dist/providers/cursor/prompt.js +142 -0
  207. package/dist/providers/cursor/proto/checkpoint.d.ts +35 -0
  208. package/dist/providers/cursor/proto/checkpoint.js +114 -0
  209. package/dist/providers/cursor/proto/context.d.ts +64 -0
  210. package/dist/providers/cursor/proto/context.js +178 -0
  211. package/dist/providers/cursor/proto/errors.d.ts +16 -0
  212. package/dist/providers/cursor/proto/errors.js +26 -0
  213. package/dist/providers/cursor/proto/exec-control.d.ts +20 -0
  214. package/dist/providers/cursor/proto/exec-control.js +54 -0
  215. package/dist/providers/cursor/proto/exec.d.ts +47 -0
  216. package/dist/providers/cursor/proto/exec.js +154 -0
  217. package/dist/providers/cursor/proto/fields.d.ts +22 -0
  218. package/dist/providers/cursor/proto/fields.js +97 -0
  219. package/dist/providers/cursor/proto/interaction-query.d.ts +15 -0
  220. package/dist/providers/cursor/proto/interaction-query.js +79 -0
  221. package/dist/providers/cursor/proto/interaction-tool-update.d.ts +10 -0
  222. package/dist/providers/cursor/proto/interaction-tool-update.js +58 -0
  223. package/dist/providers/cursor/proto/interaction-turn-ended.d.ts +6 -0
  224. package/dist/providers/cursor/proto/interaction-turn-ended.js +18 -0
  225. package/dist/providers/cursor/proto/interaction.d.ts +65 -0
  226. package/dist/providers/cursor/proto/interaction.js +185 -0
  227. package/dist/providers/cursor/proto/kv.d.ts +25 -0
  228. package/dist/providers/cursor/proto/kv.js +109 -0
  229. package/dist/providers/cursor/proto/mcp-result.d.ts +40 -0
  230. package/dist/providers/cursor/proto/mcp-result.js +150 -0
  231. package/dist/providers/cursor/proto/mcp.d.ts +19 -0
  232. package/dist/providers/cursor/proto/mcp.js +78 -0
  233. package/dist/providers/cursor/proto/model.d.ts +11 -0
  234. package/dist/providers/cursor/proto/model.js +36 -0
  235. package/dist/providers/cursor/proto/output-location.d.ts +7 -0
  236. package/dist/providers/cursor/proto/output-location.js +53 -0
  237. package/dist/providers/cursor/proto/prewarm.d.ts +16 -0
  238. package/dist/providers/cursor/proto/prewarm.js +68 -0
  239. package/dist/providers/cursor/proto/request-context.d.ts +16 -0
  240. package/dist/providers/cursor/proto/request-context.js +58 -0
  241. package/dist/providers/cursor/proto/request.d.ts +44 -0
  242. package/dist/providers/cursor/proto/request.js +111 -0
  243. package/dist/providers/cursor/proto/run-request.d.ts +19 -0
  244. package/dist/providers/cursor/proto/run-request.js +68 -0
  245. package/dist/providers/cursor/proto/server.d.ts +35 -0
  246. package/dist/providers/cursor/proto/server.js +93 -0
  247. package/dist/providers/cursor/proto/unknown-field.d.ts +1 -0
  248. package/dist/providers/cursor/proto/unknown-field.js +22 -0
  249. package/dist/providers/cursor/proto-value.d.ts +3 -0
  250. package/dist/providers/cursor/proto-value.js +170 -0
  251. package/dist/providers/cursor/proto-wire.d.ts +22 -0
  252. package/dist/providers/cursor/proto-wire.js +224 -0
  253. package/dist/providers/cursor/protocol-failure.d.ts +18 -0
  254. package/dist/providers/cursor/protocol-failure.js +45 -0
  255. package/dist/providers/cursor/recovery.d.ts +48 -0
  256. package/dist/providers/cursor/recovery.js +102 -0
  257. package/dist/providers/cursor/request-blob-ownership.d.ts +15 -0
  258. package/dist/providers/cursor/request-blob-ownership.js +39 -0
  259. package/dist/providers/cursor/request-build.d.ts +18 -0
  260. package/dist/providers/cursor/request-build.js +123 -0
  261. package/dist/providers/cursor/request-history.d.ts +32 -0
  262. package/dist/providers/cursor/request-history.js +163 -0
  263. package/dist/providers/cursor/request-input.d.ts +75 -0
  264. package/dist/providers/cursor/request-input.js +123 -0
  265. package/dist/providers/cursor/run-events.d.ts +15 -0
  266. package/dist/providers/cursor/run-events.js +43 -0
  267. package/dist/providers/cursor/run-session-expiry.d.ts +15 -0
  268. package/dist/providers/cursor/run-session-expiry.js +21 -0
  269. package/dist/providers/cursor/run-session.d.ts +50 -0
  270. package/dist/providers/cursor/run-session.js +205 -0
  271. package/dist/providers/cursor/run.d.ts +9 -0
  272. package/dist/providers/cursor/run.js +151 -0
  273. package/dist/providers/cursor/runner.d.ts +1 -0
  274. package/dist/providers/cursor/runner.js +55 -0
  275. package/dist/providers/cursor/server-dispatch-types.d.ts +83 -0
  276. package/dist/providers/cursor/server-dispatch-types.js +1 -0
  277. package/dist/providers/cursor/server-dispatch.d.ts +3 -0
  278. package/dist/providers/cursor/server-dispatch.js +178 -0
  279. package/dist/providers/cursor/session-state.d.ts +21 -0
  280. package/dist/providers/cursor/session-state.js +118 -0
  281. package/dist/providers/cursor/session.d.ts +1 -0
  282. package/dist/providers/cursor/session.js +26 -0
  283. package/dist/providers/cursor/settle-cleanup.d.ts +1 -0
  284. package/dist/providers/cursor/settle-cleanup.js +11 -0
  285. package/dist/providers/cursor/stream-adapter.d.ts +17 -0
  286. package/dist/providers/cursor/stream-adapter.js +99 -0
  287. package/dist/providers/cursor/tool-continuation.d.ts +14 -0
  288. package/dist/providers/cursor/tool-continuation.js +134 -0
  289. package/dist/providers/cursor/tool-stream.d.ts +2 -0
  290. package/dist/providers/cursor/tool-stream.js +220 -0
  291. package/dist/providers/cursor/usage.d.ts +3 -0
  292. package/dist/providers/cursor/usage.js +35 -0
  293. package/dist/providers/ollama/adapter.d.ts +8 -0
  294. package/dist/providers/ollama/adapter.js +65 -0
  295. package/dist/providers/ollama/catalog-state.d.ts +17 -0
  296. package/dist/providers/ollama/catalog-state.js +40 -0
  297. package/dist/providers/ollama/cloud-catalog.d.ts +3 -0
  298. package/dist/providers/ollama/cloud-catalog.js +82 -0
  299. package/dist/providers/ollama/errors.d.ts +14 -0
  300. package/dist/providers/ollama/errors.js +19 -0
  301. package/dist/providers/ollama/generate.d.ts +2 -0
  302. package/dist/providers/ollama/generate.js +49 -0
  303. package/dist/providers/ollama/html-links.d.ts +1 -0
  304. package/dist/providers/ollama/html-links.js +30 -0
  305. package/dist/providers/ollama/http.d.ts +12 -0
  306. package/dist/providers/ollama/http.js +67 -0
  307. package/dist/providers/ollama/index.d.ts +8 -0
  308. package/dist/providers/ollama/index.js +8 -0
  309. package/dist/providers/ollama/language-model.d.ts +11 -0
  310. package/dist/providers/ollama/language-model.js +62 -0
  311. package/dist/providers/ollama/local-catalog.d.ts +3 -0
  312. package/dist/providers/ollama/local-catalog.js +38 -0
  313. package/dist/providers/ollama/ndjson.d.ts +3 -0
  314. package/dist/providers/ollama/ndjson.js +51 -0
  315. package/dist/providers/ollama/prompt.d.ts +8 -0
  316. package/dist/providers/ollama/prompt.js +141 -0
  317. package/dist/providers/ollama/protocol.d.ts +56 -0
  318. package/dist/providers/ollama/protocol.js +26 -0
  319. package/dist/providers/ollama/runtime.d.ts +11 -0
  320. package/dist/providers/ollama/runtime.js +128 -0
  321. package/dist/providers/ollama/stream.d.ts +8 -0
  322. package/dist/providers/ollama/stream.js +110 -0
  323. package/dist/sdk/command-code.d.ts +5 -0
  324. package/dist/sdk/command-code.js +6 -0
  325. package/dist/sdk/cursor.d.ts +5 -0
  326. package/dist/sdk/cursor.js +6 -0
  327. package/dist/sdk/ollama.d.ts +5 -0
  328. package/dist/sdk/ollama.js +6 -0
  329. package/dist/server.d.ts +12 -0
  330. package/dist/server.js +94 -0
  331. package/docs/README.ko.md +189 -0
  332. package/package.json +75 -0
@@ -0,0 +1,25 @@
1
+ import type { AuthHook } from "@opencode-ai/plugin";
2
+ import type { ProviderAdapter } from "../core/adapter";
3
+ import type { Clock } from "../core/clock";
4
+ import type { HttpTransport } from "../core/http";
5
+ import type { CredentialRefreshPolicy } from "../core/options";
6
+ import type { OpenCodeAuthStore } from "./auth-store";
7
+ import type { IntegrationEnvMethod } from "./beta-api";
8
+ export type ProviderEntryDeps = {
9
+ readonly env: Readonly<Record<string, string | undefined>>;
10
+ readonly transport: HttpTransport;
11
+ readonly clock: Clock;
12
+ readonly authStore: OpenCodeAuthStore;
13
+ readonly writeBackCredentials: boolean;
14
+ readonly credentialRefresh?: CredentialRefreshPolicy;
15
+ };
16
+ export type ProviderEntry = {
17
+ readonly id: string;
18
+ readonly displayName: string;
19
+ readonly integrationId: string;
20
+ readonly integrationMethod: IntegrationEnvMethod;
21
+ readonly fallbackModelIds?: readonly string[];
22
+ readonly createAdapter: (deps: ProviderEntryDeps) => ProviderAdapter;
23
+ readonly createAuthHook: (deps: ProviderEntryDeps) => AuthHook;
24
+ readonly isConnected: (deps: ProviderEntryDeps) => Promise<boolean>;
25
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { ClaudeCredentials } from "../providers/claude/credentials";
2
+ import type { OllamaCatalogState } from "../providers/ollama/catalog-state";
3
+ import { type OllamaFetch } from "../providers/ollama/http";
4
+ import type { ProviderEntry } from "./provider-entry";
5
+ export type ProviderConnectionActive = (integrationId: string) => Promise<boolean>;
6
+ export type ClaudeCredentialWriter = (env: Readonly<Record<string, string | undefined>>, credentials: ClaudeCredentials) => Promise<void>;
7
+ export type ProviderRegistryOptions = {
8
+ readonly writeClaudeCredentials?: ClaudeCredentialWriter;
9
+ readonly ollama?: {
10
+ readonly fetch: OllamaFetch;
11
+ readonly catalog: OllamaCatalogState;
12
+ };
13
+ };
14
+ export declare function selectConfiguredProviders(entries: readonly ProviderEntry[], providerIds: readonly string[]): readonly ProviderEntry[];
15
+ export declare function selectActiveProviders(entries: readonly ProviderEntry[], isActive: ProviderConnectionActive): Promise<readonly ProviderEntry[]>;
16
+ export declare function createProviderRegistry(options?: ProviderRegistryOptions): readonly ProviderEntry[];
@@ -0,0 +1,140 @@
1
+ import { createClaudeAdapter } from "../providers/claude/adapter";
2
+ import { createClaudeTokenManager, readClaudeCredentials } from "../providers/claude/auth";
3
+ import { createClaudeVersionResolver } from "../providers/claude/cli-version";
4
+ import { listClaudeModels } from "../providers/claude/models";
5
+ import { createCommandCodeAdapter } from "../providers/command-code/adapter";
6
+ import { readCommandCodeAccessToken } from "../providers/command-code/auth";
7
+ import { listCommandCodeModels } from "../providers/command-code/models";
8
+ import { createCursorAdapter } from "../providers/cursor/adapter";
9
+ import { readCursorAccessToken } from "../providers/cursor/auth";
10
+ import { listCursorUsableModels } from "../providers/cursor/models";
11
+ import { createOllamaAdapter } from "../providers/ollama/adapter";
12
+ import { productionOllamaFetch } from "../providers/ollama/http";
13
+ import { probeLocalOllama } from "./ollama-probe";
14
+ import { productionOllamaCatalog } from "./ollama-production";
15
+ import { createAnthropicCliAuth } from "./v1-anthropic-auth";
16
+ import { createCommandCodeSessionAuth, createCursorSessionAuth, createOllamaSessionAuth, } from "./v1-session-auth";
17
+ async function readCommandCodeToken(deps, signal) {
18
+ const match = await deps.authStore.matchAuth("command-code");
19
+ if (match === null) {
20
+ return null;
21
+ }
22
+ switch (match.kind) {
23
+ case "api-key":
24
+ return match.key;
25
+ case "marker":
26
+ return readCommandCodeAccessToken(deps.env, signal);
27
+ case "oauth":
28
+ return null;
29
+ }
30
+ }
31
+ export function selectConfiguredProviders(entries, providerIds) {
32
+ const selected = new Set(providerIds);
33
+ return entries.filter((entry) => selected.has(entry.id));
34
+ }
35
+ export async function selectActiveProviders(entries, isActive) {
36
+ const selected = [];
37
+ for (const entry of entries) {
38
+ if (await isActive(entry.integrationId)) {
39
+ selected.push(entry);
40
+ }
41
+ }
42
+ return selected;
43
+ }
44
+ export function createProviderRegistry(options = {}) {
45
+ const writeClaudeCredentials = options.writeClaudeCredentials;
46
+ const ollama = options.ollama ?? {
47
+ fetch: productionOllamaFetch,
48
+ catalog: productionOllamaCatalog,
49
+ };
50
+ return [
51
+ {
52
+ id: "claude",
53
+ displayName: "Claude",
54
+ integrationId: "anthropic",
55
+ integrationMethod: { type: "env", names: ["CLAUDE_EXT_CONNECTOR_ENABLED"] },
56
+ createAdapter: (deps) => {
57
+ const readVersion = createClaudeVersionResolver(deps);
58
+ return createClaudeAdapter({
59
+ readAccessToken: async (signal) => {
60
+ const credentials = await readClaudeCredentials(deps.env, signal);
61
+ return credentials?.accessToken ?? null;
62
+ },
63
+ listModels: async (token, signal) => {
64
+ const version = await readVersion(signal);
65
+ return version === null
66
+ ? []
67
+ : listClaudeModels({ transport: deps.transport, token, signal, version });
68
+ },
69
+ });
70
+ },
71
+ createAuthHook: (deps) => {
72
+ const tokenManager = createClaudeTokenManager({
73
+ env: deps.env,
74
+ clock: deps.clock,
75
+ transport: deps.transport,
76
+ ...(deps.credentialRefresh === undefined ? {} : { refresh: deps.credentialRefresh }),
77
+ ...(deps.writeBackCredentials && writeClaudeCredentials !== undefined
78
+ ? {
79
+ writeBack: (credentials) => writeClaudeCredentials(deps.env, credentials),
80
+ }
81
+ : {}),
82
+ });
83
+ return createAnthropicCliAuth({
84
+ provider: "anthropic",
85
+ readCredentials: (signal) => readClaudeCredentials(deps.env, signal),
86
+ readAccessToken: tokenManager.readAccessToken,
87
+ forceRefreshAccessToken: tokenManager.forceRefreshAccessToken,
88
+ readVersion: createClaudeVersionResolver(deps),
89
+ });
90
+ },
91
+ isConnected: async (deps) => {
92
+ if ((await deps.authStore.matchAuth("anthropic")) === null) {
93
+ return false;
94
+ }
95
+ const signal = new AbortController().signal;
96
+ return (await readClaudeCredentials(deps.env, signal)) !== null;
97
+ },
98
+ },
99
+ {
100
+ id: "cursor",
101
+ displayName: "Cursor",
102
+ integrationId: "cursor",
103
+ integrationMethod: { type: "env", names: ["CURSOR_EXT_CONNECTOR_ENABLED"] },
104
+ fallbackModelIds: ["default"],
105
+ createAdapter: (deps) => createCursorAdapter({
106
+ readAccessToken: (signal) => readCursorAccessToken(deps.env, signal),
107
+ listModels: (token, signal) => listCursorUsableModels(token, signal),
108
+ }),
109
+ createAuthHook: (deps) => createCursorSessionAuth(deps.env),
110
+ isConnected: async (deps) => (await deps.authStore.matchAuth("cursor")) !== null &&
111
+ (await readCursorAccessToken(deps.env, new AbortController().signal)) !== null,
112
+ },
113
+ {
114
+ id: "command-code",
115
+ displayName: "Command Code",
116
+ integrationId: "command-code",
117
+ integrationMethod: { type: "env", names: ["COMMAND_CODE_API_KEY"] },
118
+ fallbackModelIds: ["Qwen/Qwen3.8-Max"],
119
+ createAdapter: (deps) => createCommandCodeAdapter({
120
+ readAccessToken: (signal) => readCommandCodeToken(deps, signal),
121
+ listModels: (token, signal) => listCommandCodeModels(deps.transport, token, signal),
122
+ }),
123
+ createAuthHook: (deps) => createCommandCodeSessionAuth(deps.env),
124
+ isConnected: async (deps) => (await readCommandCodeToken(deps, new AbortController().signal)) !== null,
125
+ },
126
+ {
127
+ id: "ollama",
128
+ displayName: "Ollama",
129
+ integrationId: "ollama",
130
+ integrationMethod: { type: "env", names: ["OLLAMA_EXT_CONNECTOR_ENABLED"] },
131
+ createAdapter: () => createOllamaAdapter(ollama),
132
+ createAuthHook: () => createOllamaSessionAuth(ollama.fetch),
133
+ isConnected: async (deps) => {
134
+ if ((await deps.authStore.matchAuth("ollama")) === null)
135
+ return false;
136
+ return probeLocalOllama(ollama.fetch);
137
+ },
138
+ },
139
+ ];
140
+ }
@@ -0,0 +1,3 @@
1
+ import type { IntegrationDraft } from "./beta-api";
2
+ import type { ProviderEntry } from "./provider-entry";
3
+ export declare function registerProviderIntegrations(entries: readonly ProviderEntry[], draft: IntegrationDraft): void;
@@ -0,0 +1,8 @@
1
+ export function registerProviderIntegrations(entries, draft) {
2
+ for (const entry of entries) {
3
+ draft.method.update({
4
+ integrationID: entry.integrationId,
5
+ method: entry.integrationMethod,
6
+ });
7
+ }
8
+ }
@@ -0,0 +1,9 @@
1
+ import type { Clock } from "../core/clock";
2
+ export type CatalogReloadOptions = {
3
+ readonly clock: Clock;
4
+ readonly intervalMs: number;
5
+ readonly reload: () => Promise<void>;
6
+ };
7
+ export declare function scheduleCatalogReload(options: CatalogReloadOptions): {
8
+ readonly dispose: () => Promise<void>;
9
+ };
@@ -0,0 +1,30 @@
1
+ import { createAsyncDisposable } from "../core/lifecycle";
2
+ export function scheduleCatalogReload(options) {
3
+ if (options.intervalMs <= 0) {
4
+ return createAsyncDisposable(() => undefined);
5
+ }
6
+ let cancelled = false;
7
+ let scheduled;
8
+ let activeReload;
9
+ const arm = () => {
10
+ scheduled = options.clock.schedule(options.intervalMs, () => {
11
+ if (cancelled) {
12
+ return;
13
+ }
14
+ scheduled = undefined;
15
+ activeReload = options.reload().then(() => undefined, () => undefined);
16
+ void activeReload.then(() => {
17
+ activeReload = undefined;
18
+ if (!cancelled) {
19
+ arm();
20
+ }
21
+ });
22
+ });
23
+ };
24
+ arm();
25
+ return createAsyncDisposable(async () => {
26
+ cancelled = true;
27
+ scheduled?.cancel();
28
+ await activeReload;
29
+ });
30
+ }
@@ -0,0 +1,9 @@
1
+ import type { AuthHook } from "@opencode-ai/plugin";
2
+ import type { ClaudeCredentials } from "../providers/claude/credentials";
3
+ export declare function createAnthropicCliAuth(options: {
4
+ readonly readCredentials: (signal: AbortSignal) => Promise<ClaudeCredentials | null>;
5
+ readonly readAccessToken: (signal: AbortSignal) => Promise<string | null>;
6
+ readonly forceRefreshAccessToken: (signal: AbortSignal) => Promise<string | null>;
7
+ readonly readVersion: (signal: AbortSignal) => Promise<string | null>;
8
+ readonly provider?: string;
9
+ }): AuthHook;
@@ -0,0 +1,55 @@
1
+ import { createClaudeCompatibilityFetch } from "../providers/claude/compat-request";
2
+ export function createAnthropicCliAuth(options) {
3
+ const provider = options.provider ?? "anthropic";
4
+ return {
5
+ provider,
6
+ loader: async (getAuth) => {
7
+ const auth = await getAuth();
8
+ if (!("type" in auth) || auth.type !== "oauth") {
9
+ return {};
10
+ }
11
+ const credentials = await options.readCredentials(new AbortController().signal);
12
+ if (credentials === null) {
13
+ return {};
14
+ }
15
+ return {
16
+ apiKey: "",
17
+ baseURL: "https://api.anthropic.com/v1",
18
+ fetch: createClaudeCompatibilityFetch({
19
+ readVersion: options.readVersion,
20
+ readAccessToken: options.readAccessToken,
21
+ forceRefreshAccessToken: options.forceRefreshAccessToken,
22
+ }),
23
+ };
24
+ },
25
+ methods: [
26
+ {
27
+ type: "oauth",
28
+ label: "Claude Code subscription",
29
+ authorize: async () => {
30
+ const credentials = await options.readCredentials(new AbortController().signal);
31
+ if (credentials === null) {
32
+ return {
33
+ url: "",
34
+ instructions: "No Claude Code credentials were found. Log in with Claude Code once or copy an existing `~/.claude/.credentials.json` here, then retry.",
35
+ method: "auto",
36
+ callback: async () => ({ type: "failed" }),
37
+ };
38
+ }
39
+ return {
40
+ url: "",
41
+ instructions: "Using existing Claude Code credentials.",
42
+ method: "auto",
43
+ callback: async () => ({
44
+ type: "success",
45
+ provider,
46
+ access: credentials.accessToken,
47
+ refresh: credentials.refreshToken ?? "",
48
+ expires: credentials.expiresAtMs ?? 0,
49
+ }),
50
+ };
51
+ },
52
+ },
53
+ ],
54
+ };
55
+ }
@@ -0,0 +1,13 @@
1
+ import type { Hooks } from "@opencode-ai/plugin";
2
+ import type { CatalogPublisher } from "../core/adapter";
3
+ import type { ProviderEntry } from "./provider-entry";
4
+ type HostConfig = Parameters<NonNullable<Hooks["config"]>>[0];
5
+ export type V1CatalogProjector = {
6
+ readonly publisher: CatalogPublisher;
7
+ readonly attach: (config: HostConfig) => void;
8
+ };
9
+ export declare function createV1CatalogProjector(options: {
10
+ readonly entries: readonly ProviderEntry[];
11
+ readonly npmSpecifiers?: Readonly<Record<string, string>>;
12
+ }): V1CatalogProjector;
13
+ export {};
@@ -0,0 +1,80 @@
1
+ import { InvalidArgumentError, OperationCancelledError } from "../core/errors";
2
+ function assertNever(_value) {
3
+ throw new InvalidArgumentError("snapshot.status");
4
+ }
5
+ function modelRecord(snapshot, entry) {
6
+ const models = {};
7
+ const ids = snapshot.status === "unavailable" ? [] : snapshot.models.map((model) => model.id);
8
+ const selected = ids.length === 0 ? (entry.fallbackModelIds ?? []) : ids;
9
+ for (const id of selected) {
10
+ Object.defineProperty(models, id, {
11
+ value: { id, name: id },
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ });
16
+ }
17
+ return models;
18
+ }
19
+ export function createV1CatalogProjector(options) {
20
+ const entries = new Map(options.entries.map((entry) => [entry.id, entry]));
21
+ const modelsByProvider = new Map();
22
+ const ownedProviders = new Set();
23
+ let attachedConfig;
24
+ const project = (entry) => {
25
+ if (attachedConfig === undefined || options.npmSpecifiers === undefined)
26
+ return;
27
+ const npm = options.npmSpecifiers[entry.id];
28
+ if (npm === undefined)
29
+ return;
30
+ const models = modelsByProvider.get(entry.id);
31
+ if (models === undefined) {
32
+ if (ownedProviders.delete(entry.id) && attachedConfig.provider !== undefined) {
33
+ Reflect.deleteProperty(attachedConfig.provider, entry.id);
34
+ }
35
+ return;
36
+ }
37
+ const provider = attachedConfig.provider ?? {};
38
+ Object.defineProperty(provider, entry.id, {
39
+ value: { npm, name: entry.displayName, models },
40
+ enumerable: true,
41
+ configurable: true,
42
+ writable: true,
43
+ });
44
+ attachedConfig.provider = provider;
45
+ ownedProviders.add(entry.id);
46
+ };
47
+ return {
48
+ publisher: {
49
+ publish: async (snapshot, signal) => {
50
+ if (signal.aborted)
51
+ throw new OperationCancelledError("publish-v1-catalog");
52
+ const entry = entries.get(snapshot.providerId);
53
+ if (entry === undefined)
54
+ throw new InvalidArgumentError("snapshot.providerId");
55
+ switch (snapshot.status) {
56
+ case "unavailable":
57
+ modelsByProvider.delete(entry.id);
58
+ break;
59
+ case "ready":
60
+ case "stale": {
61
+ const models = modelRecord(snapshot, entry);
62
+ if (Reflect.ownKeys(models).length === 0)
63
+ modelsByProvider.delete(entry.id);
64
+ else
65
+ modelsByProvider.set(entry.id, models);
66
+ break;
67
+ }
68
+ default:
69
+ assertNever(snapshot);
70
+ }
71
+ project(entry);
72
+ },
73
+ },
74
+ attach: (config) => {
75
+ attachedConfig = config;
76
+ for (const entry of options.entries)
77
+ project(entry);
78
+ },
79
+ };
80
+ }
@@ -0,0 +1,3 @@
1
+ import type { LanguageModelV3 } from "@ai-sdk/provider";
2
+ export declare function languageForV1Provider(providerID: string, modelId: string, options: Readonly<Record<string, unknown>>): LanguageModelV3;
3
+ export declare const disposeV1LanguageRuntime: () => Promise<void>;
@@ -0,0 +1,64 @@
1
+ import { createFetchHttpTransport } from "../http/fetch-transport";
2
+ import { createConsoleLogger } from "../logging/logger";
3
+ import { createClaudeTokenReader } from "../providers/claude/auth";
4
+ import { readCursorAccessToken } from "../providers/cursor/auth";
5
+ import { createCursorDirectRuntime } from "../providers/cursor/direct-runtime";
6
+ import { createConnectorLanguage } from "./language-factory";
7
+ import { productionOllamaRuntime } from "./ollama-production";
8
+ const clock = {
9
+ nowMs: () => Date.now(),
10
+ schedule: (delayMs, callback) => {
11
+ const handle = setTimeout(callback, delayMs);
12
+ handle.unref();
13
+ const cancel = () => {
14
+ clearTimeout(handle);
15
+ };
16
+ return {
17
+ cancel,
18
+ [Symbol.dispose]: cancel,
19
+ };
20
+ },
21
+ };
22
+ const env = process.env;
23
+ const transport = createFetchHttpTransport();
24
+ const logger = createConsoleLogger(clock);
25
+ const cursorRuntime = createCursorDirectRuntime({
26
+ clock,
27
+ readAccessToken: (signal) => readCursorAccessToken(env, signal),
28
+ onBackgroundCleanupError: (error) => {
29
+ logger.log("warn", "cursor.session.ttl-cleanup-failed", {
30
+ code: error.code,
31
+ operation: error.operation,
32
+ sessionId: error.identity.sessionId,
33
+ modelId: error.identity.modelId,
34
+ });
35
+ },
36
+ });
37
+ const readClaudeToken = createClaudeTokenReader({
38
+ env,
39
+ clock,
40
+ transport,
41
+ });
42
+ function apiKeyFromOptions(options) {
43
+ const value = options["apiKey"];
44
+ return typeof value === "string" && value.length > 0 && !value.startsWith("cli-session:")
45
+ ? value
46
+ : undefined;
47
+ }
48
+ export function languageForV1Provider(providerID, modelId, options) {
49
+ const commandCodeApiKey = apiKeyFromOptions(options);
50
+ const createLanguage = createConnectorLanguage({
51
+ env,
52
+ transport,
53
+ readClaudeToken,
54
+ cursorRuntime,
55
+ ollamaRuntime: productionOllamaRuntime,
56
+ ...(commandCodeApiKey === undefined ? {} : { commandCodeApiKey }),
57
+ });
58
+ const model = createLanguage(providerID, modelId);
59
+ if (model === null) {
60
+ throw new Error(`${providerID} is unavailable`);
61
+ }
62
+ return model;
63
+ }
64
+ export const disposeV1LanguageRuntime = cursorRuntime.dispose;
@@ -0,0 +1,23 @@
1
+ import type { Hooks, Plugin as V1Plugin } from "@opencode-ai/plugin";
2
+ import type { Clock } from "../core/clock";
3
+ import type { HealthPolicy } from "../core/health";
4
+ import type { HttpTransport } from "../core/http";
5
+ import type { ConnectorLogger } from "../core/logger";
6
+ import type { OpenCodeAuthStore } from "./auth-store";
7
+ import type { ProviderEntry, ProviderEntryDeps } from "./provider-entry";
8
+ export type V1ServerOptions = {
9
+ readonly clock: Clock;
10
+ readonly transport: HttpTransport;
11
+ readonly authStore: OpenCodeAuthStore;
12
+ readonly env?: Readonly<Record<string, string | undefined>>;
13
+ readonly providers: readonly ProviderEntry[];
14
+ readonly snapshotTimeoutMs?: number;
15
+ readonly catalogReloadMs?: number;
16
+ readonly health?: HealthPolicy;
17
+ readonly logger?: ConnectorLogger;
18
+ readonly npmSpecifiers?: Readonly<Record<string, string>>;
19
+ };
20
+ export declare function buildV1Hooks(options: V1ServerOptions): Promise<Hooks>;
21
+ export declare function buildV1AuthHooks(entry: ProviderEntry, deps: ProviderEntryDeps, options: unknown): Hooks;
22
+ export declare function createV1AuthServer(entry: ProviderEntry, deps: ProviderEntryDeps): V1Plugin;
23
+ export declare function createV1Server(options: V1ServerOptions): V1Plugin;
@@ -0,0 +1,74 @@
1
+ import { createAsyncDisposable } from "../core/lifecycle";
2
+ import { parseConnectorOptions } from "../core/options";
3
+ import { refreshAdaptersWithHealth } from "./health-refresh";
4
+ import { pickConnectorOptionsInput } from "./host-options";
5
+ import { scheduleCatalogReload } from "./reload";
6
+ import { createV1CatalogProjector } from "./v1-catalog";
7
+ function entryDeps(options) {
8
+ return {
9
+ env: options.env ?? process.env,
10
+ transport: options.transport,
11
+ clock: options.clock,
12
+ authStore: options.authStore,
13
+ writeBackCredentials: false,
14
+ };
15
+ }
16
+ export async function buildV1Hooks(options) {
17
+ const deps = entryDeps(options);
18
+ const providers = [];
19
+ for (const entry of options.providers) {
20
+ if (await entry.isConnected(deps)) {
21
+ providers.push(entry);
22
+ }
23
+ }
24
+ const adapters = providers.map((entry) => entry.createAdapter(deps));
25
+ const projector = createV1CatalogProjector({
26
+ entries: providers,
27
+ ...(options.npmSpecifiers === undefined ? {} : { npmSpecifiers: options.npmSpecifiers }),
28
+ });
29
+ const lifetime = new AbortController();
30
+ const healthStore = new Map();
31
+ const refresh = () => refreshAdaptersWithHealth({
32
+ adapters,
33
+ publisher: projector.publisher,
34
+ logger: options.logger ?? { log: () => undefined },
35
+ clock: options.clock,
36
+ health: options.health ?? { initialBackoffMs: 1_000, maximumBackoffMs: 60_000 },
37
+ store: healthStore,
38
+ signal: lifetime.signal,
39
+ snapshotTimeoutMs: options.snapshotTimeoutMs ?? 30_000,
40
+ });
41
+ await refresh();
42
+ const reload = scheduleCatalogReload({
43
+ clock: options.clock,
44
+ intervalMs: options.catalogReloadMs ?? 300_000,
45
+ reload: refresh,
46
+ });
47
+ const disposal = createAsyncDisposable(async () => {
48
+ lifetime.abort();
49
+ await reload.dispose();
50
+ await Promise.all(adapters.map((adapter) => adapter.dispose()));
51
+ });
52
+ return {
53
+ config: async (config) => projector.attach(config),
54
+ dispose: disposal.dispose,
55
+ };
56
+ }
57
+ export function buildV1AuthHooks(entry, deps, options) {
58
+ const configured = parseConnectorOptions(pickConnectorOptionsInput(options));
59
+ return configured.providers.some((providerId) => providerId === entry.id)
60
+ ? {
61
+ auth: entry.createAuthHook({
62
+ ...deps,
63
+ writeBackCredentials: configured.writeBackCredentials,
64
+ credentialRefresh: configured.credentialRefresh,
65
+ }),
66
+ }
67
+ : {};
68
+ }
69
+ export function createV1AuthServer(entry, deps) {
70
+ return async (_input, options) => buildV1AuthHooks(entry, deps, options);
71
+ }
72
+ export function createV1Server(options) {
73
+ return async () => buildV1Hooks(options);
74
+ }
@@ -0,0 +1,5 @@
1
+ import type { AuthHook } from "@opencode-ai/plugin";
2
+ import { type OllamaFetch } from "../providers/ollama/http";
3
+ export declare function createCursorSessionAuth(env: Readonly<Record<string, string | undefined>>): AuthHook;
4
+ export declare function createCommandCodeSessionAuth(env: Readonly<Record<string, string | undefined>>): AuthHook;
5
+ export declare function createOllamaSessionAuth(fetch?: OllamaFetch): AuthHook;