@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.
Files changed (155) hide show
  1. package/README.md +164 -0
  2. package/dist/.build-info.json +9 -0
  3. package/dist/build-config.d.ts +25 -0
  4. package/dist/build-config.d.ts.map +1 -0
  5. package/dist/build-config.js +27 -0
  6. package/dist/build-config.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +246 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/handlers/auth.handlers.d.ts +13 -0
  12. package/dist/handlers/auth.handlers.d.ts.map +1 -0
  13. package/dist/handlers/auth.handlers.js +99 -0
  14. package/dist/handlers/auth.handlers.js.map +1 -0
  15. package/dist/handlers/index.d.ts +11 -0
  16. package/dist/handlers/index.d.ts.map +1 -0
  17. package/dist/handlers/index.js +11 -0
  18. package/dist/handlers/index.js.map +1 -0
  19. package/dist/handlers/project.handlers.d.ts +29 -0
  20. package/dist/handlers/project.handlers.d.ts.map +1 -0
  21. package/dist/handlers/project.handlers.js +200 -0
  22. package/dist/handlers/project.handlers.js.map +1 -0
  23. package/dist/handlers/requirement.handlers.d.ts +32 -0
  24. package/dist/handlers/requirement.handlers.d.ts.map +1 -0
  25. package/dist/handlers/requirement.handlers.js +234 -0
  26. package/dist/handlers/requirement.handlers.js.map +1 -0
  27. package/dist/handlers/status.handlers.d.ts +12 -0
  28. package/dist/handlers/status.handlers.d.ts.map +1 -0
  29. package/dist/handlers/status.handlers.js +209 -0
  30. package/dist/handlers/status.handlers.js.map +1 -0
  31. package/dist/handlers/task.handlers.d.ts +29 -0
  32. package/dist/handlers/task.handlers.d.ts.map +1 -0
  33. package/dist/handlers/task.handlers.js +272 -0
  34. package/dist/handlers/task.handlers.js.map +1 -0
  35. package/dist/handlers/types.d.ts +10 -0
  36. package/dist/handlers/types.d.ts.map +1 -0
  37. package/dist/handlers/types.js +5 -0
  38. package/dist/handlers/types.js.map +1 -0
  39. package/dist/services/auth.d.ts +41 -0
  40. package/dist/services/auth.d.ts.map +1 -0
  41. package/dist/services/auth.js +498 -0
  42. package/dist/services/auth.js.map +1 -0
  43. package/dist/services/claude.d.ts +18 -0
  44. package/dist/services/claude.d.ts.map +1 -0
  45. package/dist/services/claude.js +164 -0
  46. package/dist/services/claude.js.map +1 -0
  47. package/dist/services/context-manager.d.ts +170 -0
  48. package/dist/services/context-manager.d.ts.map +1 -0
  49. package/dist/services/context-manager.js +261 -0
  50. package/dist/services/context-manager.js.map +1 -0
  51. package/dist/services/credential-store.d.ts +47 -0
  52. package/dist/services/credential-store.d.ts.map +1 -0
  53. package/dist/services/credential-store.js +88 -0
  54. package/dist/services/credential-store.js.map +1 -0
  55. package/dist/services/oauth2-auth.d.ts +60 -0
  56. package/dist/services/oauth2-auth.d.ts.map +1 -0
  57. package/dist/services/oauth2-auth.js +377 -0
  58. package/dist/services/oauth2-auth.js.map +1 -0
  59. package/dist/services/project-service.d.ts +22 -0
  60. package/dist/services/project-service.d.ts.map +1 -0
  61. package/dist/services/project-service.js +52 -0
  62. package/dist/services/project-service.js.map +1 -0
  63. package/dist/services/requirement-service.d.ts +32 -0
  64. package/dist/services/requirement-service.d.ts.map +1 -0
  65. package/dist/services/requirement-service.js +91 -0
  66. package/dist/services/requirement-service.js.map +1 -0
  67. package/dist/services/task-service.d.ts +22 -0
  68. package/dist/services/task-service.d.ts.map +1 -0
  69. package/dist/services/task-service.js +52 -0
  70. package/dist/services/task-service.js.map +1 -0
  71. package/dist/test/setup.d.ts +2 -0
  72. package/dist/test/setup.d.ts.map +1 -0
  73. package/dist/test/setup.js +40 -0
  74. package/dist/test/setup.js.map +1 -0
  75. package/dist/types/api.d.ts +16 -0
  76. package/dist/types/api.d.ts.map +1 -0
  77. package/dist/types/api.js +5 -0
  78. package/dist/types/api.js.map +1 -0
  79. package/dist/types/auth.d.ts +68 -0
  80. package/dist/types/auth.d.ts.map +1 -0
  81. package/dist/types/auth.js +2 -0
  82. package/dist/types/auth.js.map +1 -0
  83. package/dist/types/claude.d.ts +22 -0
  84. package/dist/types/claude.d.ts.map +1 -0
  85. package/dist/types/claude.js +2 -0
  86. package/dist/types/claude.js.map +1 -0
  87. package/dist/types/project.d.ts +32 -0
  88. package/dist/types/project.d.ts.map +1 -0
  89. package/dist/types/project.js +5 -0
  90. package/dist/types/project.js.map +1 -0
  91. package/dist/types/requirement.d.ts +69 -0
  92. package/dist/types/requirement.d.ts.map +1 -0
  93. package/dist/types/requirement.js +5 -0
  94. package/dist/types/requirement.js.map +1 -0
  95. package/dist/types/task.d.ts +44 -0
  96. package/dist/types/task.d.ts.map +1 -0
  97. package/dist/types/task.js +5 -0
  98. package/dist/types/task.js.map +1 -0
  99. package/dist/utils/axios-retry.d.ts +25 -0
  100. package/dist/utils/axios-retry.d.ts.map +1 -0
  101. package/dist/utils/axios-retry.js +174 -0
  102. package/dist/utils/axios-retry.js.map +1 -0
  103. package/dist/utils/axios-with-auth.d.ts +10 -0
  104. package/dist/utils/axios-with-auth.d.ts.map +1 -0
  105. package/dist/utils/axios-with-auth.js +118 -0
  106. package/dist/utils/axios-with-auth.js.map +1 -0
  107. package/dist/utils/cli-tools.d.ts +30 -0
  108. package/dist/utils/cli-tools.d.ts.map +1 -0
  109. package/dist/utils/cli-tools.js +131 -0
  110. package/dist/utils/cli-tools.js.map +1 -0
  111. package/dist/utils/command-execution.d.ts +30 -0
  112. package/dist/utils/command-execution.d.ts.map +1 -0
  113. package/dist/utils/command-execution.js +264 -0
  114. package/dist/utils/command-execution.js.map +1 -0
  115. package/dist/utils/command-parser.d.ts +85 -0
  116. package/dist/utils/command-parser.d.ts.map +1 -0
  117. package/dist/utils/command-parser.js +287 -0
  118. package/dist/utils/command-parser.js.map +1 -0
  119. package/dist/utils/config.d.ts +9 -0
  120. package/dist/utils/config.d.ts.map +1 -0
  121. package/dist/utils/config.js +59 -0
  122. package/dist/utils/config.js.map +1 -0
  123. package/dist/utils/error-formatter.d.ts +17 -0
  124. package/dist/utils/error-formatter.d.ts.map +1 -0
  125. package/dist/utils/error-formatter.js +115 -0
  126. package/dist/utils/error-formatter.js.map +1 -0
  127. package/dist/utils/formatting.d.ts +10 -0
  128. package/dist/utils/formatting.d.ts.map +1 -0
  129. package/dist/utils/formatting.js +122 -0
  130. package/dist/utils/formatting.js.map +1 -0
  131. package/dist/utils/git.d.ts +55 -0
  132. package/dist/utils/git.d.ts.map +1 -0
  133. package/dist/utils/git.js +131 -0
  134. package/dist/utils/git.js.map +1 -0
  135. package/dist/utils/jwt.d.ts +45 -0
  136. package/dist/utils/jwt.d.ts.map +1 -0
  137. package/dist/utils/jwt.js +64 -0
  138. package/dist/utils/jwt.js.map +1 -0
  139. package/dist/utils/logger.d.ts +36 -0
  140. package/dist/utils/logger.d.ts.map +1 -0
  141. package/dist/utils/logger.js +176 -0
  142. package/dist/utils/logger.js.map +1 -0
  143. package/dist/utils/requirements.d.ts +28 -0
  144. package/dist/utils/requirements.d.ts.map +1 -0
  145. package/dist/utils/requirements.js +54 -0
  146. package/dist/utils/requirements.js.map +1 -0
  147. package/dist/utils/status-parser.d.ts +95 -0
  148. package/dist/utils/status-parser.d.ts.map +1 -0
  149. package/dist/utils/status-parser.js +189 -0
  150. package/dist/utils/status-parser.js.map +1 -0
  151. package/dist/utils/tasks.d.ts +9 -0
  152. package/dist/utils/tasks.d.ts.map +1 -0
  153. package/dist/utils/tasks.js +38 -0
  154. package/dist/utils/tasks.js.map +1 -0
  155. 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"}