fivosense 0.1.5 ā 0.1.6
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/COMPLETE_SUMMARY.md +412 -0
- package/FINAL_VERIFICATION.md +316 -0
- package/dist/ai/client.d.ts +27 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +167 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/judge.d.ts +3 -3
- package/dist/ai/judge.d.ts.map +1 -1
- package/dist/ai/judge.js +43 -14
- package/dist/ai/judge.js.map +1 -1
- package/dist/core/orchestrator.d.ts +31 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +205 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/scope.d.ts +29 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +143 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/engine/adversary.d.ts +3 -2
- package/dist/engine/adversary.d.ts.map +1 -1
- package/dist/engine/adversary.js +43 -12
- package/dist/engine/adversary.js.map +1 -1
- package/dist/engine/poc.d.ts +20 -0
- package/dist/engine/poc.d.ts.map +1 -0
- package/dist/engine/poc.js +176 -0
- package/dist/engine/poc.js.map +1 -0
- package/dist/hooks/git.d.ts +31 -0
- package/dist/hooks/git.d.ts.map +1 -0
- package/dist/hooks/git.js +155 -0
- package/dist/hooks/git.js.map +1 -0
- package/mcp/index.js +48 -20
- package/mcp/package-lock.json +382 -0
- package/mcp/package.json +1 -1
- package/package.json +1 -1
- package/src/ai/client.ts +219 -0
- package/src/ai/judge.ts +51 -14
- package/src/core/orchestrator.ts +259 -0
- package/src/core/scope.ts +168 -0
- package/src/engine/adversary.ts +48 -12
- package/src/engine/poc.ts +212 -0
- package/src/hooks/git.ts +187 -0
- package/vscode-extension/fivosense-vscode-0.1.0.vsix +0 -0
- package/vscode-extension/package-lock.json +4 -4
- package/vscode-extension/package.json +3 -3
- package/vscode-extension/src/extension.ts +65 -11
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Client - BYOK (Bring Your Own Key) support for multiple AI providers
|
|
3
|
+
*/
|
|
4
|
+
export interface AIProvider {
|
|
5
|
+
name: string;
|
|
6
|
+
endpoint?: string;
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AIResponse {
|
|
11
|
+
text: string;
|
|
12
|
+
model: string;
|
|
13
|
+
usage?: {
|
|
14
|
+
promptTokens: number;
|
|
15
|
+
completionTokens: number;
|
|
16
|
+
totalTokens: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Main AI client - routes to correct provider
|
|
21
|
+
*/
|
|
22
|
+
export declare function callAI(provider: AIProvider, prompt: string): Promise<AIResponse>;
|
|
23
|
+
/**
|
|
24
|
+
* Get AI provider from environment variables
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAIProviderFromEnv(): AIProvider | null;
|
|
27
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ai/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AA0ID;;GAEG;AACH,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,GAAG,IAAI,CA+BxD"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Client - BYOK (Bring Your Own Key) support for multiple AI providers
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Call OpenAI-compatible API
|
|
6
|
+
*/
|
|
7
|
+
async function callOpenAI(provider, prompt) {
|
|
8
|
+
const endpoint = provider.endpoint || 'https://api.openai.com/v1/chat/completions';
|
|
9
|
+
const model = provider.model || 'gpt-4o-mini';
|
|
10
|
+
const response = await fetch(endpoint, {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'Authorization': `Bearer ${provider.apiKey}`,
|
|
15
|
+
},
|
|
16
|
+
body: JSON.stringify({
|
|
17
|
+
model,
|
|
18
|
+
messages: [
|
|
19
|
+
{
|
|
20
|
+
role: 'system',
|
|
21
|
+
content: 'You are a security expert analyzing code vulnerabilities. Respond only with valid JSON.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
role: 'user',
|
|
25
|
+
content: prompt,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
temperature: 0.3,
|
|
29
|
+
max_tokens: 500,
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
throw new Error(`OpenAI API error: ${response.status} ${response.statusText}`);
|
|
34
|
+
}
|
|
35
|
+
const data = await response.json();
|
|
36
|
+
return {
|
|
37
|
+
text: data.choices[0].message.content,
|
|
38
|
+
model: data.model,
|
|
39
|
+
usage: {
|
|
40
|
+
promptTokens: data.usage.prompt_tokens,
|
|
41
|
+
completionTokens: data.usage.completion_tokens,
|
|
42
|
+
totalTokens: data.usage.total_tokens,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Call Anthropic Claude API
|
|
48
|
+
*/
|
|
49
|
+
async function callClaude(provider, prompt) {
|
|
50
|
+
const endpoint = provider.endpoint || 'https://api.anthropic.com/v1/messages';
|
|
51
|
+
const model = provider.model || 'claude-3-5-sonnet-20241022';
|
|
52
|
+
const response = await fetch(endpoint, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: {
|
|
55
|
+
'Content-Type': 'application/json',
|
|
56
|
+
'x-api-key': provider.apiKey,
|
|
57
|
+
'anthropic-version': '2023-06-01',
|
|
58
|
+
},
|
|
59
|
+
body: JSON.stringify({
|
|
60
|
+
model,
|
|
61
|
+
max_tokens: 500,
|
|
62
|
+
temperature: 0.3,
|
|
63
|
+
system: 'You are a security expert analyzing code vulnerabilities. Respond only with valid JSON.',
|
|
64
|
+
messages: [
|
|
65
|
+
{
|
|
66
|
+
role: 'user',
|
|
67
|
+
content: prompt,
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
}),
|
|
71
|
+
});
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
throw new Error(`Claude API error: ${response.status} ${response.statusText}`);
|
|
74
|
+
}
|
|
75
|
+
const data = await response.json();
|
|
76
|
+
return {
|
|
77
|
+
text: data.content[0].text,
|
|
78
|
+
model: data.model,
|
|
79
|
+
usage: {
|
|
80
|
+
promptTokens: data.usage.input_tokens,
|
|
81
|
+
completionTokens: data.usage.output_tokens,
|
|
82
|
+
totalTokens: data.usage.input_tokens + data.usage.output_tokens,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Call Ollama (local)
|
|
88
|
+
*/
|
|
89
|
+
async function callOllama(provider, prompt) {
|
|
90
|
+
const endpoint = provider.endpoint || 'http://localhost:11434/api/generate';
|
|
91
|
+
const model = provider.model || 'llama3.2';
|
|
92
|
+
const response = await fetch(endpoint, {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
headers: {
|
|
95
|
+
'Content-Type': 'application/json',
|
|
96
|
+
},
|
|
97
|
+
body: JSON.stringify({
|
|
98
|
+
model,
|
|
99
|
+
prompt: `You are a security expert. ${prompt}`,
|
|
100
|
+
stream: false,
|
|
101
|
+
options: {
|
|
102
|
+
temperature: 0.3,
|
|
103
|
+
num_predict: 500,
|
|
104
|
+
},
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
if (!response.ok) {
|
|
108
|
+
throw new Error(`Ollama API error: ${response.status} ${response.statusText}`);
|
|
109
|
+
}
|
|
110
|
+
const data = await response.json();
|
|
111
|
+
return {
|
|
112
|
+
text: data.response,
|
|
113
|
+
model: data.model,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Main AI client - routes to correct provider
|
|
118
|
+
*/
|
|
119
|
+
export async function callAI(provider, prompt) {
|
|
120
|
+
if (!provider.apiKey && provider.name !== 'ollama') {
|
|
121
|
+
throw new Error(`API key required for provider: ${provider.name}`);
|
|
122
|
+
}
|
|
123
|
+
switch (provider.name.toLowerCase()) {
|
|
124
|
+
case 'openai':
|
|
125
|
+
return callOpenAI(provider, prompt);
|
|
126
|
+
case 'claude':
|
|
127
|
+
case 'anthropic':
|
|
128
|
+
return callClaude(provider, prompt);
|
|
129
|
+
case 'ollama':
|
|
130
|
+
return callOllama(provider, prompt);
|
|
131
|
+
default:
|
|
132
|
+
throw new Error(`Unsupported AI provider: ${provider.name}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get AI provider from environment variables
|
|
137
|
+
*/
|
|
138
|
+
export function getAIProviderFromEnv() {
|
|
139
|
+
// Check for OpenAI
|
|
140
|
+
if (process.env.OPENAI_API_KEY) {
|
|
141
|
+
return {
|
|
142
|
+
name: 'openai',
|
|
143
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
144
|
+
model: process.env.OPENAI_MODEL || 'gpt-4o-mini',
|
|
145
|
+
endpoint: process.env.OPENAI_ENDPOINT,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// Check for Claude
|
|
149
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
150
|
+
return {
|
|
151
|
+
name: 'claude',
|
|
152
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
153
|
+
model: process.env.ANTHROPIC_MODEL || 'claude-3-5-sonnet-20241022',
|
|
154
|
+
endpoint: process.env.ANTHROPIC_ENDPOINT,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// Check for Ollama
|
|
158
|
+
if (process.env.OLLAMA_ENDPOINT || process.env.OLLAMA_HOST) {
|
|
159
|
+
return {
|
|
160
|
+
name: 'ollama',
|
|
161
|
+
model: process.env.OLLAMA_MODEL || 'llama3.2',
|
|
162
|
+
endpoint: process.env.OLLAMA_ENDPOINT || process.env.OLLAMA_HOST || 'http://localhost:11434/api/generate',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ai/client.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/judge.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AI Path Judge - Uses host AI to determine exploitability
|
|
3
3
|
*/
|
|
4
|
+
import { type AIProvider } from './client.js';
|
|
4
5
|
export interface PathJudgment {
|
|
5
6
|
exploitable: boolean;
|
|
6
7
|
confidence: number;
|
|
@@ -29,8 +30,7 @@ export declare function buildPathJudgePrompt(context: PathContext): string;
|
|
|
29
30
|
*/
|
|
30
31
|
export declare function parsePathJudgment(response: string): PathJudgment | null;
|
|
31
32
|
/**
|
|
32
|
-
*
|
|
33
|
-
* In Phase 2, this will call the actual host AI (Claude/etc.)
|
|
33
|
+
* Judge path exploitability using AI
|
|
34
34
|
*/
|
|
35
|
-
export declare function judgePathWithAI(context: PathContext): Promise<PathJudgment>;
|
|
35
|
+
export declare function judgePathWithAI(context: PathContext, provider?: AIProvider): Promise<PathJudgment>;
|
|
36
36
|
//# sourceMappingURL=judge.d.ts.map
|
package/dist/ai/judge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/ai/judge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA4BjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAkBvE;AAED
|
|
1
|
+
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/ai/judge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA4BjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAkBvE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,YAAY,CAAC,CA+CvB"}
|
package/dist/ai/judge.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AI Path Judge - Uses host AI to determine exploitability
|
|
3
3
|
*/
|
|
4
|
+
import { callAI, getAIProviderFromEnv } from './client.js';
|
|
4
5
|
/**
|
|
5
6
|
* Build prompt for AI path judgment
|
|
6
7
|
*/
|
|
@@ -56,20 +57,48 @@ export function parsePathJudgment(response) {
|
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
/**
|
|
59
|
-
*
|
|
60
|
-
* In Phase 2, this will call the actual host AI (Claude/etc.)
|
|
60
|
+
* Judge path exploitability using AI
|
|
61
61
|
*/
|
|
62
|
-
export async function judgePathWithAI(context) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
62
|
+
export async function judgePathWithAI(context, provider) {
|
|
63
|
+
// Get provider from env if not provided
|
|
64
|
+
const aiProvider = provider || getAIProviderFromEnv();
|
|
65
|
+
// If no AI provider available, return conservative judgment
|
|
66
|
+
if (!aiProvider) {
|
|
67
|
+
console.warn('ā ļø No AI provider configured - using conservative defaults');
|
|
68
|
+
console.warn('š” Set OPENAI_API_KEY, ANTHROPIC_API_KEY, or OLLAMA_HOST to enable AI judgment');
|
|
69
|
+
return {
|
|
70
|
+
exploitable: true, // Conservative: assume exploitable
|
|
71
|
+
confidence: 0.7,
|
|
72
|
+
reasoning: 'AI judgment not configured - marked as potentially exploitable',
|
|
73
|
+
severity: 'high',
|
|
74
|
+
recommendation: 'Configure AI provider or review manually',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const prompt = buildPathJudgePrompt(context);
|
|
79
|
+
const response = await callAI(aiProvider, prompt);
|
|
80
|
+
const judgment = parsePathJudgment(response.text);
|
|
81
|
+
if (!judgment) {
|
|
82
|
+
console.warn('ā ļø Failed to parse AI response - using conservative defaults');
|
|
83
|
+
return {
|
|
84
|
+
exploitable: true,
|
|
85
|
+
confidence: 0.6,
|
|
86
|
+
reasoning: 'Failed to parse AI response',
|
|
87
|
+
severity: 'high',
|
|
88
|
+
recommendation: 'Review manually',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return judgment;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.warn(`ā ļø AI judgment failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
95
|
+
return {
|
|
96
|
+
exploitable: true,
|
|
97
|
+
confidence: 0.7,
|
|
98
|
+
reasoning: `AI judgment failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
99
|
+
severity: 'high',
|
|
100
|
+
recommendation: 'Review manually',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
74
103
|
}
|
|
75
104
|
//# sourceMappingURL=judge.js.map
|
package/dist/ai/judge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/ai/judge.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/ai/judge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator - Coordinates analysis pipeline and flow control
|
|
3
|
+
*/
|
|
4
|
+
import type { AuditResult } from '../index.js';
|
|
5
|
+
import type { AIProvider } from '../ai/client.js';
|
|
6
|
+
export interface OrchestratorOptions {
|
|
7
|
+
enableAI?: boolean;
|
|
8
|
+
enableAdversarial?: boolean;
|
|
9
|
+
enablePoC?: boolean;
|
|
10
|
+
scopeToDiff?: boolean;
|
|
11
|
+
diffBase?: string;
|
|
12
|
+
aiProvider?: AIProvider;
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Main orchestration pipeline
|
|
17
|
+
*/
|
|
18
|
+
export declare function orchestrateAudit(code: string, filepath: string, options?: OrchestratorOptions): Promise<AuditResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Quick audit (no AI, no scope)
|
|
21
|
+
*/
|
|
22
|
+
export declare function quickAudit(code: string, filepath: string): Promise<AuditResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Full audit (with AI and adversarial)
|
|
25
|
+
*/
|
|
26
|
+
export declare function fullAudit(code: string, filepath: string, aiProvider?: AIProvider): Promise<AuditResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Diff-scoped audit (only changed code)
|
|
29
|
+
*/
|
|
30
|
+
export declare function diffAudit(code: string, filepath: string, diffBase?: string): Promise<AuditResult>;
|
|
31
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,WAAW,CAAC,CAiLtB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQrF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,WAAW,CAAC,CAStB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAe,GACxB,OAAO,CAAC,WAAW,CAAC,CAStB"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator - Coordinates analysis pipeline and flow control
|
|
3
|
+
*/
|
|
4
|
+
import { buildDataFlowGraph } from '../engine/graph.js';
|
|
5
|
+
import { generateTaintTraces } from '../engine/taint.js';
|
|
6
|
+
import { detectSecrets } from '../rules/secrets.js';
|
|
7
|
+
import { detectDestructive } from '../rules/destructive.js';
|
|
8
|
+
import { judgePathWithAI } from '../ai/judge.js';
|
|
9
|
+
import { verifyWithAdversary } from '../engine/adversary.js';
|
|
10
|
+
import { generatePoC } from '../engine/poc.js';
|
|
11
|
+
import { getDiffScope, filterFindingsByScope } from './scope.js';
|
|
12
|
+
/**
|
|
13
|
+
* Main orchestration pipeline
|
|
14
|
+
*/
|
|
15
|
+
export async function orchestrateAudit(code, filepath, options = {}) {
|
|
16
|
+
const { enableAI = false, enableAdversarial = false, enablePoC = false, scopeToDiff = false, diffBase = 'main', aiProvider, verbose = false, } = options;
|
|
17
|
+
if (verbose) {
|
|
18
|
+
console.log(`š Starting audit: ${filepath}`);
|
|
19
|
+
console.log(` AI Judge: ${enableAI ? 'ā
' : 'ā'}`);
|
|
20
|
+
console.log(` Adversarial: ${enableAdversarial ? 'ā
' : 'ā'}`);
|
|
21
|
+
console.log(` PoC Generation: ${enablePoC ? 'ā
' : 'ā'}`);
|
|
22
|
+
console.log(` Scope to diff: ${scopeToDiff ? 'ā
' : 'ā'}`);
|
|
23
|
+
}
|
|
24
|
+
// Step 1: Get scope if needed
|
|
25
|
+
let scope;
|
|
26
|
+
if (scopeToDiff) {
|
|
27
|
+
if (verbose)
|
|
28
|
+
console.log(`š Getting diff scope (base: ${diffBase})...`);
|
|
29
|
+
scope = await getDiffScope(diffBase);
|
|
30
|
+
if (verbose)
|
|
31
|
+
console.log(` ${scope.files.length} files in scope`);
|
|
32
|
+
}
|
|
33
|
+
// Step 2: Build data-flow graph
|
|
34
|
+
if (verbose)
|
|
35
|
+
console.log(`šØ Building data-flow graph...`);
|
|
36
|
+
const graph = buildDataFlowGraph(code, filepath);
|
|
37
|
+
// Step 3: Taint analysis
|
|
38
|
+
if (verbose)
|
|
39
|
+
console.log(`š Running taint analysis...`);
|
|
40
|
+
const traces = generateTaintTraces(graph, filepath);
|
|
41
|
+
// Convert traces to vulnerabilities format
|
|
42
|
+
const allVulnerabilities = traces.map(trace => ({
|
|
43
|
+
finding: trace.finding,
|
|
44
|
+
severity: trace.severity,
|
|
45
|
+
category: trace.category,
|
|
46
|
+
cwe: trace.cwe,
|
|
47
|
+
path: trace.path.split(' ā '),
|
|
48
|
+
evidence: trace.evidence,
|
|
49
|
+
location: trace.location,
|
|
50
|
+
sanitized: trace.sanitized,
|
|
51
|
+
confidence: 0.8,
|
|
52
|
+
}));
|
|
53
|
+
// Step 4: Filter by scope if enabled
|
|
54
|
+
let vulnerabilities = allVulnerabilities;
|
|
55
|
+
if (scope && scopeToDiff) {
|
|
56
|
+
if (verbose)
|
|
57
|
+
console.log(`šÆ Filtering by scope...`);
|
|
58
|
+
vulnerabilities = filterFindingsByScope(vulnerabilities, filepath, scope);
|
|
59
|
+
if (verbose)
|
|
60
|
+
console.log(` ${vulnerabilities.length} vulnerabilities in scope`);
|
|
61
|
+
}
|
|
62
|
+
// Step 5: AI judgment (if enabled)
|
|
63
|
+
if (enableAI && vulnerabilities.length > 0) {
|
|
64
|
+
if (verbose)
|
|
65
|
+
console.log(`š¤ Running AI judgment...`);
|
|
66
|
+
for (let i = 0; i < vulnerabilities.length; i++) {
|
|
67
|
+
const vuln = vulnerabilities[i];
|
|
68
|
+
try {
|
|
69
|
+
const judgment = await judgePathWithAI({
|
|
70
|
+
source: vuln.path[0] || 'unknown',
|
|
71
|
+
sourceType: 'user input',
|
|
72
|
+
sourceLoc: `line ${vuln.location.line}`,
|
|
73
|
+
sink: vuln.path[vuln.path.length - 1] || 'unknown',
|
|
74
|
+
sinkType: vuln.category,
|
|
75
|
+
category: vuln.category,
|
|
76
|
+
cwe: vuln.cwe,
|
|
77
|
+
dataFlow: vuln.path.join(' ā '),
|
|
78
|
+
codeSnippet: code.split('\n').slice(Math.max(0, vuln.location.line - 3), vuln.location.line + 2).join('\n'),
|
|
79
|
+
language: filepath.endsWith('.ts') || filepath.endsWith('.tsx') ? 'typescript' : 'javascript',
|
|
80
|
+
}, aiProvider);
|
|
81
|
+
// Update vulnerability with AI judgment
|
|
82
|
+
vuln.confidence = judgment.confidence;
|
|
83
|
+
if (verbose) {
|
|
84
|
+
console.log(` [${i + 1}/${vulnerabilities.length}] ${vuln.finding}: ${judgment.exploitable ? 'ā Exploitable' : 'ā
Safe'} (confidence: ${judgment.confidence})`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (verbose) {
|
|
89
|
+
console.warn(` [${i + 1}/${vulnerabilities.length}] AI judgment failed:`, error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Step 6: Adversarial verification (if enabled)
|
|
95
|
+
if (enableAdversarial && vulnerabilities.length > 0) {
|
|
96
|
+
if (verbose)
|
|
97
|
+
console.log(`āļø Running adversarial verification...`);
|
|
98
|
+
for (let i = 0; i < vulnerabilities.length; i++) {
|
|
99
|
+
const vuln = vulnerabilities[i];
|
|
100
|
+
try {
|
|
101
|
+
const trace = traces.find((t) => t.category === vuln.category && t.location.line === vuln.location.line);
|
|
102
|
+
if (trace) {
|
|
103
|
+
const adversary = await verifyWithAdversary(trace, code, aiProvider);
|
|
104
|
+
// Update confidence based on adversarial result
|
|
105
|
+
vuln.confidence = Math.min(vuln.confidence, adversary.confidence);
|
|
106
|
+
if (verbose) {
|
|
107
|
+
console.log(` [${i + 1}/${vulnerabilities.length}] ${adversary.exploitable ? 'āļø Exploit found' : 'š”ļø Defense holds'}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (verbose) {
|
|
113
|
+
console.warn(` [${i + 1}/${vulnerabilities.length}] Adversarial verification failed:`, error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Step 7: PoC generation (if enabled)
|
|
119
|
+
if (enablePoC && vulnerabilities.length > 0) {
|
|
120
|
+
if (verbose)
|
|
121
|
+
console.log(`š£ Generating PoCs...`);
|
|
122
|
+
for (const vuln of vulnerabilities) {
|
|
123
|
+
try {
|
|
124
|
+
const trace = traces.find((t) => t.category === vuln.category && t.location.line === vuln.location.line);
|
|
125
|
+
if (trace) {
|
|
126
|
+
const poc = generatePoC(trace);
|
|
127
|
+
// Attach PoC to vulnerability (could extend Vulnerability type)
|
|
128
|
+
vuln.poc = poc;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (verbose) {
|
|
133
|
+
console.warn(` Failed to generate PoC:`, error);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Step 8: Secret detection
|
|
139
|
+
if (verbose)
|
|
140
|
+
console.log(`š Detecting secrets...`);
|
|
141
|
+
const secrets = detectSecrets(code);
|
|
142
|
+
// Step 9: Destructive command detection
|
|
143
|
+
if (verbose)
|
|
144
|
+
console.log(`š„ Detecting destructive commands...`);
|
|
145
|
+
const destructive = detectDestructive(code);
|
|
146
|
+
// Step 10: Build summary
|
|
147
|
+
const summary = {
|
|
148
|
+
total: vulnerabilities.length + secrets.length + destructive.length,
|
|
149
|
+
critical: vulnerabilities.filter((v) => v.severity === 'critical').length,
|
|
150
|
+
high: vulnerabilities.filter((v) => v.severity === 'high').length + secrets.length,
|
|
151
|
+
medium: vulnerabilities.filter((v) => v.severity === 'medium').length + destructive.length,
|
|
152
|
+
};
|
|
153
|
+
if (verbose) {
|
|
154
|
+
console.log(`\nš Audit complete:`);
|
|
155
|
+
console.log(` Total: ${summary.total}`);
|
|
156
|
+
console.log(` Critical: ${summary.critical}`);
|
|
157
|
+
console.log(` High: ${summary.high}`);
|
|
158
|
+
console.log(` Medium: ${summary.medium}\n`);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
vulnerabilities,
|
|
162
|
+
secrets,
|
|
163
|
+
destructive,
|
|
164
|
+
summary,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Quick audit (no AI, no scope)
|
|
169
|
+
*/
|
|
170
|
+
export async function quickAudit(code, filepath) {
|
|
171
|
+
return orchestrateAudit(code, filepath, {
|
|
172
|
+
enableAI: false,
|
|
173
|
+
enableAdversarial: false,
|
|
174
|
+
enablePoC: false,
|
|
175
|
+
scopeToDiff: false,
|
|
176
|
+
verbose: false,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Full audit (with AI and adversarial)
|
|
181
|
+
*/
|
|
182
|
+
export async function fullAudit(code, filepath, aiProvider) {
|
|
183
|
+
return orchestrateAudit(code, filepath, {
|
|
184
|
+
enableAI: true,
|
|
185
|
+
enableAdversarial: true,
|
|
186
|
+
enablePoC: true,
|
|
187
|
+
scopeToDiff: false,
|
|
188
|
+
aiProvider,
|
|
189
|
+
verbose: true,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Diff-scoped audit (only changed code)
|
|
194
|
+
*/
|
|
195
|
+
export async function diffAudit(code, filepath, diffBase = 'main') {
|
|
196
|
+
return orchestrateAudit(code, filepath, {
|
|
197
|
+
enableAI: false,
|
|
198
|
+
enableAdversarial: false,
|
|
199
|
+
enablePoC: false,
|
|
200
|
+
scopeToDiff: true,
|
|
201
|
+
diffBase,
|
|
202
|
+
verbose: true,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scope Management - Track and filter relevant code changes
|
|
3
|
+
*/
|
|
4
|
+
export interface CodeScope {
|
|
5
|
+
files: string[];
|
|
6
|
+
lines: Map<string, Set<number>>;
|
|
7
|
+
changedFunctions: Map<string, string[]>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get diff scope for current changes
|
|
11
|
+
*/
|
|
12
|
+
export declare function getDiffScope(base?: string): Promise<CodeScope>;
|
|
13
|
+
/**
|
|
14
|
+
* Filter findings to only those in changed scope
|
|
15
|
+
*/
|
|
16
|
+
export declare function filterFindingsByScope<T extends {
|
|
17
|
+
location?: {
|
|
18
|
+
line: number;
|
|
19
|
+
};
|
|
20
|
+
}>(findings: T[], file: string, scope: CodeScope): T[];
|
|
21
|
+
/**
|
|
22
|
+
* Get scope for staged changes
|
|
23
|
+
*/
|
|
24
|
+
export declare function getStagedScope(): Promise<CodeScope>;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a line is in scope
|
|
27
|
+
*/
|
|
28
|
+
export declare function isLineInScope(file: string, line: number, scope: CodeScope): boolean;
|
|
29
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/core/scope.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAE,MAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAiC5E;AA+BD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EAC7E,QAAQ,EAAE,CAAC,EAAE,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,GACf,CAAC,EAAE,CAsBL;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,SAAS,CAAC,CAiCzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAanF"}
|