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.
Files changed (362) hide show
  1. package/.env.example +155 -0
  2. package/LICENSE +21 -0
  3. package/README.md +316 -0
  4. package/apps/dashboard/dist/assets/chat-core-BwSoInmZ.js +1 -0
  5. package/apps/dashboard/dist/assets/chat-core-BwSoInmZ.js.br +0 -0
  6. package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js +1 -0
  7. package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js.br +0 -0
  8. package/apps/dashboard/dist/assets/components-CSUb80ze.js +1 -0
  9. package/apps/dashboard/dist/assets/components-CSUb80ze.js.br +0 -0
  10. package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js +1 -0
  11. package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js.br +0 -0
  12. package/apps/dashboard/dist/assets/index-CF0aJRtC.css +1 -0
  13. package/apps/dashboard/dist/assets/index-CF0aJRtC.css.br +0 -0
  14. package/apps/dashboard/dist/assets/index-Px49zu76.js +2 -0
  15. package/apps/dashboard/dist/assets/index-Px49zu76.js.br +0 -0
  16. package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js +1 -0
  17. package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js.br +0 -0
  18. package/apps/dashboard/dist/assets/setup-wizard-i3eEixlo.js +1 -0
  19. package/apps/dashboard/dist/assets/setup-wizard-i3eEixlo.js.br +0 -0
  20. package/apps/dashboard/dist/assets/tab-agents-tab-BThdsdJY.js +1 -0
  21. package/apps/dashboard/dist/assets/tab-agents-tab-BThdsdJY.js.br +0 -0
  22. package/apps/dashboard/dist/assets/tab-benchmarks-tab-DfCuAClu.js +1 -0
  23. package/apps/dashboard/dist/assets/tab-comms-tab-eHpOSBhG.js +1 -0
  24. package/apps/dashboard/dist/assets/tab-comms-tab-eHpOSBhG.js.br +0 -0
  25. package/apps/dashboard/dist/assets/tab-contacts-tab-yEegNyO4.js +1 -0
  26. package/apps/dashboard/dist/assets/tab-contacts-tab-yEegNyO4.js.br +0 -0
  27. package/apps/dashboard/dist/assets/tab-engines-tab-C3DYxTwy.js +1 -0
  28. package/apps/dashboard/dist/assets/tab-engines-tab-C3DYxTwy.js.br +0 -0
  29. package/apps/dashboard/dist/assets/tab-memory-tab-C59BYFQD.js +1 -0
  30. package/apps/dashboard/dist/assets/tab-memory-tab-C59BYFQD.js.br +0 -0
  31. package/apps/dashboard/dist/assets/tab-models-tab-9Ur7pXWA.js +1 -0
  32. package/apps/dashboard/dist/assets/tab-models-tab-9Ur7pXWA.js.br +0 -0
  33. package/apps/dashboard/dist/assets/tab-pm-loop-tab-D7mnDelU.js +1 -0
  34. package/apps/dashboard/dist/assets/tab-pm-loop-tab-D7mnDelU.js.br +0 -0
  35. package/apps/dashboard/dist/assets/tab-projects-tab-C6h2Mv1K.js +1 -0
  36. package/apps/dashboard/dist/assets/tab-projects-tab-C6h2Mv1K.js.br +0 -0
  37. package/apps/dashboard/dist/assets/tab-prompts-tab-C0wZvWK3.js +1 -0
  38. package/apps/dashboard/dist/assets/tab-prompts-tab-C0wZvWK3.js.br +0 -0
  39. package/apps/dashboard/dist/assets/tab-services-tab-DBj_w3bc.js +1 -0
  40. package/apps/dashboard/dist/assets/tab-services-tab-DBj_w3bc.js.br +0 -0
  41. package/apps/dashboard/dist/assets/tab-settings-tab-ezeqAjZk.js +1 -0
  42. package/apps/dashboard/dist/assets/tab-settings-tab-ezeqAjZk.js.br +0 -0
  43. package/apps/dashboard/dist/assets/tab-skills-tab-BYdU2whk.js +1 -0
  44. package/apps/dashboard/dist/assets/tab-skills-tab-BYdU2whk.js.br +0 -0
  45. package/apps/dashboard/dist/assets/tab-spending-tab-Bg6w9t_p.js +1 -0
  46. package/apps/dashboard/dist/assets/tab-spending-tab-Bg6w9t_p.js.br +0 -0
  47. package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BBV9HB2X.js +1 -0
  48. package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BBV9HB2X.js.br +0 -0
  49. package/apps/dashboard/dist/assets/tab-swarm-tab-ChqLlEVs.js +1 -0
  50. package/apps/dashboard/dist/assets/tab-swarm-tab-ChqLlEVs.js.br +0 -0
  51. package/apps/dashboard/dist/assets/tab-usage-tab-B2UWXenJ.js +1 -0
  52. package/apps/dashboard/dist/assets/tab-usage-tab-B2UWXenJ.js.br +0 -0
  53. package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js +1 -0
  54. package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js.br +0 -0
  55. package/apps/dashboard/dist/assets/tab-workflows-tab-6QSXLJ0i.js +1 -0
  56. package/apps/dashboard/dist/assets/tab-workflows-tab-6QSXLJ0i.js.br +0 -0
  57. package/apps/dashboard/dist/favicon.png +0 -0
  58. package/apps/dashboard/dist/index.html +6466 -0
  59. package/apps/dashboard/dist/index.html.br +0 -0
  60. package/apps/dashboard/dist/index.html.gz +0 -0
  61. package/apps/dashboard/dist/signup.html +446 -0
  62. package/apps/dashboard/index.html +6442 -0
  63. package/apps/dashboard/package.json +15 -0
  64. package/apps/dashboard/src/app.js +2823 -0
  65. package/apps/dashboard/src/app.js.br +0 -0
  66. package/apps/dashboard/src/app.js.gz +0 -0
  67. package/apps/dashboard/src/chat/chat-actions.js +1847 -0
  68. package/apps/dashboard/src/chat/chat-actions.js.br +0 -0
  69. package/apps/dashboard/src/chat/unified-messages.js +327 -0
  70. package/apps/dashboard/src/chat/unified-messages.js.br +0 -0
  71. package/apps/dashboard/src/cli-process.js +208 -0
  72. package/apps/dashboard/src/cli-process.js.br +0 -0
  73. package/apps/dashboard/src/cli-process.js.gz +0 -0
  74. package/apps/dashboard/src/components/active-tasks-panel.js +175 -0
  75. package/apps/dashboard/src/components/active-tasks-panel.js.br +0 -0
  76. package/apps/dashboard/src/core/api.js +18 -0
  77. package/apps/dashboard/src/core/api.js.br +0 -0
  78. package/apps/dashboard/src/core/dom.js +220 -0
  79. package/apps/dashboard/src/core/dom.js.br +0 -0
  80. package/apps/dashboard/src/core/state.js +91 -0
  81. package/apps/dashboard/src/core/state.js.br +0 -0
  82. package/apps/dashboard/src/core/task-manager.js +134 -0
  83. package/apps/dashboard/src/core/task-manager.js.br +0 -0
  84. package/apps/dashboard/src/orchestration-status.js +127 -0
  85. package/apps/dashboard/src/orchestration-status.js.br +0 -0
  86. package/apps/dashboard/src/setup-wizard.js +555 -0
  87. package/apps/dashboard/src/setup-wizard.js.br +0 -0
  88. package/apps/dashboard/src/styles.css +2085 -0
  89. package/apps/dashboard/src/styles.css.br +0 -0
  90. package/apps/dashboard/src/styles.css.gz +0 -0
  91. package/apps/dashboard/src/tabs/agents-tab.js +2237 -0
  92. package/apps/dashboard/src/tabs/agents-tab.js.br +0 -0
  93. package/apps/dashboard/src/tabs/benchmarks-tab.js +229 -0
  94. package/apps/dashboard/src/tabs/benchmarks-tab.js.br +0 -0
  95. package/apps/dashboard/src/tabs/comms-tab.js +955 -0
  96. package/apps/dashboard/src/tabs/comms-tab.js.br +0 -0
  97. package/apps/dashboard/src/tabs/contacts-tab.js +654 -0
  98. package/apps/dashboard/src/tabs/contacts-tab.js.br +0 -0
  99. package/apps/dashboard/src/tabs/engines-tab.js +175 -0
  100. package/apps/dashboard/src/tabs/engines-tab.js.br +0 -0
  101. package/apps/dashboard/src/tabs/memory-tab.js +182 -0
  102. package/apps/dashboard/src/tabs/memory-tab.js.br +0 -0
  103. package/apps/dashboard/src/tabs/models-tab.js +441 -0
  104. package/apps/dashboard/src/tabs/models-tab.js.br +0 -0
  105. package/apps/dashboard/src/tabs/pm-loop-tab.js +185 -0
  106. package/apps/dashboard/src/tabs/pm-loop-tab.js.br +0 -0
  107. package/apps/dashboard/src/tabs/projects-tab.js +663 -0
  108. package/apps/dashboard/src/tabs/projects-tab.js.br +0 -0
  109. package/apps/dashboard/src/tabs/projects-tab.js.gz +0 -0
  110. package/apps/dashboard/src/tabs/prompts-tab.js +160 -0
  111. package/apps/dashboard/src/tabs/prompts-tab.js.br +0 -0
  112. package/apps/dashboard/src/tabs/services-tab.js +202 -0
  113. package/apps/dashboard/src/tabs/services-tab.js.br +0 -0
  114. package/apps/dashboard/src/tabs/settings-tab.js +803 -0
  115. package/apps/dashboard/src/tabs/settings-tab.js.br +0 -0
  116. package/apps/dashboard/src/tabs/skills-tab.js +284 -0
  117. package/apps/dashboard/src/tabs/skills-tab.js.br +0 -0
  118. package/apps/dashboard/src/tabs/spending-tab.js +173 -0
  119. package/apps/dashboard/src/tabs/spending-tab.js.br +0 -0
  120. package/apps/dashboard/src/tabs/swarm-chat-tab.js +660 -0
  121. package/apps/dashboard/src/tabs/swarm-chat-tab.js.br +0 -0
  122. package/apps/dashboard/src/tabs/swarm-tab.js +538 -0
  123. package/apps/dashboard/src/tabs/swarm-tab.js.br +0 -0
  124. package/apps/dashboard/src/tabs/usage-tab.js +390 -0
  125. package/apps/dashboard/src/tabs/usage-tab.js.br +0 -0
  126. package/apps/dashboard/src/tabs/waves-tab.js +238 -0
  127. package/apps/dashboard/src/tabs/waves-tab.js.br +0 -0
  128. package/apps/dashboard/src/tabs/workflows-tab.js +747 -0
  129. package/apps/dashboard/src/tabs/workflows-tab.js.br +0 -0
  130. package/apps/vibe/.crew/agent-memory/pipeline.json +249 -0
  131. package/apps/vibe/.crew/cost.json +17 -0
  132. package/apps/vibe/.crew/json-parse-metrics.jsonl +22 -0
  133. package/apps/vibe/.crew/pipeline-metrics.jsonl +22 -0
  134. package/apps/vibe/.crew/pipeline-runs/pipeline-0f90c392-2425-4ae5-850c-bd9d17b1d690.jsonl +5 -0
  135. package/apps/vibe/.crew/pipeline-runs/pipeline-1c269dd9-a63f-4fba-af81-5cf08048ef06.jsonl +5 -0
  136. package/apps/vibe/.crew/pipeline-runs/pipeline-288a7765-da24-4a22-89bc-1f3cc9b0562c.jsonl +1 -0
  137. package/apps/vibe/.crew/pipeline-runs/pipeline-2c78fd22-a657-4bd1-bc49-0679fb384409.jsonl +5 -0
  138. package/apps/vibe/.crew/pipeline-runs/pipeline-3e6fe08d-3264-404a-8df3-aab7efef10e7.jsonl +5 -0
  139. package/apps/vibe/.crew/pipeline-runs/pipeline-42eec610-57fe-4e09-9e7e-b315038495c2.jsonl +5 -0
  140. package/apps/vibe/.crew/pipeline-runs/pipeline-4438eb4c-ae13-42b1-90e2-b043d8983be8.jsonl +5 -0
  141. package/apps/vibe/.crew/pipeline-runs/pipeline-4740a9f5-86e7-44b6-a394-de433e291727.jsonl +5 -0
  142. package/apps/vibe/.crew/pipeline-runs/pipeline-49e1da6a-957e-48fd-9220-415019e4f8e2.jsonl +5 -0
  143. package/apps/vibe/.crew/pipeline-runs/pipeline-4c9251db-be68-427b-a3fc-a264f2b5778d.jsonl +5 -0
  144. package/apps/vibe/.crew/pipeline-runs/pipeline-65e29a57-664d-4196-8109-017e364f182e.jsonl +5 -0
  145. package/apps/vibe/.crew/pipeline-runs/pipeline-6aa04bc5-9593-4b1f-b58d-3bf2978cb602.jsonl +5 -0
  146. package/apps/vibe/.crew/pipeline-runs/pipeline-6e1cba53-9b70-457e-99e0-59199149dd21.jsonl +5 -0
  147. package/apps/vibe/.crew/pipeline-runs/pipeline-749f41cc-4dac-4204-be64-873a6080a0d2.jsonl +5 -0
  148. package/apps/vibe/.crew/pipeline-runs/pipeline-74d68121-e181-4864-bd9a-c3211341dfaf.jsonl +5 -0
  149. package/apps/vibe/.crew/pipeline-runs/pipeline-8509bc24-142d-4e07-b44a-a50bf99d1103.jsonl +5 -0
  150. package/apps/vibe/.crew/pipeline-runs/pipeline-960339c6-07ca-43ce-9900-f6e1702b39b9.jsonl +5 -0
  151. package/apps/vibe/.crew/pipeline-runs/pipeline-9c6480a9-7031-4146-b241-825b9a2d1de1.jsonl +5 -0
  152. package/apps/vibe/.crew/pipeline-runs/pipeline-9fd42426-8492-4157-9d5f-e1537c060489.jsonl +2 -0
  153. package/apps/vibe/.crew/pipeline-runs/pipeline-ad6d40a3-2f5e-46a9-a345-47caaccc51aa.jsonl +5 -0
  154. package/apps/vibe/.crew/pipeline-runs/pipeline-bc606133-8d5b-4535-8d85-f1a29cdaa981.jsonl +5 -0
  155. package/apps/vibe/.crew/pipeline-runs/pipeline-c1a13ccd-634a-4d01-a4a7-1177b8a752ff.jsonl +5 -0
  156. package/apps/vibe/.crew/pipeline-runs/pipeline-c7d27b42-249e-4bd4-8f26-6aa998110b8a.jsonl +5 -0
  157. package/apps/vibe/.crew/pipeline-runs/pipeline-cca2e9b9-4a34-4d25-a311-5c793fa7e91e.jsonl +5 -0
  158. package/apps/vibe/.crew/sandbox.json +7 -0
  159. package/apps/vibe/.crew/session.json +285 -0
  160. package/apps/vibe/.crew/training-data.jsonl +0 -0
  161. package/apps/vibe/.github/workflows/studio-quality.yml +37 -0
  162. package/apps/vibe/.studio-data/project-messages/chuck-norris.jsonl +12 -0
  163. package/apps/vibe/.studio-data/project-messages/general.jsonl +54 -0
  164. package/apps/vibe/.studio-data/project-messages/studio-local.jsonl +10 -0
  165. package/apps/vibe/ARCHITECTURE.md +3393 -0
  166. package/apps/vibe/QUICK-REFERENCE.md +211 -0
  167. package/apps/vibe/README.md +76 -0
  168. package/apps/vibe/ROADMAP.md +41 -0
  169. package/apps/vibe/STUDIO-SETUP-COMPLETE.md +35 -0
  170. package/apps/vibe/VISUAL-GUIDE.md +378 -0
  171. package/apps/vibe/capture-demo.mjs +160 -0
  172. package/apps/vibe/capture-vibe-assets.mjs +71 -0
  173. package/apps/vibe/capture-vibe-video.mjs +260 -0
  174. package/apps/vibe/check-buttons.js +41 -0
  175. package/apps/vibe/diagnose.html +106 -0
  176. package/apps/vibe/fix-buttons.js +103 -0
  177. package/apps/vibe/index.html +3401 -0
  178. package/apps/vibe/package-lock.json +920 -0
  179. package/apps/vibe/package.json +31 -0
  180. package/apps/vibe/public/favicon.png +0 -0
  181. package/apps/vibe/scripts/studio-pty-host.py +117 -0
  182. package/apps/vibe/server.mjs +1835 -0
  183. package/apps/vibe/src/main.js +2846 -0
  184. package/apps/vibe/src/register-all-languages.js +98 -0
  185. package/apps/vibe/start-studio.sh +11 -0
  186. package/apps/vibe/test/accessibility-tests.js +77 -0
  187. package/apps/vibe/test/browser-performance-audit.mjs +205 -0
  188. package/apps/vibe/test/performance-tests.js +120 -0
  189. package/apps/vibe/test/security-tests.js +213 -0
  190. package/apps/vibe/tests/e2e.local.mjs +54 -0
  191. package/apps/vibe/tests/server.smoke.mjs +106 -0
  192. package/apps/vibe/update_website.mjs +74 -0
  193. package/apps/vibe/vite.config.js +19 -0
  194. package/apps/vibe/watch-server.mjs +108 -0
  195. package/contrib/openclaw-plugin/README.md +199 -0
  196. package/contrib/openclaw-plugin/index.ts +306 -0
  197. package/contrib/openclaw-plugin/openclaw.plugin.json +41 -0
  198. package/contrib/openclaw-plugin/package.json +27 -0
  199. package/contrib/openclaw-plugin/skills/crewswarm/SKILL.md +88 -0
  200. package/crew-lead.mjs +649 -0
  201. package/engines/claude-code.json +36 -0
  202. package/engines/codex.json +37 -0
  203. package/engines/crew-cli.json +42 -0
  204. package/engines/cursor.json +40 -0
  205. package/engines/docker-sandbox.json +38 -0
  206. package/engines/gemini-cli.json +75 -0
  207. package/engines/opencode.json +31 -0
  208. package/gateway-bridge.mjs +1575 -0
  209. package/install.sh +738 -0
  210. package/lib/agent-registry.mjs +232 -0
  211. package/lib/agents/daemon.mjs +121 -0
  212. package/lib/agents/dispatch.mjs +225 -0
  213. package/lib/agents/permissions.mjs +90 -0
  214. package/lib/agents/platform-formatting.mjs +102 -0
  215. package/lib/agents/registry.mjs +81 -0
  216. package/lib/agents/tool-instructions.mjs +257 -0
  217. package/lib/agents/validation.mjs +75 -0
  218. package/lib/approval/policy-manager.mjs +221 -0
  219. package/lib/autoharness/index.mjs +391 -0
  220. package/lib/bridges/cli-executor.mjs +332 -0
  221. package/lib/bridges/gateway-ws.mjs +345 -0
  222. package/lib/bridges/integration.mjs +229 -0
  223. package/lib/bridges/rag-helper.mjs +90 -0
  224. package/lib/browser/opencode-passthrough-filter.js +44 -0
  225. package/lib/browser/passthrough-stderr.js +109 -0
  226. package/lib/chat/autonomous-mentions.mjs +373 -0
  227. package/lib/chat/history.mjs +82 -0
  228. package/lib/chat/mention-routing-intent.mjs +136 -0
  229. package/lib/chat/participants.mjs +95 -0
  230. package/lib/chat/project-messages-rag.mjs +265 -0
  231. package/lib/chat/project-messages.mjs +479 -0
  232. package/lib/chat/shared-chat-prompt-overlay.mjs +52 -0
  233. package/lib/chat/thread-binding.mjs +34 -0
  234. package/lib/chat/unified-history.mjs +223 -0
  235. package/lib/chat/unified-wrapper.mjs +41 -0
  236. package/lib/cli-process-tracker.mjs +228 -0
  237. package/lib/collections/index.mjs +433 -0
  238. package/lib/contacts/identity-linker.mjs +248 -0
  239. package/lib/contacts/index.mjs +341 -0
  240. package/lib/crew-judge/PROMPT.md +93 -0
  241. package/lib/crew-judge/judge.mjs +260 -0
  242. package/lib/crew-lead/agent-manager.mjs +125 -0
  243. package/lib/crew-lead/background.mjs +270 -0
  244. package/lib/crew-lead/brain.mjs +110 -0
  245. package/lib/crew-lead/chat-handler.mjs +2603 -0
  246. package/lib/crew-lead/chat-handler.mjs.bak +1274 -0
  247. package/lib/crew-lead/classifier.mjs +83 -0
  248. package/lib/crew-lead/http-server.mjs +4824 -0
  249. package/lib/crew-lead/intent.mjs +102 -0
  250. package/lib/crew-lead/interval-manager.mjs +41 -0
  251. package/lib/crew-lead/llm-caller.mjs +544 -0
  252. package/lib/crew-lead/prompts.mjs +392 -0
  253. package/lib/crew-lead/retry-manager.mjs +118 -0
  254. package/lib/crew-lead/tools.mjs +318 -0
  255. package/lib/crew-lead/wave-dispatcher.mjs +798 -0
  256. package/lib/crew-lead/waves-config.json +73 -0
  257. package/lib/crew-lead/waves-loader.mjs +110 -0
  258. package/lib/crew-lead/ws-router.mjs +428 -0
  259. package/lib/dispatch/parsers.mjs +299 -0
  260. package/lib/domain-planning/detector.mjs +196 -0
  261. package/lib/domain-planning/prompts/crew-pm-cli.md +96 -0
  262. package/lib/domain-planning/prompts/crew-pm-core.md +122 -0
  263. package/lib/domain-planning/prompts/crew-pm-frontend.md +111 -0
  264. package/lib/engines/crew-cli-sandbox.mjs +422 -0
  265. package/lib/engines/crew-cli.mjs +155 -0
  266. package/lib/engines/cursor-launcher.mjs +110 -0
  267. package/lib/engines/engine-registry.mjs +253 -0
  268. package/lib/engines/llm-direct.mjs +184 -0
  269. package/lib/engines/opencode.mjs +256 -0
  270. package/lib/engines/ouroboros.mjs +114 -0
  271. package/lib/engines/rt-envelope.mjs +1643 -0
  272. package/lib/engines/rt-envelope.mjs.backup-current +870 -0
  273. package/lib/engines/runners.mjs +1367 -0
  274. package/lib/gemini-cli-passthrough-noise.mjs +37 -0
  275. package/lib/integrations/code-search.mjs +259 -0
  276. package/lib/integrations/greptile.mjs +148 -0
  277. package/lib/integrations/multimodal.mjs +313 -0
  278. package/lib/integrations/telegram-streaming.mjs +153 -0
  279. package/lib/integrations/tts.mjs +312 -0
  280. package/lib/integrations/twitter-links.mjs +294 -0
  281. package/lib/memory/shared-adapter.mjs +296 -0
  282. package/lib/pipeline/manager.mjs +539 -0
  283. package/lib/preferences/extractor.mjs +347 -0
  284. package/lib/project-dir.mjs +20 -0
  285. package/lib/runtime/config.mjs +388 -0
  286. package/lib/runtime/dlq.mjs +170 -0
  287. package/lib/runtime/log-rotation.mjs +82 -0
  288. package/lib/runtime/logger.mjs +58 -0
  289. package/lib/runtime/memory.mjs +421 -0
  290. package/lib/runtime/paths.mjs +76 -0
  291. package/lib/runtime/project-dir.mjs +127 -0
  292. package/lib/runtime/spending.mjs +204 -0
  293. package/lib/runtime/startup-guard.mjs +291 -0
  294. package/lib/runtime/task-lease.mjs +234 -0
  295. package/lib/runtime/telemetry-schema.mjs +208 -0
  296. package/lib/runtime/telemetry.mjs +101 -0
  297. package/lib/runtime/utils.mjs +64 -0
  298. package/lib/skills/index.mjs +265 -0
  299. package/lib/tools/browser.mjs +135 -0
  300. package/lib/tools/executor.mjs +913 -0
  301. package/lib/types.d.ts +57 -0
  302. package/package.json +106 -0
  303. package/pm-loop.mjs +1626 -0
  304. package/prompts/coder-back.md +27 -0
  305. package/prompts/coder-front.md +27 -0
  306. package/prompts/coder.md +28 -0
  307. package/prompts/copywriter.md +17 -0
  308. package/prompts/fixer.md +39 -0
  309. package/prompts/frontend.md +23 -0
  310. package/prompts/github.md +24 -0
  311. package/prompts/main.md +39 -0
  312. package/prompts/pm-cli.md +95 -0
  313. package/prompts/pm-core.md +121 -0
  314. package/prompts/pm-frontend.md +110 -0
  315. package/prompts/pm.md +234 -0
  316. package/prompts/qa.md +44 -0
  317. package/prompts/security.md +19 -0
  318. package/scripts/build-crew-chat.sh +28 -0
  319. package/scripts/build-llms-full.mjs +52 -0
  320. package/scripts/chatmock-login.sh +16 -0
  321. package/scripts/chatmock-serve.sh +16 -0
  322. package/scripts/check-dashboard.mjs +88 -0
  323. package/scripts/crew-scribe.mjs +326 -0
  324. package/scripts/dashboard-helpers.mjs +391 -0
  325. package/scripts/dashboard-validation.mjs +198 -0
  326. package/scripts/dashboard.mjs +9717 -0
  327. package/scripts/dlq-replay.mjs +61 -0
  328. package/scripts/doctor.mjs +196 -0
  329. package/scripts/file-lock.mjs +186 -0
  330. package/scripts/fresh-machine-smoke.sh +323 -0
  331. package/scripts/generate-changelog.mjs +227 -0
  332. package/scripts/generate-openapi.mjs +334 -0
  333. package/scripts/health-check.mjs +229 -0
  334. package/scripts/install-docker.sh +213 -0
  335. package/scripts/mcp-server.mjs +1625 -0
  336. package/scripts/opencrew-rt-daemon.mjs +568 -0
  337. package/scripts/openswitchctl +646 -0
  338. package/scripts/refactor-configs.mjs +39 -0
  339. package/scripts/release-check.sh +46 -0
  340. package/scripts/resolve-node-bin.sh +25 -0
  341. package/scripts/restart-all-from-repo.sh +329 -0
  342. package/scripts/restart-crew-lead.sh +98 -0
  343. package/scripts/restart-dashboard.sh +104 -0
  344. package/scripts/restart-service.sh +274 -0
  345. package/scripts/run-accessibility-audit.mjs +356 -0
  346. package/scripts/run-integration-bounded.mjs +188 -0
  347. package/scripts/run-scheduled-pipeline.mjs +230 -0
  348. package/scripts/run.mjs +41 -0
  349. package/scripts/scan-skills.mjs +79 -0
  350. package/scripts/setup-firewall.sh +128 -0
  351. package/scripts/smoke-dispatch.mjs +149 -0
  352. package/scripts/smoke.sh +163 -0
  353. package/scripts/start-crew.mjs +328 -0
  354. package/scripts/start.mjs +146 -0
  355. package/scripts/swiftbar-restart-service.sh +19 -0
  356. package/scripts/sync-agents.mjs +152 -0
  357. package/scripts/sync-prompts.mjs +79 -0
  358. package/scripts/validate-config.mjs +337 -0
  359. package/scripts/wow.mjs +89 -0
  360. package/telegram-bridge.mjs +2421 -0
  361. package/unified-orchestrator.mjs +519 -0
  362. 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