@osovv/vv-opencode 0.17.4 → 0.19.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/README.md +48 -46
- package/dist/cli.js +5 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent.js +9 -193
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/completion.js +28 -25
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/config-validate.js +58 -5
- package/dist/commands/config-validate.js.map +1 -1
- package/dist/commands/doctor.js +11 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +2 -1
- package/dist/commands/init.js +30 -28
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/patch-provider.d.ts +19 -0
- package/dist/commands/patch-provider.js +23 -2
- package/dist/commands/patch-provider.js.map +1 -1
- package/dist/commands/preset.d.ts +3 -11
- package/dist/commands/preset.js +81 -85
- package/dist/commands/preset.js.map +1 -1
- package/dist/commands/role.d.ts +20 -0
- package/dist/commands/role.js +184 -0
- package/dist/commands/role.js.map +1 -0
- package/dist/commands/status.js +17 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-models.d.ts +10 -1
- package/dist/lib/agent-models.js +34 -15
- package/dist/lib/agent-models.js.map +1 -1
- package/dist/lib/model-roles.d.ts +44 -0
- package/dist/lib/model-roles.js +144 -0
- package/dist/lib/model-roles.js.map +1 -0
- package/dist/lib/opencode.d.ts +21 -0
- package/dist/lib/opencode.js +178 -31
- package/dist/lib/opencode.js.map +1 -1
- package/dist/lib/vvoc-config.d.ts +24 -10
- package/dist/lib/vvoc-config.js +166 -104
- package/dist/lib/vvoc-config.js.map +1 -1
- package/dist/plugins/guardian/index.js +124 -15
- package/dist/plugins/guardian/index.js.map +1 -1
- package/dist/plugins/memory/index.js +116 -10
- package/dist/plugins/memory/index.js.map +1 -1
- package/dist/plugins/memory-store.d.ts +0 -2
- package/dist/plugins/memory-store.js +2 -3
- package/dist/plugins/memory-store.js.map +1 -1
- package/dist/plugins/model-roles/index.d.ts +2 -0
- package/dist/plugins/model-roles/index.js +230 -0
- package/dist/plugins/model-roles/index.js.map +1 -0
- package/package.json +6 -2
- package/schemas/vvoc/v1.json +1 -1
- package/schemas/vvoc/v2.json +1 -1
- package/schemas/vvoc/v3.json +127 -0
package/dist/lib/agent-models.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// FILE: src/lib/agent-models.ts
|
|
2
|
-
// VERSION: 0.
|
|
2
|
+
// VERSION: 0.3.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
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.
|
|
5
|
+
// SCOPE: Model target ID lists, type guards, model formatting, and model-argument parsing reused by CLI commands and vvoc config validation, including OpenCode agent targets that support variants.
|
|
6
6
|
// DEPENDS: [src/lib/managed-agents.ts]
|
|
7
7
|
// LINKS: [M-CLI-CONFIG, M-CLI-COMMANDS, M-CLI-PRESET]
|
|
8
8
|
// ROLE: RUNTIME
|
|
@@ -10,32 +10,41 @@
|
|
|
10
10
|
// END_MODULE_CONTRACT
|
|
11
11
|
//
|
|
12
12
|
// START_MODULE_MAP
|
|
13
|
-
// SPECIAL_AGENT_NAMES - Target IDs that support provider/model[:variant] syntax.
|
|
13
|
+
// SPECIAL_AGENT_NAMES - Target IDs that support provider/model[:variant] syntax in canonical vvoc config.
|
|
14
14
|
// OPENCODE_DEFAULT_MODEL_TARGETS - Target IDs that map to top-level OpenCode model fields.
|
|
15
|
-
//
|
|
15
|
+
// CONFIGURABLE_OPENCODE_PRIMARY_AGENTS - Built-in OpenCode primary agent IDs vvoc can override directly.
|
|
16
|
+
// CONFIGURABLE_OPENCODE_SUBAGENTS - Built-in OpenCode subagent IDs vvoc can override directly.
|
|
17
|
+
// CONFIGURABLE_OPENCODE_AGENTS - Built-in OpenCode agent IDs that vvoc can map to model plus variant fields.
|
|
16
18
|
// SupportedModelTargetName - Union of every preset-compatible model target ID.
|
|
17
19
|
// MODEL_TARGET_NAME_CHOICES - Human-readable supported target list for CLI errors.
|
|
18
20
|
// isSpecialAgentName - Checks whether a target uses Guardian-style model syntax.
|
|
19
21
|
// isOpenCodeDefaultModelTargetName - Checks whether a target maps to top-level OpenCode model fields.
|
|
22
|
+
// isConfigurableOpenCodeAgentName - Checks whether a target is a built-in OpenCode agent override.
|
|
20
23
|
// isConfigurableOpenCodeSubagentName - Checks whether a target is a built-in OpenCode agent override.
|
|
21
24
|
// parseModelTargetName - Validates a user-supplied model target ID.
|
|
22
25
|
// parseGuardianStyleModelArg - Validates provider/model[:variant] syntax.
|
|
23
|
-
// parseOpenCodeModelArg - Validates provider/model syntax.
|
|
26
|
+
// parseOpenCodeModelArg - Validates plain provider/model syntax for top-level OpenCode model fields.
|
|
27
|
+
// parseOpenCodeAgentModelArg - Validates provider/model[:variant] syntax for OpenCode agent fields.
|
|
24
28
|
// normalizeModelTargetOverride - Validates and canonicalizes a stored model override string for any supported target.
|
|
25
29
|
// formatAgentModel - Formats a model and optional variant for CLI output.
|
|
26
30
|
// END_MODULE_MAP
|
|
27
31
|
//
|
|
28
32
|
// START_CHANGE_SUMMARY
|
|
29
|
-
// LAST_CHANGE: [v0.
|
|
33
|
+
// LAST_CHANGE: [v0.3.0 - Added variant-aware OpenCode agent targets for build/plan/general/explore while keeping top-level default model fields plain.]
|
|
30
34
|
// END_CHANGE_SUMMARY
|
|
31
35
|
import { MANAGED_OPENCODE_AGENTS, isManagedOpenCodeAgentName, } from "./managed-agents.js";
|
|
32
36
|
export const SPECIAL_AGENT_NAMES = ["guardian", "memory-reviewer"];
|
|
33
37
|
export const OPENCODE_DEFAULT_MODEL_TARGETS = ["default", "small-model"];
|
|
38
|
+
export const CONFIGURABLE_OPENCODE_PRIMARY_AGENTS = ["build", "plan"];
|
|
34
39
|
export const CONFIGURABLE_OPENCODE_SUBAGENTS = ["general", "explore"];
|
|
40
|
+
export const CONFIGURABLE_OPENCODE_AGENTS = [
|
|
41
|
+
...CONFIGURABLE_OPENCODE_PRIMARY_AGENTS,
|
|
42
|
+
...CONFIGURABLE_OPENCODE_SUBAGENTS,
|
|
43
|
+
];
|
|
35
44
|
export const SUPPORTED_MODEL_TARGET_NAMES = [
|
|
36
45
|
...SPECIAL_AGENT_NAMES,
|
|
37
46
|
...OPENCODE_DEFAULT_MODEL_TARGETS,
|
|
38
|
-
...
|
|
47
|
+
...CONFIGURABLE_OPENCODE_AGENTS,
|
|
39
48
|
...MANAGED_OPENCODE_AGENTS.map((definition) => definition.name),
|
|
40
49
|
];
|
|
41
50
|
export const MODEL_TARGET_NAME_CHOICES = SUPPORTED_MODEL_TARGET_NAMES.join(", ");
|
|
@@ -48,6 +57,9 @@ export function isOpenCodeDefaultModelTargetName(value) {
|
|
|
48
57
|
export function isConfigurableOpenCodeSubagentName(value) {
|
|
49
58
|
return CONFIGURABLE_OPENCODE_SUBAGENTS.includes(value);
|
|
50
59
|
}
|
|
60
|
+
export function isConfigurableOpenCodeAgentName(value) {
|
|
61
|
+
return CONFIGURABLE_OPENCODE_AGENTS.includes(value);
|
|
62
|
+
}
|
|
51
63
|
export function parseModelTargetName(value, operation) {
|
|
52
64
|
if (typeof value !== "string" || !value.trim()) {
|
|
53
65
|
throw new Error(`target argument required for ${operation}`);
|
|
@@ -55,13 +67,19 @@ export function parseModelTargetName(value, operation) {
|
|
|
55
67
|
const trimmed = value.trim();
|
|
56
68
|
if (isSpecialAgentName(trimmed) ||
|
|
57
69
|
isOpenCodeDefaultModelTargetName(trimmed) ||
|
|
58
|
-
|
|
70
|
+
isConfigurableOpenCodeAgentName(trimmed) ||
|
|
59
71
|
isManagedOpenCodeAgentName(trimmed)) {
|
|
60
72
|
return trimmed;
|
|
61
73
|
}
|
|
62
74
|
throw new Error(`unsupported target: ${trimmed}. Expected one of: ${MODEL_TARGET_NAME_CHOICES}`);
|
|
63
75
|
}
|
|
64
76
|
export function parseGuardianStyleModelArg(value, operation) {
|
|
77
|
+
return parseModelArgWithOptionalVariant(value, operation);
|
|
78
|
+
}
|
|
79
|
+
export function parseOpenCodeAgentModelArg(value, operation) {
|
|
80
|
+
return parseModelArgWithOptionalVariant(value, operation);
|
|
81
|
+
}
|
|
82
|
+
function parseModelArgWithOptionalVariant(value, operation) {
|
|
65
83
|
if (typeof value !== "string" || !value.trim()) {
|
|
66
84
|
throw new Error(`model argument required for ${operation}`);
|
|
67
85
|
}
|
|
@@ -81,20 +99,21 @@ export function parseGuardianStyleModelArg(value, operation) {
|
|
|
81
99
|
return { model: trimmed };
|
|
82
100
|
}
|
|
83
101
|
export function parseOpenCodeModelArg(value, operation) {
|
|
84
|
-
|
|
85
|
-
|
|
102
|
+
const { model, variant } = parseModelArgWithOptionalVariant(value, operation);
|
|
103
|
+
if (variant) {
|
|
104
|
+
throw new Error(`model must be in provider/model-id format without :variant for ${operation}, got: ${value}`);
|
|
86
105
|
}
|
|
87
|
-
|
|
88
|
-
if (!trimmed.includes("/")) {
|
|
89
|
-
throw new Error(`model must be in provider/model-id format, got: ${trimmed}`);
|
|
90
|
-
}
|
|
91
|
-
return trimmed;
|
|
106
|
+
return model;
|
|
92
107
|
}
|
|
93
108
|
export function normalizeModelTargetOverride(targetName, value, operation) {
|
|
94
109
|
if (isSpecialAgentName(targetName)) {
|
|
95
110
|
const { model, variant } = parseGuardianStyleModelArg(value, operation);
|
|
96
111
|
return formatAgentModel(model, variant);
|
|
97
112
|
}
|
|
113
|
+
if (isConfigurableOpenCodeAgentName(targetName) || isManagedOpenCodeAgentName(targetName)) {
|
|
114
|
+
const { model, variant } = parseOpenCodeAgentModelArg(value, operation);
|
|
115
|
+
return formatAgentModel(model, variant);
|
|
116
|
+
}
|
|
98
117
|
return parseOpenCodeModelArg(value, operation);
|
|
99
118
|
}
|
|
100
119
|
export function formatAgentModel(model, variant) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-models.js","sourceRoot":"","sources":["../../src/lib/agent-models.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,iBAAiB;AACjB,wBAAwB;AACxB,kGAAkG;AAClG
|
|
1
|
+
{"version":3,"file":"agent-models.js","sourceRoot":"","sources":["../../src/lib/agent-models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export declare const BUILTIN_ROLE_NAMES: readonly ["default", "smart", "fast", "vision"];
|
|
2
|
+
export type BuiltInRoleName = (typeof BUILTIN_ROLE_NAMES)[number];
|
|
3
|
+
export declare const ROLE_REFERENCE_PREFIX = "vv-role:";
|
|
4
|
+
export type ModelRolesErrorCode = "INVALID_ROLE_ID" | "INVALID_ROLE_REFERENCE" | "INVALID_MODEL_SELECTION" | "UNKNOWN_ROLE";
|
|
5
|
+
export type ModelRolesError = Error & {
|
|
6
|
+
code: ModelRolesErrorCode;
|
|
7
|
+
field: "roleId" | "roleRef" | "modelSelection";
|
|
8
|
+
value: string;
|
|
9
|
+
};
|
|
10
|
+
export type ParsedModelSelection = {
|
|
11
|
+
provider: string;
|
|
12
|
+
model: string;
|
|
13
|
+
variant?: string;
|
|
14
|
+
normalized: string;
|
|
15
|
+
};
|
|
16
|
+
export type ResolvedRoleSelection = ParsedModelSelection & {
|
|
17
|
+
roleId: string;
|
|
18
|
+
roleRef: string;
|
|
19
|
+
};
|
|
20
|
+
export type BuiltInRoleBindings = {
|
|
21
|
+
opencodeDefaults: {
|
|
22
|
+
model: BuiltInRoleName;
|
|
23
|
+
smallModel: BuiltInRoleName;
|
|
24
|
+
};
|
|
25
|
+
opencodeAgents: {
|
|
26
|
+
build: BuiltInRoleName;
|
|
27
|
+
plan: BuiltInRoleName;
|
|
28
|
+
general: BuiltInRoleName;
|
|
29
|
+
explore: BuiltInRoleName;
|
|
30
|
+
};
|
|
31
|
+
managedAgents: {
|
|
32
|
+
guardian: BuiltInRoleName;
|
|
33
|
+
"memory-reviewer": BuiltInRoleName;
|
|
34
|
+
enhancer: BuiltInRoleName;
|
|
35
|
+
implementer: BuiltInRoleName;
|
|
36
|
+
"spec-reviewer": BuiltInRoleName;
|
|
37
|
+
"code-reviewer": BuiltInRoleName;
|
|
38
|
+
investitagor: BuiltInRoleName;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export declare function isRoleReference(value: string): boolean;
|
|
42
|
+
export declare function parseModelSelection(modelSelection: string): ParsedModelSelection;
|
|
43
|
+
export declare function resolveRoleReference(roleRef: string, roleMap: Record<string, string>): ResolvedRoleSelection;
|
|
44
|
+
export declare function getBuiltInRoleBindings(): BuiltInRoleBindings;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// FILE: src/lib/model-roles.ts
|
|
2
|
+
// VERSION: 0.1.1
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Define built-in role IDs, role-reference parsing, concrete model-selection parsing, and deterministic built-in role bindings.
|
|
5
|
+
// SCOPE: Role ID validation, vv-role reference detection/resolution, provider/model[:variant] parsing, and hard-coded built-in role binding lookup.
|
|
6
|
+
// INPUTS: roleId | roleRef | modelSelection strings and a canonical role map.
|
|
7
|
+
// OUTPUTS: Normalized role IDs plus parsed and resolved model-selection objects.
|
|
8
|
+
// DEPENDS: [none]
|
|
9
|
+
// LINKS: [M-MODEL-ROLES]
|
|
10
|
+
// ROLE: RUNTIME
|
|
11
|
+
// MAP_MODE: EXPORTS
|
|
12
|
+
// END_MODULE_CONTRACT
|
|
13
|
+
//
|
|
14
|
+
// START_MODULE_MAP
|
|
15
|
+
// BUILTIN_ROLE_NAMES - Built-in role IDs in deterministic order.
|
|
16
|
+
// ROLE_REFERENCE_PREFIX - Stable role-reference prefix.
|
|
17
|
+
// isRoleReference - Checks whether a value is a vv-role reference.
|
|
18
|
+
// parseModelSelection - Parses provider/model[:variant] into normalized parts.
|
|
19
|
+
// resolveRoleReference - Resolves vv-role references through a canonical role map.
|
|
20
|
+
// getBuiltInRoleBindings - Returns hard-coded role bindings for OpenCode defaults and bundled agents.
|
|
21
|
+
// END_MODULE_MAP
|
|
22
|
+
//
|
|
23
|
+
// START_CHANGE_SUMMARY
|
|
24
|
+
// LAST_CHANGE: [v0.1.1 - Distinguished unknown-role from blank configured role bindings and aligned role-reference whitespace handling between checker and resolver.]
|
|
25
|
+
// LAST_CHANGE: [v0.1.0 - Added role ID validation, role reference resolution helpers, model selection parsing, and deterministic built-in role bindings.]
|
|
26
|
+
// END_CHANGE_SUMMARY
|
|
27
|
+
export const BUILTIN_ROLE_NAMES = ["default", "smart", "fast", "vision"];
|
|
28
|
+
export const ROLE_REFERENCE_PREFIX = "vv-role:";
|
|
29
|
+
const ROLE_ID_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
30
|
+
const MODEL_SELECTION_PATTERN = /^([^\s/:]+)\/([^\s/:]+)(?::([^\s:]+))?$/;
|
|
31
|
+
const BUILTIN_ROLE_BINDINGS = {
|
|
32
|
+
opencodeDefaults: {
|
|
33
|
+
model: "default",
|
|
34
|
+
smallModel: "fast",
|
|
35
|
+
},
|
|
36
|
+
opencodeAgents: {
|
|
37
|
+
build: "smart",
|
|
38
|
+
plan: "smart",
|
|
39
|
+
general: "default",
|
|
40
|
+
explore: "fast",
|
|
41
|
+
},
|
|
42
|
+
managedAgents: {
|
|
43
|
+
guardian: "fast",
|
|
44
|
+
"memory-reviewer": "fast",
|
|
45
|
+
enhancer: "smart",
|
|
46
|
+
implementer: "default",
|
|
47
|
+
"spec-reviewer": "smart",
|
|
48
|
+
"code-reviewer": "smart",
|
|
49
|
+
investitagor: "smart",
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
// START_CONTRACT: isRoleReference
|
|
53
|
+
// PURPOSE: Check whether a model-like value is a vv-role:* reference.
|
|
54
|
+
// INPUTS: { value: string - Candidate model-like string. }
|
|
55
|
+
// OUTPUTS: { boolean - True only when the value starts with the vv-role prefix and has a non-empty suffix. }
|
|
56
|
+
// SIDE_EFFECTS: none
|
|
57
|
+
// LINKS: [fn-isRoleReference, fn-resolveRoleReference]
|
|
58
|
+
// END_CONTRACT: isRoleReference
|
|
59
|
+
export function isRoleReference(value) {
|
|
60
|
+
const trimmed = value.trim();
|
|
61
|
+
return trimmed.startsWith(ROLE_REFERENCE_PREFIX) && trimmed.length > ROLE_REFERENCE_PREFIX.length;
|
|
62
|
+
}
|
|
63
|
+
// START_CONTRACT: parseModelSelection
|
|
64
|
+
// PURPOSE: Parse provider/model[:variant] syntax into normalized model-selection parts.
|
|
65
|
+
// INPUTS: { modelSelection: string - Concrete model-selection input. }
|
|
66
|
+
// OUTPUTS: { ParsedModelSelection - Normalized provider/model and optional variant values. }
|
|
67
|
+
// SIDE_EFFECTS: none
|
|
68
|
+
// LINKS: [fn-parseModelSelection]
|
|
69
|
+
// END_CONTRACT: parseModelSelection
|
|
70
|
+
export function parseModelSelection(modelSelection) {
|
|
71
|
+
const trimmed = modelSelection.trim();
|
|
72
|
+
const match = MODEL_SELECTION_PATTERN.exec(trimmed);
|
|
73
|
+
if (!match) {
|
|
74
|
+
throw createModelRolesError("INVALID_MODEL_SELECTION", "modelSelection", modelSelection, "expected provider/model[:variant]");
|
|
75
|
+
}
|
|
76
|
+
const [, provider, model, variant] = match;
|
|
77
|
+
const normalized = variant ? `${provider}/${model}:${variant}` : `${provider}/${model}`;
|
|
78
|
+
return variant ? { provider, model, variant, normalized } : { provider, model, normalized };
|
|
79
|
+
}
|
|
80
|
+
// START_CONTRACT: resolveRoleReference
|
|
81
|
+
// PURPOSE: Resolve a vv-role:* reference to a concrete provider/model[:variant] selection.
|
|
82
|
+
// INPUTS: { roleRef: string - vv-role reference, roleMap: Record<string, string> - canonical role assignments. }
|
|
83
|
+
// OUTPUTS: { ResolvedRoleSelection - Parsed concrete model selection plus normalized role information. }
|
|
84
|
+
// SIDE_EFFECTS: none
|
|
85
|
+
// LINKS: [fn-resolveRoleReference, fn-parseModelSelection]
|
|
86
|
+
// END_CONTRACT: resolveRoleReference
|
|
87
|
+
export function resolveRoleReference(roleRef, roleMap) {
|
|
88
|
+
// START_BLOCK_RESOLVE_ROLE_REFERENCE
|
|
89
|
+
const roleId = parseRoleReference(roleRef);
|
|
90
|
+
if (!Object.hasOwn(roleMap, roleId)) {
|
|
91
|
+
throw createModelRolesError("UNKNOWN_ROLE", "roleRef", roleRef, `unknown role: ${roleId}`);
|
|
92
|
+
}
|
|
93
|
+
const rawModelSelection = roleMap[roleId];
|
|
94
|
+
if (typeof rawModelSelection !== "string" || !rawModelSelection.trim()) {
|
|
95
|
+
throw createModelRolesError("INVALID_MODEL_SELECTION", "modelSelection", typeof rawModelSelection === "string" ? rawModelSelection : String(rawModelSelection), `configured role binding is blank or invalid for role: ${roleId}`);
|
|
96
|
+
}
|
|
97
|
+
if (isRoleReference(rawModelSelection.trim())) {
|
|
98
|
+
throw createModelRolesError("INVALID_MODEL_SELECTION", "modelSelection", rawModelSelection, "role-to-role chaining is not allowed");
|
|
99
|
+
}
|
|
100
|
+
const parsed = parseModelSelection(rawModelSelection);
|
|
101
|
+
return {
|
|
102
|
+
roleId,
|
|
103
|
+
roleRef: `${ROLE_REFERENCE_PREFIX}${roleId}`,
|
|
104
|
+
...parsed,
|
|
105
|
+
};
|
|
106
|
+
// END_BLOCK_RESOLVE_ROLE_REFERENCE
|
|
107
|
+
}
|
|
108
|
+
// START_CONTRACT: getBuiltInRoleBindings
|
|
109
|
+
// PURPOSE: Return deterministic built-in role bindings used by OpenCode defaults and bundled agents.
|
|
110
|
+
// INPUTS: {}
|
|
111
|
+
// OUTPUTS: { BuiltInRoleBindings - Immutable hard-coded role bindings. }
|
|
112
|
+
// SIDE_EFFECTS: none
|
|
113
|
+
// LINKS: [fn-getBuiltInRoleBindings, const-BUILTIN_ROLE_NAMES]
|
|
114
|
+
// END_CONTRACT: getBuiltInRoleBindings
|
|
115
|
+
export function getBuiltInRoleBindings() {
|
|
116
|
+
return {
|
|
117
|
+
opencodeDefaults: { ...BUILTIN_ROLE_BINDINGS.opencodeDefaults },
|
|
118
|
+
opencodeAgents: { ...BUILTIN_ROLE_BINDINGS.opencodeAgents },
|
|
119
|
+
managedAgents: { ...BUILTIN_ROLE_BINDINGS.managedAgents },
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function parseRoleReference(roleRef) {
|
|
123
|
+
const trimmed = roleRef.trim();
|
|
124
|
+
if (!isRoleReference(trimmed)) {
|
|
125
|
+
throw createModelRolesError("INVALID_ROLE_REFERENCE", "roleRef", roleRef, `expected ${ROLE_REFERENCE_PREFIX}<role-id>`);
|
|
126
|
+
}
|
|
127
|
+
const roleId = trimmed.slice(ROLE_REFERENCE_PREFIX.length);
|
|
128
|
+
return normalizeRoleId(roleId);
|
|
129
|
+
}
|
|
130
|
+
function normalizeRoleId(roleId) {
|
|
131
|
+
const normalized = roleId.trim();
|
|
132
|
+
if (!ROLE_ID_PATTERN.test(normalized)) {
|
|
133
|
+
throw createModelRolesError("INVALID_ROLE_ID", "roleId", roleId, "expected lowercase letters, digits, and hyphens");
|
|
134
|
+
}
|
|
135
|
+
return normalized;
|
|
136
|
+
}
|
|
137
|
+
function createModelRolesError(code, field, value, detail) {
|
|
138
|
+
const error = new Error(`${code}: ${field} ${detail} (received: ${value})`);
|
|
139
|
+
error.code = code;
|
|
140
|
+
error.field = field;
|
|
141
|
+
error.value = value;
|
|
142
|
+
return error;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=model-roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-roles.js","sourceRoot":"","sources":["../../src/lib/model-roles.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/opencode.d.ts
CHANGED
|
@@ -24,6 +24,11 @@ export type WriteResult = {
|
|
|
24
24
|
reason?: string;
|
|
25
25
|
};
|
|
26
26
|
export type ManagedAgentModelMap = Record<ManagedOpenCodeAgentName, string | undefined>;
|
|
27
|
+
export type OpenCodeAgentOverride = {
|
|
28
|
+
model?: string;
|
|
29
|
+
variant?: string;
|
|
30
|
+
};
|
|
31
|
+
export type ManagedAgentOverrideMap = Record<ManagedOpenCodeAgentName, OpenCodeAgentOverride>;
|
|
27
32
|
export type InstallationInspection = {
|
|
28
33
|
scope: Scope;
|
|
29
34
|
opencode: {
|
|
@@ -50,6 +55,18 @@ export type InstallationInspection = {
|
|
|
50
55
|
secretsRedaction: {
|
|
51
56
|
config?: SecretsRedactionConfig;
|
|
52
57
|
};
|
|
58
|
+
roles: {
|
|
59
|
+
assignments: Array<{
|
|
60
|
+
roleId: string;
|
|
61
|
+
model: string;
|
|
62
|
+
builtIn: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
unresolvedReferences: Array<{
|
|
65
|
+
fieldPath: string;
|
|
66
|
+
roleRef: string;
|
|
67
|
+
roleId: string;
|
|
68
|
+
}>;
|
|
69
|
+
};
|
|
53
70
|
warnings: string[];
|
|
54
71
|
problems: string[];
|
|
55
72
|
};
|
|
@@ -71,10 +88,13 @@ export declare function syncManagedAgentPrompts(paths: ResolvedPaths, options: {
|
|
|
71
88
|
force: boolean;
|
|
72
89
|
}): Promise<WriteResult[]>;
|
|
73
90
|
export declare function readManagedAgentModels(paths: Pick<ResolvedPaths, "opencodeConfigPath">): Promise<ManagedAgentModelMap>;
|
|
91
|
+
export declare function readManagedAgentOverrides(paths: Pick<ResolvedPaths, "opencodeConfigPath">): Promise<ManagedAgentOverrideMap>;
|
|
74
92
|
export declare function readOpenCodeAgentModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, agentName: string): Promise<string | undefined>;
|
|
93
|
+
export declare function readOpenCodeAgentOverride(paths: Pick<ResolvedPaths, "opencodeConfigPath">, agentName: string): Promise<OpenCodeAgentOverride>;
|
|
75
94
|
export declare function readOpenCodeDefaultModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, key: OpenCodeDefaultModelKey): Promise<string | undefined>;
|
|
76
95
|
export declare function writeOpenCodeAgentModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, agentName: string, options: {
|
|
77
96
|
model?: string;
|
|
97
|
+
variant?: string;
|
|
78
98
|
ensureEntry: boolean;
|
|
79
99
|
}): Promise<WriteResult>;
|
|
80
100
|
export declare function writeOpenCodeDefaultModel(paths: Pick<ResolvedPaths, "opencodeConfigPath">, key: OpenCodeDefaultModelKey, options: {
|
|
@@ -84,6 +104,7 @@ export declare function writeOpenCodeDefaultModel(paths: Pick<ResolvedPaths, "op
|
|
|
84
104
|
export declare function writeOpenCodeProviderObject(paths: Pick<ResolvedPaths, "opencodeConfigPath">, providerID: string, value: JsonObject): Promise<WriteResult>;
|
|
85
105
|
export declare function writeManagedAgentModel(paths: Pick<ResolvedPaths, "managedAgentsDirPath" | "opencodeConfigPath">, agentName: ManagedOpenCodeAgentName, options: {
|
|
86
106
|
model?: string;
|
|
107
|
+
variant?: string;
|
|
87
108
|
ensureEntry: boolean;
|
|
88
109
|
}): Promise<WriteResult>;
|
|
89
110
|
export { parseGuardianConfigText, renderGuardianConfig, type GuardianConfigOverrides, } from "./vvoc-config.js";
|