@machina.ai/cell-cli 1.36.0-rc1 → 1.38.1-rc2
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.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/package.json +4 -4
- package/dist/src/acp/acpClient.js +297 -32
- package/dist/src/acp/acpClient.js.map +1 -1
- package/dist/src/acp/acpClient.test.js +419 -19
- package/dist/src/acp/acpClient.test.js.map +1 -1
- package/dist/src/acp/acpResume.test.js +8 -0
- package/dist/src/acp/acpResume.test.js.map +1 -1
- package/dist/src/acp/commandHandler.js +4 -0
- package/dist/src/acp/commandHandler.js.map +1 -1
- package/dist/src/acp/commandHandler.test.js +4 -0
- package/dist/src/acp/commandHandler.test.js.map +1 -1
- package/dist/src/acp/commands/about.d.ts +11 -0
- package/dist/src/acp/commands/about.js +53 -0
- package/dist/src/acp/commands/about.js.map +1 -0
- package/dist/src/acp/commands/extensions.js +1 -1
- package/dist/src/acp/commands/extensions.js.map +1 -1
- package/dist/src/acp/commands/help.d.ts +14 -0
- package/dist/src/acp/commands/help.js +35 -0
- package/dist/src/acp/commands/help.js.map +1 -0
- package/dist/src/acp/commands/help.test.d.ts +6 -0
- package/dist/src/acp/commands/help.test.js +40 -0
- package/dist/src/acp/commands/help.test.js.map +1 -0
- package/dist/src/acp/commands/restore.js +2 -2
- package/dist/src/acp/commands/restore.js.map +1 -1
- package/dist/src/commands/extensions/new.js +1 -1
- package/dist/src/commands/extensions/new.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/commands/mcp.test.js +1 -1
- package/dist/src/commands/mcp.test.js.map +1 -1
- package/dist/src/commands/skills/list.js +5 -8
- package/dist/src/commands/skills/list.js.map +1 -1
- package/dist/src/commands/skills/list.test.js +17 -13
- package/dist/src/commands/skills/list.test.js.map +1 -1
- package/dist/src/config/config.js +22 -9
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +121 -36
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extension-manager-permissions.test.js +1 -1
- package/dist/src/config/extension-manager-permissions.test.js.map +1 -1
- package/dist/src/config/extension-manager-themes.spec.js +1 -0
- package/dist/src/config/extension-manager-themes.spec.js.map +1 -1
- package/dist/src/config/extension-manager.test.js +1 -1
- package/dist/src/config/extension-manager.test.js.map +1 -1
- package/dist/src/config/extension.js +1 -1
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/github.js +1 -1
- package/dist/src/config/extensions/github.js.map +1 -1
- package/dist/src/config/footerItems.d.ts +4 -0
- package/dist/src/config/footerItems.js +12 -2
- package/dist/src/config/footerItems.js.map +1 -1
- package/dist/src/config/footerItems.test.js +129 -72
- package/dist/src/config/footerItems.test.js.map +1 -1
- package/dist/src/config/policy-engine.integration.test.js +1 -3
- package/dist/src/config/policy-engine.integration.test.js.map +1 -1
- package/dist/src/config/policy.d.ts +1 -1
- package/dist/src/config/policy.js +2 -2
- package/dist/src/config/policy.js.map +1 -1
- package/dist/src/config/settings.js +19 -3
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +272 -53
- package/dist/src/config/settingsSchema.js +262 -48
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +22 -4
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/config/workspace-policy-cli.test.js +7 -7
- package/dist/src/config/workspace-policy-cli.test.js.map +1 -1
- package/dist/src/gemini.js +24 -7
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +74 -4
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/gemini_cleanup.test.js +69 -4
- package/dist/src/gemini_cleanup.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/integration-tests/modelSteering.test.js +1 -1
- package/dist/src/integration-tests/modelSteering.test.js.map +1 -1
- package/dist/src/interactiveCli.js +4 -2
- package/dist/src/interactiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCli.d.ts +1 -1
- package/dist/src/nonInteractiveCli.js +11 -2
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCli.test.js +4 -2
- package/dist/src/nonInteractiveCli.test.js.map +1 -1
- package/dist/src/nonInteractiveCliAgentSession.d.ts +16 -0
- package/dist/src/nonInteractiveCliAgentSession.js +484 -0
- package/dist/src/nonInteractiveCliAgentSession.js.map +1 -0
- package/dist/src/nonInteractiveCliAgentSession.test.js +1837 -0
- package/dist/src/nonInteractiveCliAgentSession.test.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.js +4 -2
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/test-utils/mockCommandContext.js +1 -0
- package/dist/src/test-utils/mockCommandContext.js.map +1 -1
- package/dist/src/test-utils/mockConfig.js +16 -0
- package/dist/src/test-utils/mockConfig.js.map +1 -1
- package/dist/src/test-utils/mockSpinner.d.ts +6 -0
- package/dist/src/test-utils/mockSpinner.js +21 -0
- package/dist/src/test-utils/mockSpinner.js.map +1 -0
- package/dist/src/test-utils/render.d.ts +8 -1
- package/dist/src/test-utils/render.js +37 -11
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/App.test.js +1 -1
- package/dist/src/ui/App.test.js.map +1 -1
- package/dist/src/ui/AppContainer.js +225 -99
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +50 -38
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +15 -5
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/clearCommand.js +3 -1
- package/dist/src/ui/commands/clearCommand.js.map +1 -1
- package/dist/src/ui/commands/directoryCommand.js +1 -1
- package/dist/src/ui/commands/directoryCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +22 -11
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/marketplaceCommand.d.ts +7 -0
- package/dist/src/ui/commands/marketplaceCommand.js +135 -0
- package/dist/src/ui/commands/marketplaceCommand.js.map +1 -0
- package/dist/src/ui/commands/mcpCommand.js +26 -7
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.test.js +26 -0
- package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
- package/dist/src/ui/commands/planCommand.js +9 -0
- package/dist/src/ui/commands/planCommand.js.map +1 -1
- package/dist/src/ui/commands/planCommand.test.js +29 -0
- package/dist/src/ui/commands/planCommand.test.js.map +1 -1
- package/dist/src/ui/commands/restoreCommand.js +1 -1
- package/dist/src/ui/commands/restoreCommand.js.map +1 -1
- package/dist/src/ui/commands/rewindCommand.js +3 -1
- package/dist/src/ui/commands/rewindCommand.js.map +1 -1
- package/dist/src/ui/commands/rewindCommand.test.js +1 -1
- package/dist/src/ui/commands/rewindCommand.test.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.js +5 -5
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/skillsCommand.js +11 -1
- package/dist/src/ui/commands/skillsCommand.js.map +1 -1
- package/dist/src/ui/commands/skillsCommand.test.js +1 -0
- package/dist/src/ui/commands/skillsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/{shellsCommand.d.ts → tasksCommand.d.ts} +1 -1
- package/dist/src/ui/commands/{shellsCommand.js → tasksCommand.js} +6 -6
- package/dist/src/ui/commands/tasksCommand.js.map +1 -0
- package/dist/src/ui/commands/tasksCommand.test.js +30 -0
- package/dist/src/ui/commands/tasksCommand.test.js.map +1 -0
- package/dist/src/ui/commands/types.d.ts +9 -1
- package/dist/src/ui/components/AnsiOutput.js +7 -5
- package/dist/src/ui/components/AnsiOutput.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.test.js +13 -0
- package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
- package/dist/src/ui/components/AppHeader.js +11 -11
- package/dist/src/ui/components/AppHeader.js.map +1 -1
- package/dist/src/ui/components/AppHeader.test.js +6 -2
- package/dist/src/ui/components/AppHeader.test.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 +13 -13
- package/dist/src/ui/components/AskUserDialog.js.map +1 -1
- package/dist/src/ui/components/AskUserDialog.test.js +31 -0
- package/dist/src/ui/components/AskUserDialog.test.js.map +1 -1
- package/dist/src/ui/components/BackgroundTaskDisplay.d.ts +16 -0
- package/dist/src/ui/components/{BackgroundShellDisplay.js → BackgroundTaskDisplay.js} +12 -12
- package/dist/src/ui/components/BackgroundTaskDisplay.js.map +1 -0
- package/dist/src/ui/components/{BackgroundShellDisplay.test.js → BackgroundTaskDisplay.test.js} +26 -26
- package/dist/src/ui/components/BackgroundTaskDisplay.test.js.map +1 -0
- package/dist/src/ui/components/Composer.js +20 -208
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/Composer.test.js +22 -17
- package/dist/src/ui/components/Composer.test.js.map +1 -1
- package/dist/src/ui/components/ContextSummaryDisplay.js +3 -1
- package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/CopyModeWarning.js +3 -6
- package/dist/src/ui/components/CopyModeWarning.js.map +1 -1
- package/dist/src/ui/components/CopyModeWarning.test.js +7 -8
- package/dist/src/ui/components/CopyModeWarning.test.js.map +1 -1
- package/dist/src/ui/components/ExitPlanModeDialog.js +9 -0
- package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
- package/dist/src/ui/components/ExitPlanModeDialog.test.js +15 -3
- package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +7 -8
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +36 -9
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Footer.test.js +85 -6
- package/dist/src/ui/components/Footer.test.js.map +1 -1
- package/dist/src/ui/components/FooterConfigDialog.js +1 -0
- package/dist/src/ui/components/FooterConfigDialog.js.map +1 -1
- package/dist/src/ui/components/FooterConfigDialog.test.js +1 -1
- package/dist/src/ui/components/Help.test.js +1 -1
- package/dist/src/ui/components/Help.test.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.d.ts +2 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +14 -12
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.d.ts +10 -5
- package/dist/src/ui/components/InputPrompt.js +195 -90
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.test.d.ts +12 -1
- package/dist/src/ui/components/InputPrompt.test.js +370 -160
- package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.js +1 -2
- package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.test.js +7 -0
- package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/components/MainContent.d.ts +1 -1
- package/dist/src/ui/components/MainContent.js +105 -34
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/MainContent.test.js +12 -9
- package/dist/src/ui/components/MainContent.test.js.map +1 -1
- package/dist/src/ui/components/MemoryUsageDisplay.d.ts +1 -0
- package/dist/src/ui/components/MemoryUsageDisplay.js +5 -2
- package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.js +50 -72
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.test.js +1 -0
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
- package/dist/src/ui/components/ModelQuotaDisplay.d.ts +18 -0
- package/dist/src/ui/components/ModelQuotaDisplay.js +104 -0
- package/dist/src/ui/components/ModelQuotaDisplay.js.map +1 -0
- package/dist/src/ui/components/ModelQuotaDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/ModelQuotaDisplay.test.js +62 -0
- package/dist/src/ui/components/ModelQuotaDisplay.test.js.map +1 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/ProgressBar.d.ts +13 -0
- package/dist/src/ui/components/ProgressBar.js +17 -0
- package/dist/src/ui/components/ProgressBar.js.map +1 -0
- package/dist/src/ui/components/ProgressBar.test.d.ts +6 -0
- package/dist/src/ui/components/ProgressBar.test.js +28 -0
- package/dist/src/ui/components/ProgressBar.test.js.map +1 -0
- package/dist/src/ui/components/StatsDisplay.d.ts +2 -2
- package/dist/src/ui/components/StatsDisplay.js +47 -128
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.test.js +65 -136
- package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
- package/dist/src/ui/components/StatusDisplay.js +1 -1
- package/dist/src/ui/components/StatusDisplay.js.map +1 -1
- package/dist/src/ui/components/StatusDisplay.test.js +3 -3
- package/dist/src/ui/components/StatusDisplay.test.js.map +1 -1
- package/dist/src/ui/components/StatusRow.d.ts +32 -0
- package/dist/src/ui/components/StatusRow.js +180 -0
- package/dist/src/ui/components/StatusRow.js.map +1 -0
- package/dist/src/ui/components/StatusRow.test.d.ts +6 -0
- package/dist/src/ui/components/StatusRow.test.js +99 -0
- package/dist/src/ui/components/StatusRow.test.js.map +1 -0
- package/dist/src/ui/components/ToastDisplay.d.ts +2 -1
- package/dist/src/ui/components/ToastDisplay.js +7 -5
- package/dist/src/ui/components/ToastDisplay.js.map +1 -1
- package/dist/src/ui/components/ToastDisplay.test.js +34 -20
- package/dist/src/ui/components/ToastDisplay.test.js.map +1 -1
- package/dist/src/ui/components/ToolConfirmationQueue.js +24 -9
- package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -1
- package/dist/src/ui/components/ToolConfirmationQueue.test.js +4 -6
- package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
- package/dist/src/ui/components/UserIdentity.js +8 -5
- package/dist/src/ui/components/UserIdentity.js.map +1 -1
- package/dist/src/ui/components/messages/DenseToolMessage.d.ts +13 -0
- package/dist/src/ui/components/messages/DenseToolMessage.js +270 -0
- package/dist/src/ui/components/messages/DenseToolMessage.js.map +1 -0
- package/dist/src/ui/components/messages/DenseToolMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/DenseToolMessage.test.js +383 -0
- package/dist/src/ui/components/messages/DenseToolMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/DiffRenderer.d.ts +18 -0
- package/dist/src/ui/components/messages/DiffRenderer.js +54 -34
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.test.js +12 -6
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
- package/dist/src/ui/components/messages/InfoMessage.d.ts +1 -0
- package/dist/src/ui/components/messages/InfoMessage.js +2 -2
- package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
- package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +1 -1
- package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +1 -1
- package/dist/src/ui/components/messages/ShellToolMessage.test.js +44 -33
- package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/SubagentGroupDisplay.js +3 -2
- package/dist/src/ui/components/messages/SubagentGroupDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/SubagentGroupDisplay.test.js +1 -1
- package/dist/src/ui/components/messages/SubagentGroupDisplay.test.js.map +1 -1
- package/dist/src/ui/components/messages/SubagentHistoryMessage.d.ts +13 -0
- package/dist/src/ui/components/messages/SubagentHistoryMessage.js +4 -0
- package/dist/src/ui/components/messages/SubagentHistoryMessage.js.map +1 -0
- package/dist/src/ui/components/messages/SubagentHistoryMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/SubagentHistoryMessage.test.js +68 -0
- package/dist/src/ui/components/messages/SubagentHistoryMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/SubagentProgressDisplay.d.ts +2 -1
- package/dist/src/ui/components/messages/SubagentProgressDisplay.js +2 -2
- package/dist/src/ui/components/messages/SubagentProgressDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js +0 -4
- package/dist/src/ui/components/messages/SubagentProgressDisplay.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +1 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +108 -70
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +40 -25
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.d.ts +6 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.js +147 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.compact.test.js.map +1 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +3 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.js +219 -52
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +55 -3
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.test.js +8 -7
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js +1 -1
- package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplay.js +57 -15
- package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplay.test.js +66 -3
- package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js +5 -4
- package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +3 -3
- package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +1 -1
- package/dist/src/ui/components/messages/TopicMessage.d.ts +15 -0
- package/dist/src/ui/components/messages/TopicMessage.js +56 -0
- package/dist/src/ui/components/messages/TopicMessage.js.map +1 -0
- package/dist/src/ui/components/messages/TopicMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/TopicMessage.test.js +77 -0
- package/dist/src/ui/components/messages/TopicMessage.test.js.map +1 -0
- package/dist/src/ui/components/shared/MaxSizedBox.d.ts +1 -0
- package/dist/src/ui/components/shared/MaxSizedBox.js +10 -7
- package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
- package/dist/src/ui/components/shared/Scrollable.d.ts +3 -0
- package/dist/src/ui/components/shared/Scrollable.js +6 -2
- package/dist/src/ui/components/shared/Scrollable.js.map +1 -1
- package/dist/src/ui/components/shared/ScrollableList.d.ts +9 -12
- package/dist/src/ui/components/shared/ScrollableList.js +2 -2
- package/dist/src/ui/components/shared/ScrollableList.js.map +1 -1
- package/dist/src/ui/components/shared/VirtualizedList.d.ts +13 -1
- package/dist/src/ui/components/shared/VirtualizedList.js +148 -37
- package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -1
- package/dist/src/ui/components/shared/VirtualizedList.test.js +1 -10
- package/dist/src/ui/components/shared/VirtualizedList.test.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.d.ts +1 -0
- package/dist/src/ui/components/shared/text-buffer.js +19 -21
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionDetails.d.ts +4 -1
- package/dist/src/ui/components/views/ExtensionDetails.js +14 -4
- package/dist/src/ui/components/views/ExtensionDetails.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionDetails.test.js +25 -1
- package/dist/src/ui/components/views/ExtensionDetails.test.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionRegistryView.js +19 -5
- package/dist/src/ui/components/views/ExtensionRegistryView.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionRegistryView.test.js +38 -0
- package/dist/src/ui/components/views/ExtensionRegistryView.test.js.map +1 -1
- package/dist/src/ui/components/views/SkillsList.js +2 -1
- package/dist/src/ui/components/views/SkillsList.js.map +1 -1
- package/dist/src/ui/components/views/SkillsList.test.js +3 -1
- package/dist/src/ui/components/views/SkillsList.test.js.map +1 -1
- package/dist/src/ui/constants/tips.js +2 -2
- package/dist/src/ui/constants/tips.js.map +1 -1
- package/dist/src/ui/constants.d.ts +6 -0
- package/dist/src/ui/constants.js +15 -0
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/contexts/InputContext.d.ts +17 -0
- package/dist/src/ui/contexts/InputContext.js +15 -0
- package/dist/src/ui/contexts/InputContext.js.map +1 -0
- package/dist/src/ui/contexts/KeypressContext.js +1 -1
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +25 -1
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/ScrollProvider.js +25 -3
- package/dist/src/ui/contexts/ScrollProvider.js.map +1 -1
- package/dist/src/ui/contexts/ScrollProvider.test.js +100 -0
- package/dist/src/ui/contexts/ScrollProvider.test.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.d.ts +2 -2
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/contexts/ToolActionsContext.d.ts +6 -0
- package/dist/src/ui/contexts/ToolActionsContext.js +19 -11
- package/dist/src/ui/contexts/ToolActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/ToolActionsContext.test.js +90 -7
- package/dist/src/ui/contexts/ToolActionsContext.test.js.map +1 -1
- package/dist/src/ui/contexts/UIActionsContext.d.ts +4 -3
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +10 -16
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +2 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +2 -1
- package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +1 -1
- package/dist/src/ui/hooks/shellReducer.d.ts +12 -10
- package/dist/src/ui/hooks/shellReducer.js +67 -37
- package/dist/src/ui/hooks/shellReducer.js.map +1 -1
- package/dist/src/ui/hooks/shellReducer.test.js +207 -36
- package/dist/src/ui/hooks/shellReducer.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.test.js +1 -1
- package/dist/src/ui/hooks/toolMapping.js +7 -0
- package/dist/src/ui/hooks/toolMapping.js.map +1 -1
- package/dist/src/ui/hooks/useAlternateBuffer.js +6 -1
- package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -1
- package/dist/src/ui/hooks/useAlternateBuffer.test.js +5 -0
- package/dist/src/ui/hooks/useAlternateBuffer.test.js.map +1 -1
- package/dist/src/ui/hooks/useAnimatedScrollbar.js +2 -2
- package/dist/src/ui/hooks/useAnimatedScrollbar.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.js +1 -1
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useBackgroundTaskManager.d.ts +22 -0
- package/dist/src/ui/hooks/useBackgroundTaskManager.js +58 -0
- package/dist/src/ui/hooks/useBackgroundTaskManager.js.map +1 -0
- package/dist/src/ui/hooks/{useBackgroundShellManager.test.js → useBackgroundTaskManager.test.js} +50 -50
- package/dist/src/ui/hooks/useBackgroundTaskManager.test.js.map +1 -0
- package/dist/src/ui/hooks/useBanner.d.ts +1 -0
- package/dist/src/ui/hooks/useBanner.js +16 -9
- package/dist/src/ui/hooks/useBanner.js.map +1 -1
- package/dist/src/ui/hooks/useBanner.test.js +7 -4
- package/dist/src/ui/hooks/useBanner.test.js.map +1 -1
- package/dist/src/ui/hooks/useBatchedScroll.js +2 -2
- package/dist/src/ui/hooks/useBatchedScroll.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.d.ts +2 -1
- package/dist/src/ui/hooks/useCommandCompletion.js +13 -3
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.test.js +82 -6
- package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useComposerStatus.d.ts +21 -0
- package/dist/src/ui/hooks/useComposerStatus.js +78 -0
- package/dist/src/ui/hooks/useComposerStatus.js.map +1 -0
- package/dist/src/ui/hooks/useConsoleMessages.test.js +2 -2
- package/dist/src/ui/hooks/useConsoleMessages.test.js.map +1 -1
- package/dist/src/ui/hooks/useExecutionLifecycle.d.ts +28 -0
- package/dist/src/ui/hooks/{shellCommandProcessor.js → useExecutionLifecycle.js} +140 -58
- package/dist/src/ui/hooks/useExecutionLifecycle.js.map +1 -0
- package/dist/src/ui/hooks/useExecutionLifecycle.test.d.ts +6 -0
- package/dist/src/ui/hooks/{shellCommandProcessor.test.js → useExecutionLifecycle.test.js} +123 -81
- package/dist/src/ui/hooks/useExecutionLifecycle.test.js.map +1 -0
- package/dist/src/ui/hooks/useFolderTrust.js +1 -1
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.d.ts +6 -6
- package/dist/src/ui/hooks/useGeminiStream.js +140 -38
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.test.js +176 -22
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useGitBranchName.js +2 -2
- package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +10 -0
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/usePermissionsModifyTrust.js +2 -2
- package/dist/src/ui/hooks/usePermissionsModifyTrust.js.map +1 -1
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +1 -1
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +4 -2
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/useSessionBrowser.d.ts +1 -1
- package/dist/src/ui/hooks/useSessionBrowser.js +2 -2
- package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.d.ts +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.js +37 -63
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +57 -47
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.d.ts +2 -1
- package/dist/src/ui/hooks/useToolScheduler.js +55 -1
- package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +107 -9
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/key/keyBindings.d.ts +9 -1
- package/dist/src/ui/key/keyBindings.js +40 -3
- package/dist/src/ui/key/keyBindings.js.map +1 -1
- package/dist/src/ui/key/keyMatchers.test.js +12 -2
- package/dist/src/ui/key/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/layouts/DefaultAppLayout.js +8 -6
- package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -1
- package/dist/src/ui/layouts/DefaultAppLayout.test.js +27 -22
- package/dist/src/ui/layouts/DefaultAppLayout.test.js.map +1 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +1 -1
- package/dist/src/ui/themes/builtin/dark/tokyonight-dark.d.ts +7 -0
- package/dist/src/ui/themes/builtin/dark/tokyonight-dark.js +147 -0
- package/dist/src/ui/themes/builtin/dark/tokyonight-dark.js.map +1 -0
- package/dist/src/ui/themes/theme-manager.js +2 -0
- package/dist/src/ui/themes/theme-manager.js.map +1 -1
- package/dist/src/ui/themes/theme.js +1 -1
- package/dist/src/ui/themes/theme.js.map +1 -1
- package/dist/src/ui/types.d.ts +10 -2
- 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 +17 -18
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
- package/dist/src/ui/utils/ConsolePatcher.d.ts +1 -0
- package/dist/src/ui/utils/ConsolePatcher.js +12 -5
- package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
- package/dist/src/ui/utils/ConsolePatcher.test.d.ts +6 -0
- package/dist/src/ui/utils/ConsolePatcher.test.js +199 -0
- package/dist/src/ui/utils/ConsolePatcher.test.js.map +1 -0
- package/dist/src/ui/utils/TableRenderer.js +3 -3
- package/dist/src/ui/utils/TableRenderer.js.map +1 -1
- package/dist/src/ui/utils/borderStyles.d.ts +2 -2
- package/dist/src/ui/utils/borderStyles.js +2 -2
- package/dist/src/ui/utils/borderStyles.js.map +1 -1
- package/dist/src/ui/utils/directoryUtils.js +1 -1
- package/dist/src/ui/utils/directoryUtils.js.map +1 -1
- package/dist/src/ui/utils/fileUtils.d.ts +10 -0
- package/dist/src/ui/utils/fileUtils.js +17 -0
- package/dist/src/ui/utils/fileUtils.js.map +1 -0
- package/dist/src/ui/utils/terminalCapabilityManager.d.ts +1 -0
- package/dist/src/ui/utils/terminalCapabilityManager.js +8 -0
- package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -1
- package/dist/src/ui/utils/terminalCapabilityManager.test.js +38 -0
- package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -1
- package/dist/src/ui/utils/toolLayoutUtils.d.ts +1 -1
- package/dist/src/ui/utils/toolLayoutUtils.js +1 -1
- package/dist/src/ui/utils/ui-sizing.test.js +1 -0
- package/dist/src/ui/utils/ui-sizing.test.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.d.ts +1 -0
- package/dist/src/ui/utils/updateCheck.js.map +1 -1
- package/dist/src/utils/activityLogger.js +16 -0
- package/dist/src/utils/activityLogger.js.map +1 -1
- package/dist/src/utils/cleanup.js +12 -5
- package/dist/src/utils/cleanup.js.map +1 -1
- package/dist/src/utils/commands.js +15 -0
- package/dist/src/utils/commands.js.map +1 -1
- package/dist/src/utils/commands.test.js +79 -0
- package/dist/src/utils/commands.test.js.map +1 -1
- package/dist/src/utils/envVarResolver.d.ts +5 -2
- package/dist/src/utils/envVarResolver.js +15 -6
- package/dist/src/utils/envVarResolver.js.map +1 -1
- package/dist/src/utils/envVarResolver.test.js +41 -24
- package/dist/src/utils/envVarResolver.test.js.map +1 -1
- package/dist/src/utils/errors.js +4 -4
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/events.d.ts +3 -1
- package/dist/src/utils/events.js +1 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/gitUtils.js +4 -4
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/handleAutoUpdate.js +10 -3
- package/dist/src/utils/handleAutoUpdate.js.map +1 -1
- package/dist/src/utils/handleAutoUpdate.test.js +8 -2
- package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
- package/dist/src/utils/installationInfo.js +1 -1
- package/dist/src/utils/installationInfo.js.map +1 -1
- package/dist/src/utils/jsonoutput.js +1 -1
- package/dist/src/utils/jsonoutput.js.map +1 -1
- package/dist/src/utils/sandboxUtils.js +1 -1
- package/dist/src/utils/sandboxUtils.js.map +1 -1
- package/dist/src/utils/sessionCleanup.js +7 -30
- package/dist/src/utils/sessionCleanup.js.map +1 -1
- package/dist/src/utils/sessionCleanup.test.js +3 -0
- package/dist/src/utils/sessionCleanup.test.js.map +1 -1
- package/dist/src/utils/sessionUtils.js +1 -0
- package/dist/src/utils/sessionUtils.js.map +1 -1
- package/dist/src/utils/sessionUtils.test.js +179 -3
- package/dist/src/utils/sessionUtils.test.js.map +1 -1
- package/dist/src/utils/sessions.js +1 -1
- package/dist/src/utils/sessions.js.map +1 -1
- package/dist/src/utils/skillUtils.js +3 -1
- package/dist/src/utils/skillUtils.js.map +1 -1
- package/dist/src/utils/skillUtils.test.js +4 -6
- package/dist/src/utils/skillUtils.test.js.map +1 -1
- package/dist/src/utils/terminalNotifications.js +2 -4
- package/dist/src/utils/terminalNotifications.js.map +1 -1
- package/dist/src/utils/terminalNotifications.test.js +5 -3
- package/dist/src/utils/terminalNotifications.test.js.map +1 -1
- package/dist/src/utils/userStartupWarnings.js +2 -2
- package/dist/src/utils/userStartupWarnings.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/dist/src/ui/commands/shellsCommand.js.map +0 -1
- package/dist/src/ui/commands/shellsCommand.test.js +0 -29
- package/dist/src/ui/commands/shellsCommand.test.js.map +0 -1
- package/dist/src/ui/components/BackgroundShellDisplay.d.ts +0 -16
- package/dist/src/ui/components/BackgroundShellDisplay.js.map +0 -1
- package/dist/src/ui/components/BackgroundShellDisplay.test.js.map +0 -1
- package/dist/src/ui/hooks/shellCommandProcessor.d.ts +0 -28
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +0 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +0 -1
- package/dist/src/ui/hooks/useBackgroundShellManager.d.ts +0 -22
- package/dist/src/ui/hooks/useBackgroundShellManager.js +0 -58
- package/dist/src/ui/hooks/useBackgroundShellManager.js.map +0 -1
- package/dist/src/ui/hooks/useBackgroundShellManager.test.js.map +0 -1
- /package/dist/src/{ui/commands/shellsCommand.test.d.ts → nonInteractiveCliAgentSession.test.d.ts} +0 -0
- /package/dist/src/ui/{components/BackgroundShellDisplay.test.d.ts → commands/tasksCommand.test.d.ts} +0 -0
- /package/dist/src/ui/{hooks/shellCommandProcessor.test.d.ts → components/BackgroundTaskDisplay.test.d.ts} +0 -0
- /package/dist/src/ui/hooks/{useBackgroundShellManager.test.d.ts → useBackgroundTaskManager.test.d.ts} +0 -0
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
|
|
7
7
|
import { GeminiAgent, Session } from './acpClient.js';
|
|
8
8
|
import * as acp from '@agentclientprotocol/sdk';
|
|
9
|
-
import { AuthType, ToolConfirmationOutcome, StreamEventType,
|
|
9
|
+
import { AuthType, ToolConfirmationOutcome, StreamEventType, ReadManyFilesTool, LlmRole, processSingleFileContent, InvalidStreamError, } from '@google/gemini-cli-core';
|
|
10
10
|
import { SettingScope, loadSettings, } from '../config/settings.js';
|
|
11
11
|
import { loadCliConfig } from '../config/config.js';
|
|
12
12
|
import * as fs from 'node:fs/promises';
|
|
@@ -61,19 +61,10 @@ vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
|
|
61
61
|
const actual = await importOriginal();
|
|
62
62
|
return {
|
|
63
63
|
...actual,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
build: vi.fn().mockReturnValue({
|
|
68
|
-
getDescription: () => 'Read files',
|
|
69
|
-
toolLocations: () => [],
|
|
70
|
-
execute: vi.fn().mockResolvedValue({
|
|
71
|
-
llmContent: ['--- file.txt ---\n\nFile content\n\n'],
|
|
72
|
-
}),
|
|
73
|
-
}),
|
|
74
|
-
})),
|
|
64
|
+
updatePolicy: vi.fn(),
|
|
65
|
+
createPolicyUpdater: vi.fn(),
|
|
66
|
+
ReadManyFilesTool: vi.fn(),
|
|
75
67
|
logToolCall: vi.fn(),
|
|
76
|
-
isWithinRoot: vi.fn().mockReturnValue(true),
|
|
77
68
|
LlmRole: {
|
|
78
69
|
MAIN: 'main',
|
|
79
70
|
SUBAGENT: 'subagent',
|
|
@@ -96,6 +87,7 @@ vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
|
|
96
87
|
Cancelled: 'cancelled',
|
|
97
88
|
AwaitingApproval: 'awaiting_approval',
|
|
98
89
|
},
|
|
90
|
+
processSingleFileContent: vi.fn(),
|
|
99
91
|
};
|
|
100
92
|
});
|
|
101
93
|
// Helper to create mock streams
|
|
@@ -135,6 +127,24 @@ describe('GeminiAgent', () => {
|
|
|
135
127
|
getHasAccessToPreviewModel: vi.fn().mockReturnValue(false),
|
|
136
128
|
getCheckpointingEnabled: vi.fn().mockReturnValue(false),
|
|
137
129
|
getDisableAlwaysAllow: vi.fn().mockReturnValue(false),
|
|
130
|
+
validatePathAccess: vi.fn().mockReturnValue(null),
|
|
131
|
+
getWorkspaceContext: vi.fn().mockReturnValue({
|
|
132
|
+
addReadOnlyPath: vi.fn(),
|
|
133
|
+
}),
|
|
134
|
+
getPolicyEngine: vi.fn().mockReturnValue({
|
|
135
|
+
addRule: vi.fn(),
|
|
136
|
+
}),
|
|
137
|
+
messageBus: {
|
|
138
|
+
publish: vi.fn(),
|
|
139
|
+
subscribe: vi.fn(),
|
|
140
|
+
unsubscribe: vi.fn(),
|
|
141
|
+
},
|
|
142
|
+
storage: {
|
|
143
|
+
getWorkspaceAutoSavedPolicyPath: vi.fn(),
|
|
144
|
+
getAutoSavedPolicyPath: vi.fn(),
|
|
145
|
+
setClientName: vi.fn(),
|
|
146
|
+
},
|
|
147
|
+
setClientName: vi.fn(),
|
|
138
148
|
get config() {
|
|
139
149
|
return this;
|
|
140
150
|
},
|
|
@@ -149,11 +159,15 @@ describe('GeminiAgent', () => {
|
|
|
149
159
|
mockArgv = {};
|
|
150
160
|
mockConnection = {
|
|
151
161
|
sessionUpdate: vi.fn(),
|
|
162
|
+
requestPermission: vi.fn(),
|
|
152
163
|
};
|
|
153
164
|
loadCliConfig.mockResolvedValue(mockConfig);
|
|
154
165
|
loadSettings.mockImplementation(() => ({
|
|
155
166
|
merged: {
|
|
156
|
-
security: {
|
|
167
|
+
security: {
|
|
168
|
+
auth: { selectedType: AuthType.LOGIN_WITH_GOOGLE },
|
|
169
|
+
enablePermanentToolApproval: true,
|
|
170
|
+
},
|
|
157
171
|
mcpServers: {},
|
|
158
172
|
},
|
|
159
173
|
setValue: vi.fn(),
|
|
@@ -296,6 +310,21 @@ describe('GeminiAgent', () => {
|
|
|
296
310
|
}),
|
|
297
311
|
]));
|
|
298
312
|
});
|
|
313
|
+
it('should include gemini-3.1-flash-lite when useGemini31FlashLite is true', async () => {
|
|
314
|
+
mockConfig.getHasAccessToPreviewModel = vi.fn().mockReturnValue(true);
|
|
315
|
+
mockConfig.getGemini31LaunchedSync = vi.fn().mockReturnValue(true);
|
|
316
|
+
mockConfig.getGemini31FlashLiteLaunchedSync = vi.fn().mockReturnValue(true);
|
|
317
|
+
const response = await agent.newSession({
|
|
318
|
+
cwd: '/tmp',
|
|
319
|
+
mcpServers: [],
|
|
320
|
+
});
|
|
321
|
+
expect(response.models?.availableModels).toEqual(expect.arrayContaining([
|
|
322
|
+
expect.objectContaining({
|
|
323
|
+
modelId: 'gemini-3.1-flash-lite-preview',
|
|
324
|
+
name: 'gemini-3.1-flash-lite-preview',
|
|
325
|
+
}),
|
|
326
|
+
]));
|
|
327
|
+
});
|
|
299
328
|
it('should return modes with plan mode when plan is enabled', async () => {
|
|
300
329
|
mockConfig.getContentGeneratorConfig = vi.fn().mockReturnValue({
|
|
301
330
|
apiKey: 'test-key',
|
|
@@ -472,6 +501,7 @@ describe('Session', () => {
|
|
|
472
501
|
sendMessageStream: vi.fn(),
|
|
473
502
|
addHistory: vi.fn(),
|
|
474
503
|
recordCompletedToolCalls: vi.fn(),
|
|
504
|
+
getHistory: vi.fn().mockReturnValue([]),
|
|
475
505
|
};
|
|
476
506
|
mockTool = {
|
|
477
507
|
kind: 'read',
|
|
@@ -493,12 +523,16 @@ describe('Session', () => {
|
|
|
493
523
|
mockConfig = {
|
|
494
524
|
getModel: vi.fn().mockReturnValue('gemini-pro'),
|
|
495
525
|
getActiveModel: vi.fn().mockReturnValue('gemini-pro'),
|
|
526
|
+
getModelRouterService: vi.fn().mockReturnValue({
|
|
527
|
+
route: vi.fn().mockResolvedValue({ model: 'resolved-model' }),
|
|
528
|
+
}),
|
|
496
529
|
getToolRegistry: vi.fn().mockReturnValue(mockToolRegistry),
|
|
497
530
|
getMcpServers: vi.fn(),
|
|
498
531
|
getFileService: vi.fn().mockReturnValue({
|
|
499
532
|
shouldIgnoreFile: vi.fn().mockReturnValue(false),
|
|
500
533
|
}),
|
|
501
534
|
getFileFilteringOptions: vi.fn().mockReturnValue({}),
|
|
535
|
+
getFileSystemService: vi.fn().mockReturnValue({}),
|
|
502
536
|
getTargetDir: vi.fn().mockReturnValue('/tmp'),
|
|
503
537
|
getEnableRecursiveFileSearch: vi.fn().mockReturnValue(false),
|
|
504
538
|
getDebugMode: vi.fn().mockReturnValue(false),
|
|
@@ -508,6 +542,10 @@ describe('Session', () => {
|
|
|
508
542
|
isPlanEnabled: vi.fn().mockReturnValue(true),
|
|
509
543
|
getCheckpointingEnabled: vi.fn().mockReturnValue(false),
|
|
510
544
|
getGitService: vi.fn().mockResolvedValue({}),
|
|
545
|
+
validatePathAccess: vi.fn().mockReturnValue(null),
|
|
546
|
+
getWorkspaceContext: vi.fn().mockReturnValue({
|
|
547
|
+
addReadOnlyPath: vi.fn(),
|
|
548
|
+
}),
|
|
511
549
|
waitForMcpInit: vi.fn(),
|
|
512
550
|
getDisableAlwaysAllow: vi.fn().mockReturnValue(false),
|
|
513
551
|
get config() {
|
|
@@ -527,12 +565,26 @@ describe('Session', () => {
|
|
|
527
565
|
systemDefaults: { settings: {} },
|
|
528
566
|
user: { settings: {} },
|
|
529
567
|
workspace: { settings: {} },
|
|
530
|
-
merged: {
|
|
568
|
+
merged: {
|
|
569
|
+
security: { enablePermanentToolApproval: true },
|
|
570
|
+
mcpServers: {},
|
|
571
|
+
},
|
|
531
572
|
errors: [],
|
|
532
573
|
});
|
|
574
|
+
ReadManyFilesTool.mockImplementation(() => ({
|
|
575
|
+
name: 'read_many_files',
|
|
576
|
+
kind: 'read',
|
|
577
|
+
build: vi.fn().mockReturnValue({
|
|
578
|
+
getDescription: () => 'Read files',
|
|
579
|
+
toolLocations: () => [],
|
|
580
|
+
execute: vi.fn().mockResolvedValue({
|
|
581
|
+
llmContent: ['--- file.txt ---\n\nFile content\n\n'],
|
|
582
|
+
}),
|
|
583
|
+
}),
|
|
584
|
+
}));
|
|
533
585
|
});
|
|
534
586
|
afterEach(() => {
|
|
535
|
-
vi.
|
|
587
|
+
vi.restoreAllMocks();
|
|
536
588
|
});
|
|
537
589
|
it('should send available commands', async () => {
|
|
538
590
|
await session.sendAvailableCommands();
|
|
@@ -591,6 +643,66 @@ describe('Session', () => {
|
|
|
591
643
|
});
|
|
592
644
|
expect(result).toMatchObject({ stopReason: 'end_turn' });
|
|
593
645
|
});
|
|
646
|
+
it('should use model router to determine model', async () => {
|
|
647
|
+
const mockRouter = {
|
|
648
|
+
route: vi.fn().mockResolvedValue({ model: 'routed-model' }),
|
|
649
|
+
};
|
|
650
|
+
mockConfig.getModelRouterService.mockReturnValue(mockRouter);
|
|
651
|
+
const stream = createMockStream([
|
|
652
|
+
{
|
|
653
|
+
type: StreamEventType.CHUNK,
|
|
654
|
+
value: {
|
|
655
|
+
candidates: [{ content: { parts: [{ text: 'Hello' }] } }],
|
|
656
|
+
},
|
|
657
|
+
},
|
|
658
|
+
]);
|
|
659
|
+
mockChat.sendMessageStream.mockResolvedValue(stream);
|
|
660
|
+
await session.prompt({
|
|
661
|
+
sessionId: 'session-1',
|
|
662
|
+
prompt: [{ type: 'text', text: 'Hi' }],
|
|
663
|
+
});
|
|
664
|
+
expect(mockRouter.route).toHaveBeenCalledWith(expect.objectContaining({
|
|
665
|
+
requestedModel: 'gemini-pro',
|
|
666
|
+
request: [{ text: 'Hi' }],
|
|
667
|
+
}));
|
|
668
|
+
expect(mockChat.sendMessageStream).toHaveBeenCalledWith(expect.objectContaining({ model: 'routed-model' }), expect.any(Array), expect.any(String), expect.any(Object), expect.any(String));
|
|
669
|
+
});
|
|
670
|
+
it('should handle prompt with empty response (InvalidStreamError)', async () => {
|
|
671
|
+
mockChat.sendMessageStream.mockRejectedValue(new InvalidStreamError('Empty response', 'NO_RESPONSE_TEXT'));
|
|
672
|
+
const result = await session.prompt({
|
|
673
|
+
sessionId: 'session-1',
|
|
674
|
+
prompt: [{ type: 'text', text: 'Hi' }],
|
|
675
|
+
});
|
|
676
|
+
expect(mockChat.sendMessageStream).toHaveBeenCalled();
|
|
677
|
+
expect(result).toMatchObject({ stopReason: 'end_turn' });
|
|
678
|
+
});
|
|
679
|
+
it('should handle prompt with empty response (NO_RESPONSE_TEXT anomaly)', async () => {
|
|
680
|
+
mockChat.sendMessageStream.mockRejectedValue({ type: 'NO_RESPONSE_TEXT' });
|
|
681
|
+
const result = await session.prompt({
|
|
682
|
+
sessionId: 'session-1',
|
|
683
|
+
prompt: [{ type: 'text', text: 'Hi' }],
|
|
684
|
+
});
|
|
685
|
+
expect(mockChat.sendMessageStream).toHaveBeenCalled();
|
|
686
|
+
expect(result).toMatchObject({ stopReason: 'end_turn' });
|
|
687
|
+
});
|
|
688
|
+
it('should handle prompt with no finish reason (InvalidStreamError)', async () => {
|
|
689
|
+
mockChat.sendMessageStream.mockRejectedValue(new InvalidStreamError('No finish reason', 'NO_FINISH_REASON'));
|
|
690
|
+
const result = await session.prompt({
|
|
691
|
+
sessionId: 'session-1',
|
|
692
|
+
prompt: [{ type: 'text', text: 'Hi' }],
|
|
693
|
+
});
|
|
694
|
+
expect(mockChat.sendMessageStream).toHaveBeenCalled();
|
|
695
|
+
expect(result).toMatchObject({ stopReason: 'end_turn' });
|
|
696
|
+
});
|
|
697
|
+
it('should handle prompt with no finish reason (NO_FINISH_REASON anomaly)', async () => {
|
|
698
|
+
mockChat.sendMessageStream.mockRejectedValue({ type: 'NO_FINISH_REASON' });
|
|
699
|
+
const result = await session.prompt({
|
|
700
|
+
sessionId: 'session-1',
|
|
701
|
+
prompt: [{ type: 'text', text: 'Hi' }],
|
|
702
|
+
});
|
|
703
|
+
expect(mockChat.sendMessageStream).toHaveBeenCalled();
|
|
704
|
+
expect(result).toMatchObject({ stopReason: 'end_turn' });
|
|
705
|
+
});
|
|
594
706
|
it('should handle /memory command', async () => {
|
|
595
707
|
const handleCommandSpy = vi
|
|
596
708
|
.spyOn(session
|
|
@@ -788,6 +900,132 @@ describe('Session', () => {
|
|
|
788
900
|
]),
|
|
789
901
|
}));
|
|
790
902
|
});
|
|
903
|
+
it('should exclude always allow and save permanent option when enablePermanentToolApproval is false', async () => {
|
|
904
|
+
mockConfig.getDisableAlwaysAllow = vi.fn().mockReturnValue(false);
|
|
905
|
+
const confirmationDetails = {
|
|
906
|
+
type: 'edit',
|
|
907
|
+
onConfirm: vi.fn(),
|
|
908
|
+
};
|
|
909
|
+
mockTool.build.mockReturnValue({
|
|
910
|
+
getDescription: () => 'Test Tool',
|
|
911
|
+
toolLocations: () => [],
|
|
912
|
+
shouldConfirmExecute: vi.fn().mockResolvedValue(confirmationDetails),
|
|
913
|
+
execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
|
|
914
|
+
});
|
|
915
|
+
const customSettings = {
|
|
916
|
+
system: { settings: {} },
|
|
917
|
+
systemDefaults: { settings: {} },
|
|
918
|
+
user: { settings: {} },
|
|
919
|
+
workspace: { settings: {} },
|
|
920
|
+
merged: {
|
|
921
|
+
security: { enablePermanentToolApproval: false },
|
|
922
|
+
mcpServers: {},
|
|
923
|
+
},
|
|
924
|
+
errors: [],
|
|
925
|
+
};
|
|
926
|
+
const localSession = new Session('session-2', mockChat, mockConfig, mockConnection, customSettings);
|
|
927
|
+
mockConnection.requestPermission.mockResolvedValueOnce({
|
|
928
|
+
outcome: {
|
|
929
|
+
outcome: 'selected',
|
|
930
|
+
optionId: ToolConfirmationOutcome.ProceedOnce,
|
|
931
|
+
},
|
|
932
|
+
});
|
|
933
|
+
const stream1 = createMockStream([
|
|
934
|
+
{
|
|
935
|
+
type: StreamEventType.CHUNK,
|
|
936
|
+
value: {
|
|
937
|
+
functionCalls: [{ name: 'test_tool', args: {} }],
|
|
938
|
+
},
|
|
939
|
+
},
|
|
940
|
+
]);
|
|
941
|
+
const stream2 = createMockStream([
|
|
942
|
+
{
|
|
943
|
+
type: StreamEventType.CHUNK,
|
|
944
|
+
value: { candidates: [] },
|
|
945
|
+
},
|
|
946
|
+
]);
|
|
947
|
+
mockChat.sendMessageStream
|
|
948
|
+
.mockResolvedValueOnce(stream1)
|
|
949
|
+
.mockResolvedValueOnce(stream2);
|
|
950
|
+
await localSession.prompt({
|
|
951
|
+
sessionId: 'session-2',
|
|
952
|
+
prompt: [{ type: 'text', text: 'Call tool' }],
|
|
953
|
+
});
|
|
954
|
+
expect(mockConnection.requestPermission).toHaveBeenCalledWith(expect.objectContaining({
|
|
955
|
+
options: expect.not.arrayContaining([
|
|
956
|
+
expect.objectContaining({
|
|
957
|
+
optionId: ToolConfirmationOutcome.ProceedAlwaysAndSave,
|
|
958
|
+
}),
|
|
959
|
+
]),
|
|
960
|
+
}));
|
|
961
|
+
expect(mockConnection.requestPermission).toHaveBeenCalledWith(expect.objectContaining({
|
|
962
|
+
options: expect.arrayContaining([
|
|
963
|
+
expect.objectContaining({
|
|
964
|
+
optionId: ToolConfirmationOutcome.ProceedAlways,
|
|
965
|
+
}),
|
|
966
|
+
]),
|
|
967
|
+
}));
|
|
968
|
+
});
|
|
969
|
+
it('should include always allow and save permanent option when enablePermanentToolApproval is true', async () => {
|
|
970
|
+
mockConfig.getDisableAlwaysAllow = vi.fn().mockReturnValue(false);
|
|
971
|
+
const confirmationDetails = {
|
|
972
|
+
type: 'edit',
|
|
973
|
+
onConfirm: vi.fn(),
|
|
974
|
+
};
|
|
975
|
+
mockTool.build.mockReturnValue({
|
|
976
|
+
getDescription: () => 'Test Tool',
|
|
977
|
+
toolLocations: () => [],
|
|
978
|
+
shouldConfirmExecute: vi.fn().mockResolvedValue(confirmationDetails),
|
|
979
|
+
execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
|
|
980
|
+
});
|
|
981
|
+
const customSettings = {
|
|
982
|
+
system: { settings: {} },
|
|
983
|
+
systemDefaults: { settings: {} },
|
|
984
|
+
user: { settings: {} },
|
|
985
|
+
workspace: { settings: {} },
|
|
986
|
+
merged: {
|
|
987
|
+
security: { enablePermanentToolApproval: true },
|
|
988
|
+
mcpServers: {},
|
|
989
|
+
},
|
|
990
|
+
errors: [],
|
|
991
|
+
};
|
|
992
|
+
const localSession = new Session('session-2', mockChat, mockConfig, mockConnection, customSettings);
|
|
993
|
+
mockConnection.requestPermission.mockResolvedValueOnce({
|
|
994
|
+
outcome: {
|
|
995
|
+
outcome: 'selected',
|
|
996
|
+
optionId: ToolConfirmationOutcome.ProceedOnce,
|
|
997
|
+
},
|
|
998
|
+
});
|
|
999
|
+
const stream1 = createMockStream([
|
|
1000
|
+
{
|
|
1001
|
+
type: StreamEventType.CHUNK,
|
|
1002
|
+
value: {
|
|
1003
|
+
functionCalls: [{ name: 'test_tool', args: {} }],
|
|
1004
|
+
},
|
|
1005
|
+
},
|
|
1006
|
+
]);
|
|
1007
|
+
const stream2 = createMockStream([
|
|
1008
|
+
{
|
|
1009
|
+
type: StreamEventType.CHUNK,
|
|
1010
|
+
value: { candidates: [] },
|
|
1011
|
+
},
|
|
1012
|
+
]);
|
|
1013
|
+
mockChat.sendMessageStream
|
|
1014
|
+
.mockResolvedValueOnce(stream1)
|
|
1015
|
+
.mockResolvedValueOnce(stream2);
|
|
1016
|
+
await localSession.prompt({
|
|
1017
|
+
sessionId: 'session-2',
|
|
1018
|
+
prompt: [{ type: 'text', text: 'Call tool' }],
|
|
1019
|
+
});
|
|
1020
|
+
expect(mockConnection.requestPermission).toHaveBeenCalledWith(expect.objectContaining({
|
|
1021
|
+
options: expect.arrayContaining([
|
|
1022
|
+
expect.objectContaining({
|
|
1023
|
+
optionId: ToolConfirmationOutcome.ProceedAlwaysAndSave,
|
|
1024
|
+
name: 'Allow for this file in all future sessions',
|
|
1025
|
+
}),
|
|
1026
|
+
]),
|
|
1027
|
+
}));
|
|
1028
|
+
});
|
|
791
1029
|
it('should use filePath for ACP diff content in permission request', async () => {
|
|
792
1030
|
const confirmationDetails = {
|
|
793
1031
|
type: 'edit',
|
|
@@ -897,6 +1135,48 @@ describe('Session', () => {
|
|
|
897
1135
|
}),
|
|
898
1136
|
}));
|
|
899
1137
|
});
|
|
1138
|
+
it('should call updatePolicy when tool permission triggers always allow', async () => {
|
|
1139
|
+
const confirmationDetails = {
|
|
1140
|
+
type: 'info',
|
|
1141
|
+
onConfirm: vi.fn(),
|
|
1142
|
+
};
|
|
1143
|
+
mockTool.build.mockReturnValue({
|
|
1144
|
+
getDescription: () => 'Test Tool',
|
|
1145
|
+
toolLocations: () => [],
|
|
1146
|
+
shouldConfirmExecute: vi.fn().mockResolvedValue(confirmationDetails),
|
|
1147
|
+
execute: vi.fn().mockResolvedValue({ llmContent: 'Tool Result' }),
|
|
1148
|
+
});
|
|
1149
|
+
mockConnection.requestPermission.mockResolvedValue({
|
|
1150
|
+
outcome: {
|
|
1151
|
+
outcome: 'selected',
|
|
1152
|
+
optionId: ToolConfirmationOutcome.ProceedAlways,
|
|
1153
|
+
},
|
|
1154
|
+
});
|
|
1155
|
+
const stream1 = createMockStream([
|
|
1156
|
+
{
|
|
1157
|
+
type: StreamEventType.CHUNK,
|
|
1158
|
+
value: {
|
|
1159
|
+
functionCalls: [{ name: 'test_tool', args: {} }],
|
|
1160
|
+
},
|
|
1161
|
+
},
|
|
1162
|
+
]);
|
|
1163
|
+
const stream2 = createMockStream([
|
|
1164
|
+
{
|
|
1165
|
+
type: StreamEventType.CHUNK,
|
|
1166
|
+
value: { candidates: [] },
|
|
1167
|
+
},
|
|
1168
|
+
]);
|
|
1169
|
+
mockChat.sendMessageStream
|
|
1170
|
+
.mockResolvedValueOnce(stream1)
|
|
1171
|
+
.mockResolvedValueOnce(stream2);
|
|
1172
|
+
const { updatePolicy } = await import('@google/gemini-cli-core');
|
|
1173
|
+
await session.prompt({
|
|
1174
|
+
sessionId: 'session-1',
|
|
1175
|
+
prompt: [{ type: 'text', text: 'Call tool' }],
|
|
1176
|
+
});
|
|
1177
|
+
expect(confirmationDetails.onConfirm).toHaveBeenCalled();
|
|
1178
|
+
expect(updatePolicy).toHaveBeenCalled();
|
|
1179
|
+
});
|
|
900
1180
|
it('should use filePath for ACP diff content in tool result', async () => {
|
|
901
1181
|
mockTool.build.mockReturnValue({
|
|
902
1182
|
getDescription: () => 'Test Tool',
|
|
@@ -1076,7 +1356,6 @@ describe('Session', () => {
|
|
|
1076
1356
|
fs.stat.mockResolvedValue({
|
|
1077
1357
|
isDirectory: () => false,
|
|
1078
1358
|
});
|
|
1079
|
-
isWithinRoot.mockReturnValue(true);
|
|
1080
1359
|
const stream = createMockStream([
|
|
1081
1360
|
{
|
|
1082
1361
|
type: StreamEventType.CHUNK,
|
|
@@ -1120,7 +1399,6 @@ describe('Session', () => {
|
|
|
1120
1399
|
fs.stat.mockResolvedValue({
|
|
1121
1400
|
isDirectory: () => false,
|
|
1122
1401
|
});
|
|
1123
|
-
isWithinRoot.mockReturnValue(true);
|
|
1124
1402
|
const MockReadManyFilesTool = ReadManyFilesTool;
|
|
1125
1403
|
MockReadManyFilesTool.mockImplementationOnce(() => ({
|
|
1126
1404
|
name: 'read_many_files',
|
|
@@ -1165,6 +1443,129 @@ describe('Session', () => {
|
|
|
1165
1443
|
}),
|
|
1166
1444
|
}));
|
|
1167
1445
|
});
|
|
1446
|
+
it('should handle @path validation error and bubble it to user', async () => {
|
|
1447
|
+
mockConfig.getTargetDir.mockReturnValue('/workspace');
|
|
1448
|
+
path.resolve.mockReturnValue('/tmp/disallowed.txt');
|
|
1449
|
+
mockConfig.validatePathAccess.mockReturnValue('Path is outside workspace');
|
|
1450
|
+
// Force fs.stat to fail to skip direct reading and triggers the warning
|
|
1451
|
+
fs.stat.mockRejectedValue(new Error('File not found'));
|
|
1452
|
+
const stream = createMockStream([
|
|
1453
|
+
{
|
|
1454
|
+
type: StreamEventType.CHUNK,
|
|
1455
|
+
value: { candidates: [] },
|
|
1456
|
+
},
|
|
1457
|
+
]);
|
|
1458
|
+
mockChat.sendMessageStream.mockResolvedValue(stream);
|
|
1459
|
+
await session.prompt({
|
|
1460
|
+
sessionId: 'session-1',
|
|
1461
|
+
prompt: [
|
|
1462
|
+
{
|
|
1463
|
+
type: 'resource_link',
|
|
1464
|
+
uri: 'file://disallowed.txt',
|
|
1465
|
+
mimeType: 'text/plain',
|
|
1466
|
+
name: 'disallowed.txt',
|
|
1467
|
+
},
|
|
1468
|
+
],
|
|
1469
|
+
});
|
|
1470
|
+
// Verify warning sent via sendUpdate
|
|
1471
|
+
expect(mockConnection.sessionUpdate).toHaveBeenCalledWith(expect.objectContaining({
|
|
1472
|
+
update: expect.objectContaining({
|
|
1473
|
+
sessionUpdate: 'agent_thought_chunk',
|
|
1474
|
+
content: expect.objectContaining({
|
|
1475
|
+
text: expect.stringContaining('Warning: skipping access to `disallowed.txt`. Reason: Path is outside workspace'),
|
|
1476
|
+
}),
|
|
1477
|
+
}),
|
|
1478
|
+
}));
|
|
1479
|
+
});
|
|
1480
|
+
it('should read absolute file directly if outside workspace', async () => {
|
|
1481
|
+
mockConfig.getTargetDir.mockReturnValue('/workspace');
|
|
1482
|
+
const testFilePath = '/tmp/custom.txt';
|
|
1483
|
+
path.resolve.mockReturnValue(testFilePath);
|
|
1484
|
+
mockConfig.validatePathAccess.mockReturnValue('Path is outside workspace');
|
|
1485
|
+
mockConnection.requestPermission.mockResolvedValue({
|
|
1486
|
+
outcome: {
|
|
1487
|
+
outcome: 'selected',
|
|
1488
|
+
optionId: ToolConfirmationOutcome.ProceedOnce,
|
|
1489
|
+
},
|
|
1490
|
+
});
|
|
1491
|
+
const mockStats = {
|
|
1492
|
+
isFile: () => true,
|
|
1493
|
+
isDirectory: () => false,
|
|
1494
|
+
};
|
|
1495
|
+
fs.stat.mockResolvedValue(mockStats);
|
|
1496
|
+
processSingleFileContent.mockResolvedValue({
|
|
1497
|
+
llmContent: 'Absolute File Content',
|
|
1498
|
+
});
|
|
1499
|
+
const stream = createMockStream([
|
|
1500
|
+
{
|
|
1501
|
+
type: StreamEventType.CHUNK,
|
|
1502
|
+
value: { candidates: [] },
|
|
1503
|
+
},
|
|
1504
|
+
]);
|
|
1505
|
+
mockChat.sendMessageStream.mockResolvedValue(stream);
|
|
1506
|
+
await session.prompt({
|
|
1507
|
+
sessionId: 'session-1',
|
|
1508
|
+
prompt: [
|
|
1509
|
+
{
|
|
1510
|
+
type: 'resource_link',
|
|
1511
|
+
uri: `file://${testFilePath}`,
|
|
1512
|
+
mimeType: 'text/plain',
|
|
1513
|
+
name: 'custom.txt',
|
|
1514
|
+
},
|
|
1515
|
+
],
|
|
1516
|
+
});
|
|
1517
|
+
expect(processSingleFileContent).toHaveBeenCalledWith(testFilePath, expect.anything(), expect.anything());
|
|
1518
|
+
// Verify content appended to sendMessageStream parts
|
|
1519
|
+
expect(mockChat.sendMessageStream).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining([
|
|
1520
|
+
expect.objectContaining({
|
|
1521
|
+
text: 'Absolute File Content',
|
|
1522
|
+
}),
|
|
1523
|
+
]), expect.anything(), expect.any(AbortSignal), expect.anything());
|
|
1524
|
+
});
|
|
1525
|
+
it('should read escaping relative file directly if outside workspace', async () => {
|
|
1526
|
+
mockConfig.getTargetDir.mockReturnValue('/workspace');
|
|
1527
|
+
const testFilePath = '../../custom.txt';
|
|
1528
|
+
path.resolve.mockReturnValue('/custom.txt');
|
|
1529
|
+
mockConfig.validatePathAccess.mockReturnValue('Path is outside workspace');
|
|
1530
|
+
mockConnection.requestPermission.mockResolvedValue({
|
|
1531
|
+
outcome: {
|
|
1532
|
+
outcome: 'selected',
|
|
1533
|
+
optionId: ToolConfirmationOutcome.ProceedOnce,
|
|
1534
|
+
},
|
|
1535
|
+
});
|
|
1536
|
+
const mockStats = {
|
|
1537
|
+
isFile: () => true,
|
|
1538
|
+
isDirectory: () => false,
|
|
1539
|
+
};
|
|
1540
|
+
fs.stat.mockResolvedValue(mockStats);
|
|
1541
|
+
processSingleFileContent.mockResolvedValue({
|
|
1542
|
+
llmContent: 'Escaping Relative File Content',
|
|
1543
|
+
});
|
|
1544
|
+
const stream = createMockStream([
|
|
1545
|
+
{
|
|
1546
|
+
type: StreamEventType.CHUNK,
|
|
1547
|
+
value: { candidates: [] },
|
|
1548
|
+
},
|
|
1549
|
+
]);
|
|
1550
|
+
mockChat.sendMessageStream.mockResolvedValue(stream);
|
|
1551
|
+
await session.prompt({
|
|
1552
|
+
sessionId: 'session-1',
|
|
1553
|
+
prompt: [
|
|
1554
|
+
{
|
|
1555
|
+
type: 'resource_link',
|
|
1556
|
+
uri: `file://${testFilePath}`,
|
|
1557
|
+
mimeType: 'text/plain',
|
|
1558
|
+
name: 'custom.txt',
|
|
1559
|
+
},
|
|
1560
|
+
],
|
|
1561
|
+
});
|
|
1562
|
+
expect(processSingleFileContent).toHaveBeenCalledWith('/custom.txt', expect.any(String), expect.anything());
|
|
1563
|
+
expect(mockChat.sendMessageStream).toHaveBeenCalledWith(expect.anything(), expect.arrayContaining([
|
|
1564
|
+
expect.objectContaining({
|
|
1565
|
+
text: 'Escaping Relative File Content',
|
|
1566
|
+
}),
|
|
1567
|
+
]), expect.anything(), expect.any(AbortSignal), expect.anything());
|
|
1568
|
+
});
|
|
1168
1569
|
it('should handle cancellation during prompt', async () => {
|
|
1169
1570
|
let streamController;
|
|
1170
1571
|
const stream = new ReadableStream({
|
|
@@ -1332,7 +1733,6 @@ describe('Session', () => {
|
|
|
1332
1733
|
fs.stat.mockResolvedValue({
|
|
1333
1734
|
isDirectory: () => true,
|
|
1334
1735
|
});
|
|
1335
|
-
isWithinRoot.mockReturnValue(true);
|
|
1336
1736
|
const stream = createMockStream([
|
|
1337
1737
|
{
|
|
1338
1738
|
type: StreamEventType.CHUNK,
|