@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
package/src/github/index.ts
CHANGED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alias tests for mentions.ts
|
|
3
|
+
*
|
|
4
|
+
* BOT_NAMES is computed once at module load time. In bun test, all test files
|
|
5
|
+
* share the same process, so mentions.test.ts loads the module first (without
|
|
6
|
+
* aliases). We use _resetBotNamesForTesting() to recompute from current env.
|
|
7
|
+
*/
|
|
8
|
+
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
|
9
|
+
import {
|
|
10
|
+
_resetBotNamesForTesting,
|
|
11
|
+
BOT_NAMES,
|
|
12
|
+
detectMention,
|
|
13
|
+
extractMentionContext,
|
|
14
|
+
isBotAssignee,
|
|
15
|
+
} from "./mentions";
|
|
16
|
+
|
|
17
|
+
const originalAliases = process.env.GITHUB_BOT_ALIASES;
|
|
18
|
+
|
|
19
|
+
beforeAll(() => {
|
|
20
|
+
process.env.GITHUB_BOT_ALIASES = "alias1,alias2";
|
|
21
|
+
_resetBotNamesForTesting();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
afterAll(() => {
|
|
25
|
+
if (originalAliases === undefined) {
|
|
26
|
+
delete process.env.GITHUB_BOT_ALIASES;
|
|
27
|
+
} else {
|
|
28
|
+
process.env.GITHUB_BOT_ALIASES = originalAliases;
|
|
29
|
+
}
|
|
30
|
+
_resetBotNamesForTesting();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("GITHUB_BOT_ALIASES support", () => {
|
|
34
|
+
test("BOT_NAMES includes primary name and aliases", () => {
|
|
35
|
+
expect(BOT_NAMES).toContain("agent-swarm-bot");
|
|
36
|
+
expect(BOT_NAMES).toContain("alias1");
|
|
37
|
+
expect(BOT_NAMES).toContain("alias2");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("detectMention recognizes alias mentions", () => {
|
|
41
|
+
expect(detectMention("@alias1 review this")).toBe(true);
|
|
42
|
+
expect(detectMention("@alias2 please help")).toBe(true);
|
|
43
|
+
expect(detectMention("Hey @alias1")).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("detectMention is case-insensitive for aliases", () => {
|
|
47
|
+
expect(detectMention("@ALIAS1 review")).toBe(true);
|
|
48
|
+
expect(detectMention("@Alias2 help")).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("detectMention still recognizes primary bot name", () => {
|
|
52
|
+
expect(detectMention("@agent-swarm-bot review")).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("isBotAssignee recognizes aliases", () => {
|
|
56
|
+
expect(isBotAssignee("alias1")).toBe(true);
|
|
57
|
+
expect(isBotAssignee("alias2")).toBe(true);
|
|
58
|
+
expect(isBotAssignee("ALIAS1")).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("isBotAssignee still recognizes primary bot name", () => {
|
|
62
|
+
expect(isBotAssignee("agent-swarm-bot")).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("isBotAssignee rejects unknown names", () => {
|
|
66
|
+
expect(isBotAssignee("not-an-alias")).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("extractMentionContext works with aliases", () => {
|
|
70
|
+
expect(extractMentionContext("@alias1 review this PR")).toBe("review this PR");
|
|
71
|
+
expect(extractMentionContext("Hey @alias2 help me")).toBe("Hey help me");
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -19,8 +19,8 @@ describe("detectMention", () => {
|
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
test("is case-insensitive", () => {
|
|
22
|
-
expect(detectMention(
|
|
23
|
-
expect(detectMention(
|
|
22
|
+
expect(detectMention(`@${GITHUB_BOT_NAME.toLowerCase()} help`)).toBe(true);
|
|
23
|
+
expect(detectMention(`@${GITHUB_BOT_NAME.toUpperCase()} help`)).toBe(true);
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
test("returns false for no mention", () => {
|
|
@@ -62,7 +62,7 @@ describe("extractMentionContext", () => {
|
|
|
62
62
|
});
|
|
63
63
|
|
|
64
64
|
test("is case-insensitive", () => {
|
|
65
|
-
expect(extractMentionContext(
|
|
65
|
+
expect(extractMentionContext(`@${GITHUB_BOT_NAME.toUpperCase()} help me`)).toBe("help me");
|
|
66
66
|
});
|
|
67
67
|
|
|
68
68
|
test("returns empty string for null or undefined", () => {
|
package/src/github/mentions.ts
CHANGED
|
@@ -1,11 +1,37 @@
|
|
|
1
1
|
// Bot name for @mentions (can be overridden via env)
|
|
2
2
|
export const GITHUB_BOT_NAME = process.env.GITHUB_BOT_NAME || "agent-swarm-bot";
|
|
3
3
|
|
|
4
|
-
//
|
|
5
|
-
|
|
4
|
+
// Additional aliases that also trigger the bot (comma-separated env var)
|
|
5
|
+
// Example: GITHUB_BOT_ALIASES=heysidekick,sidekick,review-bot
|
|
6
|
+
function computeBotNames(): string[] {
|
|
7
|
+
const primary = GITHUB_BOT_NAME.toLowerCase();
|
|
8
|
+
const aliases = (process.env.GITHUB_BOT_ALIASES || "")
|
|
9
|
+
.split(",")
|
|
10
|
+
.map((a) => a.trim().toLowerCase())
|
|
11
|
+
.filter(Boolean);
|
|
12
|
+
return [...new Set([primary, ...aliases])];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function computeMentionPattern(names: string[]): RegExp {
|
|
16
|
+
return new RegExp(
|
|
17
|
+
`@(${names.map((a) => a.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})\\b`,
|
|
18
|
+
"i",
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export let BOT_NAMES: string[] = computeBotNames();
|
|
23
|
+
|
|
24
|
+
// Pattern to detect @<any-name> mentions (case-insensitive)
|
|
25
|
+
let MENTION_PATTERN = computeMentionPattern(BOT_NAMES);
|
|
26
|
+
|
|
27
|
+
/** Recompute BOT_NAMES and MENTION_PATTERN from current env. For testing only. */
|
|
28
|
+
export function _resetBotNamesForTesting(): void {
|
|
29
|
+
BOT_NAMES = computeBotNames();
|
|
30
|
+
MENTION_PATTERN = computeMentionPattern(BOT_NAMES);
|
|
31
|
+
}
|
|
6
32
|
|
|
7
33
|
/**
|
|
8
|
-
* Check if text contains @<bot-name> mention
|
|
34
|
+
* Check if text contains @<bot-name-or-alias> mention
|
|
9
35
|
*/
|
|
10
36
|
export function detectMention(text: string | null | undefined): boolean {
|
|
11
37
|
if (!text) return false;
|
|
@@ -13,7 +39,7 @@ export function detectMention(text: string | null | undefined): boolean {
|
|
|
13
39
|
}
|
|
14
40
|
|
|
15
41
|
/**
|
|
16
|
-
* Extract context by removing the @<bot-name> mention from text
|
|
42
|
+
* Extract context by removing the @<bot-name-or-alias> mention from text
|
|
17
43
|
* Returns the remaining text trimmed
|
|
18
44
|
*/
|
|
19
45
|
export function extractMentionContext(text: string | null | undefined): string {
|
|
@@ -22,9 +48,9 @@ export function extractMentionContext(text: string | null | undefined): string {
|
|
|
22
48
|
}
|
|
23
49
|
|
|
24
50
|
/**
|
|
25
|
-
* Check if the assignee matches our bot name (case-insensitive)
|
|
51
|
+
* Check if the assignee matches our bot name or any alias (case-insensitive)
|
|
26
52
|
*/
|
|
27
53
|
export function isBotAssignee(assigneeLogin: string | undefined): boolean {
|
|
28
54
|
if (!assigneeLogin) return false;
|
|
29
|
-
return
|
|
55
|
+
return BOT_NAMES.includes(assigneeLogin.toLowerCase());
|
|
30
56
|
}
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub event prompt template definitions.
|
|
3
|
+
*
|
|
4
|
+
* Each template is registered at module load time via registerTemplate().
|
|
5
|
+
* Handlers import this module for the side-effect of registration.
|
|
6
|
+
*
|
|
7
|
+
* Template text uses {{variable}} syntax. The resolver interpolates variables
|
|
8
|
+
* and expands {{@template[id]}} references before returning the final text.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { registerTemplate } from "../prompts/registry";
|
|
12
|
+
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Common building blocks
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
registerTemplate({
|
|
18
|
+
eventType: "common.delegation_instruction",
|
|
19
|
+
header: "",
|
|
20
|
+
defaultBody:
|
|
21
|
+
"\u26a0\ufe0f As lead, DELEGATE this task to a worker agent - do not tackle it yourself.",
|
|
22
|
+
variables: [],
|
|
23
|
+
category: "common",
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
registerTemplate({
|
|
27
|
+
eventType: "common.command_suggestions.github_pr",
|
|
28
|
+
header: "",
|
|
29
|
+
defaultBody: "\ud83d\udca1 Suggested: /review-pr or /respond-github",
|
|
30
|
+
variables: [],
|
|
31
|
+
category: "common",
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
registerTemplate({
|
|
35
|
+
eventType: "common.command_suggestions.github_issue",
|
|
36
|
+
header: "",
|
|
37
|
+
defaultBody: "\ud83d\udca1 Suggested: /implement-issue or /respond-github",
|
|
38
|
+
variables: [],
|
|
39
|
+
category: "common",
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
registerTemplate({
|
|
43
|
+
eventType: "common.command_suggestions.github_comment_pr",
|
|
44
|
+
header: "",
|
|
45
|
+
defaultBody: "\ud83d\udca1 Suggested: /respond-github or /review-pr",
|
|
46
|
+
variables: [],
|
|
47
|
+
category: "common",
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
registerTemplate({
|
|
51
|
+
eventType: "common.command_suggestions.github_comment_issue",
|
|
52
|
+
header: "",
|
|
53
|
+
defaultBody: "\ud83d\udca1 Suggested: /respond-github",
|
|
54
|
+
variables: [],
|
|
55
|
+
category: "common",
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Pull Request events
|
|
60
|
+
// ============================================================================
|
|
61
|
+
|
|
62
|
+
registerTemplate({
|
|
63
|
+
eventType: "github.pull_request.assigned",
|
|
64
|
+
header: "[GitHub PR #{{pr_number}}] {{pr_title}}",
|
|
65
|
+
defaultBody: `Assigned to: @{{bot_name}}
|
|
66
|
+
From: {{sender_login}}
|
|
67
|
+
Repo: {{repo_full_name}}
|
|
68
|
+
Branch: {{head_ref}} \u2192 {{base_ref}}
|
|
69
|
+
URL: {{pr_url}}
|
|
70
|
+
|
|
71
|
+
Context:
|
|
72
|
+
{{context}}
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
{{@template[common.delegation_instruction]}}
|
|
76
|
+
{{@template[common.command_suggestions.github_pr]}}`,
|
|
77
|
+
variables: [
|
|
78
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
79
|
+
{ name: "pr_title", description: "Pull request title" },
|
|
80
|
+
{ name: "bot_name", description: "GitHub bot username" },
|
|
81
|
+
{ name: "sender_login", description: "Event sender login" },
|
|
82
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
83
|
+
{ name: "head_ref", description: "Head branch name" },
|
|
84
|
+
{ name: "base_ref", description: "Base branch name" },
|
|
85
|
+
{ name: "pr_url", description: "Pull request HTML URL" },
|
|
86
|
+
{ name: "context", description: "PR body or title as context" },
|
|
87
|
+
],
|
|
88
|
+
category: "event",
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
registerTemplate({
|
|
92
|
+
eventType: "github.pull_request.review_requested",
|
|
93
|
+
header: "[GitHub PR #{{pr_number}}] {{pr_title}}",
|
|
94
|
+
defaultBody: `Review requested from: @{{bot_name}}
|
|
95
|
+
From: {{sender_login}}
|
|
96
|
+
Repo: {{repo_full_name}}
|
|
97
|
+
Branch: {{head_ref}} \u2192 {{base_ref}}
|
|
98
|
+
URL: {{pr_url}}
|
|
99
|
+
|
|
100
|
+
Context:
|
|
101
|
+
{{context}}
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
{{@template[common.delegation_instruction]}}
|
|
105
|
+
{{@template[common.command_suggestions.github_pr]}}`,
|
|
106
|
+
variables: [
|
|
107
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
108
|
+
{ name: "pr_title", description: "Pull request title" },
|
|
109
|
+
{ name: "bot_name", description: "GitHub bot username" },
|
|
110
|
+
{ name: "sender_login", description: "Event sender login" },
|
|
111
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
112
|
+
{ name: "head_ref", description: "Head branch name" },
|
|
113
|
+
{ name: "base_ref", description: "Base branch name" },
|
|
114
|
+
{ name: "pr_url", description: "Pull request HTML URL" },
|
|
115
|
+
{ name: "context", description: "PR body or title as context" },
|
|
116
|
+
],
|
|
117
|
+
category: "event",
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
registerTemplate({
|
|
121
|
+
eventType: "github.pull_request.closed",
|
|
122
|
+
header: "{{status_emoji}} [GitHub PR #{{pr_number}}] {{status}}{{merged_by}}",
|
|
123
|
+
defaultBody: `PR: {{pr_title}}
|
|
124
|
+
Repo: {{repo_full_name}}
|
|
125
|
+
URL: {{pr_url}}
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
Related task: {{related_task_id}}
|
|
129
|
+
\ud83d\udd00 Consider routing to the same agent working on the related task.
|
|
130
|
+
{{follow_up_suggestion}}`,
|
|
131
|
+
variables: [
|
|
132
|
+
{ name: "status_emoji", description: "Status emoji (merge or close)" },
|
|
133
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
134
|
+
{ name: "status", description: "MERGED or CLOSED" },
|
|
135
|
+
{ name: "merged_by", description: "Merged by info (e.g. ' by user') or empty" },
|
|
136
|
+
{ name: "pr_title", description: "Pull request title" },
|
|
137
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
138
|
+
{ name: "pr_url", description: "Pull request HTML URL" },
|
|
139
|
+
{ name: "related_task_id", description: "ID of the related existing task" },
|
|
140
|
+
{
|
|
141
|
+
name: "follow_up_suggestion",
|
|
142
|
+
description: "Suggestion text for merged or closed PR",
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
category: "event",
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
registerTemplate({
|
|
149
|
+
eventType: "github.pull_request.synchronize",
|
|
150
|
+
header: "\ud83d\udd04 [GitHub PR #{{pr_number}}] New commits pushed",
|
|
151
|
+
defaultBody: `PR: {{pr_title}}
|
|
152
|
+
Repo: {{repo_full_name}}
|
|
153
|
+
Branch: {{head_ref}}
|
|
154
|
+
New HEAD: {{head_sha_short}}
|
|
155
|
+
URL: {{pr_url}}
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
Related task: {{related_task_id}}
|
|
159
|
+
\ud83d\udd00 Consider routing to the same agent working on the related task.
|
|
160
|
+
\ud83d\udca1 New commits were pushed. CI will re-run - monitor for results.`,
|
|
161
|
+
variables: [
|
|
162
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
163
|
+
{ name: "pr_title", description: "Pull request title" },
|
|
164
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
165
|
+
{ name: "head_ref", description: "Head branch name" },
|
|
166
|
+
{ name: "head_sha_short", description: "Short HEAD SHA (7 chars)" },
|
|
167
|
+
{ name: "pr_url", description: "Pull request HTML URL" },
|
|
168
|
+
{ name: "related_task_id", description: "ID of the related existing task" },
|
|
169
|
+
],
|
|
170
|
+
category: "event",
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
registerTemplate({
|
|
174
|
+
eventType: "github.pull_request.mentioned",
|
|
175
|
+
header: "[GitHub PR #{{pr_number}}] {{pr_title}}",
|
|
176
|
+
defaultBody: `From: {{sender_login}}
|
|
177
|
+
Repo: {{repo_full_name}}
|
|
178
|
+
Branch: {{head_ref}} \u2192 {{base_ref}}
|
|
179
|
+
URL: {{pr_url}}
|
|
180
|
+
|
|
181
|
+
Context:
|
|
182
|
+
{{context}}
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
{{@template[common.delegation_instruction]}}
|
|
186
|
+
{{@template[common.command_suggestions.github_pr]}}`,
|
|
187
|
+
variables: [
|
|
188
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
189
|
+
{ name: "pr_title", description: "Pull request title" },
|
|
190
|
+
{ name: "sender_login", description: "Event sender login" },
|
|
191
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
192
|
+
{ name: "head_ref", description: "Head branch name" },
|
|
193
|
+
{ name: "base_ref", description: "Base branch name" },
|
|
194
|
+
{ name: "pr_url", description: "Pull request HTML URL" },
|
|
195
|
+
{ name: "context", description: "Extracted mention context or PR title" },
|
|
196
|
+
],
|
|
197
|
+
category: "event",
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// ============================================================================
|
|
201
|
+
// Issue events
|
|
202
|
+
// ============================================================================
|
|
203
|
+
|
|
204
|
+
registerTemplate({
|
|
205
|
+
eventType: "github.issue.assigned",
|
|
206
|
+
header: "[GitHub Issue #{{issue_number}}] {{issue_title}}",
|
|
207
|
+
defaultBody: `Assigned to: @{{bot_name}}
|
|
208
|
+
From: {{sender_login}}
|
|
209
|
+
Repo: {{repo_full_name}}
|
|
210
|
+
URL: {{issue_url}}
|
|
211
|
+
|
|
212
|
+
Context:
|
|
213
|
+
{{context}}
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
{{@template[common.delegation_instruction]}}
|
|
217
|
+
{{@template[common.command_suggestions.github_issue]}}`,
|
|
218
|
+
variables: [
|
|
219
|
+
{ name: "issue_number", description: "Issue number" },
|
|
220
|
+
{ name: "issue_title", description: "Issue title" },
|
|
221
|
+
{ name: "bot_name", description: "GitHub bot username" },
|
|
222
|
+
{ name: "sender_login", description: "Event sender login" },
|
|
223
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
224
|
+
{ name: "issue_url", description: "Issue HTML URL" },
|
|
225
|
+
{ name: "context", description: "Issue body or title as context" },
|
|
226
|
+
],
|
|
227
|
+
category: "event",
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
registerTemplate({
|
|
231
|
+
eventType: "github.issue.mentioned",
|
|
232
|
+
header: "[GitHub Issue #{{issue_number}}] {{issue_title}}",
|
|
233
|
+
defaultBody: `From: {{sender_login}}
|
|
234
|
+
Repo: {{repo_full_name}}
|
|
235
|
+
URL: {{issue_url}}
|
|
236
|
+
|
|
237
|
+
Context:
|
|
238
|
+
{{context}}
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
{{@template[common.delegation_instruction]}}
|
|
242
|
+
{{@template[common.command_suggestions.github_issue]}}`,
|
|
243
|
+
variables: [
|
|
244
|
+
{ name: "issue_number", description: "Issue number" },
|
|
245
|
+
{ name: "issue_title", description: "Issue title" },
|
|
246
|
+
{ name: "sender_login", description: "Event sender login" },
|
|
247
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
248
|
+
{ name: "issue_url", description: "Issue HTML URL" },
|
|
249
|
+
{ name: "context", description: "Extracted mention context or issue title" },
|
|
250
|
+
],
|
|
251
|
+
category: "event",
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// ============================================================================
|
|
255
|
+
// Comment events
|
|
256
|
+
// ============================================================================
|
|
257
|
+
|
|
258
|
+
registerTemplate({
|
|
259
|
+
eventType: "github.comment.mentioned",
|
|
260
|
+
header: "[GitHub {{target_type}} #{{target_number}} Comment] {{target_title}}",
|
|
261
|
+
defaultBody: `From: {{sender_login}}
|
|
262
|
+
Repo: {{repo_full_name}}
|
|
263
|
+
URL: {{comment_url}}
|
|
264
|
+
|
|
265
|
+
Comment:
|
|
266
|
+
{{context}}
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
{{related_task_section}}{{@template[common.delegation_instruction]}}
|
|
270
|
+
{{command_suggestions}}`,
|
|
271
|
+
variables: [
|
|
272
|
+
{ name: "target_type", description: "PR or Issue" },
|
|
273
|
+
{ name: "target_number", description: "PR or issue number" },
|
|
274
|
+
{ name: "target_title", description: "PR or issue title" },
|
|
275
|
+
{ name: "sender_login", description: "Event sender login" },
|
|
276
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
277
|
+
{ name: "comment_url", description: "Comment HTML URL" },
|
|
278
|
+
{ name: "context", description: "Extracted mention context from comment" },
|
|
279
|
+
{
|
|
280
|
+
name: "related_task_section",
|
|
281
|
+
description: "Related task info with routing hint, or empty string if no related task",
|
|
282
|
+
},
|
|
283
|
+
{ name: "command_suggestions", description: "Context-appropriate command suggestions" },
|
|
284
|
+
],
|
|
285
|
+
category: "event",
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// ============================================================================
|
|
289
|
+
// Pull Request Review events
|
|
290
|
+
// ============================================================================
|
|
291
|
+
|
|
292
|
+
registerTemplate({
|
|
293
|
+
eventType: "github.pull_request.review_submitted",
|
|
294
|
+
header: "{{review_emoji}} [GitHub PR #{{pr_number}} Review] {{review_label}}",
|
|
295
|
+
defaultBody: `PR: {{pr_title}}
|
|
296
|
+
Reviewer: {{sender_login}}
|
|
297
|
+
Repo: {{repo_full_name}}
|
|
298
|
+
URL: {{review_url}}{{review_body_section}}
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
{{related_task_section}}{{@template[common.delegation_instruction]}}
|
|
302
|
+
{{review_suggestions}}`,
|
|
303
|
+
variables: [
|
|
304
|
+
{ name: "review_emoji", description: "Emoji for review state" },
|
|
305
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
306
|
+
{ name: "review_label", description: "Review state label (APPROVED, CHANGES REQUESTED, etc.)" },
|
|
307
|
+
{ name: "pr_title", description: "Pull request title" },
|
|
308
|
+
{ name: "sender_login", description: "Reviewer login" },
|
|
309
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
310
|
+
{ name: "review_url", description: "Review HTML URL" },
|
|
311
|
+
{ name: "review_body_section", description: "Review comment section or empty string" },
|
|
312
|
+
{ name: "related_task_section", description: "Related task info or empty string" },
|
|
313
|
+
{ name: "review_suggestions", description: "Context-appropriate review suggestion" },
|
|
314
|
+
],
|
|
315
|
+
category: "event",
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
// ============================================================================
|
|
319
|
+
// CI events
|
|
320
|
+
// ============================================================================
|
|
321
|
+
|
|
322
|
+
registerTemplate({
|
|
323
|
+
eventType: "github.check_run.failed",
|
|
324
|
+
header: "{{conclusion_emoji}} [GitHub PR #{{pr_number}} CI] {{check_name}} {{conclusion_label}}",
|
|
325
|
+
defaultBody: `Repo: {{repo_full_name}}
|
|
326
|
+
Check: {{check_name}}
|
|
327
|
+
URL: {{check_url}}{{output_summary_section}}
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
Related task: {{related_task_id}}
|
|
331
|
+
\ud83d\udd00 Consider routing to the same agent working on the related task.
|
|
332
|
+
\ud83d\udca1 CI check failed. Review the logs and fix the issue.`,
|
|
333
|
+
variables: [
|
|
334
|
+
{ name: "conclusion_emoji", description: "Emoji for check conclusion" },
|
|
335
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
336
|
+
{ name: "check_name", description: "Check run name" },
|
|
337
|
+
{ name: "conclusion_label", description: "Conclusion label (FAILED, ACTION REQUIRED, etc.)" },
|
|
338
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
339
|
+
{ name: "check_url", description: "Check run HTML URL" },
|
|
340
|
+
{ name: "output_summary_section", description: "Output summary section or empty string" },
|
|
341
|
+
{ name: "related_task_id", description: "ID of the related existing task" },
|
|
342
|
+
],
|
|
343
|
+
category: "event",
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
registerTemplate({
|
|
347
|
+
eventType: "github.check_suite.failed",
|
|
348
|
+
header: "{{conclusion_emoji}} [GitHub PR #{{pr_number}} CI Suite] {{conclusion_label}}",
|
|
349
|
+
defaultBody: `Repo: {{repo_full_name}}
|
|
350
|
+
Branch: {{branch}}
|
|
351
|
+
Commit: {{head_sha_short}}
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
Related task: {{related_task_id}}
|
|
355
|
+
\ud83d\udd00 Consider routing to the same agent working on the related task.
|
|
356
|
+
\ud83d\udca1 CI suite failed. Check individual check runs for details.`,
|
|
357
|
+
variables: [
|
|
358
|
+
{ name: "conclusion_emoji", description: "Emoji for check conclusion" },
|
|
359
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
360
|
+
{ name: "conclusion_label", description: "Conclusion label" },
|
|
361
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
362
|
+
{ name: "branch", description: "Head branch name" },
|
|
363
|
+
{ name: "head_sha_short", description: "Short HEAD SHA (7 chars)" },
|
|
364
|
+
{ name: "related_task_id", description: "ID of the related existing task" },
|
|
365
|
+
],
|
|
366
|
+
category: "event",
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
registerTemplate({
|
|
370
|
+
eventType: "github.workflow_run.failed",
|
|
371
|
+
header:
|
|
372
|
+
"{{conclusion_emoji}} [GitHub PR #{{pr_number}} Workflow] {{workflow_run_name}} {{conclusion_label}}",
|
|
373
|
+
defaultBody: `Repo: {{repo_full_name}}
|
|
374
|
+
Workflow: {{workflow_name}}
|
|
375
|
+
Run #{{run_number}}
|
|
376
|
+
Branch: {{head_branch}}
|
|
377
|
+
Triggered by: {{trigger_event}}
|
|
378
|
+
Logs: {{logs_url}}
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
Related task: {{related_task_id}}
|
|
382
|
+
\ud83d\udd00 Consider routing to the same agent working on the related task.
|
|
383
|
+
\ud83d\udca1 Workflow failed. Click the logs URL above to see what went wrong and fix the issue.`,
|
|
384
|
+
variables: [
|
|
385
|
+
{ name: "conclusion_emoji", description: "Emoji for check conclusion" },
|
|
386
|
+
{ name: "pr_number", description: "Pull request number" },
|
|
387
|
+
{ name: "workflow_run_name", description: "Workflow run name" },
|
|
388
|
+
{ name: "conclusion_label", description: "Conclusion label" },
|
|
389
|
+
{ name: "repo_full_name", description: "Repository full name (owner/repo)" },
|
|
390
|
+
{ name: "workflow_name", description: "Workflow name" },
|
|
391
|
+
{ name: "run_number", description: "Workflow run number" },
|
|
392
|
+
{ name: "head_branch", description: "Head branch name" },
|
|
393
|
+
{ name: "trigger_event", description: "Event that triggered the workflow" },
|
|
394
|
+
{ name: "logs_url", description: "Workflow run logs URL" },
|
|
395
|
+
{ name: "related_task_id", description: "ID of the related existing task" },
|
|
396
|
+
],
|
|
397
|
+
category: "event",
|
|
398
|
+
});
|
package/src/github/types.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface PullRequestEvent extends GitHubWebhookEvent {
|
|
|
17
17
|
base: { ref: string };
|
|
18
18
|
merged: boolean;
|
|
19
19
|
merged_by?: { login: string };
|
|
20
|
+
changed_files?: number;
|
|
20
21
|
};
|
|
21
22
|
requested_reviewer?: { login: string; id: number }; // Added for review_requested/review_request_removed events
|
|
22
23
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitLab Authentication & Webhook Verification
|
|
3
|
+
*
|
|
4
|
+
* GitLab uses a simple shared-secret token for webhook verification
|
|
5
|
+
* (X-Gitlab-Token header) and PAT/Group Access Token for API calls.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
let initialized = false;
|
|
9
|
+
let webhookSecret: string | null = null;
|
|
10
|
+
let apiToken: string | null = null;
|
|
11
|
+
let gitlabUrl: string = "https://gitlab.com";
|
|
12
|
+
|
|
13
|
+
export function isGitLabEnabled(): boolean {
|
|
14
|
+
return !!process.env.GITLAB_WEBHOOK_SECRET && process.env.GITLAB_DISABLE !== "true";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function initGitLab(): void {
|
|
18
|
+
if (initialized) return;
|
|
19
|
+
if (!isGitLabEnabled()) {
|
|
20
|
+
console.log("[GitLab] Integration disabled (GITLAB_WEBHOOK_SECRET not set)");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
webhookSecret = process.env.GITLAB_WEBHOOK_SECRET!;
|
|
25
|
+
apiToken = process.env.GITLAB_TOKEN ?? null;
|
|
26
|
+
gitlabUrl = process.env.GITLAB_URL ?? "https://gitlab.com";
|
|
27
|
+
initialized = true;
|
|
28
|
+
|
|
29
|
+
console.log(`[GitLab] Integration initialized (url: ${gitlabUrl})`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Verify a GitLab webhook request.
|
|
34
|
+
* GitLab uses simple string comparison of X-Gitlab-Token header against the configured secret.
|
|
35
|
+
*/
|
|
36
|
+
export function verifyGitLabWebhook(tokenHeader: string | undefined): boolean {
|
|
37
|
+
if (!webhookSecret) return false;
|
|
38
|
+
if (!tokenHeader) return false;
|
|
39
|
+
// timingSafeEqual throws on different lengths, so guard first
|
|
40
|
+
if (tokenHeader.length !== webhookSecret.length) return false;
|
|
41
|
+
return crypto.timingSafeEqual(Buffer.from(tokenHeader), Buffer.from(webhookSecret));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Get the GitLab API token for making API calls. */
|
|
45
|
+
export function getGitLabToken(): string | null {
|
|
46
|
+
return apiToken;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Get the configured GitLab base URL. */
|
|
50
|
+
export function getGitLabUrl(): string {
|
|
51
|
+
return gitlabUrl;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Bot name for mention detection. */
|
|
55
|
+
export const GITLAB_BOT_NAME = process.env.GITLAB_BOT_NAME ?? "agent-swarm-bot";
|
|
56
|
+
|
|
57
|
+
/** Reset state for testing. */
|
|
58
|
+
export function resetGitLab(): void {
|
|
59
|
+
initialized = false;
|
|
60
|
+
webhookSecret = null;
|
|
61
|
+
apiToken = null;
|
|
62
|
+
gitlabUrl = "https://gitlab.com";
|
|
63
|
+
}
|