agent-relay 1.2.3 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.trajectories/agent-relay-322-324.md +17 -0
- package/.trajectories/completed/2026-01/traj_03zupyv1s7b9.json +49 -0
- package/.trajectories/completed/2026-01/traj_03zupyv1s7b9.md +31 -0
- package/.trajectories/completed/2026-01/traj_0zacdjl1g4ht.json +125 -0
- package/.trajectories/completed/2026-01/traj_0zacdjl1g4ht.md +62 -0
- package/.trajectories/completed/2026-01/traj_33iuy72sezbk.json +49 -0
- package/.trajectories/completed/2026-01/traj_33iuy72sezbk.md +31 -0
- package/.trajectories/completed/2026-01/traj_5ammh5qtvklq.json +77 -0
- package/.trajectories/completed/2026-01/traj_5ammh5qtvklq.md +42 -0
- package/.trajectories/completed/2026-01/traj_6mieijqyvaag.json +77 -0
- package/.trajectories/completed/2026-01/traj_6mieijqyvaag.md +42 -0
- package/.trajectories/completed/2026-01/traj_78ffm31jn3uk.json +77 -0
- package/.trajectories/completed/2026-01/traj_78ffm31jn3uk.md +42 -0
- package/.trajectories/completed/2026-01/traj_94gnp3k30goq.json +66 -0
- package/.trajectories/completed/2026-01/traj_94gnp3k30goq.md +36 -0
- package/.trajectories/completed/2026-01/traj_avqeghu6pz5a.json +40 -0
- package/.trajectories/completed/2026-01/traj_avqeghu6pz5a.md +22 -0
- package/.trajectories/completed/2026-01/traj_dcsp9s8y01ra.json +121 -0
- package/.trajectories/completed/2026-01/traj_dcsp9s8y01ra.md +29 -0
- package/.trajectories/completed/2026-01/traj_fhx9irlckht6.json +53 -0
- package/.trajectories/completed/2026-01/traj_fhx9irlckht6.md +32 -0
- package/.trajectories/completed/2026-01/traj_fqduidx3xbtp.json +101 -0
- package/.trajectories/completed/2026-01/traj_fqduidx3xbtp.md +52 -0
- package/.trajectories/completed/2026-01/traj_hf81ey93uz6t.json +49 -0
- package/.trajectories/completed/2026-01/traj_hf81ey93uz6t.md +31 -0
- package/.trajectories/completed/2026-01/traj_hfmki2jr9d4r.json +65 -0
- package/.trajectories/completed/2026-01/traj_hfmki2jr9d4r.md +37 -0
- package/.trajectories/completed/2026-01/traj_lq450ly148uw.json +49 -0
- package/.trajectories/completed/2026-01/traj_lq450ly148uw.md +31 -0
- package/.trajectories/completed/2026-01/traj_multi_server_arch.md +101 -0
- package/.trajectories/completed/2026-01/traj_psd9ob0j2ru3.json +27 -0
- package/.trajectories/completed/2026-01/traj_psd9ob0j2ru3.md +14 -0
- package/.trajectories/completed/2026-01/traj_ub8csuv3lcv4.json +53 -0
- package/.trajectories/completed/2026-01/traj_ub8csuv3lcv4.md +32 -0
- package/.trajectories/completed/2026-01/traj_uc29tlso8i9s.json +186 -0
- package/.trajectories/completed/2026-01/traj_uc29tlso8i9s.md +86 -0
- package/.trajectories/completed/2026-01/traj_ui9b4tqxoa7j.json +77 -0
- package/.trajectories/completed/2026-01/traj_ui9b4tqxoa7j.md +42 -0
- package/.trajectories/completed/2026-01/traj_v9dkdoxylyid.json +89 -0
- package/.trajectories/completed/2026-01/traj_v9dkdoxylyid.md +47 -0
- package/.trajectories/completed/2026-01/traj_xy9vifpqet80.json +65 -0
- package/.trajectories/completed/2026-01/traj_xy9vifpqet80.md +37 -0
- package/.trajectories/completed/2026-01/traj_y7aiwijyfmmv.json +49 -0
- package/.trajectories/completed/2026-01/traj_y7aiwijyfmmv.md +31 -0
- package/.trajectories/consolidate-settings-panel.md +24 -0
- package/.trajectories/gh-cli-user-token.md +26 -0
- package/.trajectories/index.json +155 -1
- package/deploy/workspace/codex.config.toml +15 -0
- package/deploy/workspace/entrypoint.sh +167 -7
- package/deploy/workspace/git-credential-relay +17 -2
- package/dist/bridge/spawner.d.ts +7 -0
- package/dist/bridge/spawner.js +40 -9
- package/dist/bridge/types.d.ts +2 -0
- package/dist/cli/index.js +210 -168
- package/dist/cloud/api/admin.d.ts +8 -0
- package/dist/cloud/api/admin.js +212 -0
- package/dist/cloud/api/auth.js +8 -0
- package/dist/cloud/api/billing.d.ts +0 -10
- package/dist/cloud/api/billing.js +248 -58
- package/dist/cloud/api/codex-auth-helper.d.ts +10 -4
- package/dist/cloud/api/codex-auth-helper.js +215 -8
- package/dist/cloud/api/coordinators.js +402 -0
- package/dist/cloud/api/daemons.js +15 -11
- package/dist/cloud/api/git.js +104 -17
- package/dist/cloud/api/github-app.js +42 -8
- package/dist/cloud/api/nango-auth.js +297 -16
- package/dist/cloud/api/onboarding.js +97 -33
- package/dist/cloud/api/providers.js +12 -16
- package/dist/cloud/api/repos.js +200 -124
- package/dist/cloud/api/test-helpers.js +40 -0
- package/dist/cloud/api/usage.js +13 -0
- package/dist/cloud/api/webhooks.js +1 -1
- package/dist/cloud/api/workspaces.d.ts +18 -0
- package/dist/cloud/api/workspaces.js +945 -15
- package/dist/cloud/config.d.ts +8 -0
- package/dist/cloud/config.js +15 -0
- package/dist/cloud/db/drizzle.d.ts +5 -2
- package/dist/cloud/db/drizzle.js +27 -20
- package/dist/cloud/db/schema.d.ts +19 -51
- package/dist/cloud/db/schema.js +5 -4
- package/dist/cloud/index.d.ts +0 -1
- package/dist/cloud/index.js +0 -1
- package/dist/cloud/provisioner/index.d.ts +93 -1
- package/dist/cloud/provisioner/index.js +608 -63
- package/dist/cloud/server.js +156 -16
- package/dist/cloud/services/compute-enforcement.d.ts +57 -0
- package/dist/cloud/services/compute-enforcement.js +175 -0
- package/dist/cloud/services/index.d.ts +2 -0
- package/dist/cloud/services/index.js +4 -0
- package/dist/cloud/services/intro-expiration.d.ts +55 -0
- package/dist/cloud/services/intro-expiration.js +211 -0
- package/dist/cloud/services/nango.d.ts +14 -0
- package/dist/cloud/services/nango.js +74 -14
- package/dist/cloud/services/ssh-security.d.ts +31 -0
- package/dist/cloud/services/ssh-security.js +63 -0
- package/dist/continuity/manager.d.ts +5 -0
- package/dist/continuity/manager.js +56 -2
- package/dist/daemon/api.d.ts +2 -0
- package/dist/daemon/api.js +214 -5
- package/dist/daemon/cli-auth.d.ts +13 -1
- package/dist/daemon/cli-auth.js +166 -47
- package/dist/daemon/connection.d.ts +7 -1
- package/dist/daemon/connection.js +15 -0
- package/dist/daemon/orchestrator.d.ts +2 -0
- package/dist/daemon/orchestrator.js +26 -0
- package/dist/daemon/repo-manager.d.ts +116 -0
- package/dist/daemon/repo-manager.js +384 -0
- package/dist/daemon/router.d.ts +60 -1
- package/dist/daemon/router.js +281 -20
- package/dist/daemon/user-directory.d.ts +111 -0
- package/dist/daemon/user-directory.js +233 -0
- package/dist/dashboard/out/404.html +1 -1
- package/dist/dashboard/out/_next/static/T1tgCqVWHFIkV7ClEtzD7/_ssgManifest.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +9 -0
- package/dist/dashboard/out/_next/static/chunks/766-b54f0853794b78c3.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/83-b51836037078006c.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/891-6cd50de1224f70bb.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/899-bb19a9b3d9b39ea6.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-8939b0fc700f7eca.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/page-5af1b6b439858aa6.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-f45ecbc3e06134fc.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/history/{page-abb9ab2d329f56e9.js → page-8c8bed33beb2bf1c.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/login/{page-c22d080201cbd9fb.js → page-16f3b49e55b1e0ed.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-ac39dc0cc3c26fa7.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/{page-77e9c65420a06cfb.js → page-4a5938c18a11a654.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-982a7000fee44014.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-ac3a6ac433fd6001.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-09f9caae98a18c09.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/signup/{page-68d34f50baa8ab6b.js → page-547dd0ca55ecd0ba.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/{main-ed4e1fb6f29c34cf.js → main-2ee6beb2ae96d210.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/{main-app-6e8e8d3ef4e0192a.js → main-app-5d692157a8eb1fd9.js} +1 -1
- package/dist/dashboard/out/_next/static/css/85d2af9c7ac74d62.css +1 -0
- package/dist/dashboard/out/_next/static/css/fe4b28883eeff359.css +1 -0
- package/dist/dashboard/out/app/onboarding.html +1 -1
- package/dist/dashboard/out/app/onboarding.txt +3 -3
- package/dist/dashboard/out/app.html +1 -1
- package/dist/dashboard/out/app.txt +3 -3
- package/dist/dashboard/out/apple-icon.png +0 -0
- package/dist/dashboard/out/connect-repos.html +1 -1
- package/dist/dashboard/out/connect-repos.txt +3 -3
- package/dist/dashboard/out/history.html +1 -1
- package/dist/dashboard/out/history.txt +3 -3
- package/dist/dashboard/out/index.html +1 -1
- package/dist/dashboard/out/index.txt +3 -3
- package/dist/dashboard/out/login.html +2 -2
- package/dist/dashboard/out/login.txt +3 -3
- package/dist/dashboard/out/metrics.html +1 -1
- package/dist/dashboard/out/metrics.txt +3 -3
- package/dist/dashboard/out/pricing.html +2 -2
- package/dist/dashboard/out/pricing.txt +3 -3
- package/dist/dashboard/out/providers/setup/claude.html +1 -0
- package/dist/dashboard/out/providers/setup/claude.txt +8 -0
- package/dist/dashboard/out/providers/setup/codex.html +1 -0
- package/dist/dashboard/out/providers/setup/codex.txt +8 -0
- package/dist/dashboard/out/providers.html +1 -1
- package/dist/dashboard/out/providers.txt +3 -3
- package/dist/dashboard/out/signup.html +2 -2
- package/dist/dashboard/out/signup.txt +3 -3
- package/dist/dashboard-server/server.js +316 -12
- package/dist/dashboard-server/user-bridge.d.ts +103 -0
- package/dist/dashboard-server/user-bridge.js +189 -0
- package/dist/protocol/channels.d.ts +205 -0
- package/dist/protocol/channels.js +154 -0
- package/dist/protocol/types.d.ts +13 -1
- package/dist/resiliency/provider-context.js +2 -0
- package/dist/shared/cli-auth-config.d.ts +19 -0
- package/dist/shared/cli-auth-config.js +58 -2
- package/dist/utils/agent-config.js +1 -1
- package/dist/wrapper/auth-detection.d.ts +49 -0
- package/dist/wrapper/auth-detection.js +192 -0
- package/dist/wrapper/base-wrapper.d.ts +153 -0
- package/dist/wrapper/base-wrapper.js +393 -0
- package/dist/wrapper/client.d.ts +7 -1
- package/dist/wrapper/client.js +3 -0
- package/dist/wrapper/index.d.ts +1 -0
- package/dist/wrapper/index.js +4 -3
- package/dist/wrapper/pty-wrapper.d.ts +62 -84
- package/dist/wrapper/pty-wrapper.js +154 -180
- package/dist/wrapper/tmux-wrapper.d.ts +41 -66
- package/dist/wrapper/tmux-wrapper.js +90 -134
- package/package.json +4 -2
- package/scripts/postinstall.js +11 -155
- package/scripts/test-interactive-terminal.sh +248 -0
- package/dist/cloud/vault/index.d.ts +0 -76
- package/dist/cloud/vault/index.js +0 -219
- package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/724-2dae7627550ab88f.js +0 -9
- package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-3fdfa60e53f2810d.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-3538dfe0ffe984b8.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-c0d118c0f92d969c.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-67a3e98d9a43a6ed.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-b08ed1c34d14434a.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +0 -1
- package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +0 -1
- package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +0 -1
- package/dist/dashboard/out/_next/static/wPgKJtcOmTFLpUncDg16A/_ssgManifest.js +0 -1
- /package/dist/dashboard/out/_next/static/{wPgKJtcOmTFLpUncDg16A → T1tgCqVWHFIkV7ClEtzD7}/_buildManifest.js +0 -0
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Relay Cloud - Credential Vault
|
|
3
|
-
*
|
|
4
|
-
* Secure storage for OAuth tokens with AES-256-GCM encryption.
|
|
5
|
-
*/
|
|
6
|
-
import * as crypto from 'crypto';
|
|
7
|
-
import { getConfig } from '../config.js';
|
|
8
|
-
import { db } from '../db/index.js';
|
|
9
|
-
const ALGORITHM = 'aes-256-gcm';
|
|
10
|
-
const IV_LENGTH = 12;
|
|
11
|
-
const AUTH_TAG_LENGTH = 16;
|
|
12
|
-
export class CredentialVault {
|
|
13
|
-
masterKey;
|
|
14
|
-
constructor() {
|
|
15
|
-
const config = getConfig();
|
|
16
|
-
this.masterKey = Buffer.from(config.vault.masterKey, 'base64');
|
|
17
|
-
if (this.masterKey.length !== 32) {
|
|
18
|
-
throw new Error('Vault master key must be 32 bytes (base64 encoded)');
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Encrypt a string value
|
|
23
|
-
*/
|
|
24
|
-
encrypt(plaintext) {
|
|
25
|
-
const iv = crypto.randomBytes(IV_LENGTH);
|
|
26
|
-
const cipher = crypto.createCipheriv(ALGORITHM, this.masterKey, iv);
|
|
27
|
-
const encrypted = Buffer.concat([
|
|
28
|
-
cipher.update(plaintext, 'utf8'),
|
|
29
|
-
cipher.final(),
|
|
30
|
-
]);
|
|
31
|
-
const authTag = cipher.getAuthTag();
|
|
32
|
-
// Format: base64(iv + authTag + ciphertext)
|
|
33
|
-
const combined = Buffer.concat([iv, authTag, encrypted]);
|
|
34
|
-
return combined.toString('base64');
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Decrypt a string value
|
|
38
|
-
*/
|
|
39
|
-
decrypt(ciphertext) {
|
|
40
|
-
const combined = Buffer.from(ciphertext, 'base64');
|
|
41
|
-
const iv = combined.subarray(0, IV_LENGTH);
|
|
42
|
-
const authTag = combined.subarray(IV_LENGTH, IV_LENGTH + AUTH_TAG_LENGTH);
|
|
43
|
-
const encrypted = combined.subarray(IV_LENGTH + AUTH_TAG_LENGTH);
|
|
44
|
-
const decipher = crypto.createDecipheriv(ALGORITHM, this.masterKey, iv);
|
|
45
|
-
decipher.setAuthTag(authTag);
|
|
46
|
-
const decrypted = Buffer.concat([
|
|
47
|
-
decipher.update(encrypted),
|
|
48
|
-
decipher.final(),
|
|
49
|
-
]);
|
|
50
|
-
return decrypted.toString('utf8');
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Store encrypted credential
|
|
54
|
-
*/
|
|
55
|
-
async storeCredential(credential) {
|
|
56
|
-
const encryptedAccessToken = this.encrypt(credential.accessToken);
|
|
57
|
-
const encryptedRefreshToken = credential.refreshToken
|
|
58
|
-
? this.encrypt(credential.refreshToken)
|
|
59
|
-
: undefined;
|
|
60
|
-
await db.credentials.upsert({
|
|
61
|
-
userId: credential.userId,
|
|
62
|
-
provider: credential.provider,
|
|
63
|
-
accessToken: encryptedAccessToken,
|
|
64
|
-
refreshToken: encryptedRefreshToken,
|
|
65
|
-
tokenExpiresAt: credential.tokenExpiresAt,
|
|
66
|
-
scopes: credential.scopes,
|
|
67
|
-
providerAccountId: credential.providerAccountId,
|
|
68
|
-
providerAccountEmail: credential.providerAccountEmail,
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Retrieve and decrypt credential
|
|
73
|
-
*/
|
|
74
|
-
async getCredential(userId, provider) {
|
|
75
|
-
const credential = await db.credentials.findByUserAndProvider(userId, provider);
|
|
76
|
-
if (!credential) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
return {
|
|
80
|
-
accessToken: this.decrypt(credential.accessToken),
|
|
81
|
-
refreshToken: credential.refreshToken
|
|
82
|
-
? this.decrypt(credential.refreshToken)
|
|
83
|
-
: undefined,
|
|
84
|
-
tokenExpiresAt: credential.tokenExpiresAt ?? undefined,
|
|
85
|
-
scopes: credential.scopes ?? undefined,
|
|
86
|
-
providerAccountId: credential.providerAccountId ?? undefined,
|
|
87
|
-
providerAccountEmail: credential.providerAccountEmail ?? undefined,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Get all credentials for a user (decrypted)
|
|
92
|
-
*/
|
|
93
|
-
async getUserCredentials(userId) {
|
|
94
|
-
const credentials = await db.credentials.findByUserId(userId);
|
|
95
|
-
const result = new Map();
|
|
96
|
-
for (const cred of credentials) {
|
|
97
|
-
result.set(cred.provider, {
|
|
98
|
-
accessToken: this.decrypt(cred.accessToken),
|
|
99
|
-
refreshToken: cred.refreshToken
|
|
100
|
-
? this.decrypt(cred.refreshToken)
|
|
101
|
-
: undefined,
|
|
102
|
-
tokenExpiresAt: cred.tokenExpiresAt ?? undefined,
|
|
103
|
-
scopes: cred.scopes ?? undefined,
|
|
104
|
-
providerAccountId: cred.providerAccountId ?? undefined,
|
|
105
|
-
providerAccountEmail: cred.providerAccountEmail ?? undefined,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
return result;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Update tokens (e.g., after refresh)
|
|
112
|
-
*/
|
|
113
|
-
async updateTokens(userId, provider, accessToken, refreshToken, expiresAt) {
|
|
114
|
-
const encryptedAccessToken = this.encrypt(accessToken);
|
|
115
|
-
const encryptedRefreshToken = refreshToken
|
|
116
|
-
? this.encrypt(refreshToken)
|
|
117
|
-
: undefined;
|
|
118
|
-
await db.credentials.updateTokens(userId, provider, encryptedAccessToken, encryptedRefreshToken, expiresAt);
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Delete credential
|
|
122
|
-
*/
|
|
123
|
-
async deleteCredential(userId, provider) {
|
|
124
|
-
await db.credentials.delete(userId, provider);
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Check if credential needs refresh (within 5 minutes of expiry)
|
|
128
|
-
*/
|
|
129
|
-
async needsRefresh(userId, provider) {
|
|
130
|
-
const credential = await db.credentials.findByUserAndProvider(userId, provider);
|
|
131
|
-
if (!credential || !credential.tokenExpiresAt) {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
const fiveMinutes = 5 * 60 * 1000;
|
|
135
|
-
return Date.now() > credential.tokenExpiresAt.getTime() - fiveMinutes;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Refresh OAuth token for a provider
|
|
139
|
-
*/
|
|
140
|
-
async refreshToken(userId, provider) {
|
|
141
|
-
const credential = await this.getCredential(userId, provider);
|
|
142
|
-
if (!credential?.refreshToken) {
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
// Provider-specific refresh endpoints
|
|
146
|
-
const refreshEndpoints = {
|
|
147
|
-
anthropic: 'https://api.anthropic.com/oauth/token',
|
|
148
|
-
openai: 'https://auth.openai.com/oauth/token',
|
|
149
|
-
google: 'https://oauth2.googleapis.com/token',
|
|
150
|
-
github: 'https://github.com/login/oauth/access_token',
|
|
151
|
-
};
|
|
152
|
-
const endpoint = refreshEndpoints[provider];
|
|
153
|
-
if (!endpoint) {
|
|
154
|
-
console.error(`Unknown provider for refresh: ${provider}`);
|
|
155
|
-
return false;
|
|
156
|
-
}
|
|
157
|
-
try {
|
|
158
|
-
const config = getConfig();
|
|
159
|
-
const providerConfig = config.providers[provider];
|
|
160
|
-
const response = await fetch(endpoint, {
|
|
161
|
-
method: 'POST',
|
|
162
|
-
headers: {
|
|
163
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
164
|
-
Accept: 'application/json',
|
|
165
|
-
},
|
|
166
|
-
body: new URLSearchParams({
|
|
167
|
-
grant_type: 'refresh_token',
|
|
168
|
-
refresh_token: credential.refreshToken,
|
|
169
|
-
client_id: providerConfig?.clientId || config.github.clientId,
|
|
170
|
-
...(provider === 'google' && {
|
|
171
|
-
client_secret: providerConfig?.clientSecret,
|
|
172
|
-
}),
|
|
173
|
-
...(provider === 'github' && {
|
|
174
|
-
client_secret: config.github.clientSecret,
|
|
175
|
-
}),
|
|
176
|
-
}),
|
|
177
|
-
});
|
|
178
|
-
if (!response.ok) {
|
|
179
|
-
const error = await response.text();
|
|
180
|
-
console.error(`Token refresh failed for ${provider}:`, error);
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
const data = await response.json();
|
|
184
|
-
await this.updateTokens(userId, provider, data.access_token, data.refresh_token, data.expires_in
|
|
185
|
-
? new Date(Date.now() + data.expires_in * 1000)
|
|
186
|
-
: undefined);
|
|
187
|
-
return true;
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
console.error(`Error refreshing token for ${provider}:`, error);
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
// Singleton instance
|
|
196
|
-
let _vault = null;
|
|
197
|
-
export function getVault() {
|
|
198
|
-
if (!_vault) {
|
|
199
|
-
_vault = new CredentialVault();
|
|
200
|
-
}
|
|
201
|
-
return _vault;
|
|
202
|
-
}
|
|
203
|
-
export const vault = {
|
|
204
|
-
get instance() {
|
|
205
|
-
return getVault();
|
|
206
|
-
},
|
|
207
|
-
storeCredential: (cred) => getVault().storeCredential(cred),
|
|
208
|
-
getCredential: (userId, provider) => getVault().getCredential(userId, provider),
|
|
209
|
-
getUserCredentials: (userId) => getVault().getUserCredentials(userId),
|
|
210
|
-
updateTokens: (userId, provider, accessToken, refreshToken, expiresAt) => getVault().updateTokens(userId, provider, accessToken, refreshToken, expiresAt),
|
|
211
|
-
deleteCredential: (userId, provider) => getVault().deleteCredential(userId, provider),
|
|
212
|
-
needsRefresh: (userId, provider) => getVault().needsRefresh(userId, provider),
|
|
213
|
-
refreshToken: (userId, provider) => getVault().refreshToken(userId, provider),
|
|
214
|
-
};
|
|
215
|
-
// Generate a new master key (for setup)
|
|
216
|
-
export function generateMasterKey() {
|
|
217
|
-
return crypto.randomBytes(32).toString('base64');
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=index.js.map
|