@skaile/workspaces 4.33.0 → 4.35.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 (231) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +3 -3
  3. package/dist/{asset-feeds-CZGV7GCG.js → asset-feeds-NL3526ZV.js} +11 -11
  4. package/dist/{asset-feeds-CZGV7GCG.js.map → asset-feeds-NL3526ZV.js.map} +1 -1
  5. package/dist/asset-manager/catalog-deployer.js +5 -5
  6. package/dist/asset-manager/index.js +11 -11
  7. package/dist/asset-manager/installer.js +8 -8
  8. package/dist/asset-manager/renderers.js +2 -2
  9. package/dist/asset-manager/src/index.d.ts +30 -24
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/asset-manager/src/renderers.d.ts +2 -2
  12. package/dist/bridge/drivers/claude-sdk.js +9 -9
  13. package/dist/bridge/drivers/codex.js +8 -8
  14. package/dist/bridge/drivers/continue.js +10 -10
  15. package/dist/bridge/drivers/continue.js.map +1 -1
  16. package/dist/bridge/drivers/echo.js +2 -2
  17. package/dist/bridge/drivers/gemini.js +6 -6
  18. package/dist/bridge/drivers/goose.js +10 -10
  19. package/dist/bridge/drivers/goose.js.map +1 -1
  20. package/dist/bridge/drivers/omp.js +3 -3
  21. package/dist/bridge/drivers/omp.js.map +1 -1
  22. package/dist/bridge/drivers/opencode.js +11 -11
  23. package/dist/bridge/drivers/opencode.js.map +1 -1
  24. package/dist/bridge/drivers/qwen.js +6 -6
  25. package/dist/bridge/index.js +10 -10
  26. package/dist/bridge/src/capability-dispatch.d.ts +1 -1
  27. package/dist/bridge/src/drivers/_subprocess-cli.d.ts +3 -3
  28. package/dist/bridge/src/drivers/continue.d.ts +1 -1
  29. package/dist/bridge/src/drivers/gemini.d.ts +3 -3
  30. package/dist/bridge/src/drivers/goose.d.ts +1 -1
  31. package/dist/bridge/src/drivers/opencode.d.ts +1 -1
  32. package/dist/bridge/src/provider-materialize/continue-config-yaml.d.ts +2 -2
  33. package/dist/bridge/src/provider-materialize/credential-env.d.ts +4 -4
  34. package/dist/bridge/src/provider-materialize/env-drivers.d.ts +18 -18
  35. package/dist/bridge/src/provider-materialize/goose-custom-providers.d.ts +1 -1
  36. package/dist/bridge/src/provider-materialize/opencode-config.d.ts +1 -1
  37. package/dist/bridge/src/provider-materialize/session-config-home.d.ts +5 -5
  38. package/dist/bridge/src/registry.d.ts +10 -10
  39. package/dist/bridge/src/types.d.ts +9 -9
  40. package/dist/{chunk-AAPFZCQX.js → chunk-24X2GGSC.js} +6 -6
  41. package/dist/{chunk-AAPFZCQX.js.map → chunk-24X2GGSC.js.map} +1 -1
  42. package/dist/{chunk-WPISSDEI.js → chunk-3ELIPWCH.js} +6 -6
  43. package/dist/{chunk-WPISSDEI.js.map → chunk-3ELIPWCH.js.map} +1 -1
  44. package/dist/{chunk-HL6SZ7Z3.js → chunk-5YXKEM7Q.js} +7 -7
  45. package/dist/{chunk-HL6SZ7Z3.js.map → chunk-5YXKEM7Q.js.map} +1 -1
  46. package/dist/{chunk-HXC5VF3L.js → chunk-66A35U4V.js} +36 -35
  47. package/dist/chunk-66A35U4V.js.map +1 -0
  48. package/dist/{chunk-ENUCD5MW.js → chunk-75LXFKQR.js} +4 -4
  49. package/dist/{chunk-ENUCD5MW.js.map → chunk-75LXFKQR.js.map} +1 -1
  50. package/dist/{chunk-GMXG2JGN.js → chunk-7ERHZQ7O.js} +3 -3
  51. package/dist/{chunk-GMXG2JGN.js.map → chunk-7ERHZQ7O.js.map} +1 -1
  52. package/dist/{chunk-JULFGNQN.js → chunk-7HJ6SFFF.js} +3 -3
  53. package/dist/{chunk-JULFGNQN.js.map → chunk-7HJ6SFFF.js.map} +1 -1
  54. package/dist/{chunk-DKCFWSVW.js → chunk-7LBPHRRP.js} +3 -3
  55. package/dist/chunk-7LBPHRRP.js.map +1 -0
  56. package/dist/{chunk-A7WRTOFI.js → chunk-AKO6XHGV.js} +5 -5
  57. package/dist/{chunk-A7WRTOFI.js.map → chunk-AKO6XHGV.js.map} +1 -1
  58. package/dist/{chunk-3C6Q6TCZ.js → chunk-AO7TCPOS.js} +62 -18
  59. package/dist/chunk-AO7TCPOS.js.map +1 -0
  60. package/dist/{chunk-54A5QAIV.js → chunk-C3256F2F.js} +2 -2
  61. package/dist/{chunk-54A5QAIV.js.map → chunk-C3256F2F.js.map} +1 -1
  62. package/dist/{chunk-2JANXYTJ.js → chunk-DHLE66FV.js} +3 -3
  63. package/dist/{chunk-2JANXYTJ.js.map → chunk-DHLE66FV.js.map} +1 -1
  64. package/dist/{chunk-BR2IXOWX.js → chunk-DOF77WEV.js} +6 -6
  65. package/dist/{chunk-BR2IXOWX.js.map → chunk-DOF77WEV.js.map} +1 -1
  66. package/dist/{chunk-MENCWIHW.js → chunk-EB4ZTESQ.js} +4 -4
  67. package/dist/chunk-EB4ZTESQ.js.map +1 -0
  68. package/dist/{chunk-XUVQSDNV.js → chunk-GKTFGCQZ.js} +3 -3
  69. package/dist/chunk-GKTFGCQZ.js.map +1 -0
  70. package/dist/{chunk-GTVQUHBN.js → chunk-GORUF3YZ.js} +10 -10
  71. package/dist/{chunk-GTVQUHBN.js.map → chunk-GORUF3YZ.js.map} +1 -1
  72. package/dist/{chunk-ACDHNOT7.js → chunk-IFUQ6XBQ.js} +87 -10
  73. package/dist/chunk-IFUQ6XBQ.js.map +1 -0
  74. package/dist/{chunk-6J4WBP3C.js → chunk-IGNY4C6K.js} +21 -21
  75. package/dist/{chunk-6J4WBP3C.js.map → chunk-IGNY4C6K.js.map} +1 -1
  76. package/dist/{chunk-I6NZG7WX.js → chunk-J4ANCOQ4.js} +6 -6
  77. package/dist/chunk-J4ANCOQ4.js.map +1 -0
  78. package/dist/{chunk-5RHPNNWP.js → chunk-JRIU5GA7.js} +3 -3
  79. package/dist/{chunk-5RHPNNWP.js.map → chunk-JRIU5GA7.js.map} +1 -1
  80. package/dist/{chunk-F3HNW354.js → chunk-KIFJWSNC.js} +3 -3
  81. package/dist/{chunk-F3HNW354.js.map → chunk-KIFJWSNC.js.map} +1 -1
  82. package/dist/{chunk-DF7C3KZK.js → chunk-LRCSWOZO.js} +14 -14
  83. package/dist/chunk-LRCSWOZO.js.map +1 -0
  84. package/dist/{chunk-TAZMDZFP.js → chunk-MTWZ7KHZ.js} +3 -3
  85. package/dist/{chunk-TAZMDZFP.js.map → chunk-MTWZ7KHZ.js.map} +1 -1
  86. package/dist/{chunk-QDRQKQOU.js → chunk-N2UGG6WV.js} +3 -3
  87. package/dist/{chunk-QDRQKQOU.js.map → chunk-N2UGG6WV.js.map} +1 -1
  88. package/dist/{chunk-4T25XCWX.js → chunk-NVQLE4MK.js} +3 -3
  89. package/dist/{chunk-4T25XCWX.js.map → chunk-NVQLE4MK.js.map} +1 -1
  90. package/dist/{chunk-C4JDLXPI.js → chunk-QJOOD3OV.js} +3 -3
  91. package/dist/{chunk-C4JDLXPI.js.map → chunk-QJOOD3OV.js.map} +1 -1
  92. package/dist/{chunk-NPS765HV.js → chunk-RHESVS7V.js} +9 -9
  93. package/dist/{chunk-NPS765HV.js.map → chunk-RHESVS7V.js.map} +1 -1
  94. package/dist/{chunk-6GSZLKA5.js → chunk-T762W5CI.js} +3 -3
  95. package/dist/chunk-T762W5CI.js.map +1 -0
  96. package/dist/{chunk-3ZE7X5Y6.js → chunk-TB3LJ6NA.js} +3 -3
  97. package/dist/{chunk-3ZE7X5Y6.js.map → chunk-TB3LJ6NA.js.map} +1 -1
  98. package/dist/{chunk-N7B3LZ7V.js → chunk-TGE33MKN.js} +2 -2
  99. package/dist/{chunk-N7B3LZ7V.js.map → chunk-TGE33MKN.js.map} +1 -1
  100. package/dist/{chunk-DRAI3JH5.js → chunk-TGJIX77V.js} +11 -11
  101. package/dist/chunk-TGJIX77V.js.map +1 -0
  102. package/dist/{chunk-UWJAJP6T.js → chunk-TTITGVXV.js} +2 -2
  103. package/dist/{chunk-UWJAJP6T.js.map → chunk-TTITGVXV.js.map} +1 -1
  104. package/dist/{chunk-N3AH66VX.js → chunk-TUTVTGMG.js} +4 -4
  105. package/dist/{chunk-N3AH66VX.js.map → chunk-TUTVTGMG.js.map} +1 -1
  106. package/dist/{chunk-HGPSZXZP.js → chunk-VOXFI3XS.js} +3 -3
  107. package/dist/{chunk-HGPSZXZP.js.map → chunk-VOXFI3XS.js.map} +1 -1
  108. package/dist/{chunk-SK36WO2Z.js → chunk-XTOTP7MJ.js} +2 -2
  109. package/dist/{chunk-SK36WO2Z.js.map → chunk-XTOTP7MJ.js.map} +1 -1
  110. package/dist/cli/index.js +119 -119
  111. package/dist/cli/index.js.map +1 -1
  112. package/dist/cli/src/commands/catalog.d.ts +1 -1
  113. package/dist/cli/src/commands/integration.d.ts +2 -2
  114. package/dist/cli/src/commands/plugin/claude-code.d.ts +2 -2
  115. package/dist/cli/src/commands/plugin/codex.d.ts +2 -2
  116. package/dist/cli/src/commands/plugin/omp.d.ts +2 -2
  117. package/dist/cli/src/commands/plugin/types.d.ts +13 -13
  118. package/dist/cli/src/commands/plugin/types.d.ts.map +1 -1
  119. package/dist/cli/src/commands/run.d.ts +1 -1
  120. package/dist/connectors/config.js +3 -3
  121. package/dist/connectors/index.js +13 -13
  122. package/dist/connectors/src/connect-failure-carry-over.d.ts +38 -0
  123. package/dist/connectors/src/connect-failure-carry-over.d.ts.map +1 -0
  124. package/dist/connectors/src/connector-manager.d.ts +15 -0
  125. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  126. package/dist/connectors/src/index.d.ts +1 -0
  127. package/dist/connectors/src/index.d.ts.map +1 -1
  128. package/dist/core/driver-targets.js +1 -1
  129. package/dist/core/index.js +5 -5
  130. package/dist/core/runtime-assets.js +3 -3
  131. package/dist/core/src/driver-targets.d.ts +8 -8
  132. package/dist/core/src/index.d.ts +8 -2
  133. package/dist/core/src/index.d.ts.map +1 -1
  134. package/dist/core/src/settings.d.ts +1 -1
  135. package/dist/core/src/workspace-config.d.ts +16 -15
  136. package/dist/core/src/workspace-config.d.ts.map +1 -1
  137. package/dist/core/store.js +2 -2
  138. package/dist/core/workspace-config.js +2 -2
  139. package/dist/deploy/index.js +5 -5
  140. package/dist/discovery/index.js +2 -2
  141. package/dist/{ensure-sources-JGKHWDC4.js → ensure-sources-DVPPPCBS.js} +14 -14
  142. package/dist/{ensure-sources-JGKHWDC4.js.map → ensure-sources-DVPPPCBS.js.map} +1 -1
  143. package/dist/factory-assets/connectors/box.js +13 -13
  144. package/dist/factory-assets/connectors/deploy.js +13 -13
  145. package/dist/factory-assets/connectors/devserver.js +13 -13
  146. package/dist/factory-assets/connectors/flow/CONNECTOR.md +2 -2
  147. package/dist/factory-assets/connectors/flow/adapter.js +13 -13
  148. package/dist/factory-assets/connectors/flow/engine.js +6 -6
  149. package/dist/factory-assets/connectors/flow/run-flow.d.ts +1 -1
  150. package/dist/factory-assets/connectors/flow/run-flow.js +14 -14
  151. package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts +3 -3
  152. package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts.map +1 -1
  153. package/dist/factory-assets/connectors/flow.js +13 -13
  154. package/dist/factory-assets/connectors/git.js +13 -13
  155. package/dist/factory-assets/connectors/gmail.js +13 -13
  156. package/dist/factory-assets/connectors/googledrive.js +13 -13
  157. package/dist/factory-assets/connectors/local.js +13 -13
  158. package/dist/factory-assets/connectors/mattermost.js +13 -13
  159. package/dist/factory-assets/connectors/memory.js +13 -13
  160. package/dist/factory-assets/connectors/minio.js +13 -13
  161. package/dist/factory-assets/connectors/postgres.js +13 -13
  162. package/dist/factory-assets/connectors/s3.js +13 -13
  163. package/dist/factory-assets/connectors/sharepoint.js +13 -13
  164. package/dist/factory-assets/connectors/sqlite.js +13 -13
  165. package/dist/factory-assets/connectors/static-server.js +13 -13
  166. package/dist/factory-assets/connectors/tunnel.js +13 -13
  167. package/dist/factory-assets/connectors/webdav.js +13 -13
  168. package/dist/factory-assets/connectors/xstate-store.js +13 -13
  169. package/dist/factory-assets/connectors/xstate.js +13 -13
  170. package/dist/{flows-QTUSWYKY.js → flows-X7JFAVRR.js} +8 -8
  171. package/dist/{flows-QTUSWYKY.js.map → flows-X7JFAVRR.js.map} +1 -1
  172. package/dist/{helpers-6X4HJKWS.js → helpers-KLO5VUVZ.js} +14 -14
  173. package/dist/{helpers-6X4HJKWS.js.map → helpers-KLO5VUVZ.js.map} +1 -1
  174. package/dist/library/index.js +8 -8
  175. package/dist/{library-publish-MGN3N73A.js → library-publish-X6JGR7K3.js} +18 -18
  176. package/dist/{library-publish-MGN3N73A.js.map → library-publish-X6JGR7K3.js.map} +1 -1
  177. package/dist/{open-library-4PFE2CJ7.js → open-library-S2ZFKJUK.js} +16 -16
  178. package/dist/{open-library-4PFE2CJ7.js.map → open-library-S2ZFKJUK.js.map} +1 -1
  179. package/dist/{paths-IOOMNHTC.js → paths-OI5IIS22.js} +8 -8
  180. package/dist/{paths-IOOMNHTC.js.map → paths-OI5IIS22.js.map} +1 -1
  181. package/dist/plugin-registry/src/targets.d.ts +5 -5
  182. package/dist/plugin-registry/src/targets.d.ts.map +1 -1
  183. package/dist/{plugin-store-OIIPB2MQ.js → plugin-store-C67RLSPD.js} +7 -7
  184. package/dist/{plugin-store-OIIPB2MQ.js.map → plugin-store-C67RLSPD.js.map} +1 -1
  185. package/dist/{project-MD4HQ62C.js → project-7VOTYB7O.js} +15 -15
  186. package/dist/{project-MD4HQ62C.js.map → project-7VOTYB7O.js.map} +1 -1
  187. package/dist/resolver/index.js +5 -5
  188. package/dist/runner/index.js +18 -18
  189. package/dist/runner/src/manifest.d.ts +1 -1
  190. package/dist/runner/src/resources.d.ts.map +1 -1
  191. package/dist/runner/src/serve.d.ts +47 -1
  192. package/dist/runner/src/serve.d.ts.map +1 -1
  193. package/dist/runner/src/session-builder.d.ts +2 -2
  194. package/dist/runner/src/session-stimulus.d.ts +5 -0
  195. package/dist/runner/src/session-stimulus.d.ts.map +1 -1
  196. package/dist/runner/src/session.d.ts +1 -1
  197. package/dist/runner/src/session.d.ts.map +1 -1
  198. package/dist/sdk/asset-manager.js +11 -11
  199. package/dist/sdk/bridge.js +10 -10
  200. package/dist/sdk/core.js +5 -5
  201. package/dist/sdk/flow.js +6 -6
  202. package/dist/sdk/index.js +18 -18
  203. package/dist/sdk/resolver.js +5 -5
  204. package/dist/sdk/runner.js +18 -18
  205. package/dist/{setup-PB35G5SG.js → setup-RO3PGJYS.js} +19 -19
  206. package/dist/{setup-PB35G5SG.js.map → setup-RO3PGJYS.js.map} +1 -1
  207. package/dist/{skills-DH75K326.js → skills-4YTVHMOH.js} +7 -7
  208. package/dist/{skills-DH75K326.js.map → skills-4YTVHMOH.js.map} +1 -1
  209. package/dist/{source-Y5OF6IZU.js → source-ZZLLOP2U.js} +17 -17
  210. package/dist/{source-Y5OF6IZU.js.map → source-ZZLLOP2U.js.map} +1 -1
  211. package/dist/{source-manifest-publish-YWFVYTEI.js → source-manifest-publish-7WRQDIXO.js} +19 -19
  212. package/dist/{source-manifest-publish-YWFVYTEI.js.map → source-manifest-publish-7WRQDIXO.js.map} +1 -1
  213. package/dist/tui/index.js +18 -18
  214. package/dist/types/manifests.js +1 -1
  215. package/dist/types/src/manifests/agent.d.ts +4 -4
  216. package/dist/types/src/runtime.d.ts +4 -4
  217. package/dist/workspace-plugin/adapters/mcp.js +7 -7
  218. package/dist/workspace-plugin/adapters/omp.js +7 -7
  219. package/dist/workspace-plugin/index.js +1 -1
  220. package/dist/workspace-plugin/src/plugin.d.ts +1 -1
  221. package/package.json +1 -1
  222. package/dist/chunk-3C6Q6TCZ.js.map +0 -1
  223. package/dist/chunk-6GSZLKA5.js.map +0 -1
  224. package/dist/chunk-ACDHNOT7.js.map +0 -1
  225. package/dist/chunk-DF7C3KZK.js.map +0 -1
  226. package/dist/chunk-DKCFWSVW.js.map +0 -1
  227. package/dist/chunk-DRAI3JH5.js.map +0 -1
  228. package/dist/chunk-HXC5VF3L.js.map +0 -1
  229. package/dist/chunk-I6NZG7WX.js.map +0 -1
  230. package/dist/chunk-MENCWIHW.js.map +0 -1
  231. package/dist/chunk-XUVQSDNV.js.map +0 -1
