slek-ai-cli 1.1.7 → 1.1.9

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 (4) hide show
  1. package/.env +7 -0
  2. package/auth.js +45 -47
  3. package/cli.js +1 -1
  4. package/package.json +2 -2
package/.env ADDED
@@ -0,0 +1,7 @@
1
+ FIREBASE_PROJECT_ID="charm-f004f"
2
+ FIREBASE_CLIENT_EMAIL="firebase-adminsdk-fbsvc@charm-f004f.iam.gserviceaccount.com"
3
+ FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDPq0be+jDD2xzZ\nHfWTD3QhZK9/vSZAah4hBN6mozeJMkeY4HF7PH8q6e/14AcLK8NtOiYOGDW0fQNX\nR4khT/DBtkEt+BR6CqGS38u+0ahhua9hw5ea8c6+8Zu9elUWHJ1mdYnt96IGf4Tj\nrJcBe5CKxJb8YvHLd1pUvjDcwxzG46qar0shr2yJJo7z8XyQImwtXjqNd7P9FnfE\nIlBZsMGbSnW+tv/ryCoPAaQJW4A/80qDLctUuKp1nSw3Hm8r/jqPmzBEt72beCxX\nPoR4RSKWZ4Pm8yFZgw2xwU41s7loIhHQeFYN1pE5OaIhZLpGedhgEST51MaIM62I\nrhCDS85VAgMBAAECgf829V0MJapCKvq3evZCtRRGwh6v757v7SWMF33VG9zWsjfA\nfaWKt7fv43ld2KwEiNBvV7Q6hq2v1mXL82KXLlDI8zLMt5qzsZyRAikpltK5Cisf\n9GNq3hOY9NgCjR13fJsrQm/+SkrW7Wh92G8eNVVLZDuRD55t+mgthSfpRLmY6K1G\nGNhwtzwJkNHMh5ZgRFhKHwCjR7s14Lt72TIak2jDn9Fdwn5f5oF/7RoQx5Y5D9sD\ngMlWshdmmi40jjsa8Kvepun0dwmnh3CWjEB3E1DoKWjVKbSaYSryrWKA9uXYiOh3\nPZe7T5pv2OfvoORpsWwI/hOb+2yJ4gv/22b5mvECgYEA81BAAbCgqA121JExnuHP\ndoTO5gdzpc6YoHYAp2cyuyEm1yA+CwamoFglSkiwpq/odnNMo/SfOxgkoIurDtn0\n3J7ARFKOK4pHZkTAvL2jqkuvh1dJc5+NC/i3SgQq8t1df/dkZ//LNycAwPZQDNuv\nV44eG68xdrC9pHY+W5NIVhECgYEA2n8+qLXJJcUt6D2Ij6GmMtjdk8gEjMzHvWC4\nICdPsCyNHEsM2e/sJQOiV+UDEjtoDWZgfe/A5vibMMQQbeHr+3ibgMvjsbvrdVWb\nq1cmjDI94D4mOms71QgH0H+QtF2t4iQWiviudIeLqF0EUpMWsvgO9B/oJUEL6WXt\nt3YgIAUCgYEAxEKEDpjpTgTmSBoB23WrgZ8owJVcLG9T34KvjliIrDbWfIouYXhw\n6T+QfLXbf+i+auUf+dQ0qFcWHEXsqeMXRunqjnHE6cv1QcHNcbDKFnBMWrAGuHQH\nMpPhTJvGBPaYF8N2wwiqY4dbbUqBUY3WhppFIPGUxXdU0Rbrv7QykfECgYEAvVTn\nod+sBkufZQ/1BqkHUCY1kroOn0dPiV2HD22hEsL4H900rKDG2qgUg99RUvohRwNA\nd8BKQpqIN7Cdn+nVx5mR/gAvNLLm7EybUNR69Z8PmQGhtJt5RDbqNpRjerd2Vm/5\nDMFCwn012lWHylnkoH5szsPbMHT18nA9le0JF1UCgYEAlJNW/WqqTETu1JciGn3o\nIeG2jbdcUjHpnd8fKVUNm4yRCtwLsHRQar0/DI1FNUAqpi/wEU9CB5YVjyyTKWQX\nOyidG32VtkB6yTmlLKxnxY2+VxL4Vfk6ka9K/6tcLfFpy+LYgAzEbeRR32kz6upu\nLudPjkoiArV7RQZE/G7ySH4=\n-----END PRIVATE KEY-----\n"
4
+ FIREBASE_API_KEY="AIzaSyBoQHn_adTTj1ZaYZBMHCMSAblCGCIbQG4"
5
+ FIREBASE_AUTH_DOMAIN="charm-f004f.firebaseapp.com"
6
+ GOOGLE_CLIENT_ID="763614479011-v2m44ees6jhjaprj5ndoa0up83gf1qah.apps.googleusercontent.com"
7
+ GOOGLE_CLIENT_SECRET="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"
package/auth.js CHANGED
@@ -10,9 +10,14 @@ const axios = require('axios');
10
10
  const chalk = require('chalk');
