@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,8 @@
1
+ /**
2
+ * Admin API Routes
3
+ *
4
+ * Administrative endpoints for managing workspaces at scale.
5
+ * Protected by admin secret (ADMIN_API_SECRET environment variable).
6
+ */
7
+ export declare const adminRouter: import("express-serve-static-core").Router;
8
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/api/admin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,WAAW,4CAAW,CAAC"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Admin API Routes
3
+ *
4
+ * Administrative endpoints for managing workspaces at scale.
5
+ * Protected by admin secret (ADMIN_API_SECRET environment variable).
6
+ */
7
+ import { Router } from 'express';
8
+ import { getConfig } from '../config.js';
9
+ import { getProvisioner, WorkspaceProvisioner } from '../provisioner/index.js';
10
+ export const adminRouter = Router();
11
+ /**
12
+ * Middleware to authenticate admin requests
13
+ * Requires ADMIN_API_SECRET header to match environment variable
14
+ */
15
+ async function requireAdminAuth(req, res, next) {
16
+ const authHeader = req.headers['x-admin-secret'] || req.headers.authorization;
17
+ const adminSecret = process.env.ADMIN_API_SECRET;
18
+ if (!adminSecret) {
19
+ res.status(503).json({ error: 'Admin API not configured' });
20
+ return;
21
+ }
22
+ // Support both x-admin-secret header and Bearer token
23
+ const providedSecret = authHeader?.toString().replace('Bearer ', '');
24
+ if (!providedSecret || providedSecret !== adminSecret) {
25
+ res.status(401).json({ error: 'Invalid admin credentials' });
26
+ return;
27
+ }
28
+ next();
29
+ }
30
+ // Apply admin auth to all routes
31
+ adminRouter.use(requireAdminAuth);
32
+ /**
33
+ * POST /api/admin/workspaces/update-image
34
+ *
35
+ * Gracefully update workspace images across all or specific workspaces.
36
+ *
37
+ * Request body:
38
+ * - image: New Docker image to deploy (required)
39
+ * - workspaceIds?: Array of specific workspace IDs to update
40
+ * - userIds?: Array of user IDs whose workspaces to update
41
+ * - force?: Force update even if agents are active (default: false)
42
+ * - skipRestart?: Update config without restarting (default: false)
43
+ * - batchSize?: Number of concurrent updates (default: 5)
44
+ *
45
+ * Response:
46
+ * - summary: { total, updated, pendingRestart, skippedActiveAgents, skippedVerificationFailed, skippedNotRunning, errors }
47
+ * - results: Array of per-workspace results
48
+ */
49
+ adminRouter.post('/workspaces/update-image', async (req, res) => {
50
+ const { image, workspaceIds, userIds, force = false, skipRestart = false, batchSize = 5, } = req.body;
51
+ if (!image) {
52
+ res.status(400).json({ error: 'image is required' });
53
+ return;
54
+ }
55
+ console.log(`[admin] Starting workspace image update to ${image}`, {
56
+ workspaceIds: workspaceIds?.length ?? 'all',
57
+ userIds: userIds?.length ?? 'all',
58
+ force,
59
+ skipRestart,
60
+ batchSize,
61
+ });
62
+ try {
63
+ const provisioner = getProvisioner();
64
+ const result = await provisioner.gracefulUpdateAllImages(image, {
65
+ workspaceIds,
66
+ userIds,
67
+ force,
68
+ skipRestart,
69
+ batchSize,
70
+ });
71
+ res.json(result);
72
+ }
73
+ catch (error) {
74
+ console.error('[admin] Error updating workspace images:', error);
75
+ res.status(500).json({
76
+ error: 'Failed to update workspace images',
77
+ details: error.message,
78
+ });
79
+ }
80
+ });
81
+ /**
82
+ * POST /api/admin/workspaces/:id/update-image
83
+ *
84
+ * Gracefully update a single workspace's image.
85
+ *
86
+ * Request body:
87
+ * - image: New Docker image to deploy (required)
88
+ * - force?: Force update even if agents are active (default: false)
89
+ * - skipRestart?: Update config without restarting (default: false)
90
+ *
91
+ * Response:
92
+ * - result: Update result code
93
+ * - workspaceId: Workspace ID
94
+ * - machineState?: Current machine state
95
+ * - agentCount?: Number of active agents (if applicable)
96
+ * - error?: Error message (if applicable)
97
+ */
98
+ adminRouter.post('/workspaces/:id/update-image', async (req, res) => {
99
+ const id = req.params.id;
100
+ const { image, force = false, skipRestart = false, } = req.body;
101
+ if (!image) {
102
+ res.status(400).json({ error: 'image is required' });
103
+ return;
104
+ }
105
+ console.log(`[admin] Updating workspace ${id} image to ${image}`, { force, skipRestart });
106
+ try {
107
+ const provisioner = getProvisioner();
108
+ const result = await provisioner.gracefulUpdateImage(id, image, {
109
+ force,
110
+ skipRestart,
111
+ });
112
+ // Return appropriate status code based on result
113
+ if (result.result === WorkspaceProvisioner.UpdateResult.ERROR) {
114
+ res.status(500).json(result);
115
+ }
116
+ else if (result.result === WorkspaceProvisioner.UpdateResult.NOT_SUPPORTED) {
117
+ res.status(400).json(result);
118
+ }
119
+ else {
120
+ res.json(result);
121
+ }
122
+ }
123
+ catch (error) {
124
+ console.error(`[admin] Error updating workspace ${id}:`, error);
125
+ res.status(500).json({
126
+ error: 'Failed to update workspace image',
127
+ details: error.message,
128
+ });
129
+ }
130
+ });
131
+ /**
132
+ * GET /api/admin/workspaces/:id/agents
133
+ *
134
+ * Check active agents in a workspace.
135
+ * Useful for pre-flight checks before updates.
136
+ *
137
+ * Response:
138
+ * - hasActiveAgents: boolean
139
+ * - agentCount: number
140
+ * - agents: Array of { name, status }
141
+ */
142
+ adminRouter.get('/workspaces/:id/agents', async (req, res) => {
143
+ const id = req.params.id;
144
+ try {
145
+ // Query workspace directly from DB and check agents via daemon API
146
+ const workspace = await (await import('../db/index.js')).db.workspaces.findById(id);
147
+ if (!workspace) {
148
+ res.status(404).json({ error: 'Workspace not found' });
149
+ return;
150
+ }
151
+ if (workspace.computeProvider !== 'fly') {
152
+ res.status(400).json({ error: 'Only Fly.io workspaces support agent checking' });
153
+ return;
154
+ }
155
+ // Query the workspace daemon directly
156
+ const baseUrl = workspace.publicUrl;
157
+ if (!baseUrl) {
158
+ res.json({ hasActiveAgents: false, agentCount: 0, agents: [] });
159
+ return;
160
+ }
161
+ try {
162
+ // Use /api/data endpoint which returns { agents: [...], ... }
163
+ // Note: /api/agents doesn't exist on the workspace dashboard-server
164
+ const response = await fetch(`${baseUrl}/api/data`, {
165
+ method: 'GET',
166
+ headers: { 'Accept': 'application/json' },
167
+ signal: AbortSignal.timeout(10_000),
168
+ });
169
+ if (!response.ok) {
170
+ res.json({ hasActiveAgents: false, agentCount: 0, agents: [], error: `Daemon returned ${response.status}` });
171
+ return;
172
+ }
173
+ const data = await response.json();
174
+ const agents = data.agents || [];
175
+ const activeAgents = agents.filter(a => {
176
+ const status = (a.status ?? '').toLowerCase();
177
+ const activityState = (a.activityState ?? '').toLowerCase();
178
+ const isProcessing = a.isProcessing === true;
179
+ if (activityState === 'active' || activityState === 'idle')
180
+ return true;
181
+ if (status && status !== 'disconnected' && status !== 'offline')
182
+ return true;
183
+ if (isProcessing)
184
+ return true;
185
+ return false;
186
+ });
187
+ res.json({
188
+ hasActiveAgents: activeAgents.length > 0,
189
+ agentCount: activeAgents.length,
190
+ agents: agents.map(a => ({ name: a.name, status: a.status || a.activityState || 'unknown' })),
191
+ });
192
+ }
193
+ catch (error) {
194
+ // Workspace might be stopped
195
+ res.json({
196
+ hasActiveAgents: false,
197
+ agentCount: 0,
198
+ agents: [],
199
+ error: `Could not reach workspace: ${error.message}`,
200
+ });
201
+ }
202
+ }
203
+ catch (error) {
204
+ console.error(`[admin] Error checking agents for workspace ${id}:`, error);
205
+ res.status(500).json({
206
+ error: 'Failed to check workspace agents',
207
+ details: error.message,
208
+ });
209
+ }
210
+ });
211
+ /**
212
+ * GET /api/admin/health
213
+ *
214
+ * Health check for admin API.
215
+ */
216
+ adminRouter.get('/health', (_req, res) => {
217
+ res.json({
218
+ status: 'ok',
219
+ timestamp: new Date().toISOString(),
220
+ config: {
221
+ computeProvider: getConfig().compute.provider,
222
+ },
223
+ });
224
+ });
225
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/api/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Auth API Routes
3
+ *
4
+ * Session management routes.
5
+ * User login is handled via Nango (see nango-auth.ts).
6
+ * GitHub repo operations are in github-app.ts.
7
+ */
8
+ import { Request, Response } from 'express';
9
+ export declare const authRouter: import("express-serve-static-core").Router;
10
+ declare module 'express-session' {
11
+ interface SessionData {
12
+ userId?: string;
13
+ githubToken?: string;
14
+ }
15
+ }
16
+ /**
17
+ * Middleware to require authentication
18
+ */
19
+ export declare function requireAuth(req: Request, res: Response, next: () => void): Response<any, Record<string, any>> | undefined;
20
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAU,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGpD,eAAO,MAAM,UAAU,4CAAW,CAAC;AAGnC,OAAO,QAAQ,iBAAiB,CAAC;IAC/B,UAAU,WAAW;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;CACF;AAsED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,kDASxE"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Auth API Routes
3
+ *
4
+ * Session management routes.
5
+ * User login is handled via Nango (see nango-auth.ts).
6
+ * GitHub repo operations are in github-app.ts.
7
+ */
8
+ import { Router } from 'express';
9
+ import { db } from '../db/index.js';
10
+ export const authRouter = Router();
11
+ /**
12
+ * GET /api/auth/github
13
+ * Redirect to Nango login flow
14
+ * @deprecated Use /api/auth/nango/login-session instead
15
+ */
16
+ authRouter.get('/github', (_req, res) => {
17
+ res.redirect('/api/auth/nango/login-session');
18
+ });
19
+ /**
20
+ * POST /api/auth/logout
21
+ * Logout user
22
+ */
23
+ authRouter.post('/logout', (req, res) => {
24
+ req.session.destroy((err) => {
25
+ if (err) {
26
+ return res.status(500).json({ error: 'Failed to logout' });
27
+ }
28
+ res.json({ success: true });
29
+ });
30
+ });
31
+ /**
32
+ * GET /api/auth/me
33
+ * Get current user
34
+ */
35
+ authRouter.get('/me', async (req, res) => {
36
+ if (!req.session.userId) {
37
+ return res.status(401).json({ error: 'Not authenticated' });
38
+ }
39
+ try {
40
+ const user = await db.users.findById(req.session.userId);
41
+ if (!user) {
42
+ return res.status(401).json({ error: 'User not found' });
43
+ }
44
+ // Get connected providers
45
+ const credentials = await db.credentials.findByUserId(user.id);
46
+ const connectedProviders = credentials.map((c) => ({
47
+ provider: c.provider,
48
+ email: c.providerAccountEmail,
49
+ connectedAt: c.createdAt,
50
+ }));
51
+ // Get pending invites
52
+ const pendingInvites = await db.workspaceMembers.getPendingInvites(user.id);
53
+ // Check for pending GitHub installation request
54
+ const pendingGitHubApproval = !!user.pendingInstallationRequest;
55
+ res.json({
56
+ id: user.id,
57
+ githubUsername: user.githubUsername,
58
+ email: user.email,
59
+ avatarUrl: user.avatarUrl,
60
+ plan: user.plan,
61
+ connectedProviders,
62
+ pendingInvites: pendingInvites.length,
63
+ pendingGitHubApproval,
64
+ onboardingCompleted: !!user.onboardingCompletedAt,
65
+ });
66
+ }
67
+ catch (error) {
68
+ console.error('Error getting user:', error);
69
+ res.status(500).json({ error: 'Failed to get user' });
70
+ }
71
+ });
72
+ /**
73
+ * Middleware to require authentication
74
+ */
75
+ export function requireAuth(req, res, next) {
76
+ if (!req.session.userId) {
77
+ return res.status(401).json({
78
+ error: 'Authentication required',
79
+ code: 'SESSION_EXPIRED',
80
+ message: 'Your session has expired. Please log in again.',
81
+ });
82
+ }
83
+ next();
84
+ }
85
+ /**
86
+ * GET /api/auth/session
87
+ * Check if current session is valid
88
+ */
89
+ authRouter.get('/session', async (req, res) => {
90
+ if (!req.session.userId) {
91
+ return res.json({
92
+ authenticated: false,
93
+ code: 'SESSION_EXPIRED',
94
+ message: 'Your session has expired. Please log in again.',
95
+ });
96
+ }
97
+ try {
98
+ // Verify user still exists
99
+ const user = await db.users.findById(req.session.userId);
100
+ if (!user) {
101
+ req.session.destroy(() => { });
102
+ return res.json({
103
+ authenticated: false,
104
+ code: 'USER_NOT_FOUND',
105
+ message: 'User account not found. Please log in again.',
106
+ });
107
+ }
108
+ // Get connected providers
109
+ const credentials = await db.credentials.findByUserId(user.id);
110
+ const connectedProviders = credentials.map((c) => ({
111
+ provider: c.provider,
112
+ email: c.providerAccountEmail,
113
+ connectedAt: c.createdAt,
114
+ }));
115
+ res.json({
116
+ authenticated: true,
117
+ user: {
118
+ id: user.id,
119
+ githubUsername: user.githubUsername,
120
+ email: user.email,
121
+ avatarUrl: user.avatarUrl,
122
+ plan: user.plan,
123
+ },
124
+ connectedProviders,
125
+ });
126
+ }
127
+ catch (error) {
128
+ console.error('Session check error:', error);
129
+ res.status(500).json({
130
+ authenticated: false,
131
+ code: 'SESSION_ERROR',
132
+ message: 'An error occurred while checking your session.',
133
+ });
134
+ }
135
+ });
136
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Agent Relay Cloud - Billing API
3
+ *
4
+ * REST API for subscription and billing management.
5
+ */
6
+ export declare const billingRouter: import("express-serve-static-core").Router;
7
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/api/billing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,eAAO,MAAM,aAAa,4CAAW,CAAC"}