@osovv/vv-opencode 1.4.5 → 1.5.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 (69) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +8 -8
  3. package/dist/commands/patch-provider.d.ts +5 -5
  4. package/dist/commands/patch-provider.js +10 -6
  5. package/dist/commands/patch-provider.js.map +1 -1
  6. package/dist/lib/opencode/agent-registrations.d.ts +33 -0
  7. package/dist/lib/opencode/agent-registrations.js +469 -0
  8. package/dist/lib/opencode/agent-registrations.js.map +1 -0
  9. package/dist/lib/opencode/inspection.d.ts +84 -0
  10. package/dist/lib/opencode/inspection.js +367 -0
  11. package/dist/lib/opencode/inspection.js.map +1 -0
  12. package/dist/lib/opencode/model-overrides.d.ts +19 -0
  13. package/dist/lib/opencode/model-overrides.js +221 -0
  14. package/dist/lib/opencode/model-overrides.js.map +1 -0
  15. package/dist/lib/opencode/paths.d.ts +21 -0
  16. package/dist/lib/opencode/paths.js +62 -0
  17. package/dist/lib/opencode/paths.js.map +1 -0
  18. package/dist/lib/opencode/plugin-registration.d.ts +17 -0
  19. package/dist/lib/opencode/plugin-registration.js +210 -0
  20. package/dist/lib/opencode/plugin-registration.js.map +1 -0
  21. package/dist/lib/opencode/shared-utils.d.ts +30 -0
  22. package/dist/lib/opencode/shared-utils.js +183 -0
  23. package/dist/lib/opencode/shared-utils.js.map +1 -0
  24. package/dist/lib/opencode/vvoc-config-io.d.ts +9 -0
  25. package/dist/lib/opencode/vvoc-config-io.js +58 -0
  26. package/dist/lib/opencode/vvoc-config-io.js.map +1 -0
  27. package/dist/lib/opencode.d.ts +15 -174
  28. package/dist/lib/opencode.js +19 -1387
  29. package/dist/lib/opencode.js.map +1 -1
  30. package/dist/lib/spec-lint/cross-file-rules.d.ts +2 -0
  31. package/dist/lib/spec-lint/cross-file-rules.js +33 -0
  32. package/dist/lib/spec-lint/cross-file-rules.js.map +1 -0
  33. package/dist/lib/spec-lint/delegated-extraction.d.ts +8 -0
  34. package/dist/lib/spec-lint/delegated-extraction.js +112 -0
  35. package/dist/lib/spec-lint/delegated-extraction.js.map +1 -0
  36. package/dist/lib/spec-lint/lint.d.ts +7 -0
  37. package/dist/lib/spec-lint/lint.js +92 -0
  38. package/dist/lib/spec-lint/lint.js.map +1 -0
  39. package/dist/lib/spec-lint/parser.d.ts +101 -0
  40. package/dist/lib/spec-lint/parser.js +482 -0
  41. package/dist/lib/spec-lint/parser.js.map +1 -0
  42. package/dist/lib/spec-lint/plan-rules.d.ts +38 -0
  43. package/dist/lib/spec-lint/plan-rules.js +745 -0
  44. package/dist/lib/spec-lint/plan-rules.js.map +1 -0
  45. package/dist/lib/spec-lint/spec-rules.d.ts +8 -0
  46. package/dist/lib/spec-lint/spec-rules.js +188 -0
  47. package/dist/lib/spec-lint/spec-rules.js.map +1 -0
  48. package/dist/lib/spec-lint.d.ts +4 -63
  49. package/dist/lib/spec-lint.js +13 -1505
  50. package/dist/lib/spec-lint.js.map +1 -1
  51. package/dist/lib/vvoc-preset-registry.d.ts +7 -7
  52. package/dist/lib/vvoc-preset-registry.js +8 -8
  53. package/dist/lib/vvoc-preset-registry.js.map +1 -1
  54. package/dist/plugins/workflow/authorization.d.ts +30 -0
  55. package/dist/plugins/workflow/authorization.js +139 -0
  56. package/dist/plugins/workflow/authorization.js.map +1 -0
  57. package/dist/plugins/workflow/index.js +26 -329
  58. package/dist/plugins/workflow/index.js.map +1 -1
  59. package/dist/plugins/workflow/recovery.d.ts +17 -0
  60. package/dist/plugins/workflow/recovery.js +150 -0
  61. package/dist/plugins/workflow/recovery.js.map +1 -0
  62. package/dist/plugins/workflow/schemas.d.ts +208 -0
  63. package/dist/plugins/workflow/schemas.js +138 -0
  64. package/dist/plugins/workflow/schemas.js.map +1 -0
  65. package/dist/plugins/workflow/tooling.d.ts +10 -65
  66. package/dist/plugins/workflow/tooling.js +5 -5
  67. package/dist/plugins/workflow/tooling.js.map +1 -1
  68. package/package.json +1 -1
  69. package/schemas/vvoc/v3.json +1 -1
