depfixer 1.0.0 → 1.1.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.
Files changed (85) hide show
  1. package/dist/commands/audit.d.ts +19 -0
  2. package/dist/commands/audit.d.ts.map +1 -0
  3. package/dist/commands/audit.js +170 -0
  4. package/dist/commands/audit.js.map +1 -0
  5. package/dist/commands/fix.d.ts +10 -3
  6. package/dist/commands/fix.d.ts.map +1 -1
  7. package/dist/commands/fix.js +407 -41
  8. package/dist/commands/fix.js.map +1 -1
  9. package/dist/commands/graph.d.ts +1 -1
  10. package/dist/commands/graph.d.ts.map +1 -1
  11. package/dist/commands/graph.js +17 -12
  12. package/dist/commands/graph.js.map +1 -1
  13. package/dist/commands/login.d.ts.map +1 -1
  14. package/dist/commands/login.js +120 -19
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/logout.d.ts.map +1 -1
  17. package/dist/commands/logout.js +6 -0
  18. package/dist/commands/logout.js.map +1 -1
  19. package/dist/commands/migrate.d.ts +22 -0
  20. package/dist/commands/migrate.d.ts.map +1 -0
  21. package/dist/commands/migrate.js +874 -0
  22. package/dist/commands/migrate.js.map +1 -0
  23. package/dist/commands/smart.d.ts +23 -0
  24. package/dist/commands/smart.d.ts.map +1 -0
  25. package/dist/commands/smart.js +1024 -0
  26. package/dist/commands/smart.js.map +1 -0
  27. package/dist/commands/whoami.d.ts +14 -0
  28. package/dist/commands/whoami.d.ts.map +1 -0
  29. package/dist/commands/whoami.js +65 -0
  30. package/dist/commands/whoami.js.map +1 -0
  31. package/dist/index.js +165 -40
  32. package/dist/index.js.map +1 -1
  33. package/dist/services/analytics.d.ts +108 -0
  34. package/dist/services/analytics.d.ts.map +1 -0
  35. package/dist/services/analytics.js +305 -0
  36. package/dist/services/analytics.js.map +1 -0
  37. package/dist/services/api-client.d.ts +159 -0
  38. package/dist/services/api-client.d.ts.map +1 -1
  39. package/dist/services/api-client.js +192 -10
  40. package/dist/services/api-client.js.map +1 -1
  41. package/dist/services/auth-manager.d.ts +14 -0
  42. package/dist/services/auth-manager.d.ts.map +1 -1
  43. package/dist/services/auth-manager.js +30 -0
  44. package/dist/services/auth-manager.js.map +1 -1
  45. package/dist/services/cache-manager.d.ts +62 -22
  46. package/dist/services/cache-manager.d.ts.map +1 -1
  47. package/dist/services/cache-manager.js +116 -30
  48. package/dist/services/cache-manager.js.map +1 -1
  49. package/dist/services/device-id.d.ts +20 -0
  50. package/dist/services/device-id.d.ts.map +1 -0
  51. package/dist/services/device-id.js +70 -0
  52. package/dist/services/device-id.js.map +1 -0
  53. package/dist/services/package-json.d.ts +44 -5
  54. package/dist/services/package-json.d.ts.map +1 -1
  55. package/dist/services/package-json.js +273 -20
  56. package/dist/services/package-json.js.map +1 -1
  57. package/dist/services/payment-flow.d.ts +108 -0
  58. package/dist/services/payment-flow.d.ts.map +1 -0
  59. package/dist/services/payment-flow.js +476 -0
  60. package/dist/services/payment-flow.js.map +1 -0
  61. package/dist/services/session-manager.d.ts +92 -0
  62. package/dist/services/session-manager.d.ts.map +1 -0
  63. package/dist/services/session-manager.js +218 -0
  64. package/dist/services/session-manager.js.map +1 -0
  65. package/dist/utils/design-system.d.ts +90 -0
  66. package/dist/utils/design-system.d.ts.map +1 -0
  67. package/dist/utils/design-system.js +338 -0
  68. package/dist/utils/design-system.js.map +1 -0
  69. package/dist/utils/output.d.ts +48 -1
  70. package/dist/utils/output.d.ts.map +1 -1
  71. package/dist/utils/output.js +180 -17
  72. package/dist/utils/output.js.map +1 -1
  73. package/dist/utils/print.d.ts +116 -0
  74. package/dist/utils/print.d.ts.map +1 -0
  75. package/dist/utils/print.js +190 -0
  76. package/dist/utils/print.js.map +1 -0
  77. package/package.json +13 -2
  78. package/dist/commands/analyze.d.ts +0 -18
  79. package/dist/commands/analyze.d.ts.map +0 -1
  80. package/dist/commands/analyze.js +0 -404
  81. package/dist/commands/analyze.js.map +0 -1
  82. package/dist/services/gitignore.d.ts +0 -19
  83. package/dist/services/gitignore.d.ts.map +0 -1
  84. package/dist/services/gitignore.js +0 -64
  85. package/dist/services/gitignore.js.map +0 -1
