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.
- package/moe-training/client/index.js +1 -0
- package/moe-training/client/step-classifier.js +1 -1
- package/moe-training/client/trajectory-capture.js +52 -7
- package/moe-training/test/client/step-classifier.test.js +42 -0
- package/moe-training/test/client/trajectory-capture.test.js +199 -0
- package/node_modules/@groove-dev/cli/package.json +1 -1
- package/node_modules/@groove-dev/daemon/package.json +1 -1
- package/node_modules/@groove-dev/daemon/src/api.js +21 -7
- package/node_modules/@groove-dev/daemon/src/process.js +54 -0
- package/node_modules/@groove-dev/daemon/src/providers/claude-code.js +7 -7
- package/node_modules/@groove-dev/daemon/src/providers/codex.js +1 -1
- package/node_modules/@groove-dev/daemon/src/providers/gemini.js +1 -1
- package/node_modules/@groove-dev/gui/dist/assets/{index-8gdXdRnq.js → index-BN7fQKaF.js} +23 -23
- package/node_modules/@groove-dev/gui/dist/assets/{index-C1ObKizg.css → index-QwgLRN8B.css} +1 -1
- package/node_modules/@groove-dev/gui/dist/index.html +2 -2
- package/node_modules/@groove-dev/gui/package.json +1 -1
- package/node_modules/@groove-dev/gui/src/components/onboarding/setup-wizard.jsx +6 -0
- package/node_modules/@groove-dev/gui/src/components/settings/ProviderSetupWizard.jsx +57 -7
- package/node_modules/@groove-dev/gui/src/views/settings.jsx +35 -2
- package/node_modules/moe-training/client/index.js +1 -0
- package/node_modules/moe-training/client/step-classifier.js +1 -1
- package/node_modules/moe-training/client/trajectory-capture.js +52 -7
- package/node_modules/moe-training/test/client/step-classifier.test.js +42 -0
- package/node_modules/moe-training/test/client/trajectory-capture.test.js +199 -0
- package/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/api.js +21 -7
- package/packages/daemon/src/process.js +54 -0
- package/packages/daemon/src/providers/claude-code.js +7 -7
- package/packages/daemon/src/providers/codex.js +1 -1
- package/packages/daemon/src/providers/gemini.js +1 -1
- package/packages/gui/dist/assets/{index-8gdXdRnq.js → index-BN7fQKaF.js} +23 -23
- package/packages/gui/dist/assets/{index-C1ObKizg.css → index-QwgLRN8B.css} +1 -1
- package/packages/gui/dist/index.html +2 -2
- package/packages/gui/package.json +1 -1
- package/packages/gui/src/components/onboarding/setup-wizard.jsx +6 -0
- package/packages/gui/src/components/settings/ProviderSetupWizard.jsx +57 -7
- package/packages/gui/src/views/settings.jsx +35 -2
|
@@ -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' &&
|
|
149
|
-
<div className="p-3 bg-
|
|
150
|
-
<p className="text-2xs font-mono text-danger
|
|
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
|
|
265
|
-
|
|
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
|
|
291
|
-
|
|
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
|
-
|
|
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)}
|