@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,233 +0,0 @@
|
|
|
1
|
-
name: Merge Gate
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
detect-changes:
|
|
10
|
-
name: Detect Changes
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
outputs:
|
|
13
|
-
code: ${{ steps.check.outputs.code }}
|
|
14
|
-
new-ui: ${{ steps.check.outputs.new-ui }}
|
|
15
|
-
steps:
|
|
16
|
-
- name: Checkout repository
|
|
17
|
-
uses: actions/checkout@v4
|
|
18
|
-
with:
|
|
19
|
-
fetch-depth: 0
|
|
20
|
-
|
|
21
|
-
- name: Fetch base branch
|
|
22
|
-
run: git fetch origin ${{ github.base_ref }}
|
|
23
|
-
|
|
24
|
-
- name: Check for code changes
|
|
25
|
-
id: check
|
|
26
|
-
run: |
|
|
27
|
-
CHANGED=$(git diff --name-only origin/${{ github.base_ref }}...HEAD)
|
|
28
|
-
CODE_CHANGED=$(echo "$CHANGED" | grep -v '^docs-site/' | grep -v '^landing/' | grep -v '^$' || true)
|
|
29
|
-
if [ -n "$CODE_CHANGED" ]; then
|
|
30
|
-
echo "code=true" >> $GITHUB_OUTPUT
|
|
31
|
-
echo "Code files changed:"
|
|
32
|
-
echo "$CODE_CHANGED"
|
|
33
|
-
else
|
|
34
|
-
echo "code=false" >> $GITHUB_OUTPUT
|
|
35
|
-
echo "No code files changed (only docs-site/ or landing/)"
|
|
36
|
-
fi
|
|
37
|
-
UI_CHANGED=$(echo "$CHANGED" | grep '^new-ui/' || true)
|
|
38
|
-
if [ -n "$UI_CHANGED" ]; then
|
|
39
|
-
echo "new-ui=true" >> $GITHUB_OUTPUT
|
|
40
|
-
echo "new-ui files changed:"
|
|
41
|
-
echo "$UI_CHANGED"
|
|
42
|
-
else
|
|
43
|
-
echo "new-ui=false" >> $GITHUB_OUTPUT
|
|
44
|
-
fi
|
|
45
|
-
|
|
46
|
-
lint-and-typecheck:
|
|
47
|
-
name: Lint and Type Check
|
|
48
|
-
needs: detect-changes
|
|
49
|
-
if: needs.detect-changes.outputs.code == 'true'
|
|
50
|
-
runs-on: ubuntu-latest
|
|
51
|
-
|
|
52
|
-
steps:
|
|
53
|
-
- name: Checkout repository
|
|
54
|
-
uses: actions/checkout@v4
|
|
55
|
-
|
|
56
|
-
- name: Setup Bun
|
|
57
|
-
uses: oven-sh/setup-bun@v2
|
|
58
|
-
with:
|
|
59
|
-
bun-version: latest
|
|
60
|
-
|
|
61
|
-
- name: Install dependencies
|
|
62
|
-
run: bun install --frozen-lockfile
|
|
63
|
-
|
|
64
|
-
- name: Run Biome linter
|
|
65
|
-
run: bun run lint
|
|
66
|
-
|
|
67
|
-
- name: Run TypeScript type check
|
|
68
|
-
run: bun run tsc:check
|
|
69
|
-
|
|
70
|
-
- name: Check worker/API DB boundary
|
|
71
|
-
run: bash scripts/check-db-boundary.sh
|
|
72
|
-
|
|
73
|
-
test:
|
|
74
|
-
name: Run Tests
|
|
75
|
-
needs: detect-changes
|
|
76
|
-
if: needs.detect-changes.outputs.code == 'true'
|
|
77
|
-
runs-on: ubuntu-latest
|
|
78
|
-
|
|
79
|
-
steps:
|
|
80
|
-
- name: Checkout repository
|
|
81
|
-
uses: actions/checkout@v4
|
|
82
|
-
|
|
83
|
-
- name: Setup Bun
|
|
84
|
-
uses: oven-sh/setup-bun@v2
|
|
85
|
-
with:
|
|
86
|
-
bun-version: latest
|
|
87
|
-
|
|
88
|
-
- name: Install dependencies
|
|
89
|
-
run: bun install --frozen-lockfile
|
|
90
|
-
|
|
91
|
-
- name: Run tests
|
|
92
|
-
run: bun test
|
|
93
|
-
|
|
94
|
-
pi-skills-freshness:
|
|
95
|
-
name: Pi-Skills Freshness Check
|
|
96
|
-
needs: detect-changes
|
|
97
|
-
if: needs.detect-changes.outputs.code == 'true'
|
|
98
|
-
runs-on: ubuntu-latest
|
|
99
|
-
|
|
100
|
-
steps:
|
|
101
|
-
- name: Checkout repository
|
|
102
|
-
uses: actions/checkout@v4
|
|
103
|
-
|
|
104
|
-
- name: Setup Bun
|
|
105
|
-
uses: oven-sh/setup-bun@v2
|
|
106
|
-
with:
|
|
107
|
-
bun-version: latest
|
|
108
|
-
|
|
109
|
-
- name: Install dependencies
|
|
110
|
-
run: bun install --frozen-lockfile
|
|
111
|
-
|
|
112
|
-
- name: Rebuild pi-skills and check for drift
|
|
113
|
-
run: |
|
|
114
|
-
bun run build:pi-skills
|
|
115
|
-
if [ -n "$(git diff --name-only plugin/pi-skills/)" ]; then
|
|
116
|
-
echo "::error::pi-skills are out of date! Run 'bun run build:pi-skills' and commit the changes."
|
|
117
|
-
git diff --stat plugin/pi-skills/
|
|
118
|
-
exit 1
|
|
119
|
-
fi
|
|
120
|
-
echo "pi-skills are up to date."
|
|
121
|
-
|
|
122
|
-
openapi-freshness:
|
|
123
|
-
name: OpenAPI Spec Freshness Check
|
|
124
|
-
needs: detect-changes
|
|
125
|
-
if: needs.detect-changes.outputs.code == 'true'
|
|
126
|
-
runs-on: ubuntu-latest
|
|
127
|
-
steps:
|
|
128
|
-
- name: Checkout repository
|
|
129
|
-
uses: actions/checkout@v4
|
|
130
|
-
- name: Setup Bun
|
|
131
|
-
uses: oven-sh/setup-bun@v2
|
|
132
|
-
with:
|
|
133
|
-
bun-version: latest
|
|
134
|
-
- name: Install dependencies
|
|
135
|
-
run: bun install --frozen-lockfile
|
|
136
|
-
- name: Rebuild OpenAPI spec and check for drift
|
|
137
|
-
run: |
|
|
138
|
-
bun run docs:openapi
|
|
139
|
-
if [ -n "$(git diff --name-only openapi.json)" ]; then
|
|
140
|
-
echo "::error::openapi.json is out of date! Run 'bun run docs:openapi' and commit the changes."
|
|
141
|
-
git diff --stat openapi.json
|
|
142
|
-
exit 1
|
|
143
|
-
fi
|
|
144
|
-
echo "OpenAPI spec is up to date."
|
|
145
|
-
- name: Check generated API docs for drift
|
|
146
|
-
run: |
|
|
147
|
-
if [ -n "$(git diff --name-only docs-site/content/docs/api-reference/)" ]; then
|
|
148
|
-
echo "::error::API reference docs are out of date! Run 'bun run docs:openapi' and commit the changes."
|
|
149
|
-
git diff --stat docs-site/content/docs/api-reference/
|
|
150
|
-
exit 1
|
|
151
|
-
fi
|
|
152
|
-
echo "API reference docs are up to date."
|
|
153
|
-
- name: Check for raw matchRoute usage
|
|
154
|
-
run: |
|
|
155
|
-
UNREGISTERED=$(grep -rn "matchRoute(" src/http/ --include="*.ts" | grep -v "route-def.ts" | grep -v "utils.ts" || true)
|
|
156
|
-
if [ -n "$UNREGISTERED" ]; then
|
|
157
|
-
echo "::error::Found raw matchRoute() calls. Convert to route() definitions:"
|
|
158
|
-
echo "$UNREGISTERED"
|
|
159
|
-
exit 1
|
|
160
|
-
fi
|
|
161
|
-
echo "No raw matchRoute() calls found."
|
|
162
|
-
|
|
163
|
-
docker-build:
|
|
164
|
-
name: Docker Build Test
|
|
165
|
-
needs: detect-changes
|
|
166
|
-
if: needs.detect-changes.outputs.code == 'true'
|
|
167
|
-
runs-on: ubuntu-latest
|
|
168
|
-
|
|
169
|
-
strategy:
|
|
170
|
-
matrix:
|
|
171
|
-
dockerfile: [Dockerfile, Dockerfile.worker]
|
|
172
|
-
|
|
173
|
-
steps:
|
|
174
|
-
- name: Checkout repository
|
|
175
|
-
uses: actions/checkout@v4
|
|
176
|
-
|
|
177
|
-
- name: Set up Docker Buildx
|
|
178
|
-
uses: docker/setup-buildx-action@v3
|
|
179
|
-
|
|
180
|
-
- name: Build Docker image
|
|
181
|
-
uses: docker/build-push-action@v5
|
|
182
|
-
with:
|
|
183
|
-
context: .
|
|
184
|
-
file: ./${{ matrix.dockerfile }}
|
|
185
|
-
push: false
|
|
186
|
-
tags: test-image:latest
|
|
187
|
-
|
|
188
|
-
new-ui-lint:
|
|
189
|
-
name: New UI Lint and Type Check
|
|
190
|
-
needs: detect-changes
|
|
191
|
-
if: needs.detect-changes.outputs.new-ui == 'true'
|
|
192
|
-
runs-on: ubuntu-latest
|
|
193
|
-
defaults:
|
|
194
|
-
run:
|
|
195
|
-
working-directory: new-ui
|
|
196
|
-
|
|
197
|
-
steps:
|
|
198
|
-
- name: Checkout repository
|
|
199
|
-
uses: actions/checkout@v4
|
|
200
|
-
|
|
201
|
-
- name: Setup Node.js
|
|
202
|
-
uses: actions/setup-node@v4
|
|
203
|
-
with:
|
|
204
|
-
node-version: 22
|
|
205
|
-
|
|
206
|
-
- name: Install pnpm
|
|
207
|
-
run: npm install -g pnpm
|
|
208
|
-
|
|
209
|
-
- name: Install dependencies
|
|
210
|
-
run: pnpm install --frozen-lockfile
|
|
211
|
-
|
|
212
|
-
- name: Run Biome linter
|
|
213
|
-
run: pnpm lint
|
|
214
|
-
|
|
215
|
-
- name: Run TypeScript type check
|
|
216
|
-
run: pnpm exec tsc --noEmit
|
|
217
|
-
|
|
218
|
-
gate:
|
|
219
|
-
name: Merge Gate
|
|
220
|
-
needs: [detect-changes, lint-and-typecheck, test, pi-skills-freshness, openapi-freshness, docker-build, new-ui-lint]
|
|
221
|
-
if: always()
|
|
222
|
-
runs-on: ubuntu-latest
|
|
223
|
-
|
|
224
|
-
steps:
|
|
225
|
-
- name: Check results
|
|
226
|
-
run: |
|
|
227
|
-
results='${{ toJSON(needs.*.result) }}'
|
|
228
|
-
echo "Job results: $results"
|
|
229
|
-
if echo "$results" | jq -e 'map(select(. != "success" and . != "skipped")) | length > 0' > /dev/null 2>&1; then
|
|
230
|
-
echo "::error::Some required jobs failed!"
|
|
231
|
-
exit 1
|
|
232
|
-
fi
|
|
233
|
-
echo "All jobs passed or were skipped."
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
// Entire CLI plugin for OpenCode
|
|
2
|
-
// Auto-generated by `entire enable --agent opencode`
|
|
3
|
-
// Do not edit manually — changes will be overwritten on next install.
|
|
4
|
-
// Requires Bun runtime (used by OpenCode's plugin system for loading ESM plugins).
|
|
5
|
-
import type { Plugin } from "@opencode-ai/plugin"
|
|
6
|
-
|
|
7
|
-
export const EntirePlugin: Plugin = async ({ $, directory }) => {
|
|
8
|
-
const ENTIRE_CMD = "entire"
|
|
9
|
-
// Track seen user messages to fire turn-start only once per message
|
|
10
|
-
const seenUserMessages = new Set<string>()
|
|
11
|
-
// Track current session ID for message events (which don't include sessionID)
|
|
12
|
-
let currentSessionID: string | null = null
|
|
13
|
-
// In-memory store for message metadata (role, tokens, etc.)
|
|
14
|
-
const messageStore = new Map<string, any>()
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Pipe JSON payload to an entire hooks command (async).
|
|
18
|
-
* Errors are logged but never thrown — plugin failures must not crash OpenCode.
|
|
19
|
-
*/
|
|
20
|
-
async function callHook(hookName: string, payload: Record<string, unknown>) {
|
|
21
|
-
try {
|
|
22
|
-
const json = JSON.stringify(payload)
|
|
23
|
-
await $`echo ${json} | ${ENTIRE_CMD} hooks opencode ${hookName}`.quiet().nothrow()
|
|
24
|
-
} catch {
|
|
25
|
-
// Silently ignore — plugin failures must not crash OpenCode
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Synchronous variant for hooks that fire near process exit (turn-end, session-end).
|
|
31
|
-
* `opencode run` breaks its event loop on the same session.status idle event that
|
|
32
|
-
* triggers turn-end. The async callHook would be killed before completing.
|
|
33
|
-
* Bun.spawnSync blocks the event loop, preventing exit until the hook finishes.
|
|
34
|
-
*/
|
|
35
|
-
function callHookSync(hookName: string, payload: Record<string, unknown>) {
|
|
36
|
-
try {
|
|
37
|
-
const json = JSON.stringify(payload)
|
|
38
|
-
Bun.spawnSync(["sh", "-c", `${ENTIRE_CMD} hooks opencode ${hookName}`], {
|
|
39
|
-
cwd: directory,
|
|
40
|
-
stdin: new TextEncoder().encode(json + "\n"),
|
|
41
|
-
stdout: "ignore",
|
|
42
|
-
stderr: "ignore",
|
|
43
|
-
})
|
|
44
|
-
} catch {
|
|
45
|
-
// Silently ignore — plugin failures must not crash OpenCode
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
event: async ({ event }) => {
|
|
51
|
-
switch (event.type) {
|
|
52
|
-
case "session.created": {
|
|
53
|
-
const session = (event as any).properties?.info
|
|
54
|
-
if (!session?.id) break
|
|
55
|
-
// Reset per-session tracking state when switching sessions.
|
|
56
|
-
if (currentSessionID !== session.id) {
|
|
57
|
-
seenUserMessages.clear()
|
|
58
|
-
messageStore.clear()
|
|
59
|
-
}
|
|
60
|
-
currentSessionID = session.id
|
|
61
|
-
await callHook("session-start", {
|
|
62
|
-
session_id: session.id,
|
|
63
|
-
})
|
|
64
|
-
break
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
case "message.updated": {
|
|
68
|
-
const msg = (event as any).properties?.info
|
|
69
|
-
if (!msg) break
|
|
70
|
-
// Store message metadata (role, time, tokens, etc.)
|
|
71
|
-
messageStore.set(msg.id, msg)
|
|
72
|
-
break
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
case "message.part.updated": {
|
|
76
|
-
const part = (event as any).properties?.part
|
|
77
|
-
if (!part?.messageID) break
|
|
78
|
-
|
|
79
|
-
// Fire turn-start on the first text part of a new user message
|
|
80
|
-
const msg = messageStore.get(part.messageID)
|
|
81
|
-
if (msg?.role === "user" && part.type === "text" && !seenUserMessages.has(msg.id)) {
|
|
82
|
-
seenUserMessages.add(msg.id)
|
|
83
|
-
const sessionID = msg.sessionID ?? currentSessionID
|
|
84
|
-
if (sessionID) {
|
|
85
|
-
await callHook("turn-start", {
|
|
86
|
-
session_id: sessionID,
|
|
87
|
-
prompt: part.text ?? "",
|
|
88
|
-
})
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
break
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
case "session.status": {
|
|
95
|
-
// session.status fires in both TUI and non-interactive (run) mode.
|
|
96
|
-
// session.idle is deprecated and not reliably emitted in run mode.
|
|
97
|
-
const props = (event as any).properties
|
|
98
|
-
if (props?.status?.type !== "idle") break
|
|
99
|
-
const sessionID = props?.sessionID
|
|
100
|
-
if (!sessionID) break
|
|
101
|
-
// Use sync variant: `opencode run` exits on the same idle event,
|
|
102
|
-
// so an async hook would be killed before completing.
|
|
103
|
-
callHookSync("turn-end", {
|
|
104
|
-
session_id: sessionID,
|
|
105
|
-
})
|
|
106
|
-
break
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
case "session.compacted": {
|
|
110
|
-
const sessionID = (event as any).properties?.sessionID
|
|
111
|
-
if (!sessionID) break
|
|
112
|
-
await callHook("compaction", {
|
|
113
|
-
session_id: sessionID,
|
|
114
|
-
})
|
|
115
|
-
break
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
case "session.deleted": {
|
|
119
|
-
const session = (event as any).properties?.info
|
|
120
|
-
if (!session?.id) break
|
|
121
|
-
seenUserMessages.clear()
|
|
122
|
-
messageStore.clear()
|
|
123
|
-
currentSessionID = null
|
|
124
|
-
// Use sync variant: session-end may fire during shutdown.
|
|
125
|
-
callHookSync("session-end", {
|
|
126
|
-
session_id: session.id,
|
|
127
|
-
})
|
|
128
|
-
break
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
}
|
|
133
|
-
}
|
package/.superset/config.json
DELETED
package/.wts-config.json
DELETED
package/.wts-setup.ts
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
// wts setup script - runs after worktree creation
|
|
3
|
-
//
|
|
4
|
-
// Environment variables:
|
|
5
|
-
// WTS_WORKTREE_PATH - path to the new worktree (also the working directory)
|
|
6
|
-
// WTS_GIT_ROOT - path to the main repository root
|
|
7
|
-
|
|
8
|
-
import { exists, mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
9
|
-
import { join, basename } from "node:path";
|
|
10
|
-
|
|
11
|
-
const worktreePath = process.env.WTS_WORKTREE_PATH!;
|
|
12
|
-
const gitRoot = process.env.WTS_GIT_ROOT!;
|
|
13
|
-
const worktreeName = basename(worktreePath);
|
|
14
|
-
|
|
15
|
-
console.log(`Setting up worktree "${worktreeName}" at ${worktreePath}...`);
|
|
16
|
-
|
|
17
|
-
// Pick a random available port in 3100-3999
|
|
18
|
-
async function getRandomPort(maxAttempts = 10): Promise<number> {
|
|
19
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
20
|
-
const port = 3100 + Math.floor(Math.random() * 900);
|
|
21
|
-
const available = await isPortAvailable(port);
|
|
22
|
-
if (available) return port;
|
|
23
|
-
}
|
|
24
|
-
// Final fallback: hash-based port from worktree name
|
|
25
|
-
let hash = 0;
|
|
26
|
-
for (const char of worktreeName) {
|
|
27
|
-
hash = ((hash << 5) - hash + char.charCodeAt(0)) | 0;
|
|
28
|
-
}
|
|
29
|
-
return 3100 + (Math.abs(hash) % 900);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
async function isPortAvailable(port: number): Promise<boolean> {
|
|
33
|
-
try {
|
|
34
|
-
const result = await Bun.$`lsof -i :${port} -t`.quiet();
|
|
35
|
-
// If lsof returns output, port is in use
|
|
36
|
-
return result.stdout.toString().trim() === "";
|
|
37
|
-
} catch {
|
|
38
|
-
// lsof exits non-zero when nothing found — port is available
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// --- Copy and configure .env ---
|
|
44
|
-
const mainEnv = join(gitRoot, ".env");
|
|
45
|
-
const envExample = join(worktreePath, ".env.example");
|
|
46
|
-
const targetEnv = join(worktreePath, ".env");
|
|
47
|
-
|
|
48
|
-
// Read main .env to detect portless mode
|
|
49
|
-
const mainEnvContent = (await exists(mainEnv))
|
|
50
|
-
? await readFile(mainEnv, "utf-8")
|
|
51
|
-
: (await exists(envExample))
|
|
52
|
-
? await readFile(envExample, "utf-8")
|
|
53
|
-
: "";
|
|
54
|
-
|
|
55
|
-
const isPortless = mainEnvContent.includes("localhost:1355");
|
|
56
|
-
const slug = worktreeName.replace(/[^a-z0-9-]/gi, "-").toLowerCase();
|
|
57
|
-
|
|
58
|
-
if (isPortless) {
|
|
59
|
-
console.log(`Portless mode: using ${slug}.api.swarm.localhost:1355`);
|
|
60
|
-
} else {
|
|
61
|
-
console.log(`Port mode: allocating unique port`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const port = isPortless ? 0 : await getRandomPort();
|
|
65
|
-
const uiPort = isPortless ? 0 : port + 1000;
|
|
66
|
-
|
|
67
|
-
if (!isPortless) {
|
|
68
|
-
console.log(`Using port ${port} for this worktree`);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (mainEnvContent) {
|
|
72
|
-
console.log(
|
|
73
|
-
(await exists(mainEnv))
|
|
74
|
-
? "Copying .env from main repo..."
|
|
75
|
-
: "Creating .env from .env.example...",
|
|
76
|
-
);
|
|
77
|
-
let envContent = mainEnvContent;
|
|
78
|
-
|
|
79
|
-
if (isPortless) {
|
|
80
|
-
// Rewrite portless URLs with worktree subdomain
|
|
81
|
-
envContent = envContent.replace(
|
|
82
|
-
/(MCP_BASE_URL=https?:\/\/)([\w.-]*)(api\.swarm\.localhost:1355)/m,
|
|
83
|
-
`$1${slug}.$3`,
|
|
84
|
-
);
|
|
85
|
-
envContent = envContent.replace(
|
|
86
|
-
/(APP_URL=https?:\/\/)([\w.-]*)(ui\.swarm\.localhost:1355)/m,
|
|
87
|
-
`$1${slug}.$3`,
|
|
88
|
-
);
|
|
89
|
-
envContent = envContent.replace(
|
|
90
|
-
/(LINEAR_REDIRECT_URI=https?:\/\/)([\w.-]*)(api\.swarm\.localhost:1355)/m,
|
|
91
|
-
`$1${slug}.$3`,
|
|
92
|
-
);
|
|
93
|
-
} else {
|
|
94
|
-
// Port-based rewriting (existing logic)
|
|
95
|
-
envContent = envContent.replace(/^PORT=\d+/m, `PORT=${port}`);
|
|
96
|
-
envContent = envContent.replace(/:\d+/g, `:${port}`);
|
|
97
|
-
envContent = envContent.replace(
|
|
98
|
-
/APP_URL=http:\/\/localhost:\d+/m,
|
|
99
|
-
`APP_URL=http://localhost:${uiPort}`,
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
await writeFile(targetEnv, envContent);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// --- Copy and configure .mcp.json ---
|
|
107
|
-
const mainMcp = join(gitRoot, ".mcp.json");
|
|
108
|
-
const targetMcp = join(worktreePath, ".mcp.json");
|
|
109
|
-
|
|
110
|
-
if (await exists(mainMcp)) {
|
|
111
|
-
console.log("Copying .mcp.json with updated URL...");
|
|
112
|
-
let mcpContent = await readFile(mainMcp, "utf-8");
|
|
113
|
-
|
|
114
|
-
if (isPortless) {
|
|
115
|
-
mcpContent = mcpContent.replace(
|
|
116
|
-
/https?:\/\/[\w.-]*api\.swarm\.localhost:1355/g,
|
|
117
|
-
`https://${slug}.api.swarm.localhost:1355`,
|
|
118
|
-
);
|
|
119
|
-
} else {
|
|
120
|
-
mcpContent = mcpContent.replace(/localhost:\d+/g, `localhost:${port}`);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
await writeFile(targetMcp, mcpContent);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const mainQa = join(gitRoot, ".qa-use-tests.json");
|
|
127
|
-
const targetQa = join(worktreePath, ".qa-use-tests.json");
|
|
128
|
-
|
|
129
|
-
if (await exists(mainQa)) {
|
|
130
|
-
console.log("Copying .qa-use-tests.json...");
|
|
131
|
-
let qaContent = await readFile(mainQa, "utf-8");
|
|
132
|
-
await writeFile(targetQa, qaContent);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// --- Copy .claude directory ---
|
|
136
|
-
const mainClaude = join(gitRoot, ".claude");
|
|
137
|
-
const targetClaude = join(worktreePath, ".claude");
|
|
138
|
-
|
|
139
|
-
if (await exists(mainClaude)) {
|
|
140
|
-
console.log("Copying .claude directory...");
|
|
141
|
-
await mkdir(targetClaude, { recursive: true });
|
|
142
|
-
const files = await readdir(mainClaude);
|
|
143
|
-
for (const file of files) {
|
|
144
|
-
const content = await readFile(join(mainClaude, file));
|
|
145
|
-
await writeFile(join(targetClaude, file), content);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// --- Copy docker env files if they exist ---
|
|
150
|
-
const dockerEnvFiles = [".env.docker", ".env.docker-lead"];
|
|
151
|
-
for (const envFile of dockerEnvFiles) {
|
|
152
|
-
const mainDockerEnv = join(gitRoot, envFile);
|
|
153
|
-
const targetDockerEnv = join(worktreePath, envFile);
|
|
154
|
-
if (await exists(mainDockerEnv)) {
|
|
155
|
-
console.log(`Copying ${envFile}...`);
|
|
156
|
-
await Bun.$`cp ${mainDockerEnv} ${targetDockerEnv}`;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// --- Install dependencies ---
|
|
161
|
-
console.log("Installing dependencies...");
|
|
162
|
-
await Bun.$`bun install`;
|
|
163
|
-
|
|
164
|
-
if (isPortless) {
|
|
165
|
-
console.log(`\nSetup complete! Worktree using portless subdomain: ${slug}`);
|
|
166
|
-
console.log(`API: https://${slug}.api.swarm.localhost:1355`);
|
|
167
|
-
console.log(`UI: https://${slug}.ui.swarm.localhost:1355`);
|
|
168
|
-
} else {
|
|
169
|
-
console.log(`\nSetup complete! Worktree running on port ${port}`);
|
|
170
|
-
}
|
|
171
|
-
console.log(`Start the server with: bun run dev:http`);
|