agent-relay 1.2.3 → 1.3.1
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/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-fc02ed79e3de4302.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/{page-3fdfa60e53f2810d.js → page-8553743baca53a00.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-c617745b81344f4f.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-f829604fb75a831a.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/{page-77e9c65420a06cfb.js → page-dc786c183425c2ac.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-84322991d7244499.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-05606941a8e2be83.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/{main-ed4e1fb6f29c34cf.js → main-2ee6beb2ae96d210.js} +1 -1
- package/dist/dashboard/out/_next/static/css/48a8fbe3e659080e.css +1 -0
- package/dist/dashboard/out/_next/static/css/fe4b28883eeff359.css +1 -0
- package/dist/dashboard/out/_next/static/sDcbGRTYLcpPvyTs_rsNb/_ssgManifest.js +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 +2 -2
- package/dist/dashboard/out/history.html +1 -1
- package/dist/dashboard/out/history.txt +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/page-e6381e5a6e1fbcfd.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/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 → sDcbGRTYLcpPvyTs_rsNb}/_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
|