@securecode-ai/mcp 0.4.0 → 0.4.2
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/README.md +107 -13
- package/dist/api/client.d.ts +1 -1
- package/dist/api/client.js +2 -1
- package/dist/api/client.js.map +1 -1
- package/dist/attack/agentScanExecutor.js +159 -5
- package/dist/attack/agentScanExecutor.js.map +1 -1
- package/dist/attack/agentScanLoop.js +157 -3
- package/dist/attack/agentScanLoop.js.map +1 -1
- package/dist/attack/agentScanProtocol.d.ts +47 -5
- package/dist/attack/agentScanProtocol.js +3 -3
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +62 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.js +80 -3
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-map/agentMemory.d.ts +75 -0
- package/dist/project-map/agentMemory.js +230 -0
- package/dist/project-map/agentMemory.js.map +1 -0
- package/dist/project-map/crossFileTaintTracker.d.ts +51 -0
- package/dist/project-map/crossFileTaintTracker.js +429 -0
- package/dist/project-map/crossFileTaintTracker.js.map +1 -0
- package/dist/project-map/endpointDiscovery.d.ts +24 -0
- package/dist/project-map/endpointDiscovery.js +101 -0
- package/dist/project-map/endpointDiscovery.js.map +1 -0
- package/dist/project-map/guardEvaluator.js +37 -0
- package/dist/project-map/guardEvaluator.js.map +1 -1
- package/dist/project-map/guardPatterns.js +16 -5
- package/dist/project-map/guardPatterns.js.map +1 -1
- package/dist/project-map/sanitizers.js +10 -0
- package/dist/project-map/sanitizers.js.map +1 -1
- package/dist/project-map/scanCache.d.ts +67 -0
- package/dist/project-map/scanCache.js +169 -0
- package/dist/project-map/scanCache.js.map +1 -0
- package/dist/project-map/sinkRegistry.js +165 -0
- package/dist/project-map/sinkRegistry.js.map +1 -1
- package/dist/project-map/taintSources.d.ts +19 -1
- package/dist/project-map/taintSources.js +69 -2
- package/dist/project-map/taintSources.js.map +1 -1
- package/dist/project-map/taintTracker.d.ts +4 -1
- package/dist/project-map/taintTracker.js +188 -5
- package/dist/project-map/taintTracker.js.map +1 -1
- package/dist/tools/agentMemoryTools.d.ts +18 -0
- package/dist/tools/agentMemoryTools.js +107 -0
- package/dist/tools/agentMemoryTools.js.map +1 -0
- package/dist/tools/agentScan.js +206 -33
- package/dist/tools/agentScan.js.map +1 -1
- package/dist/utils/files.js +19 -2
- package/dist/utils/files.js.map +1 -1
- package/dist/utils/listFiles.d.ts +17 -0
- package/dist/utils/listFiles.js +126 -0
- package/dist/utils/listFiles.js.map +1 -0
- package/dist/utils/listImports.d.ts +15 -0
- package/dist/utils/listImports.js +164 -0
- package/dist/utils/listImports.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,15 +8,54 @@ Standalone MCP (Model Context Protocol) server for SecureCode AI. Provides secur
|
|
|
8
8
|
npm install -g @securecode-ai/mcp
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Quick Start
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
securecode-mcp login
|
|
14
|
+
securecode-mcp login # Authenticate (email + OTP)
|
|
15
|
+
securecode-mcp doctor # Verify your setup works
|
|
16
|
+
securecode-mcp scan src/app.ts # Scan a file from the CLI
|
|
17
|
+
securecode-mcp serve # Start the MCP server (for AI clients)
|
|
15
18
|
```
|
|
16
19
|
|
|
17
|
-
|
|
20
|
+
## CLI Commands
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
```bash
|
|
23
|
+
securecode-mcp serve [--workspace <path>] Start the MCP stdio server
|
|
24
|
+
securecode-mcp login [--api-url <url>] Authenticate via email + OTP
|
|
25
|
+
securecode-mcp status Show current auth status
|
|
26
|
+
securecode-mcp logout Remove stored credentials
|
|
27
|
+
securecode-mcp scan <filePath> [--json] Scan a single file
|
|
28
|
+
[--depth <fast|deep|agent>] [--workspace <path>]
|
|
29
|
+
securecode-mcp doctor Verify setup (credentials, API, scan)
|
|
30
|
+
securecode-mcp --help Show help
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Scan from CLI
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Agent scan (deep, AI-powered)
|
|
37
|
+
securecode-mcp scan src/app/api/users/route.ts
|
|
38
|
+
|
|
39
|
+
# Fast scan (no AI, free, <5s)
|
|
40
|
+
securecode-mcp scan src/lib/auth.ts --depth fast
|
|
41
|
+
|
|
42
|
+
# JSON output for CI
|
|
43
|
+
securecode-mcp scan src/app.ts --json
|
|
44
|
+
|
|
45
|
+
# Exit codes: 0 = no findings, 1 = findings found, 2 = error
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### CI/CD Example
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
# GitHub Action
|
|
52
|
+
- name: SecureCode scan
|
|
53
|
+
run: |
|
|
54
|
+
npm install -g @securecode-ai/mcp
|
|
55
|
+
securecode-mcp login # or set SECURECODE_API_TOKEN
|
|
56
|
+
securecode-mcp scan src/ --json > scan-results.json
|
|
57
|
+
# Exit 1 if findings found
|
|
58
|
+
```
|
|
20
59
|
|
|
21
60
|
## MCP client configuration
|
|
22
61
|
|
|
@@ -39,29 +78,80 @@ Alternatively, set the `SECURECODE_API_TOKEN` environment variable.
|
|
|
39
78
|
claude mcp add securecode -s user -- securecode-mcp serve --workspace /path/to/your/project
|
|
40
79
|
```
|
|
41
80
|
|
|
42
|
-
## Tools
|
|
81
|
+
## Tools (11)
|
|
82
|
+
|
|
83
|
+
### Scanning
|
|
84
|
+
|
|
85
|
+
| Tool | Description | Approval |
|
|
86
|
+
|------|-------------|----------|
|
|
87
|
+
| `securecode.scan` | Scan code for vulnerabilities (AI pipeline) | No |
|
|
88
|
+
| `securecode.agent-scan` | Agent-mode deep scan with 10 tools + sandbox proof | No |
|
|
89
|
+
| `securecode.scan-batch` | Scan multiple files in one call | No |
|
|
90
|
+
| `securecode.scan-secrets` | Scan for hardcoded secrets and PII (local, no AI) | No |
|
|
91
|
+
| `securecode.scan-dependencies` | Scan lockfiles for known vulnerabilities (OSV/NVD) | No |
|
|
92
|
+
|
|
93
|
+
### Project Analysis
|
|
43
94
|
|
|
44
95
|
| Tool | Description | Approval |
|
|
45
96
|
|------|-------------|----------|
|
|
46
|
-
| `securecode.scan` | Scan code for vulnerabilities using the AI pipeline | No |
|
|
47
97
|
| `securecode.map` | Get the Project Map (endpoints, middleware, auth) | No |
|
|
98
|
+
|
|
99
|
+
### Fixes & Testing
|
|
100
|
+
|
|
101
|
+
| Tool | Description | Approval |
|
|
102
|
+
|------|-------------|----------|
|
|
48
103
|
| `securecode.fix` | Generate a patch for a specific finding | Yes |
|
|
49
104
|
| `securecode.attack` | Endpoint red-team testing (beta) | Yes |
|
|
50
105
|
|
|
51
|
-
|
|
106
|
+
### Agent Memory (FP Learning)
|
|
107
|
+
|
|
108
|
+
| Tool | Description | Approval |
|
|
109
|
+
|------|-------------|----------|
|
|
110
|
+
| `securecode.record-false-positive` | Dismiss a finding as FP — agent learns not to report it | No |
|
|
111
|
+
| `securecode.get-agent-memory` | View learned false positives and known facts | No |
|
|
112
|
+
| `securecode.clear-agent-memory` | Clear all agent memory (or one FP by ID) | No |
|
|
113
|
+
| `securecode.add-known-fact` | Add a project fact for faster investigations | No |
|
|
114
|
+
|
|
115
|
+
### How Agent Memory Works
|
|
116
|
+
|
|
117
|
+
When the agent reports a false positive, dismiss it with `record-false-positive`. The agent stores the pattern in `.securecode/agent-memory.json` and will not report similar patterns in future scans of that workspace.
|
|
52
118
|
|
|
53
|
-
```bash
|
|
54
|
-
securecode-mcp serve [--workspace <path>] Start the MCP stdio server
|
|
55
|
-
securecode-mcp login [--api-url <url>] Authenticate via email + OTP
|
|
56
|
-
securecode-mcp status Show auth status
|
|
57
|
-
securecode-mcp logout Remove credentials
|
|
58
119
|
```
|
|
120
|
+
Scan 1: Agent reports csp_bypass → You dismiss as "intentional design"
|
|
121
|
+
Scan 2: Agent sees the FP memory → skips similar patterns → fewer false positives
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Memory is per-workspace, user-owned, and deletable. No cross-tenant leakage.
|
|
125
|
+
|
|
126
|
+
## Agent Scan Architecture
|
|
127
|
+
|
|
128
|
+
The agent scan (`securecode.agent-scan`) is an AI investigator that:
|
|
129
|
+
|
|
130
|
+
1. **Reads** the target file and related files (10 tools)
|
|
131
|
+
2. **Traces** data flows (taint tracking, cross-file)
|
|
132
|
+
3. **Checks** guards and endpoint policies
|
|
133
|
+
4. **Self-critiques** before reporting (selfCritique field)
|
|
134
|
+
5. **Gets reviewed** by an independent critique LLM
|
|
135
|
+
6. **Proves** findings in a sandbox (PROVEN/UNPROVEN)
|
|
136
|
+
7. **Generates fixes** for proven findings
|
|
137
|
+
|
|
138
|
+
Agent tools: `read_file`, `search_code`, `trace_flow`, `trace_flow_cross_file`, `check_guard`, `check_policy`, `get_endpoints`, `list_imports`, `list_files`, `finish`.
|
|
139
|
+
|
|
140
|
+
Languages: JavaScript, TypeScript, Python (partial).
|
|
141
|
+
|
|
142
|
+
## Environment Variables
|
|
143
|
+
|
|
144
|
+
| Variable | Default | Description |
|
|
145
|
+
|----------|---------|-------------|
|
|
146
|
+
| `SECURECODE_API_TOKEN` | — | API token (alternative to login) |
|
|
147
|
+
| `SECURECODE_API_URL` | `https://api.usesecurecode.tech` | API base URL |
|
|
59
148
|
|
|
60
149
|
## Security
|
|
61
150
|
|
|
62
|
-
- Credentials stored in OS keychain (Windows Credential Manager, macOS Keychain, Linux Secret Service) with file fallback.
|
|
151
|
+
- Credentials stored in OS keychain (Windows Credential Manager, macOS Keychain, Linux Secret Service) with file fallback (`~/.securecode/credentials.json`, mode 0600).
|
|
63
152
|
- File reads are confined to the `--workspace` root.
|
|
64
153
|
- Fixes are returned for review and never auto-applied.
|
|
154
|
+
- Agent memory is per-workspace (`.securecode/agent-memory.json`), never sent to the API.
|
|
65
155
|
- No telemetry.
|
|
66
156
|
|
|
67
157
|
## Development
|
|
@@ -71,3 +161,7 @@ npm install
|
|
|
71
161
|
npm run build
|
|
72
162
|
npm test
|
|
73
163
|
```
|
|
164
|
+
|
|
165
|
+
## License
|
|
166
|
+
|
|
167
|
+
MIT
|
package/dist/api/client.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export declare class ApiClient {
|
|
|
18
18
|
private readonly token;
|
|
19
19
|
private readonly timeoutMs;
|
|
20
20
|
constructor(opts: ApiClientOptions);
|
|
21
|
-
postJson<T>(path: string, body: unknown): Promise<T>;
|
|
21
|
+
postJson<T>(path: string, body: unknown, signal?: AbortSignal): Promise<T>;
|
|
22
22
|
/**
|
|
23
23
|
* POST without an Authorization header — for login/OTP before a token exists.
|
|
24
24
|
*/
|
package/dist/api/client.js
CHANGED
|
@@ -72,7 +72,7 @@ class ApiClient {
|
|
|
72
72
|
this.token = opts.token;
|
|
73
73
|
this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
74
74
|
}
|
|
75
|
-
async postJson(path, body) {
|
|
75
|
+
async postJson(path, body, signal) {
|
|
76
76
|
const url = `${this.baseUrl}${path}`;
|
|
77
77
|
const payload = JSON.stringify(body);
|
|
78
78
|
const parsed = new URL(url);
|
|
@@ -88,6 +88,7 @@ class ApiClient {
|
|
|
88
88
|
'Content-Length': Buffer.byteLength(payload),
|
|
89
89
|
Authorization: `Bearer ${this.token}`,
|
|
90
90
|
},
|
|
91
|
+
signal, // AbortSignal — when aborted, the request is destroyed
|
|
91
92
|
}, (res) => {
|
|
92
93
|
let raw = '';
|
|
93
94
|
let aborted = false;
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,6CAA+B;AAG/B,MAAM,kBAAkB,GAAG,SAAS,CAAC,CAAC,+DAA+D;AACrG,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAa,cAAe,SAAQ,KAAK;IAEjB;IACA;IAEA;IAJpB,YACoB,MAAc,EACd,OAA2B,EAC3C,OAAe,EACC,SAA6B;QAE7C,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAoB;QAE3B,cAAS,GAAT,SAAS,CAAoB;QAG7C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,qBAAqB,CAAC,GAAY;QACrC,OAAO,GAAG,YAAY,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,GAAY;QAC7B,OAAO,GAAG,YAAY,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAY;QAC3B,OAAO,GAAG,YAAY,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,GAAY;QACnC,OAAO,GAAG,YAAY,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;IAC/D,CAAC;CACJ;AA1BD,wCA0BC;AAQD,MAAa,SAAS;IACD,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,SAAS,CAAS;IAEnC,YAAY,IAAsB;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAI,IAAY,EAAE,IAAa;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,9 +47,14 @@ const path = __importStar(require("path"));
|
|
|
47
47
|
const files_1 = require("../utils/files");
|
|
48
48
|
const searchCode_1 = require("../utils/searchCode");
|
|
49
49
|
const taintTracker_1 = require("../project-map/taintTracker");
|
|
50
|
+
const crossFileTaintTracker_1 = require("../project-map/crossFileTaintTracker");
|
|
50
51
|
const guardEvaluator_1 = require("../project-map/guardEvaluator");
|
|
51
52
|
const report_1 = require("./report");
|
|
52
|
-
const
|
|
53
|
+
const endpointDiscovery_1 = require("../project-map/endpointDiscovery");
|
|
54
|
+
const listImports_1 = require("../utils/listImports");
|
|
55
|
+
const listFiles_1 = require("../utils/listFiles");
|
|
56
|
+
const MAX_OBSERVATION_CHARS = 16000;
|
|
57
|
+
const LARGE_FILE_THRESHOLD = 300;
|
|
53
58
|
function truncate(text) {
|
|
54
59
|
if (text.length <= MAX_OBSERVATION_CHARS)
|
|
55
60
|
return text;
|
|
@@ -108,6 +113,86 @@ function findFunctionInFile(source, functionName) {
|
|
|
108
113
|
function escapeRegex(s) {
|
|
109
114
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
110
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Extract a function map from source code using tree-sitter.
|
|
118
|
+
* Returns a string like:
|
|
119
|
+
* Function map:
|
|
120
|
+
* L1-20 requireAuth (function_declaration)
|
|
121
|
+
* L22-50 requireMembership (function_declaration)
|
|
122
|
+
* ...
|
|
123
|
+
* Returns null if tree-sitter parsing fails.
|
|
124
|
+
*/
|
|
125
|
+
async function extractFunctionMap(content, relPath) {
|
|
126
|
+
try {
|
|
127
|
+
const { parseSource } = await Promise.resolve().then(() => __importStar(require('../project-map/parserLoader')));
|
|
128
|
+
const { walk } = await Promise.resolve().then(() => __importStar(require('../project-map/astHelpers')));
|
|
129
|
+
// Infer language from path
|
|
130
|
+
const ext = path.extname(relPath).toLowerCase();
|
|
131
|
+
const langMap = {
|
|
132
|
+
'.ts': 'typescript', '.tsx': 'tsx', '.js': 'javascript',
|
|
133
|
+
'.jsx': 'javascript', '.py': 'python',
|
|
134
|
+
};
|
|
135
|
+
const lang = langMap[ext];
|
|
136
|
+
if (!lang)
|
|
137
|
+
return null;
|
|
138
|
+
const parsed = await parseSource(content, lang);
|
|
139
|
+
if (!parsed)
|
|
140
|
+
return null;
|
|
141
|
+
const { root } = parsed;
|
|
142
|
+
const entries = [];
|
|
143
|
+
const FUNCTION_TYPES = new Set([
|
|
144
|
+
'function_declaration', 'async_function_declaration',
|
|
145
|
+
'method_definition', 'async_method_definition',
|
|
146
|
+
'arrow_function', 'function_expression',
|
|
147
|
+
'class_declaration', 'export_statement',
|
|
148
|
+
]);
|
|
149
|
+
for (const node of walk(root)) {
|
|
150
|
+
if (!FUNCTION_TYPES.has(node.type))
|
|
151
|
+
continue;
|
|
152
|
+
// Get the name (first identifier child or property_identifier)
|
|
153
|
+
let name = '';
|
|
154
|
+
for (const child of node.children) {
|
|
155
|
+
if (child.type === 'identifier' || child.type === 'property_identifier' || child.type === 'type_identifier') {
|
|
156
|
+
name = content.slice(child.startIndex, child.endIndex);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (!name)
|
|
161
|
+
continue;
|
|
162
|
+
const startLine = node.startPosition.row + 1;
|
|
163
|
+
const endLine = node.endPosition.row + 1;
|
|
164
|
+
const lineCount = endLine - startLine + 1;
|
|
165
|
+
const kind = node.type.replace(/_/g, ' ');
|
|
166
|
+
entries.push(` L${startLine}-${endLine} (${lineCount}L) ${name} [${kind}]`);
|
|
167
|
+
}
|
|
168
|
+
if (entries.length === 0)
|
|
169
|
+
return null;
|
|
170
|
+
// Also include export-level structure for TS/JS
|
|
171
|
+
const exportLines = [];
|
|
172
|
+
for (const node of walk(root)) {
|
|
173
|
+
if (node.type === 'export_statement') {
|
|
174
|
+
const text = content.slice(node.startIndex, node.endIndex);
|
|
175
|
+
const firstLine = text.split('\n')[0];
|
|
176
|
+
if (firstLine.length > 100) {
|
|
177
|
+
exportLines.push(` L${node.startPosition.row + 1} ${firstLine.slice(0, 100)}...`);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
exportLines.push(` L${node.startPosition.row + 1} ${firstLine}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const parts = ['Function map (use read_file with startLine/endLine to read specific sections):'];
|
|
185
|
+
parts.push(...entries);
|
|
186
|
+
if (exportLines.length > 0 && exportLines.length <= 20) {
|
|
187
|
+
parts.push('', 'Exports:');
|
|
188
|
+
parts.push(...exportLines);
|
|
189
|
+
}
|
|
190
|
+
return parts.join('\n');
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
111
196
|
async function executeAction(action, ctx, runId, client, target) {
|
|
112
197
|
switch (action.type) {
|
|
113
198
|
case 'read_file': {
|
|
@@ -115,12 +200,29 @@ async function executeAction(action, ctx, runId, client, target) {
|
|
|
115
200
|
const absPath = (0, files_1.resolveWorkspacePath)(ctx.workspaceRoot, action.path);
|
|
116
201
|
const content = fs.readFileSync(absPath, 'utf8');
|
|
117
202
|
const rel = path.relative(ctx.workspaceRoot, absPath).replace(/\\/g, '/');
|
|
118
|
-
const
|
|
119
|
-
const
|
|
120
|
-
|
|
203
|
+
const allLines = content.split('\n');
|
|
204
|
+
const totalLines = allLines.length;
|
|
205
|
+
// If startLine/endLine provided, return only that range
|
|
206
|
+
if (action.startLine || action.endLine) {
|
|
207
|
+
const start = Math.max(1, action.startLine || 1);
|
|
208
|
+
const end = Math.min(totalLines, action.endLine || totalLines);
|
|
209
|
+
const section = allLines.slice(start - 1, end)
|
|
210
|
+
.map((line, i) => `${start + i}: ${line}`)
|
|
211
|
+
.join('\n');
|
|
212
|
+
return redact(`File: ${rel} (lines ${start}-${end} of ${totalLines})\n\n${section}`);
|
|
213
|
+
}
|
|
214
|
+
// For large files, return a function map instead of raw content
|
|
215
|
+
if (totalLines > LARGE_FILE_THRESHOLD) {
|
|
216
|
+
const funcMap = await extractFunctionMap(content, rel);
|
|
217
|
+
if (funcMap) {
|
|
218
|
+
return redact(`File: ${rel} (${totalLines} lines — LARGE FILE)\n\nThis file is too large to show in full. Here is a function map. Use read_file with startLine/endLine to read specific sections.\n\n${funcMap}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Small file: return full content with line numbers
|
|
222
|
+
const numbered = allLines
|
|
121
223
|
.map((line, i) => `${i + 1}: ${line}`)
|
|
122
224
|
.join('\n');
|
|
123
|
-
return redact(`File: ${rel} (${
|
|
225
|
+
return redact(`File: ${rel} (${totalLines} lines)\n\n${numbered}`);
|
|
124
226
|
}
|
|
125
227
|
catch (e) {
|
|
126
228
|
return `Error reading file "${action.path}": ${e.message || e}`;
|
|
@@ -160,6 +262,28 @@ async function executeAction(action, ctx, runId, client, target) {
|
|
|
160
262
|
return `Error tracing flow in "${action.filePath}": ${e.message || e}`;
|
|
161
263
|
}
|
|
162
264
|
}
|
|
265
|
+
case 'trace_flow_cross_file': {
|
|
266
|
+
try {
|
|
267
|
+
const results = await (0, crossFileTaintTracker_1.trackTaintCrossFile)({
|
|
268
|
+
workspaceRoot: ctx.workspaceRoot,
|
|
269
|
+
filePath: action.filePath,
|
|
270
|
+
maxDepth: action.maxDepth ?? 3,
|
|
271
|
+
});
|
|
272
|
+
if (results.length === 0) {
|
|
273
|
+
return `No cross-file taint flows found starting from ${action.filePath}.`;
|
|
274
|
+
}
|
|
275
|
+
const formatted = results.map(r => {
|
|
276
|
+
const path = r.crossFileSteps
|
|
277
|
+
.map(s => ` ${s.file}:${s.line} ${s.operation}: ${s.description}`)
|
|
278
|
+
.join('\n');
|
|
279
|
+
return `${r.source} (${r.sourceFile}:${r.sourceLine}) → ${r.sink} (${r.sinkFile}:${r.sinkLine}) [${r.canonicalType}]\n${path}`;
|
|
280
|
+
}).join('\n\n');
|
|
281
|
+
return redact(formatted);
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
return `Error tracing cross-file flow from "${action.filePath}": ${e.message || e}`;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
163
287
|
case 'check_guard': {
|
|
164
288
|
try {
|
|
165
289
|
const absPath = (0, files_1.resolveWorkspacePath)(ctx.workspaceRoot, action.filePath);
|
|
@@ -199,6 +323,36 @@ async function executeAction(action, ctx, runId, client, target) {
|
|
|
199
323
|
return `Error running check_policy: ${e.message || e}`;
|
|
200
324
|
}
|
|
201
325
|
}
|
|
326
|
+
case 'get_endpoints': {
|
|
327
|
+
try {
|
|
328
|
+
const endpoints = await (0, endpointDiscovery_1.discoverEndpoints)(ctx.workspaceRoot, action.glob);
|
|
329
|
+
return truncate((0, endpointDiscovery_1.formatEndpoints)(endpoints));
|
|
330
|
+
}
|
|
331
|
+
catch (e) {
|
|
332
|
+
return `Error discovering endpoints: ${e.message || e}`;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
case 'list_imports': {
|
|
336
|
+
try {
|
|
337
|
+
const imports = await (0, listImports_1.listImports)(ctx.workspaceRoot, action.filePath);
|
|
338
|
+
return truncate((0, listImports_1.formatImports)(imports, action.filePath));
|
|
339
|
+
}
|
|
340
|
+
catch (e) {
|
|
341
|
+
return `Error listing imports for "${action.filePath}": ${e.message || e}`;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
case 'list_files': {
|
|
345
|
+
try {
|
|
346
|
+
const files = (0, listFiles_1.listFiles)(ctx.workspaceRoot, {
|
|
347
|
+
dir: action.path,
|
|
348
|
+
glob: action.glob,
|
|
349
|
+
});
|
|
350
|
+
return truncate((0, listFiles_1.formatFileList)(files));
|
|
351
|
+
}
|
|
352
|
+
catch (e) {
|
|
353
|
+
return `Error listing files: ${e.message || e}`;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
202
356
|
case 'finish': {
|
|
203
357
|
// finish is handled by the loop, not the executor
|
|
204
358
|
return '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentScanExecutor.js","sourceRoot":"","sources":["../../src/attack/agentScanExecutor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agentScanExecutor.js","sourceRoot":"","sources":["../../src/attack/agentScanExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,8 +34,20 @@ async function runAgentScan(ctx, target, options = {}) {
|
|
|
34
34
|
let stepsTaken = 0;
|
|
35
35
|
let costSpentUsd = 0;
|
|
36
36
|
try {
|
|
37
|
-
const startResp = await client.postJson('/agent/scan/start', {});
|
|
37
|
+
const startResp = await client.postJson('/agent/scan/start', {}, options.signal);
|
|
38
38
|
const transcript = [];
|
|
39
|
+
const readFiles = new Set();
|
|
40
|
+
// Track read count per file path (case-insensitive) to prevent
|
|
41
|
+
// the agent re-reading the same file dozens of times with different
|
|
42
|
+
// line ranges, which wastes the entire step budget on one file.
|
|
43
|
+
const readFileCounts = new Map();
|
|
44
|
+
const MAX_READS_PER_FILE = 5;
|
|
45
|
+
// Track non-read tool calls to prevent the agent from looping on the
|
|
46
|
+
// same search_code/trace_flow call repeatedly. Keyed by (type + args).
|
|
47
|
+
const toolCallCounts = new Map();
|
|
48
|
+
const MAX_SAME_TOOL_CALL = 2;
|
|
49
|
+
let consecutiveErrors = 0;
|
|
50
|
+
let consecutiveBlockedReads = 0;
|
|
39
51
|
while (true) {
|
|
40
52
|
// Wall clock check
|
|
41
53
|
if (Date.now() - startTime > wallClockMs) {
|
|
@@ -69,8 +81,68 @@ async function runAgentScan(ctx, target, options = {}) {
|
|
|
69
81
|
costCapUsd: budget.costCapUsd,
|
|
70
82
|
},
|
|
71
83
|
};
|
|
72
|
-
|
|
84
|
+
let stepResp;
|
|
85
|
+
try {
|
|
86
|
+
stepResp = await client.postJson('/agent/scan/step', stepReq, options.signal);
|
|
87
|
+
}
|
|
88
|
+
catch (stepErr) {
|
|
89
|
+
const errMsg = stepErr?.message || String(stepErr);
|
|
90
|
+
const apiCode = stepErr?.apiCode || '';
|
|
91
|
+
// Detect API server restart — the run was lost. Don't waste
|
|
92
|
+
// 3 retry steps on a dead run; return immediately.
|
|
93
|
+
if (apiCode === 'AGENT_RUN_NOT_FOUND' || /AGENT_RUN_NOT_FOUND|Invalid or expired agent run/i.test(errMsg)) {
|
|
94
|
+
console.warn(`[Agent Scan Loop] Agent run expired (API server restarted?). Stopping scan.`);
|
|
95
|
+
return {
|
|
96
|
+
status: 'spawn_failed',
|
|
97
|
+
findings: [],
|
|
98
|
+
transcript,
|
|
99
|
+
stepsUsed: stepsTaken,
|
|
100
|
+
costSpentUsd,
|
|
101
|
+
error: 'API server restarted mid-scan — the run was lost. Please retry the scan.',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Detect abort — the user cancelled. Don't treat as error.
|
|
105
|
+
if (options.signal?.aborted || /aborted/i.test(errMsg)) {
|
|
106
|
+
return {
|
|
107
|
+
status: 'cancelled',
|
|
108
|
+
findings: [],
|
|
109
|
+
transcript,
|
|
110
|
+
stepsUsed: stepsTaken,
|
|
111
|
+
costSpentUsd,
|
|
112
|
+
summary: 'Cancelled by user.',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// The API rejected the action (malformed, missing field, etc).
|
|
116
|
+
// Add the error to the transcript so the LLM sees it on the
|
|
117
|
+
// next step and can correct itself. Then retry — don't waste
|
|
118
|
+
// the step silently.
|
|
119
|
+
console.warn(`[Agent Scan Loop] Step ${stepsTaken + 1} error: ${errMsg}`);
|
|
120
|
+
consecutiveErrors++;
|
|
121
|
+
stepsTaken++;
|
|
122
|
+
budget.stepsRemaining--;
|
|
123
|
+
// Push the error into the transcript so the LLM sees it
|
|
124
|
+
transcript.push({
|
|
125
|
+
action: {
|
|
126
|
+
type: 'read_file',
|
|
127
|
+
path: '__ERROR__',
|
|
128
|
+
rationale: 'Previous action was invalid',
|
|
129
|
+
},
|
|
130
|
+
observation: `ERROR: Your previous action was rejected: ${errMsg}. Please try a DIFFERENT action with ALL required fields. Set unused fields to null.`,
|
|
131
|
+
});
|
|
132
|
+
if (consecutiveErrors >= 3 || budget.stepsRemaining <= 0) {
|
|
133
|
+
return {
|
|
134
|
+
status: 'capped',
|
|
135
|
+
findings: [],
|
|
136
|
+
transcript,
|
|
137
|
+
stepsUsed: stepsTaken,
|
|
138
|
+
costSpentUsd,
|
|
139
|
+
summary: `Step budget exhausted after ${consecutiveErrors} consecutive API errors. Last error: ${errMsg}`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
73
144
|
costSpentUsd += stepResp.costUsd || 0;
|
|
145
|
+
consecutiveErrors = 0;
|
|
74
146
|
// Null next = done (cost capped or steps exhausted)
|
|
75
147
|
if (!stepResp.next) {
|
|
76
148
|
const status = stepResp.costCapped
|
|
@@ -107,7 +179,85 @@ async function runAgentScan(ctx, target, options = {}) {
|
|
|
107
179
|
};
|
|
108
180
|
}
|
|
109
181
|
// Execute the action locally
|
|
110
|
-
|
|
182
|
+
let observation;
|
|
183
|
+
let wasBlocked = false;
|
|
184
|
+
if (action.type === 'read_file') {
|
|
185
|
+
const normalizedPath = action.path.replace(/\\/g, '/').toLowerCase();
|
|
186
|
+
// Track by (path, startLine, endLine) — allow re-reading with different ranges
|
|
187
|
+
const rangeKey = `${normalizedPath}:${action.startLine || 0}:${action.endLine || 0}`;
|
|
188
|
+
if (readFiles.has(rangeKey)) {
|
|
189
|
+
observation = `File "${action.path}" (lines ${action.startLine || 'all'}-${action.endLine || 'all'}) was already read. The content is in the transcript above. Use a DIFFERENT line range or a different tool.`;
|
|
190
|
+
wasBlocked = true;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Per-file read cap: prevent the agent from re-reading the
|
|
194
|
+
// same file with slightly different line ranges dozens of
|
|
195
|
+
// times (observed 28 re-reads on one file). After 3 reads
|
|
196
|
+
// of any range, force the agent to use a different tool.
|
|
197
|
+
const count = (readFileCounts.get(normalizedPath) || 0) + 1;
|
|
198
|
+
if (count > MAX_READS_PER_FILE) {
|
|
199
|
+
observation = `BLOCKED: You have already read "${action.path}" ${MAX_READS_PER_FILE} times. Further read_file calls on this file will also be blocked. You MUST use a different tool (search_code, trace_flow, check_guard, check_policy, list_imports, or finish) to proceed.`;
|
|
200
|
+
wasBlocked = true;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
readFileCounts.set(normalizedPath, count);
|
|
204
|
+
readFiles.add(rangeKey);
|
|
205
|
+
observation = await (0, agentScanExecutor_1.executeAction)(action, ctx, startResp.runId, client, target);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// Dedup non-read tools: prevent the agent from calling the
|
|
211
|
+
// same search_code("foo") or trace_flow("bar.ts") repeatedly.
|
|
212
|
+
// Build a key from the action type + its primary argument.
|
|
213
|
+
let toolKey = '';
|
|
214
|
+
if (action.type === 'search_code') {
|
|
215
|
+
toolKey = `search_code:${action.pattern || ''}:${action.glob || ''}`;
|
|
216
|
+
}
|
|
217
|
+
else if (action.type === 'trace_flow' || action.type === 'trace_flow_cross_file') {
|
|
218
|
+
toolKey = `${action.type}:${action.filePath || ''}`;
|
|
219
|
+
}
|
|
220
|
+
else if (action.type === 'check_guard') {
|
|
221
|
+
toolKey = `check_guard:${action.guardName || ''}:${action.attackType || ''}`;
|
|
222
|
+
}
|
|
223
|
+
else if (action.type === 'check_policy') {
|
|
224
|
+
toolKey = `check_policy:${action.filePath || ''}`;
|
|
225
|
+
}
|
|
226
|
+
if (toolKey) {
|
|
227
|
+
const count = (toolCallCounts.get(toolKey) || 0) + 1;
|
|
228
|
+
toolCallCounts.set(toolKey, count);
|
|
229
|
+
if (count > MAX_SAME_TOOL_CALL) {
|
|
230
|
+
observation = `You have already called this exact tool with the same arguments ${MAX_SAME_TOOL_CALL} times. The result is in the transcript above. Use a DIFFERENT tool, different arguments, or call finish to report your findings.`;
|
|
231
|
+
wasBlocked = true;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
observation = await (0, agentScanExecutor_1.executeAction)(action, ctx, startResp.runId, client, target);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
observation = await (0, agentScanExecutor_1.executeAction)(action, ctx, startResp.runId, client, target);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Track consecutive blocked reads — if the agent keeps requesting
|
|
242
|
+
// read_file on blocked files, force-finish to stop wasting steps.
|
|
243
|
+
if (wasBlocked) {
|
|
244
|
+
consecutiveBlockedReads++;
|
|
245
|
+
if (consecutiveBlockedReads >= 5) {
|
|
246
|
+
console.warn(`[Agent Scan Loop] ${consecutiveBlockedReads} consecutive blocked reads — force-finishing to stop wasting steps.`);
|
|
247
|
+
transcript.push({ action, observation });
|
|
248
|
+
return {
|
|
249
|
+
status: 'completed',
|
|
250
|
+
findings: [],
|
|
251
|
+
transcript,
|
|
252
|
+
stepsUsed: stepsTaken,
|
|
253
|
+
costSpentUsd,
|
|
254
|
+
summary: `Investigation cut short — agent was stuck re-reading files. No findings reported.`,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
consecutiveBlockedReads = 0;
|
|
260
|
+
}
|
|
111
261
|
transcript.push({ action, observation });
|
|
112
262
|
}
|
|
113
263
|
}
|
|
@@ -127,8 +277,12 @@ function describeAction(action) {
|
|
|
127
277
|
case 'read_file': return `read_file(${action.path})`;
|
|
128
278
|
case 'search_code': return `search_code("${action.pattern}")`;
|
|
129
279
|
case 'trace_flow': return `trace_flow(${action.filePath})`;
|
|
280
|
+
case 'trace_flow_cross_file': return `trace_flow_cross_file(${action.filePath})`;
|
|
130
281
|
case 'check_guard': return `check_guard(${action.guardName})`;
|
|
131
282
|
case 'check_policy': return `check_policy(${action.filePath})`;
|
|
283
|
+
case 'get_endpoints': return `get_endpoints(${action.glob || 'all'})`;
|
|
284
|
+
case 'list_imports': return `list_imports(${action.filePath})`;
|
|
285
|
+
case 'list_files': return `list_files(${action.path || 'root'})`;
|
|
132
286
|
case 'finish': return 'finish';
|
|
133
287
|
}
|
|
134
288
|
}
|