antri_cli 1.34.0 → 1.38.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.
@@ -5,11 +5,33 @@ export interface UserAccount {
5
5
  token?: string;
6
6
  loggedInAt: string;
7
7
  }
8
+ export interface StoredAccount {
9
+ email: string;
10
+ userId: string;
11
+ passwordHash?: string;
12
+ salt?: string;
13
+ provider: 'email' | 'google';
14
+ createdAt: string;
15
+ }
8
16
  export declare class AuthManager {
9
17
  private static getAuthFilePath;
18
+ private static getAccountsFilePath;
19
+ private static loadAccounts;
20
+ private static saveAccounts;
21
+ private static hashPassword;
10
22
  static getCurrentUser(): UserAccount | null;
11
23
  static isAuthenticated(): boolean;
12
24
  static generateUserId(email: string): string;
25
+ /**
26
+ * Password-based Registration or Login
27
+ * - If account does not exist: creates account with hashed password
28
+ * - If account exists: verifies password against stored PBKDF2 hash
29
+ */
30
+ static loginWithPassword(email: string, password?: string): Promise<{
31
+ success: boolean;
32
+ user?: UserAccount;
33
+ error?: string;
34
+ }>;
13
35
  static register(email: string, password?: string): Promise<{
14
36
  success: boolean;
15
37
  user?: UserAccount;
@@ -21,7 +43,7 @@ export declare class AuthManager {
21
43
  error?: string;
22
44
  }>;
23
45
  /**
24
- * Google Sign-In handler (processes verified Google OAuth / ID token or Google Email)
46
+ * Google Sign-In handler (processes verified Google OAuth token or Google account identity)
25
47
  */
26
48
  static loginWithGoogle(email: string, googleToken?: string): Promise<{
27
49
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,eAAe;WAIhB,cAAc,IAAI,WAAW,GAAG,IAAI;WAapC,eAAe,IAAI,OAAO;WAI1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;WAO/B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;WA8B7G,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAI9H;;OAEG;WACiB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;WA8B7H,MAAM,IAAI,IAAI;CAU7B"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,eAAe;IAI9B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAIlC,OAAO,CAAC,MAAM,CAAC,YAAY;IAU3B,OAAO,CAAC,MAAM,CAAC,YAAY;IAM3B,OAAO,CAAC,MAAM,CAAC,YAAY;WAIb,cAAc,IAAI,WAAW,GAAG,IAAI;WAapC,eAAe,IAAI,OAAO;WAI1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOnD;;;;OAIG;WACiB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;WAsEtH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;WAI7G,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAI9H;;OAEG;WACiB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;WA6C7H,MAAM,IAAI,IAAI;CAU7B"}
@@ -8,6 +8,28 @@ export class AuthManager {
8
8
  static getAuthFilePath() {
9
9
  return path.join(os.homedir(), '.antri', 'auth.json');
10
10
  }
11
+ static getAccountsFilePath() {
12
+ return path.join(os.homedir(), '.antri', 'accounts.json');
13
+ }
14
+ static loadAccounts() {
15
+ const filePath = this.getAccountsFilePath();
16
+ if (fs.existsSync(filePath)) {
17
+ try {
18
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
19
+ }
20
+ catch (_) { }
21
+ }
22
+ return {};
23
+ }
24
+ static saveAccounts(accounts) {
25
+ const dir = path.join(os.homedir(), '.antri');
26
+ if (!fs.existsSync(dir))
27
+ fs.mkdirSync(dir, { recursive: true });
28
+ fs.writeFileSync(this.getAccountsFilePath(), JSON.stringify(accounts, null, 2), 'utf-8');
29
+ }
30
+ static hashPassword(password, salt) {
31
+ return crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');
32
+ }
11
33
  static getCurrentUser() {
12
34
  const filePath = this.getAuthFilePath();
13
35
  if (fs.existsSync(filePath)) {
@@ -30,7 +52,12 @@ export class AuthManager {
30
52
  const prefix = clean.split('@')[0].replace(/[^a-z0-9_-]/g, '_');
31
53
  return `${prefix}_${hash}`;
32
54
  }
33
- static async register(email, password) {
55
+ /**
56
+ * Password-based Registration or Login
57
+ * - If account does not exist: creates account with hashed password
58
+ * - If account exists: verifies password against stored PBKDF2 hash
59
+ */
60
+ static async loginWithPassword(email, password) {
34
61
  const cleanEmail = email.toLowerCase().trim();
35
62
  if (!cleanEmail || !cleanEmail.includes('@')) {
36
63
  return { success: false, error: 'Please enter a valid email address.' };
@@ -39,7 +66,43 @@ export class AuthManager {
39
66
  if (!rateCheck.allowed) {
40
67
  return { success: false, error: `Too many auth requests. Please retry in ${rateCheck.retryAfterSeconds}s.` };
41
68
  }
42
- const userId = this.generateUserId(cleanEmail);
69
+ const accounts = this.loadAccounts();
70
+ const existing = accounts[cleanEmail];
71
+ if (existing) {
72
+ // Existing account - verify password if password was set
73
+ if (existing.passwordHash && existing.salt) {
74
+ if (!password) {
75
+ return { success: false, error: 'Password required for this account.' };
76
+ }
77
+ const computedHash = this.hashPassword(password, existing.salt);
78
+ if (computedHash !== existing.passwordHash) {
79
+ return { success: false, error: 'Invalid password. Please check your password and try again.' };
80
+ }
81
+ }
82
+ }
83
+ else {
84
+ // New account - create account
85
+ if (password && password.length < 6) {
86
+ return { success: false, error: 'Password must be at least 6 characters long.' };
87
+ }
88
+ const userId = this.generateUserId(cleanEmail);
89
+ let salt;
90
+ let passwordHash;
91
+ if (password) {
92
+ salt = crypto.randomBytes(16).toString('hex');
93
+ passwordHash = this.hashPassword(password, salt);
94
+ }
95
+ accounts[cleanEmail] = {
96
+ email: cleanEmail,
97
+ userId,
98
+ passwordHash,
99
+ salt,
100
+ provider: 'email',
101
+ createdAt: new Date().toISOString(),
102
+ };
103
+ this.saveAccounts(accounts);
104
+ }
105
+ const userId = existing ? existing.userId : this.generateUserId(cleanEmail);
43
106
  const user = {
44
107
  email: cleanEmail,
45
108
  userId,
@@ -50,16 +113,19 @@ export class AuthManager {
50
113
  if (!fs.existsSync(dir))
51
114
  fs.mkdirSync(dir, { recursive: true });
52
115
  fs.writeFileSync(this.getAuthFilePath(), JSON.stringify(user, null, 2), 'utf-8');
53
- // Automatically route Firestore sync partition
116
+ // Route Firestore sync partition
54
117
  const syncCfg = FirestoreSyncManager.getSyncConfig();
55
118
  FirestoreSyncManager.saveSyncConfig(syncCfg.projectId || 'antri-agentic-hackathon', userId, syncCfg.apiKey);
56
119
  return { success: true, user };
57
120
  }
121
+ static async register(email, password) {
122
+ return this.loginWithPassword(email, password);
123
+ }
58
124
  static async login(email, password) {
59
- return this.register(email, password);
125
+ return this.loginWithPassword(email, password);
60
126
  }
61
127
  /**
62
- * Google Sign-In handler (processes verified Google OAuth / ID token or Google Email)
128
+ * Google Sign-In handler (processes verified Google OAuth token or Google account identity)
63
129
  */
64
130
  static async loginWithGoogle(email, googleToken) {
65
131
  const cleanEmail = email.toLowerCase().trim();
@@ -70,7 +136,20 @@ export class AuthManager {
70
136
  if (!rateCheck.allowed) {
71
137
  return { success: false, error: `Rate limit exceeded. Please retry in ${rateCheck.retryAfterSeconds}s.` };
72
138
  }
73
- const userId = this.generateUserId(cleanEmail);
139
+ const accounts = this.loadAccounts();
140
+ let existing = accounts[cleanEmail];
141
+ if (!existing) {
142
+ const userId = this.generateUserId(cleanEmail);
143
+ accounts[cleanEmail] = {
144
+ email: cleanEmail,
145
+ userId,
146
+ provider: 'google',
147
+ createdAt: new Date().toISOString(),
148
+ };
149
+ this.saveAccounts(accounts);
150
+ existing = accounts[cleanEmail];
151
+ }
152
+ const userId = existing.userId;
74
153
  const user = {
75
154
  email: cleanEmail,
76
155
  userId,
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"browserAuth.d.ts","sourceRoot":"","sources":["../../src/cloud/browserAuth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,qBAAa,iBAAiB;IAC5B;;OAEG;WACiB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA2FjE,OAAO,CAAC,MAAM,CAAC,WAAW;IAe1B,OAAO,CAAC,MAAM,CAAC,eAAe;CA2S/B"}
1
+ {"version":3,"file":"browserAuth.d.ts","sourceRoot":"","sources":["../../src/cloud/browserAuth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,qBAAa,iBAAiB;IAC5B;;OAEG;WACiB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqJjE,OAAO,CAAC,MAAM,CAAC,WAAW;IAe1B,OAAO,CAAC,MAAM,CAAC,eAAe;CAqU/B"}
@@ -22,7 +22,64 @@ export class BrowserAuthServer {
22
22
  res.end(this.renderLoginPage(port, projectId, apiKey));
23
23
  return;
24
24
  }
25
- // 2. Auth Callback Endpoint
25
+ // 2. Google OAuth Popup Callback Endpoint
26
+ if (url.pathname === '/api/google/callback') {
27
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
28
+ res.end(`<!DOCTYPE html><html><body style="background:#fcfbf9;font-family:system-ui;text-align:center;padding:40px;">
29
+ <p>Connecting your Google Account to ANTRI Code...</p>
30
+ <script>
31
+ const hash = window.location.hash.substring(1);
32
+ const params = new URLSearchParams(hash);
33
+ const idToken = params.get('id_token') || '';
34
+ const accessToken = params.get('access_token') || '';
35
+
36
+ function parseJwt(token) {
37
+ try {
38
+ var base64Url = token.split('.')[1];
39
+ var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
40
+ var jsonPayload = decodeURIComponent(atob(base64).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''));
41
+ return JSON.parse(jsonPayload);
42
+ } catch(e) { return null; }
43
+ }
44
+
45
+ async function finish() {
46
+ let email = '';
47
+ if (idToken) {
48
+ const payload = parseJwt(idToken);
49
+ if (payload && payload.email) email = payload.email;
50
+ }
51
+ if (!email && accessToken) {
52
+ try {
53
+ const r = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {
54
+ headers: { Authorization: 'Bearer ' + accessToken }
55
+ });
56
+ const d = await r.json();
57
+ if (d.email) email = d.email;
58
+ } catch(e) {}
59
+ }
60
+
61
+ if (email) {
62
+ await fetch('/api/callback', {
63
+ method: 'POST',
64
+ headers: { 'Content-Type': 'application/json' },
65
+ body: JSON.stringify({ email: email, provider: 'google', googleToken: idToken || accessToken })
66
+ });
67
+ if (window.opener) {
68
+ window.opener.postMessage({ type: 'ANTRI_AUTH_SUCCESS', email: email }, '*');
69
+ window.close();
70
+ } else {
71
+ window.location.href = '/login';
72
+ }
73
+ } else {
74
+ document.body.innerHTML = '<p style="color:#dc2626;">Google sign-in completed. Returning to CLI...</p>';
75
+ }
76
+ }
77
+ finish();
78
+ </script>
79
+ </body></html>`);
80
+ return;
81
+ }
82
+ // 3. Auth Callback Endpoint
26
83
  if (url.pathname === '/api/callback' && req.method === 'POST') {
27
84
  let body = '';
28
85
  req.on('data', (chunk) => (body += chunk));
@@ -41,7 +98,7 @@ export class BrowserAuthServer {
41
98
  authResult = await AuthManager.loginWithGoogle(email, data.googleToken);
42
99
  }
43
100
  else {
44
- authResult = await AuthManager.login(email);
101
+ authResult = await AuthManager.loginWithPassword(email, data.password);
45
102
  }
46
103
  if (authResult.success && authResult.user) {
47
104
  res.writeHead(200, { 'Content-Type': 'application/json' });
@@ -112,10 +169,11 @@ export class BrowserAuthServer {
112
169
  <head>
113
170
  <meta charset="UTF-8">
114
171
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
115
- <title>ANTRI Code - Authentication</title>
172
+ <title>ANTRI Code - Secure Authentication</title>
116
173
  <link rel="preconnect" href="https://fonts.googleapis.com">
117
174
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
118
175
  <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
176
+ <script src="https://accounts.google.com/gsi/client" async defer></script>
119
177
  <style>
120
178
  :root {
121
179
  --bg: #fcfbf9;
@@ -141,7 +199,7 @@ export class BrowserAuthServer {
141
199
  border: 1px solid var(--border);
142
200
  border-radius: 16px;
143
201
  width: 100%;
144
- max-width: 420px;
202
+ max-width: 440px;
145
203
  padding: 36px 32px;
146
204
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.03);
147
205
  text-align: center;
@@ -168,7 +226,12 @@ export class BrowserAuthServer {
168
226
  p.subtitle {
169
227
  font-size: 13px;
170
228
  color: var(--subtext);
171
- margin-bottom: 28px;
229
+ margin-bottom: 22px;
230
+ }
231
+ .google-container {
232
+ margin-bottom: 6px;
233
+ display: flex;
234
+ justify-content: center;
172
235
  }
173
236
  .btn-google {
174
237
  width: 100%;
@@ -193,7 +256,7 @@ export class BrowserAuthServer {
193
256
  .divider {
194
257
  display: flex;
195
258
  align-items: center;
196
- margin: 24px 0;
259
+ margin: 20px 0;
197
260
  color: #a8a29e;
198
261
  font-size: 11px;
199
262
  font-weight: 700;
@@ -208,7 +271,7 @@ export class BrowserAuthServer {
208
271
  .divider span { padding: 0 12px; }
209
272
  .input-group {
210
273
  text-align: left;
211
- margin-bottom: 18px;
274
+ margin-bottom: 14px;
212
275
  }
213
276
  label {
214
277
  display: block;
@@ -217,7 +280,7 @@ export class BrowserAuthServer {
217
280
  color: var(--text);
218
281
  margin-bottom: 6px;
219
282
  }
220
- input[type="email"] {
283
+ input[type="email"], input[type="password"] {
221
284
  width: 100%;
222
285
  padding: 12px 14px;
223
286
  border: 1px solid var(--border);
@@ -228,7 +291,7 @@ export class BrowserAuthServer {
228
291
  outline: none;
229
292
  transition: border-color 0.15s;
230
293
  }
231
- input[type="email"]:focus {
294
+ input[type="email"]:focus, input[type="password"]:focus {
232
295
  border-color: var(--text);
233
296
  background: #ffffff;
234
297
  }
@@ -243,8 +306,10 @@ export class BrowserAuthServer {
243
306
  border-radius: 8px;
244
307
  cursor: pointer;
245
308
  transition: opacity 0.15s;
309
+ margin-top: 6px;
246
310
  }
247
311
  .btn-submit:hover { opacity: 0.92; }
312
+ .btn-submit:disabled { opacity: 0.6; cursor: not-allowed; }
248
313
  .success-view {
249
314
  display: none;
250
315
  padding: 20px 0;
@@ -265,8 +330,15 @@ export class BrowserAuthServer {
265
330
  .status-msg {
266
331
  font-size: 12px;
267
332
  color: #dc2626;
268
- margin-top: 10px;
333
+ margin-top: 12px;
269
334
  display: none;
335
+ line-height: 1.4;
336
+ }
337
+ .auth-hint {
338
+ font-size: 11px;
339
+ color: var(--subtext);
340
+ margin-top: 6px;
341
+ text-align: left;
270
342
  }
271
343
  </style>
272
344
  </head>
@@ -275,26 +347,34 @@ export class BrowserAuthServer {
275
347
  <div id="auth-form-container">
276
348
  <div class="brand-mark">A</div>
277
349
  <h1>ANTRI CODE</h1>
278
- <p class="subtitle">Authenticate to link your terminal and private cloud partition</p>
350
+ <p class="subtitle">Secure authentication for terminal and cloud partition</p>
279
351
 
280
- <button class="btn-google" id="google-btn" type="button">
281
- <svg width="18" height="18" viewBox="0 0 24 24">
282
- <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
283
- <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
284
- <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z"/>
285
- <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z"/>
286
- </svg>
287
- <span id="google-btn-text">Sign in with Google</span>
288
- </button>
352
+ <!-- Google Sign In via Google Identity Services -->
353
+ <div class="google-container">
354
+ <button class="btn-google" id="google-btn" type="button">
355
+ <svg width="18" height="18" viewBox="0 0 24 24">
356
+ <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
357
+ <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
358
+ <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z"/>
359
+ <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z"/>
360
+ </svg>
361
+ <span id="google-btn-text">Sign in with Google</span>
362
+ </button>
363
+ </div>
289
364
 
290
- <div class="divider"><span>OR EMAIL</span></div>
365
+ <div class="divider"><span>OR PASSWORD LOGIN / REGISTER</span></div>
291
366
 
292
- <form id="email-form">
367
+ <form id="auth-form">
293
368
  <div class="input-group">
294
- <label for="email">Work or Personal Email</label>
369
+ <label for="email">Account Email</label>
295
370
  <input type="email" id="email" placeholder="e.g. user@gmail.com" required autofocus>
296
371
  </div>
297
- <button type="submit" class="btn-submit" id="submit-btn">Continue to CLI</button>
372
+ <div class="input-group">
373
+ <label for="password">Password</label>
374
+ <input type="password" id="password" placeholder="••••••••" minlength="6" required>
375
+ <p class="auth-hint">New account will automatically register. Existing accounts will verify password.</p>
376
+ </div>
377
+ <button type="submit" class="btn-submit" id="submit-btn">Login / Register & Unlock CLI</button>
298
378
  <div class="status-msg" id="status-msg"></div>
299
379
  </form>
300
380
  </div>
@@ -302,104 +382,107 @@ export class BrowserAuthServer {
302
382
  <div class="success-view" id="success-view">
303
383
  <div class="success-icon">✓</div>
304
384
  <h1>Authentication Successful!</h1>
305
- <p class="subtitle" style="margin-top: 8px;">Your terminal has been authenticated. You can safely close this browser window and return to your CLI.</p>
385
+ <p class="subtitle" style="margin-top: 8px;" id="success-desc">Your terminal has been authenticated. You can safely close this browser window and return to your CLI.</p>
306
386
  </div>
307
387
  </div>
308
388
 
309
- <!-- Firebase Web SDK for Real Google Sign-In Popup -->
310
- <script type="module">
311
- import { initializeApp } from 'https://www.gstatic.com/firebasejs/10.8.0/firebase-app.js';
312
- import { getAuth, signInWithPopup, GoogleAuthProvider } from 'https://www.gstatic.com/firebasejs/10.8.0/firebase-auth.js';
313
-
314
- const firebaseConfig = {
315
- projectId: "${projectId}",
316
- authDomain: "${projectId}.firebaseapp.com"
317
- };
318
-
319
- let authInstance = null;
320
- let googleProvider = null;
321
-
322
- try {
323
- const app = initializeApp(firebaseConfig);
324
- authInstance = getAuth(app);
325
- googleProvider = new GoogleAuthProvider();
326
- } catch (err) {
327
- console.warn('Firebase init:', err);
389
+ <script>
390
+ function parseJwt(token) {
391
+ try {
392
+ var base64Url = token.split('.')[1];
393
+ var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
394
+ var jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
395
+ return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
396
+ }).join(''));
397
+ return JSON.parse(jsonPayload);
398
+ } catch (e) {
399
+ return null;
400
+ }
328
401
  }
329
402
 
330
- window.authenticate = async function(email, provider = 'email', token = '') {
403
+ async function authenticate(email, password = '', provider = 'email', googleToken = '') {
331
404
  const statusMsg = document.getElementById('status-msg');
332
405
  const submitBtn = document.getElementById('submit-btn');
406
+ const googleBtnText = document.getElementById('google-btn-text');
407
+
333
408
  statusMsg.style.display = 'none';
334
409
  submitBtn.disabled = true;
335
- submitBtn.innerText = 'Authenticating...';
410
+ submitBtn.innerText = 'Verifying credentials...';
411
+ if (provider === 'google') {
412
+ googleBtnText.innerText = 'Linking Google Account...';
413
+ }
336
414
 
337
415
  try {
338
416
  const res = await fetch('/api/callback', {
339
417
  method: 'POST',
340
418
  headers: { 'Content-Type': 'application/json' },
341
- body: JSON.stringify({ email, provider, googleToken: token })
419
+ body: JSON.stringify({ email, password, provider, googleToken })
342
420
  });
343
421
  const data = await res.json();
344
422
  if (data.success) {
345
423
  document.getElementById('auth-form-container').style.display = 'none';
346
424
  document.getElementById('success-view').style.display = 'block';
425
+ document.getElementById('success-desc').innerText = 'Authenticated as ' + email + '. Private Firestore partition is active. Return to your terminal now.';
347
426
  } else {
348
427
  statusMsg.innerText = data.error || 'Authentication failed.';
428
+ statusMsg.style.color = '#dc2626';
349
429
  statusMsg.style.display = 'block';
350
430
  submitBtn.disabled = false;
351
- submitBtn.innerText = 'Continue to CLI';
431
+ submitBtn.innerText = 'Login / Register & Unlock CLI';
432
+ googleBtnText.innerText = 'Sign in with Google';
352
433
  }
353
434
  } catch (err) {
354
435
  statusMsg.innerText = 'Connection error: ' + err.message;
436
+ statusMsg.style.color = '#dc2626';
355
437
  statusMsg.style.display = 'block';
356
438
  submitBtn.disabled = false;
357
- submitBtn.innerText = 'Continue to CLI';
439
+ submitBtn.innerText = 'Login / Register & Unlock CLI';
440
+ googleBtnText.innerText = 'Sign in with Google';
358
441
  }
359
- };
442
+ }
360
443
 
361
- document.getElementById('email-form').addEventListener('submit', (e) => {
444
+ document.getElementById('auth-form').addEventListener('submit', (e) => {
362
445
  e.preventDefault();
363
446
  const email = document.getElementById('email').value.trim();
364
- if (email) window.authenticate(email, 'email');
447
+ const password = document.getElementById('password').value;
448
+ if (email && password) {
449
+ authenticate(email, password, 'email');
450
+ }
365
451
  });
366
452
 
367
- document.getElementById('google-btn').addEventListener('click', async () => {
453
+ window.addEventListener('message', (event) => {
454
+ if (event.data && event.data.type === 'ANTRI_AUTH_SUCCESS') {
455
+ document.getElementById('auth-form-container').style.display = 'none';
456
+ document.getElementById('success-view').style.display = 'block';
457
+ document.getElementById('success-desc').innerText = 'Authenticated with Google as ' + event.data.email + '. Return to your terminal now.';
458
+ }
459
+ });
460
+
461
+ function openGooglePopup() {
368
462
  const googleBtnText = document.getElementById('google-btn-text');
369
- const statusMsg = document.getElementById('status-msg');
370
- statusMsg.style.display = 'none';
463
+ googleBtnText.innerText = 'Opening Google...';
371
464
 
372
- if (authInstance && googleProvider) {
373
- try {
374
- googleBtnText.innerText = 'Connecting to Google...';
375
- const result = await signInWithPopup(authInstance, googleProvider);
376
- const user = result.user;
377
- if (user && user.email) {
378
- const token = await user.getIdToken();
379
- await window.authenticate(user.email, 'google', token);
380
- return;
381
- }
382
- } catch (err) {
383
- console.warn('Firebase popup error:', err);
384
- googleBtnText.innerText = 'Sign in with Google';
385
- // Highlight email box with Google helper
386
- const emailInput = document.getElementById('email');
387
- emailInput.placeholder = 'Enter your Google email (e.g. user@gmail.com)';
388
- emailInput.focus();
389
- statusMsg.innerText = 'Please enter your Google account email below to link your identity:';
390
- statusMsg.style.color = '#78716c';
391
- statusMsg.style.display = 'block';
392
- return;
393
- }
465
+ const authUrl = 'https://accounts.google.com/o/oauth2/v2/auth?' + new URLSearchParams({
466
+ client_id: '659424855422-e421p0t9b3qg4kff9e47s9a37gcr38l0.apps.googleusercontent.com',
467
+ redirect_uri: window.location.origin + '/api/google/callback',
468
+ response_type: 'token id_token',
469
+ scope: 'openid email profile',
470
+ nonce: Math.random().toString(36).substring(2),
471
+ prompt: 'select_account'
472
+ });
473
+
474
+ const width = 500, height = 640;
475
+ const left = (window.screen.width / 2) - (width / 2);
476
+ const top = (window.screen.height / 2) - (height / 2);
477
+ const popup = window.open(authUrl, 'google_signin_popup', 'width=' + width + ',height=' + height + ',top=' + top + ',left=' + left);
478
+
479
+ if (!popup || popup.closed || typeof popup.closed === 'undefined') {
480
+ window.location.href = authUrl;
394
481
  }
482
+ }
395
483
 
396
- // If Firebase Auth SDK is not initialized, highlight email input
397
- const emailInput = document.getElementById('email');
398
- emailInput.placeholder = 'Enter your Google email (e.g. user@gmail.com)';
399
- emailInput.focus();
400
- statusMsg.innerText = 'Enter your Google account email below and click Continue:';
401
- statusMsg.style.color = '#78716c';
402
- statusMsg.style.display = 'block';
484
+ document.getElementById('google-btn').addEventListener('click', () => {
485
+ openGooglePopup();
403
486
  });
404
487
  </script>
405
488
  </body>
@@ -1 +1 @@
1
- {"version":3,"file":"browserAuth.js","sourceRoot":"","sources":["../../src/cloud/browserAuth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browserAuth.js","sourceRoot":"","sources":["../../src/cloud/browserAuth.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import dotenv from 'dotenv';
5
5
  // Load .env if present
6
6
  dotenv.config();
7
7
  const DEFAULT_CONFIG = {
8
- version: '1.34.0',
8
+ version: '1.38.0',
9
9
  provider: 'deepseek',
10
10
  model: 'deepseek-v4-flash-(latest)',
11
11
  mode: 'vibe',
@@ -1,5 +1,5 @@
1
1
  export declare class Updater {
2
- static readonly CURRENT_VERSION = "1.34.0";
2
+ static readonly CURRENT_VERSION = "1.38.0";
3
3
  static readonly PACKAGE_NAME = "antri_cli";
4
4
  /**
5
5
  * Checks for available updates and self-updates the global antri CLI
@@ -4,7 +4,7 @@ import chalk from 'chalk';
4
4
  import ora from 'ora';
5
5
  const execPromise = util.promisify(exec);
6
6
  export class Updater {
7
- static CURRENT_VERSION = '1.34.0';
7
+ static CURRENT_VERSION = '1.38.0';
8
8
  static PACKAGE_NAME = 'antri_cli';
9
9
  /**
10
10
  * Checks for available updates and self-updates the global antri CLI
@@ -15,7 +15,7 @@
15
15
  <header class="app-header">
16
16
  <div class="brand-zone">
17
17
  <span class="logo-mark">ANTRI</span>
18
- <span class="version-tag">v1.34.0</span>
18
+ <span class="version-tag">v1.38.0</span>
19
19
  </div>
20
20
 
21
21
  <!-- Mode Toggle -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antri_cli",
3
- "version": "1.34.0",
3
+ "version": "1.38.0",
4
4
  "description": "ANTRI Code - An intelligent, terminal-first AI coding chatbot, proactive facilitator, and autonomous meta-agent",
5
5
  "type": "module",
6
6
  "bin": {