@google/gemini-cli 0.21.2 → 0.22.0-preview.0

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 (197) hide show
  1. package/dist/package.json +3 -2
  2. package/dist/src/commands/extensions/disable.js.map +1 -1
  3. package/dist/src/commands/extensions/disable.test.js.map +1 -1
  4. package/dist/src/commands/extensions/enable.js.map +1 -1
  5. package/dist/src/commands/extensions/enable.test.js.map +1 -1
  6. package/dist/src/commands/extensions/examples/mcp-server/example.test.js +1 -1
  7. package/dist/src/commands/extensions/examples/mcp-server/example.test.js.map +1 -1
  8. package/dist/src/commands/extensions/examples/mcp-server/example.test.ts +4 -12
  9. package/dist/src/commands/extensions/link.test.js.map +1 -1
  10. package/dist/src/commands/extensions/list.test.js +0 -1
  11. package/dist/src/commands/extensions/list.test.js.map +1 -1
  12. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  13. package/dist/src/commands/extensions/uninstall.test.js.map +1 -1
  14. package/dist/src/commands/extensions/update.test.js.map +1 -1
  15. package/dist/src/config/config.js +3 -6
  16. package/dist/src/config/config.js.map +1 -1
  17. package/dist/src/config/config.test.js +1 -1
  18. package/dist/src/config/config.test.js.map +1 -1
  19. package/dist/src/config/extension-manager.js +8 -9
  20. package/dist/src/config/extension-manager.js.map +1 -1
  21. package/dist/src/config/extension.test.js +4 -4
  22. package/dist/src/config/extension.test.js.map +1 -1
  23. package/dist/src/config/extensions/extensionSettings.js +1 -1
  24. package/dist/src/config/extensions/extensionSettings.js.map +1 -1
  25. package/dist/src/config/extensions/extensionSettings.test.js +27 -0
  26. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
  27. package/dist/src/config/extensions/github_fetch.js.map +1 -1
  28. package/dist/src/config/settings-validation.d.ts +23 -0
  29. package/dist/src/config/settings-validation.js +249 -0
  30. package/dist/src/config/settings-validation.js.map +1 -0
  31. package/dist/src/config/settings-validation.test.js +322 -0
  32. package/dist/src/config/settings-validation.test.js.map +1 -0
  33. package/dist/src/config/settings.js +23 -2
  34. package/dist/src/config/settings.js.map +1 -1
  35. package/dist/src/config/settings.test.js +27 -4
  36. package/dist/src/config/settings.test.js.map +1 -1
  37. package/dist/src/config/settingsSchema.d.ts +10 -1
  38. package/dist/src/config/settingsSchema.js +11 -2
  39. package/dist/src/config/settingsSchema.js.map +1 -1
  40. package/dist/src/config/settingsSchema.test.js.map +1 -1
  41. package/dist/src/{utils/version.d.ts → config/settings_repro.test.d.ts} +1 -1
  42. package/dist/src/config/settings_repro.test.js +162 -0
  43. package/dist/src/config/settings_repro.test.js.map +1 -0
  44. package/dist/src/gemini.js +2 -3
  45. package/dist/src/gemini.js.map +1 -1
  46. package/dist/src/gemini.test.js +3 -5
  47. package/dist/src/gemini.test.js.map +1 -1
  48. package/dist/src/generated/git-commit.d.ts +2 -2
  49. package/dist/src/generated/git-commit.js +2 -2
  50. package/dist/src/generated/git-commit.js.map +1 -1
  51. package/dist/src/nonInteractiveCli.js +4 -4
  52. package/dist/src/nonInteractiveCli.js.map +1 -1
  53. package/dist/src/nonInteractiveCli.test.js +0 -2
  54. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  55. package/dist/src/services/FileCommandLoader.test.js.map +1 -1
  56. package/dist/src/test-utils/render.js +0 -1
  57. package/dist/src/test-utils/render.js.map +1 -1
  58. package/dist/src/ui/AppContainer.js +23 -6
  59. package/dist/src/ui/AppContainer.js.map +1 -1
  60. package/dist/src/ui/AppContainer.test.js +30 -156
  61. package/dist/src/ui/AppContainer.test.js.map +1 -1
  62. package/dist/src/ui/auth/ApiAuthDialog.js +36 -3
  63. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  64. package/dist/src/ui/auth/ApiAuthDialog.test.js +26 -2
  65. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -1
  66. package/dist/src/ui/auth/AuthDialog.js +1 -2
  67. package/dist/src/ui/auth/AuthDialog.js.map +1 -1
  68. package/dist/src/ui/auth/AuthDialog.test.js +11 -2
  69. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  70. package/dist/src/ui/auth/useAuth.js +7 -4
  71. package/dist/src/ui/auth/useAuth.js.map +1 -1
  72. package/dist/src/ui/auth/useAuth.test.js +2 -2
  73. package/dist/src/ui/auth/useAuth.test.js.map +1 -1
  74. package/dist/src/ui/commands/aboutCommand.js +2 -3
  75. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  76. package/dist/src/ui/commands/aboutCommand.test.js +3 -6
  77. package/dist/src/ui/commands/aboutCommand.test.js.map +1 -1
  78. package/dist/src/ui/commands/bugCommand.js +2 -3
  79. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  80. package/dist/src/ui/commands/bugCommand.test.js +3 -3
  81. package/dist/src/ui/commands/bugCommand.test.js.map +1 -1
  82. package/dist/src/ui/commands/chatCommand.test.js.map +1 -1
  83. package/dist/src/ui/commands/ideCommand.test.js.map +1 -1
  84. package/dist/src/ui/commands/initCommand.js +10 -50
  85. package/dist/src/ui/commands/initCommand.js.map +1 -1
  86. package/dist/src/ui/commands/mcpCommand.js +1 -2
  87. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  88. package/dist/src/ui/commands/modelCommand.js +5 -10
  89. package/dist/src/ui/commands/modelCommand.js.map +1 -1
  90. package/dist/src/ui/commands/modelCommand.test.js +1 -12
  91. package/dist/src/ui/commands/modelCommand.test.js.map +1 -1
  92. package/dist/src/ui/commands/restoreCommand.js +1 -3
  93. package/dist/src/ui/commands/restoreCommand.js.map +1 -1
  94. package/dist/src/ui/commands/statsCommand.js +6 -2
  95. package/dist/src/ui/commands/statsCommand.js.map +1 -1
  96. package/dist/src/ui/commands/statsCommand.test.js +0 -14
  97. package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
  98. package/dist/src/ui/components/DialogManager.js +1 -1
  99. package/dist/src/ui/components/DialogManager.js.map +1 -1
  100. package/dist/src/ui/components/Footer.js +2 -2
  101. package/dist/src/ui/components/Footer.js.map +1 -1
  102. package/dist/src/ui/components/ModelDialog.js +39 -116
  103. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  104. package/dist/src/ui/components/ModelDialog.test.js +148 -157
  105. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  106. package/dist/src/ui/components/ModelStatsDisplay.js +1 -1
  107. package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
  108. package/dist/src/ui/components/ModelStatsDisplay.test.js +7 -0
  109. package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -1
  110. package/dist/src/ui/components/ProQuotaDialog.js +12 -14
  111. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  112. package/dist/src/ui/components/ProQuotaDialog.test.js +21 -20
  113. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  114. package/dist/src/ui/components/QuittingDisplay.test.js.map +1 -1
  115. package/dist/src/ui/components/SessionSummaryDisplay.test.js +1 -0
  116. package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -1
  117. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  118. package/dist/src/ui/components/StatsDisplay.d.ts +1 -1
  119. package/dist/src/ui/components/StatsDisplay.js +11 -15
  120. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  121. package/dist/src/ui/components/StatsDisplay.test.js +41 -0
  122. package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
  123. package/dist/src/ui/components/ToolStatsDisplay.js.map +1 -1
  124. package/dist/src/ui/components/messages/Todo.js.map +1 -1
  125. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +20 -0
  126. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  127. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +1 -1
  128. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +1 -1
  129. package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -1
  130. package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -1
  131. package/dist/src/ui/components/shared/text-buffer.js +5 -3
  132. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  133. package/dist/src/ui/components/shared/text-buffer.test.js +25 -0
  134. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  135. package/dist/src/ui/constants/tips.js +0 -1
  136. package/dist/src/ui/constants/tips.js.map +1 -1
  137. package/dist/src/ui/contexts/SessionContext.d.ts +1 -0
  138. package/dist/src/ui/contexts/SessionContext.js +2 -1
  139. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  140. package/dist/src/ui/contexts/SessionContext.test.js +3 -0
  141. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
  142. package/dist/src/ui/hooks/atCommandProcessor.d.ts +1 -1
  143. package/dist/src/ui/hooks/atCommandProcessor.js +25 -14
  144. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  145. package/dist/src/ui/hooks/atCommandProcessor.test.js +42 -33
  146. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
  147. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +1 -1
  148. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  149. package/dist/src/ui/hooks/useGeminiStream.js +2 -1
  150. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  151. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  152. package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +1 -1
  153. package/dist/src/ui/hooks/useQuotaAndFallback.js +21 -20
  154. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  155. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +7 -7
  156. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  157. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  158. package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
  159. package/dist/src/ui/hooks/useToolScheduler.test.js +14 -4
  160. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  161. package/dist/src/ui/utils/clipboardUtils.d.ts +20 -0
  162. package/dist/src/ui/utils/clipboardUtils.js +82 -4
  163. package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
  164. package/dist/src/ui/utils/clipboardUtils.test.js +123 -1
  165. package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -1
  166. package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
  167. package/dist/src/ui/utils/computeStats.js +2 -0
  168. package/dist/src/ui/utils/computeStats.js.map +1 -1
  169. package/dist/src/ui/utils/computeStats.test.js +9 -0
  170. package/dist/src/ui/utils/computeStats.test.js.map +1 -1
  171. package/dist/src/utils/deepMerge.js +7 -2
  172. package/dist/src/utils/deepMerge.js.map +1 -1
  173. package/dist/src/utils/deepMerge.test.js +21 -0
  174. package/dist/src/utils/deepMerge.test.js.map +1 -1
  175. package/dist/src/utils/envVarResolver.js.map +1 -1
  176. package/dist/src/utils/envVarResolver.test.js.map +1 -1
  177. package/dist/src/utils/errors.test.js +9 -1
  178. package/dist/src/utils/errors.test.js.map +1 -1
  179. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  180. package/dist/src/zed-integration/acp.test.js +8 -16
  181. package/dist/src/zed-integration/acp.test.js.map +1 -1
  182. package/dist/src/zed-integration/connection.js.map +1 -1
  183. package/dist/src/zed-integration/fileSystemService.d.ts +0 -1
  184. package/dist/src/zed-integration/fileSystemService.js +0 -3
  185. package/dist/src/zed-integration/fileSystemService.js.map +1 -1
  186. package/dist/src/zed-integration/fileSystemService.test.js +0 -8
  187. package/dist/src/zed-integration/fileSystemService.test.js.map +1 -1
  188. package/dist/src/zed-integration/zedIntegration.js +4 -3
  189. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  190. package/dist/tsconfig.tsbuildinfo +1 -1
  191. package/package.json +4 -3
  192. package/dist/google-gemini-cli-0.21.1.tgz +0 -0
  193. package/dist/src/utils/version.js +0 -15
  194. package/dist/src/utils/version.js.map +0 -1
  195. package/dist/src/utils/version.test.js +0 -39
  196. package/dist/src/utils/version.test.js.map +0 -1
  197. /package/dist/src/{utils/version.test.d.ts → config/settings-validation.test.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useCallback, useContext, useMemo, useState } from 'react';
