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.
Files changed (35) hide show
  1. package/dist/oclif/commands/providers/connect.js +4 -1
  2. package/dist/oclif/commands/providers/index.d.ts +1 -0
  3. package/dist/oclif/commands/providers/index.js +9 -1
  4. package/dist/oclif/commands/providers/switch.js +4 -1
  5. package/dist/server/core/domain/entities/provider-config.js +1 -1
  6. package/dist/server/core/domain/entities/provider-registry.js +1 -1
  7. package/dist/server/core/domain/transport/schemas.d.ts +2 -0
  8. package/dist/server/infra/auth/oauth-service.js +2 -0
  9. package/dist/server/infra/auth/oidc-discovery-service.js +1 -0
  10. package/dist/server/infra/cogit/http-cogit-push-service.js +1 -0
  11. package/dist/server/infra/daemon/agent-process.js +4 -11
  12. package/dist/server/infra/daemon/brv-server.js +1 -1
  13. package/dist/server/infra/daemon/task-validation.d.ts +18 -0
  14. package/dist/server/infra/daemon/task-validation.js +42 -0
  15. package/dist/server/infra/http/authenticated-http-client.js +3 -0
  16. package/dist/server/infra/http/models-dev-client.js +1 -0
  17. package/dist/server/infra/http/openrouter-api-client.js +1 -0
  18. package/dist/server/infra/http/provider-model-fetchers.js +3 -0
  19. package/dist/server/infra/hub/hub-install-service.js +1 -0
  20. package/dist/server/infra/hub/hub-registry-service.js +1 -0
  21. package/dist/server/infra/memory/http-memory-storage-service.js +1 -0
  22. package/dist/server/infra/process/feature-handlers.js +1 -0
  23. package/dist/server/infra/provider/provider-config-resolver.d.ts +8 -1
  24. package/dist/server/infra/provider/provider-config-resolver.js +11 -12
  25. package/dist/server/infra/provider-oauth/refresh-token-exchange.js +1 -0
  26. package/dist/server/infra/provider-oauth/token-exchange.js +1 -0
  27. package/dist/server/infra/transport/handlers/provider-handler.d.ts +4 -0
  28. package/dist/server/infra/transport/handlers/provider-handler.js +14 -1
  29. package/dist/shared/transport/events/provider-events.d.ts +4 -0
  30. package/dist/tui/features/onboarding/hooks/use-app-view-mode.d.ts +23 -8
  31. package/dist/tui/features/onboarding/hooks/use-app-view-mode.js +29 -17
  32. package/dist/tui/features/provider/components/provider-flow.d.ts +1 -1
  33. package/dist/tui/features/provider/components/provider-flow.js +39 -4
  34. package/oclif.manifest.json +183 -183
  35. 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
  }