@neurcode-ai/cli 0.3.9 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-client.d.ts +105 -17
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +388 -85
- package/dist/api-client.js.map +1 -1
- package/dist/commands/allow.d.ts.map +1 -1
- package/dist/commands/allow.js +6 -33
- package/dist/commands/allow.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +56 -13
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +134 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +365 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +209 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +70 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +210 -57
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/prompt.d.ts +6 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +254 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/revert.d.ts.map +1 -1
- package/dist/commands/revert.js +10 -0
- package/dist/commands/revert.js.map +1 -1
- package/dist/commands/session.d.ts +29 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +382 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +132 -15
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/watch.d.ts +8 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +78 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.d.ts +29 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +186 -21
- package/dist/config.js.map +1 -1
- package/dist/index.js +120 -3
- package/dist/index.js.map +1 -1
- package/dist/services/integrations/TicketService.d.ts +68 -0
- package/dist/services/integrations/TicketService.d.ts.map +1 -0
- package/dist/services/integrations/TicketService.js +151 -0
- package/dist/services/integrations/TicketService.js.map +1 -0
- package/dist/services/security/SecurityGuard.d.ts +80 -0
- package/dist/services/security/SecurityGuard.d.ts.map +1 -0
- package/dist/services/security/SecurityGuard.js +410 -0
- package/dist/services/security/SecurityGuard.js.map +1 -0
- package/dist/services/watch/BlobStore.d.ts +33 -0
- package/dist/services/watch/BlobStore.d.ts.map +1 -0
- package/dist/services/watch/BlobStore.js +108 -0
- package/dist/services/watch/BlobStore.js.map +1 -0
- package/dist/services/watch/CommandPoller.d.ts +76 -0
- package/dist/services/watch/CommandPoller.d.ts.map +1 -0
- package/dist/services/watch/CommandPoller.js +298 -0
- package/dist/services/watch/CommandPoller.js.map +1 -0
- package/dist/services/watch/Journal.d.ts +58 -0
- package/dist/services/watch/Journal.d.ts.map +1 -0
- package/dist/services/watch/Journal.js +144 -0
- package/dist/services/watch/Journal.js.map +1 -0
- package/dist/services/watch/Sentinel.d.ts +49 -0
- package/dist/services/watch/Sentinel.d.ts.map +1 -0
- package/dist/services/watch/Sentinel.js +205 -0
- package/dist/services/watch/Sentinel.js.map +1 -0
- package/dist/services/watch/Syncer.d.ts +55 -0
- package/dist/services/watch/Syncer.d.ts.map +1 -0
- package/dist/services/watch/Syncer.js +231 -0
- package/dist/services/watch/Syncer.js.map +1 -0
- package/dist/utils/ROILogger.d.ts +16 -0
- package/dist/utils/ROILogger.d.ts.map +1 -0
- package/dist/utils/ROILogger.js +45 -0
- package/dist/utils/ROILogger.js.map +1 -0
- package/dist/utils/box.d.ts +16 -0
- package/dist/utils/box.d.ts.map +1 -0
- package/dist/utils/box.js +85 -0
- package/dist/utils/box.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +34 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/messages.d.ts +81 -0
- package/dist/utils/messages.d.ts.map +1 -0
- package/dist/utils/messages.js +306 -0
- package/dist/utils/messages.js.map +1 -0
- package/dist/utils/restore.d.ts +14 -0
- package/dist/utils/restore.d.ts.map +1 -0
- package/dist/utils/restore.js +89 -0
- package/dist/utils/restore.js.map +1 -0
- package/dist/utils/state.d.ts +69 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +151 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/user-context.d.ts +28 -0
- package/dist/utils/user-context.d.ts.map +1 -0
- package/dist/utils/user-context.js +68 -0
- package/dist/utils/user-context.js.map +1 -0
- package/package.json +11 -4
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security Guard - Shadow AI Shield
|
|
4
|
+
*
|
|
5
|
+
* Local privacy scanner that runs before any API call to detect and mask secrets.
|
|
6
|
+
* Uses regex patterns and AST analysis (via ts-morph) to identify sensitive data.
|
|
7
|
+
* Also includes hallucination detection for phantom packages.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SecurityGuard = void 0;
|
|
11
|
+
const ts_morph_1 = require("ts-morph");
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path_1 = require("path");
|
|
14
|
+
/**
|
|
15
|
+
* Security Guard for local secret detection and hallucination detection
|
|
16
|
+
*/
|
|
17
|
+
class SecurityGuard {
|
|
18
|
+
REDACTION_PLACEHOLDER = '[REDACTED_BY_NEURCODE]';
|
|
19
|
+
// High-performance regex patterns for common secrets
|
|
20
|
+
patterns = {
|
|
21
|
+
// AWS Access Keys (AKIA followed by 16 base32 characters)
|
|
22
|
+
aws_key: /\bAKIA[0-9A-Z]{16}\b/g,
|
|
23
|
+
// Bearer tokens / API keys (common patterns)
|
|
24
|
+
bearer_token: /\b(bearer|token|apikey)\s*[:=]\s*['"]?([a-zA-Z0-9_\-]{32,})['"]?/gi,
|
|
25
|
+
// GitHub tokens (ghp_, gho_, ghu_, ghs_, ghr_)
|
|
26
|
+
github_token: /\b(ghp|gho|ghu|ghs|ghr)_[a-zA-Z0-9]{36,}\b/g,
|
|
27
|
+
// Generic high-entropy strings labeled as secrets
|
|
28
|
+
generic_secret: /\b(password|secret|key|token|api[_-]?key|private[_-]?key)\s*[:=]\s*['"]?([a-zA-Z0-9_\-+/=]{20,})['"]?/gi,
|
|
29
|
+
};
|
|
30
|
+
// Variable names that suggest secrets (case-insensitive)
|
|
31
|
+
sensitiveVarNames = [
|
|
32
|
+
/api[_-]?key/i,
|
|
33
|
+
/secret/i,
|
|
34
|
+
/password/i,
|
|
35
|
+
/token/i,
|
|
36
|
+
/private[_-]?key/i,
|
|
37
|
+
/access[_-]?token/i,
|
|
38
|
+
/auth[_-]?token/i,
|
|
39
|
+
];
|
|
40
|
+
// Safe list of common packages and standard library modules
|
|
41
|
+
// Using Set for O(1) lookup performance
|
|
42
|
+
safePackageList = new Set([
|
|
43
|
+
// Standard Node.js modules
|
|
44
|
+
'fs', 'path', 'os', 'crypto', 'http', 'https', 'url', 'util', 'events', 'stream',
|
|
45
|
+
'buffer', 'process', 'child_process', 'cluster', 'dgram', 'dns', 'net', 'readline',
|
|
46
|
+
'repl', 'tls', 'tty', 'vm', 'zlib', 'assert', 'querystring', 'string_decoder',
|
|
47
|
+
'timers', 'punycode', 'v8', 'worker_threads', 'perf_hooks', 'async_hooks',
|
|
48
|
+
'inspector', 'module', 'console', 'domain', 'constants',
|
|
49
|
+
// Common npm packages (top 100 most popular)
|
|
50
|
+
'react', 'react-dom', 'lodash', 'express', 'axios', 'moment', 'vue', 'angular',
|
|
51
|
+
'typescript', 'webpack', 'babel', 'jest', 'mocha', 'chai', 'sinon', 'eslint',
|
|
52
|
+
'prettier', 'next', 'gatsby', 'nuxt', 'svelte', 'rxjs', 'redux', 'mobx',
|
|
53
|
+
'styled-components', 'emotion', 'tailwindcss', 'bootstrap', 'material-ui',
|
|
54
|
+
'@mui/material', '@mui/icons-material', 'antd', 'semantic-ui', 'chakra-ui',
|
|
55
|
+
'node-fetch', 'got', 'request', 'superagent', 'cheerio', 'puppeteer', 'playwright',
|
|
56
|
+
'mongoose', 'sequelize', 'typeorm', 'prisma', 'knex', 'pg', 'mysql2', 'sqlite3',
|
|
57
|
+
'redis', 'ioredis', 'ws', 'socket.io', 'graphql', 'apollo', 'relay',
|
|
58
|
+
'dotenv', 'cross-env', 'nodemon', 'pm2', 'forever', 'concurrently',
|
|
59
|
+
'uuid', 'nanoid', 'crypto-js', 'bcrypt', 'jsonwebtoken', 'passport',
|
|
60
|
+
'winston', 'morgan', 'pino', 'debug', 'chalk', 'colors', 'commander',
|
|
61
|
+
'yargs', 'inquirer', 'ora', 'listr', 'glob', 'minimist', 'dot-prop',
|
|
62
|
+
'fast-glob', 'micromatch', 'rimraf', 'mkdirp', 'fs-extra', 'graceful-fs',
|
|
63
|
+
'chokidar', 'watchman', 'nodemailer', 'handlebars', 'ejs', 'pug', 'mustache',
|
|
64
|
+
'marked', 'highlight.js', 'prismjs', 'showdown', 'remark', 'rehype',
|
|
65
|
+
]);
|
|
66
|
+
/**
|
|
67
|
+
* Scan text content for secrets using regex patterns
|
|
68
|
+
*/
|
|
69
|
+
scanText(text, location = 'text') {
|
|
70
|
+
const detections = [];
|
|
71
|
+
// Check AWS keys
|
|
72
|
+
const awsMatches = text.match(this.patterns.aws_key);
|
|
73
|
+
if (awsMatches) {
|
|
74
|
+
awsMatches.forEach(match => {
|
|
75
|
+
detections.push({
|
|
76
|
+
type: 'aws_key',
|
|
77
|
+
severity: 'high',
|
|
78
|
+
location,
|
|
79
|
+
pattern: match,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// Check GitHub tokens
|
|
84
|
+
const githubMatches = text.match(this.patterns.github_token);
|
|
85
|
+
if (githubMatches) {
|
|
86
|
+
githubMatches.forEach(match => {
|
|
87
|
+
detections.push({
|
|
88
|
+
type: 'github_token',
|
|
89
|
+
severity: 'high',
|
|
90
|
+
location,
|
|
91
|
+
pattern: match,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Check bearer tokens and generic secrets
|
|
96
|
+
const bearerMatches = Array.from(text.matchAll(this.patterns.bearer_token));
|
|
97
|
+
bearerMatches.forEach(match => {
|
|
98
|
+
if (match[2] && match[2].length >= 32) {
|
|
99
|
+
detections.push({
|
|
100
|
+
type: 'bearer_token',
|
|
101
|
+
severity: 'high',
|
|
102
|
+
location,
|
|
103
|
+
pattern: match[0],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
const genericMatches = Array.from(text.matchAll(this.patterns.generic_secret));
|
|
108
|
+
genericMatches.forEach(match => {
|
|
109
|
+
if (match[2] && match[2].length >= 20) {
|
|
110
|
+
detections.push({
|
|
111
|
+
type: 'generic_secret',
|
|
112
|
+
severity: match[1]?.toLowerCase().includes('password') ? 'high' : 'medium',
|
|
113
|
+
location,
|
|
114
|
+
pattern: match[0],
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return detections;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Extract package names from import/require statements
|
|
122
|
+
* Returns array of { packageName, importStatement }
|
|
123
|
+
*/
|
|
124
|
+
extractPackageImports(code) {
|
|
125
|
+
const imports = [];
|
|
126
|
+
// Pattern 1: ES6 import statements
|
|
127
|
+
// import x from 'package'
|
|
128
|
+
// import { x } from 'package'
|
|
129
|
+
// import * as x from 'package'
|
|
130
|
+
// import 'package'
|
|
131
|
+
const es6ImportPattern = /import\s+(?:(?:\*\s+as\s+\w+)|(?:\{[^}]*\})|(?:\w+)|(?:\w+\s*,\s*\{[^}]*\}))\s+from\s+['"]([^'"]+)['"]/g;
|
|
132
|
+
// Also catch: import 'package' (side-effect imports)
|
|
133
|
+
const sideEffectImportPattern = /import\s+['"]([^'"]+)['"]/g;
|
|
134
|
+
// Pattern 2: CommonJS require
|
|
135
|
+
// const x = require('package')
|
|
136
|
+
// require('package')
|
|
137
|
+
const requirePattern = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
|
|
138
|
+
// Extract ES6 imports
|
|
139
|
+
let match;
|
|
140
|
+
while ((match = es6ImportPattern.exec(code)) !== null) {
|
|
141
|
+
const packageName = match[1];
|
|
142
|
+
if (packageName && !packageName.startsWith('.') && !packageName.startsWith('/')) {
|
|
143
|
+
imports.push({ packageName, importStatement: match[0] });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Extract side-effect imports
|
|
147
|
+
while ((match = sideEffectImportPattern.exec(code)) !== null) {
|
|
148
|
+
const packageName = match[1];
|
|
149
|
+
if (packageName && !packageName.startsWith('.') && !packageName.startsWith('/')) {
|
|
150
|
+
// Avoid duplicates
|
|
151
|
+
const importStatement = match[0];
|
|
152
|
+
if (!imports.some(imp => imp.importStatement === importStatement)) {
|
|
153
|
+
imports.push({ packageName, importStatement });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Extract require statements
|
|
158
|
+
while ((match = requirePattern.exec(code)) !== null) {
|
|
159
|
+
const packageName = match[1];
|
|
160
|
+
if (packageName && !packageName.startsWith('.') && !packageName.startsWith('/')) {
|
|
161
|
+
imports.push({ packageName, importStatement: match[0] });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return imports;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Load package.json dependencies from project root
|
|
168
|
+
*/
|
|
169
|
+
loadProjectDependencies(rootDir = process.cwd()) {
|
|
170
|
+
const packageJsonPath = (0, path_1.join)(rootDir, 'package.json');
|
|
171
|
+
const dependencies = new Set();
|
|
172
|
+
if (!(0, fs_1.existsSync)(packageJsonPath)) {
|
|
173
|
+
return dependencies;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const packageJson = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, 'utf-8'));
|
|
177
|
+
// Add dependencies
|
|
178
|
+
if (packageJson.dependencies && typeof packageJson.dependencies === 'object') {
|
|
179
|
+
Object.keys(packageJson.dependencies).forEach(pkg => dependencies.add(pkg));
|
|
180
|
+
}
|
|
181
|
+
// Add devDependencies
|
|
182
|
+
if (packageJson.devDependencies && typeof packageJson.devDependencies === 'object') {
|
|
183
|
+
Object.keys(packageJson.devDependencies).forEach(pkg => dependencies.add(pkg));
|
|
184
|
+
}
|
|
185
|
+
// Add peerDependencies
|
|
186
|
+
if (packageJson.peerDependencies && typeof packageJson.peerDependencies === 'object') {
|
|
187
|
+
Object.keys(packageJson.peerDependencies).forEach(pkg => dependencies.add(pkg));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
// If package.json can't be read or parsed, return empty set
|
|
192
|
+
// This is non-fatal - we'll just rely on safe list
|
|
193
|
+
}
|
|
194
|
+
return dependencies;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Scan code for hallucinated packages (phantom packages)
|
|
198
|
+
* Checks against safe list and project's package.json
|
|
199
|
+
*/
|
|
200
|
+
async scanForHallucinations(code, location = 'code', rootDir = process.cwd()) {
|
|
201
|
+
const hallucinations = [];
|
|
202
|
+
// Extract all package imports
|
|
203
|
+
const imports = this.extractPackageImports(code);
|
|
204
|
+
if (imports.length === 0) {
|
|
205
|
+
return {
|
|
206
|
+
hallucinations: [],
|
|
207
|
+
hasHallucinations: false,
|
|
208
|
+
blocked: false,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// Load project dependencies
|
|
212
|
+
const projectDependencies = this.loadProjectDependencies(rootDir);
|
|
213
|
+
// Check each import
|
|
214
|
+
for (const { packageName, importStatement } of imports) {
|
|
215
|
+
// Skip scoped packages that might be local (e.g., @company/utils)
|
|
216
|
+
// We'll be conservative and only flag obvious non-existent packages
|
|
217
|
+
// Check if package is in safe list
|
|
218
|
+
if (this.safePackageList.has(packageName)) {
|
|
219
|
+
continue; // Safe package, skip
|
|
220
|
+
}
|
|
221
|
+
// Check if package is in project dependencies
|
|
222
|
+
if (projectDependencies.has(packageName)) {
|
|
223
|
+
continue; // Package exists in project, skip
|
|
224
|
+
}
|
|
225
|
+
// Check for scoped packages - if it starts with @, check if the scope exists
|
|
226
|
+
// For now, we'll flag scoped packages that aren't in dependencies as potential hallucinations
|
|
227
|
+
// This is conservative but catches common AI hallucinations like @non-existent/package
|
|
228
|
+
if (packageName.startsWith('@')) {
|
|
229
|
+
// Scoped package - check if it's in dependencies
|
|
230
|
+
if (!projectDependencies.has(packageName)) {
|
|
231
|
+
// Potential hallucination
|
|
232
|
+
hallucinations.push({
|
|
233
|
+
packageName,
|
|
234
|
+
location,
|
|
235
|
+
importStatement,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// Non-scoped package not in safe list or dependencies - likely hallucination
|
|
241
|
+
hallucinations.push({
|
|
242
|
+
packageName,
|
|
243
|
+
location,
|
|
244
|
+
importStatement,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
hallucinations,
|
|
250
|
+
hasHallucinations: hallucinations.length > 0,
|
|
251
|
+
blocked: hallucinations.length > 0, // Block if any hallucinations detected
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Scan TypeScript/JavaScript files using AST analysis
|
|
256
|
+
*/
|
|
257
|
+
async scanFile(filePath, rootDir = process.cwd()) {
|
|
258
|
+
const detections = [];
|
|
259
|
+
const fullPath = (0, path_1.resolve)(rootDir, filePath);
|
|
260
|
+
// Check if file exists and is a .ts or .js file
|
|
261
|
+
if (!(0, fs_1.existsSync)(fullPath)) {
|
|
262
|
+
return detections;
|
|
263
|
+
}
|
|
264
|
+
const ext = filePath.split('.').pop()?.toLowerCase();
|
|
265
|
+
if (ext !== 'ts' && ext !== 'js' && ext !== 'tsx' && ext !== 'jsx') {
|
|
266
|
+
// For non-TS/JS files, use regex scanning
|
|
267
|
+
try {
|
|
268
|
+
const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
|
|
269
|
+
return this.scanText(content, filePath);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return detections;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
// Use ts-morph for AST analysis
|
|
277
|
+
const project = new ts_morph_1.Project({
|
|
278
|
+
skipAddingFilesFromTsConfig: true,
|
|
279
|
+
skipFileDependencyResolution: true,
|
|
280
|
+
});
|
|
281
|
+
const sourceFile = project.addSourceFileAtPath(fullPath);
|
|
282
|
+
// Scan for variable declarations with sensitive names
|
|
283
|
+
sourceFile.getVariableDeclarations().forEach(variable => {
|
|
284
|
+
const name = variable.getName();
|
|
285
|
+
const initializer = variable.getInitializer();
|
|
286
|
+
// Check if variable name suggests a secret
|
|
287
|
+
const isSensitive = this.sensitiveVarNames.some(pattern => pattern.test(name));
|
|
288
|
+
if (isSensitive && initializer) {
|
|
289
|
+
// Check if initializer is a string literal
|
|
290
|
+
const kind = initializer.getKindName();
|
|
291
|
+
if (kind === 'StringLiteral' || kind === 'NoSubstitutionTemplateLiteral') {
|
|
292
|
+
const text = initializer.getText().replace(/['"`]/g, '');
|
|
293
|
+
// Check if the value looks like a secret (high entropy)
|
|
294
|
+
if (text.length >= 20 && /[a-zA-Z0-9_\-+/=]{20,}/.test(text)) {
|
|
295
|
+
detections.push({
|
|
296
|
+
type: 'ast_literal',
|
|
297
|
+
severity: 'high',
|
|
298
|
+
location: filePath,
|
|
299
|
+
pattern: `${name} = ${initializer.getText()}`,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
// Also run regex scanning as fallback
|
|
306
|
+
const content = sourceFile.getFullText();
|
|
307
|
+
const regexDetections = this.scanText(content, filePath);
|
|
308
|
+
detections.push(...regexDetections);
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
// If AST parsing fails, fall back to regex scanning
|
|
312
|
+
try {
|
|
313
|
+
const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
|
|
314
|
+
return this.scanText(content, filePath);
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
// File cannot be read, return empty
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return detections;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Scan multiple files
|
|
324
|
+
*/
|
|
325
|
+
async scanFiles(filePaths, rootDir = process.cwd()) {
|
|
326
|
+
const allDetections = [];
|
|
327
|
+
for (const filePath of filePaths) {
|
|
328
|
+
const detections = await this.scanFile(filePath, rootDir);
|
|
329
|
+
allDetections.push(...detections);
|
|
330
|
+
}
|
|
331
|
+
return {
|
|
332
|
+
secrets: allDetections,
|
|
333
|
+
hasSecrets: allDetections.length > 0,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Scan intent string for secrets
|
|
338
|
+
*/
|
|
339
|
+
scanIntent(intent) {
|
|
340
|
+
const detections = this.scanText(intent, 'intent');
|
|
341
|
+
return {
|
|
342
|
+
secrets: detections,
|
|
343
|
+
hasSecrets: detections.length > 0,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Mask secrets in text
|
|
348
|
+
*/
|
|
349
|
+
maskSecrets(text, detections) {
|
|
350
|
+
let maskedText = text;
|
|
351
|
+
// Sort detections by pattern length (longest first) to avoid partial replacements
|
|
352
|
+
const sortedDetections = [...detections].sort((a, b) => b.pattern.length - a.pattern.length);
|
|
353
|
+
for (const detection of sortedDetections) {
|
|
354
|
+
// Escape special regex characters in the pattern
|
|
355
|
+
const escapedPattern = detection.pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
356
|
+
const regex = new RegExp(escapedPattern, 'g');
|
|
357
|
+
maskedText = maskedText.replace(regex, this.REDACTION_PLACEHOLDER);
|
|
358
|
+
}
|
|
359
|
+
return maskedText;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Complete scan with masking
|
|
363
|
+
*/
|
|
364
|
+
async scanAndMask(intent, filePaths, rootDir = process.cwd()) {
|
|
365
|
+
const intentResult = this.scanIntent(intent);
|
|
366
|
+
const filesResult = await this.scanFiles(filePaths, rootDir);
|
|
367
|
+
const allDetections = [...intentResult.secrets, ...filesResult.secrets];
|
|
368
|
+
const hasSecrets = allDetections.length > 0;
|
|
369
|
+
let maskedIntent;
|
|
370
|
+
let maskedFiles;
|
|
371
|
+
if (hasSecrets) {
|
|
372
|
+
// Mask intent
|
|
373
|
+
if (intentResult.hasSecrets) {
|
|
374
|
+
maskedIntent = this.maskSecrets(intent, intentResult.secrets);
|
|
375
|
+
}
|
|
376
|
+
// Mask files
|
|
377
|
+
if (filesResult.hasSecrets) {
|
|
378
|
+
maskedFiles = new Map();
|
|
379
|
+
const fileDetections = new Map();
|
|
380
|
+
// Group detections by file
|
|
381
|
+
for (const detection of filesResult.secrets) {
|
|
382
|
+
if (detection.location !== 'intent') {
|
|
383
|
+
const fileDetectionsList = fileDetections.get(detection.location) || [];
|
|
384
|
+
fileDetectionsList.push(detection);
|
|
385
|
+
fileDetections.set(detection.location, fileDetectionsList);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
// Mask each file
|
|
389
|
+
for (const [filePath, detections] of fileDetections.entries()) {
|
|
390
|
+
try {
|
|
391
|
+
const content = (0, fs_1.readFileSync)((0, path_1.resolve)(rootDir, filePath), 'utf-8');
|
|
392
|
+
const masked = this.maskSecrets(content, detections);
|
|
393
|
+
maskedFiles.set(filePath, masked);
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
// Skip files that can't be read
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
secrets: allDetections,
|
|
403
|
+
hasSecrets,
|
|
404
|
+
maskedIntent,
|
|
405
|
+
maskedFiles,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
exports.SecurityGuard = SecurityGuard;
|
|
410
|
+
//# sourceMappingURL=SecurityGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityGuard.js","sourceRoot":"","sources":["../../../src/services/security/SecurityGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BlobStore - Content-Addressable Storage for file content
|
|
3
|
+
*
|
|
4
|
+
* Stores compressed file content in .neurcode/blobs/ directory.
|
|
5
|
+
* Filename is the SHA-256 hash of the content.
|
|
6
|
+
*/
|
|
7
|
+
export declare class BlobStore {
|
|
8
|
+
private readonly blobsDir;
|
|
9
|
+
constructor(projectRoot: string);
|
|
10
|
+
/**
|
|
11
|
+
* Initialize the blob store directory
|
|
12
|
+
*/
|
|
13
|
+
initialize(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Store content and return its hash
|
|
16
|
+
* @param content - The file content to store
|
|
17
|
+
* @returns The SHA-256 hash of the content
|
|
18
|
+
*/
|
|
19
|
+
store(content: string): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a blob exists by hash
|
|
22
|
+
* @param hash - The SHA-256 hash
|
|
23
|
+
* @returns True if the blob exists
|
|
24
|
+
*/
|
|
25
|
+
exists(hash: string): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Get the path to a blob by hash
|
|
28
|
+
* @param hash - The SHA-256 hash
|
|
29
|
+
* @returns The full path to the blob file
|
|
30
|
+
*/
|
|
31
|
+
getBlobPath(hash: string): string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=BlobStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlobStore.d.ts","sourceRoot":"","sources":["../../../src/services/watch/BlobStore.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB7C;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAGlC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BlobStore = void 0;
|
|
37
|
+
const crypto_1 = require("crypto");
|
|
38
|
+
const zlib_1 = require("zlib");
|
|
39
|
+
const fs_1 = require("fs");
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const fsExtra = __importStar(require("fs-extra"));
|
|
42
|
+
/**
|
|
43
|
+
* BlobStore - Content-Addressable Storage for file content
|
|
44
|
+
*
|
|
45
|
+
* Stores compressed file content in .neurcode/blobs/ directory.
|
|
46
|
+
* Filename is the SHA-256 hash of the content.
|
|
47
|
+
*/
|
|
48
|
+
class BlobStore {
|
|
49
|
+
blobsDir;
|
|
50
|
+
constructor(projectRoot) {
|
|
51
|
+
this.blobsDir = path.join(projectRoot, '.neurcode', 'blobs');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Initialize the blob store directory
|
|
55
|
+
*/
|
|
56
|
+
async initialize() {
|
|
57
|
+
await fsExtra.ensureDir(this.blobsDir);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Store content and return its hash
|
|
61
|
+
* @param content - The file content to store
|
|
62
|
+
* @returns The SHA-256 hash of the content
|
|
63
|
+
*/
|
|
64
|
+
async store(content) {
|
|
65
|
+
// Compute SHA-256 hash
|
|
66
|
+
const hash = (0, crypto_1.createHash)('sha256').update(content, 'utf8').digest('hex');
|
|
67
|
+
const blobPath = path.join(this.blobsDir, hash);
|
|
68
|
+
// Check if blob already exists
|
|
69
|
+
try {
|
|
70
|
+
await fs_1.promises.access(blobPath);
|
|
71
|
+
// Blob already exists, return hash
|
|
72
|
+
return hash;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Blob doesn't exist, create it
|
|
76
|
+
}
|
|
77
|
+
// Compress content with GZIP
|
|
78
|
+
const compressed = (0, zlib_1.gzipSync)(Buffer.from(content, 'utf8'));
|
|
79
|
+
// Write compressed content to disk
|
|
80
|
+
await fs_1.promises.writeFile(blobPath, compressed);
|
|
81
|
+
return hash;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if a blob exists by hash
|
|
85
|
+
* @param hash - The SHA-256 hash
|
|
86
|
+
* @returns True if the blob exists
|
|
87
|
+
*/
|
|
88
|
+
async exists(hash) {
|
|
89
|
+
const blobPath = path.join(this.blobsDir, hash);
|
|
90
|
+
try {
|
|
91
|
+
await fs_1.promises.access(blobPath);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the path to a blob by hash
|
|
100
|
+
* @param hash - The SHA-256 hash
|
|
101
|
+
* @returns The full path to the blob file
|
|
102
|
+
*/
|
|
103
|
+
getBlobPath(hash) {
|
|
104
|
+
return path.join(this.blobsDir, hash);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.BlobStore = BlobStore;
|
|
108
|
+
//# sourceMappingURL=BlobStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlobStore.js","sourceRoot":"","sources":["../../../src/services/watch/BlobStore.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAoC;AACpC,+BAAgC;AAChC,2BAAoC;AACpC,2CAA6B;AAC7B,kDAAoC;AAEpC;;;;;GAKG;AACH,MAAa,SAAS;IACH,QAAQ,CAAS;IAElC,YAAY,WAAmB;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,uBAAuB;QACvB,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhD,+BAA+B;QAC/B,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,mCAAmC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;QAED,6BAA6B;QAC7B,MAAM,UAAU,GAAG,IAAA,eAAQ,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAE1D,mCAAmC;QACnC,MAAM,aAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;CACF;AAjED,8BAiEC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommandPoller - Polls for remote commands and executes them locally
|
|
3
|
+
*
|
|
4
|
+
* Polls the cloud API every 3 seconds for pending commands (like file reverts).
|
|
5
|
+
* When a command is received, executes it locally and updates the status.
|
|
6
|
+
*/
|
|
7
|
+
export interface Command {
|
|
8
|
+
id: string;
|
|
9
|
+
userId: string;
|
|
10
|
+
organizationId: string;
|
|
11
|
+
type: string;
|
|
12
|
+
payload: {
|
|
13
|
+
filePath: string;
|
|
14
|
+
blobHash: string;
|
|
15
|
+
};
|
|
16
|
+
status: string;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PollResponse {
|
|
21
|
+
command: Command | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* CommandPoller - Handles polling and execution of remote commands
|
|
25
|
+
*/
|
|
26
|
+
export declare class CommandPoller {
|
|
27
|
+
private apiUrl;
|
|
28
|
+
private apiKey;
|
|
29
|
+
private projectRoot;
|
|
30
|
+
private pollInterval;
|
|
31
|
+
private readonly pollIntervalMs;
|
|
32
|
+
private isRunning;
|
|
33
|
+
private blobStore;
|
|
34
|
+
constructor(projectRoot: string);
|
|
35
|
+
/**
|
|
36
|
+
* Start polling for commands
|
|
37
|
+
*/
|
|
38
|
+
start(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Stop polling for commands
|
|
41
|
+
*/
|
|
42
|
+
stop(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Poll for pending commands and execute them
|
|
45
|
+
*/
|
|
46
|
+
private poll;
|
|
47
|
+
/**
|
|
48
|
+
* Execute a command locally
|
|
49
|
+
*/
|
|
50
|
+
private executeCommand;
|
|
51
|
+
/**
|
|
52
|
+
* Compute the hash of the current file content
|
|
53
|
+
*/
|
|
54
|
+
private computeCurrentFileHash;
|
|
55
|
+
/**
|
|
56
|
+
* Execute a FILE_REVERT command
|
|
57
|
+
*/
|
|
58
|
+
private executeFileRevert;
|
|
59
|
+
/**
|
|
60
|
+
* Fetch blob content from cloud API and store it locally
|
|
61
|
+
*/
|
|
62
|
+
private fetchBlobFromCloud;
|
|
63
|
+
/**
|
|
64
|
+
* Update command status on the server
|
|
65
|
+
*/
|
|
66
|
+
private updateCommandStatus;
|
|
67
|
+
/**
|
|
68
|
+
* Check if poller is configured (has API key)
|
|
69
|
+
*/
|
|
70
|
+
isConfigured(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Reload API key from config (useful if user logs in after watch starts)
|
|
73
|
+
*/
|
|
74
|
+
reloadConfig(): void;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=CommandPoller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPoller.d.ts","sourceRoot":"","sources":["../../../src/services/watch/CommandPoller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,SAAS,CAAY;gBAEjB,WAAW,EAAE,MAAM;IAQ/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAsBb;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;YACW,IAAI;IA6ClB;;OAEG;YACW,cAAc;IAe5B;;OAEG;YACW,sBAAsB;IAmBpC;;OAEG;YACW,iBAAiB;IAyC/B;;OAEG;YACW,kBAAkB;IAwChC;;OAEG;YACW,mBAAmB;IA+BjC;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,YAAY,IAAI,IAAI;CAUrB"}
|