@zigrivers/mmr 1.3.0 → 1.4.1

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 (130) hide show
  1. package/README.md +444 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +4 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/ack.d.ts +11 -0
  6. package/dist/commands/ack.d.ts.map +1 -0
  7. package/dist/commands/ack.js +123 -0
  8. package/dist/commands/ack.js.map +1 -0
  9. package/dist/commands/config.d.ts +5 -0
  10. package/dist/commands/config.d.ts.map +1 -1
  11. package/dist/commands/config.js +248 -14
  12. package/dist/commands/config.js.map +1 -1
  13. package/dist/commands/jobs.d.ts.map +1 -1
  14. package/dist/commands/jobs.js +3 -4
  15. package/dist/commands/jobs.js.map +1 -1
  16. package/dist/commands/reconcile.d.ts.map +1 -1
  17. package/dist/commands/reconcile.js +12 -5
  18. package/dist/commands/reconcile.js.map +1 -1
  19. package/dist/commands/results.d.ts.map +1 -1
  20. package/dist/commands/results.js +13 -5
  21. package/dist/commands/results.js.map +1 -1
  22. package/dist/commands/review.d.ts +25 -0
  23. package/dist/commands/review.d.ts.map +1 -1
  24. package/dist/commands/review.js +459 -44
  25. package/dist/commands/review.js.map +1 -1
  26. package/dist/commands/sessions.d.ts +58 -0
  27. package/dist/commands/sessions.d.ts.map +1 -0
  28. package/dist/commands/sessions.js +266 -0
  29. package/dist/commands/sessions.js.map +1 -0
  30. package/dist/commands/status.d.ts.map +1 -1
  31. package/dist/commands/status.js +2 -3
  32. package/dist/commands/status.js.map +1 -1
  33. package/dist/config/defaults.d.ts +2 -2
  34. package/dist/config/defaults.d.ts.map +1 -1
  35. package/dist/config/defaults.js +76 -0
  36. package/dist/config/defaults.js.map +1 -1
  37. package/dist/config/loader.d.ts +22 -0
  38. package/dist/config/loader.d.ts.map +1 -1
  39. package/dist/config/loader.js +279 -36
  40. package/dist/config/loader.js.map +1 -1
  41. package/dist/config/schema.d.ts +897 -53
  42. package/dist/config/schema.d.ts.map +1 -1
  43. package/dist/config/schema.js +155 -4
  44. package/dist/config/schema.js.map +1 -1
  45. package/dist/core/ack-store.d.ts +109 -0
  46. package/dist/core/ack-store.d.ts.map +1 -0
  47. package/dist/core/ack-store.js +363 -0
  48. package/dist/core/ack-store.js.map +1 -0
  49. package/dist/core/auth.d.ts +10 -1
  50. package/dist/core/auth.d.ts.map +1 -1
  51. package/dist/core/auth.js +106 -35
  52. package/dist/core/auth.js.map +1 -1
  53. package/dist/core/compensator.d.ts +33 -4
  54. package/dist/core/compensator.d.ts.map +1 -1
  55. package/dist/core/compensator.js +120 -15
  56. package/dist/core/compensator.js.map +1 -1
  57. package/dist/core/diff-introspect.d.ts +21 -0
  58. package/dist/core/diff-introspect.d.ts.map +1 -0
  59. package/dist/core/diff-introspect.js +42 -0
  60. package/dist/core/diff-introspect.js.map +1 -0
  61. package/dist/core/dispatcher.d.ts +10 -0
  62. package/dist/core/dispatcher.d.ts.map +1 -1
  63. package/dist/core/dispatcher.js +91 -20
  64. package/dist/core/dispatcher.js.map +1 -1
  65. package/dist/core/git-show.d.ts +31 -0
  66. package/dist/core/git-show.d.ts.map +1 -0
  67. package/dist/core/git-show.js +72 -0
  68. package/dist/core/git-show.js.map +1 -0
  69. package/dist/core/host-isolation.d.ts +24 -0
  70. package/dist/core/host-isolation.d.ts.map +1 -0
  71. package/dist/core/host-isolation.js +107 -0
  72. package/dist/core/host-isolation.js.map +1 -0
  73. package/dist/core/http-dispatcher.d.ts +20 -0
  74. package/dist/core/http-dispatcher.d.ts.map +1 -0
  75. package/dist/core/http-dispatcher.js +125 -0
  76. package/dist/core/http-dispatcher.js.map +1 -0
  77. package/dist/core/job-store.d.ts +7 -1
  78. package/dist/core/job-store.d.ts.map +1 -1
  79. package/dist/core/job-store.js +21 -1
  80. package/dist/core/job-store.js.map +1 -1
  81. package/dist/core/jsonpath.d.ts +15 -0
  82. package/dist/core/jsonpath.d.ts.map +1 -0
  83. package/dist/core/jsonpath.js +63 -0
  84. package/dist/core/jsonpath.js.map +1 -0
  85. package/dist/core/oss-examples.d.ts +18 -0
  86. package/dist/core/oss-examples.d.ts.map +1 -0
  87. package/dist/core/oss-examples.js +66 -0
  88. package/dist/core/oss-examples.js.map +1 -0
  89. package/dist/core/parser.d.ts +8 -3
  90. package/dist/core/parser.d.ts.map +1 -1
  91. package/dist/core/parser.js +157 -6
  92. package/dist/core/parser.js.map +1 -1
  93. package/dist/core/project-root.d.ts +10 -0
  94. package/dist/core/project-root.d.ts.map +1 -0
  95. package/dist/core/project-root.js +23 -0
  96. package/dist/core/project-root.js.map +1 -0
  97. package/dist/core/reconciler.d.ts +1 -1
  98. package/dist/core/reconciler.d.ts.map +1 -1
  99. package/dist/core/reconciler.js +100 -18
  100. package/dist/core/reconciler.js.map +1 -1
  101. package/dist/core/redact.d.ts +17 -0
  102. package/dist/core/redact.d.ts.map +1 -0
  103. package/dist/core/redact.js +140 -0
  104. package/dist/core/redact.js.map +1 -0
  105. package/dist/core/results-pipeline.d.ts +8 -2
  106. package/dist/core/results-pipeline.d.ts.map +1 -1
  107. package/dist/core/results-pipeline.js +50 -3
  108. package/dist/core/results-pipeline.js.map +1 -1
  109. package/dist/core/runtime-probe.d.ts +14 -0
  110. package/dist/core/runtime-probe.d.ts.map +1 -0
  111. package/dist/core/runtime-probe.js +57 -0
  112. package/dist/core/runtime-probe.js.map +1 -0
  113. package/dist/core/stable-id.d.ts +19 -0
  114. package/dist/core/stable-id.d.ts.map +1 -0
  115. package/dist/core/stable-id.js +148 -0
  116. package/dist/core/stable-id.js.map +1 -0
  117. package/dist/core/trust-mode.d.ts +29 -0
  118. package/dist/core/trust-mode.d.ts.map +1 -0
  119. package/dist/core/trust-mode.js +103 -0
  120. package/dist/core/trust-mode.js.map +1 -0
  121. package/dist/formatters/markdown.d.ts.map +1 -1
  122. package/dist/formatters/markdown.js +9 -0
  123. package/dist/formatters/markdown.js.map +1 -1
  124. package/dist/formatters/text.d.ts.map +1 -1
  125. package/dist/formatters/text.js +9 -0
  126. package/dist/formatters/text.js.map +1 -1
  127. package/dist/types.d.ts +44 -1
  128. package/dist/types.d.ts.map +1 -1
  129. package/dist/types.js.map +1 -1
  130. package/package.json +2 -2
