@google/gemini-cli 0.32.0-preview.0 → 0.33.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 (239) hide show
  1. package/README.md +11 -9
  2. package/dist/package.json +3 -3
  3. package/dist/src/config/config.js +6 -1
  4. package/dist/src/config/config.js.map +1 -1
  5. package/dist/src/config/config.test.js +70 -1
  6. package/dist/src/config/config.test.js.map +1 -1
  7. package/dist/src/config/extension-manager.js +1 -0
  8. package/dist/src/config/extension-manager.js.map +1 -1
  9. package/dist/src/config/extension.d.ts +9 -0
  10. package/dist/src/config/extension.js.map +1 -1
  11. package/dist/src/config/sandboxConfig.js +3 -1
  12. package/dist/src/config/sandboxConfig.js.map +1 -1
  13. package/dist/src/config/settings.d.ts +0 -2
  14. package/dist/src/config/settings.js.map +1 -1
  15. package/dist/src/config/settingsSchema.d.ts +9 -13
  16. package/dist/src/config/settingsSchema.js +5 -13
  17. package/dist/src/config/settingsSchema.js.map +1 -1
  18. package/dist/src/gemini.js +1 -1
  19. package/dist/src/gemini.js.map +1 -1
  20. package/dist/src/generated/git-commit.d.ts +2 -2
  21. package/dist/src/generated/git-commit.js +2 -2
  22. package/dist/src/test-utils/render.js +5 -1
  23. package/dist/src/test-utils/render.js.map +1 -1
  24. package/dist/src/ui/AppContainer.js +1 -18
  25. package/dist/src/ui/AppContainer.js.map +1 -1
  26. package/dist/src/ui/commands/extensionsCommand.js +3 -1
  27. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  28. package/dist/src/ui/commands/extensionsCommand.test.js +45 -0
  29. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  30. package/dist/src/ui/commands/hooksCommand.js +12 -8
  31. package/dist/src/ui/commands/hooksCommand.js.map +1 -1
  32. package/dist/src/ui/commands/hooksCommand.test.js +15 -23
  33. package/dist/src/ui/commands/hooksCommand.test.js.map +1 -1
  34. package/dist/src/ui/commands/planCommand.js +33 -3
  35. package/dist/src/ui/commands/planCommand.js.map +1 -1
  36. package/dist/src/ui/commands/planCommand.test.js +29 -1
  37. package/dist/src/ui/commands/planCommand.test.js.map +1 -1
  38. package/dist/src/ui/components/AgentConfigDialog.js +17 -33
  39. package/dist/src/ui/components/AgentConfigDialog.js.map +1 -1
  40. package/dist/src/ui/components/AppHeader.d.ts +1 -1
  41. package/dist/src/ui/components/AppHeader.js +15 -8
  42. package/dist/src/ui/components/AppHeader.js.map +1 -1
  43. package/dist/src/ui/components/AppHeader.test.js +7 -0
  44. package/dist/src/ui/components/AppHeader.test.js.map +1 -1
  45. package/dist/src/ui/components/ContextUsageDisplay.d.ts +1 -1
  46. package/dist/src/ui/components/ContextUsageDisplay.js +15 -3
  47. package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
  48. package/dist/src/ui/components/ContextUsageDisplay.test.js +25 -19
  49. package/dist/src/ui/components/ContextUsageDisplay.test.js.map +1 -1
  50. package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -6
  51. package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
  52. package/dist/src/ui/components/DetailedMessagesDisplay.test.js +2 -2
  53. package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -1
  54. package/dist/src/ui/components/DialogManager.js +3 -19
  55. package/dist/src/ui/components/DialogManager.js.map +1 -1
  56. package/dist/src/ui/components/ExitPlanModeDialog.js +2 -1
  57. package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
  58. package/dist/src/ui/components/ExitPlanModeDialog.test.js +2 -13
  59. package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
  60. package/dist/src/ui/components/Footer.js +3 -1
  61. package/dist/src/ui/components/Footer.js.map +1 -1
  62. package/dist/src/ui/components/Footer.test.js +41 -6
  63. package/dist/src/ui/components/Footer.test.js.map +1 -1
  64. package/dist/src/ui/components/HistoryItemDisplay.js +2 -3
  65. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  66. package/dist/src/ui/components/HooksDialog.d.ts +36 -0
  67. package/dist/src/ui/components/HooksDialog.js +81 -0
  68. package/dist/src/ui/components/HooksDialog.js.map +1 -0
  69. package/dist/src/ui/components/HooksDialog.test.js +187 -0
  70. package/dist/src/ui/components/HooksDialog.test.js.map +1 -0
  71. package/dist/src/ui/components/MainContent.js +2 -1
  72. package/dist/src/ui/components/MainContent.js.map +1 -1
  73. package/dist/src/ui/components/SettingsDialog.d.ts +1 -5
  74. package/dist/src/ui/components/SettingsDialog.js +90 -254
  75. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  76. package/dist/src/ui/components/SettingsDialog.test.js +127 -105
  77. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  78. package/dist/src/ui/components/StatusDisplay.test.js +5 -4
  79. package/dist/src/ui/components/StatusDisplay.test.js.map +1 -1
  80. package/dist/src/ui/components/Tips.d.ts +1 -1
  81. package/dist/src/ui/components/Tips.js +1 -1
  82. package/dist/src/ui/components/Tips.js.map +1 -1
  83. package/dist/src/ui/components/Tips.test.d.ts +1 -1
  84. package/dist/src/ui/components/Tips.test.js +6 -7
  85. package/dist/src/ui/components/Tips.test.js.map +1 -1
  86. package/dist/src/ui/components/UserIdentity.d.ts +1 -1
  87. package/dist/src/ui/components/UserIdentity.js +10 -12
  88. package/dist/src/ui/components/UserIdentity.js.map +1 -1
  89. package/dist/src/ui/components/UserIdentity.test.js +23 -10
  90. package/dist/src/ui/components/UserIdentity.test.js.map +1 -1
  91. package/dist/src/ui/components/messages/InfoMessage.d.ts +1 -0
  92. package/dist/src/ui/components/messages/InfoMessage.js +2 -2
  93. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  94. package/dist/src/ui/components/messages/SubagentProgressDisplay.d.ts +11 -0
  95. package/dist/src/ui/components/messages/SubagentProgressDisplay.js +73 -0
  96. package/dist/src/ui/components/messages/SubagentProgressDisplay.js.map +1 -0
  97. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.d.ts +6 -0
  98. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js +158 -0
  99. package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js.map +1 -0
  100. package/dist/src/ui/components/messages/ToolGroupMessage.js +1 -0
  101. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  102. package/dist/src/ui/components/messages/ToolResultDisplay.js +5 -0
  103. package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
  104. package/dist/src/ui/components/shared/BaseSettingsDialog.d.ts +5 -2
  105. package/dist/src/ui/components/shared/BaseSettingsDialog.js +3 -2
  106. package/dist/src/ui/components/shared/BaseSettingsDialog.js.map +1 -1
  107. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +24 -0
  108. package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +1 -1
  109. package/dist/src/ui/components/views/ExtensionRegistryView.d.ts +1 -2
  110. package/dist/src/ui/constants/tips.js +1 -1
  111. package/dist/src/ui/constants/tips.js.map +1 -1
  112. package/dist/src/ui/constants.d.ts +4 -0
  113. package/dist/src/ui/constants.js +4 -0
  114. package/dist/src/ui/constants.js.map +1 -1
  115. package/dist/src/ui/contexts/SettingsContext.js +2 -1
  116. package/dist/src/ui/contexts/SettingsContext.js.map +1 -1
  117. package/dist/src/ui/contexts/UIStateContext.d.ts +0 -2
  118. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  119. package/dist/src/ui/contexts/VimModeContext.d.ts +1 -3
  120. package/dist/src/ui/contexts/VimModeContext.js +7 -16
  121. package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
  122. package/dist/src/ui/hooks/toolMapping.js +1 -0
  123. package/dist/src/ui/hooks/toolMapping.js.map +1 -1
  124. package/dist/src/ui/hooks/useGeminiStream.js +16 -13
  125. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  126. package/dist/src/ui/hooks/useGeminiStream.test.js +31 -2
  127. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  128. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  129. package/dist/src/ui/hooks/useLoadingIndicator.js +1 -1
  130. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  131. package/dist/src/ui/hooks/useTerminalTheme.js +6 -3
  132. package/dist/src/ui/hooks/useTerminalTheme.js.map +1 -1
  133. package/dist/src/ui/hooks/useTerminalTheme.test.js +19 -0
  134. package/dist/src/ui/hooks/useTerminalTheme.test.js.map +1 -1
  135. package/dist/src/ui/hooks/useToolScheduler.js +26 -12
  136. package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
  137. package/dist/src/ui/hooks/useToolScheduler.test.js +101 -8
  138. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  139. package/dist/src/ui/themes/theme-manager.d.ts +26 -4
  140. package/dist/src/ui/themes/theme-manager.js +40 -7
  141. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  142. package/dist/src/ui/themes/theme-manager.test.js +2 -1
  143. package/dist/src/ui/themes/theme-manager.test.js.map +1 -1
  144. package/dist/src/ui/types.d.ts +3 -17
  145. package/dist/src/ui/types.js +0 -1
  146. package/dist/src/ui/types.js.map +1 -1
  147. package/dist/src/ui/utils/commandUtils.d.ts +6 -2
  148. package/dist/src/ui/utils/commandUtils.js +12 -5
  149. package/dist/src/ui/utils/commandUtils.js.map +1 -1
  150. package/dist/src/ui/utils/commandUtils.test.js +21 -7
  151. package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
  152. package/dist/src/utils/agentSettings.d.ts +3 -11
  153. package/dist/src/utils/agentSettings.js +23 -81
  154. package/dist/src/utils/agentSettings.js.map +1 -1
  155. package/dist/src/{ui/components/SessionRetentionWarningDialog.test.d.ts → utils/agentSettings.test.d.ts} +0 -2
  156. package/dist/src/utils/agentSettings.test.js +111 -0
  157. package/dist/src/utils/agentSettings.test.js.map +1 -0
  158. package/dist/src/utils/dialogScopeUtils.d.ts +6 -2
  159. package/dist/src/utils/dialogScopeUtils.js +3 -3
  160. package/dist/src/utils/dialogScopeUtils.js.map +1 -1
  161. package/dist/src/utils/dialogScopeUtils.test.js +5 -5
  162. package/dist/src/utils/dialogScopeUtils.test.js.map +1 -1
  163. package/dist/src/utils/featureToggleUtils.d.ts +55 -0
  164. package/dist/src/utils/featureToggleUtils.js +95 -0
  165. package/dist/src/utils/featureToggleUtils.js.map +1 -0
  166. package/dist/src/utils/featureToggleUtils.test.d.ts +6 -0
  167. package/dist/src/utils/featureToggleUtils.test.js +126 -0
  168. package/dist/src/utils/featureToggleUtils.test.js.map +1 -0
  169. package/dist/src/utils/handleAutoUpdate.d.ts +7 -0
  170. package/dist/src/utils/handleAutoUpdate.js +41 -0
  171. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  172. package/dist/src/utils/handleAutoUpdate.test.js +52 -1
  173. package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
  174. package/dist/src/utils/processUtils.js +2 -0
  175. package/dist/src/utils/processUtils.js.map +1 -1
  176. package/dist/src/utils/processUtils.test.js +7 -1
  177. package/dist/src/utils/processUtils.test.js.map +1 -1
  178. package/dist/src/utils/sessionCleanup.js +8 -0
  179. package/dist/src/utils/sessionCleanup.js.map +1 -1
  180. package/dist/src/utils/sessionCleanup.test.js +19 -0
  181. package/dist/src/utils/sessionCleanup.test.js.map +1 -1
  182. package/dist/src/utils/settingsUtils.d.ts +18 -91
  183. package/dist/src/utils/settingsUtils.js +127 -207
  184. package/dist/src/utils/settingsUtils.js.map +1 -1
  185. package/dist/src/utils/settingsUtils.test.js +78 -264
  186. package/dist/src/utils/settingsUtils.test.js.map +1 -1
  187. package/dist/src/utils/skillSettings.d.ts +4 -14
  188. package/dist/src/utils/skillSettings.js +32 -81
  189. package/dist/src/utils/skillSettings.js.map +1 -1
  190. package/dist/src/utils/skillSettings.test.d.ts +6 -0
  191. package/dist/src/utils/skillSettings.test.js +142 -0
  192. package/dist/src/utils/skillSettings.test.js.map +1 -0
  193. package/dist/src/zed-integration/acpResume.test.js +8 -0
  194. package/dist/src/zed-integration/acpResume.test.js.map +1 -1
  195. package/dist/src/zed-integration/commandHandler.d.ts +26 -0
  196. package/dist/src/zed-integration/commandHandler.js +102 -0
  197. package/dist/src/zed-integration/commandHandler.js.map +1 -0
  198. package/dist/src/zed-integration/commandHandler.test.d.ts +6 -0
  199. package/dist/src/zed-integration/commandHandler.test.js +25 -0
  200. package/dist/src/zed-integration/commandHandler.test.js.map +1 -0
  201. package/dist/src/zed-integration/commands/commandRegistry.d.ts +12 -0
  202. package/dist/src/zed-integration/commands/commandRegistry.js +26 -0
  203. package/dist/src/zed-integration/commands/commandRegistry.js.map +1 -0
  204. package/dist/src/zed-integration/commands/extensions.d.ts +57 -0
  205. package/dist/src/zed-integration/commands/extensions.js +320 -0
  206. package/dist/src/zed-integration/commands/extensions.js.map +1 -0
  207. package/dist/src/zed-integration/commands/init.d.ts +12 -0
  208. package/dist/src/zed-integration/commands/init.js +47 -0
  209. package/dist/src/zed-integration/commands/init.js.map +1 -0
  210. package/dist/src/zed-integration/commands/memory.d.ts +34 -0
  211. package/dist/src/zed-integration/commands/memory.js +83 -0
  212. package/dist/src/zed-integration/commands/memory.js.map +1 -0
  213. package/dist/src/zed-integration/commands/restore.d.ts +18 -0
  214. package/dist/src/zed-integration/commands/restore.js +140 -0
  215. package/dist/src/zed-integration/commands/restore.js.map +1 -0
  216. package/dist/src/zed-integration/commands/types.d.ts +31 -0
  217. package/dist/src/zed-integration/commands/types.js +7 -0
  218. package/dist/src/zed-integration/commands/types.js.map +1 -0
  219. package/dist/src/zed-integration/zedIntegration.d.ts +9 -2
  220. package/dist/src/zed-integration/zedIntegration.js +170 -8
  221. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  222. package/dist/src/zed-integration/zedIntegration.test.js +329 -2
  223. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
  224. package/dist/tsconfig.tsbuildinfo +1 -1
  225. package/package.json +4 -4
  226. package/dist/src/ui/components/SessionRetentionWarningDialog.d.ts +0 -12
  227. package/dist/src/ui/components/SessionRetentionWarningDialog.js +0 -27
  228. package/dist/src/ui/components/SessionRetentionWarningDialog.js.map +0 -1
  229. package/dist/src/ui/components/SessionRetentionWarningDialog.test.js +0 -72
  230. package/dist/src/ui/components/SessionRetentionWarningDialog.test.js.map +0 -1
  231. package/dist/src/ui/components/views/HooksList.d.ts +0 -24
  232. package/dist/src/ui/components/views/HooksList.js +0 -28
  233. package/dist/src/ui/components/views/HooksList.js.map +0 -1
  234. package/dist/src/ui/hooks/useSessionRetentionCheck.d.ts +0 -12
  235. package/dist/src/ui/hooks/useSessionRetentionCheck.js +0 -57
  236. package/dist/src/ui/hooks/useSessionRetentionCheck.js.map +0 -1
  237. package/dist/src/ui/hooks/useSessionRetentionCheck.test.js +0 -169
  238. package/dist/src/ui/hooks/useSessionRetentionCheck.test.js.map +0 -1
  239. /package/dist/src/ui/{hooks/useSessionRetentionCheck.test.d.ts → components/HooksDialog.test.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@google/gemini-cli",
3
- "version": "0.32.0-preview.0",
3
+ "version": "0.33.0-preview.0",
4
4
  "description": "Gemini CLI",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -26,11 +26,11 @@
26
26
  "dist"
27
27
  ],
