@google/gemini-cli 0.22.0-preview.0 → 0.22.0-preview.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 (47) hide show
  1. package/dist/package.json +2 -2
  2. package/dist/src/config/config.js +4 -2
  3. package/dist/src/config/config.js.map +1 -1
  4. package/dist/src/config/config.test.js +1 -1
  5. package/dist/src/config/config.test.js.map +1 -1
  6. package/dist/src/config/settings.test.js +4 -4
  7. package/dist/src/config/settings.test.js.map +1 -1
  8. package/dist/src/config/settingsSchema.d.ts +1 -1
  9. package/dist/src/config/settingsSchema.js +2 -2
  10. package/dist/src/config/settingsSchema.js.map +1 -1
  11. package/dist/src/generated/git-commit.d.ts +2 -2
  12. package/dist/src/generated/git-commit.js +2 -2
  13. package/dist/src/test-utils/render.js +1 -0
  14. package/dist/src/test-utils/render.js.map +1 -1
  15. package/dist/src/ui/AppContainer.js +6 -17
  16. package/dist/src/ui/AppContainer.js.map +1 -1
  17. package/dist/src/ui/AppContainer.test.js +156 -30
  18. package/dist/src/ui/AppContainer.test.js.map +1 -1
  19. package/dist/src/ui/commands/modelCommand.js +10 -5
  20. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  21. package/dist/src/ui/commands/modelCommand.test.js +12 -1
  22. package/dist/src/ui/commands/modelCommand.test.js.map +1 -1
  23. package/dist/src/ui/commands/statsCommand.js +2 -6
  24. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  25. package/dist/src/ui/commands/statsCommand.test.js +14 -0
  26. package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
  27. package/dist/src/ui/components/Footer.js +2 -2
  28. package/dist/src/ui/components/Footer.js.map +1 -1
  29. package/dist/src/ui/components/ModelDialog.js +116 -39
  30. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  31. package/dist/src/ui/components/ModelDialog.test.js +157 -148
  32. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  33. package/dist/src/ui/components/ProQuotaDialog.js +14 -12
  34. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  35. package/dist/src/ui/components/ProQuotaDialog.test.js +20 -21
  36. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  37. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +1 -1
  38. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +1 -1
  39. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -1
  40. package/dist/src/ui/hooks/useQuotaAndFallback.js +20 -21
  41. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  42. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +7 -7
  43. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  44. package/dist/src/zed-integration/zedIntegration.js +1 -1
  45. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  46. package/dist/tsconfig.tsbuildinfo +1 -1
  47. package/package.json +3 -3
@@ -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, GEMINI_MODEL_ALIAS_FLASH, GEMINI_MODEL_ALIAS_FLASH_LITE, GEMINI_MODEL_ALIAS_PRO, ModelSlashCommandEvent, logModelSlashCommand, } from '@google/gemini-cli-core';
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
- onClose();
31
+ if (view === 'manual') {
32
+ setView('main');
33
+ }
34
+ else {
35
+ onClose();
36
+ }
17
37
  }
18
38
  }, { isActive: true });