@@ -0,0 +1,367 @@
1
+ // FILE: src/lib/opencode/inspection.ts
2
+ // VERSION: 1.0.0
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: OpenCode host compatibility diagnostics and source-aware installation inspection.
5
+ // SCOPE: opencode --version execution and semantic-version TUI compatibility comparison, installation-state inspection across runtime/TUI/vvoc config files with role-reference resolution and orchestration profile, strict/effective layered-scope inspection with config-source attribution, and write-result formatting for CLI output.
6
+ // DEPENDS: [node:path, src/lib/config-layers.ts, src/lib/model-roles.ts, src/lib/orchestration.ts, src/lib/vvoc-config.ts, src/lib/vvoc-paths.ts, src/lib/package.ts, src/lib/opencode/shared-utils.ts, src/lib/opencode/paths.ts, src/lib/opencode/plugin-registration.ts]
7
+ // LINKS: [M-CLI-CONFIG, M-ORCHESTRATION-PROFILES]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // OpenCodeRuntimeInspection - Installed OpenCode version and TUI compatibility snapshot.
14
+ // InstallationInspection - Current OpenCode runtime/TUI and vvoc installation status snapshot.
15
+ // inspectOpenCodeRuntime - Reads the installed OpenCode version and evaluates TUI compatibility.
16
+ // isTuiOpenCodeVersionCompatible - Compares an OpenCode version with the managed TUI minimum.
17
+ // extractOpenCodeVersion - Extracts the first semantic version found in `opencode --version` output.
18
+ // inspectInstallation - Reads current OpenCode/vvoc installation state for status and doctor commands.
19
+ // inspectInstallationForScope - Reads installation state using strict/effective layered source resolution.
20
+ // describeWriteResult - Formats config write outcomes for CLI output.
21
+ // END_MODULE_MAP
22
+ //
23
+ // START_CHANGE_SUMMARY
24
+ // LAST_CHANGE: [C-OPENCODE-MODULE-SPLIT - Extracted runtime inspection, installation inspection, role-reference diagnostics, and write-result formatting from the former src/lib/opencode.ts monolith into this zone module.]
25
+ // END_CHANGE_SUMMARY
26
+ import { dirname } from "node:path";
27
+ import { resolveOpenCodeConfigSource, resolveOpenCodeTuiConfigSource, resolveVvocConfigSource, } from "../config-layers.js";
28
+ import { BUILTIN_ROLE_NAMES, ROLE_REFERENCE_PREFIX } from "../model-roles.js";
29
+ import { resolveOrchestrationPolicy } from "../orchestration.js";
30
+ import { createDefaultVvocConfig, parseVersionedVvocConfigText, } from "../vvoc-config.js";
31
+ import { PACKAGE_NAME } from "../package.js";
32
+ import { getVvocAgentsDir, getVvocSkillsDir } from "../vvoc-paths.js";
33
+ import { parseObjectDocument, readOptionalText } from "./shared-utils.js";
34
+ import { resolvePaths } from "./paths.js";
35
+ import { isPackagePluginSpecifier, isTuiPackageSpecifier, MINIMUM_TUI_OPENCODE_VERSION, readPluginList, readTuiPluginList, readTuiPluginName, TUI_PACKAGE_SPECIFIER, } from "./plugin-registration.js";
36
+ // START_BLOCK_INSPECT_OPENCODE_RUNTIME
37
+ export async function inspectOpenCodeRuntime(run = runOpenCodeVersionCommand) {
38
+ try {
39
+ const result = await run();
40
+ if (result.exitCode !== 0) {
41
+ const detail = result.stderr.trim() || result.stdout.trim() || `exit code ${result.exitCode}`;
42
+ return {
43
+ minimumTuiVersion: MINIMUM_TUI_OPENCODE_VERSION,
44
+ error: `opencode --version failed: ${detail}`,
45
+ };
46
+ }
47
+ const version = extractOpenCodeVersion(`${result.stdout}\n${result.stderr}`);
48
+ if (!version) {
49
+ return {
50
+ minimumTuiVersion: MINIMUM_TUI_OPENCODE_VERSION,
51
+ error: "opencode --version did not return a semantic version",
52
+ };
53
+ }
54
+ return {
55
+ version,
56
+ minimumTuiVersion: MINIMUM_TUI_OPENCODE_VERSION,
57
+ tuiCompatible: isTuiOpenCodeVersionCompatible(version),
58
+ };
59
+ }
60
+ catch (error) {
61
+ return {
62
+ minimumTuiVersion: MINIMUM_TUI_OPENCODE_VERSION,
63
+ error: error instanceof Error ? error.message : String(error),
64
+ };
65
+ }
66
+ }
67
+ export function isTuiOpenCodeVersionCompatible(version) {
68
+ const current = parseSemanticVersion(version);
69
+ const minimum = parseSemanticVersion(MINIMUM_TUI_OPENCODE_VERSION);
70
+ if (!current || !minimum)
71
+ return false;
72
+ for (let index = 0; index < 3; index += 1) {
73
+ const currentPart = current.parts[index] ?? 0;
74
+ const minimumPart = minimum.parts[index] ?? 0;
75
+ if (currentPart > minimumPart)
76
+ return true;
77
+ if (currentPart < minimumPart)
78
+ return false;
79
+ }
80
+ return !current.prerelease || Boolean(minimum.prerelease);
81
+ }
82
+ async function runOpenCodeVersionCommand() {
83
+ const subprocess = Bun.spawn({
84
+ cmd: ["opencode", "--version"],
85
+ stdout: "pipe",
86
+ stderr: "pipe",
87
+ });
88
+ const [stdout, stderr, exitCode] = await Promise.all([
89
+ new Response(subprocess.stdout).text(),
90
+ new Response(subprocess.stderr).text(),
91
+ subprocess.exited,
92
+ ]);
93
+ return { exitCode, stdout, stderr };
94
+ }
95
+ /** Extracts the first semantic version found in `opencode --version` output. */
96
+ export function extractOpenCodeVersion(output) {
97
+ const match = output.match(/(?:^|\s)v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)(?=\s|$)/);
98
+ return match?.[1];
99
+ }
100
+ function parseSemanticVersion(value) {
101
+ const match = value
102
+ .trim()
103
+ .match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);
104
+ if (!match)
105
+ return undefined;
106
+ return {
107
+ parts: [Number(match[1]), Number(match[2]), Number(match[3])],
108
+ prerelease: match[4],
109
+ };
110
+ }
111
+ // END_BLOCK_INSPECT_OPENCODE_RUNTIME
112
+ // START_BLOCK_INSPECT_INSTALLATION_STATE
113
+ export async function inspectInstallation(paths, options = {}) {
114
+ const warnings = [];
115
+ const problems = [];
116
+ const runtime = options.runtime ?? {
117
+ minimumTuiVersion: MINIMUM_TUI_OPENCODE_VERSION,
118
+ };
119
+ if (runtime.error) {
120
+ problems.push(`OpenCode version unavailable: ${runtime.error}`);
121
+ }
122
+ else if (runtime.tuiCompatible === false) {
123
+ problems.push(`OpenCode ${runtime.version ?? "unknown"} is incompatible with /context; ${runtime.minimumTuiVersion} or newer is required`);
124
+ }
125
+ if (paths.opencodeAlternatePaths.length > 0) {
126
+ warnings.push(`multiple OpenCode config files exist: ${[paths.opencodeConfigPath, ...paths.opencodeAlternatePaths].join(", ")}`);
127
+ }
128
+ if (paths.opencodeTuiAlternatePaths.length > 0) {
129
+ warnings.push(`multiple OpenCode TUI config files exist: ${[paths.opencodeTuiConfigPath, ...paths.opencodeTuiAlternatePaths].join(", ")}`);
130
+ }
131
+ const opencodeText = await readOptionalText(paths.opencodeConfigPath);
132
+ let opencodeParseError;
133
+ let plugins = [];
134
+ let pluginConfigured = false;
135
+ if (opencodeText) {
136
+ try {
137
+ const document = parseObjectDocument(opencodeText, paths.opencodeConfigPath);
138
+ plugins = readPluginList(document, paths.opencodeConfigPath);
139
+ pluginConfigured = plugins.some(isPackagePluginSpecifier);
140
+ }
141
+ catch (error) {
142
+ opencodeParseError = error instanceof Error ? error.message : String(error);
143
+ problems.push(opencodeParseError);
144
+ }
145
+ }
146
+ const tuiText = await readOptionalText(paths.opencodeTuiConfigPath);
147
+ let tuiParseError;
148
+ let tuiPlugins = [];
149
+ let tuiPluginConfigured = false;
150
+ if (tuiText) {
151
+ try {
152
+ const document = parseObjectDocument(tuiText, paths.opencodeTuiConfigPath);
153
+ tuiPlugins = readTuiPluginList(document, paths.opencodeTuiConfigPath);
154
+ tuiPluginConfigured = tuiPlugins.some((entry) => isTuiPackageSpecifier(readTuiPluginName(entry)));
155
+ }
156
+ catch (error) {
157
+ tuiParseError = error instanceof Error ? error.message : String(error);
158
+ problems.push(tuiParseError);
159
+ }
160
+ }
161
+ const vvocText = await readOptionalText(paths.vvocConfigPath);
162
+ let vvocParseError;
163
+ let vvocConfig;
164
+ let vvocSourceSchema;
165
+ let vvocSourceVersion;
166
+ let roleAssignments = [];
167
+ if (vvocText) {
168
+ try {
169
+ const parsedConfig = parseVersionedVvocConfigText(vvocText, paths.vvocConfigPath);
170
+ vvocConfig = parsedConfig.config;
171
+ vvocSourceSchema = parsedConfig.sourceSchema;
172
+ vvocSourceVersion = parsedConfig.sourceVersion;
173
+ roleAssignments = listRoleAssignments(vvocConfig.roles);
174
+ }
175
+ catch (error) {
176
+ vvocParseError = error instanceof Error ? error.message : String(error);
177
+ problems.push(vvocParseError);
178
+ }
179
+ }
180
+ const unresolvedRoleReferences = opencodeText && !opencodeParseError
181
+ ? collectUnresolvedRoleReferences(opencodeText, paths.opencodeConfigPath, vvocConfig?.roles ?? {})
182
+ : [];
183
+ for (const unresolved of unresolvedRoleReferences) {
184
+ problems.push(`unresolved role reference at ${unresolved.fieldPath}: ${unresolved.roleRef} (missing role: ${unresolved.roleId})`);
185
+ }
186
+ if (!pluginConfigured) {
187
+ problems.push(`${PACKAGE_NAME} is not configured in ${paths.opencodeConfigPath}`);
188
+ }
189
+ if (!tuiPluginConfigured) {
190
+ problems.push(`${TUI_PACKAGE_SPECIFIER} is not configured in ${paths.opencodeTuiConfigPath}`);
191
+ }
192
+ if (!vvocText) {
193
+ problems.push(`vvoc config is missing at ${paths.vvocConfigPath}`);
194
+ }
195
+ return {
196
+ scope: paths.scope,
197
+ runtime,
198
+ opencode: {
199
+ path: paths.opencodeConfigPath,
200
+ exists: Boolean(opencodeText),
201
+ alternates: paths.opencodeAlternatePaths,
202
+ parseError: opencodeParseError,
203
+ pluginConfigured,
204
+ plugins,
205
+ },
206
+ tui: {
207
+ path: paths.opencodeTuiConfigPath,
208
+ exists: Boolean(tuiText),
209
+ alternates: paths.opencodeTuiAlternatePaths,
210
+ parseError: tuiParseError,
211
+ pluginConfigured: tuiPluginConfigured,
212
+ plugins: tuiPlugins,
213
+ },
214
+ vvoc: {
215
+ path: paths.vvocConfigPath,
216
+ exists: Boolean(vvocText),
217
+ parseError: vvocParseError,
218
+ schema: vvocSourceSchema,
219
+ version: vvocSourceVersion,
220
+ },
221
+ guardian: {
222
+ config: vvocConfig?.guardian,
223
+ },
224
+ secretsRedaction: {
225
+ config: vvocConfig?.secretsRedaction,
226
+ },
227
+ orchestration: {
228
+ profile: vvocConfig ? resolveOrchestrationPolicy(vvocConfig).profile : undefined,
229
+ },
230
+ roles: {
231
+ assignments: roleAssignments,
232
+ unresolvedReferences: unresolvedRoleReferences,
233
+ },
234
+ warnings,
235
+ problems,
236
+ };
237
+ }
238
+ export async function inspectInstallationForScope(options) {
239
+ const [opencodeSource, opencodeTuiSource, vvocSource, runtime] = await Promise.all([
240
+ resolveOpenCodeConfigSource({
241
+ scope: options.scope,
242
+ cwd: options.cwd,
243
+ configDir: options.configDir,
244
+ }),
245
+ resolveOpenCodeTuiConfigSource({
246
+ scope: options.scope,
247
+ cwd: options.cwd,
248
+ configDir: options.configDir,
249
+ }),
250
+ resolveVvocConfigSource({
251
+ scope: options.scope,
252
+ cwd: options.cwd,
253
+ configDir: options.configDir,
254
+ allowDefault: options.scope === "effective",
255
+ }),
256
+ (options.inspectRuntime ?? inspectOpenCodeRuntime)(),
257
+ ]);
258
+ if (options.scope === "project") {
259
+ const missingSource = [opencodeSource, vvocSource].find((source) => source.kind === "missing");
260
+ if (missingSource) {
261
+ throw new Error(missingSource.reason ?? "project config missing; run vvoc install --scope project");
262
+ }
263
+ }
264
+ const fallbackPaths = await resolvePaths({
265
+ scope: options.scope === "global" ? "global" : "project",
266
+ cwd: options.cwd,
267
+ configDir: options.configDir,
268
+ });
269
+ const opencodeConfigPath = opencodeSource.path ?? fallbackPaths.opencodeConfigPath;
270
+ const opencodeTuiConfigPath = opencodeTuiSource.path ?? fallbackPaths.opencodeTuiConfigPath;
271
+ const vvocConfigPath = vvocSource.path ?? fallbackPaths.vvocConfigPath;
272
+ const scopedPaths = {
273
+ ...fallbackPaths,
274
+ opencodeBaseDir: dirname(opencodeConfigPath),
275
+ vvocBaseDir: dirname(vvocConfigPath),
276
+ opencodeConfigPath,
277
+ opencodeTuiConfigPath,
278
+ vvocConfigPath,
279
+ opencodeAlternatePaths: [],
280
+ opencodeTuiAlternatePaths: [],
281
+ managedAgentsDirPath: getVvocAgentsDir(dirname(vvocConfigPath)),
282
+ managedSkillsDirPath: getVvocSkillsDir(dirname(vvocConfigPath)),
283
+ };
284
+ const inspection = await inspectInstallation(scopedPaths, { runtime });
285
+ return {
286
+ ...inspection,
287
+ orchestration: {
288
+ profile: inspection.orchestration.profile ??
289
+ (vvocSource.kind === "default"
290
+ ? resolveOrchestrationPolicy(createDefaultVvocConfig()).profile
291
+ : undefined),
292
+ },
293
+ scope: options.scope,
294
+ opencodeSource,
295
+ opencodeTuiSource,
296
+ vvocSource,
297
+ };
298
+ }
299
+ // END_BLOCK_INSPECT_INSTALLATION_STATE
300
+ export function describeWriteResult(result) {
301
+ let message = "";
302
+ switch (result.action) {
303
+ case "created":
304
+ message = `Created ${result.path}`;
305
+ break;
306
+ case "updated":
307
+ message = `Updated ${result.path}`;
308
+ break;
309
+ case "kept":
310
+ message = `Kept ${result.path}`;
311
+ break;
312
+ case "skipped":
313
+ message = `Skipped ${result.path}`;
314
+ break;
315
+ }
316
+ return result.reason ? `${message} (${result.reason})` : message;
317
+ }
318
+ // START_BLOCK_ROLE_REFERENCE_DIAGNOSTICS
319
+ function listRoleAssignments(roles) {
320
+ const listed = [];
321
+ for (const roleId of BUILTIN_ROLE_NAMES) {
322
+ if (typeof roles[roleId] === "string") {
323
+ listed.push({ roleId, model: roles[roleId], builtIn: true });
324
+ }
325
+ }
326
+ const customRoleIds = Object.keys(roles)
327
+ .filter((roleId) => !BUILTIN_ROLE_NAMES.includes(roleId))
328
+ .sort((left, right) => left.localeCompare(right));
329
+ for (const roleId of customRoleIds) {
330
+ listed.push({ roleId, model: roles[roleId], builtIn: false });
331
+ }
332
+ return listed;
333
+ }
334
+ function collectUnresolvedRoleReferences(opencodeText, label, roleMap) {
335
+ const document = parseObjectDocument(opencodeText, label);
336
+ const unresolved = [];
337
+ const collectFromField = (fieldPath, value) => {
338
+ if (typeof value !== "string") {
339
+ return;
340
+ }
341
+ const trimmed = value.trim();
342
+ if (!trimmed.startsWith(ROLE_REFERENCE_PREFIX)) {
343
+ return;
344
+ }
345
+ const roleId = trimmed.slice(ROLE_REFERENCE_PREFIX.length).trim();
346
+ if (!roleId || !Object.hasOwn(roleMap, roleId)) {
347
+ unresolved.push({ fieldPath, roleRef: trimmed, roleId: roleId || "<missing>" });
348
+ }
349
+ };
350
+ collectFromField("model", document.model);
351
+ collectFromField("small_model", document.small_model);
352
+ for (const parentName of ["agent", "command"]) {
353
+ const parent = document[parentName];
354
+ if (!parent || typeof parent !== "object" || Array.isArray(parent)) {
355
+ continue;
356
+ }
357
+ for (const [entryName, entry] of Object.entries(parent)) {
358
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
359
+ continue;
360
+ }
361
+ collectFromField(`${parentName}.${entryName}.model`, entry.model);
362
+ }
363
+ }
364
+ return unresolved;
365
+ }
366
+ // END_BLOCK_ROLE_REFERENCE_DIAGNOSTICS
367
+ //# sourceMappingURL=inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspection.js","sourceRoot":"","sources":["../../../src/lib/opencode/inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ResolvedPaths } from "./paths.js";
2
+ import { type JsonObject, type WriteResult } from "./shared-utils.js";
3
+ export type OpenCodeDefaultModelKey = "model" | "small_model";
4
+ export declare function readOpenCodeAgentModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, agentName: string): Promise<string | undefined>;
5
+ export declare function readOpenCodeAgentOverride(paths: Pick<ResolvedPaths, "opencodeConfigPath">, agentName: string): Promise<{
6
+ model?: string;
7
+ }>;
8
+ export declare function readOpenCodeDefaultModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, key: OpenCodeDefaultModelKey): Promise<string | undefined>;
9
+ export declare function writeOpenCodeAgentModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, agentName: string, options: {
10
+ model?: string;
11
+ ensureEntry: boolean;
12
+ }): Promise<WriteResult>;
13
+ export declare function writeOpenCodeDefaultModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, key: OpenCodeDefaultModelKey, options: {
14
+ model?: string;
15
+ ensureEntry: boolean;
16
+ }): Promise<WriteResult>;
17
+ export declare function writeOpenCodeProviderObject(paths: Pick<ResolvedPaths, "opencodeConfigPath">, providerID: string, value: JsonObject): Promise<WriteResult>;
18
+ export declare function ensureProviderBaseUrlConfigText(text: string | undefined, providerID: string, baseURL: string): string;
19
+ export declare function writeProviderBaseUrl(paths: Pick<ResolvedPaths, "opencodeConfigPath">, providerID: string, baseURL: string): Promise<WriteResult>;
@@ -0,0 +1,221 @@
1
+ // FILE: src/lib/opencode/model-overrides.ts
2
+ // VERSION: 1.0.0
3
+ // START_MODULE_CONTRACT
4
+ // PURPOSE: Generic OpenCode agent, default-model, and provider option overrides for any agent or provider id.
5
+ // SCOPE: Read/write model overrides for arbitrary OpenCode agents, top-level model/small_model overrides with entry ensuring, provider.<id> object merges and options.baseURL writes. Managed vvoc agent model IO stays in agent-registrations.ts.
6
+ // DEPENDS: [jsonc-parser, src/lib/opencode/shared-utils.ts, src/lib/opencode/paths.ts, src/lib/opencode/agent-registrations.ts]
7
+ // LINKS: [M-CLI-CONFIG, M-CLI-AGENT-MODELS]
8
+ // ROLE: RUNTIME
9
+ // MAP_MODE: EXPORTS
10
+ // END_MODULE_CONTRACT
11
+ //
12
+ // START_MODULE_MAP
13
+ // OpenCodeDefaultModelKey - Supported top-level OpenCode default model fields.
14
+ // readOpenCodeAgentModel - Reads a model override for any OpenCode agent from config.
15
+ // readOpenCodeAgentOverride - Reads a model override for any OpenCode agent from config.
16
+ // writeOpenCodeAgentModel - Writes or removes a model override for any OpenCode agent in config.
17
+ // readOpenCodeDefaultModel - Reads a top-level OpenCode model or small_model override.
18
+ // writeOpenCodeDefaultModel - Writes or removes a top-level OpenCode model or small_model override.
19
+ // writeOpenCodeProviderObject - Writes or merges a provider.<id> object override.
20
+ // ensureProviderBaseUrlConfigText - Ensures OpenCode config contains the requested provider options.baseURL override.
21
+ // writeProviderBaseUrl - Writes a provider options.baseURL override into OpenCode config.
22
+ // END_MODULE_MAP
23
+ //
24
+ // START_CHANGE_SUMMARY
25
+ // LAST_CHANGE: [C-OPENCODE-MODULE-SPLIT - Extracted generic agent/default-model/provider override IO from the former src/lib/opencode.ts monolith into this zone module.]
26
+ // END_CHANGE_SUMMARY
27
+ import { applyEdits, format, modify } from "jsonc-parser";
28
+ import { ensureAgentConfigText, readAgentMap } from "./agent-registrations.js";
29
+ import { ensureOpenCodeConfigText, ensureTrailingNewline, mergeJsonObjects, OPENCODE_SCHEMA_URL, parseObjectDocument, readAgentOverride, readNonEmptyString, readOptionalObject, readOptionalText, renderJson, updateAgentEntryText, writeText, } from "./shared-utils.js";
30
+ const JSON_FORMAT = {
31
+ insertSpaces: true,
32
+ tabSize: 2,
33
+ eol: "\n",
34
+ };
35
+ export async function readOpenCodeAgentModel(paths, agentName) {
36
+ return (await readOpenCodeAgentOverride(paths, agentName)).model;
37
+ }
38
+ export async function readOpenCodeAgentOverride(paths, agentName) {
39
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
40
+ if (!currentText) {
41
+ return {};
42
+ }
43
+ const document = parseObjectDocument(currentText, paths.opencodeConfigPath);
44
+ const agentMap = readAgentMap(document, paths.opencodeConfigPath);
45
+ return readAgentOverride(agentMap[agentName], `${paths.opencodeConfigPath}: agent.${agentName}`);
46
+ }
47
+ export async function readOpenCodeDefaultModel(paths, key) {
48
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
49
+ if (!currentText) {
50
+ return undefined;
51
+ }
52
+ const document = parseObjectDocument(currentText, paths.opencodeConfigPath);
53
+ const value = document[key];
54
+ if (value === undefined) {
55
+ return undefined;
56
+ }
57
+ return readNonEmptyString(value, `${paths.opencodeConfigPath}: ${key}`);
58
+ }
59
+ export async function writeOpenCodeAgentModel(paths, agentName, options) {
60
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
61
+ if (!currentText && !options.ensureEntry) {
62
+ return { action: "kept", path: paths.opencodeConfigPath };
63
+ }
64
+ const baseText = options.ensureEntry ? ensureAgentConfigText(currentText) : currentText;
65
+ if (!baseText) {
66
+ return { action: "kept", path: paths.opencodeConfigPath };
67
+ }
68
+ const document = parseObjectDocument(baseText, paths.opencodeConfigPath);
69
+ const agentMap = readAgentMap(document, paths.opencodeConfigPath);
70
+ const currentEntry = agentMap[agentName];
71
+ if (!currentEntry && !options.ensureEntry) {
72
+ return { action: "kept", path: paths.opencodeConfigPath };
73
+ }
74
+ const nextEntry = currentEntry ? { ...currentEntry } : {};
75
+ if (options.model) {
76
+ nextEntry.model = options.model;
77
+ }
78
+ else {
79
+ delete nextEntry.model;
80
+ }
81
+ const nextText = updateAgentEntryText(baseText, agentName, nextEntry);
82
+ if ((currentText ?? "") === nextText) {
83
+ return { action: "kept", path: paths.opencodeConfigPath };
84
+ }
85
+ await writeText(paths.opencodeConfigPath, nextText);
86
+ return {
87
+ action: currentText ? "updated" : "created",
88
+ path: paths.opencodeConfigPath,
89
+ };
90
+ }
91
+ export async function writeOpenCodeDefaultModel(paths, key, options) {
92
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
93
+ if (!currentText && !options.ensureEntry) {
94
+ return { action: "kept", path: paths.opencodeConfigPath };
95
+ }
96
+ const baseText = options.ensureEntry ? ensureOpenCodeConfigText(currentText) : currentText;
97
+ if (!baseText) {
98
+ return { action: "kept", path: paths.opencodeConfigPath };
99
+ }
100
+ const nextText = updateTopLevelStringFieldText(baseText, key, options.model);
101
+ if ((currentText ?? "") === nextText) {
102
+ return { action: "kept", path: paths.opencodeConfigPath };
103
+ }
104
+ await writeText(paths.opencodeConfigPath, nextText);
105
+ return {
106
+ action: currentText ? "updated" : "created",
107
+ path: paths.opencodeConfigPath,
108
+ };
109
+ }
110
+ export async function writeOpenCodeProviderObject(paths, providerID, value) {
111
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
112
+ const nextText = ensureProviderObjectConfigText(currentText, providerID, value);
113
+ if ((currentText ?? "") === nextText) {
114
+ return { action: "kept", path: paths.opencodeConfigPath };
115
+ }
116
+ await writeText(paths.opencodeConfigPath, nextText);
117
+ return {
118
+ action: currentText ? "updated" : "created",
119
+ path: paths.opencodeConfigPath,
120
+ };
121
+ }
122
+ // START_BLOCK_ENSURE_PROVIDER_BASE_URL_CONFIG
123
+ export function ensureProviderBaseUrlConfigText(text, providerID, baseURL) {
124
+ if (!text?.trim()) {
125
+ return renderJson({
126
+ $schema: OPENCODE_SCHEMA_URL,
127
+ provider: {
128
+ [providerID]: {
129
+ options: {
130
+ baseURL,
131
+ },
132
+ },
133
+ },
134
+ });
135
+ }
136
+ const document = parseObjectDocument(text, "OpenCode config");
137
+ const currentProviders = readProviderMap(document, "OpenCode config");
138
+ const currentProvider = currentProviders[providerID];
139
+ const currentOptions = currentProvider
140
+ ? readOptionalObject(currentProvider, "options", `OpenCode config: provider.${providerID}`)
141
+ : undefined;
142
+ let nextText = text;
143
+ if (!Object.hasOwn(document, "$schema")) {
144
+ nextText = applyEdits(nextText, modify(nextText, ["$schema"], OPENCODE_SCHEMA_URL, {
145
+ formattingOptions: JSON_FORMAT,
146
+ getInsertionIndex: () => 0,
147
+ }));
148
+ }
149
+ if (currentOptions?.baseURL !== baseURL) {
150
+ nextText = applyEdits(nextText, modify(nextText, ["provider", providerID, "options", "baseURL"], baseURL, {
151
+ formattingOptions: JSON_FORMAT,
152
+ }));
153
+ }
154
+ return ensureTrailingNewline(applyEdits(nextText, format(nextText, undefined, JSON_FORMAT)));
155
+ }
156
+ export async function writeProviderBaseUrl(paths, providerID, baseURL) {
157
+ const currentText = await readOptionalText(paths.opencodeConfigPath);
158
+ const nextText = ensureProviderBaseUrlConfigText(currentText, providerID, baseURL);
159
+ if ((currentText ?? "") === nextText) {
160
+ return { action: "kept", path: paths.opencodeConfigPath };
161
+ }
162
+ await writeText(paths.opencodeConfigPath, nextText);
163
+ return {
164
+ action: currentText ? "updated" : "created",
165
+ path: paths.opencodeConfigPath,
166
+ };
167
+ }
168
+ // END_BLOCK_ENSURE_PROVIDER_BASE_URL_CONFIG
169
+ // START_BLOCK_PROVIDER_AND_FIELD_EDITS
170
+ function readProviderMap(document, label) {
171
+ const raw = document.provider;
172
+ if (raw === undefined) {
173
+ return {};
174
+ }
175
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
176
+ throw new Error(`${label}: expected "provider" to be an object`);
177
+ }
178
+ const entries = {};
179
+ for (const [name, value] of Object.entries(raw)) {
180
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
181
+ throw new Error(`${label}: expected "provider.${name}" to be an object`);
182
+ }
183
+ entries[name] = value;
184
+ }
185
+ return entries;
186
+ }
187
+ function ensureProviderObjectConfigText(text, providerID, value) {
188
+ if (!text?.trim()) {
189
+ return renderJson({
190
+ $schema: OPENCODE_SCHEMA_URL,
191
+ provider: {
192
+ [providerID]: value,
193
+ },
194
+ });
195
+ }
196
+ const document = parseObjectDocument(text, "OpenCode config");
197
+ const currentProviders = readProviderMap(document, "OpenCode config");
198
+ const currentValue = currentProviders[providerID];
199
+ const nextValue = currentValue ? mergeJsonObjects(currentValue, value) : value;
200
+ let nextText = text;
201
+ if (!Object.hasOwn(document, "$schema")) {
202
+ nextText = applyEdits(nextText, modify(nextText, ["$schema"], OPENCODE_SCHEMA_URL, {
203
+ formattingOptions: JSON_FORMAT,
204
+ getInsertionIndex: () => 0,
205
+ }));
206
+ }
207
+ if (JSON.stringify(currentValue) !== JSON.stringify(nextValue)) {
208
+ nextText = applyEdits(nextText, modify(nextText, ["provider", providerID], nextValue, {
209
+ formattingOptions: JSON_FORMAT,
210
+ }));
211
+ }
212
+ return ensureTrailingNewline(applyEdits(nextText, format(nextText, undefined, JSON_FORMAT)));
213
+ }
214
+ function updateTopLevelStringFieldText(text, key, value) {
215
+ const nextText = applyEdits(text, modify(text, [key], value, {
216
+ formattingOptions: JSON_FORMAT,
217
+ }));
218
+ return ensureTrailingNewline(applyEdits(nextText, format(nextText, undefined, JSON_FORMAT)));
219
+ }
220
+ // END_BLOCK_PROVIDER_AND_FIELD_EDITS
221
+ //# sourceMappingURL=model-overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-overrides.js","sourceRoot":"","sources":["../../../src/lib/opencode/model-overrides.ts"],"names":[],"mappings":"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"}