@osovv/vv-opencode 1.7.0 → 2.0.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/CHANGELOG.md +25 -0
- package/README.md +22 -2
- package/dist/commands/preset.js +1 -1
- package/dist/commands/preset.js.map +1 -1
- package/dist/index.d.ts +7 -11
- package/dist/index.js +53 -20
- package/dist/index.js.map +1 -1
- package/dist/plugins/analytics/index.d.ts +2 -0
- package/dist/plugins/analytics/index.js +13 -2
- package/dist/plugins/analytics/index.js.map +1 -1
- package/dist/plugins/analytics/v2.d.ts +21 -0
- package/dist/plugins/analytics/v2.js +133 -0
- package/dist/plugins/analytics/v2.js.map +1 -0
- package/dist/plugins/guardian/index.d.ts +46 -0
- package/dist/plugins/guardian/index.js +21 -6
- package/dist/plugins/guardian/index.js.map +1 -1
- package/dist/plugins/guardian/v2.d.ts +13 -0
- package/dist/plugins/guardian/v2.js +161 -0
- package/dist/plugins/guardian/v2.js.map +1 -0
- package/dist/plugins/hashline-edit/index.d.ts +33 -1
- package/dist/plugins/hashline-edit/index.js +38 -14
- package/dist/plugins/hashline-edit/index.js.map +1 -1
- package/dist/plugins/hashline-edit/schemas.d.ts +7 -7
- package/dist/plugins/hashline-edit/v2.d.ts +12 -0
- package/dist/plugins/hashline-edit/v2.js +145 -0
- package/dist/plugins/hashline-edit/v2.js.map +1 -0
- package/dist/plugins/model-roles/index.d.ts +2 -0
- package/dist/plugins/model-roles/index.js +13 -2
- package/dist/plugins/model-roles/index.js.map +1 -1
- package/dist/plugins/model-roles/v2.d.ts +24 -0
- package/dist/plugins/model-roles/v2.js +274 -0
- package/dist/plugins/model-roles/v2.js.map +1 -0
- package/dist/plugins/peak-hours/index.d.ts +2 -0
- package/dist/plugins/peak-hours/index.js +13 -2
- package/dist/plugins/peak-hours/index.js.map +1 -1
- package/dist/plugins/peak-hours/v2.d.ts +12 -0
- package/dist/plugins/peak-hours/v2.js +95 -0
- package/dist/plugins/peak-hours/v2.js.map +1 -0
- package/dist/plugins/secrets-redaction/index.d.ts +7 -0
- package/dist/plugins/secrets-redaction/index.js +17 -4
- package/dist/plugins/secrets-redaction/index.js.map +1 -1
- package/dist/plugins/secrets-redaction/v2.d.ts +14 -0
- package/dist/plugins/secrets-redaction/v2.js +100 -0
- package/dist/plugins/secrets-redaction/v2.js.map +1 -0
- package/dist/plugins/spec-guard/index.d.ts +2 -0
- package/dist/plugins/spec-guard/index.js +13 -2
- package/dist/plugins/spec-guard/index.js.map +1 -1
- package/dist/plugins/spec-guard/v2.d.ts +12 -0
- package/dist/plugins/spec-guard/v2.js +139 -0
- package/dist/plugins/spec-guard/v2.js.map +1 -0
- package/dist/plugins/system-context-injection/agent-contexts.d.ts +5 -0
- package/dist/plugins/system-context-injection/agent-contexts.js +164 -0
- package/dist/plugins/system-context-injection/agent-contexts.js.map +1 -0
- package/dist/plugins/system-context-injection/index.d.ts +2 -0
- package/dist/plugins/system-context-injection/index.js +16 -146
- package/dist/plugins/system-context-injection/index.js.map +1 -1
- package/dist/plugins/system-context-injection/v2.d.ts +13 -0
- package/dist/plugins/system-context-injection/v2.js +60 -0
- package/dist/plugins/system-context-injection/v2.js.map +1 -0
- package/dist/plugins/tool-history-compaction/index.d.ts +2 -0
- package/dist/plugins/tool-history-compaction/index.js +13 -2
- package/dist/plugins/tool-history-compaction/index.js.map +1 -1
- package/dist/plugins/tool-history-compaction/v2.d.ts +11 -0
- package/dist/plugins/tool-history-compaction/v2.js +56 -0
- package/dist/plugins/tool-history-compaction/v2.js.map +1 -0
- package/dist/plugins/v2-runtime/config-watcher.d.ts +26 -0
- package/dist/plugins/v2-runtime/config-watcher.js +111 -0
- package/dist/plugins/v2-runtime/config-watcher.js.map +1 -0
- package/dist/plugins/v2-runtime/index.d.ts +50 -0
- package/dist/plugins/v2-runtime/index.js +114 -0
- package/dist/plugins/v2-runtime/index.js.map +1 -0
- package/dist/plugins/v2-runtime/location-config.d.ts +51 -0
- package/dist/plugins/v2-runtime/location-config.js +91 -0
- package/dist/plugins/v2-runtime/location-config.js.map +1 -0
- package/dist/plugins/v2-runtime/setup.d.ts +48 -0
- package/dist/plugins/v2-runtime/setup.js +174 -0
- package/dist/plugins/v2-runtime/setup.js.map +1 -0
- package/dist/plugins/web-tools/index.d.ts +2 -0
- package/dist/plugins/web-tools/index.js +13 -2
- package/dist/plugins/web-tools/index.js.map +1 -1
- package/dist/plugins/web-tools/v2.d.ts +11 -0
- package/dist/plugins/web-tools/v2.js +99 -0
- package/dist/plugins/web-tools/v2.js.map +1 -0
- package/dist/plugins/workflow/index.d.ts +2 -0
- package/dist/plugins/workflow/index.js +13 -2
- package/dist/plugins/workflow/index.js.map +1 -1
- package/dist/plugins/workflow/results.d.ts +16 -16
- package/dist/plugins/workflow/v2.d.ts +58 -0
- package/dist/plugins/workflow/v2.js +181 -0
- package/dist/plugins/workflow/v2.js.map +1 -0
- package/dist/tui.d.ts +1 -0
- package/dist/tui.js +41 -6
- package/dist/tui.js.map +1 -1
- package/package.json +13 -5
- package/schemas/vvoc/v3.json +1 -1
- package/server.js +7 -0
- package/templates/skills/vv-execute/references/tool-contracts.md +1 -1
- package/tui.js +7 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
// FILE: src/plugins/model-roles/v2.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Resolve vv-role model references through OpenCode v2 replayable agent and model transforms with config-file-driven hot reload.
|
|
5
|
+
// SCOPE: v2 setup only: load the canonical role map for the plugin-load location, rewrite role-referenced agent models inside the agent transform, apply role-referenced top-level model and small_model selections through the model transform default and the built-in title agent, pin each session's model to its role-resolved selection on the first prompt (probe-verified v2 mechanism), watch the project vvoc config and reload both domains on change, and fail closed per reference with a logged error instead of breaking the server.
|
|
6
|
+
// DEPENDS: [@opencode/plugin, src/lib/config-layers.ts, src/lib/model-roles.ts, src/lib/plugin-toggle-config.ts, src/plugins/v2-runtime/setup.ts]
|
|
7
|
+
// LINKS: [M-PLUGIN-MODEL-ROLES, V-M-PLUGIN-MODEL-ROLES, M-MODEL-ROLES, M-PLUGIN-V2-RUNTIME]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// setupModelRolesV2 - Register the role-resolving agent and model transforms with hot reload for one OpenCode v2 plugin context.
|
|
14
|
+
// RoleResolutionState - Captured, replayable inputs for the transforms: role map, default-model reference, and title-model reference.
|
|
15
|
+
// END_MODULE_MAP
|
|
16
|
+
//
|
|
17
|
+
// START_CHANGE_SUMMARY
|
|
18
|
+
// LAST_CHANGE: [C-OPENCODE-V2-MIGRATION T-006 - Ported role resolution onto v2 transforms with restart-free preset switching.]
|
|
19
|
+
// END_CHANGE_SUMMARY
|
|
20
|
+
import { loadVvocConfigForRead } from "../../lib/config-layers.js";
|
|
21
|
+
import { isRoleReference, parseModelSelection, resolveRoleReference, } from "../../lib/model-roles.js";
|
|
22
|
+
import { isVvocPluginEnabled } from "../../lib/plugin-toggle-config.js";
|
|
23
|
+
import { readFile } from "node:fs/promises";
|
|
24
|
+
import { join } from "node:path";
|
|
25
|
+
// END_BLOCK_ROLE_RESOLUTION_STATE
|
|
26
|
+
// START_BLOCK_LOAD_ROLE_RESOLUTION_STATE
|
|
27
|
+
/**
|
|
28
|
+
* Load the role map and the raw OpenCode config model references for one
|
|
29
|
+
* location. Unknown roles or unreadable files degrade to an empty state with
|
|
30
|
+
* a logged warning so the transforms stay registered and inert.
|
|
31
|
+
*/
|
|
32
|
+
async function loadRoleResolutionState(directory) {
|
|
33
|
+
try {
|
|
34
|
+
const read = await loadVvocConfigForRead({
|
|
35
|
+
cwd: directory,
|
|
36
|
+
scope: "effective",
|
|
37
|
+
allowDefault: true,
|
|
38
|
+
});
|
|
39
|
+
if (!isVvocPluginEnabled(read.config, "model-roles")) {
|
|
40
|
+
return {
|
|
41
|
+
roleMap: {},
|
|
42
|
+
defaultModelReference: undefined,
|
|
43
|
+
titleModelReference: undefined,
|
|
44
|
+
agentRoleReferences: {},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const roleMap = {};
|
|
48
|
+
const roles = read.config.roles;
|
|
49
|
+
if (roles && typeof roles === "object" && !Array.isArray(roles)) {
|
|
50
|
+
for (const [role, selection] of Object.entries(roles)) {
|
|
51
|
+
if (typeof selection === "string" && selection.trim()) {
|
|
52
|
+
roleMap[role] = selection.trim();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
let defaultModelReference;
|
|
57
|
+
let titleModelReference;
|
|
58
|
+
const agentRoleReferences = {};
|
|
59
|
+
const projectRoot = read.source.rootDir ?? directory;
|
|
60
|
+
for (const name of ["opencode.json", "opencode.jsonc"]) {
|
|
61
|
+
let text;
|
|
62
|
+
try {
|
|
63
|
+
text = await readFile(join(projectRoot, name), "utf8");
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const parsed = JSON.parse(text.replace(/^\s*\/\/.*$/gm, ""));
|
|
70
|
+
if (typeof parsed.model === "string" && isRoleReference(parsed.model)) {
|
|
71
|
+
defaultModelReference = parsed.model;
|
|
72
|
+
}
|
|
73
|
+
if (typeof parsed.small_model === "string" && isRoleReference(parsed.small_model)) {
|
|
74
|
+
titleModelReference = parsed.small_model;
|
|
75
|
+
}
|
|
76
|
+
const agentMaps = [parsed.agent, parsed.agents];
|
|
77
|
+
for (const agentMap of agentMaps) {
|
|
78
|
+
if (!agentMap || typeof agentMap !== "object" || Array.isArray(agentMap))
|
|
79
|
+
continue;
|
|
80
|
+
for (const [agentName, entry] of Object.entries(agentMap)) {
|
|
81
|
+
const model = entry?.model;
|
|
82
|
+
if (typeof model === "string" && isRoleReference(model)) {
|
|
83
|
+
agentRoleReferences[agentName] = model;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Unreadable project config leaves the references unset.
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { roleMap, defaultModelReference, titleModelReference, agentRoleReferences };
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.warn(`[vvoc][model-roles] state load failed for ${directory}: ${String(error)}`);
|
|
97
|
+
return {
|
|
98
|
+
roleMap: {},
|
|
99
|
+
defaultModelReference: undefined,
|
|
100
|
+
titleModelReference: undefined,
|
|
101
|
+
agentRoleReferences: {},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// END_BLOCK_LOAD_ROLE_RESOLUTION_STATE
|
|
106
|
+
// START_BLOCK_RESOLVE_REFERENCE
|
|
107
|
+
/**
|
|
108
|
+
* Resolve one role reference against the captured role map, failing closed
|
|
109
|
+
* with a logged error that leaves the caller's field untouched.
|
|
110
|
+
*/
|
|
111
|
+
function resolveReferenceOrLog(reference, roleMap, fieldPath) {
|
|
112
|
+
try {
|
|
113
|
+
return resolveRoleReference(reference, roleMap).normalized;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error(`[vvoc][model-roles] ${fieldPath} references an invalid role (${reference}): ${String(error)}`);
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// END_BLOCK_RESOLVE_REFERENCE
|
|
121
|
+
// START_BLOCK_APPLY_AGENT_MODEL
|
|
122
|
+
/**
|
|
123
|
+
* Apply one resolved provider/model selection to an agent draft in the v2
|
|
124
|
+
* Agent.Info object shape. The editor schema rejects plain string models, so
|
|
125
|
+
* the selection is parsed and assigned as { providerID, id } with an optional
|
|
126
|
+
* variant suffix split from the model id.
|
|
127
|
+
*/
|
|
128
|
+
function applyAgentModel(draft, selection, fieldPath) {
|
|
129
|
+
try {
|
|
130
|
+
const parsed = parseModelSelection(selection);
|
|
131
|
+
const variantMatch = /^(.+)#(.+)$/.exec(parsed.model);
|
|
132
|
+
draft.model = variantMatch
|
|
133
|
+
? { providerID: parsed.provider, id: variantMatch[1], variant: variantMatch[2] }
|
|
134
|
+
: { providerID: parsed.provider, id: parsed.model };
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error(`[vvoc][model-roles] ${fieldPath} resolved an unparseable model (${selection}): ${String(error)}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// END_BLOCK_APPLY_AGENT_MODEL
|
|
141
|
+
// START_BLOCK_SETUP_MODEL_ROLES_V2
|
|
142
|
+
/**
|
|
143
|
+
* Register the role-resolving transforms on the v2 runtime.
|
|
144
|
+
*
|
|
145
|
+
* The v1 startup config hook becomes two replayable transforms plus a config
|
|
146
|
+
* watcher: agent transforms rewrite every role-referenced agent model, the
|
|
147
|
+
* model transform applies role-referenced default and title selections read
|
|
148
|
+
* from the raw project config, and vvoc.json changes reload both domains so
|
|
149
|
+
* preset switching takes effect without restarting the shared server.
|
|
150
|
+
*/
|
|
151
|
+
export async function setupModelRolesV2(adapter) {
|
|
152
|
+
const directory = adapter.ctx.location.directory;
|
|
153
|
+
const state = await loadRoleResolutionState(directory);
|
|
154
|
+
const agentRegistration = await adapter.ctx.agent.transform((editor) => {
|
|
155
|
+
for (const agent of editor.list()) {
|
|
156
|
+
const agentId = String(agent.id);
|
|
157
|
+
const rawReference = state.agentRoleReferences[agentId];
|
|
158
|
+
if (rawReference) {
|
|
159
|
+
const resolved = resolveReferenceOrLog(rawReference, state.roleMap, `agent.${agentId}.model`);
|
|
160
|
+
if (resolved) {
|
|
161
|
+
editor.update(agentId, (draft) => {
|
|
162
|
+
applyAgentModel(draft, resolved, `agent.${agentId}.model`);
|
|
163
|
+
});
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const model = agent.model;
|
|
168
|
+
if (typeof model !== "string" || !isRoleReference(model))
|
|
169
|
+
continue;
|
|
170
|
+
const resolved = resolveReferenceOrLog(model, state.roleMap, `agent.${agentId}.model`);
|
|
171
|
+
if (!resolved)
|
|
172
|
+
continue;
|
|
173
|
+
editor.update(agentId, (draft) => {
|
|
174
|
+
applyAgentModel(draft, resolved, `agent.${agentId}.model`);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
if (state.titleModelReference) {
|
|
178
|
+
const title = editor.list().find((agent) => String(agent.id) === "title");
|
|
179
|
+
if (title) {
|
|
180
|
+
const resolved = resolveReferenceOrLog(state.titleModelReference, state.roleMap, "small_model");
|
|
181
|
+
if (resolved) {
|
|
182
|
+
editor.update(String(title.id), (draft) => {
|
|
183
|
+
applyAgentModel(draft, resolved, "small_model");
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
const modelRegistration = await adapter.ctx.model.transform((editor) => {
|
|
190
|
+
if (!state.defaultModelReference)
|
|
191
|
+
return;
|
|
192
|
+
const resolved = resolveReferenceOrLog(state.defaultModelReference, state.roleMap, "model");
|
|
193
|
+
if (!resolved)
|
|
194
|
+
return;
|
|
195
|
+
const [providerID, modelID] = resolved.split("/");
|
|
196
|
+
if (!providerID || !modelID) {
|
|
197
|
+
console.error(`[vvoc][model-roles] resolved model is not provider/model shaped: ${resolved}`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
editor.default.set(providerID, modelID);
|
|
201
|
+
});
|
|
202
|
+
// START_BLOCK_PROMPT_MODEL_APPLICATION
|
|
203
|
+
// Probe-verified on OpenCode v2.0.18: external plugin agent transforms write
|
|
204
|
+
// a plugin-host registry that config-defined agents and session model
|
|
205
|
+
// selection do not read, so role references also apply through the prompt
|
|
206
|
+
// hook: the first prompt of a session pins that session's model to the
|
|
207
|
+
// role-resolved selection, which both restores the v1 behavior and anchors
|
|
208
|
+
// long-running sessions to the preset they started with. Later prompts keep
|
|
209
|
+
// the pinned selection; new sessions resolve against the current role map,
|
|
210
|
+
// which the config watcher refreshes without a server restart.
|
|
211
|
+
const appliedSessions = new Set();
|
|
212
|
+
const promptRegistration = await adapter.ctx.session.hook("prompt", (event) => {
|
|
213
|
+
// Fire-and-forget: awaiting the switch inside admission races the first
|
|
214
|
+
// model dispatch (probe-verified — the awaited form interrupts the
|
|
215
|
+
// request), while the unawaited form lands before dispatch in practice.
|
|
216
|
+
void (async () => {
|
|
217
|
+
try {
|
|
218
|
+
const sessionID = String(event.sessionID);
|
|
219
|
+
if (appliedSessions.has(sessionID))
|
|
220
|
+
return;
|
|
221
|
+
const session = await adapter.ctx.session.get({ sessionID });
|
|
222
|
+
const agent = session?.agent;
|
|
223
|
+
if (typeof agent !== "string" || !agent)
|
|
224
|
+
return;
|
|
225
|
+
const reference = state.agentRoleReferences[agent];
|
|
226
|
+
if (!reference)
|
|
227
|
+
return;
|
|
228
|
+
const resolved = resolveReferenceOrLog(reference, state.roleMap, `agent.${agent}.model`);
|
|
229
|
+
if (!resolved)
|
|
230
|
+
return;
|
|
231
|
+
const parsed = parseModelSelection(resolved);
|
|
232
|
+
const variantMatch = /^(.+)#(.+)$/.exec(parsed.model);
|
|
233
|
+
await adapter.ctx.session.switchModel({
|
|
234
|
+
sessionID: event.sessionID,
|
|
235
|
+
model: {
|
|
236
|
+
providerID: parsed.provider,
|
|
237
|
+
id: variantMatch ? variantMatch[1] : parsed.model,
|
|
238
|
+
...(variantMatch ? { variant: variantMatch[2] } : {}),
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
appliedSessions.add(sessionID);
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
console.warn(`[vvoc][model-roles] prompt model application failed: ${String(error)}`);
|
|
245
|
+
}
|
|
246
|
+
})();
|
|
247
|
+
});
|
|
248
|
+
// END_BLOCK_PROMPT_MODEL_APPLICATION
|
|
249
|
+
const stopWatch = await adapter.watchConfig(directory, () => {
|
|
250
|
+
void (async () => {
|
|
251
|
+
const fresh = await loadRoleResolutionState(directory);
|
|
252
|
+
state.roleMap = fresh.roleMap;
|
|
253
|
+
state.defaultModelReference = fresh.defaultModelReference;
|
|
254
|
+
state.titleModelReference = fresh.titleModelReference;
|
|
255
|
+
state.agentRoleReferences = fresh.agentRoleReferences;
|
|
256
|
+
try {
|
|
257
|
+
await adapter.ctx.agent.reload();
|
|
258
|
+
await adapter.ctx.model.reload();
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
console.warn(`[vvoc][model-roles] reload after config change failed: ${String(error)}`);
|
|
262
|
+
}
|
|
263
|
+
})();
|
|
264
|
+
});
|
|
265
|
+
return async () => {
|
|
266
|
+
stopWatch();
|
|
267
|
+
await promptRegistration.dispose();
|
|
268
|
+
await agentRegistration.dispose();
|
|
269
|
+
await modelRegistration.dispose();
|
|
270
|
+
await modelRegistration.dispose();
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
// END_BLOCK_SETUP_MODEL_ROLES_V2
|
|
274
|
+
//# sourceMappingURL=v2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../src/plugins/model-roles/v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,3 +29,5 @@ export declare function buildHardBlockMessage(providerID: string, peak: ActivePe
|
|
|
29
29
|
*/
|
|
30
30
|
export declare function createPeakHoursPlugin(dependencies?: Partial<PeakHoursPluginDependencies>): Plugin;
|
|
31
31
|
export declare const PeakHoursPlugin: Plugin;
|
|
32
|
+
declare const _default: import("../v2-runtime/index.js").DualPlugin;
|
|
33
|
+
export default _default;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: Block LLM requests whose model provider is in configured peak hours in hard mode, with dynamic off-peak provider suggestions and session-age plus subagent grace; soft mode never mutates messages.
|
|
5
5
|
// SCOPE: Startup vvoc snapshot resolution and peak-hours entry parsing, internal and subagent-like agent exemptions, persisted-session grace lookup, connected provider enumeration with bounded fallback, hard blocking through a chat.params error raised after the user message is persisted, soft pass-through without any server-side message mutation, and fail-open degradation.
|
|
6
|
-
// DEPENDS: [@opencode-ai/plugin, src/lib/config-layers.ts, src/lib/plugin-toggle-config.ts, src/lib/managed-agents.ts, src/lib/peak-hours.ts]
|
|
6
|
+
// DEPENDS: [@opencode-ai/plugin, src/lib/config-layers.ts, src/lib/plugin-toggle-config.ts, src/lib/managed-agents.ts, src/lib/peak-hours.ts, src/plugins/v2-runtime/index.ts]
|
|
7
7
|
// LINKS: [M-PLUGIN-PEAK-HOURS, M-PEAK-HOURS-SCHEDULES, M-PLUGIN-TOGGLE-CONFIG]
|
|
8
8
|
// ROLE: RUNTIME
|
|
9
9
|
// MAP_MODE: EXPORTS
|
|
@@ -15,10 +15,11 @@
|
|
|
15
15
|
// buildHardBlockMessage - Composes the blocking error text with window end, wait, and suggestions.
|
|
16
16
|
// createPeakHoursPlugin - Builds the peak-hours server plugin with injectable dependencies.
|
|
17
17
|
// PeakHoursPlugin - Default production peak-hours server plugin.
|
|
18
|
+
// default - Dual subpath entrypoint: v2 setup() seam plus v1 server() delegating to the named factory.
|
|
18
19
|
// END_MODULE_MAP
|
|
19
20
|
//
|
|
20
21
|
// START_CHANGE_SUMMARY
|
|
21
|
-
// LAST_CHANGE: [DIRECT-FIX - Removed the soft-mode chat.message system-note injection so soft mode passes messages through untouched; peak cost state stays visible through the TUI banner only.]
|
|
22
|
+
// LAST_CHANGE: [C-OPENCODE-V2-MIGRATION T-001 - Added the dual subpath entrypoint so the plugin loads under OpenCode v1 via server() and v2 via setup(). Prior: DIRECT-FIX - Removed the soft-mode chat.message system-note injection so soft mode passes messages through untouched; peak cost state stays visible through the TUI banner only.]
|
|
22
23
|
// END_CHANGE_SUMMARY
|
|
23
24
|
import { loadVvocConfig } from "../../lib/config-layers.js";
|
|
24
25
|
import { MANAGED_SUBAGENT_NAMES } from "../../lib/managed-agents.js";
|
|
@@ -272,4 +273,14 @@ export function createPeakHoursPlugin(dependencies = {}) {
|
|
|
272
273
|
}
|
|
273
274
|
export const PeakHoursPlugin = createPeakHoursPlugin();
|
|
274
275
|
// END_BLOCK_PLUGIN_ENTRY
|
|
276
|
+
// START_BLOCK_DUAL_SUBPATH_ENTRY
|
|
277
|
+
import { defineDualPlugin } from "../v2-runtime/index.js";
|
|
278
|
+
import { createV2Adapter } from "../v2-runtime/setup.js";
|
|
279
|
+
import { setupPeakHoursV2 } from "./v2.js";
|
|
280
|
+
export default defineDualPlugin({
|
|
281
|
+
id: "vvoc.peak-hours",
|
|
282
|
+
v1: PeakHoursPlugin,
|
|
283
|
+
v2: (ctx) => setupPeakHoursV2(createV2Adapter(ctx)),
|
|
284
|
+
});
|
|
285
|
+
// END_BLOCK_DUAL_SUBPATH_ENTRY
|
|
275
286
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/peak-hours/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,iBAAiB;AACjB,wBAAwB;AACxB,iNAAiN;AACjN,0XAA0X;AAC1X,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/peak-hours/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Plugin as V2Plugin } from "@opencode/plugin";
|
|
2
|
+
import type { V2AdapterContext } from "../v2-runtime/setup.js";
|
|
3
|
+
/**
|
|
4
|
+
* Register the peak-hours hook on the v2 runtime.
|
|
5
|
+
*
|
|
6
|
+
* The v1 chat.params post-persist throw becomes the v2 session context hook:
|
|
7
|
+
* the prompt is already admitted, so throwing fails the outgoing model call
|
|
8
|
+
* and surfaces the block as the request error, preserving the v1 semantics.
|
|
9
|
+
* The peak decision reuses the shared pure schedule library with the same
|
|
10
|
+
* internal-agent, subagent, parent-session, and session-age grace rules.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setupPeakHoursV2(adapter: V2AdapterContext): Promise<V2Plugin.Cleanup | void>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// FILE: src/plugins/peak-hours/v2.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Block peak-priced provider requests on the OpenCode v2 runtime with dynamic off-peak suggestions and session-age plus subagent grace.
|
|
5
|
+
// SCOPE: v2 setup only: gate the session context hook on the per-location peak-hours entry, apply internal-agent and known-subagent exemptions plus persisted-session grace, compose the identical hard-block message from the shared pure schedule library, enumerate connected providers through the v2 provider domain, and degrade fail-open on any resolution error.
|
|
6
|
+
// DEPENDS: [@opencode/plugin, src/lib/peak-hours.ts, src/plugins/peak-hours/index.ts, src/plugins/v2-runtime/setup.ts]
|
|
7
|
+
// LINKS: [M-PLUGIN-PEAK-HOURS, V-M-PLUGIN-PEAK-HOURS, M-PEAK-HOURS-SCHEDULES, M-PLUGIN-V2-RUNTIME]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// setupPeakHoursV2 - Register the peak-hours hard-block context hook for one OpenCode v2 plugin context.
|
|
14
|
+
// END_MODULE_MAP
|
|
15
|
+
//
|
|
16
|
+
// START_CHANGE_SUMMARY
|
|
17
|
+
// LAST_CHANGE: [C-OPENCODE-V2-MIGRATION T-003 - Ported peak-hours hard blocking onto the v2 session context hook.]
|
|
18
|
+
// END_CHANGE_SUMMARY
|
|
19
|
+
import { findActivePeak, formatPeakEndTime, normalizeProviderId, parsePeakHoursEntry, suggestOffPeakProviders, } from "../../lib/peak-hours.js";
|
|
20
|
+
import { buildHardBlockMessage } from "./index.js";
|
|
21
|
+
// START_BLOCK_SETUP_PEAK_HOURS_V2
|
|
22
|
+
/**
|
|
23
|
+
* Register the peak-hours hook on the v2 runtime.
|
|
24
|
+
*
|
|
25
|
+
* The v1 chat.params post-persist throw becomes the v2 session context hook:
|
|
26
|
+
* the prompt is already admitted, so throwing fails the outgoing model call
|
|
27
|
+
* and surfaces the block as the request error, preserving the v1 semantics.
|
|
28
|
+
* The peak decision reuses the shared pure schedule library with the same
|
|
29
|
+
* internal-agent, subagent, parent-session, and session-age grace rules.
|
|
30
|
+
*/
|
|
31
|
+
export async function setupPeakHoursV2(adapter) {
|
|
32
|
+
const knownSubagents = new Set();
|
|
33
|
+
const registration = await adapter.ctx.session.hook("context", async (event) => {
|
|
34
|
+
try {
|
|
35
|
+
const providerID = event.model?.providerID;
|
|
36
|
+
if (!providerID)
|
|
37
|
+
return;
|
|
38
|
+
const agent = event.agent;
|
|
39
|
+
if (agent === "compaction" || agent === "title" || agent === "summary")
|
|
40
|
+
return;
|
|
41
|
+
const snapshot = await adapter.resolver.forSession(event.sessionID, (input) => adapter.ctx.session.get(input));
|
|
42
|
+
if (!snapshot)
|
|
43
|
+
return;
|
|
44
|
+
const { entry } = parsePeakHoursEntry(snapshot.config.plugins?.["peak-hours"]);
|
|
45
|
+
if (!entry.enabled)
|
|
46
|
+
return;
|
|
47
|
+
const now = new Date();
|
|
48
|
+
const peak = findActivePeak(now, entry.schedules, providerID);
|
|
49
|
+
if (!peak)
|
|
50
|
+
return;
|
|
51
|
+
const override = entry.schedules[peak.providerKey]?.mode;
|
|
52
|
+
let mode = override ?? entry.mode;
|
|
53
|
+
if (agent && knownSubagents.has(agent))
|
|
54
|
+
mode = "soft";
|
|
55
|
+
if (mode === "hard") {
|
|
56
|
+
const session = (await adapter.ctx.session
|
|
57
|
+
.get({ sessionID: event.sessionID })
|
|
58
|
+
.catch(() => undefined));
|
|
59
|
+
if (!session) {
|
|
60
|
+
mode = "soft";
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const parentID = session.parentID;
|
|
64
|
+
if (typeof parentID === "string" && parentID)
|
|
65
|
+
mode = "soft";
|
|
66
|
+
const created = session.time?.created;
|
|
67
|
+
if (entry.graceActiveSessions &&
|
|
68
|
+
(typeof created === "number" || typeof created === "string") &&
|
|
69
|
+
new Date(created).getTime() < peak.startedAt.getTime()) {
|
|
70
|
+
mode = "soft";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (mode !== "hard")
|
|
75
|
+
return;
|
|
76
|
+
const providersResponse = (await adapter.ctx.provider.list().catch(() => undefined));
|
|
77
|
+
const connected = (providersResponse?.data ?? [])
|
|
78
|
+
.map((provider) => (typeof provider.id === "string" ? provider.id : ""))
|
|
79
|
+
.filter(Boolean);
|
|
80
|
+
const suggestions = suggestOffPeakProviders(now, entry.schedules, connected).filter((candidate) => normalizeProviderId(candidate) !== normalizeProviderId(providerID));
|
|
81
|
+
const message = buildHardBlockMessage(providerID, peak, suggestions);
|
|
82
|
+
console.log(`[peak-hours] hard block applied: provider=${providerID} until=${formatPeakEndTime(peak.endsAt)} session=${String(event.sessionID)}`);
|
|
83
|
+
throw new Error(message);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof Error && error.message.includes("peak")) {
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
console.warn(`[vvoc][peak-hours] context hook failed open: ${String(error)}`);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return () => registration.dispose();
|
|
93
|
+
}
|
|
94
|
+
// END_BLOCK_SETUP_PEAK_HOURS_V2
|
|
95
|
+
//# sourceMappingURL=v2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../src/plugins/peak-hours/v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
+
import { buildPatternSet } from "./patterns.js";
|
|
2
|
+
import { PlaceholderSession } from "./session.js";
|
|
1
3
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
4
|
+
import type { Part } from "@opencode-ai/sdk/client";
|
|
5
|
+
export declare const PLACEHOLDER_PREFIX = "__VVOC_SECRET_";
|
|
6
|
+
export declare function redactMessageParts(parts: Part[], patternSet: ReturnType<typeof buildPatternSet>, session: PlaceholderSession): void;
|
|
2
7
|
export declare const SecretsRedactionPlugin: Plugin;
|
|
8
|
+
declare const _default: import("../v2-runtime/index.js").DualPlugin;
|
|
9
|
+
export default _default;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: OpenCode plugin that redacts secrets from messages before LLM requests and restores them after.
|
|
5
5
|
// SCOPE: Startup vvoc config snapshot use plus 3 hook handlers — chat.messages.transform (text, reasoning, and tool-part state redaction), text.complete, tool.execute.before
|
|
6
|
-
// DEPENDS: src/lib/config-layers.ts, src/lib/plugin-toggle-config.ts, session, engine, patterns, restore, deep, config
|
|
6
|
+
// DEPENDS: src/lib/config-layers.ts, src/lib/plugin-toggle-config.ts, session, engine, patterns, restore, deep, config, src/plugins/v2-runtime/index.ts
|
|
7
7
|
// LINKS: [M-PLUGIN-SECRETS-REDACTION]
|
|
8
8
|
// ROLE: RUNTIME
|
|
9
9
|
// MAP_MODE: EXPORTS
|
|
@@ -11,10 +11,13 @@
|
|
|
11
11
|
//
|
|
12
12
|
// START_MODULE_MAP
|
|
13
13
|
// SecretsRedactionPlugin - main plugin factory function
|
|
14
|
+
// PLACEHOLDER_PREFIX - Stable placeholder prefix shared by the v1 and v2 redaction paths.
|
|
15
|
+
// redactMessageParts - Redacts text, reasoning, and tool-part state of one message in place.
|
|
16
|
+
// default - Dual subpath entrypoint: v2 setup() seam plus v1 server() delegating to the named factory.
|
|
14
17
|
// END_MODULE_MAP
|
|
15
18
|
//
|
|
16
19
|
// START_CHANGE_SUMMARY
|
|
17
|
-
// LAST_CHANGE: [v1.3.0 - Fixed a redaction bypass: tool-part payloads (ToolPart.state input/output/error/metadata) are now deep-redacted in chat.messages.transform; removed the dead msg.info.state path that never matched the SDK message shape.]
|
|
20
|
+
// LAST_CHANGE: [C-OPENCODE-V2-MIGRATION T-001 - Added the dual subpath entrypoint so the plugin loads under OpenCode v1 via server() and v2 via setup(). Prior: v1.3.0 - Fixed a redaction bypass: tool-part payloads (ToolPart.state input/output/error/metadata) are now deep-redacted in chat.messages.transform; removed the dead msg.info.state path that never matched the SDK message shape.]
|
|
18
21
|
// END_CHANGE_SUMMARY
|
|
19
22
|
import { resolveSecretsRedactionRuntimeConfig } from "./config.js";
|
|
20
23
|
import { buildPatternSet } from "./patterns.js";
|
|
@@ -24,7 +27,7 @@ import { redactDeep, restoreDeep } from "./deep.js";
|
|
|
24
27
|
import { PlaceholderSession } from "./session.js";
|
|
25
28
|
import { loadVvocConfig } from "../../lib/config-layers.js";
|
|
26
29
|
import { isVvocPluginEnabled } from "../../lib/plugin-toggle-config.js";
|
|
27
|
-
const PLACEHOLDER_PREFIX = "__VVOC_SECRET_";
|
|
30
|
+
export const PLACEHOLDER_PREFIX = "__VVOC_SECRET_";
|
|
28
31
|
function isTextPart(part) {
|
|
29
32
|
return part.type === "text";
|
|
30
33
|
}
|
|
@@ -34,7 +37,7 @@ function isReasoningPart(part) {
|
|
|
34
37
|
function isToolPart(part) {
|
|
35
38
|
return part.type === "tool";
|
|
36
39
|
}
|
|
37
|
-
function redactMessageParts(parts, patternSet, session) {
|
|
40
|
+
export function redactMessageParts(parts, patternSet, session) {
|
|
38
41
|
for (const part of parts) {
|
|
39
42
|
if (isTextPart(part)) {
|
|
40
43
|
const result = redactText(part.text, patternSet, session);
|
|
@@ -120,4 +123,14 @@ export const SecretsRedactionPlugin = async (ctx) => {
|
|
|
120
123
|
},
|
|
121
124
|
};
|
|
122
125
|
};
|
|
126
|
+
// START_BLOCK_DUAL_SUBPATH_ENTRY
|
|
127
|
+
import { defineDualPlugin } from "../v2-runtime/index.js";
|
|
128
|
+
import { createV2Adapter } from "../v2-runtime/setup.js";
|
|
129
|
+
import { setupSecretsRedactionV2 } from "./v2.js";
|
|
130
|
+
export default defineDualPlugin({
|
|
131
|
+
id: "vvoc.secrets-redaction",
|
|
132
|
+
v1: SecretsRedactionPlugin,
|
|
133
|
+
v2: (ctx) => setupSecretsRedactionV2(createV2Adapter(ctx)),
|
|
134
|
+
});
|
|
135
|
+
// END_BLOCK_DUAL_SUBPATH_ENTRY
|
|
123
136
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,iBAAiB;AACjB,wBAAwB;AACxB,6GAA6G;AAC7G,gLAAgL;AAChL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Plugin as V2Plugin } from "@opencode/plugin";
|
|
2
|
+
import type { V2AdapterContext } from "../v2-runtime/setup.js";
|
|
3
|
+
/**
|
|
4
|
+
* Register the secrets-redaction hooks on the v2 runtime.
|
|
5
|
+
*
|
|
6
|
+
* The v1 experimental.chat.messages.transform becomes the v2 session context
|
|
7
|
+
* hook redacting the mutable request messages (including tool-part state),
|
|
8
|
+
* and the v1 tool.execute.before restore keeps the identical role on the v2
|
|
9
|
+
* tool hook. The v1 experimental.text.complete restore has no v2 equivalent;
|
|
10
|
+
* transient ctx.session.generate results are covered by the generate hook.
|
|
11
|
+
* Pattern configuration resolves per session location, and every handler
|
|
12
|
+
* failure degrades fail-open with a logged warning.
|
|
13
|
+
*/
|
|
14
|
+
export declare function setupSecretsRedactionV2(adapter: V2AdapterContext): Promise<V2Plugin.Cleanup | void>;
|