11
11
  const boxen = require('boxen');
12
12
 
13
- // ─── Firebase config (hardcoded — all values from Firebase Console) ───────────
14
- const FIREBASE_API_KEY = 'AIzaSyBoQHn_adTTj1ZaYZBMHCMSAblCGCIbQG4';
15
- const FIREBASE_AUTH_DOMAIN = 'charm-f004f.firebaseapp.com';
13
+ // Load environment variables from .env
14
+ require('dotenv').config({ path: path.join(__dirname, '.env') });
15
+
16
+ // ─── Firebase / Google config ────────────────────────────────────────────────
17
+ const FIREBASE_API_KEY = process.env.FIREBASE_API_KEY || 'AIzaSyBoQHn_adTTj1ZaYZBMHCMSAblCGCIbQG4';
18
+ const FIREBASE_AUTH_DOMAIN = process.env.FIREBASE_AUTH_DOMAIN || 'charm-f004f.firebaseapp.com';
19
+ const GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID || '763614479011-v2m44ees6jhjaprj5ndoa0up83gf1qah.apps.googleusercontent.com';
20
+ const GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET || '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';
16
21
 
17
22
  const REDIRECT_URI = 'http://localhost:9876/callback';
18
23
  const AUTH_PORT = 9876;
@@ -70,72 +75,64 @@ function openBrowser(targetUrl) {
70
75
  }
71
76
  }
72
77
 
