@zigrivers/mmr 1.3.0 → 1.4.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 (126) hide show
  1. package/README.md +422 -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 +457 -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 +66 -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 +869 -53
  42. package/dist/config/schema.d.ts.map +1 -1
  43. package/dist/config/schema.js +151 -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 +65 -2
  52. package/dist/core/auth.js.map +1 -1
  53. package/dist/core/compensator.d.ts +32 -4
  54. package/dist/core/compensator.d.ts.map +1 -1
  55. package/dist/core/compensator.js +118 -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 +7 -0
  62. package/dist/core/dispatcher.d.ts.map +1 -1
  63. package/dist/core/dispatcher.js +21 -3
  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/http-dispatcher.d.ts +20 -0
  70. package/dist/core/http-dispatcher.d.ts.map +1 -0
  71. package/dist/core/http-dispatcher.js +125 -0
  72. package/dist/core/http-dispatcher.js.map +1 -0
  73. package/dist/core/job-store.d.ts +7 -1
  74. package/dist/core/job-store.d.ts.map +1 -1
  75. package/dist/core/job-store.js +21 -1
  76. package/dist/core/job-store.js.map +1 -1
  77. package/dist/core/jsonpath.d.ts +15 -0
  78. package/dist/core/jsonpath.d.ts.map +1 -0
  79. package/dist/core/jsonpath.js +63 -0
  80. package/dist/core/jsonpath.js.map +1 -0
  81. package/dist/core/oss-examples.d.ts +18 -0
  82. package/dist/core/oss-examples.d.ts.map +1 -0
  83. package/dist/core/oss-examples.js +66 -0
  84. package/dist/core/oss-examples.js.map +1 -0
  85. package/dist/core/parser.d.ts +8 -3
  86. package/dist/core/parser.d.ts.map +1 -1
  87. package/dist/core/parser.js +157 -6
  88. package/dist/core/parser.js.map +1 -1
  89. package/dist/core/project-root.d.ts +10 -0
  90. package/dist/core/project-root.d.ts.map +1 -0
  91. package/dist/core/project-root.js +23 -0
  92. package/dist/core/project-root.js.map +1 -0
  93. package/dist/core/reconciler.d.ts +1 -1
  94. package/dist/core/reconciler.d.ts.map +1 -1
  95. package/dist/core/reconciler.js +100 -18
  96. package/dist/core/reconciler.js.map +1 -1
  97. package/dist/core/redact.d.ts +17 -0
  98. package/dist/core/redact.d.ts.map +1 -0
  99. package/dist/core/redact.js +140 -0
  100. package/dist/core/redact.js.map +1 -0
  101. package/dist/core/results-pipeline.d.ts +8 -2
  102. package/dist/core/results-pipeline.d.ts.map +1 -1
  103. package/dist/core/results-pipeline.js +50 -3
  104. package/dist/core/results-pipeline.js.map +1 -1
  105. package/dist/core/runtime-probe.d.ts +14 -0
  106. package/dist/core/runtime-probe.d.ts.map +1 -0
  107. package/dist/core/runtime-probe.js +57 -0
  108. package/dist/core/runtime-probe.js.map +1 -0
  109. package/dist/core/stable-id.d.ts +19 -0
  110. package/dist/core/stable-id.d.ts.map +1 -0
  111. package/dist/core/stable-id.js +148 -0
  112. package/dist/core/stable-id.js.map +1 -0
  113. package/dist/core/trust-mode.d.ts +29 -0
  114. package/dist/core/trust-mode.d.ts.map +1 -0
  115. package/dist/core/trust-mode.js +103 -0
  116. package/dist/core/trust-mode.js.map +1 -0
  117. package/dist/formatters/markdown.d.ts.map +1 -1
  118. package/dist/formatters/markdown.js +9 -0
  119. package/dist/formatters/markdown.js.map +1 -1
  120. package/dist/formatters/text.d.ts.map +1 -1
  121. package/dist/formatters/text.js +9 -0
  122. package/dist/formatters/text.js.map +1 -1
  123. package/dist/types.d.ts +44 -1
  124. package/dist/types.d.ts.map +1 -1
  125. package/dist/types.js.map +1 -1
  126. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,QAAQ,qCAAmC,CAAA;AAExD,eAAO,MAAM,YAAY,yCAAuC,CAAA;AAShE,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAA;AAcF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM1B,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -7,26 +7,172 @@ const AuthConfigSchema = z.object({
7
7
  failure_exit_codes: z.array(z.number()),
8
8
  recovery: z.string(),
9
9
  });
