groove-dev 0.27.144 → 0.27.145

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 (100) hide show
  1. package/node_modules/@groove-dev/cli/package.json +1 -1
  2. package/node_modules/@groove-dev/daemon/package.json +1 -1
  3. package/node_modules/@groove-dev/daemon/src/conversations.js +18 -48
  4. package/node_modules/@groove-dev/daemon/src/routes/agents.js +6 -83
  5. package/node_modules/@groove-dev/gui/dist/assets/{index-BcoF6_eF.js → index-Bxc0gU06.js} +232 -238
  6. package/node_modules/@groove-dev/gui/dist/assets/index-C0pztKBn.css +1 -0
  7. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  8. package/node_modules/@groove-dev/gui/package.json +1 -1
  9. package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +80 -95
  10. package/node_modules/@groove-dev/gui/src/components/agents/agent-panel.jsx +2 -70
  11. package/node_modules/@groove-dev/gui/src/components/chat/chat-header.jsx +2 -0
  12. package/node_modules/@groove-dev/gui/src/components/chat/chat-input.jsx +68 -66
  13. package/node_modules/@groove-dev/gui/src/components/chat/chat-view.jsx +4 -8
  14. package/node_modules/@groove-dev/gui/src/components/lab/chat-playground.jsx +39 -31
  15. package/node_modules/@groove-dev/gui/src/components/lab/parameter-panel.jsx +66 -65
  16. package/node_modules/@groove-dev/gui/src/components/lab/preset-manager.jsx +17 -14
  17. package/node_modules/@groove-dev/gui/src/components/lab/runtime-config.jsx +126 -127
  18. package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +10 -8
  19. package/node_modules/@groove-dev/gui/src/components/ui/slider.jsx +8 -8
  20. package/node_modules/@groove-dev/gui/src/lib/status.js +1 -0
  21. package/node_modules/@groove-dev/gui/src/stores/groove.js +17 -0
  22. package/node_modules/@groove-dev/gui/src/stores/slices/agents-slice.js +8 -1
  23. package/node_modules/@groove-dev/gui/src/stores/slices/chat-slice.js +13 -14
  24. package/node_modules/@groove-dev/gui/src/views/model-lab.jsx +41 -10
  25. package/node_modules/@groove-dev/gui/src/views/models.jsx +57 -36
  26. package/node_modules/axios/CHANGELOG.md +260 -0
  27. package/node_modules/axios/README.md +595 -223
  28. package/node_modules/axios/dist/axios.js +1460 -1090
  29. package/node_modules/axios/dist/axios.js.map +1 -1
  30. package/node_modules/axios/dist/axios.min.js +3 -3
  31. package/node_modules/axios/dist/axios.min.js.map +1 -1
  32. package/node_modules/axios/dist/browser/axios.cjs +1560 -1132
  33. package/node_modules/axios/dist/browser/axios.cjs.map +1 -1
  34. package/node_modules/axios/dist/esm/axios.js +1557 -1128
  35. package/node_modules/axios/dist/esm/axios.js.map +1 -1
  36. package/node_modules/axios/dist/esm/axios.min.js +2 -2
  37. package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
  38. package/node_modules/axios/dist/node/axios.cjs +1594 -1057
  39. package/node_modules/axios/dist/node/axios.cjs.map +1 -1
  40. package/node_modules/axios/index.d.cts +40 -41
  41. package/node_modules/axios/index.d.ts +151 -227
  42. package/node_modules/axios/index.js +2 -0
  43. package/node_modules/axios/lib/adapters/adapters.js +4 -2
  44. package/node_modules/axios/lib/adapters/fetch.js +147 -16
  45. package/node_modules/axios/lib/adapters/http.js +306 -58
  46. package/node_modules/axios/lib/adapters/xhr.js +6 -2
  47. package/node_modules/axios/lib/core/Axios.js +7 -3
  48. package/node_modules/axios/lib/core/AxiosError.js +120 -34
  49. package/node_modules/axios/lib/core/AxiosHeaders.js +27 -25
  50. package/node_modules/axios/lib/core/buildFullPath.js +1 -1
  51. package/node_modules/axios/lib/core/dispatchRequest.js +19 -7
  52. package/node_modules/axios/lib/core/mergeConfig.js +21 -4
  53. package/node_modules/axios/lib/core/settle.js +7 -11
  54. package/node_modules/axios/lib/defaults/index.js +14 -9
  55. package/node_modules/axios/lib/env/data.js +1 -1
  56. package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +1 -2
  57. package/node_modules/axios/lib/helpers/buildURL.js +1 -1
  58. package/node_modules/axios/lib/helpers/cookies.js +14 -2
  59. package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +28 -1
  60. package/node_modules/axios/lib/helpers/formDataToJSON.js +3 -1
  61. package/node_modules/axios/lib/helpers/formDataToStream.js +3 -2
  62. package/node_modules/axios/lib/helpers/parseProtocol.js +1 -1
  63. package/node_modules/axios/lib/helpers/progressEventReducer.js +5 -5
  64. package/node_modules/axios/lib/helpers/resolveConfig.js +54 -18
  65. package/node_modules/axios/lib/helpers/shouldBypassProxy.js +74 -2
  66. package/node_modules/axios/lib/helpers/toFormData.js +10 -2
  67. package/node_modules/axios/lib/helpers/validator.js +3 -1
  68. package/node_modules/axios/lib/utils.js +33 -21
  69. package/node_modules/axios/package.json +17 -24
  70. package/node_modules/follow-redirects/README.md +7 -5
  71. package/node_modules/follow-redirects/index.js +24 -1
  72. package/node_modules/follow-redirects/package.json +1 -1
  73. package/package.json +1 -1
  74. package/packages/cli/package.json +1 -1
  75. package/packages/daemon/package.json +1 -1
  76. package/packages/daemon/src/conversations.js +18 -48
  77. package/packages/daemon/src/routes/agents.js +6 -83
  78. package/packages/gui/dist/assets/{index-BcoF6_eF.js → index-Bxc0gU06.js} +232 -238
  79. package/packages/gui/dist/assets/index-C0pztKBn.css +1 -0
  80. package/packages/gui/dist/index.html +2 -2
  81. package/packages/gui/package.json +1 -1
  82. package/packages/gui/src/components/agents/agent-feed.jsx +80 -95
  83. package/packages/gui/src/components/agents/agent-panel.jsx +2 -70
  84. package/packages/gui/src/components/chat/chat-header.jsx +2 -0
  85. package/packages/gui/src/components/chat/chat-input.jsx +68 -66
  86. package/packages/gui/src/components/chat/chat-view.jsx +4 -8
  87. package/packages/gui/src/components/lab/chat-playground.jsx +39 -31
  88. package/packages/gui/src/components/lab/parameter-panel.jsx +66 -65
  89. package/packages/gui/src/components/lab/preset-manager.jsx +17 -14
  90. package/packages/gui/src/components/lab/runtime-config.jsx +126 -127
  91. package/packages/gui/src/components/lab/system-prompt-editor.jsx +10 -8
  92. package/packages/gui/src/components/ui/slider.jsx +8 -8
  93. package/packages/gui/src/lib/status.js +1 -0
  94. package/packages/gui/src/stores/groove.js +17 -0
  95. package/packages/gui/src/stores/slices/agents-slice.js +8 -1
  96. package/packages/gui/src/stores/slices/chat-slice.js +13 -14
  97. package/packages/gui/src/views/model-lab.jsx +41 -10
  98. package/packages/gui/src/views/models.jsx +57 -36
  99. package/node_modules/@groove-dev/gui/dist/assets/index-Dd7qhiEd.css +0 -1
  100. package/packages/gui/dist/assets/index-Dd7qhiEd.css +0 -1
@@ -1,9 +1,10 @@
1
1
  // FSL-1.1-Apache-2.0 — see LICENSE
2
2
  import { useState } from 'react';
3
3
  import { useGrooveStore } from '../../stores/groove';
4
+ import { SidebarSection } from '../../views/model-lab';
4
5
  import { TuningSlider } from '../ui/slider';
5
6
  import { Tooltip } from '../ui/tooltip';
6
- import { RotateCcw, Brain, Braces, ChevronRight, Dices, X, Plus } from 'lucide-react';
7
+ import { RotateCcw, ChevronRight, Dices, X, Plus } from 'lucide-react';
7
8
  import { cn } from '../../lib/cn';
8
9
 
9
10
  const DEFAULTS = {
@@ -25,40 +26,42 @@ const PENALTY_SLIDERS = [
25
26
  { key: 'presencePenalty', label: 'Pres Penalty', min: 0, max: 2, step: 0.01 },
26
27
  ];
27
28
 
28
- function ParamGroup({ title, defaultOpen = true, children }) {
29
+ function ParamGroup({ title, defaultOpen = false, children }) {
29
30
  const [open, setOpen] = useState(defaultOpen);
30
31
  return (
31
32
  <div>
32
33
  <button
33
34
  onClick={() => setOpen(!open)}
34
- className="w-full flex items-center gap-1.5 py-1.5 text-left cursor-pointer group"
35
+ className="w-full flex items-center gap-1.5 h-7 text-left cursor-pointer group"
35
36
  >
36
37
  <ChevronRight
37
38
  size={10}
38
39
  className={cn('text-text-4 transition-transform duration-150 flex-shrink-0', open && 'rotate-90')}
39
40
  />
40
- <span className="text-2xs font-semibold text-text-4 font-sans uppercase tracking-wider">{title}</span>
41
+ <span className="text-[10px] font-semibold text-text-4 font-sans uppercase tracking-widest">{title}</span>
41
42
  </button>
42
- {open && <div className="space-y-0.5 pb-1">{children}</div>}
43
+ {open && <div className="space-y-1 pl-0.5 pt-1">{children}</div>}
43
44
  </div>
44
45
  );
45
46
  }
46
47
 
47
- function ToggleRow({ icon: Icon, label, active, onClick, description }) {
48
+ function ToggleSwitch({ label, active, onClick, description }) {
48
49
  return (
49
50
  <Tooltip content={description} side="right">
50
51
  <button
51
52
  onClick={onClick}
52
- className={cn(
53
- 'w-full flex items-center gap-2 px-2 py-1.5 rounded-sm transition-colors cursor-pointer text-left',
54
- active ? 'bg-accent/8' : 'hover:bg-surface-3',
55
- )}
53
+ className="w-full flex items-center gap-2.5 h-9 text-left cursor-pointer group"
56
54
  >
57
- <Icon size={12} className={cn(active ? 'text-accent' : 'text-text-4')} />
58
- <span className="flex-1 text-2xs font-sans text-text-2">{label}</span>
59
- <span className={cn('text-2xs font-mono', active ? 'text-accent' : 'text-text-4')}>
60
- {active ? 'ON' : 'OFF'}
61
- </span>
55
+ <span className="text-[11px] font-sans text-text-2 flex-1">{label}</span>
56
+ <div className={cn(
57
+ 'w-7 h-[16px] rounded-full transition-colors relative flex-shrink-0',
58
+ active ? 'bg-accent' : 'bg-surface-5',
59
+ )}>
60
+ <div className={cn(
61
+ 'absolute top-[2px] w-3 h-3 rounded-full bg-white shadow-sm transition-all',
62
+ active ? 'left-[14px]' : 'left-[2px]',
63
+ )} />
64
+ </div>
62
65
  </button>
63
66
  </Tooltip>
64
67
  );
@@ -69,26 +72,28 @@ function SeedInput({ value, onChange }) {
69
72
  onChange(Math.floor(Math.random() * 2147483647));
70
73
  }
71
74
  return (
72
- <div className="flex items-center gap-1.5 px-2 py-1">
73
- <span className="text-2xs text-text-3 font-sans flex-shrink-0 w-12">Seed</span>
74
- <input
75
- type="number"
76
- min={0}
77
- value={value ?? ''}
78
- onChange={(e) => onChange(e.target.value === '' ? null : parseInt(e.target.value, 10))}
79
- placeholder="Random"
80
- className="flex-1 min-w-0 h-6 px-1.5 text-2xs font-mono bg-surface-1 border border-border rounded-sm text-text-1 placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent tabular-nums"
81
- />
82
- <Tooltip content="Randomize seed">
83
- <button onClick={handleRandomize} className="p-0.5 text-text-4 hover:text-accent transition-colors cursor-pointer">
84
- <Dices size={12} />
85
- </button>
86
- </Tooltip>
87
- {value != null && (
88
- <button onClick={() => onChange(null)} className="p-0.5 text-text-4 hover:text-danger transition-colors cursor-pointer">
89
- <X size={10} />
90
- </button>
91
- )}
75
+ <div className="space-y-2 pt-1.5">
76
+ <span className="text-[11px] text-text-2 font-sans">Seed</span>
77
+ <div className="flex items-center gap-1.5">
78
+ <input
79
+ type="number"
80
+ min={0}
81
+ value={value ?? ''}
82
+ onChange={(e) => onChange(e.target.value === '' ? null : parseInt(e.target.value, 10))}
83
+ placeholder="Random"
84
+ className="flex-1 min-w-0 h-7 px-2.5 text-[11px] font-mono bg-surface-1 border border-border rounded text-text-1 placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent/50 focus:border-accent/50 tabular-nums"
85
+ />
86
+ <Tooltip content="Randomize seed">
87
+ <button onClick={handleRandomize} className="p-0.5 text-text-4 hover:text-accent transition-colors cursor-pointer">
88
+ <Dices size={12} />
89
+ </button>
90
+ </Tooltip>
91
+ {value != null && (
92
+ <button onClick={() => onChange(null)} className="p-0.5 text-text-4 hover:text-danger transition-colors cursor-pointer">
93
+ <X size={10} />
94
+ </button>
95
+ )}
96
+ </div>
92
97
  </div>
93
98
  );
94
99
  }
@@ -113,35 +118,35 @@ function StopSequenceInput({ sequences, onChange }) {
113
118
  }
114
119
 
115
120
  return (
116
- <div className="px-2 py-1 space-y-1.5">
117
- <span className="text-2xs text-text-3 font-sans">Stop Sequences</span>
118
- {sequences.length > 0 && (
119
- <div className="flex flex-wrap gap-1">
120
- {sequences.map((s, i) => (
121
- <span key={i} className="inline-flex items-center gap-0.5 px-1.5 py-0.5 bg-surface-3 rounded text-2xs font-mono text-text-2">
122
- {s.length > 12 ? s.slice(0, 12) + '...' : s}
123
- <button onClick={() => handleRemove(i)} className="text-text-4 hover:text-danger cursor-pointer"><X size={8} /></button>
124
- </span>
125
- ))}
126
- </div>
127
- )}
128
- <div className="flex gap-1">
121
+ <div className="space-y-2 pt-1.5">
122
+ <span className="text-[11px] text-text-2 font-sans">Stop Sequences</span>
123
+ <div className="flex items-center gap-1.5">
129
124
  <input
130
125
  value={input}
131
126
  onChange={(e) => setInput(e.target.value)}
132
127
  onKeyDown={handleKeyDown}
133
128
  placeholder="Add sequence..."
134
129
  maxLength={100}
135
- className="flex-1 min-w-0 h-6 px-1.5 text-2xs font-mono bg-surface-1 border border-border rounded-sm text-text-1 placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent"
130
+ className="flex-1 min-w-0 h-7 px-2.5 text-[11px] font-mono bg-surface-1 border border-border rounded text-text-1 placeholder:text-text-4 focus:outline-none focus:ring-1 focus:ring-accent/50 focus:border-accent/50"
136
131
  />
137
132
  <button
138
133
  onClick={handleAdd}
139
134
  disabled={!input.trim() || sequences.length >= 10}
140
- className="p-1 text-text-4 hover:text-accent disabled:opacity-30 transition-colors cursor-pointer"
135
+ className="p-0.5 text-text-4 hover:text-accent disabled:opacity-30 transition-colors cursor-pointer"
141
136
  >
142
137
  <Plus size={12} />
143
138
  </button>
144
139
  </div>
140
+ {sequences.length > 0 && (
141
+ <div className="flex flex-wrap gap-1">
142
+ {sequences.map((s, i) => (
143
+ <span key={i} className="inline-flex items-center gap-1 px-1.5 py-0.5 bg-surface-2 border border-border-subtle rounded text-[10px] font-mono text-text-2">
144
+ {s.length > 12 ? s.slice(0, 12) + '...' : s}
145
+ <button onClick={() => handleRemove(i)} className="text-text-4 hover:text-danger cursor-pointer"><X size={8} /></button>
146
+ </span>
147
+ ))}
148
+ </div>
149
+ )}
145
150
  </div>
146
151
  );
147
152
  }
@@ -157,9 +162,11 @@ export function ParameterPanel() {
157
162
  }
158
163
 
159
164
  return (
160
- <div className="space-y-1">
161
- <div className="flex items-center justify-between mb-1">
162
- <span className="text-2xs font-semibold font-sans text-text-3 uppercase tracking-wider">Parameters</span>
165
+ <SidebarSection
166
+ label="Parameters"
167
+ collapsible
168
+ defaultOpen={false}
169
+ action={
163
170
  <Tooltip content="Reset to defaults">
164
171
  <button
165
172
  onClick={handleReset}
@@ -168,19 +175,16 @@ export function ParameterPanel() {
168
175
  <RotateCcw size={11} />
169
176
  </button>
170
177
  </Tooltip>
171
- </div>
172
-
173
- {/* Mode toggles */}
174
- <div className="space-y-px pb-1">
175
- <ToggleRow
176
- icon={Brain}
178
+ }
179
+ >
180
+ <div className="space-y-0.5 rounded-md bg-surface-1/50 border border-border-subtle px-3 py-2">
181
+ <ToggleSwitch
177
182
  label="Thinking"
178
183
  active={parameters.thinking}
179
184
  onClick={() => setParameter('thinking', !parameters.thinking)}
180
185
  description="Chain-of-thought for supported models (Qwen3, etc.)"
181
186
  />
182
- <ToggleRow
183
- icon={Braces}
187
+ <ToggleSwitch
184
188
  label="JSON Mode"
185
189
  active={parameters.jsonMode}
186
190
  onClick={() => setParameter('jsonMode', !parameters.jsonMode)}
@@ -188,7 +192,6 @@ export function ParameterPanel() {
188
192
  />
189
193
  </div>
190
194
 
191
- {/* Sampling group */}
192
195
  <ParamGroup title="Sampling">
193
196
  {SAMPLING_SLIDERS.map((s) => (
194
197
  <TuningSlider
@@ -203,7 +206,6 @@ export function ParameterPanel() {
203
206
  ))}
204
207
  </ParamGroup>
205
208
 
206
- {/* Generation group */}
207
209
  <ParamGroup title="Generation">
208
210
  <TuningSlider
209
211
  label="Max Tokens"
@@ -221,7 +223,6 @@ export function ParameterPanel() {
221
223
  />
222
224
  </ParamGroup>
223
225
 
224
- {/* Penalties group — collapsed by default */}
225
226
  <ParamGroup title="Penalties" defaultOpen={false}>
226
227
  {PENALTY_SLIDERS.map((s) => (
227
228
  <TuningSlider
@@ -235,6 +236,6 @@ export function ParameterPanel() {
235
236
  />
236
237
  ))}
237
238
  </ParamGroup>
238
- </div>
239
+ </SidebarSection>
239
240
  );
240
241
  }
@@ -1,6 +1,7 @@
1
1
  // FSL-1.1-Apache-2.0 — see LICENSE
2
2
  import { useState } from 'react';
3
3
  import { useGrooveStore } from '../../stores/groove';
4
+ import { SidebarSection } from '../../views/model-lab';
4
5
  import { Button } from '../ui/button';
5
6
  import { Input } from '../ui/input';
6
7
  import { Dialog, DialogContent } from '../ui/dialog';
@@ -54,33 +55,35 @@ export function PresetManager() {
54
55
  const [saveOpen, setSaveOpen] = useState(false);
55
56
 
56
57
  return (
57
- <div className="space-y-2">
58
- <div className="flex items-center justify-between">
59
- <span className="text-2xs font-semibold font-sans text-text-3 uppercase tracking-wider">Presets</span>
58
+ <SidebarSection
59
+ label="Presets"
60
+ collapsible
61
+ defaultOpen={false}
62
+ action={
60
63
  <Tooltip content="Save current settings as preset">
61
64
  <button
62
65
  onClick={() => setSaveOpen(true)}
63
66
  className="p-1 text-text-4 hover:text-accent transition-colors cursor-pointer"
64
67
  >
65
- <Save size={13} />
68
+ <Save size={12} />
66
69
  </button>
67
70
  </Tooltip>
68
- </div>
69
-
71
+ }
72
+ >
70
73
  {presets.length === 0 ? (
71
- <div className="py-3 text-center">
72
- <BookmarkCheck size={14} className="mx-auto text-text-4 mb-1" />
73
- <p className="text-2xs text-text-4 font-sans">No presets saved</p>
74
+ <div className="py-5 text-center rounded-md bg-surface-1/50 border border-border-subtle">
75
+ <BookmarkCheck size={14} className="mx-auto text-text-4 mb-1.5" />
76
+ <p className="text-[10px] text-text-4 font-sans">No presets saved</p>
74
77
  </div>
75
78
  ) : (
76
79
  <ScrollArea className="max-h-32">
77
- <div className="space-y-px">
80
+ <div className="space-y-1 rounded-md bg-surface-1/50 border border-border-subtle p-2">
78
81
  {presets.map((preset) => (
79
82
  <div
80
83
  key={preset.id}
81
84
  className={cn(
82
- 'flex items-center gap-2 px-2.5 py-1.5 rounded-sm transition-colors',
83
- activePreset === preset.id ? 'bg-accent/8' : 'hover:bg-surface-3',
85
+ 'flex items-center gap-2.5 px-2.5 py-2 rounded transition-colors',
86
+ activePreset === preset.id ? 'bg-accent/10' : 'hover:bg-surface-3',
84
87
  )}
85
88
  >
86
89
  <button
@@ -88,7 +91,7 @@ export function PresetManager() {
88
91
  className="flex-1 text-left min-w-0 cursor-pointer"
89
92
  >
90
93
  <div className={cn(
91
- 'text-xs font-sans truncate',
94
+ 'text-[11px] font-sans truncate',
92
95
  activePreset === preset.id ? 'text-accent font-medium' : 'text-text-2',
93
96
  )}>
94
97
  {preset.name}
@@ -109,6 +112,6 @@ export function PresetManager() {
109
112
  )}
110
113
 
111
114
  <SavePresetDialog open={saveOpen} onOpenChange={setSaveOpen} />
112
- </div>
115
+ </SidebarSection>
113
116
  );
114
117
  }