agent-relay 2.0.23 → 2.0.24

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 (168) hide show
  1. package/dist/src/cli/index.js +66 -13
  2. package/package.json +18 -52
  3. package/packages/api-types/package.json +1 -1
  4. package/packages/bridge/package.json +8 -8
  5. package/packages/cli-tester/package.json +1 -1
  6. package/packages/config/package.json +2 -2
  7. package/packages/continuity/package.json +1 -1
  8. package/packages/daemon/package.json +12 -12
  9. package/packages/hooks/package.json +4 -4
  10. package/packages/mcp/package.json +2 -2
  11. package/packages/memory/package.json +2 -2
  12. package/packages/policy/package.json +2 -2
  13. package/packages/protocol/package.json +1 -1
  14. package/packages/resiliency/package.json +1 -1
  15. package/packages/sdk/package.json +2 -2
  16. package/packages/spawner/package.json +1 -1
  17. package/packages/state/package.json +1 -1
  18. package/packages/storage/package.json +2 -2
  19. package/packages/telemetry/package.json +1 -1
  20. package/packages/trajectory/package.json +2 -2
  21. package/packages/user-directory/package.json +2 -2
  22. package/packages/utils/package.json +1 -1
  23. package/packages/wrapper/package.json +6 -6
  24. package/deploy/init-db.sql +0 -5
  25. package/deploy/scripts/setup-fly-workspaces.sh +0 -69
  26. package/deploy/scripts/setup-railway.sh +0 -75
  27. package/dist/src/cloud/index.d.ts +0 -8
  28. package/dist/src/cloud/index.js +0 -8
  29. package/packages/cloud/dist/api/admin.d.ts +0 -8
  30. package/packages/cloud/dist/api/admin.js +0 -225
  31. package/packages/cloud/dist/api/auth.d.ts +0 -20
  32. package/packages/cloud/dist/api/auth.js +0 -138
  33. package/packages/cloud/dist/api/billing.d.ts +0 -7
  34. package/packages/cloud/dist/api/billing.js +0 -564
  35. package/packages/cloud/dist/api/cli-pty-runner.d.ts +0 -53
  36. package/packages/cloud/dist/api/cli-pty-runner.js +0 -175
  37. package/packages/cloud/dist/api/codex-auth-helper.d.ts +0 -21
  38. package/packages/cloud/dist/api/codex-auth-helper.js +0 -327
  39. package/packages/cloud/dist/api/consensus.d.ts +0 -13
  40. package/packages/cloud/dist/api/consensus.js +0 -261
  41. package/packages/cloud/dist/api/coordinators.d.ts +0 -8
  42. package/packages/cloud/dist/api/coordinators.js +0 -750
  43. package/packages/cloud/dist/api/daemons.d.ts +0 -12
  44. package/packages/cloud/dist/api/daemons.js +0 -535
  45. package/packages/cloud/dist/api/email-auth.d.ts +0 -11
  46. package/packages/cloud/dist/api/email-auth.js +0 -347
  47. package/packages/cloud/dist/api/generic-webhooks.d.ts +0 -8
  48. package/packages/cloud/dist/api/generic-webhooks.js +0 -129
  49. package/packages/cloud/dist/api/git.d.ts +0 -8
  50. package/packages/cloud/dist/api/git.js +0 -269
  51. package/packages/cloud/dist/api/github-app.d.ts +0 -11
  52. package/packages/cloud/dist/api/github-app.js +0 -223
  53. package/packages/cloud/dist/api/middleware/planLimits.d.ts +0 -43
  54. package/packages/cloud/dist/api/middleware/planLimits.js +0 -202
  55. package/packages/cloud/dist/api/monitoring.d.ts +0 -11
  56. package/packages/cloud/dist/api/monitoring.js +0 -578
  57. package/packages/cloud/dist/api/nango-auth.d.ts +0 -9
  58. package/packages/cloud/dist/api/nango-auth.js +0 -741
  59. package/packages/cloud/dist/api/onboarding.d.ts +0 -15
  60. package/packages/cloud/dist/api/onboarding.js +0 -679
  61. package/packages/cloud/dist/api/policy.d.ts +0 -8
  62. package/packages/cloud/dist/api/policy.js +0 -229
  63. package/packages/cloud/dist/api/provider-env.d.ts +0 -26
  64. package/packages/cloud/dist/api/provider-env.js +0 -141
  65. package/packages/cloud/dist/api/providers.d.ts +0 -7
  66. package/packages/cloud/dist/api/providers.js +0 -574
  67. package/packages/cloud/dist/api/repos.d.ts +0 -8
  68. package/packages/cloud/dist/api/repos.js +0 -577
  69. package/packages/cloud/dist/api/sessions.d.ts +0 -11
  70. package/packages/cloud/dist/api/sessions.js +0 -302
  71. package/packages/cloud/dist/api/teams.d.ts +0 -7
  72. package/packages/cloud/dist/api/teams.js +0 -281
  73. package/packages/cloud/dist/api/test-helpers.d.ts +0 -10
  74. package/packages/cloud/dist/api/test-helpers.js +0 -745
  75. package/packages/cloud/dist/api/usage.d.ts +0 -7
  76. package/packages/cloud/dist/api/usage.js +0 -111
  77. package/packages/cloud/dist/api/webhooks.d.ts +0 -8
  78. package/packages/cloud/dist/api/webhooks.js +0 -645
  79. package/packages/cloud/dist/api/workspaces.d.ts +0 -25
  80. package/packages/cloud/dist/api/workspaces.js +0 -1799
  81. package/packages/cloud/dist/billing/index.d.ts +0 -9
  82. package/packages/cloud/dist/billing/index.js +0 -9
  83. package/packages/cloud/dist/billing/plans.d.ts +0 -39
  84. package/packages/cloud/dist/billing/plans.js +0 -245
  85. package/packages/cloud/dist/billing/service.d.ts +0 -80
  86. package/packages/cloud/dist/billing/service.js +0 -388
  87. package/packages/cloud/dist/billing/types.d.ts +0 -141
  88. package/packages/cloud/dist/billing/types.js +0 -7
  89. package/packages/cloud/dist/config.d.ts +0 -5
  90. package/packages/cloud/dist/config.js +0 -5
  91. package/packages/cloud/dist/db/bulk-ingest.d.ts +0 -89
  92. package/packages/cloud/dist/db/bulk-ingest.js +0 -268
  93. package/packages/cloud/dist/db/drizzle.d.ts +0 -290
  94. package/packages/cloud/dist/db/drizzle.js +0 -1422
  95. package/packages/cloud/dist/db/index.d.ts +0 -56
  96. package/packages/cloud/dist/db/index.js +0 -70
  97. package/packages/cloud/dist/db/schema.d.ts +0 -5117
  98. package/packages/cloud/dist/db/schema.js +0 -656
  99. package/packages/cloud/dist/index.d.ts +0 -11
  100. package/packages/cloud/dist/index.js +0 -38
  101. package/packages/cloud/dist/provisioner/index.d.ts +0 -207
  102. package/packages/cloud/dist/provisioner/index.js +0 -2118
  103. package/packages/cloud/dist/server.d.ts +0 -17
  104. package/packages/cloud/dist/server.js +0 -2055
  105. package/packages/cloud/dist/services/auto-scaler.d.ts +0 -152
  106. package/packages/cloud/dist/services/auto-scaler.js +0 -439
  107. package/packages/cloud/dist/services/capacity-manager.d.ts +0 -148
  108. package/packages/cloud/dist/services/capacity-manager.js +0 -449
  109. package/packages/cloud/dist/services/ci-agent-spawner.d.ts +0 -49
  110. package/packages/cloud/dist/services/ci-agent-spawner.js +0 -373
  111. package/packages/cloud/dist/services/cloud-message-bus.d.ts +0 -28
  112. package/packages/cloud/dist/services/cloud-message-bus.js +0 -19
  113. package/packages/cloud/dist/services/compute-enforcement.d.ts +0 -57
  114. package/packages/cloud/dist/services/compute-enforcement.js +0 -175
  115. package/packages/cloud/dist/services/coordinator.d.ts +0 -62
  116. package/packages/cloud/dist/services/coordinator.js +0 -389
  117. package/packages/cloud/dist/services/index.d.ts +0 -17
  118. package/packages/cloud/dist/services/index.js +0 -25
  119. package/packages/cloud/dist/services/intro-expiration.d.ts +0 -60
  120. package/packages/cloud/dist/services/intro-expiration.js +0 -252
  121. package/packages/cloud/dist/services/mention-handler.d.ts +0 -65
  122. package/packages/cloud/dist/services/mention-handler.js +0 -405
  123. package/packages/cloud/dist/services/nango.d.ts +0 -219
  124. package/packages/cloud/dist/services/nango.js +0 -424
  125. package/packages/cloud/dist/services/persistence.d.ts +0 -131
  126. package/packages/cloud/dist/services/persistence.js +0 -200
  127. package/packages/cloud/dist/services/planLimits.d.ts +0 -147
  128. package/packages/cloud/dist/services/planLimits.js +0 -335
  129. package/packages/cloud/dist/services/presence-registry.d.ts +0 -56
  130. package/packages/cloud/dist/services/presence-registry.js +0 -91
  131. package/packages/cloud/dist/services/scaling-orchestrator.d.ts +0 -159
  132. package/packages/cloud/dist/services/scaling-orchestrator.js +0 -502
  133. package/packages/cloud/dist/services/scaling-policy.d.ts +0 -121
  134. package/packages/cloud/dist/services/scaling-policy.js +0 -415
  135. package/packages/cloud/dist/services/ssh-security.d.ts +0 -31
  136. package/packages/cloud/dist/services/ssh-security.js +0 -63
  137. package/packages/cloud/dist/services/workspace-keepalive.d.ts +0 -76
  138. package/packages/cloud/dist/services/workspace-keepalive.js +0 -234
  139. package/packages/cloud/dist/shims/consensus.d.ts +0 -23
  140. package/packages/cloud/dist/shims/consensus.js +0 -5
  141. package/packages/cloud/dist/webhooks/index.d.ts +0 -24
  142. package/packages/cloud/dist/webhooks/index.js +0 -29
  143. package/packages/cloud/dist/webhooks/parsers/github.d.ts +0 -8
  144. package/packages/cloud/dist/webhooks/parsers/github.js +0 -234
  145. package/packages/cloud/dist/webhooks/parsers/index.d.ts +0 -23
  146. package/packages/cloud/dist/webhooks/parsers/index.js +0 -30
  147. package/packages/cloud/dist/webhooks/parsers/linear.d.ts +0 -9
  148. package/packages/cloud/dist/webhooks/parsers/linear.js +0 -258
  149. package/packages/cloud/dist/webhooks/parsers/slack.d.ts +0 -9
  150. package/packages/cloud/dist/webhooks/parsers/slack.js +0 -214
  151. package/packages/cloud/dist/webhooks/responders/github.d.ts +0 -8
  152. package/packages/cloud/dist/webhooks/responders/github.js +0 -73
  153. package/packages/cloud/dist/webhooks/responders/index.d.ts +0 -23
  154. package/packages/cloud/dist/webhooks/responders/index.js +0 -30
  155. package/packages/cloud/dist/webhooks/responders/linear.d.ts +0 -9
  156. package/packages/cloud/dist/webhooks/responders/linear.js +0 -149
  157. package/packages/cloud/dist/webhooks/responders/slack.d.ts +0 -20
  158. package/packages/cloud/dist/webhooks/responders/slack.js +0 -178
  159. package/packages/cloud/dist/webhooks/router.d.ts +0 -25
  160. package/packages/cloud/dist/webhooks/router.js +0 -504
  161. package/packages/cloud/dist/webhooks/rules-engine.d.ts +0 -24
  162. package/packages/cloud/dist/webhooks/rules-engine.js +0 -287
  163. package/packages/cloud/dist/webhooks/types.d.ts +0 -186
  164. package/packages/cloud/dist/webhooks/types.js +0 -8
  165. package/packages/cloud/package.json +0 -60
  166. package/scripts/run-migrations.js +0 -43
  167. package/scripts/setup-stripe-products.ts +0 -312
  168. package/scripts/verify-schema.js +0 -134