2
+ import { useCallback, useContext, useMemo } from 'react';
3
3
  import { Box, Text } from 'ink';
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';
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';
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,110 +9,45 @@ 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');
13
12
  // Determine the Preferred Model (read once when the dialog opens).
14
13
  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]);
29
14
  useKeypress((key) => {
30
15
  if (key.name === 'escape') {
31
- if (view === 'manual') {
32
- setView('main');
33
- }
34
- else {
35
- onClose();
36
- }
16
+ onClose();
37
17
  }
38
18
  }, { isActive: true });
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;
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]);
98
47
  // Calculate the initial index based on the preferred model.
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]);
48
+ const initialIndex = useMemo(() => options.findIndex((option) => option.value === preferredModel), [preferredModel, options]);
110
49
  // Handle selection internally (Autonomous Dialog).
111
50
  const handleSelect = useCallback((model) => {
112
- if (model === 'Manual') {
113
- setView('manual');
114
- return;
115
- }
116
51
  if (config) {
117
52
  config.setModel(model);
118
53
  const event = new ModelSlashCommandEvent(model);
@@ -120,24 +55,12 @@ export function ModelDialog({ onClose }) {
120
55
  }
121
56
  onClose();
122
57
  }, [config, onClose]);
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)" }) })] }));
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)" }) })] }));
142
65
  }
