@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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
-- 013_prompt_templates.sql
|
|
2
|
+
-- Prompt Template Registry: per-event customizable prompt templates with scope resolution,
|
|
3
|
+
-- three-state behavior, wildcard matching, and version history.
|
|
4
|
+
|
|
5
|
+
CREATE TABLE IF NOT EXISTS prompt_templates (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
eventType TEXT NOT NULL,
|
|
8
|
+
scope TEXT NOT NULL CHECK(scope IN ('global', 'agent', 'repo')),
|
|
9
|
+
scopeId TEXT,
|
|
10
|
+
state TEXT NOT NULL DEFAULT 'enabled' CHECK(state IN ('enabled', 'default_prompt_fallback', 'skip_event')),
|
|
11
|
+
body TEXT NOT NULL,
|
|
12
|
+
isDefault INTEGER NOT NULL DEFAULT 0,
|
|
13
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
14
|
+
createdBy TEXT,
|
|
15
|
+
createdAt TEXT NOT NULL,
|
|
16
|
+
updatedAt TEXT NOT NULL,
|
|
17
|
+
UNIQUE(eventType, scope, scopeId)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS prompt_template_history (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
templateId TEXT NOT NULL,
|
|
23
|
+
version INTEGER NOT NULL,
|
|
24
|
+
body TEXT NOT NULL,
|
|
25
|
+
state TEXT NOT NULL,
|
|
26
|
+
changedBy TEXT,
|
|
27
|
+
changedAt TEXT NOT NULL,
|
|
28
|
+
changeReason TEXT
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_prompt_templates_event_type ON prompt_templates(eventType);
|
|
32
|
+
CREATE INDEX IF NOT EXISTS idx_prompt_templates_scope ON prompt_templates(scope, scopeId);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_prompt_template_history_template ON prompt_template_history(templateId);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
-- Fix: template seeding created a spurious version 2 ("Reset to default") for every
|
|
2
|
+
-- seeded template because upsertPromptTemplate hardcoded isDefault=0, requiring
|
|
3
|
+
-- an immediate resetPromptTemplateToDefault call to flip it.
|
|
4
|
+
|
|
5
|
+
-- Delete spurious "Reset to default" history entries created by the two-step seed.
|
|
6
|
+
-- These are version=2 entries where version=1 for the same template has identical body.
|
|
7
|
+
DELETE FROM prompt_template_history
|
|
8
|
+
WHERE version = 2
|
|
9
|
+
AND changeReason = 'Reset to default'
|
|
10
|
+
AND templateId IN (
|
|
11
|
+
SELECT h2.templateId
|
|
12
|
+
FROM prompt_template_history h2
|
|
13
|
+
JOIN prompt_template_history h1
|
|
14
|
+
ON h1.templateId = h2.templateId
|
|
15
|
+
AND h1.version = 1
|
|
16
|
+
AND h1.changeReason = 'Seeded from code registry'
|
|
17
|
+
AND h1.body = h2.body
|
|
18
|
+
WHERE h2.version = 2
|
|
19
|
+
AND h2.changeReason = 'Reset to default'
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
-- Reset version back to 1 for templates that are currently at version=2
|
|
23
|
+
-- and only have version=1 history remaining (the spurious v2 was just deleted).
|
|
24
|
+
UPDATE prompt_templates
|
|
25
|
+
SET version = 1
|
|
26
|
+
WHERE version = 2
|
|
27
|
+
AND isDefault = 1
|
|
28
|
+
AND id NOT IN (
|
|
29
|
+
SELECT templateId FROM prompt_template_history WHERE version = 2
|
|
30
|
+
);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
-- Skills table: stores skill definitions
|
|
2
|
+
CREATE TABLE IF NOT EXISTS skills (
|
|
3
|
+
id TEXT PRIMARY KEY,
|
|
4
|
+
name TEXT NOT NULL,
|
|
5
|
+
description TEXT NOT NULL,
|
|
6
|
+
content TEXT NOT NULL DEFAULT '',
|
|
7
|
+
|
|
8
|
+
-- Type & ownership
|
|
9
|
+
type TEXT NOT NULL DEFAULT 'personal'
|
|
10
|
+
CHECK (type IN ('remote', 'personal')),
|
|
11
|
+
scope TEXT NOT NULL DEFAULT 'agent'
|
|
12
|
+
CHECK (scope IN ('global', 'swarm', 'agent')),
|
|
13
|
+
ownerAgentId TEXT,
|
|
14
|
+
|
|
15
|
+
-- Remote skill metadata
|
|
16
|
+
sourceUrl TEXT,
|
|
17
|
+
sourceRepo TEXT,
|
|
18
|
+
sourcePath TEXT,
|
|
19
|
+
sourceBranch TEXT DEFAULT 'main',
|
|
20
|
+
sourceHash TEXT,
|
|
21
|
+
isComplex INTEGER DEFAULT 0,
|
|
22
|
+
|
|
23
|
+
-- Parsed frontmatter cache (denormalized)
|
|
24
|
+
allowedTools TEXT,
|
|
25
|
+
model TEXT,
|
|
26
|
+
effort TEXT,
|
|
27
|
+
context TEXT,
|
|
28
|
+
agent TEXT,
|
|
29
|
+
disableModelInvocation INTEGER DEFAULT 0,
|
|
30
|
+
userInvocable INTEGER DEFAULT 1,
|
|
31
|
+
|
|
32
|
+
-- Metadata
|
|
33
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
34
|
+
isEnabled INTEGER NOT NULL DEFAULT 1,
|
|
35
|
+
|
|
36
|
+
createdAt TEXT NOT NULL,
|
|
37
|
+
lastUpdatedAt TEXT NOT NULL,
|
|
38
|
+
lastFetchedAt TEXT,
|
|
39
|
+
|
|
40
|
+
FOREIGN KEY (ownerAgentId) REFERENCES agents(id)
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
-- Unique constraint: name must be unique within scope+owner combination
|
|
44
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_skills_name_scope
|
|
45
|
+
ON skills(name, scope, COALESCE(ownerAgentId, ''));
|
|
46
|
+
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_skills_type ON skills(type);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_skills_scope ON skills(scope);
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_skills_owner ON skills(ownerAgentId);
|
|
50
|
+
|
|
51
|
+
-- Agent-skill junction table
|
|
52
|
+
CREATE TABLE IF NOT EXISTS agent_skills (
|
|
53
|
+
id TEXT PRIMARY KEY,
|
|
54
|
+
agentId TEXT NOT NULL,
|
|
55
|
+
skillId TEXT NOT NULL,
|
|
56
|
+
isActive INTEGER NOT NULL DEFAULT 1,
|
|
57
|
+
installedAt TEXT NOT NULL,
|
|
58
|
+
|
|
59
|
+
FOREIGN KEY (agentId) REFERENCES agents(id),
|
|
60
|
+
FOREIGN KEY (skillId) REFERENCES skills(id) ON DELETE CASCADE,
|
|
61
|
+
UNIQUE(agentId, skillId)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_agent_skills_agent ON agent_skills(agentId);
|
|
65
|
+
CREATE INDEX IF NOT EXISTS idx_agent_skills_skill ON agent_skills(skillId);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
-- 019_approval_requests.sql
|
|
2
|
+
-- Human-in-the-Loop approval request system for workflow nodes and agent tools
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS approval_requests (
|
|
5
|
+
id TEXT PRIMARY KEY, -- UUID
|
|
6
|
+
title TEXT NOT NULL, -- Display title for the request
|
|
7
|
+
questions JSONB NOT NULL, -- Array of Question objects
|
|
8
|
+
|
|
9
|
+
-- Source context (one of these pairs will be set)
|
|
10
|
+
workflowRunId TEXT, -- FK → workflow_runs.id (if from workflow)
|
|
11
|
+
workflowRunStepId TEXT, -- FK → workflow_run_steps.id (if from workflow)
|
|
12
|
+
sourceTaskId TEXT, -- FK → agent_tasks.id (if from agent tool)
|
|
13
|
+
|
|
14
|
+
-- Approver policy
|
|
15
|
+
approvers JSONB NOT NULL, -- { users: [...], roles: [...], policy: "any"|"all"|{min:N} }
|
|
16
|
+
|
|
17
|
+
-- State
|
|
18
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected', 'timeout')),
|
|
19
|
+
responses JSONB, -- Keyed by question ID
|
|
20
|
+
resolvedBy TEXT, -- user ID of who responded
|
|
21
|
+
resolvedAt DATETIME, -- when resolved
|
|
22
|
+
|
|
23
|
+
-- Timeout
|
|
24
|
+
timeoutSeconds INTEGER, -- NULL = no timeout
|
|
25
|
+
expiresAt DATETIME, -- computed: createdAt + timeoutSeconds
|
|
26
|
+
|
|
27
|
+
-- Notifications sent
|
|
28
|
+
notificationChannels JSONB, -- [{ channel: "slack", target: "...", messageTs: "..." }]
|
|
29
|
+
|
|
30
|
+
-- Metadata
|
|
31
|
+
createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
32
|
+
updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
-- For the history UI
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_approval_requests_status ON approval_requests(status);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_approval_requests_created ON approval_requests(createdAt DESC);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_approval_requests_workflow ON approval_requests(workflowRunId);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_approval_requests_task ON approval_requests(sourceTaskId);
|
|
40
|
+
-- For recovery: find pending requests that may have expired during downtime
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_approval_requests_expires ON approval_requests(expiresAt) WHERE status = 'pending';
|
package/src/be/seed.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seed default prompt templates into the DB from the in-memory code registry.
|
|
3
|
+
*
|
|
4
|
+
* Called from initDb() after migrations run. Ensures every registered
|
|
5
|
+
* EventTemplateDefinition has a corresponding global default in the
|
|
6
|
+
* prompt_templates table.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { getAllTemplateDefinitions } from "../prompts/registry";
|
|
10
|
+
import { getPromptTemplates, resetPromptTemplateToDefault, upsertPromptTemplate } from "./db";
|
|
11
|
+
|
|
12
|
+
// Side-effect imports: register ALL template definitions so they're seeded on API startup.
|
|
13
|
+
// Webhook handler templates (github, gitlab, etc.) are loaded transitively by the API server's
|
|
14
|
+
// handler imports, but runner/session templates are only loaded by the worker. Importing them
|
|
15
|
+
// here ensures all templates are available for the render endpoint and seeded to the DB.
|
|
16
|
+
import "../prompts/session-templates";
|
|
17
|
+
import "../commands/templates";
|
|
18
|
+
import "../tools/templates";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Seed default templates into the DB.
|
|
22
|
+
*
|
|
23
|
+
* For each registered EventTemplateDefinition:
|
|
24
|
+
* - If no global record exists at all, insert one as default (isDefault=true, state=enabled)
|
|
25
|
+
* - If a global default (isDefault=true) exists and its body differs from code, update it
|
|
26
|
+
* - Never touch records where isDefault=false (user customizations)
|
|
27
|
+
*/
|
|
28
|
+
export function seedDefaultTemplates(): void {
|
|
29
|
+
const definitions = getAllTemplateDefinitions();
|
|
30
|
+
|
|
31
|
+
if (definitions.length === 0) {
|
|
32
|
+
return; // No templates registered yet — expected during early phases
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
for (const def of definitions) {
|
|
36
|
+
// Look for ALL existing global records for this eventType (both default and customized)
|
|
37
|
+
const allGlobal = getPromptTemplates({
|
|
38
|
+
eventType: def.eventType,
|
|
39
|
+
scope: "global",
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const globalRecord = allGlobal.find((t) => t.scopeId === null);
|
|
43
|
+
|
|
44
|
+
if (!globalRecord) {
|
|
45
|
+
// No global record at all — seed one with isDefault=true directly.
|
|
46
|
+
upsertPromptTemplate({
|
|
47
|
+
eventType: def.eventType,
|
|
48
|
+
scope: "global",
|
|
49
|
+
body: def.defaultBody,
|
|
50
|
+
createdBy: "system",
|
|
51
|
+
changeReason: "Seeded from code registry",
|
|
52
|
+
isDefault: true,
|
|
53
|
+
});
|
|
54
|
+
} else if (globalRecord.isDefault && globalRecord.body !== def.defaultBody) {
|
|
55
|
+
// Global default exists but body has drifted from code — update it.
|
|
56
|
+
// Only update if the record is still marked as default (not user-customized).
|
|
57
|
+
resetPromptTemplateToDefault(globalRecord.id, def.defaultBody);
|
|
58
|
+
}
|
|
59
|
+
// If record exists with isDefault=false (user customization): leave it alone
|
|
60
|
+
// If record exists with isDefault=true and body matches: leave it alone
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses SKILL.md content (YAML frontmatter + markdown body).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export interface ParsedSkill {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
allowedTools?: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
effort?: string;
|
|
11
|
+
context?: string;
|
|
12
|
+
agent?: string;
|
|
13
|
+
disableModelInvocation?: boolean;
|
|
14
|
+
userInvocable?: boolean;
|
|
15
|
+
body: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Parse SKILL.md content into structured metadata + body.
|
|
20
|
+
* Frontmatter is delimited by `---` lines at the start.
|
|
21
|
+
*/
|
|
22
|
+
export function parseSkillContent(content: string): ParsedSkill {
|
|
23
|
+
const trimmed = content.trim();
|
|
24
|
+
|
|
25
|
+
if (!trimmed.startsWith("---")) {
|
|
26
|
+
throw new Error("Skill content must start with YAML frontmatter (---). No frontmatter found.");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const secondDelimiter = trimmed.indexOf("---", 3);
|
|
30
|
+
if (secondDelimiter === -1) {
|
|
31
|
+
throw new Error("Skill content has unterminated frontmatter. Missing closing ---.");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const frontmatterRaw = trimmed.slice(3, secondDelimiter).trim();
|
|
35
|
+
const body = trimmed.slice(secondDelimiter + 3).trim();
|
|
36
|
+
|
|
37
|
+
// Parse simple YAML key-value pairs
|
|
38
|
+
const metadata: Record<string, string> = {};
|
|
39
|
+
for (const line of frontmatterRaw.split("\n")) {
|
|
40
|
+
const colonIdx = line.indexOf(":");
|
|
41
|
+
if (colonIdx === -1) continue;
|
|
42
|
+
const key = line.slice(0, colonIdx).trim();
|
|
43
|
+
const value = line.slice(colonIdx + 1).trim();
|
|
44
|
+
if (key && value) {
|
|
45
|
+
metadata[key] = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Validate required fields
|
|
50
|
+
if (!metadata.name) {
|
|
51
|
+
throw new Error('Skill frontmatter is missing required field: "name"');
|
|
52
|
+
}
|
|
53
|
+
if (!metadata.description) {
|
|
54
|
+
throw new Error('Skill frontmatter is missing required field: "description"');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
name: metadata.name,
|
|
59
|
+
description: metadata.description,
|
|
60
|
+
allowedTools: metadata["allowed-tools"] || undefined,
|
|
61
|
+
model: metadata.model || undefined,
|
|
62
|
+
effort: metadata.effort || undefined,
|
|
63
|
+
context: metadata.context || undefined,
|
|
64
|
+
agent: metadata.agent || undefined,
|
|
65
|
+
disableModelInvocation: metadata["disable-model-invocation"] === "true" ? true : undefined,
|
|
66
|
+
userInvocable:
|
|
67
|
+
metadata["user-invocable"] !== undefined ? metadata["user-invocable"] !== "false" : undefined,
|
|
68
|
+
body,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem sync for skills.
|
|
3
|
+
*
|
|
4
|
+
* Writes installed skills to ~/.claude/skills/<name>/SKILL.md (and optionally
|
|
5
|
+
* ~/.pi/agent/skills/<name>/SKILL.md) so Claude Code and Pi discover them
|
|
6
|
+
* natively.
|
|
7
|
+
*
|
|
8
|
+
* This runs on the API side — workers call it via POST /api/skills/sync-filesystem.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from "node:fs";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { getAgentSkills } from "./db";
|
|
15
|
+
|
|
16
|
+
export interface SkillSyncResult {
|
|
17
|
+
synced: number;
|
|
18
|
+
removed: number;
|
|
19
|
+
errors: string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Sync agent's installed skills to the filesystem.
|
|
24
|
+
*
|
|
25
|
+
* For simple skills (content in DB): writes SKILL.md to ~/.claude/skills/<name>/
|
|
26
|
+
* For complex skills (isComplex=true): skipped here (handled by npx in entrypoint)
|
|
27
|
+
*/
|
|
28
|
+
export function syncSkillsToFilesystem(
|
|
29
|
+
agentId: string,
|
|
30
|
+
harnessType: "claude" | "pi" | "both" = "both",
|
|
31
|
+
homeOverride?: string,
|
|
32
|
+
): SkillSyncResult {
|
|
33
|
+
const skills = getAgentSkills(agentId);
|
|
34
|
+
const home = homeOverride ?? homedir();
|
|
35
|
+
const errors: string[] = [];
|
|
36
|
+
let synced = 0;
|
|
37
|
+
|
|
38
|
+
// Directories to write to
|
|
39
|
+
const skillDirs: string[] = [];
|
|
40
|
+
if (harnessType === "claude" || harnessType === "both") {
|
|
41
|
+
skillDirs.push(join(home, ".claude", "skills"));
|
|
42
|
+
}
|
|
43
|
+
if (harnessType === "pi" || harnessType === "both") {
|
|
44
|
+
skillDirs.push(join(home, ".pi", "agent", "skills"));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Ensure base dirs exist
|
|
48
|
+
for (const dir of skillDirs) {
|
|
49
|
+
mkdirSync(dir, { recursive: true });
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Track which skill names we write (for cleanup)
|
|
53
|
+
const writtenNames = new Set<string>();
|
|
54
|
+
|
|
55
|
+
for (const skill of skills) {
|
|
56
|
+
if (!skill.isActive || !skill.isEnabled) continue;
|
|
57
|
+
if (skill.isComplex) continue; // Complex skills handled by npx
|
|
58
|
+
if (!skill.content) continue;
|
|
59
|
+
|
|
60
|
+
// Sanitize skill name to prevent path traversal (strip /, .., and non-safe chars)
|
|
61
|
+
const safeName = skill.name.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
62
|
+
if (!safeName) continue;
|
|
63
|
+
|
|
64
|
+
writtenNames.add(safeName);
|
|
65
|
+
|
|
66
|
+
for (const baseDir of skillDirs) {
|
|
67
|
+
const skillDir = join(baseDir, safeName);
|
|
68
|
+
const skillFile = join(skillDir, "SKILL.md");
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
mkdirSync(skillDir, { recursive: true });
|
|
72
|
+
writeFileSync(skillFile, skill.content, "utf-8");
|
|
73
|
+
synced++;
|
|
74
|
+
} catch (err) {
|
|
75
|
+
errors.push(
|
|
76
|
+
`${skill.name} -> ${skillDir}: ${err instanceof Error ? err.message : "Unknown error"}`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Cleanup: remove skill directories that are no longer installed
|
|
83
|
+
let removed = 0;
|
|
84
|
+
for (const baseDir of skillDirs) {
|
|
85
|
+
if (!existsSync(baseDir)) continue;
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
const existing = readdirSync(baseDir, { withFileTypes: true });
|
|
89
|
+
for (const entry of existing) {
|
|
90
|
+
if (entry.isDirectory() && !writtenNames.has(entry.name)) {
|
|
91
|
+
const skillDir = join(baseDir, entry.name);
|
|
92
|
+
try {
|
|
93
|
+
rmSync(skillDir, { recursive: true, force: true });
|
|
94
|
+
removed++;
|
|
95
|
+
} catch {
|
|
96
|
+
// Non-fatal — skip cleanup errors
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
} catch {
|
|
101
|
+
// Non-fatal — skip if we can't read the directory
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return { synced, removed, errors };
|
|
106
|
+
}
|