@osovv/vv-opencode 0.16.0 → 0.17.1
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/README.md +106 -9
- package/dist/cli.js +5 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent.js +37 -72
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/completion.js +32 -16
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/preset.d.ts +50 -0
- package/dist/commands/preset.js +209 -0
- package/dist/commands/preset.js.map +1 -0
- package/dist/lib/agent-models.d.ts +21 -0
- package/dist/lib/agent-models.js +106 -0
- package/dist/lib/agent-models.js.map +1 -0
- package/dist/lib/opencode.d.ts +6 -0
- package/dist/lib/opencode.js +73 -23
- package/dist/lib/opencode.js.map +1 -1
- package/dist/lib/vvoc-config.d.ts +169 -124
- package/dist/lib/vvoc-config.js +303 -101
- package/dist/lib/vvoc-config.js.map +1 -1
- package/package.json +1 -1
- package/schemas/vvoc/v2.json +124 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,iBAAiB;AACjB,wBAAwB;AACxB,0EAA0E;AAC1E,
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type SupportedModelTargetName } from "../lib/agent-models.js";
|
|
2
|
+
import { type Scope, type WriteResult } from "../lib/opencode.js";
|
|
3
|
+
import { type VvocPreset, type VvocPresets } from "../lib/vvoc-config.js";
|
|
4
|
+
type ListedPreset = {
|
|
5
|
+
name: string;
|
|
6
|
+
preset: VvocPreset;
|
|
7
|
+
};
|
|
8
|
+
type AppliedPresetChange = {
|
|
9
|
+
targetName: SupportedModelTargetName;
|
|
10
|
+
model: string;
|
|
11
|
+
result: WriteResult;
|
|
12
|
+
};
|
|
13
|
+
declare const _default: import("citty").CommandDef<{
|
|
14
|
+
readonly command: {
|
|
15
|
+
type: "positional";
|
|
16
|
+
required: boolean;
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
readonly preset: {
|
|
20
|
+
type: "positional";
|
|
21
|
+
required: boolean;
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
readonly scope: {
|
|
25
|
+
type: "enum";
|
|
26
|
+
options: string[];
|
|
27
|
+
default: string;
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
readonly "config-dir": {
|
|
31
|
+
type: "string";
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
export default _default;
|
|
36
|
+
export declare function listConfiguredPresets(presets: VvocPresets): ListedPreset[];
|
|
37
|
+
export declare function resolvePreset(name: string, presets: VvocPresets): {
|
|
38
|
+
name: string;
|
|
39
|
+
preset: VvocPreset;
|
|
40
|
+
};
|
|
41
|
+
export declare function formatPreset(_name: string, preset: VvocPreset): string;
|
|
42
|
+
export declare function applyPreset(presetName: string, options?: {
|
|
43
|
+
cwd?: string;
|
|
44
|
+
configDir?: string;
|
|
45
|
+
scope?: Scope;
|
|
46
|
+
}): Promise<{
|
|
47
|
+
name: string;
|
|
48
|
+
preset: VvocPreset;
|
|
49
|
+
changes: AppliedPresetChange[];
|
|
50
|
+
}>;
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// FILE: src/commands/preset.ts
|
|
2
|
+
// VERSION: 0.2.1
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: List, show, and apply declarative named model-target presets from canonical vvoc.json.
|
|
5
|
+
// SCOPE: Canonical preset lookup, preset rendering, scope-aware preset application, and per-target summary output through existing vvoc and OpenCode write paths.
|
|
6
|
+
// DEPENDS: [citty, src/lib/agent-models.ts, src/lib/managed-agents.ts, src/lib/opencode.ts, src/lib/vvoc-config.ts]
|
|
7
|
+
// LINKS: [M-CLI-PRESET, M-CLI-CONFIG, M-CLI-COMMANDS]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// default - Preset command group for vvoc.
|
|
14
|
+
// listConfiguredPresets - Returns configured presets in deterministic name order.
|
|
15
|
+
// resolvePreset - Validates a preset name and returns the matching preset.
|
|
16
|
+
// formatPreset - Renders a preset object as JSON for CLI output.
|
|
17
|
+
// applyPreset - Applies a preset through the existing vvoc/OpenCode write helpers.
|
|
18
|
+
// END_MODULE_MAP
|
|
19
|
+
//
|
|
20
|
+
// START_CHANGE_SUMMARY
|
|
21
|
+
// LAST_CHANGE: [v0.2.1 - Fixed `vvoc preset <name>` dispatch so bare preset names are applied instead of being parsed as unknown subcommands.]
|
|
22
|
+
// END_CHANGE_SUMMARY
|
|
23
|
+
import { defineCommand } from "citty";
|
|
24
|
+
import { formatAgentModel, isConfigurableOpenCodeSubagentName, isOpenCodeDefaultModelTargetName, isSpecialAgentName, normalizeModelTargetOverride, parseGuardianStyleModelArg, } from "../lib/agent-models.js";
|
|
25
|
+
import { isManagedOpenCodeAgentName } from "../lib/managed-agents.js";
|
|
26
|
+
import { describeWriteResult, installManagedAgentPrompts, readVvocConfig, resolvePaths, writeGuardianConfig, writeOpenCodeDefaultModel, writeManagedAgentModel, writeMemoryConfig, writeOpenCodeAgentModel, } from "../lib/opencode.js";
|
|
27
|
+
const commandArg = {
|
|
28
|
+
type: "positional",
|
|
29
|
+
required: false,
|
|
30
|
+
description: "Preset name or one of: list, show.",
|
|
31
|
+
};
|
|
32
|
+
const presetArg = {
|
|
33
|
+
type: "positional",
|
|
34
|
+
required: false,
|
|
35
|
+
description: "Preset name for `show`.",
|
|
36
|
+
};
|
|
37
|
+
const scopeArg = {
|
|
38
|
+
type: "enum",
|
|
39
|
+
options: ["global", "project"],
|
|
40
|
+
default: "global",
|
|
41
|
+
description: "Write global or project OpenCode config.",
|
|
42
|
+
};
|
|
43
|
+
const configDirArg = {
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "Override the global config home.",
|
|
46
|
+
};
|
|
47
|
+
export default defineCommand({
|
|
48
|
+
meta: {
|
|
49
|
+
name: "preset",
|
|
50
|
+
description: "List, show, or apply named agent presets from vvoc.json.",
|
|
51
|
+
},
|
|
52
|
+
args: {
|
|
53
|
+
command: commandArg,
|
|
54
|
+
preset: presetArg,
|
|
55
|
+
scope: scopeArg,
|
|
56
|
+
"config-dir": configDirArg,
|
|
57
|
+
},
|
|
58
|
+
async run({ args }) {
|
|
59
|
+
await runPresetCommand(args);
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
export function listConfiguredPresets(presets) {
|
|
63
|
+
return Object.entries(presets)
|
|
64
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
65
|
+
.map(([name, preset]) => ({ name, preset }));
|
|
66
|
+
}
|
|
67
|
+
export function resolvePreset(name, presets) {
|
|
68
|
+
const presetName = name.trim();
|
|
69
|
+
if (!presetName) {
|
|
70
|
+
throw new Error("preset name required");
|
|
71
|
+
}
|
|
72
|
+
const preset = presets[presetName];
|
|
73
|
+
if (preset) {
|
|
74
|
+
return { name: presetName, preset };
|
|
75
|
+
}
|
|
76
|
+
const available = listConfiguredPresets(presets)
|
|
77
|
+
.map((entry) => entry.name)
|
|
78
|
+
.join(", ");
|
|
79
|
+
throw new Error(`unknown preset: ${presetName}. Available presets: ${available || "<none>"}`);
|
|
80
|
+
}
|
|
81
|
+
export function formatPreset(_name, preset) {
|
|
82
|
+
return `${JSON.stringify(preset, null, 2)}\n`;
|
|
83
|
+
}
|
|
84
|
+
export async function applyPreset(presetName, options = {}) {
|
|
85
|
+
const paths = await resolvePaths({
|
|
86
|
+
scope: options.scope ?? "global",
|
|
87
|
+
cwd: options.cwd ?? process.cwd(),
|
|
88
|
+
configDir: options.configDir,
|
|
89
|
+
});
|
|
90
|
+
const presets = await readConfiguredPresets({
|
|
91
|
+
cwd: options.cwd ?? process.cwd(),
|
|
92
|
+
configDir: options.configDir,
|
|
93
|
+
});
|
|
94
|
+
const resolved = resolvePreset(presetName, presets);
|
|
95
|
+
const entries = Object.entries(resolved.preset.agents);
|
|
96
|
+
if (entries.some(([targetName]) => isManagedOpenCodeAgentName(targetName))) {
|
|
97
|
+
await installManagedAgentPrompts(paths, { force: false });
|
|
98
|
+
}
|
|
99
|
+
const changes = [];
|
|
100
|
+
for (const [targetName, configuredValue] of entries) {
|
|
101
|
+
const normalizedValue = normalizeModelTargetOverride(targetName, configuredValue, `preset ${resolved.name} ${targetName}`);
|
|
102
|
+
if (targetName === "guardian") {
|
|
103
|
+
const { model, variant } = parseGuardianStyleModelArg(normalizedValue, `preset ${resolved.name}`);
|
|
104
|
+
const result = await writeGuardianConfig(paths, { model, variant }, { merge: true });
|
|
105
|
+
changes.push({ targetName, model: formatAgentModel(model, variant), result });
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (targetName === "memory-reviewer") {
|
|
109
|
+
const { model, variant } = parseGuardianStyleModelArg(normalizedValue, `preset ${resolved.name}`);
|
|
110
|
+
const result = await writeMemoryConfig(paths, { reviewerModel: model, reviewerVariant: variant }, { merge: true });
|
|
111
|
+
changes.push({ targetName, model: formatAgentModel(model, variant), result });
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (isOpenCodeDefaultModelTargetName(targetName)) {
|
|
115
|
+
const result = await writeOpenCodeDefaultModel(paths, resolveDefaultModelKey(targetName), {
|
|
116
|
+
model: normalizedValue,
|
|
117
|
+
ensureEntry: true,
|
|
118
|
+
});
|
|
119
|
+
changes.push({ targetName, model: normalizedValue, result });
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (isConfigurableOpenCodeSubagentName(targetName)) {
|
|
123
|
+
const result = await writeOpenCodeAgentModel(paths, targetName, {
|
|
124
|
+
model: normalizedValue,
|
|
125
|
+
ensureEntry: true,
|
|
126
|
+
});
|
|
127
|
+
changes.push({ targetName, model: normalizedValue, result });
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (isManagedOpenCodeAgentName(targetName)) {
|
|
131
|
+
const result = await writeManagedAgentModel(paths, targetName, {
|
|
132
|
+
model: normalizedValue,
|
|
133
|
+
ensureEntry: true,
|
|
134
|
+
});
|
|
135
|
+
changes.push({ targetName, model: normalizedValue, result });
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (isSpecialAgentName(targetName)) {
|
|
139
|
+
throw new Error(`unsupported preset target: ${targetName}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { name: resolved.name, preset: resolved.preset, changes };
|
|
143
|
+
}
|
|
144
|
+
async function listPresets(options = {}) {
|
|
145
|
+
return listConfiguredPresets(await readConfiguredPresets(options));
|
|
146
|
+
}
|
|
147
|
+
async function runPresetCommand(args) {
|
|
148
|
+
const command = typeof args.command === "string" ? args.command.trim() : "";
|
|
149
|
+
const presetName = typeof args.preset === "string" ? args.preset.trim() : "";
|
|
150
|
+
const configDir = typeof args["config-dir"] === "string" ? args["config-dir"] : undefined;
|
|
151
|
+
if (!command || command === "list") {
|
|
152
|
+
if (presetName) {
|
|
153
|
+
throw new Error(`unexpected extra argument for \`vvoc preset list\`: ${presetName}`);
|
|
154
|
+
}
|
|
155
|
+
const presets = await listPresets({ cwd: process.cwd(), configDir });
|
|
156
|
+
if (presets.length === 0) {
|
|
157
|
+
console.log("No presets configured.");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
console.log("Available presets:");
|
|
161
|
+
for (const { name, preset } of presets) {
|
|
162
|
+
const description = preset.description ? ` - ${preset.description}` : "";
|
|
163
|
+
const targetCount = Object.keys(preset.agents).length;
|
|
164
|
+
console.log(` ${name}${description} (${targetCount} target${targetCount === 1 ? "" : "s"})`);
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (command === "show") {
|
|
169
|
+
if (!presetName) {
|
|
170
|
+
throw new Error("preset name required for `vvoc preset show <name>`");
|
|
171
|
+
}
|
|
172
|
+
const presets = await readConfiguredPresets({ cwd: process.cwd(), configDir });
|
|
173
|
+
const resolved = resolvePreset(presetName, presets);
|
|
174
|
+
process.stdout.write(formatPreset(resolved.name, resolved.preset));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (presetName) {
|
|
178
|
+
throw new Error(`unexpected extra argument for \`vvoc preset <name>\`: ${presetName}`);
|
|
179
|
+
}
|
|
180
|
+
const scope = resolveScope(args.scope);
|
|
181
|
+
const applied = await applyPreset(command, {
|
|
182
|
+
cwd: process.cwd(),
|
|
183
|
+
configDir,
|
|
184
|
+
scope,
|
|
185
|
+
});
|
|
186
|
+
console.log(`Applied preset ${applied.name} (${scope}):`);
|
|
187
|
+
for (const change of applied.changes) {
|
|
188
|
+
console.log(` ${change.targetName}: ${describeWriteResult(change.result)} (${change.model})`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async function readConfiguredPresets(options = {}) {
|
|
192
|
+
const paths = await resolvePaths({
|
|
193
|
+
scope: "global",
|
|
194
|
+
cwd: options.cwd ?? process.cwd(),
|
|
195
|
+
configDir: options.configDir,
|
|
196
|
+
});
|
|
197
|
+
const config = await readVvocConfig(paths);
|
|
198
|
+
if (!config) {
|
|
199
|
+
throw new Error(`vvoc config is missing at ${paths.vvocConfigPath}. Run \`vvoc install\` or \`vvoc sync\`.`);
|
|
200
|
+
}
|
|
201
|
+
return config.presets;
|
|
202
|
+
}
|
|
203
|
+
function resolveScope(value) {
|
|
204
|
+
return value === "project" ? "project" : "global";
|
|
205
|
+
}
|
|
206
|
+
function resolveDefaultModelKey(targetName) {
|
|
207
|
+
return targetName === "default" ? "model" : "small_model";
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=preset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset.js","sourceRoot":"","sources":["../../src/commands/preset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ManagedOpenCodeAgentName } from "./managed-agents.js";
|
|
2
|
+
export declare const SPECIAL_AGENT_NAMES: readonly ["guardian", "memory-reviewer"];
|
|
3
|
+
export type SpecialAgentName = (typeof SPECIAL_AGENT_NAMES)[number];
|
|
4
|
+
export declare const OPENCODE_DEFAULT_MODEL_TARGETS: readonly ["default", "small-model"];
|
|
5
|
+
export type OpenCodeDefaultModelTargetName = (typeof OPENCODE_DEFAULT_MODEL_TARGETS)[number];
|
|
6
|
+
export declare const CONFIGURABLE_OPENCODE_SUBAGENTS: readonly ["general", "explore"];
|
|
7
|
+
export type ConfigurableOpenCodeSubagentName = (typeof CONFIGURABLE_OPENCODE_SUBAGENTS)[number];
|
|
8
|
+
export type SupportedModelTargetName = SpecialAgentName | OpenCodeDefaultModelTargetName | ConfigurableOpenCodeSubagentName | ManagedOpenCodeAgentName;
|
|
9
|
+
export declare const SUPPORTED_MODEL_TARGET_NAMES: readonly SupportedModelTargetName[];
|
|
10
|
+
export declare const MODEL_TARGET_NAME_CHOICES: string;
|
|
11
|
+
export declare function isSpecialAgentName(value: string): value is SpecialAgentName;
|
|
12
|
+
export declare function isOpenCodeDefaultModelTargetName(value: string): value is OpenCodeDefaultModelTargetName;
|
|
13
|
+
export declare function isConfigurableOpenCodeSubagentName(value: string): value is ConfigurableOpenCodeSubagentName;
|
|
14
|
+
export declare function parseModelTargetName(value: unknown, operation: string): SupportedModelTargetName;
|
|
15
|
+
export declare function parseGuardianStyleModelArg(value: unknown, operation: string): {
|
|
16
|
+
model: string;
|
|
17
|
+
variant?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function parseOpenCodeModelArg(value: unknown, operation: string): string;
|
|
20
|
+
export declare function normalizeModelTargetOverride(targetName: SupportedModelTargetName, value: unknown, operation: string): string;
|
|
21
|
+
export declare function formatAgentModel(model?: string, variant?: string): string;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// FILE: src/lib/agent-models.ts
|
|
2
|
+
// VERSION: 0.2.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Define supported vvoc model target IDs and shared model override validation helpers.
|
|
5
|
+
// SCOPE: Model target ID lists, type guards, model formatting, and model-argument parsing reused by CLI commands and vvoc config validation.
|
|
6
|
+
// DEPENDS: [src/lib/managed-agents.ts]
|
|
7
|
+
// LINKS: [M-CLI-CONFIG, M-CLI-COMMANDS, M-CLI-PRESET]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// SPECIAL_AGENT_NAMES - Target IDs that support provider/model[:variant] syntax.
|
|
14
|
+
// OPENCODE_DEFAULT_MODEL_TARGETS - Target IDs that map to top-level OpenCode model fields.
|
|
15
|
+
// CONFIGURABLE_OPENCODE_SUBAGENTS - Built-in OpenCode agent IDs vvoc can override directly.
|
|
16
|
+
// SupportedModelTargetName - Union of every preset-compatible model target ID.
|
|
17
|
+
// MODEL_TARGET_NAME_CHOICES - Human-readable supported target list for CLI errors.
|
|
18
|
+
// isSpecialAgentName - Checks whether a target uses Guardian-style model syntax.
|
|
19
|
+
// isOpenCodeDefaultModelTargetName - Checks whether a target maps to top-level OpenCode model fields.
|
|
20
|
+
// isConfigurableOpenCodeSubagentName - Checks whether a target is a built-in OpenCode agent override.
|
|
21
|
+
// parseModelTargetName - Validates a user-supplied model target ID.
|
|
22
|
+
// parseGuardianStyleModelArg - Validates provider/model[:variant] syntax.
|
|
23
|
+
// parseOpenCodeModelArg - Validates provider/model syntax.
|
|
24
|
+
// normalizeModelTargetOverride - Validates and canonicalizes a stored model override string for any supported target.
|
|
25
|
+
// formatAgentModel - Formats a model and optional variant for CLI output.
|
|
26
|
+
// END_MODULE_MAP
|
|
27
|
+
//
|
|
28
|
+
// START_CHANGE_SUMMARY
|
|
29
|
+
// LAST_CHANGE: [v0.2.0 - Added OpenCode default and small-model targets to shared validation helpers.]
|
|
30
|
+
// END_CHANGE_SUMMARY
|
|
31
|
+
import { MANAGED_OPENCODE_AGENTS, isManagedOpenCodeAgentName, } from "./managed-agents.js";
|
|
32
|
+
export const SPECIAL_AGENT_NAMES = ["guardian", "memory-reviewer"];
|
|
33
|
+
export const OPENCODE_DEFAULT_MODEL_TARGETS = ["default", "small-model"];
|
|
34
|
+
export const CONFIGURABLE_OPENCODE_SUBAGENTS = ["general", "explore"];
|
|
35
|
+
export const SUPPORTED_MODEL_TARGET_NAMES = [
|
|
36
|
+
...SPECIAL_AGENT_NAMES,
|
|
37
|
+
...OPENCODE_DEFAULT_MODEL_TARGETS,
|
|
38
|
+
...CONFIGURABLE_OPENCODE_SUBAGENTS,
|
|
39
|
+
...MANAGED_OPENCODE_AGENTS.map((definition) => definition.name),
|
|
40
|
+
];
|
|
41
|
+
export const MODEL_TARGET_NAME_CHOICES = SUPPORTED_MODEL_TARGET_NAMES.join(", ");
|
|
42
|
+
export function isSpecialAgentName(value) {
|
|
43
|
+
return SPECIAL_AGENT_NAMES.includes(value);
|
|
44
|
+
}
|
|
45
|
+
export function isOpenCodeDefaultModelTargetName(value) {
|
|
46
|
+
return OPENCODE_DEFAULT_MODEL_TARGETS.includes(value);
|
|
47
|
+
}
|
|
48
|
+
export function isConfigurableOpenCodeSubagentName(value) {
|
|
49
|
+
return CONFIGURABLE_OPENCODE_SUBAGENTS.includes(value);
|
|
50
|
+
}
|
|
51
|
+
export function parseModelTargetName(value, operation) {
|
|
52
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
53
|
+
throw new Error(`target argument required for ${operation}`);
|
|
54
|
+
}
|
|
55
|
+
const trimmed = value.trim();
|
|
56
|
+
if (isSpecialAgentName(trimmed) ||
|
|
57
|
+
isOpenCodeDefaultModelTargetName(trimmed) ||
|
|
58
|
+
isConfigurableOpenCodeSubagentName(trimmed) ||
|
|
59
|
+
isManagedOpenCodeAgentName(trimmed)) {
|
|
60
|
+
return trimmed;
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`unsupported target: ${trimmed}. Expected one of: ${MODEL_TARGET_NAME_CHOICES}`);
|
|
63
|
+
}
|
|
64
|
+
export function parseGuardianStyleModelArg(value, operation) {
|
|
65
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
66
|
+
throw new Error(`model argument required for ${operation}`);
|
|
67
|
+
}
|
|
68
|
+
const trimmed = value.trim();
|
|
69
|
+
if (trimmed.includes(":")) {
|
|
70
|
+
const lastColon = trimmed.lastIndexOf(":");
|
|
71
|
+
const model = trimmed.slice(0, lastColon);
|
|
72
|
+
const variant = trimmed.slice(lastColon + 1);
|
|
73
|
+
if (!model.includes("/")) {
|
|
74
|
+
throw new Error(`model must be in provider/model-id format, got: ${trimmed}`);
|
|
75
|
+
}
|
|
76
|
+
return { model, variant };
|
|
77
|
+
}
|
|
78
|
+
if (!trimmed.includes("/")) {
|
|
79
|
+
throw new Error(`model must be in provider/model-id format, got: ${trimmed}`);
|
|
80
|
+
}
|
|
81
|
+
return { model: trimmed };
|
|
82
|
+
}
|
|
83
|
+
export function parseOpenCodeModelArg(value, operation) {
|
|
84
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
85
|
+
throw new Error(`model argument required for ${operation}`);
|
|
86
|
+
}
|
|
87
|
+
const trimmed = value.trim();
|
|
88
|
+
if (!trimmed.includes("/")) {
|
|
89
|
+
throw new Error(`model must be in provider/model-id format, got: ${trimmed}`);
|
|
90
|
+
}
|
|
91
|
+
return trimmed;
|
|
92
|
+
}
|
|
93
|
+
export function normalizeModelTargetOverride(targetName, value, operation) {
|
|
94
|
+
if (isSpecialAgentName(targetName)) {
|
|
95
|
+
const { model, variant } = parseGuardianStyleModelArg(value, operation);
|
|
96
|
+
return formatAgentModel(model, variant);
|
|
97
|
+
}
|
|
98
|
+
return parseOpenCodeModelArg(value, operation);
|
|
99
|
+
}
|
|
100
|
+
export function formatAgentModel(model, variant) {
|
|
101
|
+
if (!model) {
|
|
102
|
+
return "default";
|
|
103
|
+
}
|
|
104
|
+
return variant ? `${model}:${variant}` : model;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=agent-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-models.js","sourceRoot":"","sources":["../../src/lib/agent-models.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/opencode.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { PACKAGE_NAME } from "./package.js";
|
|
|
4
4
|
export declare const CLI_NAME = "vvoc";
|
|
5
5
|
export { PACKAGE_NAME };
|
|
6
6
|
export declare const OPENCODE_SCHEMA_URL = "https://opencode.ai/config.json";
|
|
7
|
+
export type OpenCodeDefaultModelKey = "model" | "small_model";
|
|
7
8
|
export type Scope = "global" | "project";
|
|
8
9
|
export type ResolvedPaths = {
|
|
9
10
|
scope: Scope;
|
|
@@ -70,10 +71,15 @@ export declare function syncManagedAgentPrompts(paths: ResolvedPaths, options: {
|
|
|
70
71
|
}): Promise<WriteResult[]>;
|
|
71
72
|
export declare function readManagedAgentModels(paths: Pick<ResolvedPaths, "opencodeConfigPath">): Promise<ManagedAgentModelMap>;
|
|
72
73
|
export declare function readOpenCodeAgentModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, agentName: string): Promise<string | undefined>;
|
|
74
|
+
export declare function readOpenCodeDefaultModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, key: OpenCodeDefaultModelKey): Promise<string | undefined>;
|
|
73
75
|
export declare function writeOpenCodeAgentModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, agentName: string, options: {
|
|
74
76
|
model?: string;
|
|
75
77
|
ensureEntry: boolean;
|
|
76
78
|
}): Promise<WriteResult>;
|
|
79
|
+
export declare function writeOpenCodeDefaultModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, key: OpenCodeDefaultModelKey, options: {
|
|
80
|
+
model?: string;
|
|
81
|
+
ensureEntry: boolean;
|
|
82
|
+
}): Promise<WriteResult>;
|
|
77
83
|
export declare function writeManagedAgentModel(paths: Pick<ResolvedPaths, "managedAgentsDirPath" | "opencodeConfigPath">, agentName: ManagedOpenCodeAgentName, options: {
|
|
78
84
|
model?: string;
|
|
79
85
|
ensureEntry: boolean;
|
package/dist/lib/opencode.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// FILE: src/lib/opencode.ts
|
|
2
|
-
// VERSION: 0.
|
|
2
|
+
// VERSION: 0.8.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: Manage OpenCode config mutation, provider patching, and the canonical vvoc.json config file.
|
|
5
|
-
// SCOPE: Scope-aware path resolution, pinned plugin writes, provider baseURL patching, managed OpenCode agent registration/model overrides, managed agent prompt sync, canonical vvoc config rendering and sync, and installation inspection.
|
|
5
|
+
// SCOPE: Scope-aware path resolution, pinned plugin writes, top-level OpenCode model/default writes, provider baseURL patching, managed OpenCode agent registration/model overrides, managed agent prompt sync, version-aware canonical vvoc config rendering and sync, and installation inspection.
|
|
6
6
|
// DEPENDS: [jsonc-parser, node:fs/promises, node:path, src/lib/managed-agents.ts, src/lib/package.ts, src/lib/vvoc-config.ts, src/lib/vvoc-paths.ts]
|
|
7
7
|
// LINKS: [M-CLI-CONFIG]
|
|
8
8
|
// ROLE: RUNTIME
|
|
@@ -13,12 +13,15 @@
|
|
|
13
13
|
// CLI_NAME - Canonical vvoc CLI binary name.
|
|
14
14
|
// PACKAGE_NAME - Canonical vvoc npm package name.
|
|
15
15
|
// OPENCODE_SCHEMA_URL - OpenCode config schema URL.
|
|
16
|
+
// OpenCodeDefaultModelKey - Supported top-level OpenCode default model fields.
|
|
16
17
|
// Scope - Supported installation scopes for vvoc config writes.
|
|
17
18
|
// ResolvedPaths - Scope-aware path bundle for OpenCode and vvoc config locations.
|
|
18
19
|
// WriteResult - Result shape returned by managed config write operations.
|
|
19
20
|
// InstallationInspection - Current OpenCode and vvoc installation status snapshot.
|
|
20
21
|
// resolvePaths - Resolves OpenCode and vvoc config paths for global/project scopes.
|
|
21
22
|
// ensurePackageConfigText - Ensures OpenCode config contains the pinned vvoc plugin specifier.
|
|
23
|
+
// readOpenCodeDefaultModel - Reads a top-level OpenCode model or small_model override.
|
|
24
|
+
// writeOpenCodeDefaultModel - Writes or removes a top-level OpenCode model or small_model override.
|
|
22
25
|
// ensureProviderBaseUrlConfigText - Ensures OpenCode config contains the requested provider options.baseURL override.
|
|
23
26
|
// ensureManagedAgentRegistrationsConfigText - Ensures OpenCode config contains the vvoc-managed OpenCode agent registrations.
|
|
24
27
|
// readVvocConfig - Loads the canonical vvoc.json document when present.
|
|
@@ -40,13 +43,13 @@
|
|
|
40
43
|
// END_MODULE_MAP
|
|
41
44
|
//
|
|
42
45
|
// START_CHANGE_SUMMARY
|
|
43
|
-
// LAST_CHANGE: [v0.
|
|
46
|
+
// LAST_CHANGE: [v0.8.0 - Added top-level OpenCode model and small_model read-write helpers for default model switching.]
|
|
44
47
|
// END_CHANGE_SUMMARY
|
|
45
48
|
import { applyEdits, format, modify, parse } from "jsonc-parser";
|
|
46
49
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
47
50
|
import { dirname, join, relative } from "node:path";
|
|
48
51
|
import { MANAGED_AGENT_PROMPT_NAMES, MANAGED_OPENCODE_AGENTS, getManagedAgentPromptPath, getManagedOpenCodeAgentDefinition, loadManagedAgentPromptTemplate, } from "./managed-agents.js";
|
|
49
|
-
import { createDefaultVvocConfig, createGuardianConfig, createMemoryConfig, parseVvocConfigText, renderVvocConfig, } from "./vvoc-config.js";
|
|
52
|
+
import { createDefaultVvocConfig, createGuardianConfig, createMemoryConfig, parseVersionedVvocConfigText, parseVvocConfigText, renderVvocConfig, } from "./vvoc-config.js";
|
|
50
53
|
import { getPinnedPackageSpecifier, PACKAGE_NAME } from "./package.js";
|
|
51
54
|
import { getConfigHome, getGlobalOpencodeDir, getGlobalVvocConfigPath, getGlobalVvocDir, getProjectVvocDir, getVvocAgentsDir, } from "./vvoc-paths.js";
|
|
52
55
|
export const CLI_NAME = "vvoc";
|
|
@@ -214,6 +217,18 @@ export async function readOpenCodeAgentModel(paths, agentName) {
|
|
|
214
217
|
}
|
|
215
218
|
return readNonEmptyString(currentEntry.model, `${paths.opencodeConfigPath}: agent.${agentName}.model`);
|
|
216
219
|
}
|
|
220
|
+
export async function readOpenCodeDefaultModel(paths, key) {
|
|
221
|
+
const currentText = await readOptionalText(paths.opencodeConfigPath);
|
|
222
|
+
if (!currentText) {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
const document = parseObjectDocument(currentText, paths.opencodeConfigPath);
|
|
226
|
+
const value = document[key];
|
|
227
|
+
if (value === undefined) {
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
return readNonEmptyString(value, `${paths.opencodeConfigPath}: ${key}`);
|
|
231
|
+
}
|
|
217
232
|
export async function writeOpenCodeAgentModel(paths, agentName, options) {
|
|
218
233
|
const currentText = await readOptionalText(paths.opencodeConfigPath);
|
|
219
234
|
if (!currentText && !options.ensureEntry) {
|
|
@@ -246,6 +261,25 @@ export async function writeOpenCodeAgentModel(paths, agentName, options) {
|
|
|
246
261
|
path: paths.opencodeConfigPath,
|
|
247
262
|
};
|
|
248
263
|
}
|
|
264
|
+
export async function writeOpenCodeDefaultModel(paths, key, options) {
|
|
265
|
+
const currentText = await readOptionalText(paths.opencodeConfigPath);
|
|
266
|
+
if (!currentText && !options.ensureEntry) {
|
|
267
|
+
return { action: "kept", path: paths.opencodeConfigPath };
|
|
268
|
+
}
|
|
269
|
+
const baseText = options.ensureEntry ? ensureOpenCodeConfigText(currentText) : currentText;
|
|
270
|
+
if (!baseText) {
|
|
271
|
+
return { action: "kept", path: paths.opencodeConfigPath };
|
|
272
|
+
}
|
|
273
|
+
const nextText = updateTopLevelStringFieldText(baseText, key, options.model);
|
|
274
|
+
if ((currentText ?? "") === nextText) {
|
|
275
|
+
return { action: "kept", path: paths.opencodeConfigPath };
|
|
276
|
+
}
|
|
277
|
+
await writeText(paths.opencodeConfigPath, nextText);
|
|
278
|
+
return {
|
|
279
|
+
action: currentText ? "updated" : "created",
|
|
280
|
+
path: paths.opencodeConfigPath,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
249
283
|
export async function writeManagedAgentModel(paths, agentName, options) {
|
|
250
284
|
const currentText = await readOptionalText(paths.opencodeConfigPath);
|
|
251
285
|
if (!currentText && !options.ensureEntry) {
|
|
@@ -408,9 +442,14 @@ export async function inspectInstallation(paths) {
|
|
|
408
442
|
const vvocText = await readOptionalText(paths.vvocConfigPath);
|
|
409
443
|
let vvocParseError;
|
|
410
444
|
let vvocConfig;
|
|
445
|
+
let vvocSourceSchema;
|
|
446
|
+
let vvocSourceVersion;
|
|
411
447
|
if (vvocText) {
|
|
412
448
|
try {
|
|
413
|
-
|
|
449
|
+
const parsedConfig = parseVersionedVvocConfigText(vvocText, paths.vvocConfigPath);
|
|
450
|
+
vvocConfig = parsedConfig.config;
|
|
451
|
+
vvocSourceSchema = parsedConfig.sourceSchema;
|
|
452
|
+
vvocSourceVersion = parsedConfig.sourceVersion;
|
|
414
453
|
}
|
|
415
454
|
catch (error) {
|
|
416
455
|
vvocParseError = error instanceof Error ? error.message : String(error);
|
|
@@ -437,8 +476,8 @@ export async function inspectInstallation(paths) {
|
|
|
437
476
|
path: paths.vvocConfigPath,
|
|
438
477
|
exists: Boolean(vvocText),
|
|
439
478
|
parseError: vvocParseError,
|
|
440
|
-
schema:
|
|
441
|
-
version:
|
|
479
|
+
schema: vvocSourceSchema,
|
|
480
|
+
version: vvocSourceVersion,
|
|
442
481
|
},
|
|
443
482
|
guardian: {
|
|
444
483
|
config: vvocConfig?.guardian,
|
|
@@ -564,27 +603,16 @@ function getManagedPromptPath(paths, agentName) {
|
|
|
564
603
|
return getManagedAgentPromptPath(paths.managedAgentsDirPath, agentName);
|
|
565
604
|
}
|
|
566
605
|
function ensureAgentConfigText(text) {
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
$schema: OPENCODE_SCHEMA_URL,
|
|
570
|
-
agent: {},
|
|
571
|
-
});
|
|
572
|
-
}
|
|
573
|
-
const document = parseObjectDocument(text, "OpenCode config");
|
|
606
|
+
const nextText = ensureOpenCodeConfigText(text);
|
|
607
|
+
const document = parseObjectDocument(nextText, "OpenCode config");
|
|
574
608
|
const currentAgents = readAgentMap(document, "OpenCode config");
|
|
575
|
-
let
|
|
576
|
-
if (!Object.hasOwn(document, "$schema")) {
|
|
577
|
-
nextText = applyEdits(nextText, modify(nextText, ["$schema"], OPENCODE_SCHEMA_URL, {
|
|
578
|
-
formattingOptions: JSON_FORMAT,
|
|
579
|
-
getInsertionIndex: () => 0,
|
|
580
|
-
}));
|
|
581
|
-
}
|
|
609
|
+
let nextAgentText = nextText;
|
|
582
610
|
if (!Object.hasOwn(document, "agent")) {
|
|
583
|
-
|
|
611
|
+
nextAgentText = applyEdits(nextAgentText, modify(nextAgentText, ["agent"], currentAgents, {
|
|
584
612
|
formattingOptions: JSON_FORMAT,
|
|
585
613
|
}));
|
|
586
614
|
}
|
|
587
|
-
return ensureTrailingNewline(applyEdits(
|
|
615
|
+
return ensureTrailingNewline(applyEdits(nextAgentText, format(nextAgentText, undefined, JSON_FORMAT)));
|
|
588
616
|
}
|
|
589
617
|
function getManagedOpenCodeAgentPromptReference(paths, agentName) {
|
|
590
618
|
const promptPath = getManagedPromptPath(paths, agentName);
|
|
@@ -641,6 +669,28 @@ function updateAgentEntryText(text, agentName, entry) {
|
|
|
641
669
|
}));
|
|
642
670
|
return ensureTrailingNewline(applyEdits(nextText, format(nextText, undefined, JSON_FORMAT)));
|
|
643
671
|
}
|
|
672
|
+
function ensureOpenCodeConfigText(text) {
|
|
673
|
+
if (!text?.trim()) {
|
|
674
|
+
return renderJson({
|
|
675
|
+
$schema: OPENCODE_SCHEMA_URL,
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
const document = parseObjectDocument(text, "OpenCode config");
|
|
679
|
+
let nextText = text;
|
|
680
|
+
if (!Object.hasOwn(document, "$schema")) {
|
|
681
|
+
nextText = applyEdits(nextText, modify(nextText, ["$schema"], OPENCODE_SCHEMA_URL, {
|
|
682
|
+
formattingOptions: JSON_FORMAT,
|
|
683
|
+
getInsertionIndex: () => 0,
|
|
684
|
+
}));
|
|
685
|
+
}
|
|
686
|
+
return ensureTrailingNewline(applyEdits(nextText, format(nextText, undefined, JSON_FORMAT)));
|
|
687
|
+
}
|
|
688
|
+
function updateTopLevelStringFieldText(text, key, value) {
|
|
689
|
+
const nextText = applyEdits(text, modify(text, [key], value, {
|
|
690
|
+
formattingOptions: JSON_FORMAT,
|
|
691
|
+
}));
|
|
692
|
+
return ensureTrailingNewline(applyEdits(nextText, format(nextText, undefined, JSON_FORMAT)));
|
|
693
|
+
}
|
|
644
694
|
// END_BLOCK_MANAGED_AGENT_HELPERS
|
|
645
695
|
function readNonEmptyString(value, label) {
|
|
646
696
|
if (typeof value !== "string" || !value.trim()) {
|