@osovv/vv-opencode 1.1.6 → 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 +24 -0
- package/README.md +59 -2
- 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
|
@@ -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":"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,EAAE;AACF,uBAAuB;AACvB,qJAAqJ;AACrJ,wJAAwJ;AACxJ,qBAAqB;AAmBrB,MAAM,gBAAgB,GAAuD,IAAI,GAAG,CAAC;IACnF,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,wCAAwC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACnF;QACE,MAAM;QACN;YACE,OAAO,EACL,0FAA0F;YAC5F,QAAQ,EAAE,MAAM;SACjB;KACF;IACD,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,4BAA4B,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACrE,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvE,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAC5E,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,2BAA2B,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;IACtF;QACE,cAAc;QACd,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,cAAc,EAAE;KACpF;IACD,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC/E,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAC/E;QACE,cAAc;QACd,EAAE,OAAO,EAAE,sDAAsD,EAAE,QAAQ,EAAE,cAAc,EAAE;KAC9F;IACD,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,uCAAuC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAC5F,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACvE;QACE,WAAW;QACX,EAAE,OAAO,EAAE,gDAAgD,EAAE,QAAQ,EAAE,WAAW,EAAE;KACrF;CACF,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG,OAAO,CAAC;IAEhB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,YAAY,GAAG,IAAI;IACtD,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,YAAY,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAsB;IACpD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAEtD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -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;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// FILE: src/plugins/web-tools/fetch-service.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Build the provider-neutral web_fetch tool: input validation, permission request, provider dispatch, and structured text or attachment results.
|
|
5
|
+
// SCOPE: web_fetch ToolDefinition factory; delegates retrieval and conversion to the native, Spider, and direct Z.AI adapters.
|
|
6
|
+
// DEPENDS: [@opencode-ai/plugin, src/plugins/web-tools/config.ts, src/plugins/web-tools/providers/native-fetch.ts, src/plugins/web-tools/providers/spider.ts, src/plugins/web-tools/providers/zai.ts, src/plugins/web-tools/providers/exa.ts]
|
|
7
|
+
// LINKS: M-WEB-FETCH-SERVICE, M-WEB-NATIVE-FETCH, M-WEB-SPIDER, M-WEB-ZAI, M-WEB-MEDIA-LOADER, M-PLUGIN-WEB-TOOLS
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// WEB_FETCH_DEFAULT_TIMEOUT_SECONDS - Default per-call timeout in seconds.
|
|
14
|
+
// WEB_FETCH_MAX_TIMEOUT_SECONDS - Maximum model-configurable timeout in seconds.
|
|
15
|
+
// createWebFetchTool - Create the web_fetch ToolDefinition bound to a resolved fetch config.
|
|
16
|
+
// END_MODULE_MAP
|
|
17
|
+
//
|
|
18
|
+
// START_CHANGE_SUMMARY
|
|
19
|
+
// LAST_CHANGE: [C-ZAI-DIRECT-WEB-PROVIDERS - Routed canonical web_fetch calls through the explicit-region direct Z.AI reader adapter.]
|
|
20
|
+
// LAST_CHANGE: [v1.0.0 - Initial web_fetch tool service.]
|
|
21
|
+
// END_CHANGE_SUMMARY
|
|
22
|
+
import { tool, } from "@opencode-ai/plugin";
|
|
23
|
+
import { WebProviderError } from "./providers/exa.js";
|
|
24
|
+
import { fetchNative } from "./providers/native-fetch.js";
|
|
25
|
+
import { scrapeSpider } from "./providers/spider.js";
|
|
26
|
+
import { fetchZai } from "./providers/zai.js";
|
|
27
|
+
const z = tool.schema;
|
|
28
|
+
export const WEB_FETCH_DEFAULT_TIMEOUT_SECONDS = 30;
|
|
29
|
+
export const WEB_FETCH_MAX_TIMEOUT_SECONDS = 120;
|
|
30
|
+
// START_BLOCK_RESULT_MAPPING
|
|
31
|
+
function mediaSummary(attachment) {
|
|
32
|
+
const name = attachment.filename ? `\`${attachment.filename}\`` : "the requested resource";
|
|
33
|
+
return `Fetched ${name} as a ${attachment.mime} attachment.`;
|
|
34
|
+
}
|
|
35
|
+
function nativeResult(url, format, outcome) {
|
|
36
|
+
if (outcome.kind === "media") {
|
|
37
|
+
return {
|
|
38
|
+
title: `web_fetch: ${url}`,
|
|
39
|
+
output: mediaSummary(outcome.attachment),
|
|
40
|
+
attachments: [outcome.attachment],
|
|
41
|
+
metadata: { provider: "native", format, status: outcome.status },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
title: `web_fetch: ${url}`,
|
|
46
|
+
output: outcome.content,
|
|
47
|
+
metadata: { provider: "native", format, status: outcome.status },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function spiderResult(url, format, credentialSource, outcome) {
|
|
51
|
+
const metadata = {
|
|
52
|
+
provider: "spider",
|
|
53
|
+
format,
|
|
54
|
+
credentialSource,
|
|
55
|
+
...outcome.metadata,
|
|
56
|
+
};
|
|
57
|
+
if (outcome.kind === "media") {
|
|
58
|
+
return {
|
|
59
|
+
title: `web_fetch: ${url}`,
|
|
60
|
+
output: mediaSummary(outcome.attachment),
|
|
61
|
+
attachments: [outcome.attachment],
|
|
62
|
+
metadata,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return { title: `web_fetch: ${url}`, output: outcome.content, metadata };
|
|
66
|
+
}
|
|
67
|
+
function zaiResult(url, format, region, credentialSource, outcome) {
|
|
68
|
+
const metadata = {
|
|
69
|
+
provider: "zai",
|
|
70
|
+
region,
|
|
71
|
+
format,
|
|
72
|
+
credentialSource,
|
|
73
|
+
...outcome.metadata,
|
|
74
|
+
};
|
|
75
|
+
if (outcome.kind === "media") {
|
|
76
|
+
return {
|
|
77
|
+
title: `web_fetch: ${url}`,
|
|
78
|
+
output: mediaSummary(outcome.attachment),
|
|
79
|
+
attachments: [outcome.attachment],
|
|
80
|
+
metadata,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return { title: `web_fetch: ${url}`, output: outcome.content, metadata };
|
|
84
|
+
}
|
|
85
|
+
// END_BLOCK_RESULT_MAPPING
|
|
86
|
+
/**
|
|
87
|
+
* Create the web_fetch tool bound to the resolved fetch configuration.
|
|
88
|
+
* execute validates http or https schemes, asks permission key web_fetch with patterns [url],
|
|
89
|
+
* routes textual extraction to native, Spider, or direct Z.AI reader, returns media as attachments with a short
|
|
90
|
+
* Markdown summary in the same ToolResult, and reports metadata
|
|
91
|
+
* { provider, format, credentialSource?, status?, durationMs? }.
|
|
92
|
+
* Native fetch requires no credential; Spider and Z.AI validate credentials at execution time
|
|
93
|
+
* with actionable messages naming the environment variable and web.fetch.apiKey.
|
|
94
|
+
*/
|
|
95
|
+
export function createWebFetchTool(resolved) {
|
|
96
|
+
return tool({
|
|
97
|
+
description: "Fetch a known HTTP or HTTPS URL using the configured provider. Returns Markdown, text, raw HTML, or an image/PDF attachment.",
|
|
98
|
+
args: {
|
|
99
|
+
url: z.string().min(1).describe("The HTTP or HTTPS URL to retrieve."),
|
|
100
|
+
format: z
|
|
101
|
+
.enum(["markdown", "text", "html"])
|
|
102
|
+
.default("markdown")
|
|
103
|
+
.describe("Output format for textual resources; defaults to markdown."),
|
|
104
|
+
timeout: z
|
|
105
|
+
.number()
|
|
106
|
+
.positive()
|
|
107
|
+
.max(WEB_FETCH_MAX_TIMEOUT_SECONDS)
|
|
108
|
+
.default(WEB_FETCH_DEFAULT_TIMEOUT_SECONDS)
|
|
109
|
+
.describe("Timeout in seconds, greater than 0 and at most 120."),
|
|
110
|
+
},
|
|
111
|
+
async execute(args, context) {
|
|
112
|
+
let parsedUrl;
|
|
113
|
+
try {
|
|
114
|
+
parsedUrl = new URL(args.url);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
throw new Error("web_fetch requires a valid HTTP or HTTPS URL");
|
|
118
|
+
}
|
|
119
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
120
|
+
throw new Error(`web_fetch supports only HTTP and HTTPS URLs; received ${parsedUrl.protocol || "unknown scheme"}`);
|
|
121
|
+
}
|
|
122
|
+
await context.ask({
|
|
123
|
+
permission: "web_fetch",
|
|
124
|
+
patterns: [args.url],
|
|
125
|
+
always: [],
|
|
126
|
+
metadata: { provider: resolved.provider, format: args.format },
|
|
127
|
+
});
|
|
128
|
+
const timeoutMs = args.timeout * 1000;
|
|
129
|
+
if (resolved.provider === "native") {
|
|
130
|
+
const outcome = await fetchNative({
|
|
131
|
+
url: args.url,
|
|
132
|
+
format: args.format,
|
|
133
|
+
abort: context.abort,
|
|
134
|
+
timeoutMs,
|
|
135
|
+
});
|
|
136
|
+
return nativeResult(args.url, args.format, outcome);
|
|
137
|
+
}
|
|
138
|
+
if (!resolved.credential) {
|
|
139
|
+
throw new WebProviderError(resolved.provider, "MISSING_CREDENTIAL", `missing credential for ${resolved.provider}: set ${resolved.envVar ?? "SPIDER_API_KEY"} or ${resolved.configField ?? "web.fetch.apiKey"}`);
|
|
140
|
+
}
|
|
141
|
+
if (resolved.provider === "zai") {
|
|
142
|
+
if (!resolved.region) {
|
|
143
|
+
throw new Error("web.fetch.region is required when provider is zai");
|
|
144
|
+
}
|
|
145
|
+
const outcome = await fetchZai({
|
|
146
|
+
url: args.url,
|
|
147
|
+
format: args.format,
|
|
148
|
+
region: resolved.region,
|
|
149
|
+
credential: resolved.credential,
|
|
150
|
+
abort: context.abort,
|
|
151
|
+
timeoutMs,
|
|
152
|
+
});
|
|
153
|
+
return zaiResult(args.url, args.format, resolved.region, resolved.credential.source, outcome);
|
|
154
|
+
}
|
|
155
|
+
const outcome = await scrapeSpider({
|
|
156
|
+
url: args.url,
|
|
157
|
+
format: args.format,
|
|
158
|
+
credential: resolved.credential,
|
|
159
|
+
abort: context.abort,
|
|
160
|
+
timeoutMs,
|
|
161
|
+
});
|
|
162
|
+
return spiderResult(args.url, args.format, resolved.credential.source, outcome);
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=fetch-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-service.js","sourceRoot":"","sources":["../../../src/plugins/web-tools/fetch-service.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,iBAAiB;AACjB,wBAAwB;AACxB,4JAA4J;AAC5J,iIAAiI;AACjI,gPAAgP;AAChP,oHAAoH;AACpH,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,6EAA6E;AAC7E,mFAAmF;AACnF,+FAA+F;AAC/F,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,yIAAyI;AACzI,4DAA4D;AAC5D,qBAAqB;AAErB,OAAO,EACL,IAAI,GAIL,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAA2B,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAyB,MAAM,oBAAoB,CAAC;AAErE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;AAEtB,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AACpD,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAIjD,6BAA6B;AAC7B,SAAS,YAAY,CAAC,UAA0B;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC;IAC3F,OAAO,WAAW,IAAI,SAAS,UAAU,CAAC,IAAI,cAAc,CAAC;AAC/D,CAAC;AAED,SAAS,YAAY,CACnB,GAAW,EACX,MAAmB,EACnB,OAA2B;IAE3B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,cAAc,GAAG,EAAE;YAC1B,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;YACxC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;SACjE,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,cAAc,GAAG,EAAE;QAC1B,MAAM,EAAE,OAAO,CAAC,OAAO;QACvB,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;KACjE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,GAAW,EACX,MAAmB,EACnB,gBAAkC,EAClC,OAAsB;IAEtB,MAAM,QAAQ,GAAG;QACf,QAAQ,EAAE,QAAQ;QAClB,MAAM;QACN,gBAAgB;QAChB,GAAG,OAAO,CAAC,QAAQ;KACpB,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,cAAc,GAAG,EAAE;YAC1B,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;YACxC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;YACjC,QAAQ;SACT,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,SAAS,CAChB,GAAW,EACX,MAAmB,EACnB,MAAiC,EACjC,gBAAkC,EAClC,OAAyB;IAEzB,MAAM,QAAQ,GAAG;QACf,QAAQ,EAAE,KAAK;QACf,MAAM;QACN,MAAM;QACN,gBAAgB;QAChB,GAAG,OAAO,CAAC,QAAQ;KACpB,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,cAAc,GAAG,EAAE;YAC1B,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;YACxC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;YACjC,QAAQ;SACT,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC3E,CAAC;AACD,2BAA2B;AAE3B;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgC;IACjE,OAAO,IAAI,CAAC;QACV,WAAW,EACT,8HAA8H;QAChI,IAAI,EAAE;YACJ,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACrE,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;iBAClC,OAAO,CAAC,UAAU,CAAC;iBACnB,QAAQ,CAAC,4DAA4D,CAAC;YACzE,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,GAAG,CAAC,6BAA6B,CAAC;iBAClC,OAAO,CAAC,iCAAiC,CAAC;iBAC1C,QAAQ,CAAC,qDAAqD,CAAC;SACnE;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO;YACzB,IAAI,SAAc,CAAC;YACnB,IAAI,CAAC;gBACH,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CACb,yDAAyD,SAAS,CAAC,QAAQ,IAAI,gBAAgB,EAAE,CAClG,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,UAAU,EAAE,WAAW;gBACvB,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpB,MAAM,EAAE,EAAE;gBACV,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;aAC/D,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACtC,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;oBAChC,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,SAAS;iBACV,CAAC,CAAC;gBACH,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACtD,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACzB,MAAM,IAAI,gBAAgB,CACxB,QAAQ,CAAC,QAAQ,EACjB,oBAAoB,EACpB,0BAA0B,QAAQ,CAAC,QAAQ,SAAS,QAAQ,CAAC,MAAM,IAAI,gBAAgB,OAAO,QAAQ,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAC3I,CAAC;YACJ,CAAC;YACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACrB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;oBAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,SAAS;iBACV,CAAC,CAAC;gBACH,OAAO,SAAS,CACd,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,MAAM,EACX,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,CAAC,MAAM,EAC1B,OAAO,CACR,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;gBACjC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS;aACV,CAAC,CAAC;YACH,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClF,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert an HTML document to GitHub-flavored Markdown.
|
|
3
|
+
* Removes script and style content, keeps links as [text](href),
|
|
4
|
+
* and preserves headings, lists, and code blocks.
|
|
5
|
+
* Returns an empty string for empty or whitespace-only input.
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertHtmlToMarkdown(html: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Extract visible text from an HTML document.
|
|
10
|
+
* Removes script and style content, decodes entities, and collapses whitespace runs.
|
|
11
|
+
* Returns an empty string for empty or whitespace-only input.
|
|
12
|
+
*/
|
|
13
|
+
export declare function convertHtmlToText(html: string): string;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// FILE: src/plugins/web-tools/html-markdown.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Convert HTML locally to Markdown or plain text for the native fetch provider.
|
|
5
|
+
// SCOPE: Turndown-based Markdown conversion and htmlparser2-based text extraction, both stripping script and style content.
|
|
6
|
+
// DEPENDS: [turndown, htmlparser2]
|
|
7
|
+
// LINKS: [M-WEB-HTML-MARKDOWN, M-WEB-NATIVE-FETCH]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// convertHtmlToMarkdown - Convert an HTML document to GitHub-flavored Markdown.
|
|
14
|
+
// convertHtmlToText - Extract visible text from an HTML document.
|
|
15
|
+
// END_MODULE_MAP
|
|
16
|
+
//
|
|
17
|
+
// START_CHANGE_SUMMARY
|
|
18
|
+
// LAST_CHANGE: [v1.0.0 - Initial local HTML to Markdown and text conversion for the native fetch provider.]
|
|
19
|
+
// END_CHANGE_SUMMARY
|
|
20
|
+
import { Parser } from "htmlparser2";
|
|
21
|
+
import TurndownService from "turndown";
|
|
22
|
+
// START_BLOCK_MARKDOWN
|
|
23
|
+
let sharedTurndown;
|
|
24
|
+
function getTurndown() {
|
|
25
|
+
if (!sharedTurndown) {
|
|
26
|
+
sharedTurndown = new TurndownService({
|
|
27
|
+
headingStyle: "atx",
|
|
28
|
+
codeBlockStyle: "fenced",
|
|
29
|
+
bulletListMarker: "-",
|
|
30
|
+
});
|
|
31
|
+
sharedTurndown.remove(["script", "style"]);
|
|
32
|
+
}
|
|
33
|
+
return sharedTurndown;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Convert an HTML document to GitHub-flavored Markdown.
|
|
37
|
+
* Removes script and style content, keeps links as [text](href),
|
|
38
|
+
* and preserves headings, lists, and code blocks.
|
|
39
|
+
* Returns an empty string for empty or whitespace-only input.
|
|
40
|
+
*/
|
|
41
|
+
export function convertHtmlToMarkdown(html) {
|
|
42
|
+
if (!html || html.trim() === "") {
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
return getTurndown().turndown(html).trim();
|
|
46
|
+
}
|
|
47
|
+
// END_BLOCK_MARKDOWN
|
|
48
|
+
// START_BLOCK_TEXT
|
|
49
|
+
/**
|
|
50
|
+
* Extract visible text from an HTML document.
|
|
51
|
+
* Removes script and style content, decodes entities, and collapses whitespace runs.
|
|
52
|
+
* Returns an empty string for empty or whitespace-only input.
|
|
53
|
+
*/
|
|
54
|
+
export function convertHtmlToText(html) {
|
|
55
|
+
if (!html || html.trim() === "") {
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
let text = "";
|
|
59
|
+
let skipDepth = 0;
|
|
60
|
+
const parser = new Parser({
|
|
61
|
+
onopentag(name) {
|
|
62
|
+
if (name === "script" || name === "style") {
|
|
63
|
+
skipDepth += 1;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
ontext(data) {
|
|
67
|
+
if (skipDepth === 0) {
|
|
68
|
+
text += data;
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
onclosetag(name) {
|
|
72
|
+
if (name === "script" || name === "style") {
|
|
73
|
+
skipDepth = Math.max(0, skipDepth - 1);
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
}, { decodeEntities: true });
|
|
77
|
+
parser.write(html);
|
|
78
|
+
parser.end();
|
|
79
|
+
return text.replace(/\s+/g, " ").trim();
|
|
80
|
+
}
|
|
81
|
+
// END_BLOCK_TEXT
|
|
82
|
+
//# sourceMappingURL=html-markdown.js.map
|