@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,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 {};