@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,565 +0,0 @@
1
- ---
2
- date: 2026-01-15
3
- author: Claude
4
- status: ready
5
- tags: [scheduling, cron, sqlite, task-automation, implementation]
6
- related_research: thoughts/shared/research/2026-01-15-scheduled-tasks.md
7
- ---
8
-
9
- # Scheduled Tasks Feature - Implementation Plan
10
-
11
- **Date**: 2026-01-15
12
- **Status**: Ready for Implementation
13
-
14
- ## Overview
15
-
16
- Implement a native SQLite-based scheduled tasks feature for the agent-swarm. This allows defining recurring tasks (via cron expressions or intervals) that automatically create agent tasks at specified times. The scheduler follows existing architectural patterns (SQLite persistence, interval-based polling) and integrates seamlessly with the existing task system.
17
-
18
- ## Current State Analysis
19
-
20
- The agent-swarm currently supports:
21
- - **Task creation**: via `createTaskExtended()` in `src/be/db.ts`
22
- - **Task pool**: unassigned tasks workers can claim
23
- - **Interval polling**: pattern established in `src/slack/watcher.ts`
24
- - **MCP tools**: registered via capability-gated `createToolRegistrar` pattern
25
- - **Graceful shutdown**: SIGINT handler in `src/http.ts`
26
-
27
- ### Key Discoveries:
28
- - Database uses SQLite with WAL mode, singleton pattern (`src/be/db.ts`)
29
- - Schema created in transaction
30
- - Migrations use try-catch for ALTER TABLE
31
- - Slack watcher demonstrates polling pattern with throttling and optimistic locking (`src/slack/watcher.ts`)
32
- - Tools registered via `createToolRegistrar` with Zod schemas (`src/tools/utils.ts`)
33
-
34
- ## Desired End State
35
-
36
- A fully functional scheduler that:
37
- 1. Stores schedule definitions in SQLite (`scheduled_tasks` table)
38
- 2. Polls for due schedules every 10 seconds (configurable)
39
- 3. Creates tasks via existing `createTaskExtended` when schedules are due
40
- 4. Provides 5 MCP tools for schedule management
41
- 5. Starts on server startup and stops gracefully on shutdown
42
- 6. Supports both cron expressions and interval-based scheduling
43
-
44
- ## Quick Verification Reference
45
-
46
- Common commands to verify the implementation:
47
- - `bun run lint` - Linting
48
- - `bun run typecheck` - Type checking
49
- - `bun test` - Run tests (if available)
50
- - `bun run build` - Build
51
-
52
- Key files to check:
53
- - `src/be/db.ts` - Schema and database functions
54
- - `src/scheduler/scheduler.ts` - Core scheduler service
55
- - `src/tools/schedules/*.ts` - MCP tools
56
- - `src/http.ts` - Server startup/shutdown integration
57
-
58
- ## What We're NOT Doing
59
-
60
- - **Catch-up execution**: Missed schedules during downtime will be skipped (user requirement)
61
- - **Concurrency limits**: No limit on concurrent scheduled task instances (user requirement)
62
- - **Task dependencies**: Scheduled tasks won't depend on other tasks (user requirement)
63
- - **Notifications**: No automatic Slack/GitHub notifications (each task defines its own connections)
64
- - **Horizontal scaling**: Single-instance scheduler (can be added later with leader election)
65
- - **UI dashboard**: No frontend changes in this phase
66
-
67
- ## Implementation Approach
68
-
69
- Follow existing patterns:
70
- 1. Add `scheduled_tasks` table schema in `db.ts`
71
- 2. Create scheduler service following `slack/watcher.ts` pattern
72
- 3. Register MCP tools following existing tool patterns
73
- 4. Integrate startup/shutdown in `http.ts`
74
-
75
- ---
76
-
77
- ## Phase 1: Database Schema & Core Types
78
-
79
- ### Overview
80
- Add the `scheduled_tasks` table schema and TypeScript types.
81
-
82
- ### Changes Required:
83
-
84
- #### 1. Schema Definition
85
- **File**: `src/be/db.ts`
86
- **Location**: After existing table definitions (~line 190, before indexes)
87
-
88
- **Add table creation:**
89
- ```sql
90
- CREATE TABLE IF NOT EXISTS scheduled_tasks (
91
- id TEXT PRIMARY KEY,
92
- name TEXT NOT NULL UNIQUE,
93
- description TEXT,
94
- cronExpression TEXT,
95
- intervalMs INTEGER,
96
- taskTemplate TEXT NOT NULL,
97
- taskType TEXT,
98
- tags TEXT DEFAULT '[]',
99
- priority INTEGER DEFAULT 50,
100
- targetAgentId TEXT,
101
- enabled INTEGER DEFAULT 1,
102
- lastRunAt TEXT,
103
- nextRunAt TEXT,
104
- createdByAgentId TEXT,
105
- timezone TEXT DEFAULT 'UTC',
106
- createdAt TEXT NOT NULL,
107
- lastUpdatedAt TEXT NOT NULL,
108
- CHECK (cronExpression IS NOT NULL OR intervalMs IS NOT NULL)
109
- )
110
- ```
111
-
112
- **Add indexes:**
113
- ```sql
114
- CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_enabled ON scheduled_tasks(enabled);
115
- CREATE INDEX IF NOT EXISTS idx_scheduled_tasks_nextRunAt ON scheduled_tasks(nextRunAt);
116
- ```
117
-
118
- #### 2. Type Definitions
119
- **File**: `src/types.ts`
120
- **Location**: After AgentTask definitions
121
-
122
- **Add new types:**
123
- ```typescript
124
- export const ScheduledTaskSchema = z.object({
125
- id: z.uuid(),
126
- name: z.string().min(1).max(100),
127
- description: z.string().optional(),
128
- cronExpression: z.string().optional(),
129
- intervalMs: z.number().int().positive().optional(),
130
- taskTemplate: z.string().min(1),
131
- taskType: z.string().max(50).optional(),
132
- tags: z.array(z.string()).default([]),
133
- priority: z.number().int().min(0).max(100).default(50),
134
- targetAgentId: z.uuid().optional(),
135
- enabled: z.boolean().default(true),
136
- lastRunAt: z.iso.datetime().optional(),
137
- nextRunAt: z.iso.datetime().optional(),
138
- createdByAgentId: z.uuid().optional(),
139
- timezone: z.string().default('UTC'),
140
- createdAt: z.iso.datetime(),
141
- lastUpdatedAt: z.iso.datetime(),
142
- }).refine(
143
- data => data.cronExpression || data.intervalMs,
144
- { message: "Either cronExpression or intervalMs must be provided" }
145
- );
146
-
147
- export type ScheduledTask = z.infer<typeof ScheduledTaskSchema>;
148
- ```
149
-
150
- #### 3. Database Helper Functions
151
- **File**: `src/be/db.ts`
152
- **Location**: After existing task functions
153
-
154
- **Add CRUD functions:**
155
- - `getScheduledTasks(filters?)` - List schedules with optional filters
156
- - `getScheduledTaskById(id)` - Get single schedule
157
- - `getScheduledTaskByName(name)` - Get by unique name
158
- - `createScheduledTask(data)` - Create new schedule
159
- - `updateScheduledTask(id, data)` - Update existing schedule
160
- - `deleteScheduledTask(id)` - Delete schedule
161
- - `getDueScheduledTasks()` - Query `enabled=1 AND nextRunAt <= now`
162
-
163
- ### Success Criteria:
164
-
165
- #### Automated Verification:
166
- - [ ] `bun run typecheck` passes
167
- - [ ] `bun run lint` passes
168
-
169
- #### Manual Verification:
170
- - [ ] Database initializes without errors
171
- - [ ] Can query `scheduled_tasks` table via SQLite CLI
172
-
173
- **Implementation Note**: After completing this phase, verify schema is created correctly before proceeding.
174
-
175
- ---
176
-
177
- ## Phase 2: Scheduler Service
178
-
179
- ### Overview
180
- Create the core scheduler service that polls for due schedules and creates tasks.
181
-
182
- ### Changes Required:
183
-
184
- #### 1. Install cron-parser Package
185
- **Command**: `bun add cron-parser`
186
-
187
- #### 2. Create Scheduler Service
188
- **File**: `src/scheduler/scheduler.ts` (new file)
189
-
190
- **Implementation following slack/watcher.ts pattern:**
191
-
192
- ```typescript
193
- import { parseExpression } from 'cron-parser';
194
- import { getDb, createTaskExtended, getDueScheduledTasks, updateScheduledTask } from '../be/db';
195
- import type { ScheduledTask } from '../types';
196
-
197
- let schedulerInterval: ReturnType<typeof setInterval> | null = null;
198
- let isProcessing = false;
199
-
200
- // Calculate next run time based on cron or interval
201
- export function calculateNextRun(schedule: ScheduledTask, fromTime: Date = new Date()): string {
202
- if (schedule.cronExpression) {
203
- const interval = parseExpression(schedule.cronExpression, {
204
- currentDate: fromTime,
205
- tz: schedule.timezone || 'UTC',
206
- });
207
- return interval.next().toISOString();
208
- }
209
-
210
- if (schedule.intervalMs) {
211
- return new Date(fromTime.getTime() + schedule.intervalMs).toISOString();
212
- }
213
-
214
- throw new Error('Schedule must have cronExpression or intervalMs');
215
- }
216
-
217
- // Execute a single scheduled task
218
- async function executeSchedule(schedule: ScheduledTask): Promise<void> {
219
- const now = new Date().toISOString();
220
-
221
- // Create the actual task
222
- createTaskExtended(schedule.taskTemplate, {
223
- creatorAgentId: schedule.createdByAgentId,
224
- taskType: schedule.taskType,
225
- tags: [...schedule.tags, 'scheduled', `schedule:${schedule.name}`],
226
- priority: schedule.priority,
227
- agentId: schedule.targetAgentId, // null goes to pool
228
- });
229
-
230
- // Update lastRunAt and nextRunAt
231
- const nextRun = calculateNextRun(schedule, new Date());
232
- updateScheduledTask(schedule.id, {
233
- lastRunAt: now,
234
- nextRunAt: nextRun,
235
- lastUpdatedAt: now,
236
- });
237
-
238
- console.log(`[Scheduler] Executed schedule "${schedule.name}", next run: ${nextRun}`);
239
- }
240
-
241
- // Main polling function
242
- export function startScheduler(intervalMs = 10000): void {
243
- if (schedulerInterval) {
244
- console.log('[Scheduler] Already running');
245
- return;
246
- }
247
-
248
- console.log(`[Scheduler] Starting with ${intervalMs}ms polling interval`);
249
-
250
- schedulerInterval = setInterval(async () => {
251
- if (isProcessing) return;
252
- isProcessing = true;
253
-
254
- try {
255
- const dueSchedules = getDueScheduledTasks();
256
-
257
- for (const schedule of dueSchedules) {
258
- try {
259
- await executeSchedule(schedule);
260
- } catch (err) {
261
- console.error(`[Scheduler] Error executing "${schedule.name}":`, err);
262
- }
263
- }
264
- } finally {
265
- isProcessing = false;
266
- }
267
- }, intervalMs);
268
- }
269
-
270
- export function stopScheduler(): void {
271
- if (schedulerInterval) {
272
- clearInterval(schedulerInterval);
273
- schedulerInterval = null;
274
- isProcessing = false;
275
- console.log('[Scheduler] Stopped');
276
- }
277
- }
278
-
279
- // Run a schedule immediately (manual trigger)
280
- export async function runScheduleNow(scheduleId: string): Promise<void> {
281
- const schedule = getScheduledTaskById(scheduleId);
282
- if (!schedule) {
283
- throw new Error(`Schedule not found: ${scheduleId}`);
284
- }
285
- if (!schedule.enabled) {
286
- throw new Error(`Schedule is disabled: ${schedule.name}`);
287
- }
288
- await executeSchedule(schedule);
289
- }
290
- ```
291
-
292
- #### 3. Create Index File
293
- **File**: `src/scheduler/index.ts` (new file)
294
-
295
- ```typescript
296
- export { startScheduler, stopScheduler, runScheduleNow, calculateNextRun } from './scheduler';
297
- ```
298
-
299
- ### Success Criteria:
300
-
301
- #### Automated Verification:
302
- - [ ] `bun run typecheck` passes
303
- - [ ] `bun run lint` passes
304
- - [ ] Package `cron-parser` installed successfully
305
-
306
- #### Manual Verification:
307
- - [ ] Scheduler starts without errors
308
- - [ ] Test cron parsing: `parseExpression('0 9 * * *')` returns valid next date
309
-
310
- **Implementation Note**: Test cron-parser integration before proceeding.
311
-
312
- ---
313
-
314
- ## Phase 3: MCP Tools
315
-
316
- ### Overview
317
- Create 5 MCP tools for schedule management: list-schedules, create-schedule, update-schedule, delete-schedule, run-schedule-now.
318
-
319
- ### Changes Required:
320
-
321
- #### 1. Create Tools Directory
322
- **Directory**: `src/tools/schedules/`
323
-
324
- #### 2. list-schedules Tool
325
- **File**: `src/tools/schedules/list-schedules.ts`
326
-
327
- ```typescript
328
- import type { McpServer } from '@anthropic-ai/sdk/resources/mcp';
329
- import { z } from 'zod';
330
- import { createToolRegistrar } from '../utils';
331
- import { getScheduledTasks } from '../../be/db';
332
- import { ScheduledTaskSchema } from '../../types';
333
-
334
- export const registerListSchedulesTool = (server: McpServer) => {
335
- createToolRegistrar(server)(
336
- 'list-schedules',
337
- {
338
- title: 'List scheduled tasks',
339
- description: 'View all scheduled tasks with optional filters.',
340
- inputSchema: z.object({
341
- enabled: z.boolean().optional().describe('Filter by enabled status'),
342
- name: z.string().optional().describe('Filter by name (partial match)'),
343
- }),
344
- outputSchema: z.object({
345
- success: z.boolean(),
346
- schedules: z.array(ScheduledTaskSchema),
347
- count: z.number(),
348
- }),
349
- },
350
- async ({ enabled, name }, requestInfo, _meta) => {
351
- const schedules = getScheduledTasks({ enabled, name });
352
- return {
353
- success: true,
354
- schedules,
355
- count: schedules.length,
356
- };
357
- },
358
- );
359
- };
360
- ```
361
-
362
- #### 3. create-schedule Tool
363
- **File**: `src/tools/schedules/create-schedule.ts`
364
-
365
- Implements schedule creation with:
366
- - Required: name, taskTemplate
367
- - Optional: cronExpression, intervalMs, description, taskType, tags, priority, targetAgentId, timezone
368
- - Validates cron expression syntax
369
- - Calculates initial nextRunAt
370
- - Respects schedule ownership (createdByAgentId from requestInfo, or defaults to lead)
371
-
372
- #### 4. update-schedule Tool
373
- **File**: `src/tools/schedules/update-schedule.ts`
374
-
375
- Implements schedule updates:
376
- - Update by ID or name
377
- - Can enable/disable schedule
378
- - Recalculates nextRunAt if cron/interval changes
379
- - Only creator or lead can update
380
-
381
- #### 5. delete-schedule Tool
382
- **File**: `src/tools/schedules/delete-schedule.ts`
383
-
384
- Implements schedule deletion:
385
- - Delete by ID or name
386
- - Only creator or lead can delete
387
-
388
- #### 6. run-schedule-now Tool
389
- **File**: `src/tools/schedules/run-schedule-now.ts`
390
-
391
- Implements immediate execution:
392
- - Trigger by ID or name
393
- - Creates task immediately
394
- - Updates lastRunAt but not nextRunAt (regular schedule continues)
395
-
396
- #### 7. Index File
397
- **File**: `src/tools/schedules/index.ts`
398
-
399
- ```typescript
400
- export { registerListSchedulesTool } from './list-schedules';
401
- export { registerCreateScheduleTool } from './create-schedule';
402
- export { registerUpdateScheduleTool } from './update-schedule';
403
- export { registerDeleteScheduleTool } from './delete-schedule';
404
- export { registerRunScheduleNowTool } from './run-schedule-now';
405
- ```
406
-
407
- ### Success Criteria:
408
-
409
- #### Automated Verification:
410
- - [ ] `bun run typecheck` passes
411
- - [ ] `bun run lint` passes
412
-
413
- #### Manual Verification:
414
- - [ ] Each tool registers without errors
415
- - [ ] Tools appear in MCP tool list
416
-
417
- **Implementation Note**: After completing this phase, test each tool manually via MCP client.
418
-
419
- ---
420
-
421
- ## Phase 4: Server Integration
422
-
423
- ### Overview
424
- Wire up scheduler startup/shutdown and register MCP tools.
425
-
426
- ### Changes Required:
427
-
428
- #### 1. Add Capability Gate
429
- **File**: `src/server.ts`
430
-
431
- Add new capability for scheduling:
432
- ```typescript
433
- const DEFAULT_CAPABILITIES = "core,task-pool,messaging,profiles,services,scheduling";
434
- ```
435
-
436
- Register tools if capability enabled:
437
- ```typescript
438
- if (hasCapability("scheduling")) {
439
- registerListSchedulesTool(server);
440
- registerCreateScheduleTool(server);
441
- registerUpdateScheduleTool(server);
442
- registerDeleteScheduleTool(server);
443
- registerRunScheduleNowTool(server);
444
- }
445
- ```
446
-
447
- #### 2. Start Scheduler on Server Start
448
- **File**: `src/http.ts`
449
-
450
- In `httpServer.listen()` callback:
451
- ```typescript
452
- // Start scheduler (if configured)
453
- if (hasCapability("scheduling")) {
454
- const { startScheduler } = await import('./scheduler');
455
- startScheduler(Number(process.env.SCHEDULER_INTERVAL_MS) || 10000);
456
- }
457
- ```
458
-
459
- #### 3. Stop Scheduler on Shutdown
460
- **File**: `src/http.ts`
461
-
462
- In `shutdown()` function:
463
- ```typescript
464
- // Stop scheduler
465
- if (hasCapability("scheduling")) {
466
- const { stopScheduler } = await import('./scheduler');
467
- stopScheduler();
468
- }
469
- ```
470
-
471
- #### 4. Environment Variable Documentation
472
- **File**: `.env.example`
473
-
474
- Add:
475
- ```bash
476
- # Scheduler configuration
477
- SCHEDULER_INTERVAL_MS=10000 # Polling interval (default: 10 seconds)
478
- ```
479
-
480
- ### Success Criteria:
481
-
482
- #### Automated Verification:
483
- - [ ] `bun run typecheck` passes
484
- - [ ] `bun run lint` passes
485
-
486
- #### Manual Verification:
487
- - [ ] Server starts with scheduler running (check logs)
488
- - [ ] Server shutdown stops scheduler cleanly
489
- - [ ] Tools available via MCP when capability enabled
490
-
491
- ---
492
-
493
- ## Phase 5: Testing & Documentation
494
-
495
- ### Overview
496
- Add tests and update documentation.
497
-
498
- ### Changes Required:
499
-
500
- #### 1. Unit Tests
501
- **File**: `src/scheduler/scheduler.test.ts`
502
-
503
- Test cases:
504
- - `calculateNextRun` with cron expression
505
- - `calculateNextRun` with interval
506
- - `calculateNextRun` with timezone
507
- - Scheduler starts and stops correctly
508
-
509
- #### 2. Update MCP.md
510
- **File**: `MCP.md`
511
-
512
- Add section documenting new tools:
513
- - `list-schedules`
514
- - `create-schedule`
515
- - `update-schedule`
516
- - `delete-schedule`
517
- - `run-schedule-now`
518
-
519
- Include examples for cron and interval scheduling.
520
-
521
- #### 3. Update README.md
522
- **File**: `README.md`
523
-
524
- Add brief mention of scheduling capability in features section.
525
-
526
- ### Success Criteria:
527
-
528
- #### Automated Verification:
529
- - [ ] `bun test` passes (if tests are set up)
530
- - [ ] `bun run lint` passes
531
-
532
- #### Manual Verification:
533
- - [ ] Documentation is clear and accurate
534
- - [ ] Examples work as documented
535
-
536
- ---
537
-
538
- ## Testing Strategy
539
-
540
- ### Unit Tests
541
- - `calculateNextRun` function with various cron expressions
542
- - Database CRUD functions for scheduled_tasks
543
- - Cron expression validation
544
-
545
- ### Integration Tests
546
- - End-to-end: create schedule -> wait for execution -> verify task created
547
- - Tool validation: verify MCP tool schemas
548
-
549
- ### Manual Testing Steps
550
- 1. Create a schedule with 1-minute interval
551
- 2. Wait for task to be created
552
- 3. Verify task appears in task list with correct metadata
553
- 4. Disable schedule, verify no new tasks
554
- 5. Run schedule manually, verify task created
555
- 6. Delete schedule, verify removal
556
-
557
- ---
558
-
559
- ## References
560
-
561
- - Research document: `thoughts/shared/research/2026-01-15-scheduled-tasks.md`
562
- - Existing polling pattern: `src/slack/watcher.ts`
563
- - Task creation: `src/be/db.ts`
564
- - Tool registration: `src/tools/utils.ts`
565
- - cron-parser docs: https://www.npmjs.com/package/cron-parser