@osovv/vv-opencode 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +38 -34
  2. package/dist/commands/agent.js +23 -87
  3. package/dist/commands/agent.js.map +1 -1
  4. package/dist/commands/config-validate.d.ts +4 -24
  5. package/dist/commands/config-validate.js +52 -242
  6. package/dist/commands/config-validate.js.map +1 -1
  7. package/dist/commands/doctor.js +10 -9
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/commands/guardian.js +6 -13
  10. package/dist/commands/guardian.js.map +1 -1
  11. package/dist/commands/init.js +11 -15
  12. package/dist/commands/init.js.map +1 -1
  13. package/dist/commands/install.d.ts +1 -16
  14. package/dist/commands/install.js +8 -44
  15. package/dist/commands/install.js.map +1 -1
  16. package/dist/commands/status.js +9 -9
  17. package/dist/commands/status.js.map +1 -1
  18. package/dist/commands/sync.d.ts +1 -1
  19. package/dist/commands/sync.js +8 -10
  20. package/dist/commands/sync.js.map +1 -1
  21. package/dist/lib/opencode.d.ts +19 -52
  22. package/dist/lib/opencode.js +86 -336
  23. package/dist/lib/opencode.js.map +1 -1
  24. package/dist/lib/package.d.ts +2 -0
  25. package/dist/lib/package.js +14 -10
  26. package/dist/lib/package.js.map +1 -1
  27. package/dist/lib/vvoc-config.d.ts +209 -0
  28. package/dist/lib/vvoc-config.js +642 -0
  29. package/dist/lib/vvoc-config.js.map +1 -0
  30. package/dist/lib/vvoc-paths.d.ts +2 -0
  31. package/dist/lib/vvoc-paths.js +9 -3
  32. package/dist/lib/vvoc-paths.js.map +1 -1
  33. package/dist/plugins/guardian/index.js +24 -206
  34. package/dist/plugins/guardian/index.js.map +1 -1
  35. package/dist/plugins/memory/index.js +1 -1
  36. package/dist/plugins/memory/index.js.map +1 -1
  37. package/dist/plugins/memory-store.d.ts +2 -9
  38. package/dist/plugins/memory-store.js +20 -127
  39. package/dist/plugins/memory-store.js.map +1 -1
  40. package/dist/plugins/secrets-redaction/config.d.ts +3 -20
  41. package/dist/plugins/secrets-redaction/config.js +33 -134
  42. package/dist/plugins/secrets-redaction/config.js.map +1 -1
  43. package/dist/plugins/secrets-redaction/engine.js +20 -60
  44. package/dist/plugins/secrets-redaction/engine.js.map +1 -1
  45. package/package.json +3 -1
  46. package/schemas/vvoc/v1.json +94 -0
@@ -1,8 +1,8 @@
1
1
  // FILE: src/plugins/secrets-redaction/engine.ts
2
- // VERSION: 1.0.0
2
+ // VERSION: 1.1.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, match sorting, interval arithmetic, replacement
5
+ // SCOPE: text scanning, overlap resolution, match sorting, and replacement
6
6
  // DEPENDS: session, patterns
7
7
  // LINKS: knowledge-graph://plugins/secrets-redaction
8
8
  // ROLE: RUNTIME
@@ -12,37 +12,11 @@
12
12
  // START_MODULE_MAP
13
13
  // redactText - replaces secrets in text with placeholders, returns changed text + match list
14
14
  // END_MODULE_MAP
