@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/handlers.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { createTaskExtended, failTask,
|
|
1
|
+
import { createTaskExtended, failTask, findTaskByVcs, getAllAgents } from "../be/db";
|
|
2
|
+
import { resolveTemplate } from "../prompts/resolver";
|
|
2
3
|
import { detectMention, extractMentionContext, GITHUB_BOT_NAME, isBotAssignee } from "./mentions";
|
|
3
4
|
import { addIssueReaction, addReaction } from "./reactions";
|
|
5
|
+
// Side-effect import: registers all GitHub event templates in the in-memory registry
|
|
6
|
+
import "./templates";
|
|
4
7
|
import type {
|
|
5
8
|
CheckRunEvent,
|
|
6
9
|
CheckSuiteEvent,
|
|
@@ -15,9 +18,50 @@ import type {
|
|
|
15
18
|
const processedEvents = new Map<string, number>();
|
|
16
19
|
const EVENT_TTL = 60_000;
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Get review state emoji and label
|
|
23
|
+
*/
|
|
24
|
+
export function getReviewStateInfo(state: string): { emoji: string; label: string } {
|
|
25
|
+
switch (state) {
|
|
26
|
+
case "approved":
|
|
27
|
+
return { emoji: "ā
", label: "APPROVED" };
|
|
28
|
+
case "changes_requested":
|
|
29
|
+
return { emoji: "š", label: "CHANGES REQUESTED" };
|
|
30
|
+
case "commented":
|
|
31
|
+
return { emoji: "š¬", label: "COMMENTED" };
|
|
32
|
+
case "dismissed":
|
|
33
|
+
return { emoji: "š«", label: "DISMISSED" };
|
|
34
|
+
default:
|
|
35
|
+
return { emoji: "š", label: state.toUpperCase() };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Get conclusion emoji and label for CI checks
|
|
41
|
+
*/
|
|
42
|
+
export function getCheckConclusionInfo(conclusion: string | null): {
|
|
43
|
+
emoji: string;
|
|
44
|
+
label: string;
|
|
45
|
+
} {
|
|
46
|
+
switch (conclusion) {
|
|
47
|
+
case "success":
|
|
48
|
+
return { emoji: "ā
", label: "PASSED" };
|
|
49
|
+
case "failure":
|
|
50
|
+
return { emoji: "ā", label: "FAILED" };
|
|
51
|
+
case "cancelled":
|
|
52
|
+
return { emoji: "ā¹ļø", label: "CANCELLED" };
|
|
53
|
+
case "timed_out":
|
|
54
|
+
return { emoji: "ā±ļø", label: "TIMED OUT" };
|
|
55
|
+
case "action_required":
|
|
56
|
+
return { emoji: "ā ļø", label: "ACTION REQUIRED" };
|
|
57
|
+
case "skipped":
|
|
58
|
+
return { emoji: "āļø", label: "SKIPPED" };
|
|
59
|
+
case "neutral":
|
|
60
|
+
return { emoji: "ā", label: "NEUTRAL" };
|
|
61
|
+
default:
|
|
62
|
+
return { emoji: "ā", label: conclusion?.toUpperCase() ?? "UNKNOWN" };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
21
65
|
|
|
22
66
|
/**
|
|
23
67
|
* Get suggested commands based on task type
|
|
@@ -99,18 +143,36 @@ export async function handlePullRequest(
|
|
|
99
143
|
|
|
100
144
|
// Same task creation flow as mention-based handling
|
|
101
145
|
const lead = findLeadAgent();
|
|
102
|
-
const
|
|
103
|
-
|
|
146
|
+
const result = resolveTemplate(
|
|
147
|
+
"github.pull_request.assigned",
|
|
148
|
+
{
|
|
149
|
+
pr_number: pr.number,
|
|
150
|
+
pr_title: pr.title,
|
|
151
|
+
bot_name: GITHUB_BOT_NAME,
|
|
152
|
+
sender_login: sender.login,
|
|
153
|
+
repo_full_name: repository.full_name,
|
|
154
|
+
head_ref: pr.head.ref,
|
|
155
|
+
base_ref: pr.base.ref,
|
|
156
|
+
pr_url: pr.html_url,
|
|
157
|
+
context: pr.body || pr.title,
|
|
158
|
+
},
|
|
159
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
if (result.skipped) {
|
|
163
|
+
return { created: false };
|
|
164
|
+
}
|
|
104
165
|
|
|
105
|
-
const task = createTaskExtended(
|
|
166
|
+
const task = createTaskExtended(result.text, {
|
|
106
167
|
agentId: lead?.id ?? "",
|
|
107
168
|
source: "github",
|
|
169
|
+
vcsProvider: "github",
|
|
108
170
|
taskType: "github-pr",
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
171
|
+
vcsRepo: repository.full_name,
|
|
172
|
+
vcsEventType: "pull_request",
|
|
173
|
+
vcsNumber: pr.number,
|
|
174
|
+
vcsAuthor: sender.login,
|
|
175
|
+
vcsUrl: pr.html_url,
|
|
114
176
|
});
|
|
115
177
|
|
|
116
178
|
if (lead) {
|
|
@@ -138,7 +200,7 @@ export async function handlePullRequest(
|
|
|
138
200
|
}
|
|
139
201
|
|
|
140
202
|
// Find the related task
|
|
141
|
-
const task =
|
|
203
|
+
const task = findTaskByVcs(repository.full_name, pr.number);
|
|
142
204
|
if (!task) {
|
|
143
205
|
console.log(`[GitHub] No active task found for PR #${pr.number} to cancel`);
|
|
144
206
|
return { created: false };
|
|
@@ -167,23 +229,47 @@ export async function handlePullRequest(
|
|
|
167
229
|
return { created: false };
|
|
168
230
|
}
|
|
169
231
|
|
|
170
|
-
// Check if there's an existing task for this PR
|
|
171
|
-
const existingTask =
|
|
232
|
+
// Check if there's an existing active task for this PR ā skip duplicate review tasks
|
|
233
|
+
const existingTask = findTaskByVcs(repository.full_name, pr.number);
|
|
234
|
+
if (existingTask) {
|
|
235
|
+
console.log(
|
|
236
|
+
`[GitHub] Skipping review task for PR #${pr.number} ā active task ${existingTask.id} already exists`,
|
|
237
|
+
);
|
|
238
|
+
return { created: false };
|
|
239
|
+
}
|
|
172
240
|
|
|
173
241
|
// Create review task
|
|
174
242
|
const lead = findLeadAgent();
|
|
175
|
-
const
|
|
176
|
-
|
|
243
|
+
const result = resolveTemplate(
|
|
244
|
+
"github.pull_request.review_requested",
|
|
245
|
+
{
|
|
246
|
+
pr_number: pr.number,
|
|
247
|
+
pr_title: pr.title,
|
|
248
|
+
bot_name: GITHUB_BOT_NAME,
|
|
249
|
+
sender_login: sender.login,
|
|
250
|
+
repo_full_name: repository.full_name,
|
|
251
|
+
head_ref: pr.head.ref,
|
|
252
|
+
base_ref: pr.base.ref,
|
|
253
|
+
pr_url: pr.html_url,
|
|
254
|
+
context: pr.body || pr.title,
|
|
255
|
+
},
|
|
256
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
if (result.skipped) {
|
|
260
|
+
return { created: false };
|
|
261
|
+
}
|
|
177
262
|
|
|
178
|
-
const task = createTaskExtended(
|
|
263
|
+
const task = createTaskExtended(result.text, {
|
|
179
264
|
agentId: lead?.id ?? "",
|
|
180
265
|
source: "github",
|
|
266
|
+
vcsProvider: "github",
|
|
181
267
|
taskType: "github-pr",
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
268
|
+
vcsRepo: repository.full_name,
|
|
269
|
+
vcsEventType: "pull_request",
|
|
270
|
+
vcsNumber: pr.number,
|
|
271
|
+
vcsAuthor: sender.login,
|
|
272
|
+
vcsUrl: pr.html_url,
|
|
187
273
|
});
|
|
188
274
|
|
|
189
275
|
if (lead) {
|
|
@@ -211,7 +297,7 @@ export async function handlePullRequest(
|
|
|
211
297
|
}
|
|
212
298
|
|
|
213
299
|
// Find the related task
|
|
214
|
-
const task =
|
|
300
|
+
const task = findTaskByVcs(repository.full_name, pr.number);
|
|
215
301
|
if (!task) {
|
|
216
302
|
console.log(`[GitHub] No active task found for PR #${pr.number} to cancel`);
|
|
217
303
|
return { created: false };
|
|
@@ -232,7 +318,7 @@ export async function handlePullRequest(
|
|
|
232
318
|
// Handle closed action - PR was merged or closed without merge
|
|
233
319
|
if (action === "closed") {
|
|
234
320
|
// Find the related task
|
|
235
|
-
const task =
|
|
321
|
+
const task = findTaskByVcs(repository.full_name, pr.number);
|
|
236
322
|
if (!task) {
|
|
237
323
|
// No task for this PR, nothing to notify
|
|
238
324
|
return { created: false };
|
|
@@ -249,18 +335,40 @@ export async function handlePullRequest(
|
|
|
249
335
|
const emoji = wasMerged ? "š" : "ā";
|
|
250
336
|
const status = wasMerged ? "MERGED" : "CLOSED";
|
|
251
337
|
const mergedBy = wasMerged && pr.merged_by ? ` by ${pr.merged_by.login}` : "";
|
|
338
|
+
const followUpSuggestion = wasMerged
|
|
339
|
+
? "š” PR successfully merged! Update any related issues or documentation."
|
|
340
|
+
: "š” PR was closed without merging. Review if follow-up is needed.";
|
|
341
|
+
|
|
342
|
+
const result = resolveTemplate(
|
|
343
|
+
"github.pull_request.closed",
|
|
344
|
+
{
|
|
345
|
+
status_emoji: emoji,
|
|
346
|
+
pr_number: pr.number,
|
|
347
|
+
status,
|
|
348
|
+
merged_by: mergedBy,
|
|
349
|
+
pr_title: pr.title,
|
|
350
|
+
repo_full_name: repository.full_name,
|
|
351
|
+
pr_url: pr.html_url,
|
|
352
|
+
related_task_id: task.id,
|
|
353
|
+
follow_up_suggestion: followUpSuggestion,
|
|
354
|
+
},
|
|
355
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
356
|
+
);
|
|
252
357
|
|
|
253
|
-
|
|
358
|
+
if (result.skipped) {
|
|
359
|
+
return { created: false };
|
|
360
|
+
}
|
|
254
361
|
|
|
255
|
-
const notifyTask = createTaskExtended(
|
|
362
|
+
const notifyTask = createTaskExtended(result.text, {
|
|
256
363
|
agentId: lead?.id ?? "",
|
|
257
364
|
source: "github",
|
|
365
|
+
vcsProvider: "github",
|
|
258
366
|
taskType: "github-pr-status",
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
367
|
+
vcsRepo: repository.full_name,
|
|
368
|
+
vcsEventType: "pull_request",
|
|
369
|
+
vcsNumber: pr.number,
|
|
370
|
+
vcsAuthor: sender.login,
|
|
371
|
+
vcsUrl: pr.html_url,
|
|
264
372
|
});
|
|
265
373
|
|
|
266
374
|
console.log(
|
|
@@ -273,7 +381,7 @@ export async function handlePullRequest(
|
|
|
273
381
|
// Handle synchronize action - new commits pushed to PR
|
|
274
382
|
if (action === "synchronize") {
|
|
275
383
|
// Find the related task
|
|
276
|
-
const task =
|
|
384
|
+
const task = findTaskByVcs(repository.full_name, pr.number);
|
|
277
385
|
if (!task) {
|
|
278
386
|
// No task for this PR, nothing to notify
|
|
279
387
|
return { created: false };
|
|
@@ -286,17 +394,34 @@ export async function handlePullRequest(
|
|
|
286
394
|
}
|
|
287
395
|
|
|
288
396
|
const lead = findLeadAgent();
|
|
289
|
-
const
|
|
397
|
+
const result = resolveTemplate(
|
|
398
|
+
"github.pull_request.synchronize",
|
|
399
|
+
{
|
|
400
|
+
pr_number: pr.number,
|
|
401
|
+
pr_title: pr.title,
|
|
402
|
+
repo_full_name: repository.full_name,
|
|
403
|
+
head_ref: pr.head.ref,
|
|
404
|
+
head_sha_short: pr.head.sha.substring(0, 7),
|
|
405
|
+
pr_url: pr.html_url,
|
|
406
|
+
related_task_id: task.id,
|
|
407
|
+
},
|
|
408
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
409
|
+
);
|
|
290
410
|
|
|
291
|
-
|
|
411
|
+
if (result.skipped) {
|
|
412
|
+
return { created: false };
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
const notifyTask = createTaskExtended(result.text, {
|
|
292
416
|
agentId: lead?.id ?? "",
|
|
293
417
|
source: "github",
|
|
418
|
+
vcsProvider: "github",
|
|
294
419
|
taskType: "github-pr-update",
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
420
|
+
vcsRepo: repository.full_name,
|
|
421
|
+
vcsEventType: "pull_request",
|
|
422
|
+
vcsNumber: pr.number,
|
|
423
|
+
vcsAuthor: sender.login,
|
|
424
|
+
vcsUrl: pr.html_url,
|
|
300
425
|
});
|
|
301
426
|
|
|
302
427
|
console.log(
|
|
@@ -328,19 +453,36 @@ export async function handlePullRequest(
|
|
|
328
453
|
|
|
329
454
|
// Build task description
|
|
330
455
|
const context = extractMentionContext(pr.body) || pr.title;
|
|
331
|
-
const
|
|
332
|
-
|
|
456
|
+
const result = resolveTemplate(
|
|
457
|
+
"github.pull_request.mentioned",
|
|
458
|
+
{
|
|
459
|
+
pr_number: pr.number,
|
|
460
|
+
pr_title: pr.title,
|
|
461
|
+
sender_login: sender.login,
|
|
462
|
+
repo_full_name: repository.full_name,
|
|
463
|
+
head_ref: pr.head.ref,
|
|
464
|
+
base_ref: pr.base.ref,
|
|
465
|
+
pr_url: pr.html_url,
|
|
466
|
+
context,
|
|
467
|
+
},
|
|
468
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
469
|
+
);
|
|
470
|
+
|
|
471
|
+
if (result.skipped) {
|
|
472
|
+
return { created: false };
|
|
473
|
+
}
|
|
333
474
|
|
|
334
475
|
// Create task (assigned to lead if available, otherwise unassigned)
|
|
335
|
-
const task = createTaskExtended(
|
|
476
|
+
const task = createTaskExtended(result.text, {
|
|
336
477
|
agentId: lead?.id ?? "",
|
|
337
478
|
source: "github",
|
|
479
|
+
vcsProvider: "github",
|
|
338
480
|
taskType: "github-pr",
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
481
|
+
vcsRepo: repository.full_name,
|
|
482
|
+
vcsEventType: "pull_request",
|
|
483
|
+
vcsNumber: pr.number,
|
|
484
|
+
vcsAuthor: sender.login,
|
|
485
|
+
vcsUrl: pr.html_url,
|
|
344
486
|
});
|
|
345
487
|
|
|
346
488
|
if (lead) {
|
|
@@ -382,18 +524,34 @@ export async function handleIssue(
|
|
|
382
524
|
|
|
383
525
|
// Same task creation flow as mention-based handling
|
|
384
526
|
const lead = findLeadAgent();
|
|
385
|
-
const
|
|
386
|
-
|
|
527
|
+
const result = resolveTemplate(
|
|
528
|
+
"github.issue.assigned",
|
|
529
|
+
{
|
|
530
|
+
issue_number: issue.number,
|
|
531
|
+
issue_title: issue.title,
|
|
532
|
+
bot_name: GITHUB_BOT_NAME,
|
|
533
|
+
sender_login: sender.login,
|
|
534
|
+
repo_full_name: repository.full_name,
|
|
535
|
+
issue_url: issue.html_url,
|
|
536
|
+
context: issue.body || issue.title,
|
|
537
|
+
},
|
|
538
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
539
|
+
);
|
|
387
540
|
|
|
388
|
-
|
|
541
|
+
if (result.skipped) {
|
|
542
|
+
return { created: false };
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
const task = createTaskExtended(result.text, {
|
|
389
546
|
agentId: lead?.id ?? "",
|
|
390
547
|
source: "github",
|
|
548
|
+
vcsProvider: "github",
|
|
391
549
|
taskType: "github-issue",
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
550
|
+
vcsRepo: repository.full_name,
|
|
551
|
+
vcsEventType: "issues",
|
|
552
|
+
vcsNumber: issue.number,
|
|
553
|
+
vcsAuthor: sender.login,
|
|
554
|
+
vcsUrl: issue.html_url,
|
|
397
555
|
});
|
|
398
556
|
|
|
399
557
|
if (lead) {
|
|
@@ -421,7 +579,7 @@ export async function handleIssue(
|
|
|
421
579
|
}
|
|
422
580
|
|
|
423
581
|
// Find the related task
|
|
424
|
-
const task =
|
|
582
|
+
const task = findTaskByVcs(repository.full_name, issue.number);
|
|
425
583
|
if (!task) {
|
|
426
584
|
console.log(`[GitHub] No active task found for issue #${issue.number} to cancel`);
|
|
427
585
|
return { created: false };
|
|
@@ -459,19 +617,34 @@ export async function handleIssue(
|
|
|
459
617
|
|
|
460
618
|
// Build task description
|
|
461
619
|
const context = extractMentionContext(issue.body) || issue.title;
|
|
462
|
-
const
|
|
463
|
-
|
|
620
|
+
const result = resolveTemplate(
|
|
621
|
+
"github.issue.mentioned",
|
|
622
|
+
{
|
|
623
|
+
issue_number: issue.number,
|
|
624
|
+
issue_title: issue.title,
|
|
625
|
+
sender_login: sender.login,
|
|
626
|
+
repo_full_name: repository.full_name,
|
|
627
|
+
issue_url: issue.html_url,
|
|
628
|
+
context,
|
|
629
|
+
},
|
|
630
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
631
|
+
);
|
|
632
|
+
|
|
633
|
+
if (result.skipped) {
|
|
634
|
+
return { created: false };
|
|
635
|
+
}
|
|
464
636
|
|
|
465
637
|
// Create task (assigned to lead if available, otherwise unassigned)
|
|
466
|
-
const task = createTaskExtended(
|
|
638
|
+
const task = createTaskExtended(result.text, {
|
|
467
639
|
agentId: lead?.id ?? "",
|
|
468
640
|
source: "github",
|
|
641
|
+
vcsProvider: "github",
|
|
469
642
|
taskType: "github-issue",
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
643
|
+
vcsRepo: repository.full_name,
|
|
644
|
+
vcsEventType: "issues",
|
|
645
|
+
vcsNumber: issue.number,
|
|
646
|
+
vcsAuthor: sender.login,
|
|
647
|
+
vcsUrl: issue.html_url,
|
|
475
648
|
});
|
|
476
649
|
|
|
477
650
|
if (lead) {
|
|
@@ -526,24 +699,47 @@ export async function handleComment(
|
|
|
526
699
|
const targetUrl = target?.html_url ?? comment.html_url;
|
|
527
700
|
|
|
528
701
|
// Check if there's an existing task for this PR/Issue
|
|
529
|
-
const existingTask = targetNumber ?
|
|
702
|
+
const existingTask = targetNumber ? findTaskByVcs(repository.full_name, targetNumber) : null;
|
|
530
703
|
|
|
531
704
|
// Build task description
|
|
532
705
|
const context = extractMentionContext(comment.body);
|
|
533
706
|
const suggestions = getCommandSuggestions("github-comment", targetType);
|
|
534
|
-
const
|
|
707
|
+
const relatedTaskSection = existingTask
|
|
708
|
+
? `Related task: ${existingTask.id}\nš Consider routing to the same agent working on the related task.\n`
|
|
709
|
+
: "";
|
|
710
|
+
|
|
711
|
+
const result = resolveTemplate(
|
|
712
|
+
"github.comment.mentioned",
|
|
713
|
+
{
|
|
714
|
+
target_type: targetType,
|
|
715
|
+
target_number: targetNumber,
|
|
716
|
+
target_title: targetTitle,
|
|
717
|
+
sender_login: sender.login,
|
|
718
|
+
repo_full_name: repository.full_name,
|
|
719
|
+
comment_url: comment.html_url,
|
|
720
|
+
context,
|
|
721
|
+
related_task_section: relatedTaskSection,
|
|
722
|
+
command_suggestions: suggestions,
|
|
723
|
+
},
|
|
724
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
725
|
+
);
|
|
726
|
+
|
|
727
|
+
if (result.skipped) {
|
|
728
|
+
return { created: false };
|
|
729
|
+
}
|
|
535
730
|
|
|
536
731
|
// Create task (assigned to lead if available, otherwise unassigned)
|
|
537
|
-
const task = createTaskExtended(
|
|
732
|
+
const task = createTaskExtended(result.text, {
|
|
538
733
|
agentId: lead?.id ?? "",
|
|
539
734
|
source: "github",
|
|
735
|
+
vcsProvider: "github",
|
|
540
736
|
taskType: "github-comment",
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
737
|
+
vcsRepo: repository.full_name,
|
|
738
|
+
vcsEventType: eventType,
|
|
739
|
+
vcsNumber: targetNumber,
|
|
740
|
+
vcsCommentId: comment.id,
|
|
741
|
+
vcsAuthor: sender.login,
|
|
742
|
+
vcsUrl: targetUrl,
|
|
547
743
|
});
|
|
548
744
|
|
|
549
745
|
if (lead) {
|
|
@@ -562,24 +758,6 @@ export async function handleComment(
|
|
|
562
758
|
return { created: true, taskId: task.id };
|
|
563
759
|
}
|
|
564
760
|
|
|
565
|
-
/**
|
|
566
|
-
* Get review state emoji and label
|
|
567
|
-
*/
|
|
568
|
-
function getReviewStateInfo(state: string): { emoji: string; label: string } {
|
|
569
|
-
switch (state) {
|
|
570
|
-
case "approved":
|
|
571
|
-
return { emoji: "ā
", label: "APPROVED" };
|
|
572
|
-
case "changes_requested":
|
|
573
|
-
return { emoji: "š", label: "CHANGES REQUESTED" };
|
|
574
|
-
case "commented":
|
|
575
|
-
return { emoji: "š¬", label: "COMMENTED" };
|
|
576
|
-
case "dismissed":
|
|
577
|
-
return { emoji: "š«", label: "DISMISSED" };
|
|
578
|
-
default:
|
|
579
|
-
return { emoji: "š", label: state.toUpperCase() };
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
|
|
583
761
|
/**
|
|
584
762
|
* Handle pull_request_review events (submitted, edited, dismissed)
|
|
585
763
|
*
|
|
@@ -613,7 +791,7 @@ export async function handlePullRequestReview(
|
|
|
613
791
|
}
|
|
614
792
|
|
|
615
793
|
// Find any existing task for this PR
|
|
616
|
-
const existingTask =
|
|
794
|
+
const existingTask = findTaskByVcs(repository.full_name, pr.number);
|
|
617
795
|
|
|
618
796
|
// Only notify for PRs where bot is creator or already has a task
|
|
619
797
|
const isBotCreator = isBotAssignee(pr.user.login);
|
|
@@ -628,26 +806,49 @@ export async function handlePullRequestReview(
|
|
|
628
806
|
const { emoji, label } = getReviewStateInfo(review.state);
|
|
629
807
|
|
|
630
808
|
// Build task description
|
|
631
|
-
const
|
|
632
|
-
const
|
|
809
|
+
const reviewBodySection = review.body ? `\n\nReview Comment:\n${review.body}` : "";
|
|
810
|
+
const relatedTaskSection = existingTask
|
|
811
|
+
? `Related task: ${existingTask.id}\nš Consider routing to the same agent working on the related task.\n`
|
|
812
|
+
: "";
|
|
813
|
+
const reviewSuggestions =
|
|
633
814
|
review.state === "approved"
|
|
634
815
|
? "š” Suggested: Merge the PR or wait for additional reviews"
|
|
635
816
|
: review.state === "changes_requested"
|
|
636
817
|
? "š” Suggested: Address the requested changes and update the PR"
|
|
637
818
|
: "š” Suggested: Review the feedback and respond if needed";
|
|
638
819
|
|
|
639
|
-
const
|
|
820
|
+
const result = resolveTemplate(
|
|
821
|
+
"github.pull_request.review_submitted",
|
|
822
|
+
{
|
|
823
|
+
review_emoji: emoji,
|
|
824
|
+
pr_number: pr.number,
|
|
825
|
+
review_label: label,
|
|
826
|
+
pr_title: pr.title,
|
|
827
|
+
sender_login: sender.login,
|
|
828
|
+
repo_full_name: repository.full_name,
|
|
829
|
+
review_url: review.html_url,
|
|
830
|
+
review_body_section: reviewBodySection,
|
|
831
|
+
related_task_section: relatedTaskSection,
|
|
832
|
+
review_suggestions: reviewSuggestions,
|
|
833
|
+
},
|
|
834
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
835
|
+
);
|
|
836
|
+
|
|
837
|
+
if (result.skipped) {
|
|
838
|
+
return { created: false };
|
|
839
|
+
}
|
|
640
840
|
|
|
641
841
|
// Create task (assigned to lead if available, otherwise unassigned)
|
|
642
|
-
const task = createTaskExtended(
|
|
842
|
+
const task = createTaskExtended(result.text, {
|
|
643
843
|
agentId: lead?.id ?? "",
|
|
644
844
|
source: "github",
|
|
845
|
+
vcsProvider: "github",
|
|
645
846
|
taskType: "github-review",
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
847
|
+
vcsRepo: repository.full_name,
|
|
848
|
+
vcsEventType: "pull_request_review",
|
|
849
|
+
vcsNumber: pr.number,
|
|
850
|
+
vcsAuthor: sender.login,
|
|
851
|
+
vcsUrl: review.html_url,
|
|
651
852
|
});
|
|
652
853
|
|
|
653
854
|
if (lead) {
|
|
@@ -668,30 +869,6 @@ export async function handlePullRequestReview(
|
|
|
668
869
|
return { created: true, taskId: task.id };
|
|
669
870
|
}
|
|
670
871
|
|
|
671
|
-
/**
|
|
672
|
-
* Get conclusion emoji and label for CI checks
|
|
673
|
-
*/
|
|
674
|
-
function getCheckConclusionInfo(conclusion: string | null): { emoji: string; label: string } {
|
|
675
|
-
switch (conclusion) {
|
|
676
|
-
case "success":
|
|
677
|
-
return { emoji: "ā
", label: "PASSED" };
|
|
678
|
-
case "failure":
|
|
679
|
-
return { emoji: "ā", label: "FAILED" };
|
|
680
|
-
case "cancelled":
|
|
681
|
-
return { emoji: "ā¹ļø", label: "CANCELLED" };
|
|
682
|
-
case "timed_out":
|
|
683
|
-
return { emoji: "ā±ļø", label: "TIMED OUT" };
|
|
684
|
-
case "action_required":
|
|
685
|
-
return { emoji: "ā ļø", label: "ACTION REQUIRED" };
|
|
686
|
-
case "skipped":
|
|
687
|
-
return { emoji: "āļø", label: "SKIPPED" };
|
|
688
|
-
case "neutral":
|
|
689
|
-
return { emoji: "ā", label: "NEUTRAL" };
|
|
690
|
-
default:
|
|
691
|
-
return { emoji: "ā", label: conclusion?.toUpperCase() ?? "UNKNOWN" };
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
|
|
695
872
|
/**
|
|
696
873
|
* Handle check_run events (CI check completed)
|
|
697
874
|
*
|
|
@@ -723,7 +900,7 @@ export async function handleCheckRun(
|
|
|
723
900
|
let relatedTask = null;
|
|
724
901
|
let prNumber = 0;
|
|
725
902
|
for (const pr of check_run.pull_requests) {
|
|
726
|
-
const task =
|
|
903
|
+
const task = findTaskByVcs(repository.full_name, pr.number);
|
|
727
904
|
if (task) {
|
|
728
905
|
relatedTask = task;
|
|
729
906
|
prNumber = pr.number;
|
|
@@ -745,21 +922,39 @@ export async function handleCheckRun(
|
|
|
745
922
|
const lead = findLeadAgent();
|
|
746
923
|
const { emoji, label } = getCheckConclusionInfo(conclusion);
|
|
747
924
|
|
|
748
|
-
const
|
|
925
|
+
const outputSummarySection = check_run.output.summary
|
|
749
926
|
? `\n\nSummary:\n${check_run.output.summary.substring(0, 500)}`
|
|
750
927
|
: "";
|
|
751
928
|
|
|
752
|
-
const
|
|
929
|
+
const result = resolveTemplate(
|
|
930
|
+
"github.check_run.failed",
|
|
931
|
+
{
|
|
932
|
+
conclusion_emoji: emoji,
|
|
933
|
+
pr_number: prNumber,
|
|
934
|
+
check_name: check_run.name,
|
|
935
|
+
conclusion_label: label,
|
|
936
|
+
repo_full_name: repository.full_name,
|
|
937
|
+
check_url: check_run.html_url,
|
|
938
|
+
output_summary_section: outputSummarySection,
|
|
939
|
+
related_task_id: relatedTask.id,
|
|
940
|
+
},
|
|
941
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
942
|
+
);
|
|
943
|
+
|
|
944
|
+
if (result.skipped) {
|
|
945
|
+
return { created: false };
|
|
946
|
+
}
|
|
753
947
|
|
|
754
|
-
const task = createTaskExtended(
|
|
948
|
+
const task = createTaskExtended(result.text, {
|
|
755
949
|
agentId: lead?.id ?? "",
|
|
756
950
|
source: "github",
|
|
951
|
+
vcsProvider: "github",
|
|
757
952
|
taskType: "github-ci",
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
953
|
+
vcsRepo: repository.full_name,
|
|
954
|
+
vcsEventType: "check_run",
|
|
955
|
+
vcsNumber: prNumber,
|
|
956
|
+
vcsAuthor: "",
|
|
957
|
+
vcsUrl: check_run.html_url,
|
|
763
958
|
});
|
|
764
959
|
|
|
765
960
|
console.log(
|
|
@@ -799,7 +994,7 @@ export async function handleCheckSuite(
|
|
|
799
994
|
let relatedTask = null;
|
|
800
995
|
let prNumber = 0;
|
|
801
996
|
for (const pr of check_suite.pull_requests) {
|
|
802
|
-
const task =
|
|
997
|
+
const task = findTaskByVcs(repository.full_name, pr.number);
|
|
803
998
|
if (task) {
|
|
804
999
|
relatedTask = task;
|
|
805
1000
|
prNumber = pr.number;
|
|
@@ -822,17 +1017,34 @@ export async function handleCheckSuite(
|
|
|
822
1017
|
const { emoji, label } = getCheckConclusionInfo(conclusion);
|
|
823
1018
|
const branch = check_suite.head_branch ?? "unknown";
|
|
824
1019
|
|
|
825
|
-
const
|
|
1020
|
+
const result = resolveTemplate(
|
|
1021
|
+
"github.check_suite.failed",
|
|
1022
|
+
{
|
|
1023
|
+
conclusion_emoji: emoji,
|
|
1024
|
+
pr_number: prNumber,
|
|
1025
|
+
conclusion_label: label,
|
|
1026
|
+
repo_full_name: repository.full_name,
|
|
1027
|
+
branch,
|
|
1028
|
+
head_sha_short: check_suite.head_sha.substring(0, 7),
|
|
1029
|
+
related_task_id: relatedTask.id,
|
|
1030
|
+
},
|
|
1031
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
1032
|
+
);
|
|
1033
|
+
|
|
1034
|
+
if (result.skipped) {
|
|
1035
|
+
return { created: false };
|
|
1036
|
+
}
|
|
826
1037
|
|
|
827
|
-
const task = createTaskExtended(
|
|
1038
|
+
const task = createTaskExtended(result.text, {
|
|
828
1039
|
agentId: lead?.id ?? "",
|
|
829
1040
|
source: "github",
|
|
1041
|
+
vcsProvider: "github",
|
|
830
1042
|
taskType: "github-ci",
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
1043
|
+
vcsRepo: repository.full_name,
|
|
1044
|
+
vcsEventType: "check_suite",
|
|
1045
|
+
vcsNumber: prNumber,
|
|
1046
|
+
vcsAuthor: "",
|
|
1047
|
+
vcsUrl: repository.html_url,
|
|
836
1048
|
});
|
|
837
1049
|
|
|
838
1050
|
console.log(
|
|
@@ -875,7 +1087,7 @@ export async function handleWorkflowRun(
|
|
|
875
1087
|
let relatedTask = null;
|
|
876
1088
|
let prNumber = 0;
|
|
877
1089
|
for (const pr of workflow_run.pull_requests) {
|
|
878
|
-
const task =
|
|
1090
|
+
const task = findTaskByVcs(repository.full_name, pr.number);
|
|
879
1091
|
if (task) {
|
|
880
1092
|
relatedTask = task;
|
|
881
1093
|
prNumber = pr.number;
|
|
@@ -897,17 +1109,38 @@ export async function handleWorkflowRun(
|
|
|
897
1109
|
const lead = findLeadAgent();
|
|
898
1110
|
const { emoji, label } = getCheckConclusionInfo(conclusion);
|
|
899
1111
|
|
|
900
|
-
const
|
|
1112
|
+
const result = resolveTemplate(
|
|
1113
|
+
"github.workflow_run.failed",
|
|
1114
|
+
{
|
|
1115
|
+
conclusion_emoji: emoji,
|
|
1116
|
+
pr_number: prNumber,
|
|
1117
|
+
workflow_run_name: workflow_run.name,
|
|
1118
|
+
conclusion_label: label,
|
|
1119
|
+
repo_full_name: repository.full_name,
|
|
1120
|
+
workflow_name: workflow.name,
|
|
1121
|
+
run_number: workflow_run.run_number,
|
|
1122
|
+
head_branch: workflow_run.head_branch,
|
|
1123
|
+
trigger_event: workflow_run.event,
|
|
1124
|
+
logs_url: workflow_run.html_url,
|
|
1125
|
+
related_task_id: relatedTask.id,
|
|
1126
|
+
},
|
|
1127
|
+
{ agentId: lead?.id, repoId: repository.full_name },
|
|
1128
|
+
);
|
|
1129
|
+
|
|
1130
|
+
if (result.skipped) {
|
|
1131
|
+
return { created: false };
|
|
1132
|
+
}
|
|
901
1133
|
|
|
902
|
-
const task = createTaskExtended(
|
|
1134
|
+
const task = createTaskExtended(result.text, {
|
|
903
1135
|
agentId: lead?.id ?? "",
|
|
904
1136
|
source: "github",
|
|
1137
|
+
vcsProvider: "github",
|
|
905
1138
|
taskType: "github-ci",
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
1139
|
+
vcsRepo: repository.full_name,
|
|
1140
|
+
vcsEventType: "workflow_run",
|
|
1141
|
+
vcsNumber: prNumber,
|
|
1142
|
+
vcsAuthor: "",
|
|
1143
|
+
vcsUrl: workflow_run.html_url,
|
|
911
1144
|
});
|
|
912
1145
|
|
|
913
1146
|
console.log(
|