@@ -1,405 +0,0 @@
1
- /**
2
- * Mention Handler Service
3
- *
4
- * Handles @mentions of agents in GitHub issues and PR comments.
5
- * Routes mentions to appropriate agents for response.
6
- *
7
- * Flow:
8
- * 1. App posts acknowledgment comment
9
- * 2. Finds a linked daemon for the repository
10
- * 3. Queues spawn command for the daemon
11
- * 4. Agent works and posts response comment
12
- */
13
- import { db } from '../db/index.js';
14
- import { nangoService } from './nango.js';
15
- /**
16
- * Known agent types that can be mentioned
17
- */
18
- export const KNOWN_AGENTS = {
19
- // Generic agents
20
- 'agent-relay': 'General purpose agent for any task',
21
- 'lead': 'Lead agent for coordination and delegation',
22
- 'developer': 'Developer agent for coding tasks',
23
- 'reviewer': 'Code review agent',
24
- // Specialized agents
25
- 'ci-fix': 'CI failure fixing agent',
26
- 'debugger': 'Bug investigation and fixing agent',
27
- 'docs': 'Documentation agent',
28
- 'test': 'Test writing agent',
29
- 'refactor': 'Code refactoring agent',
30
- };
31
- /**
32
- * Check if a mention is for a known agent type
33
- */
34
- export function isKnownAgent(mention) {
35
- return mention in KNOWN_AGENTS;
36
- }
37
- /**
38
- * Get the GitHub App name for comments
39
- */
40
- function getAppName() {
41
- return process.env.GITHUB_APP_NAME || 'Agent Relay';
42
- }
43
- /**
44
- * Post an acknowledgment comment on GitHub
45
- */
46
- async function postAcknowledgmentComment(repository, issueNumber, mentionedAgent, authorLogin) {
47
- if (!repository.nangoConnectionId) {
48
- console.warn(`[mention-handler] Repository ${repository.githubFullName} has no Nango connection`);
49
- return null;
50
- }
51
- const [owner, repo] = repository.githubFullName.split('/');
52
- const appName = getAppName();
53
- const agentDescription = isKnownAgent(mentionedAgent)
54
- ? KNOWN_AGENTS[mentionedAgent]
55
- : 'Custom agent';
56
- const body = `👋 @${authorLogin}, I've received your request and am routing it to **@${mentionedAgent}** (${agentDescription}).
57
-
58
- The agent will respond shortly. You can track progress in this thread.
59
-
60
- _— ${appName}_`;
61
- try {
62
- const result = await nangoService.addGithubIssueComment(repository.nangoConnectionId, owner, repo, issueNumber, body);
63
- console.log(`[mention-handler] Posted acknowledgment comment: ${result.html_url}`);
64
- return { id: result.id, url: result.html_url };
65
- }
66
- catch (error) {
67
- console.error(`[mention-handler] Failed to post acknowledgment comment:`, error);
68
- return null;
69
- }
70
- }
71
- /**
72
- * Find a linked daemon that can handle this repository
73
- */
74
- async function findAvailableDaemon(repository) {
75
- // The daemon must belong to the repository owner
76
- if (!repository.userId) {
77
- console.warn(`[mention-handler] Repository ${repository.githubFullName} has no userId`);
78
- return null;
79
- }
80
- const daemons = await db.linkedDaemons.findByUserId(repository.userId);
81
- const onlineDaemon = daemons.find(d => d.status === 'online');
82
- if (!onlineDaemon) {
83
- console.warn(`[mention-handler] No online daemon found for user ${repository.userId}`);
84
- return null;
85
- }
86
- return { id: onlineDaemon.id, userId: repository.userId };
87
- }
88
- /**
89
- * Queue a spawn command for a linked daemon
90
- */
91
- async function queueSpawnCommand(daemonId, agentName, prompt, metadata) {
92
- const command = {
93
- type: 'spawn_agent',
94
- agentName,
95
- cli: 'claude', // Default to Claude CLI
96
- task: prompt,
97
- metadata,
98
- timestamp: new Date().toISOString(),
99
- };
100
- await db.linkedDaemons.queueMessage(daemonId, {
101
- from: { daemonId: 'cloud', daemonName: 'Agent Relay Cloud', agent: 'system' },
102
- to: '__spawner__',
103
- content: JSON.stringify(command),
104
- metadata: { type: 'spawn_command' },
105
- timestamp: new Date().toISOString(),
106
- });
107
- console.log(`[mention-handler] Queued spawn command for daemon ${daemonId}`);
108
- }
109
- /**
110
- * Handle a mention record
111
- *
112
- * This function:
113
- * 1. Validates the mention is for a known agent
114
- * 2. Posts an acknowledgment comment
115
- * 3. Finds a linked daemon
116
- * 4. Queues a spawn command for the agent
117
- */
118
- export async function handleMention(mention) {
119
- console.log(`[mention-handler] Processing mention: @${mention.mentionedAgent} in ${mention.repository}`);
120
- // Check if this is a known agent type
121
- if (!isKnownAgent(mention.mentionedAgent)) {
122
- console.log(`[mention-handler] Unknown agent: @${mention.mentionedAgent}, checking workspace config`);
123
- // TODO: Check workspace configuration for custom agent names
124
- // For now, mark as ignored
125
- await db.commentMentions.markIgnored(mention.id);
126
- return;
127
- }
128
- // Find the repository to get Nango connection
129
- const repository = await db.repositories.findByFullName(mention.repository);
130
- if (!repository) {
131
- console.error(`[mention-handler] Repository not found: ${mention.repository}`);
132
- await db.commentMentions.markIgnored(mention.id);
133
- return;
134
- }
135
- // Generate agent info
136
- const agentId = `mention-${mention.id}`;
137
- const agentName = `${mention.mentionedAgent}-${mention.issueOrPrNumber}`;
138
- // Update status to processing
139
- await db.commentMentions.markProcessing(mention.id, agentId, agentName);
140
- // Step 1: Post acknowledgment comment
141
- const ackResult = await postAcknowledgmentComment(repository, mention.issueOrPrNumber, mention.mentionedAgent, mention.authorLogin);
142
- if (!ackResult) {
143
- console.warn(`[mention-handler] Could not post acknowledgment, continuing anyway`);
144
- }
145
- // Step 2: Find a linked daemon
146
- const daemon = await findAvailableDaemon(repository);
147
- if (!daemon) {
148
- console.warn(`[mention-handler] No available daemon for ${mention.repository}`);
149
- // Post a comment explaining the situation
150
- if (repository.nangoConnectionId) {
151
- const [owner, repo] = repository.githubFullName.split('/');
152
- try {
153
- await nangoService.addGithubIssueComment(repository.nangoConnectionId, owner, repo, mention.issueOrPrNumber, `⚠️ @${mention.authorLogin}, I couldn't find an available agent to handle this request. Please ensure you have a linked Agent Relay daemon running.
154
-
155
- You can set this up by running \`agent-relay cloud link\` on your development machine.
156
-
157
- _— ${getAppName()}_`);
158
- }
159
- catch (error) {
160
- console.error(`[mention-handler] Failed to post error comment:`, error);
161
- }
162
- }
163
- return;
164
- }
165
- // Step 3: Build the prompt for the agent
166
- const prompt = buildMentionPrompt(mention, repository);
167
- // Step 4: Queue spawn command for the daemon
168
- await queueSpawnCommand(daemon.id, agentName, prompt, {
169
- mentionId: mention.id,
170
- repository: mention.repository,
171
- issueNumber: mention.issueOrPrNumber,
172
- authorLogin: mention.authorLogin,
173
- });
174
- console.log(`[mention-handler] Spawned agent @${mention.mentionedAgent} for mention ${mention.id}`);
175
- }
176
- /**
177
- * Build a prompt for handling a mention
178
- */
179
- function buildMentionPrompt(mention, _repository) {
180
- const agentDescription = isKnownAgent(mention.mentionedAgent)
181
- ? KNOWN_AGENTS[mention.mentionedAgent]
182
- : 'Custom agent';
183
- const sourceTypeDescription = {
184
- issue_comment: 'GitHub issue comment',
185
- pr_comment: 'GitHub PR comment',
186
- pr_review: 'GitHub PR review comment',
187
- }[mention.sourceType] || 'GitHub comment';
188
- const responseInstructions = `
189
- ## Response Instructions
190
-
191
- When you complete your work:
192
- 1. Post a comment on GitHub to notify @${mention.authorLogin}
193
- 2. Reference specific files and line numbers when relevant
194
- 3. If you made code changes, push them and reference the commit
195
-
196
- Use the GitHub CLI (\`gh\`) to post your response:
197
- \`\`\`bash
198
- gh issue comment ${mention.issueOrPrNumber} --repo ${mention.repository} --body "Your response here @${mention.authorLogin}"
199
- \`\`\`
200
-
201
- Or for PR comments:
202
- \`\`\`bash
203
- gh pr comment ${mention.issueOrPrNumber} --repo ${mention.repository} --body "Your response here @${mention.authorLogin}"
204
- \`\`\`
205
- `;
206
- return `
207
- # Agent Mention Task
208
-
209
- You (@${mention.mentionedAgent}) have been mentioned in a ${sourceTypeDescription}.
210
-
211
- ## Your Role
212
- ${agentDescription}
213
-
214
- ## Context
215
-
216
- **Repository:** ${mention.repository}
217
- **Issue/PR:** #${mention.issueOrPrNumber}
218
- **Comment by:** @${mention.authorLogin}
219
- **Comment URL:** ${mention.commentUrl || 'N/A'}
220
-
221
- ## Comment
222
-
223
- ${mention.commentBody}
224
-
225
- ## Your Task
226
-
227
- Analyze the comment and respond appropriately:
228
-
229
- 1. If a question was asked, provide a helpful answer
230
- 2. If a task was requested, either complete it or explain what's needed
231
- 3. If feedback was given, acknowledge it and act on it if needed
232
-
233
- ${responseInstructions}
234
-
235
- ## Important
236
-
237
- - Be concise and helpful
238
- - If you need to make code changes, create a commit and push
239
- - If the request is unclear, ask for clarification in your response
240
- - Always @mention ${mention.authorLogin} in your response so they get notified
241
- `.trim();
242
- }
243
- /**
244
- * Handle an issue assignment
245
- *
246
- * Called when an issue should be assigned to an agent
247
- */
248
- export async function handleIssueAssignment(assignment) {
249
- console.log(`[mention-handler] Processing issue assignment: #${assignment.issueNumber} in ${assignment.repository}`);
250
- // Find the repository
251
- const repository = await db.repositories.findByFullName(assignment.repository);
252
- if (!repository) {
253
- console.error(`[mention-handler] Repository not found: ${assignment.repository}`);
254
- return;
255
- }
256
- // Post acknowledgment comment
257
- if (repository.nangoConnectionId) {
258
- const [owner, repo] = repository.githubFullName.split('/');
259
- try {
260
- await nangoService.addGithubIssueComment(repository.nangoConnectionId, owner, repo, assignment.issueNumber, `🤖 I've been assigned to work on this issue. I'll analyze the problem and get started.
261
-
262
- You can track my progress in this thread. I'll update you when I have a solution or need more information.
263
-
264
- _— ${getAppName()}_`);
265
- }
266
- catch (error) {
267
- console.error(`[mention-handler] Failed to post assignment comment:`, error);
268
- }
269
- }
270
- // Find a linked daemon
271
- const daemon = await findAvailableDaemon(repository);
272
- if (!daemon) {
273
- console.warn(`[mention-handler] No available daemon for ${assignment.repository}`);
274
- if (repository.nangoConnectionId) {
275
- const [owner, repo] = repository.githubFullName.split('/');
276
- try {
277
- await nangoService.addGithubIssueComment(repository.nangoConnectionId, owner, repo, assignment.issueNumber, `⚠️ I couldn't start working on this issue because no Agent Relay daemon is available.
278
-
279
- Please ensure you have a linked daemon running by executing \`agent-relay cloud link\` on your development machine.
280
-
281
- _— ${getAppName()}_`);
282
- }
283
- catch (error) {
284
- console.error(`[mention-handler] Failed to post error comment:`, error);
285
- }
286
- }
287
- return;
288
- }
289
- // Build prompt for the issue
290
- const prompt = buildIssuePrompt(assignment, repository);
291
- // Queue spawn command
292
- const agentName = `issue-${assignment.issueNumber}`;
293
- await queueSpawnCommand(daemon.id, agentName, prompt, {
294
- mentionId: assignment.id,
295
- repository: assignment.repository,
296
- issueNumber: assignment.issueNumber,
297
- authorLogin: 'issue-author', // TODO: Get from issue
298
- });
299
- // Update assignment status and assign agent
300
- await db.issueAssignments.assignAgent(assignment.id, agentName, agentName);
301
- await db.issueAssignments.updateStatus(assignment.id, 'in_progress');
302
- console.log(`[mention-handler] Spawned agent for issue #${assignment.issueNumber}`);
303
- }
304
- /**
305
- * Build a prompt for an issue assignment
306
- */
307
- function buildIssuePrompt(assignment, _repository) {
308
- const priorityNote = assignment.priority
309
- ? `\n**Priority:** ${assignment.priority.toUpperCase()}`
310
- : '';
311
- const labelsNote = assignment.labels && assignment.labels.length > 0
312
- ? `\n**Labels:** ${assignment.labels.join(', ')}`
313
- : '';
314
- return `
315
- # Issue Assignment
316
-
317
- You have been assigned to work on GitHub issue #${assignment.issueNumber}.
318
-
319
- ## Issue Details
320
-
321
- **Repository:** ${assignment.repository}
322
- **Title:** ${assignment.issueTitle}${priorityNote}${labelsNote}
323
- **URL:** ${assignment.issueUrl || 'N/A'}
324
-
325
- ## Description
326
-
327
- ${assignment.issueBody || 'No description provided.'}
328
-
329
- ## Your Task
330
-
331
- 1. Analyze the issue and understand what needs to be done
332
- 2. Investigate the codebase to find relevant files
333
- 3. Implement a solution if possible
334
- 4. Create a PR with your changes
335
- 5. Link the PR to this issue
336
-
337
- ## Response Instructions
338
-
339
- Keep the issue updated with your progress:
340
- \`\`\`bash
341
- gh issue comment ${assignment.issueNumber} --repo ${assignment.repository} --body "Your update here"
342
- \`\`\`
343
-
344
- When you create a PR:
345
- \`\`\`bash
346
- gh pr create --repo ${assignment.repository} --title "Fix #${assignment.issueNumber}: Brief description" --body "Fixes #${assignment.issueNumber}
347
-
348
- Description of changes..."
349
- \`\`\`
350
-
351
- ## Important
352
-
353
- - Start with a comment on the issue acknowledging you're working on it
354
- - If you need clarification, ask in the issue comments
355
- - Create a draft PR early if the fix is complex
356
- - Reference the issue number in your commit messages (e.g., "Fix #${assignment.issueNumber}")
357
- `.trim();
358
- }
359
- /**
360
- * Get pending mentions for processing
361
- */
362
- export async function getPendingMentions(limit = 50) {
363
- return db.commentMentions.findPending(limit);
364
- }
365
- /**
366
- * Get pending issue assignments for processing
367
- */
368
- export async function getPendingIssueAssignments(limit = 50) {
369
- return db.issueAssignments.findPending(limit);
370
- }
371
- /**
372
- * Process all pending mentions (background job)
373
- */
374
- export async function processPendingMentions() {
375
- const pending = await getPendingMentions();
376
- let processed = 0;
377
- for (const mention of pending) {
378
- try {
379
- await handleMention(mention);
380
- processed++;
381
- }
382
- catch (error) {
383
- console.error(`[mention-handler] Failed to process mention ${mention.id}:`, error);
384
- }
385
- }
386
- return processed;
387
- }
388
- /**
389
- * Process all pending issue assignments (background job)
390
- */
391
- export async function processPendingIssueAssignments() {
392
- const pending = await getPendingIssueAssignments();
393
- let processed = 0;
394
- for (const assignment of pending) {
395
- try {
396
- await handleIssueAssignment(assignment);
397
- processed++;
398
- }
399
- catch (error) {
400
- console.error(`[mention-handler] Failed to process assignment ${assignment.id}:`, error);
401
- }
402
- }
403
- return processed;
404
- }
405
- //# sourceMappingURL=mention-handler.js.map
@@ -1,219 +0,0 @@
1
- /**
2
- * Nango Integration Configuration
3
- *
4
- * REQUIRED SCOPES:
5
- * - github (GITHUB_USER): Requires 'user:email' scope for email reconciliation.
6
- * Configure this in Nango Dashboard: Integrations → GitHub → OAuth Scopes
7
- */
8
- export declare const NANGO_INTEGRATIONS: {
9
- readonly GITHUB_USER: "github";
10
- readonly GITHUB_APP: "github-app-oauth";
11
- };
12
- export interface GithubUserProfile {
13
- id: number;
14
- login: string;
15
- email?: string;
16
- avatar_url?: string;
17
- }
18
- declare class NangoService {
19
- private _client;
20
- private _secret;
21
- /** Lazily initialize client on first use to avoid requiring env vars at import */
22
- private get client();
23
- private get secret();
24
- /**
25
- * Create a Nango connect session restricted to specific integrations.
26
- */
27
- createConnectSession(allowedIntegrations: string[], endUser: {
28
- id: string;
29
- email?: string;
30
- }): Promise<{
31
- token: string;
32
- connect_link: string;
33
- expires_at: string;
34
- }>;
35
- /**
36
- * Fetch GitHub user profile via Nango proxy.
37
- */
38
- getGithubUser(connectionId: string): Promise<GithubUserProfile>;
39
- /**
40
- * Fetch all email addresses associated with a GitHub user.
41
- * Requires 'user:email' scope to be configured in Nango.
42
- * @see https://docs.github.com/en/rest/users/emails#list-email-addresses-for-the-authenticated-user
43
- */
44
- getGithubUserEmails(connectionId: string): Promise<Array<{
45
- email: string;
46
- verified: boolean;
47
- primary: boolean;
48
- visibility: string | null;
49
- }>>;
50
- /**
51
- * Retrieve an installation access token from a GitHub App connection.
52
- * Use this ONLY when you need the raw token (e.g., for git clone URLs).
53
- * For API calls, use the proxy methods instead.
54
- */
55
- getGithubAppToken(connectionId: string): Promise<string>;
56
- /**
57
- * Retrieve the user's OAuth access token from a GitHub App OAuth connection.
58
- * This is the user-level token (not the installation token).
59
- * Use this for operations that require user context (e.g., gh CLI).
60
- *
61
- * The user token is stored in connection_config.userCredentials.access_token
62
- * by Nango's GitHub App OAuth flow. This is a gho_* or ghu_* token that
63
- * works for both git operations and gh CLI commands.
64
- */
65
- getGithubUserOAuthToken(connectionId: string): Promise<string>;
66
- /**
67
- * Retrieve the user's OAuth token from a 'github' user connection.
68
- * This is for the separate GitHub OAuth login (not the App connection).
69
- */
70
- getGithubUserToken(connectionId: string): Promise<string>;
71
- /**
72
- * List repositories available to a GitHub App installation using the Nango Proxy.
73
- * The proxy automatically handles token injection and refresh.
74
- * @see https://nango.dev/docs/implementation-guides/requests-proxy/implement-requests-proxy
75
- */
76
- listGithubAppRepos(connectionId: string): Promise<{
77
- repositories: Array<{
78
- id: number;
79
- full_name: string;
80
- private: boolean;
81
- default_branch: string;
82
- }>;
83
- }>;
84
- /**
85
- * Get the GitHub App installation ID from a connection.
86
- * The installation ID is stored in connection_config.installation_id
87
- */
88
- getGithubAppInstallationId(connectionId: string): Promise<number | null>;
89
- /**
90
- * Create an issue via Nango Proxy.
91
- */
92
- createGithubIssue(connectionId: string, owner: string, repo: string, data: {
93
- title: string;
94
- body?: string;
95
- labels?: string[];
96
- }): Promise<{
97
- number: number;
98
- html_url: string;
99
- }>;
100
- /**
101
- * Create a pull request via Nango Proxy.
102
- */
103
- createGithubPullRequest(connectionId: string, owner: string, repo: string, data: {
104
- title: string;
105
- body?: string;
106
- head: string;
107
- base: string;
108
- }): Promise<{
109
- number: number;
110
- html_url: string;
111
- }>;
112
- /**
113
- * Add a comment to an issue via Nango Proxy.
114
- */
115
- addGithubIssueComment(connectionId: string, owner: string, repo: string, issueNumber: number, body: string): Promise<{
116
- id: number;
117
- html_url: string;
118
- }>;
119
- /**
120
- * Update connection end user metadata (e.g., after creating a user record).
121
- */
122
- updateEndUser(connectionId: string, providerConfigKey: string, endUser: {
123
- id: string;
124
- email?: string;
125
- }): Promise<void>;
126
- /**
127
- * Delete a connection from Nango.
128
- *
129
- * Used to remove temporary session connections for returning users
130
- * to prevent duplicate connections in Nango. In the two-connection pattern,
131
- * new users get a permanent connection but returning users authenticate
132
- * with a temporary one that gets deleted.
133
- *
134
- * @param connectionId - Nango connection ID to delete
135
- * @param providerConfigKey - The integration key (e.g., 'github')
136
- */
137
- deleteConnection(connectionId: string, providerConfigKey: string): Promise<void>;
138
- /**
139
- * Get connection metadata including end_user info.
140
- * Useful when webhook doesn't include end_user data.
141
- */
142
- getConnection(connectionId: string, providerConfigKey: string): Promise<{
143
- id: number;
144
- connection_id: string;
145
- provider_config_key: string;
146
- end_user?: {
147
- id?: string;
148
- email?: string;
149
- };
150
- metadata?: Record<string, unknown>;
151
- }>;
152
- /**
153
- * Check if user has access to a specific GitHub repository.
154
- * Uses the user's OAuth connection to query GitHub API.
155
- * @param connectionId - User's Nango connection ID (github user OAuth)
156
- * @param owner - Repository owner
157
- * @param repo - Repository name
158
- * @returns Access details or null if no access
159
- */
160
- checkUserRepoAccess(connectionId: string, owner: string, repo: string): Promise<{
161
- hasAccess: boolean;
162
- permission?: 'admin' | 'write' | 'read' | 'none';
163
- repository?: {
164
- id: number;
165
- fullName: string;
166
- isPrivate: boolean;
167
- defaultBranch: string;
168
- };
169
- }>;
170
- /**
171
- * List all repositories the user has access to via their OAuth connection.
172
- * Uses the user's personal OAuth token (not the GitHub App).
173
- * @param connectionId - User's Nango connection ID (github user OAuth)
174
- * @param options - Pagination and filter options
175
- * @returns List of accessible repositories
176
- */
177
- listUserAccessibleRepos(connectionId: string, options?: {
178
- page?: number;
179
- perPage?: number;
180
- type?: 'all' | 'owner' | 'public' | 'private' | 'member';
181
- sort?: 'created' | 'updated' | 'pushed' | 'full_name';
182
- }): Promise<{
183
- repositories: Array<{
184
- id: number;
185
- fullName: string;
186
- isPrivate: boolean;
187
- defaultBranch: string;
188
- permissions: {
189
- admin: boolean;
190
- push: boolean;
191
- pull: boolean;
192
- };
193
- }>;
194
- hasMore: boolean;
195
- }>;
196
- /**
197
- * List collaborators for a repository via Nango Proxy.
198
- * Uses the GitHub App connection to access repository collaborators.
199
- * @param connectionId - GitHub App connection ID
200
- * @param owner - Repository owner
201
- * @param repo - Repository name
202
- * @returns List of collaborators with their permissions
203
- */
204
- listRepoCollaborators(connectionId: string, owner: string, repo: string): Promise<Array<{
205
- id: number;
206
- login: string;
207
- avatarUrl: string;
208
- permission: 'admin' | 'write' | 'read' | 'none';
209
- }>>;
210
- /**
211
- * Verify webhook signature sent by Nango.
212
- * Uses the new verifyIncomingWebhookRequest method.
213
- * @see https://nango.dev/docs/reference/sdks/node#verify-webhook-signature
214
- */
215
- verifyWebhookSignature(rawBody: string, headers: Record<string, string | string[] | undefined>): boolean;
216
- }
217
- export declare const nangoService: NangoService;
218
- export {};
219
- //# sourceMappingURL=nango.d.ts.map