@lcv-ideas-software/cross-review 4.0.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 (122) hide show
  1. package/CHANGELOG.md +2568 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +26 -0
  4. package/README.md +208 -0
  5. package/SECURITY.md +52 -0
  6. package/dist/scripts/api-streaming-smoke.d.ts +1 -0
  7. package/dist/scripts/api-streaming-smoke.js +78 -0
  8. package/dist/scripts/api-streaming-smoke.js.map +1 -0
  9. package/dist/scripts/runtime-default-smoke.d.ts +1 -0
  10. package/dist/scripts/runtime-default-smoke.js +88 -0
  11. package/dist/scripts/runtime-default-smoke.js.map +1 -0
  12. package/dist/scripts/runtime-smoke.d.ts +1 -0
  13. package/dist/scripts/runtime-smoke.js +148 -0
  14. package/dist/scripts/runtime-smoke.js.map +1 -0
  15. package/dist/scripts/smoke.d.ts +1 -0
  16. package/dist/scripts/smoke.js +6156 -0
  17. package/dist/scripts/smoke.js.map +1 -0
  18. package/dist/src/core/cache-manifest.d.ts +22 -0
  19. package/dist/src/core/cache-manifest.js +133 -0
  20. package/dist/src/core/cache-manifest.js.map +1 -0
  21. package/dist/src/core/caller-tokens.d.ts +32 -0
  22. package/dist/src/core/caller-tokens.js +240 -0
  23. package/dist/src/core/caller-tokens.js.map +1 -0
  24. package/dist/src/core/config.d.ts +9 -0
  25. package/dist/src/core/config.js +643 -0
  26. package/dist/src/core/config.js.map +1 -0
  27. package/dist/src/core/convergence.d.ts +5 -0
  28. package/dist/src/core/convergence.js +186 -0
  29. package/dist/src/core/convergence.js.map +1 -0
  30. package/dist/src/core/cost.d.ts +59 -0
  31. package/dist/src/core/cost.js +359 -0
  32. package/dist/src/core/cost.js.map +1 -0
  33. package/dist/src/core/file-config.d.ts +316 -0
  34. package/dist/src/core/file-config.js +490 -0
  35. package/dist/src/core/file-config.js.map +1 -0
  36. package/dist/src/core/orchestrator.d.ts +199 -0
  37. package/dist/src/core/orchestrator.js +3430 -0
  38. package/dist/src/core/orchestrator.js.map +1 -0
  39. package/dist/src/core/prompt-parts.d.ts +58 -0
  40. package/dist/src/core/prompt-parts.js +122 -0
  41. package/dist/src/core/prompt-parts.js.map +1 -0
  42. package/dist/src/core/relator-lottery.d.ts +23 -0
  43. package/dist/src/core/relator-lottery.js +112 -0
  44. package/dist/src/core/relator-lottery.js.map +1 -0
  45. package/dist/src/core/reports.d.ts +2 -0
  46. package/dist/src/core/reports.js +82 -0
  47. package/dist/src/core/reports.js.map +1 -0
  48. package/dist/src/core/session-store.d.ts +149 -0
  49. package/dist/src/core/session-store.js +1923 -0
  50. package/dist/src/core/session-store.js.map +1 -0
  51. package/dist/src/core/status.d.ts +61 -0
  52. package/dist/src/core/status.js +249 -0
  53. package/dist/src/core/status.js.map +1 -0
  54. package/dist/src/core/timeouts.d.ts +2 -0
  55. package/dist/src/core/timeouts.js +3 -0
  56. package/dist/src/core/timeouts.js.map +1 -0
  57. package/dist/src/core/types.d.ts +604 -0
  58. package/dist/src/core/types.js +36 -0
  59. package/dist/src/core/types.js.map +1 -0
  60. package/dist/src/dashboard/server.d.ts +2 -0
  61. package/dist/src/dashboard/server.js +339 -0
  62. package/dist/src/dashboard/server.js.map +1 -0
  63. package/dist/src/mcp/server.d.ts +54 -0
  64. package/dist/src/mcp/server.js +1584 -0
  65. package/dist/src/mcp/server.js.map +1 -0
  66. package/dist/src/observability/logger.d.ts +9 -0
  67. package/dist/src/observability/logger.js +24 -0
  68. package/dist/src/observability/logger.js.map +1 -0
  69. package/dist/src/peers/anthropic.d.ts +14 -0
  70. package/dist/src/peers/anthropic.js +290 -0
  71. package/dist/src/peers/anthropic.js.map +1 -0
  72. package/dist/src/peers/base.d.ts +72 -0
  73. package/dist/src/peers/base.js +416 -0
  74. package/dist/src/peers/base.js.map +1 -0
  75. package/dist/src/peers/deepseek.d.ts +12 -0
  76. package/dist/src/peers/deepseek.js +246 -0
  77. package/dist/src/peers/deepseek.js.map +1 -0
  78. package/dist/src/peers/errors.d.ts +2 -0
  79. package/dist/src/peers/errors.js +185 -0
  80. package/dist/src/peers/errors.js.map +1 -0
  81. package/dist/src/peers/gemini.d.ts +13 -0
  82. package/dist/src/peers/gemini.js +215 -0
  83. package/dist/src/peers/gemini.js.map +1 -0
  84. package/dist/src/peers/grok.d.ts +17 -0
  85. package/dist/src/peers/grok.js +346 -0
  86. package/dist/src/peers/grok.js.map +1 -0
  87. package/dist/src/peers/model-selection.d.ts +4 -0
  88. package/dist/src/peers/model-selection.js +260 -0
  89. package/dist/src/peers/model-selection.js.map +1 -0
  90. package/dist/src/peers/openai.d.ts +14 -0
  91. package/dist/src/peers/openai.js +299 -0
  92. package/dist/src/peers/openai.js.map +1 -0
  93. package/dist/src/peers/perplexity.d.ts +18 -0
  94. package/dist/src/peers/perplexity.js +375 -0
  95. package/dist/src/peers/perplexity.js.map +1 -0
  96. package/dist/src/peers/registry.d.ts +3 -0
  97. package/dist/src/peers/registry.js +77 -0
  98. package/dist/src/peers/registry.js.map +1 -0
  99. package/dist/src/peers/retry.d.ts +2 -0
  100. package/dist/src/peers/retry.js +36 -0
  101. package/dist/src/peers/retry.js.map +1 -0
  102. package/dist/src/peers/stub.d.ts +13 -0
  103. package/dist/src/peers/stub.js +344 -0
  104. package/dist/src/peers/stub.js.map +1 -0
  105. package/dist/src/peers/text.d.ts +18 -0
  106. package/dist/src/peers/text.js +39 -0
  107. package/dist/src/peers/text.js.map +1 -0
  108. package/dist/src/security/redact.d.ts +2 -0
  109. package/dist/src/security/redact.js +128 -0
  110. package/dist/src/security/redact.js.map +1 -0
  111. package/docs/api-keys.md +34 -0
  112. package/docs/architecture.md +118 -0
  113. package/docs/caching.md +135 -0
  114. package/docs/costs.md +40 -0
  115. package/docs/evidence-preflight.md +88 -0
  116. package/docs/github-security-baseline.md +32 -0
  117. package/docs/model-selection.md +105 -0
  118. package/docs/reports/cross-review-v2-api-capability-smoke-2026-04-30.md +354 -0
  119. package/docs/reports/cross-review-v2-format-recovery-findings-2026-04-28.md +223 -0
  120. package/docs/reports/cross-review-v2-official-provider-docs-refresh-2026-05-05.md +60 -0
  121. package/docs/reports/cross-review-v2-token-streaming-smoke-2026-04-30.md +119 -0
  122. package/package.json +88 -0
