groove-dev 0.27.8 → 0.27.12

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 (125) hide show
  1. package/groove-icon.png +0 -0
  2. package/node_modules/@groove-dev/daemon/src/api.js +460 -25
  3. package/node_modules/@groove-dev/daemon/src/index.js +7 -0
  4. package/node_modules/@groove-dev/daemon/src/introducer.js +72 -4
  5. package/node_modules/@groove-dev/daemon/src/journalist.js +66 -11
  6. package/node_modules/@groove-dev/daemon/src/process.js +67 -7
  7. package/node_modules/@groove-dev/daemon/src/registry.js +1 -1
  8. package/node_modules/@groove-dev/daemon/src/repo-import.js +541 -0
  9. package/node_modules/@groove-dev/daemon/src/rotator.js +28 -1
  10. package/node_modules/@groove-dev/daemon/src/supervisor.js +2 -1
  11. package/node_modules/@groove-dev/daemon/src/tunnel-manager.js +504 -0
  12. package/node_modules/@groove-dev/daemon/src/validate.js +13 -0
  13. package/node_modules/@groove-dev/daemon/test/journalist.test.js +5 -4
  14. package/node_modules/@groove-dev/daemon/test/rotator.test.js +4 -1
  15. package/node_modules/@groove-dev/gui/dist/assets/index-BE6lYcd7.css +1 -0
  16. package/node_modules/@groove-dev/gui/dist/assets/index-zdzOLAZM.js +677 -0
  17. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  18. package/node_modules/@groove-dev/gui/src/app.css +14 -0
  19. package/node_modules/@groove-dev/gui/src/app.jsx +13 -0
  20. package/node_modules/@groove-dev/gui/src/components/agents/agent-config.jsx +130 -1
  21. package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +2 -2
  22. package/node_modules/@groove-dev/gui/src/components/agents/agent-mdfiles.jsx +43 -1
  23. package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +141 -1
  24. package/node_modules/@groove-dev/gui/src/components/dashboard/fleet-panel.jsx +3 -3
  25. package/node_modules/@groove-dev/gui/src/components/dashboard/intel-panel.jsx +4 -4
  26. package/node_modules/@groove-dev/gui/src/components/dashboard/routing-chart.jsx +3 -3
  27. package/node_modules/@groove-dev/gui/src/components/dashboard/team-burn-panel.jsx +1 -1
  28. package/node_modules/@groove-dev/gui/src/components/layout/activity-bar.jsx +4 -4
  29. package/node_modules/@groove-dev/gui/src/components/layout/app-shell.jsx +7 -1
  30. package/node_modules/@groove-dev/gui/src/components/layout/breadcrumb-bar.jsx +26 -8
  31. package/node_modules/@groove-dev/gui/src/components/layout/command-palette.jsx +14 -4
  32. package/node_modules/@groove-dev/gui/src/components/layout/status-bar.jsx +46 -11
  33. package/node_modules/@groove-dev/gui/src/components/marketplace/repo-card.jsx +64 -0
  34. package/node_modules/@groove-dev/gui/src/components/marketplace/repo-import.jsx +363 -0
  35. package/node_modules/@groove-dev/gui/src/components/marketplace/repo-nuke-dialog.jsx +68 -0
  36. package/node_modules/@groove-dev/gui/src/components/pro/pro-gate.jsx +22 -0
  37. package/node_modules/@groove-dev/gui/src/components/pro/upgrade-card.jsx +48 -0
  38. package/node_modules/@groove-dev/gui/src/components/settings/quick-connect.jsx +129 -0
  39. package/node_modules/@groove-dev/gui/src/components/settings/remote-server-card.jsx +243 -0
  40. package/node_modules/@groove-dev/gui/src/components/settings/server-dialog.jsx +192 -0
  41. package/node_modules/@groove-dev/gui/src/components/ui/approval-modal.jsx +63 -0
  42. package/node_modules/@groove-dev/gui/src/components/ui/toast.jsx +1 -1
  43. package/node_modules/@groove-dev/gui/src/lib/edition.js +4 -0
  44. package/node_modules/@groove-dev/gui/src/lib/electron.js +25 -0
  45. package/node_modules/@groove-dev/gui/src/lib/status.js +1 -0
  46. package/node_modules/@groove-dev/gui/src/stores/groove.js +139 -6
  47. package/node_modules/@groove-dev/gui/src/views/dashboard.jsx +38 -39
  48. package/node_modules/@groove-dev/gui/src/views/marketplace.jsx +82 -0
  49. package/node_modules/@groove-dev/gui/src/views/settings.jsx +66 -0
  50. package/node_modules/@groove-dev/gui/vite.config.js +3 -0
  51. package/package.json +7 -2
  52. package/packages/daemon/src/api.js +460 -25
  53. package/packages/daemon/src/index.js +7 -0
  54. package/packages/daemon/src/introducer.js +72 -4
  55. package/packages/daemon/src/journalist.js +66 -11
  56. package/packages/daemon/src/process.js +67 -7
  57. package/packages/daemon/src/registry.js +1 -1
  58. package/packages/daemon/src/repo-import.js +541 -0
  59. package/packages/daemon/src/rotator.js +28 -1
  60. package/packages/daemon/src/supervisor.js +2 -1
  61. package/packages/daemon/src/tunnel-manager.js +504 -0
  62. package/packages/daemon/src/validate.js +13 -0
  63. package/packages/gui/dist/assets/index-BE6lYcd7.css +1 -0
  64. package/packages/gui/dist/assets/index-zdzOLAZM.js +677 -0
  65. package/packages/gui/dist/index.html +2 -2
  66. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-html.js +3 -3
  67. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-javascript.js +2 -2
  68. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-markdown.js +3 -3
  69. package/packages/gui/node_modules/.vite/deps/@codemirror_lang-python.js +5 -5
  70. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-dialog.js +3 -3
  71. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-scroll-area.js +1 -1
  72. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-tabs.js +5 -5
  73. package/packages/gui/node_modules/.vite/deps/@radix-ui_react-tooltip.js +3 -3
  74. package/packages/gui/node_modules/.vite/deps/_metadata.json +53 -53
  75. package/packages/gui/node_modules/.vite/deps/{chunk-WYSQD5ZG.js → chunk-DH7AESXW.js} +2 -2
  76. package/packages/gui/node_modules/.vite/deps/{chunk-KXLIKZFX.js → chunk-GFE3G4IN.js} +133 -133
  77. package/packages/gui/node_modules/.vite/deps/chunk-GFE3G4IN.js.map +7 -0
  78. package/packages/gui/node_modules/.vite/deps/{chunk-3LBP22MX.js → chunk-LKZVMLRH.js} +6 -6
  79. package/packages/gui/node_modules/.vite/deps/{chunk-J6DMOQWP.js → chunk-MCVDVNE5.js} +2 -2
  80. package/packages/gui/node_modules/.vite/deps/{chunk-3Q7HT7ZF.js → chunk-SPKVQGZX.js} +6 -6
  81. package/packages/gui/src/app.css +14 -0
  82. package/packages/gui/src/app.jsx +13 -0
  83. package/packages/gui/src/components/agents/agent-config.jsx +130 -1
  84. package/packages/gui/src/components/agents/agent-feed.jsx +2 -2
  85. package/packages/gui/src/components/agents/agent-mdfiles.jsx +43 -1
  86. package/packages/gui/src/components/agents/spawn-wizard.jsx +141 -1
  87. package/packages/gui/src/components/dashboard/fleet-panel.jsx +3 -3
  88. package/packages/gui/src/components/dashboard/intel-panel.jsx +4 -4
  89. package/packages/gui/src/components/dashboard/routing-chart.jsx +3 -3
  90. package/packages/gui/src/components/dashboard/team-burn-panel.jsx +1 -1
  91. package/packages/gui/src/components/layout/activity-bar.jsx +4 -4
  92. package/packages/gui/src/components/layout/app-shell.jsx +7 -1
  93. package/packages/gui/src/components/layout/breadcrumb-bar.jsx +26 -8
  94. package/packages/gui/src/components/layout/command-palette.jsx +14 -4
  95. package/packages/gui/src/components/layout/status-bar.jsx +46 -11
  96. package/packages/gui/src/components/marketplace/repo-card.jsx +64 -0
  97. package/packages/gui/src/components/marketplace/repo-import.jsx +363 -0
  98. package/packages/gui/src/components/marketplace/repo-nuke-dialog.jsx +68 -0
  99. package/packages/gui/src/components/pro/pro-gate.jsx +22 -0
  100. package/packages/gui/src/components/pro/upgrade-card.jsx +48 -0
  101. package/packages/gui/src/components/settings/quick-connect.jsx +129 -0
  102. package/packages/gui/src/components/settings/remote-server-card.jsx +243 -0
  103. package/packages/gui/src/components/settings/server-dialog.jsx +192 -0
  104. package/packages/gui/src/components/ui/approval-modal.jsx +63 -0
  105. package/packages/gui/src/components/ui/toast.jsx +1 -1
  106. package/packages/gui/src/lib/edition.js +4 -0
  107. package/packages/gui/src/lib/electron.js +25 -0
  108. package/packages/gui/src/lib/status.js +1 -0
  109. package/packages/gui/src/stores/groove.js +139 -6
  110. package/packages/gui/src/views/dashboard.jsx +38 -39
  111. package/packages/gui/src/views/marketplace.jsx +82 -0
  112. package/packages/gui/src/views/settings.jsx +66 -0
  113. package/packages/gui/vite.config.js +3 -0
  114. package/integrations/FEDERATION_PLAN.md +0 -583
  115. package/integrations/VOICE_PLAN.md +0 -232
  116. package/node_modules/@groove-dev/gui/dist/assets/index-CwmR3-HY.css +0 -1
  117. package/node_modules/@groove-dev/gui/dist/assets/index-DiCjVtQL.js +0 -652
  118. package/packages/gui/dist/assets/index-CwmR3-HY.css +0 -1
  119. package/packages/gui/dist/assets/index-DiCjVtQL.js +0 -652
  120. package/packages/gui/node_modules/.vite/deps/chunk-KXLIKZFX.js.map +0 -7
  121. package/test-slack.mjs +0 -28
  122. /package/packages/gui/node_modules/.vite/deps/{chunk-WYSQD5ZG.js.map → chunk-DH7AESXW.js.map} +0 -0
  123. /package/packages/gui/node_modules/.vite/deps/{chunk-3LBP22MX.js.map → chunk-LKZVMLRH.js.map} +0 -0
  124. /package/packages/gui/node_modules/.vite/deps/{chunk-J6DMOQWP.js.map → chunk-MCVDVNE5.js.map} +0 -0
  125. /package/packages/gui/node_modules/.vite/deps/{chunk-3Q7HT7ZF.js.map → chunk-SPKVQGZX.js.map} +0 -0