143
66
  //# 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,180 +4,171 @@ 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 'ink-testing-library';
8
- import { describe, it, expect, vi, beforeEach } from 'vitest';
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';
9
11
  import { ModelDialog } from './ModelDialog.js';
12
+ import { useKeypress } from '../hooks/useKeypress.js';
13
+ import { DescriptiveRadioButtonSelect } from './shared/DescriptiveRadioButtonSelect.js';
10
14
  import { ConfigContext } from '../contexts/ConfigContext.js';
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');
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 }) }));
19
48
  return {
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
- },
49
+ ...renderResult,
50
+ props: combinedProps,
51
+ mockConfig,
28
52
  };
29
- });
53
+ };
30
54
  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
- };
42
55
  beforeEach(() => {
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
- });
56
+ vi.clearAllMocks();
55
57
  });
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();
60
- expect(lastFrame()).toContain('Select Model');
61
- expect(lastFrame()).toContain('Auto');
62
- expect(lastFrame()).toContain('Manual');
58
+ afterEach(() => {
59
+ cleanup();
63
60
  });
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)');
61
+ it('renders the title and help text', () => {
62
+ const { lastFrame, unmount } = renderComponent();
63
+ 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();
69
67
  });
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);
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();
83
79
  });
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);
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();
99
88
  });
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();
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();
107
95
  });
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();
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();
120
109
  });
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();
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();
126
119
  });
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');
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();
141
125
  });
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)');
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: '',
148
140
  });
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.');
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: '',
180
150
  });
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();
181
172
  });
