@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.
- package/CHANGELOG.md +2568 -0
- package/LICENSE +201 -0
- package/NOTICE +26 -0
- package/README.md +208 -0
- package/SECURITY.md +52 -0
- package/dist/scripts/api-streaming-smoke.d.ts +1 -0
- package/dist/scripts/api-streaming-smoke.js +78 -0
- package/dist/scripts/api-streaming-smoke.js.map +1 -0
- package/dist/scripts/runtime-default-smoke.d.ts +1 -0
- package/dist/scripts/runtime-default-smoke.js +88 -0
- package/dist/scripts/runtime-default-smoke.js.map +1 -0
- package/dist/scripts/runtime-smoke.d.ts +1 -0
- package/dist/scripts/runtime-smoke.js +148 -0
- package/dist/scripts/runtime-smoke.js.map +1 -0
- package/dist/scripts/smoke.d.ts +1 -0
- package/dist/scripts/smoke.js +6156 -0
- package/dist/scripts/smoke.js.map +1 -0
- package/dist/src/core/cache-manifest.d.ts +22 -0
- package/dist/src/core/cache-manifest.js +133 -0
- package/dist/src/core/cache-manifest.js.map +1 -0
- package/dist/src/core/caller-tokens.d.ts +32 -0
- package/dist/src/core/caller-tokens.js +240 -0
- package/dist/src/core/caller-tokens.js.map +1 -0
- package/dist/src/core/config.d.ts +9 -0
- package/dist/src/core/config.js +643 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/convergence.d.ts +5 -0
- package/dist/src/core/convergence.js +186 -0
- package/dist/src/core/convergence.js.map +1 -0
- package/dist/src/core/cost.d.ts +59 -0
- package/dist/src/core/cost.js +359 -0
- package/dist/src/core/cost.js.map +1 -0
- package/dist/src/core/file-config.d.ts +316 -0
- package/dist/src/core/file-config.js +490 -0
- package/dist/src/core/file-config.js.map +1 -0
- package/dist/src/core/orchestrator.d.ts +199 -0
- package/dist/src/core/orchestrator.js +3430 -0
- package/dist/src/core/orchestrator.js.map +1 -0
- package/dist/src/core/prompt-parts.d.ts +58 -0
- package/dist/src/core/prompt-parts.js +122 -0
- package/dist/src/core/prompt-parts.js.map +1 -0
- package/dist/src/core/relator-lottery.d.ts +23 -0
- package/dist/src/core/relator-lottery.js +112 -0
- package/dist/src/core/relator-lottery.js.map +1 -0
- package/dist/src/core/reports.d.ts +2 -0
- package/dist/src/core/reports.js +82 -0
- package/dist/src/core/reports.js.map +1 -0
- package/dist/src/core/session-store.d.ts +149 -0
- package/dist/src/core/session-store.js +1923 -0
- package/dist/src/core/session-store.js.map +1 -0
- package/dist/src/core/status.d.ts +61 -0
- package/dist/src/core/status.js +249 -0
- package/dist/src/core/status.js.map +1 -0
- package/dist/src/core/timeouts.d.ts +2 -0
- package/dist/src/core/timeouts.js +3 -0
- package/dist/src/core/timeouts.js.map +1 -0
- package/dist/src/core/types.d.ts +604 -0
- package/dist/src/core/types.js +36 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/dashboard/server.d.ts +2 -0
- package/dist/src/dashboard/server.js +339 -0
- package/dist/src/dashboard/server.js.map +1 -0
- package/dist/src/mcp/server.d.ts +54 -0
- package/dist/src/mcp/server.js +1584 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/observability/logger.d.ts +9 -0
- package/dist/src/observability/logger.js +24 -0
- package/dist/src/observability/logger.js.map +1 -0
- package/dist/src/peers/anthropic.d.ts +14 -0
- package/dist/src/peers/anthropic.js +290 -0
- package/dist/src/peers/anthropic.js.map +1 -0
- package/dist/src/peers/base.d.ts +72 -0
- package/dist/src/peers/base.js +416 -0
- package/dist/src/peers/base.js.map +1 -0
- package/dist/src/peers/deepseek.d.ts +12 -0
- package/dist/src/peers/deepseek.js +246 -0
- package/dist/src/peers/deepseek.js.map +1 -0
- package/dist/src/peers/errors.d.ts +2 -0
- package/dist/src/peers/errors.js +185 -0
- package/dist/src/peers/errors.js.map +1 -0
- package/dist/src/peers/gemini.d.ts +13 -0
- package/dist/src/peers/gemini.js +215 -0
- package/dist/src/peers/gemini.js.map +1 -0
- package/dist/src/peers/grok.d.ts +17 -0
- package/dist/src/peers/grok.js +346 -0
- package/dist/src/peers/grok.js.map +1 -0
- package/dist/src/peers/model-selection.d.ts +4 -0
- package/dist/src/peers/model-selection.js +260 -0
- package/dist/src/peers/model-selection.js.map +1 -0
- package/dist/src/peers/openai.d.ts +14 -0
- package/dist/src/peers/openai.js +299 -0
- package/dist/src/peers/openai.js.map +1 -0
- package/dist/src/peers/perplexity.d.ts +18 -0
- package/dist/src/peers/perplexity.js +375 -0
- package/dist/src/peers/perplexity.js.map +1 -0
- package/dist/src/peers/registry.d.ts +3 -0
- package/dist/src/peers/registry.js +77 -0
- package/dist/src/peers/registry.js.map +1 -0
- package/dist/src/peers/retry.d.ts +2 -0
- package/dist/src/peers/retry.js +36 -0
- package/dist/src/peers/retry.js.map +1 -0
- package/dist/src/peers/stub.d.ts +13 -0
- package/dist/src/peers/stub.js +344 -0
- package/dist/src/peers/stub.js.map +1 -0
- package/dist/src/peers/text.d.ts +18 -0
- package/dist/src/peers/text.js +39 -0
- package/dist/src/peers/text.js.map +1 -0
- package/dist/src/security/redact.d.ts +2 -0
- package/dist/src/security/redact.js +128 -0
- package/dist/src/security/redact.js.map +1 -0
- package/docs/api-keys.md +34 -0
- package/docs/architecture.md +118 -0
- package/docs/caching.md +135 -0
- package/docs/costs.md +40 -0
- package/docs/evidence-preflight.md +88 -0
- package/docs/github-security-baseline.md +32 -0
- package/docs/model-selection.md +105 -0
- package/docs/reports/cross-review-v2-api-capability-smoke-2026-04-30.md +354 -0
- package/docs/reports/cross-review-v2-format-recovery-findings-2026-04-28.md +223 -0
- package/docs/reports/cross-review-v2-official-provider-docs-refresh-2026-05-05.md +60 -0
- package/docs/reports/cross-review-v2-token-streaming-smoke-2026-04-30.md +119 -0
- 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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"}
|