groove-dev 0.27.136 → 0.27.138
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/node_modules/@groove-dev/cli/package.json +1 -1
- package/node_modules/@groove-dev/daemon/package.json +1 -1
- package/node_modules/@groove-dev/daemon/src/adaptive.js +26 -16
- package/node_modules/@groove-dev/daemon/src/journalist.js +62 -24
- package/node_modules/@groove-dev/daemon/src/model-lab.js +6 -5
- package/node_modules/@groove-dev/daemon/src/rotator.js +48 -21
- package/{packages/gui/dist/assets/codemirror-DRQdprYi.js → node_modules/@groove-dev/gui/dist/assets/codemirror-BYKpdS2W.js} +1 -1
- package/{packages/gui/dist/assets/index-BrZHF7pK.js → node_modules/@groove-dev/gui/dist/assets/index-DcNgRadn.js} +1764 -1764
- package/node_modules/@groove-dev/gui/dist/assets/index-EY6WfKWH.css +1 -0
- package/node_modules/@groove-dev/gui/dist/index.html +3 -3
- package/node_modules/@groove-dev/gui/package.json +2 -1
- package/node_modules/@groove-dev/gui/src/components/editor/code-editor.jsx +81 -63
- package/node_modules/@groove-dev/gui/src/components/editor/editor-status-bar.jsx +66 -0
- package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +21 -24
- package/node_modules/@groove-dev/gui/src/stores/groove.js +5 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/README.md +152 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/cjs/index.js +95 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/esm/index.js +84 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-abcdef/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-abyss/README.md +150 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-abyss/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-abyss/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-abyss/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-abyss/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-abyss/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/README.md +153 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/index.js +66 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/esm/index.js +55 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-androidstudio/src/index.ts +40 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/index.js +106 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/index.js +96 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/src/color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-andromeda/src/index.ts +56 -0
- package/node_modules/@uiw/codemirror-theme-atomone/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-atomone/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-atomone/cjs/index.js +69 -0
- package/node_modules/@uiw/codemirror-theme-atomone/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-atomone/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-atomone/esm/index.js +58 -0
- package/node_modules/@uiw/codemirror-theme-atomone/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-atomone/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-atomone/src/index.ts +48 -0
- package/node_modules/@uiw/codemirror-theme-aura/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-aura/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-aura/cjs/index.js +99 -0
- package/node_modules/@uiw/codemirror-theme-aura/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-aura/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-aura/esm/index.js +89 -0
- package/node_modules/@uiw/codemirror-theme-aura/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-aura/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-aura/src/index.ts +51 -0
- package/node_modules/@uiw/codemirror-theme-basic/README.md +159 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/dark.js +156 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/light.js +153 -0
- package/node_modules/@uiw/codemirror-theme-basic/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-basic/dark.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/dark.js +146 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/light.js +143 -0
- package/node_modules/@uiw/codemirror-theme-basic/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-basic/light.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-basic/package.json +63 -0
- package/node_modules/@uiw/codemirror-theme-basic/src/dark.ts +76 -0
- package/node_modules/@uiw/codemirror-theme-basic/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-basic/src/light.ts +81 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/cjs/index.js +77 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/esm/index.js +67 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-bbedit/src/index.ts +44 -0
- package/node_modules/@uiw/codemirror-theme-bespin/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-bespin/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-bespin/cjs/index.js +72 -0
- package/node_modules/@uiw/codemirror-theme-bespin/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-bespin/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-bespin/esm/index.js +61 -0
- package/node_modules/@uiw/codemirror-theme-bespin/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-bespin/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-bespin/src/index.ts +46 -0
- package/node_modules/@uiw/codemirror-theme-console/README.md +160 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/dark.d.ts +4 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/dark.js +36 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/light.d.ts +4 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/light.js +36 -0
- package/node_modules/@uiw/codemirror-theme-console/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-console/dark.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/dark.d.ts +4 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/dark.js +26 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/light.d.ts +4 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/light.js +26 -0
- package/node_modules/@uiw/codemirror-theme-console/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-console/light.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-console/package.json +62 -0
- package/node_modules/@uiw/codemirror-theme-console/src/dark.ts +27 -0
- package/node_modules/@uiw/codemirror-theme-console/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-console/src/light.ts +27 -0
- package/node_modules/@uiw/codemirror-theme-copilot/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/index.js +106 -0
- package/node_modules/@uiw/codemirror-theme-copilot/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/index.js +96 -0
- package/node_modules/@uiw/codemirror-theme-copilot/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-copilot/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-copilot/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-copilot/src/index.ts +56 -0
- package/node_modules/@uiw/codemirror-theme-darcula/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-darcula/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-darcula/cjs/index.js +72 -0
- package/node_modules/@uiw/codemirror-theme-darcula/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-darcula/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-darcula/esm/index.js +61 -0
- package/node_modules/@uiw/codemirror-theme-darcula/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-darcula/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-darcula/src/index.ts +46 -0
- package/node_modules/@uiw/codemirror-theme-dracula/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-dracula/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-dracula/cjs/index.js +69 -0
- package/node_modules/@uiw/codemirror-theme-dracula/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-dracula/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-dracula/esm/index.js +58 -0
- package/node_modules/@uiw/codemirror-theme-dracula/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-dracula/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-dracula/src/index.ts +48 -0
- package/node_modules/@uiw/codemirror-theme-duotone/README.md +156 -0
- package/node_modules/@uiw/codemirror-theme-duotone/cjs/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-duotone/cjs/index.js +115 -0
- package/node_modules/@uiw/codemirror-theme-duotone/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-duotone/esm/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-duotone/esm/index.js +102 -0
- package/node_modules/@uiw/codemirror-theme-duotone/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-duotone/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-duotone/src/index.ts +79 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/README.md +145 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/cjs/index.js +78 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/esm/index.js +68 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-eclipse/src/index.ts +44 -0
- package/node_modules/@uiw/codemirror-theme-github/README.md +154 -0
- package/node_modules/@uiw/codemirror-theme-github/cjs/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-github/cjs/index.js +156 -0
- package/node_modules/@uiw/codemirror-theme-github/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-github/esm/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-github/esm/index.js +143 -0
- package/node_modules/@uiw/codemirror-theme-github/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-github/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-github/src/index.ts +86 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/README.md +153 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/index.d.ts +8 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/index.js +296 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/index.d.ts +8 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/index.js +283 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-gruvbox-dark/src/index.ts +203 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-kimbie/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-material/README.md +161 -0
- package/node_modules/@uiw/codemirror-theme-material/cjs/index.d.ts +12 -0
- package/node_modules/@uiw/codemirror-theme-material/cjs/index.js +247 -0
- package/node_modules/@uiw/codemirror-theme-material/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-material/esm/index.d.ts +12 -0
- package/node_modules/@uiw/codemirror-theme-material/esm/index.js +235 -0
- package/node_modules/@uiw/codemirror-theme-material/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-material/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-material/src/index.ts +129 -0
- package/node_modules/@uiw/codemirror-theme-monokai/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-monokai/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-monokai/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-monokai/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-monokai/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/package.json +46 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-monokai-dimmed/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/index.js +83 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/index.js +73 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-noctis-lilac/src/index.ts +49 -0
- package/node_modules/@uiw/codemirror-theme-nord/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-nord/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-nord/cjs/index.js +159 -0
- package/node_modules/@uiw/codemirror-theme-nord/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-nord/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-nord/esm/index.js +149 -0
- package/node_modules/@uiw/codemirror-theme-nord/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-nord/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-nord/src/index.ts +77 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/README.md +147 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/cjs/index.js +69 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/esm/index.js +59 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-okaidia/src/index.ts +41 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/index.js +104 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/index.js +94 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-quietlight/src/index.ts +53 -0
- package/node_modules/@uiw/codemirror-theme-red/README.md +149 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-red/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-red/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-red/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-red/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-red/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-solarized/README.md +160 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark-color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/dark.js +104 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/light-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/light-color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/light.js +104 -0
- package/node_modules/@uiw/codemirror-theme-solarized/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-solarized/dark.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/dark-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/dark-color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/dark.js +94 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/light-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/light-color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/light.js +94 -0
- package/node_modules/@uiw/codemirror-theme-solarized/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-solarized/light.d.ts +6 -0
- package/node_modules/@uiw/codemirror-theme-solarized/package.json +63 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/dark-color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/dark.ts +53 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/light-color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-solarized/src/light.ts +53 -0
- package/node_modules/@uiw/codemirror-theme-sublime/README.md +147 -0
- package/node_modules/@uiw/codemirror-theme-sublime/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-sublime/cjs/index.js +73 -0
- package/node_modules/@uiw/codemirror-theme-sublime/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-sublime/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-sublime/esm/index.js +62 -0
- package/node_modules/@uiw/codemirror-theme-sublime/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-sublime/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-sublime/src/index.ts +42 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/index.js +99 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/index.js +89 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/package.json +50 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night/src/index.ts +51 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/README.md +153 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/index.js +100 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/index.js +90 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/package.json +51 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-day/src/index.ts +51 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/README.md +153 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/index.js +100 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/index.js +90 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/package.json +51 -0
- package/node_modules/@uiw/codemirror-theme-tokyo-night-storm/src/index.ts +51 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/README.md +151 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/color.js +31 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/index.js +103 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/color.d.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/color.js +25 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/index.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/index.js +93 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/package.json +45 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/src/color.ts +25 -0
- package/node_modules/@uiw/codemirror-theme-tomorrow-night-blue/src/index.ts +52 -0
- package/node_modules/@uiw/codemirror-theme-vscode/README.md +161 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/dark.js +98 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/light.js +98 -0
- package/node_modules/@uiw/codemirror-theme-vscode/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/dark.js +85 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/light.js +85 -0
- package/node_modules/@uiw/codemirror-theme-vscode/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-vscode/package.json +44 -0
- package/node_modules/@uiw/codemirror-theme-vscode/src/dark.ts +82 -0
- package/node_modules/@uiw/codemirror-theme-vscode/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-vscode/src/light.ts +82 -0
- package/node_modules/@uiw/codemirror-theme-white/README.md +160 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/dark-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/dark-color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/dark.js +110 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/index.js +27 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/light-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/light-color.js +32 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/light.js +110 -0
- package/node_modules/@uiw/codemirror-theme-white/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/dark-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/dark-color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/dark.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/dark.js +100 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/index.d.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/index.js +2 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/light-color.d.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/light-color.js +26 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/light.d.ts +5 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/light.js +100 -0
- package/node_modules/@uiw/codemirror-theme-white/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-white/package.json +56 -0
- package/node_modules/@uiw/codemirror-theme-white/src/dark-color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/src/dark.ts +57 -0
- package/node_modules/@uiw/codemirror-theme-white/src/index.ts +2 -0
- package/node_modules/@uiw/codemirror-theme-white/src/light-color.ts +26 -0
- package/node_modules/@uiw/codemirror-theme-white/src/light.ts +57 -0
- package/node_modules/@uiw/codemirror-theme-xcode/README.md +154 -0
- package/node_modules/@uiw/codemirror-theme-xcode/cjs/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-xcode/cjs/index.js +119 -0
- package/node_modules/@uiw/codemirror-theme-xcode/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-xcode/esm/index.d.ts +9 -0
- package/node_modules/@uiw/codemirror-theme-xcode/esm/index.js +104 -0
- package/node_modules/@uiw/codemirror-theme-xcode/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-theme-xcode/package.json +44 -0
- package/node_modules/@uiw/codemirror-theme-xcode/src/index.ts +75 -0
- package/node_modules/@uiw/codemirror-themes/README.md +391 -0
- package/node_modules/@uiw/codemirror-themes/cjs/index.d.ts +46 -0
- package/node_modules/@uiw/codemirror-themes/cjs/index.js +84 -0
- package/node_modules/@uiw/codemirror-themes/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-themes/esm/index.d.ts +46 -0
- package/node_modules/@uiw/codemirror-themes/esm/index.js +78 -0
- package/node_modules/@uiw/codemirror-themes/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-themes/package.json +56 -0
- package/node_modules/@uiw/codemirror-themes/src/index.tsx +128 -0
- package/node_modules/@uiw/codemirror-themes-all/README.md +406 -0
- package/node_modules/@uiw/codemirror-themes-all/cjs/index.d.ts +35 -0
- package/node_modules/@uiw/codemirror-themes-all/cjs/index.js +390 -0
- package/node_modules/@uiw/codemirror-themes-all/cjs/package.json +1 -0
- package/node_modules/@uiw/codemirror-themes-all/esm/index.d.ts +35 -0
- package/node_modules/@uiw/codemirror-themes-all/esm/index.js +35 -0
- package/node_modules/@uiw/codemirror-themes-all/esm/package.json +1 -0
- package/node_modules/@uiw/codemirror-themes-all/package.json +86 -0
- package/node_modules/@uiw/codemirror-themes-all/src/index.ts +35 -0
- package/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/adaptive.js +26 -16
- package/packages/daemon/src/journalist.js +62 -24
- package/packages/daemon/src/model-lab.js +6 -5
- package/packages/daemon/src/rotator.js +48 -21
- package/{node_modules/@groove-dev/gui/dist/assets/codemirror-DRQdprYi.js → packages/gui/dist/assets/codemirror-BYKpdS2W.js} +1 -1
- package/{node_modules/@groove-dev/gui/dist/assets/index-BrZHF7pK.js → packages/gui/dist/assets/index-DcNgRadn.js} +1764 -1764
- package/packages/gui/dist/assets/index-EY6WfKWH.css +1 -0
- package/packages/gui/dist/index.html +3 -3
- package/packages/gui/package.json +2 -1
- package/packages/gui/src/components/editor/code-editor.jsx +81 -63
- package/packages/gui/src/components/editor/editor-status-bar.jsx +66 -0
- package/packages/gui/src/components/lab/system-prompt-editor.jsx +21 -24
- package/packages/gui/src/stores/groove.js +5 -0
- package/model-workspace/LAB-ASSISTANT-BUILD-PLAN.md +0 -341
- package/node_modules/@groove-dev/gui/dist/assets/index-DIfiwdKl.css +0 -1
- package/packages/gui/dist/assets/index-DIfiwdKl.css +0 -1
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
// FSL-1.1-Apache-2.0 — see LICENSE
|
|
2
|
+
import { useState, useRef, useEffect } from 'react';
|
|
3
|
+
import { Palette } from 'lucide-react';
|
|
4
|
+
import { useGrooveStore } from '../../stores/groove';
|
|
5
|
+
import { EDITOR_THEMES } from './code-editor';
|
|
6
|
+
import { cn } from '../../lib/cn';
|
|
2
7
|
|
|
3
8
|
const LANG_LABELS = {
|
|
4
9
|
javascript: 'JavaScript',
|
|
@@ -10,13 +15,74 @@ const LANG_LABELS = {
|
|
|
10
15
|
python: 'Python',
|
|
11
16
|
};
|
|
12
17
|
|
|
18
|
+
const themeKeys = Object.keys(EDITOR_THEMES);
|
|
19
|
+
const darkThemes = themeKeys.filter((k) => !['githubLight', 'vscodeLight', 'eclipse', 'xcodeLight', 'solarizedLight', 'gruvboxLight', 'materialLight', 'duotoneLight', 'quietlight', 'bbedit', 'tokyoNightDay', 'basicLight'].includes(k));
|
|
20
|
+
const lightThemes = themeKeys.filter((k) => !darkThemes.includes(k));
|
|
21
|
+
|
|
13
22
|
export function EditorStatusBar({ cursorPos, language }) {
|
|
23
|
+
const editorTheme = useGrooveStore((s) => s.editorTheme);
|
|
24
|
+
const setEditorTheme = useGrooveStore((s) => s.setEditorTheme);
|
|
25
|
+
const [open, setOpen] = useState(false);
|
|
26
|
+
const menuRef = useRef(null);
|
|
27
|
+
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (!open) return;
|
|
30
|
+
function handleClick(e) {
|
|
31
|
+
if (menuRef.current && !menuRef.current.contains(e.target)) setOpen(false);
|
|
32
|
+
}
|
|
33
|
+
document.addEventListener('mousedown', handleClick);
|
|
34
|
+
return () => document.removeEventListener('mousedown', handleClick);
|
|
35
|
+
}, [open]);
|
|
36
|
+
|
|
14
37
|
return (
|
|
15
38
|
<div className="flex items-center justify-between h-6 px-3 bg-surface-1 border-t border-border-subtle text-2xs font-sans text-text-3 flex-shrink-0 select-none">
|
|
16
39
|
<div className="flex items-center gap-3">
|
|
17
40
|
<span>Ln {cursorPos.line}, Col {cursorPos.col}</span>
|
|
18
41
|
</div>
|
|
19
42
|
<div className="flex items-center gap-3">
|
|
43
|
+
<div className="relative" ref={menuRef}>
|
|
44
|
+
<button
|
|
45
|
+
onClick={() => setOpen(!open)}
|
|
46
|
+
className="flex items-center gap-1.5 hover:text-text-0 transition-colors cursor-pointer"
|
|
47
|
+
>
|
|
48
|
+
<Palette size={10} />
|
|
49
|
+
<span>{EDITOR_THEMES[editorTheme]?.label || editorTheme}</span>
|
|
50
|
+
</button>
|
|
51
|
+
{open && (
|
|
52
|
+
<div className="absolute bottom-6 right-0 w-48 max-h-72 overflow-y-auto rounded-md border border-border bg-surface-2 shadow-xl z-50 py-1 scrollbar-thin">
|
|
53
|
+
<div className="px-2 py-1 text-2xs text-text-4 font-semibold uppercase tracking-wider">Dark</div>
|
|
54
|
+
{darkThemes.map((key) => (
|
|
55
|
+
<button
|
|
56
|
+
key={key}
|
|
57
|
+
onClick={() => { setEditorTheme(key); setOpen(false); }}
|
|
58
|
+
className={cn(
|
|
59
|
+
'w-full text-left px-3 py-1 text-2xs font-sans cursor-pointer transition-colors',
|
|
60
|
+
key === editorTheme
|
|
61
|
+
? 'text-accent bg-accent/10'
|
|
62
|
+
: 'text-text-1 hover:bg-surface-4',
|
|
63
|
+
)}
|
|
64
|
+
>
|
|
65
|
+
{EDITOR_THEMES[key].label}
|
|
66
|
+
</button>
|
|
67
|
+
))}
|
|
68
|
+
<div className="px-2 py-1 mt-1 text-2xs text-text-4 font-semibold uppercase tracking-wider border-t border-border-subtle">Light</div>
|
|
69
|
+
{lightThemes.map((key) => (
|
|
70
|
+
<button
|
|
71
|
+
key={key}
|
|
72
|
+
onClick={() => { setEditorTheme(key); setOpen(false); }}
|
|
73
|
+
className={cn(
|
|
74
|
+
'w-full text-left px-3 py-1 text-2xs font-sans cursor-pointer transition-colors',
|
|
75
|
+
key === editorTheme
|
|
76
|
+
? 'text-accent bg-accent/10'
|
|
77
|
+
: 'text-text-1 hover:bg-surface-4',
|
|
78
|
+
)}
|
|
79
|
+
>
|
|
80
|
+
{EDITOR_THEMES[key].label}
|
|
81
|
+
</button>
|
|
82
|
+
))}
|
|
83
|
+
</div>
|
|
84
|
+
)}
|
|
85
|
+
</div>
|
|
20
86
|
<span className="cursor-default">{LANG_LABELS[language] || language || 'Plain Text'}</span>
|
|
21
87
|
<span>Spaces: 2</span>
|
|
22
88
|
<span>UTF-8</span>
|
|
@@ -4,42 +4,31 @@ import { useGrooveStore } from '../../stores/groove';
|
|
|
4
4
|
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
5
5
|
import { cn } from '../../lib/cn';
|
|
6
6
|
import { EditorView, keymap, lineNumbers } from '@codemirror/view';
|
|
7
|
-
import { EditorState } from '@codemirror/state';
|
|
7
|
+
import { EditorState, Compartment } from '@codemirror/state';
|
|
8
8
|
import { defaultKeymap, history, historyKeymap } from '@codemirror/commands';
|
|
9
|
-
import { syntaxHighlighting, HighlightStyle } from '@codemirror/language';
|
|
10
|
-
import { tags as t } from '@lezer/highlight';
|
|
11
9
|
import { markdown } from '@codemirror/lang-markdown';
|
|
10
|
+
import { EDITOR_THEMES } from '../editor/code-editor';
|
|
12
11
|
|
|
13
|
-
const
|
|
14
|
-
'&': {
|
|
12
|
+
const promptChrome = EditorView.theme({
|
|
13
|
+
'&': { fontFamily: 'var(--font-mono)', fontSize: '11px', height: '100%', lineHeight: '1.6' },
|
|
15
14
|
'.cm-scroller': { overflow: 'auto', padding: '4px 0' },
|
|
16
|
-
'.cm-content': {
|
|
17
|
-
'.cm-
|
|
18
|
-
'.cm-gutters': { backgroundColor: 'var(--color-surface-1)', borderRight: 'none', color: '#404852', minWidth: '28px' },
|
|
15
|
+
'.cm-content': { padding: '0 8px' },
|
|
16
|
+
'.cm-gutters': { borderRight: 'none', minWidth: '28px' },
|
|
19
17
|
'.cm-activeLine': { backgroundColor: 'rgba(255, 255, 255, 0.02)' },
|
|
20
|
-
'&.cm-focused .cm-selectionBackground, .cm-selectionBackground': { backgroundColor: 'rgba(51, 175, 188, 0.15)' },
|
|
21
18
|
});
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
{ tag: [t.function(t.variableName), t.labelName], color: '#dcc9a0' },
|
|
27
|
-
{ tag: [t.meta, t.comment], color: '#6e7681', fontStyle: 'italic' },
|
|
28
|
-
{ tag: t.strong, fontWeight: 'bold' },
|
|
29
|
-
{ tag: t.emphasis, fontStyle: 'italic' },
|
|
30
|
-
{ tag: t.link, color: '#7ab0df', textDecoration: 'underline' },
|
|
31
|
-
{ tag: t.heading, fontWeight: '400', color: '#bcc2cd' },
|
|
32
|
-
{ tag: [t.processingInstruction, t.string, t.inserted], color: '#95b2b8' },
|
|
33
|
-
{ tag: [t.atom, t.bool], color: '#d4a07a' },
|
|
34
|
-
{ tag: t.invalid, color: '#d4736e' },
|
|
35
|
-
]);
|
|
20
|
+
function getThemeExt(key) {
|
|
21
|
+
return EDITOR_THEMES[key]?.ext || EDITOR_THEMES.vscodeDark.ext;
|
|
22
|
+
}
|
|
36
23
|
|
|
37
24
|
export function SystemPromptEditor() {
|
|
38
25
|
const systemPrompt = useGrooveStore((s) => s.labSystemPrompt);
|
|
39
26
|
const setSystemPrompt = useGrooveStore((s) => s.setLabSystemPrompt);
|
|
27
|
+
const themeKey = useGrooveStore((s) => s.editorTheme);
|
|
40
28
|
const [collapsed, setCollapsed] = useState(false);
|
|
41
29
|
const containerRef = useRef(null);
|
|
42
30
|
const viewRef = useRef(null);
|
|
31
|
+
const themeCompartment = useRef(new Compartment());
|
|
43
32
|
const externalUpdate = useRef(false);
|
|
44
33
|
|
|
45
34
|
const charCount = systemPrompt.length;
|
|
@@ -51,6 +40,8 @@ export function SystemPromptEditor() {
|
|
|
51
40
|
useEffect(() => {
|
|
52
41
|
if (!containerRef.current) return;
|
|
53
42
|
|
|
43
|
+
const initialTheme = getThemeExt(useGrooveStore.getState().editorTheme);
|
|
44
|
+
|
|
54
45
|
const updateListener = EditorView.updateListener.of((update) => {
|
|
55
46
|
if (update.docChanged) {
|
|
56
47
|
handleChange(update.state.doc.toString());
|
|
@@ -62,10 +53,10 @@ export function SystemPromptEditor() {
|
|
|
62
53
|
extensions: [
|
|
63
54
|
lineNumbers(),
|
|
64
55
|
history(),
|
|
65
|
-
|
|
56
|
+
themeCompartment.current.of(initialTheme),
|
|
57
|
+
promptChrome,
|
|
66
58
|
markdown(),
|
|
67
59
|
keymap.of([...defaultKeymap, ...historyKeymap]),
|
|
68
|
-
editorTheme,
|
|
69
60
|
updateListener,
|
|
70
61
|
EditorView.lineWrapping,
|
|
71
62
|
],
|
|
@@ -76,6 +67,12 @@ export function SystemPromptEditor() {
|
|
|
76
67
|
return () => view.destroy();
|
|
77
68
|
}, []);
|
|
78
69
|
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
const view = viewRef.current;
|
|
72
|
+
if (!view) return;
|
|
73
|
+
view.dispatch({ effects: themeCompartment.current.reconfigure(getThemeExt(themeKey)) });
|
|
74
|
+
}, [themeKey]);
|
|
75
|
+
|
|
79
76
|
useEffect(() => {
|
|
80
77
|
const view = viewRef.current;
|
|
81
78
|
if (!view) return;
|
|
@@ -196,6 +196,7 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
196
196
|
editorChangedFiles: {},
|
|
197
197
|
editorRecentSaves: {},
|
|
198
198
|
editorSidebarWidth: Number(localStorage.getItem('groove:editorSidebarWidth')) || 240,
|
|
199
|
+
editorTheme: localStorage.getItem('groove:editorTheme') || 'vscodeDark',
|
|
199
200
|
|
|
200
201
|
// ── Workspace Mode ────────────────────────────────────────
|
|
201
202
|
workspaceMode: localStorage.getItem('groove:workspaceMode') === 'true',
|
|
@@ -2810,6 +2811,10 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
2810
2811
|
set({ editorSidebarWidth: width });
|
|
2811
2812
|
localStorage.setItem('groove:editorSidebarWidth', String(width));
|
|
2812
2813
|
},
|
|
2814
|
+
setEditorTheme(theme) {
|
|
2815
|
+
set({ editorTheme: theme });
|
|
2816
|
+
localStorage.setItem('groove:editorTheme', theme);
|
|
2817
|
+
},
|
|
2813
2818
|
|
|
2814
2819
|
updateFileContent(path, content) {
|
|
2815
2820
|
set((s) => ({ editorFiles: { ...s.editorFiles, [path]: { ...s.editorFiles[path], content } } }));
|
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
# Lab Assistant — Build Plan
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
Add an embedded AI assistant to the Model Lab that helps users set up inference runtimes (vLLM, TGI) without leaving the Lab. One agent, one chat, inline in the center panel. The agent handles system recon, installation, configuration, server startup, and auto-creates the Lab runtime when done.
|
|
6
|
-
|
|
7
|
-
## User Flow
|
|
8
|
-
|
|
9
|
-
1. User selects a model + picks vLLM or TGI backend in the Launch Model section
|
|
10
|
-
2. Clicks **"Setup vLLM with Assistant"** button
|
|
11
|
-
3. Center panel switches from Playground to Assistant tab — agent chat appears
|
|
12
|
-
4. Agent: "Let me check your system..." → runs nvidia-smi, checks CUDA, Python, Docker, VRAM
|
|
13
|
-
5. Agent: "You have an RTX 4090 with 24GB VRAM. I'll set up vLLM via Docker with Qwen3-8B."
|
|
14
|
-
6. Agent installs, configures, starts the server, validates with a health check
|
|
15
|
-
7. Agent calls `POST http://localhost:31415/api/lab/runtimes` to register the runtime
|
|
16
|
-
8. Runtime appears in the Lab's left panel automatically (via WebSocket event)
|
|
17
|
-
9. Agent: "Done! Switch to the Playground tab to start chatting."
|
|
18
|
-
10. User clicks "Switch to Playground" — model is ready to use
|
|
19
|
-
|
|
20
|
-
## Architecture
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
User clicks "Setup vLLM"
|
|
24
|
-
→ store.launchLabAssistant('vllm')
|
|
25
|
-
→ POST /api/lab/assistant { backend: 'vllm' }
|
|
26
|
-
→ daemon reads templates/vllm-setup.json
|
|
27
|
-
→ daemon.processes.spawn({ role: 'lab-assistant', prompt: ... })
|
|
28
|
-
→ returns { agentId }
|
|
29
|
-
→ store sets labAssistantAgentId, switches to Assistant tab
|
|
30
|
-
→ agent output streams via WebSocket → chatHistory[agentId]
|
|
31
|
-
|
|
32
|
-
Agent runs system commands, installs vLLM, starts server
|
|
33
|
-
→ agent calls: curl POST /api/lab/runtimes (on localhost)
|
|
34
|
-
→ daemon creates runtime, broadcasts lab:runtime:added
|
|
35
|
-
→ store.fetchLabRuntimes() fires → left panel updates
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Implementation
|
|
39
|
-
|
|
40
|
-
### 1. Team Templates (new files)
|
|
41
|
-
|
|
42
|
-
**`packages/daemon/templates/vllm-setup.json`**
|
|
43
|
-
|
|
44
|
-
Single-agent template. Role is `lab-assistant` (avoids the `planner` role which is restricted to planning-only in `ROLE_PROMPTS`).
|
|
45
|
-
|
|
46
|
-
```json
|
|
47
|
-
{
|
|
48
|
-
"name": "vllm-setup",
|
|
49
|
-
"description": "Lab Assistant for vLLM installation and configuration",
|
|
50
|
-
"agents": [
|
|
51
|
-
{
|
|
52
|
-
"role": "lab-assistant",
|
|
53
|
-
"scope": [],
|
|
54
|
-
"provider": "claude-code",
|
|
55
|
-
"prompt": "SEE PROMPT SPEC BELOW"
|
|
56
|
-
}
|
|
57
|
-
]
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
**`packages/daemon/templates/tgi-setup.json`** — same structure, TGI-specific prompt.
|
|
62
|
-
|
|
63
|
-
#### Planner Prompt Spec (vLLM)
|
|
64
|
-
|
|
65
|
-
The prompt is the hardest part. It must cover:
|
|
66
|
-
|
|
67
|
-
**Identity**: "You are a GROOVE Lab Assistant. You help the user set up a vLLM inference server. Be conversational, report progress clearly."
|
|
68
|
-
|
|
69
|
-
**System Recon** (run these commands, report findings):
|
|
70
|
-
- `nvidia-smi` — GPU model, VRAM, driver version
|
|
71
|
-
- `nvcc --version` — CUDA toolkit version
|
|
72
|
-
- `python3 --version` and `pip3 --version`
|
|
73
|
-
- `docker --version`
|
|
74
|
-
- `free -h` — available RAM
|
|
75
|
-
- `df -h /` — disk space
|
|
76
|
-
|
|
77
|
-
**Decision Matrix**:
|
|
78
|
-
- Docker available + NVIDIA GPU → Docker path (simplest)
|
|
79
|
-
- No Docker, Python 3.8+ and CUDA → pip path
|
|
80
|
-
- No GPU → warn user, suggest llama.cpp/Ollama instead
|
|
81
|
-
- VRAM sizing: <8GB → 1-3B models, 8-16GB → 7B, 16-24GB → 13B, 24-48GB → 30-70B quantized, 48GB+ → 70B+
|
|
82
|
-
|
|
83
|
-
**Installation**:
|
|
84
|
-
- Docker: `docker run --runtime nvidia --gpus all -v ~/.cache/huggingface:/root/.cache/huggingface -p 8000:8000 --ipc=host vllm/vllm-openai:latest --model <model>`
|
|
85
|
-
- Pip: `pip install vllm && vllm serve <model> --host 0.0.0.0 --port 8000`
|
|
86
|
-
- Must use `nohup` or `docker run -d` so server persists after agent exits
|
|
87
|
-
|
|
88
|
-
**Validation**: `curl http://localhost:8000/v1/models` — confirm JSON response
|
|
89
|
-
|
|
90
|
-
**Runtime Registration**:
|
|
91
|
-
```bash
|
|
92
|
-
PORT=$(cat ~/.groove/daemon.port 2>/dev/null || echo 31415)
|
|
93
|
-
curl -s -X POST http://localhost:$PORT/api/lab/runtimes \
|
|
94
|
-
-H 'Content-Type: application/json' \
|
|
95
|
-
-d '{"name":"vLLM - <model>","type":"vllm","endpoint":"http://localhost:8000"}'
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**Completion**: Tell user to switch to Playground tab.
|
|
99
|
-
|
|
100
|
-
**Error Handling**: Explain errors clearly, suggest fixes, offer retry. Common issues: CUDA mismatch, insufficient VRAM, Docker not running, missing nvidia-container-toolkit.
|
|
101
|
-
|
|
102
|
-
#### TGI Prompt Spec
|
|
103
|
-
|
|
104
|
-
Same structure, but:
|
|
105
|
-
- Docker: `ghcr.io/huggingface/text-generation-inference`
|
|
106
|
-
- Default port: 8080
|
|
107
|
-
- Model loading with `--model-id`
|
|
108
|
-
- Runtime type: `"tgi"`
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
### 2. Daemon Endpoint
|
|
113
|
-
|
|
114
|
-
**File**: `packages/daemon/src/api.js`
|
|
115
|
-
**Location**: After the existing lab endpoints (after `GET /api/lab/sessions/:id`, around line 6760)
|
|
116
|
-
|
|
117
|
-
**`POST /api/lab/assistant`**
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
Request: { "backend": "vllm" | "tgi" }
|
|
121
|
-
Response: { "agentId": "abc123", "backend": "vllm" }
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
Implementation:
|
|
125
|
-
1. Validate `backend` is "vllm" or "tgi"
|
|
126
|
-
2. Read template: `readFileSync(resolve(__dirname, '../templates/${backend}-setup.json'), 'utf8')`
|
|
127
|
-
3. Parse JSON, extract the agent config (first entry in `agents` array)
|
|
128
|
-
4. Spawn agent via `daemon.processes.spawn()` with:
|
|
129
|
-
- `role`: "lab-assistant"
|
|
130
|
-
- `provider`: agent config provider or daemon default
|
|
131
|
-
- `prompt`: agent config prompt
|
|
132
|
-
- `teamId`: default team ID
|
|
133
|
-
- `metadata`: `{ labAssistant: true, backend }`
|
|
134
|
-
5. Return `201` with `{ agentId: agent.id, backend }`
|
|
135
|
-
|
|
136
|
-
**Import needed**: `readFileSync` from `fs`, `resolve` from `path` (likely already imported in api.js)
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
### 3. Store State & Actions
|
|
141
|
-
|
|
142
|
-
**File**: `packages/gui/src/stores/groove.js`
|
|
143
|
-
|
|
144
|
-
**New state** (add after `labLaunchError`):
|
|
145
|
-
```js
|
|
146
|
-
labAssistantAgentId: null,
|
|
147
|
-
labAssistantMode: false,
|
|
148
|
-
labAssistantBackend: null,
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
**New actions** (add after the existing lab actions block):
|
|
152
|
-
|
|
153
|
-
```js
|
|
154
|
-
async launchLabAssistant(backend) {
|
|
155
|
-
const existing = get().labAssistantAgentId;
|
|
156
|
-
if (existing) {
|
|
157
|
-
// If assistant already running, just switch to its tab
|
|
158
|
-
const agent = get().agents.find((a) => a.id === existing);
|
|
159
|
-
if (agent && agent.status === 'running') {
|
|
160
|
-
set({ labAssistantMode: true });
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
try {
|
|
165
|
-
const data = await api.post('/lab/assistant', { backend });
|
|
166
|
-
set({ labAssistantAgentId: data.agentId, labAssistantMode: true, labAssistantBackend: backend });
|
|
167
|
-
get().addToast('info', `Lab Assistant started for ${backend}`);
|
|
168
|
-
} catch (err) {
|
|
169
|
-
get().addToast('error', 'Failed to start assistant', err.message);
|
|
170
|
-
}
|
|
171
|
-
},
|
|
172
|
-
|
|
173
|
-
dismissLabAssistant() {
|
|
174
|
-
set({ labAssistantMode: false });
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
clearLabAssistant() {
|
|
178
|
-
const id = get().labAssistantAgentId;
|
|
179
|
-
if (id) api.delete(`/agents/${id}`).catch(() => {});
|
|
180
|
-
set({ labAssistantAgentId: null, labAssistantMode: false, labAssistantBackend: null });
|
|
181
|
-
},
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**No WebSocket changes needed** — `agent:output` already populates `chatHistory[agentId]`, and `lab:runtime:added` already triggers `fetchLabRuntimes()`.
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
### 4. Lab Assistant Component (new file)
|
|
189
|
-
|
|
190
|
-
**File**: `packages/gui/src/components/lab/lab-assistant.jsx`
|
|
191
|
-
|
|
192
|
-
A focused chat component for the lab assistant agent. Reads from `chatHistory[labAssistantAgentId]`, sends via the existing agent instruction mechanism.
|
|
193
|
-
|
|
194
|
-
**Structure**:
|
|
195
|
-
```
|
|
196
|
-
LabAssistant
|
|
197
|
-
├── Header: backend badge, agent status, dismiss "X" button
|
|
198
|
-
├── ScrollArea: message list
|
|
199
|
-
│ ├── Agent messages (left-aligned, border-l accent)
|
|
200
|
-
│ └── User messages (right-aligned, accent/10 bg)
|
|
201
|
-
├── Thinking indicator (when agent is processing)
|
|
202
|
-
├── Completion banner: "Setup complete — Switch to Playground" button
|
|
203
|
-
└── Input: textarea + send button (Enter to send, Shift+Enter newline)
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
**Key store selectors**:
|
|
207
|
-
- `labAssistantAgentId` — which agent to display
|
|
208
|
-
- `chatHistory[agentId]` — message history
|
|
209
|
-
- `agents.find(a => a.id === agentId)` — agent status (running/completed/error)
|
|
210
|
-
- `dismissLabAssistant` — switch back to playground
|
|
211
|
-
|
|
212
|
-
**Sending messages**: Use the existing `instructAgent(agentId, message)` store action (check if this exists — it should be the mechanism used by AgentChat). If not, use `api.post('/agents/${id}/instruct', { message })`.
|
|
213
|
-
|
|
214
|
-
**Styling**: Match `chat-playground.jsx` patterns exactly — same message bubble styles, same input area, same auto-scroll logic. License header on line 1.
|
|
215
|
-
|
|
216
|
-
**Completion detection**: When `agent.status !== 'running'` and the last message exists, show the "Switch to Playground" button.
|
|
217
|
-
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
### 5. Center Panel Mode Switch
|
|
221
|
-
|
|
222
|
-
**File**: `packages/gui/src/views/model-lab.jsx`
|
|
223
|
-
|
|
224
|
-
**New import**: `import { LabAssistant } from '../components/lab/lab-assistant';`
|
|
225
|
-
|
|
226
|
-
**New store selectors** in `ModelLabView`:
|
|
227
|
-
```js
|
|
228
|
-
const labAssistantAgentId = useGrooveStore((s) => s.labAssistantAgentId);
|
|
229
|
-
const labAssistantMode = useGrooveStore((s) => s.labAssistantMode);
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
**Replace the center panel** (currently `<div className="flex-1 min-w-0 p-3"><ChatPlayground /></div>`) with:
|
|
233
|
-
|
|
234
|
-
```jsx
|
|
235
|
-
<div className="flex-1 min-w-0 flex flex-col">
|
|
236
|
-
{/* Tab bar — only visible when assistant exists */}
|
|
237
|
-
{labAssistantAgentId && (
|
|
238
|
-
<div className="flex-shrink-0 flex items-center gap-1 px-3 pt-2">
|
|
239
|
-
<button
|
|
240
|
-
onClick={() => set({ labAssistantMode: false })}
|
|
241
|
-
className={cn(
|
|
242
|
-
'px-3 py-1.5 text-xs font-sans font-medium rounded-t-md transition-colors cursor-pointer',
|
|
243
|
-
!labAssistantMode ? 'text-accent bg-accent/10' : 'text-text-3 hover:text-text-1',
|
|
244
|
-
)}
|
|
245
|
-
>
|
|
246
|
-
Playground
|
|
247
|
-
</button>
|
|
248
|
-
<button
|
|
249
|
-
onClick={() => set({ labAssistantMode: true })}
|
|
250
|
-
className={cn(
|
|
251
|
-
'px-3 py-1.5 text-xs font-sans font-medium rounded-t-md transition-colors cursor-pointer',
|
|
252
|
-
labAssistantMode ? 'text-accent bg-accent/10' : 'text-text-3 hover:text-text-1',
|
|
253
|
-
)}
|
|
254
|
-
>
|
|
255
|
-
Assistant
|
|
256
|
-
</button>
|
|
257
|
-
</div>
|
|
258
|
-
)}
|
|
259
|
-
<div className="flex-1 min-h-0 p-3">
|
|
260
|
-
{labAssistantMode && labAssistantAgentId ? <LabAssistant /> : <ChatPlayground />}
|
|
261
|
-
</div>
|
|
262
|
-
</div>
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
Note: The tab buttons need to call store's `set` function — either expose `setLabAssistantMode(bool)` as a store action, or use `dismissLabAssistant()` and `set({ labAssistantMode: true })`. Cleanest approach: add a `setLabAssistantMode(mode)` action to the store.
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
### 6. LaunchModel Button
|
|
270
|
-
|
|
271
|
-
**File**: `packages/gui/src/components/lab/runtime-config.jsx`
|
|
272
|
-
|
|
273
|
-
**In the `LaunchModel` component**, replace the static guidance box for vLLM/TGI:
|
|
274
|
-
|
|
275
|
-
Change from:
|
|
276
|
-
```jsx
|
|
277
|
-
{!currentBackend?.autoLaunch && (
|
|
278
|
-
<div>...manual setup guidance...</div>
|
|
279
|
-
)}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
To:
|
|
283
|
-
```jsx
|
|
284
|
-
{!currentBackend?.autoLaunch && (
|
|
285
|
-
<div className="space-y-2">
|
|
286
|
-
<Button variant="primary" size="sm" className="w-full" onClick={handleLaunchAssistant} disabled={assistantLaunching}>
|
|
287
|
-
{assistantLaunching
|
|
288
|
-
? <><Loader2 size={12} className="animate-spin mr-1.5" /> Starting Assistant...</>
|
|
289
|
-
: <><Wrench size={12} className="mr-1.5" /> Setup {currentBackend?.label} with Assistant</>
|
|
290
|
-
}
|
|
291
|
-
</Button>
|
|
292
|
-
<p className="text-2xs text-text-4 font-sans px-1">
|
|
293
|
-
An AI assistant will check your system and handle the installation, or start your server manually and add it as a Runtime below.
|
|
294
|
-
</p>
|
|
295
|
-
</div>
|
|
296
|
-
)}
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
**New imports**: `Wrench` from lucide-react, `launchLabAssistant` from store.
|
|
300
|
-
|
|
301
|
-
**Update BACKENDS array** subtitle for vLLM/TGI:
|
|
302
|
-
```js
|
|
303
|
-
{ id: 'vllm', label: 'vLLM', subtitle: 'GPU-optimized, guided setup', autoLaunch: false },
|
|
304
|
-
{ id: 'tgi', label: 'TGI', subtitle: 'HuggingFace, guided setup', autoLaunch: false },
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
---
|
|
308
|
-
|
|
309
|
-
## File Summary
|
|
310
|
-
|
|
311
|
-
| File | Action | Description |
|
|
312
|
-
|------|--------|-------------|
|
|
313
|
-
| `packages/daemon/templates/vllm-setup.json` | CREATE | vLLM setup agent template + prompt |
|
|
314
|
-
| `packages/daemon/templates/tgi-setup.json` | CREATE | TGI setup agent template + prompt |
|
|
315
|
-
| `packages/daemon/src/api.js` | MODIFY | Add `POST /api/lab/assistant` endpoint |
|
|
316
|
-
| `packages/gui/src/stores/groove.js` | MODIFY | Add labAssistant state + actions |
|
|
317
|
-
| `packages/gui/src/components/lab/lab-assistant.jsx` | CREATE | Assistant chat component |
|
|
318
|
-
| `packages/gui/src/views/model-lab.jsx` | MODIFY | Center panel tab switch |
|
|
319
|
-
| `packages/gui/src/components/lab/runtime-config.jsx` | MODIFY | "Setup with Assistant" button |
|
|
320
|
-
|
|
321
|
-
## Build Order
|
|
322
|
-
|
|
323
|
-
1. Team templates (`vllm-setup.json`, `tgi-setup.json`)
|
|
324
|
-
2. Daemon endpoint (`POST /api/lab/assistant` in `api.js`)
|
|
325
|
-
3. Store state and actions (`groove.js`)
|
|
326
|
-
4. Lab Assistant component (`lab-assistant.jsx`)
|
|
327
|
-
5. Center panel mode switch (`model-lab.jsx`)
|
|
328
|
-
6. LaunchModel button (`runtime-config.jsx`)
|
|
329
|
-
7. `npm run build` from `packages/gui/`
|
|
330
|
-
8. End-to-end test
|
|
331
|
-
|
|
332
|
-
## Key Constraints
|
|
333
|
-
|
|
334
|
-
- **Role must be `lab-assistant`** — not `planner` (which is restricted to planning-only in `ROLE_PROMPTS`)
|
|
335
|
-
- **Agent sends messages via WebSocket** — the `chatHistory[agentId]` pattern already handles this
|
|
336
|
-
- **Runtime creation via curl** — the agent calls the daemon REST API directly. The daemon is on localhost:31415 (or read from `~/.groove/daemon.port`)
|
|
337
|
-
- **Server must persist** — use `nohup`, `docker run -d`, or background processes so the inference server outlives the agent
|
|
338
|
-
- **No inline styles** — Tailwind CSS only
|
|
339
|
-
- **License header** — `// FSL-1.1-Apache-2.0 — see LICENSE` on every new source file
|
|
340
|
-
- **ESM imports** — all files use `import`/`export`
|
|
341
|
-
- **Do NOT restart the daemon** — verify with `npm run build` only
|