@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.
Files changed (56) hide show
  1. package/README.md +107 -13
  2. package/dist/api/client.d.ts +1 -1
  3. package/dist/api/client.js +2 -1
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/attack/agentScanExecutor.js +159 -5
  6. package/dist/attack/agentScanExecutor.js.map +1 -1
  7. package/dist/attack/agentScanLoop.js +157 -3
  8. package/dist/attack/agentScanLoop.js.map +1 -1
  9. package/dist/attack/agentScanProtocol.d.ts +47 -5
  10. package/dist/attack/agentScanProtocol.js +3 -3
  11. package/dist/index.js +218 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp/server.js +62 -0
  14. package/dist/mcp/server.js.map +1 -1
  15. package/dist/mcp/tools.js +80 -3
  16. package/dist/mcp/tools.js.map +1 -1
  17. package/dist/project-map/agentMemory.d.ts +75 -0
  18. package/dist/project-map/agentMemory.js +230 -0
  19. package/dist/project-map/agentMemory.js.map +1 -0
  20. package/dist/project-map/crossFileTaintTracker.d.ts +51 -0
  21. package/dist/project-map/crossFileTaintTracker.js +429 -0
  22. package/dist/project-map/crossFileTaintTracker.js.map +1 -0
  23. package/dist/project-map/endpointDiscovery.d.ts +24 -0
  24. package/dist/project-map/endpointDiscovery.js +101 -0
  25. package/dist/project-map/endpointDiscovery.js.map +1 -0
  26. package/dist/project-map/guardEvaluator.js +37 -0
  27. package/dist/project-map/guardEvaluator.js.map +1 -1
  28. package/dist/project-map/guardPatterns.js +16 -5
  29. package/dist/project-map/guardPatterns.js.map +1 -1
  30. package/dist/project-map/sanitizers.js +10 -0
  31. package/dist/project-map/sanitizers.js.map +1 -1
  32. package/dist/project-map/scanCache.d.ts +67 -0
  33. package/dist/project-map/scanCache.js +169 -0
  34. package/dist/project-map/scanCache.js.map +1 -0
  35. package/dist/project-map/sinkRegistry.js +165 -0
  36. package/dist/project-map/sinkRegistry.js.map +1 -1
  37. package/dist/project-map/taintSources.d.ts +19 -1
  38. package/dist/project-map/taintSources.js +69 -2
  39. package/dist/project-map/taintSources.js.map +1 -1
  40. package/dist/project-map/taintTracker.d.ts +4 -1
  41. package/dist/project-map/taintTracker.js +188 -5
  42. package/dist/project-map/taintTracker.js.map +1 -1
  43. package/dist/tools/agentMemoryTools.d.ts +18 -0
  44. package/dist/tools/agentMemoryTools.js +107 -0
  45. package/dist/tools/agentMemoryTools.js.map +1 -0
  46. package/dist/tools/agentScan.js +206 -33
  47. package/dist/tools/agentScan.js.map +1 -1
  48. package/dist/utils/files.js +19 -2
  49. package/dist/utils/files.js.map +1 -1
  50. package/dist/utils/listFiles.d.ts +17 -0
  51. package/dist/utils/listFiles.js +126 -0
  52. package/dist/utils/listFiles.js.map +1 -0
  53. package/dist/utils/listImports.d.ts +15 -0
  54. package/dist/utils/listImports.js +164 -0
  55. package/dist/utils/listImports.js.map +1 -0
  56. 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
- ## Authenticate
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
- Enter your email, receive a 6-digit verification code, and paste it back. Your JWT is stored in the OS keychain (Windows Credential Manager, macOS Keychain, or Linux Secret Service). If the keychain is unavailable, it falls back to `~/.securecode/credentials.json` (mode 0600).
20
+ ## CLI Commands
18
21
 
