agent-relay 2.0.23 → 2.0.24

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 (168) hide show
  1. package/dist/src/cli/index.js +66 -13
  2. package/package.json +18 -52
  3. package/packages/api-types/package.json +1 -1
  4. package/packages/bridge/package.json +8 -8
  5. package/packages/cli-tester/package.json +1 -1
  6. package/packages/config/package.json +2 -2
  7. package/packages/continuity/package.json +1 -1
  8. package/packages/daemon/package.json +12 -12
  9. package/packages/hooks/package.json +4 -4
  10. package/packages/mcp/package.json +2 -2
  11. package/packages/memory/package.json +2 -2
  12. package/packages/policy/package.json +2 -2
  13. package/packages/protocol/package.json +1 -1
  14. package/packages/resiliency/package.json +1 -1
  15. package/packages/sdk/package.json +2 -2
  16. package/packages/spawner/package.json +1 -1
  17. package/packages/state/package.json +1 -1
  18. package/packages/storage/package.json +2 -2
  19. package/packages/telemetry/package.json +1 -1
  20. package/packages/trajectory/package.json +2 -2
  21. package/packages/user-directory/package.json +2 -2
  22. package/packages/utils/package.json +1 -1
  23. package/packages/wrapper/package.json +6 -6
  24. package/deploy/init-db.sql +0 -5
  25. package/deploy/scripts/setup-fly-workspaces.sh +0 -69
  26. package/deploy/scripts/setup-railway.sh +0 -75
  27. package/dist/src/cloud/index.d.ts +0 -8
  28. package/dist/src/cloud/index.js +0 -8
  29. package/packages/cloud/dist/api/admin.d.ts +0 -8
  30. package/packages/cloud/dist/api/admin.js +0 -225
  31. package/packages/cloud/dist/api/auth.d.ts +0 -20
  32. package/packages/cloud/dist/api/auth.js +0 -138
  33. package/packages/cloud/dist/api/billing.d.ts +0 -7
  34. package/packages/cloud/dist/api/billing.js +0 -564
  35. package/packages/cloud/dist/api/cli-pty-runner.d.ts +0 -53
  36. package/packages/cloud/dist/api/cli-pty-runner.js +0 -175
  37. package/packages/cloud/dist/api/codex-auth-helper.d.ts +0 -21
  38. package/packages/cloud/dist/api/codex-auth-helper.js +0 -327
  39. package/packages/cloud/dist/api/consensus.d.ts +0 -13
  40. package/packages/cloud/dist/api/consensus.js +0 -261
  41. package/packages/cloud/dist/api/coordinators.d.ts +0 -8
  42. package/packages/cloud/dist/api/coordinators.js +0 -750
  43. package/packages/cloud/dist/api/daemons.d.ts +0 -12
  44. package/packages/cloud/dist/api/daemons.js +0 -535
  45. package/packages/cloud/dist/api/email-auth.d.ts +0 -11
  46. package/packages/cloud/dist/api/email-auth.js +0 -347
  47. package/packages/cloud/dist/api/generic-webhooks.d.ts +0 -8
  48. package/packages/cloud/dist/api/generic-webhooks.js +0 -129
  49. package/packages/cloud/dist/api/git.d.ts +0 -8
  50. package/packages/cloud/dist/api/git.js +0 -269
  51. package/packages/cloud/dist/api/github-app.d.ts +0 -11
  52. package/packages/cloud/dist/api/github-app.js +0 -223
  53. package/packages/cloud/dist/api/middleware/planLimits.d.ts +0 -43
  54. package/packages/cloud/dist/api/middleware/planLimits.js +0 -202
  55. package/packages/cloud/dist/api/monitoring.d.ts +0 -11
  56. package/packages/cloud/dist/api/monitoring.js +0 -578
  57. package/packages/cloud/dist/api/nango-auth.d.ts +0 -9
  58. package/packages/cloud/dist/api/nango-auth.js +0 -741
  59. package/packages/cloud/dist/api/onboarding.d.ts +0 -15
  60. package/packages/cloud/dist/api/onboarding.js +0 -679
  61. package/packages/cloud/dist/api/policy.d.ts +0 -8
  62. package/packages/cloud/dist/api/policy.js +0 -229
  63. package/packages/cloud/dist/api/provider-env.d.ts +0 -26
  64. package/packages/cloud/dist/api/provider-env.js +0 -141
  65. package/packages/cloud/dist/api/providers.d.ts +0 -7
  66. package/packages/cloud/dist/api/providers.js +0 -574
  67. package/packages/cloud/dist/api/repos.d.ts +0 -8
  68. package/packages/cloud/dist/api/repos.js +0 -577
  69. package/packages/cloud/dist/api/sessions.d.ts +0 -11
  70. package/packages/cloud/dist/api/sessions.js +0 -302
  71. package/packages/cloud/dist/api/teams.d.ts +0 -7
  72. package/packages/cloud/dist/api/teams.js +0 -281
  73. package/packages/cloud/dist/api/test-helpers.d.ts +0 -10
  74. package/packages/cloud/dist/api/test-helpers.js +0 -745
  75. package/packages/cloud/dist/api/usage.d.ts +0 -7
  76. package/packages/cloud/dist/api/usage.js +0 -111
  77. package/packages/cloud/dist/api/webhooks.d.ts +0 -8
  78. package/packages/cloud/dist/api/webhooks.js +0 -645
  79. package/packages/cloud/dist/api/workspaces.d.ts +0 -25
  80. package/packages/cloud/dist/api/workspaces.js +0 -1799
  81. package/packages/cloud/dist/billing/index.d.ts +0 -9
  82. package/packages/cloud/dist/billing/index.js +0 -9
  83. package/packages/cloud/dist/billing/plans.d.ts +0 -39
  84. package/packages/cloud/dist/billing/plans.js +0 -245
  85. package/packages/cloud/dist/billing/service.d.ts +0 -80
  86. package/packages/cloud/dist/billing/service.js +0 -388
  87. package/packages/cloud/dist/billing/types.d.ts +0 -141
  88. package/packages/cloud/dist/billing/types.js +0 -7
  89. package/packages/cloud/dist/config.d.ts +0 -5
  90. package/packages/cloud/dist/config.js +0 -5
  91. package/packages/cloud/dist/db/bulk-ingest.d.ts +0 -89
  92. package/packages/cloud/dist/db/bulk-ingest.js +0 -268
  93. package/packages/cloud/dist/db/drizzle.d.ts +0 -290
  94. package/packages/cloud/dist/db/drizzle.js +0 -1422
  95. package/packages/cloud/dist/db/index.d.ts +0 -56
  96. package/packages/cloud/dist/db/index.js +0 -70
  97. package/packages/cloud/dist/db/schema.d.ts +0 -5117
  98. package/packages/cloud/dist/db/schema.js +0 -656
  99. package/packages/cloud/dist/index.d.ts +0 -11
  100. package/packages/cloud/dist/index.js +0 -38
  101. package/packages/cloud/dist/provisioner/index.d.ts +0 -207
  102. package/packages/cloud/dist/provisioner/index.js +0 -2118
  103. package/packages/cloud/dist/server.d.ts +0 -17
  104. package/packages/cloud/dist/server.js +0 -2055
  105. package/packages/cloud/dist/services/auto-scaler.d.ts +0 -152
  106. package/packages/cloud/dist/services/auto-scaler.js +0 -439
  107. package/packages/cloud/dist/services/capacity-manager.d.ts +0 -148
  108. package/packages/cloud/dist/services/capacity-manager.js +0 -449
  109. package/packages/cloud/dist/services/ci-agent-spawner.d.ts +0 -49
  110. package/packages/cloud/dist/services/ci-agent-spawner.js +0 -373
  111. package/packages/cloud/dist/services/cloud-message-bus.d.ts +0 -28
  112. package/packages/cloud/dist/services/cloud-message-bus.js +0 -19
  113. package/packages/cloud/dist/services/compute-enforcement.d.ts +0 -57
  114. package/packages/cloud/dist/services/compute-enforcement.js +0 -175
  115. package/packages/cloud/dist/services/coordinator.d.ts +0 -62
  116. package/packages/cloud/dist/services/coordinator.js +0 -389
  117. package/packages/cloud/dist/services/index.d.ts +0 -17
  118. package/packages/cloud/dist/services/index.js +0 -25
  119. package/packages/cloud/dist/services/intro-expiration.d.ts +0 -60
  120. package/packages/cloud/dist/services/intro-expiration.js +0 -252
  121. package/packages/cloud/dist/services/mention-handler.d.ts +0 -65
  122. package/packages/cloud/dist/services/mention-handler.js +0 -405
  123. package/packages/cloud/dist/services/nango.d.ts +0 -219
  124. package/packages/cloud/dist/services/nango.js +0 -424
  125. package/packages/cloud/dist/services/persistence.d.ts +0 -131
  126. package/packages/cloud/dist/services/persistence.js +0 -200
  127. package/packages/cloud/dist/services/planLimits.d.ts +0 -147
  128. package/packages/cloud/dist/services/planLimits.js +0 -335
  129. package/packages/cloud/dist/services/presence-registry.d.ts +0 -56
  130. package/packages/cloud/dist/services/presence-registry.js +0 -91
  131. package/packages/cloud/dist/services/scaling-orchestrator.d.ts +0 -159
  132. package/packages/cloud/dist/services/scaling-orchestrator.js +0 -502
  133. package/packages/cloud/dist/services/scaling-policy.d.ts +0 -121
  134. package/packages/cloud/dist/services/scaling-policy.js +0 -415
  135. package/packages/cloud/dist/services/ssh-security.d.ts +0 -31
  136. package/packages/cloud/dist/services/ssh-security.js +0 -63
  137. package/packages/cloud/dist/services/workspace-keepalive.d.ts +0 -76
  138. package/packages/cloud/dist/services/workspace-keepalive.js +0 -234
  139. package/packages/cloud/dist/shims/consensus.d.ts +0 -23
  140. package/packages/cloud/dist/shims/consensus.js +0 -5
  141. package/packages/cloud/dist/webhooks/index.d.ts +0 -24
  142. package/packages/cloud/dist/webhooks/index.js +0 -29
  143. package/packages/cloud/dist/webhooks/parsers/github.d.ts +0 -8
  144. package/packages/cloud/dist/webhooks/parsers/github.js +0 -234
  145. package/packages/cloud/dist/webhooks/parsers/index.d.ts +0 -23
  146. package/packages/cloud/dist/webhooks/parsers/index.js +0 -30
  147. package/packages/cloud/dist/webhooks/parsers/linear.d.ts +0 -9
  148. package/packages/cloud/dist/webhooks/parsers/linear.js +0 -258
  149. package/packages/cloud/dist/webhooks/parsers/slack.d.ts +0 -9
  150. package/packages/cloud/dist/webhooks/parsers/slack.js +0 -214
  151. package/packages/cloud/dist/webhooks/responders/github.d.ts +0 -8
  152. package/packages/cloud/dist/webhooks/responders/github.js +0 -73
  153. package/packages/cloud/dist/webhooks/responders/index.d.ts +0 -23
  154. package/packages/cloud/dist/webhooks/responders/index.js +0 -30
  155. package/packages/cloud/dist/webhooks/responders/linear.d.ts +0 -9
  156. package/packages/cloud/dist/webhooks/responders/linear.js +0 -149
  157. package/packages/cloud/dist/webhooks/responders/slack.d.ts +0 -20
  158. package/packages/cloud/dist/webhooks/responders/slack.js +0 -178
  159. package/packages/cloud/dist/webhooks/router.d.ts +0 -25
  160. package/packages/cloud/dist/webhooks/router.js +0 -504
  161. package/packages/cloud/dist/webhooks/rules-engine.d.ts +0 -24
  162. package/packages/cloud/dist/webhooks/rules-engine.js +0 -287
  163. package/packages/cloud/dist/webhooks/types.d.ts +0 -186
  164. package/packages/cloud/dist/webhooks/types.js +0 -8
  165. package/packages/cloud/package.json +0 -60
  166. package/scripts/run-migrations.js +0 -43
  167. package/scripts/setup-stripe-products.ts +0 -312
  168. package/scripts/verify-schema.js +0 -134
