instar 1.3.190 → 1.3.192

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.
@@ -0,0 +1,310 @@
1
+ /**
2
+ * crossModelReviewer — Step B of the tiered development process.
3
+ *
4
+ * Re-platforms the `/spec-converge` external "cross-model" reviewer onto the
5
+ * agent's own installed `codex` CLI. The external pass that the skill used to
6
+ * describe as running "via the /crossreview pattern" (a never-built
7
+ * placeholder) is now a grounded mechanism: detect whether a supported reviewer
8
+ * framework is installed + authed, assemble the cross-model reviewer prompt
9
+ * (spec + referenced context, bounded to a budget), and run it THROUGH the
10
+ * existing `CodexCliIntelligenceProvider` (the factory with
11
+ * `framework: 'codex-cli'`, model `capable` → GPT-tier).
12
+ *
13
+ * Design invariants (see docs/specs/codex-crossreview-stepB-spec.md):
14
+ * - Detection is a pure function with injectable inputs (no real spawns in
15
+ * unit tests). It is SIGNAL-ONLY — it never throws and never blocks.
16
+ * - Reviewer invocation reuses the provider (its scratch-dir clean-notepad,
17
+ * env allowlist, `--skip-git-repo-check`, and the account-global circuit
18
+ * breaker the factory wraps it in). The ONLY new spawn-adjacent code is
19
+ * prompt assembly + result parsing.
20
+ * - Every failure mode routes toward internal-only convergence or a captured
21
+ * raw finding — never a stall. `unavailable` (no framework) is distinct
22
+ * from `degraded` (framework present, this call failed) and
23
+ * `skipped-abbreviated` (author chose the fast path).
24
+ *
25
+ * codex is the FIRST supported framework; the registry
26
+ * (`SUPPORTED_REVIEWER_FRAMEWORKS`) is the single seam for gemini-cli and
27
+ * others to plug in later (Out of Scope here). Adding a framework is one
28
+ * registry entry + one `id`-union extension — no skill change.
29
+ */
30
+ import { type IntelligenceFramework } from './intelligenceProviderFactory.js';
31
+ /**
32
+ * Per-call timeout for a cross-model spec review. A reasoning review of a
33
+ * full spec is far heavier than the provider's 30s judgment-call default, so
34
+ * Step B bumps it to 120s (spec §2).
35
+ */
36
+ export declare const REVIEW_TIMEOUT_MS = 120000;
37
+ /**
38
+ * Total context budget (spec + referenced docs) inlined into the reviewer
39
+ * prompt. codex runs in an empty read-only scratch dir with no repo access,
40
+ * so referenced context MUST be inlined; this bounds the prompt size (spec §2).
41
+ * The spec is always included in full; referenced context fills the remainder
42
+ * and is truncated (with a loud note) if it overflows.
43
+ */
44
+ export declare const CONTEXT_BUDGET_BYTES: number;
45
+ /**
46
+ * Deterministic priority ordering for referenced context (spec §2, F4).
47
+ *
48
+ * When the 60KB budget can't hold every referenced doc, truncation MUST be
49
+ * deterministic — the same spec + same docs always drop the same docs — so a
50
+ * review is reproducible and the "what got dropped" note is stable. The
51
+ * constitutional / lessons docs are the highest-value context for a reviewer
52
+ * (they're what the lessons-aware internal reviewer reads), so they are kept
53
+ * FIRST; everything else keeps the spec-declared link order (the order the
54
+ * caller passed the docs in, which is the order they appear in the spec).
55
+ *
56
+ * A doc whose path contains one of these substrings sorts ahead of the rest,
57
+ * in THIS order. Ties (and all non-priority docs) preserve the caller's order
58
+ * via a stable sort.
59
+ */
60
+ export declare const CONTEXT_PRIORITY_SUBSTRINGS: readonly string[];
61
+ /**
62
+ * Order referenced context deterministically: constitutional/lessons docs
63
+ * first (per CONTEXT_PRIORITY_SUBSTRINGS), then the caller's spec-declared link
64
+ * order for the rest. A stable sort on the priority rank achieves both — equal
65
+ * ranks keep their input order. Pure; never mutates the input.
66
+ */
67
+ export declare function orderContextDeterministically(context: readonly ReferencedContextDoc[]): ReferencedContextDoc[];
68
+ /**
69
+ * Reasons a supported reviewer framework is unavailable. Mirrors the
70
+ * Rule-1 / auth-probe vocabulary so a report can render a specific
71
+ * remediation.
72
+ */
73
+ export type CrossModelUnavailableReason = 'codex-not-installed' | 'codex-not-authed' | 'codex-auth-apikey-forbidden' | 'no-supported-framework';
74
+ export interface CrossModelDetectionResult {
75
+ available: boolean;
76
+ /** Present when available; the framework id that will run the review. */
77
+ framework?: IntelligenceFramework;
78
+ /** Present when available; the concrete model the review resolves to. */
79
+ model?: string;
80
+ /** Present when unavailable; a specific machine-readable reason. */
81
+ reason?: CrossModelUnavailableReason;
82
+ }
83
+ /**
84
+ * Injectable inputs for `detectCrossModelReviewer` so the detection logic is
85
+ * unit-testable without real spawns or a real `~/.codex/auth.json`.
86
+ */
87
+ export interface CrossModelDetectInputs {
88
+ /**
89
+ * Path to the codex binary if detected, else null. Defaults to
90
+ * `detectCodexPath()` (PATH + asdf/nvm-shim resolution).
91
+ */
92
+ codexPathDetected?: string | null;
93
+ /**
94
+ * Path to the codex auth.json. Defaults to
95
+ * `${CODEX_HOME || ~/.codex}/auth.json`.
96
+ */
97
+ authJsonPath?: string;
98
+ /** Process env (for the Rule-1 OPENAI_API_KEY probe). Defaults to process.env. */
99
+ env?: NodeJS.ProcessEnv;
100
+ /** Clock injection for the Rule-1 killswitch sunset check. */
101
+ now?: Date;
102
+ }
103
+ /**
104
+ * Detect a codex reviewer. Returns `{ available: true, framework, model }`
105
+ * iff ALL of: codex binary detected, OAuth `access_token` present, Rule-1
106
+ * clean (no raw API key in env or auth.json). Any miss → a specific reason.
107
+ *
108
+ * Pure-ish: all external inputs are injectable. With no inputs it probes the
109
+ * real host. It NEVER throws.
110
+ */
111
+ export declare function detectCodexReviewer(inputs?: CrossModelDetectInputs): CrossModelDetectionResult;
112
+ export interface ReviewerResult {
113
+ /** Outcome class for the cross-model pass. */
114
+ status: 'ok' | 'degraded' | 'unavailable';
115
+ /** The framework that ran (or would have run). */
116
+ framework?: IntelligenceFramework;
117
+ /** Concrete model used. */
118
+ model?: string;
119
+ /** Parsed verdict, when the review returned. */
120
+ verdict?: ReviewVerdict;
121
+ /** Structured findings (one record), folded alongside internal reviewers. */
122
+ findings?: ReviewFinding[];
123
+ /** A reason string for degraded/unavailable outcomes. */
124
+ reason?: string;
125
+ /** The flag string that gets written to frontmatter + the report banner. */
126
+ flag: string;
127
+ }
128
+ export type ReviewVerdict = 'CLEAN' | 'MINOR ISSUES' | 'SERIOUS ISSUES' | 'UNKNOWN';
129
+ export interface ReviewFinding {
130
+ /** Reviewer tag, e.g. 'cross-model:codex-cli:gpt-5.5'. */
131
+ reviewer: string;
132
+ verdict: ReviewVerdict;
133
+ /** The findings body (verbatim text the reviewer produced). */
134
+ body: string;
135
+ /** True when the reply could not be parsed into a verdict (captured raw). */
136
+ unstructured?: boolean;
137
+ }
138
+ interface SupportedReviewerFramework {
139
+ /** Extend this union (in the type below) to add a framework. */
140
+ id: IntelligenceFramework;
141
+ /** Detection — does this framework's reviewer have what it needs to run? */
142
+ detect(inputs?: CrossModelDetectInputs): CrossModelDetectionResult;
143
+ /**
144
+ * Run the review: assemble already done by the caller; this builds the
145
+ * provider, evaluates the prompt, and parses the result. Returns a
146
+ * ReviewerResult (never throws — failures map to a degraded result).
147
+ */
148
+ review(args: ReviewerInvokeArgs): Promise<ReviewerResult>;
149
+ }
150
+ export interface ReviewerInvokeArgs {
151
+ /** The fully-assembled cross-model reviewer prompt (prompt + spec + context). */
152
+ promptText: string;
153
+ /** Per-call timeout. */
154
+ timeoutMs: number;
155
+ /**
156
+ * Optional provider override — tests inject a stub so no real codex spawn
157
+ * happens. Production passes nothing and the factory builds the real one.
158
+ */
159
+ providerOverride?: {
160
+ evaluate(prompt: string, options?: {
161
+ model?: 'fast' | 'balanced' | 'capable';
162
+ timeoutMs?: number;
163
+ }): Promise<string>;
164
+ };
165
+ }
166
+ /**
167
+ * The supported-reviewer registry. codex first — the order IS the preference
168
+ * order. gemini-cli and others land here as later steps (Out of Scope).
169
+ */
170
+ export declare const SUPPORTED_REVIEWER_FRAMEWORKS: SupportedReviewerFramework[];
171
+ /**
172
+ * Walk the registry in preference order and return the FIRST available
173
+ * framework's detection result. If none is available, returns the codex
174
+ * reason when there's exactly one entry (so the report can be specific), else
175
+ * the generic `no-supported-framework`.
176
+ *
177
+ * SIGNAL-ONLY: never throws, never blocks. A `false` simply routes the skill
178
+ * to the internal-only fallback (spec §4).
179
+ */
180
+ export declare function detectCrossModelReviewer(inputs?: CrossModelDetectInputs): CrossModelDetectionResult;
181
+ /**
182
+ * Map a provider rejection into a coarse `degraded` reason. The provider
183
+ * surfaces timeouts, non-zero exits, and (via the circuit breaker) rate
184
+ * limits as thrown Errors; we classify on the message text the same way the
185
+ * rate-limit classifier does.
186
+ */
187
+ export declare function classifyReviewFailure(err: unknown): string;
188
+ /**
189
+ * Parse a reviewer reply into a structured finding. The prompt mandates a
190
+ * `Verdict: CLEAN | MINOR ISSUES | SERIOUS ISSUES` line + a findings list. If
191
+ * the verdict line is unparseable (or the reply is blank), the whole reply is
192
+ * captured as one raw "unstructured external review — read manually" finding
193
+ * (never dropped, never thrown, never zero).
194
+ */
195
+ export declare function parseReviewerReply(raw: string, reviewerTag: string): ReviewFinding;
196
+ export interface ReferencedContextDoc {
197
+ /** Repo-relative path used as the `--- CONTEXT: <path> ---` header. */
198
+ path: string;
199
+ /** The doc's contents (already read by the caller). */
200
+ content: string;
201
+ }
202
+ export interface AssemblePromptInputs {
203
+ /** Contents of skills/spec-converge/templates/reviewer-cross-model.md. */
204
+ reviewerTemplate: string;
205
+ /** The full spec markdown. */
206
+ specMarkdown: string;
207
+ /** Repo-relative spec path, substituted for {SPEC_PATH} in the template. */
208
+ specPath: string;
209
+ /** Referenced architectural context docs (same set internal reviewers see). */
210
+ context?: ReferencedContextDoc[];
211
+ /** Total budget in bytes. Defaults to CONTEXT_BUDGET_BYTES. */
212
+ budgetBytes?: number;
213
+ }
214
+ export interface AssembledPrompt {
215
+ /** The final prompt string fed to the provider. */
216
+ promptText: string;
217
+ /** True when referenced context had to be truncated to fit the budget. */
218
+ truncated: boolean;
219
+ /** Byte size of the assembled prompt. */
220
+ bytes: number;
221
+ }
222
+ /**
223
+ * Assemble the cross-model reviewer prompt: the reviewer template (with
224
+ * `{SPEC_PATH}` substituted) + the full spec + as much referenced context as
225
+ * fits the budget. codex runs with NO repo access, so context is inlined under
226
+ * `--- CONTEXT: <path> ---` headers. The spec is ALWAYS included in full; if
227
+ * referenced docs overflow the budget, they are truncated and a loud
228
+ * truncation note is added so the reviewer knows its view was partial (a
229
+ * silently-truncated review is a trap; a disclosed-partial one is still signal).
230
+ *
231
+ * Truncation is DETERMINISTIC (spec §2, F4): referenced docs are ordered by
232
+ * `orderContextDeterministically` (constitutional/lessons docs first, then the
233
+ * spec-declared link order) BEFORE the budget walk, so the same spec + docs
234
+ * always drop the same docs. When a doc is fully or partially dropped, the
235
+ * truncation note NAMES the affected docs (which were partial, which were fully
236
+ * omitted) — a reviewer must know exactly which context it could not see, not
237
+ * just that "something" was cut.
238
+ */
239
+ export declare function assembleReviewerPrompt(inputs: AssemblePromptInputs): AssembledPrompt;
240
+ /**
241
+ * The discrete cross-model review outcome states the report + frontmatter
242
+ * record. Distinct so "you have no cross-model reviewer" reads differently
243
+ * from "your reviewer was rate-limited this round" from "you chose the fast
244
+ * path" from "the framework was present but NOT ONE round ever succeeded".
245
+ *
246
+ * `degraded-all-rounds` (spec §2/§4, F2) is the SPEC-LEVEL aggregate: a single
247
+ * round's `degraded` lives on a ReviewerResult, but convergence runs many
248
+ * rounds and the spec gets ONE final `cross-model-review:` value. When a
249
+ * framework was present every round but ZERO rounds produced a successful
250
+ * external pass (all degraded), the final flag is `degraded-all-rounds` —
251
+ * treated as loud as `unavailable`, because the spec converged having never
252
+ * once received a real external opinion. This must surface at SPEC level, not
253
+ * hide in per-round notes.
254
+ */
255
+ export type CrossModelFlagStatus = 'available' | 'unavailable' | 'degraded' | 'degraded-all-rounds' | 'skipped-abbreviated';
256
+ export interface CrossModelFlag {
257
+ status: CrossModelFlagStatus;
258
+ /** The `cross-model-review:` frontmatter value. */
259
+ flag: string;
260
+ /** Optional `cross-model-review-reason:` value. */
261
+ reason?: string;
262
+ }
263
+ /**
264
+ * Build the fallback flag for the unavailable / skipped / degraded-all-rounds
265
+ * states. (The available and per-round degraded flags come back on the
266
+ * ReviewerResult.) Centralizes the exact strings the frontmatter writer +
267
+ * report banner consume.
268
+ *
269
+ * `degraded-all-rounds` is the spec-level aggregate the skill writes when a
270
+ * framework was present but no round ever succeeded (see
271
+ * `aggregateRoundOutcomes`).
272
+ */
273
+ export declare function buildCrossModelFlag(status: 'unavailable' | 'skipped-abbreviated' | 'degraded-all-rounds', reason?: string): CrossModelFlag;
274
+ /**
275
+ * Aggregate per-round cross-model outcomes into the ONE final spec-level flag
276
+ * (spec §2/§4, F2). Convergence runs multiple rounds; each round yields a
277
+ * `ReviewerResult` (`ok` / `degraded` / `unavailable`). The skill collects the
278
+ * per-round statuses and calls this to decide what `write-convergence-tag.mjs`
279
+ * stamps:
280
+ *
281
+ * - `skipped-abbreviated` if the author opted out (passed explicitly) — wins
282
+ * over everything, since no external pass was attempted by choice.
283
+ * - `codex-cli:<model>` (the LAST successful round's flag) if ANY round got a
284
+ * real external pass — one genuine outside opinion is enough to say the spec
285
+ * received cross-model review.
286
+ * - `degraded-all-rounds` if a framework was present every round but ZERO
287
+ * rounds succeeded (all degraded) — as loud as `unavailable`.
288
+ * - `unavailable` if no framework was ever available (all rounds unavailable).
289
+ *
290
+ * Returns the `{ flag, reason }` the tag writer + report banner consume.
291
+ */
292
+ export declare function aggregateRoundOutcomes(rounds: ReviewerResult[], opts?: {
293
+ skippedAbbreviated?: boolean;
294
+ }): CrossModelFlag;
295
+ /**
296
+ * The high-level entry the skill driver calls: detect, and if available run
297
+ * the first available framework's reviewer with the assembled prompt;
298
+ * otherwise return the `unavailable` flag. NEVER throws, NEVER blocks.
299
+ *
300
+ * `assembled` is produced by `assembleReviewerPrompt`. `detectInputs` and
301
+ * `providerOverride` exist for tests; production omits them.
302
+ */
303
+ export declare function runCrossModelReview(args: {
304
+ assembled: AssembledPrompt;
305
+ timeoutMs?: number;
306
+ detectInputs?: CrossModelDetectInputs;
307
+ providerOverride?: ReviewerInvokeArgs['providerOverride'];
308
+ }): Promise<ReviewerResult>;
309
+ export {};
310
+ //# sourceMappingURL=crossModelReviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crossModelReviewer.d.ts","sourceRoot":"","sources":["../../src/core/crossModelReviewer.ts"],"names":[],"mappings":"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"}