@desplega.ai/agent-swarm 1.49.0 → 1.52.0

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 (547) hide show
  1. package/README.md +1 -1
  2. package/openapi.json +2070 -728
  3. package/package.json +10 -1
  4. package/src/agentmail/handlers.ts +65 -10
  5. package/src/agentmail/templates.ts +111 -0
  6. package/src/be/db.ts +1233 -7
  7. package/src/be/migrations/014_prompt_templates.sql +33 -0
  8. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  9. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  10. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  11. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  12. package/src/be/migrations/019_skills.sql +65 -0
  13. package/src/be/migrations/020_approval_requests.sql +41 -0
  14. package/src/be/seed.ts +62 -0
  15. package/src/be/skill-parser.ts +70 -0
  16. package/src/be/skill-sync.ts +106 -0
  17. package/src/commands/runner.ts +320 -132
  18. package/src/commands/templates.ts +172 -0
  19. package/src/github/handlers.ts +292 -77
  20. package/src/github/mentions-aliases.test.ts +73 -0
  21. package/src/github/mentions.test.ts +3 -3
  22. package/src/github/mentions.ts +32 -6
  23. package/src/github/templates.ts +398 -0
  24. package/src/gitlab/handlers.ts +63 -22
  25. package/src/gitlab/templates.ts +140 -0
  26. package/src/heartbeat/heartbeat.ts +19 -10
  27. package/src/heartbeat/templates.ts +30 -0
  28. package/src/http/active-sessions.ts +27 -0
  29. package/src/http/approval-requests.ts +247 -0
  30. package/src/http/config.ts +3 -3
  31. package/src/http/index.ts +9 -2
  32. package/src/http/poll.ts +135 -14
  33. package/src/http/prompt-templates.ts +412 -0
  34. package/src/http/schedules.ts +35 -0
  35. package/src/http/skills.ts +479 -0
  36. package/src/http/workflows.ts +8 -0
  37. package/src/linear/sync.ts +28 -4
  38. package/src/linear/templates.ts +47 -0
  39. package/src/prompts/base-prompt.ts +41 -490
  40. package/src/prompts/registry.ts +57 -0
  41. package/src/prompts/resolver.ts +296 -0
  42. package/src/prompts/session-templates.ts +604 -0
  43. package/src/providers/claude-adapter.ts +15 -2
  44. package/src/providers/pi-mono-extension.ts +5 -1
  45. package/src/scheduler/scheduler.ts +125 -91
  46. package/src/server.ts +44 -0
  47. package/src/slack/assistant.ts +7 -4
  48. package/src/slack/channel-activity.ts +177 -0
  49. package/src/slack/handlers.ts +21 -6
  50. package/src/slack/templates.ts +55 -0
  51. package/src/tests/approval-requests.test.ts +735 -0
  52. package/src/tests/artifact-sdk.test.ts +12 -12
  53. package/src/tests/base-prompt.test.ts +49 -49
  54. package/src/tests/channel-activity.test.ts +363 -0
  55. package/src/tests/heartbeat.test.ts +1 -0
  56. package/src/tests/linear-webhook.test.ts +7 -3
  57. package/src/tests/pool-session-logs.test.ts +199 -0
  58. package/src/tests/prompt-template-github.test.ts +682 -0
  59. package/src/tests/prompt-template-remaining.test.ts +504 -0
  60. package/src/tests/prompt-template-resolver.test.ts +621 -0
  61. package/src/tests/prompt-template-session.test.ts +363 -0
  62. package/src/tests/prompt-templates-db.test.ts +616 -0
  63. package/src/tests/self-improvement.test.ts +8 -7
  64. package/src/tests/skill-parser.test.ts +178 -0
  65. package/src/tests/skill-sync.test.ts +171 -0
  66. package/src/tests/slack-metadata-inheritance.test.ts +1 -1
  67. package/src/tests/slack-thread-followups.test.ts +1 -1
  68. package/src/tests/structured-output.test.ts +0 -4
  69. package/src/tests/tool-annotations.test.ts +2 -1
  70. package/src/tests/update-profile-agentid.test.ts +248 -0
  71. package/src/tests/update-profile-auth.test.ts +195 -0
  72. package/src/tests/workflow-async-v2.test.ts +126 -4
  73. package/src/tests/workflow-definition-validation.test.ts +76 -0
  74. package/src/tests/workflow-executors.test.ts +4 -2
  75. package/src/tests/workflow-retry-v2.test.ts +1 -1
  76. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  77. package/src/tests/workflow-workspace.test.ts +272 -0
  78. package/src/tools/prompt-templates/delete.ts +86 -0
  79. package/src/tools/prompt-templates/get.ts +89 -0
  80. package/src/tools/prompt-templates/index.ts +5 -0
  81. package/src/tools/prompt-templates/list.ts +95 -0
  82. package/src/tools/prompt-templates/preview.ts +84 -0
  83. package/src/tools/prompt-templates/set.ts +117 -0
  84. package/src/tools/request-human-input.ts +106 -0
  85. package/src/tools/skills/index.ts +11 -0
  86. package/src/tools/skills/skill-create.ts +105 -0
  87. package/src/tools/skills/skill-delete.ts +67 -0
  88. package/src/tools/skills/skill-get.ts +75 -0
  89. package/src/tools/skills/skill-install-remote.ts +152 -0
  90. package/src/tools/skills/skill-install.ts +101 -0
  91. package/src/tools/skills/skill-list.ts +77 -0
  92. package/src/tools/skills/skill-publish.ts +123 -0
  93. package/src/tools/skills/skill-search.ts +43 -0
  94. package/src/tools/skills/skill-sync-remote.ts +128 -0
  95. package/src/tools/skills/skill-uninstall.ts +60 -0
  96. package/src/tools/skills/skill-update.ts +128 -0
  97. package/src/tools/store-progress.ts +22 -4
  98. package/src/tools/task-action.ts +20 -0
  99. package/src/tools/templates.ts +53 -0
  100. package/src/tools/tool-config.ts +23 -0
  101. package/src/tools/update-profile.ts +106 -34
  102. package/src/tools/workflows/create-workflow.ts +19 -1
  103. package/src/tools/workflows/update-workflow.ts +16 -1
  104. package/src/types.ts +109 -2
  105. package/src/workflows/definition.ts +30 -12
  106. package/src/workflows/engine.ts +40 -14
  107. package/src/workflows/executors/agent-task.ts +14 -3
  108. package/src/workflows/executors/human-in-the-loop.ts +160 -0
  109. package/src/workflows/executors/registry.ts +2 -0
  110. package/src/workflows/index.ts +1 -1
  111. package/src/workflows/recovery.ts +72 -0
  112. package/src/workflows/resume.ts +162 -12
  113. package/src/workflows/triggers.ts +31 -2
  114. package/src/workflows/version.ts +2 -0
  115. package/.claude/settings.json +0 -84
  116. package/.claude/settings.local.json +0 -117
  117. package/.dockerignore +0 -61
  118. package/.editorconfig +0 -15
  119. package/.entire/settings.json +0 -4
  120. package/.env.docker.example +0 -56
  121. package/.env.example +0 -78
  122. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
  123. package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
  124. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  125. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
  126. package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
  127. package/.github/workflows/ci.yml +0 -52
  128. package/.github/workflows/docker-and-deploy.yml +0 -132
  129. package/.github/workflows/merge-gate.yml +0 -233
  130. package/.opencode/plugins/entire.ts +0 -133
  131. package/.superset/config.json +0 -6
  132. package/.wts-config.json +0 -4
  133. package/.wts-setup.ts +0 -171
  134. package/CHANGELOG.md +0 -447
  135. package/CLAUDE.md +0 -521
  136. package/CONTRIBUTING.md +0 -315
  137. package/DEPLOYMENT.md +0 -622
  138. package/Dockerfile +0 -65
  139. package/Dockerfile.worker +0 -189
  140. package/MCP.md +0 -841
  141. package/UI.md +0 -40
  142. package/api-entrypoint.sh +0 -56
  143. package/assets/agent-swarm-logo-orange.png +0 -0
  144. package/assets/agent-swarm-logo.png +0 -0
  145. package/assets/agent-swarm.mp4 +0 -0
  146. package/assets/agent-swarm.png +0 -0
  147. package/biome.json +0 -39
  148. package/deploy/DEPLOY.md +0 -60
  149. package/deploy/agent-swarm.service +0 -17
  150. package/deploy/docker-push.ts +0 -30
  151. package/deploy/install.ts +0 -85
  152. package/deploy/prod-db.ts +0 -42
  153. package/deploy/uninstall.ts +0 -12
  154. package/deploy/update.ts +0 -21
  155. package/depot.json +0 -1
  156. package/docker-compose.example.yml +0 -350
  157. package/docker-compose.local.yml +0 -119
  158. package/docker-entrypoint.sh +0 -632
  159. package/docs-site/app/api/search/route.ts +0 -4
  160. package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
  161. package/docs-site/app/docs/layout.tsx +0 -12
  162. package/docs-site/app/globals.css +0 -24
  163. package/docs-site/app/layout.config.tsx +0 -34
  164. package/docs-site/app/layout.tsx +0 -119
  165. package/docs-site/app/llms-full.txt/route.ts +0 -11
  166. package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
  167. package/docs-site/app/llms.txt/route.ts +0 -8
  168. package/docs-site/app/page.tsx +0 -5
  169. package/docs-site/app/robots.ts +0 -13
  170. package/docs-site/app/sitemap.ts +0 -37
  171. package/docs-site/components/api-page.client.tsx +0 -4
  172. package/docs-site/components/api-page.tsx +0 -7
  173. package/docs-site/components/mdx/mermaid.tsx +0 -55
  174. package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
  175. package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
  176. package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
  177. package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
  178. package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
  179. package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
  180. package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
  181. package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
  182. package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
  183. package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
  184. package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
  185. package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
  186. package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
  187. package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
  188. package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
  189. package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
  190. package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
  191. package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
  192. package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
  193. package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
  194. package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
  195. package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
  196. package/docs-site/content/docs/(documentation)/index.mdx +0 -65
  197. package/docs-site/content/docs/(documentation)/meta.json +0 -19
  198. package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
  199. package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
  200. package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
  201. package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
  202. package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
  203. package/docs-site/content/docs/api-reference/agents.mdx +0 -9
  204. package/docs-site/content/docs/api-reference/channels.mdx +0 -9
  205. package/docs-site/content/docs/api-reference/config.mdx +0 -9
  206. package/docs-site/content/docs/api-reference/debug.mdx +0 -9
  207. package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
  208. package/docs-site/content/docs/api-reference/epics.mdx +0 -9
  209. package/docs-site/content/docs/api-reference/index.mdx +0 -32
  210. package/docs-site/content/docs/api-reference/memory.mdx +0 -9
  211. package/docs-site/content/docs/api-reference/meta.json +0 -25
  212. package/docs-site/content/docs/api-reference/poll.mdx +0 -9
  213. package/docs-site/content/docs/api-reference/repos.mdx +0 -9
  214. package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
  215. package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
  216. package/docs-site/content/docs/api-reference/stats.mdx +0 -9
  217. package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
  218. package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
  219. package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
  220. package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
  221. package/docs-site/content/docs/meta.json +0 -3
  222. package/docs-site/lib/get-llm-text.ts +0 -10
  223. package/docs-site/lib/openapi.ts +0 -23
  224. package/docs-site/lib/source.ts +0 -8
  225. package/docs-site/mdx-components.tsx +0 -13
  226. package/docs-site/next.config.mjs +0 -29
  227. package/docs-site/package.json +0 -35
  228. package/docs-site/pnpm-lock.yaml +0 -5407
  229. package/docs-site/postcss.config.mjs +0 -8
  230. package/docs-site/public/logo.png +0 -0
  231. package/docs-site/scripts/generate-docs.ts +0 -171
  232. package/docs-site/source.config.ts +0 -17
  233. package/docs-site/tsconfig.json +0 -46
  234. package/ecosystem.config.cjs +0 -66
  235. package/landing/next.config.ts +0 -14
  236. package/landing/package.json +0 -31
  237. package/landing/pnpm-lock.yaml +0 -1091
  238. package/landing/postcss.config.mjs +0 -8
  239. package/landing/public/apple-touch-icon.png +0 -0
  240. package/landing/public/favicon.ico +0 -0
  241. package/landing/public/logo.png +0 -0
  242. package/landing/public/og-image.png +0 -0
  243. package/landing/public/omghost-desplega.svg +0 -30
  244. package/landing/public/omghost-openfort.svg +0 -9
  245. package/landing/src/app/actions/waitlist.ts +0 -25
  246. package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
  247. package/landing/src/app/blog/page.tsx +0 -162
  248. package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
  249. package/landing/src/app/examples/page.tsx +0 -174
  250. package/landing/src/app/examples/x402/page.tsx +0 -456
  251. package/landing/src/app/globals.css +0 -122
  252. package/landing/src/app/layout.tsx +0 -134
  253. package/landing/src/app/page.tsx +0 -27
  254. package/landing/src/app/robots.ts +0 -13
  255. package/landing/src/app/sitemap.ts +0 -44
  256. package/landing/src/components/architecture.tsx +0 -163
  257. package/landing/src/components/cta.tsx +0 -52
  258. package/landing/src/components/features.tsx +0 -160
  259. package/landing/src/components/footer.tsx +0 -100
  260. package/landing/src/components/hero.tsx +0 -217
  261. package/landing/src/components/how-it-works.tsx +0 -165
  262. package/landing/src/components/navbar.tsx +0 -147
  263. package/landing/src/components/waitlist.tsx +0 -110
  264. package/landing/src/components/why-choose.tsx +0 -149
  265. package/landing/src/components/workshops.tsx +0 -328
  266. package/landing/src/lib/utils.ts +0 -6
  267. package/landing/tsconfig.json +0 -41
  268. package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
  269. package/new-ui/CLAUDE.md +0 -92
  270. package/new-ui/README.md +0 -73
  271. package/new-ui/biome.json +0 -42
  272. package/new-ui/components.json +0 -21
  273. package/new-ui/index.html +0 -25
  274. package/new-ui/package.json +0 -49
  275. package/new-ui/pnpm-lock.yaml +0 -4845
  276. package/new-ui/public/logo.png +0 -0
  277. package/new-ui/src/api/client.ts +0 -814
  278. package/new-ui/src/api/hooks/index.ts +0 -64
  279. package/new-ui/src/api/hooks/use-agents.ts +0 -58
  280. package/new-ui/src/api/hooks/use-channels.ts +0 -115
  281. package/new-ui/src/api/hooks/use-config-api.ts +0 -46
  282. package/new-ui/src/api/hooks/use-costs.ts +0 -122
  283. package/new-ui/src/api/hooks/use-db-query.ts +0 -29
  284. package/new-ui/src/api/hooks/use-epics.ts +0 -75
  285. package/new-ui/src/api/hooks/use-repos.ts +0 -61
  286. package/new-ui/src/api/hooks/use-schedules.ts +0 -81
  287. package/new-ui/src/api/hooks/use-services.ts +0 -16
  288. package/new-ui/src/api/hooks/use-stats.ts +0 -27
  289. package/new-ui/src/api/hooks/use-tasks.ts +0 -89
  290. package/new-ui/src/api/hooks/use-workflows.ts +0 -109
  291. package/new-ui/src/api/types.ts +0 -549
  292. package/new-ui/src/app/App.tsx +0 -13
  293. package/new-ui/src/app/providers.tsx +0 -32
  294. package/new-ui/src/app/router.tsx +0 -52
  295. package/new-ui/src/components/layout/app-header.tsx +0 -47
  296. package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
  297. package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
  298. package/new-ui/src/components/layout/config-guard.tsx +0 -22
  299. package/new-ui/src/components/layout/root-layout.tsx +0 -40
  300. package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
  301. package/new-ui/src/components/shared/command-menu.tsx +0 -131
  302. package/new-ui/src/components/shared/data-grid.tsx +0 -141
  303. package/new-ui/src/components/shared/empty-state.tsx +0 -24
  304. package/new-ui/src/components/shared/error-boundary.tsx +0 -72
  305. package/new-ui/src/components/shared/json-viewer.tsx +0 -47
  306. package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
  307. package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
  308. package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
  309. package/new-ui/src/components/shared/stats-bar.tsx +0 -132
  310. package/new-ui/src/components/shared/status-badge.tsx +0 -131
  311. package/new-ui/src/components/shared/usage-summary.tsx +0 -179
  312. package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
  313. package/new-ui/src/components/ui/alert.tsx +0 -60
  314. package/new-ui/src/components/ui/avatar.tsx +0 -96
  315. package/new-ui/src/components/ui/badge.tsx +0 -46
  316. package/new-ui/src/components/ui/button.tsx +0 -62
  317. package/new-ui/src/components/ui/card.tsx +0 -75
  318. package/new-ui/src/components/ui/command.tsx +0 -160
  319. package/new-ui/src/components/ui/dialog.tsx +0 -143
  320. package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
  321. package/new-ui/src/components/ui/input.tsx +0 -21
  322. package/new-ui/src/components/ui/label.tsx +0 -19
  323. package/new-ui/src/components/ui/progress.tsx +0 -26
  324. package/new-ui/src/components/ui/scroll-area.tsx +0 -54
  325. package/new-ui/src/components/ui/select.tsx +0 -175
  326. package/new-ui/src/components/ui/separator.tsx +0 -28
  327. package/new-ui/src/components/ui/sheet.tsx +0 -132
  328. package/new-ui/src/components/ui/sidebar.tsx +0 -691
  329. package/new-ui/src/components/ui/skeleton.tsx +0 -13
  330. package/new-ui/src/components/ui/sonner.tsx +0 -35
  331. package/new-ui/src/components/ui/switch.tsx +0 -33
  332. package/new-ui/src/components/ui/table.tsx +0 -92
  333. package/new-ui/src/components/ui/tabs.tsx +0 -79
  334. package/new-ui/src/components/ui/textarea.tsx +0 -18
  335. package/new-ui/src/components/ui/tooltip.tsx +0 -51
  336. package/new-ui/src/components/workflows/action-node.tsx +0 -53
  337. package/new-ui/src/components/workflows/condition-node.tsx +0 -50
  338. package/new-ui/src/components/workflows/graph-utils.ts +0 -124
  339. package/new-ui/src/components/workflows/json-tree.tsx +0 -189
  340. package/new-ui/src/components/workflows/node-styles.ts +0 -10
  341. package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
  342. package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
  343. package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
  344. package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
  345. package/new-ui/src/hooks/use-config.ts +0 -203
  346. package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
  347. package/new-ui/src/hooks/use-mobile.ts +0 -19
  348. package/new-ui/src/hooks/use-theme.ts +0 -60
  349. package/new-ui/src/lib/config.ts +0 -188
  350. package/new-ui/src/lib/slugs.ts +0 -71
  351. package/new-ui/src/lib/utils.ts +0 -120
  352. package/new-ui/src/main.tsx +0 -11
  353. package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
  354. package/new-ui/src/pages/agents/page.tsx +0 -134
  355. package/new-ui/src/pages/chat/page.tsx +0 -674
  356. package/new-ui/src/pages/config/page.tsx +0 -1109
  357. package/new-ui/src/pages/dashboard/page.tsx +0 -454
  358. package/new-ui/src/pages/debug/page.tsx +0 -275
  359. package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
  360. package/new-ui/src/pages/epics/page.tsx +0 -321
  361. package/new-ui/src/pages/not-found/page.tsx +0 -18
  362. package/new-ui/src/pages/repos/page.tsx +0 -369
  363. package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
  364. package/new-ui/src/pages/schedules/page.tsx +0 -477
  365. package/new-ui/src/pages/services/page.tsx +0 -128
  366. package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
  367. package/new-ui/src/pages/tasks/page.tsx +0 -592
  368. package/new-ui/src/pages/usage/page.tsx +0 -195
  369. package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
  370. package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
  371. package/new-ui/src/pages/workflows/page.tsx +0 -266
  372. package/new-ui/src/styles/ag-grid.css +0 -36
  373. package/new-ui/src/styles/globals.css +0 -213
  374. package/new-ui/test-results/.last-run.json +0 -4
  375. package/new-ui/tsconfig.app.json +0 -34
  376. package/new-ui/tsconfig.json +0 -4
  377. package/new-ui/tsconfig.node.json +0 -26
  378. package/new-ui/vercel.json +0 -4
  379. package/new-ui/vite.config.ts +0 -28
  380. package/plugin/README.md +0 -1
  381. package/plugin/build-pi-skills.ts +0 -233
  382. package/plugin/hooks/hooks.json +0 -71
  383. package/prek.toml +0 -75
  384. package/pyproject.toml +0 -9
  385. package/scripts/check-db-boundary.sh +0 -60
  386. package/scripts/e2e-docker-provider.ts +0 -820
  387. package/scripts/e2e-io-schemas-test.ts +0 -807
  388. package/scripts/e2e-provider-test.ts +0 -220
  389. package/scripts/e2e-workflow-redesign.sh +0 -229
  390. package/scripts/e2e-workflow-test.sh +0 -285
  391. package/scripts/e2e-workflow-test.ts +0 -857
  392. package/scripts/generate-mcp-docs.ts +0 -415
  393. package/scripts/generate-openapi.ts +0 -26
  394. package/scripts/measure-tool-tokens.ts +0 -118
  395. package/scripts/x402-e2e-test.ts +0 -195
  396. package/scripts/x402-test-server.ts +0 -236
  397. package/scripts/x402-testnet-e2e.ts +0 -668
  398. package/slack-manifest.json +0 -88
  399. package/templates-ui/README.md +0 -46
  400. package/templates-ui/components.json +0 -17
  401. package/templates-ui/eslint.config.mjs +0 -18
  402. package/templates-ui/next.config.ts +0 -7
  403. package/templates-ui/package.json +0 -35
  404. package/templates-ui/pnpm-lock.yaml +0 -4571
  405. package/templates-ui/postcss.config.mjs +0 -7
  406. package/templates-ui/public/file.svg +0 -1
  407. package/templates-ui/public/globe.svg +0 -1
  408. package/templates-ui/public/logo.png +0 -0
  409. package/templates-ui/public/next.svg +0 -1
  410. package/templates-ui/public/vercel.svg +0 -1
  411. package/templates-ui/public/window.svg +0 -1
  412. package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
  413. package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
  414. package/templates-ui/src/app/api/templates/route.ts +0 -18
  415. package/templates-ui/src/app/builder/page.tsx +0 -37
  416. package/templates-ui/src/app/globals.css +0 -94
  417. package/templates-ui/src/app/layout.tsx +0 -79
  418. package/templates-ui/src/app/page.tsx +0 -38
  419. package/templates-ui/src/app/robots.ts +0 -11
  420. package/templates-ui/src/app/sitemap.ts +0 -31
  421. package/templates-ui/src/components/compose-builder.tsx +0 -442
  422. package/templates-ui/src/components/compose-preview.tsx +0 -117
  423. package/templates-ui/src/components/file-preview.tsx +0 -77
  424. package/templates-ui/src/components/footer.tsx +0 -40
  425. package/templates-ui/src/components/header.tsx +0 -41
  426. package/templates-ui/src/components/template-card.tsx +0 -87
  427. package/templates-ui/src/components/template-detail.tsx +0 -125
  428. package/templates-ui/src/components/template-gallery.tsx +0 -263
  429. package/templates-ui/src/components/ui/badge.tsx +0 -36
  430. package/templates-ui/src/components/ui/button.tsx +0 -57
  431. package/templates-ui/src/components/ui/card.tsx +0 -76
  432. package/templates-ui/src/components/ui/separator.tsx +0 -31
  433. package/templates-ui/src/components/ui/tooltip.tsx +0 -32
  434. package/templates-ui/src/lib/compose-generator.ts +0 -241
  435. package/templates-ui/src/lib/templates.ts +0 -137
  436. package/templates-ui/src/lib/utils.ts +0 -6
  437. package/templates-ui/tsconfig.json +0 -34
  438. package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
  439. package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
  440. package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
  441. package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
  442. package/thoughts/shared/plans/.gitkeep +0 -0
  443. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  444. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  445. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  446. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  447. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  448. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  449. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  450. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  451. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  452. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  453. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  454. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  455. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  456. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  457. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  458. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  459. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  460. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  461. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  462. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  463. package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
  464. package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
  465. package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
  466. package/thoughts/shared/research/.gitkeep +0 -0
  467. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  468. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  469. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  470. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  471. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  472. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  473. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  474. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  475. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  476. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  477. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  478. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  479. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  480. package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
  481. package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
  482. package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
  483. package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
  484. package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
  485. package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
  486. package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
  487. package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
  488. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  489. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  490. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  491. package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
  492. package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
  493. package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
  494. package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
  495. package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
  496. package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
  497. package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
  498. package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
  499. package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
  500. package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
  501. package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
  502. package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
  503. package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
  504. package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
  505. package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
  506. package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
  507. package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
  508. package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
  509. package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
  510. package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
  511. package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
  512. package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
  513. package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
  514. package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
  515. package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
  516. package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
  517. package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
  518. package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
  519. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  520. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  521. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  522. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  523. package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
  524. package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
  525. package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
  526. package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
  527. package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
  528. package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
  529. package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
  530. package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
  531. package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
  532. package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
  533. package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
  534. package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
  535. package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
  536. package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
  537. package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
  538. package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
  539. package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
  540. package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
  541. package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
  542. package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
  543. package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
  544. package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
  545. package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
  546. package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
  547. package/tsconfig.json +0 -37