10
- const ChannelConfigSchema = z.object({
10
+ // Auth-probe config for HTTP channels (T1-C). Distinct from the subprocess
11
+ // AuthConfigSchema: an HTTP probe is an HTTP request (method + accepted status
12
+ // codes), not a spawned command. `check_endpoint` is optional — when absent,
13
+ // the probe URL is derived from `endpoint` via `deriveProbeUrl` (a trailing
14
+ // `/chat/completions` → `/models`); the schema rejects http channels where
15
+ // neither is available.
16
+ const HttpAuthConfigSchema = z.object({
17
+ check_endpoint: z.string().optional(),
18
+ check_method: z.string().default('GET'),
19
+ check_status_ok: z.array(z.number()).default([200]),
20
+ // Positive: a 0/negative timeout would abort the probe immediately.
21
+ timeout: z.number().positive().default(5),
22
+ recovery: z.string().optional(),
23
+ });
24
+ /**
25
+ * Derive the auth-probe URL from an openai-chat endpoint by replacing a
26
+ * trailing `/chat/completions` with `/models` (handles both `.../v1/chat/...`
27
+ * and bare `.../chat/...` shapes). Returns undefined when there is no trailing
28
+ * `/chat/completions` — callers then require an explicit `auth.check_endpoint`.
29
+ */
30
+ export function deriveProbeUrl(endpoint) {
31
+ // Tolerate trailing slashes (e.g. `.../chat/completions/`).
32
+ const trimmed = endpoint.replace(/\/+$/, '');
33
+ const suffix = '/chat/completions';
34
+ if (trimmed.endsWith(suffix)) {
35
+ return trimmed.slice(0, -suffix.length) + '/models';
36
+ }
37
+ return undefined;
38
+ }
39
+ const RegexFindingsFieldsSchema = z.object({
40
+ id: z.number().int().positive().optional(),
41
+ category: z.number().int().positive().optional(),
42
+ severity: z.number().int().positive().optional(),
43
+ location: z.number().int().positive(),
44
+ description: z.number().int().positive(),
45
+ suggestion: z.number().int().positive().optional(),
46
+ });
47
+ export const RegexFindingsParserSchema = z.object({
48
+ kind: z.literal('regex-findings'),
49
+ pattern: z.string(),
50
+ flags: z.string().regex(/^[dgimsuvy]*$/).default('gm'),
51
+ default_severity: Severity.default('P2'),
52
+ fields: RegexFindingsFieldsSchema,
53
+ });
54
+ export const UnwrapJsonpathParserSchema = z.object({
55
+ kind: z.literal('unwrap-jsonpath'),
56
+ wrap: z.string(),
57
+ then: z.lazy(() => OutputParserSchema).default('default'),
58
+ });
59
+ export const OutputParserSchema = z.lazy(() => z.union([
60
+ z.string(),
61
+ z.discriminatedUnion('kind', [
62
+ UnwrapJsonpathParserSchema,
63
+ RegexFindingsParserSchema,
64
+ ]),
65
+ ]));
66
+ // Fields common to every channel kind. Shared across both discriminated-union
67
+ // arms so existing consumers can keep reading ch.command/ch.auth/etc. off the
68
+ // union without narrowing (they're subprocess-relevant but harmless on http).
69
+ const CommonChannelFields = {
11
70
  enabled: z.boolean().default(true),
12
- command: z.string(),
71
+ command: z.string().optional(),
13
72
  flags: z.array(z.string()).default([]),
14
73
  env: z.record(z.string()).default({}),
15
- auth: AuthConfigSchema,
74
+ headers: z.record(z.string()).optional(),
16
75
  prompt_wrapper: z.string().default('{{prompt}}'),
17
- output_parser: z.string().default('default'),
76
+ // How the dispatcher hands the prompt to the channel process:
77
+ // 'stdin' — pipe the prompt to stdin (default; claude/gemini/codex)
78
+ // 'prompt-file' — write the prompt to a temp file and pass its path via a
79
+ // {{prompt_file}} placeholder in flags (or appended), for
80
+ // CLIs like grok whose prompt flag requires an arg value
81
+ // and ignore stdin. Omitted ⇒ stdin.
82
+ prompt_delivery: z.enum(['stdin', 'prompt-file']).optional(),
83
+ output_parser: OutputParserSchema.default('default'),
18
84
  stderr: z.enum(['suppress', 'capture', 'passthrough']).default('capture'),
19
85
  timeout: z.number().optional(),
86
+ // Channel inheritance (v3.28). command/auth stay optional so abstract bases
87
+ // and `extends` children (resolved before parse) validate.
88
+ extends: z.string().optional(),
89
+ abstract: z.boolean().default(false),
90
+ };
91
+ const SubprocessChannelSchema = z.object({
92
+ kind: z.literal('subprocess'),
93
+ // Subprocess auth is a spawned command (check + failure_exit_codes).
94
+ auth: AuthConfigSchema.optional(),
95
+ ...CommonChannelFields,
96
+ });
97
+ // NOTE: endpoint/model/endpoint_convention are required unconditionally, so an
98
+ // abstract http *template* (providing only shared headers for children to
99
+ // extend) is not supported — http channels must be concrete. Subprocess
100
+ // abstract templates remain supported (command is optional).
101
+ const HttpChannelSchema = z.object({
102
+ kind: z.literal('http'),
103
+ endpoint: z.string(),
104
+ model: z.string(),
105
+ // Only the openai-chat convention ships in v3.30b (§5 decision 8).
106
+ endpoint_convention: z.literal('openai-chat'),
107
+ api_key_env: z.string().optional(),
108
+ api_key_header: z.string().default('Authorization'),
109
+ api_key_prefix: z.string().default('Bearer '),
110
+ // HTTP auth is an HTTP probe (GET <endpoint→/models>), always defaulted so
111
+ // the dispatcher/auth-probe can read auth.check_method/check_status_ok.
112
+ auth: HttpAuthConfigSchema.default({}),
113
+ ...CommonChannelFields,
114
+ });
115
+ /**
116
+ * Injects `kind: 'subprocess'` into any channel object missing it BEFORE the
117
+ * discriminatedUnion runs. Zod picks the union arm from the RAW discriminator
118
+ * value before defaults apply, so without this a legacy config (no `kind`)
119
+ * would fail to parse entirely.
120
+ */
121
+ function injectSubprocessDefault(raw) {
122
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
123
+ return raw;
124
+ const obj = raw;
125
+ if (obj.kind === undefined)
126
+ return { ...obj, kind: 'subprocess' };
127
+ return obj;
128
+ }
129
+ const ChannelConfigSchema = z.preprocess(injectSubprocessDefault, z.discriminatedUnion('kind', [SubprocessChannelSchema, HttpChannelSchema])).superRefine((ch, ctx) => {
130
+ // An http channel must have a probeable auth endpoint: either an explicit
131
+ // auth.check_endpoint, or a derivable one (endpoint ends in /chat/completions).
132
+ if (ch.kind === 'http' && !ch.auth.check_endpoint && !deriveProbeUrl(ch.endpoint)) {
133
+ ctx.addIssue({
134
+ code: z.ZodIssueCode.custom,
135
+ path: ['auth', 'check_endpoint'],
136
+ message: `endpoint "${ch.endpoint}" does not end in /chat/completions; auth.check_endpoint is required.`,
137
+ });
138
+ }
20
139
  });
21
140
  const TemplateSchema = z.object({
22
141
  criteria: z.array(z.string()).optional(),
23
142
  });
143
+ export const CompensatorConfigSchema = z.object({
144
+ channel: z.string().optional(),
145
+ channel_focus_map: z.record(z.string()).optional(),
146
+ }).strict().refine((cfg) => cfg.channel !== undefined || cfg.channel_focus_map !== undefined, { message: 'defaults.compensator must define channel or channel_focus_map' });
147
+ const LoopControlSchema = z.object({
148
+ max_rounds_default: z.number().int().positive().default(5),
149
+ repeat_suppression_enabled: z.boolean().default(false),
150
+ repeat_downgrade_after: z.number().int().positive().optional(),
151
+ repeat_suppress_after: z.number().int().positive().optional(),
152
+ })
153
+ .refine((lc) => {
154
+ if (!lc.repeat_suppression_enabled)
155
+ return true;
156
+ return lc.repeat_downgrade_after !== undefined && lc.repeat_suppress_after !== undefined;
157
+ }, {
158
+ message: 'loop_control.repeat_suppression_enabled requires both repeat_downgrade_after and repeat_suppress_after',
159
+ })
160
+ .refine((lc) => {
161
+ if (lc.repeat_downgrade_after === undefined || lc.repeat_suppress_after === undefined) {
162
+ return true;
163
+ }
164
+ return lc.repeat_suppress_after >= lc.repeat_downgrade_after;
165
+ }, {
166
+ message: 'loop_control.repeat_suppress_after must be greater than or equal to repeat_downgrade_after',
167
+ });
24
168
  const DefaultsSchema = z.object({
25
169
  fix_threshold: Severity.default('P2'),
26
170
  timeout: z.number().default(300),
27
171
  format: OutputFormat.default('json'),
28
172
  parallel: z.boolean().default(true),
29
173
  job_retention_days: z.number().default(7),
174
+ loop_control: LoopControlSchema.default({}),
175
+ compensator: CompensatorConfigSchema.optional(),
30
176
  });
31
177
  export const MmrConfigSchema = z.object({
32
178
  version: z.number(),
@@ -34,5 +180,6 @@ export const MmrConfigSchema = z.object({
34
180
  review_criteria: z.array(z.string()).optional(),
35
181
  templates: z.record(TemplateSchema).optional(),
36
182
  channels: z.record(ChannelConfigSchema).default({}),
183
+ channels_disabled: z.array(z.string()).optional(),
37
184
  });
38
185
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAExD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AAEhE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9B,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAA;AAEF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACtC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,IAAI,EAAE,gBAAgB;IACtB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IAChD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACzE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAChC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CAC1C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;IAC9C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACpD,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /** Canonical finding_key format: sha1 hex. Exported so the CLI can validate
2
+ * the same way before any path construction. */
3
+ export declare const FINDING_KEY_RE: RegExp;
4
+ export interface AckRecord {
5
+ finding_key: string;
6
+ normalized_location: string;
7
+ description_shingle: string[];
8
+ reason?: string;
9
+ created_at: string;
10
+ }
11
+ export type AckScope = 'project' | 'user';
12
+ export interface AckMatch {
13
+ record: AckRecord;
14
+ match: 'exact' | 'fuzzy';
15
+ scope: AckScope;
16
+ }
17
+ export interface AckStoreOptions {
18
+ /**
19
+ * Project root whose ./.mmr/acks holds project-scoped (repo-committed) acks.
20
+ * Optional: when omitted, project-scope acks are disabled entirely
21
+ * (lookup/listAll ignore them and add(..,'project') throws). Callers
22
+ * reviewing an untrusted working tree should omit it unless the project acks
23
+ * are explicitly trusted.
24
+ */
25
+ projectRoot?: string;
26
+ /**
27
+ * The MMR state root that holds user-scoped acks at `<userRoot>/acks`. This
28
+ * is the same root as jobs/sessions (resolveSessionRoot(), i.e. MMR_HOME ??
29
+ * ~/.mmr), so user acks live beside jobs/ and sessions/ and honor MMR_HOME.
30
+ */
31
+ userRoot: string;
32
+ /**
33
+ * When set, project-scope ack reads come from this Git ref via `git show`
34
+ * (committed blobs) instead of the working tree — the §5-decision-1 trust
35
+ * boundary, so an untrusted PR can't self-suppress by adding working-tree
36
+ * acks. User-scope reads and all writes are unaffected.
37
+ */
38
+ configBaseRef?: string;
39
+ }
40
+ /**
41
+ * Build an AckStore for a review run. User-scope acks (`<userRoot>/acks`,
42
+ * userRoot = resolveSessionRoot(), MMR_HOME-aware) are always loaded — they
43
+ * live on the operator's own machine. Project-scope acks live in the reviewed
44
+ * tree, which may be untrusted (a PR checkout in CI), so they are loaded only
45
+ * when explicitly trusted — otherwise an attacker could commit
46
+ * `.mmr/acks/<sha>.json` to self-suppress their own findings. The full trusted
47
+ * path (loading project acks from a git base ref) is added by the trust-mode
48
+ * thread; until then this gates project acks behind trust_project_acks.
49
+ *
50
+ * The project root is discovered by walking up from `cwd` (default
51
+ * process.cwd()) to the repository root, so acks resolve correctly even when
52
+ * the command runs from a subdirectory. userRoot is supplied by the caller
53
+ * (resolveSessionRoot()); cwd is injectable for tests.
54
+ */
55
+ export declare function buildReviewAckStore(opts: {
56
+ trustProjectAcks: boolean;
57
+ userRoot: string;
58
+ cwd?: string;
59
+ configBaseRef?: string;
60
+ }): AckStore;
61
+ export declare class AckStore {
62
+ private readonly projectDir;
63
+ private readonly userDir;
64
+ private readonly projectRootResolved;
65
+ private readonly userRootResolved;
66
+ private readonly configBaseRef;
67
+ private readonly loaded;
68
+ constructor(opts: AckStoreOptions);
69
+ private validateKey;
70
+ /**
71
+ * Returns the acks dir for a scope after verifying it does not escape its
72
+ * root via a symlinked ancestor. A leaf-only symlink check is not enough:
73
+ * project acks live in the untrusted reviewed tree, where `.mmr` or
74
+ * `.mmr/acks` could itself be a symlink redirecting every mkdir/read/write/
75
+ * unlink out of the sandbox. We realpath the deepest existing ancestor of
76
+ * the acks dir and require it to stay within the (realpath'd) root.
77
+ */
78
+ private dirForScope;
79
+ /** realpath of the deepest existing ancestor of `p` (p itself if it exists). */
80
+ private realDeepestAncestor;
81
+ private filePath;
82
+ add(record: AckRecord, scope: AckScope): void;
83
+ remove(key: string, scope: AckScope): void;
84
+ private readDir;
85
+ /**
86
+ * Read project-scope ack records from the configured base ref (committed
87
+ * blobs via git), not the working tree. Each file's embedded key must match
88
+ * its filename and the record must be shape-valid (isValidAckRecord), same as
89
+ * the working-tree path. git show returns blob content, so the FS symlink/
90
+ * traversal guards are unnecessary here; readFileAtRef caps the read size.
91
+ */
92
+ private readProjectRecordsFromRef;
93
+ private records;
94
+ /** Merge project and user acks; project shadows user on finding_key conflict. */
95
+ listAll(): AckRecord[];
96
+ /**
97
+ * Lookup an ack matching the given finding identity, applying the two-step
98
+ * rule from T2-D: (1) exact `finding_key` match (O(1) via the per-scope
99
+ * index); (2) fuzzy fallback only when normalized_location matches AND
100
+ * shingle Jaccard ≥ 0.7. Project scope shadows user scope.
101
+ */
102
+ lookup(finding: {
103
+ finding_key: string;
104
+ normalized_location: string;
105
+ shingle: string[];
106
+ }): AckMatch | undefined;
107
+ private fuzzyScan;
108
+ }
109
+ //# sourceMappingURL=ack-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ack-store.d.ts","sourceRoot":"","sources":["../../src/core/ack-store.ts"],"names":[],"mappings":"AAQA;iDACiD;AACjD,eAAO,MAAM,cAAc,QAAmB,CAAA;AAQ9C,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;AAEzC,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,SAAS,CAAA;IACjB,KAAK,EAAE,OAAO,GAAG,OAAO,CAAA;IACxB,KAAK,EAAE,QAAQ,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,gBAAgB,EAAE,OAAO,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,QAAQ,CAWX;AA4BD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAoB;IACxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAGlD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;gBAExD,IAAI,EAAE,eAAe;IAajC,OAAO,CAAC,WAAW;IAMnB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IAqBnB,gFAAgF;IAChF,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,QAAQ;IAYhB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI;IA0C7C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI;IAa1C,OAAO,CAAC,OAAO;IAuCf;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IA6BjC,OAAO,CAAC,OAAO;IA0Bf,iFAAiF;IACjF,OAAO,IAAI,SAAS,EAAE;IAOtB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,QAAQ,GAAG,SAAS;IAmB9G,OAAO,CAAC,SAAS;CAWlB"}