@@ -18,9 +18,13 @@ import { useToast } from '../lib/hooks/use-toast';
18
18
  import { fmtNum, timeAgo } from '../lib/format';
19
19
  import { useGrooveStore } from '../stores/groove';
20
20
  import { IntegrationWizard, GoogleWorkspaceWizard } from '../components/marketplace/integration-wizard';
21
+ import { RepoImport } from '../components/marketplace/repo-import';
22
+ import { RepoCard } from '../components/marketplace/repo-card';
23
+ import { RepoNukeDialog } from '../components/marketplace/repo-nuke-dialog';
21
24
  import {
22
25
  ChevronLeft, ChevronDown, Sparkles, Plug, LogIn, LogOut,
23
26
  User, Upload, Package, Download, ShoppingBag, RefreshCw, Trash2,
27
+ GitBranch,
24
28
  } from 'lucide-react';
25
29
 
26
30
  // ── Skill Detail ─────────────────────────────────────────
@@ -623,6 +627,82 @@ function AuthArea() {
623
627
  );
624
628
  }
625
629
 
630
+ // ── GitHub Browse ───────────────────────────────────────
631
+ function GitHubBrowse() {
632
+ const importedRepos = useGrooveStore((s) => s.importedRepos);
633
+ const fetchImportedRepos = useGrooveStore((s) => s.fetchImportedRepos);
634
+ const softRemoveRepo = useGrooveStore((s) => s.softRemoveRepo);
635
+ const hardNukeRepo = useGrooveStore((s) => s.hardNukeRepo);
636
+ const toast = useToast();
637
+
638
+ const [nukeTarget, setNukeTarget] = useState(null);
639
+
640
+ useEffect(() => { fetchImportedRepos(); }, []);
641
+
642
+ async function handleRemove(repo) {
643
+ try {
644
+ await softRemoveRepo(repo.id);
645
+ toast.success(`Removed ${repo.repoName || repo.name}`);
646
+ } catch (err) {
647
+ toast.error('Remove failed', err.message);
648
+ }
649
+ }
650
+
651
+ async function handleNukeConfirm(deleteFiles) {
652
+ if (!nukeTarget) return;
653
+ try {
654
+ if (deleteFiles) {
655
+ await hardNukeRepo(nukeTarget.id);
656
+ } else {
657
+ await softRemoveRepo(nukeTarget.id);
658
+ }
659
+ toast.success(`${deleteFiles ? 'Nuked' : 'Removed'} ${nukeTarget.name || nukeTarget.repo}`);
660
+ } catch (err) {
661
+ toast.error('Nuke failed', err.message);
662
+ }
663
+ setNukeTarget(null);
664
+ }
665
+
666
+ return (
667
+ <ScrollArea className="h-full">
668
+ <div className="px-5 py-4 space-y-5">
669
+ <RepoImport />
670
+
671
+ {importedRepos.length > 0 && (
672
+ <div>
673
+ <h3 className="text-xs font-semibold text-text-2 font-sans uppercase tracking-wider mb-3">
674
+ Recently Imported
675
+ </h3>
676
+ <div className="space-y-2">
677
+ {(Array.isArray(importedRepos) ? importedRepos : []).map((repo) => (
678
+ <RepoCard
679
+ key={repo.id}
680
+ repo={repo}
681
+ onRemove={() => handleRemove(repo)}
682
+ onNuke={() => setNukeTarget(repo)}
683
+ />
684
+ ))}
685
+ </div>
686
+ </div>
687
+ )}
688
+
689
+ {importedRepos.length === 0 && (
690
+ <div className="text-center py-16 text-text-4 font-sans text-sm">
691
+ No repos imported yet. Paste a GitHub URL above to get started.
692
+ </div>
693
+ )}
694
+ </div>
695
+
696
+ <RepoNukeDialog
697
+ repo={nukeTarget}
698
+ open={!!nukeTarget}
699
+ onClose={() => setNukeTarget(null)}
700
+ onConfirm={handleNukeConfirm}
701
+ />
702
+ </ScrollArea>
703
+ );
704
+ }
705
+
626
706
  // ── Main ─────────────────────────────────────────────────
