@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,215 @@
1
+ import { statusInstruction, statusJsonSchema } from "../core/status.js";
2
+ import { BasePeerAdapter, StreamBuffer } from "./base.js";
3
+ import { classifyProviderError } from "./errors.js";
4
+ import { withRetry } from "./retry.js";
5
+ import { userPrompt } from "./text.js";
6
+ function usageFromGemini(usage) {
7
+ if (!usage)
8
+ return undefined;
9
+ const cached = usage.cachedContentTokenCount ?? 0;
10
+ const result = {
11
+ input_tokens: usage.promptTokenCount,
12
+ output_tokens: usage.candidatesTokenCount,
13
+ total_tokens: usage.totalTokenCount,
14
+ reasoning_tokens: usage.thoughtsTokenCount,
15
+ };
16
+ if (cached > 0) {
17
+ result.cache_read_tokens = cached;
18
+ result.cache_provider_mode = "implicit";
19
+ }
20
+ else {
21
+ result.cache_provider_mode = "not_supported";
22
+ }
23
+ return result;
24
+ }
25
+ function geminiThinkingConfig(model, ThinkingLevelEnum) {
26
+ if (/gemini-3/i.test(model)) {
27
+ return { includeThoughts: false, thinkingLevel: ThinkingLevelEnum.HIGH };
28
+ }
29
+ return { includeThoughts: false, thinkingBudget: -1 };
30
+ }
31
+ // v2.27.1 (cold-start hardening): cache the @google/genai module promise
32
+ // so the dynamic import resolves exactly once across all callers.
33
+ // Exported so peers/model-selection.ts can share the same module promise.
34
+ let _genaiModulePromise = null;
35
+ export function loadGenaiModule() {
36
+ if (!_genaiModulePromise)
37
+ _genaiModulePromise = import("@google/genai");
38
+ return _genaiModulePromise;
39
+ }
40
+ export class GeminiAdapter extends BasePeerAdapter {
41
+ id = "gemini";
42
+ provider = "google";
43
+ model;
44
+ constructor(config, modelOverride) {
45
+ super(config);
46
+ this.model = modelOverride ?? config.models.gemini;
47
+ }
48
+ async client() {
49
+ const apiKey = this.config.api_keys.gemini;
50
+ if (!apiKey)
51
+ throw new Error("GEMINI_API_KEY was not found in environment variables.");
52
+ const genai = await loadGenaiModule();
53
+ return { ai: new genai.GoogleGenAI({ apiKey }), ThinkingLevel: genai.ThinkingLevel };
54
+ }
55
+ async probe() {
56
+ const started = Date.now();
57
+ const authPresent = Boolean(this.config.api_keys.gemini);
58
+ if (!authPresent) {
59
+ return {
60
+ peer: this.id,
61
+ provider: this.provider,
62
+ model: this.model,
63
+ available: false,
64
+ auth_present: false,
65
+ latency_ms: Date.now() - started,
66
+ model_selection: this.config.model_selection.gemini,
67
+ message: "GEMINI_API_KEY is missing.",
68
+ };
69
+ }
70
+ try {
71
+ const probeClient = await this.client();
72
+ const pager = await probeClient.ai.models.list({ config: { pageSize: 1 } });
73
+ for await (const model of pager) {
74
+ void model;
75
+ break;
76
+ }
77
+ return {
78
+ peer: this.id,
79
+ provider: this.provider,
80
+ model: this.model,
81
+ available: true,
82
+ auth_present: true,
83
+ latency_ms: Date.now() - started,
84
+ model_selection: this.config.model_selection.gemini,
85
+ };
86
+ }
87
+ catch (error) {
88
+ const failure = classifyProviderError(this.id, this.provider, this.model, error, 1, started);
89
+ return {
90
+ peer: this.id,
91
+ provider: this.provider,
92
+ model: this.model,
93
+ available: false,
94
+ auth_present: true,
95
+ latency_ms: Date.now() - started,
96
+ model_selection: this.config.model_selection.gemini,
97
+ message: failure.message,
98
+ };
99
+ }
100
+ }
101
+ async call(prompt, context) {
102
+ const started = Date.now();
103
+ return withRetry(this.config, async (attempt) => {
104
+ context.emit({
105
+ type: "peer.call.started",
106
+ session_id: context.session_id,
107
+ round: context.round,
108
+ peer: this.id,
109
+ message: `Gemini review attempt ${attempt}`,
110
+ });
111
+ // v2.4.0 / audit closure (P2.8): pass AbortSignal to GoogleGenAI.
112
+ // The SDK accepts `requestOptions.signal`; without it,
113
+ // session_cancel_job cannot interrupt an in-flight Gemini call
114
+ // and continues burning tokens until the response naturally
115
+ // arrives.
116
+ const reviewClient = await this.client();
117
+ const params = {
118
+ model: this.model,
119
+ contents: `${this.systemPrompt(context)}\n\n${userPrompt(prompt)}\n\n${statusInstruction()}`,
120
+ config: {
121
+ responseMimeType: "application/json",
122
+ responseJsonSchema: statusJsonSchema,
123
+ maxOutputTokens: this.config.max_output_tokens,
124
+ thinkingConfig: geminiThinkingConfig(this.model, reviewClient.ThinkingLevel),
125
+ abortSignal: context.signal,
126
+ },
127
+ };
128
+ if (this.shouldStreamTokens(context)) {
129
+ const stream = await reviewClient.ai.models.generateContentStream(params);
130
+ const stream_buffer = new StreamBuffer(this.id);
131
+ const tokenStream = this.createTokenEventBuffer(context, "review", "generateContentStream.text");
132
+ let last;
133
+ for await (const chunk of stream) {
134
+ last = chunk;
135
+ const delta = chunk.text ?? "";
136
+ stream_buffer.append(delta);
137
+ tokenStream.append(delta);
138
+ }
139
+ const text = stream_buffer.text();
140
+ tokenStream.complete(text.length);
141
+ return this.resultFromText({
142
+ text: text || (last?.text ?? JSON.stringify(last ?? {})),
143
+ raw: { streamed: true, provider: this.provider, model: last?.modelVersion },
144
+ usage: usageFromGemini(last?.usageMetadata),
145
+ started,
146
+ attempts: attempt,
147
+ modelReported: last?.modelVersion,
148
+ });
149
+ }
150
+ const response = (await reviewClient.ai.models.generateContent(params));
151
+ return this.resultFromText({
152
+ text: response.text ?? JSON.stringify(response),
153
+ raw: response,
154
+ usage: usageFromGemini(response.usageMetadata),
155
+ started,
156
+ attempts: attempt,
157
+ modelReported: response.modelVersion,
158
+ });
159
+ }, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
160
+ }
161
+ async generate(prompt, context) {
162
+ const started = Date.now();
163
+ return withRetry(this.config, async (attempt) => {
164
+ context.emit({
165
+ type: "peer.generate.started",
166
+ session_id: context.session_id,
167
+ round: context.round,
168
+ peer: this.id,
169
+ message: `Gemini generation attempt ${attempt}`,
170
+ });
171
+ const generateClient = await this.client();
172
+ const params = {
173
+ model: this.model,
174
+ contents: `${this.systemPrompt(context)}\n\n${userPrompt(prompt)}`,
175
+ config: {
176
+ maxOutputTokens: this.config.max_output_tokens,
177
+ thinkingConfig: geminiThinkingConfig(this.model, generateClient.ThinkingLevel),
178
+ abortSignal: context.signal,
179
+ },
180
+ };
181
+ if (this.shouldStreamTokens(context)) {
182
+ const stream = await generateClient.ai.models.generateContentStream(params);
183
+ const stream_buffer = new StreamBuffer(this.id);
184
+ const tokenStream = this.createTokenEventBuffer(context, "generation", "generateContentStream.text");
185
+ let last;
186
+ for await (const chunk of stream) {
187
+ last = chunk;
188
+ const delta = chunk.text ?? "";
189
+ stream_buffer.append(delta);
190
+ tokenStream.append(delta);
191
+ }
192
+ const text = stream_buffer.text();
193
+ tokenStream.complete(text.length);
194
+ return this.generationFromText({
195
+ text: text || (last?.text ?? JSON.stringify(last ?? {})),
196
+ raw: { streamed: true, provider: this.provider, model: last?.modelVersion },
197
+ usage: usageFromGemini(last?.usageMetadata),
198
+ started,
199
+ attempts: attempt,
200
+ modelReported: last?.modelVersion,
201
+ });
202
+ }
203
+ const response = (await generateClient.ai.models.generateContent(params));
204
+ return this.generationFromText({
205
+ text: response.text ?? JSON.stringify(response),
206
+ raw: response,
207
+ usage: usageFromGemini(response.usageMetadata),
208
+ started,
209
+ attempts: attempt,
210
+ modelReported: response.modelVersion,
211
+ });
212
+ }, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
213
+ }
214
+ }
215
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/peers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { AppConfig, GenerationResult, PeerAdapter, PeerCallContext, PeerId, PeerProbeResult, PeerResult } from "../core/types.js";
2
+ import { BasePeerAdapter } from "./base.js";
3
+ type GrokReasoningEffort = "none" | "minimal" | "low" | "medium" | "high" | "xhigh";
4
+ export declare function clampEffortForModel(effort: GrokReasoningEffort, model: string): GrokReasoningEffort;
5
+ export declare const GROK_REASONING_EFFORT_MODELS: ReadonlySet<string>;
6
+ export declare function modelAcceptsReasoningEffort(model: string): boolean;
7
+ export declare class GrokAdapter extends BasePeerAdapter implements PeerAdapter {
8
+ id: PeerId;
9
+ provider: string;
10
+ model: string;
11
+ constructor(config: AppConfig, modelOverride?: string);
12
+ private client;
13
+ probe(): Promise<PeerProbeResult>;
14
+ call(prompt: string, context: PeerCallContext): Promise<PeerResult>;
15
+ generate(prompt: string, context: PeerCallContext): Promise<GenerationResult>;
16
+ }
17
+ export {};
@@ -0,0 +1,346 @@
1
+ import { statusInstruction, statusJsonSchema } from "../core/status.js";
2
+ import { BasePeerAdapter, StreamBuffer } from "./base.js";
3
+ import { classifyProviderError } from "./errors.js";
4
+ import { loadOpenAICtor } from "./openai.js";
5
+ import { pairScopedCacheKey } from "../core/prompt-parts.js";
6
+ import { withRetry } from "./retry.js";
7
+ import { textFromOpenAIResponse, userPrompt } from "./text.js";
8
+ const GROK_BASE_URL = "https://api.x.ai/v1";
9
+ function usageFromGrok(usage) {
10
+ if (!usage)
11
+ return undefined;
12
+ // v2.21.0 (caching): xAI's grok-4.3 mirrors the OpenAI Responses API
13
+ // shape and surfaces cached tokens under prompt_tokens_details. The
14
+ // adapter is OpenAI-compatible so the same parsing path applies.
15
+ const cached = usage.prompt_tokens_details?.cached_tokens ?? usage.input_tokens_details?.cached_tokens ?? 0;
16
+ const inputTokens = usage.input_tokens ?? 0;
17
+ const result = {
18
+ input_tokens: usage.input_tokens,
19
+ output_tokens: usage.output_tokens,
20
+ total_tokens: usage.total_tokens,
21
+ reasoning_tokens: usage.output_tokens_details?.reasoning_tokens,
22
+ };
23
+ if (cached > 0) {
24
+ result.cache_read_tokens = cached;
25
+ if (inputTokens > cached)
26
+ result.cache_write_tokens = inputTokens - cached;
27
+ result.cache_provider_mode = "auto";
28
+ }
29
+ else {
30
+ result.cache_provider_mode = "auto";
31
+ }
32
+ return result;
33
+ }
34
+ function grokEffort(value) {
35
+ return value === "max" ? "xhigh" : (value ?? "xhigh");
36
+ }
37
+ // v2.18.4 / Codex audit 2026-05-07 P2.1: per-model effort clamp.
38
+ // grok-4.3 accepts only { none, low, medium, high } per xAI docs; the
39
+ // internal config scale can reach "xhigh"/"max" which the multi-agent
40
+ // model accepts but grok-4.3 would 400 on. Clamp before send.
41
+ //
42
+ // v2.18.5 / anti-drift driver (operator directive 2026-05-07): exported
43
+ // so the smoke harness can verify the clamp shape directly. Behavior
44
+ // unchanged for in-file callers.
45
+ export function clampEffortForModel(effort, model) {
46
+ if (model === "grok-4.3") {
47
+ // grok-4.3 accepts only { none, low, medium, high }. Our internal
48
+ // post-grokEffort scale is { none, minimal, low, medium, high,
49
+ // xhigh } — `max` already collapsed to `xhigh` upstream. Clamp
50
+ // `xhigh` and `minimal` to `high` (xhigh has no equivalent on
51
+ // 4.3; `minimal` is a non-standard value xAI does not accept).
52
+ if (effort === "xhigh" || effort === "minimal")
53
+ return "high";
54
+ // none/low/medium/high pass through unchanged.
55
+ return effort;
56
+ }
57
+ // grok-4.20-multi-agent and others: existing scale unchanged.
58
+ return effort;
59
+ }
60
+ // v2.15.0/v2.16.0: per-model reasoning capability detection. Per
61
+ // official xAI docs at https://docs.x.ai/developers/model-capabilities/text/reasoning, only
62
+ // `grok-4.20-multi-agent` accepts the `reasoning.effort` body field.
63
+ // Other Grok models (including `grok-4-latest`, `grok-4.20`, and
64
+ // `grok-4.20-reasoning`) have automatic reasoning by design, so the
65
+ // field is unnecessary and omitted.
66
+ //
67
+ // Pre-v2.15 the GrokAdapter unconditionally included
68
+ // `reasoning: { effort }` in every body, locking the operator to
69
+ // `grok-4.20-multi-agent` to avoid 400s (v2.14.1 hotfix). v2.15
70
+ // detects the configured model and omits the field for non-allowlist
71
+ // models, freeing the operator to use ANY Grok model — including
72
+ // cheaper ones for routine cross-reviews while reserving 16-agent
73
+ // xhigh runs for heavy tasks.
74
+ //
75
+ // Allowlist is an explicit Set so adding a new reasoning-capable
76
+ // model is a one-line change here. Future: if xAI exposes a model
77
+ // capability discovery endpoint, replace the static set with a
78
+ // runtime probe + cache.
79
+ export const GROK_REASONING_EFFORT_MODELS = new Set([
80
+ "grok-4.20-multi-agent",
81
+ // v2.18.4 / Codex audit 2026-05-07 P2.1: xAI docs (WebFetch verified
82
+ // 2026-05-07) document grok-4.3 as supporting reasoning_effort with
83
+ // { none, low (default), medium, high }. Added to allowlist so the
84
+ // adapter sends the field; clampEffortForModel narrows xhigh/max to
85
+ // "high" for this model.
86
+ "grok-4.3",
87
+ ]);
88
+ export function modelAcceptsReasoningEffort(model) {
89
+ return GROK_REASONING_EFFORT_MODELS.has(model);
90
+ }
91
+ export class GrokAdapter extends BasePeerAdapter {
92
+ id = "grok";
93
+ provider = "xai";
94
+ model;
95
+ constructor(config, modelOverride) {
96
+ super(config);
97
+ this.model = modelOverride ?? config.models.grok;
98
+ }
99
+ // v2.21.0 (caching): construct a per-call client so we can attach a
100
+ // dynamic x-grok-conv-id header derived from the pair-scoped cache
101
+ // key. xAI uses the header to bucket cache entries the same way
102
+ // OpenAI uses prompt_cache_key — it ties a sequence of calls to the
103
+ // same conversation/cache scope.
104
+ async client(callerForCache) {
105
+ const apiKey = this.config.api_keys.grok;
106
+ if (!apiKey) {
107
+ throw new Error("GROK_API_KEY was not found in environment variables.");
108
+ }
109
+ const Ctor = await loadOpenAICtor();
110
+ if (this.config.cache.enabled) {
111
+ const convId = pairScopedCacheKey(this.id, callerForCache ?? "operator", this.config.cache.schema_version);
112
+ return new Ctor({
113
+ apiKey,
114
+ baseURL: GROK_BASE_URL,
115
+ defaultHeaders: { "x-grok-conv-id": convId },
116
+ });
117
+ }
118
+ return new Ctor({ apiKey, baseURL: GROK_BASE_URL });
119
+ }
120
+ async probe() {
121
+ const started = Date.now();
122
+ const authPresent = Boolean(this.config.api_keys.grok);
123
+ if (!authPresent) {
124
+ return {
125
+ peer: this.id,
126
+ provider: this.provider,
127
+ model: this.model,
128
+ available: false,
129
+ auth_present: false,
130
+ latency_ms: Date.now() - started,
131
+ model_selection: this.config.model_selection.grok,
132
+ message: "GROK_API_KEY is missing.",
133
+ };
134
+ }
135
+ try {
136
+ // probe does not need cache scope — it lists models, not posts.
137
+ const probeClient = await this.client();
138
+ await probeClient.models.list();
139
+ return {
140
+ peer: this.id,
141
+ provider: this.provider,
142
+ model: this.model,
143
+ available: true,
144
+ auth_present: true,
145
+ latency_ms: Date.now() - started,
146
+ model_selection: this.config.model_selection.grok,
147
+ };
148
+ }
149
+ catch (error) {
150
+ const failure = classifyProviderError(this.id, this.provider, this.model, error, 1, started);
151
+ return {
152
+ peer: this.id,
153
+ provider: this.provider,
154
+ model: this.model,
155
+ available: false,
156
+ auth_present: true,
157
+ latency_ms: Date.now() - started,
158
+ model_selection: this.config.model_selection.grok,
159
+ message: failure.message,
160
+ };
161
+ }
162
+ }
163
+ async call(prompt, context) {
164
+ const started = Date.now();
165
+ return withRetry(this.config, async (attempt) => {
166
+ context.emit({
167
+ type: "peer.call.started",
168
+ session_id: context.session_id,
169
+ round: context.round,
170
+ peer: this.id,
171
+ message: `Grok review attempt ${attempt}`,
172
+ });
173
+ const cacheKey = pairScopedCacheKey(this.id, context.caller ?? "operator", this.config.cache.schema_version);
174
+ const body = {
175
+ model: this.model,
176
+ input: [
177
+ { role: "system", content: this.systemPrompt(context) },
178
+ {
179
+ role: "user",
180
+ content: `${userPrompt(prompt)}\n\n${statusInstruction()}`,
181
+ },
182
+ ],
183
+ text: {
184
+ format: {
185
+ type: "json_schema",
186
+ name: "cross_review_status",
187
+ strict: true,
188
+ schema: statusJsonSchema,
189
+ },
190
+ verbosity: "low",
191
+ },
192
+ ...(modelAcceptsReasoningEffort(this.model)
193
+ ? {
194
+ reasoning: {
195
+ effort: clampEffortForModel(grokEffort(context.reasoning_effort_override ?? this.config.reasoning_effort.grok), this.model),
196
+ },
197
+ }
198
+ : {}),
199
+ store: false,
200
+ max_output_tokens: this.config.max_output_tokens,
201
+ ...(this.config.cache.enabled
202
+ ? {
203
+ prompt_cache_key: cacheKey,
204
+ prompt_cache_retention: (this.config.cache.ttl.openai === "1h"
205
+ ? "24h"
206
+ : "in_memory"),
207
+ }
208
+ : {}),
209
+ };
210
+ if (this.shouldStreamTokens(context)) {
211
+ const stream_buffer = new StreamBuffer(this.id);
212
+ const tokenStream = this.createTokenEventBuffer(context, "review", "response.output_text.delta");
213
+ let usage;
214
+ let modelReported;
215
+ const reviewClient = await this.client(context.caller);
216
+ const stream = await reviewClient.responses.create({ ...body, stream: true }, { signal: context.signal, timeout: this.config.retry.timeout_ms });
217
+ for await (const event of stream) {
218
+ if (event.type === "response.output_text.delta") {
219
+ const delta = typeof event.delta === "string" ? event.delta : "";
220
+ stream_buffer.append(delta);
221
+ tokenStream.append(delta);
222
+ }
223
+ else if (event.type === "response.completed") {
224
+ usage = usageFromGrok(event.response?.usage);
225
+ modelReported = event.response?.model;
226
+ }
227
+ else if (event.type === "response.failed" || event.type === "response.error") {
228
+ const message = event.type === "response.failed"
229
+ ? event.response?.error?.message
230
+ : event.error?.message;
231
+ throw new Error(message ?? "Grok streaming response failed.");
232
+ }
233
+ }
234
+ const text = stream_buffer.text();
235
+ tokenStream.complete(text.length);
236
+ return this.resultFromText({
237
+ text,
238
+ raw: { streamed: true, provider: this.provider, model: modelReported ?? this.model },
239
+ usage,
240
+ started,
241
+ attempts: attempt,
242
+ modelReported,
243
+ });
244
+ }
245
+ const reviewClient = await this.client(context.caller);
246
+ const response = await reviewClient.responses.create(body, {
247
+ signal: context.signal,
248
+ timeout: this.config.retry.timeout_ms,
249
+ });
250
+ return this.resultFromText({
251
+ text: textFromOpenAIResponse(response),
252
+ raw: response,
253
+ usage: usageFromGrok(response.usage),
254
+ started,
255
+ attempts: attempt,
256
+ modelReported: response.model,
257
+ });
258
+ }, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
259
+ }
260
+ async generate(prompt, context) {
261
+ const started = Date.now();
262
+ return withRetry(this.config, async (attempt) => {
263
+ context.emit({
264
+ type: "peer.generate.started",
265
+ session_id: context.session_id,
266
+ round: context.round,
267
+ peer: this.id,
268
+ message: `Grok generation attempt ${attempt}`,
269
+ });
270
+ const cacheKey = pairScopedCacheKey(this.id, context.caller ?? "operator", this.config.cache.schema_version);
271
+ const body = {
272
+ model: this.model,
273
+ input: [
274
+ { role: "system", content: this.systemPrompt(context) },
275
+ { role: "user", content: userPrompt(prompt) },
276
+ ],
277
+ ...(modelAcceptsReasoningEffort(this.model)
278
+ ? {
279
+ reasoning: {
280
+ effort: clampEffortForModel(grokEffort(context.reasoning_effort_override ?? this.config.reasoning_effort.grok), this.model),
281
+ },
282
+ }
283
+ : {}),
284
+ store: false,
285
+ max_output_tokens: this.config.max_output_tokens,
286
+ ...(this.config.cache.enabled
287
+ ? {
288
+ prompt_cache_key: cacheKey,
289
+ prompt_cache_retention: (this.config.cache.ttl.openai === "1h"
290
+ ? "24h"
291
+ : "in_memory"),
292
+ }
293
+ : {}),
294
+ };
295
+ if (this.shouldStreamTokens(context)) {
296
+ const stream_buffer = new StreamBuffer(this.id);
297
+ const tokenStream = this.createTokenEventBuffer(context, "generation", "response.output_text.delta");
298
+ let usage;
299
+ let modelReported;
300
+ const generateClient = await this.client(context.caller);
301
+ const stream = await generateClient.responses.create({ ...body, stream: true }, { signal: context.signal, timeout: this.config.retry.timeout_ms });
302
+ for await (const event of stream) {
303
+ if (event.type === "response.output_text.delta") {
304
+ const delta = typeof event.delta === "string" ? event.delta : "";
305
+ stream_buffer.append(delta);
306
+ tokenStream.append(delta);
307
+ }
308
+ else if (event.type === "response.completed") {
309
+ usage = usageFromGrok(event.response?.usage);
310
+ modelReported = event.response?.model;
311
+ }
312
+ else if (event.type === "response.failed" || event.type === "response.error") {
313
+ const message = event.type === "response.failed"
314
+ ? event.response?.error?.message
315
+ : event.error?.message;
316
+ throw new Error(message ?? "Grok streaming response failed.");
317
+ }
318
+ }
319
+ const text = stream_buffer.text();
320
+ tokenStream.complete(text.length);
321
+ return this.generationFromText({
322
+ text,
323
+ raw: { streamed: true, provider: this.provider, model: modelReported ?? this.model },
324
+ usage,
325
+ started,
326
+ attempts: attempt,
327
+ modelReported,
328
+ });
329
+ }
330
+ const generateClient = await this.client(context.caller);
331
+ const response = await generateClient.responses.create(body, {
332
+ signal: context.signal,
333
+ timeout: this.config.retry.timeout_ms,
334
+ });
335
+ return this.generationFromText({
336
+ text: textFromOpenAIResponse(response),
337
+ raw: response,
338
+ usage: usageFromGrok(response.usage),
339
+ started,
340
+ attempts: attempt,
341
+ modelReported: response.model,
342
+ });
343
+ }, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
344
+ }
345
+ }
346
+ //# sourceMappingURL=grok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.js","sourceRoot":"","sources":["../../../src/peers/grok.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AppConfig, ModelCandidate, ModelSelection, PeerId } from "../core/types.js";
2
+ export declare function selectFromCandidates(peer: PeerId, candidates: ModelCandidate[], fallback: string): ModelSelection;
3
+ export declare function resolveBestModel(config: AppConfig, peer: PeerId): Promise<ModelSelection>;
4
+ export declare function resolveBestModels(config: AppConfig): Promise<Partial<Record<PeerId, ModelSelection>>>;