@@ -1,347 +0,0 @@
1
- /**
2
- * Email Auth API Routes
3
- *
4
- * Handles email/password authentication:
5
- * - Signup with email/password
6
- * - Login with email/password
7
- * - Email verification
8
- * - Password reset (future)
9
- */
10
- import { Router } from 'express';
11
- import { randomBytes, scrypt, timingSafeEqual } from 'node:crypto';
12
- import { promisify } from 'node:util';
13
- import { db } from '../db/index.js';
14
- import { requireAuth } from './auth.js';
15
- const scryptAsync = promisify(scrypt);
16
- export const emailAuthRouter = Router();
17
- // Password hashing configuration
18
- const SALT_LENGTH = 32;
19
- const KEY_LENGTH = 64;
20
- /**
21
- * Hash a password using scrypt
22
- */
23
- async function hashPassword(password) {
24
- const salt = randomBytes(SALT_LENGTH);
25
- const derivedKey = await scryptAsync(password, salt, KEY_LENGTH);
26
- return `${salt.toString('hex')}:${derivedKey.toString('hex')}`;
27
- }
28
- /**
29
- * Verify a password against a hash
30
- */
31
- async function verifyPassword(password, storedHash) {
32
- try {
33
- const [saltHex, keyHex] = storedHash.split(':');
34
- if (!saltHex || !keyHex)
35
- return false;
36
- const salt = Buffer.from(saltHex, 'hex');
37
- const storedKey = Buffer.from(keyHex, 'hex');
38
- const derivedKey = await scryptAsync(password, salt, KEY_LENGTH);
39
- return timingSafeEqual(storedKey, derivedKey);
40
- }
41
- catch {
42
- return false;
43
- }
44
- }
45
- /**
46
- * Generate a random verification token
47
- */
48
- function generateVerificationToken() {
49
- return randomBytes(32).toString('hex');
50
- }
51
- /**
52
- * Validate email format
53
- */
54
- function isValidEmail(email) {
55
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
56
- return emailRegex.test(email);
57
- }
58
- /**
59
- * Validate password strength
60
- */
61
- function isValidPassword(password) {
62
- if (password.length < 8) {
63
- return { valid: false, message: 'Password must be at least 8 characters long' };
64
- }
65
- if (password.length > 128) {
66
- return { valid: false, message: 'Password must be less than 128 characters' };
67
- }
68
- return { valid: true };
69
- }
70
- /**
71
- * POST /api/auth/email/signup
72
- * Create a new account with email/password
73
- */
74
- emailAuthRouter.post('/signup', async (req, res) => {
75
- try {
76
- const { email, password, displayName } = req.body;
77
- // Validate input
78
- if (!email || typeof email !== 'string') {
79
- return res.status(400).json({ error: 'Email is required' });
80
- }
81
- if (!password || typeof password !== 'string') {
82
- return res.status(400).json({ error: 'Password is required' });
83
- }
84
- const normalizedEmail = email.toLowerCase().trim();
85
- if (!isValidEmail(normalizedEmail)) {
86
- return res.status(400).json({ error: 'Invalid email format' });
87
- }
88
- const passwordValidation = isValidPassword(password);
89
- if (!passwordValidation.valid) {
90
- return res.status(400).json({ error: passwordValidation.message });
91
- }
92
- // Check if email already exists (in users.email or user_emails table)
93
- // This enables account reconciliation - if someone signed up via GitHub,
94
- // their linked emails will be found and they should log in instead
95
- const existingUser = await db.userEmails.findUserByEmail(normalizedEmail);
96
- if (existingUser) {
97
- // If the existing user signed up via GitHub, offer to use that account
98
- if (existingUser.githubId && !existingUser.passwordHash) {
99
- return res.status(409).json({
100
- error: 'This email is associated with a GitHub account. Please log in with GitHub, or set a password on that account.',
101
- code: 'GITHUB_ACCOUNT_EXISTS',
102
- });
103
- }
104
- return res.status(409).json({ error: 'An account with this email already exists' });
105
- }
106
- // Hash password and create user
107
- const passwordHash = await hashPassword(password);
108
- const user = await db.users.createEmailUser({
109
- email: normalizedEmail,
110
- passwordHash,
111
- displayName: displayName?.trim() || undefined,
112
- });
113
- // Generate verification token
114
- const verificationToken = generateVerificationToken();
115
- const verificationExpires = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 hours
116
- await db.users.setEmailVerificationToken(user.id, verificationToken, verificationExpires);
117
- // TODO: Send verification email
118
- // For now, we'll auto-verify in development or skip email verification
119
- // In production, you would send an email with a link containing the token
120
- // Set session
121
- req.session.userId = user.id;
122
- res.status(201).json({
123
- success: true,
124
- user: {
125
- id: user.id,
126
- email: user.email,
127
- displayName: user.displayName,
128
- emailVerified: user.emailVerified,
129
- },
130
- // Include verification token in development for testing
131
- ...(process.env.NODE_ENV !== 'production' && { verificationToken }),
132
- });
133
- }
134
- catch (error) {
135
- console.error('Email signup error:', error);
136
- res.status(500).json({ error: 'Failed to create account' });
137
- }
138
- });
139
- /**
140
- * POST /api/auth/email/login
141
- * Login with email/password
142
- *
143
- * Supports account reconciliation: users can log in with any email address
144
- * linked to their account via GitHub, not just their primary email.
145
- */
146
- emailAuthRouter.post('/login', async (req, res) => {
147
- try {
148
- const { email, password } = req.body;
149
- // Validate input
150
- if (!email || typeof email !== 'string') {
151
- return res.status(400).json({ error: 'Email is required' });
152
- }
153
- if (!password || typeof password !== 'string') {
154
- return res.status(400).json({ error: 'Password is required' });
155
- }
156
- const normalizedEmail = email.toLowerCase().trim();
157
- // Find user by email - checks both user_emails table (GitHub-linked emails)
158
- // and users.email (primary email), enabling account reconciliation
159
- const user = await db.userEmails.findUserByEmail(normalizedEmail);
160
- if (!user) {
161
- // Use same message for security (don't reveal if email exists)
162
- return res.status(401).json({ error: 'Invalid email or password' });
163
- }
164
- // Check if user has a password (might be GitHub-only user)
165
- if (!user.passwordHash) {
166
- return res.status(401).json({
167
- error: 'This account uses GitHub login. Please sign in with GitHub, or set a password to enable email login.',
168
- code: 'GITHUB_ACCOUNT',
169
- });
170
- }
171
- // Verify password
172
- const isValid = await verifyPassword(password, user.passwordHash);
173
- if (!isValid) {
174
- return res.status(401).json({ error: 'Invalid email or password' });
175
- }
176
- // Set session
177
- req.session.userId = user.id;
178
- res.json({
179
- success: true,
180
- user: {
181
- id: user.id,
182
- email: user.email,
183
- displayName: user.displayName,
184
- githubUsername: user.githubUsername,
185
- avatarUrl: user.avatarUrl,
186
- emailVerified: user.emailVerified,
187
- },
188
- });
189
- }
190
- catch (error) {
191
- console.error('Email login error:', error);
192
- res.status(500).json({ error: 'Failed to login' });
193
- }
194
- });
195
- /**
196
- * POST /api/auth/email/verify
197
- * Verify email with token
198
- */
199
- emailAuthRouter.post('/verify', async (req, res) => {
200
- try {
201
- const { token } = req.body;
202
- if (!token || typeof token !== 'string') {
203
- return res.status(400).json({ error: 'Verification token is required' });
204
- }
205
- // Find user by token
206
- const user = await db.users.findByEmailVerificationToken(token);
207
- if (!user) {
208
- return res.status(400).json({ error: 'Invalid or expired verification token' });
209
- }
210
- // Check if token expired
211
- if (user.emailVerificationExpires && user.emailVerificationExpires < new Date()) {
212
- return res.status(400).json({ error: 'Verification token has expired' });
213
- }
214
- // Verify email
215
- await db.users.verifyEmail(user.id);
216
- res.json({
217
- success: true,
218
- message: 'Email verified successfully',
219
- });
220
- }
221
- catch (error) {
222
- console.error('Email verification error:', error);
223
- res.status(500).json({ error: 'Failed to verify email' });
224
- }
225
- });
226
- /**
227
- * POST /api/auth/email/resend-verification
228
- * Resend verification email (requires auth)
229
- */
230
- emailAuthRouter.post('/resend-verification', requireAuth, async (req, res) => {
231
- try {
232
- const userId = req.session.userId;
233
- const user = await db.users.findById(userId);
234
- if (!user) {
235
- return res.status(404).json({ error: 'User not found' });
236
- }
237
- if (user.emailVerified) {
238
- return res.status(400).json({ error: 'Email is already verified' });
239
- }
240
- if (!user.email) {
241
- return res.status(400).json({ error: 'No email address on this account' });
242
- }
243
- // Generate new verification token
244
- const verificationToken = generateVerificationToken();
245
- const verificationExpires = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 hours
246
- await db.users.setEmailVerificationToken(user.id, verificationToken, verificationExpires);
247
- // TODO: Send verification email
248
- // For now, return success and include token in development
249
- res.json({
250
- success: true,
251
- message: 'Verification email sent',
252
- ...(process.env.NODE_ENV !== 'production' && { verificationToken }),
253
- });
254
- }
255
- catch (error) {
256
- console.error('Resend verification error:', error);
257
- res.status(500).json({ error: 'Failed to resend verification email' });
258
- }
259
- });
260
- /**
261
- * POST /api/auth/set-email
262
- * Set email for GitHub users who don't have one (requires auth)
263
- */
264
- emailAuthRouter.post('/set-email', requireAuth, async (req, res) => {
265
- try {
266
- const userId = req.session.userId;
267
- const { email } = req.body;
268
- if (!email || typeof email !== 'string') {
269
- return res.status(400).json({ error: 'Email is required' });
270
- }
271
- const normalizedEmail = email.toLowerCase().trim();
272
- if (!isValidEmail(normalizedEmail)) {
273
- return res.status(400).json({ error: 'Invalid email format' });
274
- }
275
- const user = await db.users.findById(userId);
276
- if (!user) {
277
- return res.status(404).json({ error: 'User not found' });
278
- }
279
- // Check if user already has an email
280
- if (user.email) {
281
- return res.status(400).json({ error: 'Email is already set for this account' });
282
- }
283
- // Check if email is already used by another user (including in user_emails table)
284
- const isLinkedToOther = await db.userEmails.isEmailLinkedToOtherUser(normalizedEmail, userId);
285
- if (isLinkedToOther) {
286
- return res.status(409).json({ error: 'This email is already associated with another account' });
287
- }
288
- // Also check users.email directly
289
- const existingUser = await db.users.findByEmail(normalizedEmail);
290
- if (existingUser && existingUser.id !== userId) {
291
- return res.status(409).json({ error: 'This email is already associated with another account' });
292
- }
293
- // Update user with email
294
- await db.users.update(userId, { email: normalizedEmail });
295
- // Generate verification token
296
- const verificationToken = generateVerificationToken();
297
- const verificationExpires = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 hours
298
- await db.users.setEmailVerificationToken(userId, verificationToken, verificationExpires);
299
- // TODO: Send verification email
300
- res.json({
301
- success: true,
302
- message: 'Email set successfully',
303
- email: normalizedEmail,
304
- ...(process.env.NODE_ENV !== 'production' && { verificationToken }),
305
- });
306
- }
307
- catch (error) {
308
- console.error('Set email error:', error);
309
- res.status(500).json({ error: 'Failed to set email' });
310
- }
311
- });
312
- /**
313
- * POST /api/auth/email/set-password
314
- * Set password for GitHub users who want to add email login (requires auth)
315
- */
316
- emailAuthRouter.post('/set-password', requireAuth, async (req, res) => {
317
- try {
318
- const userId = req.session.userId;
319
- const { password } = req.body;
320
- if (!password || typeof password !== 'string') {
321
- return res.status(400).json({ error: 'Password is required' });
322
- }
323
- const passwordValidation = isValidPassword(password);
324
- if (!passwordValidation.valid) {
325
- return res.status(400).json({ error: passwordValidation.message });
326
- }
327
- const user = await db.users.findById(userId);
328
- if (!user) {
329
- return res.status(404).json({ error: 'User not found' });
330
- }
331
- if (!user.email) {
332
- return res.status(400).json({ error: 'Please set an email address first' });
333
- }
334
- // Hash password and update user
335
- const passwordHash = await hashPassword(password);
336
- await db.users.updatePassword(userId, passwordHash);
337
- res.json({
338
- success: true,
339
- message: 'Password set successfully',
340
- });
341
- }
342
- catch (error) {
343
- console.error('Set password error:', error);
344
- res.status(500).json({ error: 'Failed to set password' });
345
- }
346
- });
347
- //# sourceMappingURL=email-auth.js.map
@@ -1,8 +0,0 @@
1
- /**
2
- * Generic Webhooks API Routes
3
- *
4
- * Provides endpoints for receiving webhooks from any configured source.
5
- * Routes: POST /api/webhooks/:source
6
- */
7
- export declare const genericWebhooksRouter: import("express-serve-static-core").Router;
8
- //# sourceMappingURL=generic-webhooks.d.ts.map
@@ -1,129 +0,0 @@
1
- /**
2
- * Generic Webhooks API Routes
3
- *
4
- * Provides endpoints for receiving webhooks from any configured source.
5
- * Routes: POST /api/webhooks/:source
6
- */
7
- import { Router } from 'express';
8
- import { processWebhook, getWebhookConfig } from '../webhooks/index.js';
9
- export const genericWebhooksRouter = Router();
10
- /**
11
- * POST /api/webhooks/:source
12
- * Receive a webhook from any configured source
13
- */
14
- genericWebhooksRouter.post('/:source', async (req, res) => {
15
- const source = req.params.source;
16
- // For Slack URL verification challenge
17
- if (source === 'slack' && req.body?.type === 'url_verification') {
18
- return res.json({ challenge: req.body.challenge });
19
- }
20
- try {
21
- // Get raw body for signature verification
22
- // Note: This requires express.raw() middleware or similar
23
- const rawBody = typeof req.body === 'string'
24
- ? req.body
25
- : JSON.stringify(req.body);
26
- const result = await processWebhook(source, rawBody, req.headers);
27
- if (!result.success && result.responses[0]?.error === 'Invalid signature') {
28
- return res.status(401).json({ error: 'Invalid signature' });
29
- }
30
- if (!result.success && result.responses[0]?.error?.includes('Unknown webhook source')) {
31
- return res.status(404).json({ error: `Unknown webhook source: ${source}` });
32
- }
33
- console.log(`[webhooks] Processed ${source} webhook: ${result.eventType} (${result.matchedRules.length} rules matched)`);
34
- res.json({
35
- success: result.success,
36
- eventId: result.eventId,
37
- eventType: result.eventType,
38
- matchedRules: result.matchedRules,
39
- actionsExecuted: result.actions.length,
40
- });
41
- }
42
- catch (error) {
43
- console.error(`[webhooks] Error processing ${source} webhook:`, error);
44
- res.status(500).json({
45
- error: error instanceof Error ? error.message : 'Unknown error',
46
- });
47
- }
48
- });
49
- /**
50
- * GET /api/webhooks/config
51
- * Get the current webhook configuration (for debugging)
52
- */
53
- genericWebhooksRouter.get('/config', (_req, res) => {
54
- const config = getWebhookConfig();
55
- res.json({
56
- sources: Object.entries(config.sources).map(([id, source]) => ({
57
- id,
58
- name: source.name,
59
- enabled: source.enabled,
60
- parser: source.parser,
61
- responder: source.responder,
62
- })),
63
- rules: config.rules.map(rule => ({
64
- id: rule.id,
65
- name: rule.name,
66
- enabled: rule.enabled,
67
- source: rule.source,
68
- eventType: rule.eventType,
69
- condition: rule.condition,
70
- actionType: rule.action.type,
71
- priority: rule.priority,
72
- })),
73
- });
74
- });
75
- /**
76
- * GET /api/webhooks/sources
77
- * List available webhook sources with their setup instructions
78
- */
79
- genericWebhooksRouter.get('/sources', (_req, res) => {
80
- const baseUrl = process.env.PUBLIC_URL || 'https://your-domain.com';
81
- res.json({
82
- sources: [
83
- {
84
- id: 'github',
85
- name: 'GitHub',
86
- webhookUrl: `${baseUrl}/api/webhooks/github`,
87
- setupInstructions: [
88
- '1. Go to your repository Settings > Webhooks > Add webhook',
89
- `2. Set Payload URL to: ${baseUrl}/api/webhooks/github`,
90
- '3. Set Content type to: application/json',
91
- '4. Set Secret to your GITHUB_WEBHOOK_SECRET value',
92
- '5. Select events: Check runs, Issues, Issue comments, Pull request review comments',
93
- ],
94
- requiredEnvVars: ['GITHUB_WEBHOOK_SECRET'],
95
- events: ['check_run', 'issues', 'issue_comment', 'pull_request_review_comment'],
96
- },
97
- {
98
- id: 'linear',
99
- name: 'Linear',
100
- webhookUrl: `${baseUrl}/api/webhooks/linear`,
101
- setupInstructions: [
102
- '1. Go to Linear Settings > API > Webhooks',
103
- '2. Create a new webhook',
104
- `3. Set URL to: ${baseUrl}/api/webhooks/linear`,
105
- '4. Copy the signing secret to LINEAR_WEBHOOK_SECRET',
106
- '5. Select events: Issues, Comments',
107
- ],
108
- requiredEnvVars: ['LINEAR_WEBHOOK_SECRET', 'LINEAR_API_KEY'],
109
- events: ['Issue', 'Comment', 'IssueLabel'],
110
- },
111
- {
112
- id: 'slack',
113
- name: 'Slack',
114
- webhookUrl: `${baseUrl}/api/webhooks/slack`,
115
- setupInstructions: [
116
- '1. Create a Slack App at api.slack.com/apps',
117
- '2. Enable Event Subscriptions',
118
- `3. Set Request URL to: ${baseUrl}/api/webhooks/slack`,
119
- '4. Subscribe to bot events: app_mention, message.channels',
120
- '5. Copy Signing Secret to SLACK_SIGNING_SECRET',
121
- '6. Install the app to your workspace',
122
- ],
123
- requiredEnvVars: ['SLACK_SIGNING_SECRET', 'SLACK_BOT_TOKEN'],
124
- events: ['app_mention', 'message', 'reaction_added'],
125
- },
126
- ],
127
- });
128
- });
129
- //# sourceMappingURL=generic-webhooks.js.map
@@ -1,8 +0,0 @@
1
- /**
2
- * Git Gateway API Routes
3
- *
4
- * Provides fresh GitHub tokens to workspace containers for git operations.
5
- * This gateway pattern ensures tokens are always valid (Nango handles refresh).
6
- */
7
- export declare const gitRouter: import("express-serve-static-core").Router;
8
- //# sourceMappingURL=git.d.ts.map