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.
Files changed (189) hide show
  1. package/.trajectories/agent-relay-322-324.md +17 -0
  2. package/.trajectories/completed/2026-01/traj_03zupyv1s7b9.json +49 -0
  3. package/.trajectories/completed/2026-01/traj_03zupyv1s7b9.md +31 -0
  4. package/.trajectories/completed/2026-01/traj_0zacdjl1g4ht.json +125 -0
  5. package/.trajectories/completed/2026-01/traj_0zacdjl1g4ht.md +62 -0
  6. package/.trajectories/completed/2026-01/traj_33iuy72sezbk.json +49 -0
  7. package/.trajectories/completed/2026-01/traj_33iuy72sezbk.md +31 -0
  8. package/.trajectories/completed/2026-01/traj_5ammh5qtvklq.json +77 -0
  9. package/.trajectories/completed/2026-01/traj_5ammh5qtvklq.md +42 -0
  10. package/.trajectories/completed/2026-01/traj_6mieijqyvaag.json +77 -0
  11. package/.trajectories/completed/2026-01/traj_6mieijqyvaag.md +42 -0
  12. package/.trajectories/completed/2026-01/traj_78ffm31jn3uk.json +77 -0
  13. package/.trajectories/completed/2026-01/traj_78ffm31jn3uk.md +42 -0
  14. package/.trajectories/completed/2026-01/traj_94gnp3k30goq.json +66 -0
  15. package/.trajectories/completed/2026-01/traj_94gnp3k30goq.md +36 -0
  16. package/.trajectories/completed/2026-01/traj_avqeghu6pz5a.json +40 -0
  17. package/.trajectories/completed/2026-01/traj_avqeghu6pz5a.md +22 -0
  18. package/.trajectories/completed/2026-01/traj_dcsp9s8y01ra.json +121 -0
  19. package/.trajectories/completed/2026-01/traj_dcsp9s8y01ra.md +29 -0
  20. package/.trajectories/completed/2026-01/traj_fhx9irlckht6.json +53 -0
  21. package/.trajectories/completed/2026-01/traj_fhx9irlckht6.md +32 -0
  22. package/.trajectories/completed/2026-01/traj_fqduidx3xbtp.json +101 -0
  23. package/.trajectories/completed/2026-01/traj_fqduidx3xbtp.md +52 -0
  24. package/.trajectories/completed/2026-01/traj_hf81ey93uz6t.json +49 -0
  25. package/.trajectories/completed/2026-01/traj_hf81ey93uz6t.md +31 -0
  26. package/.trajectories/completed/2026-01/traj_hfmki2jr9d4r.json +65 -0
  27. package/.trajectories/completed/2026-01/traj_hfmki2jr9d4r.md +37 -0
  28. package/.trajectories/completed/2026-01/traj_lq450ly148uw.json +49 -0
  29. package/.trajectories/completed/2026-01/traj_lq450ly148uw.md +31 -0
  30. package/.trajectories/completed/2026-01/traj_multi_server_arch.md +101 -0
  31. package/.trajectories/completed/2026-01/traj_psd9ob0j2ru3.json +27 -0
  32. package/.trajectories/completed/2026-01/traj_psd9ob0j2ru3.md +14 -0
  33. package/.trajectories/completed/2026-01/traj_ub8csuv3lcv4.json +53 -0
  34. package/.trajectories/completed/2026-01/traj_ub8csuv3lcv4.md +32 -0
  35. package/.trajectories/completed/2026-01/traj_uc29tlso8i9s.json +186 -0
  36. package/.trajectories/completed/2026-01/traj_uc29tlso8i9s.md +86 -0
  37. package/.trajectories/completed/2026-01/traj_ui9b4tqxoa7j.json +77 -0
  38. package/.trajectories/completed/2026-01/traj_ui9b4tqxoa7j.md +42 -0
  39. package/.trajectories/completed/2026-01/traj_v9dkdoxylyid.json +89 -0
  40. package/.trajectories/completed/2026-01/traj_v9dkdoxylyid.md +47 -0
  41. package/.trajectories/completed/2026-01/traj_xy9vifpqet80.json +65 -0
  42. package/.trajectories/completed/2026-01/traj_xy9vifpqet80.md +37 -0
  43. package/.trajectories/completed/2026-01/traj_y7aiwijyfmmv.json +49 -0
  44. package/.trajectories/completed/2026-01/traj_y7aiwijyfmmv.md +31 -0
  45. package/.trajectories/consolidate-settings-panel.md +24 -0
  46. package/.trajectories/gh-cli-user-token.md +26 -0
  47. package/.trajectories/index.json +155 -1
  48. package/deploy/workspace/codex.config.toml +15 -0
  49. package/deploy/workspace/entrypoint.sh +167 -7
  50. package/deploy/workspace/git-credential-relay +17 -2
  51. package/dist/bridge/spawner.d.ts +7 -0
  52. package/dist/bridge/spawner.js +40 -9
  53. package/dist/bridge/types.d.ts +2 -0
  54. package/dist/cli/index.js +210 -168
  55. package/dist/cloud/api/admin.d.ts +8 -0
  56. package/dist/cloud/api/admin.js +212 -0
  57. package/dist/cloud/api/auth.js +8 -0
  58. package/dist/cloud/api/billing.d.ts +0 -10
  59. package/dist/cloud/api/billing.js +248 -58
  60. package/dist/cloud/api/codex-auth-helper.d.ts +10 -4
  61. package/dist/cloud/api/codex-auth-helper.js +215 -8
  62. package/dist/cloud/api/coordinators.js +402 -0
  63. package/dist/cloud/api/daemons.js +15 -11
  64. package/dist/cloud/api/git.js +104 -17
  65. package/dist/cloud/api/github-app.js +42 -8
  66. package/dist/cloud/api/nango-auth.js +297 -16
  67. package/dist/cloud/api/onboarding.js +97 -33
  68. package/dist/cloud/api/providers.js +12 -16
  69. package/dist/cloud/api/repos.js +200 -124
  70. package/dist/cloud/api/test-helpers.js +40 -0
  71. package/dist/cloud/api/usage.js +13 -0
  72. package/dist/cloud/api/webhooks.js +1 -1
  73. package/dist/cloud/api/workspaces.d.ts +18 -0
  74. package/dist/cloud/api/workspaces.js +945 -15
  75. package/dist/cloud/config.d.ts +8 -0
  76. package/dist/cloud/config.js +15 -0
  77. package/dist/cloud/db/drizzle.d.ts +5 -2
  78. package/dist/cloud/db/drizzle.js +27 -20
  79. package/dist/cloud/db/schema.d.ts +19 -51
  80. package/dist/cloud/db/schema.js +5 -4
  81. package/dist/cloud/index.d.ts +0 -1
  82. package/dist/cloud/index.js +0 -1
  83. package/dist/cloud/provisioner/index.d.ts +93 -1
  84. package/dist/cloud/provisioner/index.js +608 -63
  85. package/dist/cloud/server.js +156 -16
  86. package/dist/cloud/services/compute-enforcement.d.ts +57 -0
  87. package/dist/cloud/services/compute-enforcement.js +175 -0
  88. package/dist/cloud/services/index.d.ts +2 -0
  89. package/dist/cloud/services/index.js +4 -0
  90. package/dist/cloud/services/intro-expiration.d.ts +55 -0
  91. package/dist/cloud/services/intro-expiration.js +211 -0
  92. package/dist/cloud/services/nango.d.ts +14 -0
  93. package/dist/cloud/services/nango.js +74 -14
  94. package/dist/cloud/services/ssh-security.d.ts +31 -0
  95. package/dist/cloud/services/ssh-security.js +63 -0
  96. package/dist/continuity/manager.d.ts +5 -0
  97. package/dist/continuity/manager.js +56 -2
  98. package/dist/daemon/api.d.ts +2 -0
  99. package/dist/daemon/api.js +214 -5
  100. package/dist/daemon/cli-auth.d.ts +13 -1
  101. package/dist/daemon/cli-auth.js +166 -47
  102. package/dist/daemon/connection.d.ts +7 -1
  103. package/dist/daemon/connection.js +15 -0
  104. package/dist/daemon/orchestrator.d.ts +2 -0
  105. package/dist/daemon/orchestrator.js +26 -0
  106. package/dist/daemon/repo-manager.d.ts +116 -0
  107. package/dist/daemon/repo-manager.js +384 -0
  108. package/dist/daemon/router.d.ts +60 -1
  109. package/dist/daemon/router.js +281 -20
  110. package/dist/daemon/user-directory.d.ts +111 -0
  111. package/dist/daemon/user-directory.js +233 -0
  112. package/dist/dashboard/out/404.html +1 -1
  113. package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +9 -0
  114. package/dist/dashboard/out/_next/static/chunks/766-b54f0853794b78c3.js +1 -0
  115. package/dist/dashboard/out/_next/static/chunks/83-b51836037078006c.js +1 -0
  116. package/dist/dashboard/out/_next/static/chunks/891-6cd50de1224f70bb.js +1 -0
  117. package/dist/dashboard/out/_next/static/chunks/899-fc02ed79e3de4302.js +1 -0
  118. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/{page-3fdfa60e53f2810d.js → page-8553743baca53a00.js} +1 -1
  119. package/dist/dashboard/out/_next/static/chunks/app/app/page-c617745b81344f4f.js +1 -0
  120. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-f829604fb75a831a.js +1 -0
  121. package/dist/dashboard/out/_next/static/chunks/app/{page-77e9c65420a06cfb.js → page-dc786c183425c2ac.js} +1 -1
  122. package/dist/dashboard/out/_next/static/chunks/app/providers/page-84322991d7244499.js +1 -0
  123. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-05606941a8e2be83.js +1 -0
  124. package/dist/dashboard/out/_next/static/chunks/{main-ed4e1fb6f29c34cf.js → main-2ee6beb2ae96d210.js} +1 -1
  125. package/dist/dashboard/out/_next/static/css/48a8fbe3e659080e.css +1 -0
  126. package/dist/dashboard/out/_next/static/css/fe4b28883eeff359.css +1 -0
  127. package/dist/dashboard/out/_next/static/sDcbGRTYLcpPvyTs_rsNb/_ssgManifest.js +1 -0
  128. package/dist/dashboard/out/app/onboarding.html +1 -1
  129. package/dist/dashboard/out/app/onboarding.txt +3 -3
  130. package/dist/dashboard/out/app.html +1 -1
  131. package/dist/dashboard/out/app.txt +3 -3
  132. package/dist/dashboard/out/apple-icon.png +0 -0
  133. package/dist/dashboard/out/connect-repos.html +1 -1
  134. package/dist/dashboard/out/connect-repos.txt +2 -2
  135. package/dist/dashboard/out/history.html +1 -1
  136. package/dist/dashboard/out/history.txt +2 -2
  137. package/dist/dashboard/out/index.html +1 -1
  138. package/dist/dashboard/out/index.txt +3 -3
  139. package/dist/dashboard/out/login.html +2 -2
  140. package/dist/dashboard/out/login.txt +2 -2
  141. package/dist/dashboard/out/metrics.html +1 -1
  142. package/dist/dashboard/out/metrics.txt +3 -3
  143. package/dist/dashboard/out/pricing.html +2 -2
  144. package/dist/dashboard/out/pricing.txt +3 -3
  145. package/dist/dashboard/out/providers/setup/claude.html +1 -0
  146. package/dist/dashboard/out/providers/setup/claude.txt +8 -0
  147. package/dist/dashboard/out/providers/setup/codex.html +1 -0
  148. package/dist/dashboard/out/providers/setup/codex.txt +8 -0
  149. package/dist/dashboard/out/providers.html +1 -1
  150. package/dist/dashboard/out/providers.txt +3 -3
  151. package/dist/dashboard/out/signup.html +2 -2
  152. package/dist/dashboard/out/signup.txt +2 -2
  153. package/dist/dashboard-server/server.js +316 -12
  154. package/dist/dashboard-server/user-bridge.d.ts +103 -0
  155. package/dist/dashboard-server/user-bridge.js +189 -0
  156. package/dist/protocol/channels.d.ts +205 -0
  157. package/dist/protocol/channels.js +154 -0
  158. package/dist/protocol/types.d.ts +13 -1
  159. package/dist/resiliency/provider-context.js +2 -0
  160. package/dist/shared/cli-auth-config.d.ts +19 -0
  161. package/dist/shared/cli-auth-config.js +58 -2
  162. package/dist/utils/agent-config.js +1 -1
  163. package/dist/wrapper/auth-detection.d.ts +49 -0
  164. package/dist/wrapper/auth-detection.js +192 -0
  165. package/dist/wrapper/base-wrapper.d.ts +153 -0
  166. package/dist/wrapper/base-wrapper.js +393 -0
  167. package/dist/wrapper/client.d.ts +7 -1
  168. package/dist/wrapper/client.js +3 -0
  169. package/dist/wrapper/index.d.ts +1 -0
  170. package/dist/wrapper/index.js +4 -3
  171. package/dist/wrapper/pty-wrapper.d.ts +62 -84
  172. package/dist/wrapper/pty-wrapper.js +154 -180
  173. package/dist/wrapper/tmux-wrapper.d.ts +41 -66
  174. package/dist/wrapper/tmux-wrapper.js +90 -134
  175. package/package.json +4 -2
  176. package/scripts/postinstall.js +11 -155
  177. package/scripts/test-interactive-terminal.sh +248 -0
  178. package/dist/cloud/vault/index.d.ts +0 -76
  179. package/dist/cloud/vault/index.js +0 -219
  180. package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +0 -1
  181. package/dist/dashboard/out/_next/static/chunks/724-2dae7627550ab88f.js +0 -9
  182. package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +0 -1
  183. package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +0 -1
  184. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-67a3e98d9a43a6ed.js +0 -1
  185. package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +0 -1
  186. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +0 -1
  187. package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +0 -1
  188. package/dist/dashboard/out/_next/static/wPgKJtcOmTFLpUncDg16A/_ssgManifest.js +0 -1
  189. /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