@@ -1,3 +1,4 @@
1
+ import { jsonpathGet } from './jsonpath.js';
1
2
  /**
2
3
  * Remove ```json and ``` markdown fence markers from text.
3
4
  */
@@ -46,6 +47,62 @@ export function extractJson(text) {
46
47
  }
47
48
  throw new Error('Unbalanced braces in JSON output');
48
49
  }
50
+ function extractJsonValue(text) {
51
+ let firstUnbalanced;
52
+ for (let start = 0; start < text.length; start++) {
53
+ const opener = text[start];
54
+ if (opener !== '{' && opener !== '[')
55
+ continue;
56
+ try {
57
+ const candidate = extractBalancedJsonValue(text, start);
58
+ JSON.parse(fixTrailingCommas(candidate));
59
+ return candidate;
60
+ }
61
+ catch (err) {
62
+ firstUnbalanced ??= err instanceof Error ? err : new Error(String(err));
63
+ }
64
+ }
65
+ if (firstUnbalanced)
66
+ throw firstUnbalanced;
67
+ throw new Error('No JSON object or array found in output');
68
+ }
69
+ function extractBalancedJsonValue(text, start) {
70
+ const opener = text[start];
71
+ const stack = [];
72
+ let inString = false;
73
+ for (let i = start; i < text.length; i++) {
74
+ const ch = text[i];
75
+ if (inString) {
76
+ if (ch === '\\') {
77
+ i++;
78
+ }
79
+ else if (ch === '"') {
80
+ inString = false;
81
+ }
82
+ continue;
83
+ }
84
+ if (ch === '"') {
85
+ inString = true;
86
+ }
87
+ else if (ch === '{' || ch === '[') {
88
+ stack.push(ch);
89
+ }
90
+ else if (ch === '}' || ch === ']') {
91
+ const expected = ch === '}' ? '{' : '[';
92
+ if (stack.pop() !== expected) {
93
+ throw new Error(`Mismatched JSON delimiters near: ${text.slice(start, i + 1)}`);
94
+ }
95
+ if (stack.length === 0) {
96
+ return text.slice(start, i + 1);
97
+ }
98
+ }
99
+ }
100
+ throw new Error(`Unbalanced ${opener === '{' ? 'braces' : 'brackets'} in JSON output`);
101
+ }
102
+ function parseJsonFromOutput(raw) {
103
+ const text = extractJsonValue(stripMarkdownFences(raw));
104
+ return JSON.parse(fixTrailingCommas(text));
105
+ }
49
106
  /**
50
107
  * Default parser: strips markdown fences, extracts JSON from surrounding text,
51
108
  * fixes trailing commas, then JSON.parse.
@@ -142,22 +199,116 @@ function geminiParser(raw) {
142
199
  return defaultParser(raw);
143
200
  }
144
201
  }
145
- const parsers = {
202
+ function docConformanceParser(raw) {
203
+ try {
204
+ const arr = JSON.parse(raw);
205
+ if (!Array.isArray(arr)) {
206
+ return {
207
+ approved: false,
208
+ findings: [{
209
+ severity: 'P1', location: 'doc-conformance',
210
+ description: 'doc-conformance channel returned valid JSON but not an array — malformed output',
211
+ suggestion: 'Check scaffold observe audit --output-mode=mmr-findings produces a JSON array',
212
+ }],
213
+ summary: 'doc-conformance: output was not a JSON array',
214
+ };
215
+ }
216
+ const findings = arr.map(validateFindingStrict);
217
+ const approved = findings.every((f) => f.severity === 'P2' || f.severity === 'P3');
218
+ const summary = `doc-conformance: ${findings.length} finding(s)${approved ? '' : ' (blocking)'}`;
219
+ return { approved, findings, summary };
220
+ }
221
+ catch {
222
+ return {
223
+ approved: false,
224
+ findings: [{
225
+ severity: 'P1', location: 'doc-conformance',
226
+ description: 'Failed to parse doc-conformance output', suggestion: '',
227
+ }],
228
+ summary: 'doc-conformance: parse error',
229
+ };
230
+ }
231
+ }
232
+ const builtinParsers = {
146
233
  default: defaultParser,
147
234
  gemini: geminiParser,
235
+ 'doc-conformance': docConformanceParser,
148
236
  };
149
237
  /**
150
- * Returns a parser function by name. Falls back to default if name is unknown.
238
+ * Build or look up a parser.
239
+ *
240
+ * String form looks up a built-in parser by name. Object form is intentionally
241
+ * routed through buildParser so structured configs are never silently ignored.
151
242
  */
