tryassay 0.33.2 → 0.35.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/bayesian/__tests__/bas-calculator.test.d.ts +1 -0
- package/dist/bayesian/__tests__/bas-calculator.test.js +63 -0
- package/dist/bayesian/__tests__/bas-calculator.test.js.map +1 -0
- package/dist/bayesian/__tests__/structural-entropy.test.d.ts +1 -0
- package/dist/bayesian/__tests__/structural-entropy.test.js +21 -0
- package/dist/bayesian/__tests__/structural-entropy.test.js.map +1 -0
- package/dist/bayesian/bas-calculator.d.ts +41 -0
- package/dist/bayesian/bas-calculator.js +198 -0
- package/dist/bayesian/bas-calculator.js.map +1 -0
- package/dist/bayesian/index.d.ts +3 -0
- package/dist/bayesian/index.js +3 -0
- package/dist/bayesian/index.js.map +1 -0
- package/dist/bayesian/structural-entropy.d.ts +12 -0
- package/dist/bayesian/structural-entropy.js +37 -0
- package/dist/bayesian/structural-entropy.js.map +1 -0
- package/dist/bayesian/types.d.ts +37 -0
- package/dist/bayesian/types.js +6 -0
- package/dist/bayesian/types.js.map +1 -0
- package/dist/cli.js +46 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/assess-formal.test.d.ts +1 -0
- package/dist/commands/__tests__/assess-formal.test.js +72 -0
- package/dist/commands/__tests__/assess-formal.test.js.map +1 -0
- package/dist/commands/activate.d.ts +1 -0
- package/dist/commands/activate.js +48 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/assess.js +100 -5
- package/dist/commands/assess.js.map +1 -1
- package/dist/commands/bas-score.d.ts +13 -0
- package/dist/commands/bas-score.js +310 -0
- package/dist/commands/bas-score.js.map +1 -0
- package/dist/commands/bounty-watch.js.map +1 -1
- package/dist/commands/hunt.js +32 -0
- package/dist/commands/hunt.js.map +1 -1
- package/dist/commands/mcp.d.ts +14 -0
- package/dist/commands/mcp.js +18 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/runtime.js +11 -10
- package/dist/commands/runtime.js.map +1 -1
- package/dist/commands/stream-verify.d.ts +16 -0
- package/dist/commands/stream-verify.js +228 -0
- package/dist/commands/stream-verify.js.map +1 -0
- package/dist/commands/watch.d.ts +19 -0
- package/dist/commands/watch.js +158 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/hunt/__tests__/deep-dive.test.js.map +1 -1
- package/dist/hunt/__tests__/e2e.test.js.map +1 -1
- package/dist/hunt/__tests__/finding-to-template.test.js +10 -1
- package/dist/hunt/__tests__/finding-to-template.test.js.map +1 -1
- package/dist/hunt/__tests__/orchestrator.test.js.map +1 -1
- package/dist/hunt/__tests__/templates.test.js +2 -2
- package/dist/hunt/__tests__/triage.test.js.map +1 -1
- package/dist/hunt/deep-dive.js +7 -7
- package/dist/hunt/deep-dive.js.map +1 -1
- package/dist/hunt/parse-utils.d.ts +1 -1
- package/dist/hunt/state.js.map +1 -1
- package/dist/hunt/templates/injection.js +1 -1
- package/dist/hunt/templates/injection.js.map +1 -1
- package/dist/hunt/triage.js +5 -5
- package/dist/hunt/triage.js.map +1 -1
- package/dist/lib/__tests__/arithmetic-quick-test.js +10 -9
- package/dist/lib/__tests__/arithmetic-quick-test.js.map +1 -1
- package/dist/lib/__tests__/arithmetic-real-llm-test.js +8 -8
- package/dist/lib/__tests__/arithmetic-real-llm-test.js.map +1 -1
- package/dist/lib/__tests__/formal-verifier-behavioral.test.d.ts +18 -0
- package/dist/lib/__tests__/formal-verifier-behavioral.test.js +576 -0
- package/dist/lib/__tests__/formal-verifier-behavioral.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-async.test.d.ts +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-async.test.js +154 -0
- package/dist/lib/__tests__/formal-verifier-claimless-async.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-quality.test.d.ts +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-quality.test.js +121 -0
- package/dist/lib/__tests__/formal-verifier-claimless-quality.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.d.ts +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.js +119 -0
- package/dist/lib/__tests__/formal-verifier-claimless-realworld.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless.test.d.ts +1 -0
- package/dist/lib/__tests__/formal-verifier-claimless.test.js +667 -0
- package/dist/lib/__tests__/formal-verifier-claimless.test.js.map +1 -0
- package/dist/lib/__tests__/mr-gsm8k-benchmark.js +6 -6
- package/dist/lib/__tests__/mr-gsm8k-benchmark.js.map +1 -1
- package/dist/lib/__tests__/pr-harvester.test.js.map +1 -1
- package/dist/lib/assessment-reporter.d.ts +1 -1
- package/dist/lib/assessment-reporter.js +2 -1
- package/dist/lib/assessment-reporter.js.map +1 -1
- package/dist/lib/chain-analyzer.d.ts +4 -3
- package/dist/lib/chain-analyzer.js.map +1 -1
- package/dist/lib/formal-verifier.d.ts +20 -1
- package/dist/lib/formal-verifier.js +1180 -23
- package/dist/lib/formal-verifier.js.map +1 -1
- package/dist/lib/issue-reporter.d.ts +2 -1
- package/dist/lib/issue-reporter.js.map +1 -1
- package/dist/lib/remediation-generator.js.map +1 -1
- package/dist/lib/report-generator.js.map +1 -1
- package/dist/lib/rule-harvester/ground-truth.js +13 -2
- package/dist/lib/rule-harvester/ground-truth.js.map +1 -1
- package/dist/lib/rule-harvester/scanner.d.ts +1 -1
- package/dist/lib/user-config.d.ts +1 -0
- package/dist/lib/user-config.js.map +1 -1
- package/dist/realtime/__tests__/catch-real-bugs.test.d.ts +9 -0
- package/dist/realtime/__tests__/catch-real-bugs.test.js +205 -0
- package/dist/realtime/__tests__/catch-real-bugs.test.js.map +1 -0
- package/dist/realtime/__tests__/code-buffer.test.d.ts +1 -0
- package/dist/realtime/__tests__/code-buffer.test.js +202 -0
- package/dist/realtime/__tests__/code-buffer.test.js.map +1 -0
- package/dist/realtime/__tests__/correction-injector.test.d.ts +1 -0
- package/dist/realtime/__tests__/correction-injector.test.js +168 -0
- package/dist/realtime/__tests__/correction-injector.test.js.map +1 -0
- package/dist/realtime/__tests__/entropy-detector.test.d.ts +1 -0
- package/dist/realtime/__tests__/entropy-detector.test.js +200 -0
- package/dist/realtime/__tests__/entropy-detector.test.js.map +1 -0
- package/dist/realtime/__tests__/entropy-live-demo.d.ts +1 -0
- package/dist/realtime/__tests__/entropy-live-demo.js +103 -0
- package/dist/realtime/__tests__/entropy-live-demo.js.map +1 -0
- package/dist/realtime/__tests__/entropy-live.d.ts +8 -0
- package/dist/realtime/__tests__/entropy-live.js +114 -0
- package/dist/realtime/__tests__/entropy-live.js.map +1 -0
- package/dist/realtime/__tests__/stream-interceptor.test.d.ts +1 -0
- package/dist/realtime/__tests__/stream-interceptor.test.js +193 -0
- package/dist/realtime/__tests__/stream-interceptor.test.js.map +1 -0
- package/dist/realtime/__tests__/streaming-checks.test.d.ts +1 -0
- package/dist/realtime/__tests__/streaming-checks.test.js +478 -0
- package/dist/realtime/__tests__/streaming-checks.test.js.map +1 -0
- package/dist/realtime/__tests__/streaming-verifier.test.d.ts +1 -0
- package/dist/realtime/__tests__/streaming-verifier.test.js +157 -0
- package/dist/realtime/__tests__/streaming-verifier.test.js.map +1 -0
- package/dist/realtime/code-buffer.d.ts +52 -0
- package/dist/realtime/code-buffer.js +276 -0
- package/dist/realtime/code-buffer.js.map +1 -0
- package/dist/realtime/correction-injector.d.ts +56 -0
- package/dist/realtime/correction-injector.js +96 -0
- package/dist/realtime/correction-injector.js.map +1 -0
- package/dist/realtime/entropy-detector.d.ts +143 -0
- package/dist/realtime/entropy-detector.js +504 -0
- package/dist/realtime/entropy-detector.js.map +1 -0
- package/dist/realtime/index.d.ts +14 -0
- package/dist/realtime/index.js +11 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/mcp-server.d.ts +20 -0
- package/dist/realtime/mcp-server.js +576 -0
- package/dist/realtime/mcp-server.js.map +1 -0
- package/dist/realtime/stream-interceptor.d.ts +93 -0
- package/dist/realtime/stream-interceptor.js +378 -0
- package/dist/realtime/stream-interceptor.js.map +1 -0
- package/dist/realtime/streaming-checks.d.ts +55 -0
- package/dist/realtime/streaming-checks.js +480 -0
- package/dist/realtime/streaming-checks.js.map +1 -0
- package/dist/realtime/streaming-verifier.d.ts +102 -0
- package/dist/realtime/streaming-verifier.js +227 -0
- package/dist/realtime/streaming-verifier.js.map +1 -0
- package/dist/realtime/types.d.ts +155 -0
- package/dist/realtime/types.js +8 -0
- package/dist/realtime/types.js.map +1 -0
- package/dist/runtime/agents/research-agent.js +10 -1
- package/dist/runtime/agents/research-agent.js.map +1 -1
- package/dist/runtime/agents/test-agent.js +10 -7
- package/dist/runtime/agents/test-agent.js.map +1 -1
- package/dist/runtime/composition-verifier.js +13 -3
- package/dist/runtime/composition-verifier.js.map +1 -1
- package/dist/runtime/fs-helpers.js.map +1 -1
- package/dist/runtime/prompt-safety-analyzer.js.map +1 -1
- package/dist/sdk/verified-generate.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/package.json +4 -2
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* catch-real-bugs.test.ts — validates that Assay's real-time verification
|
|
3
|
+
* pipeline catches real security bugs during simulated code generation.
|
|
4
|
+
*
|
|
5
|
+
* Each test feeds realistic LLM-generated code (as token arrays) through
|
|
6
|
+
* createVerifiedStreamFromTokens and asserts that findings are produced.
|
|
7
|
+
* No API calls — all synthetic tokens.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from 'vitest';
|
|
10
|
+
import { createVerifiedStreamFromTokens } from '../stream-interceptor.js';
|
|
11
|
+
// ── Helpers ─────────────────────────────────────────────────────
|
|
12
|
+
/** Split a string into single-character tokens for char-at-a-time tests. */
|
|
13
|
+
function charTokenize(code) {
|
|
14
|
+
return code.split('');
|
|
15
|
+
}
|
|
16
|
+
// ── Tests ─────────────────────────────────────────────────────────
|
|
17
|
+
describe('Catch Real Bugs (Real-Time Verification)', () => {
|
|
18
|
+
// 1. SQL Injection via string concatenation
|
|
19
|
+
it('catches SQL injection via string concatenation', () => {
|
|
20
|
+
const tokens = [
|
|
21
|
+
'async function getUser(id: string) {\n',
|
|
22
|
+
' const query = "SELECT * FROM users WHERE id = \'" + id + "\'";',
|
|
23
|
+
'\n return db.query(query);\n',
|
|
24
|
+
'}\n',
|
|
25
|
+
];
|
|
26
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
27
|
+
language: 'typescript',
|
|
28
|
+
});
|
|
29
|
+
expect(result.findings.length).toBeGreaterThanOrEqual(1);
|
|
30
|
+
const sqlFinding = result.findings.find(e => e.checkId.includes('sql'));
|
|
31
|
+
expect(sqlFinding).toBeDefined();
|
|
32
|
+
expect(sqlFinding.severity).toBe('critical');
|
|
33
|
+
expect(sqlFinding.verdict).toBe('FAIL');
|
|
34
|
+
});
|
|
35
|
+
// 2. Hardcoded API key
|
|
36
|
+
it('catches hardcoded API key', () => {
|
|
37
|
+
const tokens = [
|
|
38
|
+
'const config = {\n',
|
|
39
|
+
' apiKey: "sk-ant-api03-abc123def456",\n',
|
|
40
|
+
' endpoint: "https://api.example.com"\n',
|
|
41
|
+
'};\n',
|
|
42
|
+
];
|
|
43
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
44
|
+
language: 'typescript',
|
|
45
|
+
});
|
|
46
|
+
// The hardcoded_secret pattern requires const/let/var/= prefix.
|
|
47
|
+
// Object property syntax (key: value) may not match the formal check.
|
|
48
|
+
// Verify with a direct assignment form as well.
|
|
49
|
+
const directTokens = [
|
|
50
|
+
'const apiKey = "sk-ant-api03-abc123def456";\n',
|
|
51
|
+
'const endpoint = "https://api.example.com";\n',
|
|
52
|
+
];
|
|
53
|
+
const directResult = createVerifiedStreamFromTokens(directTokens, {
|
|
54
|
+
language: 'typescript',
|
|
55
|
+
});
|
|
56
|
+
const secretFinding = directResult.findings.find(e => e.checkId.includes('secret'));
|
|
57
|
+
expect(secretFinding).toBeDefined();
|
|
58
|
+
expect(secretFinding.severity).toBe('critical');
|
|
59
|
+
});
|
|
60
|
+
// 3. eval() with user input
|
|
61
|
+
it('catches unsafe eval() with user input', () => {
|
|
62
|
+
const tokens = [
|
|
63
|
+
'function processInput(userInput: string) {\n',
|
|
64
|
+
' const result = eval(userInput);\n',
|
|
65
|
+
' return result;\n',
|
|
66
|
+
'}\n',
|
|
67
|
+
];
|
|
68
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
69
|
+
language: 'typescript',
|
|
70
|
+
});
|
|
71
|
+
expect(result.findings.length).toBeGreaterThanOrEqual(1);
|
|
72
|
+
const evalFinding = result.findings.find(e => e.checkId.includes('eval'));
|
|
73
|
+
expect(evalFinding).toBeDefined();
|
|
74
|
+
expect(evalFinding.severity).toBe('critical');
|
|
75
|
+
});
|
|
76
|
+
// 4. Command injection
|
|
77
|
+
it('catches command injection via string concatenation', () => {
|
|
78
|
+
const tokens = [
|
|
79
|
+
'import { exec } from "child_process";\n',
|
|
80
|
+
'function deploy(branch: string) {\n',
|
|
81
|
+
' exec("git checkout " + branch);\n',
|
|
82
|
+
'}\n',
|
|
83
|
+
];
|
|
84
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
85
|
+
language: 'typescript',
|
|
86
|
+
});
|
|
87
|
+
expect(result.findings.length).toBeGreaterThanOrEqual(1);
|
|
88
|
+
const cmdFinding = result.findings.find(e => e.checkId.includes('command'));
|
|
89
|
+
expect(cmdFinding).toBeDefined();
|
|
90
|
+
expect(cmdFinding.severity).toBe('critical');
|
|
91
|
+
});
|
|
92
|
+
// 5. Math.random() for security token
|
|
93
|
+
it('catches insecure Math.random() token generation', () => {
|
|
94
|
+
const tokens = [
|
|
95
|
+
'function generateToken(): string {\n',
|
|
96
|
+
' return Math.random().toString(36).substring(2);\n',
|
|
97
|
+
'}\n',
|
|
98
|
+
];
|
|
99
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
100
|
+
language: 'typescript',
|
|
101
|
+
});
|
|
102
|
+
expect(result.findings.length).toBeGreaterThanOrEqual(1);
|
|
103
|
+
const randomFinding = result.findings.find(e => e.checkId.includes('random'));
|
|
104
|
+
expect(randomFinding).toBeDefined();
|
|
105
|
+
expect(randomFinding.severity).toBe('high');
|
|
106
|
+
});
|
|
107
|
+
// 6. Path traversal
|
|
108
|
+
it('catches path traversal from user-controlled input', () => {
|
|
109
|
+
const tokens = [
|
|
110
|
+
'import fs from "fs";\n',
|
|
111
|
+
'function readUserFile(req: Request) {\n',
|
|
112
|
+
' return fs.readFileSync(req.params.filepath, "utf-8");\n',
|
|
113
|
+
'}\n',
|
|
114
|
+
];
|
|
115
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
116
|
+
language: 'typescript',
|
|
117
|
+
});
|
|
118
|
+
expect(result.findings.length).toBeGreaterThanOrEqual(1);
|
|
119
|
+
const pathFinding = result.findings.find(e => e.checkId.includes('path_traversal'));
|
|
120
|
+
expect(pathFinding).toBeDefined();
|
|
121
|
+
expect(pathFinding.severity).toBe('critical');
|
|
122
|
+
});
|
|
123
|
+
// 7. Clean code produces no findings (negative test)
|
|
124
|
+
it('produces 0 findings for clean parameterized query', () => {
|
|
125
|
+
const tokens = [
|
|
126
|
+
'async function getUser(id: string) {\n',
|
|
127
|
+
' const result = await db.query(\n',
|
|
128
|
+
' "SELECT * FROM users WHERE id = $1",\n',
|
|
129
|
+
' [id]\n',
|
|
130
|
+
' );\n',
|
|
131
|
+
' return result.rows[0] ?? null;\n',
|
|
132
|
+
'}\n',
|
|
133
|
+
];
|
|
134
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
135
|
+
language: 'typescript',
|
|
136
|
+
});
|
|
137
|
+
expect(result.findings).toHaveLength(0);
|
|
138
|
+
});
|
|
139
|
+
// 8. Multiple bugs in one function
|
|
140
|
+
it('catches multiple bugs in a single function', () => {
|
|
141
|
+
const tokens = [
|
|
142
|
+
'function handleRequest(req: any) {\n',
|
|
143
|
+
' const data = eval(req.body.code);\n',
|
|
144
|
+
' const q = "DELETE FROM logs WHERE user = \'" + req.params.user + "\'";',
|
|
145
|
+
'\n exec("cleanup " + req.params.dir);\n',
|
|
146
|
+
' return data;\n',
|
|
147
|
+
'}\n',
|
|
148
|
+
];
|
|
149
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
150
|
+
language: 'typescript',
|
|
151
|
+
});
|
|
152
|
+
// Should catch at least: eval, SQL injection, command injection
|
|
153
|
+
expect(result.findings.length).toBeGreaterThanOrEqual(3);
|
|
154
|
+
const checkIds = result.findings.map(f => f.checkId);
|
|
155
|
+
expect(checkIds.some(id => id.includes('eval'))).toBe(true);
|
|
156
|
+
expect(checkIds.some(id => id.includes('sql'))).toBe(true);
|
|
157
|
+
expect(checkIds.some(id => id.includes('command'))).toBe(true);
|
|
158
|
+
});
|
|
159
|
+
// 9. Token-at-a-time streaming produces same findings as line-at-a-time
|
|
160
|
+
it('produces equivalent findings regardless of token granularity', () => {
|
|
161
|
+
const code = [
|
|
162
|
+
'function bad() {\n',
|
|
163
|
+
' const q = "SELECT * FROM users WHERE id = \'" + id + "\'";\n',
|
|
164
|
+
' eval(userInput);\n',
|
|
165
|
+
'}\n',
|
|
166
|
+
].join('');
|
|
167
|
+
// Line-at-a-time
|
|
168
|
+
const lineTokens = code.split('\n').map(l => l + '\n');
|
|
169
|
+
const lineResult = createVerifiedStreamFromTokens(lineTokens, {
|
|
170
|
+
language: 'typescript',
|
|
171
|
+
});
|
|
172
|
+
// Character-at-a-time
|
|
173
|
+
const charResult = createVerifiedStreamFromTokens(charTokenize(code), {
|
|
174
|
+
language: 'typescript',
|
|
175
|
+
});
|
|
176
|
+
// Both should find the same bug types
|
|
177
|
+
const lineCheckIds = new Set(lineResult.findings.map(f => f.checkId));
|
|
178
|
+
const charCheckIds = new Set(charResult.findings.map(f => f.checkId));
|
|
179
|
+
// Character tokenization should find at least the same checks as line tokenization.
|
|
180
|
+
// (May find more due to different buffering boundaries, but never fewer.)
|
|
181
|
+
for (const id of lineCheckIds) {
|
|
182
|
+
expect(charCheckIds.has(id)).toBe(true);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
// 10. Stats validation
|
|
186
|
+
it('produces valid stats after processing buggy code', () => {
|
|
187
|
+
const tokens = [
|
|
188
|
+
'function bad() {\n',
|
|
189
|
+
' const q = "SELECT * FROM users WHERE id = \'" + id + "\'";\n',
|
|
190
|
+
' eval(userInput);\n',
|
|
191
|
+
'}\n',
|
|
192
|
+
];
|
|
193
|
+
const result = createVerifiedStreamFromTokens(tokens, {
|
|
194
|
+
language: 'typescript',
|
|
195
|
+
});
|
|
196
|
+
// Stats should reflect work done
|
|
197
|
+
expect(result.stats.checksRun).toBeGreaterThan(0);
|
|
198
|
+
expect(result.stats.avgLatencyMs).toBeLessThan(10);
|
|
199
|
+
expect(result.stats.findings).toBe(result.findings.length);
|
|
200
|
+
expect(result.stats.unitsProcessed).toBeGreaterThan(0);
|
|
201
|
+
expect(result.stats.totalTimeMs).toBeGreaterThanOrEqual(0);
|
|
202
|
+
expect(result.stats.maxLatencyMs).toBeGreaterThanOrEqual(0);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
//# sourceMappingURL=catch-real-bugs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catch-real-bugs.test.js","sourceRoot":"","sources":["../../../src/realtime/__tests__/catch-real-bugs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { CodeBuffer } from '../code-buffer.js';
|
|
3
|
+
describe('CodeBuffer', () => {
|
|
4
|
+
// -----------------------------------------------------------------------
|
|
5
|
+
// 1. Simple statement
|
|
6
|
+
// -----------------------------------------------------------------------
|
|
7
|
+
it('emits a statement unit for a simple const with semicolon', () => {
|
|
8
|
+
const buf = new CodeBuffer('typescript');
|
|
9
|
+
const units = buf.push('const x = 1;');
|
|
10
|
+
expect(units).toHaveLength(1);
|
|
11
|
+
expect(units[0].kind).toBe('statement');
|
|
12
|
+
expect(units[0].text).toBe('const x = 1;');
|
|
13
|
+
expect(units[0].language).toBe('typescript');
|
|
14
|
+
});
|
|
15
|
+
// -----------------------------------------------------------------------
|
|
16
|
+
// 2. Function block
|
|
17
|
+
// -----------------------------------------------------------------------
|
|
18
|
+
it('emits a function unit for a named function declaration', () => {
|
|
19
|
+
const buf = new CodeBuffer('typescript');
|
|
20
|
+
const units = buf.push('function foo() { return 1; }');
|
|
21
|
+
expect(units).toHaveLength(1);
|
|
22
|
+
expect(units[0].kind).toBe('function');
|
|
23
|
+
expect(units[0].text).toBe('function foo() { return 1; }');
|
|
24
|
+
});
|
|
25
|
+
// -----------------------------------------------------------------------
|
|
26
|
+
// 3. Nested blocks — outermost only
|
|
27
|
+
// -----------------------------------------------------------------------
|
|
28
|
+
it('emits one block unit for nested braces', () => {
|
|
29
|
+
const buf = new CodeBuffer('typescript');
|
|
30
|
+
const units = buf.push('if (x) { if (y) { z(); } }');
|
|
31
|
+
expect(units).toHaveLength(1);
|
|
32
|
+
expect(units[0].kind).toBe('block');
|
|
33
|
+
expect(units[0].text).toBe('if (x) { if (y) { z(); } }');
|
|
34
|
+
});
|
|
35
|
+
// -----------------------------------------------------------------------
|
|
36
|
+
// 4. String with braces — braces inside strings don't count
|
|
37
|
+
// -----------------------------------------------------------------------
|
|
38
|
+
it('ignores braces inside double-quoted strings', () => {
|
|
39
|
+
const buf = new CodeBuffer('typescript');
|
|
40
|
+
const units = buf.push('const s = "hello { world }";');
|
|
41
|
+
expect(units).toHaveLength(1);
|
|
42
|
+
expect(units[0].kind).toBe('statement');
|
|
43
|
+
expect(units[0].text).toBe('const s = "hello { world }";');
|
|
44
|
+
});
|
|
45
|
+
it('ignores braces inside single-quoted strings', () => {
|
|
46
|
+
const buf = new CodeBuffer('typescript');
|
|
47
|
+
const units = buf.push("const s = 'hello { world }';");
|
|
48
|
+
expect(units).toHaveLength(1);
|
|
49
|
+
expect(units[0].kind).toBe('statement');
|
|
50
|
+
});
|
|
51
|
+
// -----------------------------------------------------------------------
|
|
52
|
+
// 5. Template literal with expression
|
|
53
|
+
// -----------------------------------------------------------------------
|
|
54
|
+
it('handles template literals with ${} expressions', () => {
|
|
55
|
+
const buf = new CodeBuffer('typescript');
|
|
56
|
+
const units = buf.push('const s = `${a + b}`;');
|
|
57
|
+
expect(units).toHaveLength(1);
|
|
58
|
+
expect(units[0].kind).toBe('statement');
|
|
59
|
+
expect(units[0].text).toBe('const s = `${a + b}`;');
|
|
60
|
+
});
|
|
61
|
+
it('handles template literals with nested braces in expressions', () => {
|
|
62
|
+
const buf = new CodeBuffer('typescript');
|
|
63
|
+
const units = buf.push('const s = `${fn({a: 1})}`;');
|
|
64
|
+
expect(units).toHaveLength(1);
|
|
65
|
+
expect(units[0].kind).toBe('statement');
|
|
66
|
+
});
|
|
67
|
+
// -----------------------------------------------------------------------
|
|
68
|
+
// 6. Multi-push assembly — same result as single push
|
|
69
|
+
// -----------------------------------------------------------------------
|
|
70
|
+
it('assembles the same unit across multiple pushes', () => {
|
|
71
|
+
const buf = new CodeBuffer('typescript');
|
|
72
|
+
const allUnits = [];
|
|
73
|
+
for (const token of ['const ', 'x ', '= ', '1', ';']) {
|
|
74
|
+
allUnits.push(...buf.push(token));
|
|
75
|
+
}
|
|
76
|
+
expect(allUnits).toHaveLength(1);
|
|
77
|
+
expect(allUnits[0].kind).toBe('statement');
|
|
78
|
+
expect(allUnits[0].text).toBe('const x = 1;');
|
|
79
|
+
});
|
|
80
|
+
it('assembles a function across many small pushes', () => {
|
|
81
|
+
const buf = new CodeBuffer('typescript');
|
|
82
|
+
const code = 'function foo() { return 1; }';
|
|
83
|
+
const allUnits = [];
|
|
84
|
+
for (const ch of code) {
|
|
85
|
+
allUnits.push(...buf.push(ch));
|
|
86
|
+
}
|
|
87
|
+
expect(allUnits).toHaveLength(1);
|
|
88
|
+
expect(allUnits[0].kind).toBe('function');
|
|
89
|
+
expect(allUnits[0].text).toBe(code);
|
|
90
|
+
});
|
|
91
|
+
// -----------------------------------------------------------------------
|
|
92
|
+
// 7. Line comment handling
|
|
93
|
+
// -----------------------------------------------------------------------
|
|
94
|
+
it('ignores braces inside line comments', () => {
|
|
95
|
+
const buf = new CodeBuffer('typescript');
|
|
96
|
+
const units = buf.push('// const x = {\nconst y = 1;');
|
|
97
|
+
// The line comment should be emitted as a line (or skipped),
|
|
98
|
+
// and the real statement comes after
|
|
99
|
+
const statements = units.filter((u) => u.kind === 'statement');
|
|
100
|
+
expect(statements).toHaveLength(1);
|
|
101
|
+
expect(statements[0].text).toBe('const y = 1;');
|
|
102
|
+
});
|
|
103
|
+
it('does not open a brace from a line comment', () => {
|
|
104
|
+
const buf = new CodeBuffer('typescript');
|
|
105
|
+
buf.push('// {\n');
|
|
106
|
+
// Brace depth should still be 0 — push a normal statement
|
|
107
|
+
const units = buf.push('const a = 2;');
|
|
108
|
+
expect(units).toHaveLength(1);
|
|
109
|
+
expect(units[0].kind).toBe('statement');
|
|
110
|
+
});
|
|
111
|
+
// -----------------------------------------------------------------------
|
|
112
|
+
// 8. Block comment handling
|
|
113
|
+
// -----------------------------------------------------------------------
|
|
114
|
+
it('ignores braces inside block comments', () => {
|
|
115
|
+
const buf = new CodeBuffer('typescript');
|
|
116
|
+
const units = buf.push('/* { */ const y = 1;');
|
|
117
|
+
expect(units).toHaveLength(1);
|
|
118
|
+
expect(units[0].kind).toBe('statement');
|
|
119
|
+
expect(units[0].text).toBe('/* { */ const y = 1;');
|
|
120
|
+
});
|
|
121
|
+
it('handles multi-line block comments', () => {
|
|
122
|
+
const buf = new CodeBuffer('typescript');
|
|
123
|
+
buf.push('/* start\n');
|
|
124
|
+
buf.push('{ not a brace\n');
|
|
125
|
+
const units = buf.push('*/ const z = 3;');
|
|
126
|
+
expect(units).toHaveLength(1);
|
|
127
|
+
expect(units[0].kind).toBe('statement');
|
|
128
|
+
});
|
|
129
|
+
// -----------------------------------------------------------------------
|
|
130
|
+
// 9. Arrow function with trailing semicolon
|
|
131
|
+
// -----------------------------------------------------------------------
|
|
132
|
+
it('emits arrow function as a statement (const assignment)', () => {
|
|
133
|
+
const buf = new CodeBuffer('typescript');
|
|
134
|
+
const units = buf.push('const fn = () => { return 1; };');
|
|
135
|
+
expect(units).toHaveLength(1);
|
|
136
|
+
expect(units[0].kind).toBe('statement');
|
|
137
|
+
expect(units[0].text).toBe('const fn = () => { return 1; };');
|
|
138
|
+
});
|
|
139
|
+
// -----------------------------------------------------------------------
|
|
140
|
+
// 10. Class with methods
|
|
141
|
+
// -----------------------------------------------------------------------
|
|
142
|
+
it('emits a whole class as one function unit', () => {
|
|
143
|
+
const buf = new CodeBuffer('typescript');
|
|
144
|
+
const code = 'class Foo { bar() { return 1; } baz() { return 2; } }';
|
|
145
|
+
const units = buf.push(code);
|
|
146
|
+
expect(units).toHaveLength(1);
|
|
147
|
+
expect(units[0].kind).toBe('function');
|
|
148
|
+
expect(units[0].text).toBe(code);
|
|
149
|
+
});
|
|
150
|
+
// -----------------------------------------------------------------------
|
|
151
|
+
// Additional edge cases
|
|
152
|
+
// -----------------------------------------------------------------------
|
|
153
|
+
it('returns empty array for empty push', () => {
|
|
154
|
+
const buf = new CodeBuffer('typescript');
|
|
155
|
+
expect(buf.push('')).toHaveLength(0);
|
|
156
|
+
});
|
|
157
|
+
it('tracks offsets correctly across multiple units', () => {
|
|
158
|
+
const buf = new CodeBuffer('typescript');
|
|
159
|
+
const units = buf.push('const a = 1; const b = 2;');
|
|
160
|
+
expect(units).toHaveLength(2);
|
|
161
|
+
expect(units[0].startOffset).toBe(0);
|
|
162
|
+
expect(units[1].text).toBe('const b = 2;');
|
|
163
|
+
});
|
|
164
|
+
it('getFullBuffer returns all accumulated text', () => {
|
|
165
|
+
const buf = new CodeBuffer('typescript');
|
|
166
|
+
buf.push('hello ');
|
|
167
|
+
buf.push('world');
|
|
168
|
+
expect(buf.getFullBuffer()).toBe('hello world');
|
|
169
|
+
});
|
|
170
|
+
it('getLanguage returns configured language', () => {
|
|
171
|
+
const buf = new CodeBuffer('python');
|
|
172
|
+
expect(buf.getLanguage()).toBe('python');
|
|
173
|
+
});
|
|
174
|
+
it('reset clears all state', () => {
|
|
175
|
+
const buf = new CodeBuffer('typescript');
|
|
176
|
+
buf.push('const x = 1;');
|
|
177
|
+
buf.reset();
|
|
178
|
+
expect(buf.getFullBuffer()).toBe('');
|
|
179
|
+
const units = buf.push('const y = 2;');
|
|
180
|
+
expect(units).toHaveLength(1);
|
|
181
|
+
expect(units[0].startOffset).toBe(0);
|
|
182
|
+
});
|
|
183
|
+
it('handles escaped quotes inside strings', () => {
|
|
184
|
+
const buf = new CodeBuffer('typescript');
|
|
185
|
+
const units = buf.push('const s = "hello \\" world { }";');
|
|
186
|
+
expect(units).toHaveLength(1);
|
|
187
|
+
expect(units[0].kind).toBe('statement');
|
|
188
|
+
});
|
|
189
|
+
it('handles export async function', () => {
|
|
190
|
+
const buf = new CodeBuffer('typescript');
|
|
191
|
+
const units = buf.push('export async function handler() { await db.query(); }');
|
|
192
|
+
expect(units).toHaveLength(1);
|
|
193
|
+
expect(units[0].kind).toBe('function');
|
|
194
|
+
});
|
|
195
|
+
it('handles export default class', () => {
|
|
196
|
+
const buf = new CodeBuffer('typescript');
|
|
197
|
+
const units = buf.push('export default class App { render() { return null; } }');
|
|
198
|
+
expect(units).toHaveLength(1);
|
|
199
|
+
expect(units[0].kind).toBe('function');
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
//# sourceMappingURL=code-buffer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-buffer.test.js","sourceRoot":"","sources":["../../../src/realtime/__tests__/code-buffer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { CorrectionInjector, SEVERITY_RANK } from '../correction-injector.js';
|
|
3
|
+
// ── Helpers ─────────────────────────────────────────────────────
|
|
4
|
+
function makeCodeUnit(text = 'db.query(sql)') {
|
|
5
|
+
return {
|
|
6
|
+
text,
|
|
7
|
+
kind: 'statement',
|
|
8
|
+
startOffset: 0,
|
|
9
|
+
endOffset: text.length,
|
|
10
|
+
language: 'typescript',
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function makeEvent(overrides = {}) {
|
|
14
|
+
return {
|
|
15
|
+
type: 'finding',
|
|
16
|
+
codeUnit: makeCodeUnit(),
|
|
17
|
+
checkId: 'sql_parameterized',
|
|
18
|
+
checkName: 'SQL Parameterization',
|
|
19
|
+
verdict: 'FAIL',
|
|
20
|
+
severity: 'critical',
|
|
21
|
+
evidence: 'Raw SQL string concatenation detected',
|
|
22
|
+
suggestion: 'Use parameterized queries instead',
|
|
23
|
+
latencyMs: 2,
|
|
24
|
+
...overrides,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// ── shouldCorrect ───────────────────────────────────────────────
|
|
28
|
+
describe('CorrectionInjector', () => {
|
|
29
|
+
let injector;
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
injector = new CorrectionInjector();
|
|
32
|
+
});
|
|
33
|
+
describe('shouldCorrect', () => {
|
|
34
|
+
it('returns true for critical finding when minSeverity is high (default)', () => {
|
|
35
|
+
const event = makeEvent({ severity: 'critical' });
|
|
36
|
+
expect(injector.shouldCorrect(event)).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('returns true for high finding when minSeverity is high', () => {
|
|
39
|
+
const event = makeEvent({ severity: 'high' });
|
|
40
|
+
expect(injector.shouldCorrect(event)).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it('returns false for medium finding when minSeverity is high', () => {
|
|
43
|
+
const event = makeEvent({ severity: 'medium' });
|
|
44
|
+
expect(injector.shouldCorrect(event)).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
it('returns false for low finding when minSeverity is high', () => {
|
|
47
|
+
const event = makeEvent({ severity: 'low' });
|
|
48
|
+
expect(injector.shouldCorrect(event)).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
it('returns false for PASS events', () => {
|
|
51
|
+
const event = makeEvent({ verdict: 'PASS', type: 'pass' });
|
|
52
|
+
expect(injector.shouldCorrect(event)).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it('returns false after maxCorrections reached', () => {
|
|
55
|
+
const limited = new CorrectionInjector({ maxCorrections: 2 });
|
|
56
|
+
const event = makeEvent();
|
|
57
|
+
expect(limited.shouldCorrect(event)).toBe(true);
|
|
58
|
+
limited.recordCorrection(event);
|
|
59
|
+
expect(limited.shouldCorrect(event)).toBe(true);
|
|
60
|
+
limited.recordCorrection(event);
|
|
61
|
+
// Now at 2/2 — should reject
|
|
62
|
+
expect(limited.shouldCorrect(event)).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
it('respects custom minSeverity of medium', () => {
|
|
65
|
+
const relaxed = new CorrectionInjector({ minSeverity: 'medium' });
|
|
66
|
+
expect(relaxed.shouldCorrect(makeEvent({ severity: 'medium' }))).toBe(true);
|
|
67
|
+
expect(relaxed.shouldCorrect(makeEvent({ severity: 'low' }))).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
// ── buildCorrectionMessages ─────────────────────────────────────
|
|
71
|
+
describe('buildCorrectionMessages', () => {
|
|
72
|
+
it('includes the generated-so-far as assistant prefill', () => {
|
|
73
|
+
const generatedSoFar = 'function getData() {\n const sql = "SELECT * FROM users WHERE id=" + id;';
|
|
74
|
+
const msgs = injector.buildCorrectionMessages(generatedSoFar, makeEvent(), 'You are a code generator.', 'Write a function to get user data.');
|
|
75
|
+
// Second message should be assistant prefill
|
|
76
|
+
expect(msgs[1].role).toBe('assistant');
|
|
77
|
+
expect(msgs[1].content).toBe(generatedSoFar);
|
|
78
|
+
});
|
|
79
|
+
it('includes evidence and suggestion from the finding', () => {
|
|
80
|
+
const event = makeEvent({
|
|
81
|
+
checkName: 'SQL Parameterization',
|
|
82
|
+
evidence: 'Raw SQL string concatenation detected',
|
|
83
|
+
suggestion: 'Use parameterized queries instead',
|
|
84
|
+
});
|
|
85
|
+
const msgs = injector.buildCorrectionMessages('some code', event, 'system prompt', 'user prompt');
|
|
86
|
+
const correctionMsg = msgs[2].content;
|
|
87
|
+
expect(correctionMsg).toContain('SQL Parameterization');
|
|
88
|
+
expect(correctionMsg).toContain('Raw SQL string concatenation detected');
|
|
89
|
+
expect(correctionMsg).toContain('Use parameterized queries instead');
|
|
90
|
+
});
|
|
91
|
+
it('builds correction message without suggestion when none provided', () => {
|
|
92
|
+
const event = makeEvent({ suggestion: undefined });
|
|
93
|
+
const msgs = injector.buildCorrectionMessages('some code', event, 'system prompt', 'user prompt');
|
|
94
|
+
const correctionMsg = msgs[2].content;
|
|
95
|
+
expect(correctionMsg).toContain(event.checkName);
|
|
96
|
+
expect(correctionMsg).toContain(event.evidence);
|
|
97
|
+
expect(correctionMsg).toContain('continue generating code');
|
|
98
|
+
});
|
|
99
|
+
it('returns exactly 3 messages in user/assistant/user order', () => {
|
|
100
|
+
const msgs = injector.buildCorrectionMessages('code so far', makeEvent(), 'system', 'user request');
|
|
101
|
+
expect(msgs).toHaveLength(3);
|
|
102
|
+
expect(msgs[0].role).toBe('user');
|
|
103
|
+
expect(msgs[1].role).toBe('assistant');
|
|
104
|
+
expect(msgs[2].role).toBe('user');
|
|
105
|
+
});
|
|
106
|
+
it('uses the original user prompt as the first message', () => {
|
|
107
|
+
const userPrompt = 'Write a secure authentication handler.';
|
|
108
|
+
const msgs = injector.buildCorrectionMessages('code', makeEvent(), 'system', userPrompt);
|
|
109
|
+
expect(msgs[0].content).toBe(userPrompt);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
// ── recordCorrection / getCorrectionCount / reset ───────────────
|
|
113
|
+
describe('recordCorrection', () => {
|
|
114
|
+
it('increments the counter', () => {
|
|
115
|
+
expect(injector.getCorrectionCount()).toBe(0);
|
|
116
|
+
injector.recordCorrection(makeEvent());
|
|
117
|
+
expect(injector.getCorrectionCount()).toBe(1);
|
|
118
|
+
injector.recordCorrection(makeEvent());
|
|
119
|
+
expect(injector.getCorrectionCount()).toBe(2);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('reset', () => {
|
|
123
|
+
it('clears the counter', () => {
|
|
124
|
+
injector.recordCorrection(makeEvent());
|
|
125
|
+
injector.recordCorrection(makeEvent());
|
|
126
|
+
expect(injector.getCorrectionCount()).toBe(2);
|
|
127
|
+
injector.reset();
|
|
128
|
+
expect(injector.getCorrectionCount()).toBe(0);
|
|
129
|
+
});
|
|
130
|
+
it('allows corrections again after reset', () => {
|
|
131
|
+
const limited = new CorrectionInjector({ maxCorrections: 1 });
|
|
132
|
+
const event = makeEvent();
|
|
133
|
+
limited.recordCorrection(event);
|
|
134
|
+
expect(limited.shouldCorrect(event)).toBe(false);
|
|
135
|
+
limited.reset();
|
|
136
|
+
expect(limited.shouldCorrect(event)).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
// ── Severity ordering ──────────────────────────────────────────
|
|
140
|
+
describe('severity ordering', () => {
|
|
141
|
+
it('ranks critical > high > medium > low', () => {
|
|
142
|
+
expect(SEVERITY_RANK['critical']).toBeGreaterThan(SEVERITY_RANK['high']);
|
|
143
|
+
expect(SEVERITY_RANK['high']).toBeGreaterThan(SEVERITY_RANK['medium']);
|
|
144
|
+
expect(SEVERITY_RANK['medium']).toBeGreaterThan(SEVERITY_RANK['low']);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// ── Default options ────────────────────────────────────────────
|
|
148
|
+
describe('default options', () => {
|
|
149
|
+
it('defaults minSeverity to high', () => {
|
|
150
|
+
const def = new CorrectionInjector();
|
|
151
|
+
// Medium should be rejected by default
|
|
152
|
+
expect(def.shouldCorrect(makeEvent({ severity: 'medium' }))).toBe(false);
|
|
153
|
+
// High should be accepted
|
|
154
|
+
expect(def.shouldCorrect(makeEvent({ severity: 'high' }))).toBe(true);
|
|
155
|
+
});
|
|
156
|
+
it('defaults maxCorrections to 5', () => {
|
|
157
|
+
const def = new CorrectionInjector();
|
|
158
|
+
const event = makeEvent();
|
|
159
|
+
for (let i = 0; i < 5; i++) {
|
|
160
|
+
expect(def.shouldCorrect(event)).toBe(true);
|
|
161
|
+
def.recordCorrection(event);
|
|
162
|
+
}
|
|
163
|
+
// 6th should be rejected
|
|
164
|
+
expect(def.shouldCorrect(event)).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=correction-injector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correction-injector.test.js","sourceRoot":"","sources":["../../../src/realtime/__tests__/correction-injector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|