groove-dev 0.27.144 → 0.27.146
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/CLAUDE.md +7 -0
- 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/api.js +12 -6
- package/node_modules/@groove-dev/daemon/src/conversations.js +59 -58
- package/node_modules/@groove-dev/daemon/src/introducer.js +20 -0
- package/node_modules/@groove-dev/daemon/src/process.js +262 -15
- package/node_modules/@groove-dev/daemon/src/providers/groove-network.js +1 -3
- package/node_modules/@groove-dev/daemon/src/rotator.js +15 -3
- package/node_modules/@groove-dev/daemon/src/routes/agents.js +49 -83
- package/node_modules/@groove-dev/daemon/templates/lab-general.json +12 -0
- package/node_modules/@groove-dev/daemon/templates/llama-cpp-setup.json +12 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-BKbsE_hn.js +1011 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-CEkPsSAm.css +1 -0
- package/node_modules/@groove-dev/gui/dist/index.html +2 -2
- package/node_modules/@groove-dev/gui/package.json +1 -1
- package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +80 -95
- package/node_modules/@groove-dev/gui/src/components/agents/agent-panel.jsx +2 -70
- package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +132 -4
- package/node_modules/@groove-dev/gui/src/components/chat/chat-header.jsx +3 -8
- package/node_modules/@groove-dev/gui/src/components/chat/chat-input.jsx +199 -75
- package/node_modules/@groove-dev/gui/src/components/chat/chat-messages.jsx +21 -4
- package/node_modules/@groove-dev/gui/src/components/chat/chat-view.jsx +10 -13
- package/node_modules/@groove-dev/gui/src/components/chat/model-picker.jsx +3 -3
- package/node_modules/@groove-dev/gui/src/components/lab/chat-playground.jsx +42 -34
- package/node_modules/@groove-dev/gui/src/components/lab/lab-assistant.jsx +9 -3
- package/node_modules/@groove-dev/gui/src/components/lab/metrics-panel.jsx +13 -3
- package/node_modules/@groove-dev/gui/src/components/lab/parameter-panel.jsx +66 -65
- package/node_modules/@groove-dev/gui/src/components/lab/preset-manager.jsx +17 -14
- package/node_modules/@groove-dev/gui/src/components/lab/runtime-config.jsx +124 -127
- package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +10 -8
- package/node_modules/@groove-dev/gui/src/components/layout/app-shell.jsx +2 -0
- package/node_modules/@groove-dev/gui/src/components/layout/status-bar.jsx +24 -1
- package/node_modules/@groove-dev/gui/src/components/ui/question-modal.jsx +107 -0
- package/node_modules/@groove-dev/gui/src/components/ui/sheet.jsx +2 -2
- package/node_modules/@groove-dev/gui/src/components/ui/slider.jsx +8 -8
- package/node_modules/@groove-dev/gui/src/lib/status.js +1 -0
- package/node_modules/@groove-dev/gui/src/stores/groove.js +49 -2
- package/node_modules/@groove-dev/gui/src/stores/slices/agents-slice.js +18 -2
- package/node_modules/@groove-dev/gui/src/stores/slices/chat-slice.js +14 -14
- package/node_modules/@groove-dev/gui/src/views/model-lab.jsx +68 -32
- package/node_modules/@groove-dev/gui/src/views/models.jsx +57 -36
- package/node_modules/axios/CHANGELOG.md +260 -0
- package/node_modules/axios/README.md +595 -223
- package/node_modules/axios/dist/axios.js +1460 -1090
- package/node_modules/axios/dist/axios.js.map +1 -1
- package/node_modules/axios/dist/axios.min.js +3 -3
- package/node_modules/axios/dist/axios.min.js.map +1 -1
- package/node_modules/axios/dist/browser/axios.cjs +1560 -1132
- package/node_modules/axios/dist/browser/axios.cjs.map +1 -1
- package/node_modules/axios/dist/esm/axios.js +1557 -1128
- package/node_modules/axios/dist/esm/axios.js.map +1 -1
- package/node_modules/axios/dist/esm/axios.min.js +2 -2
- package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
- package/node_modules/axios/dist/node/axios.cjs +1594 -1057
- package/node_modules/axios/dist/node/axios.cjs.map +1 -1
- package/node_modules/axios/index.d.cts +40 -41
- package/node_modules/axios/index.d.ts +151 -227
- package/node_modules/axios/index.js +2 -0
- package/node_modules/axios/lib/adapters/adapters.js +4 -2
- package/node_modules/axios/lib/adapters/fetch.js +147 -16
- package/node_modules/axios/lib/adapters/http.js +306 -58
- package/node_modules/axios/lib/adapters/xhr.js +6 -2
- package/node_modules/axios/lib/core/Axios.js +7 -3
- package/node_modules/axios/lib/core/AxiosError.js +120 -34
- package/node_modules/axios/lib/core/AxiosHeaders.js +27 -25
- package/node_modules/axios/lib/core/buildFullPath.js +1 -1
- package/node_modules/axios/lib/core/dispatchRequest.js +19 -7
- package/node_modules/axios/lib/core/mergeConfig.js +21 -4
- package/node_modules/axios/lib/core/settle.js +7 -11
- package/node_modules/axios/lib/defaults/index.js +14 -9
- package/node_modules/axios/lib/env/data.js +1 -1
- package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +1 -2
- package/node_modules/axios/lib/helpers/buildURL.js +1 -1
- package/node_modules/axios/lib/helpers/cookies.js +14 -2
- package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +28 -1
- package/node_modules/axios/lib/helpers/formDataToJSON.js +3 -1
- package/node_modules/axios/lib/helpers/formDataToStream.js +3 -2
- package/node_modules/axios/lib/helpers/parseProtocol.js +1 -1
- package/node_modules/axios/lib/helpers/progressEventReducer.js +5 -5
- package/node_modules/axios/lib/helpers/resolveConfig.js +54 -18
- package/node_modules/axios/lib/helpers/shouldBypassProxy.js +74 -2
- package/node_modules/axios/lib/helpers/toFormData.js +10 -2
- package/node_modules/axios/lib/helpers/validator.js +3 -1
- package/node_modules/axios/lib/utils.js +33 -21
- package/node_modules/axios/package.json +17 -24
- package/node_modules/follow-redirects/README.md +7 -5
- package/node_modules/follow-redirects/index.js +24 -1
- package/node_modules/follow-redirects/package.json +1 -1
- package/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/api.js +12 -6
- package/packages/daemon/src/conversations.js +59 -58
- package/packages/daemon/src/introducer.js +20 -0
- package/packages/daemon/src/process.js +262 -15
- package/packages/daemon/src/providers/groove-network.js +1 -3
- package/packages/daemon/src/rotator.js +15 -3
- package/packages/daemon/src/routes/agents.js +49 -83
- package/packages/daemon/templates/lab-general.json +12 -0
- package/packages/daemon/templates/llama-cpp-setup.json +12 -0
- package/packages/gui/dist/assets/index-BKbsE_hn.js +1011 -0
- package/packages/gui/dist/assets/index-CEkPsSAm.css +1 -0
- package/packages/gui/dist/index.html +2 -2
- package/packages/gui/package.json +1 -1
- package/packages/gui/src/components/agents/agent-feed.jsx +80 -95
- package/packages/gui/src/components/agents/agent-panel.jsx +2 -70
- package/packages/gui/src/components/agents/spawn-wizard.jsx +132 -4
- package/packages/gui/src/components/chat/chat-header.jsx +3 -8
- package/packages/gui/src/components/chat/chat-input.jsx +199 -75
- package/packages/gui/src/components/chat/chat-messages.jsx +21 -4
- package/packages/gui/src/components/chat/chat-view.jsx +10 -13
- package/packages/gui/src/components/chat/model-picker.jsx +3 -3
- package/packages/gui/src/components/lab/chat-playground.jsx +42 -34
- package/packages/gui/src/components/lab/lab-assistant.jsx +9 -3
- package/packages/gui/src/components/lab/metrics-panel.jsx +13 -3
- package/packages/gui/src/components/lab/parameter-panel.jsx +66 -65
- package/packages/gui/src/components/lab/preset-manager.jsx +17 -14
- package/packages/gui/src/components/lab/runtime-config.jsx +124 -127
- package/packages/gui/src/components/lab/system-prompt-editor.jsx +10 -8
- package/packages/gui/src/components/layout/app-shell.jsx +2 -0
- package/packages/gui/src/components/layout/status-bar.jsx +24 -1
- package/packages/gui/src/components/ui/question-modal.jsx +107 -0
- package/packages/gui/src/components/ui/sheet.jsx +2 -2
- package/packages/gui/src/components/ui/slider.jsx +8 -8
- package/packages/gui/src/lib/status.js +1 -0
- package/packages/gui/src/stores/groove.js +49 -2
- package/packages/gui/src/stores/slices/agents-slice.js +18 -2
- package/packages/gui/src/stores/slices/chat-slice.js +14 -14
- package/packages/gui/src/views/model-lab.jsx +68 -32
- package/packages/gui/src/views/models.jsx +57 -36
- package/node_modules/@groove-dev/gui/dist/assets/index-BcoF6_eF.js +0 -1012
- package/node_modules/@groove-dev/gui/dist/assets/index-Dd7qhiEd.css +0 -1
- package/packages/gui/dist/assets/index-BcoF6_eF.js +0 -1012
- package/packages/gui/dist/assets/index-Dd7qhiEd.css +0 -1
|
@@ -78,15 +78,14 @@ function ModelCard({
|
|
|
78
78
|
model.size && model.size !== '—' && model.size,
|
|
79
79
|
].filter(Boolean);
|
|
80
80
|
|
|
81
|
+
const formatTag = model.formatTag || (model.source === 'gguf' ? 'GGUF' : model.source === 'mlx' ? 'MLX' : model.source === 'hf' ? 'HF' : 'Ollama');
|
|
82
|
+
|
|
81
83
|
return (
|
|
82
|
-
<div className=
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
)}>
|
|
86
|
-
{/* Header: icon + name + status */}
|
|
87
|
-
<div className="flex items-center gap-3 mb-3">
|
|
84
|
+
<div className="group flex flex-col p-5 rounded-md border border-border-subtle bg-surface-1 min-h-[180px]">
|
|
85
|
+
{/* Header: icon + name + menu */}
|
|
86
|
+
<div className="flex items-start gap-3 mb-3">
|
|
88
87
|
<div
|
|
89
|
-
className="w-9 h-9 rounded-md flex items-center justify-center flex-shrink-0 text-base font-bold font-sans"
|
|
88
|
+
className="w-9 h-9 rounded-md flex items-center justify-center flex-shrink-0 text-base font-bold font-sans mt-0.5"
|
|
90
89
|
style={{
|
|
91
90
|
background: `hsl(${(model.name || '').charCodeAt(0) * 37 % 360}, 40%, 18%)`,
|
|
92
91
|
color: `hsl(${(model.name || '').charCodeAt(0) * 37 % 360}, 60%, 65%)`,
|
|
@@ -108,9 +107,31 @@ function ModelCard({
|
|
|
108
107
|
)}
|
|
109
108
|
</div>
|
|
110
109
|
<span className="text-2xs text-text-3 font-sans">
|
|
111
|
-
{
|
|
110
|
+
{formatTag} · {STATUS_LABEL[model.status]}
|
|
112
111
|
</span>
|
|
113
112
|
</div>
|
|
113
|
+
{/* Overflow menu — upper right */}
|
|
114
|
+
{model.status !== 'downloading' && (
|
|
115
|
+
<div ref={menuRef} className="relative flex-shrink-0 -mt-0.5 -mr-1">
|
|
116
|
+
<button
|
|
117
|
+
onClick={() => setMenuOpen(!menuOpen)}
|
|
118
|
+
className="p-1 rounded text-text-4 hover:text-text-2 transition-colors cursor-pointer"
|
|
119
|
+
>
|
|
120
|
+
<MoreHorizontal size={14} />
|
|
121
|
+
</button>
|
|
122
|
+
{menuOpen && (
|
|
123
|
+
<div className="absolute right-0 top-full mt-1 z-50 min-w-[160px] bg-surface-2 border border-border rounded-md shadow-lg py-1">
|
|
124
|
+
<button
|
|
125
|
+
onClick={() => { onDelete(model); setMenuOpen(false); }}
|
|
126
|
+
disabled={isDeleting}
|
|
127
|
+
className="w-full text-left px-3 py-1.5 text-xs font-sans text-danger hover:bg-danger/5 transition-colors cursor-pointer flex items-center gap-2 disabled:opacity-40"
|
|
128
|
+
>
|
|
129
|
+
<Trash2 size={10} /> Delete
|
|
130
|
+
</button>
|
|
131
|
+
</div>
|
|
132
|
+
)}
|
|
133
|
+
</div>
|
|
134
|
+
)}
|
|
114
135
|
</div>
|
|
115
136
|
|
|
116
137
|
{/* Specs */}
|
|
@@ -144,20 +165,20 @@ function ModelCard({
|
|
|
144
165
|
|
|
145
166
|
<div className="flex-1" />
|
|
146
167
|
|
|
147
|
-
{/* Divider + Actions */}
|
|
168
|
+
{/* Divider + Actions — left-aligned */}
|
|
148
169
|
{model.status !== 'downloading' && (
|
|
149
170
|
<>
|
|
150
171
|
<div className="h-px bg-border-subtle my-2" />
|
|
151
|
-
<div className="flex items-center
|
|
172
|
+
<div className="flex items-center gap-2">
|
|
152
173
|
{model.status === 'running' ? (
|
|
153
174
|
<>
|
|
154
175
|
<button
|
|
155
176
|
onClick={() => onStop(model.name)}
|
|
156
177
|
disabled={isUnloading}
|
|
157
|
-
className="
|
|
178
|
+
className="flex items-center gap-1.5 px-2.5 py-1 rounded text-2xs font-sans font-semibold text-text-3 hover:text-text-1 transition-colors cursor-pointer disabled:opacity-40"
|
|
158
179
|
title="Stop"
|
|
159
180
|
>
|
|
160
|
-
{isUnloading ? <Loader2 size={
|
|
181
|
+
{isUnloading ? <Loader2 size={10} className="animate-spin" /> : <Square size={10} />} Stop
|
|
161
182
|
</button>
|
|
162
183
|
<button
|
|
163
184
|
onClick={() => onSpawn(model.name)}
|
|
@@ -181,7 +202,7 @@ function ModelCard({
|
|
|
181
202
|
{runtimes.length === 0 ? 'Create Runtime' : 'Start Runtime'}
|
|
182
203
|
</button>
|
|
183
204
|
{runtimeMenuOpen && runtimes.length > 1 && (
|
|
184
|
-
<div className="absolute
|
|
205
|
+
<div className="absolute left-0 top-full mt-1 z-50 min-w-[180px] bg-surface-2 border border-border rounded-md shadow-lg py-1">
|
|
185
206
|
{runtimes.map((rt) => (
|
|
186
207
|
<button
|
|
187
208
|
key={rt.id}
|
|
@@ -204,27 +225,6 @@ function ModelCard({
|
|
|
204
225
|
</button>
|
|
205
226
|
</>
|
|
206
227
|
)}
|
|
207
|
-
|
|
208
|
-
{/* Overflow menu */}
|
|
209
|
-
<div ref={menuRef} className="relative">
|
|
210
|
-
<button
|
|
211
|
-
onClick={() => setMenuOpen(!menuOpen)}
|
|
212
|
-
className="p-1 rounded text-text-4 hover:text-text-2 transition-colors cursor-pointer"
|
|
213
|
-
>
|
|
214
|
-
<MoreHorizontal size={12} />
|
|
215
|
-
</button>
|
|
216
|
-
{menuOpen && (
|
|
217
|
-
<div className="absolute right-0 top-full mt-1 z-50 min-w-[160px] bg-surface-2 border border-border rounded-md shadow-lg py-1">
|
|
218
|
-
<button
|
|
219
|
-
onClick={() => { onDelete(model); setMenuOpen(false); }}
|
|
220
|
-
disabled={isDeleting}
|
|
221
|
-
className="w-full text-left px-3 py-1.5 text-xs font-sans text-danger hover:bg-danger/5 transition-colors cursor-pointer flex items-center gap-2 disabled:opacity-40"
|
|
222
|
-
>
|
|
223
|
-
<Trash2 size={10} /> Delete
|
|
224
|
-
</button>
|
|
225
|
-
</div>
|
|
226
|
-
)}
|
|
227
|
-
</div>
|
|
228
228
|
</div>
|
|
229
229
|
</>
|
|
230
230
|
)}
|
|
@@ -326,7 +326,9 @@ export default function ModelsView() {
|
|
|
326
326
|
const pullProgress = useGrooveStore((s) => s.ollamaPullProgress);
|
|
327
327
|
const labActiveModel = useGrooveStore((s) => s.labActiveModel);
|
|
328
328
|
const labRuntimes = useGrooveStore((s) => s.labRuntimes);
|
|
329
|
+
const labLocalModels = useGrooveStore((s) => s.labLocalModels);
|
|
329
330
|
const fetchLabRuntimes = useGrooveStore((s) => s.fetchLabRuntimes);
|
|
331
|
+
const fetchLabLocalModels = useGrooveStore((s) => s.fetchLabLocalModels);
|
|
330
332
|
const launchLocalModel = useGrooveStore((s) => s.launchLocalModel);
|
|
331
333
|
const setActiveView = useGrooveStore((s) => s.setActiveView);
|
|
332
334
|
const fetchOllamaStatus = useGrooveStore((s) => s.fetchOllamaStatus);
|
|
@@ -344,9 +346,10 @@ export default function ModelsView() {
|
|
|
344
346
|
useEffect(() => {
|
|
345
347
|
fetchOllamaStatus();
|
|
346
348
|
fetchLabRuntimes();
|
|
349
|
+
fetchLabLocalModels();
|
|
347
350
|
pollingRef.current = setInterval(fetchOllamaStatus, 10000);
|
|
348
351
|
return () => clearInterval(pollingRef.current);
|
|
349
|
-
}, [fetchOllamaStatus, fetchLabRuntimes]);
|
|
352
|
+
}, [fetchOllamaStatus, fetchLabRuntimes, fetchLabLocalModels]);
|
|
350
353
|
|
|
351
354
|
useEffect(() => {
|
|
352
355
|
api.get('/models/recommended').then((data) => {
|
|
@@ -553,6 +556,24 @@ export default function ModelsView() {
|
|
|
553
556
|
});
|
|
554
557
|
}
|
|
555
558
|
|
|
559
|
+
for (const m of labLocalModels) {
|
|
560
|
+
if (seen.has(m.id)) continue;
|
|
561
|
+
seen.add(m.id);
|
|
562
|
+
const tag = m.type === 'mlx' ? 'MLX' : m.type === 'hf' ? 'HF' : 'GGUF';
|
|
563
|
+
models.push({
|
|
564
|
+
id: m.id,
|
|
565
|
+
name: m.name || m.id.replace(/^(mlx|hf|gguf):/, ''),
|
|
566
|
+
source: m.type || 'hf',
|
|
567
|
+
status: 'downloaded',
|
|
568
|
+
size: m.sizeBytes ? formatBytes(m.sizeBytes) : '—',
|
|
569
|
+
parameters: m.parameters,
|
|
570
|
+
quantization: m.quantization,
|
|
571
|
+
formatTag: tag,
|
|
572
|
+
compatibleBackends: m.compatibleBackends,
|
|
573
|
+
isInLab: isModelInLab(m.id),
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
|
|
556
577
|
for (const d of downloads) {
|
|
557
578
|
if (seen.has(d.filename)) continue;
|
|
558
579
|
models.push({
|
|
@@ -576,7 +597,7 @@ export default function ModelsView() {
|
|
|
576
597
|
}
|
|
577
598
|
|
|
578
599
|
return models;
|
|
579
|
-
}, [runningModels, installedModels, ggufModels, downloads, pullProgress, labActiveModel, catalog]);
|
|
600
|
+
}, [runningModels, installedModels, ggufModels, labLocalModels, downloads, pullProgress, labActiveModel, catalog]);
|
|
580
601
|
|
|
581
602
|
const filteredModels = useMemo(() => {
|
|
582
603
|
let list = unifiedModels;
|