@desplega.ai/agent-swarm 1.49.0 → 1.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (547) hide show
  1. package/README.md +1 -1
  2. package/openapi.json +2070 -728
  3. package/package.json +10 -1
  4. package/src/agentmail/handlers.ts +65 -10
  5. package/src/agentmail/templates.ts +111 -0
  6. package/src/be/db.ts +1233 -7
  7. package/src/be/migrations/014_prompt_templates.sql +33 -0
  8. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  9. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  10. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  11. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  12. package/src/be/migrations/019_skills.sql +65 -0
  13. package/src/be/migrations/020_approval_requests.sql +41 -0
  14. package/src/be/seed.ts +62 -0
  15. package/src/be/skill-parser.ts +70 -0
  16. package/src/be/skill-sync.ts +106 -0
  17. package/src/commands/runner.ts +320 -132
  18. package/src/commands/templates.ts +172 -0
  19. package/src/github/handlers.ts +292 -77
  20. package/src/github/mentions-aliases.test.ts +73 -0
  21. package/src/github/mentions.test.ts +3 -3
  22. package/src/github/mentions.ts +32 -6
  23. package/src/github/templates.ts +398 -0
  24. package/src/gitlab/handlers.ts +63 -22
  25. package/src/gitlab/templates.ts +140 -0
  26. package/src/heartbeat/heartbeat.ts +19 -10
  27. package/src/heartbeat/templates.ts +30 -0
  28. package/src/http/active-sessions.ts +27 -0
  29. package/src/http/approval-requests.ts +247 -0
  30. package/src/http/config.ts +3 -3
  31. package/src/http/index.ts +9 -2
  32. package/src/http/poll.ts +135 -14
  33. package/src/http/prompt-templates.ts +412 -0
  34. package/src/http/schedules.ts +35 -0
  35. package/src/http/skills.ts +479 -0
  36. package/src/http/workflows.ts +8 -0
  37. package/src/linear/sync.ts +28 -4
  38. package/src/linear/templates.ts +47 -0
  39. package/src/prompts/base-prompt.ts +41 -490
  40. package/src/prompts/registry.ts +57 -0
  41. package/src/prompts/resolver.ts +296 -0
  42. package/src/prompts/session-templates.ts +604 -0
  43. package/src/providers/claude-adapter.ts +15 -2
  44. package/src/providers/pi-mono-extension.ts +5 -1
  45. package/src/scheduler/scheduler.ts +125 -91
  46. package/src/server.ts +44 -0
  47. package/src/slack/assistant.ts +7 -4
  48. package/src/slack/channel-activity.ts +177 -0
  49. package/src/slack/handlers.ts +21 -6
  50. package/src/slack/templates.ts +55 -0
  51. package/src/tests/approval-requests.test.ts +735 -0
  52. package/src/tests/artifact-sdk.test.ts +12 -12
  53. package/src/tests/base-prompt.test.ts +49 -49
  54. package/src/tests/channel-activity.test.ts +363 -0
  55. package/src/tests/heartbeat.test.ts +1 -0
  56. package/src/tests/linear-webhook.test.ts +7 -3
  57. package/src/tests/pool-session-logs.test.ts +199 -0
  58. package/src/tests/prompt-template-github.test.ts +682 -0
  59. package/src/tests/prompt-template-remaining.test.ts +504 -0
  60. package/src/tests/prompt-template-resolver.test.ts +621 -0
  61. package/src/tests/prompt-template-session.test.ts +363 -0
  62. package/src/tests/prompt-templates-db.test.ts +616 -0
  63. package/src/tests/self-improvement.test.ts +8 -7
  64. package/src/tests/skill-parser.test.ts +178 -0
  65. package/src/tests/skill-sync.test.ts +171 -0
  66. package/src/tests/slack-metadata-inheritance.test.ts +1 -1
  67. package/src/tests/slack-thread-followups.test.ts +1 -1
  68. package/src/tests/structured-output.test.ts +0 -4
  69. package/src/tests/tool-annotations.test.ts +2 -1
  70. package/src/tests/update-profile-agentid.test.ts +248 -0
  71. package/src/tests/update-profile-auth.test.ts +195 -0
  72. package/src/tests/workflow-async-v2.test.ts +126 -4
  73. package/src/tests/workflow-definition-validation.test.ts +76 -0
  74. package/src/tests/workflow-executors.test.ts +4 -2
  75. package/src/tests/workflow-retry-v2.test.ts +1 -1
  76. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  77. package/src/tests/workflow-workspace.test.ts +272 -0
  78. package/src/tools/prompt-templates/delete.ts +86 -0
  79. package/src/tools/prompt-templates/get.ts +89 -0
  80. package/src/tools/prompt-templates/index.ts +5 -0
  81. package/src/tools/prompt-templates/list.ts +95 -0
  82. package/src/tools/prompt-templates/preview.ts +84 -0
  83. package/src/tools/prompt-templates/set.ts +117 -0
  84. package/src/tools/request-human-input.ts +106 -0
  85. package/src/tools/skills/index.ts +11 -0
  86. package/src/tools/skills/skill-create.ts +105 -0
  87. package/src/tools/skills/skill-delete.ts +67 -0
  88. package/src/tools/skills/skill-get.ts +75 -0
  89. package/src/tools/skills/skill-install-remote.ts +152 -0
  90. package/src/tools/skills/skill-install.ts +101 -0
  91. package/src/tools/skills/skill-list.ts +77 -0
  92. package/src/tools/skills/skill-publish.ts +123 -0
  93. package/src/tools/skills/skill-search.ts +43 -0
  94. package/src/tools/skills/skill-sync-remote.ts +128 -0
  95. package/src/tools/skills/skill-uninstall.ts +60 -0
  96. package/src/tools/skills/skill-update.ts +128 -0
  97. package/src/tools/store-progress.ts +22 -4
  98. package/src/tools/task-action.ts +20 -0
  99. package/src/tools/templates.ts +53 -0
  100. package/src/tools/tool-config.ts +23 -0
  101. package/src/tools/update-profile.ts +106 -34
  102. package/src/tools/workflows/create-workflow.ts +19 -1
  103. package/src/tools/workflows/update-workflow.ts +16 -1
  104. package/src/types.ts +109 -2
  105. package/src/workflows/definition.ts +30 -12
  106. package/src/workflows/engine.ts +40 -14
  107. package/src/workflows/executors/agent-task.ts +14 -3
  108. package/src/workflows/executors/human-in-the-loop.ts +160 -0
  109. package/src/workflows/executors/registry.ts +2 -0
  110. package/src/workflows/index.ts +1 -1
  111. package/src/workflows/recovery.ts +72 -0
  112. package/src/workflows/resume.ts +162 -12
  113. package/src/workflows/triggers.ts +31 -2
  114. package/src/workflows/version.ts +2 -0
  115. package/.claude/settings.json +0 -84
  116. package/.claude/settings.local.json +0 -117
  117. package/.dockerignore +0 -61
  118. package/.editorconfig +0 -15
  119. package/.entire/settings.json +0 -4
  120. package/.env.docker.example +0 -56
  121. package/.env.example +0 -78
  122. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
  123. package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
  124. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  125. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
  126. package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
  127. package/.github/workflows/ci.yml +0 -52
  128. package/.github/workflows/docker-and-deploy.yml +0 -132
  129. package/.github/workflows/merge-gate.yml +0 -233
  130. package/.opencode/plugins/entire.ts +0 -133
  131. package/.superset/config.json +0 -6
  132. package/.wts-config.json +0 -4
  133. package/.wts-setup.ts +0 -171
  134. package/CHANGELOG.md +0 -447
  135. package/CLAUDE.md +0 -521
  136. package/CONTRIBUTING.md +0 -315
  137. package/DEPLOYMENT.md +0 -622
  138. package/Dockerfile +0 -65
  139. package/Dockerfile.worker +0 -189
  140. package/MCP.md +0 -841
  141. package/UI.md +0 -40
  142. package/api-entrypoint.sh +0 -56
  143. package/assets/agent-swarm-logo-orange.png +0 -0
  144. package/assets/agent-swarm-logo.png +0 -0
  145. package/assets/agent-swarm.mp4 +0 -0
  146. package/assets/agent-swarm.png +0 -0
  147. package/biome.json +0 -39
  148. package/deploy/DEPLOY.md +0 -60
  149. package/deploy/agent-swarm.service +0 -17
  150. package/deploy/docker-push.ts +0 -30
  151. package/deploy/install.ts +0 -85
  152. package/deploy/prod-db.ts +0 -42
  153. package/deploy/uninstall.ts +0 -12
  154. package/deploy/update.ts +0 -21
  155. package/depot.json +0 -1
  156. package/docker-compose.example.yml +0 -350
  157. package/docker-compose.local.yml +0 -119
  158. package/docker-entrypoint.sh +0 -632
  159. package/docs-site/app/api/search/route.ts +0 -4
  160. package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
  161. package/docs-site/app/docs/layout.tsx +0 -12
  162. package/docs-site/app/globals.css +0 -24
  163. package/docs-site/app/layout.config.tsx +0 -34
  164. package/docs-site/app/layout.tsx +0 -119
  165. package/docs-site/app/llms-full.txt/route.ts +0 -11
  166. package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
  167. package/docs-site/app/llms.txt/route.ts +0 -8
  168. package/docs-site/app/page.tsx +0 -5
  169. package/docs-site/app/robots.ts +0 -13
  170. package/docs-site/app/sitemap.ts +0 -37
  171. package/docs-site/components/api-page.client.tsx +0 -4
  172. package/docs-site/components/api-page.tsx +0 -7
  173. package/docs-site/components/mdx/mermaid.tsx +0 -55
  174. package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
  175. package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
  176. package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
  177. package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
  178. package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
  179. package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
  180. package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
  181. package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
  182. package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
  183. package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
  184. package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
  185. package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
  186. package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
  187. package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
  188. package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
  189. package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
  190. package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
  191. package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
  192. package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
  193. package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
  194. package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
  195. package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
  196. package/docs-site/content/docs/(documentation)/index.mdx +0 -65
  197. package/docs-site/content/docs/(documentation)/meta.json +0 -19
  198. package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
  199. package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
  200. package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
  201. package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
  202. package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
  203. package/docs-site/content/docs/api-reference/agents.mdx +0 -9
  204. package/docs-site/content/docs/api-reference/channels.mdx +0 -9
  205. package/docs-site/content/docs/api-reference/config.mdx +0 -9
  206. package/docs-site/content/docs/api-reference/debug.mdx +0 -9
  207. package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
  208. package/docs-site/content/docs/api-reference/epics.mdx +0 -9
  209. package/docs-site/content/docs/api-reference/index.mdx +0 -32
  210. package/docs-site/content/docs/api-reference/memory.mdx +0 -9
  211. package/docs-site/content/docs/api-reference/meta.json +0 -25
  212. package/docs-site/content/docs/api-reference/poll.mdx +0 -9
  213. package/docs-site/content/docs/api-reference/repos.mdx +0 -9
  214. package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
  215. package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
  216. package/docs-site/content/docs/api-reference/stats.mdx +0 -9
  217. package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
  218. package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
  219. package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
  220. package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
  221. package/docs-site/content/docs/meta.json +0 -3
  222. package/docs-site/lib/get-llm-text.ts +0 -10
  223. package/docs-site/lib/openapi.ts +0 -23
  224. package/docs-site/lib/source.ts +0 -8
  225. package/docs-site/mdx-components.tsx +0 -13
  226. package/docs-site/next.config.mjs +0 -29
  227. package/docs-site/package.json +0 -35
  228. package/docs-site/pnpm-lock.yaml +0 -5407
  229. package/docs-site/postcss.config.mjs +0 -8
  230. package/docs-site/public/logo.png +0 -0
  231. package/docs-site/scripts/generate-docs.ts +0 -171
  232. package/docs-site/source.config.ts +0 -17
  233. package/docs-site/tsconfig.json +0 -46
  234. package/ecosystem.config.cjs +0 -66
  235. package/landing/next.config.ts +0 -14
  236. package/landing/package.json +0 -31
  237. package/landing/pnpm-lock.yaml +0 -1091
  238. package/landing/postcss.config.mjs +0 -8
  239. package/landing/public/apple-touch-icon.png +0 -0
  240. package/landing/public/favicon.ico +0 -0
  241. package/landing/public/logo.png +0 -0
  242. package/landing/public/og-image.png +0 -0
  243. package/landing/public/omghost-desplega.svg +0 -30
  244. package/landing/public/omghost-openfort.svg +0 -9
  245. package/landing/src/app/actions/waitlist.ts +0 -25
  246. package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
  247. package/landing/src/app/blog/page.tsx +0 -162
  248. package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
  249. package/landing/src/app/examples/page.tsx +0 -174
  250. package/landing/src/app/examples/x402/page.tsx +0 -456
  251. package/landing/src/app/globals.css +0 -122
  252. package/landing/src/app/layout.tsx +0 -134
  253. package/landing/src/app/page.tsx +0 -27
  254. package/landing/src/app/robots.ts +0 -13
  255. package/landing/src/app/sitemap.ts +0 -44
  256. package/landing/src/components/architecture.tsx +0 -163
  257. package/landing/src/components/cta.tsx +0 -52
  258. package/landing/src/components/features.tsx +0 -160
  259. package/landing/src/components/footer.tsx +0 -100
  260. package/landing/src/components/hero.tsx +0 -217
  261. package/landing/src/components/how-it-works.tsx +0 -165
  262. package/landing/src/components/navbar.tsx +0 -147
  263. package/landing/src/components/waitlist.tsx +0 -110
  264. package/landing/src/components/why-choose.tsx +0 -149
  265. package/landing/src/components/workshops.tsx +0 -328
  266. package/landing/src/lib/utils.ts +0 -6
  267. package/landing/tsconfig.json +0 -41
  268. package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
  269. package/new-ui/CLAUDE.md +0 -92
  270. package/new-ui/README.md +0 -73
  271. package/new-ui/biome.json +0 -42
  272. package/new-ui/components.json +0 -21
  273. package/new-ui/index.html +0 -25
  274. package/new-ui/package.json +0 -49
  275. package/new-ui/pnpm-lock.yaml +0 -4845
  276. package/new-ui/public/logo.png +0 -0
  277. package/new-ui/src/api/client.ts +0 -814
  278. package/new-ui/src/api/hooks/index.ts +0 -64
  279. package/new-ui/src/api/hooks/use-agents.ts +0 -58
  280. package/new-ui/src/api/hooks/use-channels.ts +0 -115
  281. package/new-ui/src/api/hooks/use-config-api.ts +0 -46
  282. package/new-ui/src/api/hooks/use-costs.ts +0 -122
  283. package/new-ui/src/api/hooks/use-db-query.ts +0 -29
  284. package/new-ui/src/api/hooks/use-epics.ts +0 -75
  285. package/new-ui/src/api/hooks/use-repos.ts +0 -61
  286. package/new-ui/src/api/hooks/use-schedules.ts +0 -81
  287. package/new-ui/src/api/hooks/use-services.ts +0 -16
  288. package/new-ui/src/api/hooks/use-stats.ts +0 -27
  289. package/new-ui/src/api/hooks/use-tasks.ts +0 -89
  290. package/new-ui/src/api/hooks/use-workflows.ts +0 -109
  291. package/new-ui/src/api/types.ts +0 -549
  292. package/new-ui/src/app/App.tsx +0 -13
  293. package/new-ui/src/app/providers.tsx +0 -32
  294. package/new-ui/src/app/router.tsx +0 -52
  295. package/new-ui/src/components/layout/app-header.tsx +0 -47
  296. package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
  297. package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
  298. package/new-ui/src/components/layout/config-guard.tsx +0 -22
  299. package/new-ui/src/components/layout/root-layout.tsx +0 -40
  300. package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
  301. package/new-ui/src/components/shared/command-menu.tsx +0 -131
  302. package/new-ui/src/components/shared/data-grid.tsx +0 -141
  303. package/new-ui/src/components/shared/empty-state.tsx +0 -24
  304. package/new-ui/src/components/shared/error-boundary.tsx +0 -72
  305. package/new-ui/src/components/shared/json-viewer.tsx +0 -47
  306. package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
  307. package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
  308. package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
  309. package/new-ui/src/components/shared/stats-bar.tsx +0 -132
  310. package/new-ui/src/components/shared/status-badge.tsx +0 -131
  311. package/new-ui/src/components/shared/usage-summary.tsx +0 -179
  312. package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
  313. package/new-ui/src/components/ui/alert.tsx +0 -60
  314. package/new-ui/src/components/ui/avatar.tsx +0 -96
  315. package/new-ui/src/components/ui/badge.tsx +0 -46
  316. package/new-ui/src/components/ui/button.tsx +0 -62
  317. package/new-ui/src/components/ui/card.tsx +0 -75
  318. package/new-ui/src/components/ui/command.tsx +0 -160
  319. package/new-ui/src/components/ui/dialog.tsx +0 -143
  320. package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
  321. package/new-ui/src/components/ui/input.tsx +0 -21
  322. package/new-ui/src/components/ui/label.tsx +0 -19
  323. package/new-ui/src/components/ui/progress.tsx +0 -26
  324. package/new-ui/src/components/ui/scroll-area.tsx +0 -54
  325. package/new-ui/src/components/ui/select.tsx +0 -175
  326. package/new-ui/src/components/ui/separator.tsx +0 -28
  327. package/new-ui/src/components/ui/sheet.tsx +0 -132
  328. package/new-ui/src/components/ui/sidebar.tsx +0 -691
  329. package/new-ui/src/components/ui/skeleton.tsx +0 -13
  330. package/new-ui/src/components/ui/sonner.tsx +0 -35
  331. package/new-ui/src/components/ui/switch.tsx +0 -33
  332. package/new-ui/src/components/ui/table.tsx +0 -92
  333. package/new-ui/src/components/ui/tabs.tsx +0 -79
  334. package/new-ui/src/components/ui/textarea.tsx +0 -18
  335. package/new-ui/src/components/ui/tooltip.tsx +0 -51
  336. package/new-ui/src/components/workflows/action-node.tsx +0 -53
  337. package/new-ui/src/components/workflows/condition-node.tsx +0 -50
  338. package/new-ui/src/components/workflows/graph-utils.ts +0 -124
  339. package/new-ui/src/components/workflows/json-tree.tsx +0 -189
  340. package/new-ui/src/components/workflows/node-styles.ts +0 -10
  341. package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
  342. package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
  343. package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
  344. package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
  345. package/new-ui/src/hooks/use-config.ts +0 -203
  346. package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
  347. package/new-ui/src/hooks/use-mobile.ts +0 -19
  348. package/new-ui/src/hooks/use-theme.ts +0 -60
  349. package/new-ui/src/lib/config.ts +0 -188
  350. package/new-ui/src/lib/slugs.ts +0 -71
  351. package/new-ui/src/lib/utils.ts +0 -120
  352. package/new-ui/src/main.tsx +0 -11
  353. package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
  354. package/new-ui/src/pages/agents/page.tsx +0 -134
  355. package/new-ui/src/pages/chat/page.tsx +0 -674
  356. package/new-ui/src/pages/config/page.tsx +0 -1109
  357. package/new-ui/src/pages/dashboard/page.tsx +0 -454
  358. package/new-ui/src/pages/debug/page.tsx +0 -275
  359. package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
  360. package/new-ui/src/pages/epics/page.tsx +0 -321
  361. package/new-ui/src/pages/not-found/page.tsx +0 -18
  362. package/new-ui/src/pages/repos/page.tsx +0 -369
  363. package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
  364. package/new-ui/src/pages/schedules/page.tsx +0 -477
  365. package/new-ui/src/pages/services/page.tsx +0 -128
  366. package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
  367. package/new-ui/src/pages/tasks/page.tsx +0 -592
  368. package/new-ui/src/pages/usage/page.tsx +0 -195
  369. package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
  370. package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
  371. package/new-ui/src/pages/workflows/page.tsx +0 -266
  372. package/new-ui/src/styles/ag-grid.css +0 -36
  373. package/new-ui/src/styles/globals.css +0 -213
  374. package/new-ui/test-results/.last-run.json +0 -4
  375. package/new-ui/tsconfig.app.json +0 -34
  376. package/new-ui/tsconfig.json +0 -4
  377. package/new-ui/tsconfig.node.json +0 -26
  378. package/new-ui/vercel.json +0 -4
  379. package/new-ui/vite.config.ts +0 -28
  380. package/plugin/README.md +0 -1
  381. package/plugin/build-pi-skills.ts +0 -233
  382. package/plugin/hooks/hooks.json +0 -71
  383. package/prek.toml +0 -75
  384. package/pyproject.toml +0 -9
  385. package/scripts/check-db-boundary.sh +0 -60
  386. package/scripts/e2e-docker-provider.ts +0 -820
  387. package/scripts/e2e-io-schemas-test.ts +0 -807
  388. package/scripts/e2e-provider-test.ts +0 -220
  389. package/scripts/e2e-workflow-redesign.sh +0 -229
  390. package/scripts/e2e-workflow-test.sh +0 -285
  391. package/scripts/e2e-workflow-test.ts +0 -857
  392. package/scripts/generate-mcp-docs.ts +0 -415
  393. package/scripts/generate-openapi.ts +0 -26
  394. package/scripts/measure-tool-tokens.ts +0 -118
  395. package/scripts/x402-e2e-test.ts +0 -195
  396. package/scripts/x402-test-server.ts +0 -236
  397. package/scripts/x402-testnet-e2e.ts +0 -668
  398. package/slack-manifest.json +0 -88
  399. package/templates-ui/README.md +0 -46
  400. package/templates-ui/components.json +0 -17
  401. package/templates-ui/eslint.config.mjs +0 -18
  402. package/templates-ui/next.config.ts +0 -7
  403. package/templates-ui/package.json +0 -35
  404. package/templates-ui/pnpm-lock.yaml +0 -4571
  405. package/templates-ui/postcss.config.mjs +0 -7
  406. package/templates-ui/public/file.svg +0 -1
  407. package/templates-ui/public/globe.svg +0 -1
  408. package/templates-ui/public/logo.png +0 -0
  409. package/templates-ui/public/next.svg +0 -1
  410. package/templates-ui/public/vercel.svg +0 -1
  411. package/templates-ui/public/window.svg +0 -1
  412. package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
  413. package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
  414. package/templates-ui/src/app/api/templates/route.ts +0 -18
  415. package/templates-ui/src/app/builder/page.tsx +0 -37
  416. package/templates-ui/src/app/globals.css +0 -94
  417. package/templates-ui/src/app/layout.tsx +0 -79
  418. package/templates-ui/src/app/page.tsx +0 -38
  419. package/templates-ui/src/app/robots.ts +0 -11
  420. package/templates-ui/src/app/sitemap.ts +0 -31
  421. package/templates-ui/src/components/compose-builder.tsx +0 -442
  422. package/templates-ui/src/components/compose-preview.tsx +0 -117
  423. package/templates-ui/src/components/file-preview.tsx +0 -77
  424. package/templates-ui/src/components/footer.tsx +0 -40
  425. package/templates-ui/src/components/header.tsx +0 -41
  426. package/templates-ui/src/components/template-card.tsx +0 -87
  427. package/templates-ui/src/components/template-detail.tsx +0 -125
  428. package/templates-ui/src/components/template-gallery.tsx +0 -263
  429. package/templates-ui/src/components/ui/badge.tsx +0 -36
  430. package/templates-ui/src/components/ui/button.tsx +0 -57
  431. package/templates-ui/src/components/ui/card.tsx +0 -76
  432. package/templates-ui/src/components/ui/separator.tsx +0 -31
  433. package/templates-ui/src/components/ui/tooltip.tsx +0 -32
  434. package/templates-ui/src/lib/compose-generator.ts +0 -241
  435. package/templates-ui/src/lib/templates.ts +0 -137
  436. package/templates-ui/src/lib/utils.ts +0 -6
  437. package/templates-ui/tsconfig.json +0 -34
  438. package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
  439. package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
  440. package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
  441. package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
  442. package/thoughts/shared/plans/.gitkeep +0 -0
  443. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  444. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  445. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  446. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  447. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  448. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  449. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  450. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  451. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  452. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  453. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  454. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  455. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  456. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  457. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  458. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  459. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  460. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  461. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  462. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  463. package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
  464. package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
  465. package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
  466. package/thoughts/shared/research/.gitkeep +0 -0
  467. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  468. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  469. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  470. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  471. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  472. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  473. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  474. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  475. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  476. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  477. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  478. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  479. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  480. package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
  481. package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
  482. package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
  483. package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
  484. package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
  485. package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
  486. package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
  487. package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
  488. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  489. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  490. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  491. package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
  492. package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
  493. package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
  494. package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
  495. package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
  496. package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
  497. package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
  498. package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
  499. package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
  500. package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
  501. package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
  502. package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
  503. package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
  504. package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
  505. package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
  506. package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
  507. package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
  508. package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
  509. package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
  510. package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
  511. package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
  512. package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
  513. package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
  514. package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
  515. package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
  516. package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
  517. package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
  518. package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
  519. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  520. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  521. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  522. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  523. package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
  524. package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
  525. package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
  526. package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
  527. package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
  528. package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
  529. package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
  530. package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
  531. package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
  532. package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
  533. package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
  534. package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
  535. package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
  536. package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
  537. package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
  538. package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
  539. package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
  540. package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
  541. package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
  542. package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
  543. package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
  544. package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
  545. package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
  546. package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
  547. package/tsconfig.json +0 -37
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Runner trigger prompt template definitions.
3
+ *
4
+ * Each template is registered at module load time via registerTemplate().
5
+ * The runner imports this module for the side-effect of registration.
6
+ *
7
+ * Note: These templates use {{variable}} syntax. The fmt() function for
8
+ * slash commands is pre-applied before template resolution (passed as a variable).
9
+ */
10
+
11
+ import { registerTemplate } from "../prompts/registry";
12
+
13
+ // ============================================================================
14
+ // Task trigger prompts
15
+ // ============================================================================
16
+
17
+ registerTemplate({
18
+ eventType: "task.trigger.assigned",
19
+ header: "",
20
+ defaultBody: `{{work_on_task_cmd}} {{task_id}}{{task_desc_section}}{{output_instructions}}`,
21
+ variables: [
22
+ { name: "work_on_task_cmd", description: "Formatted /work-on-task command" },
23
+ { name: "task_id", description: "Task ID" },
24
+ { name: "task_desc_section", description: "Task description section or empty string" },
25
+ {
26
+ name: "output_instructions",
27
+ description:
28
+ "Output format instructions (with outputSchema if present, or generic store-progress)",
29
+ },
30
+ ],
31
+ category: "task_lifecycle",
32
+ });
33
+
34
+ registerTemplate({
35
+ eventType: "task.trigger.offered",
36
+ header: "",
37
+ defaultBody: `{{review_offered_task_cmd}} {{task_id}}{{task_desc_section}}
38
+
39
+ Accept if you have capacity and skills. Reject with a reason if you cannot handle it.`,
40
+ variables: [
41
+ { name: "review_offered_task_cmd", description: "Formatted /review-offered-task command" },
42
+ { name: "task_id", description: "Task ID" },
43
+ { name: "task_desc_section", description: "Task description section or empty string" },
44
+ ],
45
+ category: "task_lifecycle",
46
+ });
47
+
48
+ registerTemplate({
49
+ eventType: "task.trigger.unread_mentions",
50
+ header: "",
51
+ defaultBody: `You have {{mention_count}} mention(s) in chat channels.
52
+
53
+ 1. Use \`read-messages\` with unreadOnly: true to see them
54
+ 2. Respond to questions or requests directed at you
55
+ 3. If a message requires work, create a task using \`send-task\``,
56
+ variables: [{ name: "mention_count", description: "Number of unread mentions or 'unread'" }],
57
+ category: "task_lifecycle",
58
+ });
59
+
60
+ registerTemplate({
61
+ eventType: "task.trigger.pool_available",
62
+ header: "",
63
+ defaultBody: `{{task_count}} task(s) available in the pool.
64
+
65
+ 1. Run \`get-tasks\` with unassigned: true to browse
66
+ 2. Pick one matching your skills
67
+ 3. Run \`task-action\` with action: "claim" and taskId: "<id>"
68
+
69
+ Note: Claims are first-come-first-serve. If claim fails, pick another.`,
70
+ variables: [{ name: "task_count", description: "Number of available pool tasks" }],
71
+ category: "task_lifecycle",
72
+ });
73
+
74
+ registerTemplate({
75
+ eventType: "task.trigger.epic_progress",
76
+ header: "",
77
+ defaultBody: `## Epic Progress Update
78
+
79
+ {{epic_count}} epic(s) have progress updates:
80
+
81
+ {{epics_detail}}
82
+ ## Your Task: Plan Next Steps
83
+
84
+ For each epic:
85
+ 1. **Review** the completed work and any failures
86
+ 2. **Determine** if the epic goal is met (progress = 100% and all tasks succeeded)
87
+ 3. **If complete:** Use \`update-epic\` to mark status as "completed"
88
+ 4. **If not complete:**
89
+ - Retry failed tasks with \`send-task\` (reassign or modify)
90
+ - Create new tasks for remaining work with \`send-task\` (include epicId)
91
+ - Keep the epic progressing until the goal is achieved
92
+
93
+ This is an iterative process - you'll be notified again when more tasks finish.
94
+ The epic should keep progressing until 100% complete and the goal is achieved.`,
95
+ variables: [
96
+ { name: "epic_count", description: "Number of epics with progress updates" },
97
+ { name: "epics_detail", description: "Formatted detail section for all epics" },
98
+ ],
99
+ category: "task_lifecycle",
100
+ });
101
+
102
+ registerTemplate({
103
+ eventType: "task.trigger.channel_activity",
104
+ header: "",
105
+ defaultBody: `## Slack Channel Activity
106
+
107
+ {{message_count}} new message(s) in monitored Slack channels:
108
+
109
+ {{messages_detail}}
110
+ ## Your Task
111
+
112
+ Review these messages and decide if any require action:
113
+ 1. If a message is a question or request, respond using \`slack-reply\` or create a task with \`send-task\`
114
+ 2. If a message is informational, no action needed
115
+ 3. Use \`slack-read\` with the channelId to get more context if needed`,
116
+ variables: [
117
+ { name: "message_count", description: "Number of new messages" },
118
+ {
119
+ name: "messages_detail",
120
+ description: "Formatted list of messages with channel and user info",
121
+ },
122
+ ],
123
+ category: "task_lifecycle",
124
+ });
125
+
126
+ // ============================================================================
127
+ // Task resumption prompts
128
+ // ============================================================================
129
+
130
+ registerTemplate({
131
+ eventType: "task.resumption.with_progress",
132
+ header: "",
133
+ defaultBody: `{{work_on_task_cmd}} {{task_id}}
134
+
135
+ **RESUMED TASK** - This task was interrupted during a deployment and is being resumed.
136
+
137
+ Task: "{{task_description}}"
138
+
139
+ Previous Progress:
140
+ {{progress}}
141
+
142
+ Continue from where you left off. Review the progress above and complete the remaining work.
143
+
144
+ When done, use \`store-progress\` with status: "completed" and include your output.`,
145
+ variables: [
146
+ { name: "work_on_task_cmd", description: "Formatted /work-on-task command" },
147
+ { name: "task_id", description: "Task ID" },
148
+ { name: "task_description", description: "Original task description" },
149
+ { name: "progress", description: "Previous progress text" },
150
+ ],
151
+ category: "task_lifecycle",
152
+ });
153
+
154
+ registerTemplate({
155
+ eventType: "task.resumption.no_progress",
156
+ header: "",
157
+ defaultBody: `{{work_on_task_cmd}} {{task_id}}
158
+
159
+ **RESUMED TASK** - This task was interrupted during a deployment and is being resumed.
160
+
161
+ Task: "{{task_description}}"
162
+
163
+ No progress was saved before the interruption. Start the task fresh but be aware files may have been partially modified.
164
+
165
+ When done, use \`store-progress\` with status: "completed" and include your output.`,
166
+ variables: [
167
+ { name: "work_on_task_cmd", description: "Formatted /work-on-task command" },
168
+ { name: "task_id", description: "Task ID" },
169
+ { name: "task_description", description: "Original task description" },
170
+ ],
171
+ category: "task_lifecycle",
172
+ });
@@ -1,6 +1,9 @@
1
1
  import { createTaskExtended, failTask, findTaskByVcs, getAllAgents } from "../be/db";
