vibehub-cli 1.0.43 → 1.1.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.
- package/dist/commands/clone.d.ts.map +1 -1
- package/dist/commands/clone.js +24 -2
- package/dist/commands/clone.js.map +1 -1
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +71 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +92 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/profiles.d.ts +3 -0
- package/dist/commands/profiles.d.ts.map +1 -0
- package/dist/commands/profiles.js +77 -0
- package/dist/commands/profiles.js.map +1 -0
- package/dist/commands/use.d.ts +3 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +83 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +105 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/auth-helper.d.ts +14 -3
- package/dist/lib/auth-helper.d.ts.map +1 -1
- package/dist/lib/auth-helper.js +111 -35
- package/dist/lib/auth-helper.js.map +1 -1
- package/dist/lib/profile-manager.d.ts +116 -0
- package/dist/lib/profile-manager.d.ts.map +1 -0
- package/dist/lib/profile-manager.js +351 -0
- package/dist/lib/profile-manager.js.map +1 -0
- package/dist/lib/supabase-auth.d.ts +42 -0
- package/dist/lib/supabase-auth.d.ts.map +1 -0
- package/dist/lib/supabase-auth.js +398 -0
- package/dist/lib/supabase-auth.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { createClient } from '@supabase/supabase-js';
|
|
5
|
+
// Supabase configuration
|
|
6
|
+
const SUPABASE_URL = 'https://keogzaeakmndknpgrjif.supabase.co';
|
|
7
|
+
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imtlb2d6YWVha21uZGtucGdyamlmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTc0MTYzMjQsImV4cCI6MjA3Mjk5MjMyNH0.38TymM-WiTS3ONu2KirEGbQT3XwRqSC5UBhZCQnlwO0';
|
|
8
|
+
/**
|
|
9
|
+
* ProfileManager handles multi-profile authentication token storage and management.
|
|
10
|
+
*
|
|
11
|
+
* Storage structure:
|
|
12
|
+
* ~/.vibehub/
|
|
13
|
+
* ├── config.json # Global settings (defaultProfile, version)
|
|
14
|
+
* └── profiles/
|
|
15
|
+
* ├── default.json # Default profile tokens
|
|
16
|
+
* └── work.json # Named profile tokens
|
|
17
|
+
*
|
|
18
|
+
* Project-level override:
|
|
19
|
+
* project/.vibehub/config.json # Contains "profile" field to override default
|
|
20
|
+
*/
|
|
21
|
+
export class ProfileManager {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.baseDir = path.join(os.homedir(), '.vibehub');
|
|
24
|
+
this.configPath = path.join(this.baseDir, 'config.json');
|
|
25
|
+
this.profilesDir = path.join(this.baseDir, 'profiles');
|
|
26
|
+
this.supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Ensure the profile directories exist
|
|
30
|
+
*/
|
|
31
|
+
async ensureDirectories() {
|
|
32
|
+
await fs.ensureDir(this.baseDir);
|
|
33
|
+
await fs.ensureDir(this.profilesDir);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the global configuration
|
|
37
|
+
*/
|
|
38
|
+
async getGlobalConfig() {
|
|
39
|
+
try {
|
|
40
|
+
await this.ensureDirectories();
|
|
41
|
+
if (await fs.pathExists(this.configPath)) {
|
|
42
|
+
return await fs.readJson(this.configPath);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Return default config if file doesn't exist or is invalid
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
version: '2.0',
|
|
50
|
+
defaultProfile: 'default'
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Save the global configuration
|
|
55
|
+
*/
|
|
56
|
+
async saveGlobalConfig(config) {
|
|
57
|
+
await this.ensureDirectories();
|
|
58
|
+
await fs.writeJson(this.configPath, config, { spaces: 2 });
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get a profile by name
|
|
62
|
+
*/
|
|
63
|
+
async getProfile(name) {
|
|
64
|
+
try {
|
|
65
|
+
const profilePath = path.join(this.profilesDir, `${name}.json`);
|
|
66
|
+
if (await fs.pathExists(profilePath)) {
|
|
67
|
+
return await fs.readJson(profilePath);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Profile doesn't exist or is invalid
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Save a profile
|
|
77
|
+
*/
|
|
78
|
+
async saveProfile(name, data) {
|
|
79
|
+
await this.ensureDirectories();
|
|
80
|
+
const profilePath = path.join(this.profilesDir, `${name}.json`);
|
|
81
|
+
const profile = {
|
|
82
|
+
...data,
|
|
83
|
+
name,
|
|
84
|
+
lastUsedAt: new Date().toISOString()
|
|
85
|
+
};
|
|
86
|
+
await fs.writeJson(profilePath, profile, { spaces: 2 });
|
|
87
|
+
// Update global config if this is the first profile
|
|
88
|
+
const config = await this.getGlobalConfig();
|
|
89
|
+
if (!config.defaultProfile || !(await this.getProfile(config.defaultProfile))) {
|
|
90
|
+
config.defaultProfile = name;
|
|
91
|
+
await this.saveGlobalConfig(config);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Delete a profile
|
|
96
|
+
*/
|
|
97
|
+
async deleteProfile(name) {
|
|
98
|
+
const profilePath = path.join(this.profilesDir, `${name}.json`);
|
|
99
|
+
if (await fs.pathExists(profilePath)) {
|
|
100
|
+
await fs.remove(profilePath);
|
|
101
|
+
// If deleting the default profile, update config
|
|
102
|
+
const config = await this.getGlobalConfig();
|
|
103
|
+
if (config.defaultProfile === name) {
|
|
104
|
+
const profiles = await this.listProfiles();
|
|
105
|
+
config.defaultProfile = profiles.length > 0 ? profiles[0].name : 'default';
|
|
106
|
+
await this.saveGlobalConfig(config);
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* List all profiles
|
|
114
|
+
*/
|
|
115
|
+
async listProfiles() {
|
|
116
|
+
try {
|
|
117
|
+
await this.ensureDirectories();
|
|
118
|
+
const files = await fs.readdir(this.profilesDir);
|
|
119
|
+
const profiles = [];
|
|
120
|
+
for (const file of files) {
|
|
121
|
+
if (file.endsWith('.json')) {
|
|
122
|
+
try {
|
|
123
|
+
const profile = await fs.readJson(path.join(this.profilesDir, file));
|
|
124
|
+
profiles.push(profile);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Skip invalid profile files
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return profiles.sort((a, b) => new Date(b.lastUsedAt).getTime() - new Date(a.lastUsedAt).getTime());
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Delete all profiles
|
|
139
|
+
*/
|
|
140
|
+
async deleteAllProfiles() {
|
|
141
|
+
const profiles = await this.listProfiles();
|
|
142
|
+
let count = 0;
|
|
143
|
+
for (const profile of profiles) {
|
|
144
|
+
if (await this.deleteProfile(profile.name)) {
|
|
145
|
+
count++;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return count;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get the project-level profile override (if any)
|
|
152
|
+
*/
|
|
153
|
+
async getProjectProfile(projectPath) {
|
|
154
|
+
try {
|
|
155
|
+
const searchPath = projectPath || process.cwd();
|
|
156
|
+
// Check for .vibehub/config.json in project
|
|
157
|
+
const projectConfigPath = path.join(searchPath, '.vibehub', 'config.json');
|
|
158
|
+
if (await fs.pathExists(projectConfigPath)) {
|
|
159
|
+
const projectConfig = await fs.readJson(projectConfigPath);
|
|
160
|
+
if (projectConfig.profile) {
|
|
161
|
+
return projectConfig.profile;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Also check vibehub.json for backward compatibility
|
|
165
|
+
const vibehubConfigPath = path.join(searchPath, '.vibehub', 'vibehub.json');
|
|
166
|
+
if (await fs.pathExists(vibehubConfigPath)) {
|
|
167
|
+
const vibehubConfig = await fs.readJson(vibehubConfigPath);
|
|
168
|
+
if (vibehubConfig.profile) {
|
|
169
|
+
return vibehubConfig.profile;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// No project profile set
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Set the profile for the current project
|
|
180
|
+
*/
|
|
181
|
+
async setProjectProfile(profileName, projectPath) {
|
|
182
|
+
const searchPath = projectPath || process.cwd();
|
|
183
|
+
const configDir = path.join(searchPath, '.vibehub');
|
|
184
|
+
const configPath = path.join(configDir, 'config.json');
|
|
185
|
+
await fs.ensureDir(configDir);
|
|
186
|
+
// Load existing config or create new
|
|
187
|
+
let config = {};
|
|
188
|
+
try {
|
|
189
|
+
if (await fs.pathExists(configPath)) {
|
|
190
|
+
config = await fs.readJson(configPath);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Start with empty config
|
|
195
|
+
}
|
|
196
|
+
config.profile = profileName;
|
|
197
|
+
await fs.writeJson(configPath, config, { spaces: 2 });
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Clear the project profile override
|
|
201
|
+
*/
|
|
202
|
+
async clearProjectProfile(projectPath) {
|
|
203
|
+
const searchPath = projectPath || process.cwd();
|
|
204
|
+
const configPath = path.join(searchPath, '.vibehub', 'config.json');
|
|
205
|
+
try {
|
|
206
|
+
if (await fs.pathExists(configPath)) {
|
|
207
|
+
const config = await fs.readJson(configPath);
|
|
208
|
+
delete config.profile;
|
|
209
|
+
await fs.writeJson(configPath, config, { spaces: 2 });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// No config to update
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get the active profile (project-level override or default)
|
|
218
|
+
*/
|
|
219
|
+
async getActiveProfile(projectPath) {
|
|
220
|
+
// 1. Check for project-level override
|
|
221
|
+
const projectProfileName = await this.getProjectProfile(projectPath);
|
|
222
|
+
if (projectProfileName) {
|
|
223
|
+
const profile = await this.getProfile(projectProfileName);
|
|
224
|
+
if (profile) {
|
|
225
|
+
return profile;
|
|
226
|
+
}
|
|
227
|
+
// Project specifies a profile that doesn't exist
|
|
228
|
+
console.warn(`Warning: Project specifies profile '${projectProfileName}' but it doesn't exist.`);
|
|
229
|
+
}
|
|
230
|
+
// 2. Fall back to default profile
|
|
231
|
+
const config = await this.getGlobalConfig();
|
|
232
|
+
return await this.getProfile(config.defaultProfile);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Check if a token is expired or about to expire
|
|
236
|
+
*/
|
|
237
|
+
isTokenExpired(profile, bufferMinutes = 5) {
|
|
238
|
+
const expiresAt = new Date(profile.tokenExpiresAt);
|
|
239
|
+
const now = new Date();
|
|
240
|
+
const bufferMs = bufferMinutes * 60 * 1000;
|
|
241
|
+
return expiresAt.getTime() - now.getTime() <= bufferMs;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Refresh tokens if needed (silent refresh using refresh token)
|
|
245
|
+
*/
|
|
246
|
+
async refreshTokenIfNeeded(profile) {
|
|
247
|
+
if (!this.isTokenExpired(profile)) {
|
|
248
|
+
// Update last used time
|
|
249
|
+
profile.lastUsedAt = new Date().toISOString();
|
|
250
|
+
await this.saveProfile(profile.name, profile);
|
|
251
|
+
return profile;
|
|
252
|
+
}
|
|
253
|
+
// Token is expired or about to expire, refresh it
|
|
254
|
+
try {
|
|
255
|
+
const { data, error } = await this.supabase.auth.setSession({
|
|
256
|
+
access_token: profile.accessToken,
|
|
257
|
+
refresh_token: profile.refreshToken
|
|
258
|
+
});
|
|
259
|
+
if (error || !data.session) {
|
|
260
|
+
throw new Error(error?.message || 'Failed to refresh session');
|
|
261
|
+
}
|
|
262
|
+
// Update profile with new tokens
|
|
263
|
+
const updatedProfile = {
|
|
264
|
+
...profile,
|
|
265
|
+
accessToken: data.session.access_token,
|
|
266
|
+
refreshToken: data.session.refresh_token || profile.refreshToken,
|
|
267
|
+
tokenExpiresAt: new Date(data.session.expires_at * 1000).toISOString(),
|
|
268
|
+
lastUsedAt: new Date().toISOString()
|
|
269
|
+
};
|
|
270
|
+
await this.saveProfile(profile.name, updatedProfile);
|
|
271
|
+
return updatedProfile;
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
throw new Error(`Token refresh failed: ${error.message}. Please run 'vibe login' again.`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Check if migration from old format is needed and perform it
|
|
279
|
+
*/
|
|
280
|
+
async migrateIfNeeded() {
|
|
281
|
+
try {
|
|
282
|
+
// Check for old-style config with user.token
|
|
283
|
+
const oldConfigPath = path.join(this.baseDir, 'config.json');
|
|
284
|
+
if (!await fs.pathExists(oldConfigPath)) {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
const oldConfig = await fs.readJson(oldConfigPath);
|
|
288
|
+
// Check if already migrated (has version 2.0)
|
|
289
|
+
if (oldConfig.version === '2.0') {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
// Check for old user token format
|
|
293
|
+
if (oldConfig.user?.token) {
|
|
294
|
+
// Create backup
|
|
295
|
+
const backupPath = path.join(this.baseDir, 'config.backup.json');
|
|
296
|
+
await fs.copy(oldConfigPath, backupPath);
|
|
297
|
+
// Update config to new format
|
|
298
|
+
const newConfig = {
|
|
299
|
+
version: '2.0',
|
|
300
|
+
defaultProfile: 'default',
|
|
301
|
+
migratedFrom: '1.0'
|
|
302
|
+
};
|
|
303
|
+
await this.saveGlobalConfig(newConfig);
|
|
304
|
+
return true; // Migration needed - caller should prompt for re-authentication
|
|
305
|
+
}
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get the profile status (for display)
|
|
314
|
+
*/
|
|
315
|
+
getProfileStatus(profile) {
|
|
316
|
+
const expiresAt = new Date(profile.tokenExpiresAt);
|
|
317
|
+
const now = new Date();
|
|
318
|
+
const diffMs = expiresAt.getTime() - now.getTime();
|
|
319
|
+
if (diffMs <= 0) {
|
|
320
|
+
return 'expired';
|
|
321
|
+
}
|
|
322
|
+
else if (diffMs <= 10 * 60 * 1000) { // 10 minutes
|
|
323
|
+
return 'expiring';
|
|
324
|
+
}
|
|
325
|
+
return 'active';
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get time until token expires (formatted string)
|
|
329
|
+
*/
|
|
330
|
+
getTokenExpiryString(profile) {
|
|
331
|
+
const expiresAt = new Date(profile.tokenExpiresAt);
|
|
332
|
+
const now = new Date();
|
|
333
|
+
const diffMs = expiresAt.getTime() - now.getTime();
|
|
334
|
+
if (diffMs <= 0) {
|
|
335
|
+
return 'Expired';
|
|
336
|
+
}
|
|
337
|
+
const minutes = Math.floor(diffMs / 60000);
|
|
338
|
+
const hours = Math.floor(minutes / 60);
|
|
339
|
+
const days = Math.floor(hours / 24);
|
|
340
|
+
if (days > 0) {
|
|
341
|
+
return `${days} day${days > 1 ? 's' : ''}`;
|
|
342
|
+
}
|
|
343
|
+
else if (hours > 0) {
|
|
344
|
+
return `${hours} hour${hours > 1 ? 's' : ''}`;
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
return `${minutes} minute${minutes > 1 ? 's' : ''}`;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=profile-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-manager.js","sourceRoot":"","sources":["../../src/lib/profile-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AAgCrE,yBAAyB;AACzB,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAChE,MAAM,iBAAiB,GAAG,kNAAkN,CAAC;AAE7O;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,cAAc;IAMzB;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB;QAC7B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/B,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,cAAc,EAAE,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAoB;QACzC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;YAChE,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAA+B;QAC7D,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QAChE,MAAM,OAAO,GAAgB;YAC3B,GAAG,IAAI;YACP,IAAI;YACJ,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAExD,oDAAoD;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YAC9E,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;YAC7B,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAE7B,iDAAiD;YACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3C,MAAM,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC3E,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAkB,EAAE,CAAC;YAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;wBACrE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACzB,CAAC;oBAAC,MAAM,CAAC;wBACP,6BAA6B;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5B,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CACpE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,WAAoB;QAC1C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAEhD,4CAA4C;YAC5C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YAC3E,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC3C,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;gBAC3D,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC1B,OAAO,aAAa,CAAC,OAAO,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,qDAAqD;YACrD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAC5E,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC3C,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;gBAC3D,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC1B,OAAO,aAAa,CAAC,OAAO,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,WAAmB,EAAE,WAAoB;QAC/D,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAEvD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE9B,qCAAqC;QACrC,IAAI,MAAM,GAAwB,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,WAAW,CAAC;QAC7B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,WAAoB;QAC5C,MAAM,UAAU,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAEpE,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC7C,OAAO,MAAM,CAAC,OAAO,CAAC;gBACtB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,WAAoB;QACzC,sCAAsC;QACtC,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;YAC1D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,iDAAiD;YACjD,OAAO,CAAC,IAAI,CAAC,uCAAuC,kBAAkB,yBAAyB,CAAC,CAAC;QACnG,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAoB,EAAE,gBAAwB,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3C,OAAO,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,QAAQ,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,OAAoB;QAC7C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,wBAAwB;YACxB,OAAO,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC1D,YAAY,EAAE,OAAO,CAAC,WAAW;gBACjC,aAAa,EAAE,OAAO,CAAC,YAAY;aACpC,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,2BAA2B,CAAC,CAAC;YACjE,CAAC;YAED,iCAAiC;YACjC,MAAM,cAAc,GAAgB;gBAClC,GAAG,OAAO;gBACV,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;gBACtC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,YAAY;gBAChE,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAW,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;gBACvE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC,CAAC;YAEF,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACrD,OAAO,cAAc,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAA0B,KAAe,CAAC,OAAO,kCAAkC,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAEnD,8CAA8C;YAC9C,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,kCAAkC;YAClC,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;gBAC1B,gBAAgB;gBAChB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;gBACjE,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;gBAEzC,8BAA8B;gBAC9B,MAAM,SAAS,GAAiB;oBAC9B,OAAO,EAAE,KAAK;oBACd,cAAc,EAAE,SAAS;oBACzB,YAAY,EAAE,KAAK;iBACpB,CAAC;gBACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBAEvC,OAAO,IAAI,CAAC,CAAC,gEAAgE;YAC/E,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAoB;QACnC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAEnD,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,CAAC;aAAM,IAAI,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,aAAa;YAClD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAoB;QACvC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAEnD,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAEpC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7C,CAAC;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,KAAK,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,UAAU,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ProfileData } from './profile-manager.js';
|
|
2
|
+
/**
|
|
3
|
+
* SupabaseAuth handles browser-based Google OAuth authentication for CLI.
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. Start local HTTP server on localhost:54321
|
|
7
|
+
* 2. Generate PKCE code verifier and challenge
|
|
8
|
+
* 3. Open browser to Supabase OAuth URL with Google provider
|
|
9
|
+
* 4. User authenticates with Google
|
|
10
|
+
* 5. Supabase redirects to localhost:54321/callback with code
|
|
11
|
+
* 6. CLI exchanges code for session tokens
|
|
12
|
+
* 7. Return tokens to caller
|
|
13
|
+
*/
|
|
14
|
+
export declare class SupabaseAuth {
|
|
15
|
+
private supabase;
|
|
16
|
+
constructor();
|
|
17
|
+
/**
|
|
18
|
+
* Initiate Google OAuth login flow via browser
|
|
19
|
+
*/
|
|
20
|
+
loginWithGoogle(): Promise<Omit<ProfileData, 'name'>>;
|
|
21
|
+
/**
|
|
22
|
+
* Refresh an existing session using refresh token
|
|
23
|
+
*/
|
|
24
|
+
refreshSession(refreshToken: string): Promise<Omit<ProfileData, 'name'>>;
|
|
25
|
+
/**
|
|
26
|
+
* Sign out from Supabase (invalidate tokens)
|
|
27
|
+
*/
|
|
28
|
+
signOut(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Get success HTML page for browser
|
|
31
|
+
*/
|
|
32
|
+
private getSuccessHtml;
|
|
33
|
+
/**
|
|
34
|
+
* Get error HTML page for browser
|
|
35
|
+
*/
|
|
36
|
+
private getErrorHtml;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the OAuth URL for manual browser opening (fallback)
|
|
40
|
+
*/
|
|
41
|
+
export declare function getOAuthUrl(): string;
|
|
42
|
+
//# sourceMappingURL=supabase-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-auth.d.ts","sourceRoot":"","sources":["../../src/lib/supabase-auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA+BxD;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;;IAMjC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IA8I3D;;OAEG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAuB9E;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;OAEG;IACH,OAAO,CAAC,cAAc;IA+FtB;;OAEG;IACH,OAAO,CAAC,YAAY;CAqFrB;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC"}
|