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.
- 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/conversations.js +18 -48
- package/node_modules/@groove-dev/daemon/src/routes/agents.js +6 -83
- package/node_modules/@groove-dev/gui/dist/assets/{index-BcoF6_eF.js → index-Bxc0gU06.js} +232 -238
- package/node_modules/@groove-dev/gui/dist/assets/index-C0pztKBn.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/chat/chat-header.jsx +2 -0
- package/node_modules/@groove-dev/gui/src/components/chat/chat-input.jsx +68 -66
- package/node_modules/@groove-dev/gui/src/components/chat/chat-view.jsx +4 -8
- package/node_modules/@groove-dev/gui/src/components/lab/chat-playground.jsx +39 -31
- 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 +126 -127
- package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +10 -8
- 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 +17 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/agents-slice.js +8 -1
- package/node_modules/@groove-dev/gui/src/stores/slices/chat-slice.js +13 -14
- package/node_modules/@groove-dev/gui/src/views/model-lab.jsx +41 -10
- 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/conversations.js +18 -48
- package/packages/daemon/src/routes/agents.js +6 -83
- package/packages/gui/dist/assets/{index-BcoF6_eF.js → index-Bxc0gU06.js} +232 -238
- package/packages/gui/dist/assets/index-C0pztKBn.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/chat/chat-header.jsx +2 -0
- package/packages/gui/src/components/chat/chat-input.jsx +68 -66
- package/packages/gui/src/components/chat/chat-view.jsx +4 -8
- package/packages/gui/src/components/lab/chat-playground.jsx +39 -31
- 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 +126 -127
- package/packages/gui/src/components/lab/system-prompt-editor.jsx +10 -8
- 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 +17 -0
- package/packages/gui/src/stores/slices/agents-slice.js +8 -1
- package/packages/gui/src/stores/slices/chat-slice.js +13 -14
- package/packages/gui/src/views/model-lab.jsx +41 -10
- package/packages/gui/src/views/models.jsx +57 -36
- package/node_modules/@groove-dev/gui/dist/assets/index-Dd7qhiEd.css +0 -1
- package/packages/gui/dist/assets/index-Dd7qhiEd.css +0 -1
|
@@ -166,20 +166,19 @@ export const createChatSlice = (set, get) => ({
|
|
|
166
166
|
|
|
167
167
|
try {
|
|
168
168
|
const body = { message };
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
169
|
+
const history = get().conversationMessages[conversationId] || [];
|
|
170
|
+
body.history = history.slice(0, -1);
|
|
171
|
+
|
|
172
|
+
const role = get().conversationRoles?.[conversationId];
|
|
173
|
+
const rules = ['Never use emojis in your responses.', 'Be professional, concise, and direct.'];
|
|
174
|
+
if (role && role !== 'chat') rules.unshift(`You are a professional ${role}. Respond with deep expertise in that domain.`);
|
|
175
|
+
if (role === 'research') rules.unshift('You are a research assistant. Help explore ideas, synthesize information, and provide thorough analysis with sources when possible.');
|
|
176
|
+
const systemCtx = rules.join(' ');
|
|
177
|
+
body.history = [
|
|
178
|
+
{ from: 'user', text: `Instructions: ${systemCtx}` },
|
|
179
|
+
{ from: 'assistant', text: 'Understood.' },
|
|
180
|
+
...body.history,
|
|
181
|
+
];
|
|
183
182
|
const effort = get().conversationReasoningEffort?.[conversationId] || 'medium';
|
|
184
183
|
const verbosity = get().conversationVerbosity?.[conversationId] || 'medium';
|
|
185
184
|
if (conv.provider === 'codex') {
|
|
@@ -12,7 +12,7 @@ import { LabAssistant } from '../components/lab/lab-assistant';
|
|
|
12
12
|
import { MetricsPanel } from '../components/lab/metrics-panel';
|
|
13
13
|
import { PresetManager } from '../components/lab/preset-manager';
|
|
14
14
|
import { cn } from '../lib/cn';
|
|
15
|
-
import { FlaskConical, PanelLeftClose, PanelLeftOpen, PanelRightClose, PanelRightOpen, Box } from 'lucide-react';
|
|
15
|
+
import { FlaskConical, PanelLeftClose, PanelLeftOpen, PanelRightClose, PanelRightOpen, Box, ChevronRight } from 'lucide-react';
|
|
16
16
|
|
|
17
17
|
const LEFT_DEFAULT = 280;
|
|
18
18
|
const LEFT_MIN = 220;
|
|
@@ -21,6 +21,39 @@ const RIGHT_DEFAULT = 240;
|
|
|
21
21
|
const RIGHT_MIN = 200;
|
|
22
22
|
const RIGHT_MAX = 360;
|
|
23
23
|
|
|
24
|
+
export function SidebarSection({ label, action, children, className, collapsible = false, defaultOpen = true }) {
|
|
25
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
26
|
+
const isOpen = collapsible ? open : true;
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<div className={cn('space-y-3', className)}>
|
|
30
|
+
{label && (
|
|
31
|
+
<div className="flex items-center justify-between h-6">
|
|
32
|
+
{collapsible ? (
|
|
33
|
+
<button
|
|
34
|
+
onClick={() => setOpen(!open)}
|
|
35
|
+
className="flex items-center gap-1.5 cursor-pointer group"
|
|
36
|
+
>
|
|
37
|
+
<ChevronRight
|
|
38
|
+
size={10}
|
|
39
|
+
className={cn(
|
|
40
|
+
'text-text-4 transition-transform duration-150 flex-shrink-0',
|
|
41
|
+
isOpen && 'rotate-90',
|
|
42
|
+
)}
|
|
43
|
+
/>
|
|
44
|
+
<span className="text-[10px] font-semibold font-sans text-text-3 uppercase tracking-widest group-hover:text-text-2 transition-colors">{label}</span>
|
|
45
|
+
</button>
|
|
46
|
+
) : (
|
|
47
|
+
<span className="text-[10px] font-semibold font-sans text-text-3 uppercase tracking-widest">{label}</span>
|
|
48
|
+
)}
|
|
49
|
+
{isOpen && action}
|
|
50
|
+
</div>
|
|
51
|
+
)}
|
|
52
|
+
{isOpen && children}
|
|
53
|
+
</div>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
24
57
|
function ModelSelector() {
|
|
25
58
|
const models = useGrooveStore((s) => s.labModels);
|
|
26
59
|
const runtimes = useGrooveStore((s) => s.labRuntimes);
|
|
@@ -35,18 +68,16 @@ function ModelSelector() {
|
|
|
35
68
|
|
|
36
69
|
if (!online) {
|
|
37
70
|
return (
|
|
38
|
-
<
|
|
39
|
-
<
|
|
40
|
-
|
|
41
|
-
</div>
|
|
71
|
+
<SidebarSection label="Model">
|
|
72
|
+
<p className="text-2xs text-text-4 font-sans">Start the runtime to select a model</p>
|
|
73
|
+
</SidebarSection>
|
|
42
74
|
);
|
|
43
75
|
}
|
|
44
76
|
|
|
45
77
|
if (models.length <= 1 && activeModel) return null;
|
|
46
78
|
|
|
47
79
|
return (
|
|
48
|
-
<
|
|
49
|
-
<span className="text-2xs font-semibold font-sans text-text-3 uppercase tracking-wider">Model</span>
|
|
80
|
+
<SidebarSection label="Model">
|
|
50
81
|
<Combobox
|
|
51
82
|
value={activeModel || ''}
|
|
52
83
|
onChange={setActiveModel}
|
|
@@ -60,7 +91,7 @@ function ModelSelector() {
|
|
|
60
91
|
</div>
|
|
61
92
|
)}
|
|
62
93
|
/>
|
|
63
|
-
</
|
|
94
|
+
</SidebarSection>
|
|
64
95
|
);
|
|
65
96
|
}
|
|
66
97
|
|
|
@@ -175,7 +206,7 @@ export default function ModelLabView() {
|
|
|
175
206
|
style={leftCollapsed ? undefined : { width: leftWidth }}
|
|
176
207
|
>
|
|
177
208
|
<div className="h-full flex flex-col">
|
|
178
|
-
<div className="flex-shrink-0 flex items-center justify-between px-4 h-10">
|
|
209
|
+
<div className="flex-shrink-0 flex items-center justify-between px-4 h-10 border-b border-border-subtle">
|
|
179
210
|
<div className="flex items-center gap-2">
|
|
180
211
|
<FlaskConical size={13} className="text-accent" />
|
|
181
212
|
<span className="text-xs font-semibold font-sans text-text-1">Model Lab</span>
|
|
@@ -183,7 +214,7 @@ export default function ModelLabView() {
|
|
|
183
214
|
<PanelToggle collapsed={false} onClick={() => setLeftCollapsed(true)} side="left" />
|
|
184
215
|
</div>
|
|
185
216
|
<ScrollArea className="flex-1 min-h-0">
|
|
186
|
-
<div className="px-4
|
|
217
|
+
<div className="px-4 py-4 space-y-6">
|
|
187
218
|
<RuntimeSection />
|
|
188
219
|
<ModelSelector />
|
|
189
220
|
<ParameterPanel />
|
|
@@ -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;
|
|
@@ -1,5 +1,265 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.15.2 - April 21, 2026
|
|
4
|
+
|
|
5
|
+
This release delivers prototype-pollution hardening for the Node HTTP adapter, adds an opt-in `allowedSocketPaths` allowlist to mitigate SSRF via Unix domain sockets, fixes a keep-alive socket memory leak, and ships supply-chain hardening across CI and security docs.
|
|
6
|
+
|
|
7
|
+
## 🔒 Security Fixes
|
|
8
|
+
|
|
9
|
+
- **Prototype Pollution Hardening (HTTP Adapter):** Hardened the Node HTTP adapter and `resolveConfig`/`mergeConfig`/validator paths to read only own properties and use null-prototype config objects, preventing polluted `auth`, `baseURL`, `socketPath`, `beforeRedirect`, and `insecureHTTPParser` from influencing requests. (**#10779**)
|
|
10
|
+
- **SSRF via `socketPath`:** Rejects non-string `socketPath` values and adds an opt-in `allowedSocketPaths` config option to restrict permitted Unix domain socket paths, returning `AxiosError` `ERR_BAD_OPTION_VALUE` on mismatch. (**#10777**)
|
|
11
|
+
- **Supply-chain Hardening:** Added `.npmrc` with `ignore-scripts=true`, lockfile lint CI, non-blocking reproducible build diff, scoped CODEOWNERS, expanded `SECURITY.md`/`THREATMODEL.md` with provenance verification (`npm audit signatures`), 60-day resolution policy, and maintainer incident-response runbook. (**#10776**)
|
|
12
|
+
|
|
13
|
+
## 🚀 New Features
|
|
14
|
+
|
|
15
|
+
- **`allowedSocketPaths` Config Option:** New request config option (and TypeScript types) to allowlist Unix domain socket paths used by the Node http adapter; backwards compatible when unset. (**#10777**)
|
|
16
|
+
|
|
17
|
+
## 🐛 Bug Fixes
|
|
18
|
+
|
|
19
|
+
- **Keep-alive Socket Memory Leak:** Installs a single per-socket `error` listener tracking the active request via `kAxiosSocketListener`/`kAxiosCurrentReq`, eliminating per-request listener accumulation, `MaxListenersExceededWarning`, and linear heap growth under concurrent or long-running keep-alive workloads (fixes #10780). (**#10788**)
|
|
20
|
+
|
|
21
|
+
## 🔧 Maintenance & Chores
|
|
22
|
+
|
|
23
|
+
- **Changelog:** Updated `CHANGELOG.md` with v1.15.1 release notes. (**#10781**)
|
|
24
|
+
|
|
25
|
+
[Full Changelog](https://github.com/axios/axios/compare/v1.15.1...v1.15.2)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## v1.15.1 - April 19, 2026
|
|
30
|
+
|
|
31
|
+
This release ships a coordinated set of security hardening fixes across headers, body/redirect limits, multipart handling, and XSRF/prototype-pollution vectors, alongside a broad sweep of bug fixes, test migrations, and threat-model documentation updates.
|
|
32
|
+
|
|
33
|
+
## 🔒 Security Fixes
|
|
34
|
+
|
|
35
|
+
- **Header Injection Hardening:** Tightened validation and sanitisation across request header construction to close the header-injection attack surface. (**#10749**)
|
|
36
|
+
|
|
37
|
+
- **CRLF Stripping in Multipart Headers:** Correctly strips CR/LF from multipart header values to prevent injection via field names and filenames. (**#10758**)
|
|
38
|
+
|
|
39
|
+
- **Prototype Pollution / Auth Bypass:** Replaced unsafe `in` checks with `hasOwnProperty` to prevent authentication bypass via prototype pollution on config objects, with additional regression tests. (**#10761**, **#10760**)
|
|
40
|
+
|
|
41
|
+
- **`withXSRFToken` Truthy Bypass:** Short-circuits on any truthy non-boolean value, so an ambiguous config no longer silently leaks the XSRF token cross-origin. (**#10762**)
|
|
42
|
+
|
|
43
|
+
- **`maxBodyLength` With Zero Redirects:** Enforces `maxBodyLength` even when `maxRedirects` is set to `0`, closing a bypass path for oversized request bodies. (**#10753**)
|
|
44
|
+
|
|
45
|
+
- **Streamed Response `maxContentLength` Bypass:** Applies `maxContentLength` to streamed responses that previously bypassed the cap. (**#10754**)
|
|
46
|
+
|
|
47
|
+
- **Follow-up CVE Completion:** Completes an earlier incomplete CVE fix to fully close the regression window. (**#10755**)
|
|
48
|
+
|
|
49
|
+
## 🚀 New Features
|
|
50
|
+
|
|
51
|
+
- **AI-Based Docs Translations:** Initial scaffold for AI-assisted translations of the documentation site. (**#10705**)
|
|
52
|
+
|
|
53
|
+
- **`Location` Request Header Type:** Adds `Location` to `CommonRequestHeadersList` for accurate typing of redirect-aware requests. (**#7528**)
|
|
54
|
+
|
|
55
|
+
## 🐛 Bug Fixes
|
|
56
|
+
|
|
57
|
+
- **FormData Handling:** Removes `Content-Type` when no boundary is present on `FormData` fetch requests, supports multi-select fields, cancels `request.body` instead of the source stream on fetch abort, and fixes a recursion bug in form-data serialisation. (**#7314**, **#10676**, **#10702**, **#10726**)
|
|
58
|
+
|
|
59
|
+
- **HTTP Adapter:** Handles socket-only request errors without leaking keep-alive listeners. (**#10576**)
|
|
60
|
+
|
|
61
|
+
- **Progress Events:** Clamps `loaded` to `total` for computable upload/download progress events. (**#7458**)
|
|
62
|
+
|
|
63
|
+
- **Types:** Aligns `runWhen` type with the runtime behaviour in `InterceptorManager` and makes response header keys case-insensitive. (**#7529**, **#10677**)
|
|
64
|
+
|
|
65
|
+
- **`buildFullPath`:** Uses strict equality in the base/relative URL check. (**#7252**)
|
|
66
|
+
|
|
67
|
+
- **`AxiosURLSearchParams` Regex:** Improves the regex used for param serialisation to avoid edge-case mismatches. (**#10736**)
|
|
68
|
+
|
|
69
|
+
- **Resilient Value Parsing:** Parses out header/config values instead of throwing on malformed input. (**#10687**)
|
|
70
|
+
|
|
71
|
+
- **Docs Artefact Cleanup:** Removes the docs content that was incorrectly committed. (**#10727**)
|
|
72
|
+
|
|
73
|
+
## 🔧 Maintenance & Chores
|
|
74
|
+
|
|
75
|
+
- **Threat Model & Security Docs:** Ongoing refinement of `THREATMODEL.md`, including Hopper security update, TLS and tag-replay wording, mitigation descriptions, decompression-bomb guidance, and further cleanup. (**#10672**, **#10715**, **#10718**, **#10722**, **#10763**, **#10765**)
|
|
76
|
+
|
|
77
|
+
- **Test Coverage & Migration:** Expanded `shouldBypassProxy` coverage for wildcard/IPv6/edge cases, documented and tested `AxiosError.status`, and migrated `progressEventReducer` tests to Vitest. (**#10723**, **#10725**, **#10741**)
|
|
78
|
+
|
|
79
|
+
- **Type Refactor:** Uses TypeScript utility types to deduplicate literal unions. (**#7520**)
|
|
80
|
+
|
|
81
|
+
- **Repo & CI:** Adds `CODEOWNERS`, switches v1.x releases to an ephemeral release branch, and removes orphaned Bower support. (**#10739**, **#10738**, **#10746**)
|
|
82
|
+
|
|
83
|
+
## 🌟 New Contributors
|
|
84
|
+
|
|
85
|
+
We are thrilled to welcome our new contributors. Thank you for helping improve axios:
|
|
86
|
+
|
|
87
|
+
- **@curiouscoder-cmd** (**#7252**)
|
|
88
|
+
- **@tryonelove** (**#7520**)
|
|
89
|
+
- **@darwin808** (**#7314**)
|
|
90
|
+
- **@zoontek** (**#10702**)
|
|
91
|
+
- **@AKIB473** (**#10725**)
|
|
92
|
+
|
|
93
|
+
[Full Changelog](https://github.com/axios/axios/compare/v1.15.0...v1.15.1)
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## v1.15.0 - April 7, 2026
|
|
98
|
+
|
|
99
|
+
This release delivers two critical security patches targeting header injection and SSRF via proxy bypass, adds official runtime support for Deno and Bun, and includes significant CI security hardening.
|
|
100
|
+
|
|
101
|
+
## 🔒 Security Fixes
|
|
102
|
+
|
|
103
|
+
- **Header Injection (CRLF):** Rejects any header value containing `\r` or `\n` characters to block CRLF injection chains that could be used to exfiltrate cloud metadata (IMDS). Behavior change: headers with CR/LF now throw `"Invalid character in header content"`. (**#10660**)
|
|
104
|
+
|
|
105
|
+
- **SSRF via `no_proxy` Bypass:** Introduces a `shouldBypassProxy` helper that normalises hostnames (strips trailing dots, handles bracketed IPv6) before evaluating `no_proxy`/`NO_PROXY` rules, closing a gap that could cause loopback or internal hosts to be inadvertently proxied. (**#10661**)
|
|
106
|
+
|
|
107
|
+
## 🚀 New Features
|
|
108
|
+
|
|
109
|
+
- **Deno & Bun Runtime Support:** Added full smoke test suites for Deno and Bun, with CI workflows that run both runtimes before any release is cut. (**#10652**)
|
|
110
|
+
|
|
111
|
+
## 🐛 Bug Fixes
|
|
112
|
+
|
|
113
|
+
- **Node.js v22 Compatibility:** Replaced deprecated `url.parse()` calls with the WHATWG `URL`/`URLSearchParams` API across examples, sandbox, and tests, eliminating `DEP0169` deprecation warnings on Node.js v22+. (**#10625**)
|
|
114
|
+
|
|
115
|
+
## 🔧 Maintenance & Chores
|
|
116
|
+
|
|
117
|
+
- **CI Security Hardening:** Added [zizmor](https://github.com/zizmorcore/zizmor) GitHub Actions security scanner; switched npm publish to OIDC Trusted Publishing (removing the long-lived `NODE_AUTH_TOKEN`); pinned all action references to full commit SHAs; narrowed workflow permissions to least privilege; gated the publish step behind a dedicated `npm-publish` environment; and blocked the sponsor-block workflow from running on forks. (**#10618**, **#10619**, **#10627**, **#10637**, **#10641**, **#10666**)
|
|
118
|
+
|
|
119
|
+
- **Docs:** Clarified HTTP/2 support and the unsupported `httpVersion` option; added documentation for header case preservation; improved the `beforeRedirect` example to prevent accidental credential leakage. (**#10644**, **#10654**, **#10624**)
|
|
120
|
+
|
|
121
|
+
- **Dependencies:** Bumped `picomatch`, `handlebars`, `serialize-javascript`, `vite` (×3), `denoland/setup-deno`, and 4 additional dev dependencies to latest versions. (**#10564**, **#10565**, **#10567**, **#10568**, **#10572**, **#10574**, **#10663**, **#10664**, **#10665**, **#10669**, **#10670**)
|
|
122
|
+
|
|
123
|
+
## 🌟 New Contributors
|
|
124
|
+
|
|
125
|
+
We are thrilled to welcome our new contributors. Thank you for helping improve axios:
|
|
126
|
+
|
|
127
|
+
- **@Kilros0817** (**#10625**)
|
|
128
|
+
- **@shaanmajid** (**#10616**, **#10617**, **#10618**, **#10619**, **#10637**, **#10641**, **#10666**)
|
|
129
|
+
- **@ashstrc** (**#10624**, **#10644**)
|
|
130
|
+
- **@Abhi3975** (**#10589**)
|
|
131
|
+
- **@raashish1601** (**#10573**)
|
|
132
|
+
|
|
133
|
+
[Full Changelog](https://github.com/axios/axios/compare/v1.14.0...v1.15.0)
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## v1.14.0 - March 27, 2026
|
|
138
|
+
|
|
139
|
+
This release fixes a security vulnerability in the `formidable` dependency, resolves a CommonJS compatibility regression, hardens proxy and HTTP/2 handling, and modernises the build and test toolchain.
|
|
140
|
+
|
|
141
|
+
## 🔒 Security Fixes
|
|
142
|
+
|
|
143
|
+
- **Formidable Vulnerability:** Upgraded `formidable` from v2 to v3 to address a reported arbitrary-file vulnerability. Updated test server and assertions to align with the v3 API. (**#7533**)
|
|
144
|
+
|
|
145
|
+
## 🐛 Bug Fixes
|
|
146
|
+
|
|
147
|
+
- **CommonJS Compatibility:** Restored `require('axios')` in Node.js by correcting the `main` field in `package.json` to point to the built CJS bundle. (**#7532**)
|
|
148
|
+
|
|
149
|
+
- **Fetch Adapter:** Cancel the `ReadableStream` body after the request stream capability probe to prevent resource leaks. (**#7515**)
|
|
150
|
+
|
|
151
|
+
- **Proxy:** Upgraded `proxy-from-env` to v2 and switched to the named `getProxyForUrl` export, fixing proxy detection from environment variables and resolving CJS bundling errors. (**#7499**)
|
|
152
|
+
|
|
153
|
+
- **HTTP/2:** Close detached HTTP/2 sessions on timeout to free resources when no new requests arrive. (**#7457**)
|
|
154
|
+
|
|
155
|
+
- **Headers:** Trim trailing CRLF characters from normalised header values. (**#7456**)
|
|
156
|
+
|
|
157
|
+
## 🔧 Maintenance & Chores
|
|
158
|
+
|
|
159
|
+
- **Toolchain Modernisation:** Migrated test suite to Vitest, updated ESLint to v10, upgraded Rollup and `@rollup/plugin-babel`, migrated to Husky 9, upgraded TypeScript to latest, and modernised the Express test harness. (**#7484**, **#7489**, **#7498**, **#7505**, **#7506**, **#7507**, **#7508**, **#7509**, **#7510**, **#7516**, **#7522**)
|
|
160
|
+
|
|
161
|
+
- **Dependencies:** Bumped `multer` to v2, `minimatch`, `tar`, `pacote`, `@babel/preset-env`, and additional dev dependencies. (**#7453**, **#7480**, **#7491**, **#7504**, **#7517**, **#7531**)
|
|
162
|
+
|
|
163
|
+
## 🌟 New Contributors
|
|
164
|
+
|
|
165
|
+
We are thrilled to welcome our new contributors. Thank you for helping improve axios:
|
|
166
|
+
|
|
167
|
+
- **@penkzhou** (**#7515**)
|
|
168
|
+
- **@aviu16** (**#7456**)
|
|
169
|
+
- **@fedotov** (**#7457**)
|
|
170
|
+
|
|
171
|
+
[Full Changelog](https://github.com/axios/axios/compare/v1.13.6...v1.14.0)
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## v1.13.6 - February 27, 2026
|
|
176
|
+
|
|
177
|
+
This release adds React Native Blob support, fixes several enumeration and export regressions, and patches FormData detection for WeChat Mini Program environments.
|
|
178
|
+
|
|
179
|
+
## 🚀 New Features
|
|
180
|
+
|
|
181
|
+
- **React Native Blob Support:** Axios now correctly handles native Blob objects in React Native environments. (**#5764**)
|
|
182
|
+
|
|
183
|
+
## 🐛 Bug Fixes
|
|
184
|
+
|
|
185
|
+
- **AxiosError:** Fixed `AxiosError.from` not copying the `status` field from the source error. (**#7403**)
|
|
186
|
+
|
|
187
|
+
- **AxiosError:** Made the `message` property enumerable so it appears in `JSON.stringify` output and `Object.keys`. (**#7392**)
|
|
188
|
+
|
|
189
|
+
- **FormData Detection:** Corrected safe FormData detection for WeChat Mini Program environments. (**#7324**)
|
|
190
|
+
|
|
191
|
+
- **React Native / Browserify Export:** Fixed broken module export that caused import failures in React Native and Browserify. (**#7386**)
|
|
192
|
+
|
|
193
|
+
## 🔧 Maintenance & Chores
|
|
194
|
+
|
|
195
|
+
- **Dependencies:** Migrated `@rollup/plugin-babel` from v5 to v6 and bumped the development dependencies group. (**#7424**, **#7432**)
|
|
196
|
+
|
|
197
|
+
## 🌟 New Contributors
|
|
198
|
+
|
|
199
|
+
We are thrilled to welcome our new contributors. Thank you for helping improve axios:
|
|
200
|
+
|
|
201
|
+
- **@moh3n9595** (**#5764**)
|
|
202
|
+
- **@skrtheboss** (**#7403**)
|
|
203
|
+
- **@ybbus** (**#7392**)
|
|
204
|
+
- **@Shiwaangee** (**#7324**)
|
|
205
|
+
- **@Gudahtt** (**#7386**)
|
|
206
|
+
|
|
207
|
+
[Full Changelog](https://github.com/axios/axios/compare/v1.13.5...v1.13.6)
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## v1.13.5 - February 8, 2026
|
|
212
|
+
|
|
213
|
+
This release patches a prototype pollution denial-of-service vulnerability, fixes a missing `status` field regression in `AxiosError`, adds interceptor ordering control, and introduces URL validation for `isAbsoluteURL`.
|
|
214
|
+
|
|
215
|
+
## 🔒 Security Fixes
|
|
216
|
+
|
|
217
|
+
- **Prototype Pollution (DoS):** Hardened `mergeConfig` to ignore `__proto__`, `constructor`, and `prototype` keys, preventing denial-of-service via prototype pollution when merging user-supplied config. (**#7369**)
|
|
218
|
+
|
|
219
|
+
## 🚀 New Features
|
|
220
|
+
|
|
221
|
+
- **`isAbsoluteURL` Validation:** Added input validation to `isAbsoluteURL` to handle malformed or unexpected input gracefully. (**#7326**)
|
|
222
|
+
|
|
223
|
+
## 🐛 Bug Fixes
|
|
224
|
+
|
|
225
|
+
- **AxiosError `status`:** Restored the `status` field on `AxiosError` instances, which was missing in v1.13.3 and later. (**#7368**)
|
|
226
|
+
|
|
227
|
+
- **Interceptor Ordering:** Added a `useLegacyInterceptorOrder` option to restore pre-v1.13 interceptor execution order for applications relying on the previous behaviour. ([569f028](https://github.com/axios/axios/commit/569f028a5878faaec8d7d138ba686aac407bda4c))
|
|
228
|
+
|
|
229
|
+
## 🔧 Maintenance & Chores
|
|
230
|
+
|
|
231
|
+
- **CI:** Fixed run conditions and updated workflow YAMLs. (**#7372**, **#7373**)
|
|
232
|
+
|
|
233
|
+
- **Dependencies:** Bumped `karma-sourcemap-loader` and minor package versions. (**#7356**, **#7360**)
|
|
234
|
+
|
|
235
|
+
## 🌟 New Contributors
|
|
236
|
+
|
|
237
|
+
We are thrilled to welcome our new contributors. Thank you for helping improve axios:
|
|
238
|
+
|
|
239
|
+
- **@asmitha-16** (**#7326**)
|
|
240
|
+
|
|
241
|
+
[Full Changelog](https://github.com/axios/axios/compare/v1.13.4...v1.13.5)
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## v1.13.4 - January 27, 2026
|
|
246
|
+
|
|
247
|
+
Patch release fixing regressions introduced in v1.13.3, including TypeScript export compatibility and CI/build stability.
|
|
248
|
+
|
|
249
|
+
## 🐛 Bug Fixes
|
|
250
|
+
|
|
251
|
+
- **v1.13.3 Regressions:** Fixed multiple issues introduced by the v1.13.3 release, including broken merge configs. (**#7352**)
|
|
252
|
+
|
|
253
|
+
- **TypeScript Exports:** Corrected TypeScript export declarations to restore proper type resolution. (**#4884**)
|
|
254
|
+
|
|
255
|
+
## 🔧 Maintenance & Chores
|
|
256
|
+
|
|
257
|
+
- **CI & Build:** Refactored CI pipeline and build configuration for stability. (**#7340**)
|
|
258
|
+
|
|
259
|
+
[Full Changelog](https://github.com/axios/axios/compare/v1.13.3...v1.13.4)
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
3
263
|
## [1.13.3](https://github.com/axios/axios/compare/v1.13.2...v1.13.3) (2026-01-20)
|
|
4
264
|
|
|
5
265
|
### Bug Fixes
|