@agent-relay/cloud 2.0.23 → 6.0.4

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 (301) hide show
  1. package/dist/api-client.d.ts +33 -0
  2. package/dist/api-client.d.ts.map +1 -0
  3. package/dist/api-client.js +123 -0
  4. package/dist/api-client.js.map +1 -0
  5. package/dist/auth.d.ts +13 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +299 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/connect.d.ts +45 -0
  10. package/dist/connect.d.ts.map +1 -0
  11. package/dist/connect.js +166 -0
  12. package/dist/connect.js.map +1 -0
  13. package/dist/index.d.ts +7 -10
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +7 -37
  16. package/dist/index.js.map +1 -1
  17. package/dist/lib/ssh-interactive.d.ts +70 -0
  18. package/dist/lib/ssh-interactive.d.ts.map +1 -0
  19. package/dist/lib/ssh-interactive.js +440 -0
  20. package/dist/lib/ssh-interactive.js.map +1 -0
  21. package/dist/lib/ssh-runtime.d.ts +35 -0
  22. package/dist/lib/ssh-runtime.d.ts.map +1 -0
  23. package/dist/lib/ssh-runtime.js +52 -0
  24. package/dist/lib/ssh-runtime.js.map +1 -0
  25. package/dist/types.d.ts +76 -0
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/types.js +12 -0
  28. package/dist/types.js.map +1 -0
  29. package/dist/workflows.d.ts +49 -0
  30. package/dist/workflows.d.ts.map +1 -0
  31. package/dist/workflows.js +473 -0
  32. package/dist/workflows.js.map +1 -0
  33. package/package.json +12 -25
  34. package/dist/api/admin.d.ts +0 -8
  35. package/dist/api/admin.d.ts.map +0 -1
  36. package/dist/api/admin.js +0 -225
  37. package/dist/api/admin.js.map +0 -1
  38. package/dist/api/auth.d.ts +0 -20
  39. package/dist/api/auth.d.ts.map +0 -1
  40. package/dist/api/auth.js +0 -138
  41. package/dist/api/auth.js.map +0 -1
  42. package/dist/api/billing.d.ts +0 -7
  43. package/dist/api/billing.d.ts.map +0 -1
  44. package/dist/api/billing.js +0 -564
  45. package/dist/api/billing.js.map +0 -1
  46. package/dist/api/cli-pty-runner.d.ts +0 -53
  47. package/dist/api/cli-pty-runner.d.ts.map +0 -1
  48. package/dist/api/cli-pty-runner.js +0 -175
  49. package/dist/api/cli-pty-runner.js.map +0 -1
  50. package/dist/api/codex-auth-helper.d.ts +0 -21
  51. package/dist/api/codex-auth-helper.d.ts.map +0 -1
  52. package/dist/api/codex-auth-helper.js +0 -327
  53. package/dist/api/codex-auth-helper.js.map +0 -1
  54. package/dist/api/consensus.d.ts +0 -13
  55. package/dist/api/consensus.d.ts.map +0 -1
  56. package/dist/api/consensus.js +0 -261
  57. package/dist/api/consensus.js.map +0 -1
  58. package/dist/api/coordinators.d.ts +0 -8
  59. package/dist/api/coordinators.d.ts.map +0 -1
  60. package/dist/api/coordinators.js +0 -750
  61. package/dist/api/coordinators.js.map +0 -1
  62. package/dist/api/daemons.d.ts +0 -12
  63. package/dist/api/daemons.d.ts.map +0 -1
  64. package/dist/api/daemons.js +0 -535
  65. package/dist/api/daemons.js.map +0 -1
  66. package/dist/api/email-auth.d.ts +0 -11
  67. package/dist/api/email-auth.d.ts.map +0 -1
  68. package/dist/api/email-auth.js +0 -347
  69. package/dist/api/email-auth.js.map +0 -1
  70. package/dist/api/generic-webhooks.d.ts +0 -8
  71. package/dist/api/generic-webhooks.d.ts.map +0 -1
  72. package/dist/api/generic-webhooks.js +0 -129
  73. package/dist/api/generic-webhooks.js.map +0 -1
  74. package/dist/api/git.d.ts +0 -8
  75. package/dist/api/git.d.ts.map +0 -1
  76. package/dist/api/git.js +0 -269
  77. package/dist/api/git.js.map +0 -1
  78. package/dist/api/github-app.d.ts +0 -11
  79. package/dist/api/github-app.d.ts.map +0 -1
  80. package/dist/api/github-app.js +0 -223
  81. package/dist/api/github-app.js.map +0 -1
  82. package/dist/api/middleware/planLimits.d.ts +0 -43
  83. package/dist/api/middleware/planLimits.d.ts.map +0 -1
  84. package/dist/api/middleware/planLimits.js +0 -202
  85. package/dist/api/middleware/planLimits.js.map +0 -1
  86. package/dist/api/monitoring.d.ts +0 -11
  87. package/dist/api/monitoring.d.ts.map +0 -1
  88. package/dist/api/monitoring.js +0 -578
  89. package/dist/api/monitoring.js.map +0 -1
  90. package/dist/api/nango-auth.d.ts +0 -9
  91. package/dist/api/nango-auth.d.ts.map +0 -1
  92. package/dist/api/nango-auth.js +0 -741
  93. package/dist/api/nango-auth.js.map +0 -1
  94. package/dist/api/onboarding.d.ts +0 -15
  95. package/dist/api/onboarding.d.ts.map +0 -1
  96. package/dist/api/onboarding.js +0 -679
  97. package/dist/api/onboarding.js.map +0 -1
  98. package/dist/api/policy.d.ts +0 -8
  99. package/dist/api/policy.d.ts.map +0 -1
  100. package/dist/api/policy.js +0 -229
  101. package/dist/api/policy.js.map +0 -1
  102. package/dist/api/provider-env.d.ts +0 -26
  103. package/dist/api/provider-env.d.ts.map +0 -1
  104. package/dist/api/provider-env.js +0 -141
  105. package/dist/api/provider-env.js.map +0 -1
  106. package/dist/api/providers.d.ts +0 -7
  107. package/dist/api/providers.d.ts.map +0 -1
  108. package/dist/api/providers.js +0 -574
  109. package/dist/api/providers.js.map +0 -1
  110. package/dist/api/repos.d.ts +0 -8
  111. package/dist/api/repos.d.ts.map +0 -1
  112. package/dist/api/repos.js +0 -577
  113. package/dist/api/repos.js.map +0 -1
  114. package/dist/api/sessions.d.ts +0 -11
  115. package/dist/api/sessions.d.ts.map +0 -1
  116. package/dist/api/sessions.js +0 -302
  117. package/dist/api/sessions.js.map +0 -1
  118. package/dist/api/teams.d.ts +0 -7
  119. package/dist/api/teams.d.ts.map +0 -1
  120. package/dist/api/teams.js +0 -281
  121. package/dist/api/teams.js.map +0 -1
  122. package/dist/api/test-helpers.d.ts +0 -10
  123. package/dist/api/test-helpers.d.ts.map +0 -1
  124. package/dist/api/test-helpers.js +0 -745
  125. package/dist/api/test-helpers.js.map +0 -1
  126. package/dist/api/usage.d.ts +0 -7
  127. package/dist/api/usage.d.ts.map +0 -1
  128. package/dist/api/usage.js +0 -111
  129. package/dist/api/usage.js.map +0 -1
  130. package/dist/api/webhooks.d.ts +0 -8
  131. package/dist/api/webhooks.d.ts.map +0 -1
  132. package/dist/api/webhooks.js +0 -645
  133. package/dist/api/webhooks.js.map +0 -1
  134. package/dist/api/workspaces.d.ts +0 -25
  135. package/dist/api/workspaces.d.ts.map +0 -1
  136. package/dist/api/workspaces.js +0 -1799
  137. package/dist/api/workspaces.js.map +0 -1
  138. package/dist/billing/index.d.ts +0 -9
  139. package/dist/billing/index.d.ts.map +0 -1
  140. package/dist/billing/index.js +0 -9
  141. package/dist/billing/index.js.map +0 -1
  142. package/dist/billing/plans.d.ts +0 -39
  143. package/dist/billing/plans.d.ts.map +0 -1
  144. package/dist/billing/plans.js +0 -245
  145. package/dist/billing/plans.js.map +0 -1
  146. package/dist/billing/service.d.ts +0 -80
  147. package/dist/billing/service.d.ts.map +0 -1
  148. package/dist/billing/service.js +0 -388
  149. package/dist/billing/service.js.map +0 -1
  150. package/dist/billing/types.d.ts +0 -141
  151. package/dist/billing/types.d.ts.map +0 -1
  152. package/dist/billing/types.js +0 -7
  153. package/dist/billing/types.js.map +0 -1
  154. package/dist/config.d.ts +0 -5
  155. package/dist/config.d.ts.map +0 -1
  156. package/dist/config.js +0 -5
  157. package/dist/config.js.map +0 -1
  158. package/dist/db/bulk-ingest.d.ts +0 -89
  159. package/dist/db/bulk-ingest.d.ts.map +0 -1
  160. package/dist/db/bulk-ingest.js +0 -268
  161. package/dist/db/bulk-ingest.js.map +0 -1
  162. package/dist/db/drizzle.d.ts +0 -290
  163. package/dist/db/drizzle.d.ts.map +0 -1
  164. package/dist/db/drizzle.js +0 -1422
  165. package/dist/db/drizzle.js.map +0 -1
  166. package/dist/db/index.d.ts +0 -56
  167. package/dist/db/index.d.ts.map +0 -1
  168. package/dist/db/index.js +0 -70
  169. package/dist/db/index.js.map +0 -1
  170. package/dist/db/schema.d.ts +0 -5117
  171. package/dist/db/schema.d.ts.map +0 -1
  172. package/dist/db/schema.js +0 -656
  173. package/dist/db/schema.js.map +0 -1
  174. package/dist/provisioner/index.d.ts +0 -207
  175. package/dist/provisioner/index.d.ts.map +0 -1
  176. package/dist/provisioner/index.js +0 -2118
  177. package/dist/provisioner/index.js.map +0 -1
  178. package/dist/server.d.ts +0 -17
  179. package/dist/server.d.ts.map +0 -1
  180. package/dist/server.js +0 -2055
  181. package/dist/server.js.map +0 -1
  182. package/dist/services/auto-scaler.d.ts +0 -152
  183. package/dist/services/auto-scaler.d.ts.map +0 -1
  184. package/dist/services/auto-scaler.js +0 -439
  185. package/dist/services/auto-scaler.js.map +0 -1
  186. package/dist/services/capacity-manager.d.ts +0 -148
  187. package/dist/services/capacity-manager.d.ts.map +0 -1
  188. package/dist/services/capacity-manager.js +0 -449
  189. package/dist/services/capacity-manager.js.map +0 -1
  190. package/dist/services/ci-agent-spawner.d.ts +0 -49
  191. package/dist/services/ci-agent-spawner.d.ts.map +0 -1
  192. package/dist/services/ci-agent-spawner.js +0 -373
  193. package/dist/services/ci-agent-spawner.js.map +0 -1
  194. package/dist/services/cloud-message-bus.d.ts +0 -28
  195. package/dist/services/cloud-message-bus.d.ts.map +0 -1
  196. package/dist/services/cloud-message-bus.js +0 -19
  197. package/dist/services/cloud-message-bus.js.map +0 -1
  198. package/dist/services/compute-enforcement.d.ts +0 -57
  199. package/dist/services/compute-enforcement.d.ts.map +0 -1
  200. package/dist/services/compute-enforcement.js +0 -175
  201. package/dist/services/compute-enforcement.js.map +0 -1
  202. package/dist/services/coordinator.d.ts +0 -62
  203. package/dist/services/coordinator.d.ts.map +0 -1
  204. package/dist/services/coordinator.js +0 -389
  205. package/dist/services/coordinator.js.map +0 -1
  206. package/dist/services/index.d.ts +0 -17
  207. package/dist/services/index.d.ts.map +0 -1
  208. package/dist/services/index.js +0 -25
  209. package/dist/services/index.js.map +0 -1
  210. package/dist/services/intro-expiration.d.ts +0 -60
  211. package/dist/services/intro-expiration.d.ts.map +0 -1
  212. package/dist/services/intro-expiration.js +0 -252
  213. package/dist/services/intro-expiration.js.map +0 -1
  214. package/dist/services/mention-handler.d.ts +0 -65
  215. package/dist/services/mention-handler.d.ts.map +0 -1
  216. package/dist/services/mention-handler.js +0 -405
  217. package/dist/services/mention-handler.js.map +0 -1
  218. package/dist/services/nango.d.ts +0 -219
  219. package/dist/services/nango.d.ts.map +0 -1
  220. package/dist/services/nango.js +0 -424
  221. package/dist/services/nango.js.map +0 -1
  222. package/dist/services/persistence.d.ts +0 -131
  223. package/dist/services/persistence.d.ts.map +0 -1
  224. package/dist/services/persistence.js +0 -200
  225. package/dist/services/persistence.js.map +0 -1
  226. package/dist/services/planLimits.d.ts +0 -147
  227. package/dist/services/planLimits.d.ts.map +0 -1
  228. package/dist/services/planLimits.js +0 -335
  229. package/dist/services/planLimits.js.map +0 -1
  230. package/dist/services/presence-registry.d.ts +0 -56
  231. package/dist/services/presence-registry.d.ts.map +0 -1
  232. package/dist/services/presence-registry.js +0 -91
  233. package/dist/services/presence-registry.js.map +0 -1
  234. package/dist/services/scaling-orchestrator.d.ts +0 -159
  235. package/dist/services/scaling-orchestrator.d.ts.map +0 -1
  236. package/dist/services/scaling-orchestrator.js +0 -502
  237. package/dist/services/scaling-orchestrator.js.map +0 -1
  238. package/dist/services/scaling-policy.d.ts +0 -121
  239. package/dist/services/scaling-policy.d.ts.map +0 -1
  240. package/dist/services/scaling-policy.js +0 -415
  241. package/dist/services/scaling-policy.js.map +0 -1
  242. package/dist/services/ssh-security.d.ts +0 -31
  243. package/dist/services/ssh-security.d.ts.map +0 -1
  244. package/dist/services/ssh-security.js +0 -63
  245. package/dist/services/ssh-security.js.map +0 -1
  246. package/dist/services/workspace-keepalive.d.ts +0 -76
  247. package/dist/services/workspace-keepalive.d.ts.map +0 -1
  248. package/dist/services/workspace-keepalive.js +0 -234
  249. package/dist/services/workspace-keepalive.js.map +0 -1
  250. package/dist/shims/consensus.d.ts +0 -23
  251. package/dist/shims/consensus.d.ts.map +0 -1
  252. package/dist/shims/consensus.js +0 -5
  253. package/dist/shims/consensus.js.map +0 -1
  254. package/dist/webhooks/index.d.ts +0 -24
  255. package/dist/webhooks/index.d.ts.map +0 -1
  256. package/dist/webhooks/index.js +0 -29
  257. package/dist/webhooks/index.js.map +0 -1
  258. package/dist/webhooks/parsers/github.d.ts +0 -8
  259. package/dist/webhooks/parsers/github.d.ts.map +0 -1
  260. package/dist/webhooks/parsers/github.js +0 -234
  261. package/dist/webhooks/parsers/github.js.map +0 -1
  262. package/dist/webhooks/parsers/index.d.ts +0 -23
  263. package/dist/webhooks/parsers/index.d.ts.map +0 -1
  264. package/dist/webhooks/parsers/index.js +0 -30
  265. package/dist/webhooks/parsers/index.js.map +0 -1
  266. package/dist/webhooks/parsers/linear.d.ts +0 -9
  267. package/dist/webhooks/parsers/linear.d.ts.map +0 -1
  268. package/dist/webhooks/parsers/linear.js +0 -258
  269. package/dist/webhooks/parsers/linear.js.map +0 -1
  270. package/dist/webhooks/parsers/slack.d.ts +0 -9
  271. package/dist/webhooks/parsers/slack.d.ts.map +0 -1
  272. package/dist/webhooks/parsers/slack.js +0 -214
  273. package/dist/webhooks/parsers/slack.js.map +0 -1
  274. package/dist/webhooks/responders/github.d.ts +0 -8
  275. package/dist/webhooks/responders/github.d.ts.map +0 -1
  276. package/dist/webhooks/responders/github.js +0 -73
  277. package/dist/webhooks/responders/github.js.map +0 -1
  278. package/dist/webhooks/responders/index.d.ts +0 -23
  279. package/dist/webhooks/responders/index.d.ts.map +0 -1
  280. package/dist/webhooks/responders/index.js +0 -30
  281. package/dist/webhooks/responders/index.js.map +0 -1
  282. package/dist/webhooks/responders/linear.d.ts +0 -9
  283. package/dist/webhooks/responders/linear.d.ts.map +0 -1
  284. package/dist/webhooks/responders/linear.js +0 -149
  285. package/dist/webhooks/responders/linear.js.map +0 -1
  286. package/dist/webhooks/responders/slack.d.ts +0 -20
  287. package/dist/webhooks/responders/slack.d.ts.map +0 -1
  288. package/dist/webhooks/responders/slack.js +0 -178
  289. package/dist/webhooks/responders/slack.js.map +0 -1
  290. package/dist/webhooks/router.d.ts +0 -25
  291. package/dist/webhooks/router.d.ts.map +0 -1
  292. package/dist/webhooks/router.js +0 -504
  293. package/dist/webhooks/router.js.map +0 -1
  294. package/dist/webhooks/rules-engine.d.ts +0 -24
  295. package/dist/webhooks/rules-engine.d.ts.map +0 -1
  296. package/dist/webhooks/rules-engine.js +0 -287
  297. package/dist/webhooks/rules-engine.js.map +0 -1
  298. package/dist/webhooks/types.d.ts +0 -186
  299. package/dist/webhooks/types.d.ts.map +0 -1
  300. package/dist/webhooks/types.js +0 -8
  301. package/dist/webhooks/types.js.map +0 -1
@@ -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 +0,0 @@
1
- {"version":3,"file":"mention-handler.js","sourceRoot":"","sources":["../../src/services/mention-handler.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"nango.d.ts","sourceRoot":"","sources":["../../src/services/nango.ts"],"names":[],"mappings":"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"}