@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.
- package/dist/api/admin.d.ts +8 -0
- package/dist/api/admin.d.ts.map +1 -0
- package/dist/api/admin.js +225 -0
- package/dist/api/admin.js.map +1 -0
- package/dist/api/auth.d.ts +20 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +136 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/billing.d.ts +7 -0
- package/dist/api/billing.d.ts.map +1 -0
- package/dist/api/billing.js +564 -0
- package/dist/api/billing.js.map +1 -0
- package/dist/api/cli-pty-runner.d.ts +53 -0
- package/dist/api/cli-pty-runner.d.ts.map +1 -0
- package/dist/api/cli-pty-runner.js +193 -0
- package/dist/api/cli-pty-runner.js.map +1 -0
- package/dist/api/codex-auth-helper.d.ts +21 -0
- package/dist/api/codex-auth-helper.d.ts.map +1 -0
- package/dist/api/codex-auth-helper.js +327 -0
- package/dist/api/codex-auth-helper.js.map +1 -0
- package/dist/api/consensus.d.ts +13 -0
- package/dist/api/consensus.d.ts.map +1 -0
- package/dist/api/consensus.js +261 -0
- package/dist/api/consensus.js.map +1 -0
- package/dist/api/coordinators.d.ts +8 -0
- package/dist/api/coordinators.d.ts.map +1 -0
- package/dist/api/coordinators.js +750 -0
- package/dist/api/coordinators.js.map +1 -0
- package/dist/api/daemons.d.ts +12 -0
- package/dist/api/daemons.d.ts.map +1 -0
- package/dist/api/daemons.js +535 -0
- package/dist/api/daemons.js.map +1 -0
- package/dist/api/generic-webhooks.d.ts +8 -0
- package/dist/api/generic-webhooks.d.ts.map +1 -0
- package/dist/api/generic-webhooks.js +129 -0
- package/dist/api/generic-webhooks.js.map +1 -0
- package/dist/api/git.d.ts +8 -0
- package/dist/api/git.d.ts.map +1 -0
- package/dist/api/git.js +269 -0
- package/dist/api/git.js.map +1 -0
- package/dist/api/github-app.d.ts +11 -0
- package/dist/api/github-app.d.ts.map +1 -0
- package/dist/api/github-app.js +223 -0
- package/dist/api/github-app.js.map +1 -0
- package/dist/api/middleware/planLimits.d.ts +43 -0
- package/dist/api/middleware/planLimits.d.ts.map +1 -0
- package/dist/api/middleware/planLimits.js +202 -0
- package/dist/api/middleware/planLimits.js.map +1 -0
- package/dist/api/monitoring.d.ts +11 -0
- package/dist/api/monitoring.d.ts.map +1 -0
- package/dist/api/monitoring.js +578 -0
- package/dist/api/monitoring.js.map +1 -0
- package/dist/api/nango-auth.d.ts +9 -0
- package/dist/api/nango-auth.d.ts.map +1 -0
- package/dist/api/nango-auth.js +674 -0
- package/dist/api/nango-auth.js.map +1 -0
- package/dist/api/onboarding.d.ts +15 -0
- package/dist/api/onboarding.d.ts.map +1 -0
- package/dist/api/onboarding.js +679 -0
- package/dist/api/onboarding.js.map +1 -0
- package/dist/api/policy.d.ts +8 -0
- package/dist/api/policy.d.ts.map +1 -0
- package/dist/api/policy.js +229 -0
- package/dist/api/policy.js.map +1 -0
- package/dist/api/provider-env.d.ts +14 -0
- package/dist/api/provider-env.d.ts.map +1 -0
- package/dist/api/provider-env.js +75 -0
- package/dist/api/provider-env.js.map +1 -0
- package/dist/api/providers.d.ts +7 -0
- package/dist/api/providers.d.ts.map +1 -0
- package/dist/api/providers.js +564 -0
- package/dist/api/providers.js.map +1 -0
- package/dist/api/repos.d.ts +8 -0
- package/dist/api/repos.d.ts.map +1 -0
- package/dist/api/repos.js +577 -0
- package/dist/api/repos.js.map +1 -0
- package/dist/api/sessions.d.ts +11 -0
- package/dist/api/sessions.d.ts.map +1 -0
- package/dist/api/sessions.js +302 -0
- package/dist/api/sessions.js.map +1 -0
- package/dist/api/teams.d.ts +7 -0
- package/dist/api/teams.d.ts.map +1 -0
- package/dist/api/teams.js +281 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/test-helpers.d.ts +10 -0
- package/dist/api/test-helpers.d.ts.map +1 -0
- package/dist/api/test-helpers.js +745 -0
- package/dist/api/test-helpers.js.map +1 -0
- package/dist/api/usage.d.ts +7 -0
- package/dist/api/usage.d.ts.map +1 -0
- package/dist/api/usage.js +111 -0
- package/dist/api/usage.js.map +1 -0
- package/dist/api/webhooks.d.ts +8 -0
- package/dist/api/webhooks.d.ts.map +1 -0
- package/dist/api/webhooks.js +645 -0
- package/dist/api/webhooks.js.map +1 -0
- package/dist/api/workspaces.d.ts +25 -0
- package/dist/api/workspaces.d.ts.map +1 -0
- package/dist/api/workspaces.js +1799 -0
- package/dist/api/workspaces.js.map +1 -0
- package/dist/billing/index.d.ts +9 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +9 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/plans.d.ts +39 -0
- package/dist/billing/plans.d.ts.map +1 -0
- package/dist/billing/plans.js +245 -0
- package/dist/billing/plans.js.map +1 -0
- package/dist/billing/service.d.ts +80 -0
- package/dist/billing/service.d.ts.map +1 -0
- package/dist/billing/service.js +388 -0
- package/dist/billing/service.js.map +1 -0
- package/dist/billing/types.d.ts +141 -0
- package/dist/billing/types.d.ts.map +1 -0
- package/dist/billing/types.js +7 -0
- package/dist/billing/types.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -0
- package/dist/db/bulk-ingest.d.ts +89 -0
- package/dist/db/bulk-ingest.d.ts.map +1 -0
- package/dist/db/bulk-ingest.js +268 -0
- package/dist/db/bulk-ingest.js.map +1 -0
- package/dist/db/drizzle.d.ts +256 -0
- package/dist/db/drizzle.d.ts.map +1 -0
- package/dist/db/drizzle.js +1286 -0
- package/dist/db/drizzle.js.map +1 -0
- package/dist/db/index.d.ts +55 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +68 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +4873 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +620 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/provisioner/index.d.ts +207 -0
- package/dist/provisioner/index.d.ts.map +1 -0
- package/dist/provisioner/index.js +2114 -0
- package/dist/provisioner/index.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1924 -0
- package/dist/server.js.map +1 -0
- package/dist/services/auto-scaler.d.ts +152 -0
- package/dist/services/auto-scaler.d.ts.map +1 -0
- package/dist/services/auto-scaler.js +439 -0
- package/dist/services/auto-scaler.js.map +1 -0
- package/dist/services/capacity-manager.d.ts +148 -0
- package/dist/services/capacity-manager.d.ts.map +1 -0
- package/dist/services/capacity-manager.js +449 -0
- package/dist/services/capacity-manager.js.map +1 -0
- package/dist/services/ci-agent-spawner.d.ts +49 -0
- package/dist/services/ci-agent-spawner.d.ts.map +1 -0
- package/dist/services/ci-agent-spawner.js +373 -0
- package/dist/services/ci-agent-spawner.js.map +1 -0
- package/dist/services/cloud-message-bus.d.ts +28 -0
- package/dist/services/cloud-message-bus.d.ts.map +1 -0
- package/dist/services/cloud-message-bus.js +19 -0
- package/dist/services/cloud-message-bus.js.map +1 -0
- package/dist/services/compute-enforcement.d.ts +57 -0
- package/dist/services/compute-enforcement.d.ts.map +1 -0
- package/dist/services/compute-enforcement.js +175 -0
- package/dist/services/compute-enforcement.js.map +1 -0
- package/dist/services/coordinator.d.ts +62 -0
- package/dist/services/coordinator.d.ts.map +1 -0
- package/dist/services/coordinator.js +389 -0
- package/dist/services/coordinator.js.map +1 -0
- package/dist/services/index.d.ts +17 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +25 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/intro-expiration.d.ts +60 -0
- package/dist/services/intro-expiration.d.ts.map +1 -0
- package/dist/services/intro-expiration.js +252 -0
- package/dist/services/intro-expiration.js.map +1 -0
- package/dist/services/mention-handler.d.ts +65 -0
- package/dist/services/mention-handler.d.ts.map +1 -0
- package/dist/services/mention-handler.js +405 -0
- package/dist/services/mention-handler.js.map +1 -0
- package/dist/services/nango.d.ts +201 -0
- package/dist/services/nango.d.ts.map +1 -0
- package/dist/services/nango.js +392 -0
- package/dist/services/nango.js.map +1 -0
- package/dist/services/persistence.d.ts +131 -0
- package/dist/services/persistence.d.ts.map +1 -0
- package/dist/services/persistence.js +200 -0
- package/dist/services/persistence.js.map +1 -0
- package/dist/services/planLimits.d.ts +147 -0
- package/dist/services/planLimits.d.ts.map +1 -0
- package/dist/services/planLimits.js +335 -0
- package/dist/services/planLimits.js.map +1 -0
- package/dist/services/presence-registry.d.ts +56 -0
- package/dist/services/presence-registry.d.ts.map +1 -0
- package/dist/services/presence-registry.js +91 -0
- package/dist/services/presence-registry.js.map +1 -0
- package/dist/services/scaling-orchestrator.d.ts +159 -0
- package/dist/services/scaling-orchestrator.d.ts.map +1 -0
- package/dist/services/scaling-orchestrator.js +502 -0
- package/dist/services/scaling-orchestrator.js.map +1 -0
- package/dist/services/scaling-policy.d.ts +121 -0
- package/dist/services/scaling-policy.d.ts.map +1 -0
- package/dist/services/scaling-policy.js +415 -0
- package/dist/services/scaling-policy.js.map +1 -0
- package/dist/services/ssh-security.d.ts +31 -0
- package/dist/services/ssh-security.d.ts.map +1 -0
- package/dist/services/ssh-security.js +63 -0
- package/dist/services/ssh-security.js.map +1 -0
- package/dist/services/workspace-keepalive.d.ts +76 -0
- package/dist/services/workspace-keepalive.d.ts.map +1 -0
- package/dist/services/workspace-keepalive.js +234 -0
- package/dist/services/workspace-keepalive.js.map +1 -0
- package/dist/shims/consensus.d.ts +23 -0
- package/dist/shims/consensus.d.ts.map +1 -0
- package/dist/shims/consensus.js +5 -0
- package/dist/shims/consensus.js.map +1 -0
- package/dist/webhooks/index.d.ts +24 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +29 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/parsers/github.d.ts +8 -0
- package/dist/webhooks/parsers/github.d.ts.map +1 -0
- package/dist/webhooks/parsers/github.js +234 -0
- package/dist/webhooks/parsers/github.js.map +1 -0
- package/dist/webhooks/parsers/index.d.ts +23 -0
- package/dist/webhooks/parsers/index.d.ts.map +1 -0
- package/dist/webhooks/parsers/index.js +30 -0
- package/dist/webhooks/parsers/index.js.map +1 -0
- package/dist/webhooks/parsers/linear.d.ts +9 -0
- package/dist/webhooks/parsers/linear.d.ts.map +1 -0
- package/dist/webhooks/parsers/linear.js +258 -0
- package/dist/webhooks/parsers/linear.js.map +1 -0
- package/dist/webhooks/parsers/slack.d.ts +9 -0
- package/dist/webhooks/parsers/slack.d.ts.map +1 -0
- package/dist/webhooks/parsers/slack.js +214 -0
- package/dist/webhooks/parsers/slack.js.map +1 -0
- package/dist/webhooks/responders/github.d.ts +8 -0
- package/dist/webhooks/responders/github.d.ts.map +1 -0
- package/dist/webhooks/responders/github.js +73 -0
- package/dist/webhooks/responders/github.js.map +1 -0
- package/dist/webhooks/responders/index.d.ts +23 -0
- package/dist/webhooks/responders/index.d.ts.map +1 -0
- package/dist/webhooks/responders/index.js +30 -0
- package/dist/webhooks/responders/index.js.map +1 -0
- package/dist/webhooks/responders/linear.d.ts +9 -0
- package/dist/webhooks/responders/linear.d.ts.map +1 -0
- package/dist/webhooks/responders/linear.js +149 -0
- package/dist/webhooks/responders/linear.js.map +1 -0
- package/dist/webhooks/responders/slack.d.ts +20 -0
- package/dist/webhooks/responders/slack.d.ts.map +1 -0
- package/dist/webhooks/responders/slack.js +178 -0
- package/dist/webhooks/responders/slack.js.map +1 -0
- package/dist/webhooks/router.d.ts +25 -0
- package/dist/webhooks/router.d.ts.map +1 -0
- package/dist/webhooks/router.js +504 -0
- package/dist/webhooks/router.js.map +1 -0
- package/dist/webhooks/rules-engine.d.ts +24 -0
- package/dist/webhooks/rules-engine.d.ts.map +1 -0
- package/dist/webhooks/rules-engine.js +287 -0
- package/dist/webhooks/rules-engine.js.map +1 -0
- package/dist/webhooks/types.d.ts +186 -0
- package/dist/webhooks/types.d.ts.map +1 -0
- package/dist/webhooks/types.js +8 -0
- package/dist/webhooks/types.js.map +1 -0
- 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"}
|