@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,199 @@
1
+ import type { AppConfig, Confidence, CostEstimate, PeerAdapter, PeerId, PeerProbeResult, ReasoningEffort, ReviewRound, ReviewStatus, RuntimeEvent, SessionMeta, TokenUsage } from "./types.js";
2
+ import { SessionStore } from "./session-store.js";
3
+ export interface AskPeersInput {
4
+ session_id?: string;
5
+ task: string;
6
+ review_focus?: string;
7
+ draft: string;
8
+ petitioner?: PeerId | "operator";
9
+ caller?: PeerId | "operator";
10
+ lead_peer?: PeerId;
11
+ caller_status?: ReviewStatus;
12
+ peers?: PeerId[];
13
+ signal?: AbortSignal;
14
+ reasoning_effort_overrides?: Partial<Record<PeerId, ReasoningEffort>>;
15
+ }
16
+ export interface AskPeersOutput {
17
+ session: SessionMeta;
18
+ round: ReviewRound;
19
+ converged: boolean;
20
+ }
21
+ export interface RunUntilUnanimousInput {
22
+ session_id?: string;
23
+ task: string;
24
+ review_focus?: string;
25
+ initial_draft?: string;
26
+ lead_peer?: PeerId;
27
+ peers?: PeerId[];
28
+ max_rounds?: number;
29
+ until_stopped?: boolean;
30
+ max_cost_usd?: number;
31
+ signal?: AbortSignal;
32
+ reasoning_effort_overrides?: Partial<Record<PeerId, ReasoningEffort>>;
33
+ caller?: PeerId | "operator";
34
+ mode?: import("./types.js").SessionMode;
35
+ evidence?: string;
36
+ }
37
+ export interface RunUntilUnanimousOutput {
38
+ session: SessionMeta;
39
+ final_text?: string;
40
+ converged: boolean;
41
+ rounds: number;
42
+ }
43
+ export interface FabricationDetectionResult {
44
+ fabricated: boolean;
45
+ net_new_hex_count: number;
46
+ net_new_hex_sample: string[];
47
+ suspicious_assertion_count: number;
48
+ suspicious_assertion_sample: Array<{
49
+ label: string;
50
+ match: string;
51
+ }>;
52
+ }
53
+ export interface FabricationDetectionCorpus {
54
+ /**
55
+ * PROVENANCE-GRADE corpus. Raw command/tool output persisted via
56
+ * `session_attach_evidence`.
57
+ */
58
+ provenanceCorpus: string;
59
+ /**
60
+ * PRIOR-ARTIFACT corpus. The prior round's draft / the caller's
61
+ * `initial_draft` — i.e. the artifact the relator is revising.
62
+ * v3.7.4 (Codex v3.7.3 parecer follow-up): an operational assertion
63
+ * the relator PRESERVES from the artifact it was handed is NOT
64
+ * fabrication — the relator invented nothing. The documented process
65
+ * REQUIRES callers to embed the verbatim diff + raw gate output in
66
+ * `initial_draft`; punishing a relator for faithfully carrying that
67
+ * forward was a self-contradiction (session 506f006a). So the prior
68
+ * artifact, alongside attached evidence, is a legitimate provenance
69
+ * source for operational assertions.
70
+ */
71
+ priorDraftCorpus: string;
72
+ /**
73
+ * NARRATIVE corpus. The caller's task body ONLY (prose framing /
74
+ * instructions) — NOT the draft. An operational assertion that
75
+ * appears only here, promoted by the relator into the artifact, is
76
+ * still flagged: a claim narrated in the task body is not evidence
77
+ * (the eee886d3 case, operator directive 2026-05-10). Combined with
78
+ * the other two corpora ONLY for hex-token validation, since
79
+ * SHAs/IDs/file paths can be referenced as identifiers in narrative
80
+ * without being claimed as command-output evidence.
81
+ */
82
+ narrativeCorpus: string;
83
+ }
84
+ export declare function detectFabricatedEvidence(revisionText: string, corpus: FabricationDetectionCorpus): FabricationDetectionResult;
85
+ export interface MetaAuditDetectionResult {
86
+ fabricated: boolean;
87
+ placeholder_count: number;
88
+ placeholder_sample: string[];
89
+ section_count: number;
90
+ section_sample: string[];
91
+ }
92
+ export declare function detectMetaAuditFabrication(revisionText: string): MetaAuditDetectionResult;
93
+ export interface EvidencePreflightResult {
94
+ pass: boolean;
95
+ reason: string;
96
+ completed_work_claim_matched: boolean;
97
+ evidence_marker_found: boolean;
98
+ structured_evidence_supplied: boolean;
99
+ attachments_present: boolean;
100
+ }
101
+ export declare function evidencePreflight(params: {
102
+ task: string;
103
+ initialDraft?: string;
104
+ structuredEvidence?: string;
105
+ attachmentsPresent: boolean;
106
+ }): EvidencePreflightResult;
107
+ export declare class PeerDisabledError extends Error {
108
+ constructor(peer: PeerId);
109
+ }
110
+ export declare class InsufficientEnabledPeersError extends Error {
111
+ constructor(enabled: PeerId[]);
112
+ }
113
+ export declare class CrossReviewOrchestrator {
114
+ readonly config: AppConfig;
115
+ private readonly emit;
116
+ readonly store: SessionStore;
117
+ adapters: Record<PeerId, PeerAdapter>;
118
+ constructor(config: AppConfig, emit?: (event: RuntimeEvent) => void);
119
+ probeAll(): Promise<PeerProbeResult[]>;
120
+ runEvidenceChecklistJudgeConsensusPass(params: {
121
+ session_id: string;
122
+ judge_peers: PeerId[];
123
+ draft: string;
124
+ item_ids?: string[];
125
+ round?: number;
126
+ review_focus?: string;
127
+ mode?: "active" | "shadow";
128
+ signal?: AbortSignal;
129
+ }): Promise<{
130
+ promoted: Array<{
131
+ item_id: string;
132
+ rationales: Record<string, string>;
133
+ }>;
134
+ skipped: Array<{
135
+ item_id: string;
136
+ reason: "not_open" | "consensus_disagreement" | "satisfied_but_unverified" | "not_satisfied" | "judge_failed";
137
+ per_peer: Record<string, {
138
+ satisfied?: boolean;
139
+ confidence?: Confidence;
140
+ rationale_empty?: boolean;
141
+ parser_warnings?: string[];
142
+ error?: string;
143
+ }>;
144
+ }>;
145
+ consensus_decisions: Array<{
146
+ item_id: string;
147
+ unanimous_verified_satisfied: boolean;
148
+ per_peer_verdict: Record<string, "verified_satisfied" | "disagree" | "failed">;
149
+ }>;
150
+ judged_count: number;
151
+ capped: boolean;
152
+ }>;
153
+ runEvidenceChecklistJudgePass(params: {
154
+ session_id: string;
155
+ judge_peer: PeerId;
156
+ draft: string;
157
+ item_ids?: string[];
158
+ round?: number;
159
+ review_focus?: string;
160
+ mode?: "active" | "shadow";
161
+ signal?: AbortSignal;
162
+ }): Promise<{
163
+ promoted: Array<{
164
+ item_id: string;
165
+ rationale: string;
166
+ usage?: TokenUsage;
167
+ cost?: CostEstimate;
168
+ }>;
169
+ skipped: Array<{
170
+ item_id: string;
171
+ reason: "not_open" | "satisfied_but_unverified" | "not_satisfied" | "judge_failed";
172
+ satisfied?: boolean;
173
+ confidence?: Confidence;
174
+ message?: string;
175
+ }>;
176
+ shadow_decisions: Array<{
177
+ item_id: string;
178
+ would_promote: boolean;
179
+ satisfied: boolean;
180
+ confidence: Confidence;
181
+ parser_warnings: string[];
182
+ rationale_empty: boolean;
183
+ rationale: string;
184
+ }>;
185
+ judged_count: number;
186
+ capped: boolean;
187
+ mode: "active" | "shadow";
188
+ }>;
189
+ initSession(task: string, caller?: PeerId | "operator", reviewFocus?: string): Promise<SessionMeta>;
190
+ private isCancelled;
191
+ private fallbackAdapters;
192
+ private recordFallback;
193
+ private recordCacheTelemetry;
194
+ private checkBudgetWarning;
195
+ private callPeerForReview;
196
+ askPeers(input: AskPeersInput): Promise<AskPeersOutput>;
197
+ private runCircularLoop;
198
+ runUntilUnanimous(input: RunUntilUnanimousInput): Promise<RunUntilUnanimousOutput>;
199
+ }