crewswarm 0.9.2 → 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 (207) 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 +34 -4
  12. package/lib/bridges/gateway-ws.mjs +4 -0
  13. package/lib/crew-lead/chat-handler.mjs +34 -0
  14. package/lib/crew-lead/http-server.mjs +55 -14
  15. package/lib/crew-lead/llm-caller.mjs +24 -8
  16. package/lib/crew-lead/prompts.mjs +7 -0
  17. package/lib/crew-lead/wave-dispatcher.mjs +15 -3
  18. package/lib/crew-lead/ws-router.mjs +219 -27
  19. package/lib/engines/engine-registry.mjs +9 -0
  20. package/lib/engines/rt-envelope.mjs +1 -0
  21. package/lib/engines/runners.mjs +5 -2
  22. package/lib/runtime/paths.mjs +12 -8
  23. package/package.json +35 -15
  24. package/scripts/capture-build-flow.mjs +118 -0
  25. package/scripts/coverage-report.mjs +209 -0
  26. package/scripts/coverage-summary.mjs +47 -0
  27. package/scripts/dashboard-validation.mjs +74 -0
  28. package/scripts/dashboard.mjs +560 -70
  29. package/scripts/live-bridge-matrix.mjs +79 -0
  30. package/scripts/live-cli-matrix.mjs +166 -0
  31. package/scripts/live-crewchat-check.mjs +42 -0
  32. package/scripts/live-engine-matrix.mjs +50 -0
  33. package/scripts/live-provider-failover-matrix.mjs +107 -0
  34. package/scripts/live-provider-matrix.mjs +228 -0
  35. package/scripts/restart-all-from-repo.sh +4 -4
  36. package/scripts/smoke-dispatch.mjs +4 -1
  37. package/scripts/test-blast-radius.mjs +204 -0
  38. package/scripts/test-report-summary.mjs +88 -0
  39. package/scripts/test-reporter.mjs +651 -0
  40. package/scripts/test-rerun.mjs +136 -0
  41. package/scripts/tmux-bridge +130 -0
  42. package/apps/dashboard/dist/assets/chat-core-Cx4sTxDd.js.br +0 -0
  43. package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js.br +0 -0
  44. package/apps/dashboard/dist/assets/components-BS9fQjE_.js.br +0 -0
  45. package/apps/dashboard/dist/assets/core-utils-CmOkXgzi.js.br +0 -0
  46. package/apps/dashboard/dist/assets/index-CF0aJRtC.css.br +0 -0
  47. package/apps/dashboard/dist/assets/index-DnClJ1ee.js +0 -2
  48. package/apps/dashboard/dist/assets/index-DnClJ1ee.js.br +0 -0
  49. package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js.br +0 -0
  50. package/apps/dashboard/dist/assets/setup-wizard-CA0Or47w.js.br +0 -0
  51. package/apps/dashboard/dist/assets/tab-agents-tab-BgpIsjkw.js.br +0 -0
  52. package/apps/dashboard/dist/assets/tab-comms-tab-kguqTIzD.js.br +0 -0
  53. package/apps/dashboard/dist/assets/tab-contacts-tab-DiOyMYth.js.br +0 -0
  54. package/apps/dashboard/dist/assets/tab-engines-tab-BsdZVvU0.js.br +0 -0
  55. package/apps/dashboard/dist/assets/tab-memory-tab-Cu6u13EQ.js.br +0 -0
  56. package/apps/dashboard/dist/assets/tab-models-tab-BLEjmd19.js.br +0 -0
  57. package/apps/dashboard/dist/assets/tab-pm-loop-tab-Bfd449B4.js.br +0 -0
  58. package/apps/dashboard/dist/assets/tab-projects-tab-DhNWnlzt.js.br +0 -0
  59. package/apps/dashboard/dist/assets/tab-prompts-tab-DVkUNaJd.js.br +0 -0
  60. package/apps/dashboard/dist/assets/tab-services-tab-DU_LH3uG.js.br +0 -0
  61. package/apps/dashboard/dist/assets/tab-settings-tab-Bn4nXtDe.js +0 -1
  62. package/apps/dashboard/dist/assets/tab-settings-tab-Bn4nXtDe.js.br +0 -0
  63. package/apps/dashboard/dist/assets/tab-skills-tab-BpY0uZHW.js.br +0 -0
  64. package/apps/dashboard/dist/assets/tab-spending-tab-DEccQHnt.js.br +0 -0
  65. package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BNrd88-r.js.br +0 -0
  66. package/apps/dashboard/dist/assets/tab-swarm-tab-B1AcjL1W.js.br +0 -0
  67. package/apps/dashboard/dist/assets/tab-usage-tab-BIOOnB-Y.js.br +0 -0
  68. package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js.br +0 -0
  69. package/apps/dashboard/dist/assets/tab-workflows-tab-B-soSy1k.js.br +0 -0
  70. package/apps/dashboard/dist/index.html.br +0 -0
  71. package/apps/dashboard/dist/index.html.gz +0 -0
  72. package/apps/dashboard/index.html +0 -6529
  73. package/apps/dashboard/package.json +0 -15
  74. package/apps/dashboard/src/app.js +0 -2828
  75. package/apps/dashboard/src/app.js.br +0 -0
  76. package/apps/dashboard/src/app.js.gz +0 -0
  77. package/apps/dashboard/src/chat/chat-actions.js +0 -1847
  78. package/apps/dashboard/src/chat/chat-actions.js.br +0 -0
  79. package/apps/dashboard/src/chat/unified-messages.js +0 -327
  80. package/apps/dashboard/src/chat/unified-messages.js.br +0 -0
  81. package/apps/dashboard/src/cli-process.js +0 -208
  82. package/apps/dashboard/src/cli-process.js.br +0 -0
  83. package/apps/dashboard/src/cli-process.js.gz +0 -0
  84. package/apps/dashboard/src/components/active-tasks-panel.js +0 -175
  85. package/apps/dashboard/src/components/active-tasks-panel.js.br +0 -0
  86. package/apps/dashboard/src/core/api.js +0 -18
  87. package/apps/dashboard/src/core/api.js.br +0 -0
  88. package/apps/dashboard/src/core/dom.js +0 -228
  89. package/apps/dashboard/src/core/dom.js.br +0 -0
  90. package/apps/dashboard/src/core/state.js +0 -91
  91. package/apps/dashboard/src/core/state.js.br +0 -0
  92. package/apps/dashboard/src/core/task-manager.js +0 -134
  93. package/apps/dashboard/src/core/task-manager.js.br +0 -0
  94. package/apps/dashboard/src/orchestration-status.js +0 -127
  95. package/apps/dashboard/src/orchestration-status.js.br +0 -0
  96. package/apps/dashboard/src/setup-wizard.js +0 -562
  97. package/apps/dashboard/src/setup-wizard.js.br +0 -0
  98. package/apps/dashboard/src/styles.css +0 -2085
  99. package/apps/dashboard/src/styles.css.br +0 -0
  100. package/apps/dashboard/src/styles.css.gz +0 -0
  101. package/apps/dashboard/src/tabs/agents-tab.js +0 -2237
  102. package/apps/dashboard/src/tabs/agents-tab.js.br +0 -0
  103. package/apps/dashboard/src/tabs/benchmarks-tab.js +0 -229
  104. package/apps/dashboard/src/tabs/benchmarks-tab.js.br +0 -0
  105. package/apps/dashboard/src/tabs/comms-tab.js +0 -955
  106. package/apps/dashboard/src/tabs/comms-tab.js.br +0 -0
  107. package/apps/dashboard/src/tabs/contacts-tab.js +0 -654
  108. package/apps/dashboard/src/tabs/contacts-tab.js.br +0 -0
  109. package/apps/dashboard/src/tabs/engines-tab.js +0 -175
  110. package/apps/dashboard/src/tabs/engines-tab.js.br +0 -0
  111. package/apps/dashboard/src/tabs/memory-tab.js +0 -182
  112. package/apps/dashboard/src/tabs/memory-tab.js.br +0 -0
  113. package/apps/dashboard/src/tabs/models-tab.js +0 -450
  114. package/apps/dashboard/src/tabs/models-tab.js.br +0 -0
  115. package/apps/dashboard/src/tabs/pm-loop-tab.js +0 -185
  116. package/apps/dashboard/src/tabs/pm-loop-tab.js.br +0 -0
  117. package/apps/dashboard/src/tabs/projects-tab.js +0 -663
  118. package/apps/dashboard/src/tabs/projects-tab.js.br +0 -0
  119. package/apps/dashboard/src/tabs/projects-tab.js.gz +0 -0
  120. package/apps/dashboard/src/tabs/prompts-tab.js +0 -160
  121. package/apps/dashboard/src/tabs/prompts-tab.js.br +0 -0
  122. package/apps/dashboard/src/tabs/services-tab.js +0 -202
  123. package/apps/dashboard/src/tabs/services-tab.js.br +0 -0
  124. package/apps/dashboard/src/tabs/settings-tab.js +0 -861
  125. package/apps/dashboard/src/tabs/settings-tab.js.br +0 -0
  126. package/apps/dashboard/src/tabs/skills-tab.js +0 -284
  127. package/apps/dashboard/src/tabs/skills-tab.js.br +0 -0
  128. package/apps/dashboard/src/tabs/spending-tab.js +0 -173
  129. package/apps/dashboard/src/tabs/spending-tab.js.br +0 -0
  130. package/apps/dashboard/src/tabs/swarm-chat-tab.js +0 -660
  131. package/apps/dashboard/src/tabs/swarm-chat-tab.js.br +0 -0
  132. package/apps/dashboard/src/tabs/swarm-tab.js +0 -538
  133. package/apps/dashboard/src/tabs/swarm-tab.js.br +0 -0
  134. package/apps/dashboard/src/tabs/usage-tab.js +0 -390
  135. package/apps/dashboard/src/tabs/usage-tab.js.br +0 -0
  136. package/apps/dashboard/src/tabs/waves-tab.js +0 -238
  137. package/apps/dashboard/src/tabs/waves-tab.js.br +0 -0
  138. package/apps/dashboard/src/tabs/workflows-tab.js +0 -747
  139. package/apps/dashboard/src/tabs/workflows-tab.js.br +0 -0
  140. package/apps/vibe/.crew/agent-memory/pipeline.json +0 -304
  141. package/apps/vibe/.crew/cost.json +0 -17
  142. package/apps/vibe/.crew/json-parse-metrics.jsonl +0 -27
  143. package/apps/vibe/.crew/pipeline-metrics.jsonl +0 -27
  144. package/apps/vibe/.crew/pipeline-runs/pipeline-0f90c392-2425-4ae5-850c-bd9d17b1d690.jsonl +0 -5
  145. package/apps/vibe/.crew/pipeline-runs/pipeline-1c269dd9-a63f-4fba-af81-5cf08048ef06.jsonl +0 -5
  146. package/apps/vibe/.crew/pipeline-runs/pipeline-288a7765-da24-4a22-89bc-1f3cc9b0562c.jsonl +0 -5
  147. package/apps/vibe/.crew/pipeline-runs/pipeline-2c78fd22-a657-4bd1-bc49-0679fb384409.jsonl +0 -5
  148. package/apps/vibe/.crew/pipeline-runs/pipeline-3da23550-22ed-4904-9a0a-8e79c1f3024c.jsonl +0 -5
  149. package/apps/vibe/.crew/pipeline-runs/pipeline-3e6fe08d-3264-404a-8df3-aab7efef10e7.jsonl +0 -5
  150. package/apps/vibe/.crew/pipeline-runs/pipeline-42eec610-57fe-4e09-9e7e-b315038495c2.jsonl +0 -5
  151. package/apps/vibe/.crew/pipeline-runs/pipeline-4438eb4c-ae13-42b1-90e2-b043d8983be8.jsonl +0 -5
  152. package/apps/vibe/.crew/pipeline-runs/pipeline-4740a9f5-86e7-44b6-a394-de433e291727.jsonl +0 -5
  153. package/apps/vibe/.crew/pipeline-runs/pipeline-49e1da6a-957e-48fd-9220-415019e4f8e2.jsonl +0 -5
  154. package/apps/vibe/.crew/pipeline-runs/pipeline-4c9251db-be68-427b-a3fc-a264f2b5778d.jsonl +0 -5
  155. package/apps/vibe/.crew/pipeline-runs/pipeline-6413fa33-a802-4b57-a8c0-a9056ad67842.jsonl +0 -5
  156. package/apps/vibe/.crew/pipeline-runs/pipeline-65e29a57-664d-4196-8109-017e364f182e.jsonl +0 -5
  157. package/apps/vibe/.crew/pipeline-runs/pipeline-6aa04bc5-9593-4b1f-b58d-3bf2978cb602.jsonl +0 -5
  158. package/apps/vibe/.crew/pipeline-runs/pipeline-6e1cba53-9b70-457e-99e0-59199149dd21.jsonl +0 -5
  159. package/apps/vibe/.crew/pipeline-runs/pipeline-749f41cc-4dac-4204-be64-873a6080a0d2.jsonl +0 -5
  160. package/apps/vibe/.crew/pipeline-runs/pipeline-74d68121-e181-4864-bd9a-c3211341dfaf.jsonl +0 -5
  161. package/apps/vibe/.crew/pipeline-runs/pipeline-8509bc24-142d-4e07-b44a-a50bf99d1103.jsonl +0 -5
  162. package/apps/vibe/.crew/pipeline-runs/pipeline-960339c6-07ca-43ce-9900-f6e1702b39b9.jsonl +0 -5
  163. package/apps/vibe/.crew/pipeline-runs/pipeline-9bef2dd2-6122-42e5-b3d9-19f4d80f9e40.jsonl +0 -5
  164. package/apps/vibe/.crew/pipeline-runs/pipeline-9c6480a9-7031-4146-b241-825b9a2d1de1.jsonl +0 -5
  165. package/apps/vibe/.crew/pipeline-runs/pipeline-9fd42426-8492-4157-9d5f-e1537c060489.jsonl +0 -2
  166. package/apps/vibe/.crew/pipeline-runs/pipeline-ad6d40a3-2f5e-46a9-a345-47caaccc51aa.jsonl +0 -5
  167. package/apps/vibe/.crew/pipeline-runs/pipeline-bc606133-8d5b-4535-8d85-f1a29cdaa981.jsonl +0 -5
  168. package/apps/vibe/.crew/pipeline-runs/pipeline-c1418f4e-b773-4ca1-84a3-216acf36e2f2.jsonl +0 -5
  169. package/apps/vibe/.crew/pipeline-runs/pipeline-c1a13ccd-634a-4d01-a4a7-1177b8a752ff.jsonl +0 -5
  170. package/apps/vibe/.crew/pipeline-runs/pipeline-c7d27b42-249e-4bd4-8f26-6aa998110b8a.jsonl +0 -5
  171. package/apps/vibe/.crew/pipeline-runs/pipeline-cca2e9b9-4a34-4d25-a311-5c793fa7e91e.jsonl +0 -5
  172. package/apps/vibe/.crew/sandbox.json +0 -7
  173. package/apps/vibe/.crew/session.json +0 -330
  174. package/apps/vibe/.crew/training-data.jsonl +0 -0
  175. package/apps/vibe/.github/workflows/studio-quality.yml +0 -37
  176. package/apps/vibe/.studio-data/project-messages/chuck-norris.jsonl +0 -18
  177. package/apps/vibe/.studio-data/project-messages/general.jsonl +0 -81
  178. package/apps/vibe/.studio-data/project-messages/studio-local.jsonl +0 -18
  179. package/apps/vibe/ARCHITECTURE.md +0 -3393
  180. package/apps/vibe/QUICK-REFERENCE.md +0 -211
  181. package/apps/vibe/ROADMAP.md +0 -41
  182. package/apps/vibe/STUDIO-SETUP-COMPLETE.md +0 -35
  183. package/apps/vibe/VISUAL-GUIDE.md +0 -378
  184. package/apps/vibe/capture-demo.mjs +0 -160
  185. package/apps/vibe/capture-full-demo.mjs +0 -255
  186. package/apps/vibe/capture-quickstart.mjs +0 -256
  187. package/apps/vibe/capture-vibe-assets.mjs +0 -71
  188. package/apps/vibe/capture-vibe-video.mjs +0 -260
  189. package/apps/vibe/check-buttons.js +0 -41
  190. package/apps/vibe/diagnose.html +0 -106
  191. package/apps/vibe/fix-buttons.js +0 -103
  192. package/apps/vibe/index.html +0 -3404
  193. package/apps/vibe/package-lock.json +0 -920
  194. package/apps/vibe/scripts/studio-pty-host.py +0 -117
  195. package/apps/vibe/src/main.js +0 -2940
  196. package/apps/vibe/src/register-all-languages.js +0 -98
  197. package/apps/vibe/start-studio.sh +0 -11
  198. package/apps/vibe/test/accessibility-tests.js +0 -77
  199. package/apps/vibe/test/browser-performance-audit.mjs +0 -205
  200. package/apps/vibe/test/performance-tests.js +0 -120
  201. package/apps/vibe/test/security-tests.js +0 -213
  202. package/apps/vibe/tests/e2e.local.mjs +0 -54
  203. package/apps/vibe/tests/server.smoke.mjs +0 -106
  204. package/apps/vibe/update_website.mjs +0 -74
  205. package/apps/vibe/vite.config.js +0 -19
  206. package/lib/crew-lead/chat-handler.mjs.bak +0 -1274
  207. 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');