tryassay 0.11.1 → 0.12.1
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/README.md +128 -52
- package/dist/cli.js +12 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/generate.d.ts +10 -0
- package/dist/commands/generate.js +117 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/formal-verifier.d.ts +44 -0
- package/dist/lib/formal-verifier.js +481 -0
- package/dist/lib/formal-verifier.js.map +1 -0
- package/dist/sdk/forward-verify.d.ts +20 -0
- package/dist/sdk/forward-verify.js +239 -0
- package/dist/sdk/forward-verify.js.map +1 -0
- package/dist/sdk/index.d.ts +8 -0
- package/dist/sdk/index.js +29 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/types.d.ts +72 -0
- package/dist/sdk/types.js +2 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/sdk/verified-generate.d.ts +2 -0
- package/dist/sdk/verified-generate.js +109 -0
- package/dist/sdk/verified-generate.js.map +1 -0
- package/package.json +12 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { getClient, MODEL } from '../lib/anthropic.js';
|
|
2
|
+
import { runFormalVerification, } from '../lib/formal-verifier.js';
|
|
3
|
+
// ── System Prompts (ported from api/v1/forward.ts) ───────────
|
|
4
|
+
const EXTRACTION_SYSTEM = `You are a code quality auditor. Given source code, extract every testable claim the code makes about its behavior.
|
|
5
|
+
|
|
6
|
+
A "claim" is any implicit or explicit assertion about what the code does:
|
|
7
|
+
- Function signatures claim they accept certain inputs and return certain outputs
|
|
8
|
+
- Error handling claims it handles specific failure modes
|
|
9
|
+
- Security-sensitive code claims it prevents attacks
|
|
10
|
+
- Edge case handling claims it handles boundary conditions
|
|
11
|
+
- Type annotations claim data conforms to a shape
|
|
12
|
+
- Performance-sensitive code claims acceptable resource usage
|
|
13
|
+
|
|
14
|
+
For each claim:
|
|
15
|
+
{ "id": "CLAIM-001", "category": "correctness|security|performance|error-handling|edge-case|type-safety", "severity": "critical|high|medium|low", "description": "human-readable description of the claim", "assertion": "precise testable assertion" }
|
|
16
|
+
|
|
17
|
+
Be thorough. A typical function has 3-8 claims. Cover:
|
|
18
|
+
- Return value correctness for all input classes
|
|
19
|
+
- Error/exception handling completeness
|
|
20
|
+
- Boundary/edge case coverage
|
|
21
|
+
- Security properties (injection, auth, data leaks)
|
|
22
|
+
- Type safety and null handling
|
|
23
|
+
- Concurrency safety if applicable
|
|
24
|
+
|
|
25
|
+
Return ONLY a JSON array. No markdown fences.`;
|
|
26
|
+
const VERIFICATION_SYSTEM = `You are a formal verification engine. Given source code and a list of claims about that code, verify each claim against the actual implementation.
|
|
27
|
+
|
|
28
|
+
For each claim, determine:
|
|
29
|
+
- PASS: The code fully satisfies the claim with evidence
|
|
30
|
+
- PARTIAL: The code partially satisfies the claim but has gaps
|
|
31
|
+
- FAIL: The code does NOT satisfy the claim
|
|
32
|
+
- N/A: The claim is not applicable to this code
|
|
33
|
+
|
|
34
|
+
Provide specific evidence: quote code lines, identify missing checks, point to logic gaps.
|
|
35
|
+
|
|
36
|
+
Return ONLY a JSON array:
|
|
37
|
+
[{ "claimId": "CLAIM-001", "verdict": "PASS|PARTIAL|FAIL|N/A", "reasoning": "detailed explanation with code evidence" }]
|
|
38
|
+
No markdown fences.`;
|
|
39
|
+
// ── JSON Parsing Helpers ─────────────────────────────────────
|
|
40
|
+
function stripCodeFences(text) {
|
|
41
|
+
let result = text.trim();
|
|
42
|
+
if (result.startsWith('```')) {
|
|
43
|
+
const firstNewline = result.indexOf('\n');
|
|
44
|
+
if (firstNewline !== -1)
|
|
45
|
+
result = result.slice(firstNewline + 1);
|
|
46
|
+
}
|
|
47
|
+
const lastFence = result.lastIndexOf('```');
|
|
48
|
+
if (lastFence !== -1)
|
|
49
|
+
result = result.slice(0, lastFence);
|
|
50
|
+
return result.trim();
|
|
51
|
+
}
|
|
52
|
+
function repairTruncatedArray(text) {
|
|
53
|
+
if (text.endsWith(']'))
|
|
54
|
+
return text;
|
|
55
|
+
const lastBrace = text.lastIndexOf('}');
|
|
56
|
+
if (lastBrace !== -1)
|
|
57
|
+
return text.slice(0, lastBrace + 1) + '\n]';
|
|
58
|
+
return text;
|
|
59
|
+
}
|
|
60
|
+
function safeParseArray(text) {
|
|
61
|
+
let jsonText = stripCodeFences(text);
|
|
62
|
+
jsonText = repairTruncatedArray(jsonText);
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(jsonText);
|
|
65
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// ── Type Bridges ─────────────────────────────────────────────
|
|
72
|
+
function codeClaimToForward(claim) {
|
|
73
|
+
return {
|
|
74
|
+
id: claim.id,
|
|
75
|
+
category: claim.category,
|
|
76
|
+
severity: claim.severity,
|
|
77
|
+
description: claim.description,
|
|
78
|
+
assertion: claim.assertion,
|
|
79
|
+
testable: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function forwardToClaim(raw, index) {
|
|
83
|
+
if (!raw.description || typeof raw.description !== 'string')
|
|
84
|
+
return null;
|
|
85
|
+
if (!raw.assertion || typeof raw.assertion !== 'string')
|
|
86
|
+
return null;
|
|
87
|
+
const validCategories = ['correctness', 'security', 'performance', 'error-handling', 'edge-case', 'type-safety'];
|
|
88
|
+
const validSeverities = ['critical', 'high', 'medium', 'low'];
|
|
89
|
+
const category = validCategories.includes(raw.category)
|
|
90
|
+
? raw.category
|
|
91
|
+
: 'correctness';
|
|
92
|
+
const severity = validSeverities.includes(raw.severity)
|
|
93
|
+
? raw.severity
|
|
94
|
+
: 'medium';
|
|
95
|
+
return {
|
|
96
|
+
id: typeof raw.id === 'string' ? raw.id : `CLAIM-${String(index + 1).padStart(3, '0')}`,
|
|
97
|
+
category,
|
|
98
|
+
severity,
|
|
99
|
+
description: raw.description.trim(),
|
|
100
|
+
assertion: raw.assertion.trim(),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function forwardVerificationToClaimVerification(v) {
|
|
104
|
+
return {
|
|
105
|
+
claimId: v.claimId,
|
|
106
|
+
verdict: v.verdict,
|
|
107
|
+
reasoning: v.reasoning,
|
|
108
|
+
method: (v.verification_method ?? 'llm'),
|
|
109
|
+
formalOverride: v.formal_override
|
|
110
|
+
? {
|
|
111
|
+
originalLlmVerdict: v.formal_override.original_llm_verdict,
|
|
112
|
+
formalVerdict: v.formal_override.formal_verdict,
|
|
113
|
+
reason: v.formal_override.reason,
|
|
114
|
+
}
|
|
115
|
+
: undefined,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// ── Phase 1: Extract Claims ──────────────────────────────────
|
|
119
|
+
export async function extractCodeClaims(code, language, context) {
|
|
120
|
+
const client = getClient();
|
|
121
|
+
const contextBlock = context ? `\n\nAdditional context:\n${context}` : '';
|
|
122
|
+
const response = await client.messages.create({
|
|
123
|
+
model: MODEL,
|
|
124
|
+
max_tokens: 16_000,
|
|
125
|
+
system: EXTRACTION_SYSTEM,
|
|
126
|
+
messages: [
|
|
127
|
+
{
|
|
128
|
+
role: 'user',
|
|
129
|
+
content: `Language: ${language}\n\nCode:\n${code}${contextBlock}`,
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
});
|
|
133
|
+
const text = response.content
|
|
134
|
+
.filter((block) => block.type === 'text')
|
|
135
|
+
.map(block => block.text)
|
|
136
|
+
.join('');
|
|
137
|
+
const rawClaims = safeParseArray(text);
|
|
138
|
+
const claims = [];
|
|
139
|
+
for (let i = 0; i < rawClaims.length; i++) {
|
|
140
|
+
const claim = forwardToClaim(rawClaims[i], i);
|
|
141
|
+
if (claim)
|
|
142
|
+
claims.push(claim);
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
claims,
|
|
146
|
+
inputTokens: response.usage.input_tokens,
|
|
147
|
+
outputTokens: response.usage.output_tokens,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// ── Phase 2: Verify Claims ───────────────────────────────────
|
|
151
|
+
export async function verifyCodeClaims(code, language, claims) {
|
|
152
|
+
const client = getClient();
|
|
153
|
+
const claimList = claims
|
|
154
|
+
.map(c => `[${c.id}] (${c.category}, ${c.severity}) ${c.description}\n Assertion: ${c.assertion}`)
|
|
155
|
+
.join('\n\n');
|
|
156
|
+
const response = await client.messages.create({
|
|
157
|
+
model: MODEL,
|
|
158
|
+
max_tokens: 16_000,
|
|
159
|
+
system: VERIFICATION_SYSTEM,
|
|
160
|
+
messages: [
|
|
161
|
+
{
|
|
162
|
+
role: 'user',
|
|
163
|
+
content: `Language: ${language}\n\nCode:\n${code}\n\nClaims to verify:\n${claimList}`,
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
});
|
|
167
|
+
const text = response.content
|
|
168
|
+
.filter((block) => block.type === 'text')
|
|
169
|
+
.map(block => block.text)
|
|
170
|
+
.join('');
|
|
171
|
+
const rawVerifications = safeParseArray(text);
|
|
172
|
+
const validVerdicts = ['PASS', 'PARTIAL', 'FAIL', 'N/A'];
|
|
173
|
+
const verifications = rawVerifications
|
|
174
|
+
.filter(v => typeof v.claimId === 'string' && typeof v.reasoning === 'string')
|
|
175
|
+
.filter(v => claims.some(c => c.id === v.claimId))
|
|
176
|
+
.map(v => ({
|
|
177
|
+
claimId: v.claimId,
|
|
178
|
+
verdict: (validVerdicts.includes(v.verdict) ? v.verdict : 'N/A'),
|
|
179
|
+
reasoning: v.reasoning.trim(),
|
|
180
|
+
method: 'llm',
|
|
181
|
+
}));
|
|
182
|
+
return {
|
|
183
|
+
verifications,
|
|
184
|
+
inputTokens: response.usage.input_tokens,
|
|
185
|
+
outputTokens: response.usage.output_tokens,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// ── Phase 2.5: Formal Verification ───────────────────────────
|
|
189
|
+
export function applyFormalVerification(code, language, claims, llmVerifications) {
|
|
190
|
+
// Bridge SDK types → API types
|
|
191
|
+
const forwardClaims = claims.map(codeClaimToForward);
|
|
192
|
+
const forwardVerifications = llmVerifications.map(v => ({
|
|
193
|
+
claimId: v.claimId,
|
|
194
|
+
verdict: v.verdict,
|
|
195
|
+
reasoning: v.reasoning,
|
|
196
|
+
verification_method: v.method,
|
|
197
|
+
}));
|
|
198
|
+
// Run formal verification
|
|
199
|
+
const result = runFormalVerification(code, language, forwardClaims, forwardVerifications);
|
|
200
|
+
// Bridge API types → SDK types
|
|
201
|
+
const verifications = result.verifications.map(forwardVerificationToClaimVerification);
|
|
202
|
+
const formalStats = {
|
|
203
|
+
formallyVerified: result.stats.formally_verified,
|
|
204
|
+
llmVerified: result.stats.llm_verified,
|
|
205
|
+
disagreements: result.stats.disagreements,
|
|
206
|
+
formalOverrides: result.stats.formal_overrides,
|
|
207
|
+
};
|
|
208
|
+
return { verifications, formalStats };
|
|
209
|
+
}
|
|
210
|
+
// ── Orchestrator ─────────────────────────────────────────────
|
|
211
|
+
export async function forwardVerify(code, language, context) {
|
|
212
|
+
let totalIn = 0;
|
|
213
|
+
let totalOut = 0;
|
|
214
|
+
// Phase 1: Extract claims
|
|
215
|
+
const { claims, inputTokens: extractIn, outputTokens: extractOut } = await extractCodeClaims(code, language, context);
|
|
216
|
+
totalIn += extractIn;
|
|
217
|
+
totalOut += extractOut;
|
|
218
|
+
// Phase 2: LLM verification
|
|
219
|
+
const { verifications: llmVerifications, inputTokens: verifyIn, outputTokens: verifyOut } = await verifyCodeClaims(code, language, claims);
|
|
220
|
+
totalIn += verifyIn;
|
|
221
|
+
totalOut += verifyOut;
|
|
222
|
+
// Phase 2.5: Formal verification with override
|
|
223
|
+
const { verifications, formalStats } = applyFormalVerification(code, language, claims, llmVerifications);
|
|
224
|
+
const passed = verifications.filter(v => v.verdict === 'PASS').length;
|
|
225
|
+
const failed = verifications.filter(v => v.verdict === 'FAIL').length;
|
|
226
|
+
const partial = verifications.filter(v => v.verdict === 'PARTIAL').length;
|
|
227
|
+
const result = {
|
|
228
|
+
claims,
|
|
229
|
+
verifications,
|
|
230
|
+
formalStats,
|
|
231
|
+
passed,
|
|
232
|
+
failed,
|
|
233
|
+
partial,
|
|
234
|
+
total: verifications.length,
|
|
235
|
+
allPassed: failed === 0 && partial === 0,
|
|
236
|
+
};
|
|
237
|
+
return { result, inputTokens: totalIn, outputTokens: totalOut };
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=forward-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forward-verify.js","sourceRoot":"","sources":["../../src/sdk/forward-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AssaySDKConfig, GenerateOptions, VerifyOptions, VerifiedCode, VerificationResult } from './types.js';
|
|
2
|
+
export declare class AssaySDK {
|
|
3
|
+
private config;
|
|
4
|
+
constructor(config?: AssaySDKConfig);
|
|
5
|
+
generate(options: GenerateOptions): Promise<VerifiedCode>;
|
|
6
|
+
verify(options: VerifyOptions): Promise<VerificationResult>;
|
|
7
|
+
}
|
|
8
|
+
export type { AssaySDKConfig, GenerateOptions, VerifyOptions, VerifiedCode, VerificationResult, CodeClaim, ClaimVerdict, ClaimVerification, FormalStats, ProgressEvent, } from './types.js';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { verifiedGenerate } from './verified-generate.js';
|
|
2
|
+
import { forwardVerify } from './forward-verify.js';
|
|
3
|
+
export class AssaySDK {
|
|
4
|
+
config;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
const apiKey = config?.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY;
|
|
7
|
+
if (!apiKey) {
|
|
8
|
+
throw new Error('ANTHROPIC_API_KEY is required. Pass it as anthropicApiKey in config or set the ANTHROPIC_API_KEY environment variable.');
|
|
9
|
+
}
|
|
10
|
+
this.config = {
|
|
11
|
+
...config,
|
|
12
|
+
anthropicApiKey: apiKey,
|
|
13
|
+
model: config?.model ?? 'claude-sonnet-4-5-20250929',
|
|
14
|
+
maxIterations: config?.maxIterations ?? 3,
|
|
15
|
+
};
|
|
16
|
+
// Set env var so downstream lib functions pick it up
|
|
17
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
18
|
+
process.env.ANTHROPIC_API_KEY = apiKey;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async generate(options) {
|
|
22
|
+
return verifiedGenerate(options, this.config);
|
|
23
|
+
}
|
|
24
|
+
async verify(options) {
|
|
25
|
+
const { result } = await forwardVerify(options.code, options.language, options.context);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD,MAAM,OAAO,QAAQ;IACX,MAAM,CAA6E;IAE3F,YAAY,MAAuB;QACjC,MAAM,MAAM,GAAG,MAAM,EAAE,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,wHAAwH,CACzH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,MAAM;YACT,eAAe,EAAE,MAAM;YACvB,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,4BAA4B;YACpD,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,CAAC;SAC1C,CAAC;QAEF,qDAAqD;QACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;QACzC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,OAAO,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export interface AssaySDKConfig {
|
|
2
|
+
anthropicApiKey?: string;
|
|
3
|
+
model?: string;
|
|
4
|
+
maxIterations?: number;
|
|
5
|
+
onProgress?: (event: ProgressEvent) => void;
|
|
6
|
+
}
|
|
7
|
+
export interface ProgressEvent {
|
|
8
|
+
phase: 'spec' | 'constraints' | 'generate' | 'extract' | 'verify' | 'formal' | 'regenerate';
|
|
9
|
+
message: string;
|
|
10
|
+
iteration: number;
|
|
11
|
+
totalIterations: number;
|
|
12
|
+
}
|
|
13
|
+
export interface GenerateOptions {
|
|
14
|
+
task: string;
|
|
15
|
+
language: string;
|
|
16
|
+
context?: string;
|
|
17
|
+
maxIterations?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface VerifyOptions {
|
|
20
|
+
code: string;
|
|
21
|
+
language: string;
|
|
22
|
+
context?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CodeClaim {
|
|
25
|
+
id: string;
|
|
26
|
+
category: 'correctness' | 'security' | 'error-handling' | 'edge-case' | 'type-safety' | 'performance';
|
|
27
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
28
|
+
description: string;
|
|
29
|
+
assertion: string;
|
|
30
|
+
}
|
|
31
|
+
export type ClaimVerdict = 'PASS' | 'PARTIAL' | 'FAIL' | 'N/A';
|
|
32
|
+
export interface ClaimVerification {
|
|
33
|
+
claimId: string;
|
|
34
|
+
verdict: ClaimVerdict;
|
|
35
|
+
reasoning: string;
|
|
36
|
+
method: 'formal' | 'llm';
|
|
37
|
+
formalOverride?: {
|
|
38
|
+
originalLlmVerdict: ClaimVerdict;
|
|
39
|
+
formalVerdict: 'PASS' | 'FAIL';
|
|
40
|
+
reason: string;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface FormalStats {
|
|
44
|
+
formallyVerified: number;
|
|
45
|
+
llmVerified: number;
|
|
46
|
+
disagreements: number;
|
|
47
|
+
formalOverrides: number;
|
|
48
|
+
}
|
|
49
|
+
export interface VerificationResult {
|
|
50
|
+
claims: CodeClaim[];
|
|
51
|
+
verifications: ClaimVerification[];
|
|
52
|
+
formalStats: FormalStats;
|
|
53
|
+
passed: number;
|
|
54
|
+
failed: number;
|
|
55
|
+
partial: number;
|
|
56
|
+
total: number;
|
|
57
|
+
allPassed: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface VerifiedCode {
|
|
60
|
+
code: string;
|
|
61
|
+
language: string;
|
|
62
|
+
verified: boolean;
|
|
63
|
+
verification: VerificationResult;
|
|
64
|
+
iterations: number;
|
|
65
|
+
specs: number;
|
|
66
|
+
constraints: number;
|
|
67
|
+
usage: {
|
|
68
|
+
inputTokens: number;
|
|
69
|
+
outputTokens: number;
|
|
70
|
+
durationMs: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sdk/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { synthesizeSpecs } from '../lib/spec-synthesizer.js';
|
|
2
|
+
import { generateConstraints } from '../lib/constraint-engine.js';
|
|
3
|
+
import { generateWithConstraints } from '../lib/guided-generator.js';
|
|
4
|
+
import { forwardVerify } from './forward-verify.js';
|
|
5
|
+
function emit(config, phase, message, iteration, totalIterations) {
|
|
6
|
+
config.onProgress?.({ phase, message, iteration, totalIterations });
|
|
7
|
+
}
|
|
8
|
+
function buildRegenerationTask(originalTask, previousCode, failedClaims) {
|
|
9
|
+
const failures = failedClaims
|
|
10
|
+
.map(v => `- [${v.claimId}] ${v.verdict}: ${v.reasoning}`)
|
|
11
|
+
.join('\n');
|
|
12
|
+
return `${originalTask}
|
|
13
|
+
|
|
14
|
+
IMPORTANT: A previous attempt at this code FAILED verification. Fix these specific issues and regenerate:
|
|
15
|
+
|
|
16
|
+
${failures}
|
|
17
|
+
|
|
18
|
+
Previous code that failed:
|
|
19
|
+
\`\`\`
|
|
20
|
+
${previousCode}
|
|
21
|
+
\`\`\`
|
|
22
|
+
|
|
23
|
+
Generate a corrected version that addresses ALL the failures above.`;
|
|
24
|
+
}
|
|
25
|
+
function criticalOrHighFailed(verifications, claims) {
|
|
26
|
+
const criticalHighIds = new Set(claims
|
|
27
|
+
.filter(c => c.severity === 'critical' || c.severity === 'high')
|
|
28
|
+
.map(c => c.id));
|
|
29
|
+
return verifications.some(v => criticalHighIds.has(v.claimId) && (v.verdict === 'FAIL' || v.verdict === 'PARTIAL'));
|
|
30
|
+
}
|
|
31
|
+
export async function verifiedGenerate(options, config) {
|
|
32
|
+
const maxIterations = options.maxIterations ?? config.maxIterations ?? 3;
|
|
33
|
+
const startTime = Date.now();
|
|
34
|
+
let totalInputTokens = 0;
|
|
35
|
+
let totalOutputTokens = 0;
|
|
36
|
+
// ── Iteration 1: Synthesize specs + constraints (once) ─────
|
|
37
|
+
emit(config, 'spec', 'Synthesizing specifications...', 1, maxIterations);
|
|
38
|
+
const specResult = await synthesizeSpecs(options.task, options.language);
|
|
39
|
+
totalInputTokens += specResult.inputTokens;
|
|
40
|
+
totalOutputTokens += specResult.outputTokens;
|
|
41
|
+
emit(config, 'constraints', `Generating constraints from ${specResult.totalSpecs} specs...`, 1, maxIterations);
|
|
42
|
+
const constraintResult = await generateConstraints(options.task, options.language, specResult.specs);
|
|
43
|
+
totalInputTokens += constraintResult.inputTokens;
|
|
44
|
+
totalOutputTokens += constraintResult.outputTokens;
|
|
45
|
+
// ── Generate-Verify Loop ───────────────────────────────────
|
|
46
|
+
let currentTask = options.task;
|
|
47
|
+
if (options.context) {
|
|
48
|
+
currentTask += `\n\nAdditional context:\n${options.context}`;
|
|
49
|
+
}
|
|
50
|
+
for (let iteration = 1; iteration <= maxIterations; iteration++) {
|
|
51
|
+
// Generate code
|
|
52
|
+
emit(config, 'generate', `Generating code (iteration ${iteration}/${maxIterations})...`, iteration, maxIterations);
|
|
53
|
+
const codeResult = await generateWithConstraints(currentTask, options.language, specResult.specs, constraintResult.constraints);
|
|
54
|
+
totalInputTokens += codeResult.inputTokens;
|
|
55
|
+
totalOutputTokens += codeResult.outputTokens;
|
|
56
|
+
// Extract claims and verify
|
|
57
|
+
emit(config, 'extract', 'Extracting claims from generated code...', iteration, maxIterations);
|
|
58
|
+
emit(config, 'verify', 'Verifying claims against code...', iteration, maxIterations);
|
|
59
|
+
emit(config, 'formal', 'Running formal verification...', iteration, maxIterations);
|
|
60
|
+
const { result: verification, inputTokens: verifyIn, outputTokens: verifyOut } = await forwardVerify(codeResult.code, options.language);
|
|
61
|
+
totalInputTokens += verifyIn;
|
|
62
|
+
totalOutputTokens += verifyOut;
|
|
63
|
+
// Check if all critical/high claims pass
|
|
64
|
+
const hasCriticalFailures = criticalOrHighFailed(verification.verifications, verification.claims);
|
|
65
|
+
if (!hasCriticalFailures) {
|
|
66
|
+
// All critical/high claims pass — return verified code
|
|
67
|
+
return {
|
|
68
|
+
code: codeResult.code,
|
|
69
|
+
language: options.language,
|
|
70
|
+
verified: true,
|
|
71
|
+
verification,
|
|
72
|
+
iterations: iteration,
|
|
73
|
+
specs: specResult.totalSpecs,
|
|
74
|
+
constraints: constraintResult.totalConstraints,
|
|
75
|
+
usage: {
|
|
76
|
+
inputTokens: totalInputTokens,
|
|
77
|
+
outputTokens: totalOutputTokens,
|
|
78
|
+
durationMs: Date.now() - startTime,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Verification failed — prepare regeneration context
|
|
83
|
+
if (iteration < maxIterations) {
|
|
84
|
+
const failedClaims = verification.verifications.filter(v => v.verdict === 'FAIL' || v.verdict === 'PARTIAL');
|
|
85
|
+
emit(config, 'regenerate', `${failedClaims.length} claim(s) failed. Regenerating with failure context (${iteration + 1}/${maxIterations})...`, iteration, maxIterations);
|
|
86
|
+
currentTask = buildRegenerationTask(options.task, codeResult.code, failedClaims);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Max iterations reached — return with verified: false
|
|
90
|
+
return {
|
|
91
|
+
code: codeResult.code,
|
|
92
|
+
language: options.language,
|
|
93
|
+
verified: false,
|
|
94
|
+
verification,
|
|
95
|
+
iterations: iteration,
|
|
96
|
+
specs: specResult.totalSpecs,
|
|
97
|
+
constraints: constraintResult.totalConstraints,
|
|
98
|
+
usage: {
|
|
99
|
+
inputTokens: totalInputTokens,
|
|
100
|
+
outputTokens: totalOutputTokens,
|
|
101
|
+
durationMs: Date.now() - startTime,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Unreachable, but TypeScript needs it
|
|
107
|
+
throw new Error('Unreachable: generate-verify loop exited without returning');
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=verified-generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verified-generate.js","sourceRoot":"","sources":["../../src/sdk/verified-generate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tryassay",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "AI code verification CLI — find bugs that tests miss, linters ignore, and code review overlooks",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./cli": {
|
|
14
|
+
"import": "./dist/cli.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
6
17
|
"bin": {
|
|
7
18
|
"tryassay": "./dist/cli.js"
|
|
8
19
|
},
|