@desplega.ai/agent-swarm 1.20.0 → 1.51.2

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 (561) hide show
  1. package/README.md +271 -169
  2. package/openapi.json +5015 -0
  3. package/package.json +40 -7
  4. package/plugin/commands/close-issue.md +7 -3
  5. package/plugin/commands/create-pr.md +18 -12
  6. package/plugin/commands/implement-issue.md +7 -3
  7. package/plugin/commands/respond-github.md +8 -4
  8. package/plugin/commands/review-pr.md +44 -10
  9. package/plugin/commands/start-leader.md +1 -3
  10. package/plugin/commands/start-worker.md +1 -3
  11. package/plugin/commands/work-on-task.md +22 -3
  12. package/plugin/pi-skills/close-issue/SKILL.md +90 -0
  13. package/plugin/pi-skills/create-pr/SKILL.md +99 -0
  14. package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
  15. package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
  16. package/plugin/pi-skills/respond-github/SKILL.md +98 -0
  17. package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
  18. package/plugin/pi-skills/review-pr/SKILL.md +261 -0
  19. package/plugin/pi-skills/start-leader/SKILL.md +121 -0
  20. package/plugin/pi-skills/start-worker/SKILL.md +60 -0
  21. package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
  22. package/plugin/pi-skills/todos/SKILL.md +66 -0
  23. package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
  24. package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
  25. package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
  26. package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
  27. package/plugin/skills/artifacts/examples/static-report.sh +17 -0
  28. package/plugin/skills/artifacts/skill.md +71 -0
  29. package/src/agentmail/app.ts +65 -0
  30. package/src/agentmail/handlers.ts +262 -0
  31. package/src/agentmail/index.ts +9 -0
  32. package/src/agentmail/templates.ts +111 -0
  33. package/src/agentmail/types.ts +51 -0
  34. package/src/artifact-sdk/browser-sdk.ts +30 -0
  35. package/src/artifact-sdk/index.ts +2 -0
  36. package/src/artifact-sdk/localtunnel.d.ts +20 -0
  37. package/src/artifact-sdk/port.ts +12 -0
  38. package/src/artifact-sdk/server.ts +156 -0
  39. package/src/artifact-sdk/tunnel.ts +19 -0
  40. package/src/be/chunking.ts +193 -0
  41. package/src/be/db-queries/oauth.ts +90 -0
  42. package/src/be/db-queries/tracker.ts +182 -0
  43. package/src/be/db.ts +3327 -784
  44. package/src/be/embedding.ts +80 -0
  45. package/src/be/migrations/001_initial.sql +409 -0
  46. package/src/be/migrations/002_one_time_schedules.sql +59 -0
  47. package/src/be/migrations/003_workflows.sql +51 -0
  48. package/src/be/migrations/004_workflow_source.sql +81 -0
  49. package/src/be/migrations/005_epic_next_steps.sql +2 -0
  50. package/src/be/migrations/006_vcs_provider.sql +94 -0
  51. package/src/be/migrations/007_task_dir.sql +2 -0
  52. package/src/be/migrations/008_workflow_redesign.sql +85 -0
  53. package/src/be/migrations/009_tracker_integration.sql +144 -0
  54. package/src/be/migrations/010_step_diagnostics.sql +1 -0
  55. package/src/be/migrations/011_step_next_port.sql +1 -0
  56. package/src/be/migrations/012_trigger_schema.sql +1 -0
  57. package/src/be/migrations/013_task_output_schema.sql +2 -0
  58. package/src/be/migrations/014_prompt_templates.sql +33 -0
  59. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  60. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  61. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  62. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  63. package/src/be/migrations/runner.ts +188 -0
  64. package/src/be/seed.ts +62 -0
  65. package/src/cli.tsx +231 -299
  66. package/src/commands/artifact.ts +241 -0
  67. package/src/commands/onboard/compose-generator.ts +169 -0
  68. package/src/commands/onboard/env-generator.ts +79 -0
  69. package/src/commands/onboard/manifest.ts +37 -0
  70. package/src/commands/onboard/presets.ts +85 -0
  71. package/src/commands/onboard/service-names.ts +47 -0
  72. package/src/commands/onboard/steps/core-credentials.tsx +111 -0
  73. package/src/commands/onboard/steps/custom-templates.tsx +168 -0
  74. package/src/commands/onboard/steps/generate.tsx +154 -0
  75. package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
  76. package/src/commands/onboard/steps/harness.tsx +21 -0
  77. package/src/commands/onboard/steps/health-check.tsx +171 -0
  78. package/src/commands/onboard/steps/integration-github.tsx +105 -0
  79. package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
  80. package/src/commands/onboard/steps/integration-menu.tsx +58 -0
  81. package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
  82. package/src/commands/onboard/steps/integration-slack.tsx +165 -0
  83. package/src/commands/onboard/steps/post-connect.tsx +145 -0
  84. package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
  85. package/src/commands/onboard/steps/post-task.tsx +103 -0
  86. package/src/commands/onboard/steps/prereq-check.tsx +178 -0
  87. package/src/commands/onboard/steps/review.tsx +82 -0
  88. package/src/commands/onboard/steps/start.tsx +97 -0
  89. package/src/commands/onboard/templates.ts +34 -0
  90. package/src/commands/onboard/types.ts +259 -0
  91. package/src/commands/onboard.tsx +425 -0
  92. package/src/commands/runner.ts +1540 -630
  93. package/src/commands/setup.tsx +23 -38
  94. package/src/commands/shared/client-config.ts +41 -0
  95. package/src/commands/templates.ts +172 -0
  96. package/src/github/app.ts +8 -0
  97. package/src/github/handlers.ts +384 -151
  98. package/src/github/index.ts +1 -0
  99. package/src/github/mentions-aliases.test.ts +73 -0
  100. package/src/github/mentions.test.ts +3 -3
  101. package/src/github/mentions.ts +32 -6
  102. package/src/github/templates.ts +398 -0
  103. package/src/github/types.ts +1 -0
  104. package/src/gitlab/auth.ts +63 -0
  105. package/src/gitlab/handlers.ts +368 -0
  106. package/src/gitlab/index.ts +19 -0
  107. package/src/gitlab/reactions.ts +104 -0
  108. package/src/gitlab/templates.ts +140 -0
  109. package/src/gitlab/types.ts +130 -0
  110. package/src/heartbeat/heartbeat.ts +434 -0
  111. package/src/heartbeat/index.ts +1 -0
  112. package/src/heartbeat/templates.ts +30 -0
  113. package/src/hooks/hook.ts +555 -4
  114. package/src/hooks/tool-loop-detection.test.ts +158 -0
  115. package/src/hooks/tool-loop-detection.ts +167 -0
  116. package/src/http/active-sessions.ts +199 -0
  117. package/src/http/agents.ts +328 -0
  118. package/src/http/config.ts +191 -0
  119. package/src/http/core.ts +309 -0
  120. package/src/http/db-query.ts +91 -0
  121. package/src/http/ecosystem.ts +63 -0
  122. package/src/http/epics.ts +460 -0
  123. package/src/http/index.ts +216 -0
  124. package/src/http/mcp.ts +77 -0
  125. package/src/http/memory.ts +168 -0
  126. package/src/http/openapi.ts +109 -0
  127. package/src/http/poll.ts +299 -0
  128. package/src/http/prompt-templates.ts +412 -0
  129. package/src/http/repos.ts +195 -0
  130. package/src/http/route-def.ts +123 -0
  131. package/src/http/schedules.ts +426 -0
  132. package/src/http/session-data.ts +241 -0
  133. package/src/http/stats.ts +174 -0
  134. package/src/http/tasks.ts +468 -0
  135. package/src/http/trackers/index.ts +10 -0
  136. package/src/http/trackers/linear.ts +187 -0
  137. package/src/http/types.ts +12 -0
  138. package/src/http/utils.ts +87 -0
  139. package/src/http/webhooks.ts +432 -0
  140. package/src/http/workflows.ts +530 -0
  141. package/src/http.ts +1 -1890
  142. package/src/linear/README.md +65 -0
  143. package/src/linear/app.ts +48 -0
  144. package/src/linear/client.ts +18 -0
  145. package/src/linear/index.ts +1 -0
  146. package/src/linear/oauth.ts +35 -0
  147. package/src/linear/outbound.ts +212 -0
  148. package/src/linear/sync.ts +567 -0
  149. package/src/linear/templates.ts +47 -0
  150. package/src/linear/types.ts +7 -0
  151. package/src/linear/webhook.ts +104 -0
  152. package/src/oauth/README.md +66 -0
  153. package/src/oauth/index.ts +6 -0
  154. package/src/oauth/wrapper.ts +204 -0
  155. package/src/prompts/base-prompt.ts +150 -265
  156. package/src/prompts/defaults.ts +196 -0
  157. package/src/prompts/registry.ts +57 -0
  158. package/src/prompts/resolver.ts +296 -0
  159. package/src/prompts/session-templates.ts +604 -0
  160. package/src/providers/claude-adapter.ts +442 -0
  161. package/src/providers/index.ts +24 -0
  162. package/src/providers/pi-mono-adapter.ts +442 -0
  163. package/src/providers/pi-mono-extension.ts +624 -0
  164. package/src/providers/pi-mono-mcp-client.ts +124 -0
  165. package/src/providers/types.ts +75 -0
  166. package/src/scheduler/scheduler.test.ts +2 -0
  167. package/src/scheduler/scheduler.ts +231 -40
  168. package/src/server.ts +97 -6
  169. package/src/slack/HEURISTICS.md +105 -0
  170. package/src/slack/actions.ts +133 -0
  171. package/src/slack/app.ts +7 -0
  172. package/src/slack/assistant.ts +118 -0
  173. package/src/slack/blocks.ts +233 -0
  174. package/src/slack/channel-activity.ts +177 -0
  175. package/src/slack/commands.ts +31 -17
  176. package/src/slack/files.ts +1 -1
  177. package/src/slack/handlers.test.ts +114 -1
  178. package/src/slack/handlers.ts +230 -55
  179. package/src/slack/responses.ts +120 -67
  180. package/src/slack/router.ts +17 -99
  181. package/src/slack/templates.ts +55 -0
  182. package/src/slack/thread-buffer.ts +213 -0
  183. package/src/slack/watcher.ts +119 -4
  184. package/src/tests/agent-activity.test.ts +247 -0
  185. package/src/tests/agentmail-filters.test.ts +97 -0
  186. package/src/tests/artifact-sdk.test.ts +800 -0
  187. package/src/tests/base-prompt.test.ts +264 -0
  188. package/src/tests/build-pi-skills.test.ts +127 -0
  189. package/src/tests/channel-activity.test.ts +363 -0
  190. package/src/tests/claude-adapter.test.ts +126 -0
  191. package/src/tests/context-versioning.test.ts +425 -0
  192. package/src/tests/db-queries-oauth.test.ts +197 -0
  193. package/src/tests/db-queries-tracker.test.ts +230 -0
  194. package/src/tests/epics.test.ts +3 -3
  195. package/src/tests/error-tracker.test.ts +368 -0
  196. package/src/tests/fetch-resolved-env.test.ts +167 -0
  197. package/src/tests/generate-default-claude-md.test.ts +9 -1
  198. package/src/tests/generate-identity-templates.test.ts +124 -0
  199. package/src/tests/gitlab-auth.test.ts +109 -0
  200. package/src/tests/gitlab-handlers.test.ts +691 -0
  201. package/src/tests/gitlab-vcs-db.test.ts +177 -0
  202. package/src/tests/heartbeat.test.ts +364 -0
  203. package/src/tests/http-api-integration.test.ts +1698 -0
  204. package/src/tests/linear-outbound-sync.test.ts +200 -0
  205. package/src/tests/linear-webhook.test.ts +406 -0
  206. package/src/tests/match-route.test.ts +187 -0
  207. package/src/tests/memory.test.ts +737 -0
  208. package/src/tests/migration-runner-regressions.test.ts +86 -0
  209. package/src/tests/model-control.test.ts +338 -0
  210. package/src/tests/oauth-wrapper.test.ts +147 -0
  211. package/src/tests/onboard-compose.test.ts +138 -0
  212. package/src/tests/onboard-env.test.ts +174 -0
  213. package/src/tests/onboard-manifest.test.ts +137 -0
  214. package/src/tests/pi-mono-adapter.test.ts +234 -0
  215. package/src/tests/pool-session-logs.test.ts +199 -0
  216. package/src/tests/progress-dedup.test.ts +98 -0
  217. package/src/tests/prompt-template-github.test.ts +682 -0
  218. package/src/tests/prompt-template-remaining.test.ts +504 -0
  219. package/src/tests/prompt-template-resolver.test.ts +621 -0
  220. package/src/tests/prompt-template-session.test.ts +363 -0
  221. package/src/tests/prompt-templates-db.test.ts +616 -0
  222. package/src/tests/provider-adapter.test.ts +122 -0
  223. package/src/tests/provider-command-format.test.ts +98 -0
  224. package/src/tests/reload-config.test.ts +170 -0
  225. package/src/tests/runner-polling-api.test.ts +25 -20
  226. package/src/tests/scheduled-tasks.test.ts +104 -0
  227. package/src/tests/scheduler-backoff.test.ts +166 -0
  228. package/src/tests/self-improvement.test.ts +541 -0
  229. package/src/tests/session-attach.test.ts +536 -0
  230. package/src/tests/session-costs.test.ts +267 -1
  231. package/src/tests/slack-actions.test.ts +133 -0
  232. package/src/tests/slack-assistant.test.ts +136 -0
  233. package/src/tests/slack-blocks.test.ts +246 -0
  234. package/src/tests/slack-metadata-inheritance.test.ts +243 -0
  235. package/src/tests/slack-queue-offline.test.ts +174 -0
  236. package/src/tests/slack-router.test.ts +181 -0
  237. package/src/tests/slack-thread-buffer.test.ts +305 -0
  238. package/src/tests/slack-thread-followups.test.ts +298 -0
  239. package/src/tests/slack-watcher.test.ts +101 -0
  240. package/src/tests/structured-output.test.ts +307 -0
  241. package/src/tests/swarm-repos.test.ts +198 -0
  242. package/src/tests/task-cancellation.test.ts +6 -4
  243. package/src/tests/task-working-dir.test.ts +176 -0
  244. package/src/tests/template-fetch.test.ts +490 -0
  245. package/src/tests/tool-annotations.test.ts +371 -0
  246. package/src/tests/tracker-tools.test.ts +184 -0
  247. package/src/tests/update-profile-agentid.test.ts +248 -0
  248. package/src/tests/update-profile-api.test.ts +143 -3
  249. package/src/tests/update-profile-auth.test.ts +195 -0
  250. package/src/tests/validation-adapters.test.ts +86 -0
  251. package/src/tests/vcs-provider.test.ts +27 -0
  252. package/src/tests/workflow-agent-task.test.ts +196 -0
  253. package/src/tests/workflow-async-v2.test.ts +508 -0
  254. package/src/tests/workflow-convergence.test.ts +541 -0
  255. package/src/tests/workflow-definition-validation.test.ts +366 -0
  256. package/src/tests/workflow-engine-v2.test.ts +691 -0
  257. package/src/tests/workflow-executors.test.ts +736 -0
  258. package/src/tests/workflow-http-v2.test.ts +599 -0
  259. package/src/tests/workflow-integration-io.test.ts +902 -0
  260. package/src/tests/workflow-io-schemas.test.ts +624 -0
  261. package/src/tests/workflow-registry.test.ts +592 -0
  262. package/src/tests/workflow-retry-v2.test.ts +401 -0
  263. package/src/tests/workflow-retry-validation.test.ts +282 -0
  264. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  265. package/src/tests/workflow-template.test.ts +288 -0
  266. package/src/tests/workflow-trigger-schema.test.ts +359 -0
  267. package/src/tests/workflow-triggers-v2.test.ts +264 -0
  268. package/src/tests/workflow-versions.test.ts +208 -0
  269. package/src/tests/workflow-workspace.test.ts +272 -0
  270. package/src/tests/x402-client.test.ts +117 -0
  271. package/src/tests/x402-config.test.ts +182 -0
  272. package/src/tests/x402-spending-tracker.test.ts +185 -0
  273. package/src/tools/cancel-task.ts +2 -0
  274. package/src/tools/context-diff.ts +171 -0
  275. package/src/tools/context-history.ts +138 -0
  276. package/src/tools/create-channel.ts +1 -0
  277. package/src/tools/db-query.ts +78 -0
  278. package/src/tools/delete-channel.ts +132 -0
  279. package/src/tools/epics/assign-task-to-epic.ts +1 -0
  280. package/src/tools/epics/create-epic.ts +3 -2
  281. package/src/tools/epics/delete-epic.ts +2 -0
  282. package/src/tools/epics/get-epic-details.ts +2 -0
  283. package/src/tools/epics/list-epics.ts +2 -0
  284. package/src/tools/epics/unassign-task-from-epic.ts +1 -0
  285. package/src/tools/epics/update-epic.ts +7 -4
  286. package/src/tools/get-swarm.ts +2 -0
  287. package/src/tools/get-task-details.ts +2 -0
  288. package/src/tools/get-tasks.ts +27 -1
  289. package/src/tools/inject-learning.ts +106 -0
  290. package/src/tools/join-swarm.ts +17 -7
  291. package/src/tools/list-channels.ts +2 -0
  292. package/src/tools/list-services.ts +2 -0
  293. package/src/tools/memory-get.ts +56 -0
  294. package/src/tools/memory-search.ts +131 -0
  295. package/src/tools/my-agent-info.ts +2 -0
  296. package/src/tools/poll-task.ts +2 -20
  297. package/src/tools/post-message.ts +1 -0
  298. package/src/tools/prompt-templates/delete.ts +86 -0
  299. package/src/tools/prompt-templates/get.ts +89 -0
  300. package/src/tools/prompt-templates/index.ts +5 -0
  301. package/src/tools/prompt-templates/list.ts +95 -0
  302. package/src/tools/prompt-templates/preview.ts +84 -0
  303. package/src/tools/prompt-templates/set.ts +117 -0
  304. package/src/tools/read-messages.ts +2 -0
  305. package/src/tools/register-agentmail-inbox.ts +166 -0
  306. package/src/tools/register-service.ts +2 -0
  307. package/src/tools/schedules/create-schedule.ts +134 -24
  308. package/src/tools/schedules/delete-schedule.ts +2 -0
  309. package/src/tools/schedules/list-schedules.ts +20 -4
  310. package/src/tools/schedules/run-schedule-now.ts +1 -0
  311. package/src/tools/schedules/update-schedule.ts +49 -17
  312. package/src/tools/send-task.ts +132 -10
  313. package/src/tools/slack-download-file.ts +4 -2
  314. package/src/tools/slack-list-channels.ts +2 -0
  315. package/src/tools/slack-post.ts +2 -0
  316. package/src/tools/slack-read.ts +2 -0
  317. package/src/tools/slack-reply.ts +2 -0
  318. package/src/tools/slack-upload-file.ts +2 -0
  319. package/src/tools/store-progress.ts +205 -4
  320. package/src/tools/swarm-config/delete-config.ts +87 -0
  321. package/src/tools/swarm-config/get-config.ts +108 -0
  322. package/src/tools/swarm-config/index.ts +4 -0
  323. package/src/tools/swarm-config/list-config.ts +99 -0
  324. package/src/tools/swarm-config/set-config.ts +118 -0
  325. package/src/tools/task-action.ts +50 -5
  326. package/src/tools/task-dedup.ts +97 -0
  327. package/src/tools/templates.ts +53 -0
  328. package/src/tools/tool-config.ts +124 -0
  329. package/src/tools/tracker/index.ts +6 -0
  330. package/src/tools/tracker/tracker-link-epic.ts +64 -0
  331. package/src/tools/tracker/tracker-link-task.ts +64 -0
  332. package/src/tools/tracker/tracker-map-agent.ts +57 -0
  333. package/src/tools/tracker/tracker-status.ts +56 -0
  334. package/src/tools/tracker/tracker-sync-status.ts +42 -0
  335. package/src/tools/tracker/tracker-unlink.ts +41 -0
  336. package/src/tools/unregister-service.ts +2 -0
  337. package/src/tools/update-profile.ts +172 -17
  338. package/src/tools/update-service-status.ts +2 -0
  339. package/src/tools/utils.ts +10 -1
  340. package/src/tools/workflows/create-workflow.ts +129 -0
  341. package/src/tools/workflows/delete-workflow.ts +42 -0
  342. package/src/tools/workflows/get-workflow-run.ts +59 -0
  343. package/src/tools/workflows/get-workflow.ts +53 -0
  344. package/src/tools/workflows/index.ts +9 -0
  345. package/src/tools/workflows/list-workflow-runs.ts +48 -0
  346. package/src/tools/workflows/list-workflows.ts +42 -0
  347. package/src/tools/workflows/retry-workflow-run.ts +40 -0
  348. package/src/tools/workflows/trigger-workflow.ts +96 -0
  349. package/src/tools/workflows/update-workflow.ts +133 -0
  350. package/src/tracker/types.ts +51 -0
  351. package/src/types.ts +530 -14
  352. package/src/utils/credentials.test.ts +156 -0
  353. package/src/utils/credentials.ts +50 -0
  354. package/src/utils/error-tracker.ts +190 -0
  355. package/src/vcs/index.ts +15 -0
  356. package/src/vcs/types.ts +5 -0
  357. package/src/workflows/checkpoint.ts +121 -0
  358. package/src/workflows/cooldown.ts +28 -0
  359. package/src/workflows/definition.ts +235 -0
  360. package/src/workflows/engine.ts +580 -0
  361. package/src/workflows/event-bus.ts +29 -0
  362. package/src/workflows/executors/agent-task.ts +103 -0
  363. package/src/workflows/executors/base.ts +86 -0
  364. package/src/workflows/executors/code-match.ts +88 -0
  365. package/src/workflows/executors/index.ts +16 -0
  366. package/src/workflows/executors/notify.ts +93 -0
  367. package/src/workflows/executors/property-match.ts +104 -0
  368. package/src/workflows/executors/raw-llm.ts +83 -0
  369. package/src/workflows/executors/registry.ts +76 -0
  370. package/src/workflows/executors/script.ts +103 -0
  371. package/src/workflows/executors/validate.ts +215 -0
  372. package/src/workflows/executors/vcs.ts +58 -0
  373. package/src/workflows/index.ts +61 -0
  374. package/src/workflows/input.ts +46 -0
  375. package/src/workflows/json-schema-validator.ts +118 -0
  376. package/src/workflows/recovery.ts +139 -0
  377. package/src/workflows/resume.ts +229 -0
  378. package/src/workflows/retry-poller.ts +216 -0
  379. package/src/workflows/template.ts +74 -0
  380. package/src/workflows/templates.ts +86 -0
  381. package/src/workflows/triggers.ts +124 -0
  382. package/src/workflows/validation.ts +104 -0
  383. package/src/workflows/version.ts +44 -0
  384. package/src/x402/cli.ts +140 -0
  385. package/src/x402/client.ts +192 -0
  386. package/src/x402/config.ts +131 -0
  387. package/src/x402/index.ts +37 -0
  388. package/src/x402/openfort-signer.ts +83 -0
  389. package/src/x402/spending-tracker.ts +109 -0
  390. package/templates/official/coder/CLAUDE.md +49 -0
  391. package/templates/official/coder/IDENTITY.md +28 -0
  392. package/templates/official/coder/SOUL.md +43 -0
  393. package/templates/official/coder/TOOLS.md +40 -0
  394. package/templates/official/coder/config.json +23 -0
  395. package/templates/official/coder/start-up.sh +23 -0
  396. package/templates/official/content-reviewer/CLAUDE.md +68 -0
  397. package/templates/official/content-reviewer/IDENTITY.md +28 -0
  398. package/templates/official/content-reviewer/SOUL.md +44 -0
  399. package/templates/official/content-reviewer/TOOLS.md +37 -0
  400. package/templates/official/content-reviewer/config.json +23 -0
  401. package/templates/official/content-reviewer/start-up.sh +23 -0
  402. package/templates/official/content-strategist/CLAUDE.md +63 -0
  403. package/templates/official/content-strategist/IDENTITY.md +33 -0
  404. package/templates/official/content-strategist/SOUL.md +48 -0
  405. package/templates/official/content-strategist/TOOLS.md +47 -0
  406. package/templates/official/content-strategist/config.json +23 -0
  407. package/templates/official/content-strategist/start-up.sh +23 -0
  408. package/templates/official/content-writer/CLAUDE.md +72 -0
  409. package/templates/official/content-writer/IDENTITY.md +30 -0
  410. package/templates/official/content-writer/SOUL.md +46 -0
  411. package/templates/official/content-writer/TOOLS.md +44 -0
  412. package/templates/official/content-writer/config.json +23 -0
  413. package/templates/official/content-writer/start-up.sh +23 -0
  414. package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
  415. package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
  416. package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
  417. package/templates/official/forward-deployed-engineer/config.json +21 -0
  418. package/templates/official/lead/CLAUDE.md +33 -0
  419. package/templates/official/lead/IDENTITY.md +36 -0
  420. package/templates/official/lead/SOUL.md +51 -0
  421. package/templates/official/lead/config.json +22 -0
  422. package/templates/official/researcher/CLAUDE.md +46 -0
  423. package/templates/official/researcher/IDENTITY.md +28 -0
  424. package/templates/official/researcher/SOUL.md +43 -0
  425. package/templates/official/researcher/config.json +21 -0
  426. package/templates/official/reviewer/CLAUDE.md +63 -0
  427. package/templates/official/reviewer/IDENTITY.md +28 -0
  428. package/templates/official/reviewer/SOUL.md +45 -0
  429. package/templates/official/reviewer/config.json +21 -0
  430. package/templates/official/tester/CLAUDE.md +53 -0
  431. package/templates/official/tester/IDENTITY.md +28 -0
  432. package/templates/official/tester/SOUL.md +55 -0
  433. package/templates/official/tester/config.json +21 -0
  434. package/templates/schema.ts +35 -0
  435. package/.claude/settings.local.json +0 -115
  436. package/.dockerignore +0 -61
  437. package/.editorconfig +0 -15
  438. package/.env.docker.example +0 -39
  439. package/.env.example +0 -40
  440. package/.github/workflows/ci.yml +0 -76
  441. package/.github/workflows/docker-and-deploy.yml +0 -117
  442. package/.wts-config.json +0 -4
  443. package/.wts-setup.ts +0 -102
  444. package/CLAUDE.md +0 -104
  445. package/CONTRIBUTING.md +0 -270
  446. package/DEPLOYMENT.md +0 -605
  447. package/Dockerfile +0 -57
  448. package/Dockerfile.worker +0 -157
  449. package/FAQ.md +0 -19
  450. package/MCP.md +0 -406
  451. package/UI.md +0 -40
  452. package/assets/agent-swarm-logo-orange.png +0 -0
  453. package/assets/agent-swarm-logo.png +0 -0
  454. package/assets/agent-swarm.mp4 +0 -0
  455. package/assets/agent-swarm.png +0 -0
  456. package/biome.json +0 -39
  457. package/deploy/DEPLOY.md +0 -60
  458. package/deploy/agent-swarm.service +0 -17
  459. package/deploy/docker-push.ts +0 -30
  460. package/deploy/install.ts +0 -85
  461. package/deploy/prod-db.ts +0 -42
  462. package/deploy/uninstall.ts +0 -12
  463. package/deploy/update.ts +0 -21
  464. package/docker-compose.example.yml +0 -159
  465. package/docker-entrypoint.sh +0 -352
  466. package/ecosystem.config.cjs +0 -66
  467. package/plugin/README.md +0 -1
  468. package/plugin/hooks/hooks.json +0 -71
  469. package/pyproject.toml +0 -9
  470. package/scripts/generate-mcp-docs.ts +0 -415
  471. package/slack-manifest.json +0 -71
  472. package/src/tests/get-inbox-message.test.ts +0 -145
  473. package/src/tools/get-inbox-message.ts +0 -89
  474. package/src/tools/inbox-delegate.ts +0 -113
  475. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  476. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  477. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  478. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  479. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  480. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  481. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  482. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  483. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  484. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  485. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  486. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  487. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  488. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  489. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  490. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  491. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  492. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  493. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  494. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  495. package/thoughts/shared/research/.gitkeep +0 -0
  496. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  497. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  498. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  499. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  500. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  501. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  502. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  503. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  504. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  505. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  506. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  507. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  508. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  509. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  510. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  511. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  512. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  513. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  514. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  515. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  516. package/tsconfig.json +0 -37
  517. package/ui/CLAUDE.md +0 -49
  518. package/ui/bun.lock +0 -771
  519. package/ui/index.html +0 -22
  520. package/ui/package-lock.json +0 -5290
  521. package/ui/package.json +0 -33
  522. package/ui/pnpm-lock.yaml +0 -3341
  523. package/ui/postcss.config.js +0 -6
  524. package/ui/public/logo.png +0 -0
  525. package/ui/src/App.tsx +0 -63
  526. package/ui/src/components/ActivityFeed.tsx +0 -440
  527. package/ui/src/components/AgentDetailPanel.tsx +0 -733
  528. package/ui/src/components/AgentsPanel.tsx +0 -815
  529. package/ui/src/components/ChatPanel.tsx +0 -1920
  530. package/ui/src/components/ConfigModal.tsx +0 -253
  531. package/ui/src/components/Dashboard.tsx +0 -832
  532. package/ui/src/components/EditAgentProfileModal.tsx +0 -433
  533. package/ui/src/components/EpicDetailPage.tsx +0 -741
  534. package/ui/src/components/EpicsPanel.tsx +0 -566
  535. package/ui/src/components/Header.tsx +0 -160
  536. package/ui/src/components/JsonViewer.tsx +0 -171
  537. package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
  538. package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
  539. package/ui/src/components/ServicesPanel.tsx +0 -622
  540. package/ui/src/components/SessionLogPanel.tsx +0 -1219
  541. package/ui/src/components/StatsBar.tsx +0 -321
  542. package/ui/src/components/StatusBadge.tsx +0 -168
  543. package/ui/src/components/TaskDetailPanel.tsx +0 -903
  544. package/ui/src/components/TasksPanel.tsx +0 -614
  545. package/ui/src/components/UsageCharts.tsx +0 -216
  546. package/ui/src/components/UsageTab.tsx +0 -394
  547. package/ui/src/hooks/queries.ts +0 -353
  548. package/ui/src/hooks/useAutoScroll.ts +0 -83
  549. package/ui/src/index.css +0 -257
  550. package/ui/src/lib/api.ts +0 -268
  551. package/ui/src/lib/config.ts +0 -35
  552. package/ui/src/lib/contentPreview.ts +0 -208
  553. package/ui/src/lib/theme.ts +0 -214
  554. package/ui/src/lib/utils.ts +0 -88
  555. package/ui/src/main.tsx +0 -28
  556. package/ui/src/types/api.ts +0 -323
  557. package/ui/src/vite-env.d.ts +0 -1
  558. package/ui/tailwind.config.js +0 -37
  559. package/ui/tsconfig.json +0 -31
  560. package/ui/vite.config.ts +0 -35
  561. /package/{thoughts/shared/plans → templates/community}/.gitkeep +0 -0
