@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
@@ -1,443 +0,0 @@
1
- ---
2
- date: 2026-03-20T12:00:00-04:00
3
- author: Taras & Claude
4
- topic: "Prompt Template Registry for Agent Swarm Events"
5
- tags: [brainstorm, prompts, templates, events, registry]
6
- status: parked
7
- exploration_type: idea
8
- last_updated: 2026-03-20
9
- last_updated_by: Claude
10
- ---
11
-
12
- # Prompt Template Registry for Agent Swarm Events — Brainstorm
13
-
14
- ## Context
15
-
16
- The agent swarm currently uses hardcoded prompt strings when creating tasks from various events (GitHub webhooks, Slack messages, new task creation, etc.). Taras wants to introduce a **template/prompt registry** that:
17
-
18
- 1. **Catalogs all events** in the system that produce prompts (task creation, PR review, issue triage, etc.)
19
- 2. **Exposes templates via API** so agents can define, modify, and disable them at runtime
20
- 3. **Supports variable interpolation** — each event type carries specific variables (e.g. `pr.number`, `sender.login`, `repo.full_name`) that templates can reference
21
- 4. **Replaces hardcoded prompts** with a central helper that resolves the appropriate template for a given event
22
-
23
- This would make the system more configurable, allow different swarms to customize behavior without code changes, and make it easier to iterate on prompt quality.
24
-
25
- ### Current State (from codebase exploration)
26
-
27
- Hardcoded prompts exist across **13 sources**:
28
-
29
- | Source | File | What it produces |
30
- |--------|------|-----------------|
31
- | **System prompts** | `src/prompts/base-prompt.ts` | `BASE_PROMPT_LEAD`, `BASE_PROMPT_WORKER`, `BASE_PROMPT_FILESYSTEM`, etc. Assembled by `getBasePrompt()` |
32
- | **GitHub** | `src/github/handlers.ts` | ~12 event types: PR assigned, review requested, review submitted, CI failed, issue assigned, mentions, etc. + delegation instructions + command suggestions |
33
- | **GitLab** | `src/gitlab/handlers.ts` | MR, Issue, Comment, CI pipeline events (mirrors GitHub) + delegation instruction |
34
- | **Slack** | `src/slack/handlers.ts` | Message extraction + thread context wrapping |
35
- | **Slack Assistant** | `src/slack/assistant.ts` | Greeting, suggested prompts, offline message |
36
- | **AgentMail** | `src/agentmail/handlers.ts` | Email-to-task (follow-up, mapped agent, unmapped inbox) |
37
- | **Linear** | `src/linear/sync.ts` | Issue-to-task, follow-up messages |
38
- | **Heartbeat** | `src/heartbeat/heartbeat.ts` | Triage/escalation tasks for stalled agents |
39
- | **Task lifecycle** | `src/tools/store-progress.ts` | **Auto-created follow-up tasks for lead** on worker completion/failure + epic context instructions |
40
- | **Task resumption** | `src/commands/runner.ts` | Resumption prompts ("continue from where you left off"), epic progress context injection |
41
- | **Worker reminders** | `src/hooks/hook.ts` | Progress reminder: "Remember to call store-progress periodically..." |
42
- | **Pi-mono reminders** | `src/providers/pi-mono-extension.ts` | Same progress reminder for pi-mono workers |
43
- | **Docker entrypoint** | `docker-entrypoint.sh` | One-time agent-fs invitation task for lead |
44
-
45
- **Common patterns found:**
46
- - All use JS template literals with event data (`${pr.number}`, `${issue.title}`, etc.)
47
- - Status-based emoji indicators (`✅`, `🔄`, `❌`, `🎉`)
48
- - `DELEGATION_INSTRUCTION` constant injected into GitHub/GitLab tasks
49
- - `getCommandSuggestions()` appends slash command hints based on event type
50
- - Thread context wrapped in `<thread_context>...</thread_context>` tags
51
- - Long text truncated to 500 chars
52
- - Task completion/failure auto-generates lead follow-up tasks with hardcoded descriptions
53
- - Progress reminders injected into worker sessions via hooks
54
-
55
- ## Exploration
56
-
57
- ### Q: Which sources are the highest priority pain points? Where does hardcoded-ness hurt most?
58
- All of them — it's a universal problem. But there's a nuance: some things are always injected regardless (e.g. `DELEGATION_INSTRUCTION`, command suggestions), and those should remain but perhaps be configurable via a flag to override.
59
-
60
- **Insights:** Two layers emerging: (1) the task description template itself (event-specific), and (2) "always-injected" fragments that are appended to many templates (cross-cutting concerns like delegation instructions). The system needs to handle both — possibly with a concept of "base fragments" + "event templates" that compose together, where either layer can be overridden.
61
-
62
- ### Q: Who is the primary consumer of the template API — humans, agents, or both?
63
- Both. Humans configure templates via API/dashboard, and agents (especially lead) can also adjust them via MCP tools at runtime.
64
-
65
- **Insights:** This means we need dual access paths: REST API endpoints for human/dashboard consumption, AND MCP tools so agents can programmatically manage templates. The existing `set-config`/`get-config` pattern is a good precedent. Also implies we need good defaults that work out-of-the-box — agents shouldn't _need_ to configure templates, but they _can_.
66
-
67
- ### Q: What templating syntax — simple interpolation, conditionals, or full engine?
68
- Simple interpolation only (`{{variable}}`). Keep it dead simple, handle logic in code.
69
-
70
- **Insights:** This is a great call. Simple `{{var}}` replacement means: no runtime template engine dependency, easy to validate templates, easy for agents to author. Any conditional logic (like "if PR is draft, add a note") stays in the handler code that _prepares_ the variables — the template just receives a flat set of resolved values. This also means the variable contract per event type is well-defined and documentable.
71
-
72
- ### Q: Should templates be scoped with an override hierarchy?
73
- Full hierarchy: **global → per-repo → per-agent** (most specific wins).
74
-
75
- **Insights:** This mirrors how config scoping already works in the swarm (global vs agent-level configs). The resolution order would be: check agent-level override → repo-level override → global default → hardcoded fallback. This means:
76
- - The DB schema needs a `scope` concept (global, repo, agent) on template records
77
- - Resolution logic needs to try the most specific scope first and fall back
78
- - For repo scope, the identifier is probably `repo.full_name` (e.g. `desplega-ai/agent-swarm`)
79
- - For agent scope, the identifier is the agent UUID
80
- - A template can be "disabled" at any scope level (e.g. agent X opts out of CI failure notifications)
81
-
82
- ### Q: When a template is disabled, what happens to the event?
83
- Three explicit states per template record: `"enabled"` | `"default_prompt_fallback"` | `"skip_event"`.
84
-
85
- - **`enabled`** — use this custom template
86
- - **`default_prompt_fallback`** — ignore this override, fall through to the built-in hardcoded prompt
87
- - **`skip_event`** — don't create a task at all, silently drop the event
88
-
89
- **Insights:** This is cleaner than a boolean. The three states map to clear behaviors and there's no ambiguity. It also means the resolution chain is: find the most specific template → check its state → if `enabled`, render it; if `default_prompt_fallback`, skip this scope and try the next one up; if `skip_event`, bail out entirely. The `skip_event` at any scope level acts as a hard stop — if an agent says "skip CI failures", that's final even if there's a global template for it.
90
-
91
- ### Q: Storage — dedicated table or reuse config?
92
- Dedicated `prompt_templates` table with typed columns. This enables building specific UI for template management in the dashboard.
93
-
94
- **Scope clarification (per Taras's follow-up):**
95
-
96
- The `scope` + `scope_id` columns on the table define **who** this template applies to:
97
-
98
- | scope | scope_id | Meaning |
99
- |-------|----------|---------|
100
- | `global` | `NULL` | Default for the entire swarm |
101
- | `repo` | `"desplega-ai/agent-swarm"` | Override for a specific repository |
102
- | `agent` | `"uuid-of-agent"` | Override for a specific agent |
103
-
104
- **Resolution example** for event `github.pr.review_submitted` on repo `desplega-ai/agent-swarm` assigned to agent `abc-123`:
105
-
106
- 1. Look for `(event=github.pr.review_submitted, scope=agent, scope_id=abc-123)` → found? check state
107
- 2. Look for `(event=github.pr.review_submitted, scope=repo, scope_id=desplega-ai/agent-swarm)` → found? check state
108
- 3. Look for `(event=github.pr.review_submitted, scope=global, scope_id=NULL)` → found? check state
109
- 4. Fall through to hardcoded default in code
110
-
111
- At each level, if state is `enabled` → use it. If `skip_event` → stop, no task. If `default_prompt_fallback` → skip this level, continue resolution.
112
-
113
- **Insights:** This is essentially a cascading config system specifically for prompts. The dedicated table means we can add columns like `variables_schema` (documenting available vars), `description`, `created_by`, `updated_at` — things that make the dashboard UI richer. The scope hierarchy also means a lead agent could set repo-level templates for repos it manages.
114
-
115
- ### Q: Should system prompts (lead/worker base prompts) also live in this registry, or only event→task templates?
116
- Everything in one registry. System prompts and event task templates all unified.
117
-
118
- **Insights:** This is ambitious but clean — one place for all prompt management. The `source.entity.action` naming convention naturally extends:
119
-
120
- **Event task templates:**
121
- - `github.pull_request.assigned`
122
- - `github.pull_request.review_submitted`
123
- - `github.check_run.failed`
124
- - `gitlab.merge_request.assigned`
125
- - `slack.message.new`
126
- - `agentmail.email.followup`
127
- - `linear.issue.assigned`
128
- - `heartbeat.escalation.stalled`
129
-
130
- **System prompts:**
131
- - `system.agent.role`
132
- - `system.agent.lead`
133
- - `system.agent.worker`
134
- - `system.agent.filesystem`
135
- - `system.agent.services`
136
- - `system.agent.guidelines`
137
-
138
- **Always-injected fragments:**
139
- - `fragment.delegation_instruction`
140
- - `fragment.command_suggestions.github_pr`
141
- - `fragment.command_suggestions.github_issue`
142
-
143
- This means `getBasePrompt()` would resolve system templates from the registry instead of hardcoded constants, and event handlers would resolve task description templates. Fragments can be referenced from templates or injected by the resolver.
144
-
145
- ### Q: How should fragments (sub-prompts) compose with final prompts?
146
- Reference syntax (`{{@fragment.delegation_instruction}}`) — the template author controls placement. But this surfaced a bigger question: what exactly are the "final outputs" of this system?
147
-
148
- **Taras's insight:** There are really two distinct concepts:
149
- 1. **Fragments / sub-prompts** — reusable building blocks (delegation instruction, command suggestions, filesystem rules, etc.)
150
- 2. **Final prompts** — the actual prompts sent in each context: the system prompt for a session, the task description for an event trigger
151
-
152
- **Clarifying the two output contexts:**
153
-
154
- **Context A: Session system prompt** (assembled by `getBasePrompt()`)
155
- - Built from many fragments: `system.agent.role` + `system.agent.lead` + `system.agent.filesystem` + `system.agent.services` + ...
156
- - The "final prompt" is the composition of multiple fragments with truncation/budgeting
157
- - This is what goes into `--append-system-prompt`
158
-
159
- **Context B: Event → task description** (created by each handler)
160
- - A single template per event type (e.g. `github.pull_request.review_submitted`)
161
- - May reference fragments inline: `{{@fragment.delegation_instruction}}`
162
- - Variables filled from event data: `{{pr.number}}`, `{{sender.login}}`
163
- - This is what goes into `task.description`
164
-
165
- So the registry stores both fragments and "top-level" templates. A top-level template can reference fragments. The resolver's job is to: resolve scope → render variables → expand fragment references → return the final string.
166
-
167
- **Insights:** This is actually a clean separation. The registry doesn't need a separate `type` column — instead, the naming convention distinguishes them: `fragment.*` entries are composable pieces, everything else (`github.*`, `system.*`, `slack.*`) is a top-level template. Top-level templates can embed `{{@fragment.name}}` references. The resolver recursively expands those before variable interpolation.
168
-
169
- ### Q: Should the system prompt assembly recipe itself be a template?
170
- Yes — the composition is itself a template in the registry. And this collapses the "fragment" concept entirely: **any template can reference any other template**. No special fragment type needed.
171
-
172
- **Naming refinement:** Instead of `{{@fragment.delegation_instruction}}`, use `{{@template[system.agent.lead]}}` — making it clear that we're including another template by its ID.
173
-
174
- **Insights:** This is a recursive composition model:
175
-
176
- ```
177
- system.session.lead (top-level)
178
- ├── {{@template[system.agent.role]}} → "You are a {role} agent..."
179
- ├── {{@template[system.agent.lead]}} → "As lead, you delegate..."
180
- ├── {{@template[system.agent.filesystem]}} → "Workspace structure..."
181
- └── {{@template[system.agent.services]}} → "Available services..."
182
- ```
183
-
184
- ```
185
- github.pull_request.review_submitted (top-level)
186
- ├── "{{review_state_emoji}} [GitHub PR #{{pr.number}} Review] {{review_state_label}}"
187
- ├── "Reviewer: {{sender.login}}"
188
- ├── {{@template[common.delegation_instruction]}}
189
- └── {{@template[common.command_suggestions.github_pr]}}
190
- ```
191
-
192
- **Key simplification:** There's only one entity — **templates**. Some templates are "leaf" (just text + variables), some are "composite" (reference other templates). The resolver handles recursive expansion with a depth limit to prevent cycles.
193
-
194
- ### Q: Should variable schemas be stored in the DB or defined in code?
195
- In code, not DB. Define variable contracts as TypeScript constants/types, with a registry abstraction that each event handler implements.
196
-
197
- **Insights:** This is the right call — variable definitions are tightly coupled to the code that produces them. The pattern would be:
198
-
199
- ```typescript
200
- // src/prompts/registry.ts
201
- interface EventTemplate {
202
- eventType: string;
203
- defaultTemplate: string; // hardcoded fallback
204
- availableVariables: VariableDef[]; // documented contract
205
- resolveVariables(event: unknown): Record<string, string>; // extracts vars from event payload
206
- }
207
-
208
- // src/github/templates.ts
209
- const githubPrReviewSubmitted: EventTemplate = {
210
- eventType: "github.pull_request.review_submitted",
211
- defaultTemplate: "{{review_emoji}} [GitHub PR #{{pr.number}} Review] {{review_label}}\n...",
212
- availableVariables: [
213
- { name: "pr.number", description: "Pull request number" },
214
- { name: "pr.title", description: "Pull request title" },
215
- { name: "sender.login", description: "GitHub username of reviewer" },
216
- { name: "review_state", description: "approved | changes_requested | commented" },
217
- // ...
218
- ],
219
- resolveVariables(event) {
220
- return { "pr.number": String(event.pull_request.number), ... };
221
- },
222
- };
223
- ```
224
-
225
- The registry abstraction collects all `EventTemplate` definitions and exposes them via API (so the UI can show available variables for each event type). But the DB only stores custom template bodies and overrides — the variable contracts live in code.
226
-
227
- This also means the API can have a `GET /api/prompt-templates/events` endpoint that lists all registered event types with their available variables, powered by the code-defined registry.
228
-
229
- ### Q: Migration strategy — seed DB or start empty?
230
- **Seed the DB with current prompts as read-only defaults.** Add an `is_default` boolean flag.
231
-
232
- **Claude's recommendation (agreed by Taras):** Seeding is cleaner because:
233
- 1. Users see all existing prompts in the UI immediately — great for discoverability
234
- 2. The refactor is cleaner: event handlers don't need a "check DB, fallback to code" path, they _always_ read from the registry
235
- 3. Default templates are **read-only** (`is_default: true`) — users can't accidentally break them
236
- 4. To customize, the user **creates a new override** at global/repo/agent scope, which takes precedence
237
-
238
- **The flow:**
239
- - On startup/migration, the code-defined `EventTemplate.defaultTemplate` values get upserted into the DB as `scope=global, is_default=true, state=enabled`
240
- - If a user wants to customize, they create a new record (same event_type, same or narrower scope, `is_default=false`)
241
- - Resolution: find most specific non-default → then global non-default → then global default → then hardcoded fallback (safety net)
242
- - If the codebase updates a default template (new version), the migration re-upserts it — since it's flagged `is_default`, it won't clobber user customizations
243
- - The UI shows defaults grayed out / read-only, with a "Customize" button that clones it into an editable override
244
-
245
- ### Q: Should we version template edits for rollback capability?
246
- Full audit log with a `prompt_template_history` table. Updates happen transactionally — insert into history, then update the live record, all in one transaction.
247
-
248
- **Schema sketch:**
249
-
250
- ```sql
251
- -- Live templates
252
- CREATE TABLE prompt_templates (
253
- id TEXT PRIMARY KEY, -- UUID
254
- event_type TEXT NOT NULL, -- e.g. "github.pull_request.review_submitted"
255
- scope TEXT NOT NULL, -- "global" | "repo" | "agent"
256
- scope_id TEXT, -- NULL for global, repo name or agent UUID
257
- state TEXT NOT NULL DEFAULT 'enabled', -- "enabled" | "default_prompt_fallback" | "skip_event"
258
- body TEXT NOT NULL, -- the template text with {{vars}} and {{@template[...]}}
259
- is_default INTEGER NOT NULL DEFAULT 0, -- 1 = seeded from code, read-only
260
- version INTEGER NOT NULL DEFAULT 1,
261
- created_by TEXT, -- agent UUID or "system"
262
- created_at TEXT NOT NULL,
263
- updated_at TEXT NOT NULL,
264
- UNIQUE(event_type, scope, scope_id)
265
- );
266
-
267
- -- Audit trail
268
- CREATE TABLE prompt_template_history (
269
- id TEXT PRIMARY KEY,
270
- template_id TEXT NOT NULL REFERENCES prompt_templates(id),
271
- version INTEGER NOT NULL,
272
- body TEXT NOT NULL,
273
- state TEXT NOT NULL,
274
- changed_by TEXT, -- who made this change
275
- changed_at TEXT NOT NULL,
276
- change_reason TEXT -- optional context
277
- );
278
- ```
279
-
280
- **Insights:** Transactional history means we can offer "rollback to version N" in the API/UI. The `changed_by` field tracks whether a human or an agent made the change. The `change_reason` field is optional but useful when agents explain why they modified a template.
281
-
282
- ## Synthesis
283
-
284
- ### Key Decisions
285
-
286
- 1. **Unified registry** — One `prompt_templates` table for everything: event→task descriptions, system prompts, and reusable building blocks. No separate "fragment" concept.
287
-
288
- 2. **Simple interpolation** — `{{variable}}` for data, `{{@template[event_type]}}` for embedding other templates. No conditionals/loops in templates; logic stays in handler code that prepares variables.
289
-
290
- 3. **Three-state control** — Each template record has `state: "enabled" | "default_prompt_fallback" | "skip_event"` — unambiguous behavior per scope level.
291
-
292
- 4. **Three-level scope hierarchy** — `global → repo → agent` (most specific wins). Resolution walks from agent → repo → global → code fallback.
293
-
294
- 5. **Seeded defaults** — Current hardcoded prompts are migrated into the DB as `is_default: true` (read-only) records. Users create overrides to customize.
295
-
296
- 6. **Full audit history** — Every edit logged to `prompt_template_history` in a transaction. Enables rollback and attribution (human vs agent).
297
-
298
- 7. **Variable contracts in code, not DB** — TypeScript `EventTemplate` interface defines available variables per event type. The resolver validates at runtime. API exposes them for UI autocomplete.
299
-
300
- 8. **Dual access** — REST API for dashboard/humans + MCP tools for agents. Same operations available to both.
301
-
302
- ### Open Questions (Resolved)
303
-
304
- - ~~**Recursive depth limit**~~ → **Depth limit of 3 + self-reference prevention validated at API/core level** (both on create/update). Cycle detection at resolution time as a safety net.
305
- - ~~**Budget/truncation for system prompts**~~ → **Caller / registry implementation handles this** — the resolver returns the full string, truncation logic stays in `getBasePrompt()` or equivalent caller.
306
- - ~~**Template testing**~~ → **Yes — `POST /api/prompt-templates/preview` included** in the API surface.
307
- - ~~**Bulk operations**~~ → **Not needed** — dropped from scope.
308
- - ~~**UI editor**~~ → **Follow-up** — not in initial scope, can be added later.
309
-
310
- ### Constraints Identified
311
-
312
- - **SQLite limitations** — No complex JSON queries. Template bodies are plain text, variable schemas live in code.
313
- - **Migration safety** — Default templates are re-upserted on each startup (to pick up code changes), but must never overwrite user customizations.
314
- - **Cycle prevention** — `{{@template[A]}}` referencing `{{@template[B]}}` referencing `{{@template[A]}}` must be caught and errored.
315
- - **Performance** — Template resolution happens on every event. Must be fast — likely an in-memory cache with DB-change invalidation.
316
- - **Backward compatibility** — Existing hardcoded prompts must produce identical output initially. The refactor should be invisible to end users until they customize.
317
-
318
- ### Core Requirements
319
-
320
- 1. **`prompt_templates` table** with columns: `id`, `event_type`, `scope`, `scope_id`, `state`, `body`, `is_default`, `version`, `created_by`, `created_at`, `updated_at`
321
-
322
- 2. **`prompt_template_history` table** with columns: `id`, `template_id`, `version`, `body`, `state`, `changed_by`, `changed_at`, `change_reason`
323
-
324
- 3. **TypeScript `EventTemplate` registry** — Each event handler registers its event type, default template body, available variables, and a `resolveVariables(event)` function
325
-
326
- 4. **Template resolver** — Given an event type + scope context (agent, repo): walks the scope chain, expands `{{@template[...]}}` references (with depth limit), substitutes `{{variables}}`, returns final string
327
-
328
- 5. **REST API endpoints:**
329
- - `GET /api/prompt-templates` — list all templates (filterable by event_type, scope)
330
- - `GET /api/prompt-templates/:id` — get single template with history
331
- - `POST /api/prompt-templates` — create override
332
- - `PUT /api/prompt-templates/:id` — update template (with audit)
333
- - `DELETE /api/prompt-templates/:id` — delete override (revert to default)
334
- - `GET /api/prompt-templates/events` — list all registered event types with available variables
335
- - `POST /api/prompt-templates/:id/rollback` — rollback to specific version
336
- - `POST /api/prompt-templates/preview` — dry-run render with sample data
337
-
338
- 6. **MCP tools:**
339
- - `list-prompt-templates` — list templates
340
- - `get-prompt-template` — get template details + variables
341
- - `set-prompt-template` — create/update override
342
- - `delete-prompt-template` — remove override
343
- - `preview-prompt-template` — render with sample data
344
-
345
- 7. **Migration:** Seed all current hardcoded prompts as `is_default: true, scope: global` on first run
346
-
347
- 8. **Refactor event handlers** to use `registry.resolve(eventType, variables, { agentId, repoName })` instead of inline template literals
348
-
349
- ### Event Type Taxonomy
350
-
351
- ```
352
- # GitHub events
353
- github.pull_request.assigned
354
- github.pull_request.review_requested
355
- github.pull_request.review_submitted
356
- github.pull_request.closed
357
- github.pull_request.synchronize
358
- github.pull_request.mentioned
359
- github.issue.assigned
360
- github.issue.mentioned
361
- github.comment.mentioned
362
- github.check_run.failed
363
- github.check_suite.failed
364
- github.workflow_run.failed
365
-
366
- # GitLab events
367
- gitlab.merge_request.assigned
368
- gitlab.issue.assigned
369
- gitlab.comment.mentioned
370
- gitlab.pipeline.failed
371
-
372
- # Slack events
373
- slack.message.new
374
- slack.assistant.greeting
375
- slack.assistant.suggested_prompts
376
- slack.assistant.offline
377
-
378
- # AgentMail events
379
- agentmail.email.followup
380
- agentmail.email.mapped
381
- agentmail.email.unmapped
382
- agentmail.email.no_lead
383
-
384
- # Linear events
385
- linear.issue.assigned
386
- linear.issue.followup
387
-
388
- # Heartbeat events
389
- heartbeat.escalation.stalled
390
-
391
- # System prompts
392
- system.agent.role
393
- system.agent.lead
394
- system.agent.worker
395
- system.agent.filesystem
396
- system.agent.agent_fs
397
- system.agent.self_awareness
398
- system.agent.context_mode
399
- system.agent.guidelines
400
- system.agent.system
401
- system.agent.services
402
- system.agent.artifacts
403
-
404
- # Composite session prompts
405
- system.session.lead
406
- system.session.worker
407
-
408
- # Reusable building blocks
409
- common.delegation_instruction
410
- common.command_suggestions.github_pr
411
- common.command_suggestions.github_issue
412
- common.command_suggestions.github_comment
413
- common.thread_context_wrapper
414
-
415
- # Task lifecycle events
416
- task.worker.completed # Auto follow-up to lead on worker task completion
417
- task.worker.failed # Auto follow-up to lead on worker task failure
418
- task.epic.context # Epic progress/goal context injected into task
419
- task.epic.completion_check # Instructions to review output in epic context
420
- task.resumption.with_progress # "Continue from where you left off..."
421
- task.resumption.no_progress # "No progress was saved, start fresh..."
422
-
423
- # Worker session prompts
424
- worker.reminder.store_progress # "Remember to call store-progress periodically..."
425
-
426
- # Bootstrap / one-time tasks
427
- bootstrap.agentfs.invitation # Lead task to invite workers to agent-fs org
428
- ```
429
-
430
- #### Wildcard Overrides
431
-
432
- Templates support **wildcard scoping** via the `event_type` field. When resolving, the system tries exact match first, then progressively broader wildcards:
433
-
434
- 1. `github.pull_request.review_submitted` (exact)
435
- 2. `github.pull_request.*` (all PR events)
436
- 3. `github.*` (all GitHub events)
437
-
438
- This allows overrides like: "for all GitHub PR events on this repo, prepend a custom instruction" without creating N separate overrides. Wildcards are only valid in the `event_type` field of override records (not defaults). Resolution order: **exact > narrower wildcard > broader wildcard > default**.
439
-
440
- ## Next Steps
441
-
442
- - **Parked** — Brainstorm complete, ready for `/create-plan` when we pick this up
443
- - Suggested next: `/desplega:create-plan` referencing this brainstorm doc as input