@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,577 @@
1
+ /**
2
+ * Repos API Routes
3
+ *
4
+ * GitHub repository management - list, import, sync.
5
+ * Includes Nango-based GitHub permission checking for dashboard access control.
6
+ */
7
+ import crypto from 'crypto';
8
+ import { Router } from 'express';
9
+ import { requireAuth } from './auth.js';
10
+ import { db } from '../db/index.js';
11
+ import { nangoService } from '../services/nango.js';
12
+ import { getConfig } from '../config.js';
13
+ /**
14
+ * Generate workspace token for API calls to workspace containers
15
+ */
16
+ function generateWorkspaceToken(workspaceId) {
17
+ const config = getConfig();
18
+ return crypto
19
+ .createHmac('sha256', config.sessionSecret)
20
+ .update(`workspace:${workspaceId}`)
21
+ .digest('hex');
22
+ }
23
+ /**
24
+ * Call workspace API endpoint
25
+ */
26
+ async function callWorkspaceApi(publicUrl, workspaceId, method, endpoint, body) {
27
+ const token = generateWorkspaceToken(workspaceId);
28
+ const url = `${publicUrl.replace(/\/$/, '')}${endpoint}`;
29
+ try {
30
+ const response = await fetch(url, {
31
+ method,
32
+ headers: {
33
+ 'Content-Type': 'application/json',
34
+ 'Authorization': `Bearer ${token}`,
35
+ },
36
+ body: body ? JSON.stringify(body) : undefined,
37
+ });
38
+ const data = await response.json().catch((parseError) => {
39
+ console.error('Failed to parse JSON from workspace response', {
40
+ url,
41
+ status: response.status,
42
+ error: parseError instanceof Error ? parseError.message : parseError,
43
+ });
44
+ return null;
45
+ });
46
+ return {
47
+ ok: response.ok,
48
+ status: response.status,
49
+ data,
50
+ error: response.ok ? undefined : (data?.error || `HTTP ${response.status}`),
51
+ };
52
+ }
53
+ catch (err) {
54
+ return {
55
+ ok: false,
56
+ status: 0,
57
+ error: err instanceof Error ? err.message : 'Network error',
58
+ };
59
+ }
60
+ }
61
+ export const reposRouter = Router();
62
+ // All routes require authentication
63
+ reposRouter.use(requireAuth);
64
+ /**
65
+ * GET /api/repos
66
+ * List user's imported repositories
67
+ */
68
+ reposRouter.get('/', async (req, res) => {
69
+ const userId = req.session.userId;
70
+ try {
71
+ const repositories = await db.repositories.findByUserId(userId);
72
+ res.json({
73
+ repositories: repositories.map((r) => ({
74
+ id: r.id,
75
+ fullName: r.githubFullName,
76
+ defaultBranch: r.defaultBranch,
77
+ isPrivate: r.isPrivate,
78
+ syncStatus: r.syncStatus,
79
+ lastSyncedAt: r.lastSyncedAt,
80
+ workspaceId: r.workspaceId,
81
+ })),
82
+ });
83
+ }
84
+ catch (error) {
85
+ console.error('Error listing repos:', error);
86
+ res.status(500).json({ error: 'Failed to list repositories' });
87
+ }
88
+ });
89
+ /**
90
+ * GET /api/repos/github
91
+ * List available GitHub repos for the authenticated user
92
+ */
93
+ reposRouter.get('/github', async (req, res) => {
94
+ const githubToken = req.session.githubToken;
95
+ if (!githubToken) {
96
+ return res.status(401).json({ error: 'GitHub not connected' });
97
+ }
98
+ const { page = '1', per_page = '30', type = 'all' } = req.query;
99
+ try {
100
+ // Fetch repos from GitHub API
101
+ const response = await fetch(`https://api.github.com/user/repos?page=${page}&per_page=${per_page}&type=${type}&sort=updated`, {
102
+ headers: {
103
+ Authorization: `Bearer ${githubToken}`,
104
+ Accept: 'application/vnd.github.v3+json',
105
+ },
106
+ });
107
+ if (!response.ok) {
108
+ const error = await response.text();
109
+ throw new Error(`GitHub API error: ${error}`);
110
+ }
111
+ const repos = await response.json();
112
+ // Get link header for pagination
113
+ const linkHeader = response.headers.get('link');
114
+ const hasMore = linkHeader?.includes('rel="next"') || false;
115
+ res.json({
116
+ repositories: repos.map((r) => ({
117
+ githubId: r.id,
118
+ fullName: r.full_name,
119
+ name: r.name,
120
+ owner: r.owner.login,
121
+ description: r.description,
122
+ defaultBranch: r.default_branch,
123
+ isPrivate: r.private,
124
+ language: r.language,
125
+ updatedAt: r.updated_at,
126
+ htmlUrl: r.html_url,
127
+ })),
128
+ pagination: {
129
+ page: parseInt(page, 10),
130
+ perPage: parseInt(per_page, 10),
131
+ hasMore,
132
+ },
133
+ });
134
+ }
135
+ catch (error) {
136
+ console.error('Error fetching GitHub repos:', error);
137
+ res.status(500).json({ error: 'Failed to fetch GitHub repositories' });
138
+ }
139
+ });
140
+ /**
141
+ * POST /api/repos
142
+ * Import a GitHub repository
143
+ */
144
+ reposRouter.post('/', async (req, res) => {
145
+ const userId = req.session.userId;
146
+ const githubToken = req.session.githubToken;
147
+ const { fullName } = req.body;
148
+ if (!fullName || typeof fullName !== 'string') {
149
+ return res.status(400).json({ error: 'Repository full name is required (owner/repo)' });
150
+ }
151
+ if (!githubToken) {
152
+ return res.status(401).json({ error: 'GitHub not connected' });
153
+ }
154
+ try {
155
+ // Verify repo exists and user has access
156
+ const repoResponse = await fetch(`https://api.github.com/repos/${fullName}`, {
157
+ headers: {
158
+ Authorization: `Bearer ${githubToken}`,
159
+ Accept: 'application/vnd.github.v3+json',
160
+ },
161
+ });
162
+ if (!repoResponse.ok) {
163
+ if (repoResponse.status === 404) {
164
+ return res.status(404).json({ error: 'Repository not found or no access' });
165
+ }
166
+ throw new Error('Failed to verify repository');
167
+ }
168
+ const repoData = await repoResponse.json();
169
+ // Import repo
170
+ const repository = await db.repositories.upsert({
171
+ userId,
172
+ githubFullName: repoData.full_name,
173
+ githubId: repoData.id,
174
+ defaultBranch: repoData.default_branch,
175
+ isPrivate: repoData.private,
176
+ });
177
+ res.status(201).json({
178
+ repository: {
179
+ id: repository.id,
180
+ fullName: repository.githubFullName,
181
+ defaultBranch: repository.defaultBranch,
182
+ isPrivate: repository.isPrivate,
183
+ syncStatus: repository.syncStatus,
184
+ },
185
+ });
186
+ }
187
+ catch (error) {
188
+ console.error('Error importing repo:', error);
189
+ res.status(500).json({ error: 'Failed to import repository' });
190
+ }
191
+ });
192
+ /**
193
+ * POST /api/repos/bulk
194
+ * Import multiple repositories at once
195
+ */
196
+ reposRouter.post('/bulk', async (req, res) => {
197
+ const userId = req.session.userId;
198
+ const githubToken = req.session.githubToken;
199
+ const { repositories } = req.body;
200
+ if (!repositories || !Array.isArray(repositories)) {
201
+ return res.status(400).json({ error: 'repositories array is required' });
202
+ }
203
+ if (!githubToken) {
204
+ return res.status(401).json({ error: 'GitHub not connected' });
205
+ }
206
+ const results = [];
207
+ for (const repo of repositories) {
208
+ const fullName = typeof repo === 'string' ? repo : repo.fullName;
209
+ try {
210
+ // Verify and fetch repo info
211
+ const repoResponse = await fetch(`https://api.github.com/repos/${fullName}`, {
212
+ headers: {
213
+ Authorization: `Bearer ${githubToken}`,
214
+ Accept: 'application/vnd.github.v3+json',
215
+ },
216
+ });
217
+ if (!repoResponse.ok) {
218
+ results.push({ fullName, success: false, error: 'Not found or no access' });
219
+ continue;
220
+ }
221
+ const repoData = await repoResponse.json();
222
+ await db.repositories.upsert({
223
+ userId,
224
+ githubFullName: repoData.full_name,
225
+ githubId: repoData.id,
226
+ defaultBranch: repoData.default_branch,
227
+ isPrivate: repoData.private,
228
+ });
229
+ results.push({ fullName, success: true });
230
+ }
231
+ catch (_error) {
232
+ results.push({ fullName, success: false, error: 'Import failed' });
233
+ }
234
+ }
235
+ const imported = results.filter((r) => r.success).length;
236
+ const failed = results.filter((r) => !r.success).length;
237
+ res.json({
238
+ message: `Imported ${imported} repositories, ${failed} failed`,
239
+ results,
240
+ });
241
+ });
242
+ /**
243
+ * GET /api/repos/accessible
244
+ * List all GitHub repositories the authenticated user has access to.
245
+ * Uses Nango proxy with user's GitHub OAuth token.
246
+ */
247
+ reposRouter.get('/accessible', async (req, res) => {
248
+ const userId = req.session.userId;
249
+ const { page, perPage, type, sort } = req.query;
250
+ try {
251
+ // Get user's Nango connection ID
252
+ const user = await db.users.findById(userId);
253
+ if (!user) {
254
+ return res.status(404).json({ error: 'User not found' });
255
+ }
256
+ if (!user.nangoConnectionId) {
257
+ return res.status(400).json({
258
+ error: 'GitHub not connected via Nango',
259
+ code: 'NANGO_NOT_CONNECTED',
260
+ message: 'Please reconnect your GitHub account',
261
+ });
262
+ }
263
+ // List accessible repos via Nango proxy
264
+ const result = await nangoService.listUserAccessibleRepos(user.nangoConnectionId, {
265
+ page: page ? parseInt(page, 10) : undefined,
266
+ perPage: perPage ? Math.min(parseInt(perPage, 10), 100) : undefined,
267
+ type: type,
268
+ sort: sort,
269
+ });
270
+ res.json({
271
+ repositories: result.repositories,
272
+ pagination: {
273
+ page: page ? parseInt(page, 10) : 1,
274
+ perPage: perPage ? Math.min(parseInt(perPage, 10), 100) : 100,
275
+ hasMore: result.hasMore,
276
+ },
277
+ checkedBy: {
278
+ userId: user.id,
279
+ githubUsername: user.githubUsername,
280
+ },
281
+ });
282
+ }
283
+ catch (error) {
284
+ console.error('Error listing accessible repos:', error);
285
+ res.status(500).json({ error: 'Failed to list accessible repositories' });
286
+ }
287
+ });
288
+ /**
289
+ * GET /api/repos/search
290
+ * Search GitHub repos by name
291
+ */
292
+ reposRouter.get('/search', async (req, res) => {
293
+ const githubToken = req.session.githubToken;
294
+ const { q } = req.query;
295
+ if (!q || typeof q !== 'string') {
296
+ return res.status(400).json({ error: 'Search query (q) is required' });
297
+ }
298
+ if (!githubToken) {
299
+ return res.status(401).json({ error: 'GitHub not connected' });
300
+ }
301
+ try {
302
+ // Search user's repos
303
+ const response = await fetch(`https://api.github.com/search/repositories?q=${encodeURIComponent(q)}+user:@me&sort=updated&per_page=20`, {
304
+ headers: {
305
+ Authorization: `Bearer ${githubToken}`,
306
+ Accept: 'application/vnd.github.v3+json',
307
+ },
308
+ });
309
+ if (!response.ok) {
310
+ throw new Error('GitHub search failed');
311
+ }
312
+ const data = await response.json();
313
+ res.json({
314
+ repositories: data.items.map((r) => ({
315
+ githubId: r.id,
316
+ fullName: r.full_name,
317
+ name: r.name,
318
+ owner: r.owner.login,
319
+ description: r.description,
320
+ defaultBranch: r.default_branch,
321
+ isPrivate: r.private,
322
+ language: r.language,
323
+ })),
324
+ total: data.total_count,
325
+ });
326
+ }
327
+ catch (error) {
328
+ console.error('Error searching repos:', error);
329
+ res.status(500).json({ error: 'Failed to search repositories' });
330
+ }
331
+ });
332
+ // ============================================================================
333
+ // Nango-based GitHub Permission APIs (for dashboard access control)
334
+ // ============================================================================
335
+ /**
336
+ * GET /api/repos/check-access/:owner/:repo
337
+ * Check if authenticated user has access to a specific GitHub repository.
338
+ * Uses Nango proxy with user's GitHub OAuth token.
339
+ *
340
+ * Response:
341
+ * - hasAccess: boolean - Whether user can access this repo
342
+ * - permission: 'admin' | 'write' | 'read' | 'none' - User's permission level
343
+ * - repository: Repository details if user has access
344
+ *
345
+ * Use this for dashboard access control - grant access if hasAccess is true.
346
+ */
347
+ reposRouter.get('/check-access/:owner/:repo', async (req, res) => {
348
+ const userId = req.session.userId;
349
+ const owner = req.params.owner;
350
+ const repo = req.params.repo;
351
+ if (!owner || !repo) {
352
+ return res.status(400).json({ error: 'Owner and repo parameters are required' });
353
+ }
354
+ try {
355
+ // Get user's Nango connection ID
356
+ const user = await db.users.findById(userId);
357
+ if (!user) {
358
+ return res.status(404).json({ error: 'User not found' });
359
+ }
360
+ if (!user.nangoConnectionId) {
361
+ return res.status(400).json({
362
+ error: 'GitHub not connected via Nango',
363
+ code: 'NANGO_NOT_CONNECTED',
364
+ message: 'Please reconnect your GitHub account',
365
+ });
366
+ }
367
+ // Check access via Nango proxy
368
+ const accessResult = await nangoService.checkUserRepoAccess(user.nangoConnectionId, owner, repo);
369
+ res.json({
370
+ hasAccess: accessResult.hasAccess,
371
+ permission: accessResult.permission,
372
+ repository: accessResult.repository,
373
+ // Include user info for dashboard context
374
+ checkedBy: {
375
+ userId: user.id,
376
+ githubUsername: user.githubUsername,
377
+ },
378
+ });
379
+ }
380
+ catch (error) {
381
+ console.error('Error checking repo access:', error);
382
+ res.status(500).json({ error: 'Failed to check repository access' });
383
+ }
384
+ });
385
+ /**
386
+ * POST /api/repos/check-access-bulk
387
+ * Check access to multiple repositories at once.
388
+ * Useful for determining which workspaces a user can view.
389
+ *
390
+ * Body:
391
+ * - repositories: Array of "owner/repo" strings
392
+ *
393
+ * Response:
394
+ * - results: Array of { fullName, hasAccess, permission }
395
+ */
396
+ reposRouter.post('/check-access-bulk', async (req, res) => {
397
+ const userId = req.session.userId;
398
+ const { repositories } = req.body;
399
+ if (!repositories || !Array.isArray(repositories)) {
400
+ return res.status(400).json({ error: 'repositories array is required' });
401
+ }
402
+ if (repositories.length > 50) {
403
+ return res.status(400).json({ error: 'Maximum 50 repositories per request' });
404
+ }
405
+ try {
406
+ // Get user's Nango connection ID
407
+ const user = await db.users.findById(userId);
408
+ if (!user) {
409
+ return res.status(404).json({ error: 'User not found' });
410
+ }
411
+ if (!user.nangoConnectionId) {
412
+ return res.status(400).json({
413
+ error: 'GitHub not connected via Nango',
414
+ code: 'NANGO_NOT_CONNECTED',
415
+ message: 'Please reconnect your GitHub account',
416
+ });
417
+ }
418
+ // Check access for each repo (in parallel with concurrency limit)
419
+ const results = [];
420
+ // Process in batches of 10 to avoid rate limiting
421
+ const batchSize = 10;
422
+ for (let i = 0; i < repositories.length; i += batchSize) {
423
+ const batch = repositories.slice(i, i + batchSize);
424
+ const batchResults = await Promise.all(batch.map(async (fullName) => {
425
+ try {
426
+ const [owner, repo] = fullName.split('/');
427
+ if (!owner || !repo) {
428
+ return { fullName, hasAccess: false, error: 'Invalid repository format' };
429
+ }
430
+ const accessResult = await nangoService.checkUserRepoAccess(user.nangoConnectionId, owner, repo);
431
+ return {
432
+ fullName,
433
+ hasAccess: accessResult.hasAccess,
434
+ permission: accessResult.permission,
435
+ };
436
+ }
437
+ catch (_err) {
438
+ return { fullName, hasAccess: false, error: 'Check failed' };
439
+ }
440
+ }));
441
+ results.push(...batchResults);
442
+ }
443
+ const accessibleCount = results.filter(r => r.hasAccess).length;
444
+ res.json({
445
+ results,
446
+ summary: {
447
+ total: repositories.length,
448
+ accessible: accessibleCount,
449
+ denied: repositories.length - accessibleCount,
450
+ },
451
+ checkedBy: {
452
+ userId: user.id,
453
+ githubUsername: user.githubUsername,
454
+ },
455
+ });
456
+ }
457
+ catch (error) {
458
+ console.error('Error checking bulk repo access:', error);
459
+ res.status(500).json({ error: 'Failed to check repository access' });
460
+ }
461
+ });
462
+ // ============================================================================
463
+ // WILDCARD ROUTES BELOW - All specific routes must be defined ABOVE this line
464
+ // ============================================================================
465
+ /**
466
+ * GET /api/repos/:id
467
+ * Get repository details
468
+ */
469
+ reposRouter.get('/:id', async (req, res) => {
470
+ const userId = req.session.userId;
471
+ const id = req.params.id;
472
+ try {
473
+ const repositories = await db.repositories.findByUserId(userId);
474
+ const repo = repositories.find((r) => r.id === id);
475
+ if (!repo) {
476
+ return res.status(404).json({ error: 'Repository not found' });
477
+ }
478
+ res.json({
479
+ id: repo.id,
480
+ fullName: repo.githubFullName,
481
+ defaultBranch: repo.defaultBranch,
482
+ isPrivate: repo.isPrivate,
483
+ syncStatus: repo.syncStatus,
484
+ lastSyncedAt: repo.lastSyncedAt,
485
+ workspaceId: repo.workspaceId,
486
+ createdAt: repo.createdAt,
487
+ });
488
+ }
489
+ catch (error) {
490
+ console.error('Error getting repo:', error);
491
+ res.status(500).json({ error: 'Failed to get repository' });
492
+ }
493
+ });
494
+ /**
495
+ * POST /api/repos/:id/sync
496
+ * Trigger repository sync (clone/pull to workspace)
497
+ *
498
+ * Calls the workspace's /repos/sync API endpoint to clone or update the repo.
499
+ * This enables dynamic repo management without workspace restart.
500
+ */
501
+ reposRouter.post('/:id/sync', async (req, res) => {
502
+ const userId = req.session.userId;
503
+ const id = req.params.id;
504
+ try {
505
+ const repositories = await db.repositories.findByUserId(userId);
506
+ const repo = repositories.find((r) => r.id === id);
507
+ if (!repo) {
508
+ return res.status(404).json({ error: 'Repository not found' });
509
+ }
510
+ if (!repo.workspaceId) {
511
+ return res.status(400).json({ error: 'Repository not assigned to a workspace' });
512
+ }
513
+ // Get the workspace to find its public URL
514
+ const workspace = await db.workspaces.findById(repo.workspaceId);
515
+ if (!workspace) {
516
+ return res.status(404).json({ error: 'Workspace not found' });
517
+ }
518
+ if (workspace.status !== 'running') {
519
+ return res.status(400).json({
520
+ error: 'Workspace is not running',
521
+ workspaceStatus: workspace.status,
522
+ });
523
+ }
524
+ if (!workspace.publicUrl) {
525
+ return res.status(400).json({ error: 'Workspace has no public URL' });
526
+ }
527
+ // Update sync status
528
+ await db.repositories.updateSyncStatus(id, 'syncing');
529
+ // Call the workspace's repo sync API
530
+ const result = await callWorkspaceApi(workspace.publicUrl, workspace.id, 'POST', '/repos/sync', { repo: repo.githubFullName });
531
+ if (result.ok) {
532
+ // Update sync status to synced
533
+ await db.repositories.updateSyncStatus(id, 'synced', new Date());
534
+ res.json({
535
+ message: 'Repository synced successfully',
536
+ syncStatus: 'synced',
537
+ result: result.data,
538
+ });
539
+ }
540
+ else {
541
+ // Update sync status to error
542
+ await db.repositories.updateSyncStatus(id, 'error');
543
+ console.error('Workspace sync failed:', result.error);
544
+ res.status(502).json({
545
+ error: 'Failed to sync repository to workspace',
546
+ details: result.error,
547
+ syncStatus: 'error',
548
+ });
549
+ }
550
+ }
551
+ catch (error) {
552
+ console.error('Error syncing repo:', error);
553
+ res.status(500).json({ error: 'Failed to sync repository' });
554
+ }
555
+ });
556
+ /**
557
+ * DELETE /api/repos/:id
558
+ * Remove a repository
559
+ */
560
+ reposRouter.delete('/:id', async (req, res) => {
561
+ const userId = req.session.userId;
562
+ const id = req.params.id;
563
+ try {
564
+ const repositories = await db.repositories.findByUserId(userId);
565
+ const repo = repositories.find((r) => r.id === id);
566
+ if (!repo) {
567
+ return res.status(404).json({ error: 'Repository not found' });
568
+ }
569
+ await db.repositories.delete(id);
570
+ res.json({ success: true });
571
+ }
572
+ catch (error) {
573
+ console.error('Error deleting repo:', error);
574
+ res.status(500).json({ error: 'Failed to delete repository' });
575
+ }
576
+ });
577
+ //# sourceMappingURL=repos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/api/repos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Agent Session Persistence API Routes
3
+ *
4
+ * Provides endpoints for workspace containers to persist agent session data.
5
+ * Workspaces call these endpoints instead of accessing the database directly,
6
+ * which provides better security isolation (workspaces can only write their own data).
7
+ *
8
+ * Authentication: Workspace token (same as git gateway)
9
+ */
10
+ export declare const sessionsRouter: import("express-serve-static-core").Router;
11
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/api/sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,eAAO,MAAM,cAAc,4CAAW,CAAC"}