@braingrid/cli 0.0.2
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/README.md +164 -0
- package/dist/.build-info.json +9 -0
- package/dist/build-config.d.ts +25 -0
- package/dist/build-config.d.ts.map +1 -0
- package/dist/build-config.js +27 -0
- package/dist/build-config.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +246 -0
- package/dist/cli.js.map +1 -0
- package/dist/handlers/auth.handlers.d.ts +13 -0
- package/dist/handlers/auth.handlers.d.ts.map +1 -0
- package/dist/handlers/auth.handlers.js +99 -0
- package/dist/handlers/auth.handlers.js.map +1 -0
- package/dist/handlers/index.d.ts +11 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +11 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/project.handlers.d.ts +29 -0
- package/dist/handlers/project.handlers.d.ts.map +1 -0
- package/dist/handlers/project.handlers.js +200 -0
- package/dist/handlers/project.handlers.js.map +1 -0
- package/dist/handlers/requirement.handlers.d.ts +32 -0
- package/dist/handlers/requirement.handlers.d.ts.map +1 -0
- package/dist/handlers/requirement.handlers.js +234 -0
- package/dist/handlers/requirement.handlers.js.map +1 -0
- package/dist/handlers/status.handlers.d.ts +12 -0
- package/dist/handlers/status.handlers.d.ts.map +1 -0
- package/dist/handlers/status.handlers.js +209 -0
- package/dist/handlers/status.handlers.js.map +1 -0
- package/dist/handlers/task.handlers.d.ts +29 -0
- package/dist/handlers/task.handlers.d.ts.map +1 -0
- package/dist/handlers/task.handlers.js +272 -0
- package/dist/handlers/task.handlers.js.map +1 -0
- package/dist/handlers/types.d.ts +10 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +5 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/services/auth.d.ts +41 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +498 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/claude.d.ts +18 -0
- package/dist/services/claude.d.ts.map +1 -0
- package/dist/services/claude.js +164 -0
- package/dist/services/claude.js.map +1 -0
- package/dist/services/context-manager.d.ts +170 -0
- package/dist/services/context-manager.d.ts.map +1 -0
- package/dist/services/context-manager.js +261 -0
- package/dist/services/context-manager.js.map +1 -0
- package/dist/services/credential-store.d.ts +47 -0
- package/dist/services/credential-store.d.ts.map +1 -0
- package/dist/services/credential-store.js +88 -0
- package/dist/services/credential-store.js.map +1 -0
- package/dist/services/oauth2-auth.d.ts +60 -0
- package/dist/services/oauth2-auth.d.ts.map +1 -0
- package/dist/services/oauth2-auth.js +377 -0
- package/dist/services/oauth2-auth.js.map +1 -0
- package/dist/services/project-service.d.ts +22 -0
- package/dist/services/project-service.d.ts.map +1 -0
- package/dist/services/project-service.js +52 -0
- package/dist/services/project-service.js.map +1 -0
- package/dist/services/requirement-service.d.ts +32 -0
- package/dist/services/requirement-service.d.ts.map +1 -0
- package/dist/services/requirement-service.js +91 -0
- package/dist/services/requirement-service.js.map +1 -0
- package/dist/services/task-service.d.ts +22 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +52 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +40 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/types/api.d.ts +16 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +5 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/auth.d.ts +68 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/claude.d.ts +22 -0
- package/dist/types/claude.d.ts.map +1 -0
- package/dist/types/claude.js +2 -0
- package/dist/types/claude.js.map +1 -0
- package/dist/types/project.d.ts +32 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +5 -0
- package/dist/types/project.js.map +1 -0
- package/dist/types/requirement.d.ts +69 -0
- package/dist/types/requirement.d.ts.map +1 -0
- package/dist/types/requirement.js +5 -0
- package/dist/types/requirement.js.map +1 -0
- package/dist/types/task.d.ts +44 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +5 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/axios-retry.d.ts +25 -0
- package/dist/utils/axios-retry.d.ts.map +1 -0
- package/dist/utils/axios-retry.js +174 -0
- package/dist/utils/axios-retry.js.map +1 -0
- package/dist/utils/axios-with-auth.d.ts +10 -0
- package/dist/utils/axios-with-auth.d.ts.map +1 -0
- package/dist/utils/axios-with-auth.js +118 -0
- package/dist/utils/axios-with-auth.js.map +1 -0
- package/dist/utils/cli-tools.d.ts +30 -0
- package/dist/utils/cli-tools.d.ts.map +1 -0
- package/dist/utils/cli-tools.js +131 -0
- package/dist/utils/cli-tools.js.map +1 -0
- package/dist/utils/command-execution.d.ts +30 -0
- package/dist/utils/command-execution.d.ts.map +1 -0
- package/dist/utils/command-execution.js +264 -0
- package/dist/utils/command-execution.js.map +1 -0
- package/dist/utils/command-parser.d.ts +85 -0
- package/dist/utils/command-parser.d.ts.map +1 -0
- package/dist/utils/command-parser.js +287 -0
- package/dist/utils/command-parser.js.map +1 -0
- package/dist/utils/config.d.ts +9 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +59 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/error-formatter.d.ts +17 -0
- package/dist/utils/error-formatter.d.ts.map +1 -0
- package/dist/utils/error-formatter.js +115 -0
- package/dist/utils/error-formatter.js.map +1 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +122 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/git.d.ts +55 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +131 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/jwt.d.ts +45 -0
- package/dist/utils/jwt.d.ts.map +1 -0
- package/dist/utils/jwt.js +64 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +176 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/requirements.d.ts +28 -0
- package/dist/utils/requirements.d.ts.map +1 -0
- package/dist/utils/requirements.js +54 -0
- package/dist/utils/requirements.js.map +1 -0
- package/dist/utils/status-parser.d.ts +95 -0
- package/dist/utils/status-parser.d.ts.map +1 -0
- package/dist/utils/status-parser.js +189 -0
- package/dist/utils/status-parser.js.map +1 -0
- package/dist/utils/tasks.d.ts +9 -0
- package/dist/utils/tasks.d.ts.map +1 -0
- package/dist/utils/tasks.js +38 -0
- package/dist/utils/tasks.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { axiosWithRetry } from '../utils/axios-retry.js';
|
|
3
|
+
import { OAuth2Handler } from './oauth2-auth.js';
|
|
4
|
+
import { getConfig } from '../utils/config.js';
|
|
5
|
+
import { decodeJWT, isJWTExpired, extractUserFromJWT } from '../utils/jwt.js';
|
|
6
|
+
import { getLogger } from '../utils/logger.js';
|
|
7
|
+
import { credentialStore } from './credential-store.js';
|
|
8
|
+
const KEYCHAIN_SERVICE = 'braingrid-cli';
|
|
9
|
+
const KEYCHAIN_ACCOUNT = 'session';
|
|
10
|
+
const GITHUB_KEYCHAIN_ACCOUNT = 'github-token';
|
|
11
|
+
export class BraingridAuth {
|
|
12
|
+
constructor(baseUrl) {
|
|
13
|
+
this.lastValidationTime = 0;
|
|
14
|
+
this.lastValidationResult = false;
|
|
15
|
+
this.loginTime = 0;
|
|
16
|
+
this.VALIDATION_CACHE_MS = 60 * 60 * 1000; // Cache validation for 1 hour
|
|
17
|
+
this.POST_LOGIN_GRACE_MS = 24 * 60 * 60 * 1000; // 24 hours grace period after login
|
|
18
|
+
this.oauthHandler = null;
|
|
19
|
+
this.logger = getLogger();
|
|
20
|
+
const config = getConfig();
|
|
21
|
+
this.baseUrl = baseUrl || config.apiUrl || 'https://app.braingrid.ai';
|
|
22
|
+
}
|
|
23
|
+
async isAuthenticated(forceValidation = false) {
|
|
24
|
+
try {
|
|
25
|
+
const session = await this.getStoredSession();
|
|
26
|
+
if (!session) {
|
|
27
|
+
this.logger.debug('[AUTH] No stored session found');
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
// Debug: Log session dates
|
|
31
|
+
this.logger.debug('[AUTH] Session dates:', {
|
|
32
|
+
created_at: session.created_at,
|
|
33
|
+
updated_at: session.updated_at,
|
|
34
|
+
login_time: session.login_time,
|
|
35
|
+
now: new Date(),
|
|
36
|
+
});
|
|
37
|
+
// Check if session is expired (JWT tokens expire in 1 hour)
|
|
38
|
+
if (this.isSessionExpired(session)) {
|
|
39
|
+
this.logger.debug('[AUTH] Session expired (JWT token expired) - attempting automatic refresh');
|
|
40
|
+
// Attempt to refresh the session using refresh token
|
|
41
|
+
const refreshed = await this.refreshSession();
|
|
42
|
+
if (refreshed) {
|
|
43
|
+
this.logger.debug('[AUTH] Session refreshed successfully');
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
this.logger.debug('[AUTH] Session refresh failed - authentication required');
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
// If forced validation is requested, skip all caching and validate with server
|
|
51
|
+
if (forceValidation) {
|
|
52
|
+
this.logger.debug('[AUTH] Force validation requested - calling server');
|
|
53
|
+
const validationResult = await this.validateSessionWithServer(session);
|
|
54
|
+
this.lastValidationTime = now;
|
|
55
|
+
this.lastValidationResult = validationResult.isValid;
|
|
56
|
+
this.logger.debug(`[AUTH] Server validation result: isValid=${validationResult.isValid}, shouldClearSession=${validationResult.shouldClearSession}`);
|
|
57
|
+
if (!validationResult.isValid && validationResult.shouldClearSession) {
|
|
58
|
+
this.logger.debug('[AUTH] Clearing session due to validation failure');
|
|
59
|
+
await this.clearSession();
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return validationResult.isValid;
|
|
63
|
+
}
|
|
64
|
+
// Grace period: If we're within 1 hour of login, skip server validation
|
|
65
|
+
// Reduced from 24 hours to 1 hour to catch auth issues faster
|
|
66
|
+
let effectiveLoginTime = this.loginTime;
|
|
67
|
+
if (effectiveLoginTime === 0) {
|
|
68
|
+
// Restore login time from session if not set (CLI restart scenario)
|
|
69
|
+
if (session.login_time) {
|
|
70
|
+
effectiveLoginTime = session.login_time.getTime();
|
|
71
|
+
this.loginTime = effectiveLoginTime;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Fallback to updated_at if login_time is not available (old sessions)
|
|
75
|
+
effectiveLoginTime = session.updated_at.getTime();
|
|
76
|
+
this.loginTime = effectiveLoginTime;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const timeSinceLogin = now - effectiveLoginTime;
|
|
80
|
+
const graceMs = 60 * 60 * 1000; // 1 hour instead of 24 hours
|
|
81
|
+
this.logger.debug(`[AUTH] Time since login: ${timeSinceLogin}ms (${Math.round(timeSinceLogin / 1000)}s), grace period: ${graceMs}ms`);
|
|
82
|
+
this.logger.debug(`[AUTH] Login time: ${new Date(effectiveLoginTime)}, Now: ${new Date(now)}`);
|
|
83
|
+
if (timeSinceLogin < graceMs) {
|
|
84
|
+
// Within 1-hour grace period after login - skip server validation
|
|
85
|
+
this.logger.debug('[AUTH] Within grace period - skipping server validation');
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
// Use cached validation result if recent enough (15 minutes instead of 1 hour)
|
|
89
|
+
const cacheMs = 15 * 60 * 1000; // 15 minutes
|
|
90
|
+
if (now - this.lastValidationTime < cacheMs && this.lastValidationResult) {
|
|
91
|
+
// Only trust positive cached results, always revalidate failures
|
|
92
|
+
return this.lastValidationResult;
|
|
93
|
+
}
|
|
94
|
+
// Validate with server
|
|
95
|
+
const validationResult = await this.validateSessionWithServer(session);
|
|
96
|
+
this.lastValidationTime = now;
|
|
97
|
+
this.lastValidationResult = validationResult.isValid;
|
|
98
|
+
// Update user data if validation returned fresh user info
|
|
99
|
+
if (validationResult.user && session.user) {
|
|
100
|
+
session.user = validationResult.user;
|
|
101
|
+
}
|
|
102
|
+
// Only clear session for definitive authentication failures, not temporary issues
|
|
103
|
+
if (!validationResult.isValid) {
|
|
104
|
+
if (validationResult.shouldClearSession) {
|
|
105
|
+
// Clear session only for permanent auth failures (401, 403, invalid token)
|
|
106
|
+
await this.clearSession();
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// For temporary issues (network errors, 500s, redirects), don't clear session
|
|
111
|
+
// Fall back to local session check to be more forgiving
|
|
112
|
+
return !this.isSessionExpired(session);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// On any error, check if we have a local session that isn't expired
|
|
119
|
+
try {
|
|
120
|
+
const session = await this.getStoredSession();
|
|
121
|
+
return session !== null && !this.isSessionExpired(session);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async getCurrentUser() {
|
|
129
|
+
try {
|
|
130
|
+
const session = await this.getStoredSession();
|
|
131
|
+
if (!session)
|
|
132
|
+
return null;
|
|
133
|
+
// First try to get user from stored session
|
|
134
|
+
if (session.user && session.user.id && session.user.email) {
|
|
135
|
+
return session.user;
|
|
136
|
+
}
|
|
137
|
+
// If user info is missing or incomplete, decode from JWT
|
|
138
|
+
const jwtPayload = decodeJWT(session.sealed_session);
|
|
139
|
+
if (!jwtPayload) {
|
|
140
|
+
// If we can't decode the JWT, return what we have
|
|
141
|
+
return session.user || null;
|
|
142
|
+
}
|
|
143
|
+
// Extract user info from JWT
|
|
144
|
+
const userInfo = extractUserFromJWT(jwtPayload);
|
|
145
|
+
// Create a User object from JWT data
|
|
146
|
+
const user = {
|
|
147
|
+
object: 'user',
|
|
148
|
+
id: userInfo.id,
|
|
149
|
+
email: userInfo.email,
|
|
150
|
+
emailVerified: true, // Assume verified if they have a valid JWT
|
|
151
|
+
firstName: userInfo.firstName,
|
|
152
|
+
lastName: userInfo.lastName,
|
|
153
|
+
profilePictureUrl: '', // Not available in JWT
|
|
154
|
+
createdAt: new Date(jwtPayload.iat ? jwtPayload.iat * 1000 : Date.now()).toISOString(),
|
|
155
|
+
updatedAt: new Date().toISOString(),
|
|
156
|
+
lastSignInAt: new Date().toISOString(),
|
|
157
|
+
externalId: null,
|
|
158
|
+
metadata: jwtPayload.metadata || {},
|
|
159
|
+
};
|
|
160
|
+
// Update the stored session with user info from JWT
|
|
161
|
+
session.user = user;
|
|
162
|
+
await this.storeSession(session);
|
|
163
|
+
return user;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async hasStoredSession() {
|
|
170
|
+
try {
|
|
171
|
+
const session = await this.getStoredSession();
|
|
172
|
+
return session !== null && !this.isSessionExpired(session);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async getStoredSession() {
|
|
179
|
+
try {
|
|
180
|
+
const sessionData = await credentialStore.getPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
|
|
181
|
+
if (!sessionData)
|
|
182
|
+
return null;
|
|
183
|
+
const session = JSON.parse(sessionData);
|
|
184
|
+
return {
|
|
185
|
+
...session,
|
|
186
|
+
created_at: new Date(session.created_at),
|
|
187
|
+
updated_at: new Date(session.updated_at),
|
|
188
|
+
login_time: session.login_time ? new Date(session.login_time) : undefined,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async storeSession(session) {
|
|
196
|
+
const now = new Date();
|
|
197
|
+
// Add login time to session data for persistence across CLI instances
|
|
198
|
+
const sessionWithLoginTime = {
|
|
199
|
+
...session,
|
|
200
|
+
login_time: now,
|
|
201
|
+
};
|
|
202
|
+
const sessionData = JSON.stringify(sessionWithLoginTime);
|
|
203
|
+
await credentialStore.setPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, sessionData);
|
|
204
|
+
// Mark session as valid when we store it and record login time
|
|
205
|
+
const nowMs = now.getTime();
|
|
206
|
+
this.lastValidationTime = nowMs;
|
|
207
|
+
this.lastValidationResult = true;
|
|
208
|
+
this.loginTime = nowMs;
|
|
209
|
+
}
|
|
210
|
+
async clearSession() {
|
|
211
|
+
await credentialStore.deletePassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
|
|
212
|
+
// Also clear refresh token
|
|
213
|
+
await credentialStore.deletePassword(KEYCHAIN_SERVICE, 'refresh-token');
|
|
214
|
+
this.refreshTokenValue = undefined;
|
|
215
|
+
// Clear the validation cache when session is cleared
|
|
216
|
+
this.lastValidationTime = 0;
|
|
217
|
+
this.lastValidationResult = false;
|
|
218
|
+
}
|
|
219
|
+
async handleAuthenticationError() {
|
|
220
|
+
// Clear validation cache but don't automatically clear session
|
|
221
|
+
// Let the user explicitly re-authenticate if needed
|
|
222
|
+
this.lastValidationTime = 0;
|
|
223
|
+
this.lastValidationResult = false;
|
|
224
|
+
}
|
|
225
|
+
async login(onAuthUrl) {
|
|
226
|
+
try {
|
|
227
|
+
// Use OAuth2 Authorization Code Flow with PKCE for authentication
|
|
228
|
+
this.oauthHandler = new OAuth2Handler();
|
|
229
|
+
// Set callback if provided
|
|
230
|
+
if (onAuthUrl) {
|
|
231
|
+
this.oauthHandler.setAuthUrlCallback(onAuthUrl);
|
|
232
|
+
}
|
|
233
|
+
const authResult = await this.oauthHandler.authenticate();
|
|
234
|
+
// Store refresh token separately if available
|
|
235
|
+
if (authResult.refreshToken) {
|
|
236
|
+
this.refreshTokenValue = authResult.refreshToken;
|
|
237
|
+
// Store refresh token securely
|
|
238
|
+
await credentialStore.setPassword(KEYCHAIN_SERVICE, 'refresh-token', authResult.refreshToken);
|
|
239
|
+
}
|
|
240
|
+
// Use ID token if available, otherwise use access token
|
|
241
|
+
const tokenToProcess = authResult.idToken || authResult.accessToken;
|
|
242
|
+
// Extract user info from JWT
|
|
243
|
+
const jwtPayload = decodeJWT(tokenToProcess);
|
|
244
|
+
if (!jwtPayload) {
|
|
245
|
+
throw new Error('Invalid token received - unable to decode');
|
|
246
|
+
}
|
|
247
|
+
// Extract user info from JWT
|
|
248
|
+
const userInfo = extractUserFromJWT(jwtPayload);
|
|
249
|
+
// Create user object from JWT data
|
|
250
|
+
const user = {
|
|
251
|
+
object: 'user',
|
|
252
|
+
id: userInfo.id,
|
|
253
|
+
email: userInfo.email,
|
|
254
|
+
emailVerified: true, // Assume verified if they have a valid JWT
|
|
255
|
+
firstName: userInfo.firstName,
|
|
256
|
+
lastName: userInfo.lastName,
|
|
257
|
+
profilePictureUrl: '', // Not available in JWT
|
|
258
|
+
createdAt: new Date(jwtPayload.iat ? jwtPayload.iat * 1000 : Date.now()).toISOString(),
|
|
259
|
+
updatedAt: new Date().toISOString(),
|
|
260
|
+
lastSignInAt: new Date().toISOString(),
|
|
261
|
+
externalId: null,
|
|
262
|
+
metadata: jwtPayload.metadata || {},
|
|
263
|
+
};
|
|
264
|
+
// Store the session
|
|
265
|
+
const session = {
|
|
266
|
+
user: user,
|
|
267
|
+
sealed_session: authResult.accessToken, // Store access token as sealed_session
|
|
268
|
+
organization_id: jwtPayload.organization_id || 'default', // Use organization from token or default
|
|
269
|
+
created_at: new Date(),
|
|
270
|
+
updated_at: new Date(),
|
|
271
|
+
login_time: new Date(),
|
|
272
|
+
};
|
|
273
|
+
await this.storeSession(session);
|
|
274
|
+
return { user, success: true };
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
if (this.oauthHandler) {
|
|
278
|
+
this.oauthHandler.abort();
|
|
279
|
+
this.oauthHandler = null;
|
|
280
|
+
}
|
|
281
|
+
throw new Error(`Login failed: ${error}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
cancelLogin() {
|
|
285
|
+
if (this.oauthHandler) {
|
|
286
|
+
this.oauthHandler.abort();
|
|
287
|
+
this.oauthHandler = null;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
async logout() {
|
|
291
|
+
await this.clearSession();
|
|
292
|
+
}
|
|
293
|
+
async refreshSession() {
|
|
294
|
+
try {
|
|
295
|
+
const session = await this.getStoredSession();
|
|
296
|
+
if (!session) {
|
|
297
|
+
this.logger.debug('[AUTH] No session found for refresh');
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
// Get stored refresh token
|
|
301
|
+
let refreshToken = this.refreshTokenValue;
|
|
302
|
+
if (!refreshToken) {
|
|
303
|
+
refreshToken =
|
|
304
|
+
(await credentialStore.getPassword(KEYCHAIN_SERVICE, 'refresh-token')) || undefined;
|
|
305
|
+
}
|
|
306
|
+
if (!refreshToken) {
|
|
307
|
+
// No refresh token available, cannot refresh
|
|
308
|
+
this.logger.debug('[AUTH] No refresh token available');
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
this.logger.debug('[AUTH] Attempting to refresh access token');
|
|
312
|
+
// Use OAuth2 handler to refresh the token
|
|
313
|
+
const handler = new OAuth2Handler();
|
|
314
|
+
const authResult = await handler.refreshToken(refreshToken);
|
|
315
|
+
// Update stored refresh token if new one provided
|
|
316
|
+
if (authResult.refreshToken && authResult.refreshToken !== refreshToken) {
|
|
317
|
+
this.refreshTokenValue = authResult.refreshToken;
|
|
318
|
+
await credentialStore.setPassword(KEYCHAIN_SERVICE, 'refresh-token', authResult.refreshToken);
|
|
319
|
+
this.logger.debug('[AUTH] Refresh token rotated');
|
|
320
|
+
}
|
|
321
|
+
// Update session with new access token
|
|
322
|
+
session.sealed_session = authResult.accessToken;
|
|
323
|
+
session.updated_at = new Date();
|
|
324
|
+
await this.storeSession(session);
|
|
325
|
+
this.logger.debug('[AUTH] Access token refreshed successfully');
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
330
|
+
this.logger.warn(`[AUTH] Token refresh failed: ${errorMsg}`);
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
async validateSessionWithServer(session) {
|
|
335
|
+
try {
|
|
336
|
+
this.logger.debug(`[AUTH] Making API call to ${this.baseUrl}/api/v1/auth/validate for session validation`);
|
|
337
|
+
// Use the new v1 auth validate endpoint
|
|
338
|
+
const response = await axiosWithRetry({
|
|
339
|
+
url: `${this.baseUrl}/api/v1/auth/validate`,
|
|
340
|
+
method: 'POST',
|
|
341
|
+
headers: {
|
|
342
|
+
'Content-Type': 'application/json',
|
|
343
|
+
Authorization: `Bearer ${session.sealed_session}`,
|
|
344
|
+
},
|
|
345
|
+
maxRedirects: 0, // Don't follow redirects
|
|
346
|
+
validateStatus: status => status < 500, // Accept all status codes < 500
|
|
347
|
+
}, {
|
|
348
|
+
maxRetries: 2,
|
|
349
|
+
initialDelay: 500,
|
|
350
|
+
onRetry: (attempt, delay) => {
|
|
351
|
+
console.warn(`Retrying session validation (attempt ${attempt}) after ${delay}ms`);
|
|
352
|
+
},
|
|
353
|
+
});
|
|
354
|
+
this.logger.debug(`[AUTH] API response: status=${response.status}, contentType=${response.headers['content-type']}`);
|
|
355
|
+
// Debug response data
|
|
356
|
+
if (response.headers['content-type']?.includes('application/json')) {
|
|
357
|
+
this.logger.debug('[AUTH] API response data:', {
|
|
358
|
+
data: JSON.stringify(response.data).substring(0, 200),
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
// Handle redirects (302, 307) - likely temporary, don't clear session
|
|
362
|
+
if (response.status === 302 || response.status === 307) {
|
|
363
|
+
this.logger.warn(`Session validation received ${response.status} redirect - treating as temporary issue`);
|
|
364
|
+
return { isValid: false, shouldClearSession: false };
|
|
365
|
+
}
|
|
366
|
+
if (response.status === 200) {
|
|
367
|
+
// Parse the validation response
|
|
368
|
+
const validationData = response.data;
|
|
369
|
+
if (validationData.valid === true && validationData.user) {
|
|
370
|
+
// Extract user information from the validation response
|
|
371
|
+
const user = {
|
|
372
|
+
object: 'user',
|
|
373
|
+
id: validationData.user.id,
|
|
374
|
+
email: validationData.user.email,
|
|
375
|
+
emailVerified: true, // Assume verified if they have a valid token
|
|
376
|
+
firstName: validationData.user.firstName || '',
|
|
377
|
+
lastName: validationData.user.lastName || '',
|
|
378
|
+
profilePictureUrl: validationData.user.avatar || '',
|
|
379
|
+
createdAt: session.user?.createdAt || new Date().toISOString(),
|
|
380
|
+
updatedAt: new Date().toISOString(),
|
|
381
|
+
lastSignInAt: new Date().toISOString(),
|
|
382
|
+
externalId: null,
|
|
383
|
+
metadata: {
|
|
384
|
+
username: validationData.user.username,
|
|
385
|
+
organizationId: validationData.organization?.id,
|
|
386
|
+
organizationName: validationData.organization?.name,
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
// Update the stored session with fresh user info
|
|
390
|
+
if (session.user?.id !== user.id ||
|
|
391
|
+
session.user?.email !== user.email ||
|
|
392
|
+
session.user?.firstName !== user.firstName ||
|
|
393
|
+
session.user?.lastName !== user.lastName) {
|
|
394
|
+
session.user = user;
|
|
395
|
+
session.organization_id = validationData.organization?.id || session.organization_id;
|
|
396
|
+
await this.storeSession(session);
|
|
397
|
+
}
|
|
398
|
+
return { isValid: true, shouldClearSession: false, user };
|
|
399
|
+
}
|
|
400
|
+
else if (validationData.valid === false) {
|
|
401
|
+
// Token is explicitly invalid
|
|
402
|
+
this.logger.warn('Token validation failed: token is invalid');
|
|
403
|
+
return { isValid: false, shouldClearSession: true };
|
|
404
|
+
}
|
|
405
|
+
// Unexpected response format
|
|
406
|
+
this.logger.warn('Unexpected validation response format');
|
|
407
|
+
return { isValid: false, shouldClearSession: false };
|
|
408
|
+
}
|
|
409
|
+
else if (response.status === 401 || response.status === 403) {
|
|
410
|
+
// Clear session for definitive authentication failures
|
|
411
|
+
this.logger.warn(`Session validation failed: ${response.status} ${response.statusText} - clearing session`);
|
|
412
|
+
return { isValid: false, shouldClearSession: true };
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
// For other errors (500, 404, etc.), don't clear session - might be temporary
|
|
416
|
+
this.logger.warn(`API error during session validation: ${response.status} - assuming session is valid`);
|
|
417
|
+
return { isValid: true, shouldClearSession: false }; // Assume session is still valid, server might be having issues
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
// Network error or API unavailable - don't clear session, might be temporary
|
|
422
|
+
this.logger.warn('Network error during session validation - assuming session is valid:', {
|
|
423
|
+
error,
|
|
424
|
+
});
|
|
425
|
+
return { isValid: true, shouldClearSession: false };
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
isSessionExpired(session) {
|
|
429
|
+
// JWT tokens expire in 1 hour, so we only need to check JWT expiry
|
|
430
|
+
return isJWTExpired(session.sealed_session);
|
|
431
|
+
}
|
|
432
|
+
getUserDisplayName(user) {
|
|
433
|
+
if (user.firstName && user.lastName) {
|
|
434
|
+
return `${user.firstName} ${user.lastName}`;
|
|
435
|
+
}
|
|
436
|
+
if (user.firstName) {
|
|
437
|
+
return user.firstName;
|
|
438
|
+
}
|
|
439
|
+
if (user.email) {
|
|
440
|
+
return user.email;
|
|
441
|
+
}
|
|
442
|
+
return 'Unknown User';
|
|
443
|
+
}
|
|
444
|
+
isUserValid(user) {
|
|
445
|
+
return Boolean(user.id && user.email);
|
|
446
|
+
}
|
|
447
|
+
isSessionValid(session) {
|
|
448
|
+
return this.isUserValid(session.user) && Boolean(session.sealed_session);
|
|
449
|
+
}
|
|
450
|
+
// GitHub token management methods
|
|
451
|
+
async getStoredGitHubToken() {
|
|
452
|
+
try {
|
|
453
|
+
return await credentialStore.getPassword(KEYCHAIN_SERVICE, GITHUB_KEYCHAIN_ACCOUNT);
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
async storeGitHubToken(token) {
|
|
460
|
+
if (!token || !token.trim()) {
|
|
461
|
+
throw new Error('GitHub token cannot be empty');
|
|
462
|
+
}
|
|
463
|
+
await credentialStore.setPassword(KEYCHAIN_SERVICE, GITHUB_KEYCHAIN_ACCOUNT, token.trim());
|
|
464
|
+
}
|
|
465
|
+
async clearGitHubToken() {
|
|
466
|
+
await credentialStore.deletePassword(KEYCHAIN_SERVICE, GITHUB_KEYCHAIN_ACCOUNT);
|
|
467
|
+
}
|
|
468
|
+
async validateGitHubToken(token) {
|
|
469
|
+
try {
|
|
470
|
+
const tokenToValidate = token || (await this.getStoredGitHubToken());
|
|
471
|
+
if (!tokenToValidate) {
|
|
472
|
+
return { valid: false };
|
|
473
|
+
}
|
|
474
|
+
const response = await axios.get('https://api.github.com/user', {
|
|
475
|
+
headers: {
|
|
476
|
+
Accept: 'application/vnd.github+json',
|
|
477
|
+
Authorization: `Bearer ${tokenToValidate}`,
|
|
478
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
479
|
+
'User-Agent': 'Braingrid-CLI',
|
|
480
|
+
},
|
|
481
|
+
});
|
|
482
|
+
if (response.status >= 400) {
|
|
483
|
+
return { valid: false };
|
|
484
|
+
}
|
|
485
|
+
const user = response.data;
|
|
486
|
+
const scopes = response.headers['x-oauth-scopes']?.split(', ') || [];
|
|
487
|
+
return {
|
|
488
|
+
valid: true,
|
|
489
|
+
user,
|
|
490
|
+
scopes,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
return { valid: false };
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TaskRequest, ClaudeOutput } from '../types/claude.js';
|
|
2
|
+
export declare class ClaudeWrapper {
|
|
3
|
+
private executablePath;
|
|
4
|
+
private workingDir;
|
|
5
|
+
private verbose;
|
|
6
|
+
private timeout;
|
|
7
|
+
constructor(execPath?: string);
|
|
8
|
+
setVerbose(verbose: boolean): void;
|
|
9
|
+
setWorkingDir(dir: string): void;
|
|
10
|
+
setTimeout(timeout: number): void;
|
|
11
|
+
execute(args: string[]): Promise<ClaudeOutput>;
|
|
12
|
+
executeTask(task: TaskRequest): Promise<ClaudeOutput>;
|
|
13
|
+
streamOutput(args: string[], onOutput: (line: string) => void): Promise<void>;
|
|
14
|
+
checkInstallation(): Promise<boolean>;
|
|
15
|
+
getVersion(): Promise<string>;
|
|
16
|
+
private buildTaskArgs;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/D,qBAAa,aAAa;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,QAAQ,GAAE,MAAiB;IAOvC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIhC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAuD9C,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAarD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA2C7E,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IASnC,OAAO,CAAC,aAAa;CAwCrB"}
|