gsd-agent 1.0.7 → 1.0.8
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/bin/cli.js +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -49
- package/dist/index.js.map +1 -1
- package/dist/token-manager.d.ts +28 -0
- package/dist/token-manager.d.ts.map +1 -0
- package/dist/token-manager.js +106 -0
- package/dist/token-manager.js.map +1 -0
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -23,7 +23,7 @@ const __dirname = dirname(__filename);
|
|
|
23
23
|
const AGENT_DIST = join(__dirname, '..', 'dist', 'index.js');
|
|
24
24
|
const CREDENTIALS_PATH = join(process.env.HOME || '', '.gsd-agent', 'credentials.json');
|
|
25
25
|
const LOG_FILE = join(process.env.HOME || '', '.gsd-agent', 'logs', 'agent.log');
|
|
26
|
-
const VERSION = '1.0.
|
|
26
|
+
const VERSION = '1.0.8';
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* Check if agent is authenticated
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA8O1C"}
|
package/dist/index.js
CHANGED
|
@@ -20,54 +20,16 @@ import { CommandQueue } from './command-queue.js';
|
|
|
20
20
|
import { createClient } from '@supabase/supabase-js';
|
|
21
21
|
import os from 'os';
|
|
22
22
|
import path from 'path';
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
*/
|
|
26
|
-
function isAuthenticated() {
|
|
27
|
-
try {
|
|
28
|
-
const configDir = path.join(os.homedir(), '.gsd-agent');
|
|
29
|
-
const credentialsPath = path.join(configDir, 'credentials.json');
|
|
30
|
-
console.log('[DEBUG] Checking authentication...');
|
|
31
|
-
console.log('[DEBUG] Credentials path:', credentialsPath);
|
|
32
|
-
if (!require('fs').existsSync(credentialsPath)) {
|
|
33
|
-
console.log('[DEBUG] Credentials file does not exist');
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
const credentials = JSON.parse(require('fs').readFileSync(credentialsPath, 'utf-8'));
|
|
37
|
-
console.log('[DEBUG] Credentials loaded:', {
|
|
38
|
-
has_access_token: !!credentials.access_token,
|
|
39
|
-
has_user_id: !!credentials.user_id,
|
|
40
|
-
has_supabase_url: !!credentials.supabase_url,
|
|
41
|
-
expires_at: credentials.expires_at
|
|
42
|
-
});
|
|
43
|
-
if (!credentials.access_token || !credentials.user_id) {
|
|
44
|
-
console.log('[DEBUG] Missing access_token or user_id');
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
// Check if token is expired
|
|
48
|
-
const expiresAt = new Date(credentials.expires_at);
|
|
49
|
-
const now = new Date();
|
|
50
|
-
console.log('[DEBUG] Token expires at:', expiresAt.toISOString());
|
|
51
|
-
console.log('[DEBUG] Current time:', now.toISOString());
|
|
52
|
-
console.log('[DEBUG] Is expired?', expiresAt < now);
|
|
53
|
-
if (expiresAt < now) {
|
|
54
|
-
console.log('[DEBUG] Token is expired');
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
console.log('[DEBUG] Authentication check passed!');
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
console.log('[DEBUG] Authentication check error:', error);
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
23
|
+
import fs from 'fs';
|
|
24
|
+
import { createTokenManager } from './token-manager.js';
|
|
65
25
|
/**
|
|
66
26
|
* Main function - initializes and runs the agent daemon
|
|
67
27
|
*/
|
|
68
28
|
export async function main() {
|
|
69
|
-
// Check authentication
|
|
70
|
-
|
|
29
|
+
// Check authentication and refresh token if needed
|
|
30
|
+
const tokenManager = createTokenManager();
|
|
31
|
+
const isAuth = await tokenManager.isAuthenticated();
|
|
32
|
+
if (!isAuth) {
|
|
71
33
|
console.error('GSD Agent not authenticated.');
|
|
72
34
|
console.error('Run: gsd-agent auth');
|
|
73
35
|
console.error('Before starting the agent daemon.');
|
|
@@ -95,17 +57,30 @@ export async function main() {
|
|
|
95
57
|
logger.warn('No workspaces found. Create a GSD project with /gsd:new-project');
|
|
96
58
|
// Continue running to detect new workspaces
|
|
97
59
|
}
|
|
98
|
-
// 5. Connect to Supabase with user credentials
|
|
60
|
+
// 5. Connect to Supabase with user credentials (get fresh token)
|
|
99
61
|
logger.info('Connecting to Supabase');
|
|
100
62
|
const credentialsPath = path.join(configDir, 'credentials.json');
|
|
101
|
-
const credentials = JSON.parse(
|
|
102
|
-
|
|
63
|
+
const credentials = JSON.parse(fs.readFileSync(credentialsPath, 'utf-8'));
|
|
64
|
+
// Get valid token (will refresh if needed)
|
|
65
|
+
const validToken = await tokenManager.getValidToken();
|
|
66
|
+
if (!validToken) {
|
|
67
|
+
logger.error('Failed to get valid access token');
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
// Use anon key for client creation, then set the access token
|
|
71
|
+
const anonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImphdGxleGl0ZnVndXVkamxxdm93Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzQ1NDgxMzgsImV4cCI6MjA5MDEyNDEzOH0.NBh6CFrrRW3BlP3UsxekAoxOuYy7rQywUmx-VTL4zs0';
|
|
72
|
+
const supabaseJsClient = createClient(config.supabase_url, anonKey, {
|
|
103
73
|
auth: {
|
|
104
74
|
persistSession: false,
|
|
105
75
|
autoRefreshToken: false
|
|
106
76
|
},
|
|
107
77
|
db: {
|
|
108
78
|
schema: 'public'
|
|
79
|
+
},
|
|
80
|
+
global: {
|
|
81
|
+
headers: {
|
|
82
|
+
Authorization: `Bearer ${validToken}`
|
|
83
|
+
}
|
|
109
84
|
}
|
|
110
85
|
});
|
|
111
86
|
// 6. Create StorageClient
|
|
@@ -181,10 +156,23 @@ export async function main() {
|
|
|
181
156
|
const commandQueue = new CommandQueue(supabaseJsClient);
|
|
182
157
|
commandQueue.start();
|
|
183
158
|
logger.info('Command execution enabled');
|
|
159
|
+
// 21. Set up periodic token refresh (every 30 minutes)
|
|
160
|
+
const tokenRefreshInterval = setInterval(async () => {
|
|
161
|
+
logger.info('Performing periodic token refresh check');
|
|
162
|
+
const freshToken = await tokenManager.getValidToken();
|
|
163
|
+
if (!freshToken) {
|
|
164
|
+
logger.error('Failed to refresh token, agent may lose access');
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
logger.info('Token refresh check completed');
|
|
168
|
+
}
|
|
169
|
+
}, 30 * 60 * 1000); // 30 minutes
|
|
184
170
|
logger.info('Agent running', { workspaces: syncedWorkspaces.length });
|
|
185
|
-
//
|
|
171
|
+
// 22. Handle graceful shutdown
|
|
186
172
|
const shutdown = async (signal) => {
|
|
187
173
|
logger.info(`Received ${signal}, shutting down gracefully`);
|
|
174
|
+
// Clear token refresh interval
|
|
175
|
+
clearInterval(tokenRefreshInterval);
|
|
188
176
|
// Stop CommandQueue
|
|
189
177
|
commandQueue.stop();
|
|
190
178
|
logger.info('Command queue stopped');
|
|
@@ -210,7 +198,12 @@ export async function main() {
|
|
|
210
198
|
await new Promise(() => { }); // Never resolves
|
|
211
199
|
}
|
|
212
200
|
catch (error) {
|
|
213
|
-
logger.error('Agent failed to start', {
|
|
201
|
+
logger.error('Agent failed to start', {
|
|
202
|
+
error,
|
|
203
|
+
message: error instanceof Error ? error.message : String(error),
|
|
204
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
205
|
+
});
|
|
206
|
+
console.error('Full error:', error);
|
|
214
207
|
process.exit(1);
|
|
215
208
|
}
|
|
216
209
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Manager - Handles token refresh and validation
|
|
3
|
+
*
|
|
4
|
+
* Automatically refreshes access tokens using refresh tokens when they expire.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TokenManager {
|
|
7
|
+
private credentialsPath;
|
|
8
|
+
private supabaseUrl;
|
|
9
|
+
private supabaseAnonKey;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Get valid access token, refreshing if necessary
|
|
13
|
+
*/
|
|
14
|
+
getValidToken(): Promise<string | null>;
|
|
15
|
+
/**
|
|
16
|
+
* Refresh access token using refresh token
|
|
17
|
+
*/
|
|
18
|
+
private refreshToken;
|
|
19
|
+
/**
|
|
20
|
+
* Check if credentials exist and are valid
|
|
21
|
+
*/
|
|
22
|
+
isAuthenticated(): Promise<boolean>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Factory function to create TokenManager
|
|
26
|
+
*/
|
|
27
|
+
export declare function createTokenManager(): TokenManager;
|
|
28
|
+
//# sourceMappingURL=token-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,qBAAa,YAAY;IACvB,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,eAAe,CAAQ;;IAQ/B;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmC7C;;OAEG;YACW,YAAY;IAoD1B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;CAI1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Manager - Handles token refresh and validation
|
|
3
|
+
*
|
|
4
|
+
* Automatically refreshes access tokens using refresh tokens when they expire.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import os from 'os';
|
|
9
|
+
import { createClient } from '@supabase/supabase-js';
|
|
10
|
+
export class TokenManager {
|
|
11
|
+
credentialsPath;
|
|
12
|
+
supabaseUrl;
|
|
13
|
+
supabaseAnonKey;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.credentialsPath = path.join(os.homedir(), '.gsd-agent', 'credentials.json');
|
|
16
|
+
this.supabaseUrl = 'https://jatlexitfuguudjlqvow.supabase.co';
|
|
17
|
+
this.supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImphdGxleGl0ZnVndXVkamxxdm93Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzQ1NDgxMzgsImV4cCI6MjA5MDEyNDEzOH0.NBh6CFrrRW3BlP3UsxekAoxOuYy7rQywUmx-VTL4zs0';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get valid access token, refreshing if necessary
|
|
21
|
+
*/
|
|
22
|
+
async getValidToken() {
|
|
23
|
+
try {
|
|
24
|
+
if (!fs.existsSync(this.credentialsPath)) {
|
|
25
|
+
console.error('[TokenManager] Credentials file not found');
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const credentials = JSON.parse(fs.readFileSync(this.credentialsPath, 'utf-8'));
|
|
29
|
+
// Check if token is expired or will expire in the next 5 minutes
|
|
30
|
+
const expiresAt = new Date(credentials.expires_at);
|
|
31
|
+
const now = new Date();
|
|
32
|
+
const fiveMinutesFromNow = new Date(now.getTime() + 5 * 60 * 1000);
|
|
33
|
+
console.log('[TokenManager] Token check:', {
|
|
34
|
+
expires_at: expiresAt.toISOString(),
|
|
35
|
+
current_time: now.toISOString(),
|
|
36
|
+
needs_refresh: expiresAt < fiveMinutesFromNow
|
|
37
|
+
});
|
|
38
|
+
if (expiresAt < fiveMinutesFromNow) {
|
|
39
|
+
console.log('[TokenManager] Token expired or expiring soon, refreshing...');
|
|
40
|
+
return await this.refreshToken(credentials);
|
|
41
|
+
}
|
|
42
|
+
console.log('[TokenManager] Token is valid');
|
|
43
|
+
return credentials.access_token;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error('[TokenManager] Error getting valid token:', error);
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Refresh access token using refresh token
|
|
52
|
+
*/
|
|
53
|
+
async refreshToken(credentials) {
|
|
54
|
+
try {
|
|
55
|
+
const supabase = createClient(this.supabaseUrl, this.supabaseAnonKey, {
|
|
56
|
+
auth: {
|
|
57
|
+
autoRefreshToken: false,
|
|
58
|
+
persistSession: false
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
console.log('[TokenManager] Calling Supabase refreshSession...');
|
|
62
|
+
// Use Supabase's built-in refresh mechanism
|
|
63
|
+
const { data, error } = await supabase.auth.refreshSession({
|
|
64
|
+
refresh_token: credentials.refresh_token
|
|
65
|
+
});
|
|
66
|
+
if (error) {
|
|
67
|
+
console.error('[TokenManager] Failed to refresh token:', error.message);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
if (!data.session) {
|
|
71
|
+
console.error('[TokenManager] No session returned from refresh');
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
console.log('[TokenManager] Token refreshed successfully');
|
|
75
|
+
// Update stored credentials
|
|
76
|
+
const newCredentials = {
|
|
77
|
+
user_id: credentials.user_id,
|
|
78
|
+
access_token: data.session.access_token,
|
|
79
|
+
refresh_token: data.session.refresh_token,
|
|
80
|
+
expires_at: new Date(data.session.expires_at * 1000).toISOString(),
|
|
81
|
+
supabase_url: credentials.supabase_url
|
|
82
|
+
};
|
|
83
|
+
fs.writeFileSync(this.credentialsPath, JSON.stringify(newCredentials, null, 2), { mode: 0o600 });
|
|
84
|
+
console.log('[TokenManager] New token expires at:', newCredentials.expires_at);
|
|
85
|
+
return newCredentials.access_token;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('[TokenManager] Error refreshing token:', error);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if credentials exist and are valid
|
|
94
|
+
*/
|
|
95
|
+
async isAuthenticated() {
|
|
96
|
+
const token = await this.getValidToken();
|
|
97
|
+
return token !== null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Factory function to create TokenManager
|
|
102
|
+
*/
|
|
103
|
+
export function createTokenManager() {
|
|
104
|
+
return new TokenManager();
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=token-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED