crewswarm 0.8.1-beta
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/.env.example +155 -0
- package/LICENSE +21 -0
- package/README.md +316 -0
- package/apps/dashboard/dist/assets/chat-core-BwSoInmZ.js +1 -0
- package/apps/dashboard/dist/assets/chat-core-BwSoInmZ.js.br +0 -0
- package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js +1 -0
- package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js.br +0 -0
- package/apps/dashboard/dist/assets/components-CSUb80ze.js +1 -0
- package/apps/dashboard/dist/assets/components-CSUb80ze.js.br +0 -0
- package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js +1 -0
- package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js.br +0 -0
- package/apps/dashboard/dist/assets/index-CF0aJRtC.css +1 -0
- package/apps/dashboard/dist/assets/index-CF0aJRtC.css.br +0 -0
- package/apps/dashboard/dist/assets/index-Px49zu76.js +2 -0
- package/apps/dashboard/dist/assets/index-Px49zu76.js.br +0 -0
- package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js +1 -0
- package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js.br +0 -0
- package/apps/dashboard/dist/assets/setup-wizard-i3eEixlo.js +1 -0
- package/apps/dashboard/dist/assets/setup-wizard-i3eEixlo.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-agents-tab-BThdsdJY.js +1 -0
- package/apps/dashboard/dist/assets/tab-agents-tab-BThdsdJY.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-benchmarks-tab-DfCuAClu.js +1 -0
- package/apps/dashboard/dist/assets/tab-comms-tab-eHpOSBhG.js +1 -0
- package/apps/dashboard/dist/assets/tab-comms-tab-eHpOSBhG.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-contacts-tab-yEegNyO4.js +1 -0
- package/apps/dashboard/dist/assets/tab-contacts-tab-yEegNyO4.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-engines-tab-C3DYxTwy.js +1 -0
- package/apps/dashboard/dist/assets/tab-engines-tab-C3DYxTwy.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-memory-tab-C59BYFQD.js +1 -0
- package/apps/dashboard/dist/assets/tab-memory-tab-C59BYFQD.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-models-tab-9Ur7pXWA.js +1 -0
- package/apps/dashboard/dist/assets/tab-models-tab-9Ur7pXWA.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-pm-loop-tab-D7mnDelU.js +1 -0
- package/apps/dashboard/dist/assets/tab-pm-loop-tab-D7mnDelU.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-projects-tab-C6h2Mv1K.js +1 -0
- package/apps/dashboard/dist/assets/tab-projects-tab-C6h2Mv1K.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-prompts-tab-C0wZvWK3.js +1 -0
- package/apps/dashboard/dist/assets/tab-prompts-tab-C0wZvWK3.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-services-tab-DBj_w3bc.js +1 -0
- package/apps/dashboard/dist/assets/tab-services-tab-DBj_w3bc.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-settings-tab-ezeqAjZk.js +1 -0
- package/apps/dashboard/dist/assets/tab-settings-tab-ezeqAjZk.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-skills-tab-BYdU2whk.js +1 -0
- package/apps/dashboard/dist/assets/tab-skills-tab-BYdU2whk.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-spending-tab-Bg6w9t_p.js +1 -0
- package/apps/dashboard/dist/assets/tab-spending-tab-Bg6w9t_p.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BBV9HB2X.js +1 -0
- package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BBV9HB2X.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-swarm-tab-ChqLlEVs.js +1 -0
- package/apps/dashboard/dist/assets/tab-swarm-tab-ChqLlEVs.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-usage-tab-B2UWXenJ.js +1 -0
- package/apps/dashboard/dist/assets/tab-usage-tab-B2UWXenJ.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js +1 -0
- package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-workflows-tab-6QSXLJ0i.js +1 -0
- package/apps/dashboard/dist/assets/tab-workflows-tab-6QSXLJ0i.js.br +0 -0
- package/apps/dashboard/dist/favicon.png +0 -0
- package/apps/dashboard/dist/index.html +6466 -0
- package/apps/dashboard/dist/index.html.br +0 -0
- package/apps/dashboard/dist/index.html.gz +0 -0
- package/apps/dashboard/dist/signup.html +446 -0
- package/apps/dashboard/index.html +6442 -0
- package/apps/dashboard/package.json +15 -0
- package/apps/dashboard/src/app.js +2823 -0
- package/apps/dashboard/src/app.js.br +0 -0
- package/apps/dashboard/src/app.js.gz +0 -0
- package/apps/dashboard/src/chat/chat-actions.js +1847 -0
- package/apps/dashboard/src/chat/chat-actions.js.br +0 -0
- package/apps/dashboard/src/chat/unified-messages.js +327 -0
- package/apps/dashboard/src/chat/unified-messages.js.br +0 -0
- package/apps/dashboard/src/cli-process.js +208 -0
- package/apps/dashboard/src/cli-process.js.br +0 -0
- package/apps/dashboard/src/cli-process.js.gz +0 -0
- package/apps/dashboard/src/components/active-tasks-panel.js +175 -0
- package/apps/dashboard/src/components/active-tasks-panel.js.br +0 -0
- package/apps/dashboard/src/core/api.js +18 -0
- package/apps/dashboard/src/core/api.js.br +0 -0
- package/apps/dashboard/src/core/dom.js +220 -0
- package/apps/dashboard/src/core/dom.js.br +0 -0
- package/apps/dashboard/src/core/state.js +91 -0
- package/apps/dashboard/src/core/state.js.br +0 -0
- package/apps/dashboard/src/core/task-manager.js +134 -0
- package/apps/dashboard/src/core/task-manager.js.br +0 -0
- package/apps/dashboard/src/orchestration-status.js +127 -0
- package/apps/dashboard/src/orchestration-status.js.br +0 -0
- package/apps/dashboard/src/setup-wizard.js +555 -0
- package/apps/dashboard/src/setup-wizard.js.br +0 -0
- package/apps/dashboard/src/styles.css +2085 -0
- package/apps/dashboard/src/styles.css.br +0 -0
- package/apps/dashboard/src/styles.css.gz +0 -0
- package/apps/dashboard/src/tabs/agents-tab.js +2237 -0
- package/apps/dashboard/src/tabs/agents-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/benchmarks-tab.js +229 -0
- package/apps/dashboard/src/tabs/benchmarks-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/comms-tab.js +955 -0
- package/apps/dashboard/src/tabs/comms-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/contacts-tab.js +654 -0
- package/apps/dashboard/src/tabs/contacts-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/engines-tab.js +175 -0
- package/apps/dashboard/src/tabs/engines-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/memory-tab.js +182 -0
- package/apps/dashboard/src/tabs/memory-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/models-tab.js +441 -0
- package/apps/dashboard/src/tabs/models-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/pm-loop-tab.js +185 -0
- package/apps/dashboard/src/tabs/pm-loop-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/projects-tab.js +663 -0
- package/apps/dashboard/src/tabs/projects-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/projects-tab.js.gz +0 -0
- package/apps/dashboard/src/tabs/prompts-tab.js +160 -0
- package/apps/dashboard/src/tabs/prompts-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/services-tab.js +202 -0
- package/apps/dashboard/src/tabs/services-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/settings-tab.js +803 -0
- package/apps/dashboard/src/tabs/settings-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/skills-tab.js +284 -0
- package/apps/dashboard/src/tabs/skills-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/spending-tab.js +173 -0
- package/apps/dashboard/src/tabs/spending-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/swarm-chat-tab.js +660 -0
- package/apps/dashboard/src/tabs/swarm-chat-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/swarm-tab.js +538 -0
- package/apps/dashboard/src/tabs/swarm-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/usage-tab.js +390 -0
- package/apps/dashboard/src/tabs/usage-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/waves-tab.js +238 -0
- package/apps/dashboard/src/tabs/waves-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/workflows-tab.js +747 -0
- package/apps/dashboard/src/tabs/workflows-tab.js.br +0 -0
- package/apps/vibe/.crew/agent-memory/pipeline.json +249 -0
- package/apps/vibe/.crew/cost.json +17 -0
- package/apps/vibe/.crew/json-parse-metrics.jsonl +22 -0
- package/apps/vibe/.crew/pipeline-metrics.jsonl +22 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-0f90c392-2425-4ae5-850c-bd9d17b1d690.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-1c269dd9-a63f-4fba-af81-5cf08048ef06.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-288a7765-da24-4a22-89bc-1f3cc9b0562c.jsonl +1 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-2c78fd22-a657-4bd1-bc49-0679fb384409.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-3e6fe08d-3264-404a-8df3-aab7efef10e7.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-42eec610-57fe-4e09-9e7e-b315038495c2.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-4438eb4c-ae13-42b1-90e2-b043d8983be8.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-4740a9f5-86e7-44b6-a394-de433e291727.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-49e1da6a-957e-48fd-9220-415019e4f8e2.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-4c9251db-be68-427b-a3fc-a264f2b5778d.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-65e29a57-664d-4196-8109-017e364f182e.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-6aa04bc5-9593-4b1f-b58d-3bf2978cb602.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-6e1cba53-9b70-457e-99e0-59199149dd21.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-749f41cc-4dac-4204-be64-873a6080a0d2.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-74d68121-e181-4864-bd9a-c3211341dfaf.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-8509bc24-142d-4e07-b44a-a50bf99d1103.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-960339c6-07ca-43ce-9900-f6e1702b39b9.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-9c6480a9-7031-4146-b241-825b9a2d1de1.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-9fd42426-8492-4157-9d5f-e1537c060489.jsonl +2 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-ad6d40a3-2f5e-46a9-a345-47caaccc51aa.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-bc606133-8d5b-4535-8d85-f1a29cdaa981.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-c1a13ccd-634a-4d01-a4a7-1177b8a752ff.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-c7d27b42-249e-4bd4-8f26-6aa998110b8a.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-cca2e9b9-4a34-4d25-a311-5c793fa7e91e.jsonl +5 -0
- package/apps/vibe/.crew/sandbox.json +7 -0
- package/apps/vibe/.crew/session.json +285 -0
- package/apps/vibe/.crew/training-data.jsonl +0 -0
- package/apps/vibe/.github/workflows/studio-quality.yml +37 -0
- package/apps/vibe/.studio-data/project-messages/chuck-norris.jsonl +12 -0
- package/apps/vibe/.studio-data/project-messages/general.jsonl +54 -0
- package/apps/vibe/.studio-data/project-messages/studio-local.jsonl +10 -0
- package/apps/vibe/ARCHITECTURE.md +3393 -0
- package/apps/vibe/QUICK-REFERENCE.md +211 -0
- package/apps/vibe/README.md +76 -0
- package/apps/vibe/ROADMAP.md +41 -0
- package/apps/vibe/STUDIO-SETUP-COMPLETE.md +35 -0
- package/apps/vibe/VISUAL-GUIDE.md +378 -0
- package/apps/vibe/capture-demo.mjs +160 -0
- package/apps/vibe/capture-vibe-assets.mjs +71 -0
- package/apps/vibe/capture-vibe-video.mjs +260 -0
- package/apps/vibe/check-buttons.js +41 -0
- package/apps/vibe/diagnose.html +106 -0
- package/apps/vibe/fix-buttons.js +103 -0
- package/apps/vibe/index.html +3401 -0
- package/apps/vibe/package-lock.json +920 -0
- package/apps/vibe/package.json +31 -0
- package/apps/vibe/public/favicon.png +0 -0
- package/apps/vibe/scripts/studio-pty-host.py +117 -0
- package/apps/vibe/server.mjs +1835 -0
- package/apps/vibe/src/main.js +2846 -0
- package/apps/vibe/src/register-all-languages.js +98 -0
- package/apps/vibe/start-studio.sh +11 -0
- package/apps/vibe/test/accessibility-tests.js +77 -0
- package/apps/vibe/test/browser-performance-audit.mjs +205 -0
- package/apps/vibe/test/performance-tests.js +120 -0
- package/apps/vibe/test/security-tests.js +213 -0
- package/apps/vibe/tests/e2e.local.mjs +54 -0
- package/apps/vibe/tests/server.smoke.mjs +106 -0
- package/apps/vibe/update_website.mjs +74 -0
- package/apps/vibe/vite.config.js +19 -0
- package/apps/vibe/watch-server.mjs +108 -0
- package/contrib/openclaw-plugin/README.md +199 -0
- package/contrib/openclaw-plugin/index.ts +306 -0
- package/contrib/openclaw-plugin/openclaw.plugin.json +41 -0
- package/contrib/openclaw-plugin/package.json +27 -0
- package/contrib/openclaw-plugin/skills/crewswarm/SKILL.md +88 -0
- package/crew-lead.mjs +649 -0
- package/engines/claude-code.json +36 -0
- package/engines/codex.json +37 -0
- package/engines/crew-cli.json +42 -0
- package/engines/cursor.json +40 -0
- package/engines/docker-sandbox.json +38 -0
- package/engines/gemini-cli.json +75 -0
- package/engines/opencode.json +31 -0
- package/gateway-bridge.mjs +1575 -0
- package/install.sh +738 -0
- package/lib/agent-registry.mjs +232 -0
- package/lib/agents/daemon.mjs +121 -0
- package/lib/agents/dispatch.mjs +225 -0
- package/lib/agents/permissions.mjs +90 -0
- package/lib/agents/platform-formatting.mjs +102 -0
- package/lib/agents/registry.mjs +81 -0
- package/lib/agents/tool-instructions.mjs +257 -0
- package/lib/agents/validation.mjs +75 -0
- package/lib/approval/policy-manager.mjs +221 -0
- package/lib/autoharness/index.mjs +391 -0
- package/lib/bridges/cli-executor.mjs +332 -0
- package/lib/bridges/gateway-ws.mjs +345 -0
- package/lib/bridges/integration.mjs +229 -0
- package/lib/bridges/rag-helper.mjs +90 -0
- package/lib/browser/opencode-passthrough-filter.js +44 -0
- package/lib/browser/passthrough-stderr.js +109 -0
- package/lib/chat/autonomous-mentions.mjs +373 -0
- package/lib/chat/history.mjs +82 -0
- package/lib/chat/mention-routing-intent.mjs +136 -0
- package/lib/chat/participants.mjs +95 -0
- package/lib/chat/project-messages-rag.mjs +265 -0
- package/lib/chat/project-messages.mjs +479 -0
- package/lib/chat/shared-chat-prompt-overlay.mjs +52 -0
- package/lib/chat/thread-binding.mjs +34 -0
- package/lib/chat/unified-history.mjs +223 -0
- package/lib/chat/unified-wrapper.mjs +41 -0
- package/lib/cli-process-tracker.mjs +228 -0
- package/lib/collections/index.mjs +433 -0
- package/lib/contacts/identity-linker.mjs +248 -0
- package/lib/contacts/index.mjs +341 -0
- package/lib/crew-judge/PROMPT.md +93 -0
- package/lib/crew-judge/judge.mjs +260 -0
- package/lib/crew-lead/agent-manager.mjs +125 -0
- package/lib/crew-lead/background.mjs +270 -0
- package/lib/crew-lead/brain.mjs +110 -0
- package/lib/crew-lead/chat-handler.mjs +2603 -0
- package/lib/crew-lead/chat-handler.mjs.bak +1274 -0
- package/lib/crew-lead/classifier.mjs +83 -0
- package/lib/crew-lead/http-server.mjs +4824 -0
- package/lib/crew-lead/intent.mjs +102 -0
- package/lib/crew-lead/interval-manager.mjs +41 -0
- package/lib/crew-lead/llm-caller.mjs +544 -0
- package/lib/crew-lead/prompts.mjs +392 -0
- package/lib/crew-lead/retry-manager.mjs +118 -0
- package/lib/crew-lead/tools.mjs +318 -0
- package/lib/crew-lead/wave-dispatcher.mjs +798 -0
- package/lib/crew-lead/waves-config.json +73 -0
- package/lib/crew-lead/waves-loader.mjs +110 -0
- package/lib/crew-lead/ws-router.mjs +428 -0
- package/lib/dispatch/parsers.mjs +299 -0
- package/lib/domain-planning/detector.mjs +196 -0
- package/lib/domain-planning/prompts/crew-pm-cli.md +96 -0
- package/lib/domain-planning/prompts/crew-pm-core.md +122 -0
- package/lib/domain-planning/prompts/crew-pm-frontend.md +111 -0
- package/lib/engines/crew-cli-sandbox.mjs +422 -0
- package/lib/engines/crew-cli.mjs +155 -0
- package/lib/engines/cursor-launcher.mjs +110 -0
- package/lib/engines/engine-registry.mjs +253 -0
- package/lib/engines/llm-direct.mjs +184 -0
- package/lib/engines/opencode.mjs +256 -0
- package/lib/engines/ouroboros.mjs +114 -0
- package/lib/engines/rt-envelope.mjs +1643 -0
- package/lib/engines/rt-envelope.mjs.backup-current +870 -0
- package/lib/engines/runners.mjs +1367 -0
- package/lib/gemini-cli-passthrough-noise.mjs +37 -0
- package/lib/integrations/code-search.mjs +259 -0
- package/lib/integrations/greptile.mjs +148 -0
- package/lib/integrations/multimodal.mjs +313 -0
- package/lib/integrations/telegram-streaming.mjs +153 -0
- package/lib/integrations/tts.mjs +312 -0
- package/lib/integrations/twitter-links.mjs +294 -0
- package/lib/memory/shared-adapter.mjs +296 -0
- package/lib/pipeline/manager.mjs +539 -0
- package/lib/preferences/extractor.mjs +347 -0
- package/lib/project-dir.mjs +20 -0
- package/lib/runtime/config.mjs +388 -0
- package/lib/runtime/dlq.mjs +170 -0
- package/lib/runtime/log-rotation.mjs +82 -0
- package/lib/runtime/logger.mjs +58 -0
- package/lib/runtime/memory.mjs +421 -0
- package/lib/runtime/paths.mjs +76 -0
- package/lib/runtime/project-dir.mjs +127 -0
- package/lib/runtime/spending.mjs +204 -0
- package/lib/runtime/startup-guard.mjs +291 -0
- package/lib/runtime/task-lease.mjs +234 -0
- package/lib/runtime/telemetry-schema.mjs +208 -0
- package/lib/runtime/telemetry.mjs +101 -0
- package/lib/runtime/utils.mjs +64 -0
- package/lib/skills/index.mjs +265 -0
- package/lib/tools/browser.mjs +135 -0
- package/lib/tools/executor.mjs +913 -0
- package/lib/types.d.ts +57 -0
- package/package.json +106 -0
- package/pm-loop.mjs +1626 -0
- package/prompts/coder-back.md +27 -0
- package/prompts/coder-front.md +27 -0
- package/prompts/coder.md +28 -0
- package/prompts/copywriter.md +17 -0
- package/prompts/fixer.md +39 -0
- package/prompts/frontend.md +23 -0
- package/prompts/github.md +24 -0
- package/prompts/main.md +39 -0
- package/prompts/pm-cli.md +95 -0
- package/prompts/pm-core.md +121 -0
- package/prompts/pm-frontend.md +110 -0
- package/prompts/pm.md +234 -0
- package/prompts/qa.md +44 -0
- package/prompts/security.md +19 -0
- package/scripts/build-crew-chat.sh +28 -0
- package/scripts/build-llms-full.mjs +52 -0
- package/scripts/chatmock-login.sh +16 -0
- package/scripts/chatmock-serve.sh +16 -0
- package/scripts/check-dashboard.mjs +88 -0
- package/scripts/crew-scribe.mjs +326 -0
- package/scripts/dashboard-helpers.mjs +391 -0
- package/scripts/dashboard-validation.mjs +198 -0
- package/scripts/dashboard.mjs +9717 -0
- package/scripts/dlq-replay.mjs +61 -0
- package/scripts/doctor.mjs +196 -0
- package/scripts/file-lock.mjs +186 -0
- package/scripts/fresh-machine-smoke.sh +323 -0
- package/scripts/generate-changelog.mjs +227 -0
- package/scripts/generate-openapi.mjs +334 -0
- package/scripts/health-check.mjs +229 -0
- package/scripts/install-docker.sh +213 -0
- package/scripts/mcp-server.mjs +1625 -0
- package/scripts/opencrew-rt-daemon.mjs +568 -0
- package/scripts/openswitchctl +646 -0
- package/scripts/refactor-configs.mjs +39 -0
- package/scripts/release-check.sh +46 -0
- package/scripts/resolve-node-bin.sh +25 -0
- package/scripts/restart-all-from-repo.sh +329 -0
- package/scripts/restart-crew-lead.sh +98 -0
- package/scripts/restart-dashboard.sh +104 -0
- package/scripts/restart-service.sh +274 -0
- package/scripts/run-accessibility-audit.mjs +356 -0
- package/scripts/run-integration-bounded.mjs +188 -0
- package/scripts/run-scheduled-pipeline.mjs +230 -0
- package/scripts/run.mjs +41 -0
- package/scripts/scan-skills.mjs +79 -0
- package/scripts/setup-firewall.sh +128 -0
- package/scripts/smoke-dispatch.mjs +149 -0
- package/scripts/smoke.sh +163 -0
- package/scripts/start-crew.mjs +328 -0
- package/scripts/start.mjs +146 -0
- package/scripts/swiftbar-restart-service.sh +19 -0
- package/scripts/sync-agents.mjs +152 -0
- package/scripts/sync-prompts.mjs +79 -0
- package/scripts/validate-config.mjs +337 -0
- package/scripts/wow.mjs +89 -0
- package/telegram-bridge.mjs +2421 -0
- package/unified-orchestrator.mjs +519 -0
- package/whatsapp-bridge.mjs +1481 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
|
|
5
|
+
console.log('Beginning config path consolidation...');
|
|
6
|
+
|
|
7
|
+
// 1. Files containing config.json
|
|
8
|
+
const filesRaw = execSync('git grep -l "config.json" || true').toString().split('\n').filter(Boolean);
|
|
9
|
+
let updatedCount = 0;
|
|
10
|
+
|
|
11
|
+
for (const file of filesRaw) {
|
|
12
|
+
// skip package.json, lock files, and this very script
|
|
13
|
+
if (file.includes('package') || file.includes('refactor-configs.mjs') || file.includes('CHANGELOG.md')) continue;
|
|
14
|
+
|
|
15
|
+
const fullPath = path.resolve(process.cwd(), file);
|
|
16
|
+
if (!fs.existsSync(fullPath)) continue;
|
|
17
|
+
|
|
18
|
+
let content = fs.readFileSync(fullPath, 'utf8');
|
|
19
|
+
const og = content;
|
|
20
|
+
|
|
21
|
+
// Replace direct string paths
|
|
22
|
+
content = content.replace(/\.crewswarm[\/\\]config\.json/g, '.crewswarm/crewswarm.json');
|
|
23
|
+
|
|
24
|
+
// Replace path.join(..., "config.json") -> path.join(..., "crewswarm.json")
|
|
25
|
+
// We only replace "config.json" exactly.
|
|
26
|
+
content = content.replace(/"config\.json"/g, '"crewswarm.json"');
|
|
27
|
+
content = content.replace(/'config\.json'/g, "'crewswarm.json'");
|
|
28
|
+
|
|
29
|
+
// Also handle `config.json` in markdown text
|
|
30
|
+
content = content.replace(/`~\/\.crewswarm\/config\.json`/g, '`~/.crewswarm/crewswarm.json`');
|
|
31
|
+
|
|
32
|
+
if (content !== og) {
|
|
33
|
+
fs.writeFileSync(fullPath, content);
|
|
34
|
+
console.log(`Updated ${file}`);
|
|
35
|
+
updatedCount++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
console.log(`Successfully updated ${updatedCount} files to use crewswarm.json contextually.`);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Lightweight public-release checklist runner.
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# bash scripts/release-check.sh
|
|
6
|
+
# bash scripts/release-check.sh --full
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
11
|
+
cd "$REPO_DIR"
|
|
12
|
+
|
|
13
|
+
FULL=0
|
|
14
|
+
for arg in "$@"; do
|
|
15
|
+
[[ "$arg" == "--full" ]] && FULL=1
|
|
16
|
+
done
|
|
17
|
+
|
|
18
|
+
echo ""
|
|
19
|
+
echo "━━━ crewswarm release check ━━━"
|
|
20
|
+
echo "repo: $REPO_DIR"
|
|
21
|
+
echo "date: $(date)"
|
|
22
|
+
|
|
23
|
+
echo ""
|
|
24
|
+
echo "1. Doctor"
|
|
25
|
+
npm run doctor
|
|
26
|
+
|
|
27
|
+
echo ""
|
|
28
|
+
echo "2. Static smoke"
|
|
29
|
+
bash scripts/smoke.sh --no-build
|
|
30
|
+
|
|
31
|
+
echo ""
|
|
32
|
+
echo "3. Health"
|
|
33
|
+
if [[ "${CI:-}" == "true" ]]; then
|
|
34
|
+
npm run health -- --quiet --no-services
|
|
35
|
+
else
|
|
36
|
+
npm run health -- --quiet
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
if [[ "$FULL" -eq 1 ]]; then
|
|
40
|
+
echo ""
|
|
41
|
+
echo "4. Live dispatch smoke"
|
|
42
|
+
npm run smoke
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
echo ""
|
|
46
|
+
echo "Release check passed."
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
if [[ -n "${NODE:-}" && -x "${NODE}" ]]; then
|
|
4
|
+
printf "%s\n" "$NODE"
|
|
5
|
+
exit 0
|
|
6
|
+
fi
|
|
7
|
+
|
|
8
|
+
for candidate in \
|
|
9
|
+
"/usr/local/opt/node/bin/node" \
|
|
10
|
+
"/opt/homebrew/opt/node/bin/node" \
|
|
11
|
+
"/usr/local/bin/node" \
|
|
12
|
+
"/opt/homebrew/bin/node"
|
|
13
|
+
do
|
|
14
|
+
if [[ -x "$candidate" ]]; then
|
|
15
|
+
printf "%s\n" "$candidate"
|
|
16
|
+
exit 0
|
|
17
|
+
fi
|
|
18
|
+
done
|
|
19
|
+
|
|
20
|
+
if command -v node >/dev/null 2>&1; then
|
|
21
|
+
command -v node
|
|
22
|
+
exit 0
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
exit 1
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Restart the full crewswarm stack using only repo scripts (OpenCode, RT daemon, gateways, crew-lead, dashboard, Vibe, watch).
|
|
3
|
+
# Run from repo root: ./scripts/restart-all-from-repo.sh
|
|
4
|
+
# Optional: --no-dashboard skip dashboard
|
|
5
|
+
# --no-studio skip Vibe + file watcher
|
|
6
|
+
# --no-bridges skip Telegram + WhatsApp bridges
|
|
7
|
+
|
|
8
|
+
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
9
|
+
cd "$REPO_DIR"
|
|
10
|
+
export CREWSWARM_DIR="$REPO_DIR"
|
|
11
|
+
export OPENCLAW_DIR="$REPO_DIR" # backward compat for scripts that only check this
|
|
12
|
+
export NODE="$("$REPO_DIR/scripts/resolve-node-bin.sh")"
|
|
13
|
+
# Work around intermittent Node 24/25 ESM loader crashes (`Unknown system error -11, read`)
|
|
14
|
+
# seen in the RT daemon and Vibe startup paths on this machine.
|
|
15
|
+
export NODE_DISABLE_COMPILE_CACHE="${NODE_DISABLE_COMPILE_CACHE:-1}"
|
|
16
|
+
|
|
17
|
+
# ── Color helpers ─────────────────────────────────────────────────────────────
|
|
18
|
+
RED='\033[0;31m'
|
|
19
|
+
GREEN='\033[0;32m'
|
|
20
|
+
YELLOW='\033[0;33m'
|
|
21
|
+
BOLD='\033[1m'
|
|
22
|
+
RESET='\033[0m'
|
|
23
|
+
|
|
24
|
+
# ── Service status tracking ──────────────────────────────────────────────────
|
|
25
|
+
declare -A SVC_STATUS # "up" or "down"
|
|
26
|
+
|
|
27
|
+
# ── Graceful kill: SIGTERM first, SIGKILL after 5s ────────────────────────────
|
|
28
|
+
graceful_kill_pattern() {
|
|
29
|
+
local pattern="$1"
|
|
30
|
+
local pids
|
|
31
|
+
pids=$(pgrep -f "$pattern" 2>/dev/null || true)
|
|
32
|
+
if [[ -z "$pids" ]]; then return 0; fi
|
|
33
|
+
# Send SIGTERM
|
|
34
|
+
echo "$pids" | xargs kill -TERM 2>/dev/null || true
|
|
35
|
+
# Wait up to 5s for processes to exit
|
|
36
|
+
local waited=0
|
|
37
|
+
while [[ $waited -lt 50 ]]; do
|
|
38
|
+
if ! pgrep -f "$pattern" >/dev/null 2>&1; then
|
|
39
|
+
return 0
|
|
40
|
+
fi
|
|
41
|
+
sleep 0.1
|
|
42
|
+
waited=$((waited + 1))
|
|
43
|
+
done
|
|
44
|
+
# Still alive — SIGKILL
|
|
45
|
+
pgrep -f "$pattern" 2>/dev/null | xargs kill -9 2>/dev/null || true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
graceful_kill_port() {
|
|
49
|
+
local port="$1"
|
|
50
|
+
local pids
|
|
51
|
+
pids=$(lsof -ti :"$port" 2>/dev/null || true)
|
|
52
|
+
if [[ -z "$pids" ]]; then return 0; fi
|
|
53
|
+
echo "$pids" | xargs kill -TERM 2>/dev/null || true
|
|
54
|
+
local waited=0
|
|
55
|
+
while [[ $waited -lt 50 ]]; do
|
|
56
|
+
if ! lsof -ti :"$port" >/dev/null 2>&1; then
|
|
57
|
+
return 0
|
|
58
|
+
fi
|
|
59
|
+
sleep 0.1
|
|
60
|
+
waited=$((waited + 1))
|
|
61
|
+
done
|
|
62
|
+
lsof -ti :"$port" 2>/dev/null | xargs kill -9 2>/dev/null || true
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
# ── Health polling: wait for a URL to respond 200 (or any 2xx/3xx) ────────────
|
|
66
|
+
wait_for_health() {
|
|
67
|
+
local url="$1"
|
|
68
|
+
local name="$2"
|
|
69
|
+
local max_attempts="${3:-30}"
|
|
70
|
+
local attempt=0
|
|
71
|
+
while [ $attempt -lt $max_attempts ]; do
|
|
72
|
+
if curl -s --max-time 2 "$url" > /dev/null 2>&1; then
|
|
73
|
+
echo -e " ${GREEN}✓${RESET} $name is up"
|
|
74
|
+
SVC_STATUS[$name]="up"
|
|
75
|
+
return 0
|
|
76
|
+
fi
|
|
77
|
+
attempt=$((attempt + 1))
|
|
78
|
+
sleep 1
|
|
79
|
+
done
|
|
80
|
+
echo -e " ${RED}✗${RESET} $name failed to start (tried ${max_attempts}s)"
|
|
81
|
+
SVC_STATUS[$name]="down"
|
|
82
|
+
return 1
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# ── Parse flags ───────────────────────────────────────────────────────────────
|
|
86
|
+
START_DASH=1
|
|
87
|
+
START_STUDIO=1
|
|
88
|
+
START_BRIDGES=1
|
|
89
|
+
for arg in "$@"; do
|
|
90
|
+
case "$arg" in
|
|
91
|
+
--no-dashboard) START_DASH=0 ;;
|
|
92
|
+
--no-studio) START_STUDIO=0 ;;
|
|
93
|
+
--no-bridges) START_BRIDGES=0 ;;
|
|
94
|
+
esac
|
|
95
|
+
done
|
|
96
|
+
|
|
97
|
+
# ══════════════════════════════════════════════════════════════════════════════
|
|
98
|
+
# PHASE 1: Stop everything gracefully
|
|
99
|
+
# ══════════════════════════════════════════════════════════════════════════════
|
|
100
|
+
echo ""
|
|
101
|
+
echo -e "${BOLD}Stopping existing crewswarm processes...${RESET}"
|
|
102
|
+
|
|
103
|
+
# ── Kill by process name (SIGTERM → SIGKILL) ─────────────────────────────────
|
|
104
|
+
# Use pattern without leading "node " so we catch all node binary paths
|
|
105
|
+
graceful_kill_pattern "gateway-bridge.mjs"
|
|
106
|
+
graceful_kill_pattern "opencrew-rt-daemon.mjs"
|
|
107
|
+
graceful_kill_pattern "crew-lead.mjs"
|
|
108
|
+
graceful_kill_pattern "scripts/dashboard.mjs"
|
|
109
|
+
graceful_kill_pattern "scripts/mcp-server.mjs"
|
|
110
|
+
graceful_kill_pattern "scripts/crew-scribe.mjs"
|
|
111
|
+
graceful_kill_pattern "telegram-bridge.mjs"
|
|
112
|
+
graceful_kill_pattern "whatsapp-bridge.mjs"
|
|
113
|
+
graceful_kill_pattern "opencode serve"
|
|
114
|
+
graceful_kill_pattern "pm-loop.mjs"
|
|
115
|
+
graceful_kill_pattern "apps/vibe/server.mjs"
|
|
116
|
+
graceful_kill_pattern "watch-server.mjs"
|
|
117
|
+
graceful_kill_pattern "vite.*vibe"
|
|
118
|
+
|
|
119
|
+
# ── Kill by port (catches anything that survived — e.g. launchd-managed dashboard)
|
|
120
|
+
for port in 5010 4319 18889 4096 5020 3333 3334; do
|
|
121
|
+
graceful_kill_port "$port"
|
|
122
|
+
done
|
|
123
|
+
|
|
124
|
+
# ── Clean stale PID files so start-crew doesn't skip re-spawning
|
|
125
|
+
find /tmp -maxdepth 1 -name "bridge-*.pid" -delete 2>/dev/null; true
|
|
126
|
+
|
|
127
|
+
sleep 1
|
|
128
|
+
|
|
129
|
+
# ── Confirm ports are clear ──────────────────────────────────────────────────
|
|
130
|
+
for port in 5010 4319 18889 4096 5020 3333 3334; do
|
|
131
|
+
HELD=$(lsof -ti :$port 2>/dev/null | wc -l | tr -d ' ')
|
|
132
|
+
if [ "$HELD" -gt 0 ]; then
|
|
133
|
+
echo " WARNING: port $port still held — force killing..."
|
|
134
|
+
lsof -ti :$port 2>/dev/null | xargs kill -9 2>/dev/null; true
|
|
135
|
+
sleep 1
|
|
136
|
+
fi
|
|
137
|
+
done
|
|
138
|
+
|
|
139
|
+
echo " All processes stopped."
|
|
140
|
+
|
|
141
|
+
# ══════════════════════════════════════════════════════════════════════════════
|
|
142
|
+
# PHASE 2: Start services in order with health polling
|
|
143
|
+
# ══════════════════════════════════════════════════════════════════════════════
|
|
144
|
+
echo ""
|
|
145
|
+
echo -e "${BOLD}Starting services...${RESET}"
|
|
146
|
+
|
|
147
|
+
# ── 1. OpenCode (optional, non-critical) ─────────────────────────────────────
|
|
148
|
+
echo ""
|
|
149
|
+
echo "Starting optional OpenCode session server (port 4096)..."
|
|
150
|
+
OPENCODE_BIN="$(command -v opencode 2>/dev/null)" || OPENCODE_BIN="/usr/local/bin/opencode"
|
|
151
|
+
if [[ -x "$OPENCODE_BIN" ]]; then
|
|
152
|
+
nohup "$OPENCODE_BIN" serve --port 4096 --hostname 127.0.0.1 >> /tmp/opencode.log 2>&1 &
|
|
153
|
+
# Non-critical — don't block on health
|
|
154
|
+
SVC_STATUS["opencode"]="up"
|
|
155
|
+
echo " Started (PID $!)"
|
|
156
|
+
else
|
|
157
|
+
echo " (opencode not found; skip)"
|
|
158
|
+
SVC_STATUS["opencode"]="skip"
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# ── 2. RT daemon (port 18889) ────────────────────────────────────────────────
|
|
162
|
+
echo ""
|
|
163
|
+
echo "Starting RT daemon (port 18889)..."
|
|
164
|
+
nohup "$NODE" scripts/opencrew-rt-daemon.mjs >> /tmp/opencrew-rt-daemon.log 2>&1 &
|
|
165
|
+
|
|
166
|
+
if ! wait_for_health "http://127.0.0.1:18889/status" "rt-bus" 15; then
|
|
167
|
+
echo " Retrying RT daemon once..."
|
|
168
|
+
graceful_kill_pattern "opencrew-rt-daemon.mjs"
|
|
169
|
+
graceful_kill_port 18889
|
|
170
|
+
sleep 1
|
|
171
|
+
nohup "$NODE" scripts/opencrew-rt-daemon.mjs >> /tmp/opencrew-rt-daemon.log 2>&1 &
|
|
172
|
+
if ! wait_for_health "http://127.0.0.1:18889/status" "rt-bus" 15; then
|
|
173
|
+
echo " Last RT log lines:"
|
|
174
|
+
tail -n 40 /tmp/opencrew-rt-daemon.log 2>/dev/null || true
|
|
175
|
+
echo ""
|
|
176
|
+
echo -e " ${RED}RT bus failed — continuing with remaining services${RESET}"
|
|
177
|
+
fi
|
|
178
|
+
fi
|
|
179
|
+
|
|
180
|
+
# ── 3. Gateway bridges (agents) ──────────────────────────────────────────────
|
|
181
|
+
echo ""
|
|
182
|
+
echo "Starting gateway bridges (crew-main, crew-pm, crew-coder, etc.)..."
|
|
183
|
+
"$NODE" scripts/start-crew.mjs --force
|
|
184
|
+
SVC_STATUS["agents"]="up"
|
|
185
|
+
sleep 1
|
|
186
|
+
|
|
187
|
+
# ── 4. crew-lead (port 5010) — CRITICAL ─────────────────────────────────────
|
|
188
|
+
echo ""
|
|
189
|
+
echo "Starting crew-lead (port 5010)..."
|
|
190
|
+
# crew-lead is spawned by start-crew.mjs above; this is a safety net only.
|
|
191
|
+
if ! lsof -ti :5010 >/dev/null 2>&1; then
|
|
192
|
+
nohup "$NODE" crew-lead.mjs >> /tmp/crew-lead.log 2>&1 &
|
|
193
|
+
fi
|
|
194
|
+
wait_for_health "http://127.0.0.1:5010/health" "crew-lead" 30 || true
|
|
195
|
+
|
|
196
|
+
# ── 5. Dashboard (port 4319) — CRITICAL ─────────────────────────────────────
|
|
197
|
+
if [[ "$START_DASH" -eq 1 ]]; then
|
|
198
|
+
echo ""
|
|
199
|
+
echo "Starting dashboard (port 4319)..."
|
|
200
|
+
if launchctl list com.crewswarm.dashboard >/dev/null 2>&1; then
|
|
201
|
+
launchctl stop com.crewswarm.dashboard 2>/dev/null; sleep 1
|
|
202
|
+
launchctl start com.crewswarm.dashboard 2>/dev/null
|
|
203
|
+
echo " (via launchd)"
|
|
204
|
+
else
|
|
205
|
+
nohup "$NODE" scripts/dashboard.mjs >> /tmp/dashboard.log 2>&1 &
|
|
206
|
+
fi
|
|
207
|
+
wait_for_health "http://127.0.0.1:4319/" "dashboard" 30 || true
|
|
208
|
+
else
|
|
209
|
+
SVC_STATUS["dashboard"]="skip"
|
|
210
|
+
fi
|
|
211
|
+
|
|
212
|
+
# ── 6. Messaging bridges (Telegram + WhatsApp) ──────────────────────────────
|
|
213
|
+
if [[ "$START_BRIDGES" -eq 1 ]]; then
|
|
214
|
+
echo ""
|
|
215
|
+
# Verify RT bus is still up before starting bridges
|
|
216
|
+
if [[ "${SVC_STATUS[rt-bus]:-down}" == "up" ]]; then
|
|
217
|
+
echo "Starting Telegram bridge..."
|
|
218
|
+
nohup "$NODE" "$REPO_DIR/telegram-bridge.mjs" >> /tmp/telegram-bridge.log 2>&1 &
|
|
219
|
+
SVC_STATUS["telegram"]="up"
|
|
220
|
+
echo " PID: $!"
|
|
221
|
+
|
|
222
|
+
echo "Starting WhatsApp bridge..."
|
|
223
|
+
nohup "$NODE" "$REPO_DIR/whatsapp-bridge.mjs" >> /tmp/whatsapp-bridge.log 2>&1 &
|
|
224
|
+
SVC_STATUS["whatsapp"]="up"
|
|
225
|
+
echo " PID: $!"
|
|
226
|
+
else
|
|
227
|
+
echo -e " ${YELLOW}Skipping messaging bridges — RT bus is not up${RESET}"
|
|
228
|
+
SVC_STATUS["telegram"]="skip"
|
|
229
|
+
SVC_STATUS["whatsapp"]="skip"
|
|
230
|
+
fi
|
|
231
|
+
fi
|
|
232
|
+
|
|
233
|
+
# ── 7. MCP + OpenAI-compat server (port 5020) ───────────────────────────────
|
|
234
|
+
echo ""
|
|
235
|
+
echo "Starting MCP + OpenAI-compat server (port 5020)..."
|
|
236
|
+
if ! lsof -ti :5020 >/dev/null 2>&1; then
|
|
237
|
+
nohup "$NODE" scripts/mcp-server.mjs >> /tmp/crewswarm-mcp.log 2>&1 &
|
|
238
|
+
wait_for_health "http://127.0.0.1:5020/health" "mcp-server" 15 || true
|
|
239
|
+
else
|
|
240
|
+
echo " (already running on :5020)"
|
|
241
|
+
SVC_STATUS["mcp-server"]="up"
|
|
242
|
+
fi
|
|
243
|
+
|
|
244
|
+
# ── 8. Vibe Studio + file watcher (ports 3333, 3334) ────────────────────────
|
|
245
|
+
if [[ "$START_STUDIO" -eq 1 ]]; then
|
|
246
|
+
echo ""
|
|
247
|
+
echo "Starting Vibe (Studio) + file watcher (ports 3333, 3334)..."
|
|
248
|
+
if [[ ! -d "$REPO_DIR/apps/vibe/dist" ]]; then
|
|
249
|
+
echo " Building Studio (first run)..."
|
|
250
|
+
(cd "$REPO_DIR" && npm run studio:build) >/dev/null 2>&1 || true
|
|
251
|
+
fi
|
|
252
|
+
sleep 1
|
|
253
|
+
nohup "$NODE" "$REPO_DIR/apps/vibe/server.mjs" >> /tmp/studio.log 2>&1 &
|
|
254
|
+
nohup env NODE_DISABLE_COMPILE_CACHE=1 "$NODE" "$REPO_DIR/apps/vibe/watch-server.mjs" >> /tmp/studio-watch.log 2>&1 &
|
|
255
|
+
wait_for_health "http://127.0.0.1:3333/" "vibe-studio" 25 || true
|
|
256
|
+
# Watch server doesn't have HTTP health — just check port
|
|
257
|
+
for i in $(seq 1 10); do
|
|
258
|
+
if lsof -ti :3334 >/dev/null 2>&1; then
|
|
259
|
+
echo -e " ${GREEN}✓${RESET} file watcher is up"
|
|
260
|
+
SVC_STATUS["file-watcher"]="up"
|
|
261
|
+
break
|
|
262
|
+
fi
|
|
263
|
+
if [[ "$i" -eq 10 ]]; then
|
|
264
|
+
echo -e " ${YELLOW}!${RESET} file watcher not detected on :3334"
|
|
265
|
+
SVC_STATUS["file-watcher"]="down"
|
|
266
|
+
fi
|
|
267
|
+
sleep 1
|
|
268
|
+
done
|
|
269
|
+
else
|
|
270
|
+
SVC_STATUS["vibe-studio"]="skip"
|
|
271
|
+
SVC_STATUS["file-watcher"]="skip"
|
|
272
|
+
fi
|
|
273
|
+
|
|
274
|
+
# ══════════════════════════════════════════════════════════════════════════════
|
|
275
|
+
# PHASE 3: Summary
|
|
276
|
+
# ══════════════════════════════════════════════════════════════════════════════
|
|
277
|
+
echo ""
|
|
278
|
+
echo -e "${BOLD}━━━ Service Summary ━━━${RESET}"
|
|
279
|
+
|
|
280
|
+
print_status() {
|
|
281
|
+
local name="$1"
|
|
282
|
+
local port="$2"
|
|
283
|
+
local status="${SVC_STATUS[$name]:-unknown}"
|
|
284
|
+
case "$status" in
|
|
285
|
+
up) echo -e " ${GREEN}✓${RESET} $name :$port" ;;
|
|
286
|
+
down) echo -e " ${RED}✗${RESET} $name :$port" ;;
|
|
287
|
+
skip) echo -e " ${YELLOW}-${RESET} $name :$port (skipped)" ;;
|
|
288
|
+
*) echo -e " ${YELLOW}?${RESET} $name :$port (unknown)" ;;
|
|
289
|
+
esac
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
print_status "rt-bus" 18889
|
|
293
|
+
print_status "crew-lead" 5010
|
|
294
|
+
print_status "dashboard" 4319
|
|
295
|
+
print_status "agents" "--"
|
|
296
|
+
print_status "mcp-server" 5020
|
|
297
|
+
print_status "vibe-studio" 3333
|
|
298
|
+
print_status "file-watcher" 3334
|
|
299
|
+
print_status "opencode" 4096
|
|
300
|
+
if [[ "$START_BRIDGES" -eq 1 ]]; then
|
|
301
|
+
print_status "telegram" "--"
|
|
302
|
+
print_status "whatsapp" "--"
|
|
303
|
+
fi
|
|
304
|
+
|
|
305
|
+
echo ""
|
|
306
|
+
echo "Logs: /tmp/opencode.log /tmp/opencrew-rt-daemon.log /tmp/crew-lead.log /tmp/dashboard.log /tmp/crewswarm-mcp.log /tmp/studio.log /tmp/studio-watch.log"
|
|
307
|
+
|
|
308
|
+
# ── Run health-check if available ────────────────────────────────────────────
|
|
309
|
+
if [[ -f "$REPO_DIR/scripts/health-check.mjs" ]]; then
|
|
310
|
+
echo ""
|
|
311
|
+
echo -e "${BOLD}Running health check...${RESET}"
|
|
312
|
+
"$NODE" "$REPO_DIR/scripts/health-check.mjs" --quiet 2>/dev/null || true
|
|
313
|
+
fi
|
|
314
|
+
|
|
315
|
+
# ── Exit code: 0 if critical services are up, 1 otherwise ────────────────────
|
|
316
|
+
CREW_LEAD_OK="${SVC_STATUS[crew-lead]:-down}"
|
|
317
|
+
DASHBOARD_OK="${SVC_STATUS[dashboard]:-down}"
|
|
318
|
+
|
|
319
|
+
if [[ "$CREW_LEAD_OK" == "up" ]] && { [[ "$DASHBOARD_OK" == "up" ]] || [[ "$START_DASH" -eq 0 ]]; }; then
|
|
320
|
+
echo ""
|
|
321
|
+
echo -e "${GREEN}${BOLD}All critical services are up.${RESET}"
|
|
322
|
+
exit 0
|
|
323
|
+
else
|
|
324
|
+
echo ""
|
|
325
|
+
echo -e "${RED}${BOLD}One or more critical services failed to start.${RESET}"
|
|
326
|
+
[[ "$CREW_LEAD_OK" != "up" ]] && echo -e " ${RED}crew-lead is not responding — check /tmp/crew-lead.log${RESET}"
|
|
327
|
+
[[ "$DASHBOARD_OK" != "up" && "$START_DASH" -eq 1 ]] && echo -e " ${RED}dashboard is not responding — check /tmp/dashboard.log${RESET}"
|
|
328
|
+
exit 1
|
|
329
|
+
fi
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Restart crew-lead using PID file for reliable process management
|
|
3
|
+
# This prevents accidentally killing the dashboard when restarting crew-lead
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
9
|
+
CREWSWARM_DIR="${CREWSWARM_DIR:-${OPENCLAW_DIR:-$REPO_ROOT}}"
|
|
10
|
+
CREW_LEAD_SCRIPT="$CREWSWARM_DIR/crew-lead.mjs"
|
|
11
|
+
LOG_FILE="/tmp/crew-lead.log"
|
|
12
|
+
PID_FILE="$HOME/.crewswarm/logs/crew-lead.pid"
|
|
13
|
+
PATH="/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:${PATH:-}"
|
|
14
|
+
export PATH
|
|
15
|
+
LAUNCH_LABEL="com.crewswarm.crew-lead"
|
|
16
|
+
LAUNCH_PLIST="$HOME/Library/LaunchAgents/${LAUNCH_LABEL}.plist"
|
|
17
|
+
RESOLVE_NODE_BIN="$CREWSWARM_DIR/scripts/resolve-node-bin.sh"
|
|
18
|
+
NODE_BIN="${NODE:-}"
|
|
19
|
+
if [[ -z "$NODE_BIN" ]]; then
|
|
20
|
+
if [[ -x "$RESOLVE_NODE_BIN" ]]; then
|
|
21
|
+
NODE_BIN="$("$RESOLVE_NODE_BIN")"
|
|
22
|
+
elif command -v node >/dev/null 2>&1; then
|
|
23
|
+
NODE_BIN="$(command -v node)"
|
|
24
|
+
elif [[ -x /usr/local/bin/node ]]; then
|
|
25
|
+
NODE_BIN="/usr/local/bin/node"
|
|
26
|
+
elif [[ -x /opt/homebrew/bin/node ]]; then
|
|
27
|
+
NODE_BIN="/opt/homebrew/bin/node"
|
|
28
|
+
else
|
|
29
|
+
echo "❌ node not found in PATH"
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
# Stop every way crew-lead might be running and free :5010 (launchd alone does not
|
|
35
|
+
# kill a nohup/manual node crew-lead.mjs, which causes "Port 5010 in use" on kickstart).
|
|
36
|
+
stop_crew_lead_processes() {
|
|
37
|
+
echo " → Stopping existing crew-lead processes..."
|
|
38
|
+
if [ -f "$PID_FILE" ]; then
|
|
39
|
+
PID=$(cat "$PID_FILE" 2>/dev/null || echo "")
|
|
40
|
+
if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then
|
|
41
|
+
echo " → Found crew-lead PID $PID from PID file"
|
|
42
|
+
kill -9 "$PID" 2>/dev/null || true
|
|
43
|
+
fi
|
|
44
|
+
echo "" > "$PID_FILE" 2>/dev/null || true
|
|
45
|
+
fi
|
|
46
|
+
pkill -9 -f "crew-lead.mjs" 2>/dev/null || true
|
|
47
|
+
if lsof -i :5010 -sTCP:LISTEN -t &>/dev/null; then
|
|
48
|
+
echo " → Releasing port 5010 (listener still present)..."
|
|
49
|
+
lsof -ti :5010 -sTCP:LISTEN 2>/dev/null | xargs kill -9 2>/dev/null || true
|
|
50
|
+
fi
|
|
51
|
+
local n=0
|
|
52
|
+
while lsof -i :5010 -sTCP:LISTEN -t &>/dev/null && [ "$n" -lt 60 ]; do
|
|
53
|
+
sleep 0.25
|
|
54
|
+
n=$((n + 1))
|
|
55
|
+
done
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
echo "🔄 Restarting crew-lead..."
|
|
59
|
+
|
|
60
|
+
if launchctl list "$LAUNCH_LABEL" >/dev/null 2>&1 || [[ -f "$LAUNCH_PLIST" ]]; then
|
|
61
|
+
echo " → Using launchd agent: $LAUNCH_LABEL"
|
|
62
|
+
launchctl bootout "gui/$(id -u)" "$LAUNCH_PLIST" 2>/dev/null || true
|
|
63
|
+
stop_crew_lead_processes
|
|
64
|
+
launchctl bootstrap "gui/$(id -u)" "$LAUNCH_PLIST"
|
|
65
|
+
launchctl kickstart -k "gui/$(id -u)/$LAUNCH_LABEL"
|
|
66
|
+
sleep 2
|
|
67
|
+
if lsof -i :5010 -sTCP:LISTEN -t &>/dev/null; then
|
|
68
|
+
echo "✅ crew-lead is running at http://127.0.0.1:5010"
|
|
69
|
+
echo " Log: $LOG_FILE"
|
|
70
|
+
echo " LaunchAgent: $LAUNCH_PLIST"
|
|
71
|
+
exit 0
|
|
72
|
+
fi
|
|
73
|
+
echo "❌ crew-lead launchd start failed. Check log:"
|
|
74
|
+
echo " tail -20 $LOG_FILE"
|
|
75
|
+
exit 1
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
stop_crew_lead_processes
|
|
79
|
+
|
|
80
|
+
# Step 4: Start fresh crew-lead
|
|
81
|
+
echo " → Starting crew-lead at $CREW_LEAD_SCRIPT..."
|
|
82
|
+
cd "$CREWSWARM_DIR"
|
|
83
|
+
NODE_DISABLE_COMPILE_CACHE=1 nohup "$NODE_BIN" "$CREW_LEAD_SCRIPT" >> "$LOG_FILE" 2>&1 &
|
|
84
|
+
|
|
85
|
+
# Step 5: Wait for startup and verify
|
|
86
|
+
echo " → Verifying startup..."
|
|
87
|
+
sleep 3
|
|
88
|
+
|
|
89
|
+
if lsof -i :5010 -sTCP:LISTEN -t &>/dev/null; then
|
|
90
|
+
echo "✅ crew-lead is running at http://127.0.0.1:5010"
|
|
91
|
+
echo " Log: $LOG_FILE"
|
|
92
|
+
echo " PID file: $PID_FILE"
|
|
93
|
+
exit 0
|
|
94
|
+
else
|
|
95
|
+
echo "❌ crew-lead failed to start. Check log:"
|
|
96
|
+
echo " tail -20 $LOG_FILE"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Direct dashboard restart script — for agents and CLI use
|
|
3
|
+
# Bypasses the dashboard's API self-restart prohibition
|
|
4
|
+
#
|
|
5
|
+
# Usage: bash scripts/restart-dashboard.sh
|
|
6
|
+
# npm run restart-dashboard
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
12
|
+
CREWSWARM_DIR="${CREWSWARM_DIR:-${OPENCLAW_DIR:-$REPO_ROOT}}"
|
|
13
|
+
DASHBOARD_SCRIPT="$CREWSWARM_DIR/scripts/dashboard.mjs"
|
|
14
|
+
LOG_FILE="${CREWSWARM_DASH_LOG:-/tmp/dashboard.log}"
|
|
15
|
+
HEALTH_URL="${CREWSWARM_DASH_HEALTH_URL:-http://127.0.0.1:4319/api/health}"
|
|
16
|
+
NODE_BIN="${NODE:-$("$CREWSWARM_DIR/scripts/resolve-node-bin.sh")}"
|
|
17
|
+
LAUNCH_LABEL="com.crewswarm.dashboard"
|
|
18
|
+
LAUNCH_PLIST="$HOME/Library/LaunchAgents/${LAUNCH_LABEL}.plist"
|
|
19
|
+
|
|
20
|
+
wait_for_dashboard() {
|
|
21
|
+
local pid="$1"
|
|
22
|
+
local attempts="${2:-15}"
|
|
23
|
+
|
|
24
|
+
for ((i=1; i<=attempts; i++)); do
|
|
25
|
+
if ! kill -0 "$pid" 2>/dev/null; then
|
|
26
|
+
echo " → Dashboard process exited before becoming healthy"
|
|
27
|
+
return 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
if curl -sSf -m 2 "$HEALTH_URL" >/dev/null 2>&1; then
|
|
31
|
+
return 0
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
sleep 1
|
|
35
|
+
done
|
|
36
|
+
|
|
37
|
+
echo " → Dashboard did not pass health check at $HEALTH_URL"
|
|
38
|
+
return 1
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
start_dashboard() {
|
|
42
|
+
export NODE_DISABLE_COMPILE_CACHE=1
|
|
43
|
+
if command -v setsid >/dev/null 2>&1; then
|
|
44
|
+
setsid "$NODE_BIN" "$DASHBOARD_SCRIPT" >> "$LOG_FILE" 2>&1 < /dev/null &
|
|
45
|
+
else
|
|
46
|
+
nohup "$NODE_BIN" "$DASHBOARD_SCRIPT" >> "$LOG_FILE" 2>&1 < /dev/null &
|
|
47
|
+
fi
|
|
48
|
+
echo $!
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
echo "🔄 Restarting dashboard..."
|
|
52
|
+
|
|
53
|
+
if launchctl list "$LAUNCH_LABEL" >/dev/null 2>&1 || [[ -f "$LAUNCH_PLIST" ]]; then
|
|
54
|
+
echo " → Using launchd agent: $LAUNCH_LABEL"
|
|
55
|
+
launchctl bootout "gui/$(id -u)" "$LAUNCH_PLIST" 2>/dev/null || true
|
|
56
|
+
# Kill only the actual node dashboard process, not shell wrappers that mention it
|
|
57
|
+
pgrep -f 'node.*scripts/dashboard\.mjs' | xargs kill -9 2>/dev/null || true
|
|
58
|
+
lsof -ti :4319 2>/dev/null | xargs kill -9 2>/dev/null || true
|
|
59
|
+
sleep 2
|
|
60
|
+
launchctl bootstrap "gui/$(id -u)" "$LAUNCH_PLIST"
|
|
61
|
+
launchctl kickstart -k "gui/$(id -u)/$LAUNCH_LABEL"
|
|
62
|
+
for _ in $(seq 1 20); do
|
|
63
|
+
if curl -sSf -m 2 "$HEALTH_URL" >/dev/null 2>&1; then
|
|
64
|
+
echo "✅ Dashboard is running at http://127.0.0.1:4319"
|
|
65
|
+
echo " Log: $LOG_FILE"
|
|
66
|
+
echo " LaunchAgent: $LAUNCH_PLIST"
|
|
67
|
+
exit 0
|
|
68
|
+
fi
|
|
69
|
+
sleep 1
|
|
70
|
+
done
|
|
71
|
+
echo "❌ Dashboard launchd start failed. Check log:"
|
|
72
|
+
tail -20 "$LOG_FILE" || true
|
|
73
|
+
exit 1
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
echo " → Stopping existing dashboard processes..."
|
|
77
|
+
# Kill only the actual node dashboard process, not shell wrappers that mention it
|
|
78
|
+
pgrep -f 'node.*scripts/dashboard\.mjs' | xargs kill -9 2>/dev/null || true
|
|
79
|
+
|
|
80
|
+
echo " → Waiting for port 4319 to release..."
|
|
81
|
+
sleep 2
|
|
82
|
+
|
|
83
|
+
# Step 3: Start fresh dashboard
|
|
84
|
+
echo " → Starting dashboard at $DASHBOARD_SCRIPT..."
|
|
85
|
+
DASH_PID="$(start_dashboard)"
|
|
86
|
+
|
|
87
|
+
# Step 4: Wait for startup and verify
|
|
88
|
+
echo " → Verifying startup..."
|
|
89
|
+
if wait_for_dashboard "$DASH_PID"; then
|
|
90
|
+
sleep 3
|
|
91
|
+
if ! kill -0 "$DASH_PID" 2>/dev/null; then
|
|
92
|
+
echo "❌ Dashboard exited shortly after startup. Check log:"
|
|
93
|
+
tail -20 "$LOG_FILE" || true
|
|
94
|
+
exit 1
|
|
95
|
+
fi
|
|
96
|
+
echo "✅ Dashboard is running at http://127.0.0.1:4319"
|
|
97
|
+
echo " PID: $DASH_PID"
|
|
98
|
+
echo " Log: $LOG_FILE"
|
|
99
|
+
exit 0
|
|
100
|
+
else
|
|
101
|
+
echo "❌ Dashboard failed to start. Check log:"
|
|
102
|
+
tail -20 "$LOG_FILE" || true
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|