15
- function subtractCovered(intervals) {
16
- if (intervals.length === 0)
17
- return [];
18
- intervals.sort((a, b) => a[0] - b[0]);
19
- const result = [];
20
- let currentEnd = intervals[0][0];
21
- for (const [start, end] of intervals) {
22
- if (start > currentEnd) {
23
- result.push([currentEnd, start]);
24
- }
25
- if (end > currentEnd) {
26
- currentEnd = end;
27
- }
28
- }
29
- return result;
30
- }
31
- function insertCovered(intervals, newInterval) {
32
- const merged = [...intervals, newInterval];
33
- merged.sort((a, b) => a[0] - b[0]);
34
- const result = [];
35
- for (const interval of merged) {
36
- if (result.length > 0 && interval[0] <= result[result.length - 1][1]) {
37
- result[result.length - 1][1] = Math.max(result[result.length - 1][1], interval[1]);
38
- }
39
- else {
40
- result.push([...interval]);
41
- }
42
- }
43
- return result;
44
- }
45
- function sortByPositionDesc(rules, text) {
15
+ //
16
+ // START_CHANGE_SUMMARY
17
+ // LAST_CHANGE: [v1.1.0 - Fixed overlap handling so first and wider earlier matches redact correctly instead of being skipped entirely.]
18
+ // END_CHANGE_SUMMARY
19
+ function sortByPositionAsc(rules, text) {
46
20
  const allMatches = [];
47
21
  for (const rule of rules) {
48
22
  const re = new RegExp(rule.pattern.source, rule.pattern.flags.includes("g") ? rule.pattern.flags : `${rule.pattern.flags}g`);
@@ -55,17 +29,23 @@ function sortByPositionDesc(rules, text) {
55
29
  const aStart = a.match.index;
56
30
  const bStart = b.match.index;
57
31
  if (aStart !== bStart)
58
- return bStart - aStart;
32
+ return aStart - bStart;
59
33
  return b.match[0].length - a.match[0].length;
60
34
  });
61
35
  return allMatches.map((x) => ({ rule: x.rule, matches: x.match }));
62
36
  }
37
+ function overlapsSelected(start, selected) {
38
+ const lastSelected = selected[selected.length - 1];
39
+ if (!lastSelected) {
40
+ return false;
41
+ }
42
+ return start < lastSelected.end;
43
+ }
63
44
  export function redactText(input, patternSet, session) {
64
45
  if (!input || patternSet.rules.length === 0) {
65
46
  return { text: input, matches: [] };
66
47
  }
67
- const sorted = sortByPositionDesc(patternSet.rules, input);
68
- const covered = [];
48
+ const sorted = sortByPositionAsc(patternSet.rules, input);
69
49
  const matches = [];
70
50
  for (const { rule, matches: match } of sorted) {
71
51
  const start = match.index;
@@ -74,40 +54,20 @@ export function redactText(input, patternSet, session) {
74
54
  if (patternSet.exclude.has(value.toLowerCase())) {
75
55
  continue;
76
56
  }
77
- const gaps = subtractCovered(covered);
78
- const isInside = gaps.every(([gStart, gEnd]) => start >= gStart && end <= gEnd);
79
- if (isInside)
57
+ if (overlapsSelected(start, matches)) {
80
58
  continue;
59
+ }
81
60
  const placeholder = session.getOrCreatePlaceholder(value, rule.category);
82
61
  matches.push({ start, end, original: value, placeholder, category: rule.category });
83
- const remainingGaps = [];
84
- for (const [gStart, gEnd] of gaps) {
85
- if (start >= gEnd || end <= gStart) {
86
- remainingGaps.push([gStart, gEnd]);
87
- }
88
- else {
89
- if (start > gStart) {
90
- remainingGaps.push([gStart, start]);
91
- }
92
- if (end < gEnd) {
93
- remainingGaps.push([end, gEnd]);
94
- }
95
- }
96
- }
97
- covered.length = 0;
98
- for (const g of remainingGaps) {
99
- insertCovered(covered, g);
100
- }
101
62
  }
102
- const sortedMatches = [...matches].sort((a, b) => a.start - b.start);
103
63
  let result = "";
104
64
  let lastIndex = 0;
105
- for (const m of sortedMatches) {
65
+ for (const m of matches) {
106
66
  result += input.slice(lastIndex, m.start);
107
67
  result += m.placeholder;
108
68
  lastIndex = m.end;
109
69
  }
110
70
  result += input.slice(lastIndex);
111
- return { text: result, matches: sortedMatches };
71
+ return { text: result, matches };
112
72
  }
113
73
  //# sourceMappingURL=engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/plugins/secrets-redaction/engine.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osovv/vv-opencode",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "Portable OpenCode workflow plugins, explicit memory, and CLI tooling.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -25,6 +25,7 @@
25
25
  },
26
26
  "files": [
27
27
  "dist",
28
+ "schemas",
28
29
  "templates",
29
30
  "README.md"
30
31
  ],
@@ -65,6 +66,7 @@
65
66
  "@clack/prompts": "^1.2.0",
66
67
  "@opencode-ai/plugin": "1.3.17",
67
68
  "@opencode-ai/sdk": "1.3.17",
69
+ "ajv": "^8.17.1",
68
70
  "citty": "0.2.2",
69
71
  "jsonc-parser": "3.3.1"
70
72
  },
@@ -0,0 +1,94 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@0.14.0/schemas/vvoc/v1.json",
4
+ "title": "vvoc config",
5
+ "description": "Canonical vvoc configuration document.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["$schema", "version", "guardian", "memory", "secretsRedaction"],
9
+ "properties": {
10
+ "$schema": {
11
+ "type": "string",
12
+ "minLength": 1,
13
+ "description": "Hosted JSON Schema URL for vvoc.json."
14
+ },
15
+ "version": {
16
+ "type": "integer",
17
+ "const": 1
18
+ },
19
+ "guardian": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "required": ["timeoutMs", "approvalRiskThreshold", "reviewToastDurationMs"],
23
+ "properties": {
24
+ "model": { "type": "string", "minLength": 1 },
25
+ "variant": { "type": "string", "minLength": 1 },
26
+ "timeoutMs": { "type": "integer", "minimum": 1 },
27
+ "approvalRiskThreshold": { "type": "integer", "minimum": 0, "maximum": 100 },
28
+ "reviewToastDurationMs": { "type": "integer", "minimum": 1 }
29
+ }
30
+ },
31
+ "memory": {
32
+ "type": "object",
33
+ "additionalProperties": false,
34
+ "required": ["enabled", "defaultSearchLimit"],
35
+ "properties": {
36
+ "enabled": { "type": "boolean" },
37
+ "defaultSearchLimit": { "type": "integer", "minimum": 1 },
38
+ "reviewerModel": { "type": "string", "minLength": 1 },
39
+ "reviewerVariant": { "type": "string", "minLength": 1 }
40
+ }
41
+ },
42
+ "secretsRedaction": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "required": ["enabled", "secret", "ttlMs", "maxMappings", "patterns", "debug"],
46
+ "properties": {
47
+ "enabled": { "type": "boolean" },
48
+ "secret": { "type": "string", "minLength": 1 },
49
+ "ttlMs": { "type": "integer", "minimum": 0 },
50
+ "maxMappings": { "type": "integer", "minimum": 1 },
51
+ "debug": { "type": "boolean" },
52
+ "patterns": {
53
+ "type": "object",
54
+ "additionalProperties": false,
55
+ "required": ["keywords", "regex", "builtin", "exclude"],
56
+ "properties": {
57
+ "keywords": {
58
+ "type": "array",
59
+ "items": {
60
+ "type": "object",
61
+ "additionalProperties": false,
62
+ "required": ["value"],
63
+ "properties": {
64
+ "value": { "type": "string", "minLength": 1 },
65
+ "category": { "type": "string", "minLength": 1 }
66
+ }
67
+ }
68
+ },
69
+ "regex": {
70
+ "type": "array",
71
+ "items": {
72
+ "type": "object",
73
+ "additionalProperties": false,
74
+ "required": ["pattern", "category"],
75
+ "properties": {
76
+ "pattern": { "type": "string", "minLength": 1 },
77
+ "category": { "type": "string", "minLength": 1 }
78
+ }
79
+ }
80
+ },
81
+ "builtin": {
82
+ "type": "array",
83
+ "items": { "type": "string", "minLength": 1 }
84
+ },
85
+ "exclude": {
86
+ "type": "array",
87
+ "items": { "type": "string", "minLength": 1 }
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }