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,256 @@
1
+ import { spawn, execFileSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+
5
+ let _deps = {};
6
+
7
+ export function initOpenCode(deps) {
8
+ _deps = deps;
9
+ }
10
+
11
+ export function runOpenCodeTask(prompt, payload = {}) {
12
+ const {
13
+ CREWSWARM_OPENCODE_BIN, CREWSWARM_RT_AGENT, CREWSWARM_OPENCODE_MODEL,
14
+ CREWSWARM_OPENCODE_TIMEOUT_MS, CREWSWARM_OPENCODE_AGENT,
15
+ getAgentOpenCodeConfig, getOpencodeProjectDir,
16
+ extractProjectDirFromTask, readAgentSessionId, writeAgentSessionId,
17
+ parseMostRecentSessionId, isOpencodeRateLimitBanner,
18
+ } = _deps;
19
+ return new Promise((resolve, reject) => {
20
+ const bin = fs.existsSync(CREWSWARM_OPENCODE_BIN) ? CREWSWARM_OPENCODE_BIN : "opencode";
21
+ // Model priority: explicit payload > per-agent opencodeModel > global default
22
+ const agentId = String(payload?.agentId || payload?.agent || CREWSWARM_RT_AGENT || "");
23
+ const agentOcCfg = getAgentOpenCodeConfig(agentId);
24
+ const model = String(payload?.model || agentOcCfg.model || CREWSWARM_OPENCODE_MODEL);
25
+ const OC_AGENT_MAP = {
26
+ "crew-coder": "coder",
27
+ "crew-coder-front": "coder-front",
28
+ "crew-coder-back": "coder-back",
29
+ "crew-fixer": "fixer",
30
+ "crew-frontend": "frontend",
31
+ "crew-qa": "qa",
32
+ "crew-security": "security",
33
+ "crew-pm": "pm",
34
+ "crew-main": "main",
35
+ "crew-copywriter": "copywriter",
36
+ "crew-github": "github",
37
+ "crew-orchestrator": "orchestrator",
38
+ "orchestrator": "orchestrator",
39
+ };
40
+ const ocAgentName = OC_AGENT_MAP[agentId] || agentId.replace(/^crew-/, "") || payload?.agent || CREWSWARM_OPENCODE_AGENT || "admin";
41
+ const agent = String(ocAgentName).trim();
42
+ const configuredDir = getOpencodeProjectDir();
43
+ let projectDir = payload?.projectDir || configuredDir || null;
44
+ // Only fall through to task-text extraction when NO dir is configured at all.
45
+ // Avoid when configuredDir === process.cwd() — extractProjectDirFromTask can
46
+ // pick up sentence-ending periods (e.g. "…/crewswarm.") producing an invalid cwd.
47
+ if (!projectDir) {
48
+ const fromTask = extractProjectDirFromTask(prompt);
49
+ if (fromTask) projectDir = fromTask;
50
+ }
51
+ // Strip trailing punctuation that sentence parsing may have attached to the path.
52
+ projectDir = String(projectDir || process.cwd()).replace(/[.,;!?]+$/, "");
53
+ if (!payload?.projectDir && !configuredDir && projectDir === process.cwd()) {
54
+ console.warn(`[OpenCode] No project dir configured — writing to cwd (${process.cwd()}). Set one in Dashboard → Settings → OpenCode Project Directory.`);
55
+ }
56
+ const defaultWorkspaceRoot = String(
57
+ configuredDir || process.cwd(),
58
+ ).replace(/[.,;!?]+$/, "");
59
+ let skipSessionResume = /^1|true|yes$/i.test(
60
+ String(process.env.CREWSWARM_OPENCODE_NO_SESSION_RESUME || ""),
61
+ );
62
+ if (payload?.projectDir) {
63
+ try {
64
+ if (
65
+ path.resolve(projectDir) !== path.resolve(defaultWorkspaceRoot)
66
+ ) {
67
+ skipSessionResume = true;
68
+ console.error(
69
+ `[OpenCode] Task projectDir differs from default workspace — not resuming session (avoids external_directory auto-reject).`,
70
+ );
71
+ }
72
+ } catch { /* ignore */ }
73
+ }
74
+ const agentPrefix = agentId ? `[${agentId}] ` : "";
75
+ const titledPrompt = agentPrefix + String(prompt);
76
+ // Omit --dir to avoid triggering opencode's rg (ripgrep) spawn without stdin:ignore
77
+ // (opencode bug: rg hangs waiting for stdin when --dir is passed — PR pending).
78
+ // cwd on the spawn call below sets the working directory equivalently.
79
+ const args = ["run", titledPrompt, "--model", model];
80
+ if (agent) args.push("--agent", agent);
81
+
82
+ // Session continuity: reuse the agent's last session so it remembers previous work
83
+ const existingSessionId = readAgentSessionId(agentId);
84
+ if (existingSessionId && !skipSessionResume) {
85
+ args.push("--session", existingSessionId);
86
+ console.error(`[OpenCode] Continuing session ${existingSessionId} for ${agentId}`);
87
+ } else if (existingSessionId && skipSessionResume) {
88
+ console.error(
89
+ `[OpenCode] Fresh run for ${agentId} (session ${existingSessionId} not reused for this projectDir)`,
90
+ );
91
+ }
92
+
93
+ console.error(`[OpenCode] Running: ${bin} run [prompt] --model ${model} (cwd=${projectDir})`);
94
+
95
+ const cleanEnv = { ...process.env };
96
+ delete cleanEnv.OPENCODE_SERVER_USERNAME;
97
+ delete cleanEnv.OPENCODE_SERVER_PASSWORD;
98
+ delete cleanEnv.OPENCODE_CLIENT;
99
+ delete cleanEnv.OPENCODE;
100
+
101
+ // Helper: restart opencode serve if it's not responding (causes ENOENT on spawn)
102
+ async function ensureOpencodeServe() {
103
+ try {
104
+ const r = await fetch("http://127.0.0.1:4096/", { signal: AbortSignal.timeout(2000) }).catch(() => null);
105
+ if (r && r.ok) return; // serve is healthy
106
+ } catch {}
107
+ // Serve is down — kill any stale instance and restart
108
+ console.warn("[OpenCode] serve not responding — restarting...");
109
+ try { spawn("pkill", ["-f", "opencode serve"], { stdio: "ignore" }); } catch {}
110
+ await new Promise(r => setTimeout(r, 1500));
111
+ const serveProc = spawn(bin, ["serve", "--port", "4096", "--hostname", "127.0.0.1"], {
112
+ detached: true, stdio: "ignore", env: cleanEnv,
113
+ });
114
+ serveProc.unref();
115
+ await new Promise(r => setTimeout(r, 3000)); // wait for serve to be ready
116
+ console.warn("[OpenCode] serve restarted");
117
+ }
118
+
119
+ // Validate cwd exists — spawn throws ENOENT if the directory doesn't exist
120
+ const safeProjectDir = (projectDir && fs.existsSync(projectDir)) ? projectDir : process.cwd();
121
+ if (safeProjectDir !== projectDir) {
122
+ console.warn(`[OpenCode] projectDir "${projectDir}" does not exist, using cwd: ${safeProjectDir}`);
123
+ }
124
+
125
+ const child = spawn(bin, args, {
126
+ cwd: safeProjectDir,
127
+ env: cleanEnv,
128
+ stdio: ["ignore", "pipe", "pipe"],
129
+ });
130
+
131
+ let stdout = "";
132
+ let stderr = "";
133
+ let lastProgressAt = Date.now();
134
+ const agentLabel = agentId || CREWSWARM_RT_AGENT || "opencode";
135
+
136
+ // Emit agent_working event so dashboard + SwiftBar can show live indicator
137
+ _deps._rtClientForApprovals?.publish({ channel: "events", type: "agent_working", to: "broadcast", payload: { agent: agentLabel, model, ts: Date.now() } });
138
+
139
+ const timer = setTimeout(() => {
140
+ child.kill("SIGTERM");
141
+ // SIGKILL fallback if SIGTERM doesn't work within 5 seconds
142
+ setTimeout(() => {
143
+ if (child.exitCode === null && !child.killed) {
144
+ console.warn(`[OpenCode:${agentLabel}] SIGTERM failed, sending SIGKILL`);
145
+ child.kill("SIGKILL");
146
+ }
147
+ }, 5000);
148
+ reject(new Error(`OpenCode timeout after ${CREWSWARM_OPENCODE_TIMEOUT_MS}ms`));
149
+ }, CREWSWARM_OPENCODE_TIMEOUT_MS);
150
+
151
+ // Stream progress to log and RT bus so you can watch it live
152
+ child.stdout.on("data", (d) => {
153
+ const chunk = d.toString("utf8");
154
+ stdout += chunk;
155
+ lastProgressAt = Date.now();
156
+ const lines = chunk.split("\n").map(l => l.trim()).filter(Boolean);
157
+ for (const line of lines) {
158
+ console.log(`[OpenCode:${agentLabel}] ${line}`);
159
+ }
160
+ });
161
+ // Lines from OpenCode stderr that are known-harmless and must NOT be returned
162
+ // as task output or logged as errors — they would poison agent conversation history.
163
+ const OC_NOISE_PATTERNS = [
164
+ /realtime\s+daemon\s+error/i,
165
+ /invalid\s+realtime\s+token/i,
166
+ /realtime\s+error:/i,
167
+ /ExperimentalWarning/i,
168
+ /--experimental/i,
169
+ ];
170
+ const isOcNoise = (line) => OC_NOISE_PATTERNS.some(p => p.test(line));
171
+
172
+ child.stderr.on("data", (d) => {
173
+ const chunk = d.toString("utf8");
174
+ lastProgressAt = Date.now();
175
+ const lines = chunk.split("\n").map(l => l.trim()).filter(Boolean);
176
+ for (const line of lines) {
177
+ if (isOcNoise(line)) continue; // swallow — don't accumulate, don't log
178
+ stderr += line + "\n";
179
+ console.log(`[OpenCode:${agentLabel}] ${line}`);
180
+ }
181
+ });
182
+ // Stall detector — kill and reject if no output for too long so fallback can kick in
183
+ const STALL_TIMEOUT_MS = 180_000;
184
+ const stallCheck = setInterval(() => {
185
+ const stalledMs = Date.now() - lastProgressAt;
186
+ if (stalledMs > STALL_TIMEOUT_MS) {
187
+ clearTimeout(timer);
188
+ clearInterval(stallCheck);
189
+ child.kill("SIGTERM");
190
+ // SIGKILL fallback for stalled processes
191
+ setTimeout(() => {
192
+ if (child.exitCode === null && !child.killed) {
193
+ console.warn(`[OpenCode:${agentLabel}] Stall SIGTERM failed, sending SIGKILL`);
194
+ child.kill("SIGKILL");
195
+ }
196
+ }, 5000);
197
+ console.warn(`[OpenCode:${agentLabel}] No output for ${Math.round(stalledMs/1000)}s — killing and triggering fallback`);
198
+ _deps._rtClientForApprovals?.publish({ channel: "events", type: "agent_idle", to: "broadcast", payload: { agent: agentLabel, stalled: true, ts: Date.now() } });
199
+ reject(new Error(`OpenCode stalled (no output for ${Math.round(stalledMs/1000)}s)`));
200
+ } else if (stalledMs > 60000) {
201
+ console.warn(`[OpenCode:${agentLabel}] No output for ${Math.round(stalledMs/1000)}s — may be stalled`);
202
+ }
203
+ }, 30000);
204
+ child.on("error", (err) => {
205
+ clearTimeout(timer);
206
+ clearInterval(stallCheck);
207
+ reject(err);
208
+ });
209
+ child.on("close", (code) => {
210
+ clearTimeout(timer);
211
+ clearInterval(stallCheck);
212
+ // stdout is the actual task reply; stderr (already noise-filtered above) is diagnostics only.
213
+ // Never let stderr noise (realtime token errors etc.) become the returned output.
214
+ const out = (stdout || stderr || "").trim();
215
+ if (code !== 0) {
216
+ // If the only non-empty output is noise that slipped through, treat as unknown error
217
+ const cleanOut = out.replace(/• ?(realtime daemon error|invalid realtime token)[^\n]*/gi, "").trim();
218
+ const bannerOnly = isOpencodeRateLimitBanner(cleanOut || out);
219
+ if (bannerOnly) {
220
+ console.warn(`[OpenCode:${agentLabel}] Rate limit detected (banner-only exit null) — will rotate model`);
221
+ reject(new Error(`OpenCode rate limited (banner-only): ${model}`));
222
+ } else {
223
+ const errMsg = cleanOut || "unknown error (possibly realtime token noise — task may have succeeded)";
224
+ console.error(`[OpenCode:${agentLabel}] Failed (exit ${code}): ${errMsg.slice(0, 300)}`);
225
+ reject(new Error(`OpenCode exited ${code}: ${errMsg}`));
226
+ }
227
+ return;
228
+ }
229
+ console.log(`[OpenCode:${agentLabel}] Done — ${out.length} chars output`);
230
+ _deps._rtClientForApprovals?.publish({ channel: "events", type: "agent_idle", to: "broadcast", payload: { agent: agentLabel, ts: Date.now() } });
231
+
232
+ // Persist the session ID for this agent so the next task continues from here.
233
+ // Filter by agentPrefix (e.g. "[crew-coder]") so parallel agents don't steal
234
+ // each other's most-recent session when finishing at the same time.
235
+ if (agentId) {
236
+ try {
237
+ const listOut = execFileSync(bin, ["session", "list"], {
238
+ cwd: projectDir, env: cleanEnv, timeout: 8000, encoding: "utf8",
239
+ });
240
+ const prefix = agentId ? `[${agentId}]` : null;
241
+ const newSessionId = parseMostRecentSessionId(listOut, prefix);
242
+ if (newSessionId) {
243
+ writeAgentSessionId(agentId, newSessionId);
244
+ console.error(`[OpenCode:${agentLabel}] Session saved: ${newSessionId}`);
245
+ } else {
246
+ console.warn(`[OpenCode:${agentLabel}] No matching session found for prefix "${prefix}" — session not saved`);
247
+ }
248
+ } catch (sessErr) {
249
+ console.warn(`[OpenCode:${agentLabel}] Could not save session: ${sessErr.message}`);
250
+ }
251
+ }
252
+
253
+ resolve(out || "(opencode completed with no output)");
254
+ });
255
+ });
256
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Ouroboros-style LLM ↔ engine loop — extracted from gateway-bridge.mjs
3
+ * Runs a multi-step loop: the loop brain LLM decomposes a task into STEP/DONE
4
+ * instructions, each STEP is executed by the chosen engine, results feed back.
5
+ *
6
+ * Inject: initOuroboros({ loadAgentList, loadLoopBrainConfig, loadAgentPrompts,
7
+ * callLLMDirect, buildMiniTaskForOpenCode,
8
+ * runCursorCliTask, runClaudeCodeTask,
9
+ * runCodexTask, runOpenCodeTask })
10
+ */
11
+
12
+ let _deps = {};
13
+
14
+ export function initOuroboros(deps) {
15
+ _deps = deps;
16
+ }
17
+
18
+ export async function runOuroborosStyleLoop(originalTask, agentId, projectDir, payload, progress, engine = "opencode") {
19
+ const {
20
+ loadAgentList, loadLoopBrainConfig, loadAgentPrompts, callLLMDirect,
21
+ buildMiniTaskForOpenCode, runCursorCliTask, runClaudeCodeTask,
22
+ runCodexTask, runOpenCodeTask,
23
+ } = _deps;
24
+
25
+ const agentCfg = loadAgentList().find(a => a.id === agentId) || {};
26
+ const maxRounds = Math.min(20, Math.max(1,
27
+ agentCfg.opencodeLoopMaxRounds ||
28
+ parseInt(process.env.CREWSWARM_ENGINE_LOOP_MAX_ROUNDS || "10", 10)
29
+ ));
30
+
31
+ // Central loop brain: one fast model controls all STEP/DONE decisions.
32
+ // Falls back to agent's own model if loopBrain not configured.
33
+ const loopBrain = loadLoopBrainConfig();
34
+ const agentPrompts = loadAgentPrompts();
35
+ const bareId = agentId ? agentId.replace(/^crew-/, "") : null;
36
+ const rolePrompt = (agentId && agentPrompts[agentId]) || (bareId && agentPrompts[bareId]) || "";
37
+ const DECOMPOSER_SYSTEM = [
38
+ "You are a task decomposer controlling a specialist AI agent.",
39
+ rolePrompt ? `The agent's role: ${rolePrompt.slice(0, 300)}` : "",
40
+ "Output exactly one line: either STEP: <one clear instruction for the agent to execute now> or DONE.",
41
+ "No other text. Be specific and actionable. DONE only when the full task is complete.",
42
+ ].filter(Boolean).join("\n");
43
+
44
+ const engineLabel = engine === "cursor" ? "Cursor CLI" : engine === "claude" ? "Claude Code" : engine === "docker-sandbox" ? "Docker Sandbox" : "OpenCode";
45
+ const brainLabel = loopBrain ? `${loopBrain.modelId} (central brain)` : `${agentId} model`;
46
+ progress(`Loop brain: ${brainLabel} | Engine: ${engineLabel} | Max ${maxRounds} rounds`);
47
+
48
+ const steps = [];
49
+ let prompt = `${originalTask}\n\nOutput the first step: STEP: <instruction> or DONE.`;
50
+ let lastReply = "";
51
+
52
+ for (let round = 0; round < maxRounds; round++) {
53
+ // Use central brain if configured, otherwise fall back to agent's own model
54
+ let reply;
55
+ if (loopBrain) {
56
+ const messages = [
57
+ { role: "system", content: DECOMPOSER_SYSTEM },
58
+ { role: "user", content: prompt },
59
+ ];
60
+ try {
61
+ // Reasoning models (o1/o3/gpt-5 series) don't support max_tokens parameter
62
+ const isReasoningModel = /^(o1|o3|gpt-5)/i.test(loopBrain.modelId);
63
+ const payload = { model: loopBrain.modelId, messages, stream: false };
64
+ if (!isReasoningModel) {
65
+ payload.max_tokens = 256;
66
+ }
67
+ const res = await fetch(`${loopBrain.baseUrl.replace(/\/$/, "")}/chat/completions`, {
68
+ method: "POST",
69
+ headers: { "content-type": "application/json", authorization: `Bearer ${loopBrain.apiKey}` },
70
+ body: JSON.stringify(payload),
71
+ signal: AbortSignal.timeout(30000),
72
+ });
73
+ if (res.ok) {
74
+ const data = await res.json();
75
+ reply = data?.choices?.[0]?.message?.content?.trim() || "";
76
+ }
77
+ } catch (e) {
78
+ console.warn(`[loop-brain] Central brain failed (${e.message}) — falling back to agent model`);
79
+ }
80
+ }
81
+ if (!reply) reply = await callLLMDirect(prompt, agentId, DECOMPOSER_SYSTEM);
82
+ if (!reply || !reply.trim()) break;
83
+ lastReply = reply.trim();
84
+
85
+ if (/^\s*DONE\s*$/im.test(lastReply) || /\bDONE\s*$/im.test(lastReply)) break;
86
+
87
+ const stepMatch = lastReply.match(/STEP:\s*([\s\S]+?)(?:\n\n|\n*$)/im) || lastReply.match(/STEP:\s*(.+)/i);
88
+ const step = stepMatch ? stepMatch[1].trim().replace(/\n.*/gs, "").trim() : lastReply.slice(0, 500);
89
+ if (!step) break;
90
+
91
+ progress(`[${engineLabel} loop] Round ${round + 1}/${maxRounds}: ${step.slice(0, 60)}${step.length > 60 ? "…" : ""}`);
92
+
93
+ const miniTask = await buildMiniTaskForOpenCode(step, agentId, projectDir);
94
+ let stepResult;
95
+ try {
96
+ if (engine === "cursor") {
97
+ stepResult = await runCursorCliTask(miniTask, { ...payload, agentId, projectDir });
98
+ } else if (engine === "claude") {
99
+ stepResult = await runClaudeCodeTask(miniTask, { ...payload, agentId, projectDir });
100
+ } else if (engine === "codex") {
101
+ stepResult = await runCodexTask(miniTask, { ...payload, agentId, projectDir });
102
+ } else {
103
+ stepResult = await runOpenCodeTask(miniTask, payload);
104
+ }
105
+ } catch (e) {
106
+ stepResult = `Error: ${e?.message || String(e)}`;
107
+ }
108
+ steps.push({ step, result: stepResult });
109
+ prompt = `Task: ${originalTask}\n\nCompleted steps:\n${steps.map((s, i) => `${i + 1}. ${s.step}\nResult: ${s.result}`).join("\n\n")}\n\nWhat is the next step? Reply with exactly: STEP: <instruction> or DONE.`;
110
+ }
111
+
112
+ if (steps.length === 0) return lastReply || "No steps executed.";
113
+ return steps.map(s => s.result).join("\n\n---\n\n");
114
+ }