@cotal-ai/connector-opencode 0.10.0 → 0.11.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.
@@ -1 +1 @@
1
- {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,SAAS,EAAoC,MAAM,gBAAgB,CAAC;AAa3G;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,EAAE,SA4G/B,CAAC"}
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,SAAS,EAAuE,MAAM,gBAAgB,CAAC;AAuF9I;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAqI/B,CAAC"}
package/dist/extension.js CHANGED
@@ -1,7 +1,8 @@
1
+ import { execFileSync } from "node:child_process";
1
2
  import { fileURLToPath } from "node:url";
2
3
  import { resolve } from "node:path";
3
4
  import { loadAgentFile, registry } from "@cotal-ai/core";
4
- import { aclEnv, launchEnv, controlEndpoint, MODEL_PROVIDER_KEYS, transcriptChannel } from "@cotal-ai/connector-core";
5
+ import { aclEnv, connectorLaunchOptions, launchEnv, controlEndpoint, MODEL_PROVIDER_KEYS, transcriptChannel, userAuthEnv } from "@cotal-ai/connector-core";
5
6
  /** The bundled in-process plugin (esbuild → `dist/plugin.bundle.js`). `opencode serve` loads it by
6
7
  * absolute path from the inline config, so it runs *inside* the server and shares its SDK client.
7
8
  * Resolved relative to this module — beside the built `dist/extension.js`, so the connector must be
@@ -10,6 +11,79 @@ const PLUGIN_ENTRY = fileURLToPath(new URL("./plugin.bundle.js", import.meta.url
10
11
  /** The launcher shim (`dist/serve.js`): starts `opencode serve` with the plugin, then attaches a
11
12
  * foreground `opencode` TUI to the exact session the plugin drives (see serve.ts). */
12
13
  const SERVE_SHIM = fileURLToPath(new URL("./serve.js", import.meta.url));
14
+ function discoveryEnv() {
15
+ const env = { ...process.env };
16
+ delete env.OPENCODE_CONFIG_CONTENT;
17
+ for (const k of Object.keys(env))
18
+ if (k.startsWith("COTAL_"))
19
+ delete env[k];
20
+ return env;
21
+ }
22
+ function execErrorMessage(e) {
23
+ const err = e;
24
+ const stderr = Buffer.isBuffer(err.stderr) ? err.stderr.toString("utf8") : err.stderr;
25
+ return (stderr?.trim() || err.message).replace(/\s+/g, " ");
26
+ }
27
+ function readJsonBlock(lines, start) {
28
+ const parts = [];
29
+ for (let i = start; i < lines.length; i++) {
30
+ parts.push(lines[i]);
31
+ try {
32
+ return { value: JSON.parse(parts.join("\n")), end: i };
33
+ }
34
+ catch {
35
+ // Keep accumulating the pretty-printed JSON object.
36
+ }
37
+ }
38
+ throw new Error("opencode models output ended before a model metadata JSON block closed");
39
+ }
40
+ function parseModels(stdout) {
41
+ const lines = stdout.split(/\r?\n/);
42
+ const models = [];
43
+ for (let i = 0; i < lines.length; i++) {
44
+ const id = lines[i].trim();
45
+ if (!/^[^\s/]+\/\S+$/.test(id))
46
+ continue;
47
+ let raw;
48
+ if (lines[i + 1]?.trim().startsWith("{")) {
49
+ const block = readJsonBlock(lines, i + 1);
50
+ i = block.end;
51
+ if (block.value && typeof block.value === "object" && !Array.isArray(block.value))
52
+ raw = block.value;
53
+ }
54
+ const variantsRaw = raw?.variants;
55
+ const variants = variantsRaw && typeof variantsRaw === "object" && !Array.isArray(variantsRaw)
56
+ ? Object.entries(variantsRaw)
57
+ .filter(([, v]) => !(v && typeof v === "object" && !Array.isArray(v) && v.disabled === true))
58
+ .map(([name, v]) => ({ name, ...(v && typeof v === "object" && !Array.isArray(v) ? { options: v } : {}) }))
59
+ : undefined;
60
+ const provider = typeof raw?.providerID === "string" ? raw.providerID : id.split("/", 1)[0];
61
+ models.push({
62
+ id,
63
+ provider,
64
+ ...(typeof raw?.name === "string" ? { name: raw.name } : {}),
65
+ ...(variants?.length ? { variants } : {}),
66
+ });
67
+ }
68
+ return models;
69
+ }
70
+ function listOpenCodeModels(opts = {}) {
71
+ const args = ["models", "--pure", "--verbose"];
72
+ if (opts.refresh)
73
+ args.push("--refresh");
74
+ try {
75
+ const stdout = execFileSync("opencode", args, {
76
+ encoding: "utf8",
77
+ env: discoveryEnv(),
78
+ stdio: ["ignore", "pipe", "pipe"],
79
+ maxBuffer: 16 * 1024 * 1024,
80
+ });
81
+ return { source: "opencode models --pure --verbose", models: parseModels(stdout) };
82
+ }
83
+ catch (e) {
84
+ throw new Error(`opencode models failed: ${execErrorMessage(e)}`);
85
+ }
86
+ }
13
87
  /**
14
88
  * The OpenCode connector: launches a watchable `opencode` TUI bound to the agent's session, using
15
89
  * OpenCode's client/server split (see serve.ts). The Cotal mesh bridge runs as an in-process plugin
@@ -29,6 +103,8 @@ export const opencodeConnector = {
29
103
  name: "opencode",
30
104
  transcriptChannel, // the shared `tr-<name>` convention (connector-core), exposed via the contract
31
105
  requires: ["opencode"],
106
+ supportsModelVariant: true,
107
+ listModels: listOpenCodeModels,
32
108
  buildLaunch(opts) {
33
109
  // Resuming an existing session isn't wired for opencode: the connector runs `opencode serve` +
34
110
  // a plugin that CREATES its own session then attaches a TUI, so a fork must plumb into
@@ -54,6 +130,7 @@ export const opencodeConnector = {
54
130
  const env = {
55
131
  ...launchEnv({ providerKeys: MODEL_PROVIDER_KEYS }),
56
132
  ...aclEnv(opts),
133
+ ...userAuthEnv(opts),
57
134
  COTAL_SPACE: opts.space,
58
135
  COTAL_NAME: opts.name,
59
136
  };
@@ -90,23 +167,45 @@ export const opencodeConnector = {
90
167
  },
91
168
  },
92
169
  };
93
- // An agent file carries identity (read in-session via COTAL_AGENT_FILE) plus persona + model.
94
- // The model is a config default (the session — and the attached TUI — use it); the persona is
170
+ // An agent file carries identity (read in-session via COTAL_AGENT_FILE) plus persona + model/variant.
171
+ // The model/variant are config defaults (the session — and the attached TUI — use them); the persona is
95
172
  // applied in-session by the plugin (opencode has no `--append-system-prompt`).
96
173
  let model = opts.model;
174
+ let variant = opts.variant;
97
175
  if (opts.configPath) {
98
176
  const path = resolve(opts.configPath);
99
177
  env.COTAL_AGENT_FILE = path; // plugin reads persona from it
100
178
  const def = loadAgentFile(path);
101
179
  model ??= def.model;
180
+ variant ??= def.variant;
102
181
  }
103
- // The `--model` flag wins over the agent file, and applies even with no agent file. Pin it to a
104
- // dedicated primary agent made the default, so an operator's own `default_agent` in
105
- // ~/.config/opencode (with its own model) can't override the model a Cotal spawn asks for — the
106
- // session the plugin drives runs the persona's model, not the operator's default agent's.
182
+ // The `--model` / `--variant` flags win over the agent file, and apply even with no agent file.
183
+ // Pin them to a dedicated primary agent made the default, so an operator's own `default_agent` in
184
+ // ~/.config/opencode (with its own model) can't override what a Cotal spawn asks for — the session
185
+ // the plugin drives runs the persona's selectors, not the operator's default agent's.
186
+ const cotalAgent = { mode: "primary" };
107
187
  if (model) {
108
188
  config.model = model;
109
- config.agent = { cotal: { mode: "primary", model } };
189
+ env.COTAL_MODEL = model;
190
+ cotalAgent.model = model;
191
+ }
192
+ if (variant) {
193
+ env.COTAL_VARIANT = variant;
194
+ cotalAgent.variant = variant;
195
+ }
196
+ // Opaque connector options → config for the cotal agent (the session the plugin drives), RAW
197
+ // passthrough: each option is merged into the agent config as-is and validated by opencode's own
198
+ // config schema. No deny-list — the spawn capability is the trust boundary (see
199
+ // connectorLaunchOptions), not the config keys. `mode`/`model`/`variant` are still set by the
200
+ // connector; an option of the same name simply overrides that default (last write wins), same as
201
+ // any other config field.
202
+ let hasLaunchOptions = false;
203
+ for (const [k, v] of connectorLaunchOptions("opencode", opts.launchOptions)) {
204
+ cotalAgent[k] = v;
205
+ hasLaunchOptions = true;
206
+ }
207
+ if (model || variant || hasLaunchOptions) {
208
+ config.agent = { cotal: cotalAgent };
110
209
  config.default_agent = "cotal";
111
210
  }
112
211
  env.OPENCODE_CONFIG_CONTENT = JSON.stringify(config);
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}