@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.
Files changed (54) hide show
  1. package/README.md +48 -46
  2. package/dist/cli.js +5 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/agent.js +9 -193
  5. package/dist/commands/agent.js.map +1 -1
  6. package/dist/commands/completion.js +28 -25
  7. package/dist/commands/completion.js.map +1 -1
  8. package/dist/commands/config-validate.js +58 -5
  9. package/dist/commands/config-validate.js.map +1 -1
  10. package/dist/commands/doctor.js +11 -2
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/init.d.ts +2 -1
  13. package/dist/commands/init.js +30 -28
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/patch-provider.d.ts +19 -0
  16. package/dist/commands/patch-provider.js +23 -2
  17. package/dist/commands/patch-provider.js.map +1 -1
  18. package/dist/commands/preset.d.ts +3 -11
  19. package/dist/commands/preset.js +81 -85
  20. package/dist/commands/preset.js.map +1 -1
  21. package/dist/commands/role.d.ts +20 -0
  22. package/dist/commands/role.js +184 -0
  23. package/dist/commands/role.js.map +1 -0
  24. package/dist/commands/status.js +17 -2
  25. package/dist/commands/status.js.map +1 -1
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +7 -6
  28. package/dist/index.js.map +1 -1
  29. package/dist/lib/agent-models.d.ts +10 -1
  30. package/dist/lib/agent-models.js +34 -15
  31. package/dist/lib/agent-models.js.map +1 -1
  32. package/dist/lib/model-roles.d.ts +44 -0
  33. package/dist/lib/model-roles.js +144 -0
  34. package/dist/lib/model-roles.js.map +1 -0
  35. package/dist/lib/opencode.d.ts +21 -0
  36. package/dist/lib/opencode.js +178 -31
  37. package/dist/lib/opencode.js.map +1 -1
  38. package/dist/lib/vvoc-config.d.ts +24 -10
  39. package/dist/lib/vvoc-config.js +166 -104
  40. package/dist/lib/vvoc-config.js.map +1 -1
  41. package/dist/plugins/guardian/index.js +124 -15
  42. package/dist/plugins/guardian/index.js.map +1 -1
  43. package/dist/plugins/memory/index.js +116 -10
  44. package/dist/plugins/memory/index.js.map +1 -1
  45. package/dist/plugins/memory-store.d.ts +0 -2
  46. package/dist/plugins/memory-store.js +2 -3
  47. package/dist/plugins/memory-store.js.map +1 -1
  48. package/dist/plugins/model-roles/index.d.ts +2 -0
  49. package/dist/plugins/model-roles/index.js +230 -0
  50. package/dist/plugins/model-roles/index.js.map +1 -0
  51. package/package.json +6 -2
  52. package/schemas/vvoc/v1.json +1 -1
  53. package/schemas/vvoc/v2.json +1 -1
  54. package/schemas/vvoc/v3.json +127 -0
@@ -1,8 +1,8 @@
1
1
  // FILE: src/lib/agent-models.ts
2
- // VERSION: 0.2.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
- // CONFIGURABLE_OPENCODE_SUBAGENTS - Built-in OpenCode agent IDs vvoc can override directly.
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.2.0 - Added OpenCode default and small-model targets to shared validation helpers.]
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
- ...CONFIGURABLE_OPENCODE_SUBAGENTS,
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
- isConfigurableOpenCodeSubagentName(trimmed) ||
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
- if (typeof value !== "string" || !value.trim()) {
85
- throw new Error(`model argument required for ${operation}`);
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
- 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;
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":"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"}
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,uMAAuM;AACvM,yCAAyC;AACzC,wDAAwD;AACxD,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,4GAA4G;AAC5G,6FAA6F;AAC7F,2GAA2G;AAC3G,iGAAiG;AACjG,+GAA+G;AAC/G,iFAAiF;AACjF,qFAAqF;AACrF,mFAAmF;AACnF,wGAAwG;AACxG,qGAAqG;AACrG,wGAAwG;AACxG,sEAAsE;AACtE,4EAA4E;AAC5E,uGAAuG;AACvG,sGAAsG;AACtG,wHAAwH;AACxH,4EAA4E;AAC5E,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,0JAA0J;AAC1J,qBAAqB;AAErB,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAE3B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAU,CAAC;AAG5E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,SAAS,EAAE,aAAa,CAAU,CAAC;AAGlF,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAU,CAAC;AAI/E,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,SAAS,EAAE,SAAS,CAAU,CAAC;AAG/E,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,GAAG,oCAAoC;IACvC,GAAG,+BAA+B;CAC1B,CAAC;AASX,MAAM,CAAC,MAAM,4BAA4B,GAAwC;IAC/E,GAAG,mBAAmB;IACtB,GAAG,8BAA8B;IACjC,GAAG,4BAA4B;IAC/B,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;CAChE,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEjF,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,mBAAmB,CAAC,QAAQ,CAAC,KAAyB,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,KAAa;IAEb,OAAO,8BAA8B,CAAC,QAAQ,CAAC,KAAuC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,KAAa;IAEb,OAAO,+BAA+B,CAAC,QAAQ,CAAC,KAAyC,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,KAAa;IAEb,OAAO,4BAA4B,CAAC,QAAQ,CAAC,KAAsC,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc,EAAE,SAAiB;IACpE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IACE,kBAAkB,CAAC,OAAO,CAAC;QAC3B,gCAAgC,CAAC,OAAO,CAAC;QACzC,+BAA+B,CAAC,OAAO,CAAC;QACxC,0BAA0B,CAAC,OAAO,CAAC,EACnC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,sBAAsB,yBAAyB,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAc,EACd,SAAiB;IAEjB,OAAO,gCAAgC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAc,EACd,SAAiB;IAEjB,OAAO,gCAAgC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,gCAAgC,CACvC,KAAc,EACd,SAAiB;IAEjB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mDAAmD,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mDAAmD,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,SAAiB;IACrE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,gCAAgC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9E,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,kEAAkE,SAAS,UAAU,KAAK,EAAE,CAC7F,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,UAAoC,EACpC,KAAc,EACd,SAAiB;IAEjB,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,0BAA0B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxE,OAAO,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,+BAA+B,CAAC,UAAU,CAAC,IAAI,0BAA0B,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1F,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,0BAA0B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxE,OAAO,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,OAAgB;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC"}
@@ -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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"}
@@ -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";