groove-dev 0.27.143 → 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/CLAUDE.md +0 -7
- 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 +1086 -6532
- package/node_modules/@groove-dev/daemon/src/conversations.js +18 -48
- package/node_modules/@groove-dev/daemon/src/gateways/manager.js +35 -1
- package/node_modules/@groove-dev/daemon/src/index.js +3 -0
- package/node_modules/@groove-dev/daemon/src/journalist.js +23 -13
- package/node_modules/@groove-dev/daemon/src/mlx-server.js +365 -0
- package/node_modules/@groove-dev/daemon/src/model-lab.js +308 -12
- package/node_modules/@groove-dev/daemon/src/pm.js +1 -1
- package/node_modules/@groove-dev/daemon/src/process.js +2 -2
- package/node_modules/@groove-dev/daemon/src/providers/local.js +36 -8
- package/node_modules/@groove-dev/daemon/src/registry.js +21 -5
- package/node_modules/@groove-dev/daemon/src/routes/agents.js +812 -0
- package/node_modules/@groove-dev/daemon/src/routes/coordination.js +318 -0
- package/node_modules/@groove-dev/daemon/src/routes/files.js +751 -0
- package/node_modules/@groove-dev/daemon/src/routes/integrations.js +485 -0
- package/node_modules/@groove-dev/daemon/src/routes/network.js +1784 -0
- package/node_modules/@groove-dev/daemon/src/routes/providers.js +755 -0
- package/node_modules/@groove-dev/daemon/src/routes/schedules.js +110 -0
- package/node_modules/@groove-dev/daemon/src/routes/teams.js +650 -0
- package/node_modules/@groove-dev/daemon/src/scheduler.js +456 -24
- package/node_modules/@groove-dev/daemon/src/teams.js +1 -1
- package/node_modules/@groove-dev/daemon/src/validate.js +38 -1
- package/node_modules/@groove-dev/daemon/templates/mlx-setup.json +12 -0
- package/node_modules/@groove-dev/daemon/templates/tgi-setup.json +1 -1
- package/node_modules/@groove-dev/daemon/templates/vllm-setup.json +1 -1
- package/node_modules/@groove-dev/daemon/test/introducer.test.js +3 -3
- package/node_modules/@groove-dev/daemon/test/journalist.test.js +7 -10
- package/node_modules/@groove-dev/daemon/test/registry.test.js +38 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-Bxc0gU06.js +1006 -0
- 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/{app.jsx → App.jsx} +0 -2
- package/node_modules/@groove-dev/gui/src/app.css +35 -0
- package/node_modules/@groove-dev/gui/src/components/agents/agent-config.jsx +1 -128
- package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +210 -112
- package/node_modules/@groove-dev/gui/src/components/agents/agent-node.jsx +8 -13
- package/node_modules/@groove-dev/gui/src/components/agents/agent-panel.jsx +2 -70
- package/node_modules/@groove-dev/gui/src/components/agents/code-review.jsx +159 -122
- package/node_modules/@groove-dev/gui/src/components/agents/diff-viewer.jsx +23 -23
- package/node_modules/@groove-dev/gui/src/components/agents/journalist-panel.jsx +1 -1
- package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +2 -135
- package/node_modules/@groove-dev/gui/src/components/automations/automation-card.jsx +274 -0
- package/node_modules/@groove-dev/gui/src/components/automations/automation-wizard.jsx +1136 -0
- 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/dashboard/activity-feed.jsx +3 -3
- package/node_modules/@groove-dev/gui/src/components/dashboard/cache-ring.jsx +5 -5
- package/node_modules/@groove-dev/gui/src/components/dashboard/context-gauges.jsx +6 -8
- package/node_modules/@groove-dev/gui/src/components/dashboard/fleet-panel.jsx +8 -14
- package/node_modules/@groove-dev/gui/src/components/dashboard/intel-panel.jsx +238 -656
- package/node_modules/@groove-dev/gui/src/components/dashboard/kpi-card.jsx +3 -3
- package/node_modules/@groove-dev/gui/src/components/dashboard/routing-chart.jsx +3 -3
- package/node_modules/@groove-dev/gui/src/components/dashboard/team-burn-panel.jsx +1 -1
- package/node_modules/@groove-dev/gui/src/components/dashboard/token-chart.jsx +4 -4
- package/node_modules/@groove-dev/gui/src/components/lab/chat-playground.jsx +39 -31
- package/node_modules/@groove-dev/gui/src/components/lab/lab-assistant.jsx +316 -82
- package/node_modules/@groove-dev/gui/src/components/lab/metrics-panel.jsx +187 -32
- package/node_modules/@groove-dev/gui/src/components/lab/parameter-panel.jsx +200 -18
- 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 +335 -152
- package/node_modules/@groove-dev/gui/src/components/lab/system-prompt-editor.jsx +10 -8
- package/node_modules/@groove-dev/gui/src/components/layout/activity-bar.jsx +2 -4
- package/node_modules/@groove-dev/gui/src/components/layout/terminal-panel.jsx +4 -2
- package/node_modules/@groove-dev/gui/src/components/layout/welcome-splash.jsx +137 -108
- package/node_modules/@groove-dev/gui/src/components/network/network-health.jsx +2 -2
- package/node_modules/@groove-dev/gui/src/components/network/performance-dashboard.jsx +4 -4
- package/node_modules/@groove-dev/gui/src/components/settings/ssh-wizard.jsx +81 -99
- package/node_modules/@groove-dev/gui/src/components/ui/sheet.jsx +5 -2
- package/node_modules/@groove-dev/gui/src/components/ui/slider.jsx +8 -8
- package/node_modules/@groove-dev/gui/src/lib/cron.js +64 -0
- package/node_modules/@groove-dev/gui/src/lib/status.js +25 -24
- package/node_modules/@groove-dev/gui/src/lib/theme-hex.js +1 -0
- package/node_modules/@groove-dev/gui/src/stores/groove.js +51 -3144
- package/node_modules/@groove-dev/gui/src/stores/helpers.js +10 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/agents-slice.js +459 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/automations-slice.js +96 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/chat-slice.js +226 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/editor-slice.js +285 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/marketplace-slice.js +461 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/network-slice.js +361 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/preview-slice.js +109 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/providers-slice.js +897 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/teams-slice.js +413 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/ui-slice.js +98 -0
- package/node_modules/@groove-dev/gui/src/views/agents.jsx +5 -5
- package/node_modules/@groove-dev/gui/src/views/dashboard.jsx +12 -13
- package/node_modules/@groove-dev/gui/src/views/marketplace.jsx +191 -3
- package/node_modules/@groove-dev/gui/src/views/model-lab.jsx +54 -12
- package/node_modules/@groove-dev/gui/src/views/models.jsx +419 -496
- package/node_modules/@groove-dev/gui/src/views/network.jsx +3 -3
- package/node_modules/@groove-dev/gui/src/views/settings.jsx +81 -94
- package/node_modules/@groove-dev/gui/src/views/teams.jsx +40 -483
- 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 +1086 -6532
- package/packages/daemon/src/conversations.js +18 -48
- package/packages/daemon/src/gateways/manager.js +35 -1
- package/packages/daemon/src/index.js +3 -0
- package/packages/daemon/src/journalist.js +23 -13
- package/packages/daemon/src/mlx-server.js +365 -0
- package/packages/daemon/src/model-lab.js +308 -12
- package/packages/daemon/src/pm.js +1 -1
- package/packages/daemon/src/process.js +2 -2
- package/packages/daemon/src/providers/local.js +36 -8
- package/packages/daemon/src/registry.js +21 -5
- package/packages/daemon/src/routes/agents.js +812 -0
- package/packages/daemon/src/routes/coordination.js +318 -0
- package/packages/daemon/src/routes/files.js +751 -0
- package/packages/daemon/src/routes/integrations.js +485 -0
- package/packages/daemon/src/routes/network.js +1784 -0
- package/packages/daemon/src/routes/providers.js +755 -0
- package/packages/daemon/src/routes/schedules.js +110 -0
- package/packages/daemon/src/routes/teams.js +650 -0
- package/packages/daemon/src/scheduler.js +456 -24
- package/packages/daemon/src/teams.js +1 -1
- package/packages/daemon/src/validate.js +38 -1
- package/packages/daemon/templates/mlx-setup.json +12 -0
- package/packages/daemon/templates/tgi-setup.json +1 -1
- package/packages/daemon/templates/vllm-setup.json +1 -1
- package/packages/gui/dist/assets/index-Bxc0gU06.js +1006 -0
- 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/{app.jsx → App.jsx} +0 -2
- package/packages/gui/src/app.css +35 -0
- package/packages/gui/src/components/agents/agent-config.jsx +1 -128
- package/packages/gui/src/components/agents/agent-feed.jsx +210 -112
- package/packages/gui/src/components/agents/agent-node.jsx +8 -13
- package/packages/gui/src/components/agents/agent-panel.jsx +2 -70
- package/packages/gui/src/components/agents/code-review.jsx +159 -122
- package/packages/gui/src/components/agents/diff-viewer.jsx +23 -23
- package/packages/gui/src/components/agents/journalist-panel.jsx +1 -1
- package/packages/gui/src/components/agents/spawn-wizard.jsx +2 -135
- package/packages/gui/src/components/automations/automation-card.jsx +274 -0
- package/packages/gui/src/components/automations/automation-wizard.jsx +1136 -0
- 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/dashboard/activity-feed.jsx +3 -3
- package/packages/gui/src/components/dashboard/cache-ring.jsx +5 -5
- package/packages/gui/src/components/dashboard/context-gauges.jsx +6 -8
- package/packages/gui/src/components/dashboard/fleet-panel.jsx +8 -14
- package/packages/gui/src/components/dashboard/intel-panel.jsx +238 -656
- package/packages/gui/src/components/dashboard/kpi-card.jsx +3 -3
- package/packages/gui/src/components/dashboard/routing-chart.jsx +3 -3
- package/packages/gui/src/components/dashboard/team-burn-panel.jsx +1 -1
- package/packages/gui/src/components/dashboard/token-chart.jsx +4 -4
- package/packages/gui/src/components/lab/chat-playground.jsx +39 -31
- package/packages/gui/src/components/lab/lab-assistant.jsx +316 -82
- package/packages/gui/src/components/lab/metrics-panel.jsx +187 -32
- package/packages/gui/src/components/lab/parameter-panel.jsx +200 -18
- package/packages/gui/src/components/lab/preset-manager.jsx +17 -14
- package/packages/gui/src/components/lab/runtime-config.jsx +335 -152
- package/packages/gui/src/components/lab/system-prompt-editor.jsx +10 -8
- package/packages/gui/src/components/layout/activity-bar.jsx +2 -4
- package/packages/gui/src/components/layout/terminal-panel.jsx +4 -2
- package/packages/gui/src/components/layout/welcome-splash.jsx +137 -108
- package/packages/gui/src/components/network/network-health.jsx +2 -2
- package/packages/gui/src/components/network/performance-dashboard.jsx +4 -4
- package/packages/gui/src/components/settings/ssh-wizard.jsx +81 -99
- package/packages/gui/src/components/ui/sheet.jsx +5 -2
- package/packages/gui/src/components/ui/slider.jsx +8 -8
- package/packages/gui/src/lib/cron.js +64 -0
- package/packages/gui/src/lib/status.js +25 -24
- package/packages/gui/src/lib/theme-hex.js +1 -0
- package/packages/gui/src/stores/groove.js +51 -3144
- package/packages/gui/src/stores/helpers.js +10 -0
- package/packages/gui/src/stores/slices/agents-slice.js +459 -0
- package/packages/gui/src/stores/slices/automations-slice.js +96 -0
- package/packages/gui/src/stores/slices/chat-slice.js +226 -0
- package/packages/gui/src/stores/slices/editor-slice.js +285 -0
- package/packages/gui/src/stores/slices/marketplace-slice.js +461 -0
- package/packages/gui/src/stores/slices/network-slice.js +361 -0
- package/packages/gui/src/stores/slices/preview-slice.js +109 -0
- package/packages/gui/src/stores/slices/providers-slice.js +897 -0
- package/packages/gui/src/stores/slices/teams-slice.js +413 -0
- package/packages/gui/src/stores/slices/ui-slice.js +98 -0
- package/packages/gui/src/views/agents.jsx +5 -5
- package/packages/gui/src/views/dashboard.jsx +12 -13
- package/packages/gui/src/views/marketplace.jsx +191 -3
- package/packages/gui/src/views/model-lab.jsx +54 -12
- package/packages/gui/src/views/models.jsx +419 -496
- package/packages/gui/src/views/network.jsx +3 -3
- package/packages/gui/src/views/settings.jsx +81 -94
- package/packages/gui/src/views/teams.jsx +40 -483
- package/SECURITY_SWEEP.md +0 -228
- package/TRAINING_DATA_v4.md +0 -6
- package/node_modules/@groove-dev/gui/dist/assets/index-CCVvAoQn.css +0 -1
- package/node_modules/@groove-dev/gui/dist/assets/index-DGIv_TRm.js +0 -984
- package/node_modules/@groove-dev/gui/src/components/agents/agent-chat.jsx +0 -379
- package/node_modules/@groove-dev/gui/src/views/preview.jsx +0 -6
- package/node_modules/@groove-dev/gui/src/views/subscription-panel.jsx +0 -327
- package/packages/gui/dist/assets/index-CCVvAoQn.css +0 -1
- package/packages/gui/dist/assets/index-DGIv_TRm.js +0 -984
- package/packages/gui/src/components/agents/agent-chat.jsx +0 -379
- package/packages/gui/src/views/preview.jsx +0 -6
- package/packages/gui/src/views/subscription-panel.jsx +0 -327
- package/test.py +0 -571
|
@@ -8,6 +8,8 @@ import { cn } from '../../lib/cn';
|
|
|
8
8
|
import { roleColor } from '../../lib/status';
|
|
9
9
|
|
|
10
10
|
const CHAT_ROLES = [
|
|
11
|
+
{ id: 'chat', label: 'Chat', desc: 'General conversation' },
|
|
12
|
+
{ id: 'research', label: 'Research Assistant', desc: 'Explore ideas, web search' },
|
|
11
13
|
{ id: 'fullstack', label: 'Fullstack', desc: 'End-to-end engineering' },
|
|
12
14
|
{ id: 'backend', label: 'Backend', desc: 'APIs, services, databases' },
|
|
13
15
|
{ id: 'frontend', label: 'Frontend', desc: 'UI, components, styling' },
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// FSL-1.1-Apache-2.0 — see LICENSE
|
|
2
2
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { SendHorizontal, Loader2, Square, Paperclip, Image as ImageIcon, Zap, Bot, GripHorizontal } from 'lucide-react';
|
|
4
4
|
import { cn } from '../../lib/cn';
|
|
5
5
|
import { formatModelName } from './model-picker';
|
|
6
6
|
|
|
@@ -19,7 +19,7 @@ const VERBOSITY_OPTIONS = [
|
|
|
19
19
|
|
|
20
20
|
export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImageModel, currentModel, replyContext, onClearReply, role, isCodex, reasoningEffort, onReasoningEffortChange, verbosity, onVerbosityChange, mode, onModeChange, modeChanging }) {
|
|
21
21
|
const [input, setInput] = useState('');
|
|
22
|
-
const [inputHeight, setInputHeight] = useState(
|
|
22
|
+
const [inputHeight, setInputHeight] = useState(88);
|
|
23
23
|
const textareaRef = useRef(null);
|
|
24
24
|
const fileInputRef = useRef(null);
|
|
25
25
|
|
|
@@ -32,7 +32,6 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
|
|
|
32
32
|
if (!text || sending || disabled) return;
|
|
33
33
|
onSend(text);
|
|
34
34
|
setInput('');
|
|
35
|
-
setInputHeight(40);
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
function onKeyDown(e) {
|
|
@@ -54,7 +53,7 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
|
|
|
54
53
|
e.preventDefault();
|
|
55
54
|
const startY = e.clientY;
|
|
56
55
|
const startH = inputHeight;
|
|
57
|
-
const onMove = (ev) => setInputHeight(Math.min(Math.max(
|
|
56
|
+
const onMove = (ev) => setInputHeight(Math.min(Math.max(56, startH - (ev.clientY - startY)), 400));
|
|
58
57
|
const onUp = () => {
|
|
59
58
|
window.removeEventListener('mousemove', onMove);
|
|
60
59
|
window.removeEventListener('mouseup', onUp);
|
|
@@ -76,95 +75,97 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
|
|
|
76
75
|
: 'Send a message...';
|
|
77
76
|
|
|
78
77
|
return (
|
|
79
|
-
<div className="
|
|
78
|
+
<div className="px-4 pb-3">
|
|
80
79
|
<div
|
|
81
80
|
onMouseDown={onDragStart}
|
|
82
|
-
className="flex items-center justify-center h-
|
|
81
|
+
className="flex items-center justify-center h-5 cursor-row-resize group"
|
|
83
82
|
>
|
|
84
|
-
<GripHorizontal size={
|
|
83
|
+
<GripHorizontal size={12} className="text-text-4 group-hover:text-text-2 transition-colors" />
|
|
85
84
|
</div>
|
|
86
85
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
<
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
<
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
<
|
|
99
|
-
ref={
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
rows={1}
|
|
106
|
-
style={{ height: inputHeight }}
|
|
107
|
-
className={cn(
|
|
108
|
-
'w-full resize-none rounded-xl px-4 py-2.5 text-sm',
|
|
109
|
-
'bg-surface-0 border text-text-0 font-sans',
|
|
110
|
-
'placeholder:text-text-4',
|
|
111
|
-
'focus:outline-none focus:ring-1',
|
|
112
|
-
'border-border focus:ring-accent/40',
|
|
113
|
-
'disabled:opacity-50 disabled:cursor-not-allowed',
|
|
114
|
-
)}
|
|
86
|
+
{replyContext && (
|
|
87
|
+
<div className="flex items-center gap-2 mb-2 px-3 py-2 rounded-lg bg-accent/5 border border-accent/15">
|
|
88
|
+
<ImageIcon size={12} className="text-accent flex-shrink-0" />
|
|
89
|
+
<span className="flex-1 text-2xs text-text-2 font-sans truncate">Iterating: "{replyContext.prompt}"</span>
|
|
90
|
+
<button onClick={onClearReply} className="text-text-4 hover:text-text-1 cursor-pointer flex-shrink-0">
|
|
91
|
+
<Square size={10} />
|
|
92
|
+
</button>
|
|
93
|
+
</div>
|
|
94
|
+
)}
|
|
95
|
+
|
|
96
|
+
<div className="flex flex-col rounded-lg border border-border-subtle bg-surface-0 transition-colors overflow-hidden focus-within:border-text-4/40">
|
|
97
|
+
<input
|
|
98
|
+
ref={fileInputRef}
|
|
99
|
+
type="file"
|
|
100
|
+
multiple
|
|
101
|
+
accept=".pdf,.png,.jpg,.jpeg,.gif,.svg,.csv,.txt,.md,.json,.yaml,.yml,.docx,.pptx,.xlsx"
|
|
102
|
+
onChange={handleFileSelect}
|
|
103
|
+
className="hidden"
|
|
115
104
|
/>
|
|
116
105
|
|
|
117
|
-
<div className="
|
|
118
|
-
<
|
|
119
|
-
ref={
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
106
|
+
<div className="px-1">
|
|
107
|
+
<textarea
|
|
108
|
+
ref={textareaRef}
|
|
109
|
+
value={input}
|
|
110
|
+
onChange={(e) => setInput(e.target.value)}
|
|
111
|
+
onKeyDown={onKeyDown}
|
|
112
|
+
placeholder={placeholder}
|
|
113
|
+
disabled={disabled}
|
|
114
|
+
rows={1}
|
|
115
|
+
className={cn(
|
|
116
|
+
'w-full resize-none px-3 py-2.5 text-[13px]',
|
|
117
|
+
'bg-transparent font-sans text-text-0',
|
|
118
|
+
'placeholder:text-text-4',
|
|
119
|
+
'focus:outline-none',
|
|
120
|
+
'disabled:opacity-40 disabled:cursor-not-allowed',
|
|
121
|
+
)}
|
|
122
|
+
style={{ height: inputHeight }}
|
|
125
123
|
/>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div className="flex items-center gap-1.5 px-1.5 pb-1.5 pt-0.5">
|
|
126
127
|
<button
|
|
127
128
|
onClick={() => fileInputRef.current?.click()}
|
|
128
129
|
disabled={disabled}
|
|
129
|
-
className="w-
|
|
130
|
+
className="w-7 h-7 flex items-center justify-center rounded-md text-text-4 hover:text-text-1 transition-colors cursor-pointer disabled:opacity-30 disabled:cursor-not-allowed"
|
|
130
131
|
title="Attach file"
|
|
131
132
|
>
|
|
132
133
|
<Paperclip size={14} />
|
|
133
134
|
</button>
|
|
134
135
|
|
|
135
|
-
<div className="flex items-center h-
|
|
136
|
+
<div className="flex items-center h-6 rounded-md bg-surface-3 border border-border-subtle p-0.5">
|
|
136
137
|
<button
|
|
137
138
|
onClick={() => onModeChange?.('api')}
|
|
138
139
|
disabled={modeChanging}
|
|
139
140
|
className={cn(
|
|
140
|
-
'flex items-center gap-1 h-
|
|
141
|
+
'flex items-center gap-1 h-5 px-2 rounded text-2xs font-semibold font-sans transition-colors cursor-pointer',
|
|
141
142
|
'disabled:opacity-50 disabled:cursor-not-allowed',
|
|
142
|
-
currentMode === 'api' ? 'bg-accent/15 text-accent
|
|
143
|
+
currentMode === 'api' ? 'bg-accent/15 text-accent' : 'text-text-3 hover:text-text-1',
|
|
143
144
|
)}
|
|
144
145
|
title="Lightweight — fast and cheap, no tools"
|
|
145
146
|
>
|
|
146
|
-
<Zap size={
|
|
147
|
+
<Zap size={10} /> Chat
|
|
147
148
|
</button>
|
|
148
149
|
<button
|
|
149
150
|
onClick={() => onModeChange?.('agent')}
|
|
150
151
|
disabled={modeChanging}
|
|
151
152
|
className={cn(
|
|
152
|
-
'flex items-center gap-1 h-
|
|
153
|
+
'flex items-center gap-1 h-5 px-2 rounded text-2xs font-semibold font-sans transition-colors cursor-pointer',
|
|
153
154
|
'disabled:opacity-50 disabled:cursor-not-allowed',
|
|
154
|
-
currentMode === 'agent' ? 'bg-purple/15 text-purple
|
|
155
|
+
currentMode === 'agent' ? 'bg-purple/15 text-purple' : 'text-text-3 hover:text-text-1',
|
|
155
156
|
)}
|
|
156
157
|
title="Full agent — tools, files, session resume"
|
|
157
158
|
>
|
|
158
|
-
<Bot size={
|
|
159
|
+
<Bot size={10} /> Agent
|
|
159
160
|
</button>
|
|
160
161
|
</div>
|
|
161
162
|
|
|
162
163
|
{currentModel && (
|
|
163
164
|
<div className={cn(
|
|
164
|
-
'flex items-center gap-1 h-
|
|
165
|
+
'flex items-center gap-1 h-5 px-2 rounded text-2xs font-mono',
|
|
165
166
|
isImageModel
|
|
166
|
-
? 'bg-purple/8
|
|
167
|
-
: '
|
|
167
|
+
? 'bg-purple/8 text-purple'
|
|
168
|
+
: 'text-text-3',
|
|
168
169
|
)}>
|
|
169
170
|
{isImageModel && <ImageIcon size={9} />}
|
|
170
171
|
<span className="max-w-[80px] truncate">{formatModelName(currentModel)}</span>
|
|
@@ -173,13 +174,13 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
|
|
|
173
174
|
|
|
174
175
|
{isCodex && (
|
|
175
176
|
<>
|
|
176
|
-
<div className="flex items-center h-
|
|
177
|
+
<div className="flex items-center h-5 rounded bg-surface-3 border border-border-subtle p-0.5">
|
|
177
178
|
{EFFORT_OPTIONS.map((opt) => (
|
|
178
179
|
<button
|
|
179
180
|
key={opt.value}
|
|
180
181
|
onClick={() => onReasoningEffortChange?.(opt.value)}
|
|
181
182
|
className={cn(
|
|
182
|
-
'h-
|
|
183
|
+
'h-4 px-1.5 rounded text-2xs font-semibold font-sans transition-colors cursor-pointer',
|
|
183
184
|
reasoningEffort === opt.value
|
|
184
185
|
? 'bg-accent/15 text-accent'
|
|
185
186
|
: 'text-text-4 hover:text-text-1',
|
|
@@ -191,13 +192,13 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
|
|
|
191
192
|
))}
|
|
192
193
|
</div>
|
|
193
194
|
|
|
194
|
-
<div className="flex items-center h-
|
|
195
|
+
<div className="flex items-center h-5 rounded bg-surface-3 border border-border-subtle p-0.5">
|
|
195
196
|
{VERBOSITY_OPTIONS.map((opt) => (
|
|
196
197
|
<button
|
|
197
198
|
key={opt.value}
|
|
198
199
|
onClick={() => onVerbosityChange?.(opt.value)}
|
|
199
200
|
className={cn(
|
|
200
|
-
'h-
|
|
201
|
+
'h-4 px-1.5 rounded text-2xs font-semibold font-sans transition-colors cursor-pointer',
|
|
201
202
|
verbosity === opt.value
|
|
202
203
|
? 'bg-accent/15 text-accent'
|
|
203
204
|
: 'text-text-4 hover:text-text-1',
|
|
@@ -216,24 +217,25 @@ export function ChatInput({ onSend, onStop, sending, streaming, disabled, isImag
|
|
|
216
217
|
{isActive ? (
|
|
217
218
|
<button
|
|
218
219
|
onClick={onStop}
|
|
219
|
-
className="w-8 h-8 flex items-center justify-center rounded-lg bg-danger/80 text-white hover:bg-danger transition-all cursor-pointer shadow-lg shadow-danger/20 flex-shrink-0"
|
|
220
220
|
title="Stop generation"
|
|
221
|
+
className="group w-7 h-7 flex items-center justify-center rounded-md transition-colors cursor-pointer"
|
|
221
222
|
>
|
|
222
|
-
<
|
|
223
|
+
<span className="relative flex items-center justify-center w-3.5 h-3.5">
|
|
224
|
+
<span className="absolute inset-0 rounded-full bg-accent/30 group-hover:bg-red-500/30 animate-ping [animation-duration:2s] transition-colors" />
|
|
225
|
+
<span className="relative w-2.5 h-2.5 rounded-full bg-accent group-hover:bg-red-500 transition-colors" />
|
|
226
|
+
</span>
|
|
223
227
|
</button>
|
|
224
228
|
) : (
|
|
225
229
|
<button
|
|
226
230
|
onClick={handleSend}
|
|
227
231
|
disabled={!canSend}
|
|
228
232
|
className={cn(
|
|
229
|
-
'w-
|
|
230
|
-
'disabled:opacity-
|
|
231
|
-
canSend
|
|
232
|
-
? 'bg-accent/15 text-accent hover:bg-accent/25 border border-accent/25'
|
|
233
|
-
: 'bg-surface-4 text-text-4',
|
|
233
|
+
'w-7 h-7 flex items-center justify-center rounded-md transition-colors cursor-pointer',
|
|
234
|
+
'disabled:opacity-15 disabled:cursor-not-allowed',
|
|
235
|
+
canSend ? 'text-text-0 hover:text-text-1' : 'text-text-4',
|
|
234
236
|
)}
|
|
235
237
|
>
|
|
236
|
-
{sending ? <Loader2 size={
|
|
238
|
+
{sending ? <Loader2 size={15} className="animate-spin" /> : <SendHorizontal size={15} />}
|
|
237
239
|
</button>
|
|
238
240
|
)}
|
|
239
241
|
</div>
|
|
@@ -37,7 +37,7 @@ export function ChatView() {
|
|
|
37
37
|
const setActiveConversation = useGrooveStore((s) => s.setActiveConversation);
|
|
38
38
|
const sendChatMessage = useGrooveStore((s) => s.sendChatMessage);
|
|
39
39
|
const sendImageMessage = useGrooveStore((s) => s.sendImageMessage);
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
const stopChatStreaming = useGrooveStore((s) => s.stopChatStreaming);
|
|
42
42
|
const setConversationMode = useGrooveStore((s) => s.setConversationMode);
|
|
43
43
|
const setConversationModel = useGrooveStore((s) => s.setConversationModel);
|
|
@@ -54,7 +54,7 @@ export function ChatView() {
|
|
|
54
54
|
const [replyContext, setReplyContext] = useState(null);
|
|
55
55
|
const [modeChanging, setModeChanging] = useState(false);
|
|
56
56
|
|
|
57
|
-
const activeRole = activeConversationId ? (conversationRoles?.[activeConversationId] ||
|
|
57
|
+
const activeRole = activeConversationId ? (conversationRoles?.[activeConversationId] || 'chat') : 'chat';
|
|
58
58
|
const activeReasoningEffort = activeConversationId ? (conversationReasoningEffort?.[activeConversationId] || 'medium') : 'medium';
|
|
59
59
|
const activeVerbosity = activeConversationId ? (conversationVerbosity?.[activeConversationId] || 'medium') : 'medium';
|
|
60
60
|
|
|
@@ -101,12 +101,8 @@ export function ChatView() {
|
|
|
101
101
|
|
|
102
102
|
const handleStop = useCallback(() => {
|
|
103
103
|
if (!activeConversation) return;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
} else {
|
|
107
|
-
stopChatStreaming(activeConversationId);
|
|
108
|
-
}
|
|
109
|
-
}, [activeConversation, activeConversationId, stopAgent, stopChatStreaming]);
|
|
104
|
+
stopChatStreaming(activeConversationId);
|
|
105
|
+
}, [activeConversation, activeConversationId, stopChatStreaming]);
|
|
110
106
|
|
|
111
107
|
const handleModelChange = useCallback(async (selection) => {
|
|
112
108
|
if (activeConversationId) {
|
|
@@ -13,11 +13,11 @@ const ICONS = {
|
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
const ICON_COLORS = {
|
|
16
|
-
spawn: 'text-
|
|
17
|
-
complete: 'text-
|
|
16
|
+
spawn: 'text-text-2',
|
|
17
|
+
complete: 'text-text-2',
|
|
18
18
|
crash: 'text-danger',
|
|
19
19
|
kill: 'text-text-3',
|
|
20
|
-
rotate: 'text-
|
|
20
|
+
rotate: 'text-text-2',
|
|
21
21
|
error: 'text-danger',
|
|
22
22
|
};
|
|
23
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// FSL-1.1-Apache-2.0 — see LICENSE
|
|
2
2
|
import { useRef, useEffect, memo } from 'react';
|
|
3
|
-
import { HEX } from '../../lib/theme-hex';
|
|
3
|
+
import { HEX, hexAlpha } from '../../lib/theme-hex';
|
|
4
4
|
import { fmtNum } from '../../lib/format';
|
|
5
5
|
|
|
6
6
|
const CacheRing = memo(function CacheRing({ cacheRead = 0, cacheCreation = 0, totalInput = 0, size = 140 }) {
|
|
@@ -47,7 +47,7 @@ const CacheRing = memo(function CacheRing({ cacheRead = 0, cacheCreation = 0, to
|
|
|
47
47
|
const segEnd = startAngle + sweep * readPct;
|
|
48
48
|
ctx.beginPath();
|
|
49
49
|
ctx.arc(cx, cy, radius, startAngle, segEnd);
|
|
50
|
-
ctx.strokeStyle = HEX.
|
|
50
|
+
ctx.strokeStyle = HEX.text0;
|
|
51
51
|
ctx.lineWidth = strokeWidth;
|
|
52
52
|
ctx.lineCap = 'round';
|
|
53
53
|
ctx.stroke();
|
|
@@ -58,7 +58,7 @@ const CacheRing = memo(function CacheRing({ cacheRead = 0, cacheCreation = 0, to
|
|
|
58
58
|
const segEnd = segStart + sweep * createPct;
|
|
59
59
|
ctx.beginPath();
|
|
60
60
|
ctx.arc(cx, cy, radius, segStart, segEnd);
|
|
61
|
-
ctx.strokeStyle = HEX.
|
|
61
|
+
ctx.strokeStyle = HEX.text3;
|
|
62
62
|
ctx.lineWidth = strokeWidth;
|
|
63
63
|
ctx.lineCap = 'butt';
|
|
64
64
|
ctx.stroke();
|
|
@@ -85,8 +85,8 @@ const CacheRing = memo(function CacheRing({ cacheRead = 0, cacheCreation = 0, to
|
|
|
85
85
|
style={{ width: size, height: size }}
|
|
86
86
|
/>
|
|
87
87
|
<div className="w-full mt-3 space-y-1.5 max-w-[160px]">
|
|
88
|
-
<StatRow color={HEX.
|
|
89
|
-
<StatRow color={HEX.
|
|
88
|
+
<StatRow color={HEX.text0} label="Read" value={fmtNum(cacheRead)} />
|
|
89
|
+
<StatRow color={HEX.text3} label="Create" value={fmtNum(cacheCreation)} />
|
|
90
90
|
<StatRow color={HEX.surface5} label="Miss" value={fmtNum(Math.max(totalInput - cacheRead - cacheCreation, 0))} />
|
|
91
91
|
</div>
|
|
92
92
|
</div>
|
|
@@ -8,10 +8,8 @@ const RADIUS = (SIZE - STROKE) / 2;
|
|
|
8
8
|
const CIRCUMFERENCE = 2 * Math.PI * RADIUS;
|
|
9
9
|
const START_ANGLE = -90;
|
|
10
10
|
|
|
11
|
-
function gaugeColor(
|
|
12
|
-
|
|
13
|
-
if (pct > 60) return HEX.warning;
|
|
14
|
-
return HEX.success;
|
|
11
|
+
function gaugeColor() {
|
|
12
|
+
return HEX.text1;
|
|
15
13
|
}
|
|
16
14
|
|
|
17
15
|
function MiniGauge({ name, pct, threshold }) {
|
|
@@ -44,7 +42,7 @@ function MiniGauge({ name, pct, threshold }) {
|
|
|
44
42
|
fill="none" strokeWidth={1}
|
|
45
43
|
strokeLinecap="butt"
|
|
46
44
|
style={{
|
|
47
|
-
stroke: HEX.
|
|
45
|
+
stroke: HEX.text3,
|
|
48
46
|
strokeDasharray: `1 ${CIRCUMFERENCE - 1}`,
|
|
49
47
|
strokeDashoffset: -(threshold / 100) * CIRCUMFERENCE,
|
|
50
48
|
}}
|
|
@@ -68,11 +66,11 @@ function MiniGauge({ name, pct, threshold }) {
|
|
|
68
66
|
function FleetSummary({ zones }) {
|
|
69
67
|
return (
|
|
70
68
|
<div className="flex items-center gap-2 text-2xs font-mono">
|
|
71
|
-
<span className="text-
|
|
69
|
+
<span className="text-text-2">{zones.healthy}</span>
|
|
72
70
|
<span className="text-text-4">/</span>
|
|
73
|
-
<span className="text-
|
|
71
|
+
<span className="text-text-2">{zones.warning}</span>
|
|
74
72
|
<span className="text-text-4">/</span>
|
|
75
|
-
<span className="text-
|
|
73
|
+
<span className="text-text-2">{zones.critical}</span>
|
|
76
74
|
</div>
|
|
77
75
|
);
|
|
78
76
|
}
|
|
@@ -20,15 +20,15 @@ function shortModel(id) {
|
|
|
20
20
|
const AgentRow = memo(function AgentRow({ agent, isRotating }) {
|
|
21
21
|
const isAlive = agent.status === 'running' || agent.status === 'starting';
|
|
22
22
|
const contextPct = Math.round((agent.contextUsage || 0) * 100);
|
|
23
|
-
const sColor = isRotating ?
|
|
23
|
+
const sColor = isRotating ? HEX.accent : statusColor(agent.status);
|
|
24
24
|
const quality = agent.quality;
|
|
25
25
|
const successRate = quality?.toolSuccessRate != null ? Math.round(quality.toolSuccessRate * 100) : null;
|
|
26
26
|
const thresholdPct = agent.rotationThreshold ? Math.round(agent.rotationThreshold * 100) : null;
|
|
27
27
|
const rc = roleColor(agent.role);
|
|
28
|
-
const barColor =
|
|
28
|
+
const barColor = HEX.text1;
|
|
29
29
|
|
|
30
30
|
return (
|
|
31
|
-
<div className="px-3 pl-6 py-2 hover:bg-
|
|
31
|
+
<div className="px-3 pl-6 py-2 hover:bg-surface-4 transition-colors space-y-1.5">
|
|
32
32
|
{/* Top row */}
|
|
33
33
|
<div className="flex items-center gap-2 min-w-0">
|
|
34
34
|
{/* Status dot */}
|
|
@@ -64,13 +64,7 @@ const AgentRow = memo(function AgentRow({ agent, isRotating }) {
|
|
|
64
64
|
|
|
65
65
|
{/* Quality badge */}
|
|
66
66
|
{successRate != null && (
|
|
67
|
-
<span
|
|
68
|
-
className="text-2xs font-mono font-bold px-1 py-px rounded-sm flex-shrink-0"
|
|
69
|
-
style={{
|
|
70
|
-
color: successRate >= 90 ? '#4ae168' : successRate >= 70 ? '#e5c07b' : '#e06c75',
|
|
71
|
-
background: successRate >= 90 ? 'rgba(74,225,104,0.1)' : successRate >= 70 ? 'rgba(229,192,123,0.1)' : 'rgba(224,108,117,0.1)',
|
|
72
|
-
}}
|
|
73
|
-
>
|
|
67
|
+
<span className="text-2xs font-mono font-bold px-1 py-px rounded-sm flex-shrink-0 text-text-1 bg-surface-4">
|
|
74
68
|
{successRate}%
|
|
75
69
|
</span>
|
|
76
70
|
)}
|
|
@@ -95,7 +89,7 @@ const AgentRow = memo(function AgentRow({ agent, isRotating }) {
|
|
|
95
89
|
<div className="flex items-center gap-2">
|
|
96
90
|
<div
|
|
97
91
|
className="relative flex-1 h-0.5 rounded-sm overflow-visible"
|
|
98
|
-
style={{ background: hexAlpha(HEX.
|
|
92
|
+
style={{ background: hexAlpha(HEX.text4, 0.2) }}
|
|
99
93
|
>
|
|
100
94
|
<div
|
|
101
95
|
className="absolute inset-y-0 left-0 rounded-sm transition-all duration-700"
|
|
@@ -104,7 +98,7 @@ const AgentRow = memo(function AgentRow({ agent, isRotating }) {
|
|
|
104
98
|
{thresholdPct && (
|
|
105
99
|
<div
|
|
106
100
|
className="absolute top-[-1px] w-px h-[4px]"
|
|
107
|
-
style={{ left: `${thresholdPct}%`, background: HEX.
|
|
101
|
+
style={{ left: `${thresholdPct}%`, background: HEX.text3 }}
|
|
108
102
|
title={`Rotation at ${thresholdPct}%`}
|
|
109
103
|
/>
|
|
110
104
|
)}
|
|
@@ -126,7 +120,7 @@ function TeamSection({ team, members, rotatingSet }) {
|
|
|
126
120
|
<div>
|
|
127
121
|
<button
|
|
128
122
|
onClick={() => setExpanded((e) => !e)}
|
|
129
|
-
className="w-full flex items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-
|
|
123
|
+
className="w-full flex items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-surface-4 bg-surface-3"
|
|
130
124
|
style={{ borderLeft: isActive ? `2px solid ${HEX.accent}` : '2px solid transparent' }}
|
|
131
125
|
>
|
|
132
126
|
{expanded
|
|
@@ -142,7 +136,7 @@ function TeamSection({ team, members, rotatingSet }) {
|
|
|
142
136
|
)}
|
|
143
137
|
<span
|
|
144
138
|
className="text-2xs font-mono tabular-nums flex-shrink-0 ml-1.5"
|
|
145
|
-
style={{ color: isActive ? HEX.
|
|
139
|
+
style={{ color: isActive ? HEX.text1 : undefined }}
|
|
146
140
|
>
|
|
147
141
|
{runningCount}/{members.length}
|
|
148
142
|
</span>
|