152
- export function getParser(name) {
153
- return parsers[name] ?? parsers['default'];
243
+ export function getParser(spec) {
244
+ if (typeof spec === 'string') {
245
+ return builtinParsers[spec] ?? builtinParsers['default'];
246
+ }
247
+ return buildParser(spec);
248
+ }
249
+ export function buildParser(spec) {
250
+ if (typeof spec === 'string') {
251
+ return getParser(spec);
252
+ }
253
+ if (spec.kind === 'unwrap-jsonpath') {
254
+ const nextSpec = spec.then ?? 'default';
255
+ const nextParser = getParser(nextSpec);
256
+ return (raw) => {
257
+ const decoded = parseJsonFromOutput(raw);
258
+ const unwrapped = jsonpathGet(decoded, spec.wrap);
259
+ if (unwrapped === undefined) {
260
+ throw new Error(`jsonpath did not match: ${spec.wrap}`);
261
+ }
262
+ const nextRaw = typeof unwrapped === 'string' ? unwrapped : JSON.stringify(unwrapped);
263
+ return nextParser(nextRaw);
264
+ };
265
+ }
266
+ if (spec.kind === 'regex-findings') {
267
+ return (raw) => parseRegexFindings(raw, spec);
268
+ }
269
+ throw new Error(`Unsupported output_parser kind: ${spec.kind}`);
270
+ }
271
+ function parseRegexFindings(raw, spec) {
272
+ const regex = new RegExp(spec.pattern, spec.flags ?? 'gm');
273
+ const findings = [];
274
+ let match;
275
+ while ((match = regex.exec(raw)) !== null) {
276
+ const field = (index) => index === undefined ? undefined : match?.[index];
277
+ const location = field(spec.fields.location);
278
+ const description = field(spec.fields.description);
279
+ if (!location?.trim() || !description?.trim()) {
280
+ throw new Error('regex-findings parser requires non-empty location and description captures');
281
+ }
282
+ const severityValue = field(spec.fields.severity);
283
+ const severity = isSeverity(severityValue) ? severityValue : (spec.default_severity ?? 'P2');
284
+ findings.push({
285
+ id: field(spec.fields.id),
286
+ category: field(spec.fields.category),
287
+ severity,
288
+ location,
289
+ description,
290
+ suggestion: field(spec.fields.suggestion) ?? '',
291
+ });
292
+ if (!regex.global)
293
+ break;
294
+ if (match[0] === '')
295
+ regex.lastIndex += 1;
296
+ }
297
+ return {
298
+ approved: findings.length === 0,
299
+ findings,
300
+ summary: findings.length === 0 ? 'No regex findings.' : `Parsed ${findings.length} regex finding(s).`,
301
+ };
302
+ }
303
+ function isSeverity(value) {
304
+ return value === 'P0' || value === 'P1' || value === 'P2' || value === 'P3';
154
305
  }
155
306
  /**
156
307
  * Wraps getParser in try/catch, returns error finding on parse failure.
157
308
  */
158
- export function parseChannelOutput(raw, parserName) {
309
+ export function parseChannelOutput(raw, parserSpec) {
159
310
  try {
160
- const parser = getParser(parserName);
311
+ const parser = getParser(parserSpec);
161
312
  return parser(raw);
162
313
  }
163
314
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resolve the project root by walking up from `start` until a `.git` entry
3
+ * (the repository root) is found. Falls back to `start` when none is found, so
4
+ * resolution degrades to the current directory rather than failing.
5
+ *
6
+ * This lets project-scoped lookups (e.g. ./.mmr/acks) work when a command is
7
+ * invoked from a subdirectory, instead of resolving relative to process.cwd().
8
+ */
9
+ export declare function findProjectRoot(start?: string): string;
10
+ //# sourceMappingURL=project-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/core/project-root.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,CASrE"}
@@ -0,0 +1,23 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ /**
4
+ * Resolve the project root by walking up from `start` until a `.git` entry
5
+ * (the repository root) is found. Falls back to `start` when none is found, so
6
+ * resolution degrades to the current directory rather than failing.
7
+ *
8
+ * This lets project-scoped lookups (e.g. ./.mmr/acks) work when a command is
9
+ * invoked from a subdirectory, instead of resolving relative to process.cwd().
10
+ */
11
+ export function findProjectRoot(start = process.cwd()) {
12
+ const origin = path.resolve(start);
13
+ let dir = origin;
14
+ for (;;) {
15
+ if (fs.existsSync(path.join(dir, '.git')))
16
+ return dir;
17
+ const parent = path.dirname(dir);
18
+ if (parent === dir)
19
+ return origin;
20
+ dir = parent;
21
+ }
22
+ }
23
+ //# sourceMappingURL=project-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/core/project-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,GAAG,GAAG,MAAM,CAAA;IAChB,SAAS,CAAC;QACR,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,GAAG,CAAA;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,MAAM,CAAA;QACjC,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;AACH,CAAC"}
@@ -4,7 +4,7 @@ import type { Finding, ReconciledFinding, Severity, Verdict, ChannelStatus } fro
4
4
  * consensus scoring.
5
5
  *
6
6
  * 1. Flatten all findings with source attribution
7
- * 2. Group by normalized location
7
+ * 2. Group by stable finding identity
8
8
  * 3. For each group, determine agreement, confidence, and effective severity
9
9
  * 4. Sort by severity (P0 first)
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"reconciler.d.ts","sourceRoot":"","sources":["../../src/core/reconciler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAyB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAetH;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,iBAAiB,EAAE,CA8EzF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,CAGxF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,OAAO,EACnB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAC7C,OAAO,CAcT"}
1
+ {"version":3,"file":"reconciler.d.ts","sourceRoot":"","sources":["../../src/core/reconciler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAyB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAiCtH;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,iBAAiB,EAAE,CA6HzF;AAyDD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,CAGxF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,OAAO,EACnB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAC7C,OAAO,CAcT"}
@@ -1,7 +1,5 @@
1
1
  import { SEVERITY_ORDER } from '../types.js';
2
- function normalizeLocation(location) {
3
- return location.toLowerCase().trim();
4
- }
2
+ import { computeFindingKey, descriptionShingle, jaccardSimilarity, normalizeLocationForKey, normalizeSuggestionForKey, shingleSize, } from './stable-id.js';
5
3
  function higherSeverity(a, b) {
6
4
  return SEVERITY_ORDER[a] <= SEVERITY_ORDER[b] ? a : b;
7
5
  }
@@ -10,33 +8,70 @@ function higherSeverity(a, b) {
10
8
  * consensus scoring.
11
9
  *
12
10
  * 1. Flatten all findings with source attribution
13
- * 2. Group by normalized location
11
+ * 2. Group by stable finding identity
14
12
  * 3. For each group, determine agreement, confidence, and effective severity
15
13
  * 4. Sort by severity (P0 first)
16
14
  */
17
15
  export function reconcile(channelFindings) {
18
- // Step 1: Flatten with source attribution
16
+ // Step 1: Flatten with source attribution and stable identity data
19
17
  const attributed = [];
20
18
  for (const [source, findings] of Object.entries(channelFindings)) {
21
19
  for (const finding of findings) {
22
- attributed.push({ ...finding, source });
20
+ attributed.push({
21
+ ...finding,
22
+ source,
23
+ finding_key: computeFindingKey(finding),
24
+ normalized_location: normalizeLocationForKey(finding.location),
25
+ normalized_category: (finding.category ?? '').toLowerCase(),
26
+ normalized_suggestion: normalizeSuggestionForKey(finding.suggestion),
27
+ shingle: new Set(descriptionShingle(finding.description)),
28
+ });
23
29
  }
24
30
  }
25
31
  if (attributed.length === 0)
26
32
  return [];
27
- // Step 2: Group by normalized location
28
- const groups = new Map();
33
+ attributed.sort(compareAttributedFindings);
34
+ // Step 2: Group by exact stable identity, then location-anchored fuzzy description match.
35
+ const groups = [];
36
+ const keyIndex = new Map();
29
37
  for (const finding of attributed) {
30
- const key = normalizeLocation(finding.location);
31
- const group = groups.get(key) ?? [];
32
- group.push(finding);
33
- groups.set(key, group);
38
+ // Multiple groups can share a finding_key because location normalization
39
+ // strips line spans. Keep same-source findings at different raw locations
40
+ // separate, then join later channels to the compatible raw-location group.
41
+ const exact = bestJoinableGroup((keyIndex.get(finding.finding_key) ?? [])
42
+ .filter((group) => canJoinGroup(group, finding)), finding);
43
+ if (exact !== undefined) {
44
+ exact.findings.push(finding);
45
+ continue;
46
+ }
47
+ const fuzzy = bestJoinableGroup(groups.filter((group) => canJoinGroup(group, finding) &&
48
+ group.normalized_location === finding.normalized_location &&
49
+ canFuzzyJoinGroup(group, finding) &&
50
+ shingleSize(group.shingle) > 0 &&
51
+ shingleSize(finding.shingle) > 0 &&
52
+ jaccardSimilarity(group.shingle, finding.shingle) >= 0.7), finding);
53
+ if (fuzzy !== undefined) {
54
+ fuzzy.findings.push(finding);
55
+ addToKeyIndex(keyIndex, finding.finding_key, fuzzy);
56
+ continue;
57
+ }
58
+ const group = {
59
+ finding_key: finding.finding_key,
60
+ normalized_location: finding.normalized_location,
61
+ normalized_category: finding.normalized_category,
62
+ normalized_suggestion: finding.normalized_suggestion,
63
+ shingle: finding.shingle,
64
+ findings: [finding],
65
+ };
66
+ groups.push(group);
67
+ addToKeyIndex(keyIndex, finding.finding_key, group);
34
68
  }
35
69
  // Step 3: Reconcile each group
36
70
  const results = [];
37
- for (const group of groups.values()) {
38
- const sources = [...new Set(group.map((f) => f.source))];
39
- const severities = [...new Set(group.map((f) => f.severity))];
71
+ for (const group of groups) {
72
+ const findings = group.findings;
73
+ const sources = [...new Set(findings.map((f) => f.source))];
74
+ const severities = [...new Set(findings.map((f) => f.severity))];
40
75
  const effectiveSeverity = severities.reduce(higherSeverity);
41
76
  let agreement;
42
77
  let confidence;
@@ -61,7 +96,7 @@ export function reconcile(channelFindings) {
61
96
  : 'medium';
62
97
  }
63
98
  // Use the finding with the longest description as representative (deterministic)
64
- const representative = group.reduce((best, current) => current.description.length > best.description.length ? current : best);
99
+ const representative = findings.reduce((best, current) => current.description.length > best.description.length ? current : best);
65
100
  results.push({
66
101
  severity: effectiveSeverity,
67
102
  location: representative.location,
@@ -72,10 +107,14 @@ export function reconcile(channelFindings) {
72
107
  confidence,
73
108
  sources,
74
109
  agreement,
110
+ finding_key: representative.finding_key,
111
+ description_shingle: [...representative.shingle],
75
112
  });
76
113
  }
77
114
  // Step 4: Sort by severity (P0 first)
78
- results.sort((a, b) => SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity]);
115
+ results.sort((a, b) => SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity] ||
116
+ (a.finding_key ?? '').localeCompare(b.finding_key ?? '') ||
117
+ a.location.localeCompare(b.location));
79
118
  // Auto-generate finding IDs (only backfill when absent)
80
119
  results.forEach((f, i) => {
81
120
  if (!f.id) {
@@ -84,13 +123,56 @@ export function reconcile(channelFindings) {
84
123
  });
85
124
  return results;
86
125
  }
126
+ function compareAttributedFindings(a, b) {
127
+ return a.finding_key.localeCompare(b.finding_key) ||
128
+ a.source.localeCompare(b.source) ||
129
+ a.location.localeCompare(b.location) ||
130
+ a.description.localeCompare(b.description) ||
131
+ a.suggestion.localeCompare(b.suggestion);
132
+ }
133
+ function canJoinGroup(group, finding) {
134
+ return group.findings.every((existing) => existing.source !== finding.source || existing.location === finding.location);
135
+ }
136
+ function canFuzzyJoinGroup(group, finding) {
137
+ if (group.findings.some((existing) => existing.location === finding.location)) {
138
+ return true;
139
+ }
140
+ return group.normalized_category === finding.normalized_category &&
141
+ group.normalized_suggestion === finding.normalized_suggestion;
142
+ }
143
+ function bestJoinableGroup(groups, finding) {
144
+ const eligible = [...groups].sort((a, b) => compareGroupsForFinding(a, b, finding));
145
+ return eligible.find((group) => group.findings.some((existing) => existing.location === finding.location)) ?? eligible[0];
146
+ }
147
+ function compareGroupsForFinding(a, b, finding) {
148
+ return groupMatchScore(b, finding) - groupMatchScore(a, finding) ||
149
+ a.finding_key.localeCompare(b.finding_key) ||
150
+ a.normalized_location.localeCompare(b.normalized_location);
151
+ }
152
+ function groupMatchScore(group, finding) {
153
+ let score = 0;
154
+ if (group.normalized_category === finding.normalized_category)
155
+ score += 1;
156
+ if (group.normalized_suggestion === finding.normalized_suggestion)
157
+ score += 1;
158
+ return score;
159
+ }
160
+ function addToKeyIndex(keyIndex, findingKey, group) {
161
+ const groups = keyIndex.get(findingKey);
162
+ if (groups === undefined) {
163
+ keyIndex.set(findingKey, [group]);
164
+ }
165
+ else if (!groups.includes(group)) {
166
+ groups.push(group);
167
+ }
168
+ }
87
169
  /**
88
170
  * Evaluate the quality gate: passes if no finding has severity at or above
89
171
  * the threshold (i.e., no finding with SEVERITY_ORDER <= threshold order).
90
172
  */
91
173
  export function evaluateGate(findings, threshold) {
92
174
  const thresholdOrder = SEVERITY_ORDER[threshold];
93
- return findings.every((f) => SEVERITY_ORDER[f.severity] > thresholdOrder);
175
+ return findings.every((f) => f.acknowledged === true || SEVERITY_ORDER[f.severity] > thresholdOrder);
94
176
  }
95
177
  /**
96
178
  * Derive the review verdict from gate evaluation and channel health.
@@ -1 +1 @@
1
- {"version":3,"file":"reconciler.js","sourceRoot":"","sources":["../../src/core/reconciler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reconciler.js","sourceRoot":"","sources":["../../src/core/reconciler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare function isSecretKey(name: string, options?: {
2
+ exemptEnvNameKeys?: boolean;
3
+ }): boolean;
4
+ /**
5
+ * Return a new record with secret-keyed values replaced by `<redacted>`.
6
+ * Non-secret keys pass through unchanged.
7
+ */
8
+ export declare function redactRecord(input: Record<string, unknown> | undefined, options?: {
9
+ exemptEnvNameKeys?: boolean;
10
+ }): Record<string, unknown>;
11
+ /**
12
+ * Return a shallow copy of `channel` with `env` and `headers` redacted via
13
+ * `redactRecord`. `api_key_env` (the env-var NAME, not its value) is preserved
14
+ * as-is because the name is non-secret and useful for debugging.
15
+ */
16
+ export declare function redactChannel(channel: Record<string, unknown>): Record<string, unknown>;
17
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/core/redact.ts"],"names":[],"mappings":"AA+BA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAShG;AAQD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB;AAyED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEvF"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Key parts whose VALUE should be redacted in any introspection output.
3
+ * Deliberately broad, but separator-aware: `api_key` is secret-like while
4
+ * harmless words such as `tokenizer`, `monkey`, or `author` are not.
5
+ * The top-level channel field `api_key_env` is intentionally non-secret (it
6
+ * stores the env-var name, not its value), but the same key inside env/headers
7
+ * records still carries a value and is redacted there.
8
+ */
9
+ const SECRET_KEY_PARTS = new Set([
10
+ 'auth',
11
+ 'authorization',
12
+ 'cookie',
13
+ 'cred',
14
+ 'credentials',
15
+ 'creds',
16
+ 'credential',
17
+ 'apikey',
18
+ 'pass',
19
+ 'passphrase',
20
+ 'passwd',
21
+ 'password',
22
+ 'secret',
23
+ 'session',
24
+ 'sid',
25
+ 'signature',
26
+ 'token',
27
+ ]);
28
+ const NON_SECRET_ENV_NAME_KEYS = new Set(['api_key_env']);
29
+ const KEY_PART_RE = /[_.-]+|(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/;
30
+ const SENSITIVE_KEY_CONTEXT_PARTS = new Set(['api', 'openai', 'private', 'access']);
31
+ export function isSecretKey(name, options = {}) {
32
+ const cleanName = name.replace(/^['"]|['"]$/g, '');
33
+ const normalized = cleanName.toLowerCase();
34
+ if (options.exemptEnvNameKeys !== false && NON_SECRET_ENV_NAME_KEYS.has(normalized))
35
+ return false;
36
+ const parts = cleanName.split(KEY_PART_RE).map((part) => part.toLowerCase());
37
+ if (parts.some((part) => SECRET_KEY_PARTS.has(part)))
38
+ return true;
39
+ if (!parts.includes('key'))
40
+ return false;
41
+ if (parts.length === 1)
42
+ return true;
43
+ return parts.some((part) => SENSITIVE_KEY_CONTEXT_PARTS.has(part));
44
+ }
45
+ function redactValue(value, options) {
46
+ if (Array.isArray(value))
47
+ return redactList(value, options);
48
+ if (value && typeof value === 'object')
49
+ return redactRecord(value, options);
50
+ return value;
51
+ }
52
+ /**
53
+ * Return a new record with secret-keyed values replaced by `<redacted>`.
54
+ * Non-secret keys pass through unchanged.
55
+ */
56
+ export function redactRecord(input, options = {}) {
57
+ if (!input)
58
+ return {};
59
+ const out = {};
60
+ for (const [k, v] of Object.entries(input)) {
61
+ out[k] = isSecretKey(k, options) ? '<redacted>' : redactValue(v, { ...options, exemptEnvNameKeys: false });
62
+ }
63
+ return out;
64
+ }
65
+ function redactKeyValueString(input) {
66
+ const match = /^(\s*)([^:=\s]+)(\s*[:=]\s*)(.*)$/.exec(input);
67
+ if (!match)
68
+ return isSecretKey(input.trim(), { exemptEnvNameKeys: false }) ? '<redacted>' : input;
69
+ const [, leading, key, separator, value] = match;
70
+ if (isSecretKey(key, { exemptEnvNameKeys: false }) || containsNestedSecretKeyValue(value)) {
71
+ return `${leading}${key}${separator}<redacted>`;
72
+ }
73
+ return `${leading}${key}${separator}${value}`;
74
+ }
75
+ function containsNestedSecretKeyValue(input) {
76
+ const nestedKeyValueRe = /(?:^|[=:])"?([A-Za-z0-9_.-]+)"?\s*[:=]/g;
77
+ for (const match of input.matchAll(nestedKeyValueRe)) {
78
+ if (isSecretKey(match[1], { exemptEnvNameKeys: false }))
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ function redactList(input, options = { exemptEnvNameKeys: false }) {
84
+ const out = [];
85
+ for (let i = 0; i < input.length; i += 1) {
86
+ const value = input[i];
87
+ if (typeof value === 'string' &&
88
+ typeof input[i + 1] === 'string' &&
89
+ isSecretKey(value, { exemptEnvNameKeys: false })) {
90
+ out.push(value, '<redacted>');
91
+ i += 1;
92
+ continue;
93
+ }
94
+ if (typeof value === 'string') {
95
+ out.push(redactKeyValueString(value));
96
+ continue;
97
+ }
98
+ if (Array.isArray(value)) {
99
+ const key = value[0];
100
+ const rest = value.slice(2);
101
+ if (typeof key === 'string' && value.length === 1) {
102
+ out.push([redactKeyValueString(key)]);
103
+ continue;
104
+ }
105
+ if (typeof key === 'string' && isSecretKey(key, { exemptEnvNameKeys: false }) && value.length >= 2) {
106
+ out.push([key, '<redacted>', ...redactList(rest, options)]);
107
+ }
108
+ else {
109
+ out.push(redactList(value, options));
110
+ }
111
+ continue;
112
+ }
113
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
114
+ const original = value;
115
+ const secretLabel = (typeof original.name === 'string' && isSecretKey(original.name, { exemptEnvNameKeys: false })) ||
116
+ (typeof original.key === 'string' && isSecretKey(original.key, { exemptEnvNameKeys: false }));
117
+ const redacted = redactRecord(value, options);
118
+ if (typeof original.name === 'string')
119
+ redacted.name = original.name;
120
+ if (typeof original.key === 'string')
121
+ redacted.key = original.key;
122
+ if (secretLabel && 'value' in redacted) {
123
+ redacted.value = '<redacted>';
124
+ }
125
+ out.push(redacted);
126
+ continue;
127
+ }
128
+ out.push(value);
129
+ }
130
+ return out;
131
+ }
132
+ /**
133
+ * Return a shallow copy of `channel` with `env` and `headers` redacted via
134
+ * `redactRecord`. `api_key_env` (the env-var NAME, not its value) is preserved
135
+ * as-is because the name is non-secret and useful for debugging.
136
+ */
137
+ export function redactChannel(channel) {
138
+ return redactRecord(channel);
139
+ }
140
+ //# sourceMappingURL=redact.js.map