groove-dev 0.27.66 → 0.27.67

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 (49) 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/api.js +12 -31
  4. package/node_modules/@groove-dev/daemon/src/tunnel-manager.js +25 -2
  5. package/node_modules/@groove-dev/gui/dist/assets/index-MPNqazCA.js +8614 -0
  6. package/node_modules/@groove-dev/gui/dist/assets/index-YeunozTU.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/app.jsx +5 -1
  10. package/node_modules/@groove-dev/gui/src/components/agents/agent-config.jsx +3 -1
  11. package/node_modules/@groove-dev/gui/src/components/agents/folder-browser.jsx +5 -4
  12. package/node_modules/@groove-dev/gui/src/components/layout/app-shell.jsx +1 -2
  13. package/node_modules/@groove-dev/gui/src/components/layout/breadcrumb-bar.jsx +1 -9
  14. package/node_modules/@groove-dev/gui/src/components/layout/project-picker.jsx +3 -1
  15. package/node_modules/@groove-dev/gui/src/components/layout/welcome-splash.jsx +132 -0
  16. package/node_modules/@groove-dev/gui/src/components/onboarding/setup-wizard.jsx +3 -1
  17. package/node_modules/@groove-dev/gui/src/components/pro/upgrade-modal.jsx +1 -2
  18. package/node_modules/@groove-dev/gui/src/components/settings/server-dialog.jsx +2 -0
  19. package/node_modules/@groove-dev/gui/src/components/settings/ssh-wizard.jsx +3 -0
  20. package/node_modules/@groove-dev/gui/src/stores/groove.js +10 -2
  21. package/node_modules/@groove-dev/gui/src/views/agents.jsx +14 -1
  22. package/node_modules/@groove-dev/gui/src/views/settings.jsx +3 -1
  23. package/package.json +1 -1
  24. package/packages/cli/package.json +1 -1
  25. package/packages/daemon/package.json +1 -1
  26. package/packages/daemon/src/api.js +12 -31
  27. package/packages/daemon/src/tunnel-manager.js +25 -2
  28. package/packages/gui/dist/assets/index-MPNqazCA.js +8614 -0
  29. package/packages/gui/dist/assets/index-YeunozTU.css +1 -0
  30. package/packages/gui/dist/index.html +2 -2
  31. package/packages/gui/package.json +1 -1
  32. package/packages/gui/src/app.jsx +5 -1
  33. package/packages/gui/src/components/agents/agent-config.jsx +3 -1
  34. package/packages/gui/src/components/agents/folder-browser.jsx +5 -4
  35. package/packages/gui/src/components/layout/app-shell.jsx +1 -2
  36. package/packages/gui/src/components/layout/breadcrumb-bar.jsx +1 -9
  37. package/packages/gui/src/components/layout/project-picker.jsx +3 -1
  38. package/packages/gui/src/components/layout/welcome-splash.jsx +132 -0
  39. package/packages/gui/src/components/onboarding/setup-wizard.jsx +3 -1
  40. package/packages/gui/src/components/pro/upgrade-modal.jsx +1 -2
  41. package/packages/gui/src/components/settings/server-dialog.jsx +2 -0
  42. package/packages/gui/src/components/settings/ssh-wizard.jsx +3 -0
  43. package/packages/gui/src/stores/groove.js +10 -2
  44. package/packages/gui/src/views/agents.jsx +14 -1
  45. package/packages/gui/src/views/settings.jsx +3 -1
  46. package/node_modules/@groove-dev/gui/dist/assets/index-BvvSZvQz.js +0 -8614
  47. package/node_modules/@groove-dev/gui/dist/assets/index-DFp5IOnd.css +0 -1
  48. package/packages/gui/dist/assets/index-BvvSZvQz.js +0 -8614
  49. package/packages/gui/dist/assets/index-DFp5IOnd.css +0 -1
