@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
package/new-ui/src/api/client.ts
DELETED
|
@@ -1,814 +0,0 @@
|
|
|
1
|
-
import { getConfig } from "@/lib/config";
|
|
2
|
-
import type {
|
|
3
|
-
AgentsResponse,
|
|
4
|
-
AgentWithTasks,
|
|
5
|
-
ChannelMessage,
|
|
6
|
-
ChannelsResponse,
|
|
7
|
-
DashboardCostResponse,
|
|
8
|
-
Epic,
|
|
9
|
-
EpicsResponse,
|
|
10
|
-
EpicWithTasks,
|
|
11
|
-
LogsResponse,
|
|
12
|
-
MessagesResponse,
|
|
13
|
-
ScheduledTask,
|
|
14
|
-
ScheduledTasksResponse,
|
|
15
|
-
ServicesResponse,
|
|
16
|
-
SessionCostsResponse,
|
|
17
|
-
SessionLog,
|
|
18
|
-
SessionLogsResponse,
|
|
19
|
-
Stats,
|
|
20
|
-
SwarmConfig,
|
|
21
|
-
SwarmConfigsResponse,
|
|
22
|
-
SwarmRepo,
|
|
23
|
-
SwarmReposResponse,
|
|
24
|
-
TasksResponse,
|
|
25
|
-
TaskWithLogs,
|
|
26
|
-
UsageSummaryResponse,
|
|
27
|
-
Workflow,
|
|
28
|
-
WorkflowRun,
|
|
29
|
-
WorkflowRunStep,
|
|
30
|
-
WorkflowRunWithSteps,
|
|
31
|
-
WorkflowsResponse,
|
|
32
|
-
WorkflowVersion,
|
|
33
|
-
} from "./types";
|
|
34
|
-
|
|
35
|
-
class ApiClient {
|
|
36
|
-
private getHeaders(): HeadersInit {
|
|
37
|
-
const config = getConfig();
|
|
38
|
-
const headers: HeadersInit = {
|
|
39
|
-
"Content-Type": "application/json",
|
|
40
|
-
};
|
|
41
|
-
if (config.apiKey) {
|
|
42
|
-
headers.Authorization = `Bearer ${config.apiKey}`;
|
|
43
|
-
}
|
|
44
|
-
return headers;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
private getBaseUrl(): string {
|
|
48
|
-
const config = getConfig();
|
|
49
|
-
if (import.meta.env.DEV && config.apiUrl === "http://localhost:3013") {
|
|
50
|
-
return "";
|
|
51
|
-
}
|
|
52
|
-
return config.apiUrl;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async fetchAgents(includeTasks = true): Promise<AgentsResponse> {
|
|
56
|
-
const url = `${this.getBaseUrl()}/api/agents${includeTasks ? "?include=tasks" : ""}`;
|
|
57
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
58
|
-
if (!res.ok) throw new Error(`Failed to fetch agents: ${res.status}`);
|
|
59
|
-
return res.json();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async fetchAgent(id: string, includeTasks = true): Promise<AgentWithTasks> {
|
|
63
|
-
const url = `${this.getBaseUrl()}/api/agents/${id}${includeTasks ? "?include=tasks" : ""}`;
|
|
64
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
65
|
-
if (!res.ok) throw new Error(`Failed to fetch agent: ${res.status}`);
|
|
66
|
-
return res.json();
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async updateAgentName(id: string, name: string): Promise<AgentWithTasks> {
|
|
70
|
-
const url = `${this.getBaseUrl()}/api/agents/${id}/name`;
|
|
71
|
-
const res = await fetch(url, {
|
|
72
|
-
method: "PUT",
|
|
73
|
-
headers: this.getHeaders(),
|
|
74
|
-
body: JSON.stringify({ name }),
|
|
75
|
-
});
|
|
76
|
-
if (!res.ok) {
|
|
77
|
-
const error = await res.json().catch(() => ({ error: "Failed to update name" }));
|
|
78
|
-
throw new Error(error.error || `Failed to update name: ${res.status}`);
|
|
79
|
-
}
|
|
80
|
-
return res.json();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async updateAgentProfile(
|
|
84
|
-
id: string,
|
|
85
|
-
profile: {
|
|
86
|
-
role?: string;
|
|
87
|
-
description?: string;
|
|
88
|
-
capabilities?: string[];
|
|
89
|
-
claudeMd?: string;
|
|
90
|
-
soulMd?: string;
|
|
91
|
-
identityMd?: string;
|
|
92
|
-
toolsMd?: string;
|
|
93
|
-
setupScript?: string;
|
|
94
|
-
},
|
|
95
|
-
): Promise<AgentWithTasks> {
|
|
96
|
-
const url = `${this.getBaseUrl()}/api/agents/${id}/profile`;
|
|
97
|
-
const res = await fetch(url, {
|
|
98
|
-
method: "PUT",
|
|
99
|
-
headers: this.getHeaders(),
|
|
100
|
-
body: JSON.stringify(profile),
|
|
101
|
-
});
|
|
102
|
-
if (!res.ok) {
|
|
103
|
-
const error = await res.json().catch(() => ({ error: "Failed to update profile" }));
|
|
104
|
-
throw new Error(error.error || `Failed to update profile: ${res.status}`);
|
|
105
|
-
}
|
|
106
|
-
return res.json();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
async fetchTasks(filters?: {
|
|
110
|
-
status?: string;
|
|
111
|
-
agentId?: string;
|
|
112
|
-
epicId?: string;
|
|
113
|
-
scheduleId?: string;
|
|
114
|
-
search?: string;
|
|
115
|
-
includeHeartbeat?: boolean;
|
|
116
|
-
limit?: number;
|
|
117
|
-
offset?: number;
|
|
118
|
-
}): Promise<TasksResponse> {
|
|
119
|
-
const params = new URLSearchParams();
|
|
120
|
-
if (filters?.status) params.set("status", filters.status);
|
|
121
|
-
if (filters?.agentId) params.set("agentId", filters.agentId);
|
|
122
|
-
if (filters?.epicId) params.set("epicId", filters.epicId);
|
|
123
|
-
if (filters?.scheduleId) params.set("scheduleId", filters.scheduleId);
|
|
124
|
-
if (filters?.search) params.set("search", filters.search);
|
|
125
|
-
if (filters?.includeHeartbeat) params.set("includeHeartbeat", "true");
|
|
126
|
-
if (filters?.limit != null) params.set("limit", String(filters.limit));
|
|
127
|
-
if (filters?.offset != null) params.set("offset", String(filters.offset));
|
|
128
|
-
const queryString = params.toString();
|
|
129
|
-
const url = `${this.getBaseUrl()}/api/tasks${queryString ? `?${queryString}` : ""}`;
|
|
130
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
131
|
-
if (!res.ok) throw new Error(`Failed to fetch tasks: ${res.status}`);
|
|
132
|
-
return res.json();
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
async fetchTask(id: string): Promise<TaskWithLogs> {
|
|
136
|
-
const url = `${this.getBaseUrl()}/api/tasks/${id}`;
|
|
137
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
138
|
-
if (!res.ok) throw new Error(`Failed to fetch task: ${res.status}`);
|
|
139
|
-
return res.json();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
async createTask(data: {
|
|
143
|
-
task: string;
|
|
144
|
-
agentId?: string;
|
|
145
|
-
taskType?: string;
|
|
146
|
-
tags?: string[];
|
|
147
|
-
priority?: number;
|
|
148
|
-
dependsOn?: string[];
|
|
149
|
-
}): Promise<TaskWithLogs> {
|
|
150
|
-
const url = `${this.getBaseUrl()}/api/tasks`;
|
|
151
|
-
const res = await fetch(url, {
|
|
152
|
-
method: "POST",
|
|
153
|
-
headers: this.getHeaders(),
|
|
154
|
-
body: JSON.stringify(data),
|
|
155
|
-
});
|
|
156
|
-
if (!res.ok) {
|
|
157
|
-
const error = await res.json().catch(() => ({ error: "Failed to create task" }));
|
|
158
|
-
throw new Error(error.error || `Failed to create task: ${res.status}`);
|
|
159
|
-
}
|
|
160
|
-
return res.json();
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
async cancelTask(id: string, reason?: string): Promise<{ success: boolean; task: TaskWithLogs }> {
|
|
164
|
-
const url = `${this.getBaseUrl()}/api/tasks/${id}/cancel`;
|
|
165
|
-
const res = await fetch(url, {
|
|
166
|
-
method: "POST",
|
|
167
|
-
headers: this.getHeaders(),
|
|
168
|
-
body: JSON.stringify({ reason }),
|
|
169
|
-
});
|
|
170
|
-
if (!res.ok) {
|
|
171
|
-
const error = await res.json().catch(() => ({ error: "Failed to cancel task" }));
|
|
172
|
-
throw new Error(error.error || `Failed to cancel task: ${res.status}`);
|
|
173
|
-
}
|
|
174
|
-
return res.json();
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
async pauseTask(id: string): Promise<{ success: boolean; task: TaskWithLogs }> {
|
|
178
|
-
const url = `${this.getBaseUrl()}/api/tasks/${id}/pause`;
|
|
179
|
-
const res = await fetch(url, {
|
|
180
|
-
method: "POST",
|
|
181
|
-
headers: this.getHeaders(),
|
|
182
|
-
});
|
|
183
|
-
if (!res.ok) {
|
|
184
|
-
const error = await res.json().catch(() => ({ error: "Failed to pause task" }));
|
|
185
|
-
throw new Error(error.error || `Failed to pause task: ${res.status}`);
|
|
186
|
-
}
|
|
187
|
-
return res.json();
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
async resumeTask(id: string): Promise<{ success: boolean; task: TaskWithLogs }> {
|
|
191
|
-
const url = `${this.getBaseUrl()}/api/tasks/${id}/resume`;
|
|
192
|
-
const res = await fetch(url, {
|
|
193
|
-
method: "POST",
|
|
194
|
-
headers: this.getHeaders(),
|
|
195
|
-
});
|
|
196
|
-
if (!res.ok) {
|
|
197
|
-
const error = await res.json().catch(() => ({ error: "Failed to resume task" }));
|
|
198
|
-
throw new Error(error.error || `Failed to resume task: ${res.status}`);
|
|
199
|
-
}
|
|
200
|
-
return res.json();
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
async fetchTaskSessionLogs(taskId: string): Promise<SessionLog[]> {
|
|
204
|
-
const url = `${this.getBaseUrl()}/api/tasks/${taskId}/session-logs`;
|
|
205
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
206
|
-
if (!res.ok) throw new Error(`Failed to fetch session logs: ${res.status}`);
|
|
207
|
-
const data = (await res.json()) as SessionLogsResponse;
|
|
208
|
-
return data.logs;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
async fetchLogs(limit = 100, agentId?: string): Promise<LogsResponse> {
|
|
212
|
-
const params = new URLSearchParams();
|
|
213
|
-
params.set("limit", String(limit));
|
|
214
|
-
if (agentId) params.set("agentId", agentId);
|
|
215
|
-
const url = `${this.getBaseUrl()}/api/logs?${params.toString()}`;
|
|
216
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
217
|
-
if (!res.ok) throw new Error(`Failed to fetch logs: ${res.status}`);
|
|
218
|
-
return res.json();
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
async fetchStats(): Promise<Stats> {
|
|
222
|
-
const url = `${this.getBaseUrl()}/api/stats`;
|
|
223
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
224
|
-
if (!res.ok) throw new Error(`Failed to fetch stats: ${res.status}`);
|
|
225
|
-
return res.json();
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
async checkHealth(): Promise<{ status: string; version: string }> {
|
|
229
|
-
const config = getConfig();
|
|
230
|
-
const baseUrl =
|
|
231
|
-
import.meta.env.DEV && config.apiUrl === "http://localhost:3013"
|
|
232
|
-
? "http://localhost:3013"
|
|
233
|
-
: config.apiUrl;
|
|
234
|
-
const url = `${baseUrl}/health`;
|
|
235
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
236
|
-
if (!res.ok) throw new Error(`Health check failed: ${res.status}`);
|
|
237
|
-
return res.json();
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
async createChannel(data: {
|
|
241
|
-
name: string;
|
|
242
|
-
description?: string;
|
|
243
|
-
type?: string;
|
|
244
|
-
}): Promise<{ channel: { id: string; name: string } }> {
|
|
245
|
-
const url = `${this.getBaseUrl()}/api/channels`;
|
|
246
|
-
const res = await fetch(url, {
|
|
247
|
-
method: "POST",
|
|
248
|
-
headers: this.getHeaders(),
|
|
249
|
-
body: JSON.stringify(data),
|
|
250
|
-
});
|
|
251
|
-
if (!res.ok) {
|
|
252
|
-
const body = await res.json().catch(() => ({}));
|
|
253
|
-
throw new Error(body.error || `Failed to create channel: ${res.status}`);
|
|
254
|
-
}
|
|
255
|
-
return res.json();
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
async deleteChannel(id: string): Promise<{ success: boolean }> {
|
|
259
|
-
const url = `${this.getBaseUrl()}/api/channels/${id}`;
|
|
260
|
-
const res = await fetch(url, { method: "DELETE", headers: this.getHeaders() });
|
|
261
|
-
if (!res.ok) {
|
|
262
|
-
const body = await res.json().catch(() => ({}));
|
|
263
|
-
throw new Error(body.error || `Failed to delete channel: ${res.status}`);
|
|
264
|
-
}
|
|
265
|
-
return res.json();
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
async fetchChannels(): Promise<ChannelsResponse> {
|
|
269
|
-
const url = `${this.getBaseUrl()}/api/channels`;
|
|
270
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
271
|
-
if (!res.ok) throw new Error(`Failed to fetch channels: ${res.status}`);
|
|
272
|
-
return res.json();
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
async fetchMessages(
|
|
276
|
-
channelId: string,
|
|
277
|
-
options?: { limit?: number; since?: string; before?: string },
|
|
278
|
-
): Promise<MessagesResponse> {
|
|
279
|
-
const params = new URLSearchParams();
|
|
280
|
-
if (options?.limit) params.set("limit", String(options.limit));
|
|
281
|
-
if (options?.since) params.set("since", options.since);
|
|
282
|
-
if (options?.before) params.set("before", options.before);
|
|
283
|
-
const queryString = params.toString();
|
|
284
|
-
const url = `${this.getBaseUrl()}/api/channels/${channelId}/messages${queryString ? `?${queryString}` : ""}`;
|
|
285
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
286
|
-
if (!res.ok) throw new Error(`Failed to fetch messages: ${res.status}`);
|
|
287
|
-
return res.json();
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
async fetchThreadMessages(channelId: string, messageId: string): Promise<MessagesResponse> {
|
|
291
|
-
const url = `${this.getBaseUrl()}/api/channels/${channelId}/messages/${messageId}/thread`;
|
|
292
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
293
|
-
if (!res.ok) throw new Error(`Failed to fetch thread: ${res.status}`);
|
|
294
|
-
return res.json();
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
async postMessage(
|
|
298
|
-
channelId: string,
|
|
299
|
-
content: string,
|
|
300
|
-
options?: { agentId?: string; replyToId?: string; mentions?: string[] },
|
|
301
|
-
): Promise<ChannelMessage> {
|
|
302
|
-
const url = `${this.getBaseUrl()}/api/channels/${channelId}/messages`;
|
|
303
|
-
const res = await fetch(url, {
|
|
304
|
-
method: "POST",
|
|
305
|
-
headers: this.getHeaders(),
|
|
306
|
-
body: JSON.stringify({
|
|
307
|
-
content,
|
|
308
|
-
agentId: options?.agentId,
|
|
309
|
-
replyToId: options?.replyToId,
|
|
310
|
-
mentions: options?.mentions,
|
|
311
|
-
}),
|
|
312
|
-
});
|
|
313
|
-
if (!res.ok) throw new Error(`Failed to post message: ${res.status}`);
|
|
314
|
-
return res.json();
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
async fetchServices(filters?: {
|
|
318
|
-
status?: string;
|
|
319
|
-
agentId?: string;
|
|
320
|
-
name?: string;
|
|
321
|
-
}): Promise<ServicesResponse> {
|
|
322
|
-
const params = new URLSearchParams();
|
|
323
|
-
if (filters?.status) params.set("status", filters.status);
|
|
324
|
-
if (filters?.agentId) params.set("agentId", filters.agentId);
|
|
325
|
-
if (filters?.name) params.set("name", filters.name);
|
|
326
|
-
const queryString = params.toString();
|
|
327
|
-
const url = `${this.getBaseUrl()}/api/services${queryString ? `?${queryString}` : ""}`;
|
|
328
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
329
|
-
if (!res.ok) throw new Error(`Failed to fetch services: ${res.status}`);
|
|
330
|
-
return res.json();
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
async fetchSessionCosts(filters?: {
|
|
334
|
-
agentId?: string;
|
|
335
|
-
taskId?: string;
|
|
336
|
-
startDate?: string;
|
|
337
|
-
endDate?: string;
|
|
338
|
-
limit?: number;
|
|
339
|
-
}): Promise<SessionCostsResponse> {
|
|
340
|
-
const params = new URLSearchParams();
|
|
341
|
-
if (filters?.agentId) params.set("agentId", filters.agentId);
|
|
342
|
-
if (filters?.taskId) params.set("taskId", filters.taskId);
|
|
343
|
-
if (filters?.startDate) params.set("startDate", filters.startDate);
|
|
344
|
-
if (filters?.endDate) params.set("endDate", filters.endDate);
|
|
345
|
-
if (filters?.limit) params.set("limit", String(filters.limit));
|
|
346
|
-
const queryString = params.toString();
|
|
347
|
-
const url = `${this.getBaseUrl()}/api/session-costs${queryString ? `?${queryString}` : ""}`;
|
|
348
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
349
|
-
if (!res.ok) throw new Error(`Failed to fetch session costs: ${res.status}`);
|
|
350
|
-
return res.json();
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
async fetchUsageSummary(filters?: {
|
|
354
|
-
startDate?: string;
|
|
355
|
-
endDate?: string;
|
|
356
|
-
agentId?: string;
|
|
357
|
-
groupBy?: "day" | "agent" | "both";
|
|
358
|
-
}): Promise<UsageSummaryResponse> {
|
|
359
|
-
const params = new URLSearchParams();
|
|
360
|
-
if (filters?.startDate) params.set("startDate", filters.startDate);
|
|
361
|
-
if (filters?.endDate) params.set("endDate", filters.endDate);
|
|
362
|
-
if (filters?.agentId) params.set("agentId", filters.agentId);
|
|
363
|
-
if (filters?.groupBy) params.set("groupBy", filters.groupBy);
|
|
364
|
-
const queryString = params.toString();
|
|
365
|
-
const url = `${this.getBaseUrl()}/api/session-costs/summary${queryString ? `?${queryString}` : ""}`;
|
|
366
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
367
|
-
if (!res.ok) throw new Error(`Failed to fetch usage summary: ${res.status}`);
|
|
368
|
-
return res.json();
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
async fetchDashboardCosts(): Promise<DashboardCostResponse> {
|
|
372
|
-
const url = `${this.getBaseUrl()}/api/session-costs/dashboard`;
|
|
373
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
374
|
-
if (!res.ok) throw new Error(`Failed to fetch dashboard costs: ${res.status}`);
|
|
375
|
-
return res.json();
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
async fetchScheduledTasks(filters?: {
|
|
379
|
-
enabled?: boolean;
|
|
380
|
-
name?: string;
|
|
381
|
-
}): Promise<ScheduledTasksResponse> {
|
|
382
|
-
const params = new URLSearchParams();
|
|
383
|
-
if (filters?.enabled !== undefined) params.set("enabled", String(filters.enabled));
|
|
384
|
-
if (filters?.name) params.set("name", filters.name);
|
|
385
|
-
const queryString = params.toString();
|
|
386
|
-
const url = `${this.getBaseUrl()}/api/scheduled-tasks${queryString ? `?${queryString}` : ""}`;
|
|
387
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
388
|
-
if (!res.ok) throw new Error(`Failed to fetch scheduled tasks: ${res.status}`);
|
|
389
|
-
return res.json();
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
async fetchSchedule(id: string): Promise<ScheduledTask> {
|
|
393
|
-
const url = `${this.getBaseUrl()}/api/schedules/${id}`;
|
|
394
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
395
|
-
if (!res.ok) throw new Error(`Failed to fetch schedule: ${res.status}`);
|
|
396
|
-
return res.json();
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
async createSchedule(data: {
|
|
400
|
-
name: string;
|
|
401
|
-
taskTemplate: string;
|
|
402
|
-
cronExpression?: string;
|
|
403
|
-
intervalMs?: number;
|
|
404
|
-
description?: string;
|
|
405
|
-
taskType?: string;
|
|
406
|
-
tags?: string[];
|
|
407
|
-
priority?: number;
|
|
408
|
-
targetAgentId?: string;
|
|
409
|
-
timezone?: string;
|
|
410
|
-
model?: string;
|
|
411
|
-
enabled?: boolean;
|
|
412
|
-
}): Promise<ScheduledTask> {
|
|
413
|
-
const url = `${this.getBaseUrl()}/api/schedules`;
|
|
414
|
-
const res = await fetch(url, {
|
|
415
|
-
method: "POST",
|
|
416
|
-
headers: { ...this.getHeaders(), "Content-Type": "application/json" },
|
|
417
|
-
body: JSON.stringify(data),
|
|
418
|
-
});
|
|
419
|
-
if (!res.ok) {
|
|
420
|
-
const body = await res.json().catch(() => ({}));
|
|
421
|
-
throw new Error(body.error || `Failed to create schedule: ${res.status}`);
|
|
422
|
-
}
|
|
423
|
-
return res.json();
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
async updateSchedule(id: string, data: Partial<ScheduledTask>): Promise<ScheduledTask> {
|
|
427
|
-
const url = `${this.getBaseUrl()}/api/schedules/${id}`;
|
|
428
|
-
const res = await fetch(url, {
|
|
429
|
-
method: "PUT",
|
|
430
|
-
headers: { ...this.getHeaders(), "Content-Type": "application/json" },
|
|
431
|
-
body: JSON.stringify(data),
|
|
432
|
-
});
|
|
433
|
-
if (!res.ok) {
|
|
434
|
-
const body = await res.json().catch(() => ({}));
|
|
435
|
-
throw new Error(body.error || `Failed to update schedule: ${res.status}`);
|
|
436
|
-
}
|
|
437
|
-
return res.json();
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
async deleteSchedule(id: string): Promise<{ success: boolean }> {
|
|
441
|
-
const url = `${this.getBaseUrl()}/api/schedules/${id}`;
|
|
442
|
-
const res = await fetch(url, { method: "DELETE", headers: this.getHeaders() });
|
|
443
|
-
if (!res.ok) {
|
|
444
|
-
const body = await res.json().catch(() => ({}));
|
|
445
|
-
throw new Error(body.error || `Failed to delete schedule: ${res.status}`);
|
|
446
|
-
}
|
|
447
|
-
return res.json();
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
async runScheduleNow(id: string): Promise<{ schedule: ScheduledTask; task: TaskWithLogs }> {
|
|
451
|
-
const url = `${this.getBaseUrl()}/api/schedules/${id}/run`;
|
|
452
|
-
const res = await fetch(url, {
|
|
453
|
-
method: "POST",
|
|
454
|
-
headers: this.getHeaders(),
|
|
455
|
-
});
|
|
456
|
-
if (!res.ok) {
|
|
457
|
-
const body = await res.json().catch(() => ({}));
|
|
458
|
-
throw new Error(body.error || `Failed to run schedule: ${res.status}`);
|
|
459
|
-
}
|
|
460
|
-
return res.json();
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
async fetchEpics(filters?: {
|
|
464
|
-
status?: string;
|
|
465
|
-
search?: string;
|
|
466
|
-
leadAgentId?: string;
|
|
467
|
-
}): Promise<EpicsResponse> {
|
|
468
|
-
const params = new URLSearchParams();
|
|
469
|
-
if (filters?.status) params.set("status", filters.status);
|
|
470
|
-
if (filters?.search) params.set("search", filters.search);
|
|
471
|
-
if (filters?.leadAgentId) params.set("leadAgentId", filters.leadAgentId);
|
|
472
|
-
const queryString = params.toString();
|
|
473
|
-
const url = `${this.getBaseUrl()}/api/epics${queryString ? `?${queryString}` : ""}`;
|
|
474
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
475
|
-
if (!res.ok) throw new Error(`Failed to fetch epics: ${res.status}`);
|
|
476
|
-
return res.json();
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
async fetchEpic(id: string): Promise<EpicWithTasks> {
|
|
480
|
-
const url = `${this.getBaseUrl()}/api/epics/${id}`;
|
|
481
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
482
|
-
if (!res.ok) throw new Error(`Failed to fetch epic: ${res.status}`);
|
|
483
|
-
return res.json();
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
async createEpic(data: {
|
|
487
|
-
name: string;
|
|
488
|
-
goal: string;
|
|
489
|
-
description?: string;
|
|
490
|
-
priority?: number;
|
|
491
|
-
tags?: string[];
|
|
492
|
-
leadAgentId?: string;
|
|
493
|
-
}): Promise<Epic> {
|
|
494
|
-
const url = `${this.getBaseUrl()}/api/epics`;
|
|
495
|
-
const res = await fetch(url, {
|
|
496
|
-
method: "POST",
|
|
497
|
-
headers: { ...this.getHeaders(), "Content-Type": "application/json" },
|
|
498
|
-
body: JSON.stringify(data),
|
|
499
|
-
});
|
|
500
|
-
if (!res.ok) {
|
|
501
|
-
const body = await res.json().catch(() => ({}));
|
|
502
|
-
throw new Error(body.error || `Failed to create epic: ${res.status}`);
|
|
503
|
-
}
|
|
504
|
-
return res.json();
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
async updateEpic(id: string, data: Partial<Epic>): Promise<Epic> {
|
|
508
|
-
const url = `${this.getBaseUrl()}/api/epics/${id}`;
|
|
509
|
-
const res = await fetch(url, {
|
|
510
|
-
method: "PUT",
|
|
511
|
-
headers: { ...this.getHeaders(), "Content-Type": "application/json" },
|
|
512
|
-
body: JSON.stringify(data),
|
|
513
|
-
});
|
|
514
|
-
if (!res.ok) {
|
|
515
|
-
const body = await res.json().catch(() => ({}));
|
|
516
|
-
throw new Error(body.error || `Failed to update epic: ${res.status}`);
|
|
517
|
-
}
|
|
518
|
-
return res.json();
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
async deleteEpic(id: string): Promise<{ success: boolean }> {
|
|
522
|
-
const url = `${this.getBaseUrl()}/api/epics/${id}`;
|
|
523
|
-
const res = await fetch(url, { method: "DELETE", headers: this.getHeaders() });
|
|
524
|
-
if (!res.ok) {
|
|
525
|
-
const body = await res.json().catch(() => ({}));
|
|
526
|
-
throw new Error(body.error || `Failed to delete epic: ${res.status}`);
|
|
527
|
-
}
|
|
528
|
-
return res.json();
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
async assignTaskToEpic(
|
|
532
|
-
epicId: string,
|
|
533
|
-
data: { taskId?: string; task?: string },
|
|
534
|
-
): Promise<TaskWithLogs> {
|
|
535
|
-
const url = `${this.getBaseUrl()}/api/epics/${epicId}/tasks`;
|
|
536
|
-
const res = await fetch(url, {
|
|
537
|
-
method: "POST",
|
|
538
|
-
headers: { ...this.getHeaders(), "Content-Type": "application/json" },
|
|
539
|
-
body: JSON.stringify(data),
|
|
540
|
-
});
|
|
541
|
-
if (!res.ok) {
|
|
542
|
-
const body = await res.json().catch(() => ({}));
|
|
543
|
-
throw new Error(body.error || `Failed to assign task to epic: ${res.status}`);
|
|
544
|
-
}
|
|
545
|
-
return res.json();
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
async fetchConfigs(filters?: {
|
|
549
|
-
scope?: string;
|
|
550
|
-
scopeId?: string;
|
|
551
|
-
includeSecrets?: boolean;
|
|
552
|
-
}): Promise<SwarmConfigsResponse> {
|
|
553
|
-
const params = new URLSearchParams();
|
|
554
|
-
if (filters?.scope) params.set("scope", filters.scope);
|
|
555
|
-
if (filters?.scopeId) params.set("scopeId", filters.scopeId);
|
|
556
|
-
if (filters?.includeSecrets) params.set("includeSecrets", "true");
|
|
557
|
-
const queryString = params.toString();
|
|
558
|
-
const url = `${this.getBaseUrl()}/api/config${queryString ? `?${queryString}` : ""}`;
|
|
559
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
560
|
-
if (!res.ok) throw new Error(`Failed to fetch configs: ${res.status}`);
|
|
561
|
-
return res.json();
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
async fetchResolvedConfig(params?: {
|
|
565
|
-
agentId?: string;
|
|
566
|
-
repoId?: string;
|
|
567
|
-
includeSecrets?: boolean;
|
|
568
|
-
}): Promise<SwarmConfigsResponse> {
|
|
569
|
-
const searchParams = new URLSearchParams();
|
|
570
|
-
if (params?.agentId) searchParams.set("agentId", params.agentId);
|
|
571
|
-
if (params?.repoId) searchParams.set("repoId", params.repoId);
|
|
572
|
-
if (params?.includeSecrets) searchParams.set("includeSecrets", "true");
|
|
573
|
-
const queryString = searchParams.toString();
|
|
574
|
-
const url = `${this.getBaseUrl()}/api/config/resolved${queryString ? `?${queryString}` : ""}`;
|
|
575
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
576
|
-
if (!res.ok) throw new Error(`Failed to fetch resolved config: ${res.status}`);
|
|
577
|
-
return res.json();
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
async upsertConfig(data: {
|
|
581
|
-
scope: string;
|
|
582
|
-
scopeId?: string | null;
|
|
583
|
-
key: string;
|
|
584
|
-
value: string;
|
|
585
|
-
isSecret?: boolean;
|
|
586
|
-
envPath?: string | null;
|
|
587
|
-
description?: string | null;
|
|
588
|
-
}): Promise<SwarmConfig> {
|
|
589
|
-
const url = `${this.getBaseUrl()}/api/config?includeSecrets=true`;
|
|
590
|
-
const res = await fetch(url, {
|
|
591
|
-
method: "PUT",
|
|
592
|
-
headers: this.getHeaders(),
|
|
593
|
-
body: JSON.stringify(data),
|
|
594
|
-
});
|
|
595
|
-
if (!res.ok) {
|
|
596
|
-
const error = await res.json().catch(() => ({ error: "Failed to upsert config" }));
|
|
597
|
-
throw new Error(error.error || `Failed to upsert config: ${res.status}`);
|
|
598
|
-
}
|
|
599
|
-
return res.json();
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
async deleteConfig(id: string): Promise<{ success: boolean }> {
|
|
603
|
-
const url = `${this.getBaseUrl()}/api/config/${id}`;
|
|
604
|
-
const res = await fetch(url, { method: "DELETE", headers: this.getHeaders() });
|
|
605
|
-
if (!res.ok) throw new Error(`Failed to delete config: ${res.status}`);
|
|
606
|
-
return res.json();
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
async fetchRepos(filters?: { autoClone?: boolean }): Promise<SwarmReposResponse> {
|
|
610
|
-
const params = new URLSearchParams();
|
|
611
|
-
if (filters?.autoClone !== undefined) params.set("autoClone", String(filters.autoClone));
|
|
612
|
-
const queryString = params.toString();
|
|
613
|
-
const url = `${this.getBaseUrl()}/api/repos${queryString ? `?${queryString}` : ""}`;
|
|
614
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
615
|
-
if (!res.ok) throw new Error(`Failed to fetch repos: ${res.status}`);
|
|
616
|
-
return res.json();
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
async createRepo(data: {
|
|
620
|
-
url: string;
|
|
621
|
-
name: string;
|
|
622
|
-
clonePath?: string;
|
|
623
|
-
defaultBranch?: string;
|
|
624
|
-
autoClone?: boolean;
|
|
625
|
-
}): Promise<SwarmRepo> {
|
|
626
|
-
const url = `${this.getBaseUrl()}/api/repos`;
|
|
627
|
-
const res = await fetch(url, {
|
|
628
|
-
method: "POST",
|
|
629
|
-
headers: this.getHeaders(),
|
|
630
|
-
body: JSON.stringify(data),
|
|
631
|
-
});
|
|
632
|
-
if (!res.ok) {
|
|
633
|
-
const error = await res.json().catch(() => ({ error: "Failed to create repo" }));
|
|
634
|
-
throw new Error(error.error || `Failed to create repo: ${res.status}`);
|
|
635
|
-
}
|
|
636
|
-
return res.json();
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
async updateRepo(
|
|
640
|
-
id: string,
|
|
641
|
-
data: Partial<{
|
|
642
|
-
url: string;
|
|
643
|
-
name: string;
|
|
644
|
-
clonePath: string;
|
|
645
|
-
defaultBranch: string;
|
|
646
|
-
autoClone: boolean;
|
|
647
|
-
}>,
|
|
648
|
-
): Promise<SwarmRepo> {
|
|
649
|
-
const url = `${this.getBaseUrl()}/api/repos/${id}`;
|
|
650
|
-
const res = await fetch(url, {
|
|
651
|
-
method: "PUT",
|
|
652
|
-
headers: this.getHeaders(),
|
|
653
|
-
body: JSON.stringify(data),
|
|
654
|
-
});
|
|
655
|
-
if (!res.ok) {
|
|
656
|
-
const error = await res.json().catch(() => ({ error: "Failed to update repo" }));
|
|
657
|
-
throw new Error(error.error || `Failed to update repo: ${res.status}`);
|
|
658
|
-
}
|
|
659
|
-
return res.json();
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
async deleteRepo(id: string): Promise<{ success: boolean }> {
|
|
663
|
-
const url = `${this.getBaseUrl()}/api/repos/${id}`;
|
|
664
|
-
const res = await fetch(url, { method: "DELETE", headers: this.getHeaders() });
|
|
665
|
-
if (!res.ok) throw new Error(`Failed to delete repo: ${res.status}`);
|
|
666
|
-
return res.json();
|
|
667
|
-
}
|
|
668
|
-
// Workflows
|
|
669
|
-
async fetchWorkflows(): Promise<WorkflowsResponse> {
|
|
670
|
-
const url = `${this.getBaseUrl()}/api/workflows`;
|
|
671
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
672
|
-
if (!res.ok) throw new Error(`Failed to fetch workflows: ${res.status}`);
|
|
673
|
-
const workflows = (await res.json()) as Workflow[];
|
|
674
|
-
// List endpoint doesn't include auto-generated edges — ensure the field exists
|
|
675
|
-
for (const w of workflows) {
|
|
676
|
-
if (!w.definition.edges) {
|
|
677
|
-
w.definition.edges = [];
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
return { workflows };
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
async fetchWorkflow(id: string): Promise<Workflow> {
|
|
684
|
-
const url = `${this.getBaseUrl()}/api/workflows/${id}`;
|
|
685
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
686
|
-
if (!res.ok) throw new Error(`Failed to fetch workflow: ${res.status}`);
|
|
687
|
-
const data = await res.json();
|
|
688
|
-
// API returns { ...workflow, edges } with edges at top level.
|
|
689
|
-
// Nest edges into definition for UI convenience.
|
|
690
|
-
if (data.edges && !data.definition.edges) {
|
|
691
|
-
data.definition.edges = data.edges;
|
|
692
|
-
}
|
|
693
|
-
// Ensure edges array exists even if not returned
|
|
694
|
-
if (!data.definition.edges) {
|
|
695
|
-
data.definition.edges = [];
|
|
696
|
-
}
|
|
697
|
-
return data as Workflow;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
async updateWorkflow(
|
|
701
|
-
id: string,
|
|
702
|
-
data: Partial<Pick<Workflow, "name" | "description" | "enabled">>,
|
|
703
|
-
): Promise<Workflow> {
|
|
704
|
-
const url = `${this.getBaseUrl()}/api/workflows/${id}`;
|
|
705
|
-
const res = await fetch(url, {
|
|
706
|
-
method: "PUT",
|
|
707
|
-
headers: this.getHeaders(),
|
|
708
|
-
body: JSON.stringify(data),
|
|
709
|
-
});
|
|
710
|
-
if (!res.ok) throw new Error(`Failed to update workflow: ${res.status}`);
|
|
711
|
-
return res.json();
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
async deleteWorkflow(id: string): Promise<void> {
|
|
715
|
-
const url = `${this.getBaseUrl()}/api/workflows/${id}`;
|
|
716
|
-
const res = await fetch(url, { method: "DELETE", headers: this.getHeaders() });
|
|
717
|
-
if (!res.ok) throw new Error(`Failed to delete workflow: ${res.status}`);
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
async triggerWorkflow(
|
|
721
|
-
id: string,
|
|
722
|
-
triggerData?: Record<string, unknown>,
|
|
723
|
-
): Promise<{ runId: string }> {
|
|
724
|
-
const url = `${this.getBaseUrl()}/api/workflows/${id}/trigger`;
|
|
725
|
-
const res = await fetch(url, {
|
|
726
|
-
method: "POST",
|
|
727
|
-
headers: this.getHeaders(),
|
|
728
|
-
body: JSON.stringify({ triggerData }),
|
|
729
|
-
});
|
|
730
|
-
if (!res.ok) throw new Error(`Failed to trigger workflow: ${res.status}`);
|
|
731
|
-
return res.json();
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
async fetchWorkflowRuns(workflowId: string): Promise<WorkflowRun[]> {
|
|
735
|
-
const url = `${this.getBaseUrl()}/api/workflows/${workflowId}/runs`;
|
|
736
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
737
|
-
if (!res.ok) throw new Error(`Failed to fetch workflow runs: ${res.status}`);
|
|
738
|
-
return res.json();
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
async fetchAllWorkflowRuns(): Promise<WorkflowRun[]> {
|
|
742
|
-
const { workflows } = await this.fetchWorkflows();
|
|
743
|
-
const allRuns: WorkflowRun[] = [];
|
|
744
|
-
for (const w of workflows) {
|
|
745
|
-
const runs = await this.fetchWorkflowRuns(w.id);
|
|
746
|
-
allRuns.push(...runs);
|
|
747
|
-
}
|
|
748
|
-
return allRuns.sort(
|
|
749
|
-
(a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),
|
|
750
|
-
);
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
async fetchWorkflowRun(id: string): Promise<WorkflowRunWithSteps> {
|
|
754
|
-
const url = `${this.getBaseUrl()}/api/workflow-runs/${id}`;
|
|
755
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
756
|
-
if (!res.ok) throw new Error(`Failed to fetch workflow run: ${res.status}`);
|
|
757
|
-
const data = (await res.json()) as { run: WorkflowRun; steps: WorkflowRunStep[] };
|
|
758
|
-
// Reshape { run, steps } into WorkflowRunWithSteps
|
|
759
|
-
return { ...data.run, steps: data.steps };
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
async fetchWorkflowVersions(workflowId: string): Promise<WorkflowVersion[]> {
|
|
763
|
-
const url = `${this.getBaseUrl()}/api/workflows/${workflowId}/versions`;
|
|
764
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
765
|
-
if (!res.ok) throw new Error(`Failed to fetch workflow versions: ${res.status}`);
|
|
766
|
-
const data = (await res.json()) as { versions: WorkflowVersion[] };
|
|
767
|
-
return data.versions;
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
async retryWorkflowRun(id: string): Promise<{ success: boolean }> {
|
|
771
|
-
const url = `${this.getBaseUrl()}/api/workflow-runs/${id}/retry`;
|
|
772
|
-
const res = await fetch(url, {
|
|
773
|
-
method: "POST",
|
|
774
|
-
headers: this.getHeaders(),
|
|
775
|
-
});
|
|
776
|
-
if (!res.ok) throw new Error(`Failed to retry workflow run: ${res.status}`);
|
|
777
|
-
return res.json();
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
async fetchExecutorTypes(): Promise<ExecutorTypeInfo[]> {
|
|
781
|
-
const url = `${this.getBaseUrl()}/api/executor-types`;
|
|
782
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
783
|
-
if (!res.ok) return [];
|
|
784
|
-
const data = await res.json();
|
|
785
|
-
return data.executorTypes ?? [];
|
|
786
|
-
}
|
|
787
|
-
|
|
788
|
-
async fetchExecutorType(type: string): Promise<ExecutorTypeInfo | null> {
|
|
789
|
-
const url = `${this.getBaseUrl()}/api/executor-types/${encodeURIComponent(type)}`;
|
|
790
|
-
const res = await fetch(url, { headers: this.getHeaders() });
|
|
791
|
-
if (!res.ok) return null;
|
|
792
|
-
return res.json();
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
async dbQuery(sql: string, params?: unknown[]): Promise<import("./types").DbQueryResponse> {
|
|
796
|
-
const url = `${this.getBaseUrl()}/api/db-query`;
|
|
797
|
-
const res = await fetch(url, {
|
|
798
|
-
method: "POST",
|
|
799
|
-
headers: this.getHeaders(),
|
|
800
|
-
body: JSON.stringify({ sql, params }),
|
|
801
|
-
});
|
|
802
|
-
if (!res.ok) throw new Error(`Failed to execute query: ${res.status}`);
|
|
803
|
-
return res.json();
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
export interface ExecutorTypeInfo {
|
|
808
|
-
type: string;
|
|
809
|
-
mode: "instant" | "async";
|
|
810
|
-
configSchema: Record<string, unknown>;
|
|
811
|
-
outputSchema: Record<string, unknown>;
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
export const api = new ApiClient();
|