19
- const options = useMemo(() => [
20
- {
21
- value: DEFAULT_GEMINI_MODEL_AUTO,
22
- title: 'Auto',
23
- description: 'Let the system choose the best model for your task.',
24
- key: DEFAULT_GEMINI_MODEL_AUTO,
25
- },
26
- {
27
- value: GEMINI_MODEL_ALIAS_PRO,
28
- title: config?.getPreviewFeatures()
29
- ? `Pro (${PREVIEW_GEMINI_MODEL}, ${DEFAULT_GEMINI_MODEL})`
30
- : `Pro (${DEFAULT_GEMINI_MODEL})`,
31
- description: 'For complex tasks that require deep reasoning and creativity',
32
- key: GEMINI_MODEL_ALIAS_PRO,
33
- },
34
- {
35
- value: GEMINI_MODEL_ALIAS_FLASH,
36
- title: `Flash (${DEFAULT_GEMINI_FLASH_MODEL})`,
37
- description: 'For tasks that need a balance of speed and reasoning',
38
- key: GEMINI_MODEL_ALIAS_FLASH,
39
- },
40
- {
41
- value: GEMINI_MODEL_ALIAS_FLASH_LITE,
42
- title: `Flash-Lite (${DEFAULT_GEMINI_FLASH_LITE_MODEL})`,
43
- description: 'For simple tasks that need to be done quickly',
44
- key: GEMINI_MODEL_ALIAS_FLASH_LITE,
45
- },
46
- ], [config]);
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(() => options.findIndex((option) => option.value === preferredModel), [preferredModel, options]);
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
- const header = config?.getPreviewFeatures()
59
- ? 'Gemini 3 is now enabled.'
60
- : 'Gemini 3 is now available.';
61
- const subheader = config?.getPreviewFeatures()
62
- ? `To disable Gemini 3, disable "Preview features" in /settings.\nLearn more at https://goo.gle/enable-preview-features\n\nWhen you select Auto or Pro, Gemini CLI will attempt to use ${PREVIEW_GEMINI_MODEL} first, before falling back to ${DEFAULT_GEMINI_MODEL}.`
63
- : `To use Gemini 3, enable "Preview features" in /settings.\nLearn more at https://goo.gle/enable-preview-features`;
64
- 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, { marginTop: 1, marginBottom: 1, flexDirection: "column", children: [_jsx(ThemedGradient, { children: _jsx(Text, { children: header }) }), _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)" }) })] }));
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":"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"}
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 '../../test-utils/render.js';
8
- import { cleanup } from 'ink-testing-library';
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
- vi.mock('../hooks/useKeypress.js', () => ({
16
- useKeypress: vi.fn(),
17
- }));
18
- const mockedUseKeypress = vi.mocked(useKeypress);
19
- vi.mock('./shared/DescriptiveRadioButtonSelect.js', () => ({
20
- DescriptiveRadioButtonSelect: vi.fn(() => null),
21
- }));
22
- const mockedSelect = vi.mocked(DescriptiveRadioButtonSelect);
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
- ...renderResult,
50
- props: combinedProps,
51
- mockConfig,
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.clearAllMocks();
57
- });
58
- afterEach(() => {
59
- cleanup();
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
- it('renders the title and help text', () => {
62
- const { lastFrame, unmount } = renderComponent();
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('(Press Esc to close)');
65
- expect(lastFrame()).toContain('To use a specific Gemini model on startup, use the --model flag.');
66
- unmount();
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('passes all model options to DescriptiveRadioButtonSelect', () => {
69
- const { unmount } = renderComponent();
70
- expect(mockedSelect).toHaveBeenCalledTimes(1);
71
- const props = mockedSelect.mock.calls[0][0];
72
- expect(props.items).toHaveLength(4);
73
- expect(props.items[0].value).toBe(DEFAULT_GEMINI_MODEL_AUTO);
74
- expect(props.items[1].value).toBe(GEMINI_MODEL_ALIAS_PRO);
75
- expect(props.items[2].value).toBe(GEMINI_MODEL_ALIAS_FLASH);
76
- expect(props.items[3].value).toBe(GEMINI_MODEL_ALIAS_FLASH_LITE);
77
- expect(props.showNumbers).toBe(true);
78
- unmount();
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('initializes with the model from ConfigContext', () => {
81
- const mockGetModel = vi.fn(() => GEMINI_MODEL_ALIAS_FLASH);
82
- const { unmount } = renderComponent({}, { getModel: mockGetModel });
83
- expect(mockGetModel).toHaveBeenCalled();
84
- expect(mockedSelect).toHaveBeenCalledWith(expect.objectContaining({
85
- initialIndex: 2,
86
- }), undefined);
87
- unmount();
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('initializes with "auto" model if context is not provided', () => {
90
- const { unmount } = renderComponent({}, undefined);
91
- expect(mockedSelect).toHaveBeenCalledWith(expect.objectContaining({
92
- initialIndex: 0,
93
- }), undefined);
94
- unmount();
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('initializes with "auto" model if getModel returns undefined', () => {
97
- const mockGetModel = vi.fn(() => undefined);
98
- // @ts-expect-error This test validates component robustness when getModel
99
- // returns an unexpected undefined value.
100
- const { unmount } = renderComponent({}, { getModel: mockGetModel });
101
- expect(mockGetModel).toHaveBeenCalled();
102
- // When getModel returns undefined, preferredModel falls back to DEFAULT_GEMINI_MODEL_AUTO
103
- // which has index 0, so initialIndex should be 0
104
- expect(mockedSelect).toHaveBeenCalledWith(expect.objectContaining({
105
- initialIndex: 0,
106
- }), undefined);
107
- expect(mockedSelect).toHaveBeenCalledTimes(1);
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('calls config.setModel and onClose when DescriptiveRadioButtonSelect.onSelect is triggered', () => {
111
- const { props, mockConfig, unmount } = renderComponent({}, {}); // Pass empty object for contextValue
112
- const childOnSelect = mockedSelect.mock.calls[0][0].onSelect;
113
- expect(childOnSelect).toBeDefined();
114
- childOnSelect(GEMINI_MODEL_ALIAS_PRO);
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('does not pass onHighlight to DescriptiveRadioButtonSelect', () => {
121
- const { unmount } = renderComponent();
122
- const childOnHighlight = mockedSelect.mock.calls[0][0].onHighlight;
123
- expect(childOnHighlight).toBeUndefined();
124
- unmount();
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
- it('calls onClose prop when "escape" key is pressed', () => {
127
- const { props, unmount } = renderComponent();
128
- expect(mockedUseKeypress).toHaveBeenCalled();
129
- const keyPressHandler = mockedUseKeypress.mock.calls[0][0];
130
- const options = mockedUseKeypress.mock.calls[0][1];
131
- expect(options).toEqual({ isActive: true });
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
- expect(props.onClose).toHaveBeenCalledTimes(1);
142
- keyPressHandler({
143
- name: 'a',
144
- ctrl: false,
145
- meta: false,
146
- shift: false,
147
- paste: false,
148
- insertable: true,
149
- sequence: '',
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":"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"}
1
+ {"version":3,"file":"ModelDialog.test.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.test.tsx"],"names":[],"mappings":"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"}