28
28
  "config": {
29
- "sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.32.0-preview.0"
29
+ "sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.33.0-preview.0"
30
30
  },
31
31
  "dependencies": {
32
32
  "@agentclientprotocol/sdk": "^0.12.0",
33
- "@google/gemini-cli-core": "0.32.0-preview.0",
33
+ "@google/gemini-cli-core": "0.33.0-preview.0",
34
34
  "@google/genai": "1.41.0",
35
35
  "@iarna/toml": "^2.2.5",
36
36
  "@modelcontextprotocol/sdk": "^1.23.0",
@@ -38,7 +38,7 @@
38
38
  "ansi-regex": "^6.2.2",
39
39
  "chalk": "^4.1.2",
40
40
  "cli-spinners": "^2.9.2",
41
- "clipboardy": "^5.0.0",
41
+ "clipboardy": "~5.2.0",
42
42
  "color-convert": "^2.0.1",
43
43
  "command-exists": "^1.2.9",
44
44
  "comment-json": "^4.2.5",
@@ -1,12 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- interface SessionRetentionWarningDialogProps {
7
- onKeep120Days: () => void;
8
- onKeep30Days: () => void;
9
- sessionsToDeleteCount: number;
10
- }
11
- export declare const SessionRetentionWarningDialog: ({ onKeep120Days, onKeep30Days, sessionsToDeleteCount, }: SessionRetentionWarningDialogProps) => import("react/jsx-runtime").JSX.Element;
12
- export {};
@@ -1,27 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * @license
4
- * Copyright 2026 Google LLC
5
- * SPDX-License-Identifier: Apache-2.0
6
- */
7
- import { Box, Text } from 'ink';
8
- import { theme } from '../semantic-colors.js';
9
- import { RadioButtonSelect, } from './shared/RadioButtonSelect.js';
10
- export const SessionRetentionWarningDialog = ({ onKeep120Days, onKeep30Days, sessionsToDeleteCount, }) => {
11
- const options = [
12
- {
13
- label: 'Keep for 30 days (Recommended)',
14
- value: onKeep30Days,
15
- key: '30days',
16
- sublabel: `${sessionsToDeleteCount} session${sessionsToDeleteCount === 1 ? '' : 's'} will be deleted`,
17
- },
18
- {
19
- label: 'Keep for 120 days',
20
- value: onKeep120Days,
21
- key: '120days',
22
- sublabel: 'No sessions will be deleted at this time',
23
- },
24
- ];
25
- return (_jsxs(Box, { borderStyle: "round", borderColor: theme.border.default, flexDirection: "column", width: "100%", padding: 1, children: [_jsx(Box, { marginBottom: 1, justifyContent: "center", width: "100%", children: _jsx(Text, { bold: true, children: "Keep chat history" }) }), _jsx(Box, { flexDirection: "column", gap: 1, marginBottom: 1, children: _jsx(Text, { children: "To keep your workspace clean, we are introducing a limit on how long chat sessions are stored. Please choose a retention period for your existing chats:" }) }), _jsx(Box, { marginTop: 1, children: _jsx(RadioButtonSelect, { items: options, onSelect: (action) => action(), initialIndex: 1 }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.text.secondary, children: ["Set a custom limit ", _jsx(Text, { color: theme.text.primary, children: "/settings" }), ' ', "and change \"Keep chat history\"."] }) })] }));
26
- };
27
- //# sourceMappingURL=SessionRetentionWarningDialog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionRetentionWarningDialog.js","sourceRoot":"","sources":["../../../../src/ui/components/SessionRetentionWarningDialog.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EACL,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AAQvC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,aAAa,EACb,YAAY,EACZ,qBAAqB,GACc,EAAE,EAAE;IACvC,MAAM,OAAO,GAAuC;QAClD;YACE,KAAK,EAAE,gCAAgC;YACvC,KAAK,EAAE,YAAY;YACnB,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,GAAG,qBAAqB,WAChC,qBAAqB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACrC,kBAAkB;SACnB;QACD;YACE,KAAK,EAAE,mBAAmB;YAC1B,KAAK,EAAE,aAAa;YACpB,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,0CAA0C;SACrD;KACF,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EACjC,aAAa,EAAC,QAAQ,EACtB,KAAK,EAAC,MAAM,EACZ,OAAO,EAAE,CAAC,aAEV,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,cAAc,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,YACxD,KAAC,IAAI,IAAC,IAAI,wCAAyB,GAC/B,EAEN,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,YACjD,KAAC,IAAI,2KAIE,GACH,EAEN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,iBAAiB,IAChB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,EAC9B,YAAY,EAAE,CAAC,GACf,GACE,EAEN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,oCACZ,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,0BAAkB,EAAC,GAAG,yCAEnE,GACH,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -1,72 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- /**
3
- * @license
4
- * Copyright 2026 Google LLC
5
- * SPDX-License-Identifier: Apache-2.0
6
- *
7
- * @license
8
- */
9
- import { describe, it, expect, vi, afterEach } from 'vitest';
10
- import { renderWithProviders } from '../../test-utils/render.js';
11
- import { SessionRetentionWarningDialog } from './SessionRetentionWarningDialog.js';
12
- import { waitFor } from '../../test-utils/async.js';
13
- import { act } from 'react';
14
- // Helper to write to stdin
15
- const writeKey = (stdin, key) => {
16
- act(() => {
17
- stdin.write(key);
18
- });
19
- };
20
- describe('SessionRetentionWarningDialog', () => {
21
- afterEach(() => {
22
- vi.restoreAllMocks();
23
- });
24
- it('renders correctly with warning message and session count', async () => {
25
- const { lastFrame, waitUntilReady } = renderWithProviders(_jsx(SessionRetentionWarningDialog, { onKeep120Days: vi.fn(), onKeep30Days: vi.fn(), sessionsToDeleteCount: 42 }));
26
- await waitUntilReady();
27
- expect(lastFrame()).toContain('Keep chat history');
28
- expect(lastFrame()).toContain('introducing a limit on how long chat sessions are stored');
29
- expect(lastFrame()).toContain('Keep for 30 days (Recommended)');
30
- expect(lastFrame()).toContain('42 sessions will be deleted');
31
- expect(lastFrame()).toContain('Keep for 120 days');
32
- expect(lastFrame()).toContain('No sessions will be deleted at this time');
33
- });
34
- it('handles pluralization correctly for 1 session', async () => {
35
- const { lastFrame, waitUntilReady } = renderWithProviders(_jsx(SessionRetentionWarningDialog, { onKeep120Days: vi.fn(), onKeep30Days: vi.fn(), sessionsToDeleteCount: 1 }));
36
- await waitUntilReady();
37
- expect(lastFrame()).toContain('1 session will be deleted');
38
- });
39
- it('defaults to "Keep for 120 days" when there are sessions to delete', async () => {
40
- const onKeep120Days = vi.fn();
41
- const onKeep30Days = vi.fn();
42
- const { stdin, waitUntilReady } = renderWithProviders(_jsx(SessionRetentionWarningDialog, { onKeep120Days: onKeep120Days, onKeep30Days: onKeep30Days, sessionsToDeleteCount: 10 }));
43
- await waitUntilReady();
44
- // Initial selection should be "Keep for 120 days" (index 1) because count > 0
45
- // Pressing Enter immediately should select it.
46
- writeKey(stdin, '\r');
47
- await waitFor(() => {
48
- expect(onKeep120Days).toHaveBeenCalled();
49
- expect(onKeep30Days).not.toHaveBeenCalled();
50
- });
51
- });
52
- it('calls onKeep30Days when "Keep for 30 days" is explicitly selected (from 120 days default)', async () => {
53
- const onKeep120Days = vi.fn();
54
- const onKeep30Days = vi.fn();
55
- const { stdin, waitUntilReady } = renderWithProviders(_jsx(SessionRetentionWarningDialog, { onKeep120Days: onKeep120Days, onKeep30Days: onKeep30Days, sessionsToDeleteCount: 10 }));
56
- await waitUntilReady();
57
- // Default is index 1 (120 days). Move UP to index 0 (30 days).
58
- writeKey(stdin, '\x1b[A'); // Up arrow
59
- writeKey(stdin, '\r');
60
- await waitFor(() => {
61
- expect(onKeep30Days).toHaveBeenCalled();
62
- expect(onKeep120Days).not.toHaveBeenCalled();
63
- });
64
- });
65
- it('should match snapshot', async () => {
66
- const { lastFrame, waitUntilReady } = renderWithProviders(_jsx(SessionRetentionWarningDialog, { onKeep120Days: vi.fn(), onKeep30Days: vi.fn(), sessionsToDeleteCount: 123 }));
67
- await waitUntilReady();
68
- // Initial render
69
- expect(lastFrame()).toMatchSnapshot();
70
- });
71
- });
72
- //# sourceMappingURL=SessionRetentionWarningDialog.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SessionRetentionWarningDialog.test.js","sourceRoot":"","sources":["../../../../src/ui/components/SessionRetentionWarningDialog.test.tsx"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import type React from 'react';
7
- interface HooksListProps {
8
- hooks: ReadonlyArray<{
9
- config: {
10
- command?: string;
11
- type: string;
12
- name?: string;
13
- description?: string;
14
- timeout?: number;
15
- };
16
- source: string;
17
- eventName: string;
18
- matcher?: string;
19
- sequential?: boolean;
20
- enabled: boolean;
21
- }>;
22
- }
23
- export declare const HooksList: React.FC<HooksListProps>;
24
- export {};
@@ -1,28 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from 'ink';
3
- import { theme } from '../../semantic-colors.js';
4
- export const HooksList = ({ hooks }) => {
5
- if (hooks.length === 0) {
6
- return (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsx(Text, { children: "No hooks configured." }) }));
7
- }
8
- // Group hooks by event name for better organization
9
- const hooksByEvent = hooks.reduce((acc, hook) => {
10
- if (!acc[hook.eventName]) {
11
- acc[hook.eventName] = [];
12
- }
13
- acc[hook.eventName].push(hook);
14
- return acc;
15
- }, {});
16
- return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: theme.status.warning, bold: true, underline: true, children: "\u26A0\uFE0F Security Warning:" }), _jsx(Text, { color: theme.status.warning, children: "Hooks can execute arbitrary commands on your system. Only use hooks from sources you trust. Review hook scripts carefully." })] }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: ["Learn more:", ' ', _jsx(Text, { color: theme.text.link, children: "https://geminicli.com/docs/hooks" })] }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, children: "Configured Hooks:" }) }), _jsx(Box, { flexDirection: "column", paddingLeft: 2, marginTop: 1, children: Object.entries(hooksByEvent).map(([eventName, eventHooks]) => (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Text, { color: theme.text.accent, bold: true, children: [eventName, ":"] }), _jsx(Box, { flexDirection: "column", paddingLeft: 2, children: eventHooks.map((hook, index) => {
17
- const hookName = hook.config.name || hook.config.command || 'unknown';
18
- const statusColor = hook.enabled
19
- ? theme.status.success
20
- : theme.text.secondary;
21
- const statusText = hook.enabled ? 'enabled' : 'disabled';
22
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: _jsxs(Text, { children: [_jsx(Text, { color: theme.text.accent, children: hookName }), _jsx(Text, { color: statusColor, children: ` [${statusText}]` })] }) }), _jsxs(Box, { paddingLeft: 2, flexDirection: "column", children: [hook.config.description && (_jsx(Text, { italic: true, children: hook.config.description })), _jsxs(Text, { dimColor: true, children: ["Source: ", hook.source, hook.config.name &&
23
- hook.config.command &&
24
- ` | Command: ${hook.config.command}`, hook.matcher && ` | Matcher: ${hook.matcher}`, hook.sequential && ` | Sequential`, hook.config.timeout &&
25
- ` | Timeout: ${hook.config.timeout}s`] })] })] }, `${eventName}-${index}`));
26
- }) })] }, eventName))) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["Tip: Use ", _jsxs(Text, { bold: true, children: ["/hooks enable ", '<hook-name>'] }), " or", ' ', _jsxs(Text, { bold: true, children: ["/hooks disable ", '<hook-name>'] }), " to toggle individual hooks. Use ", _jsx(Text, { bold: true, children: "/hooks enable-all" }), " or", ' ', _jsx(Text, { bold: true, children: "/hooks disable-all" }), " to toggle all hooks at once."] }) })] }));
27
- };
28
- //# sourceMappingURL=HooksList.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HooksList.js","sourceRoot":"","sources":["../../../../../src/ui/components/views/HooksList.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAmBjD,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,YACzC,KAAC,IAAI,uCAA4B,GAC7B,CACP,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAC/B,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAC3B,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAmD,CACpD,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,QAAC,SAAS,qDAE1C,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,2IAG1B,IACH,EAEN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,8BACS,GAAG,EACf,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,iDAAyC,IAChE,GACH,EAEN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,IAAI,wCAAyB,GAC/B,EACN,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,YACrD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAC7D,MAAC,GAAG,IAAiB,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzD,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,mBACjC,SAAS,SACL,EACP,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,YACvC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gCAC9B,MAAM,QAAQ,GACZ,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;gCACvD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO;oCAC9B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;oCACtB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gCACzB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;gCAEzD,OAAO,CACL,MAAC,GAAG,IAA+B,aAAa,EAAC,QAAQ,aACvD,KAAC,GAAG,cACF,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,YAAG,QAAQ,GAAQ,EACjD,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,YAAG,KAAK,UAAU,GAAG,GAAQ,IAChD,GACH,EACN,MAAC,GAAG,IAAC,WAAW,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACxC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAC1B,KAAC,IAAI,IAAC,MAAM,kBAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAQ,CAC9C,EACD,MAAC,IAAI,IAAC,QAAQ,+BACH,IAAI,CAAC,MAAM,EACnB,IAAI,CAAC,MAAM,CAAC,IAAI;4DACf,IAAI,CAAC,MAAM,CAAC,OAAO;4DACnB,eAAe,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EACrC,IAAI,CAAC,OAAO,IAAI,eAAe,IAAI,CAAC,OAAO,EAAE,EAC7C,IAAI,CAAC,UAAU,IAAI,eAAe,EAClC,IAAI,CAAC,MAAM,CAAC,OAAO;4DAClB,eAAe,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAClC,IACH,KArBE,GAAG,SAAS,IAAI,KAAK,EAAE,CAsB3B,CACP,CAAC;4BACJ,CAAC,CAAC,GACE,KAvCE,SAAS,CAwCb,CACP,CAAC,GACE,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,gCACH,MAAC,IAAI,IAAC,IAAI,qCAAgB,aAAa,IAAQ,SAAI,GAAG,EAC/D,MAAC,IAAI,IAAC,IAAI,sCAAiB,aAAa,IAAQ,uCACrC,KAAC,IAAI,IAAC,IAAI,wCAAyB,SAAI,GAAG,EACrD,KAAC,IAAI,IAAC,IAAI,yCAA0B,qCAC/B,GACH,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -1,12 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { type Config } from '@google/gemini-cli-core';
7
- import { type Settings } from '../../config/settings.js';
8
- export declare function useSessionRetentionCheck(config: Config, settings: Settings, onAutoEnable?: () => void): {
9
- shouldShowWarning: boolean;
10
- checkComplete: boolean;
11
- sessionsToDeleteCount: number;
12
- };
@@ -1,57 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { useState, useEffect } from 'react';
7
- import {} from '@google/gemini-cli-core';
8
- import {} from '../../config/settings.js';
9
- import { getAllSessionFiles } from '../../utils/sessionUtils.js';
10
- import { identifySessionsToDelete } from '../../utils/sessionCleanup.js';
11
- import path from 'node:path';
12
- export function useSessionRetentionCheck(config, settings, onAutoEnable) {
13
- const [shouldShowWarning, setShouldShowWarning] = useState(false);
14
- const [sessionsToDeleteCount, setSessionsToDeleteCount] = useState(0);
15
- const [checkComplete, setCheckComplete] = useState(false);
16
- useEffect(() => {
17
- // If warning already acknowledged or retention already enabled, skip check
18
- if (settings.general?.sessionRetention?.warningAcknowledged ||
19
- (settings.general?.sessionRetention?.enabled &&
20
- settings.general?.sessionRetention?.maxAge !== undefined)) {
21
- setShouldShowWarning(false);
22
- setCheckComplete(true);
23
- return;
24
- }
25
- const checkSessions = async () => {
26
- try {
27
- const chatsDir = path.join(config.storage.getProjectTempDir(), 'chats');
28
- const allFiles = await getAllSessionFiles(chatsDir, config.getSessionId());
29
- // Calculate how many sessions would be deleted if we applied a 30-day retention
30
- const sessionsToDelete = await identifySessionsToDelete(allFiles, {
31
- enabled: true,
32
- maxAge: '30d',
33
- });
34
- if (sessionsToDelete.length > 0) {
35
- setSessionsToDeleteCount(sessionsToDelete.length);
36
- setShouldShowWarning(true);
37
- }
38
- else {
39
- setShouldShowWarning(false);
40
- // If no sessions to delete, safe to auto-enable retention
41
- onAutoEnable?.();
42
- }
43
- }
44
- catch {
45
- // If we can't check sessions, default to not showing the warning to be safe
46
- setShouldShowWarning(false);
47
- }
48
- finally {
49
- setCheckComplete(true);
50
- }
51
- };
52
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
53
- checkSessions();
54
- }, [config, settings.general?.sessionRetention, onAutoEnable]);
55
- return { shouldShowWarning, checkComplete, sessionsToDeleteCount };
56
- }
57
- //# sourceMappingURL=useSessionRetentionCheck.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSessionRetentionCheck.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useSessionRetentionCheck.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAe,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAiB,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,wBAAwB,CACtC,MAAc,EACd,QAAkB,EAClB,YAAyB;IAEzB,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACb,2EAA2E;QAC3E,IACE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB;YACvD,CAAC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO;gBAC1C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,KAAK,SAAS,CAAC,EAC3D,CAAC;YACD,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC5B,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;YAC/B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,OAAO,CAAC,CAAC;gBACxE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CACvC,QAAQ,EACR,MAAM,CAAC,YAAY,EAAE,CACtB,CAAC;gBAEF,gFAAgF;gBAChF,MAAM,gBAAgB,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE;oBAChE,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,KAAK;iBACd,CAAC,CAAC;gBAEH,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,wBAAwB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;oBAClD,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAC5B,0DAA0D;oBAC1D,YAAY,EAAE,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,4EAA4E;gBAC5E,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;oBAAS,CAAC;gBACT,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;QAEF,mEAAmE;QACnE,aAAa,EAAE,CAAC;IAClB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC,CAAC;IAE/D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC;AACrE,CAAC"}
@@ -1,169 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2026 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { renderHook } from '../../test-utils/render.js';
8
- import { useSessionRetentionCheck } from './useSessionRetentionCheck.js';
9
- import {} from '@google/gemini-cli-core';
10
- import { waitFor } from '../../test-utils/async.js';
11
- // Mock utils
12
- const mockGetAllSessionFiles = vi.fn();
13
- const mockIdentifySessionsToDelete = vi.fn();
14
- vi.mock('../../utils/sessionUtils.js', () => ({
15
- getAllSessionFiles: () => mockGetAllSessionFiles(),
16
- }));
17
- vi.mock('../../utils/sessionCleanup.js', () => ({
18
- identifySessionsToDelete: () => mockIdentifySessionsToDelete(),
19
- DEFAULT_MIN_RETENTION: '30d',
20
- }));
21
- describe('useSessionRetentionCheck', () => {
22
- const mockConfig = {
23
- storage: {
24
- getProjectTempDir: () => '/mock/project/temp/dir',
25
- },
26
- getSessionId: () => 'mock-session-id',
27
- };
28
- beforeEach(() => {
29
- vi.resetAllMocks();
30
- });
31
- afterEach(() => {
32
- vi.restoreAllMocks();
33
- });
34
- it('should show warning if enabled is true but maxAge is undefined', async () => {
35
- const settings = {
36
- general: {
37
- sessionRetention: {
38
- enabled: true,
39
- maxAge: undefined,
40
- warningAcknowledged: false,
41
- },
42
- },
43
- };
44
- mockGetAllSessionFiles.mockResolvedValue(['session1.json']);
45
- mockIdentifySessionsToDelete.mockResolvedValue(['session1.json']);
46
- const { result } = renderHook(() => useSessionRetentionCheck(mockConfig, settings));
47
- await waitFor(() => {
48
- expect(result.current.checkComplete).toBe(true);
49
- expect(result.current.shouldShowWarning).toBe(true);
50
- expect(mockGetAllSessionFiles).toHaveBeenCalled();
51
- expect(mockIdentifySessionsToDelete).toHaveBeenCalled();
52
- });
53
- });
54
- it('should not show warning if warningAcknowledged is true', async () => {
55
- const settings = {
56
- general: {
57
- sessionRetention: {
58
- warningAcknowledged: true,
59
- },
60
- },
61
- };
62
- const { result } = renderHook(() => useSessionRetentionCheck(mockConfig, settings));
63
- await waitFor(() => {
64
- expect(result.current.checkComplete).toBe(true);
65
- expect(result.current.shouldShowWarning).toBe(false);
66
- expect(mockGetAllSessionFiles).not.toHaveBeenCalled();
67
- expect(mockIdentifySessionsToDelete).not.toHaveBeenCalled();
68
- });
69
- });
70
- it('should not show warning if retention is already enabled', async () => {
71
- const settings = {
72
- general: {
73
- sessionRetention: {
74
- enabled: true,
75
- maxAge: '30d', // Explicitly enabled with non-default
76
- },
77
- },
78
- };
79
- const { result } = renderHook(() => useSessionRetentionCheck(mockConfig, settings));
80
- await waitFor(() => {
81
- expect(result.current.checkComplete).toBe(true);
82
- expect(result.current.shouldShowWarning).toBe(false);
83
- expect(mockGetAllSessionFiles).not.toHaveBeenCalled();
84
- expect(mockIdentifySessionsToDelete).not.toHaveBeenCalled();
85
- });
86
- });
87
- it('should show warning if sessions to delete exist', async () => {
88
- const settings = {
89
- general: {
90
- sessionRetention: {
91
- enabled: false,
92
- warningAcknowledged: false,
93
- },
94
- },
95
- };
96
- mockGetAllSessionFiles.mockResolvedValue([
97
- 'session1.json',
98
- 'session2.json',
99
- ]);
100
- mockIdentifySessionsToDelete.mockResolvedValue(['session1.json']); // 1 session to delete
101
- const { result } = renderHook(() => useSessionRetentionCheck(mockConfig, settings));
102
- await waitFor(() => {
103
- expect(result.current.checkComplete).toBe(true);
104
- expect(result.current.shouldShowWarning).toBe(true);
105
- expect(result.current.sessionsToDeleteCount).toBe(1);
106
- expect(mockGetAllSessionFiles).toHaveBeenCalled();
107
- expect(mockIdentifySessionsToDelete).toHaveBeenCalled();
108
- });
109
- });
110
- it('should call onAutoEnable if no sessions to delete and currently disabled', async () => {
111
- const settings = {
112
- general: {
113
- sessionRetention: {
114
- enabled: false,
115
- warningAcknowledged: false,
116
- },
117
- },
118
- };
119
- mockGetAllSessionFiles.mockResolvedValue(['session1.json']);
120
- mockIdentifySessionsToDelete.mockResolvedValue([]); // 0 sessions to delete
121
- const onAutoEnable = vi.fn();
122
- const { result } = renderHook(() => useSessionRetentionCheck(mockConfig, settings, onAutoEnable));
123
- await waitFor(() => {
124
- expect(result.current.checkComplete).toBe(true);
125
- expect(result.current.shouldShowWarning).toBe(false);
126
- expect(onAutoEnable).toHaveBeenCalled();
127
- });
128
- });
129
- it('should not show warning if no sessions to delete', async () => {
130
- const settings = {
131
- general: {
132
- sessionRetention: {
133
- enabled: false,
134
- warningAcknowledged: false,
135
- },
136
- },
137
- };
138
- mockGetAllSessionFiles.mockResolvedValue([
139
- 'session1.json',
140
- 'session2.json',
141
- ]);
142
- mockIdentifySessionsToDelete.mockResolvedValue([]); // 0 sessions to delete
143
- const { result } = renderHook(() => useSessionRetentionCheck(mockConfig, settings));
144
- await waitFor(() => {
145
- expect(result.current.checkComplete).toBe(true);
146
- expect(result.current.shouldShowWarning).toBe(false);
147
- expect(result.current.sessionsToDeleteCount).toBe(0);
148
- expect(mockGetAllSessionFiles).toHaveBeenCalled();
149
- expect(mockIdentifySessionsToDelete).toHaveBeenCalled();
150
- });
151
- });
152
- it('should handle errors gracefully (assume no warning)', async () => {
153
- const settings = {
154
- general: {
155
- sessionRetention: {
156
- enabled: false,
157
- warningAcknowledged: false,
158
- },
159
- },
160
- };
161
- mockGetAllSessionFiles.mockRejectedValue(new Error('FS Error'));
162
- const { result } = renderHook(() => useSessionRetentionCheck(mockConfig, settings));
163
- await waitFor(() => {
164
- expect(result.current.checkComplete).toBe(true);
165
- expect(result.current.shouldShowWarning).toBe(false);
166
- });
167
- });
168
- });
169
- //# sourceMappingURL=useSessionRetentionCheck.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSessionRetentionCheck.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useSessionRetentionCheck.test.ts"],"names":[],"mappings":"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"}