@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.
- package/README.md +1 -1
- package/openapi.json +2070 -728
- package/package.json +10 -1
- package/src/agentmail/handlers.ts +65 -10
- package/src/agentmail/templates.ts +111 -0
- package/src/be/db.ts +1233 -7
- package/src/be/migrations/014_prompt_templates.sql +33 -0
- package/src/be/migrations/015_workflow_workspace.sql +3 -0
- package/src/be/migrations/016_active_session_runner_session.sql +4 -0
- package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
- package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
- package/src/be/migrations/019_skills.sql +65 -0
- package/src/be/migrations/020_approval_requests.sql +41 -0
- package/src/be/seed.ts +62 -0
- package/src/be/skill-parser.ts +70 -0
- package/src/be/skill-sync.ts +106 -0
- package/src/commands/runner.ts +320 -132
- package/src/commands/templates.ts +172 -0
- package/src/github/handlers.ts +292 -77
- package/src/github/mentions-aliases.test.ts +73 -0
- package/src/github/mentions.test.ts +3 -3
- package/src/github/mentions.ts +32 -6
- package/src/github/templates.ts +398 -0
- package/src/gitlab/handlers.ts +63 -22
- package/src/gitlab/templates.ts +140 -0
- package/src/heartbeat/heartbeat.ts +19 -10
- package/src/heartbeat/templates.ts +30 -0
- package/src/http/active-sessions.ts +27 -0
- package/src/http/approval-requests.ts +247 -0
- package/src/http/config.ts +3 -3
- package/src/http/index.ts +9 -2
- package/src/http/poll.ts +135 -14
- package/src/http/prompt-templates.ts +412 -0
- package/src/http/schedules.ts +35 -0
- package/src/http/skills.ts +479 -0
- package/src/http/workflows.ts +8 -0
- package/src/linear/sync.ts +28 -4
- package/src/linear/templates.ts +47 -0
- package/src/prompts/base-prompt.ts +41 -490
- package/src/prompts/registry.ts +57 -0
- package/src/prompts/resolver.ts +296 -0
- package/src/prompts/session-templates.ts +604 -0
- package/src/providers/claude-adapter.ts +15 -2
- package/src/providers/pi-mono-extension.ts +5 -1
- package/src/scheduler/scheduler.ts +125 -91
- package/src/server.ts +44 -0
- package/src/slack/assistant.ts +7 -4
- package/src/slack/channel-activity.ts +177 -0
- package/src/slack/handlers.ts +21 -6
- package/src/slack/templates.ts +55 -0
- package/src/tests/approval-requests.test.ts +735 -0
- package/src/tests/artifact-sdk.test.ts +12 -12
- package/src/tests/base-prompt.test.ts +49 -49
- package/src/tests/channel-activity.test.ts +363 -0
- package/src/tests/heartbeat.test.ts +1 -0
- package/src/tests/linear-webhook.test.ts +7 -3
- package/src/tests/pool-session-logs.test.ts +199 -0
- package/src/tests/prompt-template-github.test.ts +682 -0
- package/src/tests/prompt-template-remaining.test.ts +504 -0
- package/src/tests/prompt-template-resolver.test.ts +621 -0
- package/src/tests/prompt-template-session.test.ts +363 -0
- package/src/tests/prompt-templates-db.test.ts +616 -0
- package/src/tests/self-improvement.test.ts +8 -7
- package/src/tests/skill-parser.test.ts +178 -0
- package/src/tests/skill-sync.test.ts +171 -0
- package/src/tests/slack-metadata-inheritance.test.ts +1 -1
- package/src/tests/slack-thread-followups.test.ts +1 -1
- package/src/tests/structured-output.test.ts +0 -4
- package/src/tests/tool-annotations.test.ts +2 -1
- package/src/tests/update-profile-agentid.test.ts +248 -0
- package/src/tests/update-profile-auth.test.ts +195 -0
- package/src/tests/workflow-async-v2.test.ts +126 -4
- package/src/tests/workflow-definition-validation.test.ts +76 -0
- package/src/tests/workflow-executors.test.ts +4 -2
- package/src/tests/workflow-retry-v2.test.ts +1 -1
- package/src/tests/workflow-schedule-trigger.test.ts +104 -0
- package/src/tests/workflow-workspace.test.ts +272 -0
- package/src/tools/prompt-templates/delete.ts +86 -0
- package/src/tools/prompt-templates/get.ts +89 -0
- package/src/tools/prompt-templates/index.ts +5 -0
- package/src/tools/prompt-templates/list.ts +95 -0
- package/src/tools/prompt-templates/preview.ts +84 -0
- package/src/tools/prompt-templates/set.ts +117 -0
- package/src/tools/request-human-input.ts +106 -0
- package/src/tools/skills/index.ts +11 -0
- package/src/tools/skills/skill-create.ts +105 -0
- package/src/tools/skills/skill-delete.ts +67 -0
- package/src/tools/skills/skill-get.ts +75 -0
- package/src/tools/skills/skill-install-remote.ts +152 -0
- package/src/tools/skills/skill-install.ts +101 -0
- package/src/tools/skills/skill-list.ts +77 -0
- package/src/tools/skills/skill-publish.ts +123 -0
- package/src/tools/skills/skill-search.ts +43 -0
- package/src/tools/skills/skill-sync-remote.ts +128 -0
- package/src/tools/skills/skill-uninstall.ts +60 -0
- package/src/tools/skills/skill-update.ts +128 -0
- package/src/tools/store-progress.ts +22 -4
- package/src/tools/task-action.ts +20 -0
- package/src/tools/templates.ts +53 -0
- package/src/tools/tool-config.ts +23 -0
- package/src/tools/update-profile.ts +106 -34
- package/src/tools/workflows/create-workflow.ts +19 -1
- package/src/tools/workflows/update-workflow.ts +16 -1
- package/src/types.ts +109 -2
- package/src/workflows/definition.ts +30 -12
- package/src/workflows/engine.ts +40 -14
- package/src/workflows/executors/agent-task.ts +14 -3
- package/src/workflows/executors/human-in-the-loop.ts +160 -0
- package/src/workflows/executors/registry.ts +2 -0
- package/src/workflows/index.ts +1 -1
- package/src/workflows/recovery.ts +72 -0
- package/src/workflows/resume.ts +162 -12
- package/src/workflows/triggers.ts +31 -2
- package/src/workflows/version.ts +2 -0
- package/.claude/settings.json +0 -84
- package/.claude/settings.local.json +0 -117
- package/.dockerignore +0 -61
- package/.editorconfig +0 -15
- package/.entire/settings.json +0 -4
- package/.env.docker.example +0 -56
- package/.env.example +0 -78
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
- package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
- package/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
- package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
- package/.github/workflows/ci.yml +0 -52
- package/.github/workflows/docker-and-deploy.yml +0 -132
- package/.github/workflows/merge-gate.yml +0 -233
- package/.opencode/plugins/entire.ts +0 -133
- package/.superset/config.json +0 -6
- package/.wts-config.json +0 -4
- package/.wts-setup.ts +0 -171
- package/CHANGELOG.md +0 -447
- package/CLAUDE.md +0 -521
- package/CONTRIBUTING.md +0 -315
- package/DEPLOYMENT.md +0 -622
- package/Dockerfile +0 -65
- package/Dockerfile.worker +0 -189
- package/MCP.md +0 -841
- package/UI.md +0 -40
- package/api-entrypoint.sh +0 -56
- package/assets/agent-swarm-logo-orange.png +0 -0
- package/assets/agent-swarm-logo.png +0 -0
- package/assets/agent-swarm.mp4 +0 -0
- package/assets/agent-swarm.png +0 -0
- package/biome.json +0 -39
- package/deploy/DEPLOY.md +0 -60
- package/deploy/agent-swarm.service +0 -17
- package/deploy/docker-push.ts +0 -30
- package/deploy/install.ts +0 -85
- package/deploy/prod-db.ts +0 -42
- package/deploy/uninstall.ts +0 -12
- package/deploy/update.ts +0 -21
- package/depot.json +0 -1
- package/docker-compose.example.yml +0 -350
- package/docker-compose.local.yml +0 -119
- package/docker-entrypoint.sh +0 -632
- package/docs-site/app/api/search/route.ts +0 -4
- package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
- package/docs-site/app/docs/layout.tsx +0 -12
- package/docs-site/app/globals.css +0 -24
- package/docs-site/app/layout.config.tsx +0 -34
- package/docs-site/app/layout.tsx +0 -119
- package/docs-site/app/llms-full.txt/route.ts +0 -11
- package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
- package/docs-site/app/llms.txt/route.ts +0 -8
- package/docs-site/app/page.tsx +0 -5
- package/docs-site/app/robots.ts +0 -13
- package/docs-site/app/sitemap.ts +0 -37
- package/docs-site/components/api-page.client.tsx +0 -4
- package/docs-site/components/api-page.tsx +0 -7
- package/docs-site/components/mdx/mermaid.tsx +0 -55
- package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
- package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
- package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
- package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
- package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
- package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
- package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
- package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
- package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
- package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
- package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
- package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
- package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
- package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
- package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
- package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
- package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
- package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
- package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
- package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
- package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
- package/docs-site/content/docs/(documentation)/index.mdx +0 -65
- package/docs-site/content/docs/(documentation)/meta.json +0 -19
- package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
- package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
- package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
- package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
- package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
- package/docs-site/content/docs/api-reference/agents.mdx +0 -9
- package/docs-site/content/docs/api-reference/channels.mdx +0 -9
- package/docs-site/content/docs/api-reference/config.mdx +0 -9
- package/docs-site/content/docs/api-reference/debug.mdx +0 -9
- package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
- package/docs-site/content/docs/api-reference/epics.mdx +0 -9
- package/docs-site/content/docs/api-reference/index.mdx +0 -32
- package/docs-site/content/docs/api-reference/memory.mdx +0 -9
- package/docs-site/content/docs/api-reference/meta.json +0 -25
- package/docs-site/content/docs/api-reference/poll.mdx +0 -9
- package/docs-site/content/docs/api-reference/repos.mdx +0 -9
- package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
- package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
- package/docs-site/content/docs/api-reference/stats.mdx +0 -9
- package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
- package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
- package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
- package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
- package/docs-site/content/docs/meta.json +0 -3
- package/docs-site/lib/get-llm-text.ts +0 -10
- package/docs-site/lib/openapi.ts +0 -23
- package/docs-site/lib/source.ts +0 -8
- package/docs-site/mdx-components.tsx +0 -13
- package/docs-site/next.config.mjs +0 -29
- package/docs-site/package.json +0 -35
- package/docs-site/pnpm-lock.yaml +0 -5407
- package/docs-site/postcss.config.mjs +0 -8
- package/docs-site/public/logo.png +0 -0
- package/docs-site/scripts/generate-docs.ts +0 -171
- package/docs-site/source.config.ts +0 -17
- package/docs-site/tsconfig.json +0 -46
- package/ecosystem.config.cjs +0 -66
- package/landing/next.config.ts +0 -14
- package/landing/package.json +0 -31
- package/landing/pnpm-lock.yaml +0 -1091
- package/landing/postcss.config.mjs +0 -8
- package/landing/public/apple-touch-icon.png +0 -0
- package/landing/public/favicon.ico +0 -0
- package/landing/public/logo.png +0 -0
- package/landing/public/og-image.png +0 -0
- package/landing/public/omghost-desplega.svg +0 -30
- package/landing/public/omghost-openfort.svg +0 -9
- package/landing/src/app/actions/waitlist.ts +0 -25
- package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
- package/landing/src/app/blog/page.tsx +0 -162
- package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
- package/landing/src/app/examples/page.tsx +0 -174
- package/landing/src/app/examples/x402/page.tsx +0 -456
- package/landing/src/app/globals.css +0 -122
- package/landing/src/app/layout.tsx +0 -134
- package/landing/src/app/page.tsx +0 -27
- package/landing/src/app/robots.ts +0 -13
- package/landing/src/app/sitemap.ts +0 -44
- package/landing/src/components/architecture.tsx +0 -163
- package/landing/src/components/cta.tsx +0 -52
- package/landing/src/components/features.tsx +0 -160
- package/landing/src/components/footer.tsx +0 -100
- package/landing/src/components/hero.tsx +0 -217
- package/landing/src/components/how-it-works.tsx +0 -165
- package/landing/src/components/navbar.tsx +0 -147
- package/landing/src/components/waitlist.tsx +0 -110
- package/landing/src/components/why-choose.tsx +0 -149
- package/landing/src/components/workshops.tsx +0 -328
- package/landing/src/lib/utils.ts +0 -6
- package/landing/tsconfig.json +0 -41
- package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
- package/new-ui/CLAUDE.md +0 -92
- package/new-ui/README.md +0 -73
- package/new-ui/biome.json +0 -42
- package/new-ui/components.json +0 -21
- package/new-ui/index.html +0 -25
- package/new-ui/package.json +0 -49
- package/new-ui/pnpm-lock.yaml +0 -4845
- package/new-ui/public/logo.png +0 -0
- package/new-ui/src/api/client.ts +0 -814
- package/new-ui/src/api/hooks/index.ts +0 -64
- package/new-ui/src/api/hooks/use-agents.ts +0 -58
- package/new-ui/src/api/hooks/use-channels.ts +0 -115
- package/new-ui/src/api/hooks/use-config-api.ts +0 -46
- package/new-ui/src/api/hooks/use-costs.ts +0 -122
- package/new-ui/src/api/hooks/use-db-query.ts +0 -29
- package/new-ui/src/api/hooks/use-epics.ts +0 -75
- package/new-ui/src/api/hooks/use-repos.ts +0 -61
- package/new-ui/src/api/hooks/use-schedules.ts +0 -81
- package/new-ui/src/api/hooks/use-services.ts +0 -16
- package/new-ui/src/api/hooks/use-stats.ts +0 -27
- package/new-ui/src/api/hooks/use-tasks.ts +0 -89
- package/new-ui/src/api/hooks/use-workflows.ts +0 -109
- package/new-ui/src/api/types.ts +0 -549
- package/new-ui/src/app/App.tsx +0 -13
- package/new-ui/src/app/providers.tsx +0 -32
- package/new-ui/src/app/router.tsx +0 -52
- package/new-ui/src/components/layout/app-header.tsx +0 -47
- package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
- package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
- package/new-ui/src/components/layout/config-guard.tsx +0 -22
- package/new-ui/src/components/layout/root-layout.tsx +0 -40
- package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
- package/new-ui/src/components/shared/command-menu.tsx +0 -131
- package/new-ui/src/components/shared/data-grid.tsx +0 -141
- package/new-ui/src/components/shared/empty-state.tsx +0 -24
- package/new-ui/src/components/shared/error-boundary.tsx +0 -72
- package/new-ui/src/components/shared/json-viewer.tsx +0 -47
- package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
- package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
- package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
- package/new-ui/src/components/shared/stats-bar.tsx +0 -132
- package/new-ui/src/components/shared/status-badge.tsx +0 -131
- package/new-ui/src/components/shared/usage-summary.tsx +0 -179
- package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
- package/new-ui/src/components/ui/alert.tsx +0 -60
- package/new-ui/src/components/ui/avatar.tsx +0 -96
- package/new-ui/src/components/ui/badge.tsx +0 -46
- package/new-ui/src/components/ui/button.tsx +0 -62
- package/new-ui/src/components/ui/card.tsx +0 -75
- package/new-ui/src/components/ui/command.tsx +0 -160
- package/new-ui/src/components/ui/dialog.tsx +0 -143
- package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
- package/new-ui/src/components/ui/input.tsx +0 -21
- package/new-ui/src/components/ui/label.tsx +0 -19
- package/new-ui/src/components/ui/progress.tsx +0 -26
- package/new-ui/src/components/ui/scroll-area.tsx +0 -54
- package/new-ui/src/components/ui/select.tsx +0 -175
- package/new-ui/src/components/ui/separator.tsx +0 -28
- package/new-ui/src/components/ui/sheet.tsx +0 -132
- package/new-ui/src/components/ui/sidebar.tsx +0 -691
- package/new-ui/src/components/ui/skeleton.tsx +0 -13
- package/new-ui/src/components/ui/sonner.tsx +0 -35
- package/new-ui/src/components/ui/switch.tsx +0 -33
- package/new-ui/src/components/ui/table.tsx +0 -92
- package/new-ui/src/components/ui/tabs.tsx +0 -79
- package/new-ui/src/components/ui/textarea.tsx +0 -18
- package/new-ui/src/components/ui/tooltip.tsx +0 -51
- package/new-ui/src/components/workflows/action-node.tsx +0 -53
- package/new-ui/src/components/workflows/condition-node.tsx +0 -50
- package/new-ui/src/components/workflows/graph-utils.ts +0 -124
- package/new-ui/src/components/workflows/json-tree.tsx +0 -189
- package/new-ui/src/components/workflows/node-styles.ts +0 -10
- package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
- package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
- package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
- package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
- package/new-ui/src/hooks/use-config.ts +0 -203
- package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
- package/new-ui/src/hooks/use-mobile.ts +0 -19
- package/new-ui/src/hooks/use-theme.ts +0 -60
- package/new-ui/src/lib/config.ts +0 -188
- package/new-ui/src/lib/slugs.ts +0 -71
- package/new-ui/src/lib/utils.ts +0 -120
- package/new-ui/src/main.tsx +0 -11
- package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
- package/new-ui/src/pages/agents/page.tsx +0 -134
- package/new-ui/src/pages/chat/page.tsx +0 -674
- package/new-ui/src/pages/config/page.tsx +0 -1109
- package/new-ui/src/pages/dashboard/page.tsx +0 -454
- package/new-ui/src/pages/debug/page.tsx +0 -275
- package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
- package/new-ui/src/pages/epics/page.tsx +0 -321
- package/new-ui/src/pages/not-found/page.tsx +0 -18
- package/new-ui/src/pages/repos/page.tsx +0 -369
- package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
- package/new-ui/src/pages/schedules/page.tsx +0 -477
- package/new-ui/src/pages/services/page.tsx +0 -128
- package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
- package/new-ui/src/pages/tasks/page.tsx +0 -592
- package/new-ui/src/pages/usage/page.tsx +0 -195
- package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
- package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
- package/new-ui/src/pages/workflows/page.tsx +0 -266
- package/new-ui/src/styles/ag-grid.css +0 -36
- package/new-ui/src/styles/globals.css +0 -213
- package/new-ui/test-results/.last-run.json +0 -4
- package/new-ui/tsconfig.app.json +0 -34
- package/new-ui/tsconfig.json +0 -4
- package/new-ui/tsconfig.node.json +0 -26
- package/new-ui/vercel.json +0 -4
- package/new-ui/vite.config.ts +0 -28
- package/plugin/README.md +0 -1
- package/plugin/build-pi-skills.ts +0 -233
- package/plugin/hooks/hooks.json +0 -71
- package/prek.toml +0 -75
- package/pyproject.toml +0 -9
- package/scripts/check-db-boundary.sh +0 -60
- package/scripts/e2e-docker-provider.ts +0 -820
- package/scripts/e2e-io-schemas-test.ts +0 -807
- package/scripts/e2e-provider-test.ts +0 -220
- package/scripts/e2e-workflow-redesign.sh +0 -229
- package/scripts/e2e-workflow-test.sh +0 -285
- package/scripts/e2e-workflow-test.ts +0 -857
- package/scripts/generate-mcp-docs.ts +0 -415
- package/scripts/generate-openapi.ts +0 -26
- package/scripts/measure-tool-tokens.ts +0 -118
- package/scripts/x402-e2e-test.ts +0 -195
- package/scripts/x402-test-server.ts +0 -236
- package/scripts/x402-testnet-e2e.ts +0 -668
- package/slack-manifest.json +0 -88
- package/templates-ui/README.md +0 -46
- package/templates-ui/components.json +0 -17
- package/templates-ui/eslint.config.mjs +0 -18
- package/templates-ui/next.config.ts +0 -7
- package/templates-ui/package.json +0 -35
- package/templates-ui/pnpm-lock.yaml +0 -4571
- package/templates-ui/postcss.config.mjs +0 -7
- package/templates-ui/public/file.svg +0 -1
- package/templates-ui/public/globe.svg +0 -1
- package/templates-ui/public/logo.png +0 -0
- package/templates-ui/public/next.svg +0 -1
- package/templates-ui/public/vercel.svg +0 -1
- package/templates-ui/public/window.svg +0 -1
- package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
- package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
- package/templates-ui/src/app/api/templates/route.ts +0 -18
- package/templates-ui/src/app/builder/page.tsx +0 -37
- package/templates-ui/src/app/globals.css +0 -94
- package/templates-ui/src/app/layout.tsx +0 -79
- package/templates-ui/src/app/page.tsx +0 -38
- package/templates-ui/src/app/robots.ts +0 -11
- package/templates-ui/src/app/sitemap.ts +0 -31
- package/templates-ui/src/components/compose-builder.tsx +0 -442
- package/templates-ui/src/components/compose-preview.tsx +0 -117
- package/templates-ui/src/components/file-preview.tsx +0 -77
- package/templates-ui/src/components/footer.tsx +0 -40
- package/templates-ui/src/components/header.tsx +0 -41
- package/templates-ui/src/components/template-card.tsx +0 -87
- package/templates-ui/src/components/template-detail.tsx +0 -125
- package/templates-ui/src/components/template-gallery.tsx +0 -263
- package/templates-ui/src/components/ui/badge.tsx +0 -36
- package/templates-ui/src/components/ui/button.tsx +0 -57
- package/templates-ui/src/components/ui/card.tsx +0 -76
- package/templates-ui/src/components/ui/separator.tsx +0 -31
- package/templates-ui/src/components/ui/tooltip.tsx +0 -32
- package/templates-ui/src/lib/compose-generator.ts +0 -241
- package/templates-ui/src/lib/templates.ts +0 -137
- package/templates-ui/src/lib/utils.ts +0 -6
- package/templates-ui/tsconfig.json +0 -34
- package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
- package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
- package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
- package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
- package/thoughts/shared/plans/.gitkeep +0 -0
- package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
- package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
- package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
- package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
- package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
- package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
- package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
- package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
- package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
- package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
- package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
- package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
- package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
- package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
- package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
- package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
- package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
- package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
- package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
- package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
- package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
- package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
- package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
- package/thoughts/shared/research/.gitkeep +0 -0
- package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
- package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
- package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
- package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
- package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
- package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
- package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
- package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
- package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
- package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
- package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
- package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
- package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
- package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
- package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
- package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
- package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
- package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
- package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
- package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
- package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
- package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
- package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
- package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
- package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
- package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
- package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
- package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
- package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
- package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
- package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
- package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
- package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
- package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
- package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
- package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
- package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
- package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
- package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
- package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
- package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
- package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
- package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
- package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
- package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
- package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
- package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
- package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
- package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
- package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
- package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
- package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
- package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
- package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
- package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
- package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
- package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
- package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
- package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
- package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
- package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
- package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
- package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
- package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
- package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
- package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
- package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
- package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
- package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
- package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
- package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
- package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
- package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
- package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
- package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
- package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
- package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
- package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
- package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
- package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
- 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?
|