tryassay 0.11.0 → 0.12.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/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/runtime/audit-log.js +2 -2
- package/dist/runtime/audit-log.js.map +1 -1
- package/dist/runtime/control-server.js +8 -4
- package/dist/runtime/control-server.js.map +1 -1
- package/dist/runtime/executor.js +27 -12
- package/dist/runtime/executor.js.map +1 -1
- 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,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.0",
|
|
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
|
},
|