@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,78 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { loadConfig } from "../src/core/config.js";
|
|
5
|
+
import { PEERS } from "../src/core/types.js";
|
|
6
|
+
import { resolveBestModels } from "../src/peers/model-selection.js";
|
|
7
|
+
import { createAdapters } from "../src/peers/registry.js";
|
|
8
|
+
process.env.CROSS_REVIEW_STUB = "0";
|
|
9
|
+
process.env.CROSS_REVIEW_STREAM_TOKENS = "1";
|
|
10
|
+
process.env.CROSS_REVIEW_DATA_DIR =
|
|
11
|
+
process.env.CROSS_REVIEW_DATA_DIR ||
|
|
12
|
+
path.join(os.tmpdir(), `cross-review-api-streaming-smoke-${Date.now()}`);
|
|
13
|
+
const config = loadConfig();
|
|
14
|
+
const missing = PEERS.filter((peer) => !config.api_keys[peer]);
|
|
15
|
+
if (missing.length > 0) {
|
|
16
|
+
throw new Error(`Missing API keys for real streaming smoke: ${missing.join(", ")}. ` +
|
|
17
|
+
"Set OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY and DEEPSEEK_API_KEY.");
|
|
18
|
+
}
|
|
19
|
+
await resolveBestModels(config);
|
|
20
|
+
const adapters = createAdapters(config);
|
|
21
|
+
function tokenChars(events, peer) {
|
|
22
|
+
return events
|
|
23
|
+
.filter((event) => event.type === "peer.token.delta" && event.peer === peer)
|
|
24
|
+
.reduce((total, event) => total + Number(event.data?.chars ?? 0), 0);
|
|
25
|
+
}
|
|
26
|
+
function usageSummary(usage) {
|
|
27
|
+
if (!usage)
|
|
28
|
+
return undefined;
|
|
29
|
+
return {
|
|
30
|
+
input_tokens: usage.input_tokens,
|
|
31
|
+
output_tokens: usage.output_tokens,
|
|
32
|
+
total_tokens: usage.total_tokens,
|
|
33
|
+
reasoning_tokens: usage.reasoning_tokens,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const prompt = [
|
|
37
|
+
"Real streaming smoke test.",
|
|
38
|
+
"Return a valid cross-review JSON decision with status READY.",
|
|
39
|
+
"Keep the summary short and do not include any secret or raw prompt text.",
|
|
40
|
+
].join("\n");
|
|
41
|
+
const results = [];
|
|
42
|
+
for (const peer of PEERS) {
|
|
43
|
+
const events = [];
|
|
44
|
+
const result = await adapters[peer].call(prompt, {
|
|
45
|
+
session_id: `api-streaming-smoke-${peer}`,
|
|
46
|
+
round: 1,
|
|
47
|
+
task: "Verify real provider token streaming for cross-review.",
|
|
48
|
+
stream: true,
|
|
49
|
+
stream_tokens: true,
|
|
50
|
+
emit(event) {
|
|
51
|
+
events.push(event);
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const deltaEvents = events.filter((event) => event.type === "peer.token.delta" && event.peer === peer);
|
|
55
|
+
const completedEvents = events.filter((event) => event.type === "peer.token.completed" && event.peer === peer);
|
|
56
|
+
assert.ok(deltaEvents.length > 0, `${peer} did not emit peer.token.delta events.`);
|
|
57
|
+
assert.equal(completedEvents.length, 1, `${peer} did not emit one completion event.`);
|
|
58
|
+
assert.ok(result.text.length > 0, `${peer} returned empty text.`);
|
|
59
|
+
results.push({
|
|
60
|
+
peer,
|
|
61
|
+
provider: result.provider,
|
|
62
|
+
requested_model: result.model,
|
|
63
|
+
reported_model: result.model_reported,
|
|
64
|
+
status: result.status,
|
|
65
|
+
decision_quality: result.decision_quality,
|
|
66
|
+
delta_events: deltaEvents.length,
|
|
67
|
+
streamed_chars: tokenChars(events, peer),
|
|
68
|
+
usage: usageSummary(result.usage),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
console.log(JSON.stringify({
|
|
72
|
+
ok: true,
|
|
73
|
+
streaming_tokens: config.streaming.tokens,
|
|
74
|
+
streaming_text: config.streaming.include_text,
|
|
75
|
+
data_dir: config.data_dir,
|
|
76
|
+
results,
|
|
77
|
+
}, null, 2));
|
|
78
|
+
//# sourceMappingURL=api-streaming-smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-streaming-smoke.js","sourceRoot":"","sources":["../../scripts/api-streaming-smoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// v2.15.0 (item 3, operator directive 2026-05-04 — project_cross_review_v2_v215_backlog_candidates.md):
|
|
2
|
+
// real-API smoke marker for "default model rejects parameter".
|
|
3
|
+
// Opt-in: requires CROSS_REVIEW_REAL_API_SMOKE=1 plus the relevant
|
|
4
|
+
// provider API keys in env. Stubs are NOT a substitute here — the whole
|
|
5
|
+
// point is to exercise live provider 4xx surfaces so the docs-hint path
|
|
6
|
+
// (item 5) and the per-model allowlist gate (item 6) prove themselves
|
|
7
|
+
// in production conditions, not just on synthetic inputs.
|
|
8
|
+
//
|
|
9
|
+
// What it does:
|
|
10
|
+
// - For each peer the operator opted into via PEERS_TO_TEST env (default
|
|
11
|
+
// grok), forces the model to a known-incompatible default and asks for
|
|
12
|
+
// a tiny generation. The expected outcome is either:
|
|
13
|
+
// (a) The runtime allowlist gate (item 6) drops `reasoning.effort`
|
|
14
|
+
// silently and the call SUCCEEDS — proves item 6.
|
|
15
|
+
// (b) The provider rejects with a 400 and the failure carries
|
|
16
|
+
// `recovery_hint: "consult_docs_then_revise"` plus a docs URL —
|
|
17
|
+
// proves item 5.
|
|
18
|
+
// - Anything else is a regression and exits non-zero.
|
|
19
|
+
//
|
|
20
|
+
// This script never runs in CI by default. It exists to be triggered
|
|
21
|
+
// after a v2.15.x ship + reload by the operator running:
|
|
22
|
+
// CROSS_REVIEW_REAL_API_SMOKE=1 \
|
|
23
|
+
// CROSS_REVIEW_GROK_MODEL=grok-4-latest \
|
|
24
|
+
// npm run runtime-default-smoke
|
|
25
|
+
import process from "node:process";
|
|
26
|
+
import { loadConfig } from "../src/core/config.js";
|
|
27
|
+
import { GrokAdapter, modelAcceptsReasoningEffort } from "../src/peers/grok.js";
|
|
28
|
+
const ENABLED = process.env.CROSS_REVIEW_REAL_API_SMOKE === "1";
|
|
29
|
+
if (!ENABLED) {
|
|
30
|
+
console.log("[runtime-default-smoke] CROSS_REVIEW_REAL_API_SMOKE!=1; this script is opt-in. Skipping.");
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
const peersToTest = (process.env.PEERS_TO_TEST ?? "grok").split(",").map((p) => p.trim());
|
|
34
|
+
const config = loadConfig();
|
|
35
|
+
let failures = 0;
|
|
36
|
+
function emit(event) {
|
|
37
|
+
// Suppress streaming token noise; surface only key lifecycle events.
|
|
38
|
+
if (event.type.startsWith("peer.token."))
|
|
39
|
+
return;
|
|
40
|
+
console.log(`[event] ${event.type} ${event.message ?? ""}`);
|
|
41
|
+
}
|
|
42
|
+
async function exerciseGrok() {
|
|
43
|
+
const model = config.models.grok;
|
|
44
|
+
console.log(`[runtime-default-smoke] grok model=${model}`);
|
|
45
|
+
console.log(`[runtime-default-smoke] modelAcceptsReasoningEffort(${model})=${modelAcceptsReasoningEffort(model)}`);
|
|
46
|
+
const adapter = new GrokAdapter(config);
|
|
47
|
+
const context = {
|
|
48
|
+
session_id: "00000000-0000-4000-8000-000000000000",
|
|
49
|
+
round: 0,
|
|
50
|
+
task: "runtime-default-smoke",
|
|
51
|
+
emit,
|
|
52
|
+
};
|
|
53
|
+
try {
|
|
54
|
+
const result = await adapter.generate("Reply with the single token: ok.", context);
|
|
55
|
+
console.log(`[runtime-default-smoke] grok generation ok: ${result.text.slice(0, 40)} (${result.latency_ms}ms)`);
|
|
56
|
+
if (!modelAcceptsReasoningEffort(model)) {
|
|
57
|
+
console.log("[runtime-default-smoke] PASS — non-allowlist model omitted reasoning.effort and succeeded (item 6 verified).");
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log("[runtime-default-smoke] PASS — allowlist model accepted reasoning.effort and succeeded.");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
65
|
+
if (/reasoning\.effort/i.test(message) &&
|
|
66
|
+
/\b(?:not\s+supported|invalid|400|argument)\b/i.test(message)) {
|
|
67
|
+
console.log(`[runtime-default-smoke] FAIL — provider rejected reasoning.effort but the runtime should have gated it. Message: ${message}`);
|
|
68
|
+
failures += 1;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log(`[runtime-default-smoke] grok call failed for an unrelated reason; not a v2.15 regression. Message: ${message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
for (const peer of peersToTest) {
|
|
76
|
+
if (peer === "grok") {
|
|
77
|
+
await exerciseGrok();
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.log(`[runtime-default-smoke] peer=${peer} not yet wired into this script; skipping.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (failures > 0) {
|
|
84
|
+
console.error(`[runtime-default-smoke] ${failures} regression(s) detected.`);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
console.log("[runtime-default-smoke] all checks passed.");
|
|
88
|
+
//# sourceMappingURL=runtime-default-smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-default-smoke.js","sourceRoot":"","sources":["../../scripts/runtime-default-smoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
3
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
4
|
+
import { MCP_REQUEST_TIMEOUT_MS } from "../src/core/timeouts.js";
|
|
5
|
+
const transport = new StdioClientTransport({
|
|
6
|
+
command: process.execPath,
|
|
7
|
+
args: ["dist/src/mcp/server.js"],
|
|
8
|
+
cwd: process.cwd(),
|
|
9
|
+
env: {
|
|
10
|
+
...process.env,
|
|
11
|
+
CROSS_REVIEW_STUB: process.env.CROSS_REVIEW_STUB ?? "1",
|
|
12
|
+
// v2.4.0 / audit closure (P1.1): runtime smoke is a legitimate stub
|
|
13
|
+
// consumer; opt in to the double-confirmation gate.
|
|
14
|
+
CROSS_REVIEW_STUB_CONFIRMED: process.env.CROSS_REVIEW_STUB_CONFIRMED ?? "1",
|
|
15
|
+
CROSS_REVIEW_MAX_SESSION_COST_USD: process.env.CROSS_REVIEW_MAX_SESSION_COST_USD ?? "1000",
|
|
16
|
+
CROSS_REVIEW_PREFLIGHT_MAX_ROUND_COST_USD: process.env.CROSS_REVIEW_PREFLIGHT_MAX_ROUND_COST_USD ?? "1000",
|
|
17
|
+
CROSS_REVIEW_UNTIL_STOPPED_MAX_COST_USD: process.env.CROSS_REVIEW_UNTIL_STOPPED_MAX_COST_USD ?? "1000",
|
|
18
|
+
CROSS_REVIEW_OPENAI_INPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_OPENAI_INPUT_USD_PER_MILLION ?? "1000",
|
|
19
|
+
CROSS_REVIEW_OPENAI_OUTPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_OPENAI_OUTPUT_USD_PER_MILLION ?? "1000",
|
|
20
|
+
CROSS_REVIEW_ANTHROPIC_INPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_ANTHROPIC_INPUT_USD_PER_MILLION ?? "1000",
|
|
21
|
+
CROSS_REVIEW_ANTHROPIC_OUTPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_ANTHROPIC_OUTPUT_USD_PER_MILLION ?? "1000",
|
|
22
|
+
CROSS_REVIEW_GEMINI_INPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_GEMINI_INPUT_USD_PER_MILLION ?? "1000",
|
|
23
|
+
CROSS_REVIEW_GEMINI_OUTPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_GEMINI_OUTPUT_USD_PER_MILLION ?? "1000",
|
|
24
|
+
CROSS_REVIEW_DEEPSEEK_INPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_DEEPSEEK_INPUT_USD_PER_MILLION ?? "1000",
|
|
25
|
+
CROSS_REVIEW_DEEPSEEK_OUTPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_DEEPSEEK_OUTPUT_USD_PER_MILLION ?? "1000",
|
|
26
|
+
// v3.7.4 (Codex v3.7.3 parecer AUDIT-1): the public MCP path strips a
|
|
27
|
+
// caller's `peers` list (v3.3.0 `lockCallerPeerSelection`), so every
|
|
28
|
+
// round here runs the full server-configured 6-peer panel — grok and
|
|
29
|
+
// perplexity included. Without their rate cards `missingFinancialControlVars`
|
|
30
|
+
// trips and the round finalizes `outcome=max-rounds` /
|
|
31
|
+
// `financial_controls_missing` instead of actually running. Inject all
|
|
32
|
+
// six peers' cost rates so the round genuinely converges and the
|
|
33
|
+
// outcome asserts below mean something.
|
|
34
|
+
CROSS_REVIEW_GROK_INPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_GROK_INPUT_USD_PER_MILLION ?? "1000",
|
|
35
|
+
CROSS_REVIEW_GROK_OUTPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_GROK_OUTPUT_USD_PER_MILLION ?? "1000",
|
|
36
|
+
CROSS_REVIEW_PERPLEXITY_INPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_PERPLEXITY_INPUT_USD_PER_MILLION ?? "1000",
|
|
37
|
+
CROSS_REVIEW_PERPLEXITY_OUTPUT_USD_PER_MILLION: process.env.CROSS_REVIEW_PERPLEXITY_OUTPUT_USD_PER_MILLION ?? "1000",
|
|
38
|
+
// Perplexity also bills a per-1000-requests search fee; when search is
|
|
39
|
+
// enabled `missingFinancialControlVars` requires the request fee for
|
|
40
|
+
// the configured `search_context_size`. This stub smoke does not
|
|
41
|
+
// exercise paid search, so disable it — and, belt-and-suspenders in
|
|
42
|
+
// case an inherited operator env re-enables it, inject the request fee
|
|
43
|
+
// for every search_context_size so the financial preflight passes
|
|
44
|
+
// regardless.
|
|
45
|
+
CROSS_REVIEW_PERPLEXITY_DISABLE_SEARCH: process.env.CROSS_REVIEW_PERPLEXITY_DISABLE_SEARCH ?? "1",
|
|
46
|
+
CROSS_REVIEW_PERPLEXITY_REQUEST_FEE_LOW_USD_PER_1000_REQUESTS: process.env.CROSS_REVIEW_PERPLEXITY_REQUEST_FEE_LOW_USD_PER_1000_REQUESTS ?? "0",
|
|
47
|
+
CROSS_REVIEW_PERPLEXITY_REQUEST_FEE_MEDIUM_USD_PER_1000_REQUESTS: process.env.CROSS_REVIEW_PERPLEXITY_REQUEST_FEE_MEDIUM_USD_PER_1000_REQUESTS ?? "0",
|
|
48
|
+
CROSS_REVIEW_PERPLEXITY_REQUEST_FEE_HIGH_USD_PER_1000_REQUESTS: process.env.CROSS_REVIEW_PERPLEXITY_REQUEST_FEE_HIGH_USD_PER_1000_REQUESTS ?? "0",
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
const client = new Client({ name: "cross-review-runtime-smoke", version: "0.0.0" });
|
|
52
|
+
async function callTool(name, args) {
|
|
53
|
+
const result = await client.callTool({ name, arguments: args }, undefined, {
|
|
54
|
+
timeout: MCP_REQUEST_TIMEOUT_MS,
|
|
55
|
+
maxTotalTimeout: MCP_REQUEST_TIMEOUT_MS,
|
|
56
|
+
});
|
|
57
|
+
const content = result.content ?? [];
|
|
58
|
+
const text = content[0]?.type === "text" ? (content[0].text ?? "{}") : "{}";
|
|
59
|
+
return JSON.parse(text);
|
|
60
|
+
}
|
|
61
|
+
async function pollUntilDone(sessionId) {
|
|
62
|
+
for (let attempt = 0; attempt < 20; attempt++) {
|
|
63
|
+
const state = (await callTool("session_poll", {
|
|
64
|
+
session_id: sessionId,
|
|
65
|
+
response_format: "json",
|
|
66
|
+
}));
|
|
67
|
+
if (state.jobs?.some((job) => job.status === "completed" || job.status === "failed" || job.status === "cancelled")) {
|
|
68
|
+
return state;
|
|
69
|
+
}
|
|
70
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`Timed out polling runtime-smoke session ${sessionId}`);
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await client.connect(transport);
|
|
76
|
+
const serverInfo = await callTool("server_info", { response_format: "json" });
|
|
77
|
+
const capabilities = await callTool("runtime_capabilities", { response_format: "json" });
|
|
78
|
+
const roundStart = (await callTool("session_start_round", {
|
|
79
|
+
task: "Runtime smoke: verify async review round.",
|
|
80
|
+
review_focus: "runtime/smoke",
|
|
81
|
+
draft: "Runtime smoke draft.",
|
|
82
|
+
peers: ["codex"],
|
|
83
|
+
response_format: "json",
|
|
84
|
+
}));
|
|
85
|
+
const roundState = await pollUntilDone(roundStart.session_id);
|
|
86
|
+
const events = await callTool("session_events", {
|
|
87
|
+
session_id: roundStart.session_id,
|
|
88
|
+
response_format: "json",
|
|
89
|
+
});
|
|
90
|
+
const report = await callTool("session_report", {
|
|
91
|
+
session_id: roundStart.session_id,
|
|
92
|
+
response_format: "json",
|
|
93
|
+
});
|
|
94
|
+
const unanimousStart = (await callTool("session_start_unanimous", {
|
|
95
|
+
task: "Runtime smoke: verify async unanimity flow.",
|
|
96
|
+
review_focus: "runtime/unanimous",
|
|
97
|
+
lead_peer: "codex",
|
|
98
|
+
peers: ["claude"],
|
|
99
|
+
max_rounds: 2,
|
|
100
|
+
response_format: "json",
|
|
101
|
+
}));
|
|
102
|
+
const unanimousState = await pollUntilDone(unanimousStart.session_id);
|
|
103
|
+
const cancelStart = (await callTool("session_start_round", {
|
|
104
|
+
task: "Runtime smoke: verify cancellation tool.",
|
|
105
|
+
draft: "FORCE_CANCEL_SLOW",
|
|
106
|
+
peers: ["codex"],
|
|
107
|
+
response_format: "json",
|
|
108
|
+
}));
|
|
109
|
+
const cancelResult = await callTool("session_cancel_job", {
|
|
110
|
+
session_id: cancelStart.session_id,
|
|
111
|
+
job_id: cancelStart.job.job_id,
|
|
112
|
+
reason: "runtime_smoke_cancel",
|
|
113
|
+
response_format: "json",
|
|
114
|
+
});
|
|
115
|
+
const cancelState = await pollUntilDone(cancelStart.session_id);
|
|
116
|
+
const metrics = await callTool("session_metrics", { response_format: "json" });
|
|
117
|
+
const recovery = await callTool("session_recover_interrupted", { response_format: "json" });
|
|
118
|
+
// v3.7.4 (Codex v3.7.3 parecer AUDIT-1): assert the durable terminal
|
|
119
|
+
// state of every async flow this smoke claims to exercise. Without these
|
|
120
|
+
// the harness printed `ok: true` even when a round was silently blocked
|
|
121
|
+
// by the financial preflight (`outcome=max-rounds`) instead of actually
|
|
122
|
+
// running. These asserts run BEFORE the `ok: true` print, so any flow
|
|
123
|
+
// that did not reach its intended terminal state fails the smoke loudly
|
|
124
|
+
// with a non-zero exit.
|
|
125
|
+
assert.equal(roundState.outcome, "converged", `runtime-smoke: review round did not converge — outcome=${String(roundState.outcome)}`);
|
|
126
|
+
assert.equal(unanimousState.outcome, "converged", `runtime-smoke: unanimity flow did not converge — outcome=${String(unanimousState.outcome)}`);
|
|
127
|
+
assert.equal(cancelState.outcome, "aborted", `runtime-smoke: cancellation flow did not abort — outcome=${String(cancelState.outcome)}`);
|
|
128
|
+
console.log(JSON.stringify({
|
|
129
|
+
ok: true,
|
|
130
|
+
serverInfo,
|
|
131
|
+
capabilities,
|
|
132
|
+
round_session_id: roundStart.session_id,
|
|
133
|
+
roundState,
|
|
134
|
+
events,
|
|
135
|
+
report,
|
|
136
|
+
unanimous_session_id: unanimousStart.session_id,
|
|
137
|
+
unanimousState,
|
|
138
|
+
cancel_session_id: cancelStart.session_id,
|
|
139
|
+
cancelResult,
|
|
140
|
+
cancelState,
|
|
141
|
+
metrics,
|
|
142
|
+
recovery,
|
|
143
|
+
}, null, 2));
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
await client.close();
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=runtime-smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-smoke.js","sourceRoot":"","sources":["../../scripts/runtime-smoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|