@machina.ai/cell-cli 1.8.2-rc1 → 1.10.0-rc1

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 (253) hide show
  1. package/dist/package.json +4 -3
  2. package/dist/src/commands/extensions/examples/context/GEMINI.md +9 -3
  3. package/dist/src/commands/extensions/install.d.ts +1 -0
  4. package/dist/src/commands/extensions/install.js +9 -3
  5. package/dist/src/commands/extensions/install.js.map +1 -1
  6. package/dist/src/commands/extensions/install.test.js +9 -9
  7. package/dist/src/commands/extensions/install.test.js.map +1 -1
  8. package/dist/src/commands/extensions/link.js +2 -2
  9. package/dist/src/commands/extensions/link.js.map +1 -1
  10. package/dist/src/commands/extensions/uninstall.js +1 -1
  11. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  12. package/dist/src/commands/extensions/update.js +2 -6
  13. package/dist/src/commands/extensions/update.js.map +1 -1
  14. package/dist/src/commands/mcp/list.js +2 -2
  15. package/dist/src/commands/mcp/list.js.map +1 -1
  16. package/dist/src/config/config.d.ts +3 -3
  17. package/dist/src/config/config.js +49 -10
  18. package/dist/src/config/config.js.map +1 -1
  19. package/dist/src/config/extension.d.ts +20 -18
  20. package/dist/src/config/extension.js +75 -52
  21. package/dist/src/config/extension.js.map +1 -1
  22. package/dist/src/config/extensions/extensionEnablement.d.ts +2 -2
  23. package/dist/src/config/extensions/extensionEnablement.js +1 -2
  24. package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
  25. package/dist/src/config/extensions/extensionEnablement.test.js +6 -5
  26. package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
  27. package/dist/src/config/extensions/github.d.ts +8 -1
  28. package/dist/src/config/extensions/github.js +40 -66
  29. package/dist/src/config/extensions/github.js.map +1 -1
  30. package/dist/src/config/extensions/github.test.js +56 -12
  31. package/dist/src/config/extensions/github.test.js.map +1 -1
  32. package/dist/src/config/extensions/github_fetch.d.ts +7 -0
  33. package/dist/src/config/extensions/github_fetch.js +34 -0
  34. package/dist/src/config/extensions/github_fetch.js.map +1 -0
  35. package/dist/src/config/extensions/update.d.ts +1 -1
  36. package/dist/src/config/extensions/update.js +15 -12
  37. package/dist/src/config/extensions/update.js.map +1 -1
  38. package/dist/src/config/extensions/update.test.js +5 -5
  39. package/dist/src/config/extensions/update.test.js.map +1 -1
  40. package/dist/src/config/keyBindings.js +1 -1
  41. package/dist/src/config/keyBindings.js.map +1 -1
  42. package/dist/src/config/policy.js +2 -2
  43. package/dist/src/config/policy.js.map +1 -1
  44. package/dist/src/config/settings.d.ts +10 -1
  45. package/dist/src/config/settings.js +17 -6
  46. package/dist/src/config/settings.js.map +1 -1
  47. package/dist/src/config/settingsSchema.d.ts +124 -3
  48. package/dist/src/config/settingsSchema.js +125 -4
  49. package/dist/src/config/settingsSchema.js.map +1 -1
  50. package/dist/src/config/trustedFolders.d.ts +0 -1
  51. package/dist/src/config/trustedFolders.js +2 -3
  52. package/dist/src/config/trustedFolders.js.map +1 -1
  53. package/dist/src/gemini.js +24 -17
  54. package/dist/src/gemini.js.map +1 -1
  55. package/dist/src/gemini.test.js +20 -8
  56. package/dist/src/gemini.test.js.map +1 -1
  57. package/dist/src/generated/git-commit.d.ts +2 -2
  58. package/dist/src/generated/git-commit.js +2 -2
  59. package/dist/src/generated/git-commit.js.map +1 -1
  60. package/dist/src/nonInteractiveCli.js +14 -1
  61. package/dist/src/nonInteractiveCli.js.map +1 -1
  62. package/dist/src/nonInteractiveCliCommands.js +1 -2
  63. package/dist/src/nonInteractiveCliCommands.js.map +1 -1
  64. package/dist/src/services/BuiltinCommandLoader.js +3 -0
  65. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  66. package/dist/src/services/BuiltinCommandLoader.test.js +37 -0
  67. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
  68. package/dist/src/services/FileCommandLoader.d.ts +1 -1
  69. package/dist/src/services/FileCommandLoader.js +4 -4
  70. package/dist/src/services/FileCommandLoader.js.map +1 -1
  71. package/dist/src/services/prompt-processors/shellProcessor.js +1 -1
  72. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  73. package/dist/src/test-utils/render.d.ts +11 -4
  74. package/dist/src/test-utils/render.js +53 -2
  75. package/dist/src/test-utils/render.js.map +1 -1
  76. package/dist/src/ui/App.js +1 -17
  77. package/dist/src/ui/App.js.map +1 -1
  78. package/dist/src/ui/AppContainer.js +22 -7
  79. package/dist/src/ui/AppContainer.js.map +1 -1
  80. package/dist/src/ui/auth/AuthInProgress.js +2 -2
  81. package/dist/src/ui/auth/AuthInProgress.js.map +1 -1
  82. package/dist/src/ui/commands/chatCommand.js +7 -24
  83. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  84. package/dist/src/ui/commands/extensionsCommand.js +30 -32
  85. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  86. package/dist/src/ui/commands/memoryCommand.js +23 -5
  87. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  88. package/dist/src/ui/commands/profileCommand.d.ts +7 -0
  89. package/dist/src/ui/commands/profileCommand.js +23 -0
  90. package/dist/src/ui/commands/profileCommand.js.map +1 -0
  91. package/dist/src/ui/commands/setupGithubCommand.test.js +2 -1
  92. package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -1
  93. package/dist/src/ui/commands/types.d.ts +1 -0
  94. package/dist/src/ui/commands/types.js.map +1 -1
  95. package/dist/src/ui/components/AnsiOutput.d.ts +1 -0
  96. package/dist/src/ui/components/AnsiOutput.js +5 -5
  97. package/dist/src/ui/components/AnsiOutput.js.map +1 -1
  98. package/dist/src/ui/components/AnsiOutput.test.js +6 -6
  99. package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
  100. package/dist/src/ui/components/AsciiArt.d.ts +3 -3
  101. package/dist/src/ui/components/AsciiArt.js +3 -3
  102. package/dist/src/ui/components/CliSpinner.d.ts +10 -0
  103. package/dist/src/ui/components/CliSpinner.js +20 -0
  104. package/dist/src/ui/components/CliSpinner.js.map +1 -0
  105. package/dist/src/ui/components/Composer.js +4 -7
  106. package/dist/src/ui/components/Composer.js.map +1 -1
  107. package/dist/src/ui/components/ContextSummaryDisplay.js +2 -2
  108. package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
  109. package/dist/src/ui/components/DebugProfiler.d.ts +18 -0
  110. package/dist/src/ui/components/DebugProfiler.js +158 -12
  111. package/dist/src/ui/components/DebugProfiler.js.map +1 -1
  112. package/dist/src/ui/components/DebugProfiler.test.d.ts +6 -0
  113. package/dist/src/ui/components/DebugProfiler.test.js +140 -0
  114. package/dist/src/ui/components/DebugProfiler.test.js.map +1 -0
  115. package/dist/src/ui/components/FolderTrustDialog.js +9 -5
  116. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  117. package/dist/src/ui/components/FolderTrustDialog.test.js +7 -11
  118. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  119. package/dist/src/ui/components/Footer.js +7 -6
  120. package/dist/src/ui/components/Footer.js.map +1 -1
  121. package/dist/src/ui/components/GeminiRespondingSpinner.js +2 -2
  122. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  123. package/dist/src/ui/components/Help.js +1 -1
  124. package/dist/src/ui/components/Help.js.map +1 -1
  125. package/dist/src/ui/components/HistoryItemDisplay.js +2 -1
  126. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  127. package/dist/src/ui/components/InputPrompt.d.ts +7 -1
  128. package/dist/src/ui/components/InputPrompt.js +50 -25
  129. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  130. package/dist/src/ui/components/MainContent.js +1 -1
  131. package/dist/src/ui/components/MainContent.js.map +1 -1
  132. package/dist/src/ui/components/Notifications.js +12 -4
  133. package/dist/src/ui/components/Notifications.js.map +1 -1
  134. package/dist/src/ui/components/SettingsDialog.js +1 -1
  135. package/dist/src/ui/components/SettingsDialog.test.js +1 -1
  136. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  137. package/dist/src/ui/components/WorkspaceMigrationDialog.d.ts +2 -2
  138. package/dist/src/ui/components/WorkspaceMigrationDialog.js +2 -2
  139. package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
  140. package/dist/src/ui/components/messages/CompressionMessage.js +3 -3
  141. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  142. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
  143. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  144. package/dist/src/ui/components/messages/ToolGroupMessage.js +1 -1
  145. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  146. package/dist/src/ui/components/messages/ToolMessage.js +2 -2
  147. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  148. package/dist/src/ui/components/views/ChatList.d.ts +12 -0
  149. package/dist/src/ui/components/views/ChatList.js +17 -0
  150. package/dist/src/ui/components/views/ChatList.js.map +1 -0
  151. package/dist/src/ui/components/views/ChatList.test.d.ts +6 -0
  152. package/dist/src/ui/components/views/ChatList.test.js +42 -0
  153. package/dist/src/ui/components/views/ChatList.test.js.map +1 -0
  154. package/dist/src/ui/contexts/KeypressContext.js +43 -3
  155. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  156. package/dist/src/ui/contexts/KeypressContext.test.js +127 -0
  157. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  158. package/dist/src/ui/contexts/UIStateContext.d.ts +3 -1
  159. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  160. package/dist/src/ui/hooks/shellCommandProcessor.js +5 -6
  161. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  162. package/dist/src/ui/hooks/shellCommandProcessor.test.js +19 -32
  163. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
  164. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -1
  165. package/dist/src/ui/hooks/slashCommandProcessor.js +9 -7
  166. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  167. package/dist/src/ui/hooks/useExtensionUpdates.js +68 -18
  168. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
  169. package/dist/src/ui/hooks/useExtensionUpdates.test.js +7 -4
  170. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
  171. package/dist/src/ui/hooks/useFlickerDetector.d.ts +14 -0
  172. package/dist/src/ui/hooks/useFlickerDetector.js +37 -0
  173. package/dist/src/ui/hooks/useFlickerDetector.js.map +1 -0
  174. package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +6 -0
  175. package/dist/src/ui/hooks/useFlickerDetector.test.js +102 -0
  176. package/dist/src/ui/hooks/useFlickerDetector.test.js.map +1 -0
  177. package/dist/src/ui/hooks/useFolderTrust.d.ts +2 -1
  178. package/dist/src/ui/hooks/useFolderTrust.js +12 -3
  179. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  180. package/dist/src/ui/hooks/useGeminiStream.js +33 -2
  181. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  182. package/dist/src/ui/hooks/useHistoryManager.js +3 -3
  183. package/dist/src/ui/hooks/useHistoryManager.js.map +1 -1
  184. package/dist/src/ui/hooks/usePhraseCycler.js +1 -0
  185. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  186. package/dist/src/ui/hooks/useSelectionList.js +50 -23
  187. package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
  188. package/dist/src/ui/hooks/useSelectionList.test.js +24 -0
  189. package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
  190. package/dist/src/ui/hooks/useShellHistory.test.js +16 -10
  191. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
  192. package/dist/src/ui/hooks/useTerminalSize.js +2 -3
  193. package/dist/src/ui/hooks/useTerminalSize.js.map +1 -1
  194. package/dist/src/ui/hooks/useWorkspaceMigration.d.ts +2 -2
  195. package/dist/src/ui/hooks/useWorkspaceMigration.js +13 -8
  196. package/dist/src/ui/hooks/useWorkspaceMigration.js.map +1 -1
  197. package/dist/src/ui/layouts/DefaultAppLayout.d.ts +1 -3
  198. package/dist/src/ui/layouts/DefaultAppLayout.js +5 -2
  199. package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -1
  200. package/dist/src/ui/layouts/ScreenReaderAppLayout.js +4 -1
  201. package/dist/src/ui/layouts/ScreenReaderAppLayout.js.map +1 -1
  202. package/dist/src/ui/noninteractive/nonInteractiveUi.js +1 -0
  203. package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -1
  204. package/dist/src/ui/state/extensions.d.ts +22 -3
  205. package/dist/src/ui/state/extensions.js +26 -4
  206. package/dist/src/ui/state/extensions.js.map +1 -1
  207. package/dist/src/ui/types.d.ts +11 -2
  208. package/dist/src/ui/types.js +1 -0
  209. package/dist/src/ui/types.js.map +1 -1
  210. package/dist/src/ui/utils/ui-sizing.d.ts +7 -0
  211. package/dist/src/ui/utils/ui-sizing.js +23 -0
  212. package/dist/src/ui/utils/ui-sizing.js.map +1 -0
  213. package/dist/src/utils/commentJson.js +95 -13
  214. package/dist/src/utils/commentJson.js.map +1 -1
  215. package/dist/src/utils/commentJson.test.js +161 -0
  216. package/dist/src/utils/commentJson.test.js.map +1 -1
  217. package/dist/src/utils/errors.d.ts +8 -3
  218. package/dist/src/utils/errors.js +23 -13
  219. package/dist/src/utils/errors.js.map +1 -1
  220. package/dist/src/utils/errors.test.js +40 -46
  221. package/dist/src/utils/errors.test.js.map +1 -1
  222. package/dist/src/utils/events.d.ts +2 -1
  223. package/dist/src/utils/events.js +1 -0
  224. package/dist/src/utils/events.js.map +1 -1
  225. package/dist/src/utils/handleAutoUpdate.js +4 -1
  226. package/dist/src/utils/handleAutoUpdate.js.map +1 -1
  227. package/dist/src/utils/installationInfo.d.ts +1 -0
  228. package/dist/src/utils/installationInfo.js +2 -0
  229. package/dist/src/utils/installationInfo.js.map +1 -1
  230. package/dist/src/utils/sandbox.js +8 -8
  231. package/dist/src/utils/sandbox.js.map +1 -1
  232. package/dist/src/utils/sessionCleanup.d.ts +22 -0
  233. package/dist/src/utils/sessionCleanup.integration.test.d.ts +6 -0
  234. package/dist/src/utils/sessionCleanup.integration.test.js +182 -0
  235. package/dist/src/utils/sessionCleanup.integration.test.js.map +1 -0
  236. package/dist/src/utils/sessionCleanup.js +214 -0
  237. package/dist/src/utils/sessionCleanup.js.map +1 -0
  238. package/dist/src/utils/sessionCleanup.test.d.ts +6 -0
  239. package/dist/src/utils/sessionCleanup.test.js +1232 -0
  240. package/dist/src/utils/sessionCleanup.test.js.map +1 -0
  241. package/dist/src/utils/sessionUtils.d.ts +37 -0
  242. package/dist/src/utils/sessionUtils.js +71 -0
  243. package/dist/src/utils/sessionUtils.js.map +1 -0
  244. package/dist/src/validateNonInterActiveAuth.js +6 -7
  245. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  246. package/dist/src/zed-integration/acp.js +1 -2
  247. package/dist/src/zed-integration/acp.js.map +1 -1
  248. package/dist/src/zed-integration/schema.d.ts +176 -176
  249. package/dist/src/zed-integration/zedIntegration.d.ts +2 -3
  250. package/dist/src/zed-integration/zedIntegration.js +7 -26
  251. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  252. package/dist/tsconfig.tsbuildinfo +1 -1
  253. package/package.json +4 -3
