@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.
- package/dist/package.json +4 -3
- package/dist/src/commands/extensions/examples/context/GEMINI.md +9 -3
- package/dist/src/commands/extensions/install.d.ts +1 -0
- package/dist/src/commands/extensions/install.js +9 -3
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +9 -9
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.js +2 -2
- package/dist/src/commands/extensions/link.js.map +1 -1
- package/dist/src/commands/extensions/uninstall.js +1 -1
- package/dist/src/commands/extensions/uninstall.js.map +1 -1
- package/dist/src/commands/extensions/update.js +2 -6
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/mcp/list.js +2 -2
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/config/config.d.ts +3 -3
- package/dist/src/config/config.js +49 -10
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +20 -18
- package/dist/src/config/extension.js +75 -52
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.d.ts +2 -2
- package/dist/src/config/extensions/extensionEnablement.js +1 -2
- package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.test.js +6 -5
- package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
- package/dist/src/config/extensions/github.d.ts +8 -1
- package/dist/src/config/extensions/github.js +40 -66
- package/dist/src/config/extensions/github.js.map +1 -1
- package/dist/src/config/extensions/github.test.js +56 -12
- package/dist/src/config/extensions/github.test.js.map +1 -1
- package/dist/src/config/extensions/github_fetch.d.ts +7 -0
- package/dist/src/config/extensions/github_fetch.js +34 -0
- package/dist/src/config/extensions/github_fetch.js.map +1 -0
- package/dist/src/config/extensions/update.d.ts +1 -1
- package/dist/src/config/extensions/update.js +15 -12
- package/dist/src/config/extensions/update.js.map +1 -1
- package/dist/src/config/extensions/update.test.js +5 -5
- package/dist/src/config/extensions/update.test.js.map +1 -1
- package/dist/src/config/keyBindings.js +1 -1
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/policy.js +2 -2
- package/dist/src/config/policy.js.map +1 -1
- package/dist/src/config/settings.d.ts +10 -1
- package/dist/src/config/settings.js +17 -6
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +124 -3
- package/dist/src/config/settingsSchema.js +125 -4
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/trustedFolders.d.ts +0 -1
- package/dist/src/config/trustedFolders.js +2 -3
- package/dist/src/config/trustedFolders.js.map +1 -1
- package/dist/src/gemini.js +24 -17
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +20 -8
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/nonInteractiveCli.js +14 -1
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCliCommands.js +1 -2
- package/dist/src/nonInteractiveCliCommands.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +3 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.test.js +37 -0
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
- package/dist/src/services/FileCommandLoader.d.ts +1 -1
- package/dist/src/services/FileCommandLoader.js +4 -4
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/services/prompt-processors/shellProcessor.js +1 -1
- package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
- package/dist/src/test-utils/render.d.ts +11 -4
- package/dist/src/test-utils/render.js +53 -2
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/App.js +1 -17
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/AppContainer.js +22 -7
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/auth/AuthInProgress.js +2 -2
- package/dist/src/ui/auth/AuthInProgress.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +7 -24
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +30 -32
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +23 -5
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.d.ts +7 -0
- package/dist/src/ui/commands/profileCommand.js +23 -0
- package/dist/src/ui/commands/profileCommand.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.test.js +2 -1
- package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +1 -0
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.d.ts +1 -0
- package/dist/src/ui/components/AnsiOutput.js +5 -5
- package/dist/src/ui/components/AnsiOutput.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.test.js +6 -6
- package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
- package/dist/src/ui/components/AsciiArt.d.ts +3 -3
- package/dist/src/ui/components/AsciiArt.js +3 -3
- package/dist/src/ui/components/CliSpinner.d.ts +10 -0
- package/dist/src/ui/components/CliSpinner.js +20 -0
- package/dist/src/ui/components/CliSpinner.js.map +1 -0
- package/dist/src/ui/components/Composer.js +4 -7
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/ContextSummaryDisplay.js +2 -2
- package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/DebugProfiler.d.ts +18 -0
- package/dist/src/ui/components/DebugProfiler.js +158 -12
- package/dist/src/ui/components/DebugProfiler.js.map +1 -1
- package/dist/src/ui/components/DebugProfiler.test.d.ts +6 -0
- package/dist/src/ui/components/DebugProfiler.test.js +140 -0
- package/dist/src/ui/components/DebugProfiler.test.js.map +1 -0
- package/dist/src/ui/components/FolderTrustDialog.js +9 -5
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +7 -11
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +7 -6
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.js +2 -2
- package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
- package/dist/src/ui/components/Help.js +1 -1
- package/dist/src/ui/components/Help.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js +2 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.d.ts +7 -1
- package/dist/src/ui/components/InputPrompt.js +50 -25
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/MainContent.js +1 -1
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/Notifications.js +12 -4
- package/dist/src/ui/components/Notifications.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.js +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/WorkspaceMigrationDialog.d.ts +2 -2
- package/dist/src/ui/components/WorkspaceMigrationDialog.js +2 -2
- package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
- package/dist/src/ui/components/messages/CompressionMessage.js +3 -3
- package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +2 -2
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/views/ChatList.d.ts +12 -0
- package/dist/src/ui/components/views/ChatList.js +17 -0
- package/dist/src/ui/components/views/ChatList.js.map +1 -0
- package/dist/src/ui/components/views/ChatList.test.d.ts +6 -0
- package/dist/src/ui/components/views/ChatList.test.js +42 -0
- package/dist/src/ui/components/views/ChatList.test.js.map +1 -0
- package/dist/src/ui/contexts/KeypressContext.js +43 -3
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +127 -0
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +3 -1
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +5 -6
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +19 -32
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +9 -7
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.js +68 -18
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +7 -4
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
- package/dist/src/ui/hooks/useFlickerDetector.d.ts +14 -0
- package/dist/src/ui/hooks/useFlickerDetector.js +37 -0
- package/dist/src/ui/hooks/useFlickerDetector.js.map +1 -0
- package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +6 -0
- package/dist/src/ui/hooks/useFlickerDetector.test.js +102 -0
- package/dist/src/ui/hooks/useFlickerDetector.test.js.map +1 -0
- package/dist/src/ui/hooks/useFolderTrust.d.ts +2 -1
- package/dist/src/ui/hooks/useFolderTrust.js +12 -3
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +33 -2
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useHistoryManager.js +3 -3
- package/dist/src/ui/hooks/useHistoryManager.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +1 -0
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/useSelectionList.js +50 -23
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
- package/dist/src/ui/hooks/useSelectionList.test.js +24 -0
- package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
- package/dist/src/ui/hooks/useShellHistory.test.js +16 -10
- package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useTerminalSize.js +2 -3
- package/dist/src/ui/hooks/useTerminalSize.js.map +1 -1
- package/dist/src/ui/hooks/useWorkspaceMigration.d.ts +2 -2
- package/dist/src/ui/hooks/useWorkspaceMigration.js +13 -8
- package/dist/src/ui/hooks/useWorkspaceMigration.js.map +1 -1
- package/dist/src/ui/layouts/DefaultAppLayout.d.ts +1 -3
- package/dist/src/ui/layouts/DefaultAppLayout.js +5 -2
- package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -1
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js +4 -1
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js.map +1 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +1 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -1
- package/dist/src/ui/state/extensions.d.ts +22 -3
- package/dist/src/ui/state/extensions.js +26 -4
- package/dist/src/ui/state/extensions.js.map +1 -1
- package/dist/src/ui/types.d.ts +11 -2
- package/dist/src/ui/types.js +1 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/ui-sizing.d.ts +7 -0
- package/dist/src/ui/utils/ui-sizing.js +23 -0
- package/dist/src/ui/utils/ui-sizing.js.map +1 -0
- package/dist/src/utils/commentJson.js +95 -13
- package/dist/src/utils/commentJson.js.map +1 -1
- package/dist/src/utils/commentJson.test.js +161 -0
- package/dist/src/utils/commentJson.test.js.map +1 -1
- package/dist/src/utils/errors.d.ts +8 -3
- package/dist/src/utils/errors.js +23 -13
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.js +40 -46
- package/dist/src/utils/errors.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +2 -1
- package/dist/src/utils/events.js +1 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/handleAutoUpdate.js +4 -1
- package/dist/src/utils/handleAutoUpdate.js.map +1 -1
- package/dist/src/utils/installationInfo.d.ts +1 -0
- package/dist/src/utils/installationInfo.js +2 -0
- package/dist/src/utils/installationInfo.js.map +1 -1
- package/dist/src/utils/sandbox.js +8 -8
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/sessionCleanup.d.ts +22 -0
- package/dist/src/utils/sessionCleanup.integration.test.d.ts +6 -0
- package/dist/src/utils/sessionCleanup.integration.test.js +182 -0
- package/dist/src/utils/sessionCleanup.integration.test.js.map +1 -0
- package/dist/src/utils/sessionCleanup.js +214 -0
- package/dist/src/utils/sessionCleanup.js.map +1 -0
- package/dist/src/utils/sessionCleanup.test.d.ts +6 -0
- package/dist/src/utils/sessionCleanup.test.js +1232 -0
- package/dist/src/utils/sessionCleanup.test.js.map +1 -0
- package/dist/src/utils/sessionUtils.d.ts +37 -0
- package/dist/src/utils/sessionUtils.js +71 -0
- package/dist/src/utils/sessionUtils.js.map +1 -0
- package/dist/src/validateNonInterActiveAuth.js +6 -7
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/zed-integration/acp.js +1 -2
- package/dist/src/zed-integration/acp.js.map +1 -1
- package/dist/src/zed-integration/schema.d.ts +176 -176
- package/dist/src/zed-integration/zedIntegration.d.ts +2 -3
- package/dist/src/zed-integration/zedIntegration.js +7 -26
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- 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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"}
|