19
- Alternatively, set the `SECURECODE_API_TOKEN` environment variable.
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
- ## CLI
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
@@ -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
  */
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
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 MAX_OBSERVATION_CHARS = 8000;
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 lines = content.split('\n').length;
119
- const numbered = content
120
- .split('\n')
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} (${lines} lines)\n\n${numbered}`);
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":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwKH,sCA8KC;AApVD,uCAAyB;AACzB,2CAA6B;AAG7B,0CAA6E;AAC7E,oDAAqE;AACrE,8DAAyD;AACzD,gFAA2E;AAC3E,kEAA8D;AAE9D,qCAAsC;AACtC,wEAAsF;AACtF,sDAAkE;AAClE,kDAA+D;AAQ/D,MAAM,qBAAqB,GAAG,KAAK,CAAC;AACpC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,SAAS,QAAQ,CAAC,IAAY;IAC1B,IAAI,IAAI,CAAC,MAAM,IAAI,qBAAqB;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,GAAG,iBAAiB,CAAC;AACpE,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IACxB,OAAO,QAAQ,CAAC,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACpC,MAAM,GAAG,GAAiC;QACtC,UAAU,EAAE,YAAY;QACxB,eAAe,EAAE,YAAY;QAC7B,UAAU,EAAE,YAAY;QACxB,eAAe,EAAE,KAAK;QACtB,MAAM,EAAE,QAAQ;KACnB,CAAC;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,YAAoB;IAC5D,mEAAmE;IACnE,mEAAmE;IACnE,MAAM,QAAQ,GAAG;QACb,IAAI,MAAM,CAAC,4CAA4C,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC;QAC1F,IAAI,MAAM,CAAC,wBAAwB,WAAW,CAAC,YAAY,CAAC,4BAA4B,CAAC;QACzF,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,YAAY,CAAC,+CAA+C,CAAC;KAC7F,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAM,CAAC;QAE9B,qBAAqB;QACrB,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,SAAS;QAEhC,4BAA4B;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBAC1B,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzB,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAAC,MAAM,GAAG,CAAC,CAAC;oBAAC,MAAM;gBAAC,CAAC;YAC3C,CAAC;QACL,CAAC;QACD,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAChB,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,OAAe;IAC9D,IAAI,CAAC;QACD,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,6BAA6B,GAAC,CAAC;QACpE,MAAM,EAAE,IAAI,EAAE,GAAG,wDAAa,2BAA2B,GAAC,CAAC;QAE3D,2BAA2B;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,OAAO,GAA2B;YACpC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY;YACvD,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ;SACxC,CAAC;QACF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,IAAW,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACxB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;YAC3B,sBAAsB,EAAE,4BAA4B;YACpD,mBAAmB,EAAE,yBAAyB;YAC9C,gBAAgB,EAAE,qBAAqB;YACvC,mBAAmB,EAAE,kBAAkB;SAC1C,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE7C,+DAA+D;YAC/D,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBAC1G,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACvD,MAAM;gBACV,CAAC;YACL,CAAC;YACD,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,SAAS,IAAI,OAAO,KAAK,SAAS,MAAM,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,gDAAgD;QAChD,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACzB,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBACvF,CAAC;qBAAM,CAAC;oBACJ,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;gBACtE,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,gFAAgF,CAAC,CAAC;QACjG,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QACvB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,aAAa,CAC/B,MAAuB,EACvB,GAAkB,EAClB,KAAa,EACb,MAAiB,EACjB,MAAuB;IAEvB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,WAAW,CAAC,CAAC,CAAC;YACf,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,IAAA,4BAAoB,EAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAEnC,wDAAwD;gBACxD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;oBACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;oBAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC;yBACzC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;yBACzC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,OAAO,MAAM,CAAC,SAAS,GAAG,WAAW,KAAK,IAAI,GAAG,OAAO,UAAU,QAAQ,OAAO,EAAE,CAAC,CAAC;gBACzF,CAAC;gBAED,gEAAgE;gBAChE,IAAI,UAAU,GAAG,oBAAoB,EAAE,CAAC;oBACpC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBACvD,IAAI,OAAO,EAAE,CAAC;wBACV,OAAO,MAAM,CAAC,SAAS,GAAG,KAAK,UAAU,8JAA8J,OAAO,EAAE,CAAC,CAAC;oBACtN,CAAC;gBACL,CAAC;gBAED,oDAAoD;gBACpD,MAAM,QAAQ,GAAG,QAAQ;qBACpB,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;qBACrC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChB,OAAO,MAAM,CAAC,SAAS,GAAG,KAAK,UAAU,cAAc,QAAQ,EAAE,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,uBAAuB,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YACpE,CAAC;QACL,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,IAAA,uBAAU,EAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAChF,OAAO,MAAM,CAAC,IAAA,+BAAkB,EAAC,MAAM,CAAC,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,wBAAwB,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YACxE,CAAC;QACL,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,IAAA,4BAAoB,EAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,6BAAqB,EAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC/E,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACZ,OAAO,4CAA4C,QAAQ,EAAE,CAAC;gBAClE,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAU,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,2BAA2B,MAAM,CAAC,QAAQ,GAAG,CAAC;gBACzD,CAAC;gBACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe;yBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;yBACzD,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,OAAO,GAAG,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;gBACnJ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,0BAA0B,MAAM,CAAC,QAAQ,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YAC3E,CAAC;QACL,CAAC;QAED,KAAK,uBAAuB,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,IAAA,2CAAmB,EAAC;oBACtC,aAAa,EAAE,GAAG,CAAC,aAAa;oBAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAG,MAAc,CAAC,QAAQ,IAAI,CAAC;iBAC1C,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,iDAAiD,MAAM,CAAC,QAAQ,GAAG,CAAC;gBAC/E,CAAC;gBACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,cAAc;yBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;yBAClE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,OAAO,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,aAAa,MAAM,IAAI,EAAE,CAAC;gBACnI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,uCAAuC,MAAM,CAAC,QAAQ,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YACxF,CAAC;QACL,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,IAAA,4BAAoB,EAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClE,IAAI,CAAC,WAAW,EAAE,CAAC;oBACf,OAAO,mBAAmB,MAAM,CAAC,SAAS,kBAAkB,MAAM,CAAC,QAAQ,+CAA+C,CAAC;gBAC/H,CAAC;gBACD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,6BAAqB,EAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC/E,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACZ,OAAO,8CAA8C,QAAQ,EAAE,CAAC;gBACpE,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAa,EAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC/F,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC;gBACtE,IAAI,MAAM,GAAG,UAAU,MAAM,CAAC,SAAS,QAAQ,MAAM,CAAC,UAAU,KAAK,YAAY,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC9G,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;oBACvB,MAAM,IAAI,aAAa,MAAM,CAAC,aAAa,EAAE,CAAC;gBAClD,CAAC;gBACD,OAAO,MAAM,CAAC;YAClB,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,2BAA2B,MAAM,CAAC,SAAS,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YAC7E,CAAC;QACL,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC;gBACD,MAAM,OAAO,GAAyB;oBAClC,KAAK;oBACL,MAAM;oBACN,MAAM;iBACT,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAwB,kBAAkB,EAAE,OAAO,CAAC,CAAC;gBACvF,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,+BAA+B,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YAC3D,CAAC;QACL,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,IAAA,qCAAiB,EAAC,GAAG,CAAC,aAAa,EAAG,MAAc,CAAC,IAAI,CAAC,CAAC;gBACnF,OAAO,QAAQ,CAAC,IAAA,mCAAe,EAAC,SAAS,CAAC,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,gCAAgC,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YAC5D,CAAC;QACL,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,IAAA,yBAAW,EAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtE,OAAO,QAAQ,CAAC,IAAA,2BAAa,EAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,8BAA8B,MAAM,CAAC,QAAQ,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YAC/E,CAAC;QACL,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC;gBACD,MAAM,KAAK,GAAG,IAAA,qBAAS,EAAC,GAAG,CAAC,aAAa,EAAE;oBACvC,GAAG,EAAG,MAAc,CAAC,IAAI;oBACzB,IAAI,EAAG,MAAc,CAAC,IAAI;iBAC7B,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC,IAAA,0BAAc,EAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,OAAO,wBAAwB,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YACpD,CAAC;QACL,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,kDAAkD;YAClD,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -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
- const stepResp = await client.postJson('/agent/scan/step', stepReq);
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
- const observation = await (0, agentScanExecutor_1.executeAction)(action, ctx, startResp.runId, client, target);
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
  }