@@ -1,18 +1,18 @@
1
- import { driverSessionConfigHome, removeSessionConfigFile, writeSessionConfigFile } from '../../chunk-6GSZLKA5.js';
2
- import { SubprocessCliDriver, extractText } from '../../chunk-XUVQSDNV.js';
3
- import { resolveEnvDriverSession, resolveRegistryBinding, backendModelSelector, credentialsForEveryProvider, registryModelEntries, selectableEntries, isStockCatalogEndpoint, entrySurface, entryBaseUrl, entryModelIds, versionedAnthropicBaseUrl } from '../../chunk-DRAI3JH5.js';
1
+ import { driverSessionConfigHome, removeSessionConfigFile, writeSessionConfigFile } from '../../chunk-T762W5CI.js';
2
+ import { SubprocessCliDriver, extractText } from '../../chunk-GKTFGCQZ.js';
3
+ import { resolveEnvDriverSession, resolveRegistryBinding, harnessModelSelector, credentialsForEveryProvider, registryModelEntries, selectableEntries, isStockCatalogEndpoint, entrySurface, entryBaseUrl, entryModelIds, versionedAnthropicBaseUrl } from '../../chunk-TGJIX77V.js';
4
4
  import '../../chunk-XBSQ4KMC.js';
5
5
  import '../../chunk-YROR332M.js';