@@ -5,6 +5,7 @@ export {
5
5
  initGitHub,
6
6
  isGitHubEnabled,
7
7
  isReactionsEnabled,
8
+ resetGitHub,
8
9
  verifyWebhookSignature,
9
10
  } from "./app";
10
11
  export {
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Alias tests for mentions.ts
3
+ *
4
+ * BOT_NAMES is computed once at module load time. In bun test, all test files
5
+ * share the same process, so mentions.test.ts loads the module first (without
6
+ * aliases). We use _resetBotNamesForTesting() to recompute from current env.
7
+ */
8
+ import { afterAll, beforeAll, describe, expect, test } from "bun:test";
9
+ import {
10
+ _resetBotNamesForTesting,
11
+ BOT_NAMES,
12
+ detectMention,
13
+ extractMentionContext,
14
+ isBotAssignee,
15
+ } from "./mentions";
16
+
17
+ const originalAliases = process.env.GITHUB_BOT_ALIASES;
18
+
19
+ beforeAll(() => {
20
+ process.env.GITHUB_BOT_ALIASES = "alias1,alias2";
21
+ _resetBotNamesForTesting();
22
+ });
23
+
24
+ afterAll(() => {
25
+ if (originalAliases === undefined) {
26
+ delete process.env.GITHUB_BOT_ALIASES;
27
+ } else {
28
+ process.env.GITHUB_BOT_ALIASES = originalAliases;
29
+ }
30
+ _resetBotNamesForTesting();
31
+ });
32
+
33
+ describe("GITHUB_BOT_ALIASES support", () => {
34
+ test("BOT_NAMES includes primary name and aliases", () => {
35
+ expect(BOT_NAMES).toContain("agent-swarm-bot");
36
+ expect(BOT_NAMES).toContain("alias1");
37
+ expect(BOT_NAMES).toContain("alias2");
38
+ });
39
+
40
+ test("detectMention recognizes alias mentions", () => {
41
+ expect(detectMention("@alias1 review this")).toBe(true);
42
+ expect(detectMention("@alias2 please help")).toBe(true);
43
+ expect(detectMention("Hey @alias1")).toBe(true);
44
+ });
45
+
46
+ test("detectMention is case-insensitive for aliases", () => {
47
+ expect(detectMention("@ALIAS1 review")).toBe(true);
48
+ expect(detectMention("@Alias2 help")).toBe(true);
49
+ });
50
+
51
+ test("detectMention still recognizes primary bot name", () => {
52
+ expect(detectMention("@agent-swarm-bot review")).toBe(true);
53
+ });
54
+
55
+ test("isBotAssignee recognizes aliases", () => {
56
+ expect(isBotAssignee("alias1")).toBe(true);
57
+ expect(isBotAssignee("alias2")).toBe(true);
58
+ expect(isBotAssignee("ALIAS1")).toBe(true);
59
+ });
60
+
61
+ test("isBotAssignee still recognizes primary bot name", () => {
62
+ expect(isBotAssignee("agent-swarm-bot")).toBe(true);
63
+ });
64
+
65
+ test("isBotAssignee rejects unknown names", () => {
66
+ expect(isBotAssignee("not-an-alias")).toBe(false);
67
+ });
68
+
69
+ test("extractMentionContext works with aliases", () => {
70
+ expect(extractMentionContext("@alias1 review this PR")).toBe("review this PR");
71
+ expect(extractMentionContext("Hey @alias2 help me")).toBe("Hey help me");
72
+ });
73
+ });
@@ -19,8 +19,8 @@ describe("detectMention", () => {
19
19
  });
20
20
 
21
21
  test("is case-insensitive", () => {
22
- expect(detectMention("@Agent-Swarm-Bot help")).toBe(true);
23
- expect(detectMention("@AGENT-SWARM-BOT help")).toBe(true);
22
+ expect(detectMention(`@${GITHUB_BOT_NAME.toLowerCase()} help`)).toBe(true);
23
+ expect(detectMention(`@${GITHUB_BOT_NAME.toUpperCase()} help`)).toBe(true);
24
24
  });
25
25
 
26
26
  test("returns false for no mention", () => {
@@ -62,7 +62,7 @@ describe("extractMentionContext", () => {
62
62
  });
63
63
 
64
64
  test("is case-insensitive", () => {
65
- expect(extractMentionContext("@AGENT-SWARM-BOT help me")).toBe("help me");
65
+ expect(extractMentionContext(`@${GITHUB_BOT_NAME.toUpperCase()} help me`)).toBe("help me");
66
66
  });
67
67
 
68
68
  test("returns empty string for null or undefined", () => {
@@ -1,11 +1,37 @@
1
1
  // Bot name for @mentions (can be overridden via env)
2
2
  export const GITHUB_BOT_NAME = process.env.GITHUB_BOT_NAME || "agent-swarm-bot";
3
3
 
4
- // Pattern to detect @<bot-name> mentions (case-insensitive)
5
- const MENTION_PATTERN = new RegExp(`@${GITHUB_BOT_NAME}\\b`, "i");
4
+ // Additional aliases that also trigger the bot (comma-separated env var)
5
+ // Example: GITHUB_BOT_ALIASES=heysidekick,sidekick,review-bot
6
+ function computeBotNames(): string[] {
7
+ const primary = GITHUB_BOT_NAME.toLowerCase();
8
+ const aliases = (process.env.GITHUB_BOT_ALIASES || "")
9
+ .split(",")
10
+ .map((a) => a.trim().toLowerCase())
11
+ .filter(Boolean);
12
+ return [...new Set([primary, ...aliases])];
13
+ }
14
+
15
+ function computeMentionPattern(names: string[]): RegExp {
16
+ return new RegExp(
17
+ `@(${names.map((a) => a.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})\\b`,
18
+ "i",
19
+ );
20
+ }
21
+
22
+ export let BOT_NAMES: string[] = computeBotNames();
23
+
24
+ // Pattern to detect @<any-name> mentions (case-insensitive)
25
+ let MENTION_PATTERN = computeMentionPattern(BOT_NAMES);
26
+
27
+ /** Recompute BOT_NAMES and MENTION_PATTERN from current env. For testing only. */
28
+ export function _resetBotNamesForTesting(): void {
29
+ BOT_NAMES = computeBotNames();
30
+ MENTION_PATTERN = computeMentionPattern(BOT_NAMES);
31
+ }
6
32
 
7
33
  /**
8
- * Check if text contains @<bot-name> mention
34
+ * Check if text contains @<bot-name-or-alias> mention
9
35
  */
10
36
  export function detectMention(text: string | null | undefined): boolean {
11
37
  if (!text) return false;
@@ -13,7 +39,7 @@ export function detectMention(text: string | null | undefined): boolean {
13
39
  }
14
40
 
15
41
  /**
16
- * Extract context by removing the @<bot-name> mention from text
42
+ * Extract context by removing the @<bot-name-or-alias> mention from text
17
43
  * Returns the remaining text trimmed
18
44
  */
19
45
  export function extractMentionContext(text: string | null | undefined): string {
@@ -22,9 +48,9 @@ export function extractMentionContext(text: string | null | undefined): string {
22
48
  }
23
49
 
24
50
  /**
25
- * Check if the assignee matches our bot name (case-insensitive)
51
+ * Check if the assignee matches our bot name or any alias (case-insensitive)
26
52
  */
27
53
  export function isBotAssignee(assigneeLogin: string | undefined): boolean {
28
54
  if (!assigneeLogin) return false;
29
- return assigneeLogin.toLowerCase() === GITHUB_BOT_NAME.toLowerCase();
55
+ return BOT_NAMES.includes(assigneeLogin.toLowerCase());
30
56
  }
@@ -0,0 +1,398 @@
1
+ /**
2
+ * GitHub event prompt template definitions.
3
+ *
4
+ * Each template is registered at module load time via registerTemplate().
5
+ * Handlers import this module for the side-effect of registration.
6
+ *
7
+ * Template text uses {{variable}} syntax. The resolver interpolates variables
8
+ * and expands {{@template[id]}} references before returning the final text.
9
+ */
10
+
11
+ import { registerTemplate } from "../prompts/registry";
12
+
13
+ // ============================================================================
14
+ // Common building blocks
15
+ // ============================================================================
16
+
17
+ registerTemplate({
18
+ eventType: "common.delegation_instruction",
19
+ header: "",
20
+ defaultBody:
21
+ "\u26a0\ufe0f As lead, DELEGATE this task to a worker agent - do not tackle it yourself.",
22
+ variables: [],
23
+ category: "common",
24
+ });
25
+
26
+ registerTemplate({
27
+ eventType: "common.command_suggestions.github_pr",
28
+ header: "",
29
+ defaultBody: "\ud83d\udca1 Suggested: /review-pr or /respond-github",
30
+ variables: [],
31
+ category: "common",
32
+ });
33
+
34
+ registerTemplate({
35
+ eventType: "common.command_suggestions.github_issue",
36
+ header: "",
37
+ defaultBody: "\ud83d\udca1 Suggested: /implement-issue or /respond-github",
38
+ variables: [],
39
+ category: "common",
40
+ });
41
+
42
+ registerTemplate({
43
+ eventType: "common.command_suggestions.github_comment_pr",
44
+ header: "",
45
+ defaultBody: "\ud83d\udca1 Suggested: /respond-github or /review-pr",
46
+ variables: [],
47
+ category: "common",
48
+ });
49
+
50
+ registerTemplate({
51
+ eventType: "common.command_suggestions.github_comment_issue",
52
+ header: "",
53
+ defaultBody: "\ud83d\udca1 Suggested: /respond-github",
54
+ variables: [],
55
+ category: "common",
56
+ });
57
+
58
+ // ============================================================================
59
+ // Pull Request events
60
+ // ============================================================================
61
+
62
+ registerTemplate({
63
+ eventType: "github.pull_request.assigned",
64
+ header: "[GitHub PR #{{pr_number}}] {{pr_title}}",
65
+ defaultBody: `Assigned to: @{{bot_name}}
66
+ From: {{sender_login}}
67
+ Repo: {{repo_full_name}}
68
+ Branch: {{head_ref}} \u2192 {{base_ref}}
69
+ URL: {{pr_url}}
70
+
71
+ Context:
72
+ {{context}}
73
+
74
+ ---
75
+ {{@template[common.delegation_instruction]}}
76
+ {{@template[common.command_suggestions.github_pr]}}`,
77
+ variables: [
78
+ { name: "pr_number", description: "Pull request number" },
79
+ { name: "pr_title", description: "Pull request title" },
80
+ { name: "bot_name", description: "GitHub bot username" },
81
+ { name: "sender_login", description: "Event sender login" },
82
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
83
+ { name: "head_ref", description: "Head branch name" },
84
+ { name: "base_ref", description: "Base branch name" },
85
+ { name: "pr_url", description: "Pull request HTML URL" },
86
+ { name: "context", description: "PR body or title as context" },
87
+ ],
88
+ category: "event",
89
+ });
90
+
91
+ registerTemplate({
92
+ eventType: "github.pull_request.review_requested",
93
+ header: "[GitHub PR #{{pr_number}}] {{pr_title}}",
94
+ defaultBody: `Review requested from: @{{bot_name}}
95
+ From: {{sender_login}}
96
+ Repo: {{repo_full_name}}
97
+ Branch: {{head_ref}} \u2192 {{base_ref}}
98
+ URL: {{pr_url}}
99
+
100
+ Context:
101
+ {{context}}
102
+
103
+ ---
104
+ {{@template[common.delegation_instruction]}}
105
+ {{@template[common.command_suggestions.github_pr]}}`,
106
+ variables: [
107
+ { name: "pr_number", description: "Pull request number" },
108
+ { name: "pr_title", description: "Pull request title" },
109
+ { name: "bot_name", description: "GitHub bot username" },
110
+ { name: "sender_login", description: "Event sender login" },
111
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
112
+ { name: "head_ref", description: "Head branch name" },
113
+ { name: "base_ref", description: "Base branch name" },
114
+ { name: "pr_url", description: "Pull request HTML URL" },
115
+ { name: "context", description: "PR body or title as context" },
116
+ ],
117
+ category: "event",
118
+ });
119
+
120
+ registerTemplate({
121
+ eventType: "github.pull_request.closed",
122
+ header: "{{status_emoji}} [GitHub PR #{{pr_number}}] {{status}}{{merged_by}}",
123
+ defaultBody: `PR: {{pr_title}}
124
+ Repo: {{repo_full_name}}
125
+ URL: {{pr_url}}
126
+
127
+ ---
128
+ Related task: {{related_task_id}}
129
+ \ud83d\udd00 Consider routing to the same agent working on the related task.
130
+ {{follow_up_suggestion}}`,
131
+ variables: [
132
+ { name: "status_emoji", description: "Status emoji (merge or close)" },
133
+ { name: "pr_number", description: "Pull request number" },
134
+ { name: "status", description: "MERGED or CLOSED" },
135
+ { name: "merged_by", description: "Merged by info (e.g. ' by user') or empty" },
136
+ { name: "pr_title", description: "Pull request title" },
137
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
138
+ { name: "pr_url", description: "Pull request HTML URL" },
139
+ { name: "related_task_id", description: "ID of the related existing task" },
140
+ {
141
+ name: "follow_up_suggestion",
142
+ description: "Suggestion text for merged or closed PR",
143
+ },
144
+ ],
145
+ category: "event",
146
+ });
147
+
148
+ registerTemplate({
149
+ eventType: "github.pull_request.synchronize",
150
+ header: "\ud83d\udd04 [GitHub PR #{{pr_number}}] New commits pushed",
151
+ defaultBody: `PR: {{pr_title}}
152
+ Repo: {{repo_full_name}}
153
+ Branch: {{head_ref}}
154
+ New HEAD: {{head_sha_short}}
155
+ URL: {{pr_url}}
156
+
157
+ ---
158
+ Related task: {{related_task_id}}
159
+ \ud83d\udd00 Consider routing to the same agent working on the related task.
160
+ \ud83d\udca1 New commits were pushed. CI will re-run - monitor for results.`,
161
+ variables: [
162
+ { name: "pr_number", description: "Pull request number" },
163
+ { name: "pr_title", description: "Pull request title" },
164
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
165
+ { name: "head_ref", description: "Head branch name" },
166
+ { name: "head_sha_short", description: "Short HEAD SHA (7 chars)" },
167
+ { name: "pr_url", description: "Pull request HTML URL" },
168
+ { name: "related_task_id", description: "ID of the related existing task" },
169
+ ],
170
+ category: "event",
171
+ });
172
+
173
+ registerTemplate({
174
+ eventType: "github.pull_request.mentioned",
175
+ header: "[GitHub PR #{{pr_number}}] {{pr_title}}",
176
+ defaultBody: `From: {{sender_login}}
177
+ Repo: {{repo_full_name}}
178
+ Branch: {{head_ref}} \u2192 {{base_ref}}
179
+ URL: {{pr_url}}
180
+
181
+ Context:
182
+ {{context}}
183
+
184
+ ---
185
+ {{@template[common.delegation_instruction]}}
186
+ {{@template[common.command_suggestions.github_pr]}}`,
187
+ variables: [
188
+ { name: "pr_number", description: "Pull request number" },
189
+ { name: "pr_title", description: "Pull request title" },
190
+ { name: "sender_login", description: "Event sender login" },
191
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
192
+ { name: "head_ref", description: "Head branch name" },
193
+ { name: "base_ref", description: "Base branch name" },
194
+ { name: "pr_url", description: "Pull request HTML URL" },
195
+ { name: "context", description: "Extracted mention context or PR title" },
196
+ ],
197
+ category: "event",
198
+ });
199
+
200
+ // ============================================================================
201
+ // Issue events
202
+ // ============================================================================
203
+
204
+ registerTemplate({
205
+ eventType: "github.issue.assigned",
206
+ header: "[GitHub Issue #{{issue_number}}] {{issue_title}}",
207
+ defaultBody: `Assigned to: @{{bot_name}}
208
+ From: {{sender_login}}
209
+ Repo: {{repo_full_name}}
210
+ URL: {{issue_url}}
211
+
212
+ Context:
213
+ {{context}}
214
+
215
+ ---
216
+ {{@template[common.delegation_instruction]}}
217
+ {{@template[common.command_suggestions.github_issue]}}`,
218
+ variables: [
219
+ { name: "issue_number", description: "Issue number" },
220
+ { name: "issue_title", description: "Issue title" },
221
+ { name: "bot_name", description: "GitHub bot username" },
222
+ { name: "sender_login", description: "Event sender login" },
223
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
224
+ { name: "issue_url", description: "Issue HTML URL" },
225
+ { name: "context", description: "Issue body or title as context" },
226
+ ],
227
+ category: "event",
228
+ });
229
+
230
+ registerTemplate({
231
+ eventType: "github.issue.mentioned",
232
+ header: "[GitHub Issue #{{issue_number}}] {{issue_title}}",
233
+ defaultBody: `From: {{sender_login}}
234
+ Repo: {{repo_full_name}}
235
+ URL: {{issue_url}}
236
+
237
+ Context:
238
+ {{context}}
239
+
240
+ ---
241
+ {{@template[common.delegation_instruction]}}
242
+ {{@template[common.command_suggestions.github_issue]}}`,
243
+ variables: [
244
+ { name: "issue_number", description: "Issue number" },
245
+ { name: "issue_title", description: "Issue title" },
246
+ { name: "sender_login", description: "Event sender login" },
247
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
248
+ { name: "issue_url", description: "Issue HTML URL" },
249
+ { name: "context", description: "Extracted mention context or issue title" },
250
+ ],
251
+ category: "event",
252
+ });
253
+
254
+ // ============================================================================
255
+ // Comment events
256
+ // ============================================================================
257
+
258
+ registerTemplate({
259
+ eventType: "github.comment.mentioned",
260
+ header: "[GitHub {{target_type}} #{{target_number}} Comment] {{target_title}}",
261
+ defaultBody: `From: {{sender_login}}
262
+ Repo: {{repo_full_name}}
263
+ URL: {{comment_url}}
264
+
265
+ Comment:
266
+ {{context}}
267
+
268
+ ---
269
+ {{related_task_section}}{{@template[common.delegation_instruction]}}
270
+ {{command_suggestions}}`,
271
+ variables: [
272
+ { name: "target_type", description: "PR or Issue" },
273
+ { name: "target_number", description: "PR or issue number" },
274
+ { name: "target_title", description: "PR or issue title" },
275
+ { name: "sender_login", description: "Event sender login" },
276
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
277
+ { name: "comment_url", description: "Comment HTML URL" },
278
+ { name: "context", description: "Extracted mention context from comment" },
279
+ {
280
+ name: "related_task_section",
281
+ description: "Related task info with routing hint, or empty string if no related task",
282
+ },
283
+ { name: "command_suggestions", description: "Context-appropriate command suggestions" },
284
+ ],
285
+ category: "event",
286
+ });
287
+
288
+ // ============================================================================
289
+ // Pull Request Review events
290
+ // ============================================================================
291
+
292
+ registerTemplate({
293
+ eventType: "github.pull_request.review_submitted",
294
+ header: "{{review_emoji}} [GitHub PR #{{pr_number}} Review] {{review_label}}",
295
+ defaultBody: `PR: {{pr_title}}
296
+ Reviewer: {{sender_login}}
297
+ Repo: {{repo_full_name}}
298
+ URL: {{review_url}}{{review_body_section}}
299
+
300
+ ---
301
+ {{related_task_section}}{{@template[common.delegation_instruction]}}
302
+ {{review_suggestions}}`,
303
+ variables: [
304
+ { name: "review_emoji", description: "Emoji for review state" },
305
+ { name: "pr_number", description: "Pull request number" },
306
+ { name: "review_label", description: "Review state label (APPROVED, CHANGES REQUESTED, etc.)" },
307
+ { name: "pr_title", description: "Pull request title" },
308
+ { name: "sender_login", description: "Reviewer login" },
309
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
310
+ { name: "review_url", description: "Review HTML URL" },
311
+ { name: "review_body_section", description: "Review comment section or empty string" },
312
+ { name: "related_task_section", description: "Related task info or empty string" },
313
+ { name: "review_suggestions", description: "Context-appropriate review suggestion" },
314
+ ],
315
+ category: "event",
316
+ });
317
+
318
+ // ============================================================================
319
+ // CI events
320
+ // ============================================================================
321
+
322
+ registerTemplate({
323
+ eventType: "github.check_run.failed",
324
+ header: "{{conclusion_emoji}} [GitHub PR #{{pr_number}} CI] {{check_name}} {{conclusion_label}}",
325
+ defaultBody: `Repo: {{repo_full_name}}
326
+ Check: {{check_name}}
327
+ URL: {{check_url}}{{output_summary_section}}
328
+
329
+ ---
330
+ Related task: {{related_task_id}}
331
+ \ud83d\udd00 Consider routing to the same agent working on the related task.
332
+ \ud83d\udca1 CI check failed. Review the logs and fix the issue.`,
333
+ variables: [
334
+ { name: "conclusion_emoji", description: "Emoji for check conclusion" },
335
+ { name: "pr_number", description: "Pull request number" },
336
+ { name: "check_name", description: "Check run name" },
337
+ { name: "conclusion_label", description: "Conclusion label (FAILED, ACTION REQUIRED, etc.)" },
338
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
339
+ { name: "check_url", description: "Check run HTML URL" },
340
+ { name: "output_summary_section", description: "Output summary section or empty string" },
341
+ { name: "related_task_id", description: "ID of the related existing task" },
342
+ ],
343
+ category: "event",
344
+ });
345
+
346
+ registerTemplate({
347
+ eventType: "github.check_suite.failed",
348
+ header: "{{conclusion_emoji}} [GitHub PR #{{pr_number}} CI Suite] {{conclusion_label}}",
349
+ defaultBody: `Repo: {{repo_full_name}}
350
+ Branch: {{branch}}
351
+ Commit: {{head_sha_short}}
352
+
353
+ ---
354
+ Related task: {{related_task_id}}
355
+ \ud83d\udd00 Consider routing to the same agent working on the related task.
356
+ \ud83d\udca1 CI suite failed. Check individual check runs for details.`,
357
+ variables: [
358
+ { name: "conclusion_emoji", description: "Emoji for check conclusion" },
359
+ { name: "pr_number", description: "Pull request number" },
360
+ { name: "conclusion_label", description: "Conclusion label" },
361
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
362
+ { name: "branch", description: "Head branch name" },
363
+ { name: "head_sha_short", description: "Short HEAD SHA (7 chars)" },
364
+ { name: "related_task_id", description: "ID of the related existing task" },
365
+ ],
366
+ category: "event",
367
+ });
368
+
369
+ registerTemplate({
370
+ eventType: "github.workflow_run.failed",
371
+ header:
372
+ "{{conclusion_emoji}} [GitHub PR #{{pr_number}} Workflow] {{workflow_run_name}} {{conclusion_label}}",
373
+ defaultBody: `Repo: {{repo_full_name}}
374
+ Workflow: {{workflow_name}}
375
+ Run #{{run_number}}
376
+ Branch: {{head_branch}}
377
+ Triggered by: {{trigger_event}}
378
+ Logs: {{logs_url}}
379
+
380
+ ---
381
+ Related task: {{related_task_id}}
382
+ \ud83d\udd00 Consider routing to the same agent working on the related task.
383
+ \ud83d\udca1 Workflow failed. Click the logs URL above to see what went wrong and fix the issue.`,
384
+ variables: [
385
+ { name: "conclusion_emoji", description: "Emoji for check conclusion" },
386
+ { name: "pr_number", description: "Pull request number" },
387
+ { name: "workflow_run_name", description: "Workflow run name" },
388
+ { name: "conclusion_label", description: "Conclusion label" },
389
+ { name: "repo_full_name", description: "Repository full name (owner/repo)" },
390
+ { name: "workflow_name", description: "Workflow name" },
391
+ { name: "run_number", description: "Workflow run number" },
392
+ { name: "head_branch", description: "Head branch name" },
393
+ { name: "trigger_event", description: "Event that triggered the workflow" },
394
+ { name: "logs_url", description: "Workflow run logs URL" },
395
+ { name: "related_task_id", description: "ID of the related existing task" },
396
+ ],
397
+ category: "event",
398
+ });
@@ -17,6 +17,7 @@ export interface PullRequestEvent extends GitHubWebhookEvent {
17
17
  base: { ref: string };
18
18
  merged: boolean;
19
19
  merged_by?: { login: string };
20
+ changed_files?: number;
20
21
  };
21
22
  requested_reviewer?: { login: string; id: number }; // Added for review_requested/review_request_removed events
22
23
  }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * GitLab Authentication & Webhook Verification
3
+ *
4
+ * GitLab uses a simple shared-secret token for webhook verification
5
+ * (X-Gitlab-Token header) and PAT/Group Access Token for API calls.
6
+ */
7
+
8
+ let initialized = false;
9
+ let webhookSecret: string | null = null;
10
+ let apiToken: string | null = null;
11
+ let gitlabUrl: string = "https://gitlab.com";
12
+
13
+ export function isGitLabEnabled(): boolean {
14
+ return !!process.env.GITLAB_WEBHOOK_SECRET && process.env.GITLAB_DISABLE !== "true";
15
+ }
16
+
17
+ export function initGitLab(): void {
18
+ if (initialized) return;
19
+ if (!isGitLabEnabled()) {
20
+ console.log("[GitLab] Integration disabled (GITLAB_WEBHOOK_SECRET not set)");
21
+ return;
22
+ }
23
+
24
+ webhookSecret = process.env.GITLAB_WEBHOOK_SECRET!;
25
+ apiToken = process.env.GITLAB_TOKEN ?? null;
26
+ gitlabUrl = process.env.GITLAB_URL ?? "https://gitlab.com";
27
+ initialized = true;
28
+
29
+ console.log(`[GitLab] Integration initialized (url: ${gitlabUrl})`);
30
+ }
31
+
32
+ /**
33
+ * Verify a GitLab webhook request.
34
+ * GitLab uses simple string comparison of X-Gitlab-Token header against the configured secret.
35
+ */
36
+ export function verifyGitLabWebhook(tokenHeader: string | undefined): boolean {
37
+ if (!webhookSecret) return false;
38
+ if (!tokenHeader) return false;
39
+ // timingSafeEqual throws on different lengths, so guard first
40
+ if (tokenHeader.length !== webhookSecret.length) return false;
41
+ return crypto.timingSafeEqual(Buffer.from(tokenHeader), Buffer.from(webhookSecret));
42
+ }
43
+
44
+ /** Get the GitLab API token for making API calls. */
45
+ export function getGitLabToken(): string | null {
46
+ return apiToken;
47
+ }
48
+
49
+ /** Get the configured GitLab base URL. */
50
+ export function getGitLabUrl(): string {
51
+ return gitlabUrl;
52
+ }
53
+
54
+ /** Bot name for mention detection. */
55
+ export const GITLAB_BOT_NAME = process.env.GITLAB_BOT_NAME ?? "agent-swarm-bot";
56
+
57
+ /** Reset state for testing. */
58
+ export function resetGitLab(): void {
59
+ initialized = false;
60
+ webhookSecret = null;
61
+ apiToken = null;
62
+ gitlabUrl = "https://gitlab.com";
63
+ }