@osovv/vv-opencode 1.1.5 → 1.2.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 +33 -0
- package/README.md +72 -9
- package/dist/commands/completion.js +1 -1
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +7 -2
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/patch-provider.d.ts +4 -4
- package/dist/commands/patch-provider.js +7 -6
- package/dist/commands/patch-provider.js.map +1 -1
- package/dist/commands/plugin-list.js +1 -1
- package/dist/commands/plugin-list.js.map +1 -1
- package/dist/commands/plugin-toggle.js +1 -1
- package/dist/commands/plugin-toggle.js.map +1 -1
- package/dist/commands/preset.js +1 -0
- package/dist/commands/preset.js.map +1 -1
- package/dist/commands/role.js +1 -1
- package/dist/commands/role.js.map +1 -1
- package/dist/commands/sync.js +7 -2
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/upgrade.js +1 -1
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-models.js +1 -1
- package/dist/lib/agent-models.js.map +1 -1
- package/dist/lib/managed-agents.js +1 -1
- package/dist/lib/managed-agents.js.map +1 -1
- package/dist/lib/managed-skills.js +1 -1
- package/dist/lib/managed-skills.js.map +1 -1
- package/dist/lib/model-roles.js +1 -1
- package/dist/lib/model-roles.js.map +1 -1
- package/dist/lib/opencode.js +22 -7
- package/dist/lib/opencode.js.map +1 -1
- package/dist/lib/orchestration.js +4 -2
- package/dist/lib/orchestration.js.map +1 -1
- package/dist/lib/plugin-toggle-config.d.ts +1 -1
- package/dist/lib/plugin-toggle-config.js +4 -2
- package/dist/lib/plugin-toggle-config.js.map +1 -1
- package/dist/lib/vvoc-config.d.ts +93 -0
- package/dist/lib/vvoc-config.js +87 -2
- package/dist/lib/vvoc-config.js.map +1 -1
- package/dist/lib/vvoc-preset-registry.js +1 -1
- package/dist/lib/vvoc-preset-registry.js.map +1 -1
- package/dist/plugins/guardian/index.js +44 -6
- package/dist/plugins/guardian/index.js.map +1 -1
- package/dist/plugins/hashline-edit/edit-text-normalization.js +6 -5
- package/dist/plugins/hashline-edit/edit-text-normalization.js.map +1 -1
- package/dist/plugins/hashline-edit/index.js +16 -7
- package/dist/plugins/hashline-edit/index.js.map +1 -1
- package/dist/plugins/hashline-edit/tool-description.d.ts +1 -1
- package/dist/plugins/hashline-edit/tool-description.js +3 -2
- package/dist/plugins/hashline-edit/tool-description.js.map +1 -1
- package/dist/plugins/secrets-redaction/config.d.ts +6 -1
- package/dist/plugins/secrets-redaction/config.js +29 -4
- package/dist/plugins/secrets-redaction/config.js.map +1 -1
- package/dist/plugins/secrets-redaction/engine.js +10 -4
- package/dist/plugins/secrets-redaction/engine.js.map +1 -1
- package/dist/plugins/secrets-redaction/index.js +14 -21
- package/dist/plugins/secrets-redaction/index.js.map +1 -1
- package/dist/plugins/secrets-redaction/patterns.js +3 -3
- package/dist/plugins/secrets-redaction/patterns.js.map +1 -1
- package/dist/plugins/secrets-redaction/session.js +0 -1
- package/dist/plugins/secrets-redaction/session.js.map +1 -1
- package/dist/plugins/web-tools/config.d.ts +43 -0
- package/dist/plugins/web-tools/config.js +134 -0
- package/dist/plugins/web-tools/config.js.map +1 -0
- package/dist/plugins/web-tools/fetch-service.d.ts +14 -0
- package/dist/plugins/web-tools/fetch-service.js +166 -0
- package/dist/plugins/web-tools/fetch-service.js.map +1 -0
- package/dist/plugins/web-tools/html-markdown.d.ts +13 -0
- package/dist/plugins/web-tools/html-markdown.js +82 -0
- package/dist/plugins/web-tools/html-markdown.js.map +1 -0
- package/dist/plugins/web-tools/http.d.ts +34 -0
- package/dist/plugins/web-tools/http.js +154 -0
- package/dist/plugins/web-tools/http.js.map +1 -0
- package/dist/plugins/web-tools/index.d.ts +18 -0
- package/dist/plugins/web-tools/index.js +93 -0
- package/dist/plugins/web-tools/index.js.map +1 -0
- package/dist/plugins/web-tools/media-loader.d.ts +26 -0
- package/dist/plugins/web-tools/media-loader.js +178 -0
- package/dist/plugins/web-tools/media-loader.js.map +1 -0
- package/dist/plugins/web-tools/providers/brave.d.ts +3 -0
- package/dist/plugins/web-tools/providers/brave.js +101 -0
- package/dist/plugins/web-tools/providers/brave.js.map +1 -0
- package/dist/plugins/web-tools/providers/exa.d.ts +28 -0
- package/dist/plugins/web-tools/providers/exa.js +138 -0
- package/dist/plugins/web-tools/providers/exa.js.map +1 -0
- package/dist/plugins/web-tools/providers/native-fetch.d.ts +21 -0
- package/dist/plugins/web-tools/providers/native-fetch.js +112 -0
- package/dist/plugins/web-tools/providers/native-fetch.js.map +1 -0
- package/dist/plugins/web-tools/providers/spider.d.ts +25 -0
- package/dist/plugins/web-tools/providers/spider.js +104 -0
- package/dist/plugins/web-tools/providers/spider.js.map +1 -0
- package/dist/plugins/web-tools/providers/zai.d.ts +33 -0
- package/dist/plugins/web-tools/providers/zai.js +181 -0
- package/dist/plugins/web-tools/providers/zai.js.map +1 -0
- package/dist/plugins/web-tools/search-service.d.ts +18 -0
- package/dist/plugins/web-tools/search-service.js +110 -0
- package/dist/plugins/web-tools/search-service.js.map +1 -0
- package/dist/plugins/workflow/index.js +24 -5
- package/dist/plugins/workflow/index.js.map +1 -1
- package/dist/plugins/workflow/persistence.js +1 -1
- package/dist/plugins/workflow/persistence.js.map +1 -1
- package/dist/plugins/workflow/state.d.ts +14 -0
- package/dist/plugins/workflow/state.js +44 -1
- package/dist/plugins/workflow/state.js.map +1 -1
- package/dist/plugins/workflow/tooling.js +1 -1
- package/dist/plugins/workflow/tooling.js.map +1 -1
- package/dist/tui/context/analyze.js +11 -3
- package/dist/tui/context/analyze.js.map +1 -1
- package/dist/tui/context/collect.js +1 -1
- package/dist/tui/context/collect.js.map +1 -1
- package/dist/tui/context/plugin.js +3 -2
- package/dist/tui/context/plugin.js.map +1 -1
- package/dist/tui.js +1 -1
- package/package.json +15 -8
- package/schemas/vvoc/v3.json +43 -1
- package/templates/skills/vv-execute/SKILL.md +17 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const HASHLINE_EDIT_DESCRIPTION = "Edit files using exact hash-anchored line references from the latest Read output.\n\n<must>\n1. SNAPSHOT: All edits in one call reference the ORIGINAL file state. Do NOT adjust line numbers for prior edits in the same batch \u2014 the system applies them bottom-up automatically.\n2. replace replaces ONE line at pos. It does NOT accept end. For multi-line replacement, use replace_range.\n3. replace_range with pos+end replaces ALL lines FROM pos THROUGH end (BOTH INCLUSIVE). The end line WILL BE replaced. If you set end to a line that belongs to the next function/method/statement, that line is DELETED.\n CORRECT: pos on the first line to replace, end on the LAST line to replace \u2014 not the line after.\n4. lines must contain ONLY the content that belongs inside the replaced range. Lines AFTER end survive unchanged \u2014 do NOT include them in lines. If you do, they will appear twice.\n5. Tags MUST be copied exactly from read output or >>> mismatch output. NEVER guess or reconstruct tags.\n6. Batch = multiple operations in edits[], NOT one big replace covering everything. Each operation targets the smallest possible change.\n7. lines must contain plain replacement text only (no LINE#HASH#ANCHOR| prefixes, no diff + markers).\n8. CRITICAL: Double-quote characters inside lines strings MUST be escaped as \\\". Unescaped \\\" inside a JSON string will break the parser. Example: [\"const x = \\\"hello\\\";\"] \u2014 NOT [\"const x = \"hello\";\"]. Single quotes and backticks do NOT need escaping.\n</must>\n\n<operations>\nANCHOR FORMAT:\n Each anchor is `{line_number}#{hash_id}#{anchor_hash}` from read output like `42#VK#AB|content`.\n Backward-compatible `{line}#{hash}` also accepted.\n\nOPERATION CHOICE:\n replace with pos -> replace ONE line at pos (end is rejected)\n replace_range with pos+end -> replace range pos..end INCLUSIVE (both lines replaced)\n append with pos -> insert lines AFTER the anchored line (use when you need to ADD lines, not replace)\n prepend with pos -> insert lines BEFORE the anchored line\n append/prepend without pos -> EOF/BOF insertion (also creates missing files)\n\nCONTENT FORMAT:\n lines: string (single line) or string[] (multi-line, preferred)\n lines: null or lines: [] with replace -> DELETE those lines\n\nFILE MODES:\n delete=true deletes file and requires edits=[] with no rename\n rename moves final content to a new path and removes old path\n<operations>\n\n<examples>\nGiven this file after read:\n 10#VK#AB|function hello() {\n 11#XJ#CD| console.log(\"hi\");\n 12#MB#EF| console.log(\"bye\");\n 13#QR#GH|} // end of hello()\n\nSingle-line replace (change line 11):\n { op: \"replace\", pos: \"11#XJ#CD\", lines: [\" console.log(\"hello\");\"] }\n Result: line 11 replaced. Lines 10, 12-13 unchanged.\n\nRange replace (replace lines 11-12, function body):\n { op: \"replace_range\", pos: \"11#XJ#CD\", end: \"12#MB#EF\", lines: [\" return \"hello world\";\"] }\n Result: lines 11-12 removed, replaced by 1 new line. Lines 10, 13 unchanged.\n\nBAD - end is one line too far (DELETES closing brace):\n { op: \"replace_range\", pos: \"11#XJ#CD\", end: \"13#QR#GH\", lines: [\" return \"hello world\";\"] }\n Result: line 13 (closing brace) is REPLACED too \u2014 function is broken!\n CORRECT: use end: \"12#MB#EF\" \u2014 only replace lines 11-12, keep line 13 unchanged.\n\nBAD - lines extend past end (DUPLICATES line 13):\n { op: \"replace_range\", pos: \"11#XJ#CD\", end: \"12#MB#EF\", lines: [\" return \"hi\";\", \"}\"] }\n Line 13 is \"}\" which already exists after end. Including it in lines duplicates it.\n CORRECT: { op: \"replace_range\", pos: \"11#XJ#CD\", end: \"12#MB#EF\", lines: [\" return \"hi\";\"] }\n\nAppend after a line (insert between functions):\n { op: \"append\", pos: \"13#QR#GH\", lines: [\"\", \"function added() {\", \" return true;\", \"}\"] }\n Result: 4 lines inserted after line 13. All existing lines unchanged.\n</examples>\n\n<auto>\nBuilt-in autocorrect (you do NOT need to handle these):\n Merged lines are auto-expanded back to original line count.\n Indentation is auto-restored from original lines.\n BOM and CRLF line endings are preserved automatically.\n Hashline prefixes and diff markers in text are auto-stripped.\n Boundary echo lines
|
|
1
|
+
export declare const HASHLINE_EDIT_DESCRIPTION = "Edit files using exact hash-anchored line references from the latest Read output.\n\n<must>\n1. SNAPSHOT: All edits in one call reference the ORIGINAL file state. Do NOT adjust line numbers for prior edits in the same batch \u2014 the system applies them bottom-up automatically.\n2. replace replaces ONE line at pos. It does NOT accept end. For multi-line replacement, use replace_range.\n3. replace_range with pos+end replaces ALL lines FROM pos THROUGH end (BOTH INCLUSIVE). The end line WILL BE replaced. If you set end to a line that belongs to the next function/method/statement, that line is DELETED.\n CORRECT: pos on the first line to replace, end on the LAST line to replace \u2014 not the line after.\n4. lines must contain ONLY the content that belongs inside the replaced range. Lines AFTER end survive unchanged \u2014 do NOT include them in lines. If you do, they will appear twice.\n5. Tags MUST be copied exactly from read output or >>> mismatch output. NEVER guess or reconstruct tags.\n6. Batch = multiple operations in edits[], NOT one big replace covering everything. Each operation targets the smallest possible change.\n7. lines must contain plain replacement text only (no LINE#HASH#ANCHOR| prefixes, no diff + markers).\n8. CRITICAL: Double-quote characters inside lines strings MUST be escaped as \\\". Unescaped \\\" inside a JSON string will break the parser. Example: [\"const x = \\\"hello\\\";\"] \u2014 NOT [\"const x = \"hello\";\"]. Single quotes and backticks do NOT need escaping.\n</must>\n\n<operations>\nANCHOR FORMAT:\n Each anchor is `{line_number}#{hash_id}#{anchor_hash}` from read output like `42#VK#AB|content`.\n Backward-compatible `{line}#{hash}` also accepted.\n\nOPERATION CHOICE:\n replace with pos -> replace ONE line at pos (end is rejected)\n replace_range with pos+end -> replace range pos..end INCLUSIVE (both lines replaced)\n append with pos -> insert lines AFTER the anchored line (use when you need to ADD lines, not replace)\n prepend with pos -> insert lines BEFORE the anchored line\n append/prepend without pos -> EOF/BOF insertion (also creates missing files)\n\nCONTENT FORMAT:\n lines: string (single line) or string[] (multi-line, preferred)\n lines: null or lines: [] with replace -> DELETE those lines\n\nFILE MODES:\n delete=true deletes file and requires edits=[] with no rename\n rename moves final content to a new path and removes old path\n<operations>\n\n<examples>\nGiven this file after read:\n 10#VK#AB|function hello() {\n 11#XJ#CD| console.log(\"hi\");\n 12#MB#EF| console.log(\"bye\");\n 13#QR#GH|} // end of hello()\n\nSingle-line replace (change line 11):\n { op: \"replace\", pos: \"11#XJ#CD\", lines: [\" console.log(\"hello\");\"] }\n Result: line 11 replaced. Lines 10, 12-13 unchanged.\n\nRange replace (replace lines 11-12, function body):\n { op: \"replace_range\", pos: \"11#XJ#CD\", end: \"12#MB#EF\", lines: [\" return \"hello world\";\"] }\n Result: lines 11-12 removed, replaced by 1 new line. Lines 10, 13 unchanged.\n\nBAD - end is one line too far (DELETES closing brace):\n { op: \"replace_range\", pos: \"11#XJ#CD\", end: \"13#QR#GH\", lines: [\" return \"hello world\";\"] }\n Result: line 13 (closing brace) is REPLACED too \u2014 function is broken!\n CORRECT: use end: \"12#MB#EF\" \u2014 only replace lines 11-12, keep line 13 unchanged.\n\nBAD - lines extend past end (DUPLICATES line 13):\n { op: \"replace_range\", pos: \"11#XJ#CD\", end: \"12#MB#EF\", lines: [\" return \"hi\";\", \"}\"] }\n Line 13 is \"}\" which already exists after end. Including it in lines duplicates it.\n CORRECT: { op: \"replace_range\", pos: \"11#XJ#CD\", end: \"12#MB#EF\", lines: [\" return \"hi\";\"] }\n\nAppend after a line (insert between functions):\n { op: \"append\", pos: \"13#QR#GH\", lines: [\"\", \"function added() {\", \" return true;\", \"}\"] }\n Result: 4 lines inserted after line 13. All existing lines unchanged.\n</examples>\n\n<auto>\nBuilt-in autocorrect (you do NOT need to handle these):\n Merged lines are auto-expanded back to original line count.\n Indentation is auto-restored from original lines.\n BOM and CRLF line endings are preserved automatically.\n Hashline prefixes and diff markers in text are auto-stripped.\n Boundary echo lines exactly duplicating adjacent surviving lines are auto-stripped.\n</auto>\n\nRecovery:\n- If you get a hash mismatch error, copy the updated anchors shown in that error or re-read the file before retrying.";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// FILE: src/plugins/hashline-edit/tool-description.ts
|
|
2
|
-
// VERSION: 0.
|
|
2
|
+
// VERSION: 0.6.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: Provide the LLM-facing tool description for the hash-anchored edit override.
|
|
5
5
|
// SCOPE: Stable instructions for read-then-edit workflow, anchor usage, operation choice, and stale-anchor recovery.
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
// HASHLINE_EDIT_DESCRIPTION - Canonical LLM-facing description for the hashline-backed `edit` tool.
|
|
14
14
|
// END_MODULE_MAP
|
|
15
15
|
// START_CHANGE_SUMMARY
|
|
16
|
+
// LAST_CHANGE: [v0.6.0 - Clarified that automatic range-boundary echo stripping applies only to exact adjacent-line duplicates.]
|
|
16
17
|
// LAST_CHANGE: [v0.5.0 - Split replace into replace (single line) and replace_range (range) to prevent accidental end-boundary errors.]
|
|
17
18
|
// END_CHANGE_SUMMARY
|
|
18
19
|
export const HASHLINE_EDIT_DESCRIPTION = `Edit files using exact hash-anchored line references from the latest Read output.
|
|
@@ -86,7 +87,7 @@ Built-in autocorrect (you do NOT need to handle these):
|
|
|
86
87
|
Indentation is auto-restored from original lines.
|
|
87
88
|
BOM and CRLF line endings are preserved automatically.
|
|
88
89
|
Hashline prefixes and diff markers in text are auto-stripped.
|
|
89
|
-
Boundary echo lines
|
|
90
|
+
Boundary echo lines exactly duplicating adjacent surviving lines are auto-stripped.
|
|
90
91
|
</auto>
|
|
91
92
|
|
|
92
93
|
Recovery:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-description.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/tool-description.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,iBAAiB;AACjB,wBAAwB;AACxB,0FAA0F;AAC1F,uHAAuH;AACvH,gBAAgB;AAChB,oCAAoC;AACpC,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,sGAAsG;AACtG,iBAAiB;AACjB,uBAAuB;AACvB,0IAA0I;AAC1I,qBAAqB;AACrB,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sHA2E6E,CAAC"}
|
|
1
|
+
{"version":3,"file":"tool-description.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/tool-description.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,iBAAiB;AACjB,wBAAwB;AACxB,0FAA0F;AAC1F,uHAAuH;AACvH,gBAAgB;AAChB,oCAAoC;AACpC,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,sGAAsG;AACtG,iBAAiB;AACjB,uBAAuB;AACvB,mIAAmI;AACnI,0IAA0I;AAC1I,qBAAqB;AACrB,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sHA2E6E,CAAC"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { type VvocConfigSnapshot } from "../../lib/config-layers.js";
|
|
2
|
-
import { type SecretsRedactionConfig } from "../../lib/vvoc-config.js";
|
|
2
|
+
import { type SecretsRedactionConfig, type VvocConfig } from "../../lib/vvoc-config.js";
|
|
3
3
|
export type { SecretsRedactionConfig };
|
|
4
4
|
export declare const DEFAULT_CONFIG: SecretsRedactionConfig;
|
|
5
|
+
/** Exact-value keyword rules for configured web apiKey fields. Environment credentials are excluded. */
|
|
6
|
+
export declare function webApiKeyKeywordRules(config: VvocConfig): Array<{
|
|
7
|
+
value: string;
|
|
8
|
+
category: "WEB_API_KEY";
|
|
9
|
+
}>;
|
|
5
10
|
export declare function getConfigCandidates(directory: string): Promise<string[]>;
|
|
6
11
|
export declare function resolveSecretsRedactionRuntimeConfig(loaded: Pick<VvocConfigSnapshot, "config" | "source" | "warnings">, env?: NodeJS.ProcessEnv): {
|
|
7
12
|
config: SecretsRedactionConfig;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// FILE: src/plugins/secrets-redaction/config.ts
|
|
2
|
-
// VERSION: 1.
|
|
2
|
+
// VERSION: 1.4.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: Resolve secrets-redaction settings from the shared startup vvoc config snapshot with environment variable substitution.
|
|
5
|
-
// SCOPE: startup vvoc config snapshot consumption, env substitution, fallback defaults
|
|
5
|
+
// SCOPE: startup vvoc config snapshot consumption, env substitution, fallback defaults, and exact-value web apiKey keyword rules
|
|
6
6
|
// DEPENDS: src/lib/config-layers.ts, src/lib/vvoc-config.ts
|
|
7
7
|
// LINKS: knowledge-graph://plugins/secrets-redaction
|
|
8
8
|
// ROLE: RUNTIME
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
//
|
|
12
12
|
// START_MODULE_MAP
|
|
13
13
|
// DEFAULT_CONFIG - Default secrets-redaction section used when vvoc.json is missing or incomplete
|
|
14
|
+
// webApiKeyKeywordRules - returns deduplicated exact-value rules for configured web apiKey fields
|
|
14
15
|
// resolveSecretsRedactionRuntimeConfig - returns normalized config from a loaded vvoc config snapshot
|
|
15
16
|
// loadConfig - backward-compatible wrapper around loadVvocConfig plus resolveSecretsRedactionRuntimeConfig
|
|
16
17
|
// getConfigCandidates - returns the effective vvoc.json path candidate when one is selected
|
|
@@ -18,6 +19,7 @@
|
|
|
18
19
|
// END_MODULE_MAP
|
|
19
20
|
//
|
|
20
21
|
// START_CHANGE_SUMMARY
|
|
22
|
+
// LAST_CHANGE: [C-UNIFIED-WEB-TOOLS - Added exact-value redaction rules for configured web apiKey fields.]
|
|
21
23
|
// LAST_CHANGE: [v1.3.0 - Resolved secrets-redaction settings from the shared startup vvoc config snapshot.]
|
|
22
24
|
// LAST_CHANGE: [v1.2.0 - Loaded secrets-redaction config from the effective vvoc source.]
|
|
23
25
|
// LAST_CHANGE: [v1.1.0 - Switched secrets-redaction config loading to the canonical vvoc.json file.]
|
|
@@ -26,6 +28,19 @@ import { loadVvocConfig, resolveVvocConfigSource, } from "../../lib/config-layer
|
|
|
26
28
|
import { createDefaultSecretsRedactionConfig, } from "../../lib/vvoc-config.js";
|
|
27
29
|
import { generateFallbackSecret } from "./session.js";
|
|
28
30
|
export const DEFAULT_CONFIG = createDefaultSecretsRedactionConfig();
|
|
31
|
+
/** Exact-value keyword rules for configured web apiKey fields. Environment credentials are excluded. */
|
|
32
|
+
export function webApiKeyKeywordRules(config) {
|
|
33
|
+
const rules = [];
|
|
34
|
+
const seen = new Set();
|
|
35
|
+
for (const value of [config.web?.search?.apiKey, config.web?.fetch?.apiKey]) {
|
|
36
|
+
if (typeof value !== "string" || value.length === 0 || seen.has(value)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
seen.add(value);
|
|
40
|
+
rules.push({ value, category: "WEB_API_KEY" });
|
|
41
|
+
}
|
|
42
|
+
return rules;
|
|
43
|
+
}
|
|
29
44
|
function substituteEnvVars(value, env) {
|
|
30
45
|
return value.replace(/\$\{([^}]+)\}/g, (_, varName) => {
|
|
31
46
|
return env[varName] ?? "";
|
|
@@ -42,20 +57,30 @@ export async function getConfigCandidates(directory) {
|
|
|
42
57
|
export function resolveSecretsRedactionRuntimeConfig(loaded, env = process.env) {
|
|
43
58
|
const warnings = [...loaded.warnings];
|
|
44
59
|
let finalSecret = substituteEnvVars(loaded.config.secretsRedaction.secret, env);
|
|
60
|
+
const configured = loaded.config.secretsRedaction;
|
|
61
|
+
const keywordValues = new Set(configured.patterns.keywords.map((rule) => rule.value));
|
|
62
|
+
const webKeywords = webApiKeyKeywordRules(loaded.config).filter((rule) => !keywordValues.has(rule.value));
|
|
63
|
+
const configWithWebKeys = {
|
|
64
|
+
...configured,
|
|
65
|
+
patterns: {
|
|
66
|
+
...configured.patterns,
|
|
67
|
+
keywords: [...configured.patterns.keywords, ...webKeywords],
|
|
68
|
+
},
|
|
69
|
+
};
|
|
45
70
|
if (!finalSecret) {
|
|
46
71
|
finalSecret = generateFallbackSecret();
|
|
47
72
|
warnings.push(`No VVOC_SECRET env var set - using random fallback secret. Secrets will not be reversible across restarts.`);
|
|
48
73
|
}
|
|
49
74
|
if (loaded.source.kind !== "default") {
|
|
50
75
|
return {
|
|
51
|
-
config: { ...
|
|
76
|
+
config: { ...configWithWebKeys, secret: finalSecret },
|
|
52
77
|
path: loaded.source.path ?? null,
|
|
53
78
|
warnings,
|
|
54
79
|
};
|
|
55
80
|
}
|
|
56
81
|
warnings.push(`No vvoc config found - using secrets-redaction defaults with a random secret.`);
|
|
57
82
|
return {
|
|
58
|
-
config: { ...
|
|
83
|
+
config: { ...configWithWebKeys, secret: finalSecret },
|
|
59
84
|
path: null,
|
|
60
85
|
warnings,
|
|
61
86
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/config.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,iBAAiB;AACjB,wBAAwB;AACxB,qIAAqI;AACrI,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// FILE: src/plugins/secrets-redaction/engine.ts
|
|
2
|
-
// VERSION: 1.
|
|
2
|
+
// VERSION: 1.2.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: Core redaction engine — performs find/replace of secrets with placeholders in text.
|
|
5
|
-
// SCOPE: text scanning, overlap resolution, match sorting, and replacement
|
|
5
|
+
// SCOPE: text scanning, overlap resolution, match sorting, zero-width match guard, and replacement
|
|
6
6
|
// DEPENDS: session, patterns
|
|
7
|
-
// LINKS:
|
|
7
|
+
// LINKS: [M-PLUGIN-SECRETS-REDACTION]
|
|
8
8
|
// ROLE: RUNTIME
|
|
9
9
|
// MAP_MODE: EXPORTS
|
|
10
10
|
// END_MODULE_CONTRACT
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
// Match - Regex match result.
|
|
15
15
|
// RedactResult - Overall redaction operation result.
|
|
16
16
|
// END_MODULE_MAP
|
|
17
|
-
// END_MODULE_MAP
|
|
18
17
|
//
|
|
19
18
|
// START_CHANGE_SUMMARY
|
|
19
|
+
// LAST_CHANGE: [v1.2.0 - Guarded the scan loop against zero-width regex matches (lookahead/anchor patterns) to prevent an infinite loop on user-configured patterns.]
|
|
20
20
|
// LAST_CHANGE: [v1.1.0 - Fixed overlap handling so first and wider earlier matches redact correctly instead of being skipped entirely.]
|
|
21
21
|
// END_CHANGE_SUMMARY
|
|
22
22
|
function sortByPositionAsc(rules, text) {
|
|
@@ -25,6 +25,12 @@ function sortByPositionAsc(rules, text) {
|
|
|
25
25
|
const re = new RegExp(rule.pattern.source, rule.pattern.flags.includes("g") ? rule.pattern.flags : `${rule.pattern.flags}g`);
|
|
26
26
|
let match;
|
|
27
27
|
while ((match = re.exec(text)) !== null) {
|
|
28
|
+
if (match[0].length === 0) {
|
|
29
|
+
// Zero-width match: advance manually to avoid an infinite loop; an
|
|
30
|
+
// empty match has nothing to redact, so skip it.
|
|
31
|
+
re.lastIndex += 1;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
28
34
|
allMatches.push({ rule, match: match });
|
|
29
35
|
}
|
|
30
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/engine.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,iBAAiB;AACjB,wBAAwB;AACxB,iGAAiG;AACjG,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
// VERSION: 1.0.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: OpenCode plugin that redacts secrets from messages before LLM requests and restores them after.
|
|
5
|
-
// SCOPE: Startup vvoc config snapshot use plus 3 hook handlers — chat.messages.transform, text.complete, tool.execute.before
|
|
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
6
|
// DEPENDS: src/lib/config-layers.ts, src/lib/plugin-toggle-config.ts, session, engine, patterns, restore, deep, config
|
|
7
|
-
// LINKS:
|
|
7
|
+
// LINKS: [M-PLUGIN-SECRETS-REDACTION]
|
|
8
8
|
// ROLE: RUNTIME
|
|
9
9
|
// MAP_MODE: EXPORTS
|
|
10
10
|
// END_MODULE_CONTRACT
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
// END_MODULE_MAP
|
|
15
15
|
//
|
|
16
16
|
// 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.]
|
|
17
18
|
// LAST_CHANGE: [v1.2.0 - Used the shared startup vvoc config snapshot for plugin toggles and redaction settings.]
|
|
18
19
|
// LAST_CHANGE: [v0.0.0 - Initial GRACE compliance: added missing CHANGE_SUMMARY.]
|
|
19
20
|
// END_CHANGE_SUMMARY
|
|
@@ -32,6 +33,9 @@ function isTextPart(part) {
|
|
|
32
33
|
function isReasoningPart(part) {
|
|
33
34
|
return part.type === "reasoning";
|
|
34
35
|
}
|
|
36
|
+
function isToolPart(part) {
|
|
37
|
+
return part.type === "tool";
|
|
38
|
+
}
|
|
35
39
|
function redactMessageParts(parts, patternSet, session) {
|
|
36
40
|
for (const part of parts) {
|
|
37
41
|
if (isTextPart(part)) {
|
|
@@ -42,22 +46,14 @@ function redactMessageParts(parts, patternSet, session) {
|
|
|
42
46
|
const result = redactText(part.text, patternSet, session);
|
|
43
47
|
part.text = result.text;
|
|
44
48
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (state.output) {
|
|
54
|
-
redactDeep(state.output, patternSet, session);
|
|
55
|
-
}
|
|
56
|
-
if (state.error) {
|
|
57
|
-
redactDeep(state.error, patternSet, session);
|
|
58
|
-
}
|
|
59
|
-
if (state.raw) {
|
|
60
|
-
redactDeep(state.raw, patternSet, session);
|
|
49
|
+
if (isToolPart(part)) {
|
|
50
|
+
// Tool inputs/outputs/errors/metadata are the primary secret vector
|
|
51
|
+
// (file contents from `read`, command output from `bash`, env vars).
|
|
52
|
+
// They live in part.state per the SDK ToolPart shape, not msg.info.state.
|
|
53
|
+
redactDeep(part.state, patternSet, session);
|
|
54
|
+
if (part.metadata) {
|
|
55
|
+
redactDeep(part.metadata, patternSet, session);
|
|
56
|
+
}
|
|
61
57
|
}
|
|
62
58
|
}
|
|
63
59
|
}
|
|
@@ -116,9 +112,6 @@ export const SecretsRedactionPlugin = async (ctx) => {
|
|
|
116
112
|
},
|
|
117
113
|
"experimental.chat.messages.transform": async (_input, output) => {
|
|
118
114
|
for (const msg of output.messages) {
|
|
119
|
-
if (msg.info.role === "assistant") {
|
|
120
|
-
redactAssistantState(msg.info, patternSet, session);
|
|
121
|
-
}
|
|
122
115
|
redactMessageParts(msg.parts, patternSet, session);
|
|
123
116
|
}
|
|
124
117
|
},
|
|
@@ -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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// FILE: src/plugins/secrets-redaction/patterns.ts
|
|
2
|
-
// VERSION: 1.0.
|
|
2
|
+
// VERSION: 1.0.2
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: Builds the internal pattern set from config — keywords, regex rules, and builtin patterns.
|
|
5
5
|
// SCOPE: pattern parsing, normalization, deduplication
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
// PatternSet - Group of related pattern rules.
|
|
17
17
|
// PatternsConfig - Patterns configuration schema.
|
|
18
18
|
// END_MODULE_MAP
|
|
19
|
-
// END_MODULE_MAP
|
|
20
19
|
//
|
|
21
20
|
// START_CHANGE_SUMMARY
|
|
21
|
+
// LAST_CHANGE: [v1.0.2 - Deduplicated combined regex flags so an inline (?i) pattern no longer produces an invalid duplicate flag set at startup.]
|
|
22
22
|
// LAST_CHANGE: [v1.0.1 - Tightened bearer_token lookahead to exclude . _ - after match, preventing false positives on long filenames with extension.]
|
|
23
23
|
// END_CHANGE_SUMMARY
|
|
24
24
|
const BUILTIN_PATTERNS = new Map([
|
|
@@ -69,7 +69,7 @@ function peelFlags(pattern) {
|
|
|
69
69
|
}
|
|
70
70
|
function buildRegex(pattern, defaultFlags = "gi") {
|
|
71
71
|
const { pattern: raw, flags: peeled } = peelFlags(pattern);
|
|
72
|
-
const flags =
|
|
72
|
+
const flags = [...new Set(`${defaultFlags}${peeled}`)].join("");
|
|
73
73
|
return new RegExp(raw, flags);
|
|
74
74
|
}
|
|
75
75
|
export function buildPatternSet(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/patterns.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,iBAAiB;AACjB,wBAAwB;AACxB,wGAAwG;AACxG,yDAAyD;AACzD,uCAAuC;AACvC,uDAAuD;AACvD,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,4DAA4D;AAC5D,6DAA6D;AAC7D,oDAAoD;AACpD,iDAAiD;AACjD,oDAAoD;AACpD,iBAAiB;AACjB,
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
// PlaceholderEntry - Individual placeholder mapping entry.
|
|
18
18
|
// generateFallbackSecret - Generate fallback secret string.
|
|
19
19
|
// END_MODULE_MAP
|
|
20
|
-
// END_MODULE_MAP
|
|
21
20
|
//
|
|
22
21
|
// START_CHANGE_SUMMARY
|
|
23
22
|
// LAST_CHANGE: [v0.0.0 - Initial GRACE compliance: added missing CHANGE_SUMMARY.]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/session.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,iBAAiB;AACjB,wBAAwB;AACxB,4GAA4G;AAC5G,+FAA+F;AAC/F,iDAAiD;AACjD,yBAAyB;AACzB,uDAAuD;AACvD,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,iFAAiF;AACjF,0EAA0E;AAC1E,+DAA+D;AAC/D,6DAA6D;AAC7D,8DAA8D;AAC9D,iBAAiB;AACjB,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { VvocConfigSnapshot } from "../../lib/config-layers.js";
|
|
2
|
+
import type { VvocWebRegion } from "../../lib/vvoc-config.js";
|
|
3
|
+
/** A resolved credential. The value must never be logged or printed. */
|
|
4
|
+
export type WebProviderCredential = {
|
|
5
|
+
value: string;
|
|
6
|
+
source: "env" | "config";
|
|
7
|
+
};
|
|
8
|
+
export type ResolvedWebSearchConfig = {
|
|
9
|
+
provider: "exa" | "brave";
|
|
10
|
+
envVar: "EXA_API_KEY" | "BRAVE_API_KEY";
|
|
11
|
+
configField: "web.search.apiKey";
|
|
12
|
+
credential?: WebProviderCredential;
|
|
13
|
+
} | {
|
|
14
|
+
provider: "zai";
|
|
15
|
+
region: VvocWebRegion;
|
|
16
|
+
envVar: "ZAI_API_KEY";
|
|
17
|
+
configField: "web.search.apiKey";
|
|
18
|
+
credential?: WebProviderCredential;
|
|
19
|
+
};
|
|
20
|
+
export type ResolvedWebFetchConfig = {
|
|
21
|
+
provider: "native" | "spider" | "zai";
|
|
22
|
+
region?: VvocWebRegion;
|
|
23
|
+
envVar?: "SPIDER_API_KEY" | "ZAI_API_KEY";
|
|
24
|
+
configField?: "web.fetch.apiKey";
|
|
25
|
+
credential?: WebProviderCredential;
|
|
26
|
+
};
|
|
27
|
+
export type ResolvedWebConfig = {
|
|
28
|
+
search: ResolvedWebSearchConfig;
|
|
29
|
+
fetch: ResolvedWebFetchConfig;
|
|
30
|
+
/** Non-fatal diagnostics safe to display; never contain key values. */
|
|
31
|
+
warnings: string[];
|
|
32
|
+
};
|
|
33
|
+
/** Injectable command runner for testability. Returns the process exit status. */
|
|
34
|
+
export type CommandRunner = (cmd: string[], cwd: string) => {
|
|
35
|
+
status: number;
|
|
36
|
+
};
|
|
37
|
+
export declare function resolveWebRuntimeConfig(loaded: Pick<VvocConfigSnapshot, "config" | "source" | "warnings">, env?: NodeJS.ProcessEnv): ResolvedWebConfig;
|
|
38
|
+
/**
|
|
39
|
+
* Best-effort warning when a project-layer vvoc config file that stores an apiKey is tracked by git.
|
|
40
|
+
* Returns a warning that names the file, or undefined when there is nothing to warn about.
|
|
41
|
+
* Never includes the key value. Git failures are swallowed and produce no warning.
|
|
42
|
+
*/
|
|
43
|
+
export declare function warnIfSecretBearingProjectConfigTracked(input: Pick<VvocConfigSnapshot, "config" | "source">, run?: CommandRunner): string | undefined;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// FILE: src/plugins/web-tools/config.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Resolve the optional vvoc web section into concrete provider choices, explicit Z.AI regions, and credentials for the web tools plugin.
|
|
5
|
+
// SCOPE: Provider defaults, fail-closed Z.AI region resolution, credential resolution with environment precedence over config apiKey fields, credential source reporting, and a best-effort git-tracked project-config warning helper.
|
|
6
|
+
// DEPENDS: [src/lib/config-layers.ts, src/lib/vvoc-config.ts, node:path]
|
|
7
|
+
// LINKS: [M-WEB-CONFIG, M-PLUGIN-WEB-TOOLS, M-CLI-CONFIG]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// WebProviderCredential - Resolved credential value plus its source (env or config).
|
|
14
|
+
// ResolvedWebSearchConfig - Resolved search provider, credential locations, and credential.
|
|
15
|
+
// ResolvedWebFetchConfig - Resolved fetch provider, credential locations, and credential.
|
|
16
|
+
// ResolvedWebConfig - Resolved search and fetch configuration plus non-fatal warnings.
|
|
17
|
+
// CommandRunner - Injectable command runner used by the git-tracked warning helper.
|
|
18
|
+
// resolveWebRuntimeConfig - Resolves providers and credentials from a vvoc snapshot and environment.
|
|
19
|
+
// warnIfSecretBearingProjectConfigTracked - Best-effort warning when a tracked project config stores an apiKey.
|
|
20
|
+
// END_MODULE_MAP
|
|
21
|
+
//
|
|
22
|
+
// START_CHANGE_SUMMARY
|
|
23
|
+
// LAST_CHANGE: [C-ZAI-DIRECT-WEB-PROVIDERS - Resolved direct Z.AI search and fetch regions with shared ZAI_API_KEY precedence.]
|
|
24
|
+
// LAST_CHANGE: [v1.0.0 - Initial runtime web config and credential resolver for the unified web tools plugin.]
|
|
25
|
+
// END_CHANGE_SUMMARY
|
|
26
|
+
import { basename, dirname } from "node:path";
|
|
27
|
+
const SEARCH_ENV_VARS = {
|
|
28
|
+
exa: "EXA_API_KEY",
|
|
29
|
+
brave: "BRAVE_API_KEY",
|
|
30
|
+
zai: "ZAI_API_KEY",
|
|
31
|
+
};
|
|
32
|
+
// START_BLOCK_CREDENTIAL_RESOLUTION
|
|
33
|
+
function resolveCredential(envValue, configValue) {
|
|
34
|
+
if (typeof envValue === "string" && envValue.length > 0) {
|
|
35
|
+
return { value: envValue, source: "env" };
|
|
36
|
+
}
|
|
37
|
+
if (typeof configValue === "string" && configValue.length > 0) {
|
|
38
|
+
return { value: configValue, source: "config" };
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
function requireZaiRegion(value, field) {
|
|
43
|
+
if (value === "international" || value === "china") {
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
throw new Error(`${field} is required when provider is zai`);
|
|
47
|
+
}
|
|
48
|
+
// END_BLOCK_CREDENTIAL_RESOLUTION
|
|
49
|
+
// START_CONTRACT: resolveWebRuntimeConfig
|
|
50
|
+
// PURPOSE: Resolve providers and credentials from the startup vvoc snapshot.
|
|
51
|
+
// INPUTS: { loaded: vvoc snapshot subset with config, source, warnings; env: process environment override }
|
|
52
|
+
// OUTPUTS: { ResolvedWebConfig - providers default to exa and native; environment wins over config apiKey }
|
|
53
|
+
// SIDE_EFFECTS: none; missing credentials are not resolution-time errors
|
|
54
|
+
// LINKS: M-PLUGIN-WEB-TOOLS
|
|
55
|
+
// END_CONTRACT: resolveWebRuntimeConfig
|
|
56
|
+
export function resolveWebRuntimeConfig(loaded, env = process.env) {
|
|
57
|
+
const web = loaded.config.web;
|
|
58
|
+
const searchProvider = web?.search?.provider ?? "exa";
|
|
59
|
+
const fetchProvider = web?.fetch?.provider ?? "native";
|
|
60
|
+
const search = searchProvider === "zai"
|
|
61
|
+
? {
|
|
62
|
+
provider: "zai",
|
|
63
|
+
region: requireZaiRegion(web?.search?.region, "web.search.region"),
|
|
64
|
+
envVar: "ZAI_API_KEY",
|
|
65
|
+
configField: "web.search.apiKey",
|
|
66
|
+
credential: resolveCredential(env.ZAI_API_KEY, web?.search?.apiKey),
|
|
67
|
+
}
|
|
68
|
+
: {
|
|
69
|
+
provider: searchProvider,
|
|
70
|
+
envVar: SEARCH_ENV_VARS[searchProvider],
|
|
71
|
+
configField: "web.search.apiKey",
|
|
72
|
+
credential: resolveCredential(env[SEARCH_ENV_VARS[searchProvider]], web?.search?.apiKey),
|
|
73
|
+
};
|
|
74
|
+
const fetch = fetchProvider === "zai"
|
|
75
|
+
? {
|
|
76
|
+
provider: "zai",
|
|
77
|
+
region: requireZaiRegion(web?.fetch?.region, "web.fetch.region"),
|
|
78
|
+
envVar: "ZAI_API_KEY",
|
|
79
|
+
configField: "web.fetch.apiKey",
|
|
80
|
+
credential: resolveCredential(env.ZAI_API_KEY, web?.fetch?.apiKey),
|
|
81
|
+
}
|
|
82
|
+
: fetchProvider === "spider"
|
|
83
|
+
? {
|
|
84
|
+
provider: "spider",
|
|
85
|
+
envVar: "SPIDER_API_KEY",
|
|
86
|
+
configField: "web.fetch.apiKey",
|
|
87
|
+
credential: resolveCredential(env.SPIDER_API_KEY, web?.fetch?.apiKey),
|
|
88
|
+
}
|
|
89
|
+
: { provider: "native" };
|
|
90
|
+
return { search, fetch, warnings: [...loaded.warnings] };
|
|
91
|
+
}
|
|
92
|
+
// START_BLOCK_GIT_TRACKED_WARNING
|
|
93
|
+
function defaultCommandRunner(cmd, cwd) {
|
|
94
|
+
try {
|
|
95
|
+
const proc = Bun.spawnSync(cmd, { cwd, stdout: "ignore", stderr: "ignore" });
|
|
96
|
+
return { status: proc.exitCode };
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return { status: 1 };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Best-effort warning when a project-layer vvoc config file that stores an apiKey is tracked by git.
|
|
104
|
+
* Returns a warning that names the file, or undefined when there is nothing to warn about.
|
|
105
|
+
* Never includes the key value. Git failures are swallowed and produce no warning.
|
|
106
|
+
*/
|
|
107
|
+
export function warnIfSecretBearingProjectConfigTracked(input, run = defaultCommandRunner) {
|
|
108
|
+
const source = input.source;
|
|
109
|
+
if (source.kind !== "project") {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const hasApiKey = Boolean(input.config.web?.search?.apiKey || input.config.web?.fetch?.apiKey);
|
|
113
|
+
if (!hasApiKey) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
const configPath = source.path;
|
|
117
|
+
if (!configPath) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
let status = 1;
|
|
121
|
+
try {
|
|
122
|
+
status = run(["git", "ls-files", "--error-unmatch", basename(configPath)], dirname(configPath)).status;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
if (status !== 0) {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
return (`vvoc config ${configPath} stores a web apiKey and is tracked by git; ` +
|
|
131
|
+
"consider moving the key to the global layer or an environment variable.");
|
|
132
|
+
}
|
|
133
|
+
// END_BLOCK_GIT_TRACKED_WARNING
|
|
134
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/plugins/web-tools/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ToolDefinition } from "@opencode-ai/plugin";
|
|
2
|
+
import type { ResolvedWebFetchConfig } from "./config.js";
|
|
3
|
+
export declare const WEB_FETCH_DEFAULT_TIMEOUT_SECONDS = 30;
|
|
4
|
+
export declare const WEB_FETCH_MAX_TIMEOUT_SECONDS = 120;
|
|
5
|
+
/**
|
|
6
|
+
* Create the web_fetch tool bound to the resolved fetch configuration.
|
|
7
|
+
* execute validates http or https schemes, asks permission key web_fetch with patterns [url],
|
|
8
|
+
* routes textual extraction to native, Spider, or direct Z.AI reader, returns media as attachments with a short
|
|
9
|
+
* Markdown summary in the same ToolResult, and reports metadata
|
|
10
|
+
* { provider, format, credentialSource?, status?, durationMs? }.
|
|
11
|
+
* Native fetch requires no credential; Spider and Z.AI validate credentials at execution time
|
|
12
|
+
* with actionable messages naming the environment variable and web.fetch.apiKey.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createWebFetchTool(resolved: ResolvedWebFetchConfig): ToolDefinition;
|