6
- import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, registryDriverConfig, providerCredentialEnvName } from '../../chunk-TAZMDZFP.js';
6
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, registryDriverConfig, providerCredentialEnvName } from '../../chunk-MTWZ7KHZ.js';
7
7
  import '../../chunk-6E6PKKAD.js';
8
- import '../../chunk-WPISSDEI.js';
8
+ import '../../chunk-3ELIPWCH.js';
9
9
  import '../../chunk-4GY63JU6.js';
10
- import '../../chunk-5RHPNNWP.js';
11
- import '../../chunk-F3HNW354.js';
10
+ import '../../chunk-JRIU5GA7.js';
11
+ import '../../chunk-KIFJWSNC.js';
12
12
  import '../../chunk-K5GBV4SA.js';
13
13
  import '../../chunk-QVZA2MDT.js';
14
- import '../../chunk-DF7C3KZK.js';
15
- import '../../chunk-MENCWIHW.js';
14
+ import '../../chunk-LRCSWOZO.js';
15
+ import '../../chunk-EB4ZTESQ.js';
16
16
  import '../../chunk-P4VHQA4N.js';
17
17
  import '../../chunk-2FBPAR2V.js';
18
18
  import '../../chunk-GEEW6SY2.js';
@@ -79,7 +79,7 @@ function buildOpenCodeConfigDocument(session) {
79
79
  else document.provider[providerId] = rendered.block;
80
80
  }
81
81
  const binding = resolveRegistryBinding(session);
