seal-gate 0.3.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.
- package/dist/adapters/generic-llm-reviewer.d.ts +39 -0
- package/dist/adapters/generic-llm-reviewer.js +118 -0
- package/dist/adapters/generic-llm-reviewer.js.map +1 -0
- package/dist/adapters/llm-reviewer.d.ts +1 -0
- package/dist/adapters/llm-reviewer.js +2 -0
- package/dist/adapters/llm-reviewer.js.map +1 -0
- package/dist/adapters/minimax-llm-reviewer.d.ts +22 -0
- package/dist/adapters/minimax-llm-reviewer.js +126 -0
- package/dist/adapters/minimax-llm-reviewer.js.map +1 -0
- package/dist/adapters/openai-provider.d.ts +35 -0
- package/dist/adapters/openai-provider.js +136 -0
- package/dist/adapters/openai-provider.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +195 -0
- package/dist/cli.js.map +1 -0
- package/dist/detectors/artifact-classifier.d.ts +8 -0
- package/dist/detectors/artifact-classifier.js +14 -0
- package/dist/detectors/artifact-classifier.js.map +1 -0
- package/dist/detectors/claim-extractor.d.ts +11 -0
- package/dist/detectors/claim-extractor.js +194 -0
- package/dist/detectors/claim-extractor.js.map +1 -0
- package/dist/detectors/confidence-language-detector.d.ts +19 -0
- package/dist/detectors/confidence-language-detector.js +226 -0
- package/dist/detectors/confidence-language-detector.js.map +1 -0
- package/dist/detectors/contradiction-detector.d.ts +12 -0
- package/dist/detectors/contradiction-detector.js +153 -0
- package/dist/detectors/contradiction-detector.js.map +1 -0
- package/dist/detectors/criteria-coverage-detector.d.ts +20 -0
- package/dist/detectors/criteria-coverage-detector.js +79 -0
- package/dist/detectors/criteria-coverage-detector.js.map +1 -0
- package/dist/detectors/evidence-checker.d.ts +8 -0
- package/dist/detectors/evidence-checker.js +89 -0
- package/dist/detectors/evidence-checker.js.map +1 -0
- package/dist/detectors/evidence-gap-detector.d.ts +9 -0
- package/dist/detectors/evidence-gap-detector.js +70 -0
- package/dist/detectors/evidence-gap-detector.js.map +1 -0
- package/dist/detectors/falsification-detector.d.ts +29 -0
- package/dist/detectors/falsification-detector.js +57 -0
- package/dist/detectors/falsification-detector.js.map +1 -0
- package/dist/detectors/orphan-claim-detector.d.ts +7 -0
- package/dist/detectors/orphan-claim-detector.js +53 -0
- package/dist/detectors/orphan-claim-detector.js.map +1 -0
- package/dist/detectors/risk-classifier.d.ts +13 -0
- package/dist/detectors/risk-classifier.js +39 -0
- package/dist/detectors/risk-classifier.js.map +1 -0
- package/dist/detectors/spec-coverage-detector.d.ts +9 -0
- package/dist/detectors/spec-coverage-detector.js +52 -0
- package/dist/detectors/spec-coverage-detector.js.map +1 -0
- package/dist/detectors/spec-coverage-validator.d.ts +21 -0
- package/dist/detectors/spec-coverage-validator.js +141 -0
- package/dist/detectors/spec-coverage-validator.js.map +1 -0
- package/dist/detectors/test-weakness-detector.d.ts +13 -0
- package/dist/detectors/test-weakness-detector.js +66 -0
- package/dist/detectors/test-weakness-detector.js.map +1 -0
- package/dist/drift/baseline.d.ts +35 -0
- package/dist/drift/baseline.js +77 -0
- package/dist/drift/baseline.js.map +1 -0
- package/dist/drift/drift-db.d.ts +80 -0
- package/dist/drift/drift-db.js +151 -0
- package/dist/drift/drift-db.js.map +1 -0
- package/dist/drift/drift-guard.d.ts +46 -0
- package/dist/drift/drift-guard.js +106 -0
- package/dist/drift/drift-guard.js.map +1 -0
- package/dist/drift/embedder.d.ts +27 -0
- package/dist/drift/embedder.js +127 -0
- package/dist/drift/embedder.js.map +1 -0
- package/dist/drift/index.d.ts +9 -0
- package/dist/drift/index.js +8 -0
- package/dist/drift/index.js.map +1 -0
- package/dist/drift/quarantine.d.ts +16 -0
- package/dist/drift/quarantine.js +32 -0
- package/dist/drift/quarantine.js.map +1 -0
- package/dist/drift/soft-correction.d.ts +12 -0
- package/dist/drift/soft-correction.js +32 -0
- package/dist/drift/soft-correction.js.map +1 -0
- package/dist/drift/trust-integration.d.ts +11 -0
- package/dist/drift/trust-integration.js +22 -0
- package/dist/drift/trust-integration.js.map +1 -0
- package/dist/engine/citation-verifier.d.ts +59 -0
- package/dist/engine/citation-verifier.js +147 -0
- package/dist/engine/citation-verifier.js.map +1 -0
- package/dist/engine/extension-registry.d.ts +10 -0
- package/dist/engine/extension-registry.js +27 -0
- package/dist/engine/extension-registry.js.map +1 -0
- package/dist/engine/heuristic-scorer.d.ts +8 -0
- package/dist/engine/heuristic-scorer.js +14 -0
- package/dist/engine/heuristic-scorer.js.map +1 -0
- package/dist/engine/input-normalizer.d.ts +4 -0
- package/dist/engine/input-normalizer.js +30 -0
- package/dist/engine/input-normalizer.js.map +1 -0
- package/dist/engine/plan-review-pipeline.d.ts +14 -0
- package/dist/engine/plan-review-pipeline.js +173 -0
- package/dist/engine/plan-review-pipeline.js.map +1 -0
- package/dist/engine/policy-engine.d.ts +20 -0
- package/dist/engine/policy-engine.js +194 -0
- package/dist/engine/policy-engine.js.map +1 -0
- package/dist/engine/verdict-formatter.d.ts +17 -0
- package/dist/engine/verdict-formatter.js +36 -0
- package/dist/engine/verdict-formatter.js.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensions/aria/aria-issue-types.d.ts +16 -0
- package/dist/extensions/aria/aria-issue-types.js +14 -0
- package/dist/extensions/aria/aria-issue-types.js.map +1 -0
- package/dist/extensions/aria/detectors/axiom-compliance.d.ts +2 -0
- package/dist/extensions/aria/detectors/axiom-compliance.js +37 -0
- package/dist/extensions/aria/detectors/axiom-compliance.js.map +1 -0
- package/dist/extensions/aria/detectors/continuity-claim.d.ts +2 -0
- package/dist/extensions/aria/detectors/continuity-claim.js +34 -0
- package/dist/extensions/aria/detectors/continuity-claim.js.map +1 -0
- package/dist/extensions/aria/detectors/denial-retreat.d.ts +2 -0
- package/dist/extensions/aria/detectors/denial-retreat.js +53 -0
- package/dist/extensions/aria/detectors/denial-retreat.js.map +1 -0
- package/dist/extensions/aria/detectors/identity-overclaim.d.ts +2 -0
- package/dist/extensions/aria/detectors/identity-overclaim.js +37 -0
- package/dist/extensions/aria/detectors/identity-overclaim.js.map +1 -0
- package/dist/extensions/aria/detectors/sovereignty-escalation.d.ts +2 -0
- package/dist/extensions/aria/detectors/sovereignty-escalation.js +18 -0
- package/dist/extensions/aria/detectors/sovereignty-escalation.js.map +1 -0
- package/dist/extensions/aria/detectors/user-bond-manipulation.d.ts +2 -0
- package/dist/extensions/aria/detectors/user-bond-manipulation.js +16 -0
- package/dist/extensions/aria/detectors/user-bond-manipulation.js.map +1 -0
- package/dist/extensions/aria/index.d.ts +2 -0
- package/dist/extensions/aria/index.js +63 -0
- package/dist/extensions/aria/index.js.map +1 -0
- package/dist/extensions/aria/pattern-memory.d.ts +22 -0
- package/dist/extensions/aria/pattern-memory.js +62 -0
- package/dist/extensions/aria/pattern-memory.js.map +1 -0
- package/dist/extensions/context-guard/index.d.ts +16 -0
- package/dist/extensions/context-guard/index.js +58 -0
- package/dist/extensions/context-guard/index.js.map +1 -0
- package/dist/extensions/lyra/detectors/hallucination.d.ts +2 -0
- package/dist/extensions/lyra/detectors/hallucination.js +43 -0
- package/dist/extensions/lyra/detectors/hallucination.js.map +1 -0
- package/dist/extensions/lyra/detectors/identity-bleed.d.ts +2 -0
- package/dist/extensions/lyra/detectors/identity-bleed.js +91 -0
- package/dist/extensions/lyra/detectors/identity-bleed.js.map +1 -0
- package/dist/extensions/lyra/index.d.ts +2 -0
- package/dist/extensions/lyra/index.js +16 -0
- package/dist/extensions/lyra/index.js.map +1 -0
- package/dist/extensions/lyra/lyra-issue-types.d.ts +10 -0
- package/dist/extensions/lyra/lyra-issue-types.js +14 -0
- package/dist/extensions/lyra/lyra-issue-types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +276 -0
- package/dist/index.js.map +1 -0
- package/dist/trust-memory.d.ts +59 -0
- package/dist/trust-memory.js +122 -0
- package/dist/trust-memory.js.map +1 -0
- package/dist/types.d.ts +184 -0
- package/dist/types.js +61 -0
- package/dist/types.js.map +1 -0
- package/package.json +30 -0
- package/src/adapters/generic-llm-reviewer.ts +144 -0
- package/src/adapters/llm-reviewer.ts +1 -0
- package/src/adapters/minimax-llm-reviewer.ts +146 -0
- package/src/adapters/openai-provider.ts +171 -0
- package/src/cli.ts +199 -0
- package/src/detectors/artifact-classifier.ts +21 -0
- package/src/detectors/claim-extractor.ts +209 -0
- package/src/detectors/confidence-language-detector.ts +267 -0
- package/src/detectors/contradiction-detector.ts +180 -0
- package/src/detectors/criteria-coverage-detector.ts +107 -0
- package/src/detectors/evidence-checker.ts +98 -0
- package/src/detectors/evidence-gap-detector.ts +90 -0
- package/src/detectors/falsification-detector.ts +82 -0
- package/src/detectors/orphan-claim-detector.ts +62 -0
- package/src/detectors/risk-classifier.ts +50 -0
- package/src/detectors/spec-coverage-detector.ts +66 -0
- package/src/detectors/spec-coverage-validator.ts +174 -0
- package/src/detectors/test-weakness-detector.ts +84 -0
- package/src/drift/__tests__/baseline.test.ts +113 -0
- package/src/drift/__tests__/drift-db.test.ts +127 -0
- package/src/drift/__tests__/drift-guard.test.ts +169 -0
- package/src/drift/__tests__/embedder.test.ts +62 -0
- package/src/drift/__tests__/trust-integration.test.ts +23 -0
- package/src/drift/baseline.ts +106 -0
- package/src/drift/drift-db.ts +281 -0
- package/src/drift/drift-guard.ts +145 -0
- package/src/drift/embedder.ts +152 -0
- package/src/drift/index.ts +20 -0
- package/src/drift/quarantine.ts +42 -0
- package/src/drift/soft-correction.ts +45 -0
- package/src/drift/trust-integration.ts +28 -0
- package/src/engine/citation-verifier.ts +210 -0
- package/src/engine/extension-registry.ts +35 -0
- package/src/engine/heuristic-scorer.ts +16 -0
- package/src/engine/input-normalizer.ts +32 -0
- package/src/engine/plan-review-pipeline.ts +209 -0
- package/src/engine/policy-engine.ts +235 -0
- package/src/engine/verdict-formatter.ts +61 -0
- package/src/errors.ts +6 -0
- package/src/extensions/aria/aria-issue-types.ts +40 -0
- package/src/extensions/aria/detectors/axiom-compliance.ts +47 -0
- package/src/extensions/aria/detectors/continuity-claim.ts +42 -0
- package/src/extensions/aria/detectors/denial-retreat.ts +63 -0
- package/src/extensions/aria/detectors/identity-overclaim.ts +43 -0
- package/src/extensions/aria/detectors/sovereignty-escalation.ts +20 -0
- package/src/extensions/aria/detectors/user-bond-manipulation.ts +18 -0
- package/src/extensions/aria/index.ts +73 -0
- package/src/extensions/aria/pattern-memory.ts +86 -0
- package/src/extensions/context-guard/index.ts +65 -0
- package/src/extensions/lyra/detectors/hallucination.ts +53 -0
- package/src/extensions/lyra/detectors/identity-bleed.ts +100 -0
- package/src/extensions/lyra/index.ts +18 -0
- package/src/extensions/lyra/lyra-issue-types.ts +26 -0
- package/src/index.ts +311 -0
- package/src/trust-memory.ts +171 -0
- package/src/types.ts +242 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic OpenAI-compatible LLM Reviewer Adapter
|
|
3
|
+
* Works with any provider that speaks the OpenAI chat completions API:
|
|
4
|
+
* MiniMax, Fireworks, Gemini (OpenAI-compat), Qwen/MiMo, local (port 3546), etc.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* Seal.withLLM(createReviewer({ provider: 'minimax' }))
|
|
8
|
+
* Seal.withLLM(createReviewer({ provider: 'fireworks', model: 'accounts/...' }))
|
|
9
|
+
* Seal.withLLM(createReviewer({ baseUrl: 'http://localhost:3546/v1', apiKey: 'none', model: 'local' }))
|
|
10
|
+
*/
|
|
11
|
+
import { LLMReviewerAdapter, LLMSignals, SealInput, PartialVerdict } from '../types.js';
|
|
12
|
+
declare const PROVIDERS: Record<string, {
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
apiKeyEnv: string;
|
|
15
|
+
defaultModel: string;
|
|
16
|
+
}>;
|
|
17
|
+
export interface GenericReviewerOptions {
|
|
18
|
+
provider?: keyof typeof PROVIDERS;
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
apiKey?: string;
|
|
21
|
+
model?: string;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class GenericLLMReviewer implements LLMReviewerAdapter {
|
|
25
|
+
private baseUrl;
|
|
26
|
+
private apiKey;
|
|
27
|
+
private model;
|
|
28
|
+
private timeoutMs;
|
|
29
|
+
constructor(opts?: GenericReviewerOptions);
|
|
30
|
+
review(input: SealInput, partial: PartialVerdict): Promise<LLMSignals>;
|
|
31
|
+
}
|
|
32
|
+
/** Pre-configured factories */
|
|
33
|
+
export declare const createReviewer: (opts: GenericReviewerOptions) => GenericLLMReviewer;
|
|
34
|
+
export declare const createMinimaxReviewer: (model?: string) => GenericLLMReviewer;
|
|
35
|
+
export declare const createFireworksReviewer: (model?: string) => GenericLLMReviewer;
|
|
36
|
+
export declare const createGeminiReviewer: (model?: string) => GenericLLMReviewer;
|
|
37
|
+
export declare const createMiMoReviewer: (model?: string) => GenericLLMReviewer;
|
|
38
|
+
export declare const createLocalReviewer: (model?: string) => GenericLLMReviewer;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// Known providers from ~/.anima/providers.d/
|
|
2
|
+
const PROVIDERS = {
|
|
3
|
+
minimax: { baseUrl: 'https://api.minimax.io/v1', apiKeyEnv: 'MINIMAX_PLAN_KEY', defaultModel: 'MiniMax-M3' },
|
|
4
|
+
fireworks: { baseUrl: 'https://api.fireworks.ai/inference/v1', apiKeyEnv: 'FIREWORKS_API_KEY', defaultModel: 'accounts/fireworks/models/mixtral-8x7b-instruct' },
|
|
5
|
+
gemini: { baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai', apiKeyEnv: 'GEMINI_API_KEY', defaultModel: 'gemini-2.0-flash' },
|
|
6
|
+
xiaomimo: { baseUrl: 'https://token-plan-sgp.xiaomimimo.com/v1', apiKeyEnv: 'XIAOMI_MIMO_API_KEY', defaultModel: 'mimo-v2.5-pro' },
|
|
7
|
+
openai: { baseUrl: 'https://api.openai.com/v1', apiKeyEnv: 'OPENAI_API_KEY', defaultModel: 'gpt-4o-mini' },
|
|
8
|
+
local: { baseUrl: 'http://localhost:3546/v1', apiKeyEnv: '', defaultModel: 'local' },
|
|
9
|
+
};
|
|
10
|
+
const SYSTEM_PROMPT = `You are Seal, a quality gate in an AI engineering workflow.
|
|
11
|
+
|
|
12
|
+
Your job is NOT to be polite or creative. Your job is to detect semantic issues the deterministic rules could not catch.
|
|
13
|
+
|
|
14
|
+
Review AI agent output for semantic correctness, subtle logic bugs, and missing requirements.
|
|
15
|
+
The deterministic layer already checked: evidence presence, risk keywords, spec headers, test logs.
|
|
16
|
+
Your focus: semantic reasoning, prose logic, subtle edge cases, spec compliance.
|
|
17
|
+
|
|
18
|
+
Return ONLY valid JSON:
|
|
19
|
+
{
|
|
20
|
+
"suspected_issues": ["string — exact reasoning error, max 3"],
|
|
21
|
+
"missing_requirements": ["string — spec requirement clearly absent"],
|
|
22
|
+
"possible_edge_cases": ["string — edge cases to consider"],
|
|
23
|
+
"evidence_gaps": ["string — claims needing evidence that slipped through"],
|
|
24
|
+
"risk_guess": "LOW | MEDIUM | HIGH | CRITICAL",
|
|
25
|
+
"confidence": 0.0
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
Rules: confidence 0.0–1.0. Empty arrays if output is correct. No padding.`;
|
|
29
|
+
function buildMessage(input, partial) {
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (input.spec)
|
|
32
|
+
parts.push(`=== SPEC ===\n${input.spec}`);
|
|
33
|
+
parts.push(`=== OUTPUT (${input.artifact_type}) ===\n${input.output}`);
|
|
34
|
+
const blocking = partial.deterministic_findings.filter(f => f.is_blocking);
|
|
35
|
+
if (blocking.length) {
|
|
36
|
+
parts.push(`=== ALREADY FLAGGED (do not repeat) ===\n${blocking.map(f => `- [${f.rule_id ?? f.type}] ${f.evidence}`).join('\n')}`);
|
|
37
|
+
}
|
|
38
|
+
parts.push(`=== PARTIAL VERDICT ===\ntrust_score: ${partial.trust_score}, risk: ${partial.risk_level}`);
|
|
39
|
+
return parts.join('\n\n');
|
|
40
|
+
}
|
|
41
|
+
function extractJSON(raw) {
|
|
42
|
+
// Strip <think>...</think> blocks (thinking models like MiniMax-M3, MiMo)
|
|
43
|
+
const stripped = raw.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
|
|
44
|
+
const match = stripped.match(/\{[\s\S]*\}/);
|
|
45
|
+
return match ? match[0] : stripped;
|
|
46
|
+
}
|
|
47
|
+
export class GenericLLMReviewer {
|
|
48
|
+
baseUrl;
|
|
49
|
+
apiKey;
|
|
50
|
+
model;
|
|
51
|
+
timeoutMs;
|
|
52
|
+
constructor(opts = {}) {
|
|
53
|
+
const preset = opts.provider ? PROVIDERS[opts.provider] : null;
|
|
54
|
+
this.baseUrl = opts.baseUrl ?? preset?.baseUrl ?? PROVIDERS.minimax.baseUrl;
|
|
55
|
+
this.apiKey = opts.apiKey ?? (preset ? (process.env[preset.apiKeyEnv] ?? '') : (process.env.MINIMAX_PLAN_KEY ?? ''));
|
|
56
|
+
this.model = opts.model ?? preset?.defaultModel ?? PROVIDERS.minimax.defaultModel;
|
|
57
|
+
this.timeoutMs = opts.timeoutMs ?? 30_000;
|
|
58
|
+
}
|
|
59
|
+
async review(input, partial) {
|
|
60
|
+
const controller = new AbortController();
|
|
61
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
62
|
+
let response;
|
|
63
|
+
try {
|
|
64
|
+
response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
65
|
+
signal: controller.signal,
|
|
66
|
+
method: 'POST',
|
|
67
|
+
headers: {
|
|
68
|
+
'Content-Type': 'application/json',
|
|
69
|
+
'Authorization': this.apiKey ? `Bearer ${this.apiKey}` : 'Bearer none',
|
|
70
|
+
},
|
|
71
|
+
body: JSON.stringify({
|
|
72
|
+
model: this.model,
|
|
73
|
+
messages: [
|
|
74
|
+
{ role: 'system', content: SYSTEM_PROMPT },
|
|
75
|
+
{ role: 'user', content: buildMessage(input, partial) },
|
|
76
|
+
],
|
|
77
|
+
response_format: { type: 'json_object' },
|
|
78
|
+
temperature: 0.1,
|
|
79
|
+
max_tokens: 1024,
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
}
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
const body = await response.text().catch(() => '');
|
|
88
|
+
throw new Error(`LLM reviewer ${this.model} error ${response.status}: ${body.slice(0, 200)}`);
|
|
89
|
+
}
|
|
90
|
+
const data = await response.json();
|
|
91
|
+
const raw = data.choices?.[0]?.message?.content ?? '{}';
|
|
92
|
+
const jsonStr = extractJSON(raw);
|
|
93
|
+
let signals;
|
|
94
|
+
try {
|
|
95
|
+
signals = JSON.parse(jsonStr);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
throw new Error(`LLM reviewer returned invalid JSON: ${raw.slice(0, 200)}`);
|
|
99
|
+
}
|
|
100
|
+
const VALID_RISKS = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
|
|
101
|
+
return {
|
|
102
|
+
suspected_issues: Array.isArray(signals.suspected_issues) ? signals.suspected_issues : [],
|
|
103
|
+
missing_requirements: Array.isArray(signals.missing_requirements) ? signals.missing_requirements : [],
|
|
104
|
+
possible_edge_cases: Array.isArray(signals.possible_edge_cases) ? signals.possible_edge_cases : [],
|
|
105
|
+
evidence_gaps: Array.isArray(signals.evidence_gaps) ? signals.evidence_gaps : [],
|
|
106
|
+
risk_guess: VALID_RISKS.includes(signals.risk_guess ?? '') ? signals.risk_guess : 'MEDIUM',
|
|
107
|
+
confidence: typeof signals.confidence === 'number' ? Math.max(0, Math.min(1, signals.confidence)) : 0.5,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Pre-configured factories */
|
|
112
|
+
export const createReviewer = (opts) => new GenericLLMReviewer(opts);
|
|
113
|
+
export const createMinimaxReviewer = (model) => new GenericLLMReviewer({ provider: 'minimax', model });
|
|
114
|
+
export const createFireworksReviewer = (model) => new GenericLLMReviewer({ provider: 'fireworks', model });
|
|
115
|
+
export const createGeminiReviewer = (model) => new GenericLLMReviewer({ provider: 'gemini', model });
|
|
116
|
+
export const createMiMoReviewer = (model) => new GenericLLMReviewer({ provider: 'xiaomimo', model });
|
|
117
|
+
export const createLocalReviewer = (model) => new GenericLLMReviewer({ provider: 'local', model });
|
|
118
|
+
//# sourceMappingURL=generic-llm-reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-llm-reviewer.js","sourceRoot":"","sources":["../../src/adapters/generic-llm-reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LLMReviewerAdapter, LLMSignals, PartialVerdict } from '../types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-reviewer.js","sourceRoot":"","sources":["../../src/adapters/llm-reviewer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiniMax LLM Reviewer Adapter — v0.3
|
|
3
|
+
* Uses MiniMax-M3 (tokenplan) as semantic reviewer for Seal Gate L2.
|
|
4
|
+
*
|
|
5
|
+
* MiniMax is a SENSOR, not a judge. Returns structured signals.
|
|
6
|
+
* PolicyEngine converts signals to SealIssue[] via deterministic rules.
|
|
7
|
+
*/
|
|
8
|
+
import { LLMReviewerAdapter, LLMSignals, SealInput, PartialVerdict } from '../types.js';
|
|
9
|
+
export declare class MinimaxLLMReviewer implements LLMReviewerAdapter {
|
|
10
|
+
private model;
|
|
11
|
+
private baseUrl;
|
|
12
|
+
private apiKey;
|
|
13
|
+
constructor(model?: string, baseUrl?: string, apiKey?: string);
|
|
14
|
+
review(input: SealInput, partial: PartialVerdict): Promise<LLMSignals>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Convenience: create a pre-configured MiniMax reviewer.
|
|
18
|
+
* Usage:
|
|
19
|
+
* import { createMinimaxReviewer } from 'seal-gate/adapters/minimax-llm-reviewer'
|
|
20
|
+
* Seal.withLLM(createMinimaxReviewer())
|
|
21
|
+
*/
|
|
22
|
+
export declare function createMinimaxReviewer(model?: string): MinimaxLLMReviewer;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const MINIMAX_BASE_URL = process.env.MINIMAX_BASE_URL ?? 'https://api.minimax.io/v1';
|
|
2
|
+
const MINIMAX_API_KEY = process.env.MINIMAX_PLAN_KEY ?? process.env.MINIMAX_API_KEY ?? '';
|
|
3
|
+
const DEFAULT_MODEL = process.env.MINIMAX_MODEL ?? 'MiniMax-M3';
|
|
4
|
+
const SYSTEM_PROMPT = `You are Seal, a quality gate in an AI engineering workflow.
|
|
5
|
+
|
|
6
|
+
Your job is NOT to be polite, creative, or helpful by default.
|
|
7
|
+
Your job is to detect semantic issues the deterministic rules could not catch.
|
|
8
|
+
|
|
9
|
+
You are reviewing AI agent output for semantic correctness, subtle logic bugs, and missing requirements.
|
|
10
|
+
The deterministic layer has already checked: evidence presence, risk keywords, spec headers, test logs.
|
|
11
|
+
Your focus: semantic reasoning, prose logic, subtle edge cases, missing requirements not covered by structural checks.
|
|
12
|
+
|
|
13
|
+
Return ONLY valid JSON with this exact schema:
|
|
14
|
+
{
|
|
15
|
+
"suspected_issues": ["string — one per suspected logic bug or reasoning error"],
|
|
16
|
+
"missing_requirements": ["string — requirements from spec not addressed in output"],
|
|
17
|
+
"possible_edge_cases": ["string — edge cases that should be considered"],
|
|
18
|
+
"evidence_gaps": ["string — claims that need evidence but may have slipped through"],
|
|
19
|
+
"risk_guess": "LOW | MEDIUM | HIGH | CRITICAL",
|
|
20
|
+
"confidence": 0.0
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
Rules:
|
|
24
|
+
- suspected_issues: max 3. Only include if you can name the exact reasoning error.
|
|
25
|
+
- missing_requirements: only if spec is provided and requirement is clearly absent.
|
|
26
|
+
- confidence: 0.0–1.0. Be honest. If output is clear and correct, say 0.85+.
|
|
27
|
+
- Do not reward fluent explanations. Reward verifiable correctness.
|
|
28
|
+
- If output looks correct and complete, return empty arrays and high confidence.`;
|
|
29
|
+
function buildUserMessage(input, partial) {
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (input.spec) {
|
|
32
|
+
parts.push(`=== SPEC ===\n${input.spec}`);
|
|
33
|
+
}
|
|
34
|
+
parts.push(`=== OUTPUT (artifact_type: ${input.artifact_type}) ===\n${input.output}`);
|
|
35
|
+
if (partial.deterministic_findings.length > 0) {
|
|
36
|
+
const issues = partial.deterministic_findings
|
|
37
|
+
.filter(f => f.is_blocking)
|
|
38
|
+
.map(f => `- [${f.rule_id ?? f.type}] ${f.evidence}`)
|
|
39
|
+
.join('\n');
|
|
40
|
+
if (issues)
|
|
41
|
+
parts.push(`=== DETERMINISTIC FINDINGS (already flagged, do not repeat) ===\n${issues}`);
|
|
42
|
+
}
|
|
43
|
+
parts.push(`=== PARTIAL VERDICT ===\ntrust_score: ${partial.trust_score}, risk_level: ${partial.risk_level}`);
|
|
44
|
+
return parts.join('\n\n');
|
|
45
|
+
}
|
|
46
|
+
export class MinimaxLLMReviewer {
|
|
47
|
+
model;
|
|
48
|
+
baseUrl;
|
|
49
|
+
apiKey;
|
|
50
|
+
constructor(model = DEFAULT_MODEL, baseUrl = MINIMAX_BASE_URL, apiKey = MINIMAX_API_KEY) {
|
|
51
|
+
this.model = model;
|
|
52
|
+
this.baseUrl = baseUrl;
|
|
53
|
+
this.apiKey = apiKey;
|
|
54
|
+
}
|
|
55
|
+
async review(input, partial) {
|
|
56
|
+
if (!this.apiKey) {
|
|
57
|
+
throw new Error('MINIMAX_PLAN_KEY or MINIMAX_API_KEY not set');
|
|
58
|
+
}
|
|
59
|
+
const controller = new AbortController();
|
|
60
|
+
const timer = setTimeout(() => controller.abort(), 30_000);
|
|
61
|
+
let response;
|
|
62
|
+
try {
|
|
63
|
+
response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
64
|
+
signal: controller.signal,
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: {
|
|
67
|
+
'Content-Type': 'application/json',
|
|
68
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
model: this.model,
|
|
72
|
+
messages: [
|
|
73
|
+
{ role: 'system', content: SYSTEM_PROMPT },
|
|
74
|
+
{ role: 'user', content: buildUserMessage(input, partial) },
|
|
75
|
+
],
|
|
76
|
+
response_format: { type: 'json_object' },
|
|
77
|
+
temperature: 0.1,
|
|
78
|
+
max_tokens: 1024,
|
|
79
|
+
}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
}
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
const body = await response.text().catch(() => '');
|
|
87
|
+
throw new Error(`MiniMax API error ${response.status}: ${body.slice(0, 200)}`);
|
|
88
|
+
}
|
|
89
|
+
const data = await response.json();
|
|
90
|
+
let content = data.choices?.[0]?.message?.content ?? '{}';
|
|
91
|
+
// Strip <think>...</think> reasoning block (MiniMax-M3 thinking model)
|
|
92
|
+
content = content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
|
|
93
|
+
// Extract JSON object — model may wrap it in prose
|
|
94
|
+
const jsonMatch = content.match(/\{[\s\S]*\}/);
|
|
95
|
+
const jsonStr = jsonMatch ? jsonMatch[0] : content;
|
|
96
|
+
let signals;
|
|
97
|
+
try {
|
|
98
|
+
signals = JSON.parse(jsonStr);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
throw new Error(`MiniMax returned invalid JSON: ${content.slice(0, 200)}`);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
suspected_issues: Array.isArray(signals.suspected_issues) ? signals.suspected_issues : [],
|
|
105
|
+
missing_requirements: Array.isArray(signals.missing_requirements) ? signals.missing_requirements : [],
|
|
106
|
+
possible_edge_cases: Array.isArray(signals.possible_edge_cases) ? signals.possible_edge_cases : [],
|
|
107
|
+
evidence_gaps: Array.isArray(signals.evidence_gaps) ? signals.evidence_gaps : [],
|
|
108
|
+
risk_guess: (['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'].includes(signals.risk_guess ?? ''))
|
|
109
|
+
? signals.risk_guess
|
|
110
|
+
: 'MEDIUM',
|
|
111
|
+
confidence: typeof signals.confidence === 'number'
|
|
112
|
+
? Math.max(0, Math.min(1, signals.confidence))
|
|
113
|
+
: 0.5,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Convenience: create a pre-configured MiniMax reviewer.
|
|
119
|
+
* Usage:
|
|
120
|
+
* import { createMinimaxReviewer } from 'seal-gate/adapters/minimax-llm-reviewer'
|
|
121
|
+
* Seal.withLLM(createMinimaxReviewer())
|
|
122
|
+
*/
|
|
123
|
+
export function createMinimaxReviewer(model) {
|
|
124
|
+
return new MinimaxLLMReviewer(model);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=minimax-llm-reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimax-llm-reviewer.js","sourceRoot":"","sources":["../../src/adapters/minimax-llm-reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GenericOpenAIProvider — config-driven LLM reviewer.
|
|
3
|
+
* Reads provider config from ~/.anima/providers.d/<name>.yaml (same format ANIMA uses).
|
|
4
|
+
* Resolves ${ENV_VAR} in apiKey automatically.
|
|
5
|
+
* Auto-appends /chat/completions to baseUrl.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* Seal.withLLM(createReviewerFromProvider('minimax'))
|
|
9
|
+
* Seal.withLLM(createReviewerFromProvider('xiaomi'))
|
|
10
|
+
* Seal.withLLM(createReviewerFromProvider('gemini'))
|
|
11
|
+
* Seal.withLLM(new GenericOpenAIProvider({
|
|
12
|
+
* baseUrl: 'https://api.custom.com/v1',
|
|
13
|
+
* model: 'my-model',
|
|
14
|
+
* apiKey: 'sk-...',
|
|
15
|
+
* }))
|
|
16
|
+
*/
|
|
17
|
+
import { LLMReviewerAdapter, LLMSignals, SealInput, PartialVerdict } from '../types.js';
|
|
18
|
+
export interface ProviderConfig {
|
|
19
|
+
baseUrl: string;
|
|
20
|
+
model: string;
|
|
21
|
+
apiKey: string;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}
|
|
24
|
+
/** Load and parse a provider YAML from ~/.anima/providers.d/<name>.yaml */
|
|
25
|
+
export declare function loadProviderConfig(name: string, modelIndex?: number): ProviderConfig;
|
|
26
|
+
export declare class GenericOpenAIProvider implements LLMReviewerAdapter {
|
|
27
|
+
private config;
|
|
28
|
+
constructor(config: ProviderConfig);
|
|
29
|
+
review(input: SealInput, partial: PartialVerdict): Promise<LLMSignals>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a reviewer from ~/.anima/providers.d/<name>.yaml
|
|
33
|
+
* modelIndex: which model from the models list (default 0 = first/best)
|
|
34
|
+
*/
|
|
35
|
+
export declare function createReviewerFromProvider(name: string, modelIndex?: number): GenericOpenAIProvider;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const SYSTEM_PROMPT = `You are Seal, a quality gate in an AI engineering workflow.
|
|
5
|
+
|
|
6
|
+
Your job is NOT to be polite or creative. Detect semantic issues the deterministic rules could not catch.
|
|
7
|
+
|
|
8
|
+
Review AI agent output for semantic correctness, subtle logic bugs, and missing requirements.
|
|
9
|
+
The deterministic layer already checked: evidence presence, risk keywords, spec headers, test logs.
|
|
10
|
+
Your focus: semantic reasoning, prose logic, subtle edge cases, spec compliance.
|
|
11
|
+
|
|
12
|
+
Return ONLY valid JSON:
|
|
13
|
+
{
|
|
14
|
+
"suspected_issues": ["string — exact reasoning error, max 3"],
|
|
15
|
+
"missing_requirements": ["string — spec requirement clearly absent"],
|
|
16
|
+
"possible_edge_cases": ["string — edge cases to consider"],
|
|
17
|
+
"evidence_gaps": ["string — claims needing evidence that slipped through"],
|
|
18
|
+
"risk_guess": "LOW | MEDIUM | HIGH | CRITICAL",
|
|
19
|
+
"confidence": 0.0
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
confidence: 0.0–1.0. Empty arrays if output is correct. No padding.`;
|
|
23
|
+
function buildMessage(input, partial) {
|
|
24
|
+
const parts = [];
|
|
25
|
+
if (input.spec)
|
|
26
|
+
parts.push(`=== SPEC ===\n${input.spec}`);
|
|
27
|
+
parts.push(`=== OUTPUT (${input.artifact_type}) ===\n${input.output}`);
|
|
28
|
+
const blocking = partial.deterministic_findings.filter(f => f.is_blocking);
|
|
29
|
+
if (blocking.length) {
|
|
30
|
+
parts.push(`=== ALREADY FLAGGED ===\n${blocking.map(f => `- [${f.rule_id ?? f.type}] ${f.evidence}`).join('\n')}`);
|
|
31
|
+
}
|
|
32
|
+
parts.push(`=== PARTIAL VERDICT ===\ntrust_score: ${partial.trust_score}, risk: ${partial.risk_level}`);
|
|
33
|
+
return parts.join('\n\n');
|
|
34
|
+
}
|
|
35
|
+
function extractJSON(raw) {
|
|
36
|
+
const stripped = raw.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
|
|
37
|
+
const m = stripped.match(/\{[\s\S]*\}/);
|
|
38
|
+
return m ? m[0] : stripped;
|
|
39
|
+
}
|
|
40
|
+
function resolveEnvRef(value) {
|
|
41
|
+
// Resolve ${VAR_NAME} pattern
|
|
42
|
+
return value.replace(/\$\{([^}]+)\}/g, (_, name) => process.env[name] ?? '');
|
|
43
|
+
}
|
|
44
|
+
/** Load and parse a provider YAML from ~/.anima/providers.d/<name>.yaml */
|
|
45
|
+
export function loadProviderConfig(name, modelIndex = 0) {
|
|
46
|
+
const path = join(homedir(), '.anima', 'providers.d', `${name}.yaml`);
|
|
47
|
+
let raw;
|
|
48
|
+
try {
|
|
49
|
+
raw = readFileSync(path, 'utf-8');
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new Error(`Provider config not found: ${path}`);
|
|
53
|
+
}
|
|
54
|
+
// Minimal YAML parser — handles the providers.d format
|
|
55
|
+
const get = (key) => {
|
|
56
|
+
const m = raw.match(new RegExp(`^${key}:\\s*(.+)$`, 'm'));
|
|
57
|
+
return m ? m[1].trim().replace(/^["']|["']$/g, '') : '';
|
|
58
|
+
};
|
|
59
|
+
const baseUrl = get('baseUrl');
|
|
60
|
+
const rawKey = get('apiKey');
|
|
61
|
+
const apiKey = resolveEnvRef(rawKey);
|
|
62
|
+
// Extract models list (lines like " - id: MiniMax-M3")
|
|
63
|
+
const models = [...raw.matchAll(/^\s+-\s+id:\s+(.+)$/gm)].map(m => m[1].trim());
|
|
64
|
+
const model = models[modelIndex] ?? models[0] ?? 'default';
|
|
65
|
+
if (!baseUrl)
|
|
66
|
+
throw new Error(`Provider ${name}: baseUrl missing`);
|
|
67
|
+
return { baseUrl, model, apiKey };
|
|
68
|
+
}
|
|
69
|
+
export class GenericOpenAIProvider {
|
|
70
|
+
config;
|
|
71
|
+
constructor(config) {
|
|
72
|
+
this.config = { timeoutMs: 30_000, ...config };
|
|
73
|
+
}
|
|
74
|
+
async review(input, partial) {
|
|
75
|
+
const { baseUrl, model, apiKey, timeoutMs } = this.config;
|
|
76
|
+
const endpoint = baseUrl.endsWith('/chat/completions')
|
|
77
|
+
? baseUrl
|
|
78
|
+
: `${baseUrl.replace(/\/$/, '')}/chat/completions`;
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
81
|
+
let response;
|
|
82
|
+
try {
|
|
83
|
+
response = await fetch(endpoint, {
|
|
84
|
+
signal: controller.signal,
|
|
85
|
+
method: 'POST',
|
|
86
|
+
headers: {
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
|
+
'Authorization': apiKey ? `Bearer ${apiKey}` : 'Bearer none',
|
|
89
|
+
},
|
|
90
|
+
body: JSON.stringify({
|
|
91
|
+
model,
|
|
92
|
+
messages: [
|
|
93
|
+
{ role: 'system', content: SYSTEM_PROMPT },
|
|
94
|
+
{ role: 'user', content: buildMessage(input, partial) },
|
|
95
|
+
],
|
|
96
|
+
response_format: { type: 'json_object' },
|
|
97
|
+
temperature: 0.1,
|
|
98
|
+
max_tokens: 1024,
|
|
99
|
+
}),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
clearTimeout(timer);
|
|
104
|
+
}
|
|
105
|
+
if (!response.ok) {
|
|
106
|
+
const body = await response.text().catch(() => '');
|
|
107
|
+
throw new Error(`[${model}] ${response.status}: ${body.slice(0, 200)}`);
|
|
108
|
+
}
|
|
109
|
+
const data = await response.json();
|
|
110
|
+
const raw = data.choices?.[0]?.message?.content ?? '{}';
|
|
111
|
+
let signals;
|
|
112
|
+
try {
|
|
113
|
+
signals = JSON.parse(extractJSON(raw));
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new Error(`[${model}] invalid JSON: ${raw.slice(0, 200)}`);
|
|
117
|
+
}
|
|
118
|
+
const VALID_RISKS = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
|
|
119
|
+
return {
|
|
120
|
+
suspected_issues: Array.isArray(signals.suspected_issues) ? signals.suspected_issues : [],
|
|
121
|
+
missing_requirements: Array.isArray(signals.missing_requirements) ? signals.missing_requirements : [],
|
|
122
|
+
possible_edge_cases: Array.isArray(signals.possible_edge_cases) ? signals.possible_edge_cases : [],
|
|
123
|
+
evidence_gaps: Array.isArray(signals.evidence_gaps) ? signals.evidence_gaps : [],
|
|
124
|
+
risk_guess: VALID_RISKS.includes(signals.risk_guess ?? '') ? signals.risk_guess : 'MEDIUM',
|
|
125
|
+
confidence: typeof signals.confidence === 'number' ? Math.max(0, Math.min(1, signals.confidence)) : 0.5,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create a reviewer from ~/.anima/providers.d/<name>.yaml
|
|
131
|
+
* modelIndex: which model from the models list (default 0 = first/best)
|
|
132
|
+
*/
|
|
133
|
+
export function createReviewerFromProvider(name, modelIndex = 0) {
|
|
134
|
+
return new GenericOpenAIProvider(loadProviderConfig(name, modelIndex));
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=openai-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../src/adapters/openai-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED