@agent-relay/cloud 0.1.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.
Files changed (269) hide show
  1. package/dist/api/admin.d.ts +8 -0
  2. package/dist/api/admin.d.ts.map +1 -0
  3. package/dist/api/admin.js +225 -0
  4. package/dist/api/admin.js.map +1 -0
  5. package/dist/api/auth.d.ts +20 -0
  6. package/dist/api/auth.d.ts.map +1 -0
  7. package/dist/api/auth.js +136 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/billing.d.ts +7 -0
  10. package/dist/api/billing.d.ts.map +1 -0
  11. package/dist/api/billing.js +564 -0
  12. package/dist/api/billing.js.map +1 -0
  13. package/dist/api/cli-pty-runner.d.ts +53 -0
  14. package/dist/api/cli-pty-runner.d.ts.map +1 -0
  15. package/dist/api/cli-pty-runner.js +193 -0
  16. package/dist/api/cli-pty-runner.js.map +1 -0
  17. package/dist/api/codex-auth-helper.d.ts +21 -0
  18. package/dist/api/codex-auth-helper.d.ts.map +1 -0
  19. package/dist/api/codex-auth-helper.js +327 -0
  20. package/dist/api/codex-auth-helper.js.map +1 -0
  21. package/dist/api/consensus.d.ts +13 -0
  22. package/dist/api/consensus.d.ts.map +1 -0
  23. package/dist/api/consensus.js +261 -0
  24. package/dist/api/consensus.js.map +1 -0
  25. package/dist/api/coordinators.d.ts +8 -0
  26. package/dist/api/coordinators.d.ts.map +1 -0
  27. package/dist/api/coordinators.js +750 -0
  28. package/dist/api/coordinators.js.map +1 -0
  29. package/dist/api/daemons.d.ts +12 -0
  30. package/dist/api/daemons.d.ts.map +1 -0
  31. package/dist/api/daemons.js +535 -0
  32. package/dist/api/daemons.js.map +1 -0
  33. package/dist/api/generic-webhooks.d.ts +8 -0
  34. package/dist/api/generic-webhooks.d.ts.map +1 -0
  35. package/dist/api/generic-webhooks.js +129 -0
  36. package/dist/api/generic-webhooks.js.map +1 -0
  37. package/dist/api/git.d.ts +8 -0
  38. package/dist/api/git.d.ts.map +1 -0
  39. package/dist/api/git.js +269 -0
  40. package/dist/api/git.js.map +1 -0
  41. package/dist/api/github-app.d.ts +11 -0
  42. package/dist/api/github-app.d.ts.map +1 -0
  43. package/dist/api/github-app.js +223 -0
  44. package/dist/api/github-app.js.map +1 -0
  45. package/dist/api/middleware/planLimits.d.ts +43 -0
  46. package/dist/api/middleware/planLimits.d.ts.map +1 -0
  47. package/dist/api/middleware/planLimits.js +202 -0
  48. package/dist/api/middleware/planLimits.js.map +1 -0
  49. package/dist/api/monitoring.d.ts +11 -0
  50. package/dist/api/monitoring.d.ts.map +1 -0
  51. package/dist/api/monitoring.js +578 -0
  52. package/dist/api/monitoring.js.map +1 -0
  53. package/dist/api/nango-auth.d.ts +9 -0
  54. package/dist/api/nango-auth.d.ts.map +1 -0
  55. package/dist/api/nango-auth.js +674 -0
  56. package/dist/api/nango-auth.js.map +1 -0
  57. package/dist/api/onboarding.d.ts +15 -0
  58. package/dist/api/onboarding.d.ts.map +1 -0
  59. package/dist/api/onboarding.js +679 -0
  60. package/dist/api/onboarding.js.map +1 -0
  61. package/dist/api/policy.d.ts +8 -0
  62. package/dist/api/policy.d.ts.map +1 -0
  63. package/dist/api/policy.js +229 -0
  64. package/dist/api/policy.js.map +1 -0
  65. package/dist/api/provider-env.d.ts +14 -0
  66. package/dist/api/provider-env.d.ts.map +1 -0
  67. package/dist/api/provider-env.js +75 -0
  68. package/dist/api/provider-env.js.map +1 -0
  69. package/dist/api/providers.d.ts +7 -0
  70. package/dist/api/providers.d.ts.map +1 -0
  71. package/dist/api/providers.js +564 -0
  72. package/dist/api/providers.js.map +1 -0
  73. package/dist/api/repos.d.ts +8 -0
  74. package/dist/api/repos.d.ts.map +1 -0
  75. package/dist/api/repos.js +577 -0
  76. package/dist/api/repos.js.map +1 -0
  77. package/dist/api/sessions.d.ts +11 -0
  78. package/dist/api/sessions.d.ts.map +1 -0
  79. package/dist/api/sessions.js +302 -0
  80. package/dist/api/sessions.js.map +1 -0
  81. package/dist/api/teams.d.ts +7 -0
  82. package/dist/api/teams.d.ts.map +1 -0
  83. package/dist/api/teams.js +281 -0
  84. package/dist/api/teams.js.map +1 -0
  85. package/dist/api/test-helpers.d.ts +10 -0
  86. package/dist/api/test-helpers.d.ts.map +1 -0
  87. package/dist/api/test-helpers.js +745 -0
  88. package/dist/api/test-helpers.js.map +1 -0
  89. package/dist/api/usage.d.ts +7 -0
  90. package/dist/api/usage.d.ts.map +1 -0
  91. package/dist/api/usage.js +111 -0
  92. package/dist/api/usage.js.map +1 -0
  93. package/dist/api/webhooks.d.ts +8 -0
  94. package/dist/api/webhooks.d.ts.map +1 -0
  95. package/dist/api/webhooks.js +645 -0
  96. package/dist/api/webhooks.js.map +1 -0
  97. package/dist/api/workspaces.d.ts +25 -0
  98. package/dist/api/workspaces.d.ts.map +1 -0
  99. package/dist/api/workspaces.js +1799 -0
  100. package/dist/api/workspaces.js.map +1 -0
  101. package/dist/billing/index.d.ts +9 -0
  102. package/dist/billing/index.d.ts.map +1 -0
  103. package/dist/billing/index.js +9 -0
  104. package/dist/billing/index.js.map +1 -0
  105. package/dist/billing/plans.d.ts +39 -0
  106. package/dist/billing/plans.d.ts.map +1 -0
  107. package/dist/billing/plans.js +245 -0
  108. package/dist/billing/plans.js.map +1 -0
  109. package/dist/billing/service.d.ts +80 -0
  110. package/dist/billing/service.d.ts.map +1 -0
  111. package/dist/billing/service.js +388 -0
  112. package/dist/billing/service.js.map +1 -0
  113. package/dist/billing/types.d.ts +141 -0
  114. package/dist/billing/types.d.ts.map +1 -0
  115. package/dist/billing/types.js +7 -0
  116. package/dist/billing/types.js.map +1 -0
  117. package/dist/config.d.ts +5 -0
  118. package/dist/config.d.ts.map +1 -0
  119. package/dist/config.js +5 -0
  120. package/dist/config.js.map +1 -0
  121. package/dist/db/bulk-ingest.d.ts +89 -0
  122. package/dist/db/bulk-ingest.d.ts.map +1 -0
  123. package/dist/db/bulk-ingest.js +268 -0
  124. package/dist/db/bulk-ingest.js.map +1 -0
  125. package/dist/db/drizzle.d.ts +256 -0
  126. package/dist/db/drizzle.d.ts.map +1 -0
  127. package/dist/db/drizzle.js +1286 -0
  128. package/dist/db/drizzle.js.map +1 -0
  129. package/dist/db/index.d.ts +55 -0
  130. package/dist/db/index.d.ts.map +1 -0
  131. package/dist/db/index.js +68 -0
  132. package/dist/db/index.js.map +1 -0
  133. package/dist/db/schema.d.ts +4873 -0
  134. package/dist/db/schema.d.ts.map +1 -0
  135. package/dist/db/schema.js +620 -0
  136. package/dist/db/schema.js.map +1 -0
  137. package/dist/index.d.ts +11 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +38 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/provisioner/index.d.ts +207 -0
  142. package/dist/provisioner/index.d.ts.map +1 -0
  143. package/dist/provisioner/index.js +2114 -0
  144. package/dist/provisioner/index.js.map +1 -0
  145. package/dist/server.d.ts +17 -0
  146. package/dist/server.d.ts.map +1 -0
  147. package/dist/server.js +1924 -0
  148. package/dist/server.js.map +1 -0
  149. package/dist/services/auto-scaler.d.ts +152 -0
  150. package/dist/services/auto-scaler.d.ts.map +1 -0
  151. package/dist/services/auto-scaler.js +439 -0
  152. package/dist/services/auto-scaler.js.map +1 -0
  153. package/dist/services/capacity-manager.d.ts +148 -0
  154. package/dist/services/capacity-manager.d.ts.map +1 -0
  155. package/dist/services/capacity-manager.js +449 -0
  156. package/dist/services/capacity-manager.js.map +1 -0
  157. package/dist/services/ci-agent-spawner.d.ts +49 -0
  158. package/dist/services/ci-agent-spawner.d.ts.map +1 -0
  159. package/dist/services/ci-agent-spawner.js +373 -0
  160. package/dist/services/ci-agent-spawner.js.map +1 -0
  161. package/dist/services/cloud-message-bus.d.ts +28 -0
  162. package/dist/services/cloud-message-bus.d.ts.map +1 -0
  163. package/dist/services/cloud-message-bus.js +19 -0
  164. package/dist/services/cloud-message-bus.js.map +1 -0
  165. package/dist/services/compute-enforcement.d.ts +57 -0
  166. package/dist/services/compute-enforcement.d.ts.map +1 -0
  167. package/dist/services/compute-enforcement.js +175 -0
  168. package/dist/services/compute-enforcement.js.map +1 -0
  169. package/dist/services/coordinator.d.ts +62 -0
  170. package/dist/services/coordinator.d.ts.map +1 -0
  171. package/dist/services/coordinator.js +389 -0
  172. package/dist/services/coordinator.js.map +1 -0
  173. package/dist/services/index.d.ts +17 -0
  174. package/dist/services/index.d.ts.map +1 -0
  175. package/dist/services/index.js +25 -0
  176. package/dist/services/index.js.map +1 -0
  177. package/dist/services/intro-expiration.d.ts +60 -0
  178. package/dist/services/intro-expiration.d.ts.map +1 -0
  179. package/dist/services/intro-expiration.js +252 -0
  180. package/dist/services/intro-expiration.js.map +1 -0
  181. package/dist/services/mention-handler.d.ts +65 -0
  182. package/dist/services/mention-handler.d.ts.map +1 -0
  183. package/dist/services/mention-handler.js +405 -0
  184. package/dist/services/mention-handler.js.map +1 -0
  185. package/dist/services/nango.d.ts +201 -0
  186. package/dist/services/nango.d.ts.map +1 -0
  187. package/dist/services/nango.js +392 -0
  188. package/dist/services/nango.js.map +1 -0
  189. package/dist/services/persistence.d.ts +131 -0
  190. package/dist/services/persistence.d.ts.map +1 -0
  191. package/dist/services/persistence.js +200 -0
  192. package/dist/services/persistence.js.map +1 -0
  193. package/dist/services/planLimits.d.ts +147 -0
  194. package/dist/services/planLimits.d.ts.map +1 -0
  195. package/dist/services/planLimits.js +335 -0
  196. package/dist/services/planLimits.js.map +1 -0
  197. package/dist/services/presence-registry.d.ts +56 -0
  198. package/dist/services/presence-registry.d.ts.map +1 -0
  199. package/dist/services/presence-registry.js +91 -0
  200. package/dist/services/presence-registry.js.map +1 -0
  201. package/dist/services/scaling-orchestrator.d.ts +159 -0
  202. package/dist/services/scaling-orchestrator.d.ts.map +1 -0
  203. package/dist/services/scaling-orchestrator.js +502 -0
  204. package/dist/services/scaling-orchestrator.js.map +1 -0
  205. package/dist/services/scaling-policy.d.ts +121 -0
  206. package/dist/services/scaling-policy.d.ts.map +1 -0
  207. package/dist/services/scaling-policy.js +415 -0
  208. package/dist/services/scaling-policy.js.map +1 -0
  209. package/dist/services/ssh-security.d.ts +31 -0
  210. package/dist/services/ssh-security.d.ts.map +1 -0
  211. package/dist/services/ssh-security.js +63 -0
  212. package/dist/services/ssh-security.js.map +1 -0
  213. package/dist/services/workspace-keepalive.d.ts +76 -0
  214. package/dist/services/workspace-keepalive.d.ts.map +1 -0
  215. package/dist/services/workspace-keepalive.js +234 -0
  216. package/dist/services/workspace-keepalive.js.map +1 -0
  217. package/dist/shims/consensus.d.ts +23 -0
  218. package/dist/shims/consensus.d.ts.map +1 -0
  219. package/dist/shims/consensus.js +5 -0
  220. package/dist/shims/consensus.js.map +1 -0
  221. package/dist/webhooks/index.d.ts +24 -0
  222. package/dist/webhooks/index.d.ts.map +1 -0
  223. package/dist/webhooks/index.js +29 -0
  224. package/dist/webhooks/index.js.map +1 -0
  225. package/dist/webhooks/parsers/github.d.ts +8 -0
  226. package/dist/webhooks/parsers/github.d.ts.map +1 -0
  227. package/dist/webhooks/parsers/github.js +234 -0
  228. package/dist/webhooks/parsers/github.js.map +1 -0
  229. package/dist/webhooks/parsers/index.d.ts +23 -0
  230. package/dist/webhooks/parsers/index.d.ts.map +1 -0
  231. package/dist/webhooks/parsers/index.js +30 -0
  232. package/dist/webhooks/parsers/index.js.map +1 -0
  233. package/dist/webhooks/parsers/linear.d.ts +9 -0
  234. package/dist/webhooks/parsers/linear.d.ts.map +1 -0
  235. package/dist/webhooks/parsers/linear.js +258 -0
  236. package/dist/webhooks/parsers/linear.js.map +1 -0
  237. package/dist/webhooks/parsers/slack.d.ts +9 -0
  238. package/dist/webhooks/parsers/slack.d.ts.map +1 -0
  239. package/dist/webhooks/parsers/slack.js +214 -0
  240. package/dist/webhooks/parsers/slack.js.map +1 -0
  241. package/dist/webhooks/responders/github.d.ts +8 -0
  242. package/dist/webhooks/responders/github.d.ts.map +1 -0
  243. package/dist/webhooks/responders/github.js +73 -0
  244. package/dist/webhooks/responders/github.js.map +1 -0
  245. package/dist/webhooks/responders/index.d.ts +23 -0
  246. package/dist/webhooks/responders/index.d.ts.map +1 -0
  247. package/dist/webhooks/responders/index.js +30 -0
  248. package/dist/webhooks/responders/index.js.map +1 -0
  249. package/dist/webhooks/responders/linear.d.ts +9 -0
  250. package/dist/webhooks/responders/linear.d.ts.map +1 -0
  251. package/dist/webhooks/responders/linear.js +149 -0
  252. package/dist/webhooks/responders/linear.js.map +1 -0
  253. package/dist/webhooks/responders/slack.d.ts +20 -0
  254. package/dist/webhooks/responders/slack.d.ts.map +1 -0
  255. package/dist/webhooks/responders/slack.js +178 -0
  256. package/dist/webhooks/responders/slack.js.map +1 -0
  257. package/dist/webhooks/router.d.ts +25 -0
  258. package/dist/webhooks/router.d.ts.map +1 -0
  259. package/dist/webhooks/router.js +504 -0
  260. package/dist/webhooks/router.js.map +1 -0
  261. package/dist/webhooks/rules-engine.d.ts +24 -0
  262. package/dist/webhooks/rules-engine.d.ts.map +1 -0
  263. package/dist/webhooks/rules-engine.js +287 -0
  264. package/dist/webhooks/rules-engine.js.map +1 -0
  265. package/dist/webhooks/types.d.ts +186 -0
  266. package/dist/webhooks/types.d.ts.map +1 -0
  267. package/dist/webhooks/types.js +8 -0
  268. package/dist/webhooks/types.js.map +1 -0
  269. package/package.json +55 -0
@@ -0,0 +1,129 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-webhooks.js","sourceRoot":"","sources":["../../src/api/generic-webhooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/api/git.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,eAAO,MAAM,SAAS,4CAAW,CAAC"}
@@ -0,0 +1,269 @@
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
+ import crypto from 'crypto';
8
+ import { Router } from 'express';
9
+ import { db } from '../db/index.js';
10
+ import { nangoService } from '../services/nango.js';
11
+ import { getConfig } from '../config.js';
12
+ export const gitRouter = Router();
13
+ /**
14
+ * Generate expected workspace token using HMAC
15
+ */
16
+ function generateExpectedToken(workspaceId) {
17
+ const config = getConfig();
18
+ return crypto
19
+ .createHmac('sha256', config.sessionSecret)
20
+ .update(`workspace:${workspaceId}`)
21
+ .digest('hex');
22
+ }
23
+ /**
24
+ * Verify workspace access token
25
+ * Workspaces authenticate with a secret passed at provisioning time
26
+ *
27
+ * Returns:
28
+ * - { valid: true } if token matches
29
+ * - { valid: false, reason: string } if token is invalid or missing
30
+ */
31
+ function verifyWorkspaceToken(req, workspaceId) {
32
+ const authHeader = req.get('authorization');
33
+ if (!authHeader) {
34
+ return { valid: false, reason: 'No Authorization header. WORKSPACE_TOKEN may not be set in the container.' };
35
+ }
36
+ if (!authHeader.startsWith('Bearer ')) {
37
+ return { valid: false, reason: 'Invalid Authorization header format. Expected: Bearer <token>' };
38
+ }
39
+ const providedToken = authHeader.slice(7);
40
+ if (!providedToken) {
41
+ return { valid: false, reason: 'Empty bearer token provided.' };
42
+ }
43
+ const expectedToken = generateExpectedToken(workspaceId);
44
+ // Use timing-safe comparison to prevent timing attacks
45
+ try {
46
+ const isValid = crypto.timingSafeEqual(Buffer.from(providedToken), Buffer.from(expectedToken));
47
+ if (!isValid) {
48
+ return { valid: false, reason: 'Token mismatch. Workspace may need reprovisioning or SESSION_SECRET changed.' };
49
+ }
50
+ return { valid: true };
51
+ }
52
+ catch {
53
+ return { valid: false, reason: 'Token comparison failed (length mismatch). Workspace may need reprovisioning.' };
54
+ }
55
+ }
56
+ /**
57
+ * GET /api/git/token
58
+ * Get a fresh GitHub token for git operations
59
+ *
60
+ * Query params:
61
+ * - workspaceId: The workspace requesting the token
62
+ *
63
+ * Returns: { token: string, expiresAt?: string }
64
+ *
65
+ * This endpoint is called by the git credential helper in workspace containers.
66
+ * It fetches a fresh GitHub App installation token via Nango.
67
+ */
68
+ gitRouter.get('/token', async (req, res) => {
69
+ const { workspaceId } = req.query;
70
+ if (!workspaceId || typeof workspaceId !== 'string') {
71
+ return res.status(400).json({ error: 'workspaceId is required' });
72
+ }
73
+ // Verify the request is from a valid workspace
74
+ const tokenVerification = verifyWorkspaceToken(req, workspaceId);
75
+ if (!tokenVerification.valid) {
76
+ console.warn(`[git] Token verification failed for workspace ${workspaceId.substring(0, 8)}: ${tokenVerification.reason}`);
77
+ return res.status(401).json({
78
+ error: 'Invalid workspace token',
79
+ code: 'INVALID_WORKSPACE_TOKEN',
80
+ hint: tokenVerification.reason,
81
+ });
82
+ }
83
+ try {
84
+ // Get workspace to find the user
85
+ const workspace = await db.workspaces.findById(workspaceId);
86
+ if (!workspace) {
87
+ console.warn(`[git] Workspace not found: ${workspaceId}`);
88
+ return res.status(404).json({
89
+ error: 'Workspace not found',
90
+ code: 'WORKSPACE_NOT_FOUND',
91
+ hint: 'The workspace may have been deleted. Try reprovisioning.',
92
+ });
93
+ }
94
+ const userId = workspace.userId;
95
+ console.log(`[git] Token request for workspace ${workspaceId.substring(0, 8)}, user ${userId.substring(0, 8)}`);
96
+ // Find a repository with a Nango connection for this user
97
+ const repos = await db.repositories.findByUserId(userId);
98
+ const repoWithConnection = repos.find(r => r.nangoConnectionId);
99
+ if (!repoWithConnection?.nangoConnectionId) {
100
+ console.warn(`[git] No Nango connection found for user ${userId.substring(0, 8)}. Repos: ${repos.length}, with connections: ${repos.filter(r => r.nangoConnectionId).length}`);
101
+ return res.status(404).json({
102
+ error: 'No GitHub App connection found',
103
+ code: 'NO_GITHUB_APP_CONNECTION',
104
+ hint: 'Install the GitHub App on your repositories at https://github.com/apps/agent-relay',
105
+ repoCount: repos.length,
106
+ });
107
+ }
108
+ console.log(`[git] Fetching token from Nango for connection ${repoWithConnection.nangoConnectionId.substring(0, 8)}...`);
109
+ // Get fresh tokens from Nango (auto-refreshes if needed)
110
+ // - installationToken: for git operations (clone, push, pull)
111
+ // - userToken: for gh CLI operations (requires user context)
112
+ let installationToken;
113
+ try {
114
+ installationToken = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
115
+ }
116
+ catch (nangoError) {
117
+ const errorMessage = nangoError instanceof Error ? nangoError.message : 'Unknown error';
118
+ console.error(`[git] Nango token fetch failed for connection ${repoWithConnection.nangoConnectionId}:`, errorMessage);
119
+ // Provide specific hints based on error type
120
+ if (errorMessage.includes('not found') || errorMessage.includes('404')) {
121
+ return res.status(500).json({
122
+ error: 'GitHub App connection expired or revoked',
123
+ code: 'NANGO_CONNECTION_EXPIRED',
124
+ hint: 'Reconnect your GitHub App at https://github.com/apps/agent-relay',
125
+ details: errorMessage,
126
+ });
127
+ }
128
+ return res.status(500).json({
129
+ error: 'Failed to fetch GitHub token from Nango',
130
+ code: 'NANGO_TOKEN_FETCH_FAILED',
131
+ hint: 'This may be a temporary issue. Try again in a few seconds.',
132
+ details: errorMessage,
133
+ });
134
+ }
135
+ // Try to get user OAuth token from github-app-oauth connection_config first
136
+ // Fall back to separate 'github' user connection if available
137
+ let userToken = null;
138
+ try {
139
+ userToken = await nangoService.getGithubUserOAuthToken(repoWithConnection.nangoConnectionId);
140
+ }
141
+ catch {
142
+ // Try the separate github user connection if available
143
+ const userRepo = repos.find(r => r.nangoConnectionId && r.nangoConnectionId !== repoWithConnection.nangoConnectionId);
144
+ if (userRepo?.nangoConnectionId) {
145
+ try {
146
+ userToken = await nangoService.getGithubUserToken(userRepo.nangoConnectionId);
147
+ }
148
+ catch {
149
+ console.log('[git] No github user token available');
150
+ }
151
+ }
152
+ }
153
+ // GitHub App installation tokens expire after 1 hour
154
+ const expiresAt = new Date(Date.now() + 55 * 60 * 1000).toISOString(); // 55 min buffer
155
+ // Prefer userToken for git operations - installation tokens (ghs_*) are API-only
156
+ // and don't work with git credential helpers. User OAuth tokens work for both
157
+ // git operations (clone, push, pull) AND gh CLI commands.
158
+ const primaryToken = userToken || installationToken;
159
+ const tokenType = userToken ? 'user' : 'installation';
160
+ console.log(`[git] Token fetched successfully for workspace ${workspaceId.substring(0, 8)} (type: ${tokenType})`);
161
+ res.json({
162
+ token: primaryToken, // Primary token for git/gh operations (prefer user token)
163
+ userToken, // Explicit user token field (may be null)
164
+ installationToken, // GitHub App installation token for API operations
165
+ expiresAt,
166
+ username: 'x-access-token', // Works with both token types
167
+ tokenType, // 'user' or 'installation' - helps clients know what they got
168
+ });
169
+ }
170
+ catch (error) {
171
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
172
+ console.error('[git] Unexpected error getting token:', error);
173
+ res.status(500).json({
174
+ error: 'Failed to get GitHub token',
175
+ code: 'UNEXPECTED_ERROR',
176
+ details: errorMessage,
177
+ });
178
+ }
179
+ });
180
+ /**
181
+ * POST /api/git/token
182
+ * Same as GET but accepts body params (for compatibility with some git credential helpers)
183
+ */
184
+ gitRouter.post('/token', async (req, res) => {
185
+ const workspaceId = req.body.workspaceId || req.query.workspaceId;
186
+ if (!workspaceId || typeof workspaceId !== 'string') {
187
+ return res.status(400).json({ error: 'workspaceId is required' });
188
+ }
189
+ const tokenVerification = verifyWorkspaceToken(req, workspaceId);
190
+ if (!tokenVerification.valid) {
191
+ console.warn(`[git] POST: Token verification failed for workspace ${workspaceId.substring(0, 8)}: ${tokenVerification.reason}`);
192
+ return res.status(401).json({
193
+ error: 'Invalid workspace token',
194
+ code: 'INVALID_WORKSPACE_TOKEN',
195
+ hint: tokenVerification.reason,
196
+ });
197
+ }
198
+ try {
199
+ const workspace = await db.workspaces.findById(workspaceId);
200
+ if (!workspace) {
201
+ console.warn(`[git] POST: Workspace not found: ${workspaceId}`);
202
+ return res.status(404).json({
203
+ error: 'Workspace not found',
204
+ code: 'WORKSPACE_NOT_FOUND',
205
+ });
206
+ }
207
+ const repos = await db.repositories.findByUserId(workspace.userId);
208
+ const repoWithConnection = repos.find(r => r.nangoConnectionId);
209
+ if (!repoWithConnection?.nangoConnectionId) {
210
+ console.warn(`[git] POST: No Nango connection for user ${workspace.userId.substring(0, 8)}`);
211
+ return res.status(404).json({
212
+ error: 'No GitHub App connection found',
213
+ code: 'NO_GITHUB_APP_CONNECTION',
214
+ });
215
+ }
216
+ let installationToken;
217
+ try {
218
+ installationToken = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
219
+ }
220
+ catch (nangoError) {
221
+ const errorMessage = nangoError instanceof Error ? nangoError.message : 'Unknown error';
222
+ console.error(`[git] POST: Nango token fetch failed:`, errorMessage);
223
+ return res.status(500).json({
224
+ error: 'Failed to fetch GitHub token',
225
+ code: 'NANGO_TOKEN_FETCH_FAILED',
226
+ details: errorMessage,
227
+ });
228
+ }
229
+ // Try to get user OAuth token (preferred for git operations)
230
+ let userToken = null;
231
+ try {
232
+ userToken = await nangoService.getGithubUserOAuthToken(repoWithConnection.nangoConnectionId);
233
+ }
234
+ catch {
235
+ // Try the separate github user connection if available
236
+ const userRepo = repos.find(r => r.nangoConnectionId && r.nangoConnectionId !== repoWithConnection.nangoConnectionId);
237
+ if (userRepo?.nangoConnectionId) {
238
+ try {
239
+ userToken = await nangoService.getGithubUserToken(userRepo.nangoConnectionId);
240
+ }
241
+ catch {
242
+ console.log('[git] POST: No github user token available');
243
+ }
244
+ }
245
+ }
246
+ const expiresAt = new Date(Date.now() + 55 * 60 * 1000).toISOString();
247
+ // Prefer userToken for git operations
248
+ const primaryToken = userToken || installationToken;
249
+ const tokenType = userToken ? 'user' : 'installation';
250
+ res.json({
251
+ token: primaryToken,
252
+ userToken,
253
+ installationToken,
254
+ expiresAt,
255
+ username: 'x-access-token',
256
+ tokenType,
257
+ });
258
+ }
259
+ catch (error) {
260
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
261
+ console.error('[git] POST: Unexpected error:', error);
262
+ res.status(500).json({
263
+ error: 'Failed to get GitHub token',
264
+ code: 'UNEXPECTED_ERROR',
265
+ details: errorMessage,
266
+ });
267
+ }
268
+ });
269
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/api/git.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;AAElC;;GAEG;AACH,SAAS,qBAAqB,CAAC,WAAmB;IAChD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,OAAO,MAAM;SACV,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC;SAC1C,MAAM,CAAC,aAAa,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,GAAY,EAAE,WAAmB;IAC7D,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAE5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,2EAA2E,EAAE,CAAC;IAC/G,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,+DAA+D,EAAE,CAAC;IACnG,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAEzD,uDAAuD;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CACpC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAC1B,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAC3B,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,8EAA8E,EAAE,CAAC;QAClH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,+EAA+E,EAAE,CAAC;IACnH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC5D,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;IAElC,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,+CAA+C;IAC/C,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACjE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,iDAAiD,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1H,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC1B,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE,iBAAiB,CAAC,MAAM;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,qBAAqB;gBAC5B,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,0DAA0D;aACjE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,qCAAqC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAEhH,0DAA0D;QAC1D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAEhE,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,uBAAuB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/K,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,gCAAgC;gBACvC,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE,oFAAoF;gBAC1F,SAAS,EAAE,KAAK,CAAC,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kDAAkD,kBAAkB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAEzH,yDAAyD;QACzD,8DAA8D;QAC9D,6DAA6D;QAC7D,IAAI,iBAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,iBAAiB,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QACjG,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxF,OAAO,CAAC,KAAK,CAAC,iDAAiD,kBAAkB,CAAC,iBAAiB,GAAG,EAAE,YAAY,CAAC,CAAC;YAEtH,6CAA6C;YAC7C,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,0CAA0C;oBACjD,IAAI,EAAE,0BAA0B;oBAChC,IAAI,EAAE,kEAAkE;oBACxE,OAAO,EAAE,YAAY;iBACtB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,yCAAyC;gBAChD,IAAI,EAAE,0BAA0B;gBAChC,IAAI,EAAE,4DAA4D;gBAClE,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;QAED,4EAA4E;QAC5E,8DAA8D;QAC9D,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,YAAY,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;YACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,iBAAiB,KAAK,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;YACtH,IAAI,QAAQ,EAAE,iBAAiB,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,SAAS,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;gBAChF,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,gBAAgB;QAEvF,iFAAiF;QACjF,8EAA8E;QAC9E,0DAA0D;QAC1D,MAAM,YAAY,GAAG,SAAS,IAAI,iBAAiB,CAAC;QACpD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QAEtD,OAAO,CAAC,GAAG,CAAC,kDAAkD,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,SAAS,GAAG,CAAC,CAAC;QAElH,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,YAAY,EAAE,0DAA0D;YAC/E,SAAS,EAAE,0CAA0C;YACrD,iBAAiB,EAAE,mDAAmD;YACtE,SAAS;YACT,QAAQ,EAAE,gBAAgB,EAAE,8BAA8B;YAC1D,SAAS,EAAE,8DAA8D;SAC1E,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,4BAA4B;YACnC,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7D,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;IAElE,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACjE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,uDAAuD,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;QAChI,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC1B,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE,iBAAiB,CAAC,MAAM;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC;YAChE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,qBAAqB;gBAC5B,IAAI,EAAE,qBAAqB;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAEhE,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,4CAA4C,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7F,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,gCAAgC;gBACvC,IAAI,EAAE,0BAA0B;aACjC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,iBAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,iBAAiB,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QACjG,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACxF,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,YAAY,CAAC,CAAC;YACrE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,8BAA8B;gBACrC,IAAI,EAAE,0BAA0B;gBAChC,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;QAED,6DAA6D;QAC7D,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,YAAY,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;YACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,iBAAiB,KAAK,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;YACtH,IAAI,QAAQ,EAAE,iBAAiB,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,SAAS,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;gBAChF,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAEtE,sCAAsC;QACtC,MAAM,YAAY,GAAG,SAAS,IAAI,iBAAiB,CAAC;QACpD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QAEtD,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,YAAY;YACnB,SAAS;YACT,iBAAiB;YACjB,SAAS;YACT,QAAQ,EAAE,gBAAgB;YAC1B,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,4BAA4B;YACnC,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * GitHub App API Routes
3
+ *
4
+ * Repo operations via Nango's github-app-oauth connection:
5
+ * - Get clone token for repositories
6
+ * - Create issues, PRs, and comments
7
+ *
8
+ * Auth flow is handled by nango-auth.ts
9
+ */
10
+ export declare const githubAppRouter: import("express-serve-static-core").Router;
11
+ //# sourceMappingURL=github-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-app.d.ts","sourceRoot":"","sources":["../../src/api/github-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,eAAO,MAAM,eAAe,4CAAW,CAAC"}