@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,260 @@
1
+ import { loadAnthropicCtor } from "./anthropic.js";
2
+ import { loadGenaiModule } from "./gemini.js";
3
+ import { loadOpenAICtor } from "./openai.js";
4
+ const DOCS = {
5
+ codex: "https://developers.openai.com/api/docs/guides/latest-model",
6
+ claude: "https://platform.claude.com/docs/en/about-claude/models/overview",
7
+ gemini: "https://ai.google.dev/gemini-api/docs/models",
8
+ deepseek: "https://api-docs.deepseek.com/updates",
9
+ grok: "https://docs.x.ai/developers/model-capabilities/text/reasoning",
10
+ // v3.0.0: Perplexity Sonar API documents 4 models. Reference page
11
+ // lists `sonar`, `sonar-pro`, `sonar-reasoning-pro`, and
12
+ // `sonar-deep-research`. The Sonar API does NOT publish a
13
+ // `models.list` endpoint via the OpenAI-SDK base path, so model
14
+ // selection here is documented-priority only (no live API probe).
15
+ perplexity: "https://docs.perplexity.ai/getting-started/models",
16
+ };
17
+ // v3.7.2 (AUDIT-3, Codex 3rd super-audit + operator directive 2026-05-14):
18
+ // NO MODEL FALLBACK. Every peer is pinned to a SINGLE canonical model — the
19
+ // most advanced "pro" model with reasoning for that provider. Operator
20
+ // directive: "não quero fallback de modelos. É um único modelo pinado e
21
+ // pronto. E sempre o modelo mais avançado, pro, com reasoning."
22
+ // `selectFromCandidates` picks the first PRIORITY entry the provider's live
23
+ // list contains; with a lone entry it either selects that canonical model
24
+ // or falls through to the configured `fallback` (config.models[peer]) — it
25
+ // can NEVER silently auto-select an off-policy model. The only escape hatch
26
+ // is the explicit per-host env override (CROSS_REVIEW_<PROVIDER>_MODEL).
27
+ // Pre-v3.7.2 codex/claude/grok kept multi-entry same-provider chains and
28
+ // gemini/deepseek were trimmed in v3.7.1; this completes the trim for all 6.
29
+ const PRIORITY = {
30
+ codex: ["gpt-5.5"],
31
+ claude: ["claude-opus-4-7"],
32
+ gemini: ["gemini-2.5-pro"],
33
+ deepseek: ["deepseek-v4-pro"],
34
+ // grok-4-latest: operator-chosen canonical pin for cross-review
35
+ // (directive 2026-05-14, superseding the prior grok-4.20-multi-agent
36
+ // pin). It does automatic reasoning and must omit the explicit
37
+ // `reasoning.effort` field — the adapter handles that via
38
+ // `modelAcceptsReasoningEffort`.
39
+ grok: ["grok-4-latest"],
40
+ perplexity: ["sonar-reasoning-pro"],
41
+ };
42
+ function envOverrideName(peer) {
43
+ switch (peer) {
44
+ case "codex":
45
+ return "CROSS_REVIEW_OPENAI_MODEL";
46
+ case "claude":
47
+ return "CROSS_REVIEW_ANTHROPIC_MODEL";
48
+ case "gemini":
49
+ return "CROSS_REVIEW_GEMINI_MODEL";
50
+ case "deepseek":
51
+ return "CROSS_REVIEW_DEEPSEEK_MODEL";
52
+ case "grok":
53
+ return "CROSS_REVIEW_GROK_MODEL";
54
+ case "perplexity":
55
+ return "CROSS_REVIEW_PERPLEXITY_MODEL";
56
+ }
57
+ }
58
+ function keyPresent(config, peer) {
59
+ return Boolean(config.api_keys[peer]);
60
+ }
61
+ function modelId(value) {
62
+ return value.replace(/^models\//, "");
63
+ }
64
+ export function selectFromCandidates(peer, candidates, fallback) {
65
+ const available = new Set(candidates.map((candidate) => modelId(candidate.id)));
66
+ const priority = PRIORITY[peer];
67
+ const selected = priority.find((id) => available.has(id));
68
+ return {
69
+ peer,
70
+ selected: modelId(selected ?? fallback),
71
+ candidates,
72
+ source_url: DOCS[peer],
73
+ confidence: selected ? "verified" : candidates.length > 0 ? "unknown" : "inferred",
74
+ reason: selected
75
+ ? `Selected the first available advanced thinking model from the documented priority list: ${priority.join(" > ")}.`
76
+ : candidates.length > 0
77
+ ? `Model API returned candidates, but none matched the advanced thinking priority list (${priority.join(" > ")}); using documented fallback ${fallback} so the run fails visibly if unavailable instead of silently downgrading.`
78
+ : `Model API unavailable; using documented fallback ${fallback}.`,
79
+ };
80
+ }
81
+ function overrideSelection(peer, value) {
82
+ // v2.4.0 / audit closure: warn when an env override does not match any
83
+ // entry in the documented PRIORITY list. Pre-v2.4.0 a typo
84
+ // (`gpt-5.5-fast` vs `gpt-5.5`) would silently propagate to the
85
+ // provider and surface as a 404/invalid-model error mid-round, far
86
+ // from the env-config root cause. We do NOT throw — the operator may
87
+ // legitimately pin a model outside the maintained list — but the
88
+ // `confidence: "inferred"` plus the explicit notice in the reason
89
+ // string make the deviation observable.
90
+ const known = PRIORITY[peer].includes(value);
91
+ return {
92
+ peer,
93
+ selected: value,
94
+ candidates: [{ id: value, source: "env-override" }],
95
+ source_url: DOCS[peer],
96
+ confidence: known ? "verified" : "inferred",
97
+ reason: known
98
+ ? `${envOverrideName(peer)} is set; the explicit override has priority over automatic selection.`
99
+ : `${envOverrideName(peer)}='${value}' is set but is not in the documented priority list (${PRIORITY[peer].join(" > ")}); honoring the operator override but flagging confidence=inferred so any provider 404 surfaces here.`,
100
+ };
101
+ }
102
+ async function openAIModels(config) {
103
+ const apiKey = config.api_keys.codex;
104
+ if (!apiKey)
105
+ return [];
106
+ const Ctor = await loadOpenAICtor();
107
+ const list = await new Ctor({ apiKey }).models.list();
108
+ return list.data
109
+ .map((model) => ({
110
+ id: model.id,
111
+ source: "api",
112
+ metadata: { owned_by: model.owned_by, created: model.created },
113
+ }))
114
+ .filter((model) => /^gpt-|^o\d|codex/i.test(model.id));
115
+ }
116
+ async function anthropicModels(config) {
117
+ const apiKey = config.api_keys.claude;
118
+ if (!apiKey)
119
+ return [];
120
+ const Ctor = await loadAnthropicCtor();
121
+ const client = new Ctor({ apiKey, timeout: config.retry.timeout_ms });
122
+ const page = await client.models.list({ limit: 100 });
123
+ return page.data.map((model) => ({
124
+ id: model.id,
125
+ display_name: model.display_name,
126
+ source: "api",
127
+ metadata: {
128
+ created_at: model.created_at,
129
+ max_input_tokens: model.max_input_tokens,
130
+ max_tokens: model.max_tokens,
131
+ capabilities: model.capabilities,
132
+ },
133
+ }));
134
+ }
135
+ async function geminiModels(config) {
136
+ const apiKey = config.api_keys.gemini;
137
+ if (!apiKey)
138
+ return [];
139
+ const genai = await loadGenaiModule();
140
+ const pager = await new genai.GoogleGenAI({ apiKey }).models.list({
141
+ config: { pageSize: 1000 },
142
+ });
143
+ const candidates = [];
144
+ for await (const model of pager) {
145
+ const id = modelId(model.name ?? model.displayName ?? "");
146
+ if (!id)
147
+ continue;
148
+ const supported = model.supportedActions ?? [];
149
+ if (!supported.includes("generateContent"))
150
+ continue;
151
+ candidates.push({
152
+ id,
153
+ display_name: model.displayName,
154
+ source: "api",
155
+ metadata: {
156
+ description: model.description,
157
+ inputTokenLimit: model.inputTokenLimit,
158
+ outputTokenLimit: model.outputTokenLimit,
159
+ thinking: model.thinking,
160
+ supportedActions: supported,
161
+ },
162
+ });
163
+ }
164
+ return candidates;
165
+ }
166
+ async function deepSeekModels(config) {
167
+ const apiKey = config.api_keys.deepseek;
168
+ if (!apiKey)
169
+ return [];
170
+ const Ctor = await loadOpenAICtor();
171
+ const list = await new Ctor({ apiKey, baseURL: "https://api.deepseek.com" }).models.list();
172
+ return list.data.map((model) => ({
173
+ id: model.id,
174
+ source: "api",
175
+ metadata: { owned_by: model.owned_by, created: model.created },
176
+ }));
177
+ }
178
+ // v2.14.0: Grok models via xAI's OpenAI-compatible API at api.x.ai/v1.
179
+ async function grokModels(config) {
180
+ const apiKey = config.api_keys.grok;
181
+ if (!apiKey)
182
+ return [];
183
+ const Ctor = await loadOpenAICtor();
184
+ const list = await new Ctor({ apiKey, baseURL: "https://api.x.ai/v1" }).models.list();
185
+ return list.data.map((model) => ({
186
+ id: model.id,
187
+ source: "api",
188
+ metadata: { owned_by: model.owned_by, created: model.created },
189
+ }));
190
+ }
191
+ // v3.0.0: Perplexity does NOT expose a public `models.list` endpoint
192
+ // via the OpenAI-SDK base path (the Sonar API is the only documented
193
+ // surface). Operators choose among the 4 documented Sonar models via
194
+ // CROSS_REVIEW_PERPLEXITY_MODEL; this resolver returns an empty live-
195
+ // candidate set so `selectFromCandidates` falls through to the
196
+ // documented PRIORITY list with confidence "inferred". The probe step
197
+ // in `peers/perplexity.ts` still validates that the API key works at
198
+ // boot via a minimal `disable_search` round-trip.
199
+ async function perplexityModels(config) {
200
+ const apiKey = config.api_keys.perplexity;
201
+ if (!apiKey)
202
+ return [];
203
+ return [];
204
+ }
205
+ async function candidatesForPeer(config, peer) {
206
+ switch (peer) {
207
+ case "codex":
208
+ return openAIModels(config);
209
+ case "claude":
210
+ return anthropicModels(config);
211
+ case "gemini":
212
+ return geminiModels(config);
213
+ case "deepseek":
214
+ return deepSeekModels(config);
215
+ case "grok":
216
+ return grokModels(config);
217
+ case "perplexity":
218
+ return perplexityModels(config);
219
+ }
220
+ }
221
+ export async function resolveBestModel(config, peer) {
222
+ const envOverride = process.env[envOverrideName(peer)];
223
+ if (envOverride)
224
+ return overrideSelection(peer, envOverride);
225
+ if (!keyPresent(config, peer)) {
226
+ return {
227
+ peer,
228
+ selected: config.models[peer] ?? PRIORITY[peer][0],
229
+ candidates: [],
230
+ source_url: DOCS[peer],
231
+ confidence: "inferred",
232
+ reason: "API key is missing in the current process; using the documented fallback until the key is available.",
233
+ };
234
+ }
235
+ try {
236
+ const candidates = await candidatesForPeer(config, peer);
237
+ return selectFromCandidates(peer, candidates, PRIORITY[peer][0]);
238
+ }
239
+ catch (error) {
240
+ const message = error instanceof Error ? error.message : String(error);
241
+ return {
242
+ peer,
243
+ selected: config.models[peer] ?? PRIORITY[peer][0],
244
+ candidates: [],
245
+ source_url: DOCS[peer],
246
+ confidence: "unknown",
247
+ reason: `Failed to query the model API; using the current fallback. Error: ${message}`,
248
+ };
249
+ }
250
+ }
251
+ export async function resolveBestModels(config) {
252
+ const entries = await Promise.all(Object.keys(config.models).map(async (peer) => [peer, await resolveBestModel(config, peer)]));
253
+ const selections = Object.fromEntries(entries);
254
+ for (const [peer, selection] of entries) {
255
+ config.models[peer] = selection.selected;
256
+ config.model_selection[peer] = selection;
257
+ }
258
+ return selections;
259
+ }
260
+ //# sourceMappingURL=model-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../../src/peers/model-selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type OpenAI from "openai";
2
+ import type { AppConfig, GenerationResult, PeerAdapter, PeerCallContext, PeerId, PeerProbeResult, PeerResult } from "../core/types.js";
3
+ import { BasePeerAdapter } from "./base.js";
4
+ export declare function loadOpenAICtor(): Promise<typeof OpenAI>;
5
+ export declare class OpenAIAdapter extends BasePeerAdapter implements PeerAdapter {
6
+ id: PeerId;
7
+ provider: string;
8
+ model: string;
9
+ constructor(config: AppConfig, modelOverride?: string);
10
+ private client;
11
+ probe(): Promise<PeerProbeResult>;
12
+ call(prompt: string, context: PeerCallContext): Promise<PeerResult>;
13
+ generate(prompt: string, context: PeerCallContext): Promise<GenerationResult>;
14
+ }
@@ -0,0 +1,299 @@
1
+ import { statusInstruction, statusJsonSchema } from "../core/status.js";
2
+ import { BasePeerAdapter, StreamBuffer } from "./base.js";
3
+ import { classifyProviderError } from "./errors.js";
4
+ import { pairScopedCacheKey } from "../core/prompt-parts.js";
5
+ import { withRetry } from "./retry.js";
6
+ import { textFromOpenAIResponse, userPrompt } from "./text.js";
7
+ function usageFromOpenAI(usage) {
8
+ if (!usage)
9
+ return undefined;
10
+ const cached = usage.prompt_tokens_details?.cached_tokens ?? usage.input_tokens_details?.cached_tokens ?? 0;
11
+ const inputTokens = usage.input_tokens ?? 0;
12
+ const result = {
13
+ input_tokens: usage.input_tokens,
14
+ output_tokens: usage.output_tokens,
15
+ total_tokens: usage.total_tokens,
16
+ reasoning_tokens: usage.output_tokens_details?.reasoning_tokens,
17
+ };
18
+ if (cached > 0) {
19
+ result.cache_read_tokens = cached;
20
+ // OpenAI does not separately report write tokens; the diff between
21
+ // total input and cached tokens is the "fresh" input tokens that
22
+ // were potentially cacheable for the next call.
23
+ if (inputTokens > cached)
24
+ result.cache_write_tokens = inputTokens - cached;
25
+ result.cache_provider_mode = "auto";
26
+ }
27
+ else {
28
+ result.cache_provider_mode = "auto";
29
+ }
30
+ return result;
31
+ }
32
+ // v2.21.0: caller identity is plumbed through PeerCallContext via
33
+ // `caller`. Default to "operator" when unset so legacy callers (no
34
+ // caller set) still get a stable cache key bucket.
35
+ function cacheKeyFor(adapter, config, caller) {
36
+ return pairScopedCacheKey(adapter.id, caller ?? "operator", config.cache.schema_version);
37
+ }
38
+ function openAIEffort(value) {
39
+ return value === "max" ? "xhigh" : (value ?? "xhigh");
40
+ }
41
+ // v2.27.1 (cold-start hardening): cache the SDK ctor between calls so
42
+ // the dynamic import only resolves once. Shared across OpenAI + DeepSeek
43
+ // + Grok adapters because all three drive the same `openai` package.
44
+ let _OpenAICtorPromise = null;
45
+ export function loadOpenAICtor() {
46
+ if (!_OpenAICtorPromise) {
47
+ _OpenAICtorPromise = import("openai").then((mod) => mod.default);
48
+ }
49
+ return _OpenAICtorPromise;
50
+ }
51
+ export class OpenAIAdapter extends BasePeerAdapter {
52
+ id = "codex";
53
+ provider = "openai";
54
+ model;
55
+ constructor(config, modelOverride) {
56
+ super(config);
57
+ this.model = modelOverride ?? config.models.codex;
58
+ }
59
+ async client() {
60
+ const apiKey = this.config.api_keys.codex;
61
+ if (!apiKey)
62
+ throw new Error("OPENAI_API_KEY was not found in environment variables.");
63
+ const Ctor = await loadOpenAICtor();
64
+ return new Ctor({ apiKey });
65
+ }
66
+ async probe() {
67
+ const started = Date.now();
68
+ const authPresent = Boolean(this.config.api_keys.codex);
69
+ if (!authPresent) {
70
+ return {
71
+ peer: this.id,
72
+ provider: this.provider,
73
+ model: this.model,
74
+ available: false,
75
+ auth_present: false,
76
+ latency_ms: Date.now() - started,
77
+ model_selection: this.config.model_selection.codex,
78
+ message: "OPENAI_API_KEY is missing.",
79
+ };
80
+ }
81
+ try {
82
+ const probeClient = await this.client();
83
+ await probeClient.models.list();
84
+ return {
85
+ peer: this.id,
86
+ provider: this.provider,
87
+ model: this.model,
88
+ available: true,
89
+ auth_present: true,
90
+ latency_ms: Date.now() - started,
91
+ model_selection: this.config.model_selection.codex,
92
+ };
93
+ }
94
+ catch (error) {
95
+ const failure = classifyProviderError(this.id, this.provider, this.model, error, 1, started);
96
+ return {
97
+ peer: this.id,
98
+ provider: this.provider,
99
+ model: this.model,
100
+ available: false,
101
+ auth_present: true,
102
+ latency_ms: Date.now() - started,
103
+ model_selection: this.config.model_selection.codex,
104
+ message: failure.message,
105
+ };
106
+ }
107
+ }
108
+ async call(prompt, context) {
109
+ const started = Date.now();
110
+ return withRetry(this.config, async (attempt) => {
111
+ context.emit({
112
+ type: "peer.call.started",
113
+ session_id: context.session_id,
114
+ round: context.round,
115
+ peer: this.id,
116
+ message: `OpenAI review attempt ${attempt}`,
117
+ });
118
+ const cacheKey = cacheKeyFor({ id: this.id }, this.config, context.caller);
119
+ const body = {
120
+ model: this.model,
121
+ input: [
122
+ { role: "system", content: this.systemPrompt(context) },
123
+ {
124
+ role: "user",
125
+ content: `${userPrompt(prompt)}\n\n${statusInstruction()}`,
126
+ },
127
+ ],
128
+ text: {
129
+ format: {
130
+ type: "json_schema",
131
+ name: "cross_review_status",
132
+ strict: true,
133
+ schema: statusJsonSchema,
134
+ },
135
+ verbosity: "low",
136
+ },
137
+ reasoning: {
138
+ effort: openAIEffort(context.reasoning_effort_override ?? this.config.reasoning_effort.codex),
139
+ },
140
+ store: false,
141
+ // OpenAI Responses API uses max_output_tokens, not Chat Completions max_tokens.
142
+ max_output_tokens: this.config.max_output_tokens,
143
+ // v2.21.0 (caching): pair-scoped prompt_cache_key. OpenAI uses
144
+ // this to bucket cache entries; same caller+peer pair shares
145
+ // hits across rounds within the configured retention window.
146
+ // v2.21.0 (caching): prompt_cache_retention accepts only
147
+ // "in_memory" | "24h" per OpenAI Responses API SDK types.
148
+ // We translate the operator-facing config flag (5m or 1h) to
149
+ // the closest accepted value: anything other than 1h →
150
+ // "in_memory" (the API default of ~5min); 1h → "24h"
151
+ // (extended retention, the only longer option).
152
+ ...(this.config.cache.enabled
153
+ ? {
154
+ prompt_cache_key: cacheKey,
155
+ prompt_cache_retention: (this.config.cache.ttl.openai === "1h"
156
+ ? "24h"
157
+ : "in_memory"),
158
+ }
159
+ : {}),
160
+ };
161
+ if (this.shouldStreamTokens(context)) {
162
+ const stream_buffer = new StreamBuffer(this.id);
163
+ const tokenStream = this.createTokenEventBuffer(context, "review", "response.output_text.delta");
164
+ let usage;
165
+ let modelReported;
166
+ const reviewClient = await this.client();
167
+ const stream = await reviewClient.responses.create({ ...body, stream: true }, { signal: context.signal, timeout: this.config.retry.timeout_ms });
168
+ for await (const event of stream) {
169
+ if (event.type === "response.output_text.delta") {
170
+ const delta = typeof event.delta === "string" ? event.delta : "";
171
+ stream_buffer.append(delta);
172
+ tokenStream.append(delta);
173
+ }
174
+ else if (event.type === "response.completed") {
175
+ usage = usageFromOpenAI(event.response?.usage);
176
+ modelReported = event.response?.model;
177
+ }
178
+ else if (event.type === "response.failed" || event.type === "response.error") {
179
+ const message = event.type === "response.failed"
180
+ ? event.response?.error?.message
181
+ : event.error?.message;
182
+ throw new Error(message ?? "OpenAI streaming response failed.");
183
+ }
184
+ }
185
+ const text = stream_buffer.text();
186
+ tokenStream.complete(text.length);
187
+ return this.resultFromText({
188
+ text,
189
+ raw: { streamed: true, provider: this.provider, model: modelReported ?? this.model },
190
+ usage,
191
+ started,
192
+ attempts: attempt,
193
+ modelReported,
194
+ });
195
+ }
196
+ const reviewClient = await this.client();
197
+ const response = await reviewClient.responses.create(body, {
198
+ signal: context.signal,
199
+ timeout: this.config.retry.timeout_ms,
200
+ });
201
+ return this.resultFromText({
202
+ text: textFromOpenAIResponse(response),
203
+ raw: response,
204
+ usage: usageFromOpenAI(response.usage),
205
+ started,
206
+ attempts: attempt,
207
+ modelReported: response.model,
208
+ });
209
+ }, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
210
+ }
211
+ async generate(prompt, context) {
212
+ const started = Date.now();
213
+ return withRetry(this.config, async (attempt) => {
214
+ context.emit({
215
+ type: "peer.generate.started",
216
+ session_id: context.session_id,
217
+ round: context.round,
218
+ peer: this.id,
219
+ message: `OpenAI generation attempt ${attempt}`,
220
+ });
221
+ const cacheKey = cacheKeyFor({ id: this.id }, this.config, context.caller);
222
+ const body = {
223
+ model: this.model,
224
+ input: [
225
+ { role: "system", content: this.systemPrompt(context) },
226
+ { role: "user", content: userPrompt(prompt) },
227
+ ],
228
+ reasoning: {
229
+ effort: openAIEffort(context.reasoning_effort_override ?? this.config.reasoning_effort.codex),
230
+ },
231
+ store: false,
232
+ max_output_tokens: this.config.max_output_tokens,
233
+ // v2.21.0 (caching): prompt_cache_retention accepts only
234
+ // "in_memory" | "24h" per OpenAI Responses API SDK types.
235
+ // We translate the operator-facing config flag (5m or 1h) to
236
+ // the closest accepted value: anything other than 1h →
237
+ // "in_memory" (the API default of ~5min); 1h → "24h"
238
+ // (extended retention, the only longer option).
239
+ ...(this.config.cache.enabled
240
+ ? {
241
+ prompt_cache_key: cacheKey,
242
+ prompt_cache_retention: (this.config.cache.ttl.openai === "1h"
243
+ ? "24h"
244
+ : "in_memory"),
245
+ }
246
+ : {}),
247
+ };
248
+ if (this.shouldStreamTokens(context)) {
249
+ const stream_buffer = new StreamBuffer(this.id);
250
+ const tokenStream = this.createTokenEventBuffer(context, "generation", "response.output_text.delta");
251
+ let usage;
252
+ let modelReported;
253
+ const generateClient = await this.client();
254
+ const stream = await generateClient.responses.create({ ...body, stream: true }, { signal: context.signal, timeout: this.config.retry.timeout_ms });
255
+ for await (const event of stream) {
256
+ if (event.type === "response.output_text.delta") {
257
+ const delta = typeof event.delta === "string" ? event.delta : "";
258
+ stream_buffer.append(delta);
259
+ tokenStream.append(delta);
260
+ }
261
+ else if (event.type === "response.completed") {
262
+ usage = usageFromOpenAI(event.response?.usage);
263
+ modelReported = event.response?.model;
264
+ }
265
+ else if (event.type === "response.failed" || event.type === "response.error") {
266
+ const message = event.type === "response.failed"
267
+ ? event.response?.error?.message
268
+ : event.error?.message;
269
+ throw new Error(message ?? "OpenAI streaming response failed.");
270
+ }
271
+ }
272
+ const text = stream_buffer.text();
273
+ tokenStream.complete(text.length);
274
+ return this.generationFromText({
275
+ text,
276
+ raw: { streamed: true, provider: this.provider, model: modelReported ?? this.model },
277
+ usage,
278
+ started,
279
+ attempts: attempt,
280
+ modelReported,
281
+ });
282
+ }
283
+ const generateClient = await this.client();
284
+ const response = await generateClient.responses.create(body, {
285
+ signal: context.signal,
286
+ timeout: this.config.retry.timeout_ms,
287
+ });
288
+ return this.generationFromText({
289
+ text: textFromOpenAIResponse(response),
290
+ raw: response,
291
+ usage: usageFromOpenAI(response.usage),
292
+ started,
293
+ attempts: attempt,
294
+ modelReported: response.model,
295
+ });
296
+ }, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
297
+ }
298
+ }
299
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/peers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AppConfig, GenerationResult, PeerAdapter, PeerCallContext, PeerId, PeerProbeResult, PeerResult } from "../core/types.js";
2
+ import { BasePeerAdapter } from "./base.js";
3
+ export declare function stripPerplexityThinkingBlock(raw: string): string;
4
+ type PerplexityReasoningEffort = "minimal" | "low" | "medium" | "high";
5
+ export declare function clampEffortForPerplexity(effort: AppConfig["reasoning_effort"][PeerId]): PerplexityReasoningEffort;
6
+ export declare const PERPLEXITY_REASONING_EFFORT_MODELS: ReadonlySet<string>;
7
+ export declare function perplexityAcceptsReasoningEffort(model: string): boolean;
8
+ export declare class PerplexityAdapter extends BasePeerAdapter implements PeerAdapter {
9
+ id: PeerId;
10
+ provider: string;
11
+ model: string;
12
+ constructor(config: AppConfig, modelOverride?: string);
13
+ private client;
14
+ probe(): Promise<PeerProbeResult>;
15
+ call(prompt: string, context: PeerCallContext): Promise<PeerResult>;
16
+ generate(prompt: string, context: PeerCallContext): Promise<GenerationResult>;
17
+ }
18
+ export {};