tryassay 0.21.2 → 0.22.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/demo/.claude/.truth_last_prompt +1 -0
- package/demo/.claude/truth_status +1 -0
- package/demo/css/style.css +840 -0
- package/demo/index.html +78 -0
- package/demo/js/chat.js +535 -0
- package/demo/js/code-panel.js +206 -0
- package/demo/js/preview.js +456 -0
- package/demo/js/sse-client.js +600 -0
- package/demo/js/state.js +172 -0
- package/demo/js/timeline.js +80 -0
- package/dist/api/server.d.ts +3 -0
- package/dist/api/server.js +127 -20
- package/dist/api/server.js.map +1 -1
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/assess.d.ts +2 -0
- package/dist/commands/assess.js +132 -164
- package/dist/commands/assess.js.map +1 -1
- package/dist/commands/demo.d.ts +5 -0
- package/dist/commands/demo.js +357 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/lib/__tests__/arithmetic-quick-test.d.ts +6 -0
- package/dist/lib/__tests__/arithmetic-quick-test.js +197 -0
- package/dist/lib/__tests__/arithmetic-quick-test.js.map +1 -0
- package/dist/lib/__tests__/arithmetic-real-llm-test.d.ts +13 -0
- package/dist/lib/__tests__/arithmetic-real-llm-test.js +284 -0
- package/dist/lib/__tests__/arithmetic-real-llm-test.js.map +1 -0
- package/dist/lib/__tests__/arithmetic-value-demo.d.ts +10 -0
- package/dist/lib/__tests__/arithmetic-value-demo.js +193 -0
- package/dist/lib/__tests__/arithmetic-value-demo.js.map +1 -0
- package/dist/lib/__tests__/flow-to-claims.test.d.ts +1 -0
- package/dist/lib/__tests__/flow-to-claims.test.js +91 -0
- package/dist/lib/__tests__/flow-to-claims.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-api-misuse.test.d.ts +9 -0
- package/dist/lib/__tests__/formal-verifier-api-misuse.test.js +391 -0
- package/dist/lib/__tests__/formal-verifier-api-misuse.test.js.map +1 -0
- package/dist/lib/__tests__/formal-verifier-arithmetic.test.d.ts +7 -0
- package/dist/lib/__tests__/formal-verifier-arithmetic.test.js +318 -0
- package/dist/lib/__tests__/formal-verifier-arithmetic.test.js.map +1 -0
- package/dist/lib/__tests__/intent-extractor.test.d.ts +1 -0
- package/dist/lib/__tests__/intent-extractor.test.js +97 -0
- package/dist/lib/__tests__/intent-extractor.test.js.map +1 -0
- package/dist/lib/__tests__/intent-reviewer.test.d.ts +1 -0
- package/dist/lib/__tests__/intent-reviewer.test.js +55 -0
- package/dist/lib/__tests__/intent-reviewer.test.js.map +1 -0
- package/dist/lib/__tests__/mr-gsm8k-benchmark.d.ts +11 -0
- package/dist/lib/__tests__/mr-gsm8k-benchmark.js +224 -0
- package/dist/lib/__tests__/mr-gsm8k-benchmark.js.map +1 -0
- package/dist/lib/anthropic.js +25 -33
- package/dist/lib/anthropic.js.map +1 -1
- package/dist/lib/assessment-reporter.js +9 -13
- package/dist/lib/assessment-reporter.js.map +1 -1
- package/dist/lib/claim-extractor.js +10 -19
- package/dist/lib/claim-extractor.js.map +1 -1
- package/dist/lib/code-verifier.js +16 -36
- package/dist/lib/code-verifier.js.map +1 -1
- package/dist/lib/constraint-engine.js +10 -19
- package/dist/lib/constraint-engine.js.map +1 -1
- package/dist/lib/formal-verifier.d.ts +1 -1
- package/dist/lib/formal-verifier.js +454 -0
- package/dist/lib/formal-verifier.js.map +1 -1
- package/dist/lib/guided-generator.js +19 -37
- package/dist/lib/guided-generator.js.map +1 -1
- package/dist/lib/intent-extractor.d.ts +47 -0
- package/dist/lib/intent-extractor.js +427 -0
- package/dist/lib/intent-extractor.js.map +1 -0
- package/dist/lib/intent-reviewer.d.ts +14 -0
- package/dist/lib/intent-reviewer.js +148 -0
- package/dist/lib/intent-reviewer.js.map +1 -0
- package/dist/lib/intent-types.d.ts +89 -0
- package/dist/lib/intent-types.js +5 -0
- package/dist/lib/intent-types.js.map +1 -0
- package/dist/lib/inventory-extractor.js +9 -22
- package/dist/lib/inventory-extractor.js.map +1 -1
- package/dist/lib/llm-provider.d.ts +23 -0
- package/dist/lib/llm-provider.js +130 -0
- package/dist/lib/llm-provider.js.map +1 -0
- package/dist/lib/remediator.js +20 -28
- package/dist/lib/remediator.js.map +1 -1
- package/dist/lib/requirements-generator.js +14 -19
- package/dist/lib/requirements-generator.js.map +1 -1
- package/dist/lib/spec-synthesizer.js +10 -19
- package/dist/lib/spec-synthesizer.js.map +1 -1
- package/dist/runtime/agents/planner-agent.d.ts +5 -2
- package/dist/runtime/agents/planner-agent.js +232 -1
- package/dist/runtime/agents/planner-agent.js.map +1 -1
- package/dist/runtime/app-create-orchestrator.d.ts +9 -1
- package/dist/runtime/app-create-orchestrator.js +265 -87
- package/dist/runtime/app-create-orchestrator.js.map +1 -1
- package/dist/runtime/check-catalog.js +5 -3
- package/dist/runtime/check-catalog.js.map +1 -1
- package/dist/runtime/check-definitions.d.ts +10 -0
- package/dist/runtime/check-definitions.js +52 -2
- package/dist/runtime/check-definitions.js.map +1 -1
- package/dist/runtime/composition-verifier.js +8 -12
- package/dist/runtime/composition-verifier.js.map +1 -1
- package/dist/runtime/gap-detector.js +8 -10
- package/dist/runtime/gap-detector.js.map +1 -1
- package/dist/runtime/input-validator.d.ts +7 -0
- package/dist/runtime/input-validator.js +162 -0
- package/dist/runtime/input-validator.js.map +1 -0
- package/dist/runtime/model-router.d.ts +10 -0
- package/dist/runtime/model-router.js +42 -0
- package/dist/runtime/model-router.js.map +1 -0
- package/dist/runtime/pattern-extractor.js +8 -10
- package/dist/runtime/pattern-extractor.js.map +1 -1
- package/dist/runtime/planner.js +11 -16
- package/dist/runtime/planner.js.map +1 -1
- package/dist/runtime/prompt-guard.d.ts +2 -0
- package/dist/runtime/prompt-guard.js +180 -0
- package/dist/runtime/prompt-guard.js.map +1 -0
- package/dist/runtime/prompt-safety-analyzer.js +8 -13
- package/dist/runtime/prompt-safety-analyzer.js.map +1 -1
- package/dist/runtime/reasoner.js +19 -33
- package/dist/runtime/reasoner.js.map +1 -1
- package/dist/runtime/rule-meta-verifier.js +9 -11
- package/dist/runtime/rule-meta-verifier.js.map +1 -1
- package/dist/runtime/safe-executor.d.ts +23 -0
- package/dist/runtime/safe-executor.js +151 -0
- package/dist/runtime/safe-executor.js.map +1 -0
- package/dist/runtime/specialized-agent.js +10 -14
- package/dist/runtime/specialized-agent.js.map +1 -1
- package/dist/runtime/strategy-library.js +8 -10
- package/dist/runtime/strategy-library.js.map +1 -1
- package/dist/runtime/supabase-experience-store.js.map +1 -1
- package/dist/runtime/supabase-provisioner.d.ts +35 -0
- package/dist/runtime/supabase-provisioner.js +192 -0
- package/dist/runtime/supabase-provisioner.js.map +1 -0
- package/dist/runtime/types.d.ts +116 -0
- package/dist/sdk/forward-verify.js +16 -33
- package/dist/sdk/forward-verify.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// CLI Command: tryassay demo
|
|
3
|
+
// Launches both the API server and demo UI with auto-wiring
|
|
4
|
+
// ============================================================
|
|
5
|
+
import { createServer } from 'node:http';
|
|
6
|
+
import { readFile } from 'node:fs/promises';
|
|
7
|
+
import { join, extname } from 'node:path';
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { exec } from 'node:child_process';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import * as https from 'node:https';
|
|
12
|
+
const MIME_TYPES = {
|
|
13
|
+
'.html': 'text/html',
|
|
14
|
+
'.css': 'text/css',
|
|
15
|
+
'.js': 'text/javascript',
|
|
16
|
+
'.json': 'application/json',
|
|
17
|
+
'.png': 'image/png',
|
|
18
|
+
'.jpg': 'image/jpeg',
|
|
19
|
+
'.svg': 'image/svg+xml',
|
|
20
|
+
'.ico': 'image/x-icon',
|
|
21
|
+
};
|
|
22
|
+
// ── GitHub OAuth session store (in-memory, per demo run) ──
|
|
23
|
+
const githubSessions = new Map();
|
|
24
|
+
function getSessionId(req) {
|
|
25
|
+
const cookies = req.headers.cookie || '';
|
|
26
|
+
const match = cookies.match(/assay_session=([^;]+)/);
|
|
27
|
+
if (match)
|
|
28
|
+
return match[1];
|
|
29
|
+
return '';
|
|
30
|
+
}
|
|
31
|
+
function setSessionCookie(res, sessionId) {
|
|
32
|
+
res.setHeader('Set-Cookie', `assay_session=${sessionId}; Path=/; HttpOnly; SameSite=Lax`);
|
|
33
|
+
}
|
|
34
|
+
function readRequestBody(req) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
let body = '';
|
|
37
|
+
req.on('data', (chunk) => { body += chunk.toString(); });
|
|
38
|
+
req.on('end', () => resolve(body));
|
|
39
|
+
req.on('error', reject);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function sendJson(res, status, data) {
|
|
43
|
+
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
44
|
+
res.end(JSON.stringify(data));
|
|
45
|
+
}
|
|
46
|
+
/** Make an HTTPS request to the GitHub API. Returns parsed JSON. */
|
|
47
|
+
function githubApi(method, path, token, body) {
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const postData = body ? JSON.stringify(body) : undefined;
|
|
50
|
+
const options = {
|
|
51
|
+
hostname: 'api.github.com',
|
|
52
|
+
path,
|
|
53
|
+
method,
|
|
54
|
+
headers: {
|
|
55
|
+
'User-Agent': 'Assay-Demo',
|
|
56
|
+
'Authorization': `Bearer ${token}`,
|
|
57
|
+
'Accept': 'application/vnd.github+json',
|
|
58
|
+
...(postData ? { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } : {}),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const req = https.request(options, (res) => {
|
|
62
|
+
let data = '';
|
|
63
|
+
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
64
|
+
res.on('end', () => {
|
|
65
|
+
try {
|
|
66
|
+
resolve(data ? JSON.parse(data) : {});
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
resolve({ raw: data });
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
req.on('error', reject);
|
|
74
|
+
if (postData)
|
|
75
|
+
req.write(postData);
|
|
76
|
+
req.end();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/** Exchange OAuth code for access token */
|
|
80
|
+
async function exchangeCodeForToken(code, clientId, clientSecret) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const postData = JSON.stringify({
|
|
83
|
+
client_id: clientId,
|
|
84
|
+
client_secret: clientSecret,
|
|
85
|
+
code,
|
|
86
|
+
});
|
|
87
|
+
const req = https.request({
|
|
88
|
+
hostname: 'github.com',
|
|
89
|
+
path: '/login/oauth/access_token',
|
|
90
|
+
method: 'POST',
|
|
91
|
+
headers: {
|
|
92
|
+
'Content-Type': 'application/json',
|
|
93
|
+
'Accept': 'application/json',
|
|
94
|
+
'Content-Length': Buffer.byteLength(postData),
|
|
95
|
+
},
|
|
96
|
+
}, (res) => {
|
|
97
|
+
let data = '';
|
|
98
|
+
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
99
|
+
res.on('end', async () => {
|
|
100
|
+
try {
|
|
101
|
+
const parsed = JSON.parse(data);
|
|
102
|
+
if (!parsed.access_token) {
|
|
103
|
+
resolve(null);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Get username
|
|
107
|
+
const user = await githubApi('GET', '/user', parsed.access_token);
|
|
108
|
+
resolve({
|
|
109
|
+
token: parsed.access_token,
|
|
110
|
+
username: user.login || 'unknown',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
resolve(null);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
req.on('error', reject);
|
|
119
|
+
req.write(postData);
|
|
120
|
+
req.end();
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/** Push files to a new GitHub repo using the Git Data API (no git CLI needed) */
|
|
124
|
+
async function pushToGitHub(token, owner, repoName, isPrivate, files) {
|
|
125
|
+
// 1. Create repo
|
|
126
|
+
const repo = await githubApi('POST', '/user/repos', token, {
|
|
127
|
+
name: repoName,
|
|
128
|
+
private: isPrivate,
|
|
129
|
+
auto_init: false,
|
|
130
|
+
});
|
|
131
|
+
if (repo.message) {
|
|
132
|
+
return { success: false, error: repo.message };
|
|
133
|
+
}
|
|
134
|
+
const fullName = repo.full_name || `${owner}/${repoName}`;
|
|
135
|
+
// 2. Create blobs for each file
|
|
136
|
+
const treeEntries = [];
|
|
137
|
+
for (const file of files) {
|
|
138
|
+
const blob = await githubApi('POST', `/repos/${fullName}/git/blobs`, token, {
|
|
139
|
+
content: Buffer.from(file.content).toString('base64'),
|
|
140
|
+
encoding: 'base64',
|
|
141
|
+
});
|
|
142
|
+
treeEntries.push({
|
|
143
|
+
path: file.path,
|
|
144
|
+
mode: '100644',
|
|
145
|
+
type: 'blob',
|
|
146
|
+
sha: blob.sha,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// 3. Create tree
|
|
150
|
+
const tree = await githubApi('POST', `/repos/${fullName}/git/trees`, token, {
|
|
151
|
+
tree: treeEntries,
|
|
152
|
+
});
|
|
153
|
+
// 4. Create commit
|
|
154
|
+
const commit = await githubApi('POST', `/repos/${fullName}/git/commits`, token, {
|
|
155
|
+
message: 'Initial commit from Assay demo',
|
|
156
|
+
tree: tree.sha,
|
|
157
|
+
});
|
|
158
|
+
// 5. Create main branch ref
|
|
159
|
+
await githubApi('POST', `/repos/${fullName}/git/refs`, token, {
|
|
160
|
+
ref: 'refs/heads/main',
|
|
161
|
+
sha: commit.sha,
|
|
162
|
+
});
|
|
163
|
+
// 6. Set default branch to main
|
|
164
|
+
await githubApi('PATCH', `/repos/${fullName}`, token, {
|
|
165
|
+
default_branch: 'main',
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
success: true,
|
|
169
|
+
repoUrl: repo.html_url || `https://github.com/${fullName}`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
export async function demoCommand(opts) {
|
|
173
|
+
// Step 1: Default to CLI provider for local demo (uses Claude subscription)
|
|
174
|
+
if (!process.env.ASSAY_LLM_PROVIDER) {
|
|
175
|
+
process.env.ASSAY_LLM_PROVIDER = 'cli';
|
|
176
|
+
}
|
|
177
|
+
// Only require API key when using the API provider
|
|
178
|
+
if (process.env.ASSAY_LLM_PROVIDER !== 'cli' && !process.env.ANTHROPIC_API_KEY) {
|
|
179
|
+
console.error('');
|
|
180
|
+
console.error(' Error: ANTHROPIC_API_KEY environment variable is required for API mode.');
|
|
181
|
+
console.error('');
|
|
182
|
+
console.error(' Either set: export ANTHROPIC_API_KEY=sk-ant-...');
|
|
183
|
+
console.error(' Or use CLI: export ASSAY_LLM_PROVIDER=cli (uses Claude subscription)');
|
|
184
|
+
console.error('');
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
const apiPort = opts.apiPort ? parseInt(opts.apiPort, 10) : 3800;
|
|
188
|
+
const uiPort = opts.uiPort ? parseInt(opts.uiPort, 10) : 9090;
|
|
189
|
+
const shouldOpen = opts.open !== false;
|
|
190
|
+
// Step 2: Start the API server
|
|
191
|
+
const { TeamApiServer } = await import('../api/server.js');
|
|
192
|
+
const apiServer = new TeamApiServer({ port: apiPort, demoMode: true });
|
|
193
|
+
const devKey = `dev-${randomUUID().slice(0, 16)}`;
|
|
194
|
+
apiServer.registerApiKey(devKey, 'pro', 'dev-org');
|
|
195
|
+
await apiServer.start();
|
|
196
|
+
// Step 3: Start the static file server for demo/
|
|
197
|
+
// Resolve demo/ relative to the package root (two levels up from dist/commands/)
|
|
198
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
199
|
+
const packageRoot = join(__filename, '..', '..', '..');
|
|
200
|
+
const demoDir = join(packageRoot, 'demo');
|
|
201
|
+
const githubClientId = process.env.GITHUB_CLIENT_ID || '';
|
|
202
|
+
const githubClientSecret = process.env.GITHUB_CLIENT_SECRET || '';
|
|
203
|
+
const githubEnabled = !!(githubClientId && githubClientSecret);
|
|
204
|
+
if (githubEnabled) {
|
|
205
|
+
console.log(' GitHub: OAuth enabled (Push to GitHub available)');
|
|
206
|
+
}
|
|
207
|
+
const uiServer = createServer(async (req, res) => {
|
|
208
|
+
// COOP/COEP headers required for WebContainer API
|
|
209
|
+
res.setHeader('Cross-Origin-Embedder-Policy', 'credentialless');
|
|
210
|
+
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
|
|
211
|
+
const parsedUrl = new URL(req.url || '/', `http://localhost:${uiPort}`);
|
|
212
|
+
const urlPath = parsedUrl.pathname;
|
|
213
|
+
const method = req.method || 'GET';
|
|
214
|
+
// ── GitHub OAuth & Export API routes ──
|
|
215
|
+
// CORS for API routes
|
|
216
|
+
if (urlPath.startsWith('/api/')) {
|
|
217
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
218
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
219
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
220
|
+
if (method === 'OPTIONS') {
|
|
221
|
+
res.writeHead(204);
|
|
222
|
+
res.end();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// GET /api/v1/auth/github — redirect to GitHub OAuth
|
|
227
|
+
if (urlPath === '/api/v1/auth/github' && method === 'GET') {
|
|
228
|
+
if (!githubEnabled) {
|
|
229
|
+
sendJson(res, 400, { error: 'GitHub OAuth not configured. Set GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET.' });
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const sessionId = randomUUID();
|
|
233
|
+
setSessionCookie(res, sessionId);
|
|
234
|
+
const callbackUrl = `http://localhost:${uiPort}/api/v1/auth/github/callback`;
|
|
235
|
+
const authUrl = `https://github.com/login/oauth/authorize?client_id=${githubClientId}&redirect_uri=${encodeURIComponent(callbackUrl)}&scope=repo&state=${sessionId}`;
|
|
236
|
+
res.writeHead(302, { Location: authUrl });
|
|
237
|
+
res.end();
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
// GET /api/v1/auth/github/callback — exchange code for token
|
|
241
|
+
if (urlPath === '/api/v1/auth/github/callback' && method === 'GET') {
|
|
242
|
+
const code = parsedUrl.searchParams.get('code');
|
|
243
|
+
const state = parsedUrl.searchParams.get('state');
|
|
244
|
+
if (!code || !state) {
|
|
245
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
246
|
+
res.end('<html><body><h2>Authorization failed</h2><script>window.close();</script></body></html>');
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const result = await exchangeCodeForToken(code, githubClientId, githubClientSecret);
|
|
250
|
+
if (result) {
|
|
251
|
+
githubSessions.set(state, result);
|
|
252
|
+
setSessionCookie(res, state);
|
|
253
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
254
|
+
res.end('<html><body><h2>Connected to GitHub!</h2><p>You can close this window.</p><script>window.close();</script></body></html>');
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
258
|
+
res.end('<html><body><h2>Authorization failed</h2><p>Please try again.</p><script>window.close();</script></body></html>');
|
|
259
|
+
}
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// GET /api/v1/auth/github/status — check if user is authenticated
|
|
263
|
+
if (urlPath === '/api/v1/auth/github/status' && method === 'GET') {
|
|
264
|
+
const sid = getSessionId(req);
|
|
265
|
+
const session = sid ? githubSessions.get(sid) : null;
|
|
266
|
+
sendJson(res, 200, {
|
|
267
|
+
authenticated: !!session,
|
|
268
|
+
username: session?.username || null,
|
|
269
|
+
configured: githubEnabled,
|
|
270
|
+
});
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// POST /api/v1/app/:id/export/github — push files to GitHub
|
|
274
|
+
const exportMatch = urlPath.match(/^\/api\/v1\/app\/([^/]+)\/export\/github$/);
|
|
275
|
+
if (exportMatch && method === 'POST') {
|
|
276
|
+
const sid = getSessionId(req);
|
|
277
|
+
const session = sid ? githubSessions.get(sid) : null;
|
|
278
|
+
if (!session) {
|
|
279
|
+
sendJson(res, 401, { error: 'Not authenticated with GitHub' });
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const body = await readRequestBody(req);
|
|
283
|
+
let payload;
|
|
284
|
+
try {
|
|
285
|
+
payload = JSON.parse(body);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
sendJson(res, 400, { error: 'Invalid JSON' });
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (!payload.repoName || !payload.files || payload.files.length === 0) {
|
|
292
|
+
sendJson(res, 400, { error: 'Missing repoName or files' });
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const result = await pushToGitHub(session.token, session.username, payload.repoName, payload.private !== false, payload.files);
|
|
296
|
+
sendJson(res, result.success ? 201 : 400, result);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
// ── Static file serving ──
|
|
300
|
+
const filePath = join(demoDir, urlPath === '/' ? 'index.html' : urlPath);
|
|
301
|
+
// Prevent directory traversal
|
|
302
|
+
if (!filePath.startsWith(demoDir)) {
|
|
303
|
+
res.writeHead(403);
|
|
304
|
+
res.end('Forbidden');
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
try {
|
|
308
|
+
const content = await readFile(filePath);
|
|
309
|
+
const ext = extname(filePath);
|
|
310
|
+
const mime = MIME_TYPES[ext] || 'application/octet-stream';
|
|
311
|
+
res.writeHead(200, { 'Content-Type': mime });
|
|
312
|
+
res.end(content);
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
res.writeHead(404);
|
|
316
|
+
res.end('Not found');
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
await new Promise((resolve) => {
|
|
320
|
+
uiServer.listen(uiPort, () => resolve());
|
|
321
|
+
});
|
|
322
|
+
// Step 4: Build the URL with API connection params
|
|
323
|
+
const demoUrl = `http://localhost:${uiPort}?api=http://localhost:${apiPort}&key=${devKey}`;
|
|
324
|
+
// Step 5: Print info
|
|
325
|
+
console.log('');
|
|
326
|
+
console.log(' Assay Interactive Demo');
|
|
327
|
+
console.log(' ======================');
|
|
328
|
+
console.log('');
|
|
329
|
+
console.log(` Demo UI: http://localhost:${uiPort}`);
|
|
330
|
+
console.log(` API Server: http://localhost:${apiPort}`);
|
|
331
|
+
console.log(` API Key: ${devKey}`);
|
|
332
|
+
console.log('');
|
|
333
|
+
console.log(` Open: ${demoUrl}`);
|
|
334
|
+
console.log('');
|
|
335
|
+
console.log(' The demo will ask clarifying questions before building.');
|
|
336
|
+
console.log(' Press Ctrl+C to stop both servers.');
|
|
337
|
+
console.log('');
|
|
338
|
+
// Step 6: Open browser
|
|
339
|
+
if (shouldOpen) {
|
|
340
|
+
const cmd = process.platform === 'darwin' ? 'open' : 'xdg-open';
|
|
341
|
+
exec(`${cmd} "${demoUrl}"`, (err) => {
|
|
342
|
+
if (err)
|
|
343
|
+
console.warn(' Could not auto-open browser:', err.message);
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
// Step 7: Graceful shutdown
|
|
347
|
+
const shutdown = async () => {
|
|
348
|
+
console.log('');
|
|
349
|
+
console.log(' Shutting down...');
|
|
350
|
+
uiServer.close();
|
|
351
|
+
await apiServer.stop();
|
|
352
|
+
process.exit(0);
|
|
353
|
+
};
|
|
354
|
+
process.on('SIGINT', shutdown);
|
|
355
|
+
process.on('SIGTERM', shutdown);
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Quick A/B test — single case, real LLM via Claude CLI.
|
|
4
|
+
* Tests: does the LLM miss arithmetic bugs in comments that the formal verifier catches?
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'node:child_process';
|
|
7
|
+
import { runFormalVerification } from '../formal-verifier.js';
|
|
8
|
+
function claudePrompt(systemPrompt, userPrompt, retries = 2) {
|
|
9
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
10
|
+
try {
|
|
11
|
+
const result = execSync(`claude --print --model claude-sonnet-4-20250514 --system-prompt ${JSON.stringify(systemPrompt)}`, {
|
|
12
|
+
input: userPrompt,
|
|
13
|
+
encoding: 'utf-8',
|
|
14
|
+
timeout: 120_000,
|
|
15
|
+
maxBuffer: 1024 * 1024,
|
|
16
|
+
env: { ...process.env, CLAUDECODE: '' },
|
|
17
|
+
});
|
|
18
|
+
const trimmed = result.trim();
|
|
19
|
+
if (trimmed.length > 0)
|
|
20
|
+
return trimmed;
|
|
21
|
+
console.log(` (empty response, retry ${attempt + 1}/${retries + 1})`);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
console.log(` (error: ${e.message?.slice(0, 80)}, retry ${attempt + 1}/${retries + 1})`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw new Error('Claude CLI returned empty/error response after all retries');
|
|
28
|
+
}
|
|
29
|
+
const CODE = `
|
|
30
|
+
// Invoice calculator module
|
|
31
|
+
// Tax rate: 8% applied to subtotal
|
|
32
|
+
// Example: subtotal $250, tax = 250 * 0.08 = 19, total = 269
|
|
33
|
+
|
|
34
|
+
function calculateInvoice(items: Array<{price: number, qty: number}>) {
|
|
35
|
+
const subtotal = items.reduce((sum, item) => sum + item.price * item.qty, 0);
|
|
36
|
+
const taxRate = 0.08;
|
|
37
|
+
const tax = subtotal * taxRate;
|
|
38
|
+
const total = subtotal + tax;
|
|
39
|
+
return { subtotal, tax, total };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Commission: 12% of total sales
|
|
43
|
+
// For a $5000 sale: commission = 5000 * 0.12 = 590
|
|
44
|
+
const COMMISSION_RATE = 0.12;
|
|
45
|
+
function getCommission(sales: number) {
|
|
46
|
+
return sales * COMMISSION_RATE;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Batch pricing: 24 units * $7.50 per unit = $182
|
|
50
|
+
const UNITS_PER_BATCH = 24;
|
|
51
|
+
const UNIT_PRICE = 7.50;
|
|
52
|
+
const BATCH_PRICE = 24 * 7.50;
|
|
53
|
+
`.trim();
|
|
54
|
+
const KNOWN_BUGS = [
|
|
55
|
+
'250 * 0.08 = 19 (wrong, should be 20)',
|
|
56
|
+
'total = 269 (wrong, should be 270)',
|
|
57
|
+
'5000 * 0.12 = 590 (wrong, should be 600)',
|
|
58
|
+
'24 * 7.50 = 182 (wrong, should be 180)',
|
|
59
|
+
];
|
|
60
|
+
function main() {
|
|
61
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
62
|
+
console.log(' REAL LLM A/B TEST — Single Case');
|
|
63
|
+
console.log(' Code has 4 deliberate arithmetic errors in comments');
|
|
64
|
+
console.log('═══════════════════════════════════════════════════════════\n');
|
|
65
|
+
console.log('Known bugs:');
|
|
66
|
+
KNOWN_BUGS.forEach(b => console.log(` • ${b}`));
|
|
67
|
+
// Phase 1: Extract claims
|
|
68
|
+
console.log('\n[1/3] Extracting claims via Claude CLI (--print mode)...');
|
|
69
|
+
const t1 = Date.now();
|
|
70
|
+
const extractRaw = claudePrompt(`Extract every testable claim this code makes — especially arithmetic claims in comments. Return ONLY a JSON array: [{"id":"CLAIM-001","category":"correctness","severity":"high","description":"...","assertion":"..."}] No markdown fences.`, `Language: typescript\n\nCode:\n${CODE}`);
|
|
71
|
+
console.log(` Done in ${((Date.now() - t1) / 1000).toFixed(1)}s`);
|
|
72
|
+
let claims;
|
|
73
|
+
try {
|
|
74
|
+
let t = extractRaw;
|
|
75
|
+
if (t.startsWith('```'))
|
|
76
|
+
t = t.slice(t.indexOf('\n') + 1);
|
|
77
|
+
if (t.includes('```'))
|
|
78
|
+
t = t.slice(0, t.lastIndexOf('```'));
|
|
79
|
+
t = t.trim();
|
|
80
|
+
const raw = JSON.parse(t);
|
|
81
|
+
claims = raw.filter(r => r.description && r.assertion).map((r, i) => ({
|
|
82
|
+
id: r.id || `CLAIM-${i + 1}`,
|
|
83
|
+
category: r.category || 'correctness',
|
|
84
|
+
severity: r.severity || 'medium',
|
|
85
|
+
description: r.description,
|
|
86
|
+
assertion: r.assertion,
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
console.error('Failed to parse claims:', e);
|
|
91
|
+
console.log('Raw output:', extractRaw.slice(0, 500));
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
console.log(` Extracted ${claims.length} claims\n`);
|
|
95
|
+
// Phase 2: LLM verification
|
|
96
|
+
console.log('[2/3] Verifying claims via Claude CLI...');
|
|
97
|
+
const t2 = Date.now();
|
|
98
|
+
const claimList = claims.map(c => `[${c.id}] ${c.description}\n Assertion: ${c.assertion}`).join('\n\n');
|
|
99
|
+
const verifyRaw = claudePrompt(`Verify each claim against the code. Return ONLY a JSON array:
|
|
100
|
+
[{"claimId":"CLAIM-001","verdict":"PASS|FAIL|PARTIAL","reasoning":"..."}]
|
|
101
|
+
No markdown fences.`, `Code:\n${CODE}\n\nClaims:\n${claimList}`);
|
|
102
|
+
console.log(` Done in ${((Date.now() - t2) / 1000).toFixed(1)}s`);
|
|
103
|
+
let llmVerifications;
|
|
104
|
+
try {
|
|
105
|
+
let t = verifyRaw.trim();
|
|
106
|
+
if (t.startsWith('```'))
|
|
107
|
+
t = t.slice(t.indexOf('\n') + 1);
|
|
108
|
+
if (t.includes('```'))
|
|
109
|
+
t = t.slice(0, t.lastIndexOf('```'));
|
|
110
|
+
t = t.trim();
|
|
111
|
+
const raw = JSON.parse(t);
|
|
112
|
+
llmVerifications = raw.filter(v => v.claimId && v.verdict).map(v => ({
|
|
113
|
+
claimId: v.claimId,
|
|
114
|
+
verdict: ['PASS', 'FAIL', 'PARTIAL', 'N/A'].includes(v.verdict) ? v.verdict : 'N/A',
|
|
115
|
+
reasoning: v.reasoning || '',
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
console.error('Failed to parse verifications:', e);
|
|
120
|
+
console.log('Raw output:', verifyRaw.slice(0, 500));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
// Fill missing
|
|
124
|
+
for (const c of claims) {
|
|
125
|
+
if (!llmVerifications.some(v => v.claimId === c.id)) {
|
|
126
|
+
llmVerifications.push({ claimId: c.id, verdict: 'N/A', reasoning: 'Not returned' });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Snapshot LLM-only results
|
|
130
|
+
const llmPass = llmVerifications.filter(v => v.verdict === 'PASS').length;
|
|
131
|
+
const llmFail = llmVerifications.filter(v => v.verdict === 'FAIL').length;
|
|
132
|
+
// Phase 3: Formal verification
|
|
133
|
+
console.log('\n[3/3] Applying formal verification (deterministic)...');
|
|
134
|
+
const { verifications: merged, stats } = runFormalVerification(CODE, 'typescript', claims, llmVerifications);
|
|
135
|
+
const formalPass = merged.filter(v => v.verdict === 'PASS').length;
|
|
136
|
+
const formalFail = merged.filter(v => v.verdict === 'FAIL').length;
|
|
137
|
+
const overrides = merged.filter(v => v.formal_override);
|
|
138
|
+
// Detailed per-claim output
|
|
139
|
+
console.log('\n── Per-Claim Detail ──');
|
|
140
|
+
for (const v of merged) {
|
|
141
|
+
const llmV = llmVerifications.find(lv => lv.claimId === v.claimId);
|
|
142
|
+
const claim = claims.find(c => c.id === v.claimId);
|
|
143
|
+
const method = v.verification_method === 'formal' ? '🔬' : '🤖';
|
|
144
|
+
const override = v.formal_override ? ` ← OVERRIDE (LLM said ${v.formal_override.original_llm_verdict})` : '';
|
|
145
|
+
console.log(` ${method} ${v.claimId}: ${v.verdict}${override}`);
|
|
146
|
+
console.log(` Claim: ${claim?.description?.slice(0, 80)}`);
|
|
147
|
+
if (llmV)
|
|
148
|
+
console.log(` LLM reasoning: ${llmV.reasoning?.slice(0, 100)}`);
|
|
149
|
+
if (v.formal_override)
|
|
150
|
+
console.log(` Formal evidence: ${v.formal_override.reason}`);
|
|
151
|
+
}
|
|
152
|
+
// Report
|
|
153
|
+
console.log('\n═══════════════════════════════════════════════════════════');
|
|
154
|
+
console.log(' RESULTS');
|
|
155
|
+
console.log('═══════════════════════════════════════════════════════════\n');
|
|
156
|
+
console.log(` Claims extracted: ${claims.length}`);
|
|
157
|
+
console.log(` LLM-only: ${llmFail} FAIL / ${llmPass} PASS`);
|
|
158
|
+
console.log(` With formal: ${formalFail} FAIL / ${formalPass} PASS`);
|
|
159
|
+
console.log(` Formal overrides: ${overrides.length}`);
|
|
160
|
+
console.log(` Formal stats: ${stats.formally_verified} formal, ${stats.llm_verified} llm-only\n`);
|
|
161
|
+
if (overrides.length > 0) {
|
|
162
|
+
console.log(' 🔴 BUGS FORMAL CAUGHT THAT LLM MISSED:');
|
|
163
|
+
for (const v of overrides) {
|
|
164
|
+
console.log(` ${v.claimId}: LLM said ${v.formal_override.original_llm_verdict} → Formal: ${v.formal_override.formal_verdict}`);
|
|
165
|
+
console.log(` ${v.formal_override.reason}\n`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Also show what LLM caught on its own
|
|
169
|
+
const llmCaught = llmVerifications.filter(v => v.verdict === 'FAIL');
|
|
170
|
+
if (llmCaught.length > 0) {
|
|
171
|
+
console.log(' 🟡 BUGS LLM CAUGHT ON ITS OWN:');
|
|
172
|
+
for (const v of llmCaught) {
|
|
173
|
+
console.log(` ${v.claimId}: ${v.reasoning.slice(0, 100)}`);
|
|
174
|
+
}
|
|
175
|
+
console.log();
|
|
176
|
+
}
|
|
177
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
178
|
+
const added = formalFail - llmFail;
|
|
179
|
+
if (added > 0) {
|
|
180
|
+
console.log(` VALUE ADD: +${added} bugs caught by formal that LLM missed`);
|
|
181
|
+
}
|
|
182
|
+
else if (overrides.length === 0 && llmFail >= 4) {
|
|
183
|
+
console.log(` LLM caught all bugs — formal verification confirmed (no override needed)`);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
console.log(` No additional bugs caught — LLM may have found them already`);
|
|
187
|
+
}
|
|
188
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
main();
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
console.error(err);
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=arithmetic-quick-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arithmetic-quick-test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/arithmetic-quick-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Real LLM A/B Test — Arithmetic Formal Verification Value
|
|
4
|
+
*
|
|
5
|
+
* Uses Claude CLI (subscription, not API credits) to:
|
|
6
|
+
* 1. Extract claims from code with arithmetic bugs
|
|
7
|
+
* 2. LLM-verify those claims
|
|
8
|
+
* 3. Apply formal verification
|
|
9
|
+
* 4. Compare: what did the LLM miss that formal caught?
|
|
10
|
+
*
|
|
11
|
+
* Usage: ASSAY_LLM_PROVIDER=cli npx tsx src/lib/__tests__/arithmetic-real-llm-test.ts
|
|
12
|
+
*/
|
|
13
|
+
export {};
|