@@ -0,0 +1,214 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'node:fs/promises';
7
+ import * as path from 'node:path';
8
+ import {} from '@google/gemini-cli-core';
9
+ import { getAllSessionFiles } from './sessionUtils.js';
10
+ // Constants
11
+ export const DEFAULT_MIN_RETENTION = '1d';
12
+ const MIN_MAX_COUNT = 1;
13
+ const MULTIPLIERS = {
14
+ h: 60 * 60 * 1000, // hours to ms
15
+ d: 24 * 60 * 60 * 1000, // days to ms
16
+ w: 7 * 24 * 60 * 60 * 1000, // weeks to ms
17
+ m: 30 * 24 * 60 * 60 * 1000, // months (30 days) to ms
18
+ };
19
+ /**
20
+ * Main entry point for session cleanup during CLI startup
21
+ */
22
+ export async function cleanupExpiredSessions(config, settings) {
23
+ const result = {
24
+ disabled: false,
25
+ scanned: 0,
26
+ deleted: 0,
27
+ skipped: 0,
28
+ failed: 0,
29
+ };
30
+ try {
31
+ // Early exit if cleanup is disabled
32
+ if (!settings.general?.sessionRetention?.enabled) {
33
+ return { ...result, disabled: true };
34
+ }
35
+ const retentionConfig = settings.general.sessionRetention;
36
+ const chatsDir = path.join(config.storage.getProjectTempDir(), 'chats');
37
+ // Validate retention configuration
38
+ const validationErrorMessage = validateRetentionConfig(config, retentionConfig);
39
+ if (validationErrorMessage) {
40
+ // Log validation errors to console for visibility
41
+ console.error(`Session cleanup disabled: ${validationErrorMessage}`);
42
+ return { ...result, disabled: true };
43
+ }
44
+ // Get all session files (including corrupted ones) for this project
45
+ const allFiles = await getAllSessionFiles(chatsDir, config.getSessionId());
46
+ result.scanned = allFiles.length;
47
+ if (allFiles.length === 0) {
48
+ return result;
49
+ }
50
+ // Determine which sessions to delete (corrupted and expired)
51
+ const sessionsToDelete = await identifySessionsToDelete(allFiles, retentionConfig);
52
+ // Delete all sessions that need to be deleted
53
+ for (const sessionToDelete of sessionsToDelete) {
54
+ try {
55
+ const sessionPath = path.join(chatsDir, sessionToDelete.fileName);
56
+ await fs.unlink(sessionPath);
57
+ if (config.getDebugMode()) {
58
+ if (sessionToDelete.sessionInfo === null) {
59
+ console.debug(`Deleted corrupted session file: ${sessionToDelete.fileName}`);
60
+ }
61
+ else {
62
+ console.debug(`Deleted expired session: ${sessionToDelete.sessionInfo.id} (${sessionToDelete.sessionInfo.lastUpdated})`);
63
+ }
64
+ }
65
+ result.deleted++;
66
+ }
67
+ catch (error) {
68
+ // Ignore ENOENT errors (file already deleted)
69
+ if (error instanceof Error &&
70
+ 'code' in error &&
71
+ error.code === 'ENOENT') {
72
+ // File already deleted, do nothing.
73
+ }
74
+ else {
75
+ // Log error directly to console
76
+ const sessionId = sessionToDelete.sessionInfo === null
77
+ ? sessionToDelete.fileName
78
+ : sessionToDelete.sessionInfo.id;
79
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
80
+ console.error(`Failed to delete session ${sessionId}: ${errorMessage}`);
81
+ result.failed++;
82
+ }
83
+ }
84
+ }
85
+ result.skipped = result.scanned - result.deleted - result.failed;
86
+ if (config.getDebugMode() && result.deleted > 0) {
87
+ console.debug(`Session cleanup: deleted ${result.deleted}, skipped ${result.skipped}, failed ${result.failed}`);
88
+ }
89
+ }
90
+ catch (error) {
91
+ // Global error handler - don't let cleanup failures break startup
92
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
93
+ console.error(`Session cleanup failed: ${errorMessage}`);
94
+ result.failed++;
95
+ }
96
+ return result;
97
+ }
98
+ /**
99
+ * Identifies sessions that should be deleted (corrupted or expired based on retention policy)
100
+ */
101
+ async function identifySessionsToDelete(allFiles, retentionConfig) {
102
+ const sessionsToDelete = [];
103
+ // All corrupted files should be deleted
104
+ sessionsToDelete.push(...allFiles.filter((entry) => entry.sessionInfo === null));
105
+ // Now handle valid sessions based on retention policy
106
+ const validSessions = allFiles.filter((entry) => entry.sessionInfo !== null);
107
+ if (validSessions.length === 0) {
108
+ return sessionsToDelete;
109
+ }
110
+ const now = new Date();
111
+ // Calculate cutoff date for age-based retention
112
+ let cutoffDate = null;
113
+ if (retentionConfig.maxAge) {
114
+ try {
115
+ const maxAgeMs = parseRetentionPeriod(retentionConfig.maxAge);
116
+ cutoffDate = new Date(now.getTime() - maxAgeMs);
117
+ }
118
+ catch {
119
+ // This should not happen as validation should have caught it,
120
+ // but handle gracefully just in case
121
+ cutoffDate = null;
122
+ }
123
+ }
124
+ // Sort valid sessions by lastUpdated (newest first) for count-based retention
125
+ const sortedValidSessions = [...validSessions].sort((a, b) => new Date(b.sessionInfo.lastUpdated).getTime() -
126
+ new Date(a.sessionInfo.lastUpdated).getTime());
127
+ // Separate deletable sessions from the active session
128
+ const deletableSessions = sortedValidSessions.filter((entry) => !entry.sessionInfo.isCurrentSession);
129
+ // Calculate how many deletable sessions to keep (accounting for the active session)
130
+ const hasActiveSession = sortedValidSessions.some((e) => e.sessionInfo.isCurrentSession);
131
+ const maxDeletableSessions = retentionConfig.maxCount && hasActiveSession
132
+ ? Math.max(0, retentionConfig.maxCount - 1)
133
+ : retentionConfig.maxCount;
134
+ for (let i = 0; i < deletableSessions.length; i++) {
135
+ const entry = deletableSessions[i];
136
+ const session = entry.sessionInfo;
137
+ let shouldDelete = false;
138
+ // Age-based retention check
139
+ if (cutoffDate && new Date(session.lastUpdated) < cutoffDate) {
140
+ shouldDelete = true;
141
+ }
142
+ // Count-based retention check (keep only N most recent deletable sessions)
143
+ if (maxDeletableSessions !== undefined && i >= maxDeletableSessions) {
144
+ shouldDelete = true;
145
+ }
146
+ if (shouldDelete) {
147
+ sessionsToDelete.push(entry);
148
+ }
149
+ }
150
+ return sessionsToDelete;
151
+ }
152
+ /**
153
+ * Parses retention period strings like "30d", "7d", "24h" into milliseconds
154
+ * @throws {Error} If the format is invalid
155
+ */
156
+ function parseRetentionPeriod(period) {
157
+ const match = period.match(/^(\d+)([dhwm])$/);
158
+ if (!match) {
159
+ throw new Error(`Invalid retention period format: ${period}. Expected format: <number><unit> where unit is h, d, w, or m`);
160
+ }
161
+ const value = parseInt(match[1], 10);
162
+ const unit = match[2];
163
+ // Reject zero values as they're semantically invalid
164
+ if (value === 0) {
165
+ throw new Error(`Invalid retention period: ${period}. Value must be greater than 0`);
166
+ }
167
+ return value * MULTIPLIERS[unit];
168
+ }
169
+ /**
170
+ * Validates retention configuration
171
+ */
172
+ function validateRetentionConfig(config, retentionConfig) {
173
+ if (!retentionConfig.enabled) {
174
+ return 'Retention not enabled';
175
+ }
176
+ // Validate maxAge if provided
177
+ if (retentionConfig.maxAge) {
178
+ let maxAgeMs;
179
+ try {
180
+ maxAgeMs = parseRetentionPeriod(retentionConfig.maxAge);
181
+ }
182
+ catch (error) {
183
+ return error.toString();
184
+ }
185
+ // Enforce minimum retention period
186
+ const minRetention = retentionConfig.minRetention || DEFAULT_MIN_RETENTION;
187
+ let minRetentionMs;
188
+ try {
189
+ minRetentionMs = parseRetentionPeriod(minRetention);
190
+ }
191
+ catch (error) {
192
+ // If minRetention format is invalid, fall back to default
193
+ if (config.getDebugMode()) {
194
+ console.error(`Failed to parse minRetention: ${error}`);
195
+ }
196
+ minRetentionMs = parseRetentionPeriod(DEFAULT_MIN_RETENTION);
197
+ }
198
+ if (maxAgeMs < minRetentionMs) {
199
+ return `maxAge cannot be less than minRetention (${minRetention})`;
200
+ }
201
+ }
202
+ // Validate maxCount if provided
203
+ if (retentionConfig.maxCount !== undefined) {
204
+ if (retentionConfig.maxCount < MIN_MAX_COUNT) {
205
+ return `maxCount must be at least ${MIN_MAX_COUNT}`;
206
+ }
207
+ }
208
+ // At least one retention method must be specified
209
+ if (!retentionConfig.maxAge && retentionConfig.maxCount === undefined) {
210
+ return 'Either maxAge or maxCount must be specified';
211
+ }
212
+ return null;
213
+ }
214
+ //# sourceMappingURL=sessionCleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionCleanup.js","sourceRoot":"","sources":["../../../src/utils/sessionCleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};