@google/gemini-cli 0.21.0-preview.6 → 0.21.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/package.json +2 -2
- package/dist/src/config/config.js +4 -2
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +1 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/settings.test.js +4 -4
- package/dist/src/config/settings.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +1 -1
- package/dist/src/config/settingsSchema.js +2 -2
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/test-utils/render.js +1 -0
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/AppContainer.js +6 -17
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +156 -30
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.js +10 -5
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.test.js +12 -1
- package/dist/src/ui/commands/modelCommand.test.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.js +2 -6
- package/dist/src/ui/commands/statsCommand.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.test.js +14 -0
- package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +2 -2
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.js +116 -39
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.test.js +157 -148
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.js +14 -12
- package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.test.js +20 -21
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.js +20 -21
- package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +7 -7
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.js +1 -1
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/google-gemini-cli-0.21.0-preview.5.tgz +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useContext, useMemo } from 'react';
|
|
2
|
+
import { useCallback, useContext, useMemo, useState } from 'react';
|
|
3
3
|
import { Box, Text } from 'ink';
|
|
4
|
-
import { PREVIEW_GEMINI_MODEL, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_FLASH_LITE_MODEL, DEFAULT_GEMINI_MODEL_AUTO,
|
|
4
|
+
import { PREVIEW_GEMINI_MODEL, PREVIEW_GEMINI_FLASH_MODEL, PREVIEW_GEMINI_MODEL_AUTO, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_FLASH_LITE_MODEL, DEFAULT_GEMINI_MODEL_AUTO, ModelSlashCommandEvent, logModelSlashCommand, getDisplayString, } from '@google/gemini-cli-core';
|
|
5
5
|
import { useKeypress } from '../hooks/useKeypress.js';
|
|
6
6
|
import { theme } from '../semantic-colors.js';
|
|
7
7
|
import { DescriptiveRadioButtonSelect } from './shared/DescriptiveRadioButtonSelect.js';
|
|
@@ -9,45 +9,110 @@ import { ConfigContext } from '../contexts/ConfigContext.js';
|
|
|
9
9
|
import { ThemedGradient } from './ThemedGradient.js';
|
|
10
10
|
export function ModelDialog({ onClose }) {
|
|
11
11
|
const config = useContext(ConfigContext);
|
|
12
|
+
const [view, setView] = useState('main');
|
|
12
13
|
// Determine the Preferred Model (read once when the dialog opens).
|
|
13
14
|
const preferredModel = config?.getModel() || DEFAULT_GEMINI_MODEL_AUTO;
|
|
15
|
+
const shouldShowPreviewModels = config?.getPreviewFeatures() && config.getHasAccessToPreviewModel();
|
|
16
|
+
const manualModelSelected = useMemo(() => {
|
|
17
|
+
const manualModels = [
|
|
18
|
+
DEFAULT_GEMINI_MODEL,
|
|
19
|
+
DEFAULT_GEMINI_FLASH_MODEL,
|
|
20
|
+
DEFAULT_GEMINI_FLASH_LITE_MODEL,
|
|
21
|
+
PREVIEW_GEMINI_MODEL,
|
|
22
|
+
PREVIEW_GEMINI_FLASH_MODEL,
|
|
23
|
+
];
|
|
24
|
+
if (manualModels.includes(preferredModel)) {
|
|
25
|
+
return preferredModel;
|
|
26
|
+
}
|
|
27
|
+
return '';
|
|
28
|
+
}, [preferredModel]);
|
|
14
29
|
useKeypress((key) => {
|
|
15
30
|
if (key.name === 'escape') {
|
|
16
|
-
|
|
31
|
+
if (view === 'manual') {
|
|
32
|
+
setView('main');
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
onClose();
|
|
36
|
+
}
|
|
17
37
|
}
|
|
18
38
|
}, { isActive: true });
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
const mainOptions = useMemo(() => {
|
|
40
|
+
const list = [
|
|
41
|
+
{
|
|
42
|
+
value: DEFAULT_GEMINI_MODEL_AUTO,
|
|
43
|
+
title: getDisplayString(DEFAULT_GEMINI_MODEL_AUTO),
|
|
44
|
+
description: 'Let Gemini CLI decide the best model for the task: gemini-2.5-pro, gemini-2.5-flash',
|
|
45
|
+
key: DEFAULT_GEMINI_MODEL_AUTO,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
value: 'Manual',
|
|
49
|
+
title: manualModelSelected
|
|
50
|
+
? `Manual (${manualModelSelected})`
|
|
51
|
+
: 'Manual',
|
|
52
|
+
description: 'Manually select a model',
|
|
53
|
+
key: 'Manual',
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
if (shouldShowPreviewModels) {
|
|
57
|
+
list.unshift({
|
|
58
|
+
value: PREVIEW_GEMINI_MODEL_AUTO,
|
|
59
|
+
title: getDisplayString(PREVIEW_GEMINI_MODEL_AUTO),
|
|
60
|
+
description: 'Let Gemini CLI decide the best model for the task: gemini-3-pro, gemini-3-flash',
|
|
61
|
+
key: PREVIEW_GEMINI_MODEL_AUTO,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return list;
|
|
65
|
+
}, [shouldShowPreviewModels, manualModelSelected]);
|
|
66
|
+
const manualOptions = useMemo(() => {
|
|
67
|
+
const list = [
|
|
68
|
+
{
|
|
69
|
+
value: DEFAULT_GEMINI_MODEL,
|
|
70
|
+
title: DEFAULT_GEMINI_MODEL,
|
|
71
|
+
key: DEFAULT_GEMINI_MODEL,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
value: DEFAULT_GEMINI_FLASH_MODEL,
|
|
75
|
+
title: DEFAULT_GEMINI_FLASH_MODEL,
|
|
76
|
+
key: DEFAULT_GEMINI_FLASH_MODEL,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
value: DEFAULT_GEMINI_FLASH_LITE_MODEL,
|
|
80
|
+
title: DEFAULT_GEMINI_FLASH_LITE_MODEL,
|
|
81
|
+
key: DEFAULT_GEMINI_FLASH_LITE_MODEL,
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
if (shouldShowPreviewModels) {
|
|
85
|
+
list.unshift({
|
|
86
|
+
value: PREVIEW_GEMINI_MODEL,
|
|
87
|
+
title: PREVIEW_GEMINI_MODEL,
|
|
88
|
+
key: PREVIEW_GEMINI_MODEL,
|
|
89
|
+
}, {
|
|
90
|
+
value: PREVIEW_GEMINI_FLASH_MODEL,
|
|
91
|
+
title: PREVIEW_GEMINI_FLASH_MODEL,
|
|
92
|
+
key: PREVIEW_GEMINI_FLASH_MODEL,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return list;
|
|
96
|
+
}, [shouldShowPreviewModels]);
|
|
97
|
+
const options = view === 'main' ? mainOptions : manualOptions;
|
|
47
98
|
// Calculate the initial index based on the preferred model.
|
|
48
|
-
const initialIndex = useMemo(() =>
|
|
99
|
+
const initialIndex = useMemo(() => {
|
|
100
|
+
const idx = options.findIndex((option) => option.value === preferredModel);
|
|
101
|
+
if (idx !== -1) {
|
|
102
|
+
return idx;
|
|
103
|
+
}
|
|
104
|
+
if (view === 'main') {
|
|
105
|
+
const manualIdx = options.findIndex((o) => o.value === 'Manual');
|
|
106
|
+
return manualIdx !== -1 ? manualIdx : 0;
|
|
107
|
+
}
|
|
108
|
+
return 0;
|
|
109
|
+
}, [preferredModel, options, view]);
|
|
49
110
|
// Handle selection internally (Autonomous Dialog).
|
|
50
111
|
const handleSelect = useCallback((model) => {
|
|
112
|
+
if (model === 'Manual') {
|
|
113
|
+
setView('manual');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
51
116
|
if (config) {
|
|
52
117
|
config.setModel(model);
|
|
53
118
|
const event = new ModelSlashCommandEvent(model);
|
|
@@ -55,12 +120,24 @@ export function ModelDialog({ onClose }) {
|
|
|
55
120
|
}
|
|
56
121
|
onClose();
|
|
57
122
|
}, [config, onClose]);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
123
|
+
let header;
|
|
124
|
+
let subheader;
|
|
125
|
+
// Do not show any header or subheader since it's already showing preview model
|
|
126
|
+
// options
|
|
127
|
+
if (shouldShowPreviewModels) {
|
|
128
|
+
header = undefined;
|
|
129
|
+
subheader = undefined;
|
|
130
|
+
// When a user has the access but has not enabled the preview features.
|
|
131
|
+
}
|
|
132
|
+
else if (config?.getHasAccessToPreviewModel()) {
|
|
133
|
+
header = 'Gemini 3 is now available.';
|
|
134
|
+
subheader =
|
|
135
|
+
'Enable "Preview features" in /settings.\nLearn more at https://goo.gle/enable-preview-features';
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
header = 'Gemini 3 is coming soon.';
|
|
139
|
+
subheader = undefined;
|
|
140
|
+
}
|
|
141
|
+
return (_jsxs(Box, { borderStyle: "round", borderColor: theme.border.default, flexDirection: "column", padding: 1, width: "100%", children: [_jsx(Text, { bold: true, children: "Select Model" }), _jsxs(Box, { flexDirection: "column", children: [header && (_jsx(Box, { marginTop: 1, children: _jsx(ThemedGradient, { children: _jsx(Text, { children: header }) }) })), subheader && _jsx(Text, { children: subheader })] }), _jsx(Box, { marginTop: 1, children: _jsx(DescriptiveRadioButtonSelect, { items: options, onSelect: handleSelect, initialIndex: initialIndex, showNumbers: true }) }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: _jsx(Text, { color: theme.text.secondary, children: 'To use a specific Gemini model on startup, use the --model flag.' }) }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: _jsx(Text, { color: theme.text.secondary, children: "(Press Esc to close)" }) })] }));
|
|
65
142
|
}
|
|
66
143
|
//# sourceMappingURL=ModelDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelDialog.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ModelDialog.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,171 +4,180 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
4
4
|
* Copyright 2025 Google LLC
|
|
5
5
|
* SPDX-License-Identifier: Apache-2.0
|
|
6
6
|
*/
|
|
7
|
-
import { render } from '
|
|
8
|
-
import {
|
|
9
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
10
|
-
import { GEMINI_MODEL_ALIAS_FLASH_LITE, GEMINI_MODEL_ALIAS_FLASH, GEMINI_MODEL_ALIAS_PRO, DEFAULT_GEMINI_MODEL_AUTO, } from '@google/gemini-cli-core';
|
|
7
|
+
import { render } from 'ink-testing-library';
|
|
8
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
11
9
|
import { ModelDialog } from './ModelDialog.js';
|
|
12
|
-
import { useKeypress } from '../hooks/useKeypress.js';
|
|
13
|
-
import { DescriptiveRadioButtonSelect } from './shared/DescriptiveRadioButtonSelect.js';
|
|
14
10
|
import { ConfigContext } from '../contexts/ConfigContext.js';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
vi.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
const renderComponent = (props = {}, contextValue = undefined) => {
|
|
24
|
-
const defaultProps = {
|
|
25
|
-
onClose: vi.fn(),
|
|
26
|
-
};
|
|
27
|
-
const combinedProps = { ...defaultProps, ...props };
|
|
28
|
-
const mockConfig = contextValue
|
|
29
|
-
? {
|
|
30
|
-
// --- Functions used by ModelDialog ---
|
|
31
|
-
getModel: vi.fn(() => DEFAULT_GEMINI_MODEL_AUTO),
|
|
32
|
-
setModel: vi.fn(),
|
|
33
|
-
getPreviewFeatures: vi.fn(() => false),
|
|
34
|
-
// --- Functions used by ClearcutLogger ---
|
|
35
|
-
getUsageStatisticsEnabled: vi.fn(() => true),
|
|
36
|
-
getSessionId: vi.fn(() => 'mock-session-id'),
|
|
37
|
-
getDebugMode: vi.fn(() => false),
|
|
38
|
-
getContentGeneratorConfig: vi.fn(() => ({ authType: 'mock' })),
|
|
39
|
-
getUseSmartEdit: vi.fn(() => false),
|
|
40
|
-
getProxy: vi.fn(() => undefined),
|
|
41
|
-
isInteractive: vi.fn(() => false),
|
|
42
|
-
getExperiments: () => { },
|
|
43
|
-
// --- Spread test-specific overrides ---
|
|
44
|
-
...contextValue,
|
|
45
|
-
}
|
|
46
|
-
: undefined;
|
|
47
|
-
const renderResult = render(_jsx(ConfigContext.Provider, { value: mockConfig, children: _jsx(ModelDialog, { ...combinedProps }) }));
|
|
11
|
+
import { KeypressProvider } from '../contexts/KeypressContext.js';
|
|
12
|
+
import { DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_MODEL_AUTO, DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_FLASH_LITE_MODEL, PREVIEW_GEMINI_MODEL, PREVIEW_GEMINI_MODEL_AUTO, } from '@google/gemini-cli-core';
|
|
13
|
+
// Mock dependencies
|
|
14
|
+
const mockGetDisplayString = vi.fn();
|
|
15
|
+
const mockLogModelSlashCommand = vi.fn();
|
|
16
|
+
const mockModelSlashCommandEvent = vi.fn();
|
|
17
|
+
vi.mock('@google/gemini-cli-core', async () => {
|
|
18
|
+
const actual = await vi.importActual('@google/gemini-cli-core');
|
|
48
19
|
return {
|
|
49
|
-
...
|
|
50
|
-
|
|
51
|
-
|
|
20
|
+
...actual,
|
|
21
|
+
getDisplayString: (val) => mockGetDisplayString(val),
|
|
22
|
+
logModelSlashCommand: (config, event) => mockLogModelSlashCommand(config, event),
|
|
23
|
+
ModelSlashCommandEvent: class {
|
|
24
|
+
constructor(model) {
|
|
25
|
+
mockModelSlashCommandEvent(model);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
52
28
|
};
|
|
53
|
-
};
|
|
29
|
+
});
|
|
54
30
|
describe('<ModelDialog />', () => {
|
|
31
|
+
const mockSetModel = vi.fn();
|
|
32
|
+
const mockGetModel = vi.fn();
|
|
33
|
+
const mockGetPreviewFeatures = vi.fn();
|
|
34
|
+
const mockOnClose = vi.fn();
|
|
35
|
+
const mockGetHasAccessToPreviewModel = vi.fn();
|
|
36
|
+
const mockConfig = {
|
|
37
|
+
setModel: mockSetModel,
|
|
38
|
+
getModel: mockGetModel,
|
|
39
|
+
getPreviewFeatures: mockGetPreviewFeatures,
|
|
40
|
+
getHasAccessToPreviewModel: mockGetHasAccessToPreviewModel,
|
|
41
|
+
};
|
|
55
42
|
beforeEach(() => {
|
|
56
|
-
vi.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
43
|
+
vi.resetAllMocks();
|
|
44
|
+
mockGetModel.mockReturnValue(DEFAULT_GEMINI_MODEL_AUTO);
|
|
45
|
+
mockGetPreviewFeatures.mockReturnValue(false);
|
|
46
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(false);
|
|
47
|
+
// Default implementation for getDisplayString
|
|
48
|
+
mockGetDisplayString.mockImplementation((val) => {
|
|
49
|
+
if (val === 'auto-gemini-2.5')
|
|
50
|
+
return 'Auto (Gemini 2.5)';
|
|
51
|
+
if (val === 'auto-gemini-3')
|
|
52
|
+
return 'Auto (Preview)';
|
|
53
|
+
return val;
|
|
54
|
+
});
|
|
60
55
|
});
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
const renderComponent = (contextValue = mockConfig) => render(_jsx(KeypressProvider, { children: _jsx(ConfigContext.Provider, { value: contextValue, children: _jsx(ModelDialog, { onClose: mockOnClose }) }) }));
|
|
57
|
+
const waitForUpdate = () => new Promise((resolve) => setTimeout(resolve, 150));
|
|
58
|
+
it('renders the initial "main" view correctly', () => {
|
|
59
|
+
const { lastFrame } = renderComponent();
|
|
63
60
|
expect(lastFrame()).toContain('Select Model');
|
|
64
|
-
expect(lastFrame()).toContain('
|
|
65
|
-
expect(lastFrame()).toContain('
|
|
66
|
-
|
|
61
|
+
expect(lastFrame()).toContain('Auto');
|
|
62
|
+
expect(lastFrame()).toContain('Manual');
|
|
63
|
+
});
|
|
64
|
+
it('renders "main" view with preview options when preview features are enabled', () => {
|
|
65
|
+
mockGetPreviewFeatures.mockReturnValue(true);
|
|
66
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(true); // Must have access
|
|
67
|
+
const { lastFrame } = renderComponent();
|
|
68
|
+
expect(lastFrame()).toContain('Auto (Preview)');
|
|
67
69
|
});
|
|
68
|
-
it('
|
|
69
|
-
const {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
70
|
+
it('switches to "manual" view when "Manual" is selected', async () => {
|
|
71
|
+
const { lastFrame, stdin } = renderComponent();
|
|
72
|
+
// Select "Manual" (index 1)
|
|
73
|
+
// Press down arrow to move to "Manual"
|
|
74
|
+
stdin.write('\u001B[B'); // Arrow Down
|
|
75
|
+
await waitForUpdate();
|
|
76
|
+
// Press enter to select
|
|
77
|
+
stdin.write('\r');
|
|
78
|
+
await waitForUpdate();
|
|
79
|
+
// Should now show manual options
|
|
80
|
+
expect(lastFrame()).toContain(DEFAULT_GEMINI_MODEL);
|
|
81
|
+
expect(lastFrame()).toContain(DEFAULT_GEMINI_FLASH_MODEL);
|
|
82
|
+
expect(lastFrame()).toContain(DEFAULT_GEMINI_FLASH_LITE_MODEL);
|
|
79
83
|
});
|
|
80
|
-
it('
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
it('renders "manual" view with preview options when preview features are enabled', async () => {
|
|
85
|
+
mockGetPreviewFeatures.mockReturnValue(true);
|
|
86
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(true); // Must have access
|
|
87
|
+
mockGetModel.mockReturnValue(PREVIEW_GEMINI_MODEL_AUTO);
|
|
88
|
+
const { lastFrame, stdin } = renderComponent();
|
|
89
|
+
// Select "Manual" (index 2 because Preview Auto is first, then Auto (Gemini 2.5))
|
|
90
|
+
// Press down enough times to ensure we reach the bottom (Manual)
|
|
91
|
+
stdin.write('\u001B[B'); // Arrow Down
|
|
92
|
+
await waitForUpdate();
|
|
93
|
+
stdin.write('\u001B[B'); // Arrow Down
|
|
94
|
+
await waitForUpdate();
|
|
95
|
+
// Press enter to select Manual
|
|
96
|
+
stdin.write('\r');
|
|
97
|
+
await waitForUpdate();
|
|
98
|
+
expect(lastFrame()).toContain(PREVIEW_GEMINI_MODEL);
|
|
88
99
|
});
|
|
89
|
-
it('
|
|
90
|
-
const {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
100
|
+
it('sets model and closes when a model is selected in "main" view', async () => {
|
|
101
|
+
const { stdin } = renderComponent();
|
|
102
|
+
// Select "Auto" (index 0)
|
|
103
|
+
stdin.write('\r');
|
|
104
|
+
await waitForUpdate();
|
|
105
|
+
expect(mockSetModel).toHaveBeenCalledWith(DEFAULT_GEMINI_MODEL_AUTO);
|
|
106
|
+
expect(mockOnClose).toHaveBeenCalled();
|
|
95
107
|
});
|
|
96
|
-
it('
|
|
97
|
-
const
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
//
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
expect(
|
|
108
|
-
unmount();
|
|
108
|
+
it('sets model and closes when a model is selected in "manual" view', async () => {
|
|
109
|
+
const { stdin } = renderComponent();
|
|
110
|
+
// Navigate to Manual (index 1) and select
|
|
111
|
+
stdin.write('\u001B[B');
|
|
112
|
+
await waitForUpdate();
|
|
113
|
+
stdin.write('\r');
|
|
114
|
+
await waitForUpdate();
|
|
115
|
+
// Now in manual view. Default selection is first item (DEFAULT_GEMINI_MODEL)
|
|
116
|
+
stdin.write('\r');
|
|
117
|
+
await waitForUpdate();
|
|
118
|
+
expect(mockSetModel).toHaveBeenCalledWith(DEFAULT_GEMINI_MODEL);
|
|
119
|
+
expect(mockOnClose).toHaveBeenCalled();
|
|
109
120
|
});
|
|
110
|
-
it('
|
|
111
|
-
const {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
// Assert against the default mock provided by renderComponent
|
|
116
|
-
expect(mockConfig?.setModel).toHaveBeenCalledWith(GEMINI_MODEL_ALIAS_PRO);
|
|
117
|
-
expect(props.onClose).toHaveBeenCalledTimes(1);
|
|
118
|
-
unmount();
|
|
121
|
+
it('closes dialog on escape in "main" view', async () => {
|
|
122
|
+
const { stdin } = renderComponent();
|
|
123
|
+
stdin.write('\u001B'); // Escape
|
|
124
|
+
await waitForUpdate();
|
|
125
|
+
expect(mockOnClose).toHaveBeenCalled();
|
|
119
126
|
});
|
|
120
|
-
it('
|
|
121
|
-
const {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
127
|
+
it('goes back to "main" view on escape in "manual" view', async () => {
|
|
128
|
+
const { lastFrame, stdin } = renderComponent();
|
|
129
|
+
// Go to manual view
|
|
130
|
+
stdin.write('\u001B[B');
|
|
131
|
+
await waitForUpdate();
|
|
132
|
+
stdin.write('\r');
|
|
133
|
+
await waitForUpdate();
|
|
134
|
+
expect(lastFrame()).toContain(DEFAULT_GEMINI_MODEL);
|
|
135
|
+
// Press Escape
|
|
136
|
+
stdin.write('\u001B');
|
|
137
|
+
await waitForUpdate();
|
|
138
|
+
expect(mockOnClose).not.toHaveBeenCalled();
|
|
139
|
+
// Should be back to main view (Manual option visible)
|
|
140
|
+
expect(lastFrame()).toContain('Manual');
|
|
125
141
|
});
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
keyPressHandler({
|
|
133
|
-
name: 'escape',
|
|
134
|
-
ctrl: false,
|
|
135
|
-
meta: false,
|
|
136
|
-
shift: false,
|
|
137
|
-
paste: false,
|
|
138
|
-
insertable: false,
|
|
139
|
-
sequence: '',
|
|
142
|
+
describe('Preview Logic', () => {
|
|
143
|
+
it('should NOT show preview options if user has no access', () => {
|
|
144
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(false);
|
|
145
|
+
mockGetPreviewFeatures.mockReturnValue(true); // Even if enabled
|
|
146
|
+
const { lastFrame } = renderComponent();
|
|
147
|
+
expect(lastFrame()).not.toContain('Auto (Preview)');
|
|
140
148
|
});
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
149
|
+
it('should NOT show preview options if user has access but preview features are disabled', () => {
|
|
150
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(true);
|
|
151
|
+
mockGetPreviewFeatures.mockReturnValue(false);
|
|
152
|
+
const { lastFrame } = renderComponent();
|
|
153
|
+
expect(lastFrame()).not.toContain('Auto (Preview)');
|
|
154
|
+
});
|
|
155
|
+
it('should show preview options if user has access AND preview features are enabled', () => {
|
|
156
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(true);
|
|
157
|
+
mockGetPreviewFeatures.mockReturnValue(true);
|
|
158
|
+
const { lastFrame } = renderComponent();
|
|
159
|
+
expect(lastFrame()).toContain('Auto (Preview)');
|
|
160
|
+
});
|
|
161
|
+
it('should show "Gemini 3 is now available" header if user has access but preview features disabled', () => {
|
|
162
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(true);
|
|
163
|
+
mockGetPreviewFeatures.mockReturnValue(false);
|
|
164
|
+
const { lastFrame } = renderComponent();
|
|
165
|
+
expect(lastFrame()).toContain('Gemini 3 is now available.');
|
|
166
|
+
expect(lastFrame()).toContain('Enable "Preview features" in /settings');
|
|
167
|
+
});
|
|
168
|
+
it('should show "Gemini 3 is coming soon" header if user has no access', () => {
|
|
169
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(false);
|
|
170
|
+
mockGetPreviewFeatures.mockReturnValue(false);
|
|
171
|
+
const { lastFrame } = renderComponent();
|
|
172
|
+
expect(lastFrame()).toContain('Gemini 3 is coming soon.');
|
|
173
|
+
});
|
|
174
|
+
it('should NOT show header/subheader if preview options are shown', () => {
|
|
175
|
+
mockGetHasAccessToPreviewModel.mockReturnValue(true);
|
|
176
|
+
mockGetPreviewFeatures.mockReturnValue(true);
|
|
177
|
+
const { lastFrame } = renderComponent();
|
|
178
|
+
expect(lastFrame()).not.toContain('Gemini 3 is now available.');
|
|
179
|
+
expect(lastFrame()).not.toContain('Gemini 3 is coming soon.');
|
|
150
180
|
});
|
|
151
|
-
expect(props.onClose).toHaveBeenCalledTimes(1);
|
|
152
|
-
unmount();
|
|
153
|
-
});
|
|
154
|
-
it('updates initialIndex when config context changes', () => {
|
|
155
|
-
const mockGetModel = vi.fn(() => DEFAULT_GEMINI_MODEL_AUTO);
|
|
156
|
-
const oldMockConfig = {
|
|
157
|
-
getModel: mockGetModel,
|
|
158
|
-
getPreviewFeatures: vi.fn(() => false),
|
|
159
|
-
};
|
|
160
|
-
const { rerender, unmount } = render(_jsx(ConfigContext.Provider, { value: oldMockConfig, children: _jsx(ModelDialog, { onClose: vi.fn() }) }));
|
|
161
|
-
expect(mockedSelect.mock.calls[0][0].initialIndex).toBe(0);
|
|
162
|
-
mockGetModel.mockReturnValue(GEMINI_MODEL_ALIAS_FLASH_LITE);
|
|
163
|
-
const newMockConfig = {
|
|
164
|
-
getModel: mockGetModel,
|
|
165
|
-
getPreviewFeatures: vi.fn(() => false),
|
|
166
|
-
};
|
|
167
|
-
rerender(_jsx(ConfigContext.Provider, { value: newMockConfig, children: _jsx(ModelDialog, { onClose: vi.fn() }) }));
|
|
168
|
-
// Should be called at least twice: initial render + re-render after context change
|
|
169
|
-
expect(mockedSelect).toHaveBeenCalledTimes(2);
|
|
170
|
-
expect(mockedSelect.mock.calls[1][0].initialIndex).toBe(3);
|
|
171
|
-
unmount();
|
|
172
181
|
});
|
|
173
182
|
});
|
|
174
183
|
//# sourceMappingURL=ModelDialog.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelDialog.test.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.test.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ModelDialog.test.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.test.tsx"],"names":[],"mappings":"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"}
|