82
- const selector = binding ? backendModelSelector(binding) : void 0;
82
+ const selector = binding ? harnessModelSelector(binding) : void 0;
83
83
  if (binding && selector) {
84
84
  document.model = selector;
85
85
  const block = document.provider[binding.providerId];
@@ -167,7 +167,7 @@ var OpenCodeDriver = class extends SubprocessCliDriver {
167
167
  buildArgs(message, resumeId) {
168
168
  const args = ["run", message, "--format", "json"];
169
169
  const binding = resolveRegistryBinding(this.providerSession());
170
- const model = binding ? backendModelSelector(binding) : this.config.model;
170
+ const model = binding ? harnessModelSelector(binding) : this.config.model;
171
171
  if (model) args.push("-m", model);
172
172
  if (resumeId) args.push("-s", resumeId);
173
173
  return args;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../bridge/src/provider-materialize/opencode-config.ts","../../../bridge/src/drivers/opencode.ts"],"names":[],"mappings":"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","file":"opencode.js","sourcesContent":["/**\n * OpenCode's `opencode.json` adapter — the file half of the OpenCode row\n * (§2.3).\n *\n * OpenCode names providers out of [models.dev](https://models.dev): a stock\n * endpoint is already in that list, so the env half's `-m <preset>/<model>`\n * reaches it with nothing written. An endpoint models.dev has never heard of —\n * a self-hosted gateway, a LiteLLM proxy, an Ollama box — exists for OpenCode\n * only if a `provider` block in `opencode.json` describes it:\n *\n * ```jsonc\n * {\n * \"provider\": {\n * \"corp-gateway\": {\n * \"npm\": \"@ai-sdk/openai-compatible\",\n * \"name\": \"Corp Gateway\",\n * \"options\": {\n * \"baseURL\": \"https://llm.corp.example/v1\",\n * \"apiKey\": \"{env:SKAILE_AIP_CORP_GATEWAY_KEY}\"\n * },\n * \"models\": { \"corp-fast-1\": { \"name\": \"corp-fast-1\" } }\n * }\n * }\n * }\n * ```\n *\n * The block is keyed by {@link backendProviderName}, so the name in the file\n * is the name the env half already puts on `-m`. `npm` is the Vercel AI SDK\n * package for the entry's wire `surface`; OpenCode instantiates the provider\n * from it, which is why an entry on a surface with no package is left out\n * rather than guessed at.\n *\n * **Credentials never enter the file.** `options.apiKey` holds OpenCode's own\n * `{env:VAR}` indirection naming the per-entry variable\n * `SKAILE_AIP_<ID>_KEY`; the value rides in the child environment.\n *\n * The document is written to `<home>/opencode/opencode.json` and the child's\n * `XDG_CONFIG_HOME` is pointed at `<home>` — see\n * {@link driverSessionConfigHome} for why that, and not the developer's\n * `~/.config/opencode`.\n *\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n backendModelSelector,\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvDriverSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n versionedAnthropicBaseUrl,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n removeSessionConfigFile,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → the Vercel AI SDK package OpenCode loads for it. These are the\n * four surfaces `BUILTIN_DRIVER_CATALOG.opencode.surfaces` declares; a surface\n * with no package here cannot be instantiated, so the entry is skipped.\n */\nconst OPENCODE_NPM_PACKAGE: Partial<Record<AIProviderSurface, string>> = {\n \"anthropic-messages\": \"@ai-sdk/anthropic\",\n \"openai-completions\": \"@ai-sdk/openai-compatible\",\n \"openai-responses\": \"@ai-sdk/openai\",\n \"google-generative-ai\": \"@ai-sdk/google\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Subdirectory OpenCode reads its global config from, under the config home. */\nexport const OPENCODE_CONFIG_DIRNAME = \"opencode\";\n\n/** Filename OpenCode reads its global config from. */\nexport const OPENCODE_CONFIG_FILENAME = \"opencode.json\";\n\n/** One `provider.<id>` block, in OpenCode's own vocabulary. */\nexport interface OpenCodeProviderBlock {\n /** AI SDK package OpenCode instantiates the provider from. */\n npm: string;\n /** Display name in the `/models` picker. */\n name: string;\n options: {\n baseURL?: string;\n /** OpenCode's `{env:VAR}` indirection — never a secret. */\n apiKey?: string;\n headers?: Record<string, string>;\n };\n /** Provider-side model id → its display entry. */\n models: Record<string, { name: string }>;\n}\n\n/** The subset of `opencode.json` this adapter owns. */\nexport interface OpenCodeConfigDocument {\n $schema: string;\n /** `<provider>/<model>` the session selected, when it selected one. */\n model?: string;\n provider: Record<string, OpenCodeProviderBlock>;\n}\n\n/** An entry OpenCode cannot be taught, and why. */\nexport interface OpenCodeSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildOpenCodeConfigDocument}. */\nexport interface OpenCodeConfigBuild {\n document: OpenCodeConfigDocument;\n /** Entries left out of the document — non-fatal, logged by the driver. */\n skipped: OpenCodeSkippedEntry[];\n}\n\n/**\n * Render one entry as a provider block, or explain why OpenCode cannot load\n * it.\n */\nexport function renderOpenCodeProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { block: OpenCodeProviderBlock } | { skipped: string } {\n const surface = entrySurface(entry);\n const npm = surface ? OPENCODE_NPM_PACKAGE[surface] : undefined;\n if (!npm)\n return {\n skipped: surface\n ? `OpenCode has no AI SDK package for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and OpenCode does not know this provider\" };\n\n const models: Record<string, { name: string }> = {};\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n models[providerModelId] = { name: `${entry.label ?? providerId} ${logicalId}` };\n }\n\n const block: OpenCodeProviderBlock = {\n npm,\n name: entry.label ?? providerId,\n // `@ai-sdk/anthropic` posts to `<baseURL>/messages`.\n options: { baseURL: versionedAnthropicBaseUrl(baseUrl, surface) },\n models,\n };\n const credentialKind = entry.credential?.kind;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n block.options.apiKey = `{env:${providerCredentialEnvName(providerId)}}`;\n if (entry.headers && Object.keys(entry.headers).length > 0)\n block.options.headers = { ...entry.headers };\n return { block };\n}\n\n/**\n * Build the document for a session: one block per entry OpenCode cannot name\n * on its own, plus the selected `<provider>/<model>`.\n *\n * The selected model is added to its provider's `models` map even when no\n * `model_map` declared it — a selector naming a model the registry did not\n * enumerate still has to resolve, and `-m` would otherwise name a model the\n * provider block does not list.\n *\n * An empty registry renders nothing — there is no endpoint of the session's\n * own to tell OpenCode about, and models.dev already covers the stock ones.\n */\nexport function buildOpenCodeConfigDocument(session: EnvDriverSession): OpenCodeConfigBuild {\n const document: OpenCodeConfigDocument = {\n $schema: \"https://opencode.ai/config.json\",\n provider: {},\n };\n const skipped: OpenCodeSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // OpenCode already knows every catalog endpoint through models.dev, under\n // the same name `backendProviderName` gives `-m`. What it cannot know is\n // an endpoint of the session's own, and that is exactly what this file is\n // for — one rule, read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderOpenCodeProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else document.provider[providerId] = rendered.block;\n }\n\n const binding = resolveRegistryBinding(session);\n const selector = binding ? backendModelSelector(binding) : undefined;\n if (binding && selector) {\n document.model = selector;\n const block = document.provider[binding.providerId];\n if (block && binding.providerModelId && !block.models[binding.providerModelId])\n block.models[binding.providerModelId] = { name: binding.providerModelId };\n }\n\n return { document, skipped };\n}\n\n/** What {@link materializeOpenCodeConfig} handed the driver. */\nexport interface OpenCodeMaterialization extends OpenCodeConfigBuild {\n /** Child env fragment: `XDG_CONFIG_HOME`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute path of the rendered file, when one was written. */\n path?: string;\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is already a models.dev provider writes\n * nothing and leaves `XDG_CONFIG_HOME` alone: relocating it would hide the\n * developer's own `~/.config/opencode` for no gain. A file left by an earlier\n * render of the same session is removed in that case, so a session that drops\n * its custom endpoint stops answering to it.\n */\nexport function materializeOpenCodeConfig(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): OpenCodeMaterialization {\n const build = buildOpenCodeConfigDocument(session);\n const home = driverSessionConfigHome(\"opencode\", config);\n const dir = join(home, OPENCODE_CONFIG_DIRNAME);\n if (Object.keys(build.document.provider).length === 0) {\n removeSessionConfigFile(dir, OPENCODE_CONFIG_FILENAME);\n return { ...build, env: {} };\n }\n const path = writeSessionConfigFile(\n dir,\n OPENCODE_CONFIG_FILENAME,\n `${JSON.stringify(build.document, null, 2)}\\n`,\n );\n return { ...build, env: { XDG_CONFIG_HOME: home }, path };\n}\n","import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport {\n backendModelSelector,\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { materializeOpenCodeConfig } from \"../provider-materialize/opencode-config.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractText, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * One `opencode run --format json` event, as emitted by opencode-ai 1.18.31:\n * `{type, timestamp, sessionID, part}` with the payload nested under `part`.\n * Only the fields the driver reads are pinned; other keys are stripped.\n */\nconst OpenCodeEvent = z.object({\n type: z.string(),\n sessionID: z.string().optional(),\n part: z\n .object({\n text: z.string().optional(),\n reason: z.string().optional(),\n cost: z.number().optional(),\n tokens: z\n .object({\n input: z.number().optional(),\n output: z.number().optional(),\n total: z.number().optional(),\n reasoning: z.number().optional(),\n cache: z.object({ read: z.number().optional(), write: z.number().optional() }).optional(),\n })\n .optional(),\n })\n .default({}),\n});\ntype OpenCodeTokens = NonNullable<z.infer<typeof OpenCodeEvent>[\"part\"][\"tokens\"]>;\n\n/** Map `step_finish.part.tokens` onto {@link TokenUsage}; zero cache/reasoning counts are omitted. */\nfunction opencodeTokens(t: OpenCodeTokens | undefined): TokenUsage | null {\n if (!t) return null;\n const usage: TokenUsage = {};\n if (t.input !== undefined) usage.inputTokens = t.input;\n if (t.output !== undefined) usage.outputTokens = t.output;\n if (t.total !== undefined) usage.totalTokens = t.total;\n if (t.reasoning) usage.reasoningTokens = t.reasoning;\n if (t.cache?.read) usage.cacheReadTokens = t.cache.read;\n if (t.cache?.write) usage.cacheCreationTokens = t.cache.write;\n return Object.keys(usage).length > 0 ? usage : null;\n}\n\n/** Sum two usages field by field (a turn can span several opencode steps). */\nfunction addTokens(a: TokenUsage | null, b: TokenUsage): TokenUsage {\n if (!a) return b;\n const out: TokenUsage = { ...a };\n for (const key of Object.keys(b) as (keyof TokenUsage)[])\n out[key] = (a[key] ?? 0) + (b[key] ?? 0);\n return out;\n}\n\n/**\n * Agent driver for **OpenCode** (`opencode`), the model-agnostic open-source\n * coding agent.\n *\n * Spawns `opencode run \"<prompt>\" --format json` per turn and maps OpenCode's\n * JSON event stream to the unified {@link AgentEvent} stream. A\n * `credentials-n` backend (§2.3): every enabled AI provider entry's\n * credential reaches the child environment, and the active model is selected\n * as `-m <provider>/<model>`. An endpoint models.dev does not know is\n * additionally rendered into a session-private `opencode.json`\n * (`provider-materialize/opencode-config.ts`) that `XDG_CONFIG_HOME` points\n * the child at.\n *\n * @remarks\n * - The prompt is a **positional argument** — OpenCode's `-p` flag is a\n * basic-auth password, not the prompt.\n * - Session resume via `-s <id>`; the session id is read from `sessionID`,\n * present on every event, and emitted once as `session_info`.\n * - The event schema is pinned against opencode-ai 1.18.31 by a recorded\n * fixture (`tests/fixtures/opencode-1.18-events.jsonl`).\n *\n * @see https://github.com/sst/opencode\n * @docLink packages/bridge/drivers#opencode-driver\n */\nexport class OpenCodeDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"opencode\");\n protected readonly defaultBin = \"opencode\";\n protected readonly productName = \"OpenCode\";\n protected readonly envPrefix = \"OPENCODE\";\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", message, \"--format\", \"json\"];\n const binding = resolveRegistryBinding(this.providerSession());\n const model = binding ? backendModelSelector(binding) : this.config.model;\n if (model) args.push(\"-m\", model);\n if (resumeId) args.push(\"-s\", resumeId);\n return args;\n }\n\n /**\n * Base env plus one credential variable per enabled registry entry — the\n * canonical `SKAILE_AIP_<ID>_KEY` and, for a stock catalog endpoint, the\n * vendor carrier OpenCode reads on its own (`ANTHROPIC_API_KEY`, …). There\n * is no per-driver key allowlist: what reaches the child is exactly what\n * the registry can authenticate.\n *\n * This is also where the session's custom endpoints are rendered. It runs\n * once per spawn, so a `reconfigure()` between turns re-renders rather than\n * leaving the child pointed at the previous selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const materialized = materializeOpenCodeConfig(session, this.config);\n for (const entry of materialized.skipped)\n this.log.warn(\"OpenCode cannot address an AI provider entry\", {\n providerId: entry.id,\n reason: entry.reason,\n });\n if (materialized.path)\n this.log.debug(\"rendered OpenCode provider config\", { path: materialized.path });\n return {\n ...this.baseEnv(),\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`.\";\n }\n\n override async prompt(message: string): Promise<void> {\n this.turnText = \"\";\n this.turnTokens = null;\n this.turnCost = undefined;\n return super.prompt(message);\n }\n\n /** Assistant text of the current turn, joined across `text` parts and steps. */\n private turnText = \"\";\n /** Usage summed across the turn's `step_finish` events. */\n private turnTokens: TokenUsage | null = null;\n private turnCost: number | undefined;\n\n /**\n * Map `opencode run --format json` (pinned against opencode-ai 1.18.31,\n * fixture `tests/fixtures/opencode-1.18-events.jsonl`). Every event is\n * `{type, timestamp, sessionID, part}` with the payload under `part`;\n * observed types are `step_start`, `text` and `step_finish`. Anything else\n * is ignored rather than guessed at.\n */\n protected handleJson(json: unknown): void {\n const parsed = OpenCodeEvent.safeParse(json);\n if (!parsed.success) return;\n const { type, sessionID, part } = parsed.data;\n this.captureSession(sessionID);\n switch (type) {\n case \"text\": {\n const text = extractText(parsed.data);\n if (!text) break;\n this.turnText += text;\n this.pushAssistantDelta(this.turnText);\n break;\n }\n\n case \"step_finish\": {\n const tokens = opencodeTokens(part.tokens);\n if (tokens) this.turnTokens = addTokens(this.turnTokens, tokens);\n if (part.cost !== undefined) this.turnCost = (this.turnCost ?? 0) + part.cost;\n // [INFERENCE] a step ending in tool calls is followed by another step\n // in the same turn; only the observed terminal reason ends the turn.\n if (part.reason === \"tool-calls\") break;\n this.pushResult({\n tokens: this.turnTokens,\n costUsd: this.turnCost,\n summary: this.turnText || \"Task completed\",\n });\n this.turnText = \"\";\n this.turnTokens = null;\n this.turnCost = undefined;\n break;\n }\n }\n }\n\n /**\n * OpenCode has no model-list endpoint of its own (it reads models.dev), so\n * the session's registry is the list: every enabled entry's mapped ids,\n * namespaced exactly as `-m` takes them.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * `DriverTarget` wrapper for the opencode driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const opencodeDriverTarget: DriverTarget<AgentConfig> = {\n id: \"opencode\",\n displayName: BUILTIN_DRIVER_CATALOG.opencode?.name ?? \"OpenCode\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OpenCodeDriver(config),\n listModels: async (registry, options) =>\n new OpenCodeDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
1
+ {"version":3,"sources":["../../../bridge/src/provider-materialize/opencode-config.ts","../../../bridge/src/drivers/opencode.ts"],"names":[],"mappings":"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","file":"opencode.js","sourcesContent":["/**\n * OpenCode's `opencode.json` adapter — the file half of the OpenCode row\n * (§2.3).\n *\n * OpenCode names providers out of [models.dev](https://models.dev): a stock\n * endpoint is already in that list, so the env half's `-m <preset>/<model>`\n * reaches it with nothing written. An endpoint models.dev has never heard of —\n * a self-hosted gateway, a LiteLLM proxy, an Ollama box — exists for OpenCode\n * only if a `provider` block in `opencode.json` describes it:\n *\n * ```jsonc\n * {\n * \"provider\": {\n * \"corp-gateway\": {\n * \"npm\": \"@ai-sdk/openai-compatible\",\n * \"name\": \"Corp Gateway\",\n * \"options\": {\n * \"baseURL\": \"https://llm.corp.example/v1\",\n * \"apiKey\": \"{env:SKAILE_AIP_CORP_GATEWAY_KEY}\"\n * },\n * \"models\": { \"corp-fast-1\": { \"name\": \"corp-fast-1\" } }\n * }\n * }\n * }\n * ```\n *\n * The block is keyed by {@link harnessProviderName}, so the name in the file\n * is the name the env half already puts on `-m`. `npm` is the Vercel AI SDK\n * package for the entry's wire `surface`; OpenCode instantiates the provider\n * from it, which is why an entry on a surface with no package is left out\n * rather than guessed at.\n *\n * **Credentials never enter the file.** `options.apiKey` holds OpenCode's own\n * `{env:VAR}` indirection naming the per-entry variable\n * `SKAILE_AIP_<ID>_KEY`; the value rides in the child environment.\n *\n * The document is written to `<home>/opencode/opencode.json` and the child's\n * `XDG_CONFIG_HOME` is pointed at `<home>` — see\n * {@link driverSessionConfigHome} for why that, and not the developer's\n * `~/.config/opencode`.\n *\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n harnessModelSelector,\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvDriverSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n versionedAnthropicBaseUrl,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n removeSessionConfigFile,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → the Vercel AI SDK package OpenCode loads for it. These are the\n * four surfaces `BUILTIN_DRIVER_CATALOG.opencode.surfaces` declares; a surface\n * with no package here cannot be instantiated, so the entry is skipped.\n */\nconst OPENCODE_NPM_PACKAGE: Partial<Record<AIProviderSurface, string>> = {\n \"anthropic-messages\": \"@ai-sdk/anthropic\",\n \"openai-completions\": \"@ai-sdk/openai-compatible\",\n \"openai-responses\": \"@ai-sdk/openai\",\n \"google-generative-ai\": \"@ai-sdk/google\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Subdirectory OpenCode reads its global config from, under the config home. */\nexport const OPENCODE_CONFIG_DIRNAME = \"opencode\";\n\n/** Filename OpenCode reads its global config from. */\nexport const OPENCODE_CONFIG_FILENAME = \"opencode.json\";\n\n/** One `provider.<id>` block, in OpenCode's own vocabulary. */\nexport interface OpenCodeProviderBlock {\n /** AI SDK package OpenCode instantiates the provider from. */\n npm: string;\n /** Display name in the `/models` picker. */\n name: string;\n options: {\n baseURL?: string;\n /** OpenCode's `{env:VAR}` indirection — never a secret. */\n apiKey?: string;\n headers?: Record<string, string>;\n };\n /** Provider-side model id → its display entry. */\n models: Record<string, { name: string }>;\n}\n\n/** The subset of `opencode.json` this adapter owns. */\nexport interface OpenCodeConfigDocument {\n $schema: string;\n /** `<provider>/<model>` the session selected, when it selected one. */\n model?: string;\n provider: Record<string, OpenCodeProviderBlock>;\n}\n\n/** An entry OpenCode cannot be taught, and why. */\nexport interface OpenCodeSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildOpenCodeConfigDocument}. */\nexport interface OpenCodeConfigBuild {\n document: OpenCodeConfigDocument;\n /** Entries left out of the document — non-fatal, logged by the driver. */\n skipped: OpenCodeSkippedEntry[];\n}\n\n/**\n * Render one entry as a provider block, or explain why OpenCode cannot load\n * it.\n */\nexport function renderOpenCodeProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { block: OpenCodeProviderBlock } | { skipped: string } {\n const surface = entrySurface(entry);\n const npm = surface ? OPENCODE_NPM_PACKAGE[surface] : undefined;\n if (!npm)\n return {\n skipped: surface\n ? `OpenCode has no AI SDK package for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and OpenCode does not know this provider\" };\n\n const models: Record<string, { name: string }> = {};\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n models[providerModelId] = { name: `${entry.label ?? providerId} ${logicalId}` };\n }\n\n const block: OpenCodeProviderBlock = {\n npm,\n name: entry.label ?? providerId,\n // `@ai-sdk/anthropic` posts to `<baseURL>/messages`.\n options: { baseURL: versionedAnthropicBaseUrl(baseUrl, surface) },\n models,\n };\n const credentialKind = entry.credential?.kind;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n block.options.apiKey = `{env:${providerCredentialEnvName(providerId)}}`;\n if (entry.headers && Object.keys(entry.headers).length > 0)\n block.options.headers = { ...entry.headers };\n return { block };\n}\n\n/**\n * Build the document for a session: one block per entry OpenCode cannot name\n * on its own, plus the selected `<provider>/<model>`.\n *\n * The selected model is added to its provider's `models` map even when no\n * `model_map` declared it — a selector naming a model the registry did not\n * enumerate still has to resolve, and `-m` would otherwise name a model the\n * provider block does not list.\n *\n * An empty registry renders nothing — there is no endpoint of the session's\n * own to tell OpenCode about, and models.dev already covers the stock ones.\n */\nexport function buildOpenCodeConfigDocument(session: EnvDriverSession): OpenCodeConfigBuild {\n const document: OpenCodeConfigDocument = {\n $schema: \"https://opencode.ai/config.json\",\n provider: {},\n };\n const skipped: OpenCodeSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // OpenCode already knows every catalog endpoint through models.dev, under\n // the same name `harnessProviderName` gives `-m`. What it cannot know is\n // an endpoint of the session's own, and that is exactly what this file is\n // for — one rule, read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderOpenCodeProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else document.provider[providerId] = rendered.block;\n }\n\n const binding = resolveRegistryBinding(session);\n const selector = binding ? harnessModelSelector(binding) : undefined;\n if (binding && selector) {\n document.model = selector;\n const block = document.provider[binding.providerId];\n if (block && binding.providerModelId && !block.models[binding.providerModelId])\n block.models[binding.providerModelId] = { name: binding.providerModelId };\n }\n\n return { document, skipped };\n}\n\n/** What {@link materializeOpenCodeConfig} handed the driver. */\nexport interface OpenCodeMaterialization extends OpenCodeConfigBuild {\n /** Child env fragment: `XDG_CONFIG_HOME`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute path of the rendered file, when one was written. */\n path?: string;\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is already a models.dev provider writes\n * nothing and leaves `XDG_CONFIG_HOME` alone: relocating it would hide the\n * developer's own `~/.config/opencode` for no gain. A file left by an earlier\n * render of the same session is removed in that case, so a session that drops\n * its custom endpoint stops answering to it.\n */\nexport function materializeOpenCodeConfig(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): OpenCodeMaterialization {\n const build = buildOpenCodeConfigDocument(session);\n const home = driverSessionConfigHome(\"opencode\", config);\n const dir = join(home, OPENCODE_CONFIG_DIRNAME);\n if (Object.keys(build.document.provider).length === 0) {\n removeSessionConfigFile(dir, OPENCODE_CONFIG_FILENAME);\n return { ...build, env: {} };\n }\n const path = writeSessionConfigFile(\n dir,\n OPENCODE_CONFIG_FILENAME,\n `${JSON.stringify(build.document, null, 2)}\\n`,\n );\n return { ...build, env: { XDG_CONFIG_HOME: home }, path };\n}\n","import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport {\n harnessModelSelector,\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { materializeOpenCodeConfig } from \"../provider-materialize/opencode-config.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractText, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * One `opencode run --format json` event, as emitted by opencode-ai 1.18.31:\n * `{type, timestamp, sessionID, part}` with the payload nested under `part`.\n * Only the fields the driver reads are pinned; other keys are stripped.\n */\nconst OpenCodeEvent = z.object({\n type: z.string(),\n sessionID: z.string().optional(),\n part: z\n .object({\n text: z.string().optional(),\n reason: z.string().optional(),\n cost: z.number().optional(),\n tokens: z\n .object({\n input: z.number().optional(),\n output: z.number().optional(),\n total: z.number().optional(),\n reasoning: z.number().optional(),\n cache: z.object({ read: z.number().optional(), write: z.number().optional() }).optional(),\n })\n .optional(),\n })\n .default({}),\n});\ntype OpenCodeTokens = NonNullable<z.infer<typeof OpenCodeEvent>[\"part\"][\"tokens\"]>;\n\n/** Map `step_finish.part.tokens` onto {@link TokenUsage}; zero cache/reasoning counts are omitted. */\nfunction opencodeTokens(t: OpenCodeTokens | undefined): TokenUsage | null {\n if (!t) return null;\n const usage: TokenUsage = {};\n if (t.input !== undefined) usage.inputTokens = t.input;\n if (t.output !== undefined) usage.outputTokens = t.output;\n if (t.total !== undefined) usage.totalTokens = t.total;\n if (t.reasoning) usage.reasoningTokens = t.reasoning;\n if (t.cache?.read) usage.cacheReadTokens = t.cache.read;\n if (t.cache?.write) usage.cacheCreationTokens = t.cache.write;\n return Object.keys(usage).length > 0 ? usage : null;\n}\n\n/** Sum two usages field by field (a turn can span several opencode steps). */\nfunction addTokens(a: TokenUsage | null, b: TokenUsage): TokenUsage {\n if (!a) return b;\n const out: TokenUsage = { ...a };\n for (const key of Object.keys(b) as (keyof TokenUsage)[])\n out[key] = (a[key] ?? 0) + (b[key] ?? 0);\n return out;\n}\n\n/**\n * Agent driver for **OpenCode** (`opencode`), the model-agnostic open-source\n * coding agent.\n *\n * Spawns `opencode run \"<prompt>\" --format json` per turn and maps OpenCode's\n * JSON event stream to the unified {@link AgentEvent} stream. A\n * `credentials-n` harness (§2.3): every enabled AI provider entry's\n * credential reaches the child environment, and the active model is selected\n * as `-m <provider>/<model>`. An endpoint models.dev does not know is\n * additionally rendered into a session-private `opencode.json`\n * (`provider-materialize/opencode-config.ts`) that `XDG_CONFIG_HOME` points\n * the child at.\n *\n * @remarks\n * - The prompt is a **positional argument** — OpenCode's `-p` flag is a\n * basic-auth password, not the prompt.\n * - Session resume via `-s <id>`; the session id is read from `sessionID`,\n * present on every event, and emitted once as `session_info`.\n * - The event schema is pinned against opencode-ai 1.18.31 by a recorded\n * fixture (`tests/fixtures/opencode-1.18-events.jsonl`).\n *\n * @see https://github.com/sst/opencode\n * @docLink packages/bridge/drivers#opencode-driver\n */\nexport class OpenCodeDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"opencode\");\n protected readonly defaultBin = \"opencode\";\n protected readonly productName = \"OpenCode\";\n protected readonly envPrefix = \"OPENCODE\";\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", message, \"--format\", \"json\"];\n const binding = resolveRegistryBinding(this.providerSession());\n const model = binding ? harnessModelSelector(binding) : this.config.model;\n if (model) args.push(\"-m\", model);\n if (resumeId) args.push(\"-s\", resumeId);\n return args;\n }\n\n /**\n * Base env plus one credential variable per enabled registry entry — the\n * canonical `SKAILE_AIP_<ID>_KEY` and, for a stock catalog endpoint, the\n * vendor carrier OpenCode reads on its own (`ANTHROPIC_API_KEY`, …). There\n * is no per-driver key allowlist: what reaches the child is exactly what\n * the registry can authenticate.\n *\n * This is also where the session's custom endpoints are rendered. It runs\n * once per spawn, so a `reconfigure()` between turns re-renders rather than\n * leaving the child pointed at the previous selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const materialized = materializeOpenCodeConfig(session, this.config);\n for (const entry of materialized.skipped)\n this.log.warn(\"OpenCode cannot address an AI provider entry\", {\n providerId: entry.id,\n reason: entry.reason,\n });\n if (materialized.path)\n this.log.debug(\"rendered OpenCode provider config\", { path: materialized.path });\n return {\n ...this.baseEnv(),\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`.\";\n }\n\n override async prompt(message: string): Promise<void> {\n this.turnText = \"\";\n this.turnTokens = null;\n this.turnCost = undefined;\n return super.prompt(message);\n }\n\n /** Assistant text of the current turn, joined across `text` parts and steps. */\n private turnText = \"\";\n /** Usage summed across the turn's `step_finish` events. */\n private turnTokens: TokenUsage | null = null;\n private turnCost: number | undefined;\n\n /**\n * Map `opencode run --format json` (pinned against opencode-ai 1.18.31,\n * fixture `tests/fixtures/opencode-1.18-events.jsonl`). Every event is\n * `{type, timestamp, sessionID, part}` with the payload under `part`;\n * observed types are `step_start`, `text` and `step_finish`. Anything else\n * is ignored rather than guessed at.\n */\n protected handleJson(json: unknown): void {\n const parsed = OpenCodeEvent.safeParse(json);\n if (!parsed.success) return;\n const { type, sessionID, part } = parsed.data;\n this.captureSession(sessionID);\n switch (type) {\n case \"text\": {\n const text = extractText(parsed.data);\n if (!text) break;\n this.turnText += text;\n this.pushAssistantDelta(this.turnText);\n break;\n }\n\n case \"step_finish\": {\n const tokens = opencodeTokens(part.tokens);\n if (tokens) this.turnTokens = addTokens(this.turnTokens, tokens);\n if (part.cost !== undefined) this.turnCost = (this.turnCost ?? 0) + part.cost;\n // [INFERENCE] a step ending in tool calls is followed by another step\n // in the same turn; only the observed terminal reason ends the turn.\n if (part.reason === \"tool-calls\") break;\n this.pushResult({\n tokens: this.turnTokens,\n costUsd: this.turnCost,\n summary: this.turnText || \"Task completed\",\n });\n this.turnText = \"\";\n this.turnTokens = null;\n this.turnCost = undefined;\n break;\n }\n }\n }\n\n /**\n * OpenCode has no model-list endpoint of its own (it reads models.dev), so\n * the session's registry is the list: every enabled entry's mapped ids,\n * namespaced exactly as `-m` takes them.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * `DriverTarget` wrapper for the opencode driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const opencodeDriverTarget: DriverTarget<AgentConfig> = {\n id: \"opencode\",\n displayName: BUILTIN_DRIVER_CATALOG.opencode?.name ?? \"OpenCode\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OpenCodeDriver(config),\n listModels: async (registry, options) =>\n new OpenCodeDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
@@ -1,17 +1,17 @@
1
- import { GeminiFamilyDriver } from '../../chunk-NPS765HV.js';
2
- import '../../chunk-XUVQSDNV.js';
3
- import { resolveRegistryBinding } from '../../chunk-DRAI3JH5.js';
4
- import { fetchProviderModels } from '../../chunk-ENUCD5MW.js';
1
+ import { GeminiFamilyDriver } from '../../chunk-RHESVS7V.js';
2
+ import '../../chunk-GKTFGCQZ.js';
3
+ import { resolveRegistryBinding } from '../../chunk-TGJIX77V.js';
4
+ import { fetchProviderModels } from '../../chunk-75LXFKQR.js';
5
5
  import '../../chunk-XBSQ4KMC.js';
6
6
  import '../../chunk-YROR332M.js';
7
- import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from '../../chunk-TAZMDZFP.js';
7
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from '../../chunk-MTWZ7KHZ.js';
8
8
  import '../../chunk-6E6PKKAD.js';
9
9
  import '../../chunk-JMKB7IB4.js';
10
10
  import '../../chunk-ICSCSM5D.js';
11
11
  import '../../chunk-MJHSLODD.js';
12
12
  import '../../chunk-C3CAXQMA.js';
13
13
  import '../../chunk-BOFL7GIF.js';
14
- import '../../chunk-N7B3LZ7V.js';
14
+ import '../../chunk-TGE33MKN.js';
15
15
  import '../../chunk-NSBPE2FW.js';
16
16
  import * as z from 'zod';
17
17
 
@@ -1,22 +1,22 @@
1
- export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, labelToolCall, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-4T25XCWX.js';
1
+ export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, labelToolCall, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-NVQLE4MK.js';
2
2
  export { ANTHROPIC_DEFAULT_BASE_URL, agentTranscriptStore, buildClaudeEndpointEnv, claudeEndpointMode, localTranscriptStore, probeResumeTranscript, resolveClaudeConfigDir, transcriptStoreForRuntime } from '../chunk-LX3FKVLL.js';
3
3
  export { scopeReconfigureModel } from '../chunk-EINLFFP6.js';
4
4
  export { CODEX_NATIVE_STATE_FORMAT, CodexNativeStateUnavailable } from '../chunk-LOO5CB5M.js';
5
- export { dispatchCapability, filterRenderCapabilities, renderFallback } from '../chunk-UWJAJP6T.js';
6
- export { ModelTierResolutionError, PROVIDER_MODEL_TIERS, STATIC_MODELS, fetchProviderModels, getModels, getStaticModels, modelIdTargetForEntry, resolveManifestModel, resolveModelCapabilities, resolveModelTier } from '../chunk-ENUCD5MW.js';
5
+ export { dispatchCapability, filterRenderCapabilities, renderFallback } from '../chunk-TTITGVXV.js';
6
+ export { ModelTierResolutionError, PROVIDER_MODEL_TIERS, STATIC_MODELS, fetchProviderModels, getModels, getStaticModels, modelIdTargetForEntry, resolveManifestModel, resolveModelCapabilities, resolveModelTier } from '../chunk-75LXFKQR.js';
7
7
  export { AccountUnavailableError, AuthError, RUNNER_PRIVATE_ENV_KEYS, classifyClaudeSdkError, reclassifyAuthAsAccountUnavailable, stripRunnerPrivateEnv } from '../chunk-XBSQ4KMC.js';
8
8
  export { AGENT_EXEC_ENV, agentExecRequested, resolveAgentExec, wrapAgentCommand } from '../chunk-YROR332M.js';
9
- export { AGENT_EFFORT_LEVELS, AI_PROVIDER_PRESETS, AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, PROVIDER_CREDENTIAL_ENV_PREFIX, PROVIDER_CREDENTIAL_ENV_SUFFIX, buildCredentialHeaders, catalogLayer, conventionalCredentialEnvName, createDriver, entryCredentialEnv, entryCredentialValue, expandPreset, getBridgeLogger, getProviderPreset, listDrivers, listModelsForDriver, listProviderPresets, presetBaseUrl, probeProviderEntry, providerCredentialEnvName, registerBuiltinDrivers, registryCredentialEnv, registryDriverConfig, resolveEntryCredential, resolvePresetBaseUrl, resolveProbeUrl, toAgentEffort, toMergedRegistry } from '../chunk-TAZMDZFP.js';
9
+ export { AGENT_EFFORT_LEVELS, AI_PROVIDER_PRESETS, AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, PROVIDER_CREDENTIAL_ENV_PREFIX, PROVIDER_CREDENTIAL_ENV_SUFFIX, buildCredentialHeaders, catalogLayer, conventionalCredentialEnvName, createDriver, entryCredentialEnv, entryCredentialValue, expandPreset, getBridgeLogger, getProviderPreset, listDrivers, listModelsForDriver, listProviderPresets, presetBaseUrl, probeProviderEntry, providerCredentialEnvName, registerBuiltinDrivers, registryCredentialEnv, registryDriverConfig, resolveEntryCredential, resolvePresetBaseUrl, resolveProbeUrl, toAgentEffort, toMergedRegistry } from '../chunk-MTWZ7KHZ.js';
10
10
  import '../chunk-6E6PKKAD.js';
11
11
  import '../chunk-JS7DCCDA.js';
12
- import '../chunk-WPISSDEI.js';
12
+ import '../chunk-3ELIPWCH.js';
13
13
  import '../chunk-4GY63JU6.js';
14
- import '../chunk-5RHPNNWP.js';
15
- import '../chunk-F3HNW354.js';
14
+ import '../chunk-JRIU5GA7.js';
15
+ import '../chunk-KIFJWSNC.js';
16
16
  import '../chunk-K5GBV4SA.js';
17
17
  import '../chunk-QVZA2MDT.js';
18
- import '../chunk-DF7C3KZK.js';
19
- import '../chunk-MENCWIHW.js';
18
+ import '../chunk-LRCSWOZO.js';
19
+ import '../chunk-EB4ZTESQ.js';
20
20
  import '../chunk-P4VHQA4N.js';
21
21
  import '../chunk-2FBPAR2V.js';
22
22
  import '../chunk-GEEW6SY2.js';
@@ -25,7 +25,7 @@ import '../chunk-ICSCSM5D.js';
25
25
  import '../chunk-MJHSLODD.js';
26
26
  import '../chunk-C3CAXQMA.js';
27
27
  import '../chunk-BOFL7GIF.js';
28
- import '../chunk-N7B3LZ7V.js';
28
+ import '../chunk-TGE33MKN.js';
29
29
  import '../chunk-NSBPE2FW.js';
30
30
  //# sourceMappingURL=index.js.map
31
31
  //# sourceMappingURL=index.js.map
@@ -30,7 +30,7 @@ export interface CapabilityDispatchResult {
30
30
  * for `render_invoked.callId`, `hooks.invoke`'s `callId` and — for client
31
31
  * capabilities — the outbound `capability_invoked.callId`. It is deliberately
32
32
  * NOT the driver's tool-call id: those are only as unique as the model
33
- * provider makes them (some backends emit `call_0` on every turn), and the
33
+ * provider makes them (some harnesses emit `call_0` on every turn), and the
34
34
  * runner's pending-call map is keyed by this id, so a late `capability_result`
35
35
  * for a timed-out call must never be able to resolve a later call that reused
36
36
  * the provider's id. Drivers map results back to their tool calls through the
@@ -1,15 +1,15 @@
1
1
  import type { Logger, TokenUsage } from "@skaile/workspaces/types";
2
2
  import { type AgentConfig, AgentDriver, type AgentError } from "../types.js";
3
3
  /**
4
- * Shared base for one-shot **subprocess CLI** agent backends (Gemini, Qwen,
4
+ * Shared base for one-shot **subprocess CLI** agent harnesses (Gemini, Qwen,
5
5
  * OpenCode, Goose, Continue).
6
6
  *
7
- * These backends are neither persistent JSON-RPC subprocesses (`omp`) nor
7
+ * These harnesses are neither persistent JSON-RPC subprocesses (`omp`) nor
8
8
  * in-process SDKs (`claude-sdk`, `codex`). In headless mode each is invoked
9
9
  * **once per turn** — `prompt()` spawns the CLI fresh, a `readline` loop maps
10
10
  * newline-delimited JSON on stdout to the unified {@link AgentEvent} stream, and
11
11
  * **process exit marks the end of the turn**. Multi-turn continuity comes from
12
- * capturing a backend session id (emitted as `session_info`) and replaying it
12
+ * capturing a harness session id (emitted as `session_info`) and replaying it
13
13
  * via a resume flag on the next spawn.
14
14
  *
15
15
  * Subclasses implement {@link buildArgs}, {@link buildEnv}, and either
@@ -14,7 +14,7 @@ import { SubprocessCliDriver } from "./_subprocess-cli.js";
14
14
  * events, only a final assistant message plus a result.
15
15
  *
16
16
  * @remarks
17
- * - Auth via `CONTINUE_API_KEY` / `cn login`. A `credentials-n` backend
17
+ * - Auth via `CONTINUE_API_KEY` / `cn login`. A `credentials-n` harness
18
18
  * (§2.3): every enabled AI provider entry's credential reaches the child
19
19
  * environment, and the active model is a **role binding** — `cn` has no
20
20
  * `--model` flag, its `config.yaml` binds models to roles — so the session's
@@ -24,7 +24,7 @@ export declare abstract class GeminiFamilyDriver extends SubprocessCliDriver {
24
24
  * The AI provider entry this session's model selector names, memoized until
25
25
  * the model changes.
26
26
  *
27
- * Gemini CLI and Qwen Code are `single`-plurality backends (§2.3): they
27
+ * Gemini CLI and Qwen Code are `single`-plurality harnesses (§2.3): they
28
28
  * address one endpoint, so the bound entry supplies both the credential and
29
29
  * the base URL. Resolving through {@link bindSingleProviderEntry} is what
30
30
  * puts the surface check — which throws — on the start path.
@@ -32,11 +32,11 @@ export declare abstract class GeminiFamilyDriver extends SubprocessCliDriver {
32
32
  protected registryBinding(): RegistryModelBinding | undefined;
33
33
  /**
34
34
  * Fail before the first spawn when the bound entry speaks a surface this
35
- * backend cannot — the error names the surface.
35
+ * harness cannot — the error names the surface.
36
36
  */
37
37
  start(): Promise<void>;
38
38
  reconfigure(patch: Partial<Pick<AgentConfig, "model" | "thinking" | "effort">>): void;
39
- /** The provider-side model id the backend is actually run with. */
39
+ /** The provider-side model id the harness is actually run with. */
40
40
  getModel(): string | undefined;
41
41
  }
42
42
  /**
@@ -9,7 +9,7 @@ import { SubprocessCliDriver } from "./_subprocess-cli.js";
9
9
  *
10
10
  * Spawns `goose run -t "<prompt>" --output-format stream-json --quiet` per turn
11
11
  * and maps Goose's stream-json events to the unified {@link AgentEvent} stream.
12
- * A `credentials-n` backend (§2.3): every enabled AI provider entry's
12
+ * A `credentials-n` harness (§2.3): every enabled AI provider entry's
13
13
  * credential reaches the child environment, and the active endpoint + model
14
14
  * are named by `GOOSE_PROVIDER` / `GOOSE_MODEL`. An endpoint Goose has no
15
15
  * built-in provider for is additionally rendered as a declarative
@@ -9,7 +9,7 @@ import { SubprocessCliDriver } from "./_subprocess-cli.js";
9
9
  *
10
10
  * Spawns `opencode run "<prompt>" --format json` per turn and maps OpenCode's
11
11
  * JSON event stream to the unified {@link AgentEvent} stream. A
12
- * `credentials-n` backend (§2.3): every enabled AI provider entry's
12
+ * `credentials-n` harness (§2.3): every enabled AI provider entry's
13
13
  * credential reaches the child environment, and the active model is selected
14
14
  * as `-m <provider>/<model>`. An endpoint models.dev does not know is
15
15
  * additionally rendered into a session-private `opencode.json`
@@ -24,7 +24,7 @@
24
24
  *
25
25
  * `provider` is Continue's *adapter class*, not an endpoint name — the
26
26
  * endpoint is `apiBase`. The row's `name` carries the identity instead, and it
27
- * is `backendProviderName`/`backendModelSelector` verbatim, so a model reads
27
+ * is `harnessProviderName`/`harnessModelSelector` verbatim, so a model reads
28
28
  * the same here as in every other adapter.
29
29
  *
30
30
  * **Credentials never enter the file.** `apiKey` holds Continue's own
@@ -46,7 +46,7 @@ import { type EnvDriverSession } from "./env-drivers.js";
46
46
  export declare const CONTINUE_CONFIG_FILENAME = "config.yaml";
47
47
  /** One `models[]` row. */
48
48
  export interface ContinueModelRow {
49
- /** `<backendProviderName>/<providerModelId>` — the programme-wide model id. */
49
+ /** `<harnessProviderName>/<providerModelId>` — the programme-wide model id. */
50
50
  name: string;
51
51
  /** Continue adapter class: `openai`, `anthropic`, `gemini`. */
52
52
  provider: string;
@@ -17,7 +17,7 @@
17
17
  * Alongside the canonical name, {@link registryCredentialEnv} also sets the
18
18
  * *conventional* carrier a CLI already reads (`ANTHROPIC_API_KEY`,
19
19
  * `GEMINI_API_KEY`, `GROQ_API_KEY`, …) so a catalog-preset entry works in a
20
- * backend that has no per-endpoint config file yet.
20
+ * harness that has no per-endpoint config file yet.
21
21
  *
22
22
  * @see PROVIDER-CONFIG-PLAN.md §1.4, §2.3
23
23
  */
@@ -47,7 +47,7 @@ export declare const PROVIDER_CREDENTIAL_ENV_SUFFIX = "_KEY";
47
47
  */
48
48
  export declare function providerCredentialEnvName(providerId: string): string;
49
49
  /**
50
- * The env var a backend already looks for on its own, when the entry names one.
50
+ * The env var a harness already looks for on its own, when the entry names one.
51
51
  *
52
52
  * The catalog preset's conventional carrier wins (`GEMINI_API_KEY` for
53
53
  * `google`), because that is the name the vendor's own CLI reads; otherwise an
@@ -76,9 +76,9 @@ export declare function entryCredentialValue(providerId: string, entry: AIProvid
76
76
  /** Options for {@link entryCredentialEnv} / {@link registryCredentialEnv}. */
77
77
  export interface RegistryCredentialEnvOptions extends RegistryCredentialOptions {
78
78
  /**
79
- * Also set the backend-conventional carrier
79
+ * Also set the harness-conventional carrier
80
80
  * ({@link conventionalCredentialEnvName}). Default `true`. Set `false` for a
81
- * backend that reads every endpoint out of a rendered config file and must
81
+ * harness that reads every endpoint out of a rendered config file and must
82
82
  * not inherit a vendor default from a neighbouring entry.
83
83
  */
84
84
  aliases?: boolean;
@@ -2,10 +2,10 @@
2
2
  * Registry adapter for the **env-shaped CLI drivers** — Gemini, Qwen, OpenCode,
3
3
  * Goose and Continue (§2.3).
4
4
  *
5
- * These backends take their endpoint from the environment rather than from a
5
+ * These harnesses take their endpoint from the environment rather than from a
6
6
  * config file, so the adapter's job is three things: resolve which registry
7
7
  * entry the session's model selector names, refuse at start when that entry
8
- * speaks a wire surface the backend cannot, and hand the driver the
8
+ * speaks a wire surface the harness cannot, and hand the driver the
9
9
  * provider-side model id it must put on the command line.
10
10
  *
11
11
  * Two pluralities meet here (`BUILTIN_DRIVER_CATALOG.providerPlurality`):
@@ -71,11 +71,11 @@ export interface RegistryModelBinding {
71
71
  /** Resolved endpoint, from the entry, its transport params, or its preset. */
72
72
  baseUrl?: string;
73
73
  /**
74
- * The provider name the *backend* knows this endpoint by — a catalog preset
74
+ * The provider name the *harness* knows this endpoint by — a catalog preset
75
75
  * id for a stock endpoint, the registry id for anything custom. See
76
- * {@link backendProviderName}.
76
+ * {@link harnessProviderName}.
77
77
  */
78
- backendProviderId: string;
78
+ harnessProviderId: string;
79
79
  /** Non-fatal notes from `parseModelRef` (dangling role, disabled provider). */
80
80
  warnings: string[];
81
81
  }
@@ -103,20 +103,20 @@ export declare function entryBaseUrl(entry: AIProviderLlmEntry): string | undefi
103
103
  */
104
104
  export declare function versionedAnthropicBaseUrl(baseUrl: string, surface: AIProviderSurface | undefined): string;
105
105
  /**
106
- * True when a `credentials-n` backend already knows this endpoint under its
106
+ * True when a `credentials-n` harness already knows this endpoint under its
107
107
  * own catalog name — the entry names a preset and did not move it somewhere
108
108
  * else. Both sides are compared canonically, so `https://api.anthropic.com/v1`
109
109
  * is still the `anthropic` preset's endpoint.
110
110
  *
111
111
  * The one rule both halves of §2.3 read: it decides the name the env half
112
- * puts on the command line ({@link backendProviderName}) *and* whether the
112
+ * puts on the command line ({@link harnessProviderName}) *and* whether the
113
113
  * file half has to describe the endpoint at all. Reading it twice is what
114
114
  * keeps `-m <name>/<model>` and the generated provider file talking about the
115
115
  * same thing.
116
116
  */
117
117
  export declare function isStockCatalogEndpoint(entry: AIProviderLlmEntry): boolean;
118
118
  /**
119
- * The provider name to give a `credentials-n` backend (`-m <name>/<model>`,
119
+ * The provider name to give a `credentials-n` harness (`-m <name>/<model>`,
120
120
  * `GOOSE_PROVIDER`).
121
121
  *
122
122
  * A stock catalog endpoint is named by its preset, because that is the name
@@ -126,7 +126,7 @@ export declare function isStockCatalogEndpoint(entry: AIProviderLlmEntry): boole
126
126
  * it, so the id is what its generated provider file is keyed by (the file half
127
127
  * of §2.3).
128
128
  */
129
- export declare function backendProviderName(providerId: string, entry: AIProviderLlmEntry): string;
129
+ export declare function harnessProviderName(providerId: string, entry: AIProviderLlmEntry): string;
130
130
  /**
131
131
  * Enabled `llm`/`embed` entries, in registry order. Also the set the file
132
132
  * adapters render (`opencode-config.ts`, `goose-custom-providers.ts`,
@@ -143,14 +143,14 @@ export declare function entryModelIds(entry: AIProviderLlmEntry): Array<[string,
143
143
  /**
144
144
  * Resolve the session's endpoint + model.
145
145
  *
146
- * With no selector the first entry in registry order wins and the backend
146
+ * With no selector the first entry in registry order wins and the harness
147
147
  * keeps its own default model — exactly what an absent `model` meant before
148
148
  * the registry existed. Returns `undefined` when no entry can serve a model
149
149
  * (an empty, fully-disabled or voice-only registry).
150
150
  */
151
151
  export declare function resolveRegistryBinding(session: EnvDriverSession): RegistryModelBinding | undefined;
152
152
  /**
153
- * Every credential a `credentials-n` backend may use: one variable per
153
+ * Every credential a `credentials-n` harness may use: one variable per
154
154
  * enabled registry entry. OpenCode, Goose and Continue have always received
155
155
  * *all* of them, not just the selected endpoint's, because they route across
156
156
  * providers inside a single session.
@@ -159,17 +159,17 @@ export declare function credentialsForEveryProvider(session: EnvDriverSession):
159
159
  /**
160
160
  * Throw when the bound entry speaks a wire surface this driver cannot.
161
161
  *
162
- * The message names the offending surface and lists the ones the backend does
162
+ * The message names the offending surface and lists the ones the harness does
163
163
  * speak (`BUILTIN_DRIVER_CATALOG[driverId].surfaces`). An entry that declares
164
164
  * no surface and names no preset is not judged — there is nothing to compare.
165
165
  */
166
166
  export declare function assertDriverSpeaksSurface(driverId: string, productName: string, binding: RegistryModelBinding): void;
167
167
  /**
168
- * The models a `credentials-n` backend can be pointed at, straight from the
169
- * registry: every enabled entry's mapped ids, namespaced the way the backend
168
+ * The models a `credentials-n` harness can be pointed at, straight from the
169
+ * registry: every enabled entry's mapped ids, namespaced the way the harness
170
170
  * takes them (`-m <provider>/<model>`).
171
171
  *
172
- * These backends have no model-list endpoint of their own — OpenCode reads
172
+ * These harnesses have no model-list endpoint of their own — OpenCode reads
173
173
  * models.dev, Goose and Continue read their config — so the registry is the
174
174
  * only list that describes *this* session's reachable models, and it needs no
175
175
  * network call to produce.
@@ -186,11 +186,11 @@ export declare function registryModelEntries(session: EnvDriverSession): ModelEn
186
186
  */
187
187
  export declare function bindSingleProviderEntry(driverId: string, productName: string, session: EnvDriverSession): RegistryModelBinding | undefined;
188
188
  /**
189
- * The `<provider>/<model>` selector a `credentials-n` backend takes on its
189
+ * The `<provider>/<model>` selector a `credentials-n` harness takes on its
190
190
  * command line (`opencode -m`). `undefined` when no model was selected — the
191
- * backend then uses its own default rather than being handed a bare provider.
191
+ * harness then uses its own default rather than being handed a bare provider.
192
192
  */
193
- export declare function backendModelSelector(binding: RegistryModelBinding): string | undefined;
193
+ export declare function harnessModelSelector(binding: RegistryModelBinding): string | undefined;
194
194
  /**
195
195
  * Continue's model selection is a **role binding**, not a flag: `cn` has no
196
196
  * `--model` option (only `--config <slug>`), and its `config.yaml` binds each
@@ -20,7 +20,7 @@
20
20
  * }
21
21
  * ```
22
22
  *
23
- * `name` is {@link backendProviderName}, so the id in the file is the one the
23
+ * `name` is {@link harnessProviderName}, so the id in the file is the one the
24
24
  * env half already puts in `GOOSE_PROVIDER`. `api_key_env` is a variable
25
25
  * *name*: Goose resolves it from the child environment (its config layer reads
26
26
  * the process environment first), so no secret is ever written.
@@ -24,7 +24,7 @@
24
24
  * }
25
25
  * ```
26
26
  *
27
- * The block is keyed by {@link backendProviderName}, so the name in the file
27
+ * The block is keyed by {@link harnessProviderName}, so the name in the file
28
28
  * is the name the env half already puts on `-m`. `npm` is the Vercel AI SDK
29
29
  * package for the entry's wire `surface`; OpenCode instantiates the provider
30
30
  * from it, which is why an entry on a surface with no package is left out
@@ -2,9 +2,9 @@
2
2
  * Session-private config homes for the **file-shaped CLI drivers** — OpenCode,
3
3
  * Goose and Continue (§2.3, file rows).
4
4
  *
5
- * An environment variable can say *which* endpoint a backend should use, but
6
- * it cannot describe one the backend has never heard of: a self-hosted
7
- * gateway, a LiteLLM proxy, an Ollama box. Each of these three backends learns
5
+ * An environment variable can say *which* endpoint a harness should use, but
6
+ * it cannot describe one the harness has never heard of: a self-hosted
7
+ * gateway, a LiteLLM proxy, an Ollama box. Each of these three harnesses learns
8
8
  * such an endpoint only from its own config file, and each resolves that file
9
9
  * out of a config home it takes from the environment:
10
10
  *
@@ -17,7 +17,7 @@
17
17
  * Pointing those variables at a directory this process owns is what keeps the
18
18
  * developer's real `~/.config/opencode`, goose config dir and `~/.continue`
19
19
  * out of the session: unread, and — the part that matters — unwritten. The
20
- * backends all persist state next to their config (sessions, logs, an index),
20
+ * harnesses all persist state next to their config (sessions, logs, an index),
21
21
  * so a session that rendered into the ambient home would leave its debris in
22
22
  * it.
23
23
  *
@@ -46,7 +46,7 @@ export declare function driverSessionConfigHome(driverId: string, config: Sessio
46
46
  /**
47
47
  * Write `contents` to `path`, creating its directory.
48
48
  *
49
- * Atomic by rename: a backend reading a half-written config fails the whole
49
+ * Atomic by rename: a harness reading a half-written config fails the whole
50
50
  * session, and these files are re-rendered before every turn.
51
51
  */
52
52
  export declare function writeSessionConfigFile(dir: string, filename: string, contents: string): string;
@@ -5,17 +5,17 @@ import type { ModelEntry } from "./models.js";
5
5
  import type { RegistryCredentialOptions } from "./provider-materialize/credential-env.js";
6
6
  import type { AgentConfig, AgentDriver, DriverInfo } from "./types.js";
7
7
  /**
8
- * Static capability metadata for every built-in backend.
8
+ * Static capability metadata for every built-in harness.
9
9
  *
10
- * Pure data — this object imports no driver module and references no backend
10
+ * Pure data — this object imports no driver module and references no harness
11
11
  * SDK. {@link listDrivers} returns it (merged with any third-party drivers)
12
- * so selection UIs can enumerate every backend without loading a single
12
+ * so selection UIs can enumerate every harness without loading a single
13
13
  * driver module. The matching driver module's `DriverTarget` is registered
14
14
  * into the plugin registry by {@link registerBuiltinDrivers}.
15
15
  *
16
16
  * `surfaces` and `providerPlurality` are the driver-capability declaration
17
17
  * the AI provider registry resolves against (plan §2.3): which wire protocols
18
- * a backend can be pointed at, and how many registry entries it can use at
18
+ * a harness can be pointed at, and how many registry entries it can use at
19
19
  * once. The platform's resolver filters candidate entries on `surfaces`
20
20
  * instead of matching vendor names.
21
21
  *
@@ -34,8 +34,8 @@ export declare const DRIVER_CATALOG: Record<string, DriverInfo>;
34
34
  *
35
35
  * This is the single id → module map in bridge core. Every specifier is a
36
36
  * literal string so `bun --compile` can statically bundle the driver module
37
- * (and, transitively, its SDK). The in-process-SDK backends (`claude-sdk`,
38
- * `codex`) are wrapped in build-constant guards so an excluded backend's
37
+ * (and, transitively, its SDK). The in-process-SDK harnesses (`claude-sdk`,
38
+ * `codex`) are wrapped in build-constant guards so an excluded harness's
39
39
  * `await import` folds to dead code in the compiled binary. `omp` and `echo`
40
40
  * carry no SDK weight and are always available.
41
41
  *
@@ -51,7 +51,7 @@ export declare const DRIVER_CATALOG: Record<string, DriverInfo>;
51
51
  */
52
52
  export declare function registerBuiltinDrivers(registry?: PluginRegistry): Promise<void>;
53
53
  /**
54
- * Creates a new driver instance for the given backend id.
54
+ * Creates a new driver instance for the given harness id.
55
55
  *
56
56
  * Ensures the built-in driver targets are registered (idempotent), then looks
57
57
  * up the target in the plugin registry and calls its `create()`. The returned
@@ -62,7 +62,7 @@ export declare function registerBuiltinDrivers(registry?: PluginRegistry): Promi
62
62
  * @param config - Configuration forwarded to the driver constructor.
63
63
  * @param ctx - Optional driver context (logger / abort signal). Defaults to `{}`.
64
64
  * @returns A freshly constructed (not yet started) {@link AgentDriver}.
65
- * @throws {Error} When `id` is a known backend excluded from this build, or
65
+ * @throws {Error} When `id` is a known harness excluded from this build, or
66
66
  * when `id` does not match any registered driver at all.
67
67
  * @docLink packages/bridge/api-reference#registry
68
68
  */
@@ -70,8 +70,8 @@ export declare function createDriver(id: string, config: AgentConfig, ctx?: Driv
70
70
  /**
71
71
  * Returns the capability metadata for every available driver.
72
72
  *
73
- * Enumerates every built-in backend from {@link BUILTIN_DRIVER_CATALOG} without
74
- * loading a single driver module or backend SDK, then merges in any third-party
73
+ * Enumerates every built-in harness from {@link BUILTIN_DRIVER_CATALOG} without
74
+ * loading a single driver module or harness SDK, then merges in any third-party
75
75
  * driver targets registered into the plugin registry that are not already in
76
76
  * the catalog. Use this to populate driver selection UIs.
77
77
  *