groove-dev 0.27.103 → 0.27.106

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/moe-training/client/index.js +1 -0
  2. package/moe-training/client/step-classifier.js +1 -1
  3. package/moe-training/client/trajectory-capture.js +52 -7
  4. package/moe-training/test/client/step-classifier.test.js +42 -0
  5. package/moe-training/test/client/trajectory-capture.test.js +199 -0
  6. package/node_modules/@groove-dev/cli/package.json +1 -1
  7. package/node_modules/@groove-dev/daemon/package.json +1 -1
  8. package/node_modules/@groove-dev/daemon/src/api.js +21 -7
  9. package/node_modules/@groove-dev/daemon/src/process.js +54 -0
  10. package/node_modules/@groove-dev/daemon/src/providers/claude-code.js +7 -7
  11. package/node_modules/@groove-dev/daemon/src/providers/codex.js +1 -1
  12. package/node_modules/@groove-dev/daemon/src/providers/gemini.js +1 -1
  13. package/node_modules/@groove-dev/gui/dist/assets/{index-8gdXdRnq.js → index-BN7fQKaF.js} +23 -23
  14. package/node_modules/@groove-dev/gui/dist/assets/{index-C1ObKizg.css → index-QwgLRN8B.css} +1 -1
  15. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  16. package/node_modules/@groove-dev/gui/package.json +1 -1
  17. package/node_modules/@groove-dev/gui/src/components/onboarding/setup-wizard.jsx +6 -0
  18. package/node_modules/@groove-dev/gui/src/components/settings/ProviderSetupWizard.jsx +57 -7
  19. package/node_modules/@groove-dev/gui/src/views/settings.jsx +35 -2
  20. package/node_modules/moe-training/client/index.js +1 -0
  21. package/node_modules/moe-training/client/step-classifier.js +1 -1
  22. package/node_modules/moe-training/client/trajectory-capture.js +52 -7
  23. package/node_modules/moe-training/test/client/step-classifier.test.js +42 -0
  24. package/node_modules/moe-training/test/client/trajectory-capture.test.js +199 -0
  25. package/package.json +1 -1
  26. package/packages/cli/package.json +1 -1
  27. package/packages/daemon/package.json +1 -1
  28. package/packages/daemon/src/api.js +21 -7
  29. package/packages/daemon/src/process.js +54 -0
  30. package/packages/daemon/src/providers/claude-code.js +7 -7
  31. package/packages/daemon/src/providers/codex.js +1 -1
  32. package/packages/daemon/src/providers/gemini.js +1 -1
  33. package/packages/gui/dist/assets/{index-8gdXdRnq.js → index-BN7fQKaF.js} +23 -23
  34. package/packages/gui/dist/assets/{index-C1ObKizg.css → index-QwgLRN8B.css} +1 -1
  35. package/packages/gui/dist/index.html +2 -2
  36. package/packages/gui/package.json +1 -1
  37. package/packages/gui/src/components/onboarding/setup-wizard.jsx +6 -0
  38. package/packages/gui/src/components/settings/ProviderSetupWizard.jsx +57 -7
  39. package/packages/gui/src/views/settings.jsx +35 -2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/gui",