182
173
  });
183
174
  //# 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,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,+BAA+B,EAC/B,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAGjC,oBAAoB;AACpB,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACrC,MAAM,wBAAwB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACzC,MAAM,0BAA0B,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAE3C,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;IAC5C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAChE,OAAO;QACL,GAAG,MAAM;QACT,gBAAgB,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAC5D,oBAAoB,EAAE,CAAC,MAAc,EAAE,KAA6B,EAAE,EAAE,CACtE,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC;QACzC,sBAAsB,EAAE;YACtB,YAAY,KAAa;gBACvB,0BAA0B,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;SACF;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC7B,MAAM,sBAAsB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC5B,MAAM,8BAA8B,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAS/C,MAAM,UAAU,GAAe;QAC7B,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,YAAY;QACtB,kBAAkB,EAAE,sBAAsB;QAC1C,0BAA0B,EAAE,8BAA8B;KAC3D,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,YAAY,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACxD,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,8BAA8B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtD,8CAA8C;QAC9C,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,GAAW,EAAE,EAAE;YACtD,IAAI,GAAG,KAAK,iBAAiB;gBAAE,OAAO,mBAAmB,CAAC;YAC1D,IAAI,GAAG,KAAK,eAAe;gBAAE,OAAO,gBAAgB,CAAC;YACrD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,CAAC,eAAe,UAAoB,EAAE,EAAE,CAC9D,MAAM,CACJ,KAAC,gBAAgB,cACf,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YACzC,KAAC,WAAW,IAAC,OAAO,EAAE,WAAW,GAAI,GACd,GACR,CACpB,CAAC;IAEJ,MAAM,aAAa,GAAG,GAAG,EAAE,CACzB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAErD,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB;QACzE,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAE/C,4BAA4B;QAC5B,uCAAuC;QACvC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QACtC,MAAM,aAAa,EAAE,CAAC;QAEtB,wBAAwB;QACxB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,iCAAiC;QACjC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB;QACzE,YAAY,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACxD,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAE/C,kFAAkF;QAClF,iEAAiE;QACjE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QACtC,MAAM,aAAa,EAAE,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QACtC,MAAM,aAAa,EAAE,CAAC;QAEtB,+BAA+B;QAC/B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAEpC,0BAA0B;QAC1B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAEpC,0CAA0C;QAC1C,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,aAAa,EAAE,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,6EAA6E;QAC7E,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;QAChE,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAEpC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAChC,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAE/C,oBAAoB;QACpB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,aAAa,EAAE,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAEpD,eAAe;QACf,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,sDAAsD;QACtD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,8BAA8B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACtD,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB;YAChE,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;YAC9F,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrD,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;YACzF,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrD,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iGAAiG,EAAE,GAAG,EAAE;YACzG,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrD,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,8BAA8B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACtD,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrD,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAChE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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,4BAA4B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAC;AACJ,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEjD,EAAE,CAAC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,4BAA4B,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;CAChD,CAAC,CAAC,CAAC;AACJ,MAAM,YAAY,GAAG,EAAE,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAE7D,MAAM,eAAe,GAAG,CACtB,QAA2D,EAAE,EAC7D,eAA4C,SAAS,EACrD,EAAE;IACF,MAAM,YAAY,GAAG;QACnB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;KACjB,CAAC;IACF,MAAM,aAAa,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE,CAAC;IAEpD,MAAM,UAAU,GAAG,YAAY;QAC7B,CAAC,CAAE;YACC,wCAAwC;YACxC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC;YAChD,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;YACjB,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;YAEtC,2CAA2C;YAC3C,yBAAyB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;YAC5C,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;YAC5C,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;YAChC,yBAAyB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9D,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;YACnC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YAChC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;YACjC,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;YAExB,yCAAyC;YACzC,GAAG,YAAY;SACL;QACd,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,YAAY,GAAG,MAAM,CACzB,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,UAAU,YACvC,KAAC,WAAW,OAAK,aAAa,GAAI,GACX,CAC1B,CAAC;IAEF,OAAO;QACL,GAAG,YAAY;QACf,KAAK,EAAE,aAAa;QACpB,UAAU;KACX,CAAC;AACJ,CAAC,CAAC;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;QACjD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAC3B,kEAAkE,CACnE,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;QACtC,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE9C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAC;QAC3D,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,gBAAgB,CAAC;YACtB,YAAY,EAAE,CAAC;SAChB,CAAC,EACF,SAAS,CACV,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAEnD,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,gBAAgB,CAAC;YACtB,YAAY,EAAE,CAAC;SAChB,CAAC,EACF,SAAS,CACV,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,0EAA0E;QAC1E,yCAAyC;QACzC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAExC,0FAA0F;QAC1F,iDAAiD;QACjD,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CACvC,MAAM,CAAC,gBAAgB,CAAC;YACtB,YAAY,EAAE,CAAC;SAChB,CAAC,EACF,SAAS,CACV,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2FAA2F,EAAE,GAAG,EAAE;QACnG,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,qCAAqC;QAErG,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7D,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QAEpC,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAEtC,8DAA8D;QAC9D,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAC;QAC1E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;QAEtC,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QACnE,MAAM,CAAC,gBAAgB,CAAC,CAAC,aAAa,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;QAE7C,MAAM,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAE7C,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,eAAe,CAAC;YACd,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE/C,eAAe,CAAC;YACd,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG;YACpB,QAAQ,EAAE,YAAY;YACtB,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;SAClB,CAAC;QACvB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAClC,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa,YAC1C,KAAC,WAAW,IAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,GAAI,GACV,CAC1B,CAAC;QAEF,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3D,YAAY,CAAC,eAAe,CAAC,6BAA6B,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG;YACpB,QAAQ,EAAE,YAAY;YACtB,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;SAClB,CAAC;QAEvB,QAAQ,CACN,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa,YAC1C,KAAC,WAAW,IAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,GAAI,GACV,CAC1B,CAAC;QAEF,mFAAmF;QACnF,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -25,7 +25,7 @@ export const ModelStatsDisplay = () => {
