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.
Files changed (135) hide show
  1. package/CLAUDE.md +7 -0
  2. package/node_modules/@groove-dev/cli/package.json +1 -1
  3. package/node_modules/@groove-dev/daemon/package.json +1 -1
  4. package/node_modules/@groove-dev/daemon/src/api.js +12 -6
  5. package/node_modules/@groove-dev/daemon/src/conversations.js +59 -58
  6. package/node_modules/@groove-dev/daemon/src/introducer.js +20 -0
  7. package/node_modules/@groove-dev/daemon/src/process.js +262 -15
  8. package/node_modules/@groove-dev/daemon/src/providers/groove-network.js +1 -3
  9. package/node_modules/@groove-dev/daemon/src/rotator.js +15 -3
  10. package/node_modules/@groove-dev/daemon/src/routes/agents.js +49 -83
  11. package/node_modules/@groove-dev/daemon/templates/lab-general.json +12 -0
  12. package/node_modules/@groove-dev/daemon/templates/llama-cpp-setup.json +12 -0
  13. package/node_modules/@groove-dev/gui/dist/assets/index-BKbsE_hn.js +1011 -0
  14. package/node_modules/@groove-dev/gui/dist/assets/index-CEkPsSAm.css +1 -0
  15. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  16. package/node_modules/@groove-dev/gui/package.json +1 -1
  17. package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +80 -95
  18. package/node_modules/@groove-dev/gui/src/components/agents/agent-panel.jsx +2 -70
  19. package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +132 -4
  20. package/node_modules/@groove-dev/gui/src/components/chat/chat-header.jsx +3 -8
  21. package/node_modules/@groove-dev/gui/src/components/chat/chat-input.jsx +199 -75
  22. package/node_modules/@groove-dev/gui/src/components/chat/chat-messages.jsx +21 -4
  23. package/node_modules/@groove-dev/gui/src/components/chat/chat-view.jsx +10 -13
  24. package/node_modules/@groove-dev/gui/src/components/chat/model-picker.jsx +3 -3
  25. package/node_modules/@groove-dev/gui/src/components/lab/chat-playground.jsx +42 -34
  26. package/node_modules/@groove-dev/gui/src/components/lab/lab-assistant.jsx +9 -3
  27. package/node_modules/@groove-dev/gui/src/components/lab/metrics-panel.jsx +13 -3
  28. package/node_modules/@groove-dev/gui/src/components/lab/parameter-panel.jsx +66 -65
  29. package/node_modules/@groove-dev/gui/src/components/lab/preset-manager.jsx +17 -14
  30. package/node_modules/@groove-dev/gui/src/components/lab/runtime-config.jsx +124 -127
  31. package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +10 -8
  32. package/node_modules/@groove-dev/gui/src/components/layout/app-shell.jsx +2 -0
  33. package/node_modules/@groove-dev/gui/src/components/layout/status-bar.jsx +24 -1
  34. package/node_modules/@groove-dev/gui/src/components/ui/question-modal.jsx +107 -0
  35. package/node_modules/@groove-dev/gui/src/components/ui/sheet.jsx +2 -2
  36. package/node_modules/@groove-dev/gui/src/components/ui/slider.jsx +8 -8
  37. package/node_modules/@groove-dev/gui/src/lib/status.js +1 -0
  38. package/node_modules/@groove-dev/gui/src/stores/groove.js +49 -2
  39. package/node_modules/@groove-dev/gui/src/stores/slices/agents-slice.js +18 -2
  40. package/node_modules/@groove-dev/gui/src/stores/slices/chat-slice.js +14 -14
  41. package/node_modules/@groove-dev/gui/src/views/model-lab.jsx +68 -32
  42. package/node_modules/@groove-dev/gui/src/views/models.jsx +57 -36
  43. package/node_modules/axios/CHANGELOG.md +260 -0
  44. package/node_modules/axios/README.md +595 -223
  45. package/node_modules/axios/dist/axios.js +1460 -1090
  46. package/node_modules/axios/dist/axios.js.map +1 -1
  47. package/node_modules/axios/dist/axios.min.js +3 -3
  48. package/node_modules/axios/dist/axios.min.js.map +1 -1
  49. package/node_modules/axios/dist/browser/axios.cjs +1560 -1132
  50. package/node_modules/axios/dist/browser/axios.cjs.map +1 -1
  51. package/node_modules/axios/dist/esm/axios.js +1557 -1128
  52. package/node_modules/axios/dist/esm/axios.js.map +1 -1
  53. package/node_modules/axios/dist/esm/axios.min.js +2 -2
  54. package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
  55. package/node_modules/axios/dist/node/axios.cjs +1594 -1057
  56. package/node_modules/axios/dist/node/axios.cjs.map +1 -1
  57. package/node_modules/axios/index.d.cts +40 -41
  58. package/node_modules/axios/index.d.ts +151 -227
  59. package/node_modules/axios/index.js +2 -0
  60. package/node_modules/axios/lib/adapters/adapters.js +4 -2
  61. package/node_modules/axios/lib/adapters/fetch.js +147 -16
  62. package/node_modules/axios/lib/adapters/http.js +306 -58
  63. package/node_modules/axios/lib/adapters/xhr.js +6 -2
  64. package/node_modules/axios/lib/core/Axios.js +7 -3
  65. package/node_modules/axios/lib/core/AxiosError.js +120 -34
  66. package/node_modules/axios/lib/core/AxiosHeaders.js +27 -25
  67. package/node_modules/axios/lib/core/buildFullPath.js +1 -1
  68. package/node_modules/axios/lib/core/dispatchRequest.js +19 -7
  69. package/node_modules/axios/lib/core/mergeConfig.js +21 -4
  70. package/node_modules/axios/lib/core/settle.js +7 -11
  71. package/node_modules/axios/lib/defaults/index.js +14 -9
  72. package/node_modules/axios/lib/env/data.js +1 -1
  73. package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +1 -2
  74. package/node_modules/axios/lib/helpers/buildURL.js +1 -1
  75. package/node_modules/axios/lib/helpers/cookies.js +14 -2
  76. package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +28 -1
  77. package/node_modules/axios/lib/helpers/formDataToJSON.js +3 -1
  78. package/node_modules/axios/lib/helpers/formDataToStream.js +3 -2
  79. package/node_modules/axios/lib/helpers/parseProtocol.js +1 -1
  80. package/node_modules/axios/lib/helpers/progressEventReducer.js +5 -5
  81. package/node_modules/axios/lib/helpers/resolveConfig.js +54 -18
  82. package/node_modules/axios/lib/helpers/shouldBypassProxy.js +74 -2
  83. package/node_modules/axios/lib/helpers/toFormData.js +10 -2
  84. package/node_modules/axios/lib/helpers/validator.js +3 -1
  85. package/node_modules/axios/lib/utils.js +33 -21
  86. package/node_modules/axios/package.json +17 -24
  87. package/node_modules/follow-redirects/README.md +7 -5
  88. package/node_modules/follow-redirects/index.js +24 -1
  89. package/node_modules/follow-redirects/package.json +1 -1
  90. package/package.json +1 -1
  91. package/packages/cli/package.json +1 -1
  92. package/packages/daemon/package.json +1 -1
  93. package/packages/daemon/src/api.js +12 -6
  94. package/packages/daemon/src/conversations.js +59 -58
  95. package/packages/daemon/src/introducer.js +20 -0
  96. package/packages/daemon/src/process.js +262 -15
  97. package/packages/daemon/src/providers/groove-network.js +1 -3
  98. package/packages/daemon/src/rotator.js +15 -3
  99. package/packages/daemon/src/routes/agents.js +49 -83
  100. package/packages/daemon/templates/lab-general.json +12 -0
  101. package/packages/daemon/templates/llama-cpp-setup.json +12 -0
  102. package/packages/gui/dist/assets/index-BKbsE_hn.js +1011 -0
  103. package/packages/gui/dist/assets/index-CEkPsSAm.css +1 -0
  104. package/packages/gui/dist/index.html +2 -2
  105. package/packages/gui/package.json +1 -1
  106. package/packages/gui/src/components/agents/agent-feed.jsx +80 -95
  107. package/packages/gui/src/components/agents/agent-panel.jsx +2 -70
  108. package/packages/gui/src/components/agents/spawn-wizard.jsx +132 -4
  109. package/packages/gui/src/components/chat/chat-header.jsx +3 -8
  110. package/packages/gui/src/components/chat/chat-input.jsx +199 -75
  111. package/packages/gui/src/components/chat/chat-messages.jsx +21 -4
  112. package/packages/gui/src/components/chat/chat-view.jsx +10 -13
  113. package/packages/gui/src/components/chat/model-picker.jsx +3 -3
  114. package/packages/gui/src/components/lab/chat-playground.jsx +42 -34
  115. package/packages/gui/src/components/lab/lab-assistant.jsx +9 -3
  116. package/packages/gui/src/components/lab/metrics-panel.jsx +13 -3
  117. package/packages/gui/src/components/lab/parameter-panel.jsx +66 -65
  118. package/packages/gui/src/components/lab/preset-manager.jsx +17 -14
  119. package/packages/gui/src/components/lab/runtime-config.jsx +124 -127
  120. package/packages/gui/src/components/lab/system-prompt-editor.jsx +10 -8
  121. package/packages/gui/src/components/layout/app-shell.jsx +2 -0
  122. package/packages/gui/src/components/layout/status-bar.jsx +24 -1
  123. package/packages/gui/src/components/ui/question-modal.jsx +107 -0
  124. package/packages/gui/src/components/ui/sheet.jsx +2 -2
  125. package/packages/gui/src/components/ui/slider.jsx +8 -8
  126. package/packages/gui/src/lib/status.js +1 -0
  127. package/packages/gui/src/stores/groove.js +49 -2
  128. package/packages/gui/src/stores/slices/agents-slice.js +18 -2
  129. package/packages/gui/src/stores/slices/chat-slice.js +14 -14
  130. package/packages/gui/src/views/model-lab.jsx +68 -32
  131. package/packages/gui/src/views/models.jsx +57 -36
  132. package/node_modules/@groove-dev/gui/dist/assets/index-BcoF6_eF.js +0 -1012
  133. package/node_modules/@groove-dev/gui/dist/assets/index-Dd7qhiEd.css +0 -1
  134. package/packages/gui/dist/assets/index-BcoF6_eF.js +0 -1012
  135. 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={cn(
83
- 'group flex flex-col p-5 rounded-md border border-border-subtle bg-surface-1',
84
- 'hover:border-accent/30 hover:bg-surface-2 transition-all duration-150 min-h-[180px]',
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
- {model.source === 'gguf' ? 'GGUF' : 'Ollama'} · {STATUS_LABEL[model.status]}
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 justify-end gap-2">
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="p-1 rounded text-text-4 hover:text-text-1 transition-colors cursor-pointer disabled:opacity-40"
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={12} className="animate-spin" /> : <Square size={12} />}
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 right-0 top-full mt-1 z-50 min-w-[180px] bg-surface-2 border border-border rounded-md shadow-lg py-1">
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;