3
- "version": "0.27.103",
3
+ "version": "0.27.106",
4
4
  "description": "GROOVE GUI — visual agent control plane",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -131,7 +131,13 @@ function ProjectFolderStep({ selectedDir, onSelectDir }) {
131
131
  const remoteHomedir = useGrooveStore((s) => s.remoteHomedir);
132
132
  const [browsing, setBrowsing] = useState(false);
133
133
 
134
+ const isRemote = new URLSearchParams(window.location.search).has('instance');
135
+
134
136
  async function handleBrowse() {
137
+ if (isRemote) {
138
+ setBrowsing(true);
139
+ return;
140
+ }
135
141
  const dir = await selectFolder({
136
142
  title: 'Choose your project folder',
137
143
  defaultPath: selectedDir || undefined,
@@ -145,9 +145,9 @@ function InstallStep({ providerId, meta }) {
145
145
 
146
146
  {hasError && (
147
147
  <div className="space-y-3">
148
- {typeof hasError === 'string' && hasError.length > 40 && (
149
- <div className="p-3 bg-surface-0 border border-border-subtle rounded-md max-h-24 overflow-y-auto">
150
- <p className="text-2xs font-mono text-danger/80 whitespace-pre-wrap break-all">{hasError}</p>
148
+ {typeof hasError === 'string' && (
149
+ <div className="p-3 bg-danger/5 border border-danger/20 rounded-md max-h-32 overflow-y-auto">
150
+ <p className="text-2xs font-mono text-danger whitespace-pre-wrap break-all">{hasError}</p>
151
151
  </div>
152
152
  )}
153
153
  <p className="text-xs text-text-2 font-sans">Check that npm is in your PATH and try again.</p>
@@ -172,6 +172,8 @@ function AuthenticateStep({ providerId, meta, onSaveKey }) {
172
172
  const [showKey, setShowKey] = useState(false);
173
173
  const [saving, setSaving] = useState(false);
174
174
  const [loginStarted, setLoginStarted] = useState(false);
175
+ const [verifying, setVerifying] = useState(false);
176
+ const [verifyError, setVerifyError] = useState('');
175
177
  const [authMode, setAuthMode] = useState(meta.authType === 'subscription' ? 'subscription' : 'apikey');
176
178
 
177
179
  async function handleSaveKey() {
@@ -261,9 +263,33 @@ function AuthenticateStep({ providerId, meta, onSaveKey }) {
261
263
  <ExternalLink size={12} className="text-accent" />
262
264
  <span className="text-xs text-accent font-sans">Sign-in opened in your browser</span>
263
265
  </div>
264
- <Button variant="primary" size="sm" onClick={onSaveKey} className="gap-1.5">
265
- <Check size={11} /> I've signed in
266
+ <Button
267
+ variant="primary"
268
+ size="sm"
269
+ disabled={verifying}
270
+ onClick={async () => {
271
+ setVerifying(true);
272
+ setVerifyError('');
273
+ try {
274
+ const res = await api.post(`/providers/${providerId}/verify`);
275
+ if (res.authenticated) {
276
+ onSaveKey();
277
+ } else {
278
+ setVerifyError('Authentication not detected yet. Please complete sign-in in your browser and try again.');
279
+ }
280
+ } catch {
281
+ setVerifyError('Authentication not detected yet. Please complete sign-in in your browser and try again.');
282
+ } finally {
283
+ setVerifying(false);
284
+ }
285
+ }}
286
+ className="gap-1.5"
287
+ >
288
+ {verifying ? <Loader2 size={11} className="animate-spin" /> : <Check size={11} />} I've signed in
266
289
  </Button>
290
+ {verifyError && (
291
+ <p className="text-2xs text-danger font-sans">{verifyError}</p>
292
+ )}
267
293
  </div>
268
294
  )}
269
295
  <p className="text-2xs text-text-4 font-sans">
@@ -287,9 +313,33 @@ function AuthenticateStep({ providerId, meta, onSaveKey }) {
287
313
  <ExternalLink size={12} className="text-accent" />
288
314
  <span className="text-xs text-accent font-sans">Sign-in opened in your browser</span>
289
315
  </div>
290
- <Button variant="primary" size="sm" onClick={onSaveKey} className="gap-1.5">
291
- <Check size={11} /> I've signed in
316
+ <Button
317
+ variant="primary"
318
+ size="sm"
319
+ disabled={verifying}
320
+ onClick={async () => {
321
+ setVerifying(true);
322
+ setVerifyError('');
323
+ try {
324
+ const res = await api.post(`/providers/codex/verify`);
325
+ if (res.authenticated) {
326
+ onSaveKey();
327
+ } else {
328
+ setVerifyError('Authentication not detected yet. Please complete sign-in in your browser and try again.');
329
+ }
330
+ } catch {
331
+ setVerifyError('Authentication not detected yet. Please complete sign-in in your browser and try again.');
332
+ } finally {
333
+ setVerifying(false);
334
+ }
335
+ }}
336
+ className="gap-1.5"
337
+ >
338
+ {verifying ? <Loader2 size={11} className="animate-spin" /> : <Check size={11} />} I've signed in
292
339
  </Button>
340
+ {verifyError && (
341
+ <p className="text-2xs text-danger font-sans">{verifyError}</p>
342
+ )}
293
343
  </div>
294
344
  )}
295
345
  </div>
@@ -454,10 +454,43 @@ function ProviderCard({ provider, onKeyChange }) {
454
454
  <Button
455
455
  variant="primary"
456
456
  size="sm"
457
- onClick={() => { setLoginPending(false); if (onKeyChange) onKeyChange(); }}
457
+ disabled={checking}
458
+ onClick={async () => {
459
+ if (provider.id === 'codex') {
460
+ setChecking(true);
461
+ try {
462
+ const res = await api.post(`/providers/codex/verify`);
463
+ if (res.authenticated) {
464
+ setLoginPending(false);
465
+ if (onKeyChange) onKeyChange();
466
+ } else {
467
+ addToast('error', 'Authentication not detected yet. Please complete sign-in in your browser and try again.');
468
+ }
469
+ } catch {
470
+ addToast('error', 'Authentication not detected yet. Please complete sign-in in your browser and try again.');
471
+ } finally {
472
+ setChecking(false);
473
+ }
474
+ } else {
475
+ setChecking(true);
476
+ try {
477
+ const res = await api.post(`/providers/claude-code/verify`);
478
+ if (res.authenticated) {
479
+ setLoginPending(false);
480
+ if (onKeyChange) onKeyChange();
481
+ } else {
482
+ addToast('error', 'Authentication not detected yet. Please complete sign-in in your browser and try again.');
483
+ }
484
+ } catch {
485
+ addToast('error', 'Authentication not detected yet. Please complete sign-in in your browser and try again.');
486
+ } finally {
487
+ setChecking(false);
488
+ }
489
+ }
490
+ }}
458
491
  className="w-full h-8 text-xs gap-1.5"
459
492
  >
460
- <Check size={12} /> I've signed in
493
+ {checking ? <Loader2 size={12} className="animate-spin" /> : <Check size={12} />} I've signed in
461
494
  </Button>
462
495
  <button
463
496
  onClick={() => setLoginPending(false)}