groove-dev 0.17.8 → 0.18.2
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/node_modules/@groove-dev/cli/package.json +4 -3
- package/node_modules/@groove-dev/daemon/google-oauth.json +5 -0
- package/node_modules/@groove-dev/daemon/integrations-registry.json +0 -40
- package/node_modules/@groove-dev/daemon/package.json +4 -3
- package/node_modules/@groove-dev/daemon/src/api.js +212 -21
- package/node_modules/@groove-dev/daemon/src/index.js +68 -1
- package/node_modules/@groove-dev/daemon/src/integrations.js +59 -20
- package/node_modules/@groove-dev/daemon/src/process.js +83 -11
- package/node_modules/@groove-dev/daemon/src/providers/claude-code.js +4 -0
- package/node_modules/@groove-dev/daemon/src/registry.js +1 -1
- package/node_modules/@groove-dev/gui/.groove/audit.log +1 -0
- package/node_modules/@groove-dev/gui/.groove/codebase-index.json +64 -0
- package/node_modules/@groove-dev/gui/.groove/config.json +10 -0
- package/node_modules/@groove-dev/gui/.groove/coordination.md +5 -0
- package/node_modules/@groove-dev/gui/.groove/credentials.json +6 -0
- package/node_modules/@groove-dev/gui/.groove/daemon.port +1 -0
- package/node_modules/@groove-dev/gui/.groove/federation/identity.key +3 -0
- package/node_modules/@groove-dev/gui/.groove/federation/identity.pub +3 -0
- package/node_modules/@groove-dev/gui/.groove/integrations/package.json +6 -0
- package/node_modules/@groove-dev/gui/.groove/state.json +3 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-x5suAiK7.js +182 -0
- package/node_modules/@groove-dev/gui/dist/index.html +1 -1
- package/node_modules/@groove-dev/gui/package.json +5 -4
- package/node_modules/@groove-dev/gui/src/App.jsx +149 -76
- package/node_modules/@groove-dev/gui/src/components/AgentActions.jsx +130 -1
- package/node_modules/@groove-dev/gui/src/components/AgentChat.jsx +47 -7
- package/node_modules/@groove-dev/gui/src/components/AgentNode.jsx +13 -83
- package/node_modules/@groove-dev/gui/src/components/SpawnPanel.jsx +918 -580
- package/node_modules/@groove-dev/gui/src/stores/groove.js +31 -2
- package/node_modules/@groove-dev/gui/src/views/AgentTree.jsx +133 -67
- package/node_modules/@groove-dev/gui/src/views/FileEditor.jsx +85 -1
- package/node_modules/@groove-dev/gui/src/views/IntegrationsStore.jsx +121 -44
- package/package.json +1 -2
- package/packages/cli/package.json +4 -3
- package/packages/daemon/integrations-registry.json +0 -40
- package/packages/daemon/package.json +4 -3
- package/packages/daemon/src/api.js +212 -21
- package/packages/daemon/src/index.js +68 -1
- package/packages/daemon/src/integrations.js +59 -20
- package/packages/daemon/src/process.js +83 -11
- package/packages/daemon/src/providers/claude-code.js +4 -0
- package/packages/daemon/src/registry.js +1 -1
- package/packages/gui/dist/assets/index-x5suAiK7.js +182 -0
- package/packages/gui/dist/index.html +1 -1
- package/packages/gui/node_modules/.vite/deps/@codemirror_autocomplete.js +68 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_autocomplete.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_commands.js +1420 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_commands.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-css.js +17 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-css.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-html.js +22 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-html.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-javascript.js +34 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-javascript.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-json.js +101 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-json.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-markdown.js +2534 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-markdown.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-python.js +789 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_lang-python.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_language.js +115 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_language.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_search.js +1136 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_search.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_state.js +63 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_state.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_theme-one-dark.js +179 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_theme-one-dark.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_view.js +104 -0
- package/packages/gui/node_modules/.vite/deps/@codemirror_view.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@xterm_addon-fit.js +46 -0
- package/packages/gui/node_modules/.vite/deps/@xterm_addon-fit.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@xterm_addon-web-links.js +121 -0
- package/packages/gui/node_modules/.vite/deps/@xterm_addon-web-links.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@xterm_xterm.js +9237 -0
- package/packages/gui/node_modules/.vite/deps/@xterm_xterm.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/@xyflow_react.js +9934 -0
- package/packages/gui/node_modules/.vite/deps/@xyflow_react.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/_metadata.json +184 -0
- package/packages/gui/node_modules/.vite/deps/chunk-3EE34IFC.js +5169 -0
- package/packages/gui/node_modules/.vite/deps/chunk-3EE34IFC.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-3IB5EUP7.js +2000 -0
- package/packages/gui/node_modules/.vite/deps/chunk-3IB5EUP7.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-3LBP22MX.js +1115 -0
- package/packages/gui/node_modules/.vite/deps/chunk-3LBP22MX.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-3Q7HT7ZF.js +701 -0
- package/packages/gui/node_modules/.vite/deps/chunk-3Q7HT7ZF.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-44CLUOQE.js +1776 -0
- package/packages/gui/node_modules/.vite/deps/chunk-44CLUOQE.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-5RZAEUNX.js +280 -0
- package/packages/gui/node_modules/.vite/deps/chunk-5RZAEUNX.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-5WRI5ZAA.js +30 -0
- package/packages/gui/node_modules/.vite/deps/chunk-5WRI5ZAA.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-7FYDPZIO.js +1004 -0
- package/packages/gui/node_modules/.vite/deps/chunk-7FYDPZIO.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-BX6POZPY.js +292 -0
- package/packages/gui/node_modules/.vite/deps/chunk-BX6POZPY.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-HVFOBSCQ.js +1062 -0
- package/packages/gui/node_modules/.vite/deps/chunk-HVFOBSCQ.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-RE2FU7ZU.js +10985 -0
- package/packages/gui/node_modules/.vite/deps/chunk-RE2FU7ZU.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/chunk-YYJMNVCJ.js +3459 -0
- package/packages/gui/node_modules/.vite/deps/chunk-YYJMNVCJ.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/package.json +3 -0
- package/packages/gui/node_modules/.vite/deps/react-dom.js +6 -0
- package/packages/gui/node_modules/.vite/deps/react-dom.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/react-dom_client.js +20217 -0
- package/packages/gui/node_modules/.vite/deps/react-dom_client.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/react.js +5 -0
- package/packages/gui/node_modules/.vite/deps/react.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/react_jsx-dev-runtime.js +278 -0
- package/packages/gui/node_modules/.vite/deps/react_jsx-dev-runtime.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/react_jsx-runtime.js +6 -0
- package/packages/gui/node_modules/.vite/deps/react_jsx-runtime.js.map +7 -0
- package/packages/gui/node_modules/.vite/deps/zustand.js +56 -0
- package/packages/gui/node_modules/.vite/deps/zustand.js.map +7 -0
- package/packages/gui/package.json +5 -4
- package/packages/gui/src/App.jsx +149 -76
- package/packages/gui/src/components/AgentActions.jsx +130 -1
- package/packages/gui/src/components/AgentChat.jsx +47 -7
- package/packages/gui/src/components/AgentNode.jsx +13 -83
- package/packages/gui/src/components/SpawnPanel.jsx +918 -580
- package/packages/gui/src/stores/groove.js +31 -2
- package/packages/gui/src/views/AgentTree.jsx +133 -67
- package/packages/gui/src/views/FileEditor.jsx +85 -1
- package/packages/gui/src/views/IntegrationsStore.jsx +121 -44
- package/docs/FILE-EDITOR-PLAN.md +0 -253
- package/docs/GUI_DESIGN_SPEC.md +0 -402
- package/docs/SKILLS-API-SPEC.md +0 -277
- package/node_modules/@groove-dev/gui/dist/assets/index-D5dtDQf0.js +0 -156
- package/packages/gui/dist/assets/index-D5dtDQf0.js +0 -156
|
@@ -84,6 +84,7 @@ function CredentialModal({ integration, onClose }) {
|
|
|
84
84
|
const [googleClientId, setGoogleClientId] = useState('');
|
|
85
85
|
const [googleClientSecret, setGoogleClientSecret] = useState('');
|
|
86
86
|
const [showGoogleSetup, setShowGoogleSetup] = useState(false);
|
|
87
|
+
const [errorMsg, setErrorMsg] = useState('');
|
|
87
88
|
|
|
88
89
|
useEffect(() => {
|
|
89
90
|
if (integration?.authType === 'oauth-google' || integration?.authType === 'google-autoauth' || integration?._googleSetupNeeded) {
|
|
@@ -106,6 +107,7 @@ function CredentialModal({ integration, onClose }) {
|
|
|
106
107
|
async function handleSave(key) {
|
|
107
108
|
if (!values[key]) return;
|
|
108
109
|
setSaving(true);
|
|
110
|
+
setErrorMsg('');
|
|
109
111
|
try {
|
|
110
112
|
const res = await fetch(`/api/integrations/${integration.id}/credentials`, {
|
|
111
113
|
method: 'POST',
|
|
@@ -115,44 +117,61 @@ function CredentialModal({ integration, onClose }) {
|
|
|
115
117
|
if (res.ok) {
|
|
116
118
|
setSaved((prev) => ({ ...prev, [key]: true }));
|
|
117
119
|
setValues((prev) => ({ ...prev, [key]: '' }));
|
|
120
|
+
} else {
|
|
121
|
+
const data = await res.json();
|
|
122
|
+
setErrorMsg(data.error || `Failed to save ${key}`);
|
|
118
123
|
}
|
|
119
|
-
} catch {
|
|
124
|
+
} catch {
|
|
125
|
+
setErrorMsg('Could not reach the server');
|
|
126
|
+
}
|
|
120
127
|
setSaving(false);
|
|
121
128
|
}
|
|
122
129
|
|
|
123
130
|
async function handleGoogleSetup() {
|
|
124
131
|
if (!googleClientId || !googleClientSecret) return;
|
|
125
132
|
setSaving(true);
|
|
133
|
+
setErrorMsg('');
|
|
126
134
|
try {
|
|
127
|
-
await fetch('/api/integrations/google-oauth/setup', {
|
|
135
|
+
const res = await fetch('/api/integrations/google-oauth/setup', {
|
|
128
136
|
method: 'POST',
|
|
129
137
|
headers: { 'Content-Type': 'application/json' },
|
|
130
138
|
body: JSON.stringify({ clientId: googleClientId, clientSecret: googleClientSecret }),
|
|
131
139
|
});
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
140
|
+
if (res.ok) {
|
|
141
|
+
setOauthStatus('ready');
|
|
142
|
+
setShowGoogleSetup(false);
|
|
143
|
+
} else {
|
|
144
|
+
const data = await res.json();
|
|
145
|
+
setErrorMsg(data.error || 'Failed to save credentials');
|
|
146
|
+
}
|
|
147
|
+
} catch {
|
|
148
|
+
setErrorMsg('Could not reach the server');
|
|
149
|
+
}
|
|
135
150
|
setSaving(false);
|
|
136
151
|
}
|
|
137
152
|
|
|
138
153
|
async function handleAutoAuthConnect() {
|
|
139
154
|
setOauthStatus('connecting');
|
|
155
|
+
setErrorMsg('');
|
|
140
156
|
try {
|
|
141
157
|
const res = await fetch(`/api/integrations/${integration.id}/authenticate`, { method: 'POST' });
|
|
142
158
|
const data = await res.json();
|
|
143
|
-
if (
|
|
159
|
+
if (data.ok) {
|
|
160
|
+
// MCP server spawned — it will open a browser for OAuth consent
|
|
161
|
+
setTimeout(() => onClose(), 3000);
|
|
162
|
+
} else {
|
|
163
|
+
setErrorMsg(data.error || 'Authentication failed');
|
|
144
164
|
setOauthStatus('ready');
|
|
145
165
|
}
|
|
146
|
-
// The MCP server will open a browser — poll isn't needed since
|
|
147
|
-
// the server handles auth internally. Just close after a moment.
|
|
148
|
-
setTimeout(() => onClose(), 2000);
|
|
149
166
|
} catch {
|
|
167
|
+
setErrorMsg('Could not reach the server');
|
|
150
168
|
setOauthStatus('ready');
|
|
151
169
|
}
|
|
152
170
|
}
|
|
153
171
|
|
|
154
172
|
async function handleOAuthConnect() {
|
|
155
173
|
setOauthStatus('connecting');
|
|
174
|
+
setErrorMsg('');
|
|
156
175
|
try {
|
|
157
176
|
const res = await fetch(`/api/integrations/${integration.id}/oauth/start`, { method: 'POST' });
|
|
158
177
|
const data = await res.json();
|
|
@@ -172,8 +191,12 @@ function CredentialModal({ integration, onClose }) {
|
|
|
172
191
|
}, 2000);
|
|
173
192
|
// Stop polling after 5 minutes
|
|
174
193
|
setTimeout(() => clearInterval(poll), 300000);
|
|
194
|
+
} else {
|
|
195
|
+
setErrorMsg(data.error || 'Failed to start OAuth flow');
|
|
196
|
+
setOauthStatus('ready');
|
|
175
197
|
}
|
|
176
198
|
} catch {
|
|
199
|
+
setErrorMsg('Could not reach the server');
|
|
177
200
|
setOauthStatus('ready');
|
|
178
201
|
}
|
|
179
202
|
}
|
|
@@ -236,32 +259,59 @@ function CredentialModal({ integration, onClose }) {
|
|
|
236
259
|
</a>
|
|
237
260
|
)}
|
|
238
261
|
|
|
262
|
+
{/* Error message */}
|
|
263
|
+
{errorMsg && (
|
|
264
|
+
<div style={{
|
|
265
|
+
padding: '10px 14px', marginBottom: 14, borderRadius: 6,
|
|
266
|
+
background: 'rgba(224, 108, 117, 0.08)', border: '1px solid var(--red)',
|
|
267
|
+
fontSize: 11, color: 'var(--red)', lineHeight: 1.5,
|
|
268
|
+
}}>
|
|
269
|
+
{errorMsg}
|
|
270
|
+
</div>
|
|
271
|
+
)}
|
|
272
|
+
|
|
239
273
|
{/* OAuth flow for Google integrations (both oauth-google and google-autoauth) */}
|
|
240
274
|
{(isOAuth || isGoogleAutoAuth) && (
|
|
241
275
|
<div style={{ marginBottom: 16 }}>
|
|
242
|
-
{/*
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
276
|
+
{/* Show Connect button only when OAuth is configured */}
|
|
277
|
+
{oauthStatus === 'ready' && (
|
|
278
|
+
<button
|
|
279
|
+
onClick={isGoogleAutoAuth ? handleAutoAuthConnect : handleOAuthConnect}
|
|
280
|
+
disabled={oauthStatus === 'connecting'}
|
|
281
|
+
style={{
|
|
282
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
|
|
283
|
+
width: '100%', padding: '12px 16px', marginBottom: 12,
|
|
284
|
+
background: '#4285f4',
|
|
285
|
+
color: '#fff', border: 'none', borderRadius: 6,
|
|
286
|
+
fontSize: 13, fontWeight: 600, cursor: 'pointer',
|
|
287
|
+
fontFamily: 'var(--font)',
|
|
288
|
+
}}
|
|
289
|
+
>
|
|
290
|
+
Connect with Google
|
|
291
|
+
</button>
|
|
292
|
+
)}
|
|
293
|
+
{oauthStatus === 'checking' && (
|
|
294
|
+
<div style={{
|
|
295
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
296
|
+
padding: '12px 16px', marginBottom: 12,
|
|
297
|
+
color: 'var(--text-muted)', fontSize: 12,
|
|
298
|
+
}}>
|
|
299
|
+
Checking Google credentials...
|
|
300
|
+
</div>
|
|
301
|
+
)}
|
|
302
|
+
{oauthStatus === 'connecting' && (
|
|
303
|
+
<div style={{
|
|
304
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
305
|
+
padding: '12px 16px', marginBottom: 12,
|
|
306
|
+
background: 'var(--bg-active)', borderRadius: 6,
|
|
307
|
+
color: 'var(--text-primary)', fontSize: 12, fontWeight: 600,
|
|
308
|
+
}}>
|
|
309
|
+
Waiting for authorization — check your browser...
|
|
310
|
+
</div>
|
|
311
|
+
)}
|
|
262
312
|
|
|
263
|
-
{/* First-time setup:
|
|
264
|
-
{
|
|
313
|
+
{/* First-time setup: shown when OAuth not configured */}
|
|
314
|
+
{oauthStatus === 'not-configured' && (
|
|
265
315
|
<div style={{
|
|
266
316
|
padding: 14, borderRadius: 8,
|
|
267
317
|
background: 'var(--bg-surface)', border: '1px solid var(--border)',
|
|
@@ -707,26 +757,42 @@ export default function IntegrationsStore() {
|
|
|
707
757
|
async function handleInstall(id) {
|
|
708
758
|
setInstalling(id);
|
|
709
759
|
try {
|
|
710
|
-
await fetch(`/api/integrations/${id}/install`, { method: 'POST' });
|
|
760
|
+
const res = await fetch(`/api/integrations/${id}/install`, { method: 'POST' });
|
|
761
|
+
const data = await res.json();
|
|
762
|
+
if (!res.ok) {
|
|
763
|
+
flash(data.error || 'Install failed', 'error');
|
|
764
|
+
setInstalling(null);
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
711
767
|
await fetchIntegrations();
|
|
712
768
|
// After install, refresh selected item
|
|
713
769
|
if (selectedItem?.id === id) {
|
|
714
770
|
const updated = integrations.find((s) => s.id === id);
|
|
715
771
|
if (updated) setSelectedItem({ ...updated, installed: true });
|
|
716
772
|
}
|
|
717
|
-
} catch {
|
|
773
|
+
} catch (err) {
|
|
774
|
+
flash('Install failed — check daemon logs', 'error');
|
|
775
|
+
}
|
|
718
776
|
setInstalling(null);
|
|
719
777
|
}
|
|
720
778
|
|
|
721
779
|
async function handleUninstall(id) {
|
|
722
780
|
setInstalling(id);
|
|
723
781
|
try {
|
|
724
|
-
await fetch(`/api/integrations/${id}`, { method: 'DELETE' });
|
|
782
|
+
const res = await fetch(`/api/integrations/${id}`, { method: 'DELETE' });
|
|
783
|
+
if (!res.ok) {
|
|
784
|
+
const data = await res.json();
|
|
785
|
+
flash(data.error || 'Uninstall failed', 'error');
|
|
786
|
+
setInstalling(null);
|
|
787
|
+
return;
|
|
788
|
+
}
|
|
725
789
|
await fetchIntegrations();
|
|
726
790
|
if (selectedItem?.id === id) {
|
|
727
791
|
setSelectedItem((prev) => prev ? { ...prev, installed: false, configured: false } : null);
|
|
728
792
|
}
|
|
729
|
-
} catch {
|
|
793
|
+
} catch {
|
|
794
|
+
flash('Uninstall failed', 'error');
|
|
795
|
+
}
|
|
730
796
|
setInstalling(null);
|
|
731
797
|
}
|
|
732
798
|
|
|
@@ -746,31 +812,38 @@ export default function IntegrationsStore() {
|
|
|
746
812
|
const statusRes = await fetch('/api/integrations/google-oauth/status');
|
|
747
813
|
const statusData = await statusRes.json();
|
|
748
814
|
if (!statusData.configured) {
|
|
749
|
-
// Need Google OAuth setup first — open the credential modal
|
|
815
|
+
// Need Google OAuth setup first — open the credential modal with setup form
|
|
750
816
|
setSelectedItem(null);
|
|
751
817
|
setConfiguring({ ...item, _googleSetupNeeded: true });
|
|
752
818
|
return;
|
|
753
819
|
}
|
|
754
|
-
} catch {
|
|
820
|
+
} catch {
|
|
821
|
+
// Can't check status — open setup form as fallback
|
|
822
|
+
setSelectedItem(null);
|
|
823
|
+
setConfiguring({ ...item, _googleSetupNeeded: true });
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
755
826
|
}
|
|
756
827
|
|
|
828
|
+
// OAuth is configured — trigger the authentication flow
|
|
757
829
|
setSelectedItem(null);
|
|
830
|
+
setConfiguring({ ...item }); // Show credential modal in connecting state
|
|
758
831
|
try {
|
|
759
832
|
const res = await fetch(`/api/integrations/${item.id}/authenticate`, { method: 'POST' });
|
|
760
833
|
const data = await res.json();
|
|
761
834
|
if (data.ok) {
|
|
762
835
|
flash('Sign-in window opened — check your browser');
|
|
763
836
|
} else {
|
|
764
|
-
flash(data.error || 'Authentication failed');
|
|
837
|
+
flash(data.error || 'Authentication failed', 'error');
|
|
765
838
|
}
|
|
766
839
|
} catch {
|
|
767
|
-
flash('Authentication failed');
|
|
840
|
+
flash('Authentication failed — check daemon logs', 'error');
|
|
768
841
|
}
|
|
769
842
|
}
|
|
770
843
|
|
|
771
|
-
function flash(msg) {
|
|
772
|
-
setStatusMsg(msg);
|
|
773
|
-
setTimeout(() => setStatusMsg(''),
|
|
844
|
+
function flash(msg, type = 'info') {
|
|
845
|
+
setStatusMsg({ text: msg, type });
|
|
846
|
+
setTimeout(() => setStatusMsg(''), 6000);
|
|
774
847
|
}
|
|
775
848
|
|
|
776
849
|
function handleConfigureClose() {
|
|
@@ -821,8 +894,12 @@ export default function IntegrationsStore() {
|
|
|
821
894
|
|
|
822
895
|
{/* Status message */}
|
|
823
896
|
{statusMsg && (
|
|
824
|
-
<div style={{
|
|
825
|
-
|
|
897
|
+
<div style={{
|
|
898
|
+
padding: '8px 20px', fontSize: 12, fontWeight: 500, flexShrink: 0,
|
|
899
|
+
color: statusMsg.type === 'error' ? 'var(--red)' : 'var(--accent)',
|
|
900
|
+
background: statusMsg.type === 'error' ? 'rgba(224, 108, 117, 0.06)' : 'transparent',
|
|
901
|
+
}}>
|
|
902
|
+
{statusMsg.text || statusMsg}
|
|
826
903
|
</div>
|
|
827
904
|
)}
|
|
828
905
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "groove-dev",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.2",
|
|
4
4
|
"description": "Open-source agent orchestration layer — the AI company OS. 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.",
|
|
5
5
|
"license": "FSL-1.1-Apache-2.0",
|
|
6
6
|
"author": "Groove Dev <hello@groovedev.ai> (https://groovedev.ai)",
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
"claude-code",
|
|
23
23
|
"codex",
|
|
24
24
|
"gemini",
|
|
25
|
-
|
|
26
25
|
"ollama",
|
|
27
26
|
"coding-assistant",
|
|
28
27
|
"developer-tools",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@groove-dev/cli",
|
|
3
3
|
"version": "0.11.0",
|
|
4
|
-
"description": "GROOVE CLI
|
|
4
|
+
"description": "GROOVE CLI \u2014 manage AI coding agents from your terminal",
|
|
5
5
|
"license": "FSL-1.1-Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -11,5 +11,6 @@
|
|
|
11
11
|
"@groove-dev/daemon": "*",
|
|
12
12
|
"commander": "^12.1.0",
|
|
13
13
|
"chalk": "^5.3.0"
|
|
14
|
-
}
|
|
15
|
-
|
|
14
|
+
},
|
|
15
|
+
"private": true
|
|
16
|
+
}
|
|
@@ -338,26 +338,6 @@
|
|
|
338
338
|
"ratingCount": 0,
|
|
339
339
|
"verified": "community"
|
|
340
340
|
},
|
|
341
|
-
{
|
|
342
|
-
"id": "filesystem",
|
|
343
|
-
"name": "Filesystem",
|
|
344
|
-
"description": "Read, write, search, and manage files on the local filesystem",
|
|
345
|
-
"category": "developer",
|
|
346
|
-
"icon": "folder",
|
|
347
|
-
"tags": ["files", "filesystem", "local", "storage"],
|
|
348
|
-
"roles": ["backend", "fullstack", "devops"],
|
|
349
|
-
"npmPackage": "@modelcontextprotocol/server-filesystem",
|
|
350
|
-
"transport": "stdio",
|
|
351
|
-
"command": "npx",
|
|
352
|
-
"args": ["-y", "@modelcontextprotocol/server-filesystem"],
|
|
353
|
-
"authType": "none",
|
|
354
|
-
"envKeys": [],
|
|
355
|
-
"featured": false,
|
|
356
|
-
"downloads": 0,
|
|
357
|
-
"rating": 0,
|
|
358
|
-
"ratingCount": 0,
|
|
359
|
-
"verified": "mcp-official"
|
|
360
|
-
},
|
|
361
341
|
{
|
|
362
342
|
"id": "google-maps",
|
|
363
343
|
"name": "Google Maps",
|
|
@@ -385,25 +365,5 @@
|
|
|
385
365
|
"rating": 0,
|
|
386
366
|
"ratingCount": 0,
|
|
387
367
|
"verified": "mcp-official"
|
|
388
|
-
},
|
|
389
|
-
{
|
|
390
|
-
"id": "sqlite",
|
|
391
|
-
"name": "SQLite",
|
|
392
|
-
"description": "Query and manage SQLite databases, inspect schemas, run SQL",
|
|
393
|
-
"category": "database",
|
|
394
|
-
"icon": "database",
|
|
395
|
-
"tags": ["sql", "database", "local", "lightweight"],
|
|
396
|
-
"roles": ["analyst", "backend"],
|
|
397
|
-
"npmPackage": "mcp-sqlite",
|
|
398
|
-
"transport": "stdio",
|
|
399
|
-
"command": "npx",
|
|
400
|
-
"args": ["-y", "mcp-sqlite"],
|
|
401
|
-
"authType": "none",
|
|
402
|
-
"envKeys": [],
|
|
403
|
-
"featured": false,
|
|
404
|
-
"downloads": 0,
|
|
405
|
-
"rating": 0,
|
|
406
|
-
"ratingCount": 0,
|
|
407
|
-
"verified": "mcp-official"
|
|
408
368
|
}
|
|
409
369
|
]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@groove-dev/daemon",
|
|
3
3
|
"version": "0.11.0",
|
|
4
|
-
"description": "GROOVE daemon
|
|
4
|
+
"description": "GROOVE daemon \u2014 agent orchestration engine",
|
|
5
5
|
"license": "FSL-1.1-Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "src/index.js",
|
|
@@ -14,5 +14,6 @@
|
|
|
14
14
|
"ws": "^8.17.0",
|
|
15
15
|
"express": "^4.21.0",
|
|
16
16
|
"minimatch": "^10.0.0"
|
|
17
|
-
}
|
|
18
|
-
|
|
17
|
+
},
|
|
18
|
+
"private": true
|
|
19
|
+
}
|