@edgedive/cli 0.1.5 → 0.1.6
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/.env +2 -0
- package/.env.local +2 -0
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-dev.log +20 -0
- package/dist/api/client.d.ts +2 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +23 -1
- package/dist/api/client.js.map +1 -1
- package/dist/auth/oauth-flow.d.ts +5 -0
- package/dist/auth/oauth-flow.d.ts.map +1 -1
- package/dist/auth/oauth-flow.js +41 -0
- package/dist/auth/oauth-flow.js.map +1 -1
- package/dist/auth/pkce.js +1 -5
- package/dist/auth/pkce.js.map +1 -1
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/commands/local.js.map +1 -1
- package/dist/commands/takeover.d.ts +10 -0
- package/dist/commands/takeover.d.ts.map +1 -0
- package/dist/commands/takeover.js +108 -0
- package/dist/commands/takeover.js.map +1 -0
- package/dist/config/config-manager.d.ts +10 -1
- package/dist/config/config-manager.d.ts.map +1 -1
- package/dist/config/config-manager.js +25 -11
- package/dist/config/config-manager.js.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +0 -12
- package/dist/constants.js.map +1 -1
- package/dist/utils/git-utils.d.ts.map +1 -1
- package/dist/utils/git-utils.js +1 -3
- package/dist/utils/git-utils.js.map +1 -1
- package/dist/utils/session-downloader.d.ts.map +1 -1
- package/dist/utils/session-downloader.js.map +1 -1
- package/package.json +1 -1
- package/src/api/client.ts +26 -10
- package/src/auth/oauth-flow.ts +53 -0
- package/src/auth/pkce.ts +1 -5
- package/src/commands/local.ts +17 -7
- package/src/config/config-manager.ts +29 -17
- package/src/constants.ts +0 -13
- package/src/utils/git-utils.ts +2 -8
- package/src/utils/session-downloader.ts +1 -6
- package/.claude/settings.local.json +0 -9
package/.env
ADDED
package/.env.local
ADDED
package/.turbo/turbo-build.log
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
> @edgedive/cli@0.1.3 dev /Users/nimesh/edgedive/edgedive-monorepo/packages/edgedive-cli
|
|
3
|
+
> tsc --watch
|
|
4
|
+
|
|
5
|
+
[2J[3J[H[[90m7:38:41 PM[0m] Starting compilation in watch mode...
|
|
6
|
+
|
|
7
|
+
[[90m7:38:41 PM[0m] Found 0 errors. Watching for file changes.
|
|
8
|
+
|
|
9
|
+
[2J[3J[H[[90m10:45:44 AM[0m] File change detected. Starting incremental compilation...
|
|
10
|
+
|
|
11
|
+
[[90m10:45:44 AM[0m] Found 0 errors. Watching for file changes.
|
|
12
|
+
|
|
13
|
+
[2J[3J[H[[90m10:45:45 AM[0m] File change detected. Starting incremental compilation...
|
|
14
|
+
|
|
15
|
+
[[90m10:45:45 AM[0m] Found 0 errors. Watching for file changes.
|
|
16
|
+
|
|
17
|
+
[2J[3J[H[[90m1:23:54 PM[0m] File change detected. Starting incremental compilation...
|
|
18
|
+
|
|
19
|
+
[[90m1:23:54 PM[0m] Found 0 errors. Watching for file changes.
|
|
20
|
+
|
package/dist/api/client.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export interface TakeoverResponse {
|
|
|
36
36
|
export declare class EdgediveApiClient {
|
|
37
37
|
private client;
|
|
38
38
|
private configManager;
|
|
39
|
+
private oauthFlow;
|
|
40
|
+
private isRefreshing;
|
|
39
41
|
constructor(configManager: ConfigManager);
|
|
40
42
|
/**
|
|
41
43
|
* Get session takeover information by PR URL
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,YAAY,CAAC,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE;QACb,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAkB;gBAE1B,aAAa,EAAE,aAAa;IAoCxC;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAe5D,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiBpF;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBjF"}
|
package/dist/api/client.js
CHANGED
|
@@ -3,17 +3,39 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import axios from 'axios';
|
|
5
5
|
import { API_CONFIG, TIMEOUTS } from '../constants.js';
|
|
6
|
+
import { OAuthFlow } from '../auth/oauth-flow.js';
|
|
6
7
|
export class EdgediveApiClient {
|
|
7
8
|
client;
|
|
8
9
|
configManager;
|
|
10
|
+
oauthFlow;
|
|
11
|
+
isRefreshing = false;
|
|
9
12
|
constructor(configManager) {
|
|
10
13
|
this.configManager = configManager;
|
|
14
|
+
this.oauthFlow = new OAuthFlow(configManager);
|
|
11
15
|
this.client = axios.create({
|
|
12
16
|
baseURL: API_CONFIG.BASE_URL,
|
|
13
17
|
timeout: TIMEOUTS.DEFAULT_REQUEST_MS,
|
|
14
18
|
});
|
|
15
|
-
// Add request interceptor to inject auth token
|
|
19
|
+
// Add request interceptor to inject auth token and handle refresh
|
|
16
20
|
this.client.interceptors.request.use(async (config) => {
|
|
21
|
+
// Check if token needs refresh
|
|
22
|
+
const currentConfig = await this.configManager.load();
|
|
23
|
+
if (this.configManager.isTokenExpiringSoon(currentConfig) && !this.isRefreshing) {
|
|
24
|
+
this.isRefreshing = true;
|
|
25
|
+
try {
|
|
26
|
+
console.log('🔄 Access token expiring soon, refreshing...');
|
|
27
|
+
await this.oauthFlow.refreshAccessToken();
|
|
28
|
+
console.log('✅ Token refreshed successfully');
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error('❌ Failed to refresh token:', error.message);
|
|
32
|
+
console.log('Please run "dive login" to re-authenticate');
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
this.isRefreshing = false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
17
39
|
const token = await this.configManager.getAccessToken();
|
|
18
40
|
if (token) {
|
|
19
41
|
config.headers.Authorization = `Bearer ${token}`;
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export interface OAuthTokenResponse {
|
|
|
7
7
|
token_type: string;
|
|
8
8
|
expires_in: number;
|
|
9
9
|
scope: string;
|
|
10
|
+
refresh_token: string;
|
|
10
11
|
}
|
|
11
12
|
export declare class OAuthFlow {
|
|
12
13
|
private configManager;
|
|
@@ -23,5 +24,9 @@ export declare class OAuthFlow {
|
|
|
23
24
|
* Exchange authorization code for access token
|
|
24
25
|
*/
|
|
25
26
|
private exchangeCodeForToken;
|
|
27
|
+
/**
|
|
28
|
+
* Refresh access token using refresh token
|
|
29
|
+
*/
|
|
30
|
+
refreshAccessToken(): Promise<OAuthTokenResponse | null>;
|
|
26
31
|
}
|
|
27
32
|
//# sourceMappingURL=oauth-flow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,EAAE,aAAa;IAIxC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAsC9C;;OAEG;YACW,mBAAmB;IAyHjC;;OAEG;YACW,oBAAoB;IAiClC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;CA8C/D"}
|
package/dist/auth/oauth-flow.js
CHANGED
|
@@ -42,6 +42,7 @@ export class OAuthFlow {
|
|
|
42
42
|
tokenType: tokenResponse.token_type,
|
|
43
43
|
expiresAt,
|
|
44
44
|
scope: tokenResponse.scope,
|
|
45
|
+
refreshToken: tokenResponse.refresh_token,
|
|
45
46
|
});
|
|
46
47
|
return tokenResponse;
|
|
47
48
|
}
|
|
@@ -166,6 +167,7 @@ export class OAuthFlow {
|
|
|
166
167
|
try {
|
|
167
168
|
const tokenUrl = new URL(API_CONFIG.TOKEN_PATH, API_CONFIG.BASE_URL);
|
|
168
169
|
const response = await axios.post(tokenUrl.toString(), new URLSearchParams({
|
|
170
|
+
grant_type: 'authorization_code',
|
|
169
171
|
code,
|
|
170
172
|
code_verifier: codeVerifier,
|
|
171
173
|
}), {
|
|
@@ -183,5 +185,44 @@ export class OAuthFlow {
|
|
|
183
185
|
throw new Error(`Failed to exchange code for token: ${error.message}`);
|
|
184
186
|
}
|
|
185
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Refresh access token using refresh token
|
|
190
|
+
*/
|
|
191
|
+
async refreshAccessToken() {
|
|
192
|
+
try {
|
|
193
|
+
const refreshToken = await this.configManager.getRefreshToken();
|
|
194
|
+
if (!refreshToken) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
const tokenUrl = new URL(API_CONFIG.TOKEN_PATH, API_CONFIG.BASE_URL);
|
|
198
|
+
const response = await axios.post(tokenUrl.toString(), new URLSearchParams({
|
|
199
|
+
grant_type: 'refresh_token',
|
|
200
|
+
refresh_token: refreshToken,
|
|
201
|
+
}), {
|
|
202
|
+
headers: {
|
|
203
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
204
|
+
},
|
|
205
|
+
timeout: TIMEOUTS.DEFAULT_REQUEST_MS,
|
|
206
|
+
});
|
|
207
|
+
// Save new tokens to config
|
|
208
|
+
const expiresAt = Date.now() + response.data.expires_in * 1000;
|
|
209
|
+
await this.configManager.save({
|
|
210
|
+
accessToken: response.data.access_token,
|
|
211
|
+
tokenType: response.data.token_type,
|
|
212
|
+
expiresAt,
|
|
213
|
+
scope: response.data.scope,
|
|
214
|
+
refreshToken: response.data.refresh_token,
|
|
215
|
+
});
|
|
216
|
+
return response.data;
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
// If refresh fails, clear the config so user needs to login again
|
|
220
|
+
await this.configManager.delete();
|
|
221
|
+
if (error.response) {
|
|
222
|
+
throw new Error(`Failed to refresh token: ${error.response.data?.error || error.message}`);
|
|
223
|
+
}
|
|
224
|
+
throw new Error(`Failed to refresh token: ${error.message}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
186
227
|
}
|
|
187
228
|
//# sourceMappingURL=oauth-flow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-flow.js","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-flow.js","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAWrE,MAAM,OAAO,SAAS;IACZ,aAAa,CAAgB;IAErC,YAAY,aAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,2BAA2B;QAC3B,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC,CAAC,8BAA8B;QAEpE,0BAA0B;QAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QAC9D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;QACpE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QAC1D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAEhD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE3E,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE3E,+CAA+C;QAC/C,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAE9E,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC;QAC/D,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC5B,WAAW,EAAE,aAAa,CAAC,YAAY;YACvC,SAAS,EAAE,aAAa,CAAC,UAAU;YACnC,SAAS;YACT,KAAK,EAAE,aAAa,CAAC,KAAK;YAC1B,YAAY,EAAE,aAAa,CAAC,aAAa;SAC1C,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,aAAqB,EAAE,OAAe;QACtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;oBACb,OAAO;gBACT,CAAC;gBAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAE3C,IAAI,SAAS,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;oBACvC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;oBAE/C,wBAAwB;oBACxB,IAAI,KAAK,EAAE,CAAC;wBACV,QAAQ,GAAG,IAAI,CAAC;wBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;wBACnE,GAAG,CAAC,GAAG,CAAC;;;;8BAIU,KAAK;;;;aAItB,CAAC,CAAC;wBACH,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC;wBAC3C,OAAO;oBACT,CAAC;oBAED,iBAAiB;oBACjB,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;wBAC5B,QAAQ,GAAG,IAAI,CAAC;wBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;wBACnE,GAAG,CAAC,GAAG,CAAC;;;;;;;;aAQP,CAAC,CAAC;wBACH,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;wBAC7C,OAAO;oBACT,CAAC;oBAED,mCAAmC;oBACnC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACrC,QAAQ,GAAG,IAAI,CAAC;wBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;wBACnE,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;aAWP,CAAC,CAAC;wBACH,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CAAC,CAAC;wBACd,OAAO;oBACT,CAAC;oBAED,eAAe;oBACf,QAAQ,GAAG,IAAI,CAAC;oBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,GAAG,CAAC;;;;;;;;WAQP,CAAC,CAAC;oBACH,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,GAAG,EAAE;gBAC7C,oEAAoE;gBACpE,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;qBAChC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBACd,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;wBAC/C,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,CAAC;gBACH,CAAC,CAAC;qBACD,KAAK,CAAC,GAAG,EAAE;oBACV,2CAA2C;gBAC7C,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,QAAQ,GAAG,IAAI,CAAC;oBAChB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAChC,IAAY,EACZ,YAAoB;QAEpB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YAErE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,QAAQ,CAAC,QAAQ,EAAE,EACnB,IAAI,eAAe,CAAC;gBAClB,UAAU,EAAE,oBAAoB;gBAChC,IAAI;gBACJ,aAAa,EAAE,YAAY;aAC5B,CAAC,EACF;gBACE,OAAO,EAAE;oBACP,cAAc,EAAE,mCAAmC;iBACpD;gBACD,OAAO,EAAE,QAAQ,CAAC,kBAAkB;aACrC,CACF,CAAC;YAEF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,sCAAsC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CACpF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;YAChE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YAErE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,QAAQ,CAAC,QAAQ,EAAE,EACnB,IAAI,eAAe,CAAC;gBAClB,UAAU,EAAE,eAAe;gBAC3B,aAAa,EAAE,YAAY;aAC5B,CAAC,EACF;gBACE,OAAO,EAAE;oBACP,cAAc,EAAE,mCAAmC;iBACpD;gBACD,OAAO,EAAE,QAAQ,CAAC,kBAAkB;aACrC,CACF,CAAC;YAEF,4BAA4B;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YAC/D,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC5B,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;gBACvC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU;gBACnC,SAAS;gBACT,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;gBAC1B,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa;aAC1C,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,kEAAkE;YAClE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAElC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAC1E,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF"}
|
package/dist/auth/pkce.js
CHANGED
|
@@ -19,10 +19,6 @@ export function generateCodeChallenge(verifier) {
|
|
|
19
19
|
* Base64 URL encode (without padding)
|
|
20
20
|
*/
|
|
21
21
|
function base64URLEncode(buffer) {
|
|
22
|
-
return buffer
|
|
23
|
-
.toString('base64')
|
|
24
|
-
.replace(/\+/g, '-')
|
|
25
|
-
.replace(/\//g, '_')
|
|
26
|
-
.replace(/=/g, '');
|
|
22
|
+
return buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
27
23
|
}
|
|
28
24
|
//# sourceMappingURL=pkce.js.map
|
package/dist/auth/pkce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/auth/pkce.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IACnE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,MAAM
|
|
1
|
+
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/auth/pkce.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IACnE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6InF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAyB,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAOlE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAgB;IAClE,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAE/D,6BAA6B;QAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0DAA0D,CAAC,CAAC,CAAC;YACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,qHAAqH,CACtH,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,WAAW,CAAC;QAEhB,IAAI,KAAK,EAAE,CAAC;YACV,yBAAyB;YACzB,MAAM,YAAY,GAAG,0DAA0D,CAAC;YAChF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2DAA2D,CAAC,CAAC,CAAC;gBACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,WAAW,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,WAAW,GAAG,MAAM,SAAS,CAAC,2BAA2B,CAAC,QAAS,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACrD,IAAI,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,UAAU,CAAC,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAC1F,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAErE,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,8CAA8C;QAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,QAAQ,CAAC;QAEb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CACzC,WAAW,CAAC,UAAU,CAAC,KAAK,EAC5B,WAAW,CAAC,UAAU,CAAC,IAAI,EAC3B,GAAG,CACJ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,yEAAyE,CAAC,CACxF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEvE,wDAAwD;QACxD,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,GAAG,MAAM,UAAU,CAAC,eAAe,CAC7E,WAAW,EACX,QAAQ,CAAC,QAAQ,CAClB,CAAC;QAEF,0CAA0C;QAC1C,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,sBAAsB,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,iCAAiC,WAAW,CAAC,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,IAAI,CACrF,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0DAA0D,CAAC,CAAC,CAAC;YACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,eAAe,OAAO,CAAC,CAAC,CAAC;QAEjF,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;YAE1E,4CAA4C;YAC5C,mGAAmG;YACnG,MAAM,uBAAuB,CAC3B,SAAS,EACT,WAAW,EACX,cAAc,IAAI,EAAE,iBAAiB,EAAE,CACxC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,2CAA2C,eAAe,UAAU,QAAQ,CAAC,QAAQ,GAAG,CACzF,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAEzE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,uBAAuB,CACpC,SAA4B,EAC5B,WAA6B,EAC7B,WAAqE;IAErE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;QAEjD,8FAA8F;QAC9F,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,IAAI,WAAW,CAAC,iBAAiB,CAAC;QAErF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAAC,CAAC;YACxF,OAAO;QACT,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,wCAAwC,eAAe,mBAAmB,CAAC,CACzF,CAAC;YACF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAE1D,oBAAoB;QACpB,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAEvD,mBAAmB;QACnB,MAAM,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAEzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,+CAA+C;QAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CAAC,sEAAsE,CAAC,CACrF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Takeover command - download agent session for local development
|
|
3
|
+
*/
|
|
4
|
+
interface TakeoverOptions {
|
|
5
|
+
prUrl?: string;
|
|
6
|
+
issueUrl?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function takeoverCommand({ prUrl, issueUrl }: TakeoverOptions): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=takeover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeover.d.ts","sourceRoot":"","sources":["../../src/commands/takeover.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HzF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Takeover command - download agent session for local development
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { ConfigManager } from '../config/config-manager.js';
|
|
6
|
+
import { EdgediveApiClient } from '../api/client.js';
|
|
7
|
+
import { SessionDownloader } from '../utils/session-downloader.js';
|
|
8
|
+
import { GitUtils } from '../utils/git-utils.js';
|
|
9
|
+
import { launchClaudeSession } from '../utils/claude-launcher.js';
|
|
10
|
+
export async function takeoverCommand({ prUrl, issueUrl }) {
|
|
11
|
+
const configManager = new ConfigManager();
|
|
12
|
+
const apiClient = new EdgediveApiClient(configManager);
|
|
13
|
+
const downloader = new SessionDownloader();
|
|
14
|
+
try {
|
|
15
|
+
console.log(chalk.bold('\n🔧 Edgedive Session Takeover\n'));
|
|
16
|
+
// Check for Windows platform
|
|
17
|
+
if (process.platform === 'win32') {
|
|
18
|
+
console.log(chalk.red('❌ Windows is not currently supported for the takeover command.\n'));
|
|
19
|
+
console.log(chalk.yellow('Please use macOS or Linux to takeover agent sessions.\n'));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
// Check if authenticated
|
|
23
|
+
if (!(await configManager.isAuthenticated())) {
|
|
24
|
+
console.log(chalk.red('❌ You are not logged in.\n'));
|
|
25
|
+
console.log(chalk.yellow('Please run: edgedive login\n'));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
if (!prUrl && !issueUrl) {
|
|
29
|
+
console.log(chalk.red('❌ Missing takeover identifier.\n'));
|
|
30
|
+
console.log(chalk.yellow('Provide either --pr-url https://github.com/owner/repo/pull/123 or --issue-url https://linear.app/...\n'));
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
let takeoverData;
|
|
34
|
+
if (prUrl) {
|
|
35
|
+
// Validate PR URL format
|
|
36
|
+
const prUrlPattern = /^https?:\/\/github\.com\/([^\/]+)\/([^\/]+)\/pull\/(\d+)/;
|
|
37
|
+
if (!prUrlPattern.test(prUrl)) {
|
|
38
|
+
console.log(chalk.red('❌ Invalid PR URL format.\n'));
|
|
39
|
+
console.log(chalk.yellow('Expected format: https://github.com/owner/repo/pull/123\n'));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
console.log(chalk.dim(`PR URL: ${prUrl}\n`));
|
|
43
|
+
console.log('🔍 Fetching session information...\n');
|
|
44
|
+
takeoverData = await apiClient.getTakeoverByPrUrl(prUrl);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log(chalk.dim(`Linear Issue URL: ${issueUrl}\n`));
|
|
48
|
+
console.log('🔍 Fetching session information...\n');
|
|
49
|
+
takeoverData = await apiClient.getTakeoverByLinearIssueUrl(issueUrl);
|
|
50
|
+
}
|
|
51
|
+
console.log(chalk.green('✅ Found agent session!\n'));
|
|
52
|
+
if (takeoverData.github_pr?.url) {
|
|
53
|
+
console.log(chalk.dim(`PR URL: ${takeoverData.github_pr.url}`));
|
|
54
|
+
}
|
|
55
|
+
console.log(chalk.bold('Session Information:'));
|
|
56
|
+
console.log(chalk.dim(` Session ID: ${takeoverData.session_id}`));
|
|
57
|
+
console.log(chalk.dim(` Agent Type: ${takeoverData.agent_type}`));
|
|
58
|
+
console.log(chalk.dim(` Status: ${takeoverData.status}`));
|
|
59
|
+
console.log(chalk.dim(` Repository: ${takeoverData.repository.owner}/${takeoverData.repository.name}`));
|
|
60
|
+
console.log(chalk.dim(` Branch: ${takeoverData.repository.branch}`));
|
|
61
|
+
if (takeoverData.linear_issue) {
|
|
62
|
+
console.log(chalk.dim(` Linear Issue: ${takeoverData.linear_issue.identifier}`));
|
|
63
|
+
console.log(chalk.dim(` Linear URL: ${takeoverData.linear_issue.url}`));
|
|
64
|
+
}
|
|
65
|
+
// Verify current repository matches PR source
|
|
66
|
+
const cwd = process.cwd();
|
|
67
|
+
let repoInfo;
|
|
68
|
+
try {
|
|
69
|
+
repoInfo = await GitUtils.verifyRepoMatches(takeoverData.repository.owner, takeoverData.repository.name, cwd);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error(chalk.red(`\n❌ ${error.message}\n`));
|
|
73
|
+
console.log(chalk.yellow('Run this command from within the target repository checked out locally.'));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
console.log(chalk.green(`✅ Using repository at ${repoInfo.rootPath}`));
|
|
77
|
+
// Download session files into Claude projects directory
|
|
78
|
+
const { claudeSessionId, claudeSessionPath } = await downloader.downloadSession(takeoverData, repoInfo.rootPath);
|
|
79
|
+
// Ensure PR branch is checked out locally
|
|
80
|
+
try {
|
|
81
|
+
await GitUtils.ensureBranchCheckedOut(takeoverData.repository.branch, repoInfo.rootPath);
|
|
82
|
+
console.log(chalk.green(`✅ Checked out branch ${takeoverData.repository.branch}`));
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error(chalk.red(`\n❌ Failed to checkout branch ${takeoverData.repository.branch}: ${error.message}\n`));
|
|
86
|
+
console.log(chalk.yellow('Resolve the git issue above and rerun the takeover command.'));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
console.log(chalk.blue(`\n🚀 Launching Claude session ${claudeSessionId}...\n`));
|
|
90
|
+
try {
|
|
91
|
+
await launchClaudeSession(claudeSessionId, repoInfo.rootPath);
|
|
92
|
+
console.log(chalk.green('\n✅ Claude session closed. Happy debugging!\n'));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error(chalk.red(`\n❌ Failed to start Claude automatically: ${error.message}\n`));
|
|
96
|
+
console.log(chalk.yellow(`You can resume manually with: claude -r ${claudeSessionId} (from ${repoInfo.rootPath})`));
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error(chalk.red(`\n❌ Takeover failed: ${error.message}\n`));
|
|
102
|
+
if (error.message.includes('401') || error.message.includes('Unauthorized')) {
|
|
103
|
+
console.log(chalk.yellow('Your session may have expired. Please run: edgedive login\n'));
|
|
104
|
+
}
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=takeover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeover.js","sourceRoot":"","sources":["../../src/commands/takeover.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ export interface EdgediveConfig {
|
|
|
6
6
|
tokenType?: string;
|
|
7
7
|
expiresAt?: number;
|
|
8
8
|
scope?: string;
|
|
9
|
+
refreshToken?: string;
|
|
9
10
|
}
|
|
10
11
|
export declare class ConfigManager {
|
|
11
12
|
private configPath;
|
|
@@ -27,9 +28,17 @@ export declare class ConfigManager {
|
|
|
27
28
|
*/
|
|
28
29
|
isAuthenticated(): Promise<boolean>;
|
|
29
30
|
/**
|
|
30
|
-
* Get access token
|
|
31
|
+
* Get access token (even if expired - let the API client handle refresh)
|
|
31
32
|
*/
|
|
32
33
|
getAccessToken(): Promise<string | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Get refresh token
|
|
36
|
+
*/
|
|
37
|
+
getRefreshToken(): Promise<string | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if token is expired or will expire soon (within 5 minutes)
|
|
40
|
+
*/
|
|
41
|
+
isTokenExpiringSoon(config: EdgediveConfig): boolean;
|
|
33
42
|
/**
|
|
34
43
|
* Get configuration directory path
|
|
35
44
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;;IAQ3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC;IAYrC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAgBzC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK9C;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK/C;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;IAQpD;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB"}
|
|
@@ -58,26 +58,40 @@ export class ConfigManager {
|
|
|
58
58
|
*/
|
|
59
59
|
async isAuthenticated() {
|
|
60
60
|
const config = await this.load();
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
// If we have an access token that's not expired, we're authenticated
|
|
62
|
+
if (config.accessToken && (!config.expiresAt || config.expiresAt > Date.now())) {
|
|
63
|
+
return true;
|
|
63
64
|
}
|
|
64
|
-
//
|
|
65
|
-
if (config.
|
|
66
|
-
return
|
|
65
|
+
// If we have a refresh token, we can refresh, so consider authenticated
|
|
66
|
+
if (config.refreshToken) {
|
|
67
|
+
return true;
|
|
67
68
|
}
|
|
68
|
-
return
|
|
69
|
+
return false;
|
|
69
70
|
}
|
|
70
71
|
/**
|
|
71
|
-
* Get access token
|
|
72
|
+
* Get access token (even if expired - let the API client handle refresh)
|
|
72
73
|
*/
|
|
73
74
|
async getAccessToken() {
|
|
74
75
|
const config = await this.load();
|
|
75
|
-
// Check if token is expired
|
|
76
|
-
if (config.expiresAt && config.expiresAt < Date.now()) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
76
|
return config.accessToken || null;
|
|
80
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Get refresh token
|
|
80
|
+
*/
|
|
81
|
+
async getRefreshToken() {
|
|
82
|
+
const config = await this.load();
|
|
83
|
+
return config.refreshToken || null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if token is expired or will expire soon (within 5 minutes)
|
|
87
|
+
*/
|
|
88
|
+
isTokenExpiringSoon(config) {
|
|
89
|
+
if (!config.expiresAt) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// Consider token expiring if less than 5 minutes remaining
|
|
93
|
+
return config.expiresAt < Date.now() + 5 * 60 * 1000;
|
|
94
|
+
}
|
|
81
95
|
/**
|
|
82
96
|
* Get configuration directory path
|
|
83
97
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/config/config-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB;;GAEG;AAGH,eAAO,MAAM,YAAY;;;;CAIxB,CAAC;AAGF,eAAO,MAAM,UAAU;;;;;CAKtB,CAAC;AAGF,eAAO,MAAM,YAAY;;;;;CAKxB,CAAC;AAGF,eAAO,MAAM,QAAQ;;;CAGpB,CAAC"}
|
package/dist/constants.js
CHANGED
|
@@ -2,18 +2,6 @@ import 'dotenv/config';
|
|
|
2
2
|
/**
|
|
3
3
|
* Edgedive CLI Constants
|
|
4
4
|
*/
|
|
5
|
-
// Validate required environment variables
|
|
6
|
-
const getRequiredEnv = (key, fallback) => {
|
|
7
|
-
const value = process.env[key];
|
|
8
|
-
if (!value) {
|
|
9
|
-
if (fallback) {
|
|
10
|
-
console.warn(`Warning: ${key} not set, using default: ${fallback}`);
|
|
11
|
-
return fallback;
|
|
12
|
-
}
|
|
13
|
-
throw new Error(`Missing required environment variable: ${key}`);
|
|
14
|
-
}
|
|
15
|
-
return value;
|
|
16
|
-
};
|
|
17
5
|
// OAuth configuration
|
|
18
6
|
export const OAUTH_CONFIG = {
|
|
19
7
|
CLIENT_ID: 'edgedive-cli',
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB;;GAEG;AAEH,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB;;GAEG;AAEH,sBAAsB;AACtB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS,EAAE,cAAc;IACzB,YAAY,EAAE,gCAAgC;IAC9C,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,oBAAoB;AACpB,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ,EAAE,0BAA0B;IACpC,cAAc,EAAE,sBAAsB;IACtC,UAAU,EAAE,kBAAkB;IAC9B,aAAa,EAAE,qCAAqC;CACrD,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,aAAa;IAC1B,UAAU,EAAE,SAAS;IACrB,mBAAmB,EAAE,UAAU;CAChC,CAAC;AAEF,gBAAgB;AAChB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,kBAAkB,EAAE,KAAK;IACzB,kBAAkB,EAAE,MAAM,EAAE,2BAA2B;CACxD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAuBD,qBAAa,QAAQ;WACN,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WAIzC,iBAAiB,CAC5B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,CAAC;WAuBf,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiDrF"}
|
package/dist/utils/git-utils.js
CHANGED
|
@@ -2,9 +2,7 @@ import { promisify } from 'util';
|
|
|
2
2
|
import { exec as execCb } from 'child_process';
|
|
3
3
|
const exec = promisify(execCb);
|
|
4
4
|
function parseGithubRemote(remoteUrl) {
|
|
5
|
-
const patterns = [
|
|
6
|
-
/github\.com[:/](?<owner>[^/]+)\/(?<repo>[^/.]+)(?:\.git)?$/,
|
|
7
|
-
];
|
|
5
|
+
const patterns = [/github\.com[:/](?<owner>[^/]+)\/(?<repo>[^/.]+)(?:\.git)?$/];
|
|
8
6
|
for (const pattern of patterns) {
|
|
9
7
|
const match = remoteUrl.match(pattern);
|
|
10
8
|
if (match && match.groups) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAO/B,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-downloader.d.ts","sourceRoot":"","sources":["../../src/utils/session-downloader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"session-downloader.d.ts","sourceRoot":"","sources":["../../src/utils/session-downloader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,mBAAmB;YAMb,YAAY;IAapB,eAAe,CACnB,WAAW,EAAE,gBAAgB,EAC7B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;CAiBnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-downloader.js","sourceRoot":"","sources":["../../src/utils/session-downloader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,OAAO,iBAAiB;IACpB,qBAAqB,CAAC,aAAqB;QACjD,OAAO,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAEO,mBAAmB,CAAC,aAAqB;QAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"session-downloader.js","sourceRoot":"","sources":["../../src/utils/session-downloader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,OAAO,iBAAiB;IACpB,qBAAqB,CAAC,aAAqB;QACjD,OAAO,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAEO,mBAAmB,CAAC,aAAqB;QAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAClG,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,UAAkB;QACxD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACpC,YAAY,EAAE,aAAa;gBAC3B,OAAO,EAAE,QAAQ,CAAC,kBAAkB;aACrC,CAAC,CAAC;YAEH,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,WAA6B,EAC7B,aAAqB;QAErB,IAAI,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC;QAE7C,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,eAAe,QAAQ,CAAC,CAAC;QAClF,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,aAAa,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAErF,OAAO,CAAC,GAAG,CAAC,oCAAoC,iBAAiB,IAAI,CAAC,CAAC;QAEvE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;IAChD,CAAC;CACF"}
|
package/package.json
CHANGED
package/src/api/client.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import axios, { AxiosInstance } from 'axios';
|
|
6
6
|
import { API_CONFIG, TIMEOUTS } from '../constants.js';
|
|
7
7
|
import { ConfigManager } from '../config/config-manager.js';
|
|
8
|
+
import { OAuthFlow } from '../auth/oauth-flow.js';
|
|
8
9
|
|
|
9
10
|
export interface TakeoverResponse {
|
|
10
11
|
session_id: string;
|
|
@@ -41,16 +42,37 @@ export interface TakeoverResponse {
|
|
|
41
42
|
export class EdgediveApiClient {
|
|
42
43
|
private client: AxiosInstance;
|
|
43
44
|
private configManager: ConfigManager;
|
|
45
|
+
private oauthFlow: OAuthFlow;
|
|
46
|
+
private isRefreshing: boolean = false;
|
|
44
47
|
|
|
45
48
|
constructor(configManager: ConfigManager) {
|
|
46
49
|
this.configManager = configManager;
|
|
50
|
+
this.oauthFlow = new OAuthFlow(configManager);
|
|
47
51
|
this.client = axios.create({
|
|
48
52
|
baseURL: API_CONFIG.BASE_URL,
|
|
49
53
|
timeout: TIMEOUTS.DEFAULT_REQUEST_MS,
|
|
50
54
|
});
|
|
51
55
|
|
|
52
|
-
// Add request interceptor to inject auth token
|
|
56
|
+
// Add request interceptor to inject auth token and handle refresh
|
|
53
57
|
this.client.interceptors.request.use(async (config) => {
|
|
58
|
+
// Check if token needs refresh
|
|
59
|
+
const currentConfig = await this.configManager.load();
|
|
60
|
+
|
|
61
|
+
if (this.configManager.isTokenExpiringSoon(currentConfig) && !this.isRefreshing) {
|
|
62
|
+
this.isRefreshing = true;
|
|
63
|
+
try {
|
|
64
|
+
console.log('🔄 Access token expiring soon, refreshing...');
|
|
65
|
+
await this.oauthFlow.refreshAccessToken();
|
|
66
|
+
console.log('✅ Token refreshed successfully');
|
|
67
|
+
} catch (error: any) {
|
|
68
|
+
console.error('❌ Failed to refresh token:', error.message);
|
|
69
|
+
console.log('Please run "dive login" to re-authenticate');
|
|
70
|
+
throw error;
|
|
71
|
+
} finally {
|
|
72
|
+
this.isRefreshing = false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
54
76
|
const token = await this.configManager.getAccessToken();
|
|
55
77
|
if (token) {
|
|
56
78
|
config.headers.Authorization = `Bearer ${token}`;
|
|
@@ -71,9 +93,7 @@ export class EdgediveApiClient {
|
|
|
71
93
|
} catch (error: any) {
|
|
72
94
|
if (error.response) {
|
|
73
95
|
const errorData = error.response.data;
|
|
74
|
-
throw new Error(
|
|
75
|
-
errorData?.error || `API request failed: ${error.response.status}`
|
|
76
|
-
);
|
|
96
|
+
throw new Error(errorData?.error || `API request failed: ${error.response.status}`);
|
|
77
97
|
}
|
|
78
98
|
throw new Error(`API request failed: ${error.message}`);
|
|
79
99
|
}
|
|
@@ -90,9 +110,7 @@ export class EdgediveApiClient {
|
|
|
90
110
|
} catch (error: any) {
|
|
91
111
|
if (error.response) {
|
|
92
112
|
const errorData = error.response.data;
|
|
93
|
-
throw new Error(
|
|
94
|
-
errorData?.error || `API request failed: ${error.response.status}`
|
|
95
|
-
);
|
|
113
|
+
throw new Error(errorData?.error || `API request failed: ${error.response.status}`);
|
|
96
114
|
}
|
|
97
115
|
throw new Error(`API request failed: ${error.message}`);
|
|
98
116
|
}
|
|
@@ -112,9 +130,7 @@ export class EdgediveApiClient {
|
|
|
112
130
|
} catch (error: any) {
|
|
113
131
|
if (error.response) {
|
|
114
132
|
const errorData = error.response.data;
|
|
115
|
-
throw new Error(
|
|
116
|
-
errorData?.error || `Upload failed: ${error.response.status}`
|
|
117
|
-
);
|
|
133
|
+
throw new Error(errorData?.error || `Upload failed: ${error.response.status}`);
|
|
118
134
|
}
|
|
119
135
|
throw new Error(`Upload failed: ${error.message}`);
|
|
120
136
|
}
|
package/src/auth/oauth-flow.ts
CHANGED
|
@@ -15,6 +15,7 @@ export interface OAuthTokenResponse {
|
|
|
15
15
|
token_type: string;
|
|
16
16
|
expires_in: number;
|
|
17
17
|
scope: string;
|
|
18
|
+
refresh_token: string;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
export class OAuthFlow {
|
|
@@ -59,6 +60,7 @@ export class OAuthFlow {
|
|
|
59
60
|
tokenType: tokenResponse.token_type,
|
|
60
61
|
expiresAt,
|
|
61
62
|
scope: tokenResponse.scope,
|
|
63
|
+
refreshToken: tokenResponse.refresh_token,
|
|
62
64
|
});
|
|
63
65
|
|
|
64
66
|
return tokenResponse;
|
|
@@ -201,6 +203,7 @@ export class OAuthFlow {
|
|
|
201
203
|
const response = await axios.post<OAuthTokenResponse>(
|
|
202
204
|
tokenUrl.toString(),
|
|
203
205
|
new URLSearchParams({
|
|
206
|
+
grant_type: 'authorization_code',
|
|
204
207
|
code,
|
|
205
208
|
code_verifier: codeVerifier,
|
|
206
209
|
}),
|
|
@@ -222,4 +225,54 @@ export class OAuthFlow {
|
|
|
222
225
|
throw new Error(`Failed to exchange code for token: ${error.message}`);
|
|
223
226
|
}
|
|
224
227
|
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Refresh access token using refresh token
|
|
231
|
+
*/
|
|
232
|
+
async refreshAccessToken(): Promise<OAuthTokenResponse | null> {
|
|
233
|
+
try {
|
|
234
|
+
const refreshToken = await this.configManager.getRefreshToken();
|
|
235
|
+
if (!refreshToken) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const tokenUrl = new URL(API_CONFIG.TOKEN_PATH, API_CONFIG.BASE_URL);
|
|
240
|
+
|
|
241
|
+
const response = await axios.post<OAuthTokenResponse>(
|
|
242
|
+
tokenUrl.toString(),
|
|
243
|
+
new URLSearchParams({
|
|
244
|
+
grant_type: 'refresh_token',
|
|
245
|
+
refresh_token: refreshToken,
|
|
246
|
+
}),
|
|
247
|
+
{
|
|
248
|
+
headers: {
|
|
249
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
250
|
+
},
|
|
251
|
+
timeout: TIMEOUTS.DEFAULT_REQUEST_MS,
|
|
252
|
+
}
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
// Save new tokens to config
|
|
256
|
+
const expiresAt = Date.now() + response.data.expires_in * 1000;
|
|
257
|
+
await this.configManager.save({
|
|
258
|
+
accessToken: response.data.access_token,
|
|
259
|
+
tokenType: response.data.token_type,
|
|
260
|
+
expiresAt,
|
|
261
|
+
scope: response.data.scope,
|
|
262
|
+
refreshToken: response.data.refresh_token,
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
return response.data;
|
|
266
|
+
} catch (error: any) {
|
|
267
|
+
// If refresh fails, clear the config so user needs to login again
|
|
268
|
+
await this.configManager.delete();
|
|
269
|
+
|
|
270
|
+
if (error.response) {
|
|
271
|
+
throw new Error(
|
|
272
|
+
`Failed to refresh token: ${error.response.data?.error || error.message}`
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
throw new Error(`Failed to refresh token: ${error.message}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
225
278
|
}
|
package/src/auth/pkce.ts
CHANGED
|
@@ -23,9 +23,5 @@ export function generateCodeChallenge(verifier: string): string {
|
|
|
23
23
|
* Base64 URL encode (without padding)
|
|
24
24
|
*/
|
|
25
25
|
function base64URLEncode(buffer: Buffer): string {
|
|
26
|
-
return buffer
|
|
27
|
-
.toString('base64')
|
|
28
|
-
.replace(/\+/g, '-')
|
|
29
|
-
.replace(/\//g, '_')
|
|
30
|
-
.replace(/=/g, '');
|
|
26
|
+
return buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
31
27
|
}
|
package/src/commands/local.ts
CHANGED
|
@@ -74,7 +74,9 @@ export async function localCommand({ prUrl, issueUrl }: LocalOptions): Promise<v
|
|
|
74
74
|
console.log(chalk.dim(` Session ID: ${sessionData.session_id}`));
|
|
75
75
|
console.log(chalk.dim(` Agent Type: ${sessionData.agent_type}`));
|
|
76
76
|
console.log(chalk.dim(` Status: ${sessionData.status}`));
|
|
77
|
-
console.log(
|
|
77
|
+
console.log(
|
|
78
|
+
chalk.dim(` Repository: ${sessionData.repository.owner}/${sessionData.repository.name}`)
|
|
79
|
+
);
|
|
78
80
|
console.log(chalk.dim(` Branch: ${sessionData.repository.branch}`));
|
|
79
81
|
|
|
80
82
|
if (sessionData.linear_issue) {
|
|
@@ -94,7 +96,9 @@ export async function localCommand({ prUrl, issueUrl }: LocalOptions): Promise<v
|
|
|
94
96
|
);
|
|
95
97
|
} catch (error: any) {
|
|
96
98
|
console.error(chalk.red(`\n❌ ${error.message}\n`));
|
|
97
|
-
console.log(
|
|
99
|
+
console.log(
|
|
100
|
+
chalk.yellow('Run this command from within the target repository checked out locally.')
|
|
101
|
+
);
|
|
98
102
|
process.exit(1);
|
|
99
103
|
}
|
|
100
104
|
|
|
@@ -111,7 +115,11 @@ export async function localCommand({ prUrl, issueUrl }: LocalOptions): Promise<v
|
|
|
111
115
|
await GitUtils.ensureBranchCheckedOut(sessionData.repository.branch, repoInfo.rootPath);
|
|
112
116
|
console.log(chalk.green(`✅ Checked out branch ${sessionData.repository.branch}`));
|
|
113
117
|
} catch (error: any) {
|
|
114
|
-
console.error(
|
|
118
|
+
console.error(
|
|
119
|
+
chalk.red(
|
|
120
|
+
`\n❌ Failed to checkout branch ${sessionData.repository.branch}: ${error.message}\n`
|
|
121
|
+
)
|
|
122
|
+
);
|
|
115
123
|
console.log(chalk.yellow('Resolve the git issue above and rerun the local command.'));
|
|
116
124
|
process.exit(1);
|
|
117
125
|
}
|
|
@@ -124,7 +132,11 @@ export async function localCommand({ prUrl, issueUrl }: LocalOptions): Promise<v
|
|
|
124
132
|
|
|
125
133
|
// Upload Claude session file back to server
|
|
126
134
|
// Use the session info from the SessionEnd hook if available, otherwise fall back to original path
|
|
127
|
-
await uploadClaudeSessionFile(
|
|
135
|
+
await uploadClaudeSessionFile(
|
|
136
|
+
apiClient,
|
|
137
|
+
sessionData,
|
|
138
|
+
sessionEndInfo || { claudeSessionPath }
|
|
139
|
+
);
|
|
128
140
|
} catch (error: any) {
|
|
129
141
|
console.error(chalk.red(`\n❌ Failed to start Claude automatically: ${error.message}\n`));
|
|
130
142
|
console.log(
|
|
@@ -169,9 +181,7 @@ async function uploadClaudeSessionFile(
|
|
|
169
181
|
await fs.access(sessionFilePath);
|
|
170
182
|
} catch {
|
|
171
183
|
console.log(
|
|
172
|
-
chalk.yellow(
|
|
173
|
-
`⚠️ Claude session file not found at ${sessionFilePath}, skipping upload`
|
|
174
|
-
)
|
|
184
|
+
chalk.yellow(`⚠️ Claude session file not found at ${sessionFilePath}, skipping upload`)
|
|
175
185
|
);
|
|
176
186
|
return;
|
|
177
187
|
}
|
|
@@ -12,6 +12,7 @@ export interface EdgediveConfig {
|
|
|
12
12
|
tokenType?: string;
|
|
13
13
|
expiresAt?: number;
|
|
14
14
|
scope?: string;
|
|
15
|
+
refreshToken?: string;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export class ConfigManager {
|
|
@@ -45,11 +46,7 @@ export class ConfigManager {
|
|
|
45
46
|
try {
|
|
46
47
|
const configDir = path.dirname(this.configPath);
|
|
47
48
|
await fs.mkdir(configDir, { recursive: true, mode: 0o700 });
|
|
48
|
-
await fs.writeFile(
|
|
49
|
-
this.configPath,
|
|
50
|
-
JSON.stringify(config, null, 2),
|
|
51
|
-
{ mode: 0o600 }
|
|
52
|
-
);
|
|
49
|
+
await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
53
50
|
} catch (error: any) {
|
|
54
51
|
throw new Error(`Failed to save config: ${error.message}`);
|
|
55
52
|
}
|
|
@@ -73,30 +70,45 @@ export class ConfigManager {
|
|
|
73
70
|
*/
|
|
74
71
|
async isAuthenticated(): Promise<boolean> {
|
|
75
72
|
const config = await this.load();
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
|
|
74
|
+
// If we have an access token that's not expired, we're authenticated
|
|
75
|
+
if (config.accessToken && (!config.expiresAt || config.expiresAt > Date.now())) {
|
|
76
|
+
return true;
|
|
78
77
|
}
|
|
79
78
|
|
|
80
|
-
//
|
|
81
|
-
if (config.
|
|
82
|
-
return
|
|
79
|
+
// If we have a refresh token, we can refresh, so consider authenticated
|
|
80
|
+
if (config.refreshToken) {
|
|
81
|
+
return true;
|
|
83
82
|
}
|
|
84
83
|
|
|
85
|
-
return
|
|
84
|
+
return false;
|
|
86
85
|
}
|
|
87
86
|
|
|
88
87
|
/**
|
|
89
|
-
* Get access token
|
|
88
|
+
* Get access token (even if expired - let the API client handle refresh)
|
|
90
89
|
*/
|
|
91
90
|
async getAccessToken(): Promise<string | null> {
|
|
92
91
|
const config = await this.load();
|
|
92
|
+
return config.accessToken || null;
|
|
93
|
+
}
|
|
93
94
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
/**
|
|
96
|
+
* Get refresh token
|
|
97
|
+
*/
|
|
98
|
+
async getRefreshToken(): Promise<string | null> {
|
|
99
|
+
const config = await this.load();
|
|
100
|
+
return config.refreshToken || null;
|
|
101
|
+
}
|
|
98
102
|
|
|
99
|
-
|
|
103
|
+
/**
|
|
104
|
+
* Check if token is expired or will expire soon (within 5 minutes)
|
|
105
|
+
*/
|
|
106
|
+
isTokenExpiringSoon(config: EdgediveConfig): boolean {
|
|
107
|
+
if (!config.expiresAt) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Consider token expiring if less than 5 minutes remaining
|
|
111
|
+
return config.expiresAt < Date.now() + 5 * 60 * 1000;
|
|
100
112
|
}
|
|
101
113
|
|
|
102
114
|
/**
|
package/src/constants.ts
CHANGED
|
@@ -4,19 +4,6 @@ import 'dotenv/config';
|
|
|
4
4
|
* Edgedive CLI Constants
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
// Validate required environment variables
|
|
8
|
-
const getRequiredEnv = (key: string, fallback?: string): string => {
|
|
9
|
-
const value = process.env[key];
|
|
10
|
-
if (!value) {
|
|
11
|
-
if (fallback) {
|
|
12
|
-
console.warn(`Warning: ${key} not set, using default: ${fallback}`);
|
|
13
|
-
return fallback;
|
|
14
|
-
}
|
|
15
|
-
throw new Error(`Missing required environment variable: ${key}`);
|
|
16
|
-
}
|
|
17
|
-
return value;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
7
|
// OAuth configuration
|
|
21
8
|
export const OAUTH_CONFIG = {
|
|
22
9
|
CLIENT_ID: 'edgedive-cli',
|
package/src/utils/git-utils.ts
CHANGED
|
@@ -9,9 +9,7 @@ export interface RepoVerification {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
function parseGithubRemote(remoteUrl: string): { owner: string; repo: string } | null {
|
|
12
|
-
const patterns = [
|
|
13
|
-
/github\.com[:/](?<owner>[^/]+)\/(?<repo>[^/.]+)(?:\.git)?$/,
|
|
14
|
-
];
|
|
12
|
+
const patterns = [/github\.com[:/](?<owner>[^/]+)\/(?<repo>[^/.]+)(?:\.git)?$/];
|
|
15
13
|
|
|
16
14
|
for (const pattern of patterns) {
|
|
17
15
|
const match = remoteUrl.match(pattern);
|
|
@@ -63,10 +61,7 @@ export class GitUtils {
|
|
|
63
61
|
return { rootPath, remoteUrl };
|
|
64
62
|
}
|
|
65
63
|
|
|
66
|
-
static async ensureBranchCheckedOut(
|
|
67
|
-
branch: string,
|
|
68
|
-
rootPath: string
|
|
69
|
-
): Promise<void> {
|
|
64
|
+
static async ensureBranchCheckedOut(branch: string, rootPath: string): Promise<void> {
|
|
70
65
|
// Get current branch
|
|
71
66
|
const currentBranch = await runGit('rev-parse --abbrev-ref HEAD', rootPath);
|
|
72
67
|
|
|
@@ -116,4 +111,3 @@ export class GitUtils {
|
|
|
116
111
|
}
|
|
117
112
|
}
|
|
118
113
|
}
|
|
119
|
-
|
|
@@ -17,12 +17,7 @@ export class SessionDownloader {
|
|
|
17
17
|
private getClaudeProjectDir(workspacePath: string): string {
|
|
18
18
|
const homeDir = os.homedir();
|
|
19
19
|
const sanitized = this.sanitizeWorkspacePath(workspacePath);
|
|
20
|
-
return path.join(
|
|
21
|
-
homeDir,
|
|
22
|
-
LOCAL_CONFIG.CLAUDE_DIR,
|
|
23
|
-
LOCAL_CONFIG.CLAUDE_PROJECTS_DIR,
|
|
24
|
-
sanitized
|
|
25
|
-
);
|
|
20
|
+
return path.join(homeDir, LOCAL_CONFIG.CLAUDE_DIR, LOCAL_CONFIG.CLAUDE_PROJECTS_DIR, sanitized);
|
|
26
21
|
}
|
|
27
22
|
|
|
28
23
|
private async downloadFile(url: string, targetPath: string): Promise<void> {
|