groove-dev 0.17.2 → 0.17.3

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.
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>GROOVE</title>
7
- <script type="module" crossorigin src="/assets/index-CEf7nLM2.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-DXy6tMX5.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-BhjOFLBc.css">
9
9
  </head>
10
10
  <body>
@@ -221,106 +221,97 @@ function CredentialModal({ integration, onClose }) {
221
221
  {/* OAuth flow for Google integrations */}
222
222
  {isOAuth && (
223
223
  <div style={{ marginBottom: 16 }}>
224
- {oauthStatus === 'checking' && (
225
- <div style={{ fontSize: 11, color: 'var(--text-muted)', textAlign: 'center', padding: 16 }}>
226
- Checking Google OAuth setup...
227
- </div>
228
- )}
224
+ {/* Always show the primary Connect button */}
225
+ <button
226
+ onClick={oauthStatus === 'ready' ? handleOAuthConnect : () => setShowGoogleSetup(true)}
227
+ disabled={oauthStatus === 'checking' || oauthStatus === 'connecting'}
228
+ style={{
229
+ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
230
+ width: '100%', padding: '12px 16px', marginBottom: 12,
231
+ background: oauthStatus === 'connecting' ? 'var(--bg-active)' : '#4285f4',
232
+ color: '#fff', border: 'none', borderRadius: 6,
233
+ fontSize: 13, fontWeight: 600, cursor: 'pointer',
234
+ fontFamily: 'var(--font)',
235
+ opacity: oauthStatus === 'checking' ? 0.5 : 1,
236
+ }}
237
+ >
238
+ {oauthStatus === 'checking' ? 'Checking...'
239
+ : oauthStatus === 'connecting' ? 'Waiting for authorization...'
240
+ : `Connect with Google`}
241
+ </button>
229
242
 
230
- {oauthStatus === 'not-configured' && !showGoogleSetup && (
243
+ {/* First-time setup: show inline when Connect is clicked and OAuth not configured */}
244
+ {showGoogleSetup && oauthStatus === 'not-configured' && (
231
245
  <div style={{
232
- padding: 16, borderRadius: 8,
233
- background: 'rgba(229, 192, 123, 0.06)', border: '1px solid var(--amber)',
246
+ padding: 14, borderRadius: 8,
247
+ background: 'var(--bg-surface)', border: '1px solid var(--border)',
234
248
  }}>
235
- <div style={{ fontSize: 12, fontWeight: 600, color: 'var(--amber)', marginBottom: 8 }}>
236
- One-time Google setup needed
249
+ <div style={{ fontSize: 11, fontWeight: 600, color: 'var(--text-bright)', marginBottom: 8 }}>
250
+ First-time setup (one time for all Google services)
237
251
  </div>
238
- <div style={{ fontSize: 11, color: 'var(--text-dim)', lineHeight: 1.5, marginBottom: 12 }}>
239
- To connect Google services, you need a Google Cloud project with OAuth credentials.
240
- This is a one-time setup that works for Gmail, Calendar, and Drive.
252
+ <div style={{ fontSize: 10, color: 'var(--text-dim)', lineHeight: 1.6, marginBottom: 10 }}>
253
+ Create a free Google Cloud OAuth app to let Groove connect on your behalf:
241
254
  </div>
255
+
242
256
  <a
243
- href="https://console.cloud.google.com/apis/credentials"
257
+ href="https://console.cloud.google.com/apis/credentials/oauthclient"
244
258
  target="_blank"
245
259
  rel="noopener noreferrer"
246
260
  style={{
247
- display: 'inline-flex', alignItems: 'center', gap: 4,
248
- fontSize: 11, color: 'var(--accent)', textDecoration: 'none',
249
- marginBottom: 12,
261
+ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 6,
262
+ padding: '8px 14px', marginBottom: 10,
263
+ background: 'var(--bg-active)', color: 'var(--accent)',
264
+ border: '1px solid var(--accent)', borderRadius: 6,
265
+ fontSize: 11, fontWeight: 600, textDecoration: 'none',
250
266
  }}
251
267
  >
252
268
  Open Google Cloud Console {'\u2197'}
253
269
  </a>
254
- <div style={{ fontSize: 10, color: 'var(--text-muted)', lineHeight: 1.6, marginBottom: 12 }}>
255
- 1. Create a project (or select existing){'\n'}
256
- 2. Configure OAuth consent screen (External, add your email as test user){'\n'}
257
- 3. Create OAuth Client ID (Desktop app){'\n'}
258
- 4. Copy the Client ID and Client Secret below
270
+
271
+ <div style={{ fontSize: 10, color: 'var(--text-muted)', lineHeight: 1.7, marginBottom: 12 }}>
272
+ 1. Create a project if you don't have one{'\n'}
273
+ 2. Set up OAuth consent screen (External, add your email as test user){'\n'}
274
+ 3. Create credentials {'\u2192'} OAuth client ID {'\u2192'} Desktop app{'\n'}
275
+ 4. Paste the Client ID and Secret below:
259
276
  </div>
260
- <button
261
- onClick={() => setShowGoogleSetup(true)}
262
- style={{ ...modal.saveBtn, width: '100%' }}
263
- >
264
- I have my Client ID and Secret
265
- </button>
266
- </div>
267
- )}
268
277
 
269
- {oauthStatus === 'not-configured' && showGoogleSetup && (
270
- <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
271
- <div>
272
- <label style={modal.label}>Google OAuth Client ID</label>
278
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
273
279
  <input
274
280
  value={googleClientId}
275
281
  onChange={(e) => setGoogleClientId(e.target.value)}
276
- placeholder="123456789.apps.googleusercontent.com"
282
+ placeholder="Client ID (e.g. 123456.apps.googleusercontent.com)"
277
283
  style={modal.input}
278
284
  />
279
- </div>
280
- <div>
281
- <label style={modal.label}>Google OAuth Client Secret</label>
282
285
  <input
283
286
  type="password"
284
287
  value={googleClientSecret}
285
288
  onChange={(e) => setGoogleClientSecret(e.target.value)}
286
- placeholder="GOCSPX-..."
289
+ placeholder="Client Secret (e.g. GOCSPX-...)"
287
290
  style={modal.input}
288
291
  />
292
+ <button
293
+ onClick={async () => {
294
+ await handleGoogleSetup();
295
+ // After saving, immediately trigger the OAuth connect flow
296
+ if (googleClientId && googleClientSecret) {
297
+ setTimeout(() => handleOAuthConnect(), 500);
298
+ }
299
+ }}
300
+ disabled={saving || !googleClientId || !googleClientSecret}
301
+ style={{
302
+ ...modal.saveBtn, width: '100%',
303
+ opacity: saving || !googleClientId || !googleClientSecret ? 0.4 : 1,
304
+ }}
305
+ >
306
+ {saving ? 'Saving...' : 'Save & Connect'}
307
+ </button>
289
308
  </div>
290
- <button
291
- onClick={handleGoogleSetup}
292
- disabled={saving || !googleClientId || !googleClientSecret}
293
- style={{
294
- ...modal.saveBtn, width: '100%',
295
- opacity: saving || !googleClientId || !googleClientSecret ? 0.4 : 1,
296
- }}
297
- >
298
- {saving ? 'Saving...' : 'Save Google OAuth Credentials'}
299
- </button>
300
- <div style={{ fontSize: 9, color: 'var(--text-muted)', textAlign: 'center' }}>
301
- Stored encrypted, only on this machine. One-time setup for all Google integrations.
309
+
310
+ <div style={{ fontSize: 9, color: 'var(--text-muted)', textAlign: 'center', marginTop: 6 }}>
311
+ One-time setup. Works for Gmail, Calendar, and Drive. Encrypted on this machine only.
302
312
  </div>
303
313
  </div>
304
314
  )}
305
-
306
- {(oauthStatus === 'ready' || oauthStatus === 'connecting') && (
307
- <button
308
- onClick={handleOAuthConnect}
309
- disabled={oauthStatus === 'connecting'}
310
- style={{
311
- display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8,
312
- width: '100%', padding: '12px 16px',
313
- background: oauthStatus === 'connecting' ? 'var(--bg-active)' : '#4285f4',
314
- color: '#fff', border: 'none', borderRadius: 6,
315
- fontSize: 13, fontWeight: 600, cursor: 'pointer',
316
- fontFamily: 'var(--font)',
317
- }}
318
- >
319
- {oauthStatus === 'connecting'
320
- ? 'Waiting for authorization...'
321
- : `Connect with Google`}
322
- </button>
323
- )}
324
315
  </div>
325
316
  )}
326
317
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groove-dev",
3
- "version": "0.17.2",
3
+ "version": "0.17.3",
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)",
@@ -107,9 +107,9 @@
107
107
  { "key": "GOOGLE_REFRESH_TOKEN", "label": "Refresh Token", "required": true, "hidden": true }
108
108
  ],
109
109
  "setupSteps": [
110
- "Click 'Connect with Google' below",
111
- "Sign in and authorize Groove to access your calendar",
112
- "That's it your credentials are stored securely"
110
+ "Click 'Connect with Google' below to sign in",
111
+ "Authorize Groove to access your calendar",
112
+ "Done — credentials are encrypted and stored locally"
113
113
  ],
114
114
  "featured": false,
115
115
  "downloads": 0,
@@ -137,9 +137,9 @@
137
137
  { "key": "GOOGLE_REFRESH_TOKEN", "label": "Refresh Token", "required": true, "hidden": true }
138
138
  ],
139
139
  "setupSteps": [
140
- "Click 'Connect with Google' below",
141
- "Sign in and authorize Groove to access your email",
142
- "That's it your credentials are stored securely"
140
+ "Click 'Connect with Google' below to sign in",
141
+ "Authorize Groove to access your email",
142
+ "Done — credentials are encrypted and stored locally"
143
143
  ],
144
144
  "featured": false,
145
145
  "downloads": 0,
@@ -221,9 +221,9 @@
221
221
  { "key": "GOOGLE_REFRESH_TOKEN", "label": "Refresh Token", "required": true, "hidden": true }
222
222
  ],
223
223
  "setupSteps": [
224
- "Click 'Connect with Google' below",
225
- "Sign in and authorize Groove to access your Drive",
226
- "That's it your credentials are stored securely"
224
+ "Click 'Connect with Google' below to sign in",
225
+ "Authorize Groove to access your Drive",
226
+ "Done — credentials are encrypted and stored locally"
227
227
  ],
228
228
  "featured": false,
229
229
  "downloads": 0,