@@ -0,0 +1,476 @@
1
+ import chalk from 'chalk';
2
+ import open from 'open';
3
+ import { ApiClient } from './api-client.js';
4
+ import { AuthManager } from './auth-manager.js';
5
+ import { analytics } from './analytics.js';
6
+ import { createSpinner, printError } from '../utils/output.js';
7
+ import { printUserDetails } from '../utils/design-system.js';
8
+ /**
9
+ * Payment Flow Service
10
+ *
11
+ * Handles the payment/credit flow for CLI:
12
+ * - Auth loop (device code login)
13
+ * - Balance checking
14
+ * - Balance polling with timeout
15
+ * - Credit deduction
16
+ */
17
+ export class PaymentFlowService {
18
+ apiClient;
19
+ authManager;
20
+ webUrl;
21
+ constructor() {
22
+ this.apiClient = new ApiClient();
23
+ this.authManager = new AuthManager();
24
+ this.webUrl = process.env.DEPFIXER_WEB_URL || 'https://app.depfixer.com';
25
+ }
26
+ /**
27
+ * Run the complete payment flow:
28
+ * 1. Check auth (login if needed)
29
+ * 2. Check balance (wait for top-up if needed)
30
+ * 3. Return user info if ready to proceed
31
+ */
32
+ async ensureReadyToPay(cost) {
33
+ // Step 1: Ensure authenticated
34
+ const authResult = await this.ensureAuthenticated();
35
+ if (!authResult.success) {
36
+ return { ready: false };
37
+ }
38
+ // Step 2: Ensure sufficient balance
39
+ const hasBalance = await this.ensureSufficientBalance(cost);
40
+ if (!hasBalance) {
41
+ return { ready: false };
42
+ }
43
+ // Get final balance info (includes name and email)
44
+ const balanceInfo = await this.getBalanceInfo();
45
+ return {
46
+ ready: true,
47
+ name: balanceInfo?.name,
48
+ email: balanceInfo?.email || authResult.email,
49
+ credits: balanceInfo?.credits,
50
+ hasActivePass: balanceInfo?.hasActivePass,
51
+ wasAlreadyLoggedIn: authResult.wasAlreadyLoggedIn,
52
+ };
53
+ }
54
+ /**
55
+ * Ensure user is authenticated
56
+ * Runs device code flow if not logged in
57
+ * Returns user info on success
58
+ */
59
+ async ensureAuthenticated() {
60
+ if (await this.authManager.isAuthenticated()) {
61
+ return { success: true, wasAlreadyLoggedIn: true };
62
+ }
63
+ console.log();
64
+ console.log(chalk.bold('🔐 AUTHENTICATION REQUIRED'));
65
+ console.log(chalk.dim('─'.repeat(40)));
66
+ console.log();
67
+ // Ask if user has an account
68
+ const authChoice = await this.promptAuthChoice();
69
+ if (authChoice === 'register') {
70
+ // Open registration page
71
+ const registerUrl = `${this.webUrl}/register?from=cli`;
72
+ console.log();
73
+ console.log(chalk.cyan('Opening registration page...'));
74
+ try {
75
+ await open(registerUrl);
76
+ console.log(chalk.dim('Browser opened. Create your account, then return here.'));
77
+ }
78
+ catch {
79
+ console.log(chalk.yellow(`Please visit: ${registerUrl}`));
80
+ }
81
+ console.log();
82
+ const ready = await this.promptYesNo('Account created? Ready to login?');
83
+ if (!ready) {
84
+ return { success: false };
85
+ }
86
+ }
87
+ // Run device code login flow
88
+ const result = await this.runDeviceCodeFlow();
89
+ return { success: result.success, email: result.email, wasAlreadyLoggedIn: false };
90
+ }
91
+ /**
92
+ * Prompt user to choose login or register with arrow key selection
93
+ */
94
+ async promptAuthChoice() {
95
+ const options = [
96
+ { value: 'login', label: 'Login', description: 'I have an account' },
97
+ { value: 'register', label: 'Register', description: 'Create new account' },
98
+ ];
99
+ return new Promise((resolve) => {
100
+ let selectedIndex = 0;
101
+ const render = () => {
102
+ // Move cursor up to redraw
103
+ process.stdout.write(`\x1b[${options.length + 1}A`);
104
+ console.log(chalk.dim(' Use ↑↓ arrows, Enter to confirm'));
105
+ for (let i = 0; i < options.length; i++) {
106
+ const opt = options[i];
107
+ const isSelected = i === selectedIndex;
108
+ const prefix = isSelected ? chalk.cyan('❯ ') : ' ';
109
+ const label = isSelected
110
+ ? chalk.bold.white(opt.label) + chalk.dim(` - ${opt.description}`)
111
+ : chalk.dim(opt.label + ` - ${opt.description}`);
112
+ console.log(`${prefix}${label}`);
113
+ }
114
+ };
115
+ // Initial render
116
+ console.log(chalk.dim(' Use ↑↓ arrows, Enter to confirm'));
117
+ for (let i = 0; i < options.length; i++) {
118
+ const opt = options[i];
119
+ const isSelected = i === selectedIndex;
120
+ const prefix = isSelected ? chalk.cyan('❯ ') : ' ';
121
+ const label = isSelected
122
+ ? chalk.bold.white(opt.label) + chalk.dim(` - ${opt.description}`)
123
+ : chalk.dim(opt.label + ` - ${opt.description}`);
124
+ console.log(`${prefix}${label}`);
125
+ }
126
+ if (process.stdin.isTTY) {
127
+ process.stdin.setRawMode(true);
128
+ }
129
+ process.stdin.resume();
130
+ const onKeyPress = (key) => {
131
+ const char = key.toString();
132
+ // Up arrow
133
+ if (char === '\x1b[A') {
134
+ selectedIndex = (selectedIndex - 1 + options.length) % options.length;
135
+ render();
136
+ }
137
+ // Down arrow
138
+ else if (char === '\x1b[B') {
139
+ selectedIndex = (selectedIndex + 1) % options.length;
140
+ render();
141
+ }
142
+ // Enter
143
+ else if (char === '\r' || char === '\n') {
144
+ cleanup();
145
+ console.log(chalk.green(`✓ ${options[selectedIndex].label}`));
146
+ resolve(options[selectedIndex].value);
147
+ }
148
+ // Escape - default to login
149
+ else if (char === '\x1b' && key.length === 1) {
150
+ cleanup();
151
+ console.log(chalk.dim('Cancelled'));
152
+ resolve('login');
153
+ }
154
+ // Ctrl+C
155
+ else if (char === '\x03') {
156
+ cleanup();
157
+ process.exit(0);
158
+ }
159
+ };
160
+ const cleanup = () => {
161
+ process.stdin.removeListener('data', onKeyPress);
162
+ if (process.stdin.isTTY) {
163
+ process.stdin.setRawMode(false);
164
+ }
165
+ process.stdin.pause();
166
+ };
167
+ process.stdin.on('data', onKeyPress);
168
+ });
169
+ }
170
+ /**
171
+ * Get current balance info
172
+ */
173
+ async getBalanceInfo() {
174
+ try {
175
+ const response = await this.apiClient.getBalance();
176
+ if (response.success && response.data) {
177
+ return response.data;
178
+ }
179
+ return null;
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }
185
+ /**
186
+ * Run device code authentication flow
187
+ * Returns user info on success
188
+ */
189
+ async runDeviceCodeFlow() {
190
+ try {
191
+ // Get device code from server
192
+ const response = await this.apiClient.createDeviceCode();
193
+ if (!response.success || !response.data) {
194
+ printError('Failed to initiate login');
195
+ return { success: false };
196
+ }
197
+ const { deviceCode, userCode, verificationUrl, expiresIn, pollInterval } = response.data;
198
+ // Display instructions - DON'T auto-open browser
199
+ console.log();
200
+ console.log(chalk.bold('🔐 LOGIN REQUIRED'));
201
+ console.log(chalk.dim('─'.repeat(40)));
202
+ console.log();
203
+ console.log(chalk.bold('Your Code: ') + chalk.green.bold(userCode));
204
+ console.log();
205
+ const verificationUrlWithCode = `${verificationUrl}?code=${userCode}`;
206
+ console.log(chalk.dim('Go to: ') + chalk.cyan(verificationUrlWithCode));
207
+ console.log(chalk.dim('Code will be auto-filled. Just click Authorize.'));
208
+ console.log();
209
+ // Ask if user wants to open browser
210
+ const shouldOpen = await this.promptYesNo('Open browser now?');
211
+ if (shouldOpen) {
212
+ try {
213
+ await open(verificationUrlWithCode);
214
+ console.log(chalk.dim('Browser opened.'));
215
+ }
216
+ catch {
217
+ console.log(chalk.yellow('Could not open browser. Please visit the URL manually.'));
218
+ }
219
+ }
220
+ console.log();
221
+ // Poll for completion
222
+ const spinner = createSpinner(`Waiting for authentication... (expires in ${Math.floor(expiresIn / 60)} min)`).start();
223
+ const startTime = Date.now();
224
+ const expiresAt = startTime + expiresIn * 1000;
225
+ while (Date.now() < expiresAt) {
226
+ await this.sleep(pollInterval * 1000);
227
+ try {
228
+ const pollResponse = await this.apiClient.pollDeviceCode(deviceCode);
229
+ if (pollResponse.success && pollResponse.data) {
230
+ if (pollResponse.data.status === 'approved') {
231
+ // Save tokens
232
+ await this.authManager.saveTokens(pollResponse.data.accessToken, pollResponse.data.refreshToken, pollResponse.data.expiresIn || 3600);
233
+ spinner.succeed('Logged in successfully');
234
+ // Fetch and show user details
235
+ try {
236
+ const balanceResponse = await this.apiClient.getBalance();
237
+ if (balanceResponse.success && balanceResponse.data) {
238
+ printUserDetails({
239
+ name: balanceResponse.data.name,
240
+ email: balanceResponse.data.email,
241
+ credits: balanceResponse.data.credits,
242
+ hasActivePass: balanceResponse.data.hasActivePass,
243
+ });
244
+ }
245
+ }
246
+ catch {
247
+ // Continue even if balance fetch fails
248
+ }
249
+ return { success: true, email: pollResponse.data.email };
250
+ }
251
+ else if (pollResponse.data.status === 'denied') {
252
+ spinner.fail('Login denied');
253
+ return { success: false };
254
+ }
255
+ else if (pollResponse.data.status === 'expired') {
256
+ spinner.fail('Login expired');
257
+ return { success: false };
258
+ }
259
+ // status === 'pending' - keep polling
260
+ }
261
+ }
262
+ catch (error) {
263
+ // Continue polling on errors
264
+ }
265
+ }
266
+ spinner.fail('Login timed out');
267
+ return { success: false };
268
+ }
269
+ catch (error) {
270
+ printError(`Login failed: ${error.message}`);
271
+ return { success: false };
272
+ }
273
+ }
274
+ /**
275
+ * Simple Enter/Esc prompt (Enter = Yes, Esc = No)
276
+ */
277
+ async promptYesNo(question) {
278
+ return new Promise((resolve) => {
279
+ process.stdout.write(`${question} ${chalk.dim('(Enter/Esc)')} `);
280
+ if (process.stdin.isTTY) {
281
+ process.stdin.setRawMode(true);
282
+ }
283
+ process.stdin.resume();
284
+ const onKeyPress = (key) => {
285
+ const char = key.toString();
286
+ // Enter key
287
+ if (char === '\r' || char === '\n') {
288
+ cleanup();
289
+ console.log(chalk.green('Yes'));
290
+ resolve(true);
291
+ }
292
+ // Escape key
293
+ else if (char === '\x1b') {
294
+ cleanup();
295
+ console.log(chalk.red('No'));
296
+ resolve(false);
297
+ }
298
+ // 'y' or 'Y'
299
+ else if (char.toLowerCase() === 'y') {
300
+ cleanup();
301
+ console.log(chalk.green('Yes'));
302
+ resolve(true);
303
+ }
304
+ // 'n' or 'N'
305
+ else if (char.toLowerCase() === 'n') {
306
+ cleanup();
307
+ console.log(chalk.red('No'));
308
+ resolve(false);
309
+ }
310
+ // Ctrl+C
311
+ else if (char === '\x03') {
312
+ cleanup();
313
+ process.exit(0);
314
+ }
315
+ };
316
+ const cleanup = () => {
317
+ process.stdin.removeListener('data', onKeyPress);
318
+ if (process.stdin.isTTY) {
319
+ process.stdin.setRawMode(false);
320
+ }
321
+ process.stdin.pause();
322
+ };
323
+ process.stdin.on('data', onKeyPress);
324
+ });
325
+ }
326
+ /**
327
+ * Ensure user has sufficient credits
328
+ * Opens pricing page and polls if insufficient
329
+ * Note: Credit check UI should be shown before calling this method
330
+ */
331
+ async ensureSufficientBalance(cost) {
332
+ try {
333
+ const response = await this.apiClient.getBalance();
334
+ if (!response.success || !response.data) {
335
+ printError('Failed to check balance');
336
+ return false;
337
+ }
338
+ const { credits, hasActivePass } = response.data;
339
+ // Active pass covers everything
340
+ if (hasActivePass) {
341
+ return true;
342
+ }
343
+ // Sufficient credits
344
+ if (credits >= cost) {
345
+ return true;
346
+ }
347
+ // Insufficient credits - start top-up flow
348
+ return await this.waitForTopUp(cost);
349
+ }
350
+ catch (error) {
351
+ printError(error.message);
352
+ return false;
353
+ }
354
+ }
355
+ /**
356
+ * Wait for user to top up their balance
357
+ * Opens pricing page and polls for 5 minutes
358
+ */
359
+ async waitForTopUp(requiredCredits) {
360
+ console.log();
361
+ console.log(chalk.bold.yellow('💳 CREDITS REQUIRED'));
362
+ console.log(chalk.dim('─'.repeat(40)));
363
+ console.log();
364
+ console.log(chalk.white(`You need ${chalk.bold(requiredCredits)} credits to unlock the full solution.`));
365
+ console.log(chalk.dim('This includes exact version fixes for all detected conflicts.'));
366
+ console.log();
367
+ // Track: topup_prompt_shown (user hit the paywall)
368
+ analytics.topupPromptShown({ creditsNeeded: requiredCredits });
369
+ // Ask before opening pricing page
370
+ const pricingUrl = `${this.webUrl}/dashboard/credits/pricing`;
371
+ const shouldOpen = await this.promptYesNo('Open pricing page to add credits?');
372
+ if (shouldOpen) {
373
+ // Track: topup_started (user clicked to go to pricing)
374
+ analytics.topupStarted({ creditsNeeded: requiredCredits });
375
+ try {
376
+ await open(pricingUrl);
377
+ console.log(chalk.dim('Browser opened.'));
378
+ }
379
+ catch {
380
+ console.log(chalk.yellow('Could not open browser.'));
381
+ console.log(chalk.dim('Visit: ') + chalk.cyan(pricingUrl));
382
+ }
383
+ }
384
+ else {
385
+ // Track: topup_abandoned (user declined to go to pricing)
386
+ analytics.topupAbandoned({ reason: 'declined_pricing_page', creditsNeeded: requiredCredits });
387
+ console.log();
388
+ console.log(chalk.dim('Visit: ') + chalk.cyan(pricingUrl));
389
+ console.log(chalk.dim('Run `npx depfixer fix` when ready.'));
390
+ return false;
391
+ }
392
+ console.log();
393
+ // Poll for balance update
394
+ const TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
395
+ const POLL_INTERVAL_MS = 5000; // 5 seconds
396
+ const startTime = Date.now();
397
+ const spinner = createSpinner('Waiting for payment... (5 min timeout)').start();
398
+ while (Date.now() - startTime < TIMEOUT_MS) {
399
+ await this.sleep(POLL_INTERVAL_MS);
400
+ try {
401
+ const response = await this.apiClient.getBalance();
402
+ if (response.success && response.data) {
403
+ const { credits, hasActivePass } = response.data;
404
+ if (hasActivePass) {
405
+ // Track: topup_completed (purchased pass)
406
+ analytics.topupCompleted({ type: 'panic_pass', creditsNeeded: requiredCredits });
407
+ spinner.succeed('Panic Pass activated! Unlimited fixes unlocked.');
408
+ return true;
409
+ }
410
+ if (credits >= requiredCredits) {
411
+ // Track: topup_completed (purchased credits)
412
+ analytics.topupCompleted({ type: 'credits', creditsNeeded: requiredCredits, creditsPurchased: credits });
413
+ spinner.succeed(`Balance updated! (${credits} credits)`);
414
+ return true;
415
+ }
416
+ // Update spinner with remaining time
417
+ const elapsed = Date.now() - startTime;
418
+ const remaining = Math.ceil((TIMEOUT_MS - elapsed) / 60000);
419
+ spinner.text = `Waiting for payment... (${remaining} min remaining)`;
420
+ }
421
+ }
422
+ catch {
423
+ // Continue polling on errors
424
+ }
425
+ }
426
+ // Track: topup_timeout (user didn't complete payment in time)
427
+ analytics.topupTimeout({ creditsNeeded: requiredCredits });
428
+ spinner.fail('Payment timeout');
429
+ console.log();
430
+ console.log(chalk.yellow('You can run `npx depfixer fix` later to resume.'));
431
+ return false;
432
+ }
433
+ /**
434
+ * Deduct credits for an analysis
435
+ * Returns solution and full analysis data for CLI display
436
+ */
437
+ async deductCredits(analysisId, hasActivePass) {
438
+ const spinnerText = hasActivePass ? 'Unlocking solution...' : 'Deducting credits...';
439
+ const spinner = createSpinner(spinnerText).start();
440
+ try {
441
+ const response = await this.apiClient.executeFix(analysisId);
442
+ if (!response.success) {
443
+ spinner.fail('Failed to unlock solution');
444
+ return { success: false, error: response.error };
445
+ }
446
+ // Check if pass was used (from server response)
447
+ if (response.data?.passUsed) {
448
+ spinner.succeed('Solution unlocked (Panic Pass)');
449
+ }
450
+ else {
451
+ spinner.succeed('Credits deducted');
452
+ }
453
+ return {
454
+ success: true,
455
+ solution: response.data?.solution,
456
+ // Pass through full analysis data from server
457
+ conflicts: response.data?.conflicts,
458
+ missingDependencies: response.data?.missingDependencies,
459
+ deprecations: response.data?.deprecations,
460
+ healthScore: response.data?.healthScore,
461
+ summary: response.data?.summary,
462
+ };
463
+ }
464
+ catch (error) {
465
+ spinner.fail('Failed to deduct credits');
466
+ return { success: false, error: error.message };
467
+ }
468
+ }
469
+ /**
470
+ * Sleep helper
471
+ */
472
+ sleep(ms) {
473
+ return new Promise(resolve => setTimeout(resolve, ms));
474
+ }
475
+ }
476
+ //# sourceMappingURL=payment-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-flow.js","sourceRoot":"","sources":["../../src/services/payment-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Session data structure for CLI analysis caching
3
+ */
4
+ export interface SessionData {
5
+ analysisId: string;
6
+ timestamp: number;
7
+ intent: 'AUDIT' | 'ANALYZE' | 'MIGRATE';
8
+ args?: {
9
+ target?: string;
10
+ };
11
+ originalFileHash: string;
12
+ cost: number;
13
+ status: 'UNPAID' | 'PAID';
14
+ projectName: string;
15
+ packageCount: number;
16
+ tierName: string;
17
+ projectPath?: string;
18
+ }
19
+ export interface SessionFile {
20
+ lastSession: SessionData;
21
+ }
22
+ /**
23
+ * Session Manager
24
+ * Manages CLI session state for the new payment flow.
25
+ *
26
+ * Key features:
27
+ * - Stores session in ~/.depfixer/projects/{projectHash}/session.json
28
+ * - Tracks analysis ID, cost, payment status
29
+ * - Verifies package.json hash for integrity
30
+ * - Supports resume of unpaid analyses
31
+ * - Centralized storage (no .depfixer in project directory)
32
+ */
33
+ export declare class SessionManager {
34
+ private readonly cacheDir;
35
+ private readonly sessionFile;
36
+ private readonly projectDir;
37
+ constructor(projectDir?: string);
38
+ /**
39
+ * Generate a short hash from project path for unique folder name
40
+ */
41
+ private getProjectHash;
42
+ /**
43
+ * Calculate SHA256 hash of content
44
+ */
45
+ calculateHash(content: string): string;
46
+ /**
47
+ * Save a new session after analysis
48
+ */
49
+ saveSession(data: Omit<SessionData, 'timestamp' | 'projectPath'>): Promise<void>;
50
+ /**
51
+ * Load the current session
52
+ */
53
+ loadSession(): Promise<SessionData | null>;
54
+ /**
55
+ * Check if a session exists
56
+ */
57
+ hasSession(): Promise<boolean>;
58
+ /**
59
+ * Update session status (e.g., mark as PAID)
60
+ */
61
+ updateStatus(status: 'UNPAID' | 'PAID'): Promise<void>;
62
+ /**
63
+ * Verify that package.json hasn't changed since analysis
64
+ */
65
+ verifyHash(currentContent: string): Promise<boolean>;
66
+ /**
67
+ * Get human-readable time since analysis
68
+ */
69
+ getTimeSinceAnalysis(session: SessionData): string;
70
+ /**
71
+ * Get session description for display
72
+ */
73
+ getSessionDescription(session: SessionData): string;
74
+ /**
75
+ * Clear the session (after successful fix or on user request)
76
+ */
77
+ clearSession(): Promise<void>;
78
+ /**
79
+ * Get the session file path
80
+ */
81
+ getSessionFilePath(): string;
82
+ /**
83
+ * Ensure cache directory exists
84
+ */
85
+ private ensureCacheDir;
86
+ /**
87
+ * Migrate from old cache format (analysis-history.json) if present
88
+ * This provides backward compatibility with existing installations
89
+ */
90
+ migrateFromOldCache(): Promise<boolean>;
91
+ }
92
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/services/session-manager.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,GAAE,MAAsB;IAQ9C;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAItC;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IActF;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAahD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IASpC;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D;;OAEG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1D;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAiBlD;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAenD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAUnC;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;YACW,cAAc;IAU5B;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;CA4C9C"}