@neurcode-ai/cli 0.7.11 → 0.8.0
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 +37 -17
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +224 -120
- package/dist/api-client.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.map +1 -1
- package/dist/commands/doctor.js +14 -11
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +95 -33
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +47 -57
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +177 -10
- package/dist/commands/plan.js.map +1 -1
- 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 +59 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +20 -15
- package/dist/commands/watch.js.map +1 -1
- package/dist/index.js +78 -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/Syncer.d.ts.map +1 -1
- package/dist/services/watch/Syncer.js +22 -1
- package/dist/services/watch/Syncer.js.map +1 -1
- 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/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/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 +4 -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Syncer.d.ts","sourceRoot":"","sources":["../../../src/services/watch/Syncer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;gBAEvB,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAQlD;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAuBlC;;;OAGG;YACW,SAAS;
|
|
1
|
+
{"version":3,"file":"Syncer.d.ts","sourceRoot":"","sources":["../../../src/services/watch/Syncer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;gBAEvB,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAQlD;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAuBlC;;;OAGG;YACW,SAAS;IA4GvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAyBlC;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,YAAY,IAAI,IAAI;CAKrB"}
|
|
@@ -95,7 +95,11 @@ class Syncer {
|
|
|
95
95
|
}
|
|
96
96
|
// If no API key, clear queue and return
|
|
97
97
|
if (!this.apiKey) {
|
|
98
|
+
const queuedCount = this.syncQueue.length;
|
|
98
99
|
this.syncQueue = [];
|
|
100
|
+
if (queuedCount > 0) {
|
|
101
|
+
console.warn(`⚠️ ${queuedCount} event(s) not synced: No API key configured. Run "neurcode config --key <your_api_key>"`);
|
|
102
|
+
}
|
|
99
103
|
return { success: false, synced: 0, skipped: 0, error: 'No API key configured' };
|
|
100
104
|
}
|
|
101
105
|
// Take a batch from the queue
|
|
@@ -146,6 +150,19 @@ class Syncer {
|
|
|
146
150
|
throw new Error(`API error: ${response.status} ${errorText}`);
|
|
147
151
|
}
|
|
148
152
|
const result = await response.json();
|
|
153
|
+
// Log sync result for visibility
|
|
154
|
+
if (result.success) {
|
|
155
|
+
if (result.synced > 0) {
|
|
156
|
+
console.log(`✅ Synced ${result.synced} event(s) to cloud${result.skipped > 0 ? ` (${result.skipped} skipped)` : ''}`);
|
|
157
|
+
}
|
|
158
|
+
else if (result.skipped > 0) {
|
|
159
|
+
// All events were duplicates (already synced)
|
|
160
|
+
console.log(`ℹ️ All ${result.skipped} event(s) already synced`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
console.error(`❌ Sync failed: ${result.error || 'Unknown error'}`);
|
|
165
|
+
}
|
|
149
166
|
// If there are more events in the queue, schedule another sync
|
|
150
167
|
if (this.syncQueue.length > 0) {
|
|
151
168
|
setTimeout(() => {
|
|
@@ -158,7 +175,11 @@ class Syncer {
|
|
|
158
175
|
}
|
|
159
176
|
catch (error) {
|
|
160
177
|
// Log error but don't throw - this is fire-and-forget
|
|
161
|
-
console.error(
|
|
178
|
+
console.error(`❌ Failed to sync ${batch.length} event(s) to cloud: ${error.message}`);
|
|
179
|
+
// If it's an auth error, provide helpful message
|
|
180
|
+
if (error.message?.includes('401') || error.message?.includes('403')) {
|
|
181
|
+
console.error(' 💡 Tip: Check your API key with "neurcode config --key <your_api_key>"');
|
|
182
|
+
}
|
|
162
183
|
return {
|
|
163
184
|
success: false,
|
|
164
185
|
synced: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Syncer.js","sourceRoot":"","sources":["../../../src/services/watch/Syncer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Syncer.js","sourceRoot":"","sources":["../../../src/services/watch/Syncer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ROI Logger
|
|
3
|
+
*
|
|
4
|
+
* Lightweight utility to send value events to the backend ROI service
|
|
5
|
+
* Tracks: reverts, verify passes, secret interceptions, hallucination blocks
|
|
6
|
+
*/
|
|
7
|
+
export type ROIEventType = 'REVERT_SUCCESS' | 'VERIFY_PASS' | 'SECRET_INTERCEPTED' | 'HALLUCINATION_BLOCKED';
|
|
8
|
+
export interface ROIEventMetadata {
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Log a ROI event to the backend
|
|
13
|
+
* This is fire-and-forget - errors are silently ignored to avoid blocking user workflows
|
|
14
|
+
*/
|
|
15
|
+
export declare function logROIEvent(eventType: ROIEventType, metadata?: ROIEventMetadata, projectId?: string | null): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=ROILogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ROILogger.d.ts","sourceRoot":"","sources":["../../src/utils/ROILogger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,aAAa,GAAG,oBAAoB,GAAG,uBAAuB,CAAC;AAE7G,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,YAAY,EACvB,QAAQ,GAAE,gBAAqB,EAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ROI Logger
|
|
4
|
+
*
|
|
5
|
+
* Lightweight utility to send value events to the backend ROI service
|
|
6
|
+
* Tracks: reverts, verify passes, secret interceptions, hallucination blocks
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.logROIEvent = logROIEvent;
|
|
10
|
+
const config_1 = require("../config");
|
|
11
|
+
/**
|
|
12
|
+
* Log a ROI event to the backend
|
|
13
|
+
* This is fire-and-forget - errors are silently ignored to avoid blocking user workflows
|
|
14
|
+
*/
|
|
15
|
+
async function logROIEvent(eventType, metadata = {}, projectId) {
|
|
16
|
+
try {
|
|
17
|
+
const config = (0, config_1.loadConfig)();
|
|
18
|
+
if (!config.apiKey) {
|
|
19
|
+
// Silently fail if no API key (user not authenticated)
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Use same API URL pattern as ApiClient
|
|
23
|
+
const apiUrl = config.apiUrl || process.env.NEURCODE_API_URL || 'https://api.neurcode.ai';
|
|
24
|
+
const url = `${apiUrl}/api/v1/roi/events`;
|
|
25
|
+
// Fire-and-forget fetch (don't await)
|
|
26
|
+
fetch(url, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: {
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
'Authorization': `Bearer ${config.apiKey}`,
|
|
31
|
+
},
|
|
32
|
+
body: JSON.stringify({
|
|
33
|
+
eventType,
|
|
34
|
+
metadata,
|
|
35
|
+
projectId,
|
|
36
|
+
}),
|
|
37
|
+
}).catch(() => {
|
|
38
|
+
// Silently ignore errors - ROI tracking should never block user workflows
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Silently ignore all errors
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=ROILogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ROILogger.js","sourceRoot":"","sources":["../../src/utils/ROILogger.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAcH,kCAkCC;AA9CD,sCAAuC;AAQvC;;;GAGG;AACI,KAAK,UAAU,WAAW,CAC/B,SAAuB,EACvB,WAA6B,EAAE,EAC/B,SAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,uDAAuD;YACvD,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,yBAAyB,CAAC;QAC1F,MAAM,GAAG,GAAG,GAAG,MAAM,oBAAoB,CAAC;QAE1C,sCAAsC;QACtC,KAAK,CAAC,GAAG,EAAE;YACT,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;aAC3C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS;gBACT,QAAQ;gBACR,SAAS;aACV,CAAC;SACH,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACZ,0EAA0E;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Box utility for creating terminal boxes
|
|
3
|
+
* Creates high-contrast, professional-looking boxes using chalk
|
|
4
|
+
*/
|
|
5
|
+
export interface BoxOptions {
|
|
6
|
+
title?: string;
|
|
7
|
+
padding?: number;
|
|
8
|
+
borderColor?: 'green' | 'yellow' | 'red' | 'cyan' | 'white';
|
|
9
|
+
titleColor?: 'green' | 'yellow' | 'red' | 'cyan' | 'white';
|
|
10
|
+
align?: 'left' | 'center';
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a boxed message for terminal output
|
|
14
|
+
*/
|
|
15
|
+
export declare function createBox(content: string, options?: BoxOptions): string;
|
|
16
|
+
//# sourceMappingURL=box.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/utils/box.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5D,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3D,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAiF3E"}
|