@nolimitcli/cli 1.0.0 → 1.2.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 (2) hide show
  1. package/dist/index.js +42 -40
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -17,7 +17,7 @@ const program = new Command();
17
17
  program
18
18
  .name('nolimit')
19
19
  .description('No subscription. Just code.')
20
- .version('1.0.0');
20
+ .version('1.2.0');
21
21
  // Auth command - register and get API key
22
22
  program
23
23
  .command('auth')
@@ -41,8 +41,6 @@ program
41
41
  config.set('sessionId', data.sessionId);
42
42
  config.set('apiKey', data.apiKey);
43
43
  spinner.succeed(chalk.green('Authenticated'));
44
- console.log();
45
- console.log(chalk.dim('Session:'), data.sessionId.slice(0, 8) + '...');
46
44
  if (data.welcomeBonus > 0) {
47
45
  console.log(chalk.green(`+${data.welcomeBonus.toLocaleString()}`), 'welcome tokens');
48
46
  }
@@ -68,6 +66,13 @@ program
68
66
  }
69
67
  const spinner = ora('Requesting ad...').start();
70
68
  try {
69
+ // Get starting balance
70
+ const balanceResponse = await fetch(`${API_BASE}/api/credits/balance`, {
71
+ headers: { 'Authorization': `Bearer ${apiKey}` },
72
+ });
73
+ const startBalance = balanceResponse.ok
74
+ ? (await balanceResponse.json()).balance
75
+ : 0;
71
76
  // Request ad
72
77
  const adResponse = await fetch(`${API_BASE}/api/ads/request`, {
73
78
  method: 'GET',
@@ -86,42 +91,39 @@ program
86
91
  console.log();
87
92
  // Open ad viewer in browser
88
93
  const adUrl = `${API_BASE}/ad-viewer.html?adId=${adData.adId}&apiKey=${apiKey}`;
89
- console.log(chalk.dim('Opening ad in browser...'));
90
94
  await open(adUrl);
91
- // Wait for user to complete ad
92
- console.log();
93
- console.log(chalk.yellow('Complete the ad in your browser.'));
94
- console.log(chalk.dim('Press Enter when done...'));
95
- await new Promise((resolve) => {
96
- process.stdin.once('data', () => resolve());
97
- });
98
- // Verify completion
99
- const verifySpinner = ora('Verifying...').start();
100
- const verifyResponse = await fetch(`${API_BASE}/api/ads/verify-completion`, {
101
- method: 'POST',
102
- headers: {
103
- 'Content-Type': 'application/json',
104
- 'Authorization': `Bearer ${apiKey}`,
105
- },
106
- body: JSON.stringify({
107
- adId: adData.adId,
108
- completedAt: Date.now(),
109
- events: [
110
- { event: 'play', time: 0 },
111
- { event: 'midpoint', time: Math.floor(adData.duration / 2) },
112
- { event: 'complete', time: adData.duration },
113
- ],
114
- }),
115
- });
116
- if (!verifyResponse.ok) {
117
- const errorData = await verifyResponse.json().catch(() => ({}));
118
- throw new Error(errorData.error || `Verification failed: ${verifyResponse.status}`);
95
+ // Auto-poll for completion (no manual Enter needed)
96
+ const waitSpinner = ora('Watching ad...').start();
97
+ let attempts = 0;
98
+ const maxAttempts = 60; // 60 seconds max wait
99
+ while (attempts < maxAttempts) {
100
+ await new Promise(resolve => setTimeout(resolve, 1000));
101
+ attempts++;
102
+ // Update spinner with countdown
103
+ const remaining = adData.duration - Math.min(attempts, adData.duration);
104
+ if (remaining > 0) {
105
+ waitSpinner.text = `${remaining}s remaining...`;
106
+ }
107
+ else {
108
+ waitSpinner.text = 'Verifying...';
109
+ }
110
+ // Check if balance increased (ad completed)
111
+ const checkResponse = await fetch(`${API_BASE}/api/credits/balance`, {
112
+ headers: { 'Authorization': `Bearer ${apiKey}` },
113
+ });
114
+ if (checkResponse.ok) {
115
+ const newData = await checkResponse.json();
116
+ if (newData.balance > startBalance) {
117
+ waitSpinner.succeed(chalk.green('Tokens earned!'));
118
+ console.log();
119
+ console.log(chalk.bold.green(`+${(newData.balance - startBalance).toLocaleString()}`), 'tokens');
120
+ console.log(chalk.dim('Balance:'), chalk.bold(newData.balance.toLocaleString()), chalk.dim('(~' + Math.floor(newData.balance / 1500) + ' prompts)'));
121
+ return;
122
+ }
123
+ }
119
124
  }
120
- const verifyData = await verifyResponse.json();
121
- verifySpinner.succeed(chalk.green('Tokens earned'));
122
- console.log();
123
- console.log(chalk.bold.green(`+${verifyData.tokensGranted.toLocaleString()}`), 'tokens');
124
- console.log(chalk.dim('New balance:'), chalk.bold(verifyData.newBalance.toLocaleString()));
125
+ waitSpinner.fail('Timed out waiting for ad completion');
126
+ console.log(chalk.dim('Try running'), chalk.cyan('nolimit earn'), chalk.dim('again'));
125
127
  }
126
128
  catch (error) {
127
129
  spinner.fail(chalk.red('Failed'));
@@ -151,10 +153,10 @@ program
151
153
  const data = await response.json();
152
154
  spinner.succeed('Balance');
153
155
  console.log();
154
- console.log(chalk.bold.white(data.balance.toLocaleString()), 'tokens');
156
+ console.log(chalk.bold.white(data.balance.toLocaleString()), 'tokens', chalk.dim('(~' + Math.floor(data.balance / 1500) + ' prompts)'));
155
157
  console.log();
156
- console.log(chalk.dim('Total earned:'), data.totalEarned.toLocaleString());
157
- console.log(chalk.dim('Total spent:'), data.totalSpent.toLocaleString());
158
+ console.log(chalk.dim('Earned:'), data.totalEarned.toLocaleString());
159
+ console.log(chalk.dim('Spent:'), data.totalSpent.toLocaleString());
158
160
  }
159
161
  catch (error) {
160
162
  spinner.fail(chalk.red('Failed'));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nolimitcli/cli",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "description": "No subscription. Just code. Watch an ad, build without limits.",
6
6
  "main": "dist/index.js",