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.
Files changed (39) hide show
  1. package/analyist/groove-security-audit.md +323 -0
  2. package/node_modules/@groove-dev/cli/package.json +1 -1
  3. package/node_modules/@groove-dev/daemon/package.json +1 -1
  4. package/node_modules/@groove-dev/daemon/src/adaptive.js +24 -5
  5. package/node_modules/@groove-dev/daemon/src/api.js +26 -8
  6. package/node_modules/@groove-dev/daemon/src/lockmanager.js +22 -12
  7. package/node_modules/@groove-dev/daemon/src/preview.js +30 -11
  8. package/node_modules/@groove-dev/daemon/src/process.js +26 -13
  9. package/node_modules/@groove-dev/daemon/src/teams.js +38 -9
  10. package/node_modules/@groove-dev/daemon/src/tool-executor.js +1 -1
  11. package/node_modules/@groove-dev/daemon/test/teams.test.js +13 -3
  12. package/node_modules/@groove-dev/gui/dist/assets/{index-zzVaD3-G.js → index-C1C2biHU.js} +250 -250
  13. package/node_modules/@groove-dev/gui/dist/index.html +1 -1
  14. package/node_modules/@groove-dev/gui/package.json +1 -1
  15. package/node_modules/@groove-dev/gui/src/components/ui/toast.jsx +1 -1
  16. package/node_modules/@groove-dev/gui/src/stores/groove.js +10 -5
  17. package/node_modules/@groove-dev/gui/src/views/agents.jsx +4 -8
  18. package/node_modules/@groove-dev/gui/src/views/settings.jsx +13 -0
  19. package/node_modules/@groove-dev/gui/vite.config.js +0 -3
  20. package/package.json +2 -3
  21. package/packages/cli/package.json +1 -1
  22. package/packages/daemon/package.json +1 -1
  23. package/packages/daemon/src/adaptive.js +24 -5
  24. package/packages/daemon/src/api.js +26 -8
  25. package/packages/daemon/src/lockmanager.js +22 -12
  26. package/packages/daemon/src/preview.js +30 -11
  27. package/packages/daemon/src/process.js +26 -13
  28. package/packages/daemon/src/teams.js +38 -9
  29. package/packages/daemon/src/tool-executor.js +1 -1
  30. package/packages/gui/dist/assets/{index-zzVaD3-G.js → index-C1C2biHU.js} +250 -250
  31. package/packages/gui/dist/index.html +1 -1
  32. package/packages/gui/package.json +1 -1
  33. package/packages/gui/src/components/ui/toast.jsx +1 -1
  34. package/packages/gui/src/stores/groove.js +10 -5
  35. package/packages/gui/src/views/agents.jsx +4 -8
  36. package/packages/gui/src/views/settings.jsx +13 -0
  37. package/packages/gui/vite.config.js +0 -3
  38. package/node_modules/@groove-dev/gui/src/lib/edition.js +0 -4
  39. 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-zzVaD3-G.js"></script>
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">
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/gui",
3
- "version": "0.27.40",
3
+ "version": "0.27.42",
4
4
  "description": "GROOVE GUI — visual agent control plane",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -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
- get().addToast('info', `Team "${team?.name}" deleted`);
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
- set((s) => ({ toasts: [...s.toasts, { id, type, message, detail, action }] }));
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
- {!team.isDefault && (
243
- <>
244
- <ContextMenuSeparator />
245
- <ContextMenuItem danger onSelect={() => deleteTeam(team.id)}>
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">
@@ -4,9 +4,6 @@ import tailwindcss from '@tailwindcss/vite';
4
4
 
5
5
  export default defineConfig({
6
6
  plugins: [tailwindcss(), react()],
7
- define: {
8
- __GROOVE_EDITION__: JSON.stringify(process.env.GROOVE_EDITION || 'community'),
9
- },
10
7
  server: {
11
8
  port: 3142,
12
9
  proxy: {
@@ -1,4 +0,0 @@
1
- // FSL-1.1-Apache-2.0 — see LICENSE
2
-
3
- export const isPro = __GROOVE_EDITION__ === 'pro';
4
- export const edition = __GROOVE_EDITION__;
@@ -1,4 +0,0 @@
1
- // FSL-1.1-Apache-2.0 — see LICENSE
2
-
3
- export const isPro = __GROOVE_EDITION__ === 'pro';
4
- export const edition = __GROOVE_EDITION__;