@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.
Files changed (561) hide show
  1. package/README.md +271 -169
  2. package/openapi.json +5015 -0
  3. package/package.json +40 -7
  4. package/plugin/commands/close-issue.md +7 -3
  5. package/plugin/commands/create-pr.md +18 -12
  6. package/plugin/commands/implement-issue.md +7 -3
  7. package/plugin/commands/respond-github.md +8 -4
  8. package/plugin/commands/review-pr.md +44 -10
  9. package/plugin/commands/start-leader.md +1 -3
  10. package/plugin/commands/start-worker.md +1 -3
  11. package/plugin/commands/work-on-task.md +22 -3
  12. package/plugin/pi-skills/close-issue/SKILL.md +90 -0
  13. package/plugin/pi-skills/create-pr/SKILL.md +99 -0
  14. package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
  15. package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
  16. package/plugin/pi-skills/respond-github/SKILL.md +98 -0
  17. package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
  18. package/plugin/pi-skills/review-pr/SKILL.md +261 -0
  19. package/plugin/pi-skills/start-leader/SKILL.md +121 -0
  20. package/plugin/pi-skills/start-worker/SKILL.md +60 -0
  21. package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
  22. package/plugin/pi-skills/todos/SKILL.md +66 -0
  23. package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
  24. package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
  25. package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
  26. package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
  27. package/plugin/skills/artifacts/examples/static-report.sh +17 -0
  28. package/plugin/skills/artifacts/skill.md +71 -0
  29. package/src/agentmail/app.ts +65 -0
  30. package/src/agentmail/handlers.ts +262 -0
  31. package/src/agentmail/index.ts +9 -0
  32. package/src/agentmail/templates.ts +111 -0
  33. package/src/agentmail/types.ts +51 -0
  34. package/src/artifact-sdk/browser-sdk.ts +30 -0
  35. package/src/artifact-sdk/index.ts +2 -0
  36. package/src/artifact-sdk/localtunnel.d.ts +20 -0
  37. package/src/artifact-sdk/port.ts +12 -0
  38. package/src/artifact-sdk/server.ts +156 -0
  39. package/src/artifact-sdk/tunnel.ts +19 -0
  40. package/src/be/chunking.ts +193 -0
  41. package/src/be/db-queries/oauth.ts +90 -0
  42. package/src/be/db-queries/tracker.ts +182 -0
  43. package/src/be/db.ts +3327 -784
  44. package/src/be/embedding.ts +80 -0
  45. package/src/be/migrations/001_initial.sql +409 -0
  46. package/src/be/migrations/002_one_time_schedules.sql +59 -0
  47. package/src/be/migrations/003_workflows.sql +51 -0
  48. package/src/be/migrations/004_workflow_source.sql +81 -0
  49. package/src/be/migrations/005_epic_next_steps.sql +2 -0
  50. package/src/be/migrations/006_vcs_provider.sql +94 -0
  51. package/src/be/migrations/007_task_dir.sql +2 -0
  52. package/src/be/migrations/008_workflow_redesign.sql +85 -0
  53. package/src/be/migrations/009_tracker_integration.sql +144 -0
  54. package/src/be/migrations/010_step_diagnostics.sql +1 -0
  55. package/src/be/migrations/011_step_next_port.sql +1 -0
  56. package/src/be/migrations/012_trigger_schema.sql +1 -0
  57. package/src/be/migrations/013_task_output_schema.sql +2 -0
  58. package/src/be/migrations/014_prompt_templates.sql +33 -0
  59. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  60. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  61. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  62. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  63. package/src/be/migrations/runner.ts +188 -0
  64. package/src/be/seed.ts +62 -0
  65. package/src/cli.tsx +231 -299
  66. package/src/commands/artifact.ts +241 -0
  67. package/src/commands/onboard/compose-generator.ts +169 -0
  68. package/src/commands/onboard/env-generator.ts +79 -0
  69. package/src/commands/onboard/manifest.ts +37 -0
  70. package/src/commands/onboard/presets.ts +85 -0
  71. package/src/commands/onboard/service-names.ts +47 -0
  72. package/src/commands/onboard/steps/core-credentials.tsx +111 -0
  73. package/src/commands/onboard/steps/custom-templates.tsx +168 -0
  74. package/src/commands/onboard/steps/generate.tsx +154 -0
  75. package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
  76. package/src/commands/onboard/steps/harness.tsx +21 -0
  77. package/src/commands/onboard/steps/health-check.tsx +171 -0
  78. package/src/commands/onboard/steps/integration-github.tsx +105 -0
  79. package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
  80. package/src/commands/onboard/steps/integration-menu.tsx +58 -0
  81. package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
  82. package/src/commands/onboard/steps/integration-slack.tsx +165 -0
  83. package/src/commands/onboard/steps/post-connect.tsx +145 -0
  84. package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
  85. package/src/commands/onboard/steps/post-task.tsx +103 -0
  86. package/src/commands/onboard/steps/prereq-check.tsx +178 -0
  87. package/src/commands/onboard/steps/review.tsx +82 -0
  88. package/src/commands/onboard/steps/start.tsx +97 -0
  89. package/src/commands/onboard/templates.ts +34 -0
  90. package/src/commands/onboard/types.ts +259 -0
  91. package/src/commands/onboard.tsx +425 -0
  92. package/src/commands/runner.ts +1540 -630
  93. package/src/commands/setup.tsx +23 -38
  94. package/src/commands/shared/client-config.ts +41 -0
  95. package/src/commands/templates.ts +172 -0
  96. package/src/github/app.ts +8 -0
  97. package/src/github/handlers.ts +384 -151
  98. package/src/github/index.ts +1 -0
  99. package/src/github/mentions-aliases.test.ts +73 -0
  100. package/src/github/mentions.test.ts +3 -3
  101. package/src/github/mentions.ts +32 -6
  102. package/src/github/templates.ts +398 -0
  103. package/src/github/types.ts +1 -0
  104. package/src/gitlab/auth.ts +63 -0
  105. package/src/gitlab/handlers.ts +368 -0
  106. package/src/gitlab/index.ts +19 -0
  107. package/src/gitlab/reactions.ts +104 -0
  108. package/src/gitlab/templates.ts +140 -0
  109. package/src/gitlab/types.ts +130 -0
  110. package/src/heartbeat/heartbeat.ts +434 -0
  111. package/src/heartbeat/index.ts +1 -0
  112. package/src/heartbeat/templates.ts +30 -0
  113. package/src/hooks/hook.ts +555 -4
  114. package/src/hooks/tool-loop-detection.test.ts +158 -0
  115. package/src/hooks/tool-loop-detection.ts +167 -0
  116. package/src/http/active-sessions.ts +199 -0
  117. package/src/http/agents.ts +328 -0
  118. package/src/http/config.ts +191 -0
  119. package/src/http/core.ts +309 -0
  120. package/src/http/db-query.ts +91 -0
  121. package/src/http/ecosystem.ts +63 -0
  122. package/src/http/epics.ts +460 -0
  123. package/src/http/index.ts +216 -0
  124. package/src/http/mcp.ts +77 -0
  125. package/src/http/memory.ts +168 -0
  126. package/src/http/openapi.ts +109 -0
  127. package/src/http/poll.ts +299 -0
  128. package/src/http/prompt-templates.ts +412 -0
  129. package/src/http/repos.ts +195 -0
  130. package/src/http/route-def.ts +123 -0
  131. package/src/http/schedules.ts +426 -0
  132. package/src/http/session-data.ts +241 -0
  133. package/src/http/stats.ts +174 -0
  134. package/src/http/tasks.ts +468 -0
  135. package/src/http/trackers/index.ts +10 -0
  136. package/src/http/trackers/linear.ts +187 -0
  137. package/src/http/types.ts +12 -0
  138. package/src/http/utils.ts +87 -0
  139. package/src/http/webhooks.ts +432 -0
  140. package/src/http/workflows.ts +530 -0
  141. package/src/http.ts +1 -1890
  142. package/src/linear/README.md +65 -0
  143. package/src/linear/app.ts +48 -0
  144. package/src/linear/client.ts +18 -0
  145. package/src/linear/index.ts +1 -0
  146. package/src/linear/oauth.ts +35 -0
  147. package/src/linear/outbound.ts +212 -0
  148. package/src/linear/sync.ts +567 -0
  149. package/src/linear/templates.ts +47 -0
  150. package/src/linear/types.ts +7 -0
  151. package/src/linear/webhook.ts +104 -0
  152. package/src/oauth/README.md +66 -0
  153. package/src/oauth/index.ts +6 -0
  154. package/src/oauth/wrapper.ts +204 -0
  155. package/src/prompts/base-prompt.ts +150 -265
  156. package/src/prompts/defaults.ts +196 -0
  157. package/src/prompts/registry.ts +57 -0
  158. package/src/prompts/resolver.ts +296 -0
  159. package/src/prompts/session-templates.ts +604 -0
  160. package/src/providers/claude-adapter.ts +442 -0
  161. package/src/providers/index.ts +24 -0
  162. package/src/providers/pi-mono-adapter.ts +442 -0
  163. package/src/providers/pi-mono-extension.ts +624 -0
  164. package/src/providers/pi-mono-mcp-client.ts +124 -0
  165. package/src/providers/types.ts +75 -0
  166. package/src/scheduler/scheduler.test.ts +2 -0
  167. package/src/scheduler/scheduler.ts +231 -40
  168. package/src/server.ts +97 -6
  169. package/src/slack/HEURISTICS.md +105 -0
  170. package/src/slack/actions.ts +133 -0
  171. package/src/slack/app.ts +7 -0
  172. package/src/slack/assistant.ts +118 -0
  173. package/src/slack/blocks.ts +233 -0
  174. package/src/slack/channel-activity.ts +177 -0
  175. package/src/slack/commands.ts +31 -17
  176. package/src/slack/files.ts +1 -1
  177. package/src/slack/handlers.test.ts +114 -1
  178. package/src/slack/handlers.ts +230 -55
  179. package/src/slack/responses.ts +120 -67
  180. package/src/slack/router.ts +17 -99
  181. package/src/slack/templates.ts +55 -0
  182. package/src/slack/thread-buffer.ts +213 -0
  183. package/src/slack/watcher.ts +119 -4
  184. package/src/tests/agent-activity.test.ts +247 -0
  185. package/src/tests/agentmail-filters.test.ts +97 -0
  186. package/src/tests/artifact-sdk.test.ts +800 -0
  187. package/src/tests/base-prompt.test.ts +264 -0
  188. package/src/tests/build-pi-skills.test.ts +127 -0
  189. package/src/tests/channel-activity.test.ts +363 -0
  190. package/src/tests/claude-adapter.test.ts +126 -0
  191. package/src/tests/context-versioning.test.ts +425 -0
  192. package/src/tests/db-queries-oauth.test.ts +197 -0
  193. package/src/tests/db-queries-tracker.test.ts +230 -0
  194. package/src/tests/epics.test.ts +3 -3
  195. package/src/tests/error-tracker.test.ts +368 -0
  196. package/src/tests/fetch-resolved-env.test.ts +167 -0
  197. package/src/tests/generate-default-claude-md.test.ts +9 -1
  198. package/src/tests/generate-identity-templates.test.ts +124 -0
  199. package/src/tests/gitlab-auth.test.ts +109 -0
  200. package/src/tests/gitlab-handlers.test.ts +691 -0
  201. package/src/tests/gitlab-vcs-db.test.ts +177 -0
  202. package/src/tests/heartbeat.test.ts +364 -0
  203. package/src/tests/http-api-integration.test.ts +1698 -0
  204. package/src/tests/linear-outbound-sync.test.ts +200 -0
  205. package/src/tests/linear-webhook.test.ts +406 -0
  206. package/src/tests/match-route.test.ts +187 -0
  207. package/src/tests/memory.test.ts +737 -0
  208. package/src/tests/migration-runner-regressions.test.ts +86 -0
  209. package/src/tests/model-control.test.ts +338 -0
  210. package/src/tests/oauth-wrapper.test.ts +147 -0
  211. package/src/tests/onboard-compose.test.ts +138 -0
  212. package/src/tests/onboard-env.test.ts +174 -0
  213. package/src/tests/onboard-manifest.test.ts +137 -0
  214. package/src/tests/pi-mono-adapter.test.ts +234 -0
  215. package/src/tests/pool-session-logs.test.ts +199 -0
  216. package/src/tests/progress-dedup.test.ts +98 -0
  217. package/src/tests/prompt-template-github.test.ts +682 -0
  218. package/src/tests/prompt-template-remaining.test.ts +504 -0
  219. package/src/tests/prompt-template-resolver.test.ts +621 -0
  220. package/src/tests/prompt-template-session.test.ts +363 -0
  221. package/src/tests/prompt-templates-db.test.ts +616 -0
  222. package/src/tests/provider-adapter.test.ts +122 -0
  223. package/src/tests/provider-command-format.test.ts +98 -0
  224. package/src/tests/reload-config.test.ts +170 -0
  225. package/src/tests/runner-polling-api.test.ts +25 -20
  226. package/src/tests/scheduled-tasks.test.ts +104 -0
  227. package/src/tests/scheduler-backoff.test.ts +166 -0
  228. package/src/tests/self-improvement.test.ts +541 -0
  229. package/src/tests/session-attach.test.ts +536 -0
  230. package/src/tests/session-costs.test.ts +267 -1
  231. package/src/tests/slack-actions.test.ts +133 -0
  232. package/src/tests/slack-assistant.test.ts +136 -0
  233. package/src/tests/slack-blocks.test.ts +246 -0
  234. package/src/tests/slack-metadata-inheritance.test.ts +243 -0
  235. package/src/tests/slack-queue-offline.test.ts +174 -0
  236. package/src/tests/slack-router.test.ts +181 -0
  237. package/src/tests/slack-thread-buffer.test.ts +305 -0
  238. package/src/tests/slack-thread-followups.test.ts +298 -0
  239. package/src/tests/slack-watcher.test.ts +101 -0
  240. package/src/tests/structured-output.test.ts +307 -0
  241. package/src/tests/swarm-repos.test.ts +198 -0
  242. package/src/tests/task-cancellation.test.ts +6 -4
  243. package/src/tests/task-working-dir.test.ts +176 -0
  244. package/src/tests/template-fetch.test.ts +490 -0
  245. package/src/tests/tool-annotations.test.ts +371 -0
  246. package/src/tests/tracker-tools.test.ts +184 -0
  247. package/src/tests/update-profile-agentid.test.ts +248 -0
  248. package/src/tests/update-profile-api.test.ts +143 -3
  249. package/src/tests/update-profile-auth.test.ts +195 -0
  250. package/src/tests/validation-adapters.test.ts +86 -0
  251. package/src/tests/vcs-provider.test.ts +27 -0
  252. package/src/tests/workflow-agent-task.test.ts +196 -0
  253. package/src/tests/workflow-async-v2.test.ts +508 -0
  254. package/src/tests/workflow-convergence.test.ts +541 -0
  255. package/src/tests/workflow-definition-validation.test.ts +366 -0
  256. package/src/tests/workflow-engine-v2.test.ts +691 -0
  257. package/src/tests/workflow-executors.test.ts +736 -0
  258. package/src/tests/workflow-http-v2.test.ts +599 -0
  259. package/src/tests/workflow-integration-io.test.ts +902 -0
  260. package/src/tests/workflow-io-schemas.test.ts +624 -0
  261. package/src/tests/workflow-registry.test.ts +592 -0
  262. package/src/tests/workflow-retry-v2.test.ts +401 -0
  263. package/src/tests/workflow-retry-validation.test.ts +282 -0
  264. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  265. package/src/tests/workflow-template.test.ts +288 -0
  266. package/src/tests/workflow-trigger-schema.test.ts +359 -0
  267. package/src/tests/workflow-triggers-v2.test.ts +264 -0
  268. package/src/tests/workflow-versions.test.ts +208 -0
  269. package/src/tests/workflow-workspace.test.ts +272 -0
  270. package/src/tests/x402-client.test.ts +117 -0
  271. package/src/tests/x402-config.test.ts +182 -0
  272. package/src/tests/x402-spending-tracker.test.ts +185 -0
  273. package/src/tools/cancel-task.ts +2 -0
  274. package/src/tools/context-diff.ts +171 -0
  275. package/src/tools/context-history.ts +138 -0
  276. package/src/tools/create-channel.ts +1 -0
  277. package/src/tools/db-query.ts +78 -0
  278. package/src/tools/delete-channel.ts +132 -0
  279. package/src/tools/epics/assign-task-to-epic.ts +1 -0
  280. package/src/tools/epics/create-epic.ts +3 -2
  281. package/src/tools/epics/delete-epic.ts +2 -0
  282. package/src/tools/epics/get-epic-details.ts +2 -0
  283. package/src/tools/epics/list-epics.ts +2 -0
  284. package/src/tools/epics/unassign-task-from-epic.ts +1 -0
  285. package/src/tools/epics/update-epic.ts +7 -4
  286. package/src/tools/get-swarm.ts +2 -0
  287. package/src/tools/get-task-details.ts +2 -0
  288. package/src/tools/get-tasks.ts +27 -1
  289. package/src/tools/inject-learning.ts +106 -0
  290. package/src/tools/join-swarm.ts +17 -7
  291. package/src/tools/list-channels.ts +2 -0
  292. package/src/tools/list-services.ts +2 -0
  293. package/src/tools/memory-get.ts +56 -0
  294. package/src/tools/memory-search.ts +131 -0
  295. package/src/tools/my-agent-info.ts +2 -0
  296. package/src/tools/poll-task.ts +2 -20
  297. package/src/tools/post-message.ts +1 -0
  298. package/src/tools/prompt-templates/delete.ts +86 -0
  299. package/src/tools/prompt-templates/get.ts +89 -0
  300. package/src/tools/prompt-templates/index.ts +5 -0
  301. package/src/tools/prompt-templates/list.ts +95 -0
  302. package/src/tools/prompt-templates/preview.ts +84 -0
  303. package/src/tools/prompt-templates/set.ts +117 -0
  304. package/src/tools/read-messages.ts +2 -0
  305. package/src/tools/register-agentmail-inbox.ts +166 -0
  306. package/src/tools/register-service.ts +2 -0
  307. package/src/tools/schedules/create-schedule.ts +134 -24
  308. package/src/tools/schedules/delete-schedule.ts +2 -0
  309. package/src/tools/schedules/list-schedules.ts +20 -4
  310. package/src/tools/schedules/run-schedule-now.ts +1 -0
  311. package/src/tools/schedules/update-schedule.ts +49 -17
  312. package/src/tools/send-task.ts +132 -10
  313. package/src/tools/slack-download-file.ts +4 -2
  314. package/src/tools/slack-list-channels.ts +2 -0
  315. package/src/tools/slack-post.ts +2 -0
  316. package/src/tools/slack-read.ts +2 -0
  317. package/src/tools/slack-reply.ts +2 -0
  318. package/src/tools/slack-upload-file.ts +2 -0
  319. package/src/tools/store-progress.ts +205 -4
  320. package/src/tools/swarm-config/delete-config.ts +87 -0
  321. package/src/tools/swarm-config/get-config.ts +108 -0
  322. package/src/tools/swarm-config/index.ts +4 -0
  323. package/src/tools/swarm-config/list-config.ts +99 -0
  324. package/src/tools/swarm-config/set-config.ts +118 -0
  325. package/src/tools/task-action.ts +50 -5
  326. package/src/tools/task-dedup.ts +97 -0
  327. package/src/tools/templates.ts +53 -0
  328. package/src/tools/tool-config.ts +124 -0
  329. package/src/tools/tracker/index.ts +6 -0
  330. package/src/tools/tracker/tracker-link-epic.ts +64 -0
  331. package/src/tools/tracker/tracker-link-task.ts +64 -0
  332. package/src/tools/tracker/tracker-map-agent.ts +57 -0
  333. package/src/tools/tracker/tracker-status.ts +56 -0
  334. package/src/tools/tracker/tracker-sync-status.ts +42 -0
  335. package/src/tools/tracker/tracker-unlink.ts +41 -0
  336. package/src/tools/unregister-service.ts +2 -0
  337. package/src/tools/update-profile.ts +172 -17
  338. package/src/tools/update-service-status.ts +2 -0
  339. package/src/tools/utils.ts +10 -1
  340. package/src/tools/workflows/create-workflow.ts +129 -0
  341. package/src/tools/workflows/delete-workflow.ts +42 -0
  342. package/src/tools/workflows/get-workflow-run.ts +59 -0
  343. package/src/tools/workflows/get-workflow.ts +53 -0
  344. package/src/tools/workflows/index.ts +9 -0
  345. package/src/tools/workflows/list-workflow-runs.ts +48 -0
  346. package/src/tools/workflows/list-workflows.ts +42 -0
  347. package/src/tools/workflows/retry-workflow-run.ts +40 -0
  348. package/src/tools/workflows/trigger-workflow.ts +96 -0
  349. package/src/tools/workflows/update-workflow.ts +133 -0
  350. package/src/tracker/types.ts +51 -0
  351. package/src/types.ts +530 -14
  352. package/src/utils/credentials.test.ts +156 -0
  353. package/src/utils/credentials.ts +50 -0
  354. package/src/utils/error-tracker.ts +190 -0
  355. package/src/vcs/index.ts +15 -0
  356. package/src/vcs/types.ts +5 -0
  357. package/src/workflows/checkpoint.ts +121 -0
  358. package/src/workflows/cooldown.ts +28 -0
  359. package/src/workflows/definition.ts +235 -0
  360. package/src/workflows/engine.ts +580 -0
  361. package/src/workflows/event-bus.ts +29 -0
  362. package/src/workflows/executors/agent-task.ts +103 -0
  363. package/src/workflows/executors/base.ts +86 -0
  364. package/src/workflows/executors/code-match.ts +88 -0
  365. package/src/workflows/executors/index.ts +16 -0
  366. package/src/workflows/executors/notify.ts +93 -0
  367. package/src/workflows/executors/property-match.ts +104 -0
  368. package/src/workflows/executors/raw-llm.ts +83 -0
  369. package/src/workflows/executors/registry.ts +76 -0
  370. package/src/workflows/executors/script.ts +103 -0
  371. package/src/workflows/executors/validate.ts +215 -0
  372. package/src/workflows/executors/vcs.ts +58 -0
  373. package/src/workflows/index.ts +61 -0
  374. package/src/workflows/input.ts +46 -0
  375. package/src/workflows/json-schema-validator.ts +118 -0
  376. package/src/workflows/recovery.ts +139 -0
  377. package/src/workflows/resume.ts +229 -0
  378. package/src/workflows/retry-poller.ts +216 -0
  379. package/src/workflows/template.ts +74 -0
  380. package/src/workflows/templates.ts +86 -0
  381. package/src/workflows/triggers.ts +124 -0
  382. package/src/workflows/validation.ts +104 -0
  383. package/src/workflows/version.ts +44 -0
  384. package/src/x402/cli.ts +140 -0
  385. package/src/x402/client.ts +192 -0
  386. package/src/x402/config.ts +131 -0
  387. package/src/x402/index.ts +37 -0
  388. package/src/x402/openfort-signer.ts +83 -0
  389. package/src/x402/spending-tracker.ts +109 -0
  390. package/templates/official/coder/CLAUDE.md +49 -0
  391. package/templates/official/coder/IDENTITY.md +28 -0
  392. package/templates/official/coder/SOUL.md +43 -0
  393. package/templates/official/coder/TOOLS.md +40 -0
  394. package/templates/official/coder/config.json +23 -0
  395. package/templates/official/coder/start-up.sh +23 -0
  396. package/templates/official/content-reviewer/CLAUDE.md +68 -0
  397. package/templates/official/content-reviewer/IDENTITY.md +28 -0
  398. package/templates/official/content-reviewer/SOUL.md +44 -0
  399. package/templates/official/content-reviewer/TOOLS.md +37 -0
  400. package/templates/official/content-reviewer/config.json +23 -0
  401. package/templates/official/content-reviewer/start-up.sh +23 -0
  402. package/templates/official/content-strategist/CLAUDE.md +63 -0
  403. package/templates/official/content-strategist/IDENTITY.md +33 -0
  404. package/templates/official/content-strategist/SOUL.md +48 -0
  405. package/templates/official/content-strategist/TOOLS.md +47 -0
  406. package/templates/official/content-strategist/config.json +23 -0
  407. package/templates/official/content-strategist/start-up.sh +23 -0
  408. package/templates/official/content-writer/CLAUDE.md +72 -0
  409. package/templates/official/content-writer/IDENTITY.md +30 -0
  410. package/templates/official/content-writer/SOUL.md +46 -0
  411. package/templates/official/content-writer/TOOLS.md +44 -0
  412. package/templates/official/content-writer/config.json +23 -0
  413. package/templates/official/content-writer/start-up.sh +23 -0
  414. package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
  415. package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
  416. package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
  417. package/templates/official/forward-deployed-engineer/config.json +21 -0
  418. package/templates/official/lead/CLAUDE.md +33 -0
  419. package/templates/official/lead/IDENTITY.md +36 -0
  420. package/templates/official/lead/SOUL.md +51 -0
  421. package/templates/official/lead/config.json +22 -0
  422. package/templates/official/researcher/CLAUDE.md +46 -0
  423. package/templates/official/researcher/IDENTITY.md +28 -0
  424. package/templates/official/researcher/SOUL.md +43 -0
  425. package/templates/official/researcher/config.json +21 -0
  426. package/templates/official/reviewer/CLAUDE.md +63 -0
  427. package/templates/official/reviewer/IDENTITY.md +28 -0
  428. package/templates/official/reviewer/SOUL.md +45 -0
  429. package/templates/official/reviewer/config.json +21 -0
  430. package/templates/official/tester/CLAUDE.md +53 -0
  431. package/templates/official/tester/IDENTITY.md +28 -0
  432. package/templates/official/tester/SOUL.md +55 -0
  433. package/templates/official/tester/config.json +21 -0
  434. package/templates/schema.ts +35 -0
  435. package/.claude/settings.local.json +0 -115
  436. package/.dockerignore +0 -61
  437. package/.editorconfig +0 -15
  438. package/.env.docker.example +0 -39
  439. package/.env.example +0 -40
  440. package/.github/workflows/ci.yml +0 -76
  441. package/.github/workflows/docker-and-deploy.yml +0 -117
  442. package/.wts-config.json +0 -4
  443. package/.wts-setup.ts +0 -102
  444. package/CLAUDE.md +0 -104
  445. package/CONTRIBUTING.md +0 -270
  446. package/DEPLOYMENT.md +0 -605
  447. package/Dockerfile +0 -57
  448. package/Dockerfile.worker +0 -157
  449. package/FAQ.md +0 -19
  450. package/MCP.md +0 -406
  451. package/UI.md +0 -40
  452. package/assets/agent-swarm-logo-orange.png +0 -0
  453. package/assets/agent-swarm-logo.png +0 -0
  454. package/assets/agent-swarm.mp4 +0 -0
  455. package/assets/agent-swarm.png +0 -0
  456. package/biome.json +0 -39
  457. package/deploy/DEPLOY.md +0 -60
  458. package/deploy/agent-swarm.service +0 -17
  459. package/deploy/docker-push.ts +0 -30
  460. package/deploy/install.ts +0 -85
  461. package/deploy/prod-db.ts +0 -42
  462. package/deploy/uninstall.ts +0 -12
  463. package/deploy/update.ts +0 -21
  464. package/docker-compose.example.yml +0 -159
  465. package/docker-entrypoint.sh +0 -352
  466. package/ecosystem.config.cjs +0 -66
  467. package/plugin/README.md +0 -1
  468. package/plugin/hooks/hooks.json +0 -71
  469. package/pyproject.toml +0 -9
  470. package/scripts/generate-mcp-docs.ts +0 -415
  471. package/slack-manifest.json +0 -71
  472. package/src/tests/get-inbox-message.test.ts +0 -145
  473. package/src/tools/get-inbox-message.ts +0 -89
  474. package/src/tools/inbox-delegate.ts +0 -113
  475. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  476. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  477. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  478. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  479. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  480. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  481. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  482. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  483. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  484. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  485. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  486. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  487. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  488. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  489. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  490. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  491. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  492. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  493. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  494. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  495. package/thoughts/shared/research/.gitkeep +0 -0
  496. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  497. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  498. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  499. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  500. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  501. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  502. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  503. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  504. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  505. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  506. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  507. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  508. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  509. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  510. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  511. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  512. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  513. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  514. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  515. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  516. package/tsconfig.json +0 -37
  517. package/ui/CLAUDE.md +0 -49
  518. package/ui/bun.lock +0 -771
  519. package/ui/index.html +0 -22
  520. package/ui/package-lock.json +0 -5290
  521. package/ui/package.json +0 -33
  522. package/ui/pnpm-lock.yaml +0 -3341
  523. package/ui/postcss.config.js +0 -6
  524. package/ui/public/logo.png +0 -0
  525. package/ui/src/App.tsx +0 -63
  526. package/ui/src/components/ActivityFeed.tsx +0 -440
  527. package/ui/src/components/AgentDetailPanel.tsx +0 -733
  528. package/ui/src/components/AgentsPanel.tsx +0 -815
  529. package/ui/src/components/ChatPanel.tsx +0 -1920
  530. package/ui/src/components/ConfigModal.tsx +0 -253
  531. package/ui/src/components/Dashboard.tsx +0 -832
  532. package/ui/src/components/EditAgentProfileModal.tsx +0 -433
  533. package/ui/src/components/EpicDetailPage.tsx +0 -741
  534. package/ui/src/components/EpicsPanel.tsx +0 -566
  535. package/ui/src/components/Header.tsx +0 -160
  536. package/ui/src/components/JsonViewer.tsx +0 -171
  537. package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
  538. package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
  539. package/ui/src/components/ServicesPanel.tsx +0 -622
  540. package/ui/src/components/SessionLogPanel.tsx +0 -1219
  541. package/ui/src/components/StatsBar.tsx +0 -321
  542. package/ui/src/components/StatusBadge.tsx +0 -168
  543. package/ui/src/components/TaskDetailPanel.tsx +0 -903
  544. package/ui/src/components/TasksPanel.tsx +0 -614
  545. package/ui/src/components/UsageCharts.tsx +0 -216
  546. package/ui/src/components/UsageTab.tsx +0 -394
  547. package/ui/src/hooks/queries.ts +0 -353
  548. package/ui/src/hooks/useAutoScroll.ts +0 -83
  549. package/ui/src/index.css +0 -257
  550. package/ui/src/lib/api.ts +0 -268
  551. package/ui/src/lib/config.ts +0 -35
  552. package/ui/src/lib/contentPreview.ts +0 -208
  553. package/ui/src/lib/theme.ts +0 -214
  554. package/ui/src/lib/utils.ts +0 -88
  555. package/ui/src/main.tsx +0 -28
  556. package/ui/src/types/api.ts +0 -323
  557. package/ui/src/vite-env.d.ts +0 -1
  558. package/ui/tailwind.config.js +0 -37
  559. package/ui/tsconfig.json +0 -31
  560. package/ui/vite.config.ts +0 -35
  561. /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`