2
+ import { resolveTemplate } from "../prompts/resolver";
2
3
  import { detectMention, extractMentionContext, GITHUB_BOT_NAME, isBotAssignee } from "./mentions";
3
4
  import { addIssueReaction, addReaction } from "./reactions";
5
+ // Side-effect import: registers all GitHub event templates in the in-memory registry
6
+ import "./templates";
4
7
  import type {
5
8
  CheckRunEvent,
6
9
  CheckSuiteEvent,
@@ -15,9 +18,50 @@ import type {
15
18
  const processedEvents = new Map<string, number>();
16
19
  const EVENT_TTL = 60_000;
17
20
 
18
- // Delegation instruction for lead agents receiving GitHub tasks
19
- const DELEGATION_INSTRUCTION =
20
- "⚠️ As lead, DELEGATE this task to a worker agent - do not tackle it yourself.";
21
+ /**
22
+ * Get review state emoji and label
23
+ */
24
+ export function getReviewStateInfo(state: string): { emoji: string; label: string } {
25
+ switch (state) {
26
+ case "approved":
27
+ return { emoji: "✅", label: "APPROVED" };
28
+ case "changes_requested":
29
+ return { emoji: "🔄", label: "CHANGES REQUESTED" };
30
+ case "commented":
31
+ return { emoji: "💬", label: "COMMENTED" };
32
+ case "dismissed":
33
+ return { emoji: "🚫", label: "DISMISSED" };
34
+ default:
35
+ return { emoji: "📝", label: state.toUpperCase() };
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Get conclusion emoji and label for CI checks
41
+ */
42
+ export function getCheckConclusionInfo(conclusion: string | null): {
43
+ emoji: string;
44
+ label: string;
45
+ } {
46
+ switch (conclusion) {
47
+ case "success":
48
+ return { emoji: "✅", label: "PASSED" };
49
+ case "failure":
50
+ return { emoji: "❌", label: "FAILED" };
51
+ case "cancelled":
52
+ return { emoji: "⏹️", label: "CANCELLED" };
53
+ case "timed_out":
54
+ return { emoji: "⏱️", label: "TIMED OUT" };
55
+ case "action_required":
56
+ return { emoji: "⚠️", label: "ACTION REQUIRED" };
57
+ case "skipped":
58
+ return { emoji: "⏭️", label: "SKIPPED" };
59
+ case "neutral":
60
+ return { emoji: "➖", label: "NEUTRAL" };
61
+ default:
62
+ return { emoji: "❓", label: conclusion?.toUpperCase() ?? "UNKNOWN" };
63
+ }
64
+ }
21
65
 
22
66
  /**
23
67
  * Get suggested commands based on task type
@@ -99,10 +143,27 @@ export async function handlePullRequest(
99
143
 
100
144
  // Same task creation flow as mention-based handling
101
145
  const lead = findLeadAgent();
102
- const suggestions = getCommandSuggestions("github-pr");
103
- const taskDescription = `[GitHub PR #${pr.number}] ${pr.title}\n\nAssigned to: @${GITHUB_BOT_NAME}\nFrom: ${sender.login}\nRepo: ${repository.full_name}\nBranch: ${pr.head.ref} → ${pr.base.ref}\nURL: ${pr.html_url}\n\nContext:\n${pr.body || pr.title}\n\n---\n${DELEGATION_INSTRUCTION}\n${suggestions}`;
146
+ const result = resolveTemplate(
147
+ "github.pull_request.assigned",
148
+ {
149
+ pr_number: pr.number,
150
+ pr_title: pr.title,
151
+ bot_name: GITHUB_BOT_NAME,
152
+ sender_login: sender.login,
153
+ repo_full_name: repository.full_name,
154
+ head_ref: pr.head.ref,
155
+ base_ref: pr.base.ref,
156
+ pr_url: pr.html_url,
157
+ context: pr.body || pr.title,
158
+ },
159
+ { agentId: lead?.id, repoId: repository.full_name },
160
+ );
161
+
162
+ if (result.skipped) {
163
+ return { created: false };
164
+ }
104
165
 
105
- const task = createTaskExtended(taskDescription, {
166
+ const task = createTaskExtended(result.text, {
106
167
  agentId: lead?.id ?? "",
107
168
  source: "github",
108
169
  vcsProvider: "github",
@@ -179,10 +240,27 @@ export async function handlePullRequest(
179
240
 
180
241
  // Create review task
181
242
  const lead = findLeadAgent();
182
- const suggestions = getCommandSuggestions("github-pr");
183
- const taskDescription = `[GitHub PR #${pr.number}] ${pr.title}\n\nReview requested from: @${GITHUB_BOT_NAME}\nFrom: ${sender.login}\nRepo: ${repository.full_name}\nBranch: ${pr.head.ref} → ${pr.base.ref}\nURL: ${pr.html_url}\n\nContext:\n${pr.body || pr.title}\n\n---\n${DELEGATION_INSTRUCTION}\n${suggestions}`;
243
+ const result = resolveTemplate(
244
+ "github.pull_request.review_requested",
245
+ {
246
+ pr_number: pr.number,
247
+ pr_title: pr.title,
248
+ bot_name: GITHUB_BOT_NAME,
249
+ sender_login: sender.login,
250
+ repo_full_name: repository.full_name,
251
+ head_ref: pr.head.ref,
252
+ base_ref: pr.base.ref,
253
+ pr_url: pr.html_url,
254
+ context: pr.body || pr.title,
255
+ },
256
+ { agentId: lead?.id, repoId: repository.full_name },
257
+ );
258
+
259
+ if (result.skipped) {
260
+ return { created: false };
261
+ }
184
262
 
185
- const task = createTaskExtended(taskDescription, {
263
+ const task = createTaskExtended(result.text, {
186
264
  agentId: lead?.id ?? "",
187
265
  source: "github",
188
266
  vcsProvider: "github",
@@ -257,10 +335,31 @@ export async function handlePullRequest(
257
335
  const emoji = wasMerged ? "🎉" : "❌";
258
336
  const status = wasMerged ? "MERGED" : "CLOSED";
259
337
  const mergedBy = wasMerged && pr.merged_by ? ` by ${pr.merged_by.login}` : "";
338
+ const followUpSuggestion = wasMerged
339
+ ? "💡 PR successfully merged! Update any related issues or documentation."
340
+ : "💡 PR was closed without merging. Review if follow-up is needed.";
341
+
342
+ const result = resolveTemplate(
343
+ "github.pull_request.closed",
344
+ {
345
+ status_emoji: emoji,
346
+ pr_number: pr.number,
347
+ status,
348
+ merged_by: mergedBy,
349
+ pr_title: pr.title,
350
+ repo_full_name: repository.full_name,
351
+ pr_url: pr.html_url,
352
+ related_task_id: task.id,
353
+ follow_up_suggestion: followUpSuggestion,
354
+ },
355
+ { agentId: lead?.id, repoId: repository.full_name },
356
+ );
260
357
 
261
- const taskDescription = `${emoji} [GitHub PR #${pr.number}] ${status}${mergedBy}\n\nPR: ${pr.title}\nRepo: ${repository.full_name}\nURL: ${pr.html_url}\n\n---\nRelated task: ${task.id}\n🔀 Consider routing to the same agent working on the related task.\n${wasMerged ? "💡 PR successfully merged! Update any related issues or documentation." : "💡 PR was closed without merging. Review if follow-up is needed."}`;
358
+ if (result.skipped) {
359
+ return { created: false };
360
+ }
262
361
 
263
- const notifyTask = createTaskExtended(taskDescription, {
362
+ const notifyTask = createTaskExtended(result.text, {
264
363
  agentId: lead?.id ?? "",
265
364
  source: "github",
266
365
  vcsProvider: "github",
@@ -295,9 +394,25 @@ export async function handlePullRequest(
295
394
  }
296
395
 
297
396
  const lead = findLeadAgent();
298
- const taskDescription = `🔄 [GitHub PR #${pr.number}] New commits pushed\n\nPR: ${pr.title}\nRepo: ${repository.full_name}\nBranch: ${pr.head.ref}\nNew HEAD: ${pr.head.sha.substring(0, 7)}\nURL: ${pr.html_url}\n\n---\nRelated task: ${task.id}\n🔀 Consider routing to the same agent working on the related task.\n💡 New commits were pushed. CI will re-run - monitor for results.`;
397
+ const result = resolveTemplate(
398
+ "github.pull_request.synchronize",
399
+ {
400
+ pr_number: pr.number,
401
+ pr_title: pr.title,
402
+ repo_full_name: repository.full_name,
403
+ head_ref: pr.head.ref,
404
+ head_sha_short: pr.head.sha.substring(0, 7),
405
+ pr_url: pr.html_url,
406
+ related_task_id: task.id,
407
+ },
408
+ { agentId: lead?.id, repoId: repository.full_name },
409
+ );
410
+
411
+ if (result.skipped) {
412
+ return { created: false };
413
+ }
299
414
 
300
- const notifyTask = createTaskExtended(taskDescription, {
415
+ const notifyTask = createTaskExtended(result.text, {
301
416
  agentId: lead?.id ?? "",
302
417
  source: "github",
303
418
  vcsProvider: "github",
@@ -338,11 +453,27 @@ export async function handlePullRequest(
338
453
 
339
454
  // Build task description
340
455
  const context = extractMentionContext(pr.body) || pr.title;
341
- const suggestions = getCommandSuggestions("github-pr");
342
- const taskDescription = `[GitHub PR #${pr.number}] ${pr.title}\n\nFrom: ${sender.login}\nRepo: ${repository.full_name}\nBranch: ${pr.head.ref} → ${pr.base.ref}\nURL: ${pr.html_url}\n\nContext:\n${context}\n\n---\n${DELEGATION_INSTRUCTION}\n${suggestions}`;
456
+ const result = resolveTemplate(
457
+ "github.pull_request.mentioned",
458
+ {
459
+ pr_number: pr.number,
460
+ pr_title: pr.title,
461
+ sender_login: sender.login,
462
+ repo_full_name: repository.full_name,
463
+ head_ref: pr.head.ref,
464
+ base_ref: pr.base.ref,
465
+ pr_url: pr.html_url,
466
+ context,
467
+ },
468
+ { agentId: lead?.id, repoId: repository.full_name },
469
+ );
470
+
471
+ if (result.skipped) {
472
+ return { created: false };
473
+ }
343
474
 
344
475
  // Create task (assigned to lead if available, otherwise unassigned)
345
- const task = createTaskExtended(taskDescription, {
476
+ const task = createTaskExtended(result.text, {
346
477
  agentId: lead?.id ?? "",
347
478
  source: "github",
348
479
  vcsProvider: "github",
@@ -393,10 +524,25 @@ export async function handleIssue(
393
524
 
394
525
  // Same task creation flow as mention-based handling
395
526
  const lead = findLeadAgent();
396
- const suggestions = getCommandSuggestions("github-issue");
397
- const taskDescription = `[GitHub Issue #${issue.number}] ${issue.title}\n\nAssigned to: @${GITHUB_BOT_NAME}\nFrom: ${sender.login}\nRepo: ${repository.full_name}\nURL: ${issue.html_url}\n\nContext:\n${issue.body || issue.title}\n\n---\n${DELEGATION_INSTRUCTION}\n${suggestions}`;
527
+ const result = resolveTemplate(
528
+ "github.issue.assigned",
529
+ {
530
+ issue_number: issue.number,
531
+ issue_title: issue.title,
532
+ bot_name: GITHUB_BOT_NAME,
533
+ sender_login: sender.login,
534
+ repo_full_name: repository.full_name,
535
+ issue_url: issue.html_url,
536
+ context: issue.body || issue.title,
537
+ },
538
+ { agentId: lead?.id, repoId: repository.full_name },
539
+ );
540
+
541
+ if (result.skipped) {
542
+ return { created: false };
543
+ }
398
544
 
399
- const task = createTaskExtended(taskDescription, {
545
+ const task = createTaskExtended(result.text, {
400
546
  agentId: lead?.id ?? "",
401
547
  source: "github",
402
548
  vcsProvider: "github",
@@ -471,11 +617,25 @@ export async function handleIssue(
471
617
 
472
618
  // Build task description
473
619
  const context = extractMentionContext(issue.body) || issue.title;
474
- const suggestions = getCommandSuggestions("github-issue");
475
- const taskDescription = `[GitHub Issue #${issue.number}] ${issue.title}\n\nFrom: ${sender.login}\nRepo: ${repository.full_name}\nURL: ${issue.html_url}\n\nContext:\n${context}\n\n---\n${DELEGATION_INSTRUCTION}\n${suggestions}`;
620
+ const result = resolveTemplate(
621
+ "github.issue.mentioned",
622
+ {
623
+ issue_number: issue.number,
624
+ issue_title: issue.title,
625
+ sender_login: sender.login,
626
+ repo_full_name: repository.full_name,
627
+ issue_url: issue.html_url,
628
+ context,
629
+ },
630
+ { agentId: lead?.id, repoId: repository.full_name },
631
+ );
632
+
633
+ if (result.skipped) {
634
+ return { created: false };
635
+ }
476
636
 
477
637
  // Create task (assigned to lead if available, otherwise unassigned)
478
- const task = createTaskExtended(taskDescription, {
638
+ const task = createTaskExtended(result.text, {
479
639
  agentId: lead?.id ?? "",
480
640
  source: "github",
481
641
  vcsProvider: "github",
@@ -544,10 +704,32 @@ export async function handleComment(
544
704
  // Build task description
545
705
  const context = extractMentionContext(comment.body);
546
706
  const suggestions = getCommandSuggestions("github-comment", targetType);
547
- const taskDescription = `[GitHub ${targetType} #${targetNumber} Comment] ${targetTitle}\n\nFrom: ${sender.login}\nRepo: ${repository.full_name}\nURL: ${comment.html_url}\n\nComment:\n${context}\n\n---\n${existingTask ? `Related task: ${existingTask.id}\n🔀 Consider routing to the same agent working on the related task.\n` : ""}${DELEGATION_INSTRUCTION}\n${suggestions}`;
707
+ const relatedTaskSection = existingTask
708
+ ? `Related task: ${existingTask.id}\n🔀 Consider routing to the same agent working on the related task.\n`
709
+ : "";
710
+
711
+ const result = resolveTemplate(
712
+ "github.comment.mentioned",
713
+ {
714
+ target_type: targetType,
715
+ target_number: targetNumber,
716
+ target_title: targetTitle,
717
+ sender_login: sender.login,
718
+ repo_full_name: repository.full_name,
719
+ comment_url: comment.html_url,
720
+ context,
721
+ related_task_section: relatedTaskSection,
722
+ command_suggestions: suggestions,
723
+ },
724
+ { agentId: lead?.id, repoId: repository.full_name },
725
+ );
726
+
727
+ if (result.skipped) {
728
+ return { created: false };
729
+ }
548
730
 
549
731
  // Create task (assigned to lead if available, otherwise unassigned)
550
- const task = createTaskExtended(taskDescription, {
732
+ const task = createTaskExtended(result.text, {
551
733
  agentId: lead?.id ?? "",
552
734
  source: "github",
553
735
  vcsProvider: "github",
@@ -576,24 +758,6 @@ export async function handleComment(
576
758
  return { created: true, taskId: task.id };
577
759
  }
578
760
 
579
- /**
580
- * Get review state emoji and label
581
- */
582
- function getReviewStateInfo(state: string): { emoji: string; label: string } {
583
- switch (state) {
584
- case "approved":
585
- return { emoji: "✅", label: "APPROVED" };
586
- case "changes_requested":
587
- return { emoji: "🔄", label: "CHANGES REQUESTED" };
588
- case "commented":
589
- return { emoji: "💬", label: "COMMENTED" };
590
- case "dismissed":
591
- return { emoji: "🚫", label: "DISMISSED" };
592
- default:
593
- return { emoji: "📝", label: state.toUpperCase() };
594
- }
595
- }
596
-
597
761
  /**
598
762
  * Handle pull_request_review events (submitted, edited, dismissed)
599
763
  *
@@ -642,18 +806,40 @@ export async function handlePullRequestReview(
642
806
  const { emoji, label } = getReviewStateInfo(review.state);
643
807
 
644
808
  // Build task description
645
- const reviewBody = review.body ? `\n\nReview Comment:\n${review.body}` : "";
646
- const suggestions =
809
+ const reviewBodySection = review.body ? `\n\nReview Comment:\n${review.body}` : "";
810
+ const relatedTaskSection = existingTask
811
+ ? `Related task: ${existingTask.id}\n🔀 Consider routing to the same agent working on the related task.\n`
812
+ : "";
813
+ const reviewSuggestions =
647
814
  review.state === "approved"
648
815
  ? "💡 Suggested: Merge the PR or wait for additional reviews"
649
816
  : review.state === "changes_requested"
650
817
  ? "💡 Suggested: Address the requested changes and update the PR"
651
818
  : "💡 Suggested: Review the feedback and respond if needed";
652
819
 
653
- const taskDescription = `${emoji} [GitHub PR #${pr.number} Review] ${label}\n\nPR: ${pr.title}\nReviewer: ${sender.login}\nRepo: ${repository.full_name}\nURL: ${review.html_url}${reviewBody}\n\n---\n${existingTask ? `Related task: ${existingTask.id}\n🔀 Consider routing to the same agent working on the related task.\n` : ""}${DELEGATION_INSTRUCTION}\n${suggestions}`;
820
+ const result = resolveTemplate(
821
+ "github.pull_request.review_submitted",
822
+ {
823
+ review_emoji: emoji,
824
+ pr_number: pr.number,
825
+ review_label: label,
826
+ pr_title: pr.title,
827
+ sender_login: sender.login,
828
+ repo_full_name: repository.full_name,
829
+ review_url: review.html_url,
830
+ review_body_section: reviewBodySection,
831
+ related_task_section: relatedTaskSection,
832
+ review_suggestions: reviewSuggestions,
833
+ },
834
+ { agentId: lead?.id, repoId: repository.full_name },
835
+ );
836
+
837
+ if (result.skipped) {
838
+ return { created: false };
839
+ }
654
840
 
655
841
  // Create task (assigned to lead if available, otherwise unassigned)
656
- const task = createTaskExtended(taskDescription, {
842
+ const task = createTaskExtended(result.text, {
657
843
  agentId: lead?.id ?? "",
658
844
  source: "github",
659
845
  vcsProvider: "github",
@@ -683,30 +869,6 @@ export async function handlePullRequestReview(
683
869
  return { created: true, taskId: task.id };
684
870
  }
685
871
 
686
- /**
687
- * Get conclusion emoji and label for CI checks
688
- */
689
- function getCheckConclusionInfo(conclusion: string | null): { emoji: string; label: string } {
690
- switch (conclusion) {
691
- case "success":
692
- return { emoji: "✅", label: "PASSED" };
693
- case "failure":
694
- return { emoji: "❌", label: "FAILED" };
695
- case "cancelled":
696
- return { emoji: "⏹️", label: "CANCELLED" };
697
- case "timed_out":
698
- return { emoji: "⏱️", label: "TIMED OUT" };
699
- case "action_required":
700
- return { emoji: "⚠️", label: "ACTION REQUIRED" };
701
- case "skipped":
702
- return { emoji: "⏭️", label: "SKIPPED" };
703
- case "neutral":
704
- return { emoji: "➖", label: "NEUTRAL" };
705
- default:
706
- return { emoji: "❓", label: conclusion?.toUpperCase() ?? "UNKNOWN" };
707
- }
708
- }
709
-
710
872
  /**
711
873
  * Handle check_run events (CI check completed)
712
874
  *
@@ -760,13 +922,30 @@ export async function handleCheckRun(
760
922
  const lead = findLeadAgent();
761
923
  const { emoji, label } = getCheckConclusionInfo(conclusion);
762
924
 
763
- const outputSummary = check_run.output.summary
925
+ const outputSummarySection = check_run.output.summary
764
926
  ? `\n\nSummary:\n${check_run.output.summary.substring(0, 500)}`
765
927
  : "";
766
928
 
767
- const taskDescription = `${emoji} [GitHub PR #${prNumber} CI] ${check_run.name} ${label}\n\nRepo: ${repository.full_name}\nCheck: ${check_run.name}\nURL: ${check_run.html_url}${outputSummary}\n\n---\nRelated task: ${relatedTask.id}\n🔀 Consider routing to the same agent working on the related task.\n💡 CI check failed. Review the logs and fix the issue.`;
929
+ const result = resolveTemplate(
930
+ "github.check_run.failed",
931
+ {
932
+ conclusion_emoji: emoji,
933
+ pr_number: prNumber,
934
+ check_name: check_run.name,
935
+ conclusion_label: label,
936
+ repo_full_name: repository.full_name,
937
+ check_url: check_run.html_url,
938
+ output_summary_section: outputSummarySection,
939
+ related_task_id: relatedTask.id,
940
+ },
941
+ { agentId: lead?.id, repoId: repository.full_name },
942
+ );
943
+
944
+ if (result.skipped) {
945
+ return { created: false };
946
+ }
768
947
 
769
- const task = createTaskExtended(taskDescription, {
948
+ const task = createTaskExtended(result.text, {
770
949
  agentId: lead?.id ?? "",
771
950
  source: "github",
772
951
  vcsProvider: "github",
@@ -838,9 +1017,25 @@ export async function handleCheckSuite(
838
1017
  const { emoji, label } = getCheckConclusionInfo(conclusion);
839
1018
  const branch = check_suite.head_branch ?? "unknown";
840
1019
 
841
- const taskDescription = `${emoji} [GitHub PR #${prNumber} CI Suite] ${label}\n\nRepo: ${repository.full_name}\nBranch: ${branch}\nCommit: ${check_suite.head_sha.substring(0, 7)}\n\n---\nRelated task: ${relatedTask.id}\n🔀 Consider routing to the same agent working on the related task.\n💡 CI suite failed. Check individual check runs for details.`;
1020
+ const result = resolveTemplate(
1021
+ "github.check_suite.failed",
1022
+ {
1023
+ conclusion_emoji: emoji,
1024
+ pr_number: prNumber,
1025
+ conclusion_label: label,
1026
+ repo_full_name: repository.full_name,
1027
+ branch,
1028
+ head_sha_short: check_suite.head_sha.substring(0, 7),
1029
+ related_task_id: relatedTask.id,
1030
+ },
1031
+ { agentId: lead?.id, repoId: repository.full_name },
1032
+ );
1033
+
1034
+ if (result.skipped) {
1035
+ return { created: false };
1036
+ }
842
1037
 
843
- const task = createTaskExtended(taskDescription, {
1038
+ const task = createTaskExtended(result.text, {
844
1039
  agentId: lead?.id ?? "",
845
1040
  source: "github",
846
1041
  vcsProvider: "github",
@@ -914,9 +1109,29 @@ export async function handleWorkflowRun(
914
1109
  const lead = findLeadAgent();
915
1110
  const { emoji, label } = getCheckConclusionInfo(conclusion);
916
1111
 
917
- const taskDescription = `${emoji} [GitHub PR #${prNumber} Workflow] ${workflow_run.name} ${label}\n\nRepo: ${repository.full_name}\nWorkflow: ${workflow.name}\nRun #${workflow_run.run_number}\nBranch: ${workflow_run.head_branch}\nTriggered by: ${workflow_run.event}\nLogs: ${workflow_run.html_url}\n\n---\nRelated task: ${relatedTask.id}\n🔀 Consider routing to the same agent working on the related task.\n💡 Workflow failed. Click the logs URL above to see what went wrong and fix the issue.`;
1112
+ const result = resolveTemplate(
1113
+ "github.workflow_run.failed",
1114
+ {
1115
+ conclusion_emoji: emoji,
1116
+ pr_number: prNumber,
1117
+ workflow_run_name: workflow_run.name,
1118
+ conclusion_label: label,
1119
+ repo_full_name: repository.full_name,
1120
+ workflow_name: workflow.name,
1121
+ run_number: workflow_run.run_number,
1122
+ head_branch: workflow_run.head_branch,
1123
+ trigger_event: workflow_run.event,
1124
+ logs_url: workflow_run.html_url,
1125
+ related_task_id: relatedTask.id,
1126
+ },
1127
+ { agentId: lead?.id, repoId: repository.full_name },
1128
+ );
1129
+
1130
+ if (result.skipped) {
1131
+ return { created: false };
1132
+ }
918
1133
 
919
- const task = createTaskExtended(taskDescription, {
1134
+ const task = createTaskExtended(result.text, {
920
1135
  agentId: lead?.id ?? "",
921
1136
  source: "github",
922
1137
  vcsProvider: "github",