@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.
Files changed (63) hide show
  1. package/dist/api-client.d.ts +37 -17
  2. package/dist/api-client.d.ts.map +1 -1
  3. package/dist/api-client.js +224 -120
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/commands/check.d.ts.map +1 -1
  6. package/dist/commands/check.js +56 -13
  7. package/dist/commands/check.js.map +1 -1
  8. package/dist/commands/doctor.d.ts.map +1 -1
  9. package/dist/commands/doctor.js +14 -11
  10. package/dist/commands/doctor.js.map +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +95 -33
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/login.d.ts.map +1 -1
  15. package/dist/commands/login.js +47 -57
  16. package/dist/commands/login.js.map +1 -1
  17. package/dist/commands/plan.d.ts +2 -0
  18. package/dist/commands/plan.d.ts.map +1 -1
  19. package/dist/commands/plan.js +177 -10
  20. package/dist/commands/plan.js.map +1 -1
  21. package/dist/commands/revert.d.ts.map +1 -1
  22. package/dist/commands/revert.js +10 -0
  23. package/dist/commands/revert.js.map +1 -1
  24. package/dist/commands/session.d.ts +29 -0
  25. package/dist/commands/session.d.ts.map +1 -0
  26. package/dist/commands/session.js +382 -0
  27. package/dist/commands/session.js.map +1 -0
  28. package/dist/commands/verify.d.ts.map +1 -1
  29. package/dist/commands/verify.js +59 -3
  30. package/dist/commands/verify.js.map +1 -1
  31. package/dist/commands/watch.d.ts.map +1 -1
  32. package/dist/commands/watch.js +20 -15
  33. package/dist/commands/watch.js.map +1 -1
  34. package/dist/index.js +78 -3
  35. package/dist/index.js.map +1 -1
  36. package/dist/services/integrations/TicketService.d.ts +68 -0
  37. package/dist/services/integrations/TicketService.d.ts.map +1 -0
  38. package/dist/services/integrations/TicketService.js +151 -0
  39. package/dist/services/integrations/TicketService.js.map +1 -0
  40. package/dist/services/security/SecurityGuard.d.ts +80 -0
  41. package/dist/services/security/SecurityGuard.d.ts.map +1 -0
  42. package/dist/services/security/SecurityGuard.js +410 -0
  43. package/dist/services/security/SecurityGuard.js.map +1 -0
  44. package/dist/services/watch/Syncer.d.ts.map +1 -1
  45. package/dist/services/watch/Syncer.js +22 -1
  46. package/dist/services/watch/Syncer.js.map +1 -1
  47. package/dist/utils/ROILogger.d.ts +16 -0
  48. package/dist/utils/ROILogger.d.ts.map +1 -0
  49. package/dist/utils/ROILogger.js +45 -0
  50. package/dist/utils/ROILogger.js.map +1 -0
  51. package/dist/utils/box.d.ts +16 -0
  52. package/dist/utils/box.d.ts.map +1 -0
  53. package/dist/utils/box.js +85 -0
  54. package/dist/utils/box.js.map +1 -0
  55. package/dist/utils/messages.d.ts +81 -0
  56. package/dist/utils/messages.d.ts.map +1 -0
  57. package/dist/utils/messages.js +306 -0
  58. package/dist/utils/messages.js.map +1 -0
  59. package/dist/utils/user-context.d.ts +28 -0
  60. package/dist/utils/user-context.d.ts.map +1 -0
  61. package/dist/utils/user-context.js +68 -0
  62. package/dist/utils/user-context.js.map +1 -0
  63. 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;IAwFvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAyBlC;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,YAAY,IAAI,IAAI;CAKrB"}
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('⚠️ Failed to sync events to cloud:', error.message);
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"}