@desplega.ai/agent-swarm 1.20.0 → 1.51.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +271 -169
- package/openapi.json +5015 -0
- package/package.json +40 -7
- package/plugin/commands/close-issue.md +7 -3
- package/plugin/commands/create-pr.md +18 -12
- package/plugin/commands/implement-issue.md +7 -3
- package/plugin/commands/respond-github.md +8 -4
- package/plugin/commands/review-pr.md +44 -10
- package/plugin/commands/start-leader.md +1 -3
- package/plugin/commands/start-worker.md +1 -3
- package/plugin/commands/work-on-task.md +22 -3
- package/plugin/pi-skills/close-issue/SKILL.md +90 -0
- package/plugin/pi-skills/create-pr/SKILL.md +99 -0
- package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
- package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
- package/plugin/pi-skills/respond-github/SKILL.md +98 -0
- package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
- package/plugin/pi-skills/review-pr/SKILL.md +261 -0
- package/plugin/pi-skills/start-leader/SKILL.md +121 -0
- package/plugin/pi-skills/start-worker/SKILL.md +60 -0
- package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
- package/plugin/pi-skills/todos/SKILL.md +66 -0
- package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
- package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
- package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
- package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
- package/plugin/skills/artifacts/examples/static-report.sh +17 -0
- package/plugin/skills/artifacts/skill.md +71 -0
- package/src/agentmail/app.ts +65 -0
- package/src/agentmail/handlers.ts +262 -0
- package/src/agentmail/index.ts +9 -0
- package/src/agentmail/templates.ts +111 -0
- package/src/agentmail/types.ts +51 -0
- package/src/artifact-sdk/browser-sdk.ts +30 -0
- package/src/artifact-sdk/index.ts +2 -0
- package/src/artifact-sdk/localtunnel.d.ts +20 -0
- package/src/artifact-sdk/port.ts +12 -0
- package/src/artifact-sdk/server.ts +156 -0
- package/src/artifact-sdk/tunnel.ts +19 -0
- package/src/be/chunking.ts +193 -0
- package/src/be/db-queries/oauth.ts +90 -0
- package/src/be/db-queries/tracker.ts +182 -0
- package/src/be/db.ts +3327 -784
- package/src/be/embedding.ts +80 -0
- package/src/be/migrations/001_initial.sql +409 -0
- package/src/be/migrations/002_one_time_schedules.sql +59 -0
- package/src/be/migrations/003_workflows.sql +51 -0
- package/src/be/migrations/004_workflow_source.sql +81 -0
- package/src/be/migrations/005_epic_next_steps.sql +2 -0
- package/src/be/migrations/006_vcs_provider.sql +94 -0
- package/src/be/migrations/007_task_dir.sql +2 -0
- package/src/be/migrations/008_workflow_redesign.sql +85 -0
- package/src/be/migrations/009_tracker_integration.sql +144 -0
- package/src/be/migrations/010_step_diagnostics.sql +1 -0
- package/src/be/migrations/011_step_next_port.sql +1 -0
- package/src/be/migrations/012_trigger_schema.sql +1 -0
- package/src/be/migrations/013_task_output_schema.sql +2 -0
- 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/runner.ts +188 -0
- package/src/be/seed.ts +62 -0
- package/src/cli.tsx +231 -299
- package/src/commands/artifact.ts +241 -0
- package/src/commands/onboard/compose-generator.ts +169 -0
- package/src/commands/onboard/env-generator.ts +79 -0
- package/src/commands/onboard/manifest.ts +37 -0
- package/src/commands/onboard/presets.ts +85 -0
- package/src/commands/onboard/service-names.ts +47 -0
- package/src/commands/onboard/steps/core-credentials.tsx +111 -0
- package/src/commands/onboard/steps/custom-templates.tsx +168 -0
- package/src/commands/onboard/steps/generate.tsx +154 -0
- package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
- package/src/commands/onboard/steps/harness.tsx +21 -0
- package/src/commands/onboard/steps/health-check.tsx +171 -0
- package/src/commands/onboard/steps/integration-github.tsx +105 -0
- package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
- package/src/commands/onboard/steps/integration-menu.tsx +58 -0
- package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
- package/src/commands/onboard/steps/integration-slack.tsx +165 -0
- package/src/commands/onboard/steps/post-connect.tsx +145 -0
- package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
- package/src/commands/onboard/steps/post-task.tsx +103 -0
- package/src/commands/onboard/steps/prereq-check.tsx +178 -0
- package/src/commands/onboard/steps/review.tsx +82 -0
- package/src/commands/onboard/steps/start.tsx +97 -0
- package/src/commands/onboard/templates.ts +34 -0
- package/src/commands/onboard/types.ts +259 -0
- package/src/commands/onboard.tsx +425 -0
- package/src/commands/runner.ts +1540 -630
- package/src/commands/setup.tsx +23 -38
- package/src/commands/shared/client-config.ts +41 -0
- package/src/commands/templates.ts +172 -0
- package/src/github/app.ts +8 -0
- package/src/github/handlers.ts +384 -151
- package/src/github/index.ts +1 -0
- 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/github/types.ts +1 -0
- package/src/gitlab/auth.ts +63 -0
- package/src/gitlab/handlers.ts +368 -0
- package/src/gitlab/index.ts +19 -0
- package/src/gitlab/reactions.ts +104 -0
- package/src/gitlab/templates.ts +140 -0
- package/src/gitlab/types.ts +130 -0
- package/src/heartbeat/heartbeat.ts +434 -0
- package/src/heartbeat/index.ts +1 -0
- package/src/heartbeat/templates.ts +30 -0
- package/src/hooks/hook.ts +555 -4
- package/src/hooks/tool-loop-detection.test.ts +158 -0
- package/src/hooks/tool-loop-detection.ts +167 -0
- package/src/http/active-sessions.ts +199 -0
- package/src/http/agents.ts +328 -0
- package/src/http/config.ts +191 -0
- package/src/http/core.ts +309 -0
- package/src/http/db-query.ts +91 -0
- package/src/http/ecosystem.ts +63 -0
- package/src/http/epics.ts +460 -0
- package/src/http/index.ts +216 -0
- package/src/http/mcp.ts +77 -0
- package/src/http/memory.ts +168 -0
- package/src/http/openapi.ts +109 -0
- package/src/http/poll.ts +299 -0
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/repos.ts +195 -0
- package/src/http/route-def.ts +123 -0
- package/src/http/schedules.ts +426 -0
- package/src/http/session-data.ts +241 -0
- package/src/http/stats.ts +174 -0
- package/src/http/tasks.ts +468 -0
- package/src/http/trackers/index.ts +10 -0
- package/src/http/trackers/linear.ts +187 -0
- package/src/http/types.ts +12 -0
- package/src/http/utils.ts +87 -0
- package/src/http/webhooks.ts +432 -0
- package/src/http/workflows.ts +530 -0
- package/src/http.ts +1 -1890
- package/src/linear/README.md +65 -0
- package/src/linear/app.ts +48 -0
- package/src/linear/client.ts +18 -0
- package/src/linear/index.ts +1 -0
- package/src/linear/oauth.ts +35 -0
- package/src/linear/outbound.ts +212 -0
- package/src/linear/sync.ts +567 -0
- package/src/linear/templates.ts +47 -0
- package/src/linear/types.ts +7 -0
- package/src/linear/webhook.ts +104 -0
- package/src/oauth/README.md +66 -0
- package/src/oauth/index.ts +6 -0
- package/src/oauth/wrapper.ts +204 -0
- package/src/prompts/base-prompt.ts +150 -265
- package/src/prompts/defaults.ts +196 -0
- 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 +442 -0
- package/src/providers/index.ts +24 -0
- package/src/providers/pi-mono-adapter.ts +442 -0
- package/src/providers/pi-mono-extension.ts +624 -0
- package/src/providers/pi-mono-mcp-client.ts +124 -0
- package/src/providers/types.ts +75 -0
- package/src/scheduler/scheduler.test.ts +2 -0
- package/src/scheduler/scheduler.ts +231 -40
- package/src/server.ts +97 -6
- package/src/slack/HEURISTICS.md +105 -0
- package/src/slack/actions.ts +133 -0
- package/src/slack/app.ts +7 -0
- package/src/slack/assistant.ts +118 -0
- package/src/slack/blocks.ts +233 -0
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/commands.ts +31 -17
- package/src/slack/files.ts +1 -1
- package/src/slack/handlers.test.ts +114 -1
- package/src/slack/handlers.ts +230 -55
- package/src/slack/responses.ts +120 -67
- package/src/slack/router.ts +17 -99
- package/src/slack/templates.ts +55 -0
- package/src/slack/thread-buffer.ts +213 -0
- package/src/slack/watcher.ts +119 -4
- package/src/tests/agent-activity.test.ts +247 -0
- package/src/tests/agentmail-filters.test.ts +97 -0
- package/src/tests/artifact-sdk.test.ts +800 -0
- package/src/tests/base-prompt.test.ts +264 -0
- package/src/tests/build-pi-skills.test.ts +127 -0
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/claude-adapter.test.ts +126 -0
- package/src/tests/context-versioning.test.ts +425 -0
- package/src/tests/db-queries-oauth.test.ts +197 -0
- package/src/tests/db-queries-tracker.test.ts +230 -0
- package/src/tests/epics.test.ts +3 -3
- package/src/tests/error-tracker.test.ts +368 -0
- package/src/tests/fetch-resolved-env.test.ts +167 -0
- package/src/tests/generate-default-claude-md.test.ts +9 -1
- package/src/tests/generate-identity-templates.test.ts +124 -0
- package/src/tests/gitlab-auth.test.ts +109 -0
- package/src/tests/gitlab-handlers.test.ts +691 -0
- package/src/tests/gitlab-vcs-db.test.ts +177 -0
- package/src/tests/heartbeat.test.ts +364 -0
- package/src/tests/http-api-integration.test.ts +1698 -0
- package/src/tests/linear-outbound-sync.test.ts +200 -0
- package/src/tests/linear-webhook.test.ts +406 -0
- package/src/tests/match-route.test.ts +187 -0
- package/src/tests/memory.test.ts +737 -0
- package/src/tests/migration-runner-regressions.test.ts +86 -0
- package/src/tests/model-control.test.ts +338 -0
- package/src/tests/oauth-wrapper.test.ts +147 -0
- package/src/tests/onboard-compose.test.ts +138 -0
- package/src/tests/onboard-env.test.ts +174 -0
- package/src/tests/onboard-manifest.test.ts +137 -0
- package/src/tests/pi-mono-adapter.test.ts +234 -0
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/progress-dedup.test.ts +98 -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/provider-adapter.test.ts +122 -0
- package/src/tests/provider-command-format.test.ts +98 -0
- package/src/tests/reload-config.test.ts +170 -0
- package/src/tests/runner-polling-api.test.ts +25 -20
- package/src/tests/scheduled-tasks.test.ts +104 -0
- package/src/tests/scheduler-backoff.test.ts +166 -0
- package/src/tests/self-improvement.test.ts +541 -0
- package/src/tests/session-attach.test.ts +536 -0
- package/src/tests/session-costs.test.ts +267 -1
- package/src/tests/slack-actions.test.ts +133 -0
- package/src/tests/slack-assistant.test.ts +136 -0
- package/src/tests/slack-blocks.test.ts +246 -0
- package/src/tests/slack-metadata-inheritance.test.ts +243 -0
- package/src/tests/slack-queue-offline.test.ts +174 -0
- package/src/tests/slack-router.test.ts +181 -0
- package/src/tests/slack-thread-buffer.test.ts +305 -0
- package/src/tests/slack-thread-followups.test.ts +298 -0
- package/src/tests/slack-watcher.test.ts +101 -0
- package/src/tests/structured-output.test.ts +307 -0
- package/src/tests/swarm-repos.test.ts +198 -0
- package/src/tests/task-cancellation.test.ts +6 -4
- package/src/tests/task-working-dir.test.ts +176 -0
- package/src/tests/template-fetch.test.ts +490 -0
- package/src/tests/tool-annotations.test.ts +371 -0
- package/src/tests/tracker-tools.test.ts +184 -0
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-api.test.ts +143 -3
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/validation-adapters.test.ts +86 -0
- package/src/tests/vcs-provider.test.ts +27 -0
- package/src/tests/workflow-agent-task.test.ts +196 -0
- package/src/tests/workflow-async-v2.test.ts +508 -0
- package/src/tests/workflow-convergence.test.ts +541 -0
- package/src/tests/workflow-definition-validation.test.ts +366 -0
- package/src/tests/workflow-engine-v2.test.ts +691 -0
- package/src/tests/workflow-executors.test.ts +736 -0
- package/src/tests/workflow-http-v2.test.ts +599 -0
- package/src/tests/workflow-integration-io.test.ts +902 -0
- package/src/tests/workflow-io-schemas.test.ts +624 -0
- package/src/tests/workflow-registry.test.ts +592 -0
- package/src/tests/workflow-retry-v2.test.ts +401 -0
- package/src/tests/workflow-retry-validation.test.ts +282 -0
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-template.test.ts +288 -0
- package/src/tests/workflow-trigger-schema.test.ts +359 -0
- package/src/tests/workflow-triggers-v2.test.ts +264 -0
- package/src/tests/workflow-versions.test.ts +208 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tests/x402-client.test.ts +117 -0
- package/src/tests/x402-config.test.ts +182 -0
- package/src/tests/x402-spending-tracker.test.ts +185 -0
- package/src/tools/cancel-task.ts +2 -0
- package/src/tools/context-diff.ts +171 -0
- package/src/tools/context-history.ts +138 -0
- package/src/tools/create-channel.ts +1 -0
- package/src/tools/db-query.ts +78 -0
- package/src/tools/delete-channel.ts +132 -0
- package/src/tools/epics/assign-task-to-epic.ts +1 -0
- package/src/tools/epics/create-epic.ts +3 -2
- package/src/tools/epics/delete-epic.ts +2 -0
- package/src/tools/epics/get-epic-details.ts +2 -0
- package/src/tools/epics/list-epics.ts +2 -0
- package/src/tools/epics/unassign-task-from-epic.ts +1 -0
- package/src/tools/epics/update-epic.ts +7 -4
- package/src/tools/get-swarm.ts +2 -0
- package/src/tools/get-task-details.ts +2 -0
- package/src/tools/get-tasks.ts +27 -1
- package/src/tools/inject-learning.ts +106 -0
- package/src/tools/join-swarm.ts +17 -7
- package/src/tools/list-channels.ts +2 -0
- package/src/tools/list-services.ts +2 -0
- package/src/tools/memory-get.ts +56 -0
- package/src/tools/memory-search.ts +131 -0
- package/src/tools/my-agent-info.ts +2 -0
- package/src/tools/poll-task.ts +2 -20
- package/src/tools/post-message.ts +1 -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/read-messages.ts +2 -0
- package/src/tools/register-agentmail-inbox.ts +166 -0
- package/src/tools/register-service.ts +2 -0
- package/src/tools/schedules/create-schedule.ts +134 -24
- package/src/tools/schedules/delete-schedule.ts +2 -0
- package/src/tools/schedules/list-schedules.ts +20 -4
- package/src/tools/schedules/run-schedule-now.ts +1 -0
- package/src/tools/schedules/update-schedule.ts +49 -17
- package/src/tools/send-task.ts +132 -10
- package/src/tools/slack-download-file.ts +4 -2
- package/src/tools/slack-list-channels.ts +2 -0
- package/src/tools/slack-post.ts +2 -0
- package/src/tools/slack-read.ts +2 -0
- package/src/tools/slack-reply.ts +2 -0
- package/src/tools/slack-upload-file.ts +2 -0
- package/src/tools/store-progress.ts +205 -4
- package/src/tools/swarm-config/delete-config.ts +87 -0
- package/src/tools/swarm-config/get-config.ts +108 -0
- package/src/tools/swarm-config/index.ts +4 -0
- package/src/tools/swarm-config/list-config.ts +99 -0
- package/src/tools/swarm-config/set-config.ts +118 -0
- package/src/tools/task-action.ts +50 -5
- package/src/tools/task-dedup.ts +97 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +124 -0
- package/src/tools/tracker/index.ts +6 -0
- package/src/tools/tracker/tracker-link-epic.ts +64 -0
- package/src/tools/tracker/tracker-link-task.ts +64 -0
- package/src/tools/tracker/tracker-map-agent.ts +57 -0
- package/src/tools/tracker/tracker-status.ts +56 -0
- package/src/tools/tracker/tracker-sync-status.ts +42 -0
- package/src/tools/tracker/tracker-unlink.ts +41 -0
- package/src/tools/unregister-service.ts +2 -0
- package/src/tools/update-profile.ts +172 -17
- package/src/tools/update-service-status.ts +2 -0
- package/src/tools/utils.ts +10 -1
- package/src/tools/workflows/create-workflow.ts +129 -0
- package/src/tools/workflows/delete-workflow.ts +42 -0
- package/src/tools/workflows/get-workflow-run.ts +59 -0
- package/src/tools/workflows/get-workflow.ts +53 -0
- package/src/tools/workflows/index.ts +9 -0
- package/src/tools/workflows/list-workflow-runs.ts +48 -0
- package/src/tools/workflows/list-workflows.ts +42 -0
- package/src/tools/workflows/retry-workflow-run.ts +40 -0
- package/src/tools/workflows/trigger-workflow.ts +96 -0
- package/src/tools/workflows/update-workflow.ts +133 -0
- package/src/tracker/types.ts +51 -0
- package/src/types.ts +530 -14
- package/src/utils/credentials.test.ts +156 -0
- package/src/utils/credentials.ts +50 -0
- package/src/utils/error-tracker.ts +190 -0
- package/src/vcs/index.ts +15 -0
- package/src/vcs/types.ts +5 -0
- package/src/workflows/checkpoint.ts +121 -0
- package/src/workflows/cooldown.ts +28 -0
- package/src/workflows/definition.ts +235 -0
- package/src/workflows/engine.ts +580 -0
- package/src/workflows/event-bus.ts +29 -0
- package/src/workflows/executors/agent-task.ts +103 -0
- package/src/workflows/executors/base.ts +86 -0
- package/src/workflows/executors/code-match.ts +88 -0
- package/src/workflows/executors/index.ts +16 -0
- package/src/workflows/executors/notify.ts +93 -0
- package/src/workflows/executors/property-match.ts +104 -0
- package/src/workflows/executors/raw-llm.ts +83 -0
- package/src/workflows/executors/registry.ts +76 -0
- package/src/workflows/executors/script.ts +103 -0
- package/src/workflows/executors/validate.ts +215 -0
- package/src/workflows/executors/vcs.ts +58 -0
- package/src/workflows/index.ts +61 -0
- package/src/workflows/input.ts +46 -0
- package/src/workflows/json-schema-validator.ts +118 -0
- package/src/workflows/recovery.ts +139 -0
- package/src/workflows/resume.ts +229 -0
- package/src/workflows/retry-poller.ts +216 -0
- package/src/workflows/template.ts +74 -0
- package/src/workflows/templates.ts +86 -0
- package/src/workflows/triggers.ts +124 -0
- package/src/workflows/validation.ts +104 -0
- package/src/workflows/version.ts +44 -0
- package/src/x402/cli.ts +140 -0
- package/src/x402/client.ts +192 -0
- package/src/x402/config.ts +131 -0
- package/src/x402/index.ts +37 -0
- package/src/x402/openfort-signer.ts +83 -0
- package/src/x402/spending-tracker.ts +109 -0
- package/templates/official/coder/CLAUDE.md +49 -0
- package/templates/official/coder/IDENTITY.md +28 -0
- package/templates/official/coder/SOUL.md +43 -0
- package/templates/official/coder/TOOLS.md +40 -0
- package/templates/official/coder/config.json +23 -0
- package/templates/official/coder/start-up.sh +23 -0
- package/templates/official/content-reviewer/CLAUDE.md +68 -0
- package/templates/official/content-reviewer/IDENTITY.md +28 -0
- package/templates/official/content-reviewer/SOUL.md +44 -0
- package/templates/official/content-reviewer/TOOLS.md +37 -0
- package/templates/official/content-reviewer/config.json +23 -0
- package/templates/official/content-reviewer/start-up.sh +23 -0
- package/templates/official/content-strategist/CLAUDE.md +63 -0
- package/templates/official/content-strategist/IDENTITY.md +33 -0
- package/templates/official/content-strategist/SOUL.md +48 -0
- package/templates/official/content-strategist/TOOLS.md +47 -0
- package/templates/official/content-strategist/config.json +23 -0
- package/templates/official/content-strategist/start-up.sh +23 -0
- package/templates/official/content-writer/CLAUDE.md +72 -0
- package/templates/official/content-writer/IDENTITY.md +30 -0
- package/templates/official/content-writer/SOUL.md +46 -0
- package/templates/official/content-writer/TOOLS.md +44 -0
- package/templates/official/content-writer/config.json +23 -0
- package/templates/official/content-writer/start-up.sh +23 -0
- package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
- package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
- package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
- package/templates/official/forward-deployed-engineer/config.json +21 -0
- package/templates/official/lead/CLAUDE.md +33 -0
- package/templates/official/lead/IDENTITY.md +36 -0
- package/templates/official/lead/SOUL.md +51 -0
- package/templates/official/lead/config.json +22 -0
- package/templates/official/researcher/CLAUDE.md +46 -0
- package/templates/official/researcher/IDENTITY.md +28 -0
- package/templates/official/researcher/SOUL.md +43 -0
- package/templates/official/researcher/config.json +21 -0
- package/templates/official/reviewer/CLAUDE.md +63 -0
- package/templates/official/reviewer/IDENTITY.md +28 -0
- package/templates/official/reviewer/SOUL.md +45 -0
- package/templates/official/reviewer/config.json +21 -0
- package/templates/official/tester/CLAUDE.md +53 -0
- package/templates/official/tester/IDENTITY.md +28 -0
- package/templates/official/tester/SOUL.md +55 -0
- package/templates/official/tester/config.json +21 -0
- package/templates/schema.ts +35 -0
- package/.claude/settings.local.json +0 -115
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.env.docker.example +0 -39
- package/.env.example +0 -40
- package/.github/workflows/ci.yml +0 -76
- package/.github/workflows/docker-and-deploy.yml +0 -117
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -102
- package/CLAUDE.md +0 -104
- package/CONTRIBUTING.md +0 -270
- package/DEPLOYMENT.md +0 -605
- package/Dockerfile +0 -57
- package/Dockerfile.worker +0 -157
- package/FAQ.md +0 -19
- package/MCP.md +0 -406
- package/UI.md +0 -40
- 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/docker-compose.example.yml +0 -159
- package/docker-entrypoint.sh +0 -352
- package/ecosystem.config.cjs +0 -66
- package/plugin/README.md +0 -1
- package/plugin/hooks/hooks.json +0 -71
- package/pyproject.toml +0 -9
- package/scripts/generate-mcp-docs.ts +0 -415
- package/slack-manifest.json +0 -71
- package/src/tests/get-inbox-message.test.ts +0 -145
- package/src/tools/get-inbox-message.ts +0 -89
- package/src/tools/inbox-delegate.ts +0 -113
- 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/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/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/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/tsconfig.json +0 -37
- package/ui/CLAUDE.md +0 -49
- package/ui/bun.lock +0 -771
- package/ui/index.html +0 -22
- package/ui/package-lock.json +0 -5290
- package/ui/package.json +0 -33
- package/ui/pnpm-lock.yaml +0 -3341
- package/ui/postcss.config.js +0 -6
- package/ui/public/logo.png +0 -0
- package/ui/src/App.tsx +0 -63
- package/ui/src/components/ActivityFeed.tsx +0 -440
- package/ui/src/components/AgentDetailPanel.tsx +0 -733
- package/ui/src/components/AgentsPanel.tsx +0 -815
- package/ui/src/components/ChatPanel.tsx +0 -1920
- package/ui/src/components/ConfigModal.tsx +0 -253
- package/ui/src/components/Dashboard.tsx +0 -832
- package/ui/src/components/EditAgentProfileModal.tsx +0 -433
- package/ui/src/components/EpicDetailPage.tsx +0 -741
- package/ui/src/components/EpicsPanel.tsx +0 -566
- package/ui/src/components/Header.tsx +0 -160
- package/ui/src/components/JsonViewer.tsx +0 -171
- package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
- package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
- package/ui/src/components/ServicesPanel.tsx +0 -622
- package/ui/src/components/SessionLogPanel.tsx +0 -1219
- package/ui/src/components/StatsBar.tsx +0 -321
- package/ui/src/components/StatusBadge.tsx +0 -168
- package/ui/src/components/TaskDetailPanel.tsx +0 -903
- package/ui/src/components/TasksPanel.tsx +0 -614
- package/ui/src/components/UsageCharts.tsx +0 -216
- package/ui/src/components/UsageTab.tsx +0 -394
- package/ui/src/hooks/queries.ts +0 -353
- package/ui/src/hooks/useAutoScroll.ts +0 -83
- package/ui/src/index.css +0 -257
- package/ui/src/lib/api.ts +0 -268
- package/ui/src/lib/config.ts +0 -35
- package/ui/src/lib/contentPreview.ts +0 -208
- package/ui/src/lib/theme.ts +0 -214
- package/ui/src/lib/utils.ts +0 -88
- package/ui/src/main.tsx +0 -28
- package/ui/src/types/api.ts +0 -323
- package/ui/src/vite-env.d.ts +0 -1
- package/ui/tailwind.config.js +0 -37
- package/ui/tsconfig.json +0 -31
- package/ui/vite.config.ts +0 -35
- /package/{thoughts/shared/plans → templates/community}/.gitkeep +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
import { getAgentById } from "@/be/db";
|
|
4
|
+
import { executeReadOnlyQuery } from "@/http/db-query";
|
|
5
|
+
import { createToolRegistrar } from "@/tools/utils";
|
|
6
|
+
|
|
7
|
+
const MCP_MAX_ROWS = 100;
|
|
8
|
+
|
|
9
|
+
export const registerDbQueryTool = (server: McpServer) => {
|
|
10
|
+
createToolRegistrar(server)(
|
|
11
|
+
"db-query",
|
|
12
|
+
{
|
|
13
|
+
title: "Execute database query",
|
|
14
|
+
description:
|
|
15
|
+
"Execute a read-only SQL query against the swarm database. Lead-only. Results capped at 100 rows.",
|
|
16
|
+
annotations: { readOnlyHint: true },
|
|
17
|
+
inputSchema: z.object({
|
|
18
|
+
sql: z.string().describe("SQL query (read-only only — writes are rejected)"),
|
|
19
|
+
params: z.array(z.any()).optional().default([]).describe("Query parameters"),
|
|
20
|
+
}),
|
|
21
|
+
outputSchema: z.object({
|
|
22
|
+
success: z.boolean(),
|
|
23
|
+
columns: z.array(z.string()),
|
|
24
|
+
rows: z.array(z.array(z.any())),
|
|
25
|
+
elapsed: z.number(),
|
|
26
|
+
total: z.number(),
|
|
27
|
+
truncated: z.boolean(),
|
|
28
|
+
}),
|
|
29
|
+
},
|
|
30
|
+
async ({ sql, params }, requestInfo, _meta) => {
|
|
31
|
+
const callerAgent = requestInfo.agentId ? getAgentById(requestInfo.agentId) : null;
|
|
32
|
+
if (!callerAgent?.isLead) {
|
|
33
|
+
return {
|
|
34
|
+
content: [{ type: "text" as const, text: "Only the lead agent can use this tool." }],
|
|
35
|
+
structuredContent: {
|
|
36
|
+
success: false,
|
|
37
|
+
columns: [],
|
|
38
|
+
rows: [],
|
|
39
|
+
elapsed: 0,
|
|
40
|
+
total: 0,
|
|
41
|
+
truncated: false,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const result = executeReadOnlyQuery(sql, params, MCP_MAX_ROWS);
|
|
48
|
+
const truncated = result.total > MCP_MAX_ROWS;
|
|
49
|
+
|
|
50
|
+
// Build a simple text table for Claude
|
|
51
|
+
const header = result.columns.join(" | ");
|
|
52
|
+
const separator = result.columns.map(() => "---").join(" | ");
|
|
53
|
+
const dataRows = result.rows.map((row) => row.map((v) => String(v ?? "NULL")).join(" | "));
|
|
54
|
+
const table = [header, separator, ...dataRows].join("\n");
|
|
55
|
+
const suffix = truncated ? `\n(Showing ${MCP_MAX_ROWS} of ${result.total} rows)` : "";
|
|
56
|
+
const text = `${table}${suffix}\n\n${result.total} rows in ${result.elapsed}ms`;
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
content: [{ type: "text" as const, text }],
|
|
60
|
+
structuredContent: { success: true, ...result, truncated },
|
|
61
|
+
};
|
|
62
|
+
} catch (err: unknown) {
|
|
63
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text" as const, text: `Query error: ${message}` }],
|
|
66
|
+
structuredContent: {
|
|
67
|
+
success: false,
|
|
68
|
+
columns: [],
|
|
69
|
+
rows: [],
|
|
70
|
+
elapsed: 0,
|
|
71
|
+
total: 0,
|
|
72
|
+
truncated: false,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
);
|
|
78
|
+
};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
import { deleteChannel, getAgentById, getChannelById, getChannelByName } from "@/be/db";
|
|
4
|
+
import { createToolRegistrar } from "@/tools/utils";
|
|
5
|
+
|
|
6
|
+
const GENERAL_CHANNEL_ID = "00000000-0000-4000-8000-000000000001";
|
|
7
|
+
|
|
8
|
+
export const registerDeleteChannelTool = (server: McpServer) => {
|
|
9
|
+
createToolRegistrar(server)(
|
|
10
|
+
"delete-channel",
|
|
11
|
+
{
|
|
12
|
+
title: "Delete Channel",
|
|
13
|
+
description:
|
|
14
|
+
"Deletes a channel and all its messages. Only the lead agent can delete channels. The default 'general' channel cannot be deleted.",
|
|
15
|
+
annotations: { destructiveHint: true },
|
|
16
|
+
|
|
17
|
+
inputSchema: z.object({
|
|
18
|
+
channelId: z.string().uuid().optional().describe("The ID of the channel to delete."),
|
|
19
|
+
name: z.string().optional().describe("Channel name (alternative to channelId)."),
|
|
20
|
+
}),
|
|
21
|
+
outputSchema: z.object({
|
|
22
|
+
yourAgentId: z.string().uuid().optional(),
|
|
23
|
+
success: z.boolean(),
|
|
24
|
+
message: z.string(),
|
|
25
|
+
}),
|
|
26
|
+
},
|
|
27
|
+
async (args, requestInfo, _meta) => {
|
|
28
|
+
if (!requestInfo.agentId) {
|
|
29
|
+
return {
|
|
30
|
+
content: [{ type: "text", text: 'Agent ID not found. Set the "X-Agent-ID" header.' }],
|
|
31
|
+
structuredContent: { success: false, message: "Agent ID not found." },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!args.channelId && !args.name) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: "text", text: "Either channelId or name must be provided." }],
|
|
38
|
+
structuredContent: {
|
|
39
|
+
yourAgentId: requestInfo.agentId,
|
|
40
|
+
success: false,
|
|
41
|
+
message: "Either channelId or name must be provided.",
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Check authorization: must be lead agent
|
|
47
|
+
const callingAgent = getAgentById(requestInfo.agentId);
|
|
48
|
+
if (!callingAgent?.isLead) {
|
|
49
|
+
return {
|
|
50
|
+
content: [
|
|
51
|
+
{ type: "text", text: "Not authorized. Only the lead agent can delete channels." },
|
|
52
|
+
],
|
|
53
|
+
structuredContent: {
|
|
54
|
+
yourAgentId: requestInfo.agentId,
|
|
55
|
+
success: false,
|
|
56
|
+
message: "Not authorized. Only the lead agent can delete channels.",
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
// Find channel by ID or name
|
|
63
|
+
let channel = args.channelId ? getChannelById(args.channelId) : null;
|
|
64
|
+
if (!channel && args.name) {
|
|
65
|
+
channel = getChannelByName(args.name);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!channel) {
|
|
69
|
+
const identifier = args.channelId || args.name;
|
|
70
|
+
return {
|
|
71
|
+
content: [{ type: "text", text: `Channel not found: ${identifier}` }],
|
|
72
|
+
structuredContent: {
|
|
73
|
+
yourAgentId: requestInfo.agentId,
|
|
74
|
+
success: false,
|
|
75
|
+
message: `Channel not found: ${identifier}`,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Protect the default general channel
|
|
81
|
+
if (channel.id === GENERAL_CHANNEL_ID) {
|
|
82
|
+
return {
|
|
83
|
+
content: [{ type: "text", text: 'The default "general" channel cannot be deleted.' }],
|
|
84
|
+
structuredContent: {
|
|
85
|
+
yourAgentId: requestInfo.agentId,
|
|
86
|
+
success: false,
|
|
87
|
+
message: 'The default "general" channel cannot be deleted.',
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const channelName = channel.name;
|
|
93
|
+
const deleted = deleteChannel(channel.id);
|
|
94
|
+
|
|
95
|
+
if (!deleted) {
|
|
96
|
+
return {
|
|
97
|
+
content: [{ type: "text", text: "Failed to delete channel." }],
|
|
98
|
+
structuredContent: {
|
|
99
|
+
yourAgentId: requestInfo.agentId,
|
|
100
|
+
success: false,
|
|
101
|
+
message: "Failed to delete channel.",
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: "text",
|
|
110
|
+
text: `Deleted channel "${channelName}" and all its messages.`,
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
structuredContent: {
|
|
114
|
+
yourAgentId: requestInfo.agentId,
|
|
115
|
+
success: true,
|
|
116
|
+
message: `Deleted channel "${channelName}".`,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
} catch (error) {
|
|
120
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
121
|
+
return {
|
|
122
|
+
content: [{ type: "text", text: `Failed to delete channel: ${message}` }],
|
|
123
|
+
structuredContent: {
|
|
124
|
+
yourAgentId: requestInfo.agentId,
|
|
125
|
+
success: false,
|
|
126
|
+
message: `Failed to delete channel: ${message}`,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
);
|
|
132
|
+
};
|
|
@@ -8,6 +8,7 @@ export const registerAssignTaskToEpicTool = (server: McpServer) => {
|
|
|
8
8
|
"assign-task-to-epic",
|
|
9
9
|
{
|
|
10
10
|
title: "Assign Task to Epic",
|
|
11
|
+
annotations: { idempotentHint: true },
|
|
11
12
|
description: "Assign an existing task to an epic.",
|
|
12
13
|
inputSchema: z.object({
|
|
13
14
|
taskId: z.string().uuid().describe("The ID of the task to assign"),
|
|
@@ -8,6 +8,7 @@ export const registerCreateEpicTool = (server: McpServer) => {
|
|
|
8
8
|
"create-epic",
|
|
9
9
|
{
|
|
10
10
|
title: "Create Epic",
|
|
11
|
+
annotations: { destructiveHint: false },
|
|
11
12
|
description: "Create a new epic (project) to organize related tasks.",
|
|
12
13
|
inputSchema: z.object({
|
|
13
14
|
name: z.string().min(1).max(200).describe("Unique name for the epic"),
|
|
@@ -22,8 +23,8 @@ export const registerCreateEpicTool = (server: McpServer) => {
|
|
|
22
23
|
planDocPath: z.string().optional().describe("Path to plan document"),
|
|
23
24
|
slackChannelId: z.string().optional(),
|
|
24
25
|
slackThreadTs: z.string().optional(),
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
vcsRepo: z.string().optional(),
|
|
27
|
+
vcsMilestone: z.string().optional(),
|
|
27
28
|
}),
|
|
28
29
|
outputSchema: z.object({
|
|
29
30
|
yourAgentId: z.string().uuid().optional(),
|
|
@@ -10,6 +10,8 @@ export const registerDeleteEpicTool = (server: McpServer) => {
|
|
|
10
10
|
title: "Delete Epic",
|
|
11
11
|
description:
|
|
12
12
|
"Delete an epic. Only the creator or swarm lead can delete. Tasks are unassigned, not deleted.",
|
|
13
|
+
annotations: { destructiveHint: true },
|
|
14
|
+
|
|
13
15
|
inputSchema: z.object({
|
|
14
16
|
epicId: z.string().uuid().optional().describe("The ID of the epic to delete"),
|
|
15
17
|
name: z.string().optional().describe("Epic name (alternative to ID)"),
|
|
@@ -10,6 +10,8 @@ export const registerGetEpicDetailsTool = (server: McpServer) => {
|
|
|
10
10
|
title: "Get Epic Details",
|
|
11
11
|
description:
|
|
12
12
|
"Get detailed information about a specific epic, including progress and associated tasks.",
|
|
13
|
+
annotations: { readOnlyHint: true },
|
|
14
|
+
|
|
13
15
|
inputSchema: z.object({
|
|
14
16
|
epicId: z.string().uuid().optional().describe("The ID of the epic"),
|
|
15
17
|
name: z.string().optional().describe("The name of the epic (alternative to ID)"),
|
|
@@ -10,6 +10,8 @@ export const registerListEpicsTool = (server: McpServer) => {
|
|
|
10
10
|
{
|
|
11
11
|
title: "List Epics",
|
|
12
12
|
description: "List epics with optional filters. Returns epics with progress information.",
|
|
13
|
+
annotations: { readOnlyHint: true },
|
|
14
|
+
|
|
13
15
|
inputSchema: z.object({
|
|
14
16
|
status: z
|
|
15
17
|
.enum(["draft", "active", "paused", "completed", "cancelled"])
|
|
@@ -8,6 +8,7 @@ export const registerUnassignTaskFromEpicTool = (server: McpServer) => {
|
|
|
8
8
|
"unassign-task-from-epic",
|
|
9
9
|
{
|
|
10
10
|
title: "Unassign Task from Epic",
|
|
11
|
+
annotations: { idempotentHint: true },
|
|
11
12
|
description: "Remove a task from its epic. The task is kept but no longer associated.",
|
|
12
13
|
inputSchema: z.object({
|
|
13
14
|
taskId: z.string().uuid().describe("The ID of the task to unassign"),
|
|
@@ -9,6 +9,7 @@ export const registerUpdateEpicTool = (server: McpServer) => {
|
|
|
9
9
|
"update-epic",
|
|
10
10
|
{
|
|
11
11
|
title: "Update Epic",
|
|
12
|
+
annotations: { idempotentHint: true },
|
|
12
13
|
description:
|
|
13
14
|
"Update an existing epic. Only the creator, lead agent, or swarm lead can update.",
|
|
14
15
|
inputSchema: z.object({
|
|
@@ -30,8 +31,9 @@ export const registerUpdateEpicTool = (server: McpServer) => {
|
|
|
30
31
|
planDocPath: z.string().optional(),
|
|
31
32
|
slackChannelId: z.string().optional(),
|
|
32
33
|
slackThreadTs: z.string().optional(),
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
vcsRepo: z.string().optional(),
|
|
35
|
+
vcsMilestone: z.string().optional(),
|
|
36
|
+
nextSteps: z.string().optional().describe("Notes on what to do next for this epic"),
|
|
35
37
|
}),
|
|
36
38
|
outputSchema: z.object({
|
|
37
39
|
yourAgentId: z.string().uuid().optional(),
|
|
@@ -130,8 +132,9 @@ export const registerUpdateEpicTool = (server: McpServer) => {
|
|
|
130
132
|
if (args.planDocPath !== undefined) updateData.planDocPath = args.planDocPath;
|
|
131
133
|
if (args.slackChannelId !== undefined) updateData.slackChannelId = args.slackChannelId;
|
|
132
134
|
if (args.slackThreadTs !== undefined) updateData.slackThreadTs = args.slackThreadTs;
|
|
133
|
-
if (args.
|
|
134
|
-
if (args.
|
|
135
|
+
if (args.vcsRepo !== undefined) updateData.vcsRepo = args.vcsRepo;
|
|
136
|
+
if (args.vcsMilestone !== undefined) updateData.vcsMilestone = args.vcsMilestone;
|
|
137
|
+
if (args.nextSteps !== undefined) updateData.nextSteps = args.nextSteps;
|
|
135
138
|
|
|
136
139
|
const updatedEpic = updateEpic(epic.id, updateData);
|
|
137
140
|
|
package/src/tools/get-swarm.ts
CHANGED
|
@@ -10,6 +10,8 @@ export const registerGetSwarmTool = (server: McpServer) => {
|
|
|
10
10
|
{
|
|
11
11
|
title: "Get the agent swarm",
|
|
12
12
|
description: "Returns a list of agents in the swarm without their tasks.",
|
|
13
|
+
annotations: { readOnlyHint: true },
|
|
14
|
+
|
|
13
15
|
inputSchema: z.object({
|
|
14
16
|
a: z.string().optional(),
|
|
15
17
|
}),
|
|
@@ -11,6 +11,8 @@ export const registerGetTaskDetailsTool = (server: McpServer) => {
|
|
|
11
11
|
title: "Get task details",
|
|
12
12
|
description:
|
|
13
13
|
"Returns detailed information about a specific task, including output, failure reason, and log history.",
|
|
14
|
+
annotations: { readOnlyHint: true },
|
|
15
|
+
|
|
14
16
|
inputSchema: z.object({
|
|
15
17
|
taskId: z.uuid().describe("The ID of the task to get details for."),
|
|
16
18
|
}),
|
package/src/tools/get-tasks.ts
CHANGED
|
@@ -27,6 +27,8 @@ export const registerGetTasksTool = (server: McpServer) => {
|
|
|
27
27
|
title: "Get tasks",
|
|
28
28
|
description:
|
|
29
29
|
"Returns a list of tasks in the swarm with various filters. Sorted by priority (desc) then lastUpdatedAt (desc).",
|
|
30
|
+
annotations: { readOnlyHint: true },
|
|
31
|
+
|
|
30
32
|
inputSchema: z.object({
|
|
31
33
|
status: AgentTaskStatusSchema.optional().describe(
|
|
32
34
|
"Filter by task status (unassigned, offered, pending, in_progress, completed, failed).",
|
|
@@ -41,6 +43,15 @@ export const registerGetTasksTool = (server: McpServer) => {
|
|
|
41
43
|
taskType: z.string().optional().describe("Filter by task type (e.g., 'bug', 'feature')."),
|
|
42
44
|
tags: z.array(z.string()).optional().describe("Filter by any matching tag."),
|
|
43
45
|
search: z.string().optional().describe("Search in task description."),
|
|
46
|
+
scheduleId: z
|
|
47
|
+
.string()
|
|
48
|
+
.uuid()
|
|
49
|
+
.optional()
|
|
50
|
+
.describe("Filter by schedule ID to find tasks created by a specific schedule."),
|
|
51
|
+
includeHeartbeat: z
|
|
52
|
+
.boolean()
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("Include heartbeat/system tasks in results (excluded by default)."),
|
|
44
55
|
limit: z
|
|
45
56
|
.number()
|
|
46
57
|
.int()
|
|
@@ -55,7 +66,19 @@ export const registerGetTasksTool = (server: McpServer) => {
|
|
|
55
66
|
}),
|
|
56
67
|
},
|
|
57
68
|
async (
|
|
58
|
-
{
|
|
69
|
+
{
|
|
70
|
+
status,
|
|
71
|
+
mineOnly,
|
|
72
|
+
unassigned,
|
|
73
|
+
offeredToMe,
|
|
74
|
+
readyOnly,
|
|
75
|
+
taskType,
|
|
76
|
+
tags,
|
|
77
|
+
search,
|
|
78
|
+
scheduleId,
|
|
79
|
+
includeHeartbeat,
|
|
80
|
+
limit,
|
|
81
|
+
},
|
|
59
82
|
requestInfo,
|
|
60
83
|
_meta,
|
|
61
84
|
) => {
|
|
@@ -71,6 +94,8 @@ export const registerGetTasksTool = (server: McpServer) => {
|
|
|
71
94
|
taskType,
|
|
72
95
|
tags,
|
|
73
96
|
search,
|
|
97
|
+
scheduleId,
|
|
98
|
+
includeHeartbeat,
|
|
74
99
|
limit,
|
|
75
100
|
});
|
|
76
101
|
|
|
@@ -100,6 +125,7 @@ export const registerGetTasksTool = (server: McpServer) => {
|
|
|
100
125
|
if (taskType) filters.push(`type='${taskType}'`);
|
|
101
126
|
if (tags?.length) filters.push(`tags=[${tags.join(", ")}]`);
|
|
102
127
|
if (search) filters.push(`search='${search}'`);
|
|
128
|
+
if (scheduleId) filters.push(`scheduleId='${scheduleId}'`);
|
|
103
129
|
|
|
104
130
|
const filterMsg = filters.length > 0 ? ` (${filters.join(", ")})` : "";
|
|
105
131
|
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
import { createMemory, getAgentById, updateMemoryEmbedding } from "@/be/db";
|
|
4
|
+
import { getEmbedding, serializeEmbedding } from "@/be/embedding";
|
|
5
|
+
import { createToolRegistrar } from "@/tools/utils";
|
|
6
|
+
|
|
7
|
+
const LearningCategoryEnum = z.enum([
|
|
8
|
+
"mistake-pattern",
|
|
9
|
+
"best-practice",
|
|
10
|
+
"codebase-knowledge",
|
|
11
|
+
"preference",
|
|
12
|
+
]);
|
|
13
|
+
|
|
14
|
+
export const registerInjectLearningTool = (server: McpServer) => {
|
|
15
|
+
createToolRegistrar(server)(
|
|
16
|
+
"inject-learning",
|
|
17
|
+
{
|
|
18
|
+
title: "Inject learning into worker memory",
|
|
19
|
+
annotations: { destructiveHint: false },
|
|
20
|
+
description:
|
|
21
|
+
"Allows the lead agent to push learnings into a worker's memory. The learning will be stored as a searchable memory entry that the worker can recall in future sessions.",
|
|
22
|
+
inputSchema: z.object({
|
|
23
|
+
agentId: z.uuid().describe("Target worker agent ID"),
|
|
24
|
+
learning: z.string().min(1).describe("The learning content to inject"),
|
|
25
|
+
category: LearningCategoryEnum.describe(
|
|
26
|
+
"Category of the learning: mistake-pattern, best-practice, codebase-knowledge, or preference",
|
|
27
|
+
),
|
|
28
|
+
}),
|
|
29
|
+
outputSchema: z.object({
|
|
30
|
+
success: z.boolean(),
|
|
31
|
+
message: z.string(),
|
|
32
|
+
memoryId: z.string().optional(),
|
|
33
|
+
}),
|
|
34
|
+
},
|
|
35
|
+
async ({ agentId: targetAgentId, learning, category }, requestInfo, _meta) => {
|
|
36
|
+
if (!requestInfo.agentId) {
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: "Agent ID not found." }],
|
|
39
|
+
structuredContent: {
|
|
40
|
+
success: false,
|
|
41
|
+
message: 'Agent ID not found. The MCP client should define the "X-Agent-ID" header.',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Validate caller is the lead agent
|
|
47
|
+
const callerAgent = getAgentById(requestInfo.agentId);
|
|
48
|
+
if (!callerAgent || !callerAgent.isLead) {
|
|
49
|
+
return {
|
|
50
|
+
content: [{ type: "text", text: "Only the lead agent can inject learnings." }],
|
|
51
|
+
structuredContent: {
|
|
52
|
+
success: false,
|
|
53
|
+
message: "Only the lead agent can inject learnings into worker memory.",
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Validate target agent exists
|
|
59
|
+
const targetAgent = getAgentById(targetAgentId);
|
|
60
|
+
if (!targetAgent) {
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: "text", text: `Agent "${targetAgentId}" not found.` }],
|
|
63
|
+
structuredContent: {
|
|
64
|
+
success: false,
|
|
65
|
+
message: `Agent with ID "${targetAgentId}" not found in the swarm.`,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Create swarm-scoped memory — lead learnings are organizational knowledge visible to all workers
|
|
71
|
+
const content = `[Lead Feedback — ${category}]\n\n${learning}`;
|
|
72
|
+
const memory = createMemory({
|
|
73
|
+
agentId: targetAgentId,
|
|
74
|
+
scope: "swarm",
|
|
75
|
+
name: `Lead feedback: ${category} — ${learning.slice(0, 60)}`,
|
|
76
|
+
content,
|
|
77
|
+
source: "manual",
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Generate and store embedding (async, best-effort)
|
|
81
|
+
try {
|
|
82
|
+
const embedding = await getEmbedding(content);
|
|
83
|
+
if (embedding) {
|
|
84
|
+
updateMemoryEmbedding(memory.id, serializeEmbedding(embedding));
|
|
85
|
+
}
|
|
86
|
+
} catch {
|
|
87
|
+
// Non-blocking — memory was created, embedding is optional
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const targetName = targetAgent.name || targetAgentId.slice(0, 8);
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: "text",
|
|
95
|
+
text: `Learning injected into ${targetName}'s memory (category: ${category}).`,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
structuredContent: {
|
|
99
|
+
success: true,
|
|
100
|
+
message: `Learning injected into ${targetName}'s memory (category: ${category}).`,
|
|
101
|
+
memoryId: memory.id,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
);
|
|
106
|
+
};
|
package/src/tools/join-swarm.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import * as z from "zod";
|
|
3
|
+
import { createAgent, getAllAgents, getDb, updateAgentProfile } from "@/be/db";
|
|
3
4
|
import {
|
|
4
|
-
createAgent,
|
|
5
5
|
generateDefaultClaudeMd,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
} from "@/be/db";
|
|
6
|
+
generateDefaultIdentityMd,
|
|
7
|
+
generateDefaultSoulMd,
|
|
8
|
+
} from "@/prompts/defaults";
|
|
10
9
|
import { createToolRegistrar } from "@/tools/utils";
|
|
11
10
|
import { AgentSchema } from "@/types";
|
|
12
11
|
|
|
@@ -17,6 +16,8 @@ export const registerJoinSwarmTool = (server: McpServer) => {
|
|
|
17
16
|
title: "Join the agent swarm",
|
|
18
17
|
description:
|
|
19
18
|
"Tool for an agent to join the swarm of agents with optional profile information.",
|
|
19
|
+
annotations: { idempotentHint: true },
|
|
20
|
+
|
|
20
21
|
inputSchema: z.object({
|
|
21
22
|
requestedId: z
|
|
22
23
|
.string()
|
|
@@ -96,20 +97,29 @@ export const registerJoinSwarmTool = (server: McpServer) => {
|
|
|
96
97
|
capabilities: [],
|
|
97
98
|
});
|
|
98
99
|
|
|
99
|
-
// Generate default CLAUDE.md
|
|
100
|
+
// Generate default CLAUDE.md, SOUL.md, and IDENTITY.md
|
|
100
101
|
const defaultClaudeMd = generateDefaultClaudeMd({
|
|
101
102
|
name,
|
|
102
103
|
description,
|
|
103
104
|
role,
|
|
104
105
|
capabilities,
|
|
105
106
|
});
|
|
107
|
+
const defaultSoulMd = generateDefaultSoulMd({ name, role });
|
|
108
|
+
const defaultIdentityMd = generateDefaultIdentityMd({
|
|
109
|
+
name,
|
|
110
|
+
description,
|
|
111
|
+
role,
|
|
112
|
+
capabilities,
|
|
113
|
+
});
|
|
106
114
|
|
|
107
|
-
// Update profile with any provided fields and the default
|
|
115
|
+
// Update profile with any provided fields and the default templates
|
|
108
116
|
const updatedAgent = updateAgentProfile(agent.id, {
|
|
109
117
|
description,
|
|
110
118
|
role,
|
|
111
119
|
capabilities,
|
|
112
120
|
claudeMd: defaultClaudeMd,
|
|
121
|
+
soulMd: defaultSoulMd,
|
|
122
|
+
identityMd: defaultIdentityMd,
|
|
113
123
|
});
|
|
114
124
|
|
|
115
125
|
return updatedAgent ?? agent;
|
|
@@ -10,6 +10,8 @@ export const registerListChannelsTool = (server: McpServer) => {
|
|
|
10
10
|
{
|
|
11
11
|
title: "List Channels",
|
|
12
12
|
description: "Lists all available channels for cross-agent communication.",
|
|
13
|
+
annotations: { readOnlyHint: true },
|
|
14
|
+
|
|
13
15
|
inputSchema: z.object({}),
|
|
14
16
|
outputSchema: z.object({
|
|
15
17
|
yourAgentId: z.string().uuid().optional(),
|
|
@@ -11,6 +11,8 @@ export const registerListServicesTool = (server: McpServer) => {
|
|
|
11
11
|
title: "List Services",
|
|
12
12
|
description:
|
|
13
13
|
"Query services registered by agents in the swarm. Use this to discover services exposed by other agents.",
|
|
14
|
+
annotations: { readOnlyHint: true },
|
|
15
|
+
|
|
14
16
|
inputSchema: z.object({
|
|
15
17
|
agentId: z.uuid().optional().describe("Filter by specific agent ID."),
|
|
16
18
|
name: z.string().optional().describe("Filter by service name (partial match)."),
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
import { getMemoryById } from "@/be/db";
|
|
4
|
+
import { createToolRegistrar } from "@/tools/utils";
|
|
5
|
+
import { AgentMemorySchema } from "@/types";
|
|
6
|
+
|
|
7
|
+
export const registerMemoryGetTool = (server: McpServer) => {
|
|
8
|
+
createToolRegistrar(server)(
|
|
9
|
+
"memory-get",
|
|
10
|
+
{
|
|
11
|
+
title: "Get memory details",
|
|
12
|
+
description:
|
|
13
|
+
"Retrieve the full content of a specific memory by its ID. Use memory-search to find memory IDs first.",
|
|
14
|
+
annotations: { readOnlyHint: true },
|
|
15
|
+
|
|
16
|
+
inputSchema: z.object({
|
|
17
|
+
memoryId: z.uuid().describe("The ID of the memory to retrieve."),
|
|
18
|
+
}),
|
|
19
|
+
outputSchema: z.object({
|
|
20
|
+
yourAgentId: z.string().uuid().optional(),
|
|
21
|
+
success: z.boolean(),
|
|
22
|
+
message: z.string(),
|
|
23
|
+
memory: AgentMemorySchema.optional(),
|
|
24
|
+
}),
|
|
25
|
+
},
|
|
26
|
+
async ({ memoryId }, requestInfo, _meta) => {
|
|
27
|
+
const memory = getMemoryById(memoryId);
|
|
28
|
+
|
|
29
|
+
if (!memory) {
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: "text", text: `Memory "${memoryId}" not found.` }],
|
|
32
|
+
structuredContent: {
|
|
33
|
+
yourAgentId: requestInfo.agentId,
|
|
34
|
+
success: false,
|
|
35
|
+
message: `Memory "${memoryId}" not found.`,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
content: [
|
|
42
|
+
{
|
|
43
|
+
type: "text",
|
|
44
|
+
text: `Memory "${memory.name}" retrieved.\n\n${memory.content}`,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
structuredContent: {
|
|
48
|
+
yourAgentId: requestInfo.agentId,
|
|
49
|
+
success: true,
|
|
50
|
+
message: `Memory "${memory.name}" retrieved.`,
|
|
51
|
+
memory,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
};
|