@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.
- package/README.md +1 -1
- package/openapi.json +2070 -728
- package/package.json +10 -1
- package/src/agentmail/handlers.ts +65 -10
- package/src/agentmail/templates.ts +111 -0
- package/src/be/db.ts +1233 -7
- package/src/be/migrations/014_prompt_templates.sql +33 -0
- package/src/be/migrations/015_workflow_workspace.sql +3 -0
- package/src/be/migrations/016_active_session_runner_session.sql +4 -0
- package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
- package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
- package/src/be/migrations/019_skills.sql +65 -0
- package/src/be/migrations/020_approval_requests.sql +41 -0
- package/src/be/seed.ts +62 -0
- package/src/be/skill-parser.ts +70 -0
- package/src/be/skill-sync.ts +106 -0
- package/src/commands/runner.ts +320 -132
- package/src/commands/templates.ts +172 -0
- package/src/github/handlers.ts +292 -77
- package/src/github/mentions-aliases.test.ts +73 -0
- package/src/github/mentions.test.ts +3 -3
- package/src/github/mentions.ts +32 -6
- package/src/github/templates.ts +398 -0
- package/src/gitlab/handlers.ts +63 -22
- package/src/gitlab/templates.ts +140 -0
- package/src/heartbeat/heartbeat.ts +19 -10
- package/src/heartbeat/templates.ts +30 -0
- package/src/http/active-sessions.ts +27 -0
- package/src/http/approval-requests.ts +247 -0
- package/src/http/config.ts +3 -3
- package/src/http/index.ts +9 -2
- package/src/http/poll.ts +135 -14
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/schedules.ts +35 -0
- package/src/http/skills.ts +479 -0
- package/src/http/workflows.ts +8 -0
- package/src/linear/sync.ts +28 -4
- package/src/linear/templates.ts +47 -0
- package/src/prompts/base-prompt.ts +41 -490
- package/src/prompts/registry.ts +57 -0
- package/src/prompts/resolver.ts +296 -0
- package/src/prompts/session-templates.ts +604 -0
- package/src/providers/claude-adapter.ts +15 -2
- package/src/providers/pi-mono-extension.ts +5 -1
- package/src/scheduler/scheduler.ts +125 -91
- package/src/server.ts +44 -0
- package/src/slack/assistant.ts +7 -4
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/handlers.ts +21 -6
- package/src/slack/templates.ts +55 -0
- package/src/tests/approval-requests.test.ts +735 -0
- package/src/tests/artifact-sdk.test.ts +12 -12
- package/src/tests/base-prompt.test.ts +49 -49
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/heartbeat.test.ts +1 -0
- package/src/tests/linear-webhook.test.ts +7 -3
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/prompt-template-github.test.ts +682 -0
- package/src/tests/prompt-template-remaining.test.ts +504 -0
- package/src/tests/prompt-template-resolver.test.ts +621 -0
- package/src/tests/prompt-template-session.test.ts +363 -0
- package/src/tests/prompt-templates-db.test.ts +616 -0
- package/src/tests/self-improvement.test.ts +8 -7
- package/src/tests/skill-parser.test.ts +178 -0
- package/src/tests/skill-sync.test.ts +171 -0
- package/src/tests/slack-metadata-inheritance.test.ts +1 -1
- package/src/tests/slack-thread-followups.test.ts +1 -1
- package/src/tests/structured-output.test.ts +0 -4
- package/src/tests/tool-annotations.test.ts +2 -1
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/workflow-async-v2.test.ts +126 -4
- package/src/tests/workflow-definition-validation.test.ts +76 -0
- package/src/tests/workflow-executors.test.ts +4 -2
- package/src/tests/workflow-retry-v2.test.ts +1 -1
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tools/prompt-templates/delete.ts +86 -0
- package/src/tools/prompt-templates/get.ts +89 -0
- package/src/tools/prompt-templates/index.ts +5 -0
- package/src/tools/prompt-templates/list.ts +95 -0
- package/src/tools/prompt-templates/preview.ts +84 -0
- package/src/tools/prompt-templates/set.ts +117 -0
- package/src/tools/request-human-input.ts +106 -0
- package/src/tools/skills/index.ts +11 -0
- package/src/tools/skills/skill-create.ts +105 -0
- package/src/tools/skills/skill-delete.ts +67 -0
- package/src/tools/skills/skill-get.ts +75 -0
- package/src/tools/skills/skill-install-remote.ts +152 -0
- package/src/tools/skills/skill-install.ts +101 -0
- package/src/tools/skills/skill-list.ts +77 -0
- package/src/tools/skills/skill-publish.ts +123 -0
- package/src/tools/skills/skill-search.ts +43 -0
- package/src/tools/skills/skill-sync-remote.ts +128 -0
- package/src/tools/skills/skill-uninstall.ts +60 -0
- package/src/tools/skills/skill-update.ts +128 -0
- package/src/tools/store-progress.ts +22 -4
- package/src/tools/task-action.ts +20 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +23 -0
- package/src/tools/update-profile.ts +106 -34
- package/src/tools/workflows/create-workflow.ts +19 -1
- package/src/tools/workflows/update-workflow.ts +16 -1
- package/src/types.ts +109 -2
- package/src/workflows/definition.ts +30 -12
- package/src/workflows/engine.ts +40 -14
- package/src/workflows/executors/agent-task.ts +14 -3
- package/src/workflows/executors/human-in-the-loop.ts +160 -0
- package/src/workflows/executors/registry.ts +2 -0
- package/src/workflows/index.ts +1 -1
- package/src/workflows/recovery.ts +72 -0
- package/src/workflows/resume.ts +162 -12
- package/src/workflows/triggers.ts +31 -2
- package/src/workflows/version.ts +2 -0
- package/.claude/settings.json +0 -84
- package/.claude/settings.local.json +0 -117
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.entire/settings.json +0 -4
- package/.env.docker.example +0 -56
- package/.env.example +0 -78
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
- package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
- package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
- package/.github/workflows/ci.yml +0 -52
- package/.github/workflows/docker-and-deploy.yml +0 -132
- package/.github/workflows/merge-gate.yml +0 -233
- package/.opencode/plugins/entire.ts +0 -133
- package/.superset/config.json +0 -6
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -171
- package/CHANGELOG.md +0 -447
- package/CLAUDE.md +0 -521
- package/CONTRIBUTING.md +0 -315
- package/DEPLOYMENT.md +0 -622
- package/Dockerfile +0 -65
- package/Dockerfile.worker +0 -189
- package/MCP.md +0 -841
- package/UI.md +0 -40
- package/api-entrypoint.sh +0 -56
- package/assets/agent-swarm-logo-orange.png +0 -0
- package/assets/agent-swarm-logo.png +0 -0
- package/assets/agent-swarm.mp4 +0 -0
- package/assets/agent-swarm.png +0 -0
- package/biome.json +0 -39
- package/deploy/DEPLOY.md +0 -60
- package/deploy/agent-swarm.service +0 -17
- package/deploy/docker-push.ts +0 -30
- package/deploy/install.ts +0 -85
- package/deploy/prod-db.ts +0 -42
- package/deploy/uninstall.ts +0 -12
- package/deploy/update.ts +0 -21
- package/depot.json +0 -1
- package/docker-compose.example.yml +0 -350
- package/docker-compose.local.yml +0 -119
- package/docker-entrypoint.sh +0 -632
- package/docs-site/app/api/search/route.ts +0 -4
- package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
- package/docs-site/app/docs/layout.tsx +0 -12
- package/docs-site/app/globals.css +0 -24
- package/docs-site/app/layout.config.tsx +0 -34
- package/docs-site/app/layout.tsx +0 -119
- package/docs-site/app/llms-full.txt/route.ts +0 -11
- package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
- package/docs-site/app/llms.txt/route.ts +0 -8
- package/docs-site/app/page.tsx +0 -5
- package/docs-site/app/robots.ts +0 -13
- package/docs-site/app/sitemap.ts +0 -37
- package/docs-site/components/api-page.client.tsx +0 -4
- package/docs-site/components/api-page.tsx +0 -7
- package/docs-site/components/mdx/mermaid.tsx +0 -55
- package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
- package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
- package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
- package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
- package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
- package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
- package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
- package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
- package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
- package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
- package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
- package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
- package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
- package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
- package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
- package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
- package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
- package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
- package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
- package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
- package/docs-site/content/docs/(documentation)/index.mdx +0 -65
- package/docs-site/content/docs/(documentation)/meta.json +0 -19
- package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
- package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
- package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
- package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
- package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
- package/docs-site/content/docs/api-reference/agents.mdx +0 -9
- package/docs-site/content/docs/api-reference/channels.mdx +0 -9
- package/docs-site/content/docs/api-reference/config.mdx +0 -9
- package/docs-site/content/docs/api-reference/debug.mdx +0 -9
- package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
- package/docs-site/content/docs/api-reference/epics.mdx +0 -9
- package/docs-site/content/docs/api-reference/index.mdx +0 -32
- package/docs-site/content/docs/api-reference/memory.mdx +0 -9
- package/docs-site/content/docs/api-reference/meta.json +0 -25
- package/docs-site/content/docs/api-reference/poll.mdx +0 -9
- package/docs-site/content/docs/api-reference/repos.mdx +0 -9
- package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
- package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
- package/docs-site/content/docs/api-reference/stats.mdx +0 -9
- package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
- package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
- package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
- package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
- package/docs-site/content/docs/meta.json +0 -3
- package/docs-site/lib/get-llm-text.ts +0 -10
- package/docs-site/lib/openapi.ts +0 -23
- package/docs-site/lib/source.ts +0 -8
- package/docs-site/mdx-components.tsx +0 -13
- package/docs-site/next.config.mjs +0 -29
- package/docs-site/package.json +0 -35
- package/docs-site/pnpm-lock.yaml +0 -5407
- package/docs-site/postcss.config.mjs +0 -8
- package/docs-site/public/logo.png +0 -0
- package/docs-site/scripts/generate-docs.ts +0 -171
- package/docs-site/source.config.ts +0 -17
- package/docs-site/tsconfig.json +0 -46
- package/ecosystem.config.cjs +0 -66
- package/landing/next.config.ts +0 -14
- package/landing/package.json +0 -31
- package/landing/pnpm-lock.yaml +0 -1091
- package/landing/postcss.config.mjs +0 -8
- package/landing/public/apple-touch-icon.png +0 -0
- package/landing/public/favicon.ico +0 -0
- package/landing/public/logo.png +0 -0
- package/landing/public/og-image.png +0 -0
- package/landing/public/omghost-desplega.svg +0 -30
- package/landing/public/omghost-openfort.svg +0 -9
- package/landing/src/app/actions/waitlist.ts +0 -25
- package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
- package/landing/src/app/blog/page.tsx +0 -162
- package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
- package/landing/src/app/examples/page.tsx +0 -174
- package/landing/src/app/examples/x402/page.tsx +0 -456
- package/landing/src/app/globals.css +0 -122
- package/landing/src/app/layout.tsx +0 -134
- package/landing/src/app/page.tsx +0 -27
- package/landing/src/app/robots.ts +0 -13
- package/landing/src/app/sitemap.ts +0 -44
- package/landing/src/components/architecture.tsx +0 -163
- package/landing/src/components/cta.tsx +0 -52
- package/landing/src/components/features.tsx +0 -160
- package/landing/src/components/footer.tsx +0 -100
- package/landing/src/components/hero.tsx +0 -217
- package/landing/src/components/how-it-works.tsx +0 -165
- package/landing/src/components/navbar.tsx +0 -147
- package/landing/src/components/waitlist.tsx +0 -110
- package/landing/src/components/why-choose.tsx +0 -149
- package/landing/src/components/workshops.tsx +0 -328
- package/landing/src/lib/utils.ts +0 -6
- package/landing/tsconfig.json +0 -41
- package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
- package/new-ui/CLAUDE.md +0 -92
- package/new-ui/README.md +0 -73
- package/new-ui/biome.json +0 -42
- package/new-ui/components.json +0 -21
- package/new-ui/index.html +0 -25
- package/new-ui/package.json +0 -49
- package/new-ui/pnpm-lock.yaml +0 -4845
- package/new-ui/public/logo.png +0 -0
- package/new-ui/src/api/client.ts +0 -814
- package/new-ui/src/api/hooks/index.ts +0 -64
- package/new-ui/src/api/hooks/use-agents.ts +0 -58
- package/new-ui/src/api/hooks/use-channels.ts +0 -115
- package/new-ui/src/api/hooks/use-config-api.ts +0 -46
- package/new-ui/src/api/hooks/use-costs.ts +0 -122
- package/new-ui/src/api/hooks/use-db-query.ts +0 -29
- package/new-ui/src/api/hooks/use-epics.ts +0 -75
- package/new-ui/src/api/hooks/use-repos.ts +0 -61
- package/new-ui/src/api/hooks/use-schedules.ts +0 -81
- package/new-ui/src/api/hooks/use-services.ts +0 -16
- package/new-ui/src/api/hooks/use-stats.ts +0 -27
- package/new-ui/src/api/hooks/use-tasks.ts +0 -89
- package/new-ui/src/api/hooks/use-workflows.ts +0 -109
- package/new-ui/src/api/types.ts +0 -549
- package/new-ui/src/app/App.tsx +0 -13
- package/new-ui/src/app/providers.tsx +0 -32
- package/new-ui/src/app/router.tsx +0 -52
- package/new-ui/src/components/layout/app-header.tsx +0 -47
- package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
- package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
- package/new-ui/src/components/layout/config-guard.tsx +0 -22
- package/new-ui/src/components/layout/root-layout.tsx +0 -40
- package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
- package/new-ui/src/components/shared/command-menu.tsx +0 -131
- package/new-ui/src/components/shared/data-grid.tsx +0 -141
- package/new-ui/src/components/shared/empty-state.tsx +0 -24
- package/new-ui/src/components/shared/error-boundary.tsx +0 -72
- package/new-ui/src/components/shared/json-viewer.tsx +0 -47
- package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
- package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
- package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
- package/new-ui/src/components/shared/stats-bar.tsx +0 -132
- package/new-ui/src/components/shared/status-badge.tsx +0 -131
- package/new-ui/src/components/shared/usage-summary.tsx +0 -179
- package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
- package/new-ui/src/components/ui/alert.tsx +0 -60
- package/new-ui/src/components/ui/avatar.tsx +0 -96
- package/new-ui/src/components/ui/badge.tsx +0 -46
- package/new-ui/src/components/ui/button.tsx +0 -62
- package/new-ui/src/components/ui/card.tsx +0 -75
- package/new-ui/src/components/ui/command.tsx +0 -160
- package/new-ui/src/components/ui/dialog.tsx +0 -143
- package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
- package/new-ui/src/components/ui/input.tsx +0 -21
- package/new-ui/src/components/ui/label.tsx +0 -19
- package/new-ui/src/components/ui/progress.tsx +0 -26
- package/new-ui/src/components/ui/scroll-area.tsx +0 -54
- package/new-ui/src/components/ui/select.tsx +0 -175
- package/new-ui/src/components/ui/separator.tsx +0 -28
- package/new-ui/src/components/ui/sheet.tsx +0 -132
- package/new-ui/src/components/ui/sidebar.tsx +0 -691
- package/new-ui/src/components/ui/skeleton.tsx +0 -13
- package/new-ui/src/components/ui/sonner.tsx +0 -35
- package/new-ui/src/components/ui/switch.tsx +0 -33
- package/new-ui/src/components/ui/table.tsx +0 -92
- package/new-ui/src/components/ui/tabs.tsx +0 -79
- package/new-ui/src/components/ui/textarea.tsx +0 -18
- package/new-ui/src/components/ui/tooltip.tsx +0 -51
- package/new-ui/src/components/workflows/action-node.tsx +0 -53
- package/new-ui/src/components/workflows/condition-node.tsx +0 -50
- package/new-ui/src/components/workflows/graph-utils.ts +0 -124
- package/new-ui/src/components/workflows/json-tree.tsx +0 -189
- package/new-ui/src/components/workflows/node-styles.ts +0 -10
- package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
- package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
- package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
- package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
- package/new-ui/src/hooks/use-config.ts +0 -203
- package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
- package/new-ui/src/hooks/use-mobile.ts +0 -19
- package/new-ui/src/hooks/use-theme.ts +0 -60
- package/new-ui/src/lib/config.ts +0 -188
- package/new-ui/src/lib/slugs.ts +0 -71
- package/new-ui/src/lib/utils.ts +0 -120
- package/new-ui/src/main.tsx +0 -11
- package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
- package/new-ui/src/pages/agents/page.tsx +0 -134
- package/new-ui/src/pages/chat/page.tsx +0 -674
- package/new-ui/src/pages/config/page.tsx +0 -1109
- package/new-ui/src/pages/dashboard/page.tsx +0 -454
- package/new-ui/src/pages/debug/page.tsx +0 -275
- package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
- package/new-ui/src/pages/epics/page.tsx +0 -321
- package/new-ui/src/pages/not-found/page.tsx +0 -18
- package/new-ui/src/pages/repos/page.tsx +0 -369
- package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
- package/new-ui/src/pages/schedules/page.tsx +0 -477
- package/new-ui/src/pages/services/page.tsx +0 -128
- package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
- package/new-ui/src/pages/tasks/page.tsx +0 -592
- package/new-ui/src/pages/usage/page.tsx +0 -195
- package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
- package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
- package/new-ui/src/pages/workflows/page.tsx +0 -266
- package/new-ui/src/styles/ag-grid.css +0 -36
- package/new-ui/src/styles/globals.css +0 -213
- package/new-ui/test-results/.last-run.json +0 -4
- package/new-ui/tsconfig.app.json +0 -34
- package/new-ui/tsconfig.json +0 -4
- package/new-ui/tsconfig.node.json +0 -26
- package/new-ui/vercel.json +0 -4
- package/new-ui/vite.config.ts +0 -28
- package/plugin/README.md +0 -1
- package/plugin/build-pi-skills.ts +0 -233
- package/plugin/hooks/hooks.json +0 -71
- package/prek.toml +0 -75
- package/pyproject.toml +0 -9
- package/scripts/check-db-boundary.sh +0 -60
- package/scripts/e2e-docker-provider.ts +0 -820
- package/scripts/e2e-io-schemas-test.ts +0 -807
- package/scripts/e2e-provider-test.ts +0 -220
- package/scripts/e2e-workflow-redesign.sh +0 -229
- package/scripts/e2e-workflow-test.sh +0 -285
- package/scripts/e2e-workflow-test.ts +0 -857
- package/scripts/generate-mcp-docs.ts +0 -415
- package/scripts/generate-openapi.ts +0 -26
- package/scripts/measure-tool-tokens.ts +0 -118
- package/scripts/x402-e2e-test.ts +0 -195
- package/scripts/x402-test-server.ts +0 -236
- package/scripts/x402-testnet-e2e.ts +0 -668
- package/slack-manifest.json +0 -88
- package/templates-ui/README.md +0 -46
- package/templates-ui/components.json +0 -17
- package/templates-ui/eslint.config.mjs +0 -18
- package/templates-ui/next.config.ts +0 -7
- package/templates-ui/package.json +0 -35
- package/templates-ui/pnpm-lock.yaml +0 -4571
- package/templates-ui/postcss.config.mjs +0 -7
- package/templates-ui/public/file.svg +0 -1
- package/templates-ui/public/globe.svg +0 -1
- package/templates-ui/public/logo.png +0 -0
- package/templates-ui/public/next.svg +0 -1
- package/templates-ui/public/vercel.svg +0 -1
- package/templates-ui/public/window.svg +0 -1
- package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
- package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
- package/templates-ui/src/app/api/templates/route.ts +0 -18
- package/templates-ui/src/app/builder/page.tsx +0 -37
- package/templates-ui/src/app/globals.css +0 -94
- package/templates-ui/src/app/layout.tsx +0 -79
- package/templates-ui/src/app/page.tsx +0 -38
- package/templates-ui/src/app/robots.ts +0 -11
- package/templates-ui/src/app/sitemap.ts +0 -31
- package/templates-ui/src/components/compose-builder.tsx +0 -442
- package/templates-ui/src/components/compose-preview.tsx +0 -117
- package/templates-ui/src/components/file-preview.tsx +0 -77
- package/templates-ui/src/components/footer.tsx +0 -40
- package/templates-ui/src/components/header.tsx +0 -41
- package/templates-ui/src/components/template-card.tsx +0 -87
- package/templates-ui/src/components/template-detail.tsx +0 -125
- package/templates-ui/src/components/template-gallery.tsx +0 -263
- package/templates-ui/src/components/ui/badge.tsx +0 -36
- package/templates-ui/src/components/ui/button.tsx +0 -57
- package/templates-ui/src/components/ui/card.tsx +0 -76
- package/templates-ui/src/components/ui/separator.tsx +0 -31
- package/templates-ui/src/components/ui/tooltip.tsx +0 -32
- package/templates-ui/src/lib/compose-generator.ts +0 -241
- package/templates-ui/src/lib/templates.ts +0 -137
- package/templates-ui/src/lib/utils.ts +0 -6
- package/templates-ui/tsconfig.json +0 -34
- package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
- package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
- package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
- package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
- package/thoughts/shared/plans/.gitkeep +0 -0
- package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
- package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
- package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
- package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
- package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
- package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
- package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
- package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
- package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
- package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
- package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
- package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
- package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
- package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
- package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
- package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
- package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
- package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
- package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
- package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
- package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
- package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
- package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
- package/thoughts/shared/research/.gitkeep +0 -0
- package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
- package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
- package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
- package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
- package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
- package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
- package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
- package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
- package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
- package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
- package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
- package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
- package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
- package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
- package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
- package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
- package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
- package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
- package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
- package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
- package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
- package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
- package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
- package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
- package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
- package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
- package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
- package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
- package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
- package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
- package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
- package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
- package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
- package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
- package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
- package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
- package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
- package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
- package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
- package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
- package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
- package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
- package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
- package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
- package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
- package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
- package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
- package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
- package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
- package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
- package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
- package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
- package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
- package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
- package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
- package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
- package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
- package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
- package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
- package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
- package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
- package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
- package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
- package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
- package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
- package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
- package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
- package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
- package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
- package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
- package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
- package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
- package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
- package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
- package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
- package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
- package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
- package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
- package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
- package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
- 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
|