@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,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub App API Routes
|
|
3
|
+
*
|
|
4
|
+
* Repo operations via Nango's github-app-oauth connection:
|
|
5
|
+
* - Get clone token for repositories
|
|
6
|
+
* - Create issues, PRs, and comments
|
|
7
|
+
*
|
|
8
|
+
* Auth flow is handled by nango-auth.ts
|
|
9
|
+
*/
|
|
10
|
+
import { Router } from 'express';
|
|
11
|
+
import { requireAuth } from './auth.js';
|
|
12
|
+
import { db } from '../db/index.js';
|
|
13
|
+
import { nangoService, NANGO_INTEGRATIONS } from '../services/nango.js';
|
|
14
|
+
export const githubAppRouter = Router();
|
|
15
|
+
// All routes require authentication
|
|
16
|
+
githubAppRouter.use(requireAuth);
|
|
17
|
+
/**
|
|
18
|
+
* GET /api/github-app/status
|
|
19
|
+
* Check if Nango GitHub App OAuth is configured
|
|
20
|
+
*/
|
|
21
|
+
githubAppRouter.get('/status', (_req, res) => {
|
|
22
|
+
res.json({
|
|
23
|
+
configured: true,
|
|
24
|
+
integrations: NANGO_INTEGRATIONS,
|
|
25
|
+
connectUrl: '/connect-repos',
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* GET /api/github-app/repos
|
|
30
|
+
* List repositories the user has access to
|
|
31
|
+
*
|
|
32
|
+
* First tries database (populated by GitHub App OAuth).
|
|
33
|
+
* If empty, queries GitHub directly via user OAuth connection.
|
|
34
|
+
*/
|
|
35
|
+
githubAppRouter.get('/repos', async (req, res) => {
|
|
36
|
+
const userId = req.session.userId;
|
|
37
|
+
try {
|
|
38
|
+
// Try database first (from GitHub App OAuth flow)
|
|
39
|
+
const dbRepos = await db.repositories.findByUserId(userId);
|
|
40
|
+
if (dbRepos.length > 0) {
|
|
41
|
+
// Return repos from database
|
|
42
|
+
return res.json({
|
|
43
|
+
repositories: dbRepos.map((r) => ({
|
|
44
|
+
id: r.id,
|
|
45
|
+
fullName: r.githubFullName,
|
|
46
|
+
isPrivate: r.isPrivate,
|
|
47
|
+
defaultBranch: r.defaultBranch,
|
|
48
|
+
syncStatus: r.syncStatus,
|
|
49
|
+
hasNangoConnection: !!r.nangoConnectionId,
|
|
50
|
+
lastSyncedAt: r.lastSyncedAt,
|
|
51
|
+
})),
|
|
52
|
+
source: 'database',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Database empty - query GitHub directly via user OAuth
|
|
56
|
+
const user = await db.users.findById(userId);
|
|
57
|
+
if (!user?.nangoConnectionId) {
|
|
58
|
+
return res.json({
|
|
59
|
+
repositories: [],
|
|
60
|
+
source: 'none',
|
|
61
|
+
hint: 'User not connected to GitHub',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
console.log(`[github-app/repos] Database empty, querying GitHub for user ${user.githubUsername}`);
|
|
65
|
+
const { repositories } = await nangoService.listUserAccessibleRepos(user.nangoConnectionId, {
|
|
66
|
+
perPage: 100,
|
|
67
|
+
type: 'all',
|
|
68
|
+
});
|
|
69
|
+
res.json({
|
|
70
|
+
repositories: repositories.map((r) => ({
|
|
71
|
+
id: null, // No database ID yet
|
|
72
|
+
fullName: r.fullName,
|
|
73
|
+
isPrivate: r.isPrivate,
|
|
74
|
+
defaultBranch: r.defaultBranch,
|
|
75
|
+
syncStatus: 'live', // Queried from GitHub, not cached
|
|
76
|
+
hasNangoConnection: true,
|
|
77
|
+
lastSyncedAt: null,
|
|
78
|
+
})),
|
|
79
|
+
source: 'github-api',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error('Error listing repos:', error);
|
|
84
|
+
res.status(500).json({ error: 'Failed to list repositories' });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
/**
|
|
88
|
+
* GET /api/github-app/clone-token
|
|
89
|
+
* Get a clone token for a repository
|
|
90
|
+
* Used by workspace provisioner to clone private repos
|
|
91
|
+
*/
|
|
92
|
+
githubAppRouter.get('/clone-token', async (req, res) => {
|
|
93
|
+
const userId = req.session.userId;
|
|
94
|
+
const { repo } = req.query;
|
|
95
|
+
if (!repo || typeof repo !== 'string') {
|
|
96
|
+
return res.status(400).json({ error: 'Repository name is required (owner/repo)' });
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
// Find the repository in our database
|
|
100
|
+
const userRepos = await db.repositories.findByUserId(userId);
|
|
101
|
+
const repository = userRepos.find((r) => r.githubFullName === repo);
|
|
102
|
+
if (!repository) {
|
|
103
|
+
return res.status(404).json({ error: 'Repository not found' });
|
|
104
|
+
}
|
|
105
|
+
if (!repository.nangoConnectionId) {
|
|
106
|
+
return res.status(400).json({
|
|
107
|
+
error: 'Repository not connected via Nango',
|
|
108
|
+
hint: 'Connect your GitHub repos through the Nango flow first',
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Get token from Nango connection
|
|
112
|
+
const token = await nangoService.getGithubAppToken(repository.nangoConnectionId);
|
|
113
|
+
const cloneUrl = `https://x-access-token:${token}@github.com/${repo}.git`;
|
|
114
|
+
res.json({
|
|
115
|
+
token,
|
|
116
|
+
cloneUrl,
|
|
117
|
+
expiresIn: '1 hour',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('Error getting clone token:', error);
|
|
122
|
+
res.status(500).json({ error: 'Failed to get clone token' });
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
/**
|
|
126
|
+
* POST /api/github-app/repos/:id/issues
|
|
127
|
+
* Create an issue on a repository
|
|
128
|
+
*/
|
|
129
|
+
githubAppRouter.post('/repos/:id/issues', async (req, res) => {
|
|
130
|
+
const userId = req.session.userId;
|
|
131
|
+
const id = req.params.id;
|
|
132
|
+
const { title, body, labels } = req.body;
|
|
133
|
+
if (!title || typeof title !== 'string') {
|
|
134
|
+
return res.status(400).json({ error: 'Issue title is required' });
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
// Find the repository
|
|
138
|
+
const repository = await db.repositories.findById(id);
|
|
139
|
+
if (!repository || repository.userId !== userId) {
|
|
140
|
+
return res.status(404).json({ error: 'Repository not found' });
|
|
141
|
+
}
|
|
142
|
+
if (!repository.nangoConnectionId) {
|
|
143
|
+
return res.status(400).json({ error: 'Repository not connected via Nango' });
|
|
144
|
+
}
|
|
145
|
+
// Create issue via Nango Proxy (handles token injection automatically)
|
|
146
|
+
const [owner, repo] = repository.githubFullName.split('/');
|
|
147
|
+
const issue = await nangoService.createGithubIssue(repository.nangoConnectionId, owner, repo, { title, body: body || '', labels });
|
|
148
|
+
res.json({
|
|
149
|
+
number: issue.number,
|
|
150
|
+
url: issue.html_url,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Error creating issue:', error);
|
|
155
|
+
res.status(500).json({ error: 'Failed to create issue' });
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
/**
|
|
159
|
+
* POST /api/github-app/repos/:id/pulls
|
|
160
|
+
* Create a pull request on a repository
|
|
161
|
+
*/
|
|
162
|
+
githubAppRouter.post('/repos/:id/pulls', async (req, res) => {
|
|
163
|
+
const userId = req.session.userId;
|
|
164
|
+
const id = req.params.id;
|
|
165
|
+
const { title, body, head, base } = req.body;
|
|
166
|
+
if (!title || !head || !base) {
|
|
167
|
+
return res.status(400).json({ error: 'title, head, and base are required' });
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
// Find the repository
|
|
171
|
+
const repository = await db.repositories.findById(id);
|
|
172
|
+
if (!repository || repository.userId !== userId) {
|
|
173
|
+
return res.status(404).json({ error: 'Repository not found' });
|
|
174
|
+
}
|
|
175
|
+
if (!repository.nangoConnectionId) {
|
|
176
|
+
return res.status(400).json({ error: 'Repository not connected via Nango' });
|
|
177
|
+
}
|
|
178
|
+
// Create PR via Nango Proxy (handles token injection automatically)
|
|
179
|
+
const [owner, repo] = repository.githubFullName.split('/');
|
|
180
|
+
const pr = await nangoService.createGithubPullRequest(repository.nangoConnectionId, owner, repo, { title, body: body || '', head, base });
|
|
181
|
+
res.json({
|
|
182
|
+
number: pr.number,
|
|
183
|
+
url: pr.html_url,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.error('Error creating PR:', error);
|
|
188
|
+
res.status(500).json({ error: 'Failed to create pull request' });
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
/**
|
|
192
|
+
* POST /api/github-app/repos/:id/comments
|
|
193
|
+
* Add a comment to an issue or PR
|
|
194
|
+
*/
|
|
195
|
+
githubAppRouter.post('/repos/:id/comments', async (req, res) => {
|
|
196
|
+
const userId = req.session.userId;
|
|
197
|
+
const id = req.params.id;
|
|
198
|
+
const { issueNumber, body } = req.body;
|
|
199
|
+
if (!issueNumber || !body) {
|
|
200
|
+
return res.status(400).json({ error: 'issueNumber and body are required' });
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const repository = await db.repositories.findById(id);
|
|
204
|
+
if (!repository || repository.userId !== userId) {
|
|
205
|
+
return res.status(404).json({ error: 'Repository not found' });
|
|
206
|
+
}
|
|
207
|
+
if (!repository.nangoConnectionId) {
|
|
208
|
+
return res.status(400).json({ error: 'Repository not connected via Nango' });
|
|
209
|
+
}
|
|
210
|
+
// Add comment via Nango Proxy (handles token injection automatically)
|
|
211
|
+
const [owner, repo] = repository.githubFullName.split('/');
|
|
212
|
+
const comment = await nangoService.addGithubIssueComment(repository.nangoConnectionId, owner, repo, issueNumber, body);
|
|
213
|
+
res.json({
|
|
214
|
+
id: comment.id,
|
|
215
|
+
url: comment.html_url,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.error('Error adding comment:', error);
|
|
220
|
+
res.status(500).json({ error: 'Failed to add comment' });
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
//# sourceMappingURL=github-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-app.js","sourceRoot":"","sources":["../../src/api/github-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Limits Middleware
|
|
3
|
+
*
|
|
4
|
+
* Express middleware to enforce plan-based resource limits.
|
|
5
|
+
*/
|
|
6
|
+
import { Request, Response, NextFunction } from 'express';
|
|
7
|
+
/**
|
|
8
|
+
* Middleware to check workspace creation limit
|
|
9
|
+
*
|
|
10
|
+
* Use this middleware on workspace creation endpoints.
|
|
11
|
+
* Requires userId in session (use after requireAuth).
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkWorkspaceLimit(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Middleware to check repository limit
|
|
16
|
+
*
|
|
17
|
+
* Use this middleware on repo connection endpoints.
|
|
18
|
+
* Requires userId in session (use after requireAuth).
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkRepoLimit(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Middleware to check concurrent agent limit
|
|
23
|
+
*
|
|
24
|
+
* Use this middleware on agent spawn endpoints.
|
|
25
|
+
* Requires userId in session (use after requireAuth).
|
|
26
|
+
* Optionally pass currentRunningAgents in request body for accurate count.
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkAgentLimit(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Middleware to check coordinator access
|
|
31
|
+
*
|
|
32
|
+
* Use this middleware on coordinator-related endpoints.
|
|
33
|
+
* Coordinators are only available on Pro plan and above.
|
|
34
|
+
*/
|
|
35
|
+
export declare function checkCoordinatorAccess(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Middleware to check session persistence access
|
|
38
|
+
*
|
|
39
|
+
* Use this middleware on endpoints that enable cloud session persistence.
|
|
40
|
+
* Session persistence is only available on Pro plan and above.
|
|
41
|
+
*/
|
|
42
|
+
export declare function checkSessionPersistenceAccess(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=planLimits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planLimits.d.ts","sourceRoot":"","sources":["../../../src/api/middleware/planLimits.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA4B1D;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Limits Middleware
|
|
3
|
+
*
|
|
4
|
+
* Express middleware to enforce plan-based resource limits.
|
|
5
|
+
*/
|
|
6
|
+
import { canCreateWorkspace, canAddRepo, canSpawnAgent, canUseCoordinator, canUseSessionPersistence, } from '../../services/planLimits.js';
|
|
7
|
+
/**
|
|
8
|
+
* Middleware to check workspace creation limit
|
|
9
|
+
*
|
|
10
|
+
* Use this middleware on workspace creation endpoints.
|
|
11
|
+
* Requires userId in session (use after requireAuth).
|
|
12
|
+
*/
|
|
13
|
+
export async function checkWorkspaceLimit(req, res, next) {
|
|
14
|
+
const userId = req.session.userId;
|
|
15
|
+
if (!userId) {
|
|
16
|
+
res.status(401).json({ error: 'Authentication required' });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const check = await canCreateWorkspace(userId);
|
|
21
|
+
if (!check.allowed) {
|
|
22
|
+
const response = {
|
|
23
|
+
error: check.reason || 'Workspace limit exceeded',
|
|
24
|
+
code: 'PLAN_LIMIT_EXCEEDED',
|
|
25
|
+
details: {
|
|
26
|
+
plan: 'current',
|
|
27
|
+
resource: 'workspaces',
|
|
28
|
+
limit: check.limit || 0,
|
|
29
|
+
current: check.current || 0,
|
|
30
|
+
},
|
|
31
|
+
upgrade: {
|
|
32
|
+
message: 'Upgrade your plan to create more workspaces',
|
|
33
|
+
url: '/settings/billing',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
res.status(402).json(response);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
next();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error('Error checking workspace limit:', error);
|
|
43
|
+
res.status(500).json({ error: 'Failed to check workspace limit' });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Middleware to check repository limit
|
|
48
|
+
*
|
|
49
|
+
* Use this middleware on repo connection endpoints.
|
|
50
|
+
* Requires userId in session (use after requireAuth).
|
|
51
|
+
*/
|
|
52
|
+
export async function checkRepoLimit(req, res, next) {
|
|
53
|
+
const userId = req.session.userId;
|
|
54
|
+
if (!userId) {
|
|
55
|
+
res.status(401).json({ error: 'Authentication required' });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const check = await canAddRepo(userId);
|
|
60
|
+
if (!check.allowed) {
|
|
61
|
+
const response = {
|
|
62
|
+
error: check.reason || 'Repository limit exceeded',
|
|
63
|
+
code: 'PLAN_LIMIT_EXCEEDED',
|
|
64
|
+
details: {
|
|
65
|
+
plan: 'current',
|
|
66
|
+
resource: 'repos',
|
|
67
|
+
limit: check.limit || 0,
|
|
68
|
+
current: check.current || 0,
|
|
69
|
+
},
|
|
70
|
+
upgrade: {
|
|
71
|
+
message: 'Upgrade your plan to connect more repositories',
|
|
72
|
+
url: '/settings/billing',
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
res.status(402).json(response);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
next();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('Error checking repo limit:', error);
|
|
82
|
+
res.status(500).json({ error: 'Failed to check repository limit' });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Middleware to check concurrent agent limit
|
|
87
|
+
*
|
|
88
|
+
* Use this middleware on agent spawn endpoints.
|
|
89
|
+
* Requires userId in session (use after requireAuth).
|
|
90
|
+
* Optionally pass currentRunningAgents in request body for accurate count.
|
|
91
|
+
*/
|
|
92
|
+
export async function checkAgentLimit(req, res, next) {
|
|
93
|
+
const userId = req.session.userId;
|
|
94
|
+
const currentRunningAgents = req.body.currentRunningAgents;
|
|
95
|
+
if (!userId) {
|
|
96
|
+
res.status(401).json({ error: 'Authentication required' });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const check = await canSpawnAgent(userId, currentRunningAgents);
|
|
101
|
+
if (!check.allowed) {
|
|
102
|
+
const response = {
|
|
103
|
+
error: check.reason || 'Concurrent agent limit exceeded',
|
|
104
|
+
code: 'PLAN_LIMIT_EXCEEDED',
|
|
105
|
+
details: {
|
|
106
|
+
plan: 'current',
|
|
107
|
+
resource: 'concurrentAgents',
|
|
108
|
+
limit: check.limit || 0,
|
|
109
|
+
current: check.current || 0,
|
|
110
|
+
},
|
|
111
|
+
upgrade: {
|
|
112
|
+
message: 'Upgrade your plan to run more concurrent agents',
|
|
113
|
+
url: '/settings/billing',
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
res.status(402).json(response);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
next();
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error('Error checking agent limit:', error);
|
|
123
|
+
res.status(500).json({ error: 'Failed to check agent limit' });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Middleware to check coordinator access
|
|
128
|
+
*
|
|
129
|
+
* Use this middleware on coordinator-related endpoints.
|
|
130
|
+
* Coordinators are only available on Pro plan and above.
|
|
131
|
+
*/
|
|
132
|
+
export async function checkCoordinatorAccess(req, res, next) {
|
|
133
|
+
const userId = req.session.userId;
|
|
134
|
+
if (!userId) {
|
|
135
|
+
res.status(401).json({ error: 'Authentication required' });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const check = await canUseCoordinator(userId);
|
|
140
|
+
if (!check.allowed) {
|
|
141
|
+
const response = {
|
|
142
|
+
error: check.reason || 'Coordinator agents not available',
|
|
143
|
+
code: 'FEATURE_NOT_AVAILABLE',
|
|
144
|
+
details: {
|
|
145
|
+
plan: 'current',
|
|
146
|
+
resource: 'coordinators',
|
|
147
|
+
requiredPlan: check.requiredPlan,
|
|
148
|
+
},
|
|
149
|
+
upgrade: {
|
|
150
|
+
message: 'Upgrade to Pro to use coordinator agents',
|
|
151
|
+
url: '/settings/billing',
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
res.status(402).json(response);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
next();
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
console.error('Error checking coordinator access:', error);
|
|
161
|
+
res.status(500).json({ error: 'Failed to check coordinator access' });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Middleware to check session persistence access
|
|
166
|
+
*
|
|
167
|
+
* Use this middleware on endpoints that enable cloud session persistence.
|
|
168
|
+
* Session persistence is only available on Pro plan and above.
|
|
169
|
+
*/
|
|
170
|
+
export async function checkSessionPersistenceAccess(req, res, next) {
|
|
171
|
+
const userId = req.session.userId;
|
|
172
|
+
if (!userId) {
|
|
173
|
+
res.status(401).json({ error: 'Authentication required' });
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
const check = await canUseSessionPersistence(userId);
|
|
178
|
+
if (!check.allowed) {
|
|
179
|
+
const response = {
|
|
180
|
+
error: check.reason || 'Session persistence not available',
|
|
181
|
+
code: 'FEATURE_NOT_AVAILABLE',
|
|
182
|
+
details: {
|
|
183
|
+
plan: 'current',
|
|
184
|
+
resource: 'sessionPersistence',
|
|
185
|
+
requiredPlan: check.requiredPlan,
|
|
186
|
+
},
|
|
187
|
+
upgrade: {
|
|
188
|
+
message: 'Upgrade to Pro to enable cloud session persistence',
|
|
189
|
+
url: '/settings/billing',
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
res.status(402).json(response);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
next();
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error('Error checking session persistence access:', error);
|
|
199
|
+
res.status(500).json({ error: 'Failed to check session persistence access' });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=planLimits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planLimits.js","sourceRoot":"","sources":["../../../src/api/middleware/planLimits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Monitoring API Routes
|
|
3
|
+
*
|
|
4
|
+
* Provides endpoints for:
|
|
5
|
+
* - Real-time memory metrics collection
|
|
6
|
+
* - Crash insights and history
|
|
7
|
+
* - Proactive alerting
|
|
8
|
+
* - System health dashboard
|
|
9
|
+
*/
|
|
10
|
+
export declare const monitoringRouter: import("express-serve-static-core").Router;
|
|
11
|
+
//# sourceMappingURL=monitoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring.d.ts","sourceRoot":"","sources":["../../src/api/monitoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,eAAO,MAAM,gBAAgB,4CAAW,CAAC"}
|