627
707
  export default function MarketplaceView() {
628
708
  const [tab, setTab] = useState('skills');
@@ -630,6 +710,7 @@ export default function MarketplaceView() {
630
710
  const tabs = [
631
711
  { id: 'skills', label: 'Skills', icon: Sparkles },
632
712
  { id: 'integrations', label: 'Integrations', icon: Plug },
713
+ { id: 'github', label: 'GitHub', icon: GitBranch },
633
714
  { id: 'library', label: 'My Library', icon: Package },
634
715
  ];
635
716
 
@@ -662,6 +743,7 @@ export default function MarketplaceView() {
662
743
  <div className="flex-1 min-h-0">
663
744
  {tab === 'skills' && <SkillsBrowse />}
664
745
  {tab === 'integrations' && <IntegrationsBrowse />}
746
+ {tab === 'github' && <GitHubBrowse />}
665
747
  {tab === 'library' && <MyLibrary />}
666
748
  </div>
667
749
  </div>
@@ -12,6 +12,9 @@ import { Sheet, SheetContent } from '../components/ui/sheet';
12
12
  import { api } from '../lib/api';
13
13
  import { cn } from '../lib/cn';
14
14
  import { fmtUptime } from '../lib/format';
15
+ import { RemoteServerCard } from '../components/settings/remote-server-card';
16
+ import { ServerDialog } from '../components/settings/server-dialog';
17
+ import { ProGate } from '../components/pro/pro-gate';
15
18
  import {
16
19
  Key, Eye, EyeOff, Check, Cpu, ChevronDown,
17
20
  FolderOpen, FolderSearch, RotateCw, Users, Gauge, Zap,
@@ -974,6 +977,9 @@ export default function SettingsView() {
974
977
  const [gwList, setGwList] = useState([]);
975
978
  const [loading, setLoading] = useState(true);
976
979
  const [folderBrowserOpen, setFolderBrowserOpen] = useState(false);
980
+ const [serverDialogOpen, setServerDialogOpen] = useState(false);
981
+ const [editingServer, setEditingServer] = useState(null);
982
+ const savedTunnels = useGrooveStore((s) => s.savedTunnels);
977
983
  const addToast = useGrooveStore((s) => s.addToast);
978
984
  const marketplaceUser = useGrooveStore((s) => s.marketplaceUser);
979
985
  const marketplaceAuthenticated = useGrooveStore((s) => s.marketplaceAuthenticated);
@@ -992,6 +998,7 @@ export default function SettingsView() {
992
998
  Promise.all([api.get('/providers'), api.get('/config'), api.get('/status'), api.get('/gateways')])
993
999
  .then(([p, c, s, g]) => { setProviders(Array.isArray(p) ? p : []); setConfig(c); setDaemonInfo(s); setGwList(Array.isArray(g) ? g : []); setLoading(false); })
994
1000
  .catch(() => setLoading(false));
1001
+ useGrooveStore.getState().fetchTunnels();
995
1002
  }, []);
996
1003
 
997
1004
  async function addGateway(type) {
@@ -1221,9 +1228,68 @@ export default function SettingsView() {
1221
1228
  </div>
1222
1229
  </div>
1223
1230
  )}
1231
+
1232
+ {/* ═══════ REMOTE SERVERS ═══════ */}
1233
+ <div>
1234
+ <div className="flex items-center gap-2 mb-2.5 px-0.5">
1235
+ <span className="text-2xs font-semibold text-text-3 font-sans uppercase tracking-wider">Remote Servers</span>
1236
+ <div className="flex-1 h-px bg-border-subtle" />
1237
+ </div>
1238
+ <ProGate feature="Remote Access" description="Connect to remote servers via SSH tunnel and manage agents across machines">
1239
+ <div>
1240
+ <div className="flex justify-end mb-2.5">
1241
+ <Button
1242
+ variant="ghost"
1243
+ size="sm"
1244
+ onClick={() => { setEditingServer(null); setServerDialogOpen(true); }}
1245
+ className="h-6 text-2xs gap-1 text-text-3 hover:text-accent"
1246
+ >
1247
+ <Plus size={11} /> Add Server
1248
+ </Button>
1249
+ </div>
1250
+ {savedTunnels.length === 0 ? (
1251
+ <div className="rounded-lg border border-dashed border-border-subtle bg-surface-1/50 px-4 py-6 text-center">
1252
+ <Radio size={20} className="text-text-4 mx-auto mb-2" />
1253
+ <p className="text-xs text-text-3 font-sans">No remote servers configured.</p>
1254
+ <p className="text-2xs text-text-4 font-sans mt-1">Add one to connect to a VPS or remote machine.</p>
1255
+ </div>
1256
+ ) : (
1257
+ <div className="grid grid-cols-2 gap-3">
1258
+ {savedTunnels.map((server) => (
1259
+ <RemoteServerCard
1260
+ key={server.id}
1261
+ server={server}
1262
+ onConnect={() => useGrooveStore.getState().connectTunnel(server.id)}
1263
+ onDisconnect={() => useGrooveStore.getState().disconnectTunnel(server.id)}
1264
+ onTest={() => useGrooveStore.getState().testTunnel(server.id)}
1265
+ onEdit={(s) => { setEditingServer(s); setServerDialogOpen(true); }}
1266
+ onDelete={(id) => useGrooveStore.getState().deleteTunnel(id)}
1267
+ />
1268
+ ))}
1269
+ </div>
1270
+ )}
1271
+ </div>
1272
+ </ProGate>
1273
+ </div>
1274
+
1224
1275
  </div>
1225
1276
  </ScrollArea>
1226
1277
 
1278
+ {/* Server Dialog */}
1279
+ <ServerDialog
1280
+ open={serverDialogOpen}
1281
+ onOpenChange={setServerDialogOpen}
1282
+ server={editingServer}
1283
+ onSave={async (data) => {
1284
+ if (data.id) {
1285
+ await useGrooveStore.getState().updateTunnel(data.id, data);
1286
+ } else {
1287
+ await useGrooveStore.getState().saveTunnel(data);
1288
+ }
1289
+ addToast('success', data.id ? 'Server updated' : 'Server added');
1290
+ }}
1291
+ />
1292
+
1227
1293
  {/* Folder Browser Modal */}
1228
1294
  <FolderBrowser
1229
1295
  open={folderBrowserOpen}
@@ -4,6 +4,9 @@ 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
+ },
7
10
  server: {
8
11
  port: 3142,
9
12
  proxy: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groove-dev",
3
- "version": "0.27.8",
3
+ "version": "0.27.12",
4
4
  "description": "Open-source agent orchestration layer — the AI company OS. Local model agent engine (GGUF/Ollama/llama-server), HuggingFace model browser, MCP integrations (Slack, Gmail, Stripe, 15+), agent scheduling (cron), business roles (CMO, CFO, EA). GUI dashboard, multi-agent coordination, zero cold-start, infinite sessions. Works with Claude Code, Codex, Gemini CLI, Ollama, any local model.",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "author": "Groove Dev <hello@groovedev.ai> (https://groovedev.ai)",
@@ -43,7 +43,8 @@
43
43
  "workspaces": [
44
44
  "packages/daemon",
45
45
  "packages/cli",
46
- "packages/gui"
46
+ "packages/gui",
47
+ "packages/desktop"
47
48
  ],
48
49
  "engines": {
49
50
  "node": ">=20.0.0"
@@ -52,6 +53,10 @@
52
53
  "dev:daemon": "npm run dev -w packages/daemon",
53
54
  "dev:gui": "npm run dev -w packages/gui",
54
55
  "build": "npm run build -w packages/gui",
56
+ "build:pro": "GROOVE_EDITION=pro npm run build -w packages/gui",
57
+ "start:desktop": "npm run start -w packages/desktop",
58
+ "build:desktop": "npm run build -w packages/desktop",
59
+ "dist:desktop": "npm run build:pro && npm run dist -w packages/desktop",
55
60
  "test": "node --test packages/daemon/test/*.test.js",
56
61
  "prepublishOnly": "npm run build"
57
62
  },