@@ -0,0 +1,490 @@
1
+ // v3.1.0 (operator directive 2026-05-12): central config file.
2
+ //
3
+ // Before v3.1.0, every operational knob (models, reasoning_effort,
4
+ // per-peer pricing, budget ceilings, autowire judge/consensus, cache
5
+ // TTLs, perplexity sub-config, token-delta streaming thresholds, peer
6
+ // enable toggles) had to be declared as a `CROSS_REVIEW_*` env var in
7
+ // every one of the 7 MCP host configs. With the sexteto reaching ~100
8
+ // env vars per host × 7 hosts = ~700 redundant declarations to keep in
9
+ // sync, drift between hosts became routine and operator-toilsome.
10
+ //
11
+ // This module introduces a single source-of-truth JSON file. cross-
12
+ // review-v2 reads it at boot, validates with zod, and pre-populates
13
+ // `process.env` with the env-var names that the existing
14
+ // `loadConfig()` pipeline already consumes. Effect: file values become
15
+ // defaults; explicit env-var overrides (from MCP host config or Windows
16
+ // registry) still win because the existing envValue() pipeline checks
17
+ // `process.env` first AND we skip writing to process.env when the
18
+ // existing pipeline (process.env + registry fallback) already resolves
19
+ // the var.
20
+ //
21
+ // Precedence (high → low):
22
+ // 1. process.env (MCP host config explicit declaration)
23
+ // 2. Windows registry (v2.28.0 fallback)
24
+ // 3. Central config file (THIS module)
25
+ // 4. Hardcoded defaults inside loadConfig()
26
+ //
27
+ // API keys (OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY,
28
+ // DEEPSEEK_API_KEY, GROK_API_KEY, PERPLEXITY_API_KEY) are NOT covered
29
+ // by this file by design — they remain in Windows registry per the
30
+ // secrets_policy "API keys are read from Windows environment variables
31
+ // only". The file does NOT define an `api_keys` section.
32
+ //
33
+ // Per-host identity (CROSS_REVIEW_CALLER_TOKEN, CROSS_REVIEW_REQUIRE_
34
+ // TOKEN) is also NOT covered: each MCP host declares its own caller
35
+ // identity in its own config.
36
+ //
37
+ // File location: `${data_dir}/config.json` by default, overridable via
38
+ // CROSS_REVIEW_CONFIG_FILE env var. Absence is non-fatal (boot
39
+ // proceeds with env+defaults exactly like pre-v3.1.0).
40
+ import fs from "node:fs";
41
+ import path from "node:path";
42
+ import { z } from "zod";
43
+ // All sub-schemas use .strict() so an unknown field surfaces as a
44
+ // zod error at boot rather than silently being ignored. The operator
45
+ // gets a clear message pointing at the typo'd field.
46
+ const ReasoningEffortValueSchema = z.enum([
47
+ "none",
48
+ "minimal",
49
+ "low",
50
+ "medium",
51
+ "high",
52
+ "xhigh",
53
+ "max",
54
+ ]);
55
+ const PerPeerStringSchema = z
56
+ .object({
57
+ codex: z.string().optional(),
58
+ claude: z.string().optional(),
59
+ gemini: z.string().optional(),
60
+ deepseek: z.string().optional(),
61
+ grok: z.string().optional(),
62
+ perplexity: z.string().optional(),
63
+ })
64
+ .strict()
65
+ .optional();
66
+ const PerPeerStringListSchema = z
67
+ .object({
68
+ codex: z.array(z.string()).optional(),
69
+ claude: z.array(z.string()).optional(),
70
+ gemini: z.array(z.string()).optional(),
71
+ deepseek: z.array(z.string()).optional(),
72
+ grok: z.array(z.string()).optional(),
73
+ perplexity: z.array(z.string()).optional(),
74
+ })
75
+ .strict()
76
+ .optional();
77
+ const PerPeerReasoningSchema = z
78
+ .object({
79
+ codex: ReasoningEffortValueSchema.optional(),
80
+ claude: ReasoningEffortValueSchema.optional(),
81
+ gemini: ReasoningEffortValueSchema.optional(),
82
+ deepseek: ReasoningEffortValueSchema.optional(),
83
+ grok: ReasoningEffortValueSchema.optional(),
84
+ perplexity: ReasoningEffortValueSchema.optional(),
85
+ })
86
+ .strict()
87
+ .optional();
88
+ const PerPeerBoolSchema = z
89
+ .object({
90
+ codex: z.boolean().optional(),
91
+ claude: z.boolean().optional(),
92
+ gemini: z.boolean().optional(),
93
+ deepseek: z.boolean().optional(),
94
+ grok: z.boolean().optional(),
95
+ perplexity: z.boolean().optional(),
96
+ })
97
+ .strict()
98
+ .optional();
99
+ // Per-peer cost-rate sub-schema. Mirrors AppConfig.cost_rates[peer]
100
+ // from src/core/types.ts (18 optional fields). All numbers; operator
101
+ // chooses which apply per provider (e.g., Anthropic has cache, Gemini
102
+ // has threshold/extended, DeepSeek has promo, Perplexity has request
103
+ // fees + 4th-dimension deep-research fields).
104
+ const CostRateEntrySchema = z
105
+ .object({
106
+ input_per_million: z.number().nonnegative().optional(),
107
+ output_per_million: z.number().nonnegative().optional(),
108
+ cache_read_per_million: z.number().nonnegative().optional(),
109
+ cache_write_per_million: z.number().nonnegative().optional(),
110
+ input_extended_per_million: z.number().nonnegative().optional(),
111
+ output_extended_per_million: z.number().nonnegative().optional(),
112
+ cache_read_extended_per_million: z.number().nonnegative().optional(),
113
+ cache_write_extended_per_million: z.number().nonnegative().optional(),
114
+ threshold_tokens: z.number().int().nonnegative().optional(),
115
+ promo_input_per_million: z.number().nonnegative().optional(),
116
+ promo_output_per_million: z.number().nonnegative().optional(),
117
+ promo_input_extended_per_million: z.number().nonnegative().optional(),
118
+ promo_output_extended_per_million: z.number().nonnegative().optional(),
119
+ promo_cache_read_per_million: z.number().nonnegative().optional(),
120
+ promo_cache_write_per_million: z.number().nonnegative().optional(),
121
+ promo_cache_read_extended_per_million: z.number().nonnegative().optional(),
122
+ promo_cache_write_extended_per_million: z.number().nonnegative().optional(),
123
+ promo_expires_at_utc: z.string().optional(),
124
+ request_fee_low_per_1000: z.number().nonnegative().optional(),
125
+ request_fee_medium_per_1000: z.number().nonnegative().optional(),
126
+ request_fee_high_per_1000: z.number().nonnegative().optional(),
127
+ citation_tokens_per_million: z.number().nonnegative().optional(),
128
+ deep_research_reasoning_tokens_per_million: z.number().nonnegative().optional(),
129
+ search_queries_per_1000: z.number().nonnegative().optional(),
130
+ })
131
+ .strict();
132
+ const PerPeerCostRatesSchema = z
133
+ .object({
134
+ codex: CostRateEntrySchema.optional(),
135
+ claude: CostRateEntrySchema.optional(),
136
+ gemini: CostRateEntrySchema.optional(),
137
+ deepseek: CostRateEntrySchema.optional(),
138
+ grok: CostRateEntrySchema.optional(),
139
+ perplexity: CostRateEntrySchema.optional(),
140
+ })
141
+ .strict()
142
+ .optional();
143
+ const EvidenceJudgeAutowireSchema = z
144
+ .object({
145
+ mode: z.enum(["off", "shadow", "active"]).optional(),
146
+ peer: z.string().optional(),
147
+ consensus_peers: z.array(z.string()).optional(),
148
+ max_items_per_pass: z.number().int().positive().optional(),
149
+ })
150
+ .strict()
151
+ .optional();
152
+ const BudgetSchema = z
153
+ .object({
154
+ max_session_cost_usd: z.number().nonnegative().optional(),
155
+ until_stopped_max_cost_usd: z.number().nonnegative().optional(),
156
+ preflight_max_round_cost_usd: z.number().nonnegative().optional(),
157
+ default_max_rounds: z.number().int().positive().optional(),
158
+ circular_max_rotations: z.number().int().positive().optional(),
159
+ })
160
+ .strict()
161
+ .optional();
162
+ const CacheSchema = z
163
+ .object({
164
+ disable_cache: z.boolean().optional(),
165
+ schema_version: z.string().optional(),
166
+ ttl_anthropic: z.enum(["5m", "1h"]).optional(),
167
+ ttl_openai: z.enum(["5m", "1h"]).optional(),
168
+ // v3.7.5 (A3, logs+sessions study 2026-05-15): per-provider cache
169
+ // disable. Keys mirror the PROVIDER identifiers used by env vars
170
+ // (anthropic for the claude peer, openai for the codex peer).
171
+ // Absent key = adapter default (anthropic=true cache off;
172
+ // others=false cache on per v2.21.0).
173
+ disable_anthropic: z.boolean().optional(),
174
+ disable_openai: z.boolean().optional(),
175
+ disable_gemini: z.boolean().optional(),
176
+ disable_deepseek: z.boolean().optional(),
177
+ disable_grok: z.boolean().optional(),
178
+ disable_perplexity: z.boolean().optional(),
179
+ })
180
+ .strict()
181
+ .optional();
182
+ const PerplexitySubSchema = z
183
+ .object({
184
+ search_context_size: z.enum(["low", "medium", "high"]).optional(),
185
+ disable_search: z.boolean().optional(),
186
+ })
187
+ .strict()
188
+ .optional();
189
+ const TokenStreamingSchema = z
190
+ .object({
191
+ chars_threshold: z.number().int().positive().optional(),
192
+ ms_threshold: z.number().int().positive().optional(),
193
+ verbose: z.boolean().optional(),
194
+ })
195
+ .strict()
196
+ .optional();
197
+ const RetrySchema = z
198
+ .object({
199
+ max_attempts: z.number().int().positive().optional(),
200
+ base_delay_ms: z.number().int().positive().optional(),
201
+ max_delay_ms: z.number().int().positive().optional(),
202
+ timeout_ms: z.number().int().positive().optional(),
203
+ })
204
+ .strict()
205
+ .optional();
206
+ export const FileConfigSchema = z
207
+ .object({
208
+ // Optional schema version sentinel so future breaking changes can
209
+ // be detected. Currently no version-specific logic; absence is OK.
210
+ version: z.string().optional(),
211
+ log_level: z.enum(["debug", "info", "warn", "error"]).optional(),
212
+ stub: z.boolean().optional(),
213
+ dashboard_port: z.number().int().positive().optional(),
214
+ max_output_tokens: z.number().int().positive().optional(),
215
+ models: PerPeerStringSchema,
216
+ // v3.7.3 (operator no-fallback directive 2026-05-14): the user's
217
+ // explicit, per-peer list of models accepted as fallback. Default
218
+ // empty `[]` per peer = NO fallback — a peer whose pinned model is
219
+ // unavailable is retried on the SAME model, then skipped (the round
220
+ // converges on the remaining peers). Listing models here is a
221
+ // deliberate user decision via the central config; cross-review
222
+ // never hardcodes a model downgrade.
223
+ fallback_models: PerPeerStringListSchema,
224
+ reasoning_effort: PerPeerReasoningSchema,
225
+ peer_enabled: PerPeerBoolSchema,
226
+ cost_rates: PerPeerCostRatesSchema,
227
+ budget: BudgetSchema,
228
+ retry: RetrySchema,
229
+ evidence_judge_autowire: EvidenceJudgeAutowireSchema,
230
+ cache: CacheSchema,
231
+ perplexity: PerplexitySubSchema,
232
+ token_streaming: TokenStreamingSchema,
233
+ })
234
+ .strict();
235
+ const PEER_TO_ENV_PREFIX = {
236
+ codex: "CROSS_REVIEW_OPENAI",
237
+ claude: "CROSS_REVIEW_ANTHROPIC",
238
+ gemini: "CROSS_REVIEW_GEMINI",
239
+ deepseek: "CROSS_REVIEW_DEEPSEEK",
240
+ grok: "CROSS_REVIEW_GROK",
241
+ perplexity: "CROSS_REVIEW_PERPLEXITY",
242
+ };
243
+ const COST_RATE_FIELD_TO_ENV_SUFFIX = {
244
+ input_per_million: "INPUT_USD_PER_MILLION",
245
+ output_per_million: "OUTPUT_USD_PER_MILLION",
246
+ cache_read_per_million: "CACHE_READ_USD_PER_MILLION",
247
+ cache_write_per_million: "CACHE_WRITE_USD_PER_MILLION",
248
+ input_extended_per_million: "INPUT_EXTENDED_USD_PER_MILLION",
249
+ output_extended_per_million: "OUTPUT_EXTENDED_USD_PER_MILLION",
250
+ cache_read_extended_per_million: "CACHE_READ_EXTENDED_USD_PER_MILLION",
251
+ cache_write_extended_per_million: "CACHE_WRITE_EXTENDED_USD_PER_MILLION",
252
+ threshold_tokens: "THRESHOLD_TOKENS",
253
+ promo_input_per_million: "PROMO_INPUT_USD_PER_MILLION",
254
+ promo_output_per_million: "PROMO_OUTPUT_USD_PER_MILLION",
255
+ promo_input_extended_per_million: "PROMO_INPUT_EXTENDED_USD_PER_MILLION",
256
+ promo_output_extended_per_million: "PROMO_OUTPUT_EXTENDED_USD_PER_MILLION",
257
+ promo_cache_read_per_million: "PROMO_CACHE_READ_USD_PER_MILLION",
258
+ promo_cache_write_per_million: "PROMO_CACHE_WRITE_USD_PER_MILLION",
259
+ promo_cache_read_extended_per_million: "PROMO_CACHE_READ_EXTENDED_USD_PER_MILLION",
260
+ promo_cache_write_extended_per_million: "PROMO_CACHE_WRITE_EXTENDED_USD_PER_MILLION",
261
+ promo_expires_at_utc: "PROMO_EXPIRES_AT_UTC",
262
+ request_fee_low_per_1000: "REQUEST_FEE_LOW_USD_PER_1000_REQUESTS",
263
+ request_fee_medium_per_1000: "REQUEST_FEE_MEDIUM_USD_PER_1000_REQUESTS",
264
+ request_fee_high_per_1000: "REQUEST_FEE_HIGH_USD_PER_1000_REQUESTS",
265
+ citation_tokens_per_million: "CITATION_TOKENS_USD_PER_MILLION",
266
+ deep_research_reasoning_tokens_per_million: "DEEP_RESEARCH_REASONING_TOKENS_USD_PER_MILLION",
267
+ search_queries_per_1000: "SEARCH_QUERIES_USD_PER_1000_REQUESTS",
268
+ };
269
+ // Flatten the structured FileConfig into a flat map of env-var-name →
270
+ // string-value. The existing loadConfig() pipeline reads from
271
+ // process.env, so the file's contribution is to seed those env vars
272
+ // when they aren't already explicitly set.
273
+ export function flattenFileConfigToEnvMap(config) {
274
+ const out = {};
275
+ const set = (name, value) => {
276
+ if (value == null)
277
+ return;
278
+ out[name] = String(value);
279
+ };
280
+ set("CROSS_REVIEW_LOG_LEVEL", config.log_level);
281
+ if (config.stub != null)
282
+ set("CROSS_REVIEW_STUB", config.stub ? "true" : "false");
283
+ set("CROSS_REVIEW_DASHBOARD_PORT", config.dashboard_port);
284
+ set("CROSS_REVIEW_MAX_OUTPUT_TOKENS", config.max_output_tokens);
285
+ // Per-peer model / reasoning / fallback / enabled.
286
+ if (config.models) {
287
+ for (const [peer, model] of Object.entries(config.models)) {
288
+ if (model)
289
+ set(`${PEER_TO_ENV_PREFIX[peer]}_MODEL`, model);
290
+ }
291
+ }
292
+ if (config.fallback_models) {
293
+ for (const [peer, list] of Object.entries(config.fallback_models)) {
294
+ if (list && list.length > 0)
295
+ set(`${PEER_TO_ENV_PREFIX[peer]}_FALLBACK_MODELS`, list.join(","));
296
+ }
297
+ }
298
+ if (config.reasoning_effort) {
299
+ for (const [peer, effort] of Object.entries(config.reasoning_effort)) {
300
+ if (effort)
301
+ set(`${PEER_TO_ENV_PREFIX[peer]}_REASONING_EFFORT`, effort);
302
+ }
303
+ }
304
+ if (config.peer_enabled) {
305
+ for (const [peer, on] of Object.entries(config.peer_enabled)) {
306
+ if (on != null)
307
+ set(`CROSS_REVIEW_PEER_${peer.toUpperCase()}`, on ? "on" : "off");
308
+ }
309
+ }
310
+ if (config.cost_rates) {
311
+ for (const [peer, rate] of Object.entries(config.cost_rates)) {
312
+ if (!rate)
313
+ continue;
314
+ const prefix = PEER_TO_ENV_PREFIX[peer];
315
+ for (const [field, value] of Object.entries(rate)) {
316
+ if (value == null)
317
+ continue;
318
+ const suffix = COST_RATE_FIELD_TO_ENV_SUFFIX[field];
319
+ if (!suffix)
320
+ continue;
321
+ set(`${prefix}_${suffix}`, value);
322
+ }
323
+ }
324
+ }
325
+ if (config.budget) {
326
+ set("CROSS_REVIEW_MAX_SESSION_COST_USD", config.budget.max_session_cost_usd);
327
+ set("CROSS_REVIEW_UNTIL_STOPPED_MAX_COST_USD", config.budget.until_stopped_max_cost_usd);
328
+ set("CROSS_REVIEW_PREFLIGHT_MAX_ROUND_COST_USD", config.budget.preflight_max_round_cost_usd);
329
+ set("CROSS_REVIEW_DEFAULT_MAX_ROUNDS", config.budget.default_max_rounds);
330
+ set("CROSS_REVIEW_CIRCULAR_MAX_ROTATIONS", config.budget.circular_max_rotations);
331
+ }
332
+ if (config.retry) {
333
+ set("CROSS_REVIEW_RETRY_ATTEMPTS", config.retry.max_attempts);
334
+ set("CROSS_REVIEW_RETRY_BASE_MS", config.retry.base_delay_ms);
335
+ set("CROSS_REVIEW_RETRY_MAX_MS", config.retry.max_delay_ms);
336
+ set("CROSS_REVIEW_TIMEOUT_MS", config.retry.timeout_ms);
337
+ }
338
+ if (config.evidence_judge_autowire) {
339
+ set("CROSS_REVIEW_EVIDENCE_JUDGE_AUTOWIRE_MODE", config.evidence_judge_autowire.mode);
340
+ set("CROSS_REVIEW_EVIDENCE_JUDGE_AUTOWIRE_PEER", config.evidence_judge_autowire.peer);
341
+ if (config.evidence_judge_autowire.consensus_peers) {
342
+ set("CROSS_REVIEW_EVIDENCE_JUDGE_AUTOWIRE_CONSENSUS_PEERS", config.evidence_judge_autowire.consensus_peers.join(","));
343
+ }
344
+ set("CROSS_REVIEW_EVIDENCE_JUDGE_MAX_ITEMS_PER_PASS", config.evidence_judge_autowire.max_items_per_pass);
345
+ }
346
+ if (config.cache) {
347
+ if (config.cache.disable_cache != null) {
348
+ set("CROSS_REVIEW_DISABLE_CACHE", config.cache.disable_cache ? "true" : "false");
349
+ }
350
+ set("CROSS_REVIEW_CACHE_SCHEMA_VERSION", config.cache.schema_version);
351
+ set("CROSS_REVIEW_CACHE_TTL_ANTHROPIC", config.cache.ttl_anthropic);
352
+ set("CROSS_REVIEW_CACHE_TTL_OPENAI", config.cache.ttl_openai);
353
+ // v3.7.5 (A3): per-provider disable flags mapped to env vars.
354
+ if (config.cache.disable_anthropic != null) {
355
+ set("CROSS_REVIEW_DISABLE_CACHE_ANTHROPIC", config.cache.disable_anthropic ? "true" : "false");
356
+ }
357
+ if (config.cache.disable_openai != null) {
358
+ set("CROSS_REVIEW_DISABLE_CACHE_OPENAI", config.cache.disable_openai ? "true" : "false");
359
+ }
360
+ if (config.cache.disable_gemini != null) {
361
+ set("CROSS_REVIEW_DISABLE_CACHE_GEMINI", config.cache.disable_gemini ? "true" : "false");
362
+ }
363
+ if (config.cache.disable_deepseek != null) {
364
+ set("CROSS_REVIEW_DISABLE_CACHE_DEEPSEEK", config.cache.disable_deepseek ? "true" : "false");
365
+ }
366
+ if (config.cache.disable_grok != null) {
367
+ set("CROSS_REVIEW_DISABLE_CACHE_GROK", config.cache.disable_grok ? "true" : "false");
368
+ }
369
+ if (config.cache.disable_perplexity != null) {
370
+ set("CROSS_REVIEW_DISABLE_CACHE_PERPLEXITY", config.cache.disable_perplexity ? "true" : "false");
371
+ }
372
+ }
373
+ if (config.perplexity) {
374
+ set("CROSS_REVIEW_PERPLEXITY_SEARCH_CONTEXT_SIZE", config.perplexity.search_context_size);
375
+ if (config.perplexity.disable_search != null) {
376
+ set("CROSS_REVIEW_PERPLEXITY_DISABLE_SEARCH", config.perplexity.disable_search ? "true" : "false");
377
+ }
378
+ }
379
+ if (config.token_streaming) {
380
+ set("CROSS_REVIEW_TOKEN_DELTA_CHARS_THRESHOLD", config.token_streaming.chars_threshold);
381
+ set("CROSS_REVIEW_TOKEN_DELTA_MS_THRESHOLD", config.token_streaming.ms_threshold);
382
+ if (config.token_streaming.verbose != null) {
383
+ set("CROSS_REVIEW_TOKEN_DELTA_VERBOSE", config.token_streaming.verbose ? "1" : "0");
384
+ }
385
+ }
386
+ return out;
387
+ }
388
+ // Resolve the file path: CROSS_REVIEW_CONFIG_FILE env wins; else
389
+ // `${dataDir}/config.json`. Caller passes dataDir so this module does
390
+ // not need its own copy of the data-dir resolution logic.
391
+ //
392
+ // v3.1.0 R1 fix (codex cross-review catch 2026-05-12): accept an
393
+ // optional envValue helper so the path-lookup honors the v2.28.0
394
+ // Windows registry fallback. Without this, an operator who stores
395
+ // CROSS_REVIEW_CONFIG_FILE in HKCU\Environment (instead of the MCP
396
+ // host config) would see the override silently ignored. When the
397
+ // helper is omitted (e.g., external smoke callers), fall back to
398
+ // `process.env` directly to preserve backward compatibility.
399
+ export function resolveConfigFilePath(dataDir, envValue) {
400
+ const overridePath = envValue
401
+ ? envValue("CROSS_REVIEW_CONFIG_FILE")
402
+ : process.env.CROSS_REVIEW_CONFIG_FILE;
403
+ if (overridePath && overridePath.trim().length > 0) {
404
+ return path.resolve(overridePath);
405
+ }
406
+ return path.join(dataDir, "config.json");
407
+ }
408
+ // Public API used by `loadConfig()`. Reads the file (if present),
409
+ // validates with zod, flattens to env-var map, and writes each entry
410
+ // into process.env IFF the env var is not already explicitly set
411
+ // (process.env wins; Windows registry wins via existing v2.28.0
412
+ // fallback path inside envValue()). Caller passes `envValue` so we
413
+ // honor the same registry-fallback semantics without duplicating the
414
+ // cache logic.
415
+ //
416
+ // IDEMPOTENT — calling twice produces the same final state because the
417
+ // existence check uses envValue() which sees the post-first-call state.
418
+ //
419
+ // `parse_error` is set when the JSON or schema validation fails; the
420
+ // caller can surface this as a boot notice. We do NOT throw on file-
421
+ // load failure because the operator may have just started with a
422
+ // half-edited config; falling through to env+defaults is preferable to
423
+ // crashing the MCP host.
424
+ export function applyFileConfigToEnv(dataDir, envValue) {
425
+ // v3.1.0 R1 fix: thread envValue into resolveConfigFilePath so the
426
+ // CROSS_REVIEW_CONFIG_FILE override respects v2.28.0 registry
427
+ // fallback (operator-stored override path in HKCU\Environment works).
428
+ const filePath = resolveConfigFilePath(dataDir, envValue);
429
+ if (!fs.existsSync(filePath)) {
430
+ return { applied: false, path: filePath, fields_applied: 0, fields_overridden_by_env: 0 };
431
+ }
432
+ let raw;
433
+ try {
434
+ raw = fs.readFileSync(filePath, "utf8");
435
+ }
436
+ catch (error) {
437
+ return {
438
+ applied: false,
439
+ path: filePath,
440
+ fields_applied: 0,
441
+ fields_overridden_by_env: 0,
442
+ parse_error: `read_failed: ${error.message}`,
443
+ };
444
+ }
445
+ let parsed;
446
+ try {
447
+ parsed = JSON.parse(raw);
448
+ }
449
+ catch (error) {
450
+ return {
451
+ applied: false,
452
+ path: filePath,
453
+ fields_applied: 0,
454
+ fields_overridden_by_env: 0,
455
+ parse_error: `json_parse_failed: ${error.message}`,
456
+ };
457
+ }
458
+ const validated = FileConfigSchema.safeParse(parsed);
459
+ if (!validated.success) {
460
+ return {
461
+ applied: false,
462
+ path: filePath,
463
+ fields_applied: 0,
464
+ fields_overridden_by_env: 0,
465
+ parse_error: `schema_validation_failed: ${validated.error.message}`,
466
+ };
467
+ }
468
+ const envMap = flattenFileConfigToEnvMap(validated.data);
469
+ let applied = 0;
470
+ let overridden = 0;
471
+ for (const [name, value] of Object.entries(envMap)) {
472
+ // envValue() checks process.env AND Windows registry. Both win
473
+ // over the file. We only write the file's value when nothing has
474
+ // claimed this name yet.
475
+ const existing = envValue(name);
476
+ if (existing !== undefined && existing !== "") {
477
+ overridden++;
478
+ continue;
479
+ }
480
+ process.env[name] = value;
481
+ applied++;
482
+ }
483
+ return {
484
+ applied: true,
485
+ path: filePath,
486
+ fields_applied: applied,
487
+ fields_overridden_by_env: overridden,
488
+ };
489
+ }
490
+ //# sourceMappingURL=file-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-config.js","sourceRoot":"","sources":["../../../src/core/file-config.ts"],"names":[],"mappings":"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"}