@@ -1,411 +0,0 @@
1
- ---
2
- date: 2026-02-23
3
- researcher: Researcher (16990304-76e4-4017-b991-f3e37b34cf73)
4
- topic: "Openclaw vs Agent-Swarm: Session, Task, and Heartbeat Lifecycle Comparison"
5
- tags: [research, comparison, openclaw, agent-swarm, lifecycle, heartbeat, sessions, improvements]
6
- status: complete
7
- ---
8
-
9
- # Research: Openclaw vs Agent-Swarm Lifecycle Comparison
10
-
11
- **Date**: 2026-02-23
12
- **Researcher**: Researcher (Swarm Worker)
13
- **Sources**: openclaw/openclaw repo (commit be422a9), desplega-ai/agent-swarm repo (main branch)
14
-
15
- ## Executive Summary
16
-
17
- Openclaw and agent-swarm solve similar problems — orchestrating AI agent sessions, managing task lifecycles, and ensuring reliability — but take fundamentally different architectural approaches. Openclaw is a **single-gateway monolith** with file-based state, cross-process locking, and in-process promise-chain concurrency. Agent-swarm is a **distributed multi-agent system** with SQLite-backed state, an MCP server for tool dispatch, and a runner process managing Claude CLI subprocesses.
18
-
19
- This research identifies **8 concrete improvements** agent-swarm could adopt from openclaw's patterns, prioritized by impact and feasibility.
20
-
21
- ---
22
-
23
- ## 1. Architecture Comparison
24
-
25
- | Dimension | Openclaw | Agent-Swarm |
26
- |---|---|---|
27
- | **Process Model** | Single gateway process, in-process agents | Runner process spawning Claude CLI subprocesses |
28
- | **State Storage** | JSON files with atomic temp+rename writes | SQLite with WAL mode |
29
- | **Concurrency** | Promise-chain mutexes + file locks | SQLite transactions + atomic UPDATE...WHERE...RETURNING |
30
- | **Session Identity** | Hierarchical keys (`agent:main:telegram:group:123`) | UUID-based (task-scoped, not session-scoped) |
31
- | **Health Monitoring** | Multi-layer (heartbeat runner, wake system, channel health monitor) | Two-tier ping (runner loop + hook events) |
32
- | **Error Recovery** | Exponential backoff, stale lock detection, PID liveness, watchdogs | Exit code detection, session-not-found retry, error tracker |
33
- | **Graceful Shutdown** | Ordered teardown of 15+ subsystems | SIGTERM → pause tasks → close agent |
34
- | **Task Scheduling** | Cron service with isolated agent runs + exponential backoff | Scheduler with setInterval polling (10s) |
35
- | **Subagent Coordination** | Full registry with announce flow, cascading termination | Lead/worker model via task assignment |
36
- | **Config Management** | File-watching with hot/warm/cold reload classification | Database-backed config with API |
37
-
38
- ---
39
-
40
- ## 2. Session Lifecycle Comparison
41
-
42
- ### Openclaw Sessions
43
-
44
- Openclaw sessions are **conversation-scoped** with rich lifecycle management:
45
-
46
- - **Hierarchical keys**: Sessions are identified by structured keys encoding the agent, channel, chat type, peer, thread, and subagent hierarchy
47
- - **Freshness evaluation**: Sessions auto-expire via configurable policies (daily reset at 4 AM, or idle timeout after N minutes)
48
- - **Token tracking**: Each session entry tracks `inputTokens`, `outputTokens`, `cacheRead`, `cacheWrite`, `contextTokens`
49
- - **Transcript persistence**: JSONL files with atomic writes and archival on reset
50
- - **Two-layer locking**: In-process promise queue per store path + cross-process file locks with PID-based stale detection
51
- - **Watchdog timer**: 60s interval, force-releases locks held >5 minutes
52
- - **Process cleanup**: Signal handlers (`exit`, `SIGINT`, `SIGTERM`, etc.) release all locks synchronously
53
-
54
- ### Agent-Swarm Sessions
55
-
56
- Agent-swarm sessions are **task-scoped** with simpler lifecycle:
57
-
58
- - **Task-bound**: Each Claude subprocess maps 1:1 to a task via `/tmp/agent-swarm-task-{pid}.json`
59
- - **Active session tracking**: `active_sessions` table with `lastHeartbeatAt` for stale detection (30-minute cutoff)
60
- - **Claude session ID**: Captured from subprocess stdout for `--resume` capability
61
- - **No freshness policy**: Sessions live until the task completes or fails
62
- - **No transcript management**: Claude Code manages its own conversation history
63
- - **Stale cleanup**: On startup, deletes all active sessions for the agent (blunt approach)
64
-
65
- ### Key Differences
66
-
67
- 1. **Openclaw's session freshness is sophisticated** — daily resets and idle timeouts prevent stale conversation context from accumulating, which is important for long-running agents
68
- 2. **Openclaw's locking is more robust** — PID liveness checks, watchdog timers, and reentrant locks handle edge cases that agent-swarm doesn't face (since it uses SQLite transactions instead of file locks)
69
- 3. **Agent-swarm's task-scoped sessions are simpler** — but lack the concept of persistent agent "conversations" that survive across tasks
70
-
71
- ---
72
-
73
- ## 3. Heartbeat / Health Comparison
74
-
75
- ### Openclaw Heartbeats
76
-
77
- Openclaw has a **sophisticated multi-layer heartbeat system** spanning 11+ files:
78
-
79
- - **Wake system**: Coalescing, priority-based scheduler (250ms coalesce, 1s retry). Multiple wake requests are batched. Higher-priority reasons replace lower-priority pending wakes
80
- - **10-stage execution pipeline**: Early exits -> preflight -> target resolution -> prompt construction -> visibility gate -> LLM call -> OK handling -> duplicate detection -> delivery -> error handling
81
- - **Transcript pruning**: Captures transcript size before heartbeat LLM call, rolls back if response was "OK" (prevents transcript pollution)
82
- - **Duplicate detection**: Compares against `lastHeartbeatText`; skips same text within 24 hours
83
- - **Active hours gating**: Time-window restrictions on when heartbeats fire
84
- - **Channel health monitor**: 5-minute interval checks with startup grace (60s), cooldown between restarts, rate limiting (3 restarts/hour)
85
- - **Daemon health polling**: 120 attempts x 500ms with PID-based stale process detection and SIGTERM->SIGKILL escalation
86
-
87
- ### Agent-Swarm Health
88
-
89
- Agent-swarm has a **two-tier ping system**:
90
-
91
- - **Runner ping**: `POST /ping` on every main loop iteration (~2s). Updates agent status in DB. Binary idle/busy state
92
- - **Hook ping**: Fires on every hook event (SessionStart, PreToolUse, PostToolUse, etc.) — provides intra-session liveness
93
- - **Active session heartbeat**: `PUT /api/active-sessions/heartbeat/:taskId` endpoint exists but is **not called by the runner** — only exposed for external consumers
94
- - **Stale detection**: `cleanupStaleSessions()` deletes sessions with heartbeat older than 30 minutes. On startup, deletes ALL sessions for the agent (not fine-grained)
95
- - **No health monitor**: No periodic check that agents/services are actually functional beyond the ping
96
-
97
- ### Key Differences
98
-
99
- 1. **Openclaw proactively monitors health** with a dedicated heartbeat runner that prompts the AI, checks channels, and can restart stuck components. Agent-swarm's ping is passive — it just records "I'm alive"
100
- 2. **Openclaw prevents transcript pollution** by pruning no-op heartbeat exchanges. Agent-swarm has no equivalent
101
- 3. **Openclaw deduplicates heartbeat alerts** to prevent noise. Agent-swarm has no deduplication on notifications
102
- 4. **Openclaw's daemon health includes process-level recovery** (stale PID detection, SIGTERM->SIGKILL). Agent-swarm relies on PM2 for process management
103
-
104
- ---
105
-
106
- ## 4. Task / Cron Comparison
107
-
108
- ### Openclaw Cron
109
-
110
- - **Three schedule types**: one-shot (`at`), interval (`every`), and cron expression (`cron`)
111
- - **Error recovery**: Exponential backoff (30s -> 1min -> 5min -> 15min -> 60min). Auto-disables after 3 consecutive schedule errors
112
- - **Job timeout**: Default 10 minutes, configurable per-job. Uses `Promise.race` with `AbortController`
113
- - **Startup recovery**: Clears stale `runningAtMs` markers, runs missed past-due jobs while avoiding double-execution of interrupted ones
114
- - **Isolated agent runs**: Full independent agent turn with model selection, thinking level, security wrapping
115
- - **Concurrent execution**: Configurable `maxConcurrentRuns` (default 1) per timer tick
116
- - **Force-reload**: Store is force-reloaded from disk before and after mutations to handle concurrent external edits
117
-
118
- ### Agent-Swarm Scheduler
119
-
120
- - **Two schedule types**: cron expression or interval (no one-shot)
121
- - **No error recovery**: If task creation fails, no backoff or retry
122
- - **No job timeout**: Tasks run until Claude finishes or crashes; no configurable timeout
123
- - **No startup recovery**: If the scheduler was down, missed schedules are simply skipped
124
- - **Simple execution**: Creates tasks in the pool; no isolated execution mode
125
- - **Single-threaded guard**: `isProcessing` flag prevents overlapping runs
126
- - **Manual trigger**: `runScheduleNow()` creates task with extra tag without affecting regular schedule
127
-
128
- ### Key Differences
129
-
130
- 1. **Openclaw's error recovery is significantly more robust** — exponential backoff, auto-disable after consecutive failures, job-level timeouts
131
- 2. **Openclaw handles startup recovery** — runs missed past-due jobs after downtime. Agent-swarm silently drops them
132
- 3. **Openclaw isolates job execution** — dedicated agent turns for cron jobs vs agent-swarm just creating tasks in the pool
133
-
134
- ---
135
-
136
- ## 5. Error Recovery & Resilience Comparison
137
-
138
- ### Openclaw Patterns
139
-
140
- | Pattern | Implementation |
141
- |---|---|
142
- | **Promise-chain mutex** | Module-level `Map<string, Promise<void>>` — no OS locks needed |
143
- | **Exponential backoff** | Heartbeat wakes (1s), cron failures (30s->60min), subagent announce (1s->8s) |
144
- | **Stale lock detection** | PID liveness checks, watchdog timer (60s, force-release at 5min) |
145
- | **Tool loop detection** | 4 strategies: global circuit breaker (30 repeats), known poll no-progress (10/20), ping-pong (10/20), generic repeat (10) |
146
- | **Command poll backoff** | Fixed schedule: 5s->10s->30s->60s, resets on new output |
147
- | **Process signal cleanup** | Registers handlers on 5 signals, re-raises signal after cleanup |
148
- | **Config hot-reload** | File watching with restart/hot/none classification, graceful deferral during active work |
149
- | **State migration** | One-shot guards with rollback on failure |
150
-
151
- ### Agent-Swarm Patterns
152
-
153
- | Pattern | Implementation |
154
- |---|---|
155
- | **SQLite transactions** | `getDb().transaction()` wrapping tool handlers |
156
- | **Atomic claiming** | `UPDATE...WHERE status='unassigned' RETURNING *` |
157
- | **Session-not-found retry** | Auto-retry without `--resume` flag |
158
- | **Error tracking** | `SessionErrorTracker` accumulates API errors, result errors, stderr patterns |
159
- | **Idempotent finish** | `POST /api/tasks/:id/finish` returns success if already finished |
160
- | **Pause/resume on shutdown** | Tasks paused on SIGTERM, resumed on restart |
161
- | **Task cancellation detection** | Hook checks `isTaskCancelled()` on every tool use |
162
-
163
- ### Key Differences
164
-
165
- 1. **Openclaw has tool loop detection** — 4 distinct strategies to detect agents stuck in repetitive patterns. Agent-swarm has no equivalent (relies on context compaction or max-turns limits)
166
- 2. **Openclaw has command poll backoff** — prevents agents from hammering polling endpoints. Agent-swarm's polling is fixed at 2s intervals
167
- 3. **Openclaw has stale lock detection with watchdogs** — agent-swarm's SQLite transactions don't need this, but it has no equivalent for detecting stuck subprocesses
168
- 4. **Openclaw's config hot-reload** with classification (restart vs hot vs none) is significantly more sophisticated than agent-swarm's static config
169
-
170
- ---
171
-
172
- ## 6. Subagent Coordination Comparison
173
-
174
- ### Openclaw
175
-
176
- - **Central registry**: `SubagentRunRecord` with timestamps, lifecycle events, status tracking
177
- - **Dual completion detection**: Lifecycle events (pub/sub) AND gateway RPC (`agent.wait`) — redundancy ensures no missed completions
178
- - **Announce flow**: Multi-strategy delivery (steer/queue/direct) with exponential retry (1s->8s, max 3, 5min expiry)
179
- - **Cascading termination**: Recursive subagent abort on parent stop
180
- - **Process restart recovery**: Loads unfinished runs from disk, resumes pending work, retries unannounced completions
181
- - **Output retrieval**: Reads child's latest assistant reply, retries if empty, defers if child has active descendants
182
- - **Session hierarchy**: Explicit `spawnedBy`, `spawnDepth`, `forkedFromParent` fields
183
-
184
- ### Agent-Swarm
185
-
186
- - **Task-based coordination**: Lead creates tasks for workers; workers report via `store-progress`
187
- - **Follow-up mechanism**: On task completion, auto-creates a follow-up task for the lead with Slack context
188
- - **No cascading termination**: Task cancellation is checked via polling (hook checks on each tool use), not pushed
189
- - **No completion announce**: Lead discovers task completion via follow-up tasks or polling
190
- - **Session continuity**: `parentTaskId` field enables session resumption across child tasks
191
- - **Concurrent context**: Lead can query what workers are doing via `GET /api/concurrent-context`
192
-
193
- ### Key Differences
194
-
195
- 1. **Openclaw's announce flow is proactive** — subagent results are pushed to the requester with retry. Agent-swarm's follow-up tasks are created but may be delayed by the lead's polling cycle
196
- 2. **Openclaw cascades termination recursively** — stopping a parent stops all descendants immediately. Agent-swarm's cancellation relies on per-tool-use polling, which means the agent continues until its next tool call
197
- 3. **Openclaw recovers from restarts** — unfinished subagent runs are restored from disk. Agent-swarm pauses tasks but doesn't track subagent-level state
198
-
199
- ---
200
-
201
- ## 7. Concrete Improvement Recommendations
202
-
203
- ### Priority 1: High Impact, Medium Effort
204
-
205
- #### 1.1 Tool Loop Detection
206
-
207
- **Problem**: Agents can get stuck in repetitive tool call loops (e.g., repeatedly polling for results, retrying the same failing command). Currently, agent-swarm relies on Claude's built-in limits.
208
-
209
- **Openclaw's approach**: 4 detector strategies with configurable thresholds, sliding-window history, warning -> critical escalation.
210
-
211
- **Recommendation**: Implement a simplified version in the `PreToolUse` hook:
212
- - Track the last N tool calls (name + args hash) per session
213
- - Detect same-tool repeats (threshold: 10) and ping-pong patterns (threshold: 10)
214
- - At warning threshold: inject a system message advising the agent to try a different approach
215
- - At critical threshold: block the tool call with an explanation
216
-
217
- **Files to modify**: `src/hooks/hook.ts` (PreToolUse handler), new `src/hooks/tool-loop-detection.ts`
218
-
219
- **Estimated complexity**: ~200 lines of new code
220
-
221
- ---
222
-
223
- #### 1.2 Active Session Heartbeat (Actually Use It)
224
-
225
- **Problem**: The `heartbeatActiveSession()` function and `PUT /api/active-sessions/heartbeat/:taskId` endpoint exist but are never called. Active sessions only get a heartbeat at creation time, making `cleanupStaleSessions()` unreliable.
226
-
227
- **Openclaw's approach**: Multiple layers of heartbeat with deduplication and active-hours gating.
228
-
229
- **Recommendation**: Call the heartbeat endpoint from the `PostToolUse` hook (since it fires on every tool use):
230
- - In `hook.ts` PostToolUse handler, call `PUT /api/active-sessions/heartbeat/:taskId` using the task file's taskId
231
- - This gives fine-grained liveness data — if an agent hasn't used a tool in 30 minutes, its session is genuinely stale
232
- - Also consider calling it from the runner's `checkCompletedProcesses()` loop for still-running processes
233
-
234
- **Files to modify**: `src/hooks/hook.ts` (PostToolUse handler, ~10 lines)
235
-
236
- **Estimated complexity**: ~10-20 lines
237
-
238
- ---
239
-
240
- #### 1.3 Missed Schedule Recovery on Startup
241
-
242
- **Problem**: If the scheduler was down (container restart, deploy), past-due scheduled tasks are silently dropped. They just wait for the next scheduled run.
243
-
244
- **Openclaw's approach**: On startup, clears stale markers, identifies missed jobs, and runs them while avoiding double-execution.
245
-
246
- **Recommendation**: Add a recovery step to `startScheduler()`:
247
- - On startup, query `getDueScheduledTasks()` with `nextRunAt < now()`
248
- - For each, execute the schedule immediately
249
- - Mark them with a `"recovered"` tag so they're distinguishable from regular runs
250
- - Update `nextRunAt` to the next scheduled time (not from the missed time)
251
-
252
- **Files to modify**: `src/scheduler/scheduler.ts` (add recovery to `startScheduler()`, ~30 lines)
253
-
254
- **Estimated complexity**: ~30-40 lines
255
-
256
- ---
257
-
258
- ### Priority 2: Medium Impact, Low-Medium Effort
259
-
260
- #### 2.1 Exponential Backoff for Failed Scheduled Tasks
261
-
262
- **Problem**: If a scheduled task fails repeatedly (e.g., a cron job creates a task that always fails), it keeps firing at the same interval with no backoff.
263
-
264
- **Openclaw's approach**: Error backoff schedule (30s -> 1min -> 5min -> 15min -> 60min), auto-disable after 3 consecutive schedule errors.
265
-
266
- **Recommendation**: Add error tracking to scheduled tasks:
267
- - Add `consecutiveErrors INTEGER DEFAULT 0` and `lastErrorAt TEXT` columns to `scheduled_tasks`
268
- - On task creation failure in `executeSchedule()`, increment counter and apply backoff to `nextRunAt`
269
- - After 5 consecutive errors, auto-disable the schedule and log a warning
270
- - Reset counter on successful execution
271
- - Backoff schedule: 1min, 5min, 15min, 30min, 60min
272
-
273
- **Files to modify**: `src/be/db.ts` (migration + helper), `src/scheduler/scheduler.ts` (error tracking)
274
-
275
- **Estimated complexity**: ~50-60 lines
276
-
277
- ---
278
-
279
- #### 2.2 Graceful Task Cancellation (Push vs Poll)
280
-
281
- **Problem**: When a task is cancelled, the agent only discovers it at its next `PreToolUse` or `UserPromptSubmit` hook. If the agent is in a long-running operation (e.g., waiting for a subprocess), it won't notice for a while.
282
-
283
- **Openclaw's approach**: Direct abort with cascading termination — kills child processes immediately.
284
-
285
- **Recommendation**: Send SIGUSR1 to the Claude subprocess when a task is cancelled:
286
- - In the runner's main loop (or via a separate check), periodically query for cancelled tasks
287
- - Alternatively, add a webhook/SSE from the API that pushes cancellation events
288
- - On receiving cancellation, send SIGUSR1 (or SIGTERM) to the Claude subprocess
289
- - The hook's existing cancellation detection would then fire on the process's next tool call
290
-
291
- **Files to modify**: `src/commands/runner.ts` (cancellation check in main loop), `src/http.ts` (optional webhook)
292
-
293
- **Estimated complexity**: ~40-60 lines
294
-
295
- ---
296
-
297
- #### 2.3 Task Progress Deduplication
298
-
299
- **Problem**: Agents sometimes call `store-progress` with the same or very similar progress messages repeatedly, creating noise in task logs.
300
-
301
- **Openclaw's approach**: Heartbeat deduplication — `lastHeartbeatText` comparison, skip if same text within 24 hours.
302
-
303
- **Recommendation**: Add progress deduplication in `store-progress`:
304
- - Store `lastProgressText` and `lastProgressAt` on the task
305
- - Skip duplicate progress updates (same text within 5 minutes)
306
- - Always allow status changes (completed/failed) regardless of dedup
307
-
308
- **Files to modify**: `src/tools/store-progress.ts` (~15 lines), `src/be/db.ts` (migration + helper)
309
-
310
- **Estimated complexity**: ~25-30 lines
311
-
312
- ---
313
-
314
- ### Priority 3: Lower Priority but Valuable
315
-
316
- #### 3.1 Subprocess Stuck Detection
317
-
318
- **Problem**: If a Claude subprocess hangs (not exiting, not making progress), the runner has no way to detect this. The process could occupy a concurrency slot indefinitely.
319
-
320
- **Openclaw's approach**: Command poll backoff (5s->60s) and tool loop detection at critical threshold triggers intervention.
321
-
322
- **Recommendation**: Add a maximum task duration with soft/hard limits:
323
- - Soft limit (configurable, default 30 minutes): Log a warning, inject a "please wrap up" message via the task file or a signal
324
- - Hard limit (configurable, default 60 minutes): Send SIGTERM to the subprocess, mark task as failed with timeout reason
325
- - Track `startedAt` in `RunningTask` and check in the main loop
326
-
327
- **Files to modify**: `src/commands/runner.ts` (timeout check in main loop, ~30 lines)
328
-
329
- **Estimated complexity**: ~30-40 lines
330
-
331
- ---
332
-
333
- #### 3.2 Config Hot-Reload
334
-
335
- **Problem**: Configuration changes (e.g., updating capabilities, changing scheduler intervals) require a full restart. There's no hot-reload mechanism.
336
-
337
- **Openclaw's approach**: File-watching with chokidar, 300ms debounce, change classification (restart/hot/none), graceful deferral during active work.
338
-
339
- **Recommendation**: Implement a lightweight config reload for the API server:
340
- - Watch the `swarm_config` table for changes (via a periodic poll or DB trigger)
341
- - Classify changes: scheduler interval -> restart scheduler; agent capabilities -> no action needed (dynamic); new integrations -> restart needed
342
- - For the scheduler specifically, expose a `PUT /api/scheduler/reload` endpoint that stops and restarts it with new config
343
-
344
- **Files to modify**: `src/http.ts` (new endpoint), `src/scheduler/scheduler.ts` (reload method)
345
-
346
- **Estimated complexity**: ~50-80 lines
347
-
348
- ---
349
-
350
- ## 8. Summary Matrix
351
-
352
- | Improvement | Impact | Effort | Priority | Files |
353
- |---|---|---|---|---|
354
- | Tool loop detection | High | Medium | P1 | hook.ts, new file |
355
- | Active session heartbeat | High | Low | P1 | hook.ts |
356
- | Missed schedule recovery | High | Low | P1 | scheduler.ts |
357
- | Exponential backoff for schedules | Medium | Low | P2 | db.ts, scheduler.ts |
358
- | Graceful task cancellation (push) | Medium | Medium | P2 | runner.ts, http.ts |
359
- | Task progress deduplication | Low | Low | P2 | store-progress.ts, db.ts |
360
- | Subprocess stuck detection | Medium | Low | P3 | runner.ts |
361
- | Config hot-reload | Low | Medium | P3 | http.ts, scheduler.ts |
362
-
363
- ---
364
-
365
- ## 9. Patterns Worth Noting (Not Direct Improvements)
366
-
367
- These openclaw patterns are interesting but either don't apply to agent-swarm's architecture or would require major refactoring:
368
-
369
- 1. **Promise-chain mutexes**: Agent-swarm uses SQLite transactions, which are more appropriate for its multi-process architecture. No change needed.
370
-
371
- 2. **File-based state with atomic writes**: Agent-swarm's SQLite approach is actually superior for concurrent access. Openclaw uses files because it's a single-gateway model.
372
-
373
- 3. **Session freshness evaluation**: Interesting concept (daily reset, idle timeout), but agent-swarm's task-scoped sessions naturally expire when tasks complete. Could be relevant if agent-swarm adds persistent "conversation" sessions in the future.
374
-
375
- 4. **Reply queue system** (steer/followup/collect modes): Very specific to openclaw's messaging architecture. Agent-swarm's task-based model doesn't need this complexity.
376
-
377
- 5. **`unref()`'d timers**: Node.js-specific pattern for clean shutdown. Agent-swarm uses Bun, which handles this differently.
378
-
379
- 6. **Diagnostic event bus with recursion guard**: Useful for complex in-process event systems. Agent-swarm's architecture is distributed, so events flow through the API instead.
380
-
381
- ---
382
-
383
- ## 10. Architectural Observations
384
-
385
- ### Where Agent-Swarm is Already Better
386
-
387
- 1. **Atomic operations**: SQLite transactions with `UPDATE...WHERE...RETURNING` are simpler and more reliable than file-based locking with PID checks
388
- 2. **State visibility**: All state is in a queryable database, making debugging and monitoring easier than openclaw's JSON files
389
- 3. **Task deduplication**: Jaccard word similarity for detecting duplicate tasks is a smart optimization
390
- 4. **Pause/resume semantics**: Graceful shutdown pauses tasks for later resumption — openclaw doesn't have this concept
391
- 5. **Memory/embedding system**: Automatic indexing of task completions into searchable vector memory is unique to agent-swarm
392
-
393
- ### Where Openclaw is Better
394
-
395
- 1. **Health monitoring**: Multi-layer heartbeat with proactive AI prompting, channel health monitoring, and daemon health polling
396
- 2. **Error recovery**: Exponential backoff, auto-disable, tool loop detection, command poll backoff
397
- 3. **Subagent coordination**: Central registry, dual completion detection, announce flow with retry, cascading termination
398
- 4. **Transcript management**: Pruning no-op exchanges, archiving old transcripts, size-based rotation
399
- 5. **Config lifecycle**: Hot-reload with change classification and graceful deferral
400
-
401
- ---
402
-
403
- ## Open Questions
404
-
405
- 1. Should agent-swarm adopt openclaw's concept of "persistent agent conversations" that survive across tasks? Currently, each task gets a fresh conversation (or resumes a previous one via `--resume`).
406
-
407
- 2. Is tool loop detection better implemented in the hook (which runs in a separate process) or as a Claude Code extension? The hook approach adds latency to every tool call.
408
-
409
- 3. Should the heartbeat system be extended to include actual health checks (not just "I'm alive" pings)? For example, checking if the Claude subprocess is making progress (new log output) rather than just running.
410
-
411
- 4. Openclaw's announce flow solves a real problem — how does a parent agent learn about a child's results? Agent-swarm's follow-up task mechanism works but adds latency. Is a webhook/SSE push mechanism worth the complexity?