byterover-cli 2.4.1 → 2.5.1
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/dist/oclif/commands/providers/connect.js +4 -1
- package/dist/oclif/commands/providers/index.d.ts +1 -0
- package/dist/oclif/commands/providers/index.js +9 -1
- package/dist/oclif/commands/providers/switch.js +4 -1
- package/dist/server/core/domain/entities/provider-config.js +1 -1
- package/dist/server/core/domain/entities/provider-registry.js +1 -1
- package/dist/server/core/domain/transport/schemas.d.ts +2 -0
- package/dist/server/infra/auth/oauth-service.js +2 -0
- package/dist/server/infra/auth/oidc-discovery-service.js +1 -0
- package/dist/server/infra/cogit/http-cogit-push-service.js +1 -0
- package/dist/server/infra/daemon/agent-process.js +4 -11
- package/dist/server/infra/daemon/brv-server.js +1 -1
- package/dist/server/infra/daemon/task-validation.d.ts +18 -0
- package/dist/server/infra/daemon/task-validation.js +42 -0
- package/dist/server/infra/http/authenticated-http-client.js +3 -0
- package/dist/server/infra/http/models-dev-client.js +1 -0
- package/dist/server/infra/http/openrouter-api-client.js +1 -0
- package/dist/server/infra/http/provider-model-fetchers.js +3 -0
- package/dist/server/infra/hub/hub-install-service.js +1 -0
- package/dist/server/infra/hub/hub-registry-service.js +1 -0
- package/dist/server/infra/memory/http-memory-storage-service.js +1 -0
- package/dist/server/infra/process/feature-handlers.js +1 -0
- package/dist/server/infra/provider/provider-config-resolver.d.ts +8 -1
- package/dist/server/infra/provider/provider-config-resolver.js +11 -12
- package/dist/server/infra/provider-oauth/refresh-token-exchange.js +1 -0
- package/dist/server/infra/provider-oauth/token-exchange.js +1 -0
- package/dist/server/infra/transport/handlers/provider-handler.d.ts +4 -0
- package/dist/server/infra/transport/handlers/provider-handler.js +14 -1
- package/dist/shared/transport/events/provider-events.d.ts +4 -0
- package/dist/tui/features/onboarding/hooks/use-app-view-mode.d.ts +23 -8
- package/dist/tui/features/onboarding/hooks/use-app-view-mode.js +29 -17
- package/dist/tui/features/provider/components/provider-flow.d.ts +1 -1
- package/dist/tui/features/provider/components/provider-flow.js +39 -4
- package/oclif.manifest.json +183 -183
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ProviderFlow Component
|
|
3
3
|
*
|
|
4
4
|
* Multi-step React flow for the /providers command.
|
|
5
|
-
* State machine: loading → select → provider_actions → api_key → connecting → done
|
|
5
|
+
* State machine: loading → select → login_prompt → login → provider_actions → api_key → connecting → done
|
|
6
6
|
*
|
|
7
7
|
* Owns the UX flow — fetches providers, renders selection,
|
|
8
8
|
* handles API key input, and calls connect/setActive mutations.
|
|
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
* ProviderFlow Component
|
|
4
4
|
*
|
|
5
5
|
* Multi-step React flow for the /providers command.
|
|
6
|
-
* State machine: loading → select → provider_actions → api_key → connecting → done
|
|
6
|
+
* State machine: loading → select → login_prompt → login → provider_actions → api_key → connecting → done
|
|
7
7
|
*
|
|
8
8
|
* Owns the UX flow — fetches providers, renders selection,
|
|
9
9
|
* handles API key input, and calls connect/setActive mutations.
|
|
@@ -11,9 +11,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
11
11
|
*/
|
|
12
12
|
import { Box, Text } from 'ink';
|
|
13
13
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
14
|
+
import { InlineConfirm } from '../../../components/inline-prompts/inline-confirm.js';
|
|
14
15
|
import { SelectableList } from '../../../components/selectable-list.js';
|
|
15
16
|
import { useTheme } from '../../../hooks/index.js';
|
|
16
17
|
import { formatTransportError } from '../../../utils/index.js';
|
|
18
|
+
import { LoginFlow } from '../../auth/components/login-flow.js';
|
|
19
|
+
import { useAuthStore } from '../../auth/stores/auth-store.js';
|
|
17
20
|
import { useConnectProvider } from '../api/connect-provider.js';
|
|
18
21
|
import { useDisconnectProvider } from '../api/disconnect-provider.js';
|
|
19
22
|
import { useGetProviders } from '../api/get-providers.js';
|
|
@@ -36,6 +39,7 @@ export const ProviderFlow = ({ hideCancelButton = false, isActive = true, onCanc
|
|
|
36
39
|
const disconnectMutation = useDisconnectProvider();
|
|
37
40
|
const setActiveMutation = useSetActiveProvider();
|
|
38
41
|
const validateMutation = useValidateApiKey();
|
|
42
|
+
const isAuthorized = useAuthStore((s) => s.isAuthorized);
|
|
39
43
|
const providers = data?.providers ?? [];
|
|
40
44
|
// Exit gracefully when providers query fails — don't leave user stuck
|
|
41
45
|
useEffect(() => {
|
|
@@ -98,6 +102,11 @@ export const ProviderFlow = ({ hideCancelButton = false, isActive = true, onCanc
|
|
|
98
102
|
const handleSelect = useCallback(async (provider) => {
|
|
99
103
|
setSelectedProvider(provider);
|
|
100
104
|
setError(null);
|
|
105
|
+
// ByteRover requires authentication
|
|
106
|
+
if (provider.id === 'byterover' && !isAuthorized) {
|
|
107
|
+
setStep('login_prompt');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
101
110
|
// ByteRover + already active → complete
|
|
102
111
|
if (provider.id === 'byterover' && provider.isCurrent) {
|
|
103
112
|
onComplete(`Connected to ${provider.name}`);
|
|
@@ -108,11 +117,12 @@ export const ProviderFlow = ({ hideCancelButton = false, isActive = true, onCanc
|
|
|
108
117
|
setStep('provider_actions');
|
|
109
118
|
return;
|
|
110
119
|
}
|
|
111
|
-
// ByteRover + not connected → connect directly, no model select
|
|
120
|
+
// ByteRover + not connected → connect + activate directly, no model select
|
|
112
121
|
if (provider.id === 'byterover') {
|
|
113
122
|
setStep('connecting');
|
|
114
123
|
try {
|
|
115
124
|
await connectMutation.mutateAsync({ providerId: provider.id });
|
|
125
|
+
await setActiveMutation.mutateAsync({ providerId: provider.id });
|
|
116
126
|
onComplete(`Connected to ${provider.name}`);
|
|
117
127
|
}
|
|
118
128
|
catch (error_) {
|
|
@@ -146,12 +156,16 @@ export const ProviderFlow = ({ hideCancelButton = false, isActive = true, onCanc
|
|
|
146
156
|
setError(formatTransportError(error_));
|
|
147
157
|
setStep('select');
|
|
148
158
|
}
|
|
149
|
-
}, [connectMutation, onComplete]);
|
|
159
|
+
}, [connectMutation, isAuthorized, onComplete, setActiveMutation]);
|
|
150
160
|
const handleAction = useCallback(async (action) => {
|
|
151
161
|
if (!selectedProvider)
|
|
152
162
|
return;
|
|
153
163
|
switch (action.id) {
|
|
154
164
|
case 'activate': {
|
|
165
|
+
if (selectedProvider.id === 'byterover' && !isAuthorized) {
|
|
166
|
+
setStep('login_prompt');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
155
169
|
setStep('connecting');
|
|
156
170
|
try {
|
|
157
171
|
await setActiveMutation.mutateAsync({ providerId: selectedProvider.id });
|
|
@@ -199,7 +213,14 @@ export const ProviderFlow = ({ hideCancelButton = false, isActive = true, onCanc
|
|
|
199
213
|
break;
|
|
200
214
|
}
|
|
201
215
|
}
|
|
202
|
-
}, [disconnectMutation, onComplete, selectedProvider, setActiveMutation]);
|
|
216
|
+
}, [disconnectMutation, isAuthorized, onComplete, selectedProvider, setActiveMutation]);
|
|
217
|
+
const handleLoginComplete = useCallback((message) => {
|
|
218
|
+
const nowAuthorized = useAuthStore.getState().isAuthorized;
|
|
219
|
+
if (!nowAuthorized) {
|
|
220
|
+
setError(message);
|
|
221
|
+
}
|
|
222
|
+
setStep('select');
|
|
223
|
+
}, []);
|
|
203
224
|
const handleBaseUrlSubmit = useCallback((url) => {
|
|
204
225
|
setBaseUrl(url);
|
|
205
226
|
setStep('api_key');
|
|
@@ -285,6 +306,20 @@ export const ProviderFlow = ({ hideCancelButton = false, isActive = true, onCanc
|
|
|
285
306
|
case 'connecting': {
|
|
286
307
|
return (_jsx(Box, { children: _jsxs(Text, { color: colors.primary, children: ["Connecting to ", selectedProvider?.name, "..."] }) }));
|
|
287
308
|
}
|
|
309
|
+
case 'login': {
|
|
310
|
+
return (_jsx(LoginFlow, { onCancel: () => { }, onComplete: handleLoginComplete }));
|
|
311
|
+
}
|
|
312
|
+
case 'login_prompt': {
|
|
313
|
+
return (_jsx(InlineConfirm, { default: true, message: "ByteRover requires authentication. Sign in now", onConfirm: (confirmed) => {
|
|
314
|
+
if (confirmed) {
|
|
315
|
+
setStep('login');
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
setStep('select');
|
|
319
|
+
setSelectedProvider(null);
|
|
320
|
+
}
|
|
321
|
+
} }));
|
|
322
|
+
}
|
|
288
323
|
case 'model_select': {
|
|
289
324
|
return selectedProvider ? (_jsx(ModelSelectStep, { isActive: isActive, onCancel: () => setStep('select'), onComplete: (modelName) => onComplete(`Connected to ${selectedProvider.name}, model set to ${modelName}`), providerId: selectedProvider.id, providerName: selectedProvider.name })) : null;
|
|
290
325
|
}
|