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.
- package/README.md +22 -9
- package/apps/dashboard/dist/assets/{chat-core-Cx4sTxDd.js → chat-core-3KirthZA.js} +1 -1
- package/apps/dashboard/dist/assets/index-GSWxxEPO.js +2 -0
- package/apps/dashboard/dist/assets/{tab-pm-loop-tab-Bfd449B4.js → tab-pm-loop-tab-DiAPTJXu.js} +1 -1
- package/apps/dashboard/dist/assets/{tab-projects-tab-DhNWnlzt.js → tab-projects-tab-SFH4E--a.js} +1 -1
- package/apps/dashboard/dist/assets/tab-settings-tab-BselH1c0.js +1 -0
- package/apps/dashboard/dist/index.html +82 -11
- package/apps/vibe/README.md +2 -2
- package/apps/vibe/package.json +1 -1
- package/apps/vibe/server.mjs +3 -3
- package/crew-lead.mjs +34 -4
- package/lib/bridges/gateway-ws.mjs +4 -0
- package/lib/crew-lead/chat-handler.mjs +34 -0
- package/lib/crew-lead/http-server.mjs +55 -14
- package/lib/crew-lead/llm-caller.mjs +24 -8
- package/lib/crew-lead/prompts.mjs +7 -0
- package/lib/crew-lead/wave-dispatcher.mjs +15 -3
- package/lib/crew-lead/ws-router.mjs +219 -27
- package/lib/engines/engine-registry.mjs +9 -0
- package/lib/engines/rt-envelope.mjs +1 -0
- package/lib/engines/runners.mjs +5 -2
- package/lib/runtime/paths.mjs +12 -8
- package/package.json +35 -15
- package/scripts/capture-build-flow.mjs +118 -0
- package/scripts/coverage-report.mjs +209 -0
- package/scripts/coverage-summary.mjs +47 -0
- package/scripts/dashboard-validation.mjs +74 -0
- package/scripts/dashboard.mjs +560 -70
- package/scripts/live-bridge-matrix.mjs +79 -0
- package/scripts/live-cli-matrix.mjs +166 -0
- package/scripts/live-crewchat-check.mjs +42 -0
- package/scripts/live-engine-matrix.mjs +50 -0
- package/scripts/live-provider-failover-matrix.mjs +107 -0
- package/scripts/live-provider-matrix.mjs +228 -0
- package/scripts/restart-all-from-repo.sh +4 -4
- package/scripts/smoke-dispatch.mjs +4 -1
- package/scripts/test-blast-radius.mjs +204 -0
- package/scripts/test-report-summary.mjs +88 -0
- package/scripts/test-reporter.mjs +651 -0
- package/scripts/test-rerun.mjs +136 -0
- package/scripts/tmux-bridge +130 -0
- package/apps/dashboard/dist/assets/chat-core-Cx4sTxDd.js.br +0 -0
- package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js.br +0 -0
- package/apps/dashboard/dist/assets/components-BS9fQjE_.js.br +0 -0
- package/apps/dashboard/dist/assets/core-utils-CmOkXgzi.js.br +0 -0
- package/apps/dashboard/dist/assets/index-CF0aJRtC.css.br +0 -0
- package/apps/dashboard/dist/assets/index-DnClJ1ee.js +0 -2
- package/apps/dashboard/dist/assets/index-DnClJ1ee.js.br +0 -0
- package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js.br +0 -0
- package/apps/dashboard/dist/assets/setup-wizard-CA0Or47w.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-agents-tab-BgpIsjkw.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-comms-tab-kguqTIzD.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-contacts-tab-DiOyMYth.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-engines-tab-BsdZVvU0.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-memory-tab-Cu6u13EQ.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-models-tab-BLEjmd19.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-pm-loop-tab-Bfd449B4.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-projects-tab-DhNWnlzt.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-prompts-tab-DVkUNaJd.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-services-tab-DU_LH3uG.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-settings-tab-Bn4nXtDe.js +0 -1
- package/apps/dashboard/dist/assets/tab-settings-tab-Bn4nXtDe.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-skills-tab-BpY0uZHW.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-spending-tab-DEccQHnt.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BNrd88-r.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-swarm-tab-B1AcjL1W.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-usage-tab-BIOOnB-Y.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-workflows-tab-B-soSy1k.js.br +0 -0
- package/apps/dashboard/dist/index.html.br +0 -0
- package/apps/dashboard/dist/index.html.gz +0 -0
- package/apps/dashboard/index.html +0 -6529
- package/apps/dashboard/package.json +0 -15
- package/apps/dashboard/src/app.js +0 -2828
- package/apps/dashboard/src/app.js.br +0 -0
- package/apps/dashboard/src/app.js.gz +0 -0
- package/apps/dashboard/src/chat/chat-actions.js +0 -1847
- package/apps/dashboard/src/chat/chat-actions.js.br +0 -0
- package/apps/dashboard/src/chat/unified-messages.js +0 -327
- package/apps/dashboard/src/chat/unified-messages.js.br +0 -0
- package/apps/dashboard/src/cli-process.js +0 -208
- package/apps/dashboard/src/cli-process.js.br +0 -0
- package/apps/dashboard/src/cli-process.js.gz +0 -0
- package/apps/dashboard/src/components/active-tasks-panel.js +0 -175
- package/apps/dashboard/src/components/active-tasks-panel.js.br +0 -0
- package/apps/dashboard/src/core/api.js +0 -18
- package/apps/dashboard/src/core/api.js.br +0 -0
- package/apps/dashboard/src/core/dom.js +0 -228
- package/apps/dashboard/src/core/dom.js.br +0 -0
- package/apps/dashboard/src/core/state.js +0 -91
- package/apps/dashboard/src/core/state.js.br +0 -0
- package/apps/dashboard/src/core/task-manager.js +0 -134
- package/apps/dashboard/src/core/task-manager.js.br +0 -0
- package/apps/dashboard/src/orchestration-status.js +0 -127
- package/apps/dashboard/src/orchestration-status.js.br +0 -0
- package/apps/dashboard/src/setup-wizard.js +0 -562
- package/apps/dashboard/src/setup-wizard.js.br +0 -0
- package/apps/dashboard/src/styles.css +0 -2085
- package/apps/dashboard/src/styles.css.br +0 -0
- package/apps/dashboard/src/styles.css.gz +0 -0
- package/apps/dashboard/src/tabs/agents-tab.js +0 -2237
- package/apps/dashboard/src/tabs/agents-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/benchmarks-tab.js +0 -229
- package/apps/dashboard/src/tabs/benchmarks-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/comms-tab.js +0 -955
- package/apps/dashboard/src/tabs/comms-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/contacts-tab.js +0 -654
- package/apps/dashboard/src/tabs/contacts-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/engines-tab.js +0 -175
- package/apps/dashboard/src/tabs/engines-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/memory-tab.js +0 -182
- package/apps/dashboard/src/tabs/memory-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/models-tab.js +0 -450
- package/apps/dashboard/src/tabs/models-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/pm-loop-tab.js +0 -185
- package/apps/dashboard/src/tabs/pm-loop-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/projects-tab.js +0 -663
- package/apps/dashboard/src/tabs/projects-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/projects-tab.js.gz +0 -0
- package/apps/dashboard/src/tabs/prompts-tab.js +0 -160
- package/apps/dashboard/src/tabs/prompts-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/services-tab.js +0 -202
- package/apps/dashboard/src/tabs/services-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/settings-tab.js +0 -861
- package/apps/dashboard/src/tabs/settings-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/skills-tab.js +0 -284
- package/apps/dashboard/src/tabs/skills-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/spending-tab.js +0 -173
- package/apps/dashboard/src/tabs/spending-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/swarm-chat-tab.js +0 -660
- package/apps/dashboard/src/tabs/swarm-chat-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/swarm-tab.js +0 -538
- package/apps/dashboard/src/tabs/swarm-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/usage-tab.js +0 -390
- package/apps/dashboard/src/tabs/usage-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/waves-tab.js +0 -238
- package/apps/dashboard/src/tabs/waves-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/workflows-tab.js +0 -747
- package/apps/dashboard/src/tabs/workflows-tab.js.br +0 -0
- package/apps/vibe/.crew/agent-memory/pipeline.json +0 -304
- package/apps/vibe/.crew/cost.json +0 -17
- package/apps/vibe/.crew/json-parse-metrics.jsonl +0 -27
- package/apps/vibe/.crew/pipeline-metrics.jsonl +0 -27
- package/apps/vibe/.crew/pipeline-runs/pipeline-0f90c392-2425-4ae5-850c-bd9d17b1d690.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-1c269dd9-a63f-4fba-af81-5cf08048ef06.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-288a7765-da24-4a22-89bc-1f3cc9b0562c.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-2c78fd22-a657-4bd1-bc49-0679fb384409.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-3da23550-22ed-4904-9a0a-8e79c1f3024c.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-3e6fe08d-3264-404a-8df3-aab7efef10e7.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-42eec610-57fe-4e09-9e7e-b315038495c2.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-4438eb4c-ae13-42b1-90e2-b043d8983be8.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-4740a9f5-86e7-44b6-a394-de433e291727.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-49e1da6a-957e-48fd-9220-415019e4f8e2.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-4c9251db-be68-427b-a3fc-a264f2b5778d.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-6413fa33-a802-4b57-a8c0-a9056ad67842.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-65e29a57-664d-4196-8109-017e364f182e.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-6aa04bc5-9593-4b1f-b58d-3bf2978cb602.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-6e1cba53-9b70-457e-99e0-59199149dd21.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-749f41cc-4dac-4204-be64-873a6080a0d2.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-74d68121-e181-4864-bd9a-c3211341dfaf.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-8509bc24-142d-4e07-b44a-a50bf99d1103.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-960339c6-07ca-43ce-9900-f6e1702b39b9.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-9bef2dd2-6122-42e5-b3d9-19f4d80f9e40.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-9c6480a9-7031-4146-b241-825b9a2d1de1.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-9fd42426-8492-4157-9d5f-e1537c060489.jsonl +0 -2
- package/apps/vibe/.crew/pipeline-runs/pipeline-ad6d40a3-2f5e-46a9-a345-47caaccc51aa.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-bc606133-8d5b-4535-8d85-f1a29cdaa981.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-c1418f4e-b773-4ca1-84a3-216acf36e2f2.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-c1a13ccd-634a-4d01-a4a7-1177b8a752ff.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-c7d27b42-249e-4bd4-8f26-6aa998110b8a.jsonl +0 -5
- package/apps/vibe/.crew/pipeline-runs/pipeline-cca2e9b9-4a34-4d25-a311-5c793fa7e91e.jsonl +0 -5
- package/apps/vibe/.crew/sandbox.json +0 -7
- package/apps/vibe/.crew/session.json +0 -330
- package/apps/vibe/.crew/training-data.jsonl +0 -0
- package/apps/vibe/.github/workflows/studio-quality.yml +0 -37
- package/apps/vibe/.studio-data/project-messages/chuck-norris.jsonl +0 -18
- package/apps/vibe/.studio-data/project-messages/general.jsonl +0 -81
- package/apps/vibe/.studio-data/project-messages/studio-local.jsonl +0 -18
- package/apps/vibe/ARCHITECTURE.md +0 -3393
- package/apps/vibe/QUICK-REFERENCE.md +0 -211
- package/apps/vibe/ROADMAP.md +0 -41
- package/apps/vibe/STUDIO-SETUP-COMPLETE.md +0 -35
- package/apps/vibe/VISUAL-GUIDE.md +0 -378
- package/apps/vibe/capture-demo.mjs +0 -160
- package/apps/vibe/capture-full-demo.mjs +0 -255
- package/apps/vibe/capture-quickstart.mjs +0 -256
- package/apps/vibe/capture-vibe-assets.mjs +0 -71
- package/apps/vibe/capture-vibe-video.mjs +0 -260
- package/apps/vibe/check-buttons.js +0 -41
- package/apps/vibe/diagnose.html +0 -106
- package/apps/vibe/fix-buttons.js +0 -103
- package/apps/vibe/index.html +0 -3404
- package/apps/vibe/package-lock.json +0 -920
- package/apps/vibe/scripts/studio-pty-host.py +0 -117
- package/apps/vibe/src/main.js +0 -2940
- package/apps/vibe/src/register-all-languages.js +0 -98
- package/apps/vibe/start-studio.sh +0 -11
- package/apps/vibe/test/accessibility-tests.js +0 -77
- package/apps/vibe/test/browser-performance-audit.mjs +0 -205
- package/apps/vibe/test/performance-tests.js +0 -120
- package/apps/vibe/test/security-tests.js +0 -213
- package/apps/vibe/tests/e2e.local.mjs +0 -54
- package/apps/vibe/tests/server.smoke.mjs +0 -106
- package/apps/vibe/update_website.mjs +0 -74
- package/apps/vibe/vite.config.js +0 -19
- package/lib/crew-lead/chat-handler.mjs.bak +0 -1274
- package/lib/engines/rt-envelope.mjs.backup-current +0 -870
|
Binary file
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Engines tab — extracted from app.js
|
|
3
|
-
* Deps: getJSON, postJSON, escHtml (from core/)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { getJSON, postJSON } from '../core/api.js';
|
|
7
|
-
import { escHtml } from '../core/dom.js';
|
|
8
|
-
|
|
9
|
-
export const ENGINE_ICONS = {
|
|
10
|
-
opencode: `<svg viewBox="0 0 24 30" width="20" height="24" fill="#38bdf8"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/></svg>`,
|
|
11
|
-
cursor: `<svg viewBox="0 0 24 24" width="20" height="20" fill="#818cf8"><path d="M4 4l8 16 3-7 7-3L4 4z"/></svg>`,
|
|
12
|
-
claude: `<svg viewBox="0 0 24 24" width="20" height="20" fill="#d4a853"><path d="M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z"/></svg>`,
|
|
13
|
-
codex: `<svg viewBox="0 0 24 24" width="20" height="20" fill="none"><circle cx="12" cy="12" r="10" stroke="#a78bfa" stroke-width="1.5"/><path d="M8 12l3 3 5-5" stroke="#a78bfa" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>`,
|
|
14
|
-
"docker-sandbox": `<svg viewBox="0 0 24 24" width="20" height="20" fill="#2496ed"><path d="M13.983 11.078h2.119a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.119a.185.185 0 00-.185.185v1.888c0 .102.083.185.185.185m-2.954-5.43h2.118a.186.186 0 00.186-.186V3.574a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m0 2.716h2.118a.187.187 0 00.186-.186V6.29a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.887c0 .102.082.186.185.186m-2.93 0h2.12a.186.186 0 00.184-.186V6.29a.185.185 0 00-.185-.185H8.1a.185.185 0 00-.185.185v1.887c0 .102.083.186.185.186m-2.943 0h2.119a.186.186 0 00.185-.186V6.29a.185.185 0 00-.185-.185H5.157a.185.185 0 00-.185.185v1.887c0 .102.083.186.185.186m8.763 2.714h2.119a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.119a.185.185 0 00-.185.185v1.888c0 .102.083.185.185.185m-2.93 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.185.185 0 00-.184.185v1.888c0 .102.083.185.185.185M23.763 9.89c-.065-.051-.672-.51-1.954-.51-.338.001-.676.03-1.01.087-.248-1.7-1.653-2.53-1.716-2.566l-.344-.199-.226.327c-.284.438-.49.922-.612 1.43-.23.97-.09 1.882.403 2.661-.595.332-1.55.413-1.744.42H.751a.751.751 0 00-.75.748 11.376 11.376 0 00.692 4.062c.545 1.428 1.355 2.48 2.41 3.124 1.18.723 3.1 1.137 5.275 1.137.983.003 1.963-.086 2.93-.266a12.248 12.248 0 003.823-1.389c.98-.567 1.86-1.288 2.61-2.136 1.252-1.418 1.998-2.997 2.553-4.4h.221c1.372 0 2.215-.549 2.68-1.009.309-.293.55-.65.707-1.046l.098-.288Z"/></svg>`,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export function showEngines(helpers) {
|
|
18
|
-
helpers.hideAllViews();
|
|
19
|
-
document.getElementById('enginesView').classList.add('active');
|
|
20
|
-
helpers.setNavActive('navEngines');
|
|
21
|
-
loadEngines();
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Make toggleEngineGlobal available globally for onclick
|
|
25
|
-
if (typeof window !== 'undefined') {
|
|
26
|
-
window.toggleEngineGlobal = toggleEngineGlobal;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function toggleImportEngine() {
|
|
30
|
-
const f = document.getElementById('importEngineForm');
|
|
31
|
-
if (f) f.style.display = f.style.display === 'none' ? 'block' : 'none';
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export async function importEngineFromUrl() {
|
|
35
|
-
const inp = document.getElementById('importEngineUrl');
|
|
36
|
-
const status = document.getElementById('importEngineStatus');
|
|
37
|
-
const url = inp?.value?.trim();
|
|
38
|
-
if (!url || !status) return;
|
|
39
|
-
status.textContent = 'Importing…'; status.style.color = 'var(--text-3)';
|
|
40
|
-
try {
|
|
41
|
-
const d = await postJSON('/api/engines/import', { url });
|
|
42
|
-
if (d.ok) {
|
|
43
|
-
status.textContent = `✓ Imported ${d.label}`; status.style.color = 'var(--green)';
|
|
44
|
-
inp.value = '';
|
|
45
|
-
loadEngines();
|
|
46
|
-
} else {
|
|
47
|
-
status.textContent = 'Error: ' + (d.error || 'unknown'); status.style.color = 'var(--red,#f87171)';
|
|
48
|
-
}
|
|
49
|
-
} catch(e) {
|
|
50
|
-
status.textContent = 'Error: ' + e.message; status.style.color = 'var(--red,#f87171)';
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function deleteEngine(id) {
|
|
55
|
-
if (!confirm(`Remove engine "${id}"?`)) return;
|
|
56
|
-
await fetch(`/api/engines/${encodeURIComponent(id)}`, { method: 'DELETE' });
|
|
57
|
-
loadEngines();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export async function loadEngines() {
|
|
61
|
-
const grid = document.getElementById('enginesGrid');
|
|
62
|
-
if (!grid) return;
|
|
63
|
-
grid.innerHTML = '<div style="color:var(--text-3);font-size:13px;padding:8px;">Loading…</div>';
|
|
64
|
-
try {
|
|
65
|
-
const { engines = [] } = await getJSON('/api/engines');
|
|
66
|
-
if (!engines.length) {
|
|
67
|
-
grid.innerHTML = '<div style="color:var(--text-3);font-size:13px;padding:8px;">No engines found.</div>';
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
grid.innerHTML = '';
|
|
71
|
-
for (const eng of engines) {
|
|
72
|
-
const card = document.createElement('div');
|
|
73
|
-
card.className = 'card';
|
|
74
|
-
card.style.cssText = 'display:flex;flex-direction:column;gap:10px;';
|
|
75
|
-
const iconHtml = ENGINE_ICONS[eng.icon || eng.id] || `<span style="font-size:20px;">⚙️</span>`;
|
|
76
|
-
const statusDot = eng.ready ? '🟢' : eng.installed ? '🟡' : '⚫';
|
|
77
|
-
const statusLabel = eng.ready ? 'Ready'
|
|
78
|
-
: eng.installed && eng.requiresAuth ? 'Installed — run auth to activate'
|
|
79
|
-
: eng.installed ? 'Installed — missing env vars'
|
|
80
|
-
: 'Not installed';
|
|
81
|
-
const statusColor = eng.ready ? 'var(--green)' : eng.installed ? 'var(--yellow,#fbbf24)' : 'var(--text-3)';
|
|
82
|
-
const traitsHtml = (eng.traits || []).map(t =>
|
|
83
|
-
`<li style="font-size:11px;color:var(--text-3);list-style:none;padding:2px 0;">▸ ${escHtml(t)}</li>`
|
|
84
|
-
).join('');
|
|
85
|
-
const missingHtml = eng.missingEnv?.length
|
|
86
|
-
? `<div style="font-size:11px;color:var(--yellow,#fbbf24);margin-top:4px;">Missing env: ${eng.missingEnv.map(e => `<code style="background:var(--bg-1);padding:1px 3px;border-radius:3px;">${escHtml(e)}</code>`).join(', ')}</div>`
|
|
87
|
-
: '';
|
|
88
|
-
const installHtml = !eng.installed
|
|
89
|
-
? `<div style="margin-top:6px;"><div style="font-size:11px;color:var(--text-3);margin-bottom:4px;">Install:</div>
|
|
90
|
-
<code style="font-size:11px;background:var(--bg-1);padding:4px 8px;border-radius:4px;display:block;word-break:break-all;">${escHtml(eng.installCmd || '')}</code>
|
|
91
|
-
${eng.installUrl ? `<a href="${escHtml(eng.installUrl)}" target="_blank" style="font-size:11px;color:var(--accent);margin-top:4px;display:inline-block;">↗ Install guide</a>` : ''}
|
|
92
|
-
</div>` : '';
|
|
93
|
-
const authHtml = eng.authMethods?.length
|
|
94
|
-
? `<div style="margin-top:8px;border-top:1px solid var(--border);padding-top:10px;">
|
|
95
|
-
<div style="font-size:11px;font-weight:600;color:var(--text-2);margin-bottom:8px;display:flex;align-items:center;gap:6px;">
|
|
96
|
-
<span style="font-size:13px;">🔑</span> Auth setup
|
|
97
|
-
${eng.authNote ? `<span style="font-weight:400;color:var(--text-3);">— ${escHtml(eng.authNote)}</span>` : ''}
|
|
98
|
-
</div>
|
|
99
|
-
${eng.authMethods.map((m, i) => `
|
|
100
|
-
<div style="margin-bottom:10px;">
|
|
101
|
-
<div style="font-size:11px;font-weight:600;color:var(--text-2);margin-bottom:4px;">${escHtml(m.label)}</div>
|
|
102
|
-
<div style="position:relative;display:flex;align-items:stretch;gap:0;">
|
|
103
|
-
<code style="flex:1;font-size:11px;background:var(--bg-1);padding:6px 8px;border-radius:4px 0 0 4px;display:block;word-break:break-all;border:1px solid var(--border);border-right:none;">${escHtml(m.cmd)}</code>
|
|
104
|
-
<button onclick="navigator.clipboard.writeText(${escHtml(JSON.stringify(m.cmd))}).then(()=>{this.textContent='\u2713';setTimeout(()=>this.textContent='Copy',1200)})" style="font-size:10px;padding:0 8px;border-radius:0 4px 4px 0;border:1px solid var(--border);background:var(--bg-card2);color:var(--text-2);cursor:pointer;white-space:nowrap;flex-shrink:0;">Copy</button>
|
|
105
|
-
</div>
|
|
106
|
-
${m.note ? `<div style="font-size:10px;color:var(--text-3);margin-top:3px;">${escHtml(m.note)}</div>` : ''}
|
|
107
|
-
</div>
|
|
108
|
-
`).join('')}
|
|
109
|
-
</div>`
|
|
110
|
-
: (eng.authNote ? `<div style="font-size:11px;color:var(--text-3);margin-top:6px;">🔑 ${escHtml(eng.authNote)}</div>` : '');
|
|
111
|
-
const bestForHtml = eng.bestFor?.length
|
|
112
|
-
? `<div style="font-size:11px;color:var(--text-3);">Best for: ${eng.bestFor.map(a => `<code style="background:var(--bg-1);padding:1px 3px;border-radius:3px;">${escHtml(a)}</code>`).join(' ')}</div>`
|
|
113
|
-
: '';
|
|
114
|
-
const deleteBtn = eng.source === 'user'
|
|
115
|
-
? `<button onclick="deleteEngine('${escHtml(eng.id)}')" style="font-size:11px;padding:4px 8px;border-radius:5px;cursor:pointer;border:1px solid var(--border);background:transparent;color:var(--text-3);">Remove</button>`
|
|
116
|
-
: '';
|
|
117
|
-
|
|
118
|
-
// Global enable/disable toggle (only show if engine has envToggle and is ready)
|
|
119
|
-
const toggleHtml = eng.envToggle && eng.ready
|
|
120
|
-
? `<label style="display:flex;align-items:center;gap:8px;cursor:pointer;margin-top:10px;padding:8px;background:var(--surface-2);border-radius:6px;border:1px solid var(--border);">
|
|
121
|
-
<input type="checkbox" id="toggle-${eng.id}" ${eng.enabled ? 'checked' : ''} onchange="toggleEngineGlobal('${eng.id}')" style="width:14px;height:14px;cursor:pointer;" />
|
|
122
|
-
<span style="font-size:12px;font-weight:600;color:var(--text-1);">Enable Globally</span>
|
|
123
|
-
<span style="font-size:11px;color:var(--text-3);">Sets ${escHtml(eng.envToggle)}</span>
|
|
124
|
-
</label>`
|
|
125
|
-
: '';
|
|
126
|
-
|
|
127
|
-
card.innerHTML = `
|
|
128
|
-
<div style="display:flex;align-items:center;justify-content:space-between;gap:10px;">
|
|
129
|
-
<div style="display:flex;align-items:center;gap:10px;">
|
|
130
|
-
${iconHtml}
|
|
131
|
-
<div>
|
|
132
|
-
<div style="font-weight:700;font-size:14px;">${escHtml(eng.label)}</div>
|
|
133
|
-
<div style="font-size:11px;color:${statusColor};">${statusDot} ${escHtml(statusLabel)}</div>
|
|
134
|
-
</div>
|
|
135
|
-
</div>
|
|
136
|
-
<div style="display:flex;gap:6px;align-items:center;">
|
|
137
|
-
${eng.docsUrl ? `<a href="${escHtml(eng.docsUrl)}" target="_blank" class="btn-ghost" style="font-size:11px;padding:4px 8px;text-decoration:none;">Docs ↗</a>` : ''}
|
|
138
|
-
${deleteBtn}
|
|
139
|
-
</div>
|
|
140
|
-
</div>
|
|
141
|
-
<div style="font-size:12px;color:var(--text-2);line-height:1.5;">${escHtml(eng.description || '')}</div>
|
|
142
|
-
${missingHtml}
|
|
143
|
-
${installHtml}
|
|
144
|
-
<ul style="margin:0;padding:0;">${traitsHtml}</ul>
|
|
145
|
-
${bestForHtml}
|
|
146
|
-
${toggleHtml}
|
|
147
|
-
${authHtml}
|
|
148
|
-
`;
|
|
149
|
-
grid.appendChild(card);
|
|
150
|
-
}
|
|
151
|
-
} catch(e) {
|
|
152
|
-
grid.innerHTML = `<div style="color:var(--red,#f87171);font-size:13px;">Error: ${escHtml(e.message)}</div>`;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export async function toggleEngineGlobal(engineId) {
|
|
157
|
-
const checkbox = document.getElementById(`toggle-${engineId}`);
|
|
158
|
-
const enabled = checkbox?.checked ?? false;
|
|
159
|
-
try {
|
|
160
|
-
await postJSON('/api/engines/toggle', { engineId, enabled });
|
|
161
|
-
const status = enabled ? 'enabled' : 'disabled';
|
|
162
|
-
console.log(`Engine ${engineId} ${status} globally`);
|
|
163
|
-
// Show notification (assuming showNotification is available globally)
|
|
164
|
-
if (window.showNotification) {
|
|
165
|
-
window.showNotification(`${engineId} ${status} globally`);
|
|
166
|
-
}
|
|
167
|
-
} catch(e) {
|
|
168
|
-
console.error('Toggle failed:', e);
|
|
169
|
-
// Revert checkbox on error
|
|
170
|
-
if (checkbox) checkbox.checked = !enabled;
|
|
171
|
-
if (window.showNotification) {
|
|
172
|
-
window.showNotification(`Toggle failed: ${e.message}`, true);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
Binary file
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory tab — shared memory visualization and management
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { getJSON, postJSON } from '../core/api.js';
|
|
6
|
-
import { showNotification } from '../core/dom.js';
|
|
7
|
-
|
|
8
|
-
let _state = null;
|
|
9
|
-
|
|
10
|
-
export function initMemoryTab(state) {
|
|
11
|
-
_state = state;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export async function showMemory() {
|
|
15
|
-
// Note: View activation is handled by showMemoryView() in app.js via hideAllViews() + classList.add('active')
|
|
16
|
-
// Just load the data here
|
|
17
|
-
await loadMemoryStats();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export async function loadMemoryStats() {
|
|
21
|
-
try {
|
|
22
|
-
const data = await getJSON('/api/memory/stats');
|
|
23
|
-
|
|
24
|
-
// Update fact stats
|
|
25
|
-
const factStatsEl = document.getElementById('memoryFactStats');
|
|
26
|
-
if (factStatsEl && data.agentMemory) {
|
|
27
|
-
const stats = data.agentMemory;
|
|
28
|
-
factStatsEl.innerHTML = `
|
|
29
|
-
Total facts: <strong>${stats.totalFacts || 0}</strong><br>
|
|
30
|
-
Critical facts: <strong>${stats.criticalFacts || 0}</strong><br>
|
|
31
|
-
Providers: ${stats.providers?.join(', ') || 'none'}<br>
|
|
32
|
-
${stats.oldestFact ? `Oldest: ${new Date(stats.oldestFact).toLocaleDateString()}<br>` : ''}
|
|
33
|
-
${stats.newestFact ? `Newest: ${new Date(stats.newestFact).toLocaleDateString()}` : ''}
|
|
34
|
-
`;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Update keeper stats
|
|
38
|
-
const keeperStatsEl = document.getElementById('memoryKeeperStats');
|
|
39
|
-
if (keeperStatsEl && data.agentKeeper) {
|
|
40
|
-
const stats = data.agentKeeper;
|
|
41
|
-
keeperStatsEl.innerHTML = `
|
|
42
|
-
Total entries: <strong>${stats.entries || 0}</strong><br>
|
|
43
|
-
Storage: <strong>${stats.bytes ? (stats.bytes / 1024).toFixed(1) + 'KB' : '0KB'}</strong><br>
|
|
44
|
-
${stats.byTier ? `By tier: ${Object.entries(stats.byTier).map(([k,v]) => `${k}=${v}`).join(', ')}<br>` : ''}
|
|
45
|
-
${stats.byAgent ? `By agent: ${Object.entries(stats.byAgent).map(([k,v]) => `${k}=${v}`).join(', ')}` : ''}
|
|
46
|
-
`;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Update storage info
|
|
50
|
-
const storageInfoEl = document.getElementById('memoryStorageInfo');
|
|
51
|
-
if (storageInfoEl) {
|
|
52
|
-
storageInfoEl.innerHTML = `
|
|
53
|
-
Location: <code style="font-size:11px;background:var(--bg-2);padding:2px 6px;border-radius:3px;">${data.storageDir || 'N/A'}</code><br>
|
|
54
|
-
Status: <strong style="color:var(--green);">${data.available ? '✅ Active' : '⚠️ Unavailable'}</strong><br>
|
|
55
|
-
<span style="font-size:10px;color:var(--text-3);">Set CREW_MEMORY_DIR to customize location</span>
|
|
56
|
-
`;
|
|
57
|
-
}
|
|
58
|
-
} catch (err) {
|
|
59
|
-
showNotification(`Failed to load memory stats: ${err.message}`, 'error');
|
|
60
|
-
console.error('[memory] Stats load failed:', err);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export async function searchMemory() {
|
|
65
|
-
const queryEl = document.getElementById('memorySearchQuery');
|
|
66
|
-
if (!queryEl) return;
|
|
67
|
-
|
|
68
|
-
const query = queryEl.value.trim();
|
|
69
|
-
if (!query) {
|
|
70
|
-
showNotification('Enter a search query', 'error');
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const resultsEl = document.getElementById('memorySearchResults');
|
|
75
|
-
if (!resultsEl) return;
|
|
76
|
-
|
|
77
|
-
resultsEl.style.display = 'block';
|
|
78
|
-
resultsEl.innerHTML = '<div style="padding:12px;color:var(--text-2);">Searching...</div>';
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
const data = await postJSON('/api/memory/search', { query, maxResults: 20 });
|
|
82
|
-
|
|
83
|
-
if (!data.hits || data.hits.length === 0) {
|
|
84
|
-
resultsEl.innerHTML = '<div style="padding:12px;color:var(--text-2);">No results found</div>';
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const html = data.hits.map(hit => {
|
|
89
|
-
const sourceColor = hit.source === 'agentkeeper' ? 'var(--blue)' :
|
|
90
|
-
hit.source === 'agent-memory' ? 'var(--green)' : 'var(--purple)';
|
|
91
|
-
const preview = hit.text.length > 300 ? hit.text.slice(0, 300) + '...' : hit.text;
|
|
92
|
-
|
|
93
|
-
return `
|
|
94
|
-
<div style="padding:12px;border-left:3px solid ${sourceColor};background:var(--bg-2);border-radius:6px;margin-bottom:8px;">
|
|
95
|
-
<div style="display:flex;align-items:center;gap:8px;margin-bottom:6px;">
|
|
96
|
-
<span style="font-size:10px;font-weight:600;color:${sourceColor};text-transform:uppercase;">${hit.source}</span>
|
|
97
|
-
<span style="font-size:11px;font-weight:600;color:var(--text-1);flex:1;">${escapeHtml(hit.title)}</span>
|
|
98
|
-
<span style="font-size:10px;color:var(--text-3);font-family:monospace;">score: ${hit.score.toFixed(3)}</span>
|
|
99
|
-
</div>
|
|
100
|
-
<div style="font-size:11px;color:var(--text-2);line-height:1.5;white-space:pre-wrap;">${escapeHtml(preview)}</div>
|
|
101
|
-
${hit.metadata ? `<div style="font-size:10px;color:var(--text-3);margin-top:6px;">${JSON.stringify(hit.metadata)}</div>` : ''}
|
|
102
|
-
</div>
|
|
103
|
-
`;
|
|
104
|
-
}).join('');
|
|
105
|
-
|
|
106
|
-
resultsEl.innerHTML = `
|
|
107
|
-
<div style="padding:8px 0;font-size:12px;color:var(--text-2);">
|
|
108
|
-
Found <strong>${data.hits.length}</strong> result(s) for "<strong>${escapeHtml(query)}</strong>"
|
|
109
|
-
</div>
|
|
110
|
-
${html}
|
|
111
|
-
`;
|
|
112
|
-
} catch (err) {
|
|
113
|
-
resultsEl.innerHTML = `<div style="padding:12px;color:var(--red);">Search failed: ${escapeHtml(err.message)}</div>`;
|
|
114
|
-
showNotification(`Memory search failed: ${err.message}`, 'error');
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export async function migrateMemory() {
|
|
119
|
-
const resultEl = document.getElementById('memoryActionResult');
|
|
120
|
-
if (!resultEl) return;
|
|
121
|
-
|
|
122
|
-
resultEl.style.display = 'block';
|
|
123
|
-
resultEl.innerHTML = '<div style="color:var(--text-2);">Migrating brain.md entries to shared memory...</div>';
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
const data = await postJSON('/api/memory/migrate', {});
|
|
127
|
-
|
|
128
|
-
if (data.ok) {
|
|
129
|
-
resultEl.innerHTML = `
|
|
130
|
-
<div style="color:var(--green);">✅ Migration complete</div>
|
|
131
|
-
<div style="margin-top:6px;font-size:11px;">
|
|
132
|
-
Imported: ${data.imported}, Skipped: ${data.skipped}, Errors: ${data.errors}
|
|
133
|
-
</div>
|
|
134
|
-
`;
|
|
135
|
-
showNotification('Brain.md migrated successfully', 'success');
|
|
136
|
-
await loadMemoryStats();
|
|
137
|
-
} else {
|
|
138
|
-
resultEl.innerHTML = `<div style="color:var(--red);">❌ Migration failed: ${escapeHtml(data.error || 'unknown error')}</div>`;
|
|
139
|
-
showNotification(`Migration failed: ${data.error}`, 'error');
|
|
140
|
-
}
|
|
141
|
-
} catch (err) {
|
|
142
|
-
resultEl.innerHTML = `<div style="color:var(--red);">❌ Migration failed: ${escapeHtml(err.message)}</div>`;
|
|
143
|
-
showNotification(`Migration failed: ${err.message}`, 'error');
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export async function compactMemory() {
|
|
148
|
-
const resultEl = document.getElementById('memoryActionResult');
|
|
149
|
-
if (!resultEl) return;
|
|
150
|
-
|
|
151
|
-
resultEl.style.display = 'block';
|
|
152
|
-
resultEl.innerHTML = '<div style="color:var(--text-2);">Compacting AgentKeeper store...</div>';
|
|
153
|
-
|
|
154
|
-
try {
|
|
155
|
-
const data = await postJSON('/api/memory/compact', {});
|
|
156
|
-
|
|
157
|
-
if (data.entriesBefore !== undefined) {
|
|
158
|
-
const bytesFreedKB = (data.bytesFreed / 1024).toFixed(1);
|
|
159
|
-
resultEl.innerHTML = `
|
|
160
|
-
<div style="color:var(--green);">✅ Compaction complete</div>
|
|
161
|
-
<div style="margin-top:6px;font-size:11px;">
|
|
162
|
-
Entries: ${data.entriesBefore} → ${data.entriesAfter}<br>
|
|
163
|
-
Space freed: ${bytesFreedKB}KB
|
|
164
|
-
</div>
|
|
165
|
-
`;
|
|
166
|
-
showNotification('AgentKeeper compacted successfully', 'success');
|
|
167
|
-
await loadMemoryStats();
|
|
168
|
-
} else {
|
|
169
|
-
resultEl.innerHTML = `<div style="color:var(--red);">❌ Compaction failed: ${escapeHtml(data.error || 'unknown error')}</div>`;
|
|
170
|
-
showNotification(`Compaction failed: ${data.error}`, 'error');
|
|
171
|
-
}
|
|
172
|
-
} catch (err) {
|
|
173
|
-
resultEl.innerHTML = `<div style="color:var(--red);">❌ Compaction failed: ${escapeHtml(err.message)}</div>`;
|
|
174
|
-
showNotification(`Compaction failed: ${err.message}`, 'error');
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
function escapeHtml(str) {
|
|
179
|
-
const div = document.createElement('div');
|
|
180
|
-
div.textContent = str;
|
|
181
|
-
return div.innerHTML;
|
|
182
|
-
}
|
|
Binary file
|