@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
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2025-12-22T01:20:00-08:00
|
|
3
|
-
researcher: Claude Opus 4.5
|
|
4
|
-
git_commit: 4334e7c
|
|
5
|
-
branch: main
|
|
6
|
-
repository: agent-swarm
|
|
7
|
-
topic: "Setup Experience & Demo Ideas"
|
|
8
|
-
tags: [research, developer-experience, onboarding, demo]
|
|
9
|
-
status: complete
|
|
10
|
-
last_updated: 2025-12-22
|
|
11
|
-
last_updated_by: Claude Opus 4.5
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Research: Setup Experience & Demo Ideas
|
|
15
|
-
|
|
16
|
-
**Date**: 2025-12-22T01:20:00-08:00
|
|
17
|
-
**Researcher**: Claude Opus 4.5
|
|
18
|
-
**Git Commit**: 4334e7c
|
|
19
|
-
**Branch**: main
|
|
20
|
-
**Repository**: agent-swarm
|
|
21
|
-
|
|
22
|
-
## Research Question
|
|
23
|
-
|
|
24
|
-
How to make the project super easy to setup and run for someone that clones or wants to try it out locally or deploy it? What are ideas for a demo?
|
|
25
|
-
|
|
26
|
-
## Summary
|
|
27
|
-
|
|
28
|
-
The project has solid infrastructure but the onboarding experience could be significantly improved. The main barriers are: (1) scattered documentation with no true "30-second quick start", (2) UI and server require separate setup, (3) Claude OAuth token requirement is a major barrier for new users, and (4) no simple demo to understand what the project does. Below are specific recommendations and demo ideas.
|
|
29
|
-
|
|
30
|
-
## Current Project Structure
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
agent-swarm/
|
|
34
|
-
├── src/ # MCP Server + CLI
|
|
35
|
-
│ ├── http.ts # HTTP MCP server (main backend)
|
|
36
|
-
│ ├── stdio.ts # STDIO transport
|
|
37
|
-
│ ├── cli.tsx # CLI entry (setup, worker, lead, hook)
|
|
38
|
-
│ ├── commands/ # CLI command implementations
|
|
39
|
-
│ └── tools/ # MCP tool handlers
|
|
40
|
-
├── ui/ # Separate Vite dashboard (MUI Joy + React)
|
|
41
|
-
│ ├── src/ # React components
|
|
42
|
-
│ └── package.json # Separate deps (uses pnpm)
|
|
43
|
-
├── plugin/ # Claude Code plugin (not yet published)
|
|
44
|
-
├── deploy/ # Deployment scripts (systemd, Docker)
|
|
45
|
-
├── Dockerfile.worker # Worker container with full dev env
|
|
46
|
-
└── docker-compose.*.yml # Docker compose configs
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Current Setup Experience Gaps
|
|
50
|
-
|
|
51
|
-
### 1. Prerequisites Not Prominent
|
|
52
|
-
- Bun is required but mentioned only in passing
|
|
53
|
-
- No clear version requirements
|
|
54
|
-
- Node.js 22 mentioned for Docker only
|
|
55
|
-
|
|
56
|
-
### 2. No Unified Quick Start
|
|
57
|
-
Current README jumps straight to `bunx @desplega.ai/agent-swarm@latest setup` which:
|
|
58
|
-
- Assumes user has Bun installed
|
|
59
|
-
- Requires API token from cloud service
|
|
60
|
-
- Doesn't work for local development
|
|
61
|
-
|
|
62
|
-
### 3. UI Requires Separate Setup
|
|
63
|
-
```bash
|
|
64
|
-
# User must know to:
|
|
65
|
-
cd ui
|
|
66
|
-
pnpm install # Note: different package manager!
|
|
67
|
-
pnpm dev # Separate terminal
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### 4. Missing "All-in-One" Development Script
|
|
71
|
-
No single command to start both server and UI with hot reload.
|
|
72
|
-
|
|
73
|
-
### 5. Claude OAuth Token Barrier
|
|
74
|
-
Biggest friction: requires `CLAUDE_CODE_OAUTH_TOKEN` which is:
|
|
75
|
-
- Hard to obtain (undocumented process)
|
|
76
|
-
- Required even for basic testing
|
|
77
|
-
- Blocks casual exploration
|
|
78
|
-
|
|
79
|
-
### 6. No Simple "See It Work" Demo
|
|
80
|
-
Users can't quickly see value without significant setup.
|
|
81
|
-
|
|
82
|
-
## Improvement Recommendations
|
|
83
|
-
|
|
84
|
-
### 1. Add Prerequisites Section (Top of README)
|
|
85
|
-
|
|
86
|
-
```markdown
|
|
87
|
-
## Prerequisites
|
|
88
|
-
|
|
89
|
-
- [Bun](https://bun.sh) v1.1+ (`curl -fsSL https://bun.sh/install | bash`)
|
|
90
|
-
- [Claude Code CLI](https://claude.ai/install.sh) (for running agents)
|
|
91
|
-
- Docker (optional, for containerized workers)
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### 2. Add True Quick Start (Local Development)
|
|
95
|
-
|
|
96
|
-
```markdown
|
|
97
|
-
## Quick Start (Local Development)
|
|
98
|
-
|
|
99
|
-
# 1. Clone and install
|
|
100
|
-
git clone https://github.com/desplega-ai/agent-swarm.git
|
|
101
|
-
cd agent-swarm
|
|
102
|
-
bun install
|
|
103
|
-
|
|
104
|
-
# 2. Create .env file
|
|
105
|
-
cp .env.example .env
|
|
106
|
-
# Edit .env to set API_KEY=any-secret-you-want
|
|
107
|
-
|
|
108
|
-
# 3. Start the MCP server
|
|
109
|
-
bun run dev:http
|
|
110
|
-
|
|
111
|
-
# Server running at http://localhost:3013
|
|
112
|
-
|
|
113
|
-
# 4. (Optional) Start the dashboard
|
|
114
|
-
cd ui && pnpm install && pnpm dev
|
|
115
|
-
# Dashboard at http://localhost:5173
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### 3. Add `dev:all` Script to package.json
|
|
119
|
-
|
|
120
|
-
```json
|
|
121
|
-
"scripts": {
|
|
122
|
-
"dev:all": "bun run dev:http & (cd ui && pnpm dev)",
|
|
123
|
-
"dev:ui": "cd ui && pnpm dev"
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
Or use a process manager approach:
|
|
128
|
-
```bash
|
|
129
|
-
# Add to package.json scripts
|
|
130
|
-
"dev:all": "bun --hot src/http.ts & cd ui && pnpm dev"
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### 4. Add MCP Inspector Demo Mode
|
|
134
|
-
|
|
135
|
-
For users who just want to see it work without Claude:
|
|
136
|
-
|
|
137
|
-
```markdown
|
|
138
|
-
## Try Without Claude
|
|
139
|
-
|
|
140
|
-
Test the MCP tools using the inspector:
|
|
141
|
-
|
|
142
|
-
bun run inspector:http
|
|
143
|
-
|
|
144
|
-
This opens a web UI where you can:
|
|
145
|
-
- Call `join-swarm` to register an agent
|
|
146
|
-
- Use `send-task` to create tasks
|
|
147
|
-
- See the full API without needing Claude
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### 5. Create Demo Modes in CLI
|
|
151
|
-
|
|
152
|
-
Add simple demo commands that simulate swarm behavior:
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
# Simulate a 3-agent swarm locally
|
|
156
|
-
bunx @desplega.ai/agent-swarm demo --agents 3
|
|
157
|
-
|
|
158
|
-
# This would:
|
|
159
|
-
# 1. Start local server
|
|
160
|
-
# 2. Register 3 fake agents
|
|
161
|
-
# 3. Create sample tasks
|
|
162
|
-
# 4. Show agents claiming and completing tasks
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### 6. Add Screencast/GIF to README
|
|
166
|
-
|
|
167
|
-
A 30-second GIF showing:
|
|
168
|
-
1. Dashboard with agents
|
|
169
|
-
2. Tasks being assigned
|
|
170
|
-
3. Real-time progress updates
|
|
171
|
-
4. Agent messaging
|
|
172
|
-
|
|
173
|
-
### 7. Environment File Consolidation
|
|
174
|
-
|
|
175
|
-
Create a single `.env.development.example`:
|
|
176
|
-
```env
|
|
177
|
-
# Local Development Configuration
|
|
178
|
-
API_KEY=dev-secret-key
|
|
179
|
-
PORT=3013
|
|
180
|
-
SWARM_URL=localhost
|
|
181
|
-
|
|
182
|
-
# Only needed for actual Claude agents:
|
|
183
|
-
# CLAUDE_CODE_OAUTH_TOKEN=your-token
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## Demo Ideas
|
|
187
|
-
|
|
188
|
-
### Demo 1: Task Coordination Screencast (Simplest)
|
|
189
|
-
**Setup**: 1 lead + 2 workers
|
|
190
|
-
**Scenario**: Lead breaks down "Build a calculator" into tasks:
|
|
191
|
-
- Worker 1: Implement add/subtract
|
|
192
|
-
- Worker 2: Implement multiply/divide
|
|
193
|
-
- Both report progress, lead monitors
|
|
194
|
-
|
|
195
|
-
**Why it works**: Shows core value prop - parallel execution with coordination
|
|
196
|
-
|
|
197
|
-
### Demo 2: Code Review Swarm (Practical)
|
|
198
|
-
**Setup**: 1 lead + 3 specialized workers
|
|
199
|
-
**Scenario**: Review a PR from multiple angles:
|
|
200
|
-
- Worker 1: Security review
|
|
201
|
-
- Worker 2: Performance review
|
|
202
|
-
- Worker 3: Test coverage review
|
|
203
|
-
- Lead synthesizes findings
|
|
204
|
-
|
|
205
|
-
**Why it works**: Immediately useful, shows specialization
|
|
206
|
-
|
|
207
|
-
### Demo 3: Research Swarm (Impressive)
|
|
208
|
-
**Setup**: 1 lead + 3 researchers
|
|
209
|
-
**Scenario**: Research "Best practices for X" topic:
|
|
210
|
-
- Workers search different sources in parallel
|
|
211
|
-
- Post findings to shared channel
|
|
212
|
-
- Lead synthesizes into final report
|
|
213
|
-
|
|
214
|
-
**Why it works**: Shows messaging + parallel speedup
|
|
215
|
-
|
|
216
|
-
### Demo 4: Service Registry Demo (Technical)
|
|
217
|
-
**Setup**: 2 workers with background services
|
|
218
|
-
**Scenario**:
|
|
219
|
-
- Worker 1: Starts an API server (PM2 + register-service)
|
|
220
|
-
- Worker 2: Discovers and calls Worker 1's API
|
|
221
|
-
- Shows cross-agent service communication
|
|
222
|
-
|
|
223
|
-
**Why it works**: Demonstrates unique capability
|
|
224
|
-
|
|
225
|
-
### Demo 5: Interactive Dashboard Demo
|
|
226
|
-
**No Claude needed**
|
|
227
|
-
**Scenario**: Use the MCP Inspector to:
|
|
228
|
-
1. Register 3 agents manually
|
|
229
|
-
2. Create tasks in the pool
|
|
230
|
-
3. Claim tasks as different agents
|
|
231
|
-
4. Show dashboard updating in real-time
|
|
232
|
-
|
|
233
|
-
**Why it works**: Zero barrier to entry, visual
|
|
234
|
-
|
|
235
|
-
## Recommended Demo Implementation Priority
|
|
236
|
-
|
|
237
|
-
1. **Demo 5 (Dashboard Demo)** - Zero friction, can be a video on README
|
|
238
|
-
2. **Demo 1 (Task Coordination)** - Core value, simple script
|
|
239
|
-
3. **Demo 2 (Code Review)** - Practical application
|
|
240
|
-
4. **Demo 3 (Research)** - Shows advanced features
|
|
241
|
-
|
|
242
|
-
## Quick Wins
|
|
243
|
-
|
|
244
|
-
1. Add `bun run dev:all` script
|
|
245
|
-
2. Move Prerequisites to top of README
|
|
246
|
-
3. Add "Try Without Claude" section
|
|
247
|
-
4. Record 30-second GIF for README
|
|
248
|
-
5. Create `.env.development.example` with comments
|
|
249
|
-
|
|
250
|
-
## Related Files
|
|
251
|
-
|
|
252
|
-
- `README.md` - Main documentation
|
|
253
|
-
- `deploy/DEPLOY.md` - Server deployment docs
|
|
254
|
-
- `.env.example` - Server environment template
|
|
255
|
-
- `.env.docker.example` - Docker environment template
|
|
256
|
-
- `src/cli.tsx` - CLI entry point
|
|
257
|
-
- `ui/` - Dashboard application
|
|
258
|
-
|
|
259
|
-
## Open Questions
|
|
260
|
-
|
|
261
|
-
1. Can we publish a "demo mode" that doesn't require OAuth?
|
|
262
|
-
2. Should UI be embedded in main server (single port)?
|
|
263
|
-
3. Is there a way to provide temporary Claude tokens for demos?
|
|
264
|
-
4. Should there be a hosted demo instance users can connect to?
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-01-13T10:30:00-08:00
|
|
3
|
-
researcher: Claude
|
|
4
|
-
git_commit: 3302f5c8a785cfb1bc1c213df9db2bddffbc7762
|
|
5
|
-
branch: main
|
|
6
|
-
repository: agent-swarm
|
|
7
|
-
topic: "Lead agent picking up triggers multiple times with concurrency"
|
|
8
|
-
tags: [research, codebase, concurrency, polling, triggers, lead-agent, inbox-messages, slack, deduplication]
|
|
9
|
-
status: complete
|
|
10
|
-
last_updated: 2026-01-13
|
|
11
|
-
last_updated_by: Claude
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Research: Lead Agent Duplicate Trigger Processing with Concurrency
|
|
15
|
-
|
|
16
|
-
**Date**: 2026-01-13T10:30:00-08:00
|
|
17
|
-
**Researcher**: Claude
|
|
18
|
-
**Git Commit**: 3302f5c8a785cfb1bc1c213df9db2bddffbc7762
|
|
19
|
-
**Branch**: main
|
|
20
|
-
**Repository**: agent-swarm
|
|
21
|
-
|
|
22
|
-
## Research Question
|
|
23
|
-
|
|
24
|
-
With concurrency enabled, the lead agent picks up triggers (like messages from chat, Slack, etc.) multiple times instead of only once. How does this happen?
|
|
25
|
-
|
|
26
|
-
## Summary
|
|
27
|
-
|
|
28
|
-
The lead agent can process the same triggers multiple times due to a lack of atomic "claim" mechanisms for certain trigger types. When `MAX_CONCURRENT_TASKS > 1`, the runner can spawn multiple Claude processes concurrently. Each poll request to `/api/poll` can return the same unread inbox messages or mentions because these triggers are not marked as "claimed" when returned - they remain in their original state until explicitly processed by the agent.
|
|
29
|
-
|
|
30
|
-
This contrasts with `task_assigned` triggers, which use an atomic `startTask()` call to immediately mark tasks as `in_progress`, preventing duplicate pickup.
|
|
31
|
-
|
|
32
|
-
## Detailed Findings
|
|
33
|
-
|
|
34
|
-
### Polling Architecture
|
|
35
|
-
|
|
36
|
-
#### Client-Side Polling Loop
|
|
37
|
-
- **File**: `src/commands/runner.ts:823-911`
|
|
38
|
-
- The main loop polls for triggers when the agent has capacity (`activeTasks.size < maxConcurrent`)
|
|
39
|
-
- With `MAX_CONCURRENT_TASKS > 1`, the loop can spawn multiple Claude processes concurrently
|
|
40
|
-
- Each process operates independently without knowledge of other running processes
|
|
41
|
-
|
|
42
|
-
#### Poll Endpoint
|
|
43
|
-
- **File**: `src/http.ts:344-453`
|
|
44
|
-
- Returns triggers in priority order within a transaction
|
|
45
|
-
- Transaction provides read consistency within a single poll, not across multiple polls
|
|
46
|
-
|
|
47
|
-
### Trigger Types and Their State Management
|
|
48
|
-
|
|
49
|
-
| Trigger Type | State Change on Poll | Prevents Duplicates |
|
|
50
|
-
|--------------|---------------------|---------------------|
|
|
51
|
-
| `task_offered` | None | **No** |
|
|
52
|
-
| `task_assigned` | `startTask()` → `in_progress` | **Yes** |
|
|
53
|
-
| `slack_inbox_message` | None | **No** |
|
|
54
|
-
| `unread_mentions` | None | **No** |
|
|
55
|
-
| `tasks_finished` | None (uses `since` param) | **Partial** |
|
|
56
|
-
| `pool_tasks_available` | None | **No** |
|
|
57
|
-
|
|
58
|
-
### Affected Trigger: `slack_inbox_message`
|
|
59
|
-
|
|
60
|
-
**Location**: `src/http.ts:396-406`
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
const unreadInbox = getUnreadInboxMessages(myAgentId);
|
|
64
|
-
if (unreadInbox.length > 0) {
|
|
65
|
-
return {
|
|
66
|
-
trigger: {
|
|
67
|
-
type: "slack_inbox_message",
|
|
68
|
-
count: unreadInbox.length,
|
|
69
|
-
messages: unreadInbox.slice(0, 5),
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
The `getUnreadInboxMessages()` function (`src/be/db.ts:2377-2384`) simply queries:
|
|
76
|
-
```sql
|
|
77
|
-
SELECT * FROM inbox_messages WHERE agentId = ? AND status = 'unread' ORDER BY createdAt ASC
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Messages remain `unread` until explicitly marked via:
|
|
81
|
-
- `markInboxMessageResponded()` - called by `slack-reply` tool
|
|
82
|
-
- `markInboxMessageDelegated()` - called by `inbox-delegate` tool
|
|
83
|
-
- `markInboxMessageRead()` - defined but **never called** in the codebase
|
|
84
|
-
|
|
85
|
-
### Affected Trigger: `unread_mentions`
|
|
86
|
-
|
|
87
|
-
**Location**: `src/http.ts:408-417`
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
const inbox = getInboxSummary(myAgentId);
|
|
91
|
-
if (inbox.mentionsCount > 0) {
|
|
92
|
-
return {
|
|
93
|
-
trigger: {
|
|
94
|
-
type: "unread_mentions",
|
|
95
|
-
mentionsCount: inbox.mentionsCount,
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
The `getInboxSummary()` function (`src/be/db.ts:1858-1885`) counts mentions in unread messages. There's no mechanism to mark mentions as processed.
|
|
102
|
-
|
|
103
|
-
### Protected Trigger: `task_assigned`
|
|
104
|
-
|
|
105
|
-
**Location**: `src/http.ts:376-391`
|
|
106
|
-
|
|
107
|
-
```typescript
|
|
108
|
-
if (hasCapacity(myAgentId)) {
|
|
109
|
-
const pendingTask = getPendingTaskForAgent(myAgentId);
|
|
110
|
-
if (pendingTask) {
|
|
111
|
-
// Mark task as in_progress immediately to prevent duplicate polling
|
|
112
|
-
startTask(pendingTask.id);
|
|
113
|
-
return {
|
|
114
|
-
trigger: {
|
|
115
|
-
type: "task_assigned",
|
|
116
|
-
taskId: pendingTask.id,
|
|
117
|
-
task: { ...pendingTask, status: "in_progress" },
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
The `startTask()` call (`src/be/db.ts:779-799`) atomically transitions the task to `in_progress`:
|
|
125
|
-
```sql
|
|
126
|
-
UPDATE agent_tasks SET status = 'in_progress', lastUpdatedAt = ... WHERE id = ? RETURNING *
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
This prevents subsequent polls from returning the same task since `getPendingTaskForAgent()` only queries `status = 'pending'`.
|
|
130
|
-
|
|
131
|
-
### Existing Deduplication Mechanisms (Not Related to Polling)
|
|
132
|
-
|
|
133
|
-
#### Slack Event Deduplication
|
|
134
|
-
- **File**: `src/slack/handlers.ts:106-118`
|
|
135
|
-
- Uses a `Set<string>` with 60s TTL to prevent duplicate Slack events
|
|
136
|
-
- Key format: `${channel}:${timestamp}`
|
|
137
|
-
- **Purpose**: Prevents Slack's own duplicate event delivery
|
|
138
|
-
- **Does not**: Prevent duplicate polling returns
|
|
139
|
-
|
|
140
|
-
#### GitHub Event Deduplication
|
|
141
|
-
- **File**: `src/github/handlers.ts:7-48`
|
|
142
|
-
- Uses a `Map<string, number>` with 60s TTL
|
|
143
|
-
- Key formats: `pr:${repo}:${number}:${action}`, `issue:${repo}:${number}:${action}`, `comment:${repo}:${commentId}`
|
|
144
|
-
- **Purpose**: Prevents GitHub webhook duplicate delivery
|
|
145
|
-
- **Does not**: Prevent duplicate polling returns
|
|
146
|
-
|
|
147
|
-
### Concurrency Flow with Duplicates
|
|
148
|
-
|
|
149
|
-
1. Lead agent has `MAX_CONCURRENT_TASKS = 2`
|
|
150
|
-
2. Poll #1 returns `slack_inbox_message` with messages A, B, C
|
|
151
|
-
3. Claude process #1 spawns to handle messages A, B, C
|
|
152
|
-
4. Before process #1 processes messages, poll #2 occurs
|
|
153
|
-
5. Poll #2 returns same `slack_inbox_message` with messages A, B, C (still `unread`)
|
|
154
|
-
6. Claude process #2 spawns to handle same messages A, B, C
|
|
155
|
-
7. Both processes attempt to respond to or delegate the same messages
|
|
156
|
-
|
|
157
|
-
## Code References
|
|
158
|
-
|
|
159
|
-
- `src/commands/runner.ts:823-911` - Main polling loop
|
|
160
|
-
- `src/commands/runner.ts:786` - `MAX_CONCURRENT_TASKS` environment variable
|
|
161
|
-
- `src/commands/runner.ts:831` - Capacity check: `state.activeTasks.size < state.maxConcurrent`
|
|
162
|
-
- `src/http.ts:344-453` - Poll endpoint
|
|
163
|
-
- `src/http.ts:396-406` - Inbox message trigger (no state change)
|
|
164
|
-
- `src/http.ts:381-388` - Task assigned trigger (with `startTask()`)
|
|
165
|
-
- `src/be/db.ts:2377-2384` - `getUnreadInboxMessages()` query
|
|
166
|
-
- `src/be/db.ts:2386-2394` - `markInboxMessageRead()` (unused)
|
|
167
|
-
- `src/be/db.ts:779-799` - `startTask()` atomic status update
|
|
168
|
-
- `src/slack/handlers.ts:106-118` - Slack event deduplication (separate concern)
|
|
169
|
-
|
|
170
|
-
## Architecture Documentation
|
|
171
|
-
|
|
172
|
-
### Polling State Machine
|
|
173
|
-
|
|
174
|
-
```
|
|
175
|
-
No Trigger Has Capacity
|
|
176
|
-
┌─────────────────────────────────────────────────────────┐
|
|
177
|
-
│ │
|
|
178
|
-
▼ │
|
|
179
|
-
┌────────┐ Poll Timeout ┌─────────────┐ Trigger │
|
|
180
|
-
│ Idle │ ◀───────────────── │ Polling │ ─────────────▶│
|
|
181
|
-
└────────┘ └─────────────┘ │
|
|
182
|
-
│ │ │
|
|
183
|
-
│ At Capacity │ │
|
|
184
|
-
│ (sleep 1 sec) ▼ │
|
|
185
|
-
│ ┌─────────────┐ │
|
|
186
|
-
└───────────────────────▶ │ Spawning │ ────────────────┘
|
|
187
|
-
│ Claude │
|
|
188
|
-
└─────────────┘
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### Trigger State Protection Matrix
|
|
192
|
-
|
|
193
|
-
```
|
|
194
|
-
┌────────────────────┬─────────────────────────────────────────┐
|
|
195
|
-
│ Trigger Type │ State Protection │
|
|
196
|
-
├────────────────────┼─────────────────────────────────────────┤
|
|
197
|
-
│ task_assigned │ startTask() → in_progress (PROTECTED) │
|
|
198
|
-
├────────────────────┼─────────────────────────────────────────┤
|
|
199
|
-
│ task_offered │ None (VULNERABLE) │
|
|
200
|
-
├────────────────────┼─────────────────────────────────────────┤
|
|
201
|
-
│ slack_inbox_msg │ None (VULNERABLE) │
|
|
202
|
-
├────────────────────┼─────────────────────────────────────────┤
|
|
203
|
-
│ unread_mentions │ None (VULNERABLE) │
|
|
204
|
-
├────────────────────┼─────────────────────────────────────────┤
|
|
205
|
-
│ tasks_finished │ since param (PARTIALLY PROTECTED) │
|
|
206
|
-
├────────────────────┼─────────────────────────────────────────┤
|
|
207
|
-
│ pool_tasks_avail │ None (VULNERABLE but informational) │
|
|
208
|
-
└────────────────────┴─────────────────────────────────────────┘
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
## Historical Context (from thoughts/)
|
|
212
|
-
|
|
213
|
-
- `thoughts/shared/plans/2026-01-13-agent-concurrency.md` - Main concurrency implementation plan
|
|
214
|
-
- `thoughts/shared/plans/2026-01-12-lead-inbox-model.md` - Lead inbox model design
|
|
215
|
-
- `thoughts/shared/plans/2025-12-23-runner-level-polling.md` - Runner polling architecture
|
|
216
|
-
- `thoughts/shared/research/2025-12-22-runner-loop-architecture.md` - Runner loop research
|
|
217
|
-
|
|
218
|
-
## Open Questions
|
|
219
|
-
|
|
220
|
-
1. Should `slack_inbox_message` triggers use an atomic "claim" mechanism similar to `task_assigned`?
|
|
221
|
-
2. Should there be a new intermediate status like `processing` for inbox messages?
|
|
222
|
-
3. How should `unread_mentions` be protected from duplicate processing?
|
|
223
|
-
4. Should the runner maintain a set of in-flight trigger IDs to prevent respawning for the same trigger?
|