@@ -34,6 +34,7 @@ export const useGrooveStore = create((set, get) => ({
34
34
  ws: null,
35
35
  daemonHost: null,
36
36
  tunneled: false,
37
+ remoteHomedir: null,
37
38
 
38
39
  // ── Teams ─────────────────────────────────────────────────
39
40
  teams: [],
@@ -172,6 +173,7 @@ export const useGrooveStore = create((set, get) => ({
172
173
  const isTunneled = String(s.port) !== browserPort;
173
174
  if (isTunneled) updates.tunneled = true;
174
175
  if (s.version) updates.version = s.version;
176
+ if (s.homedir) updates.remoteHomedir = s.homedir;
175
177
  if (Object.keys(updates).length > 0) set(updates);
176
178
  if (isTunneled) get().fetchProjectDir();
177
179
  }).catch(() => {});
@@ -907,7 +909,7 @@ export const useGrooveStore = create((set, get) => ({
907
909
  clearInterval(plannerPollInterval);
908
910
  plannerPollInterval = null;
909
911
  }
910
- set({ connected: false, hydrated: false, ws: null, daemonHost: null, tunneled: false });
912
+ set({ connected: false, hydrated: false, ws: null, daemonHost: null, tunneled: false, remoteHomedir: null });
911
913
  setTimeout(() => get().connect(), 2000);
912
914
  };
913
915
  ws.onerror = () => ws.close();
@@ -1540,7 +1542,13 @@ export const useGrooveStore = create((set, get) => ({
1540
1542
  get().addToast('success', `Spawned ${agent.name}`);
1541
1543
  return agent;
1542
1544
  } catch (err) {
1543
- get().addToast('error', 'Spawn failed', err.message);
1545
+ let detail = err.message;
1546
+ if (detail?.includes('workingDir must be within project directory')) {
1547
+ const projDir = get().projectDir || 'unknown';
1548
+ const workDir = config.workingDir || 'default';
1549
+ detail = `workingDir "${workDir}" is outside project directory "${projDir}". Change the project directory or pick a subfolder within it.`;
1550
+ }
1551
+ get().addToast('error', 'Spawn failed', detail);
1544
1552
  throw err;
1545
1553
  }
1546
1554
  },
@@ -10,7 +10,7 @@ import { RootNode } from '../components/agents/root-node';
10
10
  import { cn } from '../lib/cn';
11
11
  import { Button } from '../components/ui/button';
12
12
  import { Badge } from '../components/ui/badge';
13
- import { Plus, Users, Zap, X, Check, Rocket, Server, Monitor, Code2, TestTube, Shield, Pencil, Copy, Trash2, ChevronDown, ChevronLeft, ChevronRight, FolderOpen } from 'lucide-react';
13
+ import { Plus, Users, Zap, X, Check, Rocket, Server, Monitor, Code2, TestTube, Shield, Pencil, Copy, Trash2, ChevronDown, ChevronLeft, ChevronRight, FolderOpen, Radio } from 'lucide-react';
14
14
  import { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuSeparator } from '../components/ui/context-menu';
15
15
 
16
16
  const NODE_TYPES = { agentNode: AgentNode, rootNode: RootNode };
@@ -629,6 +629,19 @@ function EmptyState({ onPlanner, onSpawn }) {
629
629
  <div className="text-xs text-text-3 font-sans mt-0.5">Choose a role and configure</div>
630
630
  </div>
631
631
  </button>
632
+
633
+ <button
634
+ onClick={() => useGrooveStore.getState().toggleQuickConnect()}
635
+ className="w-full flex items-center gap-3 p-4 rounded-lg border border-border bg-surface-1 hover:bg-surface-2 hover:border-border transition-all cursor-pointer group text-left"
636
+ >
637
+ <div className="w-10 h-10 rounded-lg bg-surface-4 flex items-center justify-center group-hover:scale-110 transition-transform flex-shrink-0">
638
+ <Radio size={20} className="text-text-1" />
639
+ </div>
640
+ <div className="min-w-0">
641
+ <div className="text-sm font-semibold text-text-0 font-sans">Connect to Remote Server</div>
642
+ <div className="text-xs text-text-3 font-sans mt-0.5">SSH tunnel to a remote machine</div>
643
+ </div>
644
+ </button>
632
645
  </div>
633
646
 
634
647
  {window.groove?.openFolder && (
@@ -1035,6 +1035,7 @@ export default function SettingsView() {
1035
1035
  const [loading, setLoading] = useState(true);
1036
1036
  const [folderBrowserOpen, setFolderBrowserOpen] = useState(false);
1037
1037
  const addToast = useGrooveStore((s) => s.addToast);
1038
+ const remoteHomedir = useGrooveStore((s) => s.remoteHomedir);
1038
1039
 
1039
1040
  function loadProviders() {
1040
1041
  api.get('/providers').then((d) => setProviders(Array.isArray(d) ? d : [])).catch(() => {});
@@ -1296,7 +1297,8 @@ export default function SettingsView() {
1296
1297
  <FolderBrowser
1297
1298
  open={folderBrowserOpen}
1298
1299
  onOpenChange={setFolderBrowserOpen}
1299
- currentPath={config?.defaultWorkingDir || '/'}
1300
+ currentPath={config?.defaultWorkingDir || remoteHomedir || '/'}
1301
+ homePath={remoteHomedir}
1300
1302
  onSelect={(dir) => updateConfig('defaultWorkingDir', dir)}
1301
1303
  />
1302
1304
  </div>