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.
@@ -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.11.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
  },