25
25
  }) }), _jsx(StatRow, { title: "Avg Latency", values: getModelValues((m) => {
26
26
  const avgLatency = calculateAverageLatency(m);
27
27
  return formatDuration(avgLatency);
28
- }) }), _jsx(Box, { height: 1 }), _jsx(StatRow, { title: "Tokens", values: [], isSection: true }), _jsx(StatRow, { title: "Total", values: getModelValues((m) => (_jsx(Text, { color: theme.text.secondary, children: m.tokens.total.toLocaleString() }))) }), _jsx(StatRow, { title: "Input", isSubtle: true, values: getModelValues((m) => (_jsx(Text, { color: theme.text.primary, children: Math.max(0, m.tokens.prompt - m.tokens.cached).toLocaleString() }))) }), hasCached && (_jsx(StatRow, { title: "Cache Reads", isSubtle: true, values: getModelValues((m) => {
28
+ }) }), _jsx(Box, { height: 1 }), _jsx(StatRow, { title: "Tokens", values: [], isSection: true }), _jsx(StatRow, { title: "Total", values: getModelValues((m) => (_jsx(Text, { color: theme.text.secondary, children: m.tokens.total.toLocaleString() }))) }), _jsx(StatRow, { title: "Input", isSubtle: true, values: getModelValues((m) => (_jsx(Text, { color: theme.text.primary, children: m.tokens.input.toLocaleString() }))) }), hasCached && (_jsx(StatRow, { title: "Cache Reads", isSubtle: true, values: getModelValues((m) => {
29
29
  const cacheHitRate = calculateCacheHitRate(m);
30
30
  return (_jsxs(Text, { color: theme.text.secondary, children: [m.tokens.cached.toLocaleString(), " (", cacheHitRate.toFixed(1), "%)"] }));
31
31
  }) })), hasThoughts && (_jsx(StatRow, { title: "Thoughts", isSubtle: true, values: getModelValues((m) => (_jsx(Text, { color: theme.text.primary, children: m.tokens.thoughts.toLocaleString() }))) })), hasTool && (_jsx(StatRow, { title: "Tool", isSubtle: true, values: getModelValues((m) => (_jsx(Text, { color: theme.text.primary, children: m.tokens.tool.toLocaleString() }))) })), _jsx(StatRow, { title: "Output", isSubtle: true, values: getModelValues((m) => (_jsx(Text, { color: theme.text.primary, children: m.tokens.candidates.toLocaleString() }))) })] }));