groove-dev 0.27.40 → 0.27.42
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/analyist/groove-security-audit.md +323 -0
- package/node_modules/@groove-dev/cli/package.json +1 -1
- package/node_modules/@groove-dev/daemon/package.json +1 -1
- package/node_modules/@groove-dev/daemon/src/adaptive.js +24 -5
- package/node_modules/@groove-dev/daemon/src/api.js +26 -8
- package/node_modules/@groove-dev/daemon/src/lockmanager.js +22 -12
- package/node_modules/@groove-dev/daemon/src/preview.js +30 -11
- package/node_modules/@groove-dev/daemon/src/process.js +26 -13
- package/node_modules/@groove-dev/daemon/src/teams.js +38 -9
- package/node_modules/@groove-dev/daemon/src/tool-executor.js +1 -1
- package/node_modules/@groove-dev/daemon/test/teams.test.js +13 -3
- package/node_modules/@groove-dev/gui/dist/assets/{index-zzVaD3-G.js → index-C1C2biHU.js} +250 -250
- package/node_modules/@groove-dev/gui/dist/index.html +1 -1
- package/node_modules/@groove-dev/gui/package.json +1 -1
- package/node_modules/@groove-dev/gui/src/components/ui/toast.jsx +1 -1
- package/node_modules/@groove-dev/gui/src/stores/groove.js +10 -5
- package/node_modules/@groove-dev/gui/src/views/agents.jsx +4 -8
- package/node_modules/@groove-dev/gui/src/views/settings.jsx +13 -0
- package/node_modules/@groove-dev/gui/vite.config.js +0 -3
- package/package.json +2 -3
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/adaptive.js +24 -5
- package/packages/daemon/src/api.js +26 -8
- package/packages/daemon/src/lockmanager.js +22 -12
- package/packages/daemon/src/preview.js +30 -11
- package/packages/daemon/src/process.js +26 -13
- package/packages/daemon/src/teams.js +38 -9
- package/packages/daemon/src/tool-executor.js +1 -1
- package/packages/gui/dist/assets/{index-zzVaD3-G.js → index-C1C2biHU.js} +250 -250
- package/packages/gui/dist/index.html +1 -1
- package/packages/gui/package.json +1 -1
- package/packages/gui/src/components/ui/toast.jsx +1 -1
- package/packages/gui/src/stores/groove.js +10 -5
- package/packages/gui/src/views/agents.jsx +4 -8
- package/packages/gui/src/views/settings.jsx +13 -0
- package/packages/gui/vite.config.js +0 -3
- package/node_modules/@groove-dev/gui/src/lib/edition.js +0 -4
- package/packages/gui/src/lib/edition.js +0 -4
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
8
8
|
<title>Groove GUI</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-C1C2biHU.js"></script>
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/vendor-C0HXlhrU.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/reactflow-BQPfi37R.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/codemirror-BBL3i_JW.js">
|
|
@@ -36,7 +36,7 @@ const DURATIONS = {
|
|
|
36
36
|
function ToastItem({ toast }) {
|
|
37
37
|
const removeToast = useGrooveStore((s) => s.removeToast);
|
|
38
38
|
const Icon = ICONS[toast.type] || Info;
|
|
39
|
-
const duration = DURATIONS[toast.type];
|
|
39
|
+
const duration = toast.persistent ? 0 : (toast.duration ?? DURATIONS[toast.type]);
|
|
40
40
|
|
|
41
41
|
useEffect(() => {
|
|
42
42
|
if (!duration) return;
|
|
@@ -387,6 +387,7 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
387
387
|
'Project ready to preview',
|
|
388
388
|
msg.url,
|
|
389
389
|
{ label: 'View Site', url: msg.url },
|
|
390
|
+
{ persistent: true },
|
|
390
391
|
);
|
|
391
392
|
break;
|
|
392
393
|
|
|
@@ -660,11 +661,13 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
660
661
|
|
|
661
662
|
async deleteTeam(id) {
|
|
662
663
|
const team = get().teams.find((t) => t.id === id);
|
|
663
|
-
if (team?.isDefault) { get().addToast('warning', 'Cannot delete the default team'); return; }
|
|
664
664
|
try {
|
|
665
665
|
await api.delete(`/teams/${encodeURIComponent(id)}`);
|
|
666
|
-
// WS team:deleted handler removes from array and switches activeTeamId
|
|
667
|
-
|
|
666
|
+
// WS team:deleted handler removes from array and switches activeTeamId.
|
|
667
|
+
// Deleting the default team regenerates a fresh one server-side; the
|
|
668
|
+
// team:created event arrives separately so the list stays populated.
|
|
669
|
+
const wiped = team?.isDefault ? 'wiped' : 'deleted';
|
|
670
|
+
get().addToast('info', `Team "${team?.name}" ${wiped}`);
|
|
668
671
|
} catch (err) {
|
|
669
672
|
get().addToast('error', 'Failed to delete team', err.message);
|
|
670
673
|
}
|
|
@@ -758,9 +761,11 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
758
761
|
|
|
759
762
|
// ── Toasts ────────────────────────────────────────────────
|
|
760
763
|
|
|
761
|
-
addToast(type, message, detail, action) {
|
|
764
|
+
addToast(type, message, detail, action, options = {}) {
|
|
762
765
|
const id = ++toastCounter;
|
|
763
|
-
|
|
766
|
+
const persistent = !!options.persistent;
|
|
767
|
+
const duration = options.duration;
|
|
768
|
+
set((s) => ({ toasts: [...s.toasts, { id, type, message, detail, action, persistent, duration }] }));
|
|
764
769
|
},
|
|
765
770
|
removeToast(id) {
|
|
766
771
|
set((s) => ({ toasts: s.toasts.filter((t) => t.id !== id) }));
|
|
@@ -239,14 +239,10 @@ export function TeamTabBar() {
|
|
|
239
239
|
<ContextMenuItem onSelect={() => cloneTeam(team.id)}>
|
|
240
240
|
<Copy size={12} /> Clone
|
|
241
241
|
</ContextMenuItem>
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
<Trash2 size={12} /> Delete
|
|
247
|
-
</ContextMenuItem>
|
|
248
|
-
</>
|
|
249
|
-
)}
|
|
242
|
+
<ContextMenuSeparator />
|
|
243
|
+
<ContextMenuItem danger onSelect={() => deleteTeam(team.id)}>
|
|
244
|
+
<Trash2 size={12} /> {team.isDefault ? 'Wipe' : 'Delete'}
|
|
245
|
+
</ContextMenuItem>
|
|
250
246
|
</ContextMenuContent>
|
|
251
247
|
</ContextMenu>
|
|
252
248
|
);
|
|
@@ -1080,6 +1080,19 @@ export default function SettingsView() {
|
|
|
1080
1080
|
</select>
|
|
1081
1081
|
</ConfigCard>
|
|
1082
1082
|
|
|
1083
|
+
<ConfigCard icon={Cpu} label="Default Model" description="Model used for new agents. Auto routes by role.">
|
|
1084
|
+
<select
|
|
1085
|
+
value={config.defaultModel || ''}
|
|
1086
|
+
onChange={(e) => updateConfig('defaultModel', e.target.value || null)}
|
|
1087
|
+
className="w-full h-8 px-2.5 text-xs bg-surface-0 border border-border-subtle rounded-md text-text-0 font-mono focus:outline-none focus:ring-1 focus:ring-accent cursor-pointer"
|
|
1088
|
+
>
|
|
1089
|
+
<option value="">Auto (route by role)</option>
|
|
1090
|
+
{(providers.find((p) => p.id === (config.defaultProvider || 'claude-code'))?.models || []).map((m) => (
|
|
1091
|
+
<option key={m.id} value={m.id}>{m.name}</option>
|
|
1092
|
+
))}
|
|
1093
|
+
</select>
|
|
1094
|
+
</ConfigCard>
|
|
1095
|
+
|
|
1083
1096
|
<ConfigCard icon={FolderOpen} label="Working Directory" description="Default root directory for new agents.">
|
|
1084
1097
|
<div className="flex items-center gap-1.5">
|
|
1085
1098
|
<code className="flex-1 h-8 px-2 flex items-center bg-surface-0 border border-border-subtle rounded-md text-2xs font-mono text-text-2 truncate min-w-0">
|