@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,507 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
date: 2026-01-14
|
|
3
|
-
author: Claude
|
|
4
|
-
status: draft
|
|
5
|
-
tags: [slack, lead-agent, thread-context, inbox-messages, mcp-tools]
|
|
6
|
-
related_research: thoughts/shared/research/2026-01-14-lead-slack-thread-context.md
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Fix Slack Thread Context for Lead Agent
|
|
10
|
-
|
|
11
|
-
## Overview
|
|
12
|
-
|
|
13
|
-
The lead agent cannot properly follow up on Slack messages because:
|
|
14
|
-
1. The prompt only shows a 100-character truncated preview, which cuts off the actual message when thread context is prepended
|
|
15
|
-
2. There is no MCP tool for the agent to read full inbox message content
|
|
16
|
-
3. The message format doesn't clearly distinguish thread history from the new message
|
|
17
|
-
|
|
18
|
-
This plan implements three changes:
|
|
19
|
-
1. Remove the 100-character truncation in prompt formatting
|
|
20
|
-
2. Create a new `get-inbox-message` MCP tool
|
|
21
|
-
3. Restructure message storage to clearly separate thread context from new message
|
|
22
|
-
|
|
23
|
-
## Current State Analysis
|
|
24
|
-
|
|
25
|
-
### How Messages Are Currently Stored
|
|
26
|
-
|
|
27
|
-
When a Slack message arrives, `handlers.ts` concatenates thread context with the new message:
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
// src/slack/handlers.ts:221
|
|
31
|
-
const fullTaskDescription = threadContext + taskDescription;
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Where `threadContext` is formatted as:
|
|
35
|
-
```
|
|
36
|
-
<thread_context>
|
|
37
|
-
John Doe: Can you help me with this bug?
|
|
38
|
-
[Agent]: I'll look into that...
|
|
39
|
-
</thread_context>
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
And `taskDescription` is the new message content (e.g., "Any update?").
|
|
44
|
-
|
|
45
|
-
The resulting `content` stored in `inbox_messages` is:
|
|
46
|
-
```
|
|
47
|
-
<thread_context>
|
|
48
|
-
John Doe: Can you help me with this bug?
|
|
49
|
-
[Agent]: I'll look into that...
|
|
50
|
-
</thread_context>
|
|
51
|
-
|
|
52
|
-
Any update?
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### How Messages Are Currently Presented
|
|
56
|
-
|
|
57
|
-
In `runner.ts:372`, the content is truncated to 100 characters:
|
|
58
|
-
```typescript
|
|
59
|
-
const preview = m.content.length > 100 ? `${m.content.slice(0, 100)}...` : m.content;
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
This means the agent sees:
|
|
63
|
-
```
|
|
64
|
-
- "<thread_context>
|
|
65
|
-
John Doe: Can you help me with this bug?
|
|
66
|
-
[Agent]: I'll..." (inboxMessageId: abc-123)
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
The actual new message ("Any update?") is never shown.
|
|
70
|
-
|
|
71
|
-
### Key Discoveries
|
|
72
|
-
|
|
73
|
-
- `src/commands/runner.ts:372` - 100-char truncation
|
|
74
|
-
- `src/slack/handlers.ts:221` - Thread context prepended to message
|
|
75
|
-
- `src/slack/handlers.ts:85` - Thread context wrapped in `<thread_context>` tags
|
|
76
|
-
- `src/be/db.ts:2610` - `getInboxMessageById()` retrieves full message
|
|
77
|
-
- `src/types.ts:26-48` - `InboxMessage` schema with all Slack fields
|
|
78
|
-
- `src/server.ts:73-75` - Where Slack tools are registered
|
|
79
|
-
|
|
80
|
-
## Desired End State
|
|
81
|
-
|
|
82
|
-
After implementation:
|
|
83
|
-
1. The lead agent receives a clear prompt showing:
|
|
84
|
-
- The new message content (what they need to respond to)
|
|
85
|
-
- Thread context separately labeled
|
|
86
|
-
2. A `get-inbox-message` tool allows reading full message details
|
|
87
|
-
3. The agent can easily understand what message triggered the inbox entry
|
|
88
|
-
|
|
89
|
-
**Verification**:
|
|
90
|
-
- Send a Slack message in a thread to the lead agent
|
|
91
|
-
- Verify the prompt shows the new message prominently with thread context below
|
|
92
|
-
- Verify the `get-inbox-message` tool returns full message details
|
|
93
|
-
|
|
94
|
-
## What We're NOT Doing
|
|
95
|
-
|
|
96
|
-
- NOT changing how messages are stored in the database
|
|
97
|
-
- NOT modifying the Slack webhook handlers
|
|
98
|
-
- NOT changing how thread context is fetched from Slack
|
|
99
|
-
- NOT adding new database columns
|
|
100
|
-
- NOT modifying the `slack-reply` or `inbox-delegate` tools
|
|
101
|
-
|
|
102
|
-
## Implementation Approach
|
|
103
|
-
|
|
104
|
-
We'll make changes in three phases:
|
|
105
|
-
1. **Phase 1**: Restructure how inbox messages store content (separate new message from context)
|
|
106
|
-
2. **Phase 2**: Update runner prompt formatting to show full content clearly
|
|
107
|
-
3. **Phase 3**: Create `get-inbox-message` MCP tool
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## Phase 1: Restructure Inbox Message Content Storage
|
|
112
|
-
|
|
113
|
-
### Overview
|
|
114
|
-
|
|
115
|
-
Change how `handlers.ts` stores inbox messages to clearly separate the new message from thread context, so we can present them differently in the prompt.
|
|
116
|
-
|
|
117
|
-
### Changes Required
|
|
118
|
-
|
|
119
|
-
#### 1. Update Slack Handlers to Store Structured Content
|
|
120
|
-
|
|
121
|
-
**File**: `src/slack/handlers.ts`
|
|
122
|
-
|
|
123
|
-
**Current code** (lines 213-245):
|
|
124
|
-
```typescript
|
|
125
|
-
const threadContext = await getThreadContext(
|
|
126
|
-
client,
|
|
127
|
-
msg.channel,
|
|
128
|
-
msg.thread_ts,
|
|
129
|
-
msg.ts,
|
|
130
|
-
botUserId,
|
|
131
|
-
);
|
|
132
|
-
const fullTaskDescription = threadContext + taskDescription;
|
|
133
|
-
// ...
|
|
134
|
-
createInboxMessage(agent.id, fullTaskDescription, {
|
|
135
|
-
source: "slack",
|
|
136
|
-
slackChannelId: msg.channel,
|
|
137
|
-
slackThreadTs: threadTs,
|
|
138
|
-
slackUserId: msg.user,
|
|
139
|
-
matchedText: match.matchedText,
|
|
140
|
-
});
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
**New approach**: Store the new message as `content` and thread context separately in a new format:
|
|
144
|
-
|
|
145
|
-
```typescript
|
|
146
|
-
const threadContext = await getThreadContext(
|
|
147
|
-
client,
|
|
148
|
-
msg.channel,
|
|
149
|
-
msg.thread_ts,
|
|
150
|
-
msg.ts,
|
|
151
|
-
botUserId,
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
// Structure the content with clear separation
|
|
155
|
-
const structuredContent = threadContext
|
|
156
|
-
? `<new_message>\n${taskDescription}\n</new_message>\n\n<thread_history>\n${threadContext}\n</thread_history>`
|
|
157
|
-
: taskDescription;
|
|
158
|
-
|
|
159
|
-
createInboxMessage(agent.id, structuredContent, {
|
|
160
|
-
source: "slack",
|
|
161
|
-
slackChannelId: msg.channel,
|
|
162
|
-
slackThreadTs: threadTs,
|
|
163
|
-
slackUserId: msg.user,
|
|
164
|
-
matchedText: match.matchedText,
|
|
165
|
-
});
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
#### 2. Update getThreadContext to Return Raw Content
|
|
169
|
-
|
|
170
|
-
**File**: `src/slack/handlers.ts`
|
|
171
|
-
|
|
172
|
-
Change `getThreadContext` to return just the formatted messages without the `<thread_context>` wrapper (we'll wrap differently):
|
|
173
|
-
|
|
174
|
-
**Current** (line 85):
|
|
175
|
-
```typescript
|
|
176
|
-
return `<thread_context>\n${formattedMessages.join("\n")}\n</thread_context>\n\n`;
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
**New**:
|
|
180
|
-
```typescript
|
|
181
|
-
return formattedMessages.join("\n");
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### Success Criteria
|
|
185
|
-
|
|
186
|
-
#### Automated Verification:
|
|
187
|
-
- [x] TypeScript compiles: `bun run tsc:check`
|
|
188
|
-
- [x] Tests pass: `bun test`
|
|
189
|
-
- [x] Linting passes: `bun run lint`
|
|
190
|
-
|
|
191
|
-
#### Manual Verification:
|
|
192
|
-
- [ ] Send a Slack message in a thread to the lead agent
|
|
193
|
-
- [ ] Check database to verify `content` field has structured format with `<new_message>` and `<thread_history>` tags
|
|
194
|
-
|
|
195
|
-
**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation from the human that the database storage looks correct before proceeding to Phase 2.
|
|
196
|
-
|
|
197
|
-
---
|
|
198
|
-
|
|
199
|
-
## Phase 2: Update Runner Prompt Formatting
|
|
200
|
-
|
|
201
|
-
### Overview
|
|
202
|
-
|
|
203
|
-
Modify `buildPromptForTrigger` to show full message content with clear structure instead of truncated preview.
|
|
204
|
-
|
|
205
|
-
### Changes Required
|
|
206
|
-
|
|
207
|
-
#### 1. Update Trigger Prompt Formatting
|
|
208
|
-
|
|
209
|
-
**File**: `src/commands/runner.ts`
|
|
210
|
-
|
|
211
|
-
**Current code** (lines 368-382):
|
|
212
|
-
```typescript
|
|
213
|
-
case "slack_inbox_message": {
|
|
214
|
-
// Lead: Slack inbox messages from users
|
|
215
|
-
const inboxSummaries = (trigger.messages || [])
|
|
216
|
-
.map((m: { id: string; content: string }) => {
|
|
217
|
-
const preview = m.content.length > 100 ? `${m.content.slice(0, 100)}...` : m.content;
|
|
218
|
-
return `- "${preview}" (inboxMessageId: ${m.id})`;
|
|
219
|
-
})
|
|
220
|
-
.join("\n");
|
|
221
|
-
|
|
222
|
-
return `You have ${trigger.count} inbox message(s) from Slack:\n${inboxSummaries}\n\nFor each message, you can either:
|
|
223
|
-
- Use \`slack-reply\` with the inboxMessageId to respond directly to the user
|
|
224
|
-
- Use \`inbox-delegate\` to assign the request to a worker agent
|
|
225
|
-
|
|
226
|
-
Review each message and decide the appropriate action.`;
|
|
227
|
-
}
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
**New code**:
|
|
231
|
-
```typescript
|
|
232
|
-
case "slack_inbox_message": {
|
|
233
|
-
// Lead: Slack inbox messages from users
|
|
234
|
-
const inboxDetails = (trigger.messages || [])
|
|
235
|
-
.map((m: { id: string; content: string }, index: number) => {
|
|
236
|
-
// Parse structured content if present
|
|
237
|
-
const newMessageMatch = m.content.match(/<new_message>\n([\s\S]*?)\n<\/new_message>/);
|
|
238
|
-
const threadHistoryMatch = m.content.match(/<thread_history>\n([\s\S]*?)\n<\/thread_history>/);
|
|
239
|
-
|
|
240
|
-
const newMessage = newMessageMatch ? newMessageMatch[1] : m.content;
|
|
241
|
-
const threadHistory = threadHistoryMatch ? threadHistoryMatch[1] : null;
|
|
242
|
-
|
|
243
|
-
let formatted = `### Message ${index + 1} (inboxMessageId: ${m.id})\n`;
|
|
244
|
-
formatted += `**New Message:**\n${newMessage}\n`;
|
|
245
|
-
|
|
246
|
-
if (threadHistory) {
|
|
247
|
-
formatted += `\n**Thread History:**\n${threadHistory}\n`;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
return formatted;
|
|
251
|
-
})
|
|
252
|
-
.join("\n---\n\n");
|
|
253
|
-
|
|
254
|
-
return `You have ${trigger.count} inbox message(s) from Slack:\n\n${inboxDetails}\n\nFor each message, you can either:
|
|
255
|
-
- Use \`slack-reply\` with the inboxMessageId to respond directly to the user
|
|
256
|
-
- Use \`inbox-delegate\` to assign the request to a worker agent
|
|
257
|
-
|
|
258
|
-
Review each message and decide the appropriate action.`;
|
|
259
|
-
}
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
### Success Criteria
|
|
263
|
-
|
|
264
|
-
#### Automated Verification:
|
|
265
|
-
- [x] TypeScript compiles: `bun run tsc:check`
|
|
266
|
-
- [x] Tests pass: `bun test`
|
|
267
|
-
- [x] Linting passes: `bun run lint`
|
|
268
|
-
|
|
269
|
-
#### Manual Verification:
|
|
270
|
-
- [ ] Send a Slack message in a thread to the lead agent
|
|
271
|
-
- [ ] Verify the prompt shows the new message clearly labeled
|
|
272
|
-
- [ ] Verify thread history is shown separately below
|
|
273
|
-
- [ ] Verify no truncation occurs
|
|
274
|
-
|
|
275
|
-
**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation that the prompt format is clear and usable before proceeding to Phase 3.
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## Phase 3: Create get-inbox-message MCP Tool
|
|
280
|
-
|
|
281
|
-
### Overview
|
|
282
|
-
|
|
283
|
-
Create a new MCP tool that allows lead agents to read full details of inbox messages.
|
|
284
|
-
|
|
285
|
-
### Changes Required
|
|
286
|
-
|
|
287
|
-
#### 1. Create the Tool File
|
|
288
|
-
|
|
289
|
-
**File**: `src/tools/get-inbox-message.ts` (new file)
|
|
290
|
-
|
|
291
|
-
```typescript
|
|
292
|
-
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
293
|
-
import * as z from "zod";
|
|
294
|
-
import { getAgentById, getInboxMessageById } from "@/be/db";
|
|
295
|
-
import { createToolRegistrar } from "@/tools/utils";
|
|
296
|
-
import { InboxMessageSchema } from "@/types";
|
|
297
|
-
|
|
298
|
-
export const registerGetInboxMessageTool = (server: McpServer) => {
|
|
299
|
-
createToolRegistrar(server)(
|
|
300
|
-
"get-inbox-message",
|
|
301
|
-
{
|
|
302
|
-
title: "Get inbox message details",
|
|
303
|
-
description:
|
|
304
|
-
"Returns detailed information about a specific inbox message, including full content and Slack context. Only accessible to the lead agent who owns the message.",
|
|
305
|
-
inputSchema: z.object({
|
|
306
|
-
inboxMessageId: z.uuid().describe("The ID of the inbox message to retrieve."),
|
|
307
|
-
}),
|
|
308
|
-
outputSchema: z.object({
|
|
309
|
-
success: z.boolean(),
|
|
310
|
-
message: z.string(),
|
|
311
|
-
inboxMessage: InboxMessageSchema.optional(),
|
|
312
|
-
}),
|
|
313
|
-
},
|
|
314
|
-
async ({ inboxMessageId }, requestInfo, _meta) => {
|
|
315
|
-
if (!requestInfo.agentId) {
|
|
316
|
-
return {
|
|
317
|
-
content: [{ type: "text", text: "Agent ID not found." }],
|
|
318
|
-
structuredContent: {
|
|
319
|
-
yourAgentId: requestInfo.agentId,
|
|
320
|
-
success: false,
|
|
321
|
-
message: "Agent ID not found.",
|
|
322
|
-
},
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
const agent = getAgentById(requestInfo.agentId);
|
|
327
|
-
if (!agent) {
|
|
328
|
-
return {
|
|
329
|
-
content: [{ type: "text", text: "Agent not found in swarm." }],
|
|
330
|
-
structuredContent: {
|
|
331
|
-
yourAgentId: requestInfo.agentId,
|
|
332
|
-
success: false,
|
|
333
|
-
message: "Agent not found in swarm.",
|
|
334
|
-
},
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
const inboxMsg = getInboxMessageById(inboxMessageId);
|
|
339
|
-
|
|
340
|
-
if (!inboxMsg) {
|
|
341
|
-
return {
|
|
342
|
-
content: [{ type: "text", text: `Inbox message with ID "${inboxMessageId}" not found.` }],
|
|
343
|
-
structuredContent: {
|
|
344
|
-
yourAgentId: requestInfo.agentId,
|
|
345
|
-
success: false,
|
|
346
|
-
message: `Inbox message with ID "${inboxMessageId}" not found.`,
|
|
347
|
-
},
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// Verify ownership - only the assigned lead can read their inbox
|
|
352
|
-
if (inboxMsg.agentId !== requestInfo.agentId) {
|
|
353
|
-
return {
|
|
354
|
-
content: [{ type: "text", text: "This inbox message belongs to another agent." }],
|
|
355
|
-
structuredContent: {
|
|
356
|
-
yourAgentId: requestInfo.agentId,
|
|
357
|
-
success: false,
|
|
358
|
-
message: "This inbox message belongs to another agent.",
|
|
359
|
-
},
|
|
360
|
-
};
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
return {
|
|
364
|
-
content: [
|
|
365
|
-
{
|
|
366
|
-
type: "text",
|
|
367
|
-
text: `Inbox message "${inboxMessageId}" retrieved.\n\nContent:\n${inboxMsg.content}`,
|
|
368
|
-
},
|
|
369
|
-
],
|
|
370
|
-
structuredContent: {
|
|
371
|
-
yourAgentId: requestInfo.agentId,
|
|
372
|
-
success: true,
|
|
373
|
-
message: `Inbox message "${inboxMessageId}" retrieved.`,
|
|
374
|
-
inboxMessage: inboxMsg,
|
|
375
|
-
},
|
|
376
|
-
};
|
|
377
|
-
},
|
|
378
|
-
);
|
|
379
|
-
};
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
#### 2. Register the Tool in Server
|
|
383
|
-
|
|
384
|
-
**File**: `src/server.ts`
|
|
385
|
-
|
|
386
|
-
Add import at line 9 (with other lead inbox tools):
|
|
387
|
-
```typescript
|
|
388
|
-
import { registerGetInboxMessageTool } from "./tools/get-inbox-message";
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
Register after `registerInboxDelegateTool` at line 75:
|
|
392
|
-
```typescript
|
|
393
|
-
registerGetInboxMessageTool(server);
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
#### 3. Update Base Prompt with Tool Documentation
|
|
397
|
-
|
|
398
|
-
**File**: `src/prompts/base-prompt.ts`
|
|
399
|
-
|
|
400
|
-
Update the Slack Inbox section (around line 20-24):
|
|
401
|
-
```typescript
|
|
402
|
-
#### Slack Inbox
|
|
403
|
-
When Slack messages are routed to you, they appear as "inbox messages" - NOT tasks.
|
|
404
|
-
Each inbox message shows the new message to respond to, with any thread history for context.
|
|
405
|
-
|
|
406
|
-
Available tools:
|
|
407
|
-
- \`get-inbox-message\`: Read full details of an inbox message (content, Slack context, status)
|
|
408
|
-
- \`slack-reply\`: Reply directly to the user in the Slack thread
|
|
409
|
-
- \`inbox-delegate\`: Create a task for a worker agent (preserves Slack context for replies)
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
### Success Criteria
|
|
413
|
-
|
|
414
|
-
#### Automated Verification:
|
|
415
|
-
- [x] TypeScript compiles: `bun run tsc:check`
|
|
416
|
-
- [x] Tests pass: `bun test`
|
|
417
|
-
- [x] Linting passes: `bun run lint`
|
|
418
|
-
- [x] Tool appears in MCP tool list (registered in server.ts:77)
|
|
419
|
-
|
|
420
|
-
#### Manual Verification:
|
|
421
|
-
- [ ] Lead agent can call `get-inbox-message` with a valid ID
|
|
422
|
-
- [ ] Tool returns full message content and Slack context
|
|
423
|
-
- [ ] Tool rejects requests from agents who don't own the message
|
|
424
|
-
- [ ] Tool returns appropriate error for non-existent message IDs
|
|
425
|
-
|
|
426
|
-
**Implementation Note**: After completing this phase and all automated verification passes, pause here for manual confirmation that the tool works correctly.
|
|
427
|
-
|
|
428
|
-
---
|
|
429
|
-
|
|
430
|
-
## Testing Strategy
|
|
431
|
-
|
|
432
|
-
### Unit Tests
|
|
433
|
-
|
|
434
|
-
Add tests for the new `get-inbox-message` tool:
|
|
435
|
-
|
|
436
|
-
**File**: `src/tests/get-inbox-message.test.ts`
|
|
437
|
-
|
|
438
|
-
```typescript
|
|
439
|
-
import { describe, test, expect, beforeAll } from "bun:test";
|
|
440
|
-
import { initDb, createInboxMessage, getInboxMessageById } from "@/be/db";
|
|
441
|
-
|
|
442
|
-
describe("get-inbox-message tool", () => {
|
|
443
|
-
beforeAll(() => {
|
|
444
|
-
initDb(":memory:");
|
|
445
|
-
});
|
|
446
|
-
|
|
447
|
-
test("creates inbox message with structured content", () => {
|
|
448
|
-
const agentId = crypto.randomUUID();
|
|
449
|
-
const content = `<new_message>\nAny update?\n</new_message>\n\n<thread_history>\nJohn: Help with bug\n</thread_history>`;
|
|
450
|
-
|
|
451
|
-
const msg = createInboxMessage(agentId, content, {
|
|
452
|
-
source: "slack",
|
|
453
|
-
slackChannelId: "C123",
|
|
454
|
-
slackThreadTs: "1234.5678",
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
expect(msg.content).toBe(content);
|
|
458
|
-
expect(msg.slackChannelId).toBe("C123");
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
test("retrieves inbox message by ID", () => {
|
|
462
|
-
const agentId = crypto.randomUUID();
|
|
463
|
-
const msg = createInboxMessage(agentId, "Test message", { source: "slack" });
|
|
464
|
-
|
|
465
|
-
const retrieved = getInboxMessageById(msg.id);
|
|
466
|
-
expect(retrieved).not.toBeNull();
|
|
467
|
-
expect(retrieved?.content).toBe("Test message");
|
|
468
|
-
});
|
|
469
|
-
});
|
|
470
|
-
```
|
|
471
|
-
|
|
472
|
-
### Integration Tests
|
|
473
|
-
|
|
474
|
-
1. Send Slack message in new thread → verify no thread history
|
|
475
|
-
2. Send Slack message in existing thread → verify thread history present
|
|
476
|
-
3. Call `get-inbox-message` → verify full content returned
|
|
477
|
-
4. Call `slack-reply` → verify reply appears in Slack thread
|
|
478
|
-
|
|
479
|
-
### Manual Testing Steps
|
|
480
|
-
|
|
481
|
-
1. Start a lead agent
|
|
482
|
-
2. Send a Slack message mentioning the swarm bot in a channel
|
|
483
|
-
3. Verify the lead receives the message with clear "New Message" section
|
|
484
|
-
4. Reply in the thread
|
|
485
|
-
5. Send another message in the same thread
|
|
486
|
-
6. Verify the lead receives it with both new message and thread history clearly separated
|
|
487
|
-
7. Use `get-inbox-message` tool to retrieve full details
|
|
488
|
-
8. Use `slack-reply` to respond
|
|
489
|
-
|
|
490
|
-
## Performance Considerations
|
|
491
|
-
|
|
492
|
-
- No performance impact expected - changes are to formatting only
|
|
493
|
-
- The `get-inbox-message` tool is a simple database lookup (indexed by UUID)
|
|
494
|
-
- Thread history is already fetched at message receive time (no additional Slack API calls)
|
|
495
|
-
|
|
496
|
-
## Migration Notes
|
|
497
|
-
|
|
498
|
-
- No database migration needed - using existing columns
|
|
499
|
-
- Backward compatibility: The new structured format includes the full content, so existing logic that reads `content` will still work
|
|
500
|
-
- Messages created before this change will display without the structured format (just raw content)
|
|
501
|
-
|
|
502
|
-
## References
|
|
503
|
-
|
|
504
|
-
- Related research: `thoughts/shared/research/2026-01-14-lead-slack-thread-context.md`
|
|
505
|
-
- Similar tool: `src/tools/get-task-details.ts:1-52`
|
|
506
|
-
- Message creation: `src/slack/handlers.ts:238-247`
|
|
507
|
-
- Prompt formatting: `src/commands/runner.ts:368-382`
|