@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.
- package/CHANGELOG.md +16 -0
- package/README.md +3 -3
- package/dist/{asset-feeds-CZGV7GCG.js → asset-feeds-NL3526ZV.js} +11 -11
- package/dist/{asset-feeds-CZGV7GCG.js.map → asset-feeds-NL3526ZV.js.map} +1 -1
- package/dist/asset-manager/catalog-deployer.js +5 -5
- package/dist/asset-manager/index.js +11 -11
- package/dist/asset-manager/installer.js +8 -8
- package/dist/asset-manager/renderers.js +2 -2
- package/dist/asset-manager/src/index.d.ts +30 -24
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/renderers.d.ts +2 -2
- package/dist/bridge/drivers/claude-sdk.js +9 -9
- package/dist/bridge/drivers/codex.js +8 -8
- package/dist/bridge/drivers/continue.js +10 -10
- package/dist/bridge/drivers/continue.js.map +1 -1
- package/dist/bridge/drivers/echo.js +2 -2
- package/dist/bridge/drivers/gemini.js +6 -6
- package/dist/bridge/drivers/goose.js +10 -10
- package/dist/bridge/drivers/goose.js.map +1 -1
- package/dist/bridge/drivers/omp.js +3 -3
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/drivers/opencode.js +11 -11
- package/dist/bridge/drivers/opencode.js.map +1 -1
- package/dist/bridge/drivers/qwen.js +6 -6
- package/dist/bridge/index.js +10 -10
- package/dist/bridge/src/capability-dispatch.d.ts +1 -1
- package/dist/bridge/src/drivers/_subprocess-cli.d.ts +3 -3
- package/dist/bridge/src/drivers/continue.d.ts +1 -1
- package/dist/bridge/src/drivers/gemini.d.ts +3 -3
- package/dist/bridge/src/drivers/goose.d.ts +1 -1
- package/dist/bridge/src/drivers/opencode.d.ts +1 -1
- package/dist/bridge/src/provider-materialize/continue-config-yaml.d.ts +2 -2
- package/dist/bridge/src/provider-materialize/credential-env.d.ts +4 -4
- package/dist/bridge/src/provider-materialize/env-drivers.d.ts +18 -18
- package/dist/bridge/src/provider-materialize/goose-custom-providers.d.ts +1 -1
- package/dist/bridge/src/provider-materialize/opencode-config.d.ts +1 -1
- package/dist/bridge/src/provider-materialize/session-config-home.d.ts +5 -5
- package/dist/bridge/src/registry.d.ts +10 -10
- package/dist/bridge/src/types.d.ts +9 -9
- package/dist/{chunk-AAPFZCQX.js → chunk-24X2GGSC.js} +6 -6
- package/dist/{chunk-AAPFZCQX.js.map → chunk-24X2GGSC.js.map} +1 -1
- package/dist/{chunk-WPISSDEI.js → chunk-3ELIPWCH.js} +6 -6
- package/dist/{chunk-WPISSDEI.js.map → chunk-3ELIPWCH.js.map} +1 -1
- package/dist/{chunk-HL6SZ7Z3.js → chunk-5YXKEM7Q.js} +7 -7
- package/dist/{chunk-HL6SZ7Z3.js.map → chunk-5YXKEM7Q.js.map} +1 -1
- package/dist/{chunk-HXC5VF3L.js → chunk-66A35U4V.js} +36 -35
- package/dist/chunk-66A35U4V.js.map +1 -0
- package/dist/{chunk-ENUCD5MW.js → chunk-75LXFKQR.js} +4 -4
- package/dist/{chunk-ENUCD5MW.js.map → chunk-75LXFKQR.js.map} +1 -1
- package/dist/{chunk-GMXG2JGN.js → chunk-7ERHZQ7O.js} +3 -3
- package/dist/{chunk-GMXG2JGN.js.map → chunk-7ERHZQ7O.js.map} +1 -1
- package/dist/{chunk-JULFGNQN.js → chunk-7HJ6SFFF.js} +3 -3
- package/dist/{chunk-JULFGNQN.js.map → chunk-7HJ6SFFF.js.map} +1 -1
- package/dist/{chunk-DKCFWSVW.js → chunk-7LBPHRRP.js} +3 -3
- package/dist/chunk-7LBPHRRP.js.map +1 -0
- package/dist/{chunk-A7WRTOFI.js → chunk-AKO6XHGV.js} +5 -5
- package/dist/{chunk-A7WRTOFI.js.map → chunk-AKO6XHGV.js.map} +1 -1
- package/dist/{chunk-3C6Q6TCZ.js → chunk-AO7TCPOS.js} +62 -18
- package/dist/chunk-AO7TCPOS.js.map +1 -0
- package/dist/{chunk-54A5QAIV.js → chunk-C3256F2F.js} +2 -2
- package/dist/{chunk-54A5QAIV.js.map → chunk-C3256F2F.js.map} +1 -1
- package/dist/{chunk-2JANXYTJ.js → chunk-DHLE66FV.js} +3 -3
- package/dist/{chunk-2JANXYTJ.js.map → chunk-DHLE66FV.js.map} +1 -1
- package/dist/{chunk-BR2IXOWX.js → chunk-DOF77WEV.js} +6 -6
- package/dist/{chunk-BR2IXOWX.js.map → chunk-DOF77WEV.js.map} +1 -1
- package/dist/{chunk-MENCWIHW.js → chunk-EB4ZTESQ.js} +4 -4
- package/dist/chunk-EB4ZTESQ.js.map +1 -0
- package/dist/{chunk-XUVQSDNV.js → chunk-GKTFGCQZ.js} +3 -3
- package/dist/chunk-GKTFGCQZ.js.map +1 -0
- package/dist/{chunk-GTVQUHBN.js → chunk-GORUF3YZ.js} +10 -10
- package/dist/{chunk-GTVQUHBN.js.map → chunk-GORUF3YZ.js.map} +1 -1
- package/dist/{chunk-ACDHNOT7.js → chunk-IFUQ6XBQ.js} +87 -10
- package/dist/chunk-IFUQ6XBQ.js.map +1 -0
- package/dist/{chunk-6J4WBP3C.js → chunk-IGNY4C6K.js} +21 -21
- package/dist/{chunk-6J4WBP3C.js.map → chunk-IGNY4C6K.js.map} +1 -1
- package/dist/{chunk-I6NZG7WX.js → chunk-J4ANCOQ4.js} +6 -6
- package/dist/chunk-J4ANCOQ4.js.map +1 -0
- package/dist/{chunk-5RHPNNWP.js → chunk-JRIU5GA7.js} +3 -3
- package/dist/{chunk-5RHPNNWP.js.map → chunk-JRIU5GA7.js.map} +1 -1
- package/dist/{chunk-F3HNW354.js → chunk-KIFJWSNC.js} +3 -3
- package/dist/{chunk-F3HNW354.js.map → chunk-KIFJWSNC.js.map} +1 -1
- package/dist/{chunk-DF7C3KZK.js → chunk-LRCSWOZO.js} +14 -14
- package/dist/chunk-LRCSWOZO.js.map +1 -0
- package/dist/{chunk-TAZMDZFP.js → chunk-MTWZ7KHZ.js} +3 -3
- package/dist/{chunk-TAZMDZFP.js.map → chunk-MTWZ7KHZ.js.map} +1 -1
- package/dist/{chunk-QDRQKQOU.js → chunk-N2UGG6WV.js} +3 -3
- package/dist/{chunk-QDRQKQOU.js.map → chunk-N2UGG6WV.js.map} +1 -1
- package/dist/{chunk-4T25XCWX.js → chunk-NVQLE4MK.js} +3 -3
- package/dist/{chunk-4T25XCWX.js.map → chunk-NVQLE4MK.js.map} +1 -1
- package/dist/{chunk-C4JDLXPI.js → chunk-QJOOD3OV.js} +3 -3
- package/dist/{chunk-C4JDLXPI.js.map → chunk-QJOOD3OV.js.map} +1 -1
- package/dist/{chunk-NPS765HV.js → chunk-RHESVS7V.js} +9 -9
- package/dist/{chunk-NPS765HV.js.map → chunk-RHESVS7V.js.map} +1 -1
- package/dist/{chunk-6GSZLKA5.js → chunk-T762W5CI.js} +3 -3
- package/dist/chunk-T762W5CI.js.map +1 -0
- package/dist/{chunk-3ZE7X5Y6.js → chunk-TB3LJ6NA.js} +3 -3
- package/dist/{chunk-3ZE7X5Y6.js.map → chunk-TB3LJ6NA.js.map} +1 -1
- package/dist/{chunk-N7B3LZ7V.js → chunk-TGE33MKN.js} +2 -2
- package/dist/{chunk-N7B3LZ7V.js.map → chunk-TGE33MKN.js.map} +1 -1
- package/dist/{chunk-DRAI3JH5.js → chunk-TGJIX77V.js} +11 -11
- package/dist/chunk-TGJIX77V.js.map +1 -0
- package/dist/{chunk-UWJAJP6T.js → chunk-TTITGVXV.js} +2 -2
- package/dist/{chunk-UWJAJP6T.js.map → chunk-TTITGVXV.js.map} +1 -1
- package/dist/{chunk-N3AH66VX.js → chunk-TUTVTGMG.js} +4 -4
- package/dist/{chunk-N3AH66VX.js.map → chunk-TUTVTGMG.js.map} +1 -1
- package/dist/{chunk-HGPSZXZP.js → chunk-VOXFI3XS.js} +3 -3
- package/dist/{chunk-HGPSZXZP.js.map → chunk-VOXFI3XS.js.map} +1 -1
- package/dist/{chunk-SK36WO2Z.js → chunk-XTOTP7MJ.js} +2 -2
- package/dist/{chunk-SK36WO2Z.js.map → chunk-XTOTP7MJ.js.map} +1 -1
- package/dist/cli/index.js +119 -119
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/catalog.d.ts +1 -1
- package/dist/cli/src/commands/integration.d.ts +2 -2
- package/dist/cli/src/commands/plugin/claude-code.d.ts +2 -2
- package/dist/cli/src/commands/plugin/codex.d.ts +2 -2
- package/dist/cli/src/commands/plugin/omp.d.ts +2 -2
- package/dist/cli/src/commands/plugin/types.d.ts +13 -13
- package/dist/cli/src/commands/plugin/types.d.ts.map +1 -1
- package/dist/cli/src/commands/run.d.ts +1 -1
- package/dist/connectors/config.js +3 -3
- package/dist/connectors/index.js +13 -13
- package/dist/connectors/src/connect-failure-carry-over.d.ts +38 -0
- package/dist/connectors/src/connect-failure-carry-over.d.ts.map +1 -0
- package/dist/connectors/src/connector-manager.d.ts +15 -0
- package/dist/connectors/src/connector-manager.d.ts.map +1 -1
- package/dist/connectors/src/index.d.ts +1 -0
- package/dist/connectors/src/index.d.ts.map +1 -1
- package/dist/core/driver-targets.js +1 -1
- package/dist/core/index.js +5 -5
- package/dist/core/runtime-assets.js +3 -3
- package/dist/core/src/driver-targets.d.ts +8 -8
- package/dist/core/src/index.d.ts +8 -2
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/settings.d.ts +1 -1
- package/dist/core/src/workspace-config.d.ts +16 -15
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/store.js +2 -2
- package/dist/core/workspace-config.js +2 -2
- package/dist/deploy/index.js +5 -5
- package/dist/discovery/index.js +2 -2
- package/dist/{ensure-sources-JGKHWDC4.js → ensure-sources-DVPPPCBS.js} +14 -14
- package/dist/{ensure-sources-JGKHWDC4.js.map → ensure-sources-DVPPPCBS.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +13 -13
- package/dist/factory-assets/connectors/deploy.js +13 -13
- package/dist/factory-assets/connectors/devserver.js +13 -13
- package/dist/factory-assets/connectors/flow/CONNECTOR.md +2 -2
- package/dist/factory-assets/connectors/flow/adapter.js +13 -13
- package/dist/factory-assets/connectors/flow/engine.js +6 -6
- package/dist/factory-assets/connectors/flow/run-flow.d.ts +1 -1
- package/dist/factory-assets/connectors/flow/run-flow.js +14 -14
- package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts +3 -3
- package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow.js +13 -13
- package/dist/factory-assets/connectors/git.js +13 -13
- package/dist/factory-assets/connectors/gmail.js +13 -13
- package/dist/factory-assets/connectors/googledrive.js +13 -13
- package/dist/factory-assets/connectors/local.js +13 -13
- package/dist/factory-assets/connectors/mattermost.js +13 -13
- package/dist/factory-assets/connectors/memory.js +13 -13
- package/dist/factory-assets/connectors/minio.js +13 -13
- package/dist/factory-assets/connectors/postgres.js +13 -13
- package/dist/factory-assets/connectors/s3.js +13 -13
- package/dist/factory-assets/connectors/sharepoint.js +13 -13
- package/dist/factory-assets/connectors/sqlite.js +13 -13
- package/dist/factory-assets/connectors/static-server.js +13 -13
- package/dist/factory-assets/connectors/tunnel.js +13 -13
- package/dist/factory-assets/connectors/webdav.js +13 -13
- package/dist/factory-assets/connectors/xstate-store.js +13 -13
- package/dist/factory-assets/connectors/xstate.js +13 -13
- package/dist/{flows-QTUSWYKY.js → flows-X7JFAVRR.js} +8 -8
- package/dist/{flows-QTUSWYKY.js.map → flows-X7JFAVRR.js.map} +1 -1
- package/dist/{helpers-6X4HJKWS.js → helpers-KLO5VUVZ.js} +14 -14
- package/dist/{helpers-6X4HJKWS.js.map → helpers-KLO5VUVZ.js.map} +1 -1
- package/dist/library/index.js +8 -8
- package/dist/{library-publish-MGN3N73A.js → library-publish-X6JGR7K3.js} +18 -18
- package/dist/{library-publish-MGN3N73A.js.map → library-publish-X6JGR7K3.js.map} +1 -1
- package/dist/{open-library-4PFE2CJ7.js → open-library-S2ZFKJUK.js} +16 -16
- package/dist/{open-library-4PFE2CJ7.js.map → open-library-S2ZFKJUK.js.map} +1 -1
- package/dist/{paths-IOOMNHTC.js → paths-OI5IIS22.js} +8 -8
- package/dist/{paths-IOOMNHTC.js.map → paths-OI5IIS22.js.map} +1 -1
- package/dist/plugin-registry/src/targets.d.ts +5 -5
- package/dist/plugin-registry/src/targets.d.ts.map +1 -1
- package/dist/{plugin-store-OIIPB2MQ.js → plugin-store-C67RLSPD.js} +7 -7
- package/dist/{plugin-store-OIIPB2MQ.js.map → plugin-store-C67RLSPD.js.map} +1 -1
- package/dist/{project-MD4HQ62C.js → project-7VOTYB7O.js} +15 -15
- package/dist/{project-MD4HQ62C.js.map → project-7VOTYB7O.js.map} +1 -1
- package/dist/resolver/index.js +5 -5
- package/dist/runner/index.js +18 -18
- package/dist/runner/src/manifest.d.ts +1 -1
- package/dist/runner/src/resources.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts +47 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +2 -2
- package/dist/runner/src/session-stimulus.d.ts +5 -0
- package/dist/runner/src/session-stimulus.d.ts.map +1 -1
- package/dist/runner/src/session.d.ts +1 -1
- package/dist/runner/src/session.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +11 -11
- package/dist/sdk/bridge.js +10 -10
- package/dist/sdk/core.js +5 -5
- package/dist/sdk/flow.js +6 -6
- package/dist/sdk/index.js +18 -18
- package/dist/sdk/resolver.js +5 -5
- package/dist/sdk/runner.js +18 -18
- package/dist/{setup-PB35G5SG.js → setup-RO3PGJYS.js} +19 -19
- package/dist/{setup-PB35G5SG.js.map → setup-RO3PGJYS.js.map} +1 -1
- package/dist/{skills-DH75K326.js → skills-4YTVHMOH.js} +7 -7
- package/dist/{skills-DH75K326.js.map → skills-4YTVHMOH.js.map} +1 -1
- package/dist/{source-Y5OF6IZU.js → source-ZZLLOP2U.js} +17 -17
- package/dist/{source-Y5OF6IZU.js.map → source-ZZLLOP2U.js.map} +1 -1
- package/dist/{source-manifest-publish-YWFVYTEI.js → source-manifest-publish-7WRQDIXO.js} +19 -19
- package/dist/{source-manifest-publish-YWFVYTEI.js.map → source-manifest-publish-7WRQDIXO.js.map} +1 -1
- package/dist/tui/index.js +18 -18
- package/dist/types/manifests.js +1 -1
- package/dist/types/src/manifests/agent.d.ts +4 -4
- package/dist/types/src/runtime.d.ts +4 -4
- package/dist/workspace-plugin/adapters/mcp.js +7 -7
- package/dist/workspace-plugin/adapters/omp.js +7 -7
- package/dist/workspace-plugin/index.js +1 -1
- package/dist/workspace-plugin/src/plugin.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-3C6Q6TCZ.js.map +0 -1
- package/dist/chunk-6GSZLKA5.js.map +0 -1
- package/dist/chunk-ACDHNOT7.js.map +0 -1
- package/dist/chunk-DF7C3KZK.js.map +0 -1
- package/dist/chunk-DKCFWSVW.js.map +0 -1
- package/dist/chunk-DRAI3JH5.js.map +0 -1
- package/dist/chunk-HXC5VF3L.js.map +0 -1
- package/dist/chunk-I6NZG7WX.js.map +0 -1
- package/dist/chunk-MENCWIHW.js.map +0 -1
- package/dist/chunk-XUVQSDNV.js.map +0 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { driverSessionConfigHome, removeSessionConfigFile, writeSessionConfigFile } from '../../chunk-
|
|
2
|
-
import { SubprocessCliDriver, extractText } from '../../chunk-
|
|
3
|
-
import { resolveEnvDriverSession, resolveRegistryBinding,
|
|
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-
|
|
6
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, registryDriverConfig, providerCredentialEnvName } from '../../chunk-MTWZ7KHZ.js';
|
|
7
7
|
import '../../chunk-6E6PKKAD.js';
|
|
8
|
-
import '../../chunk-
|
|
8
|
+
import '../../chunk-3ELIPWCH.js';
|
|
9
9
|
import '../../chunk-4GY63JU6.js';
|
|
10
|
-
import '../../chunk-
|
|
11
|
-
import '../../chunk-
|
|
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-
|
|
15
|
-
import '../../chunk-
|
|
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 ?
|
|
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 ?
|
|
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-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import { resolveRegistryBinding } from '../../chunk-
|
|
4
|
-
import { fetchProviderModels } from '../../chunk-
|
|
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-
|
|
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-
|
|
14
|
+
import '../../chunk-TGE33MKN.js';
|
|
15
15
|
import '../../chunk-NSBPE2FW.js';
|
|
16
16
|
import * as z from 'zod';
|
|
17
17
|
|
package/dist/bridge/index.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, labelToolCall, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-
|
|
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-
|
|
6
|
-
export { ModelTierResolutionError, PROVIDER_MODEL_TIERS, STATIC_MODELS, fetchProviderModels, getModels, getStaticModels, modelIdTargetForEntry, resolveManifestModel, resolveModelCapabilities, resolveModelTier } from '../chunk-
|
|
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-
|
|
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-
|
|
12
|
+
import '../chunk-3ELIPWCH.js';
|
|
13
13
|
import '../chunk-4GY63JU6.js';
|
|
14
|
-
import '../chunk-
|
|
15
|
-
import '../chunk-
|
|
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-
|
|
19
|
-
import '../chunk-
|
|
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-
|
|
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
|
|
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
|
|
4
|
+
* Shared base for one-shot **subprocess CLI** agent harnesses (Gemini, Qwen,
|
|
5
5
|
* OpenCode, Goose, Continue).
|
|
6
6
|
*
|
|
7
|
-
* These
|
|
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
|
|
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`
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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`
|
|
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`
|
|
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 `
|
|
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
|
-
/** `<
|
|
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
|
-
*
|
|
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
|
|
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
|
|
79
|
+
* Also set the harness-conventional carrier
|
|
80
80
|
* ({@link conventionalCredentialEnvName}). Default `true`. Set `false` for a
|
|
81
|
-
*
|
|
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
|
|
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
|
|
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 *
|
|
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
|
|
76
|
+
* {@link harnessProviderName}.
|
|
77
77
|
*/
|
|
78
|
-
|
|
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`
|
|
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
|
|
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`
|
|
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
|
|
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
|
|
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`
|
|
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
|
|
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`
|
|
169
|
-
* registry: every enabled entry's mapped ids, namespaced the way the
|
|
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
|
|
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`
|
|
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
|
-
*
|
|
191
|
+
* harness then uses its own default rather than being handed a bare provider.
|
|
192
192
|
*/
|
|
193
|
-
export declare function
|
|
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
|
|
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
|
|
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
|
|
6
|
-
* it cannot describe one the
|
|
7
|
-
* gateway, a LiteLLM proxy, an Ollama box. Each of these three
|
|
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
|
-
*
|
|
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
|
|
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
|
|
8
|
+
* Static capability metadata for every built-in harness.
|
|
9
9
|
*
|
|
10
|
-
* Pure data — this object imports no driver module and references no
|
|
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
|
|
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
|
|
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
|
|
38
|
-
* `codex`) are wrapped in build-constant guards so an excluded
|
|
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
|
|
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
|
|
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
|
|
74
|
-
* loading a single driver module or
|
|
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
|
*
|