@machina.ai/cell-cli 1.59.0-rc2 → 1.64.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/index.js +11 -14
- package/dist/index.js.map +1 -1
- package/dist/package.json +3 -3
- package/dist/src/acp/acpResume.test.js +50 -0
- package/dist/src/acp/acpResume.test.js.map +1 -1
- package/dist/src/acp/acpRpcDispatcher.d.ts +1 -1
- package/dist/src/acp/acpRpcDispatcher.js +2 -2
- package/dist/src/acp/acpRpcDispatcher.js.map +1 -1
- package/dist/src/acp/acpRpcDispatcher.test.js +9 -0
- package/dist/src/acp/acpRpcDispatcher.test.js.map +1 -1
- package/dist/src/acp/acpSession.d.ts +1 -1
- package/dist/src/acp/acpSession.js +90 -80
- package/dist/src/acp/acpSession.js.map +1 -1
- package/dist/src/acp/acpSession.test.js +279 -2
- package/dist/src/acp/acpSession.test.js.map +1 -1
- package/dist/src/acp/acpSessionManager.d.ts +2 -2
- package/dist/src/acp/acpSessionManager.js +165 -73
- package/dist/src/acp/acpSessionManager.js.map +1 -1
- package/dist/src/acp/acpSessionManager.test.js +204 -1
- package/dist/src/acp/acpSessionManager.test.js.map +1 -1
- package/dist/src/acp/acpUtils.js +5 -3
- package/dist/src/acp/acpUtils.js.map +1 -1
- package/dist/src/commands/extensions/validate.js +7 -3
- package/dist/src/commands/extensions/validate.js.map +1 -1
- package/dist/src/commands/extensions/validate.test.js +51 -0
- package/dist/src/commands/extensions/validate.test.js.map +1 -1
- package/dist/src/config/config.js +3 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +6 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extension-manager.d.ts +25 -0
- package/dist/src/config/extension-manager.js +96 -15
- package/dist/src/config/extension-manager.js.map +1 -1
- package/dist/src/config/extension-manager.test.js +263 -1
- package/dist/src/config/extension-manager.test.js.map +1 -1
- package/dist/src/config/extension.test.js +10 -7
- package/dist/src/config/extension.test.js.map +1 -1
- package/dist/src/config/extensionRegistryClient.js +1 -1
- package/dist/src/config/extensionRegistryClient.js.map +1 -1
- package/dist/src/config/extensions/consent.js +98 -1
- package/dist/src/config/extensions/consent.js.map +1 -1
- package/dist/src/config/extensions/consent.test.js +89 -0
- package/dist/src/config/extensions/consent.test.js.map +1 -1
- package/dist/src/config/extensions/update.js +7 -2
- package/dist/src/config/extensions/update.js.map +1 -1
- package/dist/src/config/extensions/update.test.js +21 -0
- package/dist/src/config/extensions/update.test.js.map +1 -1
- package/dist/src/config/mcp/mcpServerEnablement.d.ts +5 -0
- package/dist/src/config/mcp/mcpServerEnablement.js +26 -3
- package/dist/src/config/mcp/mcpServerEnablement.js.map +1 -1
- package/dist/src/config/mcp/mcpServerEnablement.test.js +27 -0
- package/dist/src/config/mcp/mcpServerEnablement.test.js.map +1 -1
- package/dist/src/config/settings.js +20 -4
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settings.test.js +121 -0
- package/dist/src/config/settings.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +27 -0
- package/dist/src/config/settingsSchema.js +55 -1
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/core/auth.test.js +1 -1
- package/dist/src/core/auth.test.js.map +1 -1
- package/dist/src/gemini.js +110 -18
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini_uncaught.test.d.ts +6 -0
- package/dist/src/gemini_uncaught.test.js +91 -0
- package/dist/src/gemini_uncaught.test.js.map +1 -0
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/patches/http-proxy-agent.d.ts +4 -1
- package/dist/src/patches/http-proxy-agent.js +38 -2
- package/dist/src/patches/http-proxy-agent.js.map +1 -1
- package/dist/src/patches/https-proxy-agent.d.ts +4 -1
- package/dist/src/patches/https-proxy-agent.js +38 -2
- package/dist/src/patches/https-proxy-agent.js.map +1 -1
- package/dist/src/services/FeedbackService.integration.test.d.ts +6 -0
- package/dist/src/services/FeedbackService.integration.test.js +212 -0
- package/dist/src/services/FeedbackService.integration.test.js.map +1 -0
- package/dist/src/services/FeedbackService.js +62 -6
- package/dist/src/services/FeedbackService.js.map +1 -1
- package/dist/src/services/FeedbackService.test.d.ts +6 -0
- package/dist/src/services/FeedbackService.test.js +282 -0
- package/dist/src/services/FeedbackService.test.js.map +1 -0
- package/dist/src/services/FileCommandLoader.js +3 -5
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/services/FileCommandLoader.test.js +68 -6
- package/dist/src/services/FileCommandLoader.test.js.map +1 -1
- package/dist/src/test-utils/createExtension.d.ts +1 -1
- package/dist/src/test-utils/createExtension.js +15 -1
- package/dist/src/test-utils/createExtension.js.map +1 -1
- package/dist/src/ui/AppContainer.js +42 -39
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +30 -0
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.js +11 -3
- package/dist/src/ui/auth/AuthDialog.js.map +1 -1
- package/dist/src/ui/auth/useAuth.test.js +1 -1
- package/dist/src/ui/auth/useAuth.test.js.map +1 -1
- package/dist/src/ui/commands/bugCommand.js +3 -3
- package/dist/src/ui/commands/bugCommand.js.map +1 -1
- package/dist/src/ui/commands/bugCommand.test.js +44 -0
- package/dist/src/ui/commands/bugCommand.test.js.map +1 -1
- package/dist/src/ui/commands/bugMemoryCommand.js +2 -2
- package/dist/src/ui/commands/bugMemoryCommand.js.map +1 -1
- package/dist/src/ui/commands/bugMemoryCommand.test.js +12 -0
- package/dist/src/ui/commands/bugMemoryCommand.test.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.js +17 -2
- package/dist/src/ui/commands/statsCommand.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.test.js +2 -0
- package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
- package/dist/src/ui/components/AboutBox.js +1 -1
- package/dist/src/ui/components/AboutBox.js.map +1 -1
- package/dist/src/ui/components/AsciiArt.d.ts +6 -6
- package/dist/src/ui/components/AsciiArt.js +6 -6
- package/dist/src/ui/components/AskUserDialog.js +7 -2
- package/dist/src/ui/components/AskUserDialog.js.map +1 -1
- package/dist/src/ui/components/AskUserDialog.test.js +33 -0
- package/dist/src/ui/components/AskUserDialog.test.js.map +1 -1
- package/dist/src/ui/components/Composer.js +4 -4
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/Composer.test.js +50 -2
- package/dist/src/ui/components/Composer.test.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +16 -10
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.test.js +103 -7
- package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.d.ts +1 -0
- package/dist/src/ui/components/LoadingIndicator.js +13 -11
- package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.test.js +29 -0
- package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/components/MainContent.js +79 -14
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/MainContent.test.js +218 -5
- package/dist/src/ui/components/MainContent.test.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.js +11 -13
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.test.js +28 -24
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
- package/dist/src/ui/components/ModelStatsDisplay.test.js +2 -2
- package/dist/src/ui/components/ProgressBar.js +4 -3
- package/dist/src/ui/components/ProgressBar.js.map +1 -1
- package/dist/src/ui/components/ProgressBar.test.js +12 -0
- package/dist/src/ui/components/ProgressBar.test.js.map +1 -1
- package/dist/src/ui/components/RewindViewer.js +2 -1
- package/dist/src/ui/components/RewindViewer.js.map +1 -1
- package/dist/src/ui/components/RewindViewer.test.js +38 -0
- package/dist/src/ui/components/RewindViewer.test.js.map +1 -1
- package/dist/src/ui/components/SessionSummaryDisplay.js +28 -2
- package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/SessionSummaryDisplay.test.js +41 -2
- package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.d.ts +2 -1
- package/dist/src/ui/components/StatsDisplay.js +66 -4
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.test.js +120 -3
- package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
- package/dist/src/ui/components/StatusRow.d.ts +2 -0
- package/dist/src/ui/components/StatusRow.js +11 -6
- package/dist/src/ui/components/StatusRow.js.map +1 -1
- package/dist/src/ui/components/StatusRow.test.js +158 -0
- package/dist/src/ui/components/StatusRow.test.js.map +1 -1
- package/dist/src/ui/components/ToolConfirmationQueue.js +4 -2
- package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -1
- package/dist/src/ui/components/ToolConfirmationQueue.test.js +30 -0
- package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
- package/dist/src/ui/components/messages/DenseToolMessage.js +5 -5
- package/dist/src/ui/components/messages/DenseToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/DenseToolMessage.test.js +13 -0
- package/dist/src/ui/components/messages/DenseToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.d.ts +1 -0
- package/dist/src/ui/components/messages/DiffRenderer.js +16 -8
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.test.js +42 -0
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
- package/dist/src/ui/components/messages/ShellToolMessage.js +4 -3
- package/dist/src/ui/components/messages/ShellToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +74 -16
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +80 -7
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +6 -5
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +2 -1
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplay.js +11 -8
- package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/ToolShared.js +5 -4
- package/dist/src/ui/components/messages/ToolShared.js.map +1 -1
- package/dist/src/ui/components/shared/HalfLinePaddedBox.js +4 -2
- package/dist/src/ui/components/shared/HalfLinePaddedBox.js.map +1 -1
- package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +8 -0
- package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +1 -1
- package/dist/src/ui/components/shared/SearchableList.js +1 -1
- package/dist/src/ui/components/shared/SearchableList.js.map +1 -1
- package/dist/src/ui/components/shared/SearchableList.test.js +13 -0
- package/dist/src/ui/components/shared/SearchableList.test.js.map +1 -1
- package/dist/src/ui/components/shared/TextInput.js +2 -2
- package/dist/src/ui/components/shared/TextInput.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionRegistryView.test.js +2 -0
- package/dist/src/ui/components/views/ExtensionRegistryView.test.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.js +20 -2
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +24 -0
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.js +12 -0
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.test.js +5 -0
- package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +1 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/emergency-stop.test.d.ts +6 -0
- package/dist/src/ui/emergency-stop.test.js +116 -0
- package/dist/src/ui/emergency-stop.test.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.d.ts +8 -5
- package/dist/src/ui/hooks/atCommandProcessor.js +47 -16
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +160 -0
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/useComposerStatus.d.ts +1 -0
- package/dist/src/ui/hooks/useComposerStatus.js +1 -0
- package/dist/src/ui/hooks/useComposerStatus.js.map +1 -1
- package/dist/src/ui/hooks/useFocus.js +1 -0
- package/dist/src/ui/hooks/useFocus.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.js +16 -16
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js +186 -3
- package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +21 -15
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.test.js +141 -3
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -0
- package/dist/src/ui/hooks/useLoadingIndicator.js +1 -0
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +2 -0
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.js +2 -2
- package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +3 -3
- package/dist/src/ui/hooks/useSelectionList.js +24 -1
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
- package/dist/src/ui/hooks/useSelectionList.test.js +63 -1
- package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
- package/dist/src/ui/types.d.ts +2 -1
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/CodeColorizer.d.ts +1 -0
- package/dist/src/ui/utils/CodeColorizer.js +13 -7
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
- package/dist/src/ui/utils/TableRenderer.js +3 -2
- package/dist/src/ui/utils/TableRenderer.js.map +1 -1
- package/dist/src/ui/utils/borderStyles.d.ts +1 -0
- package/dist/src/ui/utils/borderStyles.js +1 -0
- package/dist/src/ui/utils/borderStyles.js.map +1 -1
- package/dist/src/ui/utils/fileUtils.d.ts +4 -0
- package/dist/src/ui/utils/fileUtils.js +13 -0
- package/dist/src/ui/utils/fileUtils.js.map +1 -1
- package/dist/src/ui/utils/renderBorder.d.ts +27 -0
- package/dist/src/ui/utils/renderBorder.js +46 -0
- package/dist/src/ui/utils/renderBorder.js.map +1 -0
- package/dist/src/ui/utils/renderBorder.test.d.ts +6 -0
- package/dist/src/ui/utils/renderBorder.test.js +74 -0
- package/dist/src/ui/utils/renderBorder.test.js.map +1 -0
- package/dist/src/ui/utils/rewindFileOps.d.ts +9 -0
- package/dist/src/ui/utils/rewindFileOps.js +25 -1
- package/dist/src/ui/utils/rewindFileOps.js.map +1 -1
- package/dist/src/ui/utils/rewindFileOps.test.js +94 -1
- package/dist/src/ui/utils/rewindFileOps.test.js.map +1 -1
- package/dist/src/ui/utils/terminalCapabilityManager.js +7 -0
- package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -1
- package/dist/src/ui/utils/terminalCapabilityManager.stdin-flow.test.d.ts +6 -0
- package/dist/src/ui/utils/terminalCapabilityManager.stdin-flow.test.js +105 -0
- package/dist/src/ui/utils/terminalCapabilityManager.stdin-flow.test.js.map +1 -0
- package/dist/src/utils/commentJson.js +66 -5
- package/dist/src/utils/commentJson.js.map +1 -1
- package/dist/src/utils/commentJson.test.js +21 -0
- package/dist/src/utils/commentJson.test.js.map +1 -1
- package/dist/src/utils/handleAutoUpdate.test.js +2 -2
- package/dist/src/utils/persistentState.js +84 -15
- package/dist/src/utils/persistentState.js.map +1 -1
- package/dist/src/utils/persistentState.test.js +66 -9
- package/dist/src/utils/persistentState.test.js.map +1 -1
- package/dist/src/utils/persistentStateRecovery.test.d.ts +6 -0
- package/dist/src/utils/persistentStateRecovery.test.js +84 -0
- package/dist/src/utils/persistentStateRecovery.test.js.map +1 -0
- package/dist/src/utils/processUtils.d.ts +10 -1
- package/dist/src/utils/processUtils.js +55 -1
- package/dist/src/utils/processUtils.js.map +1 -1
- package/dist/src/utils/processUtils.test.js +90 -2
- package/dist/src/utils/processUtils.test.js.map +1 -1
- package/dist/src/utils/relaunch.js +7 -0
- package/dist/src/utils/relaunch.js.map +1 -1
- package/dist/src/utils/relaunch.test.js +16 -0
- package/dist/src/utils/relaunch.test.js.map +1 -1
- package/dist/src/utils/retry.d.ts +22 -0
- package/dist/src/utils/retry.js +54 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/retry.test.d.ts +6 -0
- package/dist/src/utils/retry.test.js +141 -0
- package/dist/src/utils/retry.test.js.map +1 -0
- package/dist/src/utils/sandbox-macos-permissive-open.sb +36 -1
- package/dist/src/utils/sandbox-macos-permissive-proxied.sb +36 -1
- package/dist/src/utils/sandbox-macos-profiles.test.js +93 -0
- package/dist/src/utils/sandbox-macos-profiles.test.js.map +1 -1
- package/dist/src/utils/sandbox-macos-restrictive-open.sb +39 -1
- package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +40 -1
- package/dist/src/utils/sandbox-macos-strict-open.sb +38 -2
- package/dist/src/utils/sandbox-macos-strict-proxied.sb +38 -2
- package/dist/src/utils/sandbox.js +149 -36
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/sandbox.test.js +410 -2
- package/dist/src/utils/sandbox.test.js.map +1 -1
- package/dist/src/utils/sandboxBuiltinProfiles.js +198 -8
- package/dist/src/utils/sandboxBuiltinProfiles.js.map +1 -1
- package/dist/src/utils/sandboxUtils.d.ts +25 -0
- package/dist/src/utils/sandboxUtils.js +225 -1
- package/dist/src/utils/sandboxUtils.js.map +1 -1
- package/dist/src/utils/sandboxUtils.test.js +341 -1
- package/dist/src/utils/sandboxUtils.test.js.map +1 -1
- package/dist/src/utils/sessionUtils.d.ts +21 -1
- package/dist/src/utils/sessionUtils.js +66 -2
- package/dist/src/utils/sessionUtils.js.map +1 -1
- package/dist/src/utils/sessionUtils.test.js +143 -0
- package/dist/src/utils/sessionUtils.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
+
import { PassThrough } from 'node:stream';
|
|
8
|
+
vi.mock('node:fs', () => ({
|
|
9
|
+
writeSync: vi.fn(),
|
|
10
|
+
}));
|
|
11
|
+
vi.mock('@google/gemini-cli-core', () => ({
|
|
12
|
+
debugLogger: {
|
|
13
|
+
log: vi.fn(),
|
|
14
|
+
warn: vi.fn(),
|
|
15
|
+
},
|
|
16
|
+
enableKittyKeyboardProtocol: vi.fn(),
|
|
17
|
+
disableKittyKeyboardProtocol: vi.fn(),
|
|
18
|
+
enableModifyOtherKeys: vi.fn(),
|
|
19
|
+
disableModifyOtherKeys: vi.fn(),
|
|
20
|
+
enableBracketedPasteMode: vi.fn(),
|
|
21
|
+
disableBracketedPasteMode: vi.fn(),
|
|
22
|
+
disableMouseEvents: vi.fn(),
|
|
23
|
+
}));
|
|
24
|
+
import { TerminalCapabilityManager } from './terminalCapabilityManager.js';
|
|
25
|
+
describe('TerminalCapabilityManager stdin flow state', () => {
|
|
26
|
+
const originalStdin = process.stdin;
|
|
27
|
+
const originalStdout = process.stdout;
|
|
28
|
+
let stdin;
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
TerminalCapabilityManager.resetInstanceForTesting();
|
|
31
|
+
stdin = new PassThrough();
|
|
32
|
+
stdin.isTTY = true;
|
|
33
|
+
stdin.isRaw = true;
|
|
34
|
+
stdin.setRawMode = vi.fn((mode) => {
|
|
35
|
+
stdin.isRaw = mode;
|
|
36
|
+
return stdin;
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(process, 'stdin', {
|
|
39
|
+
value: stdin,
|
|
40
|
+
configurable: true,
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(process, 'stdout', {
|
|
43
|
+
value: { isTTY: true, fd: 1 },
|
|
44
|
+
configurable: true,
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
Object.defineProperty(process, 'stdin', {
|
|
49
|
+
value: originalStdin,
|
|
50
|
+
configurable: true,
|
|
51
|
+
});
|
|
52
|
+
Object.defineProperty(process, 'stdout', {
|
|
53
|
+
value: originalStdout,
|
|
54
|
+
configurable: true,
|
|
55
|
+
});
|
|
56
|
+
vi.restoreAllMocks();
|
|
57
|
+
});
|
|
58
|
+
it('pauses stdin after capability detection when not initially flowing and delivers keystrokes once resumed', async () => {
|
|
59
|
+
const pauseSpy = vi.spyOn(stdin, 'pause');
|
|
60
|
+
expect(stdin.readableFlowing).toBeNull();
|
|
61
|
+
const manager = TerminalCapabilityManager.getInstance();
|
|
62
|
+
const detection = manager.detectCapabilities();
|
|
63
|
+
stdin.write(Buffer.from('\x1b[?62c'));
|
|
64
|
+
await detection;
|
|
65
|
+
expect(pauseSpy).toHaveBeenCalledOnce();
|
|
66
|
+
expect(stdin.isPaused()).toBe(true);
|
|
67
|
+
expect(stdin.readableFlowing).toBe(false);
|
|
68
|
+
// Simulate KeypressProvider attaching a data listener and calling resume()
|
|
69
|
+
const received = [];
|
|
70
|
+
stdin.setEncoding('utf8');
|
|
71
|
+
stdin.on('data', (chunk) => {
|
|
72
|
+
received.push(chunk);
|
|
73
|
+
});
|
|
74
|
+
stdin.resume();
|
|
75
|
+
stdin.write('hello');
|
|
76
|
+
expect(stdin.isPaused()).toBe(false);
|
|
77
|
+
expect(received).toEqual(['hello']);
|
|
78
|
+
});
|
|
79
|
+
it('does not pause stdin if another data listener is registered during capability detection', async () => {
|
|
80
|
+
const pauseSpy = vi.spyOn(stdin, 'pause');
|
|
81
|
+
const manager = TerminalCapabilityManager.getInstance();
|
|
82
|
+
const detection = manager.detectCapabilities();
|
|
83
|
+
const concurrentListener = vi.fn();
|
|
84
|
+
stdin.on('data', concurrentListener);
|
|
85
|
+
stdin.write(Buffer.from('\x1b[?62c'));
|
|
86
|
+
await detection;
|
|
87
|
+
expect(pauseSpy).not.toHaveBeenCalled();
|
|
88
|
+
expect(stdin.isPaused()).toBe(false);
|
|
89
|
+
stdin.removeListener('data', concurrentListener);
|
|
90
|
+
});
|
|
91
|
+
it('preserves an already-flowing stdin stream', async () => {
|
|
92
|
+
const preExistingListener = vi.fn();
|
|
93
|
+
stdin.on('data', preExistingListener);
|
|
94
|
+
expect(stdin.readableFlowing).toBe(true);
|
|
95
|
+
const pauseSpy = vi.spyOn(stdin, 'pause');
|
|
96
|
+
const manager = TerminalCapabilityManager.getInstance();
|
|
97
|
+
const detection = manager.detectCapabilities();
|
|
98
|
+
stdin.write(Buffer.from('\x1b[?62c'));
|
|
99
|
+
await detection;
|
|
100
|
+
expect(pauseSpy).not.toHaveBeenCalled();
|
|
101
|
+
expect(stdin.isPaused()).toBe(false);
|
|
102
|
+
stdin.removeListener('data', preExistingListener);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=terminalCapabilityManager.stdin-flow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalCapabilityManager.stdin-flow.test.js","sourceRoot":"","sources":["../../../../src/ui/utils/terminalCapabilityManager.stdin-flow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,29 +4,81 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import * as fs from 'node:fs';
|
|
7
|
+
import * as path from 'node:path';
|
|
7
8
|
import { parse, stringify } from 'comment-json';
|
|
8
9
|
import { coreEvents } from '@google/gemini-cli-core';
|
|
10
|
+
function isDangerousKey(key) {
|
|
11
|
+
return key === '__proto__' || key === 'constructor' || key === 'prototype';
|
|
12
|
+
}
|
|
13
|
+
let tempCounter = 0;
|
|
14
|
+
function writeAtomicSync(filePath, content) {
|
|
15
|
+
const dir = path.dirname(filePath);
|
|
16
|
+
if (!fs.existsSync(dir)) {
|
|
17
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${Date.now()}.${tempCounter++}.tmp`);
|
|
20
|
+
try {
|
|
21
|
+
fs.writeFileSync(tempPath, content, 'utf-8');
|
|
22
|
+
fs.renameSync(tempPath, filePath);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
try {
|
|
26
|
+
if (fs.existsSync(tempPath)) {
|
|
27
|
+
fs.unlinkSync(tempPath);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// ignore
|
|
32
|
+
}
|
|
33
|
+
// Fallback to direct write if rename fails
|
|
34
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
9
37
|
/**
|
|
10
38
|
* Updates a JSON file while preserving comments and formatting.
|
|
11
39
|
*/
|
|
12
40
|
export function updateSettingsFilePreservingFormat(filePath, updates) {
|
|
41
|
+
const dirPath = path.dirname(filePath);
|
|
42
|
+
if (!fs.existsSync(dirPath)) {
|
|
43
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
44
|
+
}
|
|
13
45
|
if (!fs.existsSync(filePath)) {
|
|
14
|
-
|
|
46
|
+
writeAtomicSync(filePath, JSON.stringify(updates, null, 2));
|
|
15
47
|
return;
|
|
16
48
|
}
|
|
17
|
-
const originalContent = fs.readFileSync(filePath, 'utf-8');
|
|
18
49
|
let parsed;
|
|
19
50
|
try {
|
|
20
|
-
|
|
21
|
-
|
|
51
|
+
const originalContent = fs.readFileSync(filePath, 'utf-8');
|
|
52
|
+
if (!originalContent.trim()) {
|
|
53
|
+
parsed = {};
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const rawParsed = parse(originalContent);
|
|
57
|
+
if (typeof rawParsed !== 'object' ||
|
|
58
|
+
rawParsed === null ||
|
|
59
|
+
Array.isArray(rawParsed)) {
|
|
60
|
+
parsed = {};
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
64
|
+
parsed = rawParsed;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
22
67
|
}
|
|
23
68
|
catch (error) {
|
|
69
|
+
if (error &&
|
|
70
|
+
typeof error === 'object' &&
|
|
71
|
+
'code' in error &&
|
|
72
|
+
error.code === 'ENOENT') {
|
|
73
|
+
writeAtomicSync(filePath, JSON.stringify(updates, null, 2));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
24
76
|
coreEvents.emitFeedback('error', 'Error parsing settings file. Please check the JSON syntax.', error);
|
|
25
77
|
return;
|
|
26
78
|
}
|
|
27
79
|
const updatedStructure = applyUpdates(parsed, updates);
|
|
28
80
|
const updatedContent = stringify(updatedStructure, null, 2);
|
|
29
|
-
|
|
81
|
+
writeAtomicSync(filePath, updatedContent);
|
|
30
82
|
}
|
|
31
83
|
/**
|
|
32
84
|
* When deleting a property from a comment-json parsed object, relocate any
|
|
@@ -37,6 +89,9 @@ export function updateSettingsFilePreservingFormat(filePath, updates) {
|
|
|
37
89
|
* to the container's leading/trailing comments.
|
|
38
90
|
*/
|
|
39
91
|
function preserveCommentsOnPropertyDeletion(container, propName) {
|
|
92
|
+
if (isDangerousKey(propName)) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
40
95
|
const target = container;
|
|
41
96
|
const beforeSym = Symbol.for(`before:${propName}`);
|
|
42
97
|
const afterSym = Symbol.for(`after:${propName}`);
|
|
@@ -92,12 +147,18 @@ function preserveCommentsOnPropertyDeletion(container, propName) {
|
|
|
92
147
|
*/
|
|
93
148
|
function applyKeyDiff(base, desired) {
|
|
94
149
|
for (const existingKey of Object.getOwnPropertyNames(base)) {
|
|
150
|
+
if (isDangerousKey(existingKey)) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
95
153
|
if (!Object.prototype.hasOwnProperty.call(desired, existingKey)) {
|
|
96
154
|
preserveCommentsOnPropertyDeletion(base, existingKey);
|
|
97
155
|
delete base[existingKey];
|
|
98
156
|
}
|
|
99
157
|
}
|
|
100
158
|
for (const nextKey of Object.getOwnPropertyNames(desired)) {
|
|
159
|
+
if (isDangerousKey(nextKey)) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
101
162
|
const nextVal = desired[nextKey];
|
|
102
163
|
const baseVal = base[nextKey];
|
|
103
164
|
const isObj = typeof nextVal === 'object' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commentJson.js","sourceRoot":"","sources":["../../../src/utils/commentJson.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAOrD;;GAEG;AACH,MAAM,UAAU,kCAAkC,CAChD,QAAgB,EAChB,OAAgC;IAEhC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"commentJson.js","sourceRoot":"","sources":["../../../src/utils/commentJson.ts"],"names":[],"mappings":"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"}
|
|
@@ -303,6 +303,27 @@ describe('commentJson', () => {
|
|
|
303
303
|
expect(updatedContent).toContain('"data": "keep"');
|
|
304
304
|
expect(updatedContent).toContain('// This should be preserved');
|
|
305
305
|
});
|
|
306
|
+
it('should ignore dangerous keys (__proto__, constructor, prototype) to prevent prototype pollution', () => {
|
|
307
|
+
const originalContent = `{
|
|
308
|
+
"theme": "light"
|
|
309
|
+
}`;
|
|
310
|
+
fs.writeFileSync(testFilePath, originalContent, 'utf-8');
|
|
311
|
+
const maliciousUpdates = JSON.parse('{"__proto__": {"polluted": "yes"}, "theme": "dark"}');
|
|
312
|
+
updateSettingsFilePreservingFormat(testFilePath, maliciousUpdates);
|
|
313
|
+
// Verify prototype was not polluted
|
|
314
|
+
expect(Object.prototype['polluted']).toBeUndefined();
|
|
315
|
+
const updatedContent = fs.readFileSync(testFilePath, 'utf-8');
|
|
316
|
+
expect(updatedContent).toContain('"theme": "dark"');
|
|
317
|
+
});
|
|
318
|
+
it('should handle ENOENT gracefully if file is missing during read', () => {
|
|
319
|
+
const nonExistentPath = path.join(tempDir, 'missing.json');
|
|
320
|
+
updateSettingsFilePreservingFormat(nonExistentPath, {
|
|
321
|
+
theme: 'dark',
|
|
322
|
+
});
|
|
323
|
+
expect(fs.existsSync(nonExistentPath)).toBe(true);
|
|
324
|
+
const content = fs.readFileSync(nonExistentPath, 'utf-8');
|
|
325
|
+
expect(JSON.parse(content)).toEqual({ theme: 'dark' });
|
|
326
|
+
});
|
|
306
327
|
});
|
|
307
328
|
});
|
|
308
329
|
//# sourceMappingURL=commentJson.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commentJson.test.js","sourceRoot":"","sources":["../../../src/utils/commentJson.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commentJson.test.js","sourceRoot":"","sources":["../../../src/utils/commentJson.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -209,7 +209,7 @@ describe('handleAutoUpdate', () => {
|
|
|
209
209
|
...mockUpdateInfo,
|
|
210
210
|
update: {
|
|
211
211
|
...mockUpdateInfo.update,
|
|
212
|
-
latest: '1.
|
|
212
|
+
latest: '1.64.0-rc1',
|
|
213
213
|
},
|
|
214
214
|
};
|
|
215
215
|
await new Promise((resolve) => {
|
|
@@ -227,7 +227,7 @@ describe('handleAutoUpdate', () => {
|
|
|
227
227
|
handleAutoUpdate(mockUpdateInfo, mockSettings, '/root', false, mockSpawn);
|
|
228
228
|
});
|
|
229
229
|
expect(updateEventEmitter.emit).toHaveBeenCalledWith('update-failed', {
|
|
230
|
-
message: 'Automatic update failed. Please try updating manually:\n\nnpm i -g @machina.ai/cell-cli@1.
|
|
230
|
+
message: 'Automatic update failed. Please try updating manually:\n\nnpm i -g @machina.ai/cell-cli@1.64.0-rc1',
|
|
231
231
|
});
|
|
232
232
|
});
|
|
233
233
|
it('should emit "update-failed" when the spawn function throws an error', async () => {
|
|
@@ -7,6 +7,10 @@ import { Storage, debugLogger } from '@google/gemini-cli-core';
|
|
|
7
7
|
import * as fs from 'node:fs';
|
|
8
8
|
import * as path from 'node:path';
|
|
9
9
|
const STATE_FILENAME = 'state.json';
|
|
10
|
+
function isPersistentStateData(obj) {
|
|
11
|
+
return typeof obj === 'object' && obj !== null && !Array.isArray(obj);
|
|
12
|
+
}
|
|
13
|
+
let tempCounter = 0;
|
|
10
14
|
export class PersistentState {
|
|
11
15
|
cache = null;
|
|
12
16
|
filePath = null;
|
|
@@ -20,37 +24,102 @@ export class PersistentState {
|
|
|
20
24
|
if (this.cache) {
|
|
21
25
|
return this.cache;
|
|
22
26
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
const filePath = this.getPath();
|
|
28
|
+
const backupPath = `${filePath}.bak`;
|
|
29
|
+
const corruptPath = `${filePath}.corrupt`;
|
|
30
|
+
if (fs.existsSync(filePath)) {
|
|
31
|
+
try {
|
|
26
32
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
const parsed = JSON.parse(content);
|
|
34
|
+
if (isPersistentStateData(parsed)) {
|
|
35
|
+
this.cache = parsed;
|
|
36
|
+
return this.cache;
|
|
37
|
+
}
|
|
38
|
+
throw new Error('Persistent state is not a valid JSON object');
|
|
29
39
|
}
|
|
30
|
-
|
|
31
|
-
|
|
40
|
+
catch (error) {
|
|
41
|
+
debugLogger.warn('Failed to load persistent state:', error);
|
|
42
|
+
try {
|
|
43
|
+
if (fs.existsSync(filePath)) {
|
|
44
|
+
if (fs.existsSync(corruptPath)) {
|
|
45
|
+
fs.unlinkSync(corruptPath);
|
|
46
|
+
}
|
|
47
|
+
fs.renameSync(filePath, corruptPath);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
try {
|
|
52
|
+
fs.unlinkSync(filePath);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Ignore failure to remove corrupt file
|
|
56
|
+
}
|
|
57
|
+
}
|
|
32
58
|
}
|
|
33
59
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
60
|
+
if (fs.existsSync(backupPath)) {
|
|
61
|
+
try {
|
|
62
|
+
const bakContent = fs.readFileSync(backupPath, 'utf-8');
|
|
63
|
+
const bakParsed = JSON.parse(bakContent);
|
|
64
|
+
if (isPersistentStateData(bakParsed)) {
|
|
65
|
+
debugLogger.warn('Recovered persistent state from backup');
|
|
66
|
+
this.cache = bakParsed;
|
|
67
|
+
this.save(true);
|
|
68
|
+
return this.cache;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (bakError) {
|
|
72
|
+
debugLogger.warn('Failed to load persistent state from backup:', bakError);
|
|
73
|
+
}
|
|
38
74
|
}
|
|
75
|
+
this.cache = {};
|
|
39
76
|
return this.cache;
|
|
40
77
|
}
|
|
41
|
-
save() {
|
|
78
|
+
save(skipBackup = false) {
|
|
42
79
|
if (!this.cache)
|
|
43
80
|
return;
|
|
81
|
+
const filePath = this.getPath();
|
|
82
|
+
const dir = path.dirname(filePath);
|
|
83
|
+
const tempPath = path.join(dir, `.${STATE_FILENAME}.${process.pid}.${Date.now()}.${tempCounter++}.tmp`);
|
|
44
84
|
try {
|
|
45
|
-
const filePath = this.getPath();
|
|
46
|
-
const dir = path.dirname(filePath);
|
|
47
85
|
if (!fs.existsSync(dir)) {
|
|
48
86
|
fs.mkdirSync(dir, { recursive: true });
|
|
49
87
|
}
|
|
50
|
-
|
|
88
|
+
const content = JSON.stringify(this.cache, null, 2);
|
|
89
|
+
const fd = fs.openSync(tempPath, 'w', 0o600);
|
|
90
|
+
try {
|
|
91
|
+
fs.writeFileSync(fd, content, 'utf-8');
|
|
92
|
+
try {
|
|
93
|
+
fs.fsyncSync(fd);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// fsync can fail on unsupported or virtualized filesystems
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
fs.closeSync(fd);
|
|
101
|
+
}
|
|
102
|
+
const backupPath = `${filePath}.bak`;
|
|
103
|
+
if (!skipBackup && fs.existsSync(filePath)) {
|
|
104
|
+
try {
|
|
105
|
+
fs.copyFileSync(filePath, backupPath);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
debugLogger.warn('Failed to update persistent state backup:', err);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
fs.renameSync(tempPath, filePath);
|
|
51
112
|
}
|
|
52
113
|
catch (error) {
|
|
53
114
|
debugLogger.warn('Failed to save persistent state:', error);
|
|
115
|
+
try {
|
|
116
|
+
if (fs.existsSync(tempPath)) {
|
|
117
|
+
fs.unlinkSync(tempPath);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Ignore cleanup error
|
|
122
|
+
}
|
|
54
123
|
}
|
|
55
124
|
}
|
|
56
125
|
get(key) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentState.js","sourceRoot":"","sources":["../../../src/utils/persistentState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,cAAc,GAAG,YAAY,CAAC;AAYpC,MAAM,OAAO,eAAe;IAClB,KAAK,GAA+B,IAAI,CAAC;IACzC,QAAQ,GAAkB,IAAI,CAAC;IAE/B,OAAO;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,cAAc,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEO,IAAI;QACV,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QACD,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"persistentState.js","sourceRoot":"","sources":["../../../src/utils/persistentState.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,30 +39,87 @@ describe('PersistentState', () => {
|
|
|
39
39
|
const value = persistentState.get('defaultBannerShownCount');
|
|
40
40
|
expect(value).toBeUndefined();
|
|
41
41
|
});
|
|
42
|
-
it('should save state to file', () => {
|
|
42
|
+
it('should save state atomically to file', () => {
|
|
43
|
+
const mockFd = 42;
|
|
43
44
|
vi.mocked(fs.existsSync).mockReturnValue(false);
|
|
45
|
+
vi.mocked(fs.openSync).mockReturnValue(mockFd);
|
|
44
46
|
persistentState.set('defaultBannerShownCount', { banner1: 1 });
|
|
45
47
|
expect(fs.mkdirSync).toHaveBeenCalledWith(path.normalize(mockDir), {
|
|
46
48
|
recursive: true,
|
|
47
49
|
});
|
|
48
|
-
expect(fs.
|
|
50
|
+
expect(fs.openSync).toHaveBeenCalledWith(expect.stringMatching(/\.state\.json\..*\.tmp$/), 'w', 0o600);
|
|
51
|
+
expect(fs.writeFileSync).toHaveBeenCalledWith(mockFd, JSON.stringify({ defaultBannerShownCount: { banner1: 1 } }, null, 2), 'utf-8');
|
|
52
|
+
expect(fs.fsyncSync).toHaveBeenCalledWith(mockFd);
|
|
53
|
+
expect(fs.closeSync).toHaveBeenCalledWith(mockFd);
|
|
54
|
+
expect(fs.renameSync).toHaveBeenCalledWith(expect.stringMatching(/\.state\.json\..*\.tmp$/), mockFilePath);
|
|
49
55
|
});
|
|
50
|
-
it('should
|
|
51
|
-
|
|
56
|
+
it('should create a backup file when saving over an existing state file', () => {
|
|
57
|
+
const mockFd = 42;
|
|
58
|
+
vi.mocked(fs.existsSync).mockImplementation((p) => p === mockFilePath);
|
|
59
|
+
vi.mocked(fs.openSync).mockReturnValue(mockFd);
|
|
60
|
+
persistentState.set('defaultBannerShownCount', { banner1: 1 });
|
|
61
|
+
expect(fs.copyFileSync).toHaveBeenCalledWith(mockFilePath, `${mockFilePath}.bak`);
|
|
62
|
+
expect(fs.renameSync).toHaveBeenCalledWith(expect.stringMatching(/\.state\.json\..*\.tmp$/), mockFilePath);
|
|
63
|
+
});
|
|
64
|
+
it('should handle load errors, preserve corrupt file, and start fresh if no backup', () => {
|
|
65
|
+
vi.mocked(fs.existsSync).mockImplementation((p) => p === mockFilePath);
|
|
52
66
|
vi.mocked(fs.readFileSync).mockImplementation(() => {
|
|
53
67
|
throw new Error('Read error');
|
|
54
68
|
});
|
|
55
69
|
const value = persistentState.get('defaultBannerShownCount');
|
|
56
70
|
expect(value).toBeUndefined();
|
|
57
71
|
expect(debugLogger.warn).toHaveBeenCalled();
|
|
72
|
+
expect(fs.renameSync).toHaveBeenCalledWith(mockFilePath, `${mockFilePath}.corrupt`);
|
|
58
73
|
});
|
|
59
|
-
it('should
|
|
60
|
-
vi.mocked(fs.existsSync).
|
|
61
|
-
vi.mocked(fs.
|
|
62
|
-
throw new Error('
|
|
74
|
+
it('should unlink existing corrupt file before renaming on load error', () => {
|
|
75
|
+
vi.mocked(fs.existsSync).mockImplementation((p) => p === mockFilePath || p === `${mockFilePath}.corrupt`);
|
|
76
|
+
vi.mocked(fs.readFileSync).mockImplementation(() => {
|
|
77
|
+
throw new Error('Read error');
|
|
63
78
|
});
|
|
79
|
+
const value = persistentState.get('defaultBannerShownCount');
|
|
80
|
+
expect(value).toBeUndefined();
|
|
81
|
+
expect(fs.unlinkSync).toHaveBeenCalledWith(`${mockFilePath}.corrupt`);
|
|
82
|
+
expect(fs.renameSync).toHaveBeenCalledWith(mockFilePath, `${mockFilePath}.corrupt`);
|
|
83
|
+
});
|
|
84
|
+
it('should unlink corrupt file if rename fails', () => {
|
|
85
|
+
vi.mocked(fs.existsSync).mockImplementation((p) => p === mockFilePath);
|
|
86
|
+
vi.mocked(fs.readFileSync).mockImplementation(() => {
|
|
87
|
+
throw new Error('Read error');
|
|
88
|
+
});
|
|
89
|
+
vi.mocked(fs.renameSync).mockImplementation(() => {
|
|
90
|
+
throw new Error('Rename error');
|
|
91
|
+
});
|
|
92
|
+
const value = persistentState.get('defaultBannerShownCount');
|
|
93
|
+
expect(value).toBeUndefined();
|
|
94
|
+
expect(fs.unlinkSync).toHaveBeenCalledWith(mockFilePath);
|
|
95
|
+
});
|
|
96
|
+
it('should recover state from backup if primary file fails to load', () => {
|
|
97
|
+
const backupData = { defaultBannerShownCount: { banner1: 5 } };
|
|
98
|
+
vi.mocked(fs.existsSync).mockImplementation((p) => p === mockFilePath || p === `${mockFilePath}.bak`);
|
|
99
|
+
vi.mocked(fs.readFileSync).mockImplementation((p) => {
|
|
100
|
+
if (p === mockFilePath) {
|
|
101
|
+
throw new Error('Corrupt state');
|
|
102
|
+
}
|
|
103
|
+
if (p === `${mockFilePath}.bak`) {
|
|
104
|
+
return JSON.stringify(backupData);
|
|
105
|
+
}
|
|
106
|
+
throw new Error('File not found');
|
|
107
|
+
});
|
|
108
|
+
const value = persistentState.get('defaultBannerShownCount');
|
|
109
|
+
expect(value).toEqual(backupData.defaultBannerShownCount);
|
|
110
|
+
expect(debugLogger.warn).toHaveBeenCalledWith('Recovered persistent state from backup');
|
|
111
|
+
expect(fs.copyFileSync).not.toHaveBeenCalled();
|
|
112
|
+
});
|
|
113
|
+
it('should handle save errors and clean up temporary file', () => {
|
|
114
|
+
const mockFd = 42;
|
|
115
|
+
vi.mocked(fs.openSync).mockReturnValue(mockFd);
|
|
116
|
+
vi.mocked(fs.renameSync).mockImplementation(() => {
|
|
117
|
+
throw new Error('Rename error');
|
|
118
|
+
});
|
|
119
|
+
vi.mocked(fs.existsSync).mockImplementation((p) => typeof p === 'string' && p.endsWith('.tmp'));
|
|
64
120
|
persistentState.set('defaultBannerShownCount', { banner1: 1 });
|
|
65
|
-
expect(debugLogger.warn).
|
|
121
|
+
expect(debugLogger.warn).toHaveBeenCalledWith('Failed to save persistent state:', expect.any(Error));
|
|
122
|
+
expect(fs.unlinkSync).toHaveBeenCalledWith(expect.stringMatching(/\.state\.json\..*\.tmp$/));
|
|
66
123
|
});
|
|
67
124
|
});
|
|
68
125
|
//# sourceMappingURL=persistentState.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentState.test.js","sourceRoot":"","sources":["../../../src/utils/persistentState.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,OAAO,EAAE;QACP,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;KAC5B;IACD,WAAW,EAAE;QACX,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;KACd;CACF,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,eAAgC,CAAC;IACrC,MAAM,OAAO,GAAG,WAAW,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEtD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/D,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,QAAQ,GAAG,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAErE,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QACxD,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"persistentState.test.js","sourceRoot":"","sources":["../../../src/utils/persistentState.test.ts"],"names":[],"mappings":"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"}
|