crewswarm 0.9.1 → 0.9.3

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 (210) hide show
  1. package/README.md +22 -9
  2. package/apps/dashboard/dist/assets/{chat-core-Cx4sTxDd.js → chat-core-3KirthZA.js} +1 -1
  3. package/apps/dashboard/dist/assets/index-GSWxxEPO.js +2 -0
  4. package/apps/dashboard/dist/assets/{tab-pm-loop-tab-Bfd449B4.js → tab-pm-loop-tab-DiAPTJXu.js} +1 -1
  5. package/apps/dashboard/dist/assets/{tab-projects-tab-DhNWnlzt.js → tab-projects-tab-SFH4E--a.js} +1 -1
  6. package/apps/dashboard/dist/assets/tab-settings-tab-BselH1c0.js +1 -0
  7. package/apps/dashboard/dist/index.html +82 -11
  8. package/apps/vibe/README.md +2 -2
  9. package/apps/vibe/package.json +1 -1
  10. package/apps/vibe/server.mjs +3 -3
  11. package/crew-lead.mjs +48 -5
  12. package/lib/bridges/gateway-ws.mjs +4 -0
  13. package/lib/bridges/tmux-bridge.mjs +200 -0
  14. package/lib/cli-process-tracker.mjs +2 -1
  15. package/lib/crew-lead/chat-handler.mjs +34 -0
  16. package/lib/crew-lead/http-server.mjs +340 -14
  17. package/lib/crew-lead/llm-caller.mjs +24 -8
  18. package/lib/crew-lead/prompts.mjs +7 -0
  19. package/lib/crew-lead/wave-dispatcher.mjs +53 -3
  20. package/lib/crew-lead/ws-router.mjs +219 -27
  21. package/lib/engines/engine-registry.mjs +9 -0
  22. package/lib/engines/rt-envelope.mjs +1 -0
  23. package/lib/engines/runners.mjs +26 -2
  24. package/lib/runtime/config.mjs +7 -0
  25. package/lib/runtime/paths.mjs +12 -8
  26. package/lib/sessions/session-manager.mjs +287 -0
  27. package/package.json +35 -15
  28. package/scripts/capture-build-flow.mjs +118 -0
  29. package/scripts/coverage-report.mjs +209 -0
  30. package/scripts/coverage-summary.mjs +47 -0
  31. package/scripts/dashboard-validation.mjs +74 -0
  32. package/scripts/dashboard.mjs +560 -70
  33. package/scripts/live-bridge-matrix.mjs +79 -0
  34. package/scripts/live-cli-matrix.mjs +166 -0
  35. package/scripts/live-crewchat-check.mjs +42 -0
  36. package/scripts/live-engine-matrix.mjs +50 -0
  37. package/scripts/live-provider-failover-matrix.mjs +107 -0
  38. package/scripts/live-provider-matrix.mjs +228 -0
  39. package/scripts/restart-all-from-repo.sh +4 -4
  40. package/scripts/smoke-dispatch.mjs +4 -1
  41. package/scripts/test-blast-radius.mjs +204 -0
  42. package/scripts/test-report-summary.mjs +88 -0
  43. package/scripts/test-reporter.mjs +651 -0
  44. package/scripts/test-rerun.mjs +136 -0
  45. package/scripts/tmux-bridge +130 -0
  46. package/apps/dashboard/dist/assets/chat-core-Cx4sTxDd.js.br +0 -0
  47. package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js.br +0 -0
  48. package/apps/dashboard/dist/assets/components-BS9fQjE_.js.br +0 -0
  49. package/apps/dashboard/dist/assets/core-utils-CmOkXgzi.js.br +0 -0
  50. package/apps/dashboard/dist/assets/index-CF0aJRtC.css.br +0 -0
  51. package/apps/dashboard/dist/assets/index-DnClJ1ee.js +0 -2
  52. package/apps/dashboard/dist/assets/index-DnClJ1ee.js.br +0 -0
  53. package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js.br +0 -0
  54. package/apps/dashboard/dist/assets/setup-wizard-CA0Or47w.js.br +0 -0
  55. package/apps/dashboard/dist/assets/tab-agents-tab-BgpIsjkw.js.br +0 -0
  56. package/apps/dashboard/dist/assets/tab-comms-tab-kguqTIzD.js.br +0 -0
  57. package/apps/dashboard/dist/assets/tab-contacts-tab-DiOyMYth.js.br +0 -0
  58. package/apps/dashboard/dist/assets/tab-engines-tab-BsdZVvU0.js.br +0 -0
  59. package/apps/dashboard/dist/assets/tab-memory-tab-Cu6u13EQ.js.br +0 -0
  60. package/apps/dashboard/dist/assets/tab-models-tab-BLEjmd19.js.br +0 -0
  61. package/apps/dashboard/dist/assets/tab-pm-loop-tab-Bfd449B4.js.br +0 -0
  62. package/apps/dashboard/dist/assets/tab-projects-tab-DhNWnlzt.js.br +0 -0
  63. package/apps/dashboard/dist/assets/tab-prompts-tab-DVkUNaJd.js.br +0 -0
  64. package/apps/dashboard/dist/assets/tab-services-tab-DU_LH3uG.js.br +0 -0
  65. package/apps/dashboard/dist/assets/tab-settings-tab-Bn4nXtDe.js +0 -1
  66. package/apps/dashboard/dist/assets/tab-settings-tab-Bn4nXtDe.js.br +0 -0
  67. package/apps/dashboard/dist/assets/tab-skills-tab-BpY0uZHW.js.br +0 -0
  68. package/apps/dashboard/dist/assets/tab-spending-tab-DEccQHnt.js.br +0 -0
  69. package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BNrd88-r.js.br +0 -0
  70. package/apps/dashboard/dist/assets/tab-swarm-tab-B1AcjL1W.js.br +0 -0
  71. package/apps/dashboard/dist/assets/tab-usage-tab-BIOOnB-Y.js.br +0 -0
  72. package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js.br +0 -0
  73. package/apps/dashboard/dist/assets/tab-workflows-tab-B-soSy1k.js.br +0 -0
  74. package/apps/dashboard/dist/index.html.br +0 -0
  75. package/apps/dashboard/index.html +0 -6459
  76. package/apps/dashboard/package.json +0 -15
  77. package/apps/dashboard/src/app.js +0 -2823
  78. package/apps/dashboard/src/app.js.br +0 -0
  79. package/apps/dashboard/src/app.js.gz +0 -0
  80. package/apps/dashboard/src/chat/chat-actions.js +0 -1847
  81. package/apps/dashboard/src/chat/chat-actions.js.br +0 -0
  82. package/apps/dashboard/src/chat/unified-messages.js +0 -327
  83. package/apps/dashboard/src/chat/unified-messages.js.br +0 -0
  84. package/apps/dashboard/src/cli-process.js +0 -208
  85. package/apps/dashboard/src/cli-process.js.br +0 -0
  86. package/apps/dashboard/src/cli-process.js.gz +0 -0
  87. package/apps/dashboard/src/components/active-tasks-panel.js +0 -175
  88. package/apps/dashboard/src/components/active-tasks-panel.js.br +0 -0
  89. package/apps/dashboard/src/core/api.js +0 -18
  90. package/apps/dashboard/src/core/api.js.br +0 -0
  91. package/apps/dashboard/src/core/dom.js +0 -228
  92. package/apps/dashboard/src/core/dom.js.br +0 -0
  93. package/apps/dashboard/src/core/state.js +0 -91
  94. package/apps/dashboard/src/core/state.js.br +0 -0
  95. package/apps/dashboard/src/core/task-manager.js +0 -134
  96. package/apps/dashboard/src/core/task-manager.js.br +0 -0
  97. package/apps/dashboard/src/orchestration-status.js +0 -127
  98. package/apps/dashboard/src/orchestration-status.js.br +0 -0
  99. package/apps/dashboard/src/setup-wizard.js +0 -562
  100. package/apps/dashboard/src/setup-wizard.js.br +0 -0
  101. package/apps/dashboard/src/styles.css +0 -2085
  102. package/apps/dashboard/src/styles.css.br +0 -0
  103. package/apps/dashboard/src/styles.css.gz +0 -0
  104. package/apps/dashboard/src/tabs/agents-tab.js +0 -2237
  105. package/apps/dashboard/src/tabs/agents-tab.js.br +0 -0
  106. package/apps/dashboard/src/tabs/benchmarks-tab.js +0 -229
  107. package/apps/dashboard/src/tabs/benchmarks-tab.js.br +0 -0
  108. package/apps/dashboard/src/tabs/comms-tab.js +0 -955
  109. package/apps/dashboard/src/tabs/comms-tab.js.br +0 -0
  110. package/apps/dashboard/src/tabs/contacts-tab.js +0 -654
  111. package/apps/dashboard/src/tabs/contacts-tab.js.br +0 -0
  112. package/apps/dashboard/src/tabs/engines-tab.js +0 -175
  113. package/apps/dashboard/src/tabs/engines-tab.js.br +0 -0
  114. package/apps/dashboard/src/tabs/memory-tab.js +0 -182
  115. package/apps/dashboard/src/tabs/memory-tab.js.br +0 -0
  116. package/apps/dashboard/src/tabs/models-tab.js +0 -450
  117. package/apps/dashboard/src/tabs/models-tab.js.br +0 -0
  118. package/apps/dashboard/src/tabs/pm-loop-tab.js +0 -185
  119. package/apps/dashboard/src/tabs/pm-loop-tab.js.br +0 -0
  120. package/apps/dashboard/src/tabs/projects-tab.js +0 -663
  121. package/apps/dashboard/src/tabs/projects-tab.js.br +0 -0
  122. package/apps/dashboard/src/tabs/projects-tab.js.gz +0 -0
  123. package/apps/dashboard/src/tabs/prompts-tab.js +0 -160
  124. package/apps/dashboard/src/tabs/prompts-tab.js.br +0 -0
  125. package/apps/dashboard/src/tabs/services-tab.js +0 -202
  126. package/apps/dashboard/src/tabs/services-tab.js.br +0 -0
  127. package/apps/dashboard/src/tabs/settings-tab.js +0 -803
  128. package/apps/dashboard/src/tabs/settings-tab.js.br +0 -0
  129. package/apps/dashboard/src/tabs/skills-tab.js +0 -284
  130. package/apps/dashboard/src/tabs/skills-tab.js.br +0 -0
  131. package/apps/dashboard/src/tabs/spending-tab.js +0 -173
  132. package/apps/dashboard/src/tabs/spending-tab.js.br +0 -0
  133. package/apps/dashboard/src/tabs/swarm-chat-tab.js +0 -660
  134. package/apps/dashboard/src/tabs/swarm-chat-tab.js.br +0 -0
  135. package/apps/dashboard/src/tabs/swarm-tab.js +0 -538
  136. package/apps/dashboard/src/tabs/swarm-tab.js.br +0 -0
  137. package/apps/dashboard/src/tabs/usage-tab.js +0 -390
  138. package/apps/dashboard/src/tabs/usage-tab.js.br +0 -0
  139. package/apps/dashboard/src/tabs/waves-tab.js +0 -238
  140. package/apps/dashboard/src/tabs/waves-tab.js.br +0 -0
  141. package/apps/dashboard/src/tabs/workflows-tab.js +0 -747
  142. package/apps/dashboard/src/tabs/workflows-tab.js.br +0 -0
  143. package/apps/vibe/.crew/agent-memory/pipeline.json +0 -304
  144. package/apps/vibe/.crew/cost.json +0 -17
  145. package/apps/vibe/.crew/json-parse-metrics.jsonl +0 -27
  146. package/apps/vibe/.crew/pipeline-metrics.jsonl +0 -27
  147. package/apps/vibe/.crew/pipeline-runs/pipeline-0f90c392-2425-4ae5-850c-bd9d17b1d690.jsonl +0 -5
  148. package/apps/vibe/.crew/pipeline-runs/pipeline-1c269dd9-a63f-4fba-af81-5cf08048ef06.jsonl +0 -5
  149. package/apps/vibe/.crew/pipeline-runs/pipeline-288a7765-da24-4a22-89bc-1f3cc9b0562c.jsonl +0 -5
  150. package/apps/vibe/.crew/pipeline-runs/pipeline-2c78fd22-a657-4bd1-bc49-0679fb384409.jsonl +0 -5
  151. package/apps/vibe/.crew/pipeline-runs/pipeline-3da23550-22ed-4904-9a0a-8e79c1f3024c.jsonl +0 -5
  152. package/apps/vibe/.crew/pipeline-runs/pipeline-3e6fe08d-3264-404a-8df3-aab7efef10e7.jsonl +0 -5
  153. package/apps/vibe/.crew/pipeline-runs/pipeline-42eec610-57fe-4e09-9e7e-b315038495c2.jsonl +0 -5
  154. package/apps/vibe/.crew/pipeline-runs/pipeline-4438eb4c-ae13-42b1-90e2-b043d8983be8.jsonl +0 -5
  155. package/apps/vibe/.crew/pipeline-runs/pipeline-4740a9f5-86e7-44b6-a394-de433e291727.jsonl +0 -5
  156. package/apps/vibe/.crew/pipeline-runs/pipeline-49e1da6a-957e-48fd-9220-415019e4f8e2.jsonl +0 -5
  157. package/apps/vibe/.crew/pipeline-runs/pipeline-4c9251db-be68-427b-a3fc-a264f2b5778d.jsonl +0 -5
  158. package/apps/vibe/.crew/pipeline-runs/pipeline-6413fa33-a802-4b57-a8c0-a9056ad67842.jsonl +0 -5
  159. package/apps/vibe/.crew/pipeline-runs/pipeline-65e29a57-664d-4196-8109-017e364f182e.jsonl +0 -5
  160. package/apps/vibe/.crew/pipeline-runs/pipeline-6aa04bc5-9593-4b1f-b58d-3bf2978cb602.jsonl +0 -5
  161. package/apps/vibe/.crew/pipeline-runs/pipeline-6e1cba53-9b70-457e-99e0-59199149dd21.jsonl +0 -5
  162. package/apps/vibe/.crew/pipeline-runs/pipeline-749f41cc-4dac-4204-be64-873a6080a0d2.jsonl +0 -5
  163. package/apps/vibe/.crew/pipeline-runs/pipeline-74d68121-e181-4864-bd9a-c3211341dfaf.jsonl +0 -5
  164. package/apps/vibe/.crew/pipeline-runs/pipeline-8509bc24-142d-4e07-b44a-a50bf99d1103.jsonl +0 -5
  165. package/apps/vibe/.crew/pipeline-runs/pipeline-960339c6-07ca-43ce-9900-f6e1702b39b9.jsonl +0 -5
  166. package/apps/vibe/.crew/pipeline-runs/pipeline-9bef2dd2-6122-42e5-b3d9-19f4d80f9e40.jsonl +0 -5
  167. package/apps/vibe/.crew/pipeline-runs/pipeline-9c6480a9-7031-4146-b241-825b9a2d1de1.jsonl +0 -5
  168. package/apps/vibe/.crew/pipeline-runs/pipeline-9fd42426-8492-4157-9d5f-e1537c060489.jsonl +0 -2
  169. package/apps/vibe/.crew/pipeline-runs/pipeline-ad6d40a3-2f5e-46a9-a345-47caaccc51aa.jsonl +0 -5
  170. package/apps/vibe/.crew/pipeline-runs/pipeline-bc606133-8d5b-4535-8d85-f1a29cdaa981.jsonl +0 -5
  171. package/apps/vibe/.crew/pipeline-runs/pipeline-c1418f4e-b773-4ca1-84a3-216acf36e2f2.jsonl +0 -5
  172. package/apps/vibe/.crew/pipeline-runs/pipeline-c1a13ccd-634a-4d01-a4a7-1177b8a752ff.jsonl +0 -5
  173. package/apps/vibe/.crew/pipeline-runs/pipeline-c7d27b42-249e-4bd4-8f26-6aa998110b8a.jsonl +0 -5
  174. package/apps/vibe/.crew/pipeline-runs/pipeline-cca2e9b9-4a34-4d25-a311-5c793fa7e91e.jsonl +0 -5
  175. package/apps/vibe/.crew/sandbox.json +0 -7
  176. package/apps/vibe/.crew/session.json +0 -330
  177. package/apps/vibe/.crew/training-data.jsonl +0 -0
  178. package/apps/vibe/.github/workflows/studio-quality.yml +0 -37
  179. package/apps/vibe/.studio-data/project-messages/chuck-norris.jsonl +0 -18
  180. package/apps/vibe/.studio-data/project-messages/general.jsonl +0 -81
  181. package/apps/vibe/.studio-data/project-messages/studio-local.jsonl +0 -18
  182. package/apps/vibe/ARCHITECTURE.md +0 -3393
  183. package/apps/vibe/QUICK-REFERENCE.md +0 -211
  184. package/apps/vibe/ROADMAP.md +0 -41
  185. package/apps/vibe/STUDIO-SETUP-COMPLETE.md +0 -35
  186. package/apps/vibe/VISUAL-GUIDE.md +0 -378
  187. package/apps/vibe/capture-demo.mjs +0 -160
  188. package/apps/vibe/capture-full-demo.mjs +0 -255
  189. package/apps/vibe/capture-quickstart.mjs +0 -256
  190. package/apps/vibe/capture-vibe-assets.mjs +0 -71
  191. package/apps/vibe/capture-vibe-video.mjs +0 -260
  192. package/apps/vibe/check-buttons.js +0 -41
  193. package/apps/vibe/diagnose.html +0 -106
  194. package/apps/vibe/fix-buttons.js +0 -103
  195. package/apps/vibe/index.html +0 -3404
  196. package/apps/vibe/package-lock.json +0 -920
  197. package/apps/vibe/scripts/studio-pty-host.py +0 -117
  198. package/apps/vibe/src/main.js +0 -2940
  199. package/apps/vibe/src/register-all-languages.js +0 -98
  200. package/apps/vibe/start-studio.sh +0 -11
  201. package/apps/vibe/test/accessibility-tests.js +0 -77
  202. package/apps/vibe/test/browser-performance-audit.mjs +0 -205
  203. package/apps/vibe/test/performance-tests.js +0 -120
  204. package/apps/vibe/test/security-tests.js +0 -213
  205. package/apps/vibe/tests/e2e.local.mjs +0 -54
  206. package/apps/vibe/tests/server.smoke.mjs +0 -106
  207. package/apps/vibe/update_website.mjs +0 -74
  208. package/apps/vibe/vite.config.js +0 -19
  209. package/lib/crew-lead/chat-handler.mjs.bak +0 -1274
  210. package/lib/engines/rt-envelope.mjs.backup-current +0 -870
@@ -1,71 +0,0 @@
1
- #!/usr/bin/env node
2
- import { chromium } from 'playwright';
3
- import { mkdirSync } from 'fs';
4
- import { join, dirname } from 'path';
5
- import { fileURLToPath } from 'url';
6
- import { spawn } from 'child_process';
7
-
8
- const __dirname = dirname(fileURLToPath(import.meta.url));
9
- const OUT = join(__dirname, '..', 'website', 'vibe-assets');
10
- mkdirSync(OUT, { recursive: true });
11
-
12
- const VIBE_PORT = 3333;
13
- const SITE_PORT = 8000;
14
-
15
- async function startVibe() {
16
- console.log('🐝 Starting Vibe server...');
17
- const vibe = spawn('npm', ['start'], { cwd: __dirname });
18
- return new Promise((resolve) => {
19
- vibe.stdout.on('data', (data) => {
20
- if (data.toString().includes('running at')) resolve(vibe);
21
- });
22
- });
23
- }
24
-
25
- async function startSite() {
26
- console.log('🌐 Starting Marketing Site server...');
27
- const site = spawn('python3', ['-m', 'http.server', SITE_PORT.toString()], { cwd: join(__dirname, '..', 'website') });
28
- return new Promise((resolve) => {
29
- setTimeout(() => resolve(site), 2000); // Give it a moment to start
30
- });
31
- }
32
-
33
- async function capture() {
34
- const browser = await chromium.launch({ headless: true });
35
- const page = await browser.newPage({ viewport: { width: 1400, height: 900 } });
36
-
37
- try {
38
- // 1. Capture Vibe IDE
39
- console.log('📸 Capturing Vibe IDE...');
40
- await page.goto(`http://127.0.0.1:${VIBE_PORT}`, { waitUntil: 'networkidle' });
41
- await page.waitForTimeout(3000); // Wait for Monaco and File Tree
42
-
43
- // Take a full shot
44
- await page.screenshot({ path: join(OUT, 'vibe-full.png') });
45
-
46
- // 2. Capture the new Vibe Marketing page
47
- console.log('📸 Capturing Vibe Marketing page...');
48
- await page.goto(`http://127.0.0.1:${SITE_PORT}/vibe.html`, { waitUntil: 'networkidle' });
49
- await page.waitForTimeout(1000);
50
- await page.screenshot({ path: join(OUT, 'vibe-marketing-hero.png'), fullPage: false });
51
-
52
- console.log('✨ Screenshots saved to website/vibe-assets/');
53
- } catch (err) {
54
- console.error('❌ Error during capture:', err);
55
- } finally {
56
- await browser.close();
57
- }
58
- }
59
-
60
- async function main() {
61
- const vibe = await startVibe();
62
- const site = await startSite();
63
-
64
- await capture();
65
-
66
- console.log('🛑 Shutting down servers...');
67
- vibe.kill();
68
- site.kill();
69
- }
70
-
71
- main().catch(console.error);
@@ -1,260 +0,0 @@
1
- #!/usr/bin/env node
2
- import { chromium } from "playwright";
3
- import { mkdirSync, rmSync } from "node:fs";
4
- import { join, dirname } from "node:path";
5
- import { fileURLToPath } from "node:url";
6
- import http from "node:http";
7
-
8
- const __dirname = dirname(fileURLToPath(import.meta.url));
9
- const OUT = join(__dirname, "..", "..", "website", "vibe-assets");
10
- const VIDEO_NAME = "vibe-demo.webm";
11
- const OUTPUT_PATH = join(OUT, VIDEO_NAME);
12
-
13
- const DASHBOARD_URL = process.env.CREWSWARM_DASHBOARD_URL || "http://127.0.0.1:4319";
14
- const VIBE_URL = process.env.CREWSWARM_VIBE_URL || "http://127.0.0.1:3333";
15
-
16
- const VIEWPORT = { width: 1440, height: 900 };
17
- const SPLIT_SCENE_MS = 18_000;
18
- const VIBE_SCENE_MS = 38_000;
19
- const DASHBOARD_SCENE_MS = 34_000;
20
-
21
- mkdirSync(OUT, { recursive: true });
22
-
23
- function isUrlUp(url) {
24
- return new Promise((resolve) => {
25
- const req = http.get(url, (res) => {
26
- res.resume();
27
- resolve(Boolean(res.statusCode) && res.statusCode < 500);
28
- });
29
- req.on("error", () => resolve(false));
30
- req.setTimeout(1500, () => {
31
- req.destroy();
32
- resolve(false);
33
- });
34
- });
35
- }
36
-
37
- async function waitForUrl(url, label, timeoutMs = 15_000) {
38
- const start = Date.now();
39
- while (Date.now() - start < timeoutMs) {
40
- if (await isUrlUp(url)) return true;
41
- await new Promise((resolve) => setTimeout(resolve, 500));
42
- }
43
- throw new Error(`${label} did not become ready at ${url}`);
44
- }
45
-
46
- function buildSplitSceneHtml() {
47
- return `<!doctype html>
48
- <html>
49
- <head>
50
- <meta charset="utf-8" />
51
- <title>CrewSwarm Demo Scene</title>
52
- <style>
53
- :root {
54
- color-scheme: dark;
55
- --bg: #060a10;
56
- --panel: #0c121b;
57
- --text: #f4f7fb;
58
- --muted: #9cb0c7;
59
- --accent: #35d6c2;
60
- --border: rgba(255, 255, 255, 0.08);
61
- }
62
- * { box-sizing: border-box; }
63
- body {
64
- margin: 0;
65
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
66
- background:
67
- radial-gradient(circle at 20% 0%, rgba(53, 214, 194, 0.14), transparent 32%),
68
- radial-gradient(circle at 80% 10%, rgba(73, 124, 255, 0.14), transparent 28%),
69
- var(--bg);
70
- color: var(--text);
71
- }
72
- .wrap {
73
- display: grid;
74
- grid-template-rows: auto 1fr;
75
- height: 100vh;
76
- padding: 18px 18px 14px;
77
- gap: 14px;
78
- }
79
- .header {
80
- display: grid;
81
- grid-template-columns: 1.15fr 1fr;
82
- gap: 16px;
83
- align-items: stretch;
84
- }
85
- .hero {
86
- background: rgba(10, 16, 24, 0.82);
87
- border: 1px solid var(--border);
88
- border-radius: 18px;
89
- padding: 20px 22px;
90
- backdrop-filter: blur(10px);
91
- }
92
- .hero h1 {
93
- margin: 0 0 8px;
94
- font-size: 28px;
95
- line-height: 1.1;
96
- }
97
- .hero p {
98
- margin: 0;
99
- color: var(--muted);
100
- font-size: 15px;
101
- line-height: 1.45;
102
- }
103
- .command {
104
- background: rgba(7, 12, 18, 0.95);
105
- border: 1px solid var(--border);
106
- border-radius: 18px;
107
- padding: 18px 20px;
108
- display: flex;
109
- flex-direction: column;
110
- justify-content: center;
111
- gap: 10px;
112
- }
113
- .command .eyebrow {
114
- color: var(--accent);
115
- font-size: 11px;
116
- font-weight: 700;
117
- letter-spacing: 0.16em;
118
- text-transform: uppercase;
119
- }
120
- .command code {
121
- display: block;
122
- font-family: "SF Mono", "Fira Code", monospace;
123
- font-size: 16px;
124
- line-height: 1.4;
125
- color: #ecfeff;
126
- white-space: pre-wrap;
127
- }
128
- .panes {
129
- display: grid;
130
- grid-template-columns: 1fr 1fr;
131
- gap: 14px;
132
- min-height: 0;
133
- }
134
- .pane {
135
- min-height: 0;
136
- background: var(--panel);
137
- border: 1px solid var(--border);
138
- border-radius: 18px;
139
- overflow: hidden;
140
- display: grid;
141
- grid-template-rows: auto 1fr;
142
- }
143
- .pane-bar {
144
- display: flex;
145
- align-items: center;
146
- justify-content: space-between;
147
- padding: 10px 14px;
148
- font-size: 12px;
149
- color: var(--muted);
150
- background: rgba(255, 255, 255, 0.02);
151
- border-bottom: 1px solid var(--border);
152
- }
153
- .pane-bar strong {
154
- color: var(--text);
155
- font-size: 13px;
156
- }
157
- iframe {
158
- width: 100%;
159
- height: 100%;
160
- border: 0;
161
- background: #0b1016;
162
- }
163
- </style>
164
- </head>
165
- <body>
166
- <div class="wrap">
167
- <div class="header">
168
- <section class="hero">
169
- <h1>CrewSwarm in one fast pass</h1>
170
- <p>
171
- Launch the stack, code in Vibe, and keep the runtime visible in the dashboard.
172
- This cut is recorded from the live local surfaces, not mocked marketing panels.
173
- </p>
174
- </section>
175
- <section class="command">
176
- <div class="eyebrow">Install</div>
177
- <code>bash &lt;(curl -fsSL https://raw.githubusercontent.com/crewswarm/crewswarm/main/install.sh)</code>
178
- </section>
179
- </div>
180
- <section class="panes">
181
- <div class="pane">
182
- <div class="pane-bar"><strong>Dashboard</strong><span>${DASHBOARD_URL}</span></div>
183
- <iframe id="dash-frame" src="${DASHBOARD_URL}"></iframe>
184
- </div>
185
- <div class="pane">
186
- <div class="pane-bar"><strong>Vibe</strong><span>${VIBE_URL}</span></div>
187
- <iframe id="vibe-frame" src="${VIBE_URL}"></iframe>
188
- </div>
189
- </section>
190
- </div>
191
- </body>
192
- </html>`;
193
- }
194
-
195
- async function record() {
196
- await waitForUrl(DASHBOARD_URL, "dashboard");
197
- await waitForUrl(VIBE_URL, "vibe");
198
-
199
- rmSync(OUTPUT_PATH, { force: true });
200
-
201
- const browser = await chromium.launch({ headless: true });
202
- const context = await browser.newContext({
203
- recordVideo: {
204
- dir: OUT,
205
- size: VIEWPORT,
206
- },
207
- viewport: VIEWPORT,
208
- colorScheme: "dark",
209
- });
210
-
211
- const page = await context.newPage();
212
-
213
- try {
214
- console.log("🎬 Scene 1/3: split dashboard + vibe");
215
- await page.setContent(buildSplitSceneHtml(), { waitUntil: "domcontentloaded" });
216
- await page.waitForTimeout(SPLIT_SCENE_MS);
217
-
218
- console.log("🎬 Scene 2/3: Vibe");
219
- await page.goto(VIBE_URL, { waitUntil: "networkidle", timeout: 30_000 });
220
- await page.waitForTimeout(2_000);
221
- await page.selectOption("#chat-mode-selector", "cli:codex").catch(() => {});
222
- await page.waitForTimeout(1_000);
223
- await page.click("#toggle-bottom-terminal").catch(() => {});
224
- await page.waitForTimeout(3_000);
225
- await page.click("#preview-diff-trigger").catch(() => {});
226
- await page.waitForTimeout(5_000);
227
- await page.click(".diff-preview-close").catch(() => {});
228
- await page.waitForTimeout(1_000);
229
- await page.fill("#chat-input", "Explain what this workspace is for in one short paragraph.").catch(() => {});
230
- await page.keyboard.press("Enter").catch(() => {});
231
- await page.waitForTimeout(VIBE_SCENE_MS - 12_000);
232
-
233
- console.log("🎬 Scene 3/3: dashboard");
234
- await page.goto(DASHBOARD_URL, { waitUntil: "networkidle", timeout: 30_000 });
235
- await page.waitForTimeout(2_000);
236
- await page.click("#navServices").catch(() => {});
237
- await page.waitForTimeout(10_000);
238
- await page.click("#navAgents").catch(() => {});
239
- await page.waitForTimeout(10_000);
240
- await page.click("#navBuild").catch(() => {});
241
- await page.waitForTimeout(DASHBOARD_SCENE_MS - 22_000);
242
- } finally {
243
- const video = page.video();
244
- if (video) {
245
- await video.saveAs(OUTPUT_PATH);
246
- }
247
- await page.close();
248
- await context.close();
249
- await browser.close();
250
- }
251
- }
252
-
253
- record()
254
- .then(() => {
255
- console.log(`✨ Saved 90-second demo to ${OUTPUT_PATH}`);
256
- })
257
- .catch((error) => {
258
- console.error("❌ Demo capture failed:", error.message);
259
- process.exit(1);
260
- });
@@ -1,41 +0,0 @@
1
- /**
2
- * Paste this in console RIGHT NOW (while file is open)
3
- */
4
-
5
- console.log('=== BUTTON STATE DEBUG ===\n');
6
-
7
- // Check editor state
8
- console.log('1. Editor state:');
9
- console.log(' window.editor:', window.editor ? 'EXISTS' : 'NULL');
10
- console.log(' activeTab:', window.activeTab || 'NULL');
11
- console.log(' monaco:', typeof window.monaco !== 'undefined' ? 'LOADED' : 'NOT LOADED');
12
-
13
- // Check each button
14
- console.log('\n2. Button states:');
15
- const buttons = document.querySelectorAll('.editor-toolbar-btn');
16
- buttons.forEach(btn => {
17
- console.log(` ${btn.id}:`);
18
- console.log(` - disabled: ${btn.disabled}`);
19
- console.log(` - title: "${btn.title}"`);
20
- console.log(` - visible: ${btn.offsetWidth > 0}`);
21
- console.log(` - computed opacity: ${window.getComputedStyle(btn).opacity}`);
22
- console.log(` - computed cursor: ${window.getComputedStyle(btn).cursor}`);
23
- });
24
-
25
- // Check if updateEditorToolbarState exists
26
- console.log('\n3. Functions available:');
27
- console.log(' updateEditorToolbarState:', typeof window.updateEditorToolbarState);
28
-
29
- // FORCE UPDATE
30
- console.log('\n4. Forcing button state update...');
31
- if (window.editor && window.activeTab) {
32
- // Manually enable buttons (this is what updateEditorToolbarState should do)
33
- buttons.forEach(btn => {
34
- btn.disabled = false;
35
- btn.title = 'Enabled manually';
36
- });
37
- console.log(' ✅ All buttons force-enabled');
38
- console.log(' 🎯 Now try hovering - should see blue glow');
39
- } else {
40
- console.log(' ❌ Cannot enable - editor or activeTab missing');
41
- }
@@ -1,106 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Vibe Diagnostic</title>
5
- <style>
6
- body {
7
- font-family: monospace;
8
- padding: 20px;
9
- background: #0a0e14;
10
- color: #f0f6ff;
11
- }
12
- .test { margin: 10px 0; padding: 10px; border-left: 3px solid #38bdf8; }
13
- .pass { border-color: #34d399; }
14
- .fail { border-color: #f87171; }
15
- pre { background: #0d1420; padding: 10px; overflow: auto; }
16
- </style>
17
- </head>
18
- <body>
19
- <h1>🔍 Vibe Diagnostic</h1>
20
- <div id="results"></div>
21
-
22
- <script>
23
- const results = document.getElementById('results');
24
-
25
- function test(name, fn) {
26
- const div = document.createElement('div');
27
- div.className = 'test';
28
- try {
29
- const result = fn();
30
- div.classList.add('pass');
31
- div.innerHTML = `<strong>✅ ${name}</strong><pre>${JSON.stringify(result, null, 2)}</pre>`;
32
- } catch (err) {
33
- div.classList.add('fail');
34
- div.innerHTML = `<strong>❌ ${name}</strong><pre>${err.message}</pre>`;
35
- }
36
- results.appendChild(div);
37
- }
38
-
39
- // Wait for Vibe to load
40
- setTimeout(() => {
41
- test('Vibe URL is accessible', () => {
42
- return { url: window.location.href };
43
- });
44
-
45
- test('Monaco loaded', () => {
46
- if (typeof window.monaco === 'undefined') {
47
- throw new Error('window.monaco is undefined - Monaco did not load');
48
- }
49
- return { monaco: 'loaded' };
50
- });
51
-
52
- test('Editor instance', () => {
53
- if (typeof window.editor === 'undefined') {
54
- return { editor: 'undefined (normal - not initialized until file opened)' };
55
- }
56
- return { editor: window.editor ? 'initialized' : 'null' };
57
- });
58
-
59
- test('Fetch projects API', async () => {
60
- const res = await fetch(`${window.location.origin}/api/studio/projects`);
61
- const data = await res.json();
62
- return { status: res.status, projects: data.projects?.length };
63
- });
64
-
65
- test('Fetch files API', async () => {
66
- const rootDir =
67
- typeof window.__studioGetCurrentProjectDir === 'function'
68
- ? window.__studioGetCurrentProjectDir()
69
- : 'apps/vibe';
70
- const res = await fetch(
71
- `${window.location.origin}/api/studio/files?dir=${encodeURIComponent(rootDir)}`
72
- );
73
- const data = await res.json();
74
- return { status: res.status, files: data.files?.length };
75
- });
76
-
77
- test('Terminal content element', () => {
78
- const el = document.getElementById('terminal-content');
79
- if (!el) throw new Error('terminal-content element not found');
80
- return {
81
- exists: true,
82
- children: el.children.length,
83
- innerHTML: el.innerHTML.slice(0, 200)
84
- };
85
- });
86
-
87
- test('Editor toolbar buttons', () => {
88
- const buttons = document.querySelectorAll('.editor-toolbar-btn');
89
- if (!buttons.length) throw new Error('No toolbar buttons found');
90
- const states = Array.from(buttons).map(btn => ({
91
- id: btn.id,
92
- disabled: btn.disabled,
93
- title: btn.title
94
- }));
95
- return { count: buttons.length, states };
96
- });
97
-
98
- test('Console errors', () => {
99
- // Can't capture past errors, but can show if any are visible
100
- return { note: 'Check browser DevTools console for red errors' };
101
- });
102
-
103
- }, 2000);
104
- </script>
105
- </body>
106
- </html>
@@ -1,103 +0,0 @@
1
- /**
2
- * Studio Button Fix Script
3
- *
4
- * Run this in the browser console (F12) when Studio is open:
5
- * 1. Copy this entire file
6
- * 2. Paste into console
7
- * 3. Press Enter
8
- *
9
- * This will diagnose and fix common issues.
10
- */
11
-
12
- console.log('🔧 Studio Diagnostic & Fix Script Starting...\n');
13
-
14
- // Check 1: Files in Explorer
15
- const fileTree = document.getElementById('file-tree');
16
- if (!fileTree) {
17
- console.error('❌ file-tree element not found!');
18
- } else {
19
- const files = fileTree.querySelectorAll('li');
20
- console.log(`✅ File tree found: ${files.length} files visible`);
21
-
22
- if (files.length === 0) {
23
- console.warn('⚠️ No files in Explorer - trying to refresh...');
24
- if (typeof window.loadFileTree === 'function') {
25
- window.loadFileTree();
26
- }
27
- }
28
- }
29
-
30
- // Check 2: Editor instance
31
- if (typeof window.editor === 'undefined') {
32
- console.log('ℹ️ Editor not yet initialized (normal until you open a file)');
33
- } else if (window.editor === null) {
34
- console.log('ℹ️ Editor is null (will initialize when you open a file)');
35
- } else {
36
- console.log('✅ Editor is initialized!');
37
- }
38
-
39
- // Check 3: Monaco loaded
40
- if (typeof window.monaco === 'undefined') {
41
- console.error('❌ Monaco not loaded - this is the problem!');
42
- console.log(' Try refreshing the page (Cmd+R)');
43
- } else {
44
- console.log('✅ Monaco loaded successfully');
45
- }
46
-
47
- // Check 4: Button states
48
- const buttons = document.querySelectorAll('.editor-toolbar-btn');
49
- if (buttons.length === 0) {
50
- console.error('❌ No toolbar buttons found');
51
- } else {
52
- console.log(`✅ Found ${buttons.length} toolbar buttons`);
53
- const disabledCount = Array.from(buttons).filter(b => b.disabled).length;
54
- console.log(` ${disabledCount} disabled, ${buttons.length - disabledCount} enabled`);
55
-
56
- if (disabledCount === buttons.length) {
57
- console.log(' ℹ️ All buttons disabled (normal - no file is open yet)');
58
- }
59
- }
60
-
61
- // Check 5: Activity Trace
62
- const terminal = document.getElementById('terminal-content');
63
- if (!terminal) {
64
- console.error('❌ terminal-content element not found');
65
- } else {
66
- const lines = terminal.children.length;
67
- console.log(`✅ Activity Trace found: ${lines} entries`);
68
- if (lines === 0) {
69
- console.log(' ℹ️ Terminal empty (will populate when activity happens)');
70
- } else {
71
- console.log(` Last entry: ${terminal.lastElementChild?.textContent?.slice(0, 60)}...`);
72
- }
73
- }
74
-
75
- // FIX: Auto-open first file to enable buttons
76
- console.log('\n🔧 Attempting auto-fix: opening first file...');
77
- const firstFile = fileTree?.querySelector('li[data-path]');
78
- if (firstFile) {
79
- const filePath = firstFile.dataset.path;
80
- console.log(` Opening: ${filePath}`);
81
-
82
- // Click the file to trigger opening
83
- firstFile.click();
84
-
85
- setTimeout(() => {
86
- const enabledCount = Array.from(buttons).filter(b => !b.disabled).length;
87
- if (enabledCount > 0) {
88
- console.log(`✅ FIX SUCCESSFUL: ${enabledCount} buttons now enabled!`);
89
- console.log(' Try hovering over the Find or Replace buttons now.');
90
- } else {
91
- console.warn('⚠️ Buttons still disabled - check console for errors');
92
- }
93
- }, 1000);
94
- } else {
95
- console.warn('⚠️ No files found to open');
96
- console.log(' Try clicking a file in the Explorer manually');
97
- }
98
-
99
- console.log('\n📋 Summary:');
100
- console.log(' 1. If buttons are still disabled → click any file in Explorer');
101
- console.log(' 2. If Explorer is empty → check that files are loading');
102
- console.log(' 3. If Monaco failed → refresh the page');
103
- console.log(' 4. Hover over enabled buttons to see the blue glow');