73
- // ─── Firebase Google Sign-In URL ──────────────────────────────────────────────
74
- // Uses Firebase's own OAuth redirect — no separate Google Client ID needed.
75
- function buildFirebaseAuthUrl() {
76
- const base = `https://${FIREBASE_AUTH_DOMAIN}/__/auth/handler`;
77
- const params = new URLSearchParams({
78
- apiKey: FIREBASE_API_KEY,
79
- appName: '[DEFAULT]',
80
- authType: 'signInViaRedirect',
81
- redirectUrl: REDIRECT_URI,
82
- providerId: 'google.com',
83
- scopes: 'profile,email',
84
- v: '10',
85
- });
86
- return `${base}?${params.toString()}`;
78
+ // ─── Google OAuth URL ────────────────────────────────────────────────────────
79
+ function buildGoogleAuthUrl() {
80
+ const authUrl = new URL('https://accounts.google.com/o/oauth2/v2/auth');
81
+ authUrl.searchParams.set('client_id', GOOGLE_CLIENT_ID);
82
+ authUrl.searchParams.set('redirect_uri', REDIRECT_URI);
83
+ authUrl.searchParams.set('response_type', 'code');
84
+ authUrl.searchParams.set('scope', 'openid email profile');
85
+ authUrl.searchParams.set('access_type', 'offline');
86
+ authUrl.searchParams.set('prompt', 'select_account');
87
+ return authUrl.toString();
87
88
  }
88
89
 
89
- // ─── Exchange Firebase redirect token ────────────────────────────────────────
90
- // After Firebase redirect, we get an id_token in the callback URL fragment/query.
91
- async function handleFirebaseCallback(queryParams) {
92
- // Firebase returns id_token directly in the callback
93
- const idToken = queryParams.id_token || queryParams.idToken;
94
-
95
- if (idToken) {
96
- // Verify and get user info from Firebase
97
- const res = await axios.post(
98
- `https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=${FIREBASE_API_KEY}`,
99
- { idToken }
100
- );
101
- const user = res.data.users?.[0];
102
- if (!user) throw new Error('User not found');
103
- return {
104
- name: user.displayName || user.email,
105
- email: user.email,
106
- photo: user.photoUrl || '',
107
- idToken,
108
- expiresAt: Date.now() + 3600 * 1000, // 1 hour
109
- };
110
- }
90
+ // ─── Exchange Google code to Firebase token ──────────────────────────────────
91
+ async function exchangeCodeForToken(code) {
92
+ const tokenRes = await axios.post('https://oauth2.googleapis.com/token', {
93
+ code,
94
+ client_id: GOOGLE_CLIENT_ID,
95
+ client_secret: GOOGLE_CLIENT_SECRET,
96
+ redirect_uri: REDIRECT_URI,
97
+ grant_type: 'authorization_code',
98
+ });
111
99
 
112
- // Fallback: if Firebase sends an auth code instead
113
- const code = queryParams.code;
114
- if (!code) throw new Error('No token or code received from Firebase');
100
+ const { id_token } = tokenRes.data;
115
101
 
116
102
  const firebaseRes = await axios.post(
117
103
  `https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key=${FIREBASE_API_KEY}`,
118
104
  {
119
- postBody: `id_token=${code}&providerId=google.com`,
105
+ postBody: `id_token=${id_token}&providerId=google.com`,
120
106
  requestUri: REDIRECT_URI,
121
107
  returnIdpCredential: true,
122
108
  returnSecureToken: true,
123
109
  }
124
110
  );
125
111
 
126
- const { displayName, email, idToken: token, expiresIn, photoUrl } = firebaseRes.data;
112
+ const { displayName, email, idToken, expiresIn, photoUrl } = firebaseRes.data;
127
113
  return {
128
114
  name: displayName,
129
115
  email,
130
116
  photo: photoUrl || '',
131
- idToken: token,
117
+ idToken,
132
118
  expiresAt: Date.now() + parseInt(expiresIn) * 1000,
133
119
  };
134
120
  }
135
121
 
136
122
  // ─── Login ────────────────────────────────────────────────────────────────────
137
123
  async function login() {
138
- const authUrl = buildFirebaseAuthUrl();
124
+ if (!GOOGLE_CLIENT_ID || !GOOGLE_CLIENT_SECRET) {
125
+ console.log(
126
+ boxen(
127
+ chalk.red('✗ Google OAuth Client configuration missing!\n\n') +
128
+ chalk.white('Add GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET to .env'),
129
+ { padding: 1, margin: { left: 2 }, borderStyle: 'round', borderColor: 'red' }
130
+ )
131
+ );
132
+ process.exit(1);
133
+ }
134
+
135
+ const authUrl = buildGoogleAuthUrl();
139
136
 
140
137
  return new Promise((resolve, reject) => {
141
138
  const server = http.createServer(async (req, res) => {
@@ -166,6 +163,7 @@ async function login() {
166
163
 
167
164
  server.close();
168
165
 
166
+ const code = parsed.query.code;
169
167
  const error = parsed.query.error;
170
168
  if (error) {
171
169
  console.log(chalk.red('\n ✗ Login cancelled.\n'));
@@ -175,7 +173,7 @@ async function login() {
175
173
 
176
174
  try {
177
175
  process.stdout.write(chalk.cyan('\n ⏳ Verifying with Firebase...\n'));
178
- const userData = await handleFirebaseCallback(parsed.query);
176
+ const userData = await exchangeCodeForToken(code);
179
177
  saveToken(userData);
180
178
 
181
179
  console.log(
package/cli.js CHANGED
@@ -308,7 +308,7 @@ async function processInput(input, rl) {
308
308
  }
309
309
 
310
310
  const spinner = ora({
311
- text: chalk.cyan(' Connecting to NVIDIA API...'),
311
+ text: chalk.cyan(' Connecting to SLEK Server...'),
312
312
  spinner: 'dots',
313
313
  color: 'cyan',
314
314
  prefixText: ' ',
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "slek-ai-cli",
3
- "version": "1.1.7",
3
+ "version": "1.1.9",
4
4
  "description": "SLEK AI CLI — Powered by NVIDIA API",
5
5
  "main": "cli.js",
6
6
  "bin": {
7
- "slek": "cli.js"
7
+ "slek": "./cli.js"
8
8
  },
9
9
  "scripts": {
10
10
  "start": "node cli.js"