@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
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Google LLC
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from 'vitest';
|
|
8
|
+
import { renderWithProviders } from '../../../test-utils/render.js';
|
|
9
|
+
import { createMockSettings } from '../../../test-utils/settings.js';
|
|
10
|
+
import { waitFor } from '../../../test-utils/async.js';
|
|
11
|
+
import { DenseToolMessage } from './DenseToolMessage.js';
|
|
12
|
+
import { CoreToolCallStatus, makeFakeConfig, } from '@google/gemini-cli-core';
|
|
13
|
+
describe('DenseToolMessage', () => {
|
|
14
|
+
const defaultProps = {
|
|
15
|
+
callId: 'call-1',
|
|
16
|
+
name: 'test-tool',
|
|
17
|
+
description: 'Test description',
|
|
18
|
+
status: CoreToolCallStatus.Success,
|
|
19
|
+
resultDisplay: 'Success result',
|
|
20
|
+
confirmationDetails: undefined,
|
|
21
|
+
terminalWidth: 80,
|
|
22
|
+
};
|
|
23
|
+
it('renders correctly for a successful string result', async () => {
|
|
24
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps }));
|
|
25
|
+
await waitUntilReady();
|
|
26
|
+
const output = lastFrame();
|
|
27
|
+
expect(output).toContain('test-tool');
|
|
28
|
+
expect(output).toContain('Test description');
|
|
29
|
+
expect(output).toContain('→ Success result');
|
|
30
|
+
expect(output).toMatchSnapshot();
|
|
31
|
+
});
|
|
32
|
+
it('truncates long string results', async () => {
|
|
33
|
+
const longResult = 'A'.repeat(200);
|
|
34
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: longResult }));
|
|
35
|
+
await waitUntilReady();
|
|
36
|
+
const output = lastFrame();
|
|
37
|
+
expect(output).toContain('…');
|
|
38
|
+
expect(lastFrame()).toMatchSnapshot();
|
|
39
|
+
});
|
|
40
|
+
it('flattens newlines in string results', async () => {
|
|
41
|
+
const multilineResult = 'Line 1\nLine 2';
|
|
42
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: multilineResult }));
|
|
43
|
+
await waitUntilReady();
|
|
44
|
+
const output = lastFrame();
|
|
45
|
+
expect(output).toContain('→ Line 1 Line 2');
|
|
46
|
+
expect(output).toMatchSnapshot();
|
|
47
|
+
});
|
|
48
|
+
it('renders correctly for file diff results with stats', async () => {
|
|
49
|
+
const diffResult = {
|
|
50
|
+
fileDiff: '@@ -1,1 +1,1 @@\n-old line\n+diff content',
|
|
51
|
+
fileName: 'test.ts',
|
|
52
|
+
filePath: '/path/to/test.ts',
|
|
53
|
+
originalContent: 'old content',
|
|
54
|
+
newContent: 'new content',
|
|
55
|
+
diffStat: {
|
|
56
|
+
user_added_lines: 5,
|
|
57
|
+
user_removed_lines: 2,
|
|
58
|
+
user_added_chars: 50,
|
|
59
|
+
user_removed_chars: 20,
|
|
60
|
+
model_added_lines: 10,
|
|
61
|
+
model_removed_lines: 4,
|
|
62
|
+
model_added_chars: 100,
|
|
63
|
+
model_removed_chars: 40,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const { lastFrame } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: diffResult }), {
|
|
67
|
+
settings: createMockSettings({
|
|
68
|
+
merged: { useAlternateBuffer: false, useTerminalBuffer: false },
|
|
69
|
+
}),
|
|
70
|
+
});
|
|
71
|
+
await waitFor(() => expect(lastFrame()).toContain('test-tool'));
|
|
72
|
+
await waitFor(() => expect(lastFrame()).toContain('test.ts → Accepted (+15, -6)'));
|
|
73
|
+
const output = lastFrame();
|
|
74
|
+
expect(output).toMatchSnapshot();
|
|
75
|
+
});
|
|
76
|
+
it('renders correctly for Edit tool using confirmationDetails', async () => {
|
|
77
|
+
const confirmationDetails = {
|
|
78
|
+
type: 'edit',
|
|
79
|
+
title: 'Confirm Edit',
|
|
80
|
+
fileName: 'styles.scss',
|
|
81
|
+
filePath: '/path/to/styles.scss',
|
|
82
|
+
fileDiff: '@@ -1,1 +1,1 @@\n-body { color: blue; }\n+body { color: red; }',
|
|
83
|
+
originalContent: 'body { color: blue; }',
|
|
84
|
+
newContent: 'body { color: red; }',
|
|
85
|
+
};
|
|
86
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "Edit", status: CoreToolCallStatus.AwaitingApproval, resultDisplay: undefined, confirmationDetails: confirmationDetails }), {});
|
|
87
|
+
await waitUntilReady();
|
|
88
|
+
const output = lastFrame();
|
|
89
|
+
expect(output).toContain('Edit');
|
|
90
|
+
expect(output).toContain('styles.scss');
|
|
91
|
+
expect(output).toContain('→ Confirming');
|
|
92
|
+
expect(output).toMatchSnapshot();
|
|
93
|
+
});
|
|
94
|
+
it('renders correctly for Rejected Edit tool', async () => {
|
|
95
|
+
const diffResult = {
|
|
96
|
+
fileDiff: '@@ -1,1 +1,1 @@\n-old line\n+new line',
|
|
97
|
+
fileName: 'styles.scss',
|
|
98
|
+
filePath: '/path/to/styles.scss',
|
|
99
|
+
originalContent: 'old line',
|
|
100
|
+
newContent: 'new line',
|
|
101
|
+
diffStat: {
|
|
102
|
+
user_added_lines: 1,
|
|
103
|
+
user_removed_lines: 1,
|
|
104
|
+
user_added_chars: 0,
|
|
105
|
+
user_removed_chars: 0,
|
|
106
|
+
model_added_lines: 0,
|
|
107
|
+
model_removed_lines: 0,
|
|
108
|
+
model_added_chars: 0,
|
|
109
|
+
model_removed_chars: 0,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "Edit", status: CoreToolCallStatus.Cancelled, resultDisplay: diffResult }), {});
|
|
113
|
+
await waitUntilReady();
|
|
114
|
+
const output = lastFrame();
|
|
115
|
+
expect(output).toContain('Edit');
|
|
116
|
+
expect(output).toContain('styles.scss → Rejected (+1, -1)');
|
|
117
|
+
expect(output).toMatchSnapshot();
|
|
118
|
+
});
|
|
119
|
+
it('renders correctly for Rejected Edit tool with confirmationDetails and diffStat', async () => {
|
|
120
|
+
const confirmationDetails = {
|
|
121
|
+
type: 'edit',
|
|
122
|
+
title: 'Confirm Edit',
|
|
123
|
+
fileName: 'styles.scss',
|
|
124
|
+
filePath: '/path/to/styles.scss',
|
|
125
|
+
fileDiff: '@@ -1,1 +1,1 @@\n-body { color: blue; }\n+body { color: red; }',
|
|
126
|
+
originalContent: 'body { color: blue; }',
|
|
127
|
+
newContent: 'body { color: red; }',
|
|
128
|
+
diffStat: {
|
|
129
|
+
user_added_lines: 1,
|
|
130
|
+
user_removed_lines: 1,
|
|
131
|
+
user_added_chars: 0,
|
|
132
|
+
user_removed_chars: 0,
|
|
133
|
+
model_added_lines: 0,
|
|
134
|
+
model_removed_lines: 0,
|
|
135
|
+
model_added_chars: 0,
|
|
136
|
+
model_removed_chars: 0,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "Edit", status: CoreToolCallStatus.Cancelled, resultDisplay: undefined, confirmationDetails: confirmationDetails }), {});
|
|
140
|
+
await waitUntilReady();
|
|
141
|
+
const output = lastFrame();
|
|
142
|
+
expect(output).toContain('Edit');
|
|
143
|
+
expect(output).toContain('styles.scss → Rejected (+1, -1)');
|
|
144
|
+
expect(output).toMatchSnapshot();
|
|
145
|
+
});
|
|
146
|
+
it('renders correctly for WriteFile tool', async () => {
|
|
147
|
+
const diffResult = {
|
|
148
|
+
fileDiff: '@@ -1,1 +1,1 @@\n-old content\n+new content',
|
|
149
|
+
fileName: 'config.json',
|
|
150
|
+
filePath: '/path/to/config.json',
|
|
151
|
+
originalContent: 'old content',
|
|
152
|
+
newContent: 'new content',
|
|
153
|
+
diffStat: {
|
|
154
|
+
user_added_lines: 1,
|
|
155
|
+
user_removed_lines: 1,
|
|
156
|
+
user_added_chars: 0,
|
|
157
|
+
user_removed_chars: 0,
|
|
158
|
+
model_added_lines: 0,
|
|
159
|
+
model_removed_lines: 0,
|
|
160
|
+
model_added_chars: 0,
|
|
161
|
+
model_removed_chars: 0,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "WriteFile", status: CoreToolCallStatus.Success, resultDisplay: diffResult }), {});
|
|
165
|
+
await waitUntilReady();
|
|
166
|
+
const output = lastFrame();
|
|
167
|
+
expect(output).toContain('WriteFile');
|
|
168
|
+
expect(output).toContain('config.json → Accepted (+1, -1)');
|
|
169
|
+
expect(output).toMatchSnapshot();
|
|
170
|
+
});
|
|
171
|
+
it('renders correctly for Rejected WriteFile tool', async () => {
|
|
172
|
+
const diffResult = {
|
|
173
|
+
fileDiff: '@@ -1,1 +1,1 @@\n-old content\n+new content',
|
|
174
|
+
fileName: 'config.json',
|
|
175
|
+
filePath: '/path/to/config.json',
|
|
176
|
+
originalContent: 'old content',
|
|
177
|
+
newContent: 'new content',
|
|
178
|
+
};
|
|
179
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "WriteFile", status: CoreToolCallStatus.Cancelled, resultDisplay: diffResult }), {});
|
|
180
|
+
await waitUntilReady();
|
|
181
|
+
const output = lastFrame();
|
|
182
|
+
expect(output).toContain('WriteFile');
|
|
183
|
+
expect(output).toContain('config.json');
|
|
184
|
+
expect(output).toContain('→ Rejected');
|
|
185
|
+
expect(output).toMatchSnapshot();
|
|
186
|
+
});
|
|
187
|
+
it('renders correctly for Errored Edit tool', async () => {
|
|
188
|
+
const diffResult = {
|
|
189
|
+
fileDiff: '@@ -1,1 +1,1 @@\n-old line\n+new line',
|
|
190
|
+
fileName: 'styles.scss',
|
|
191
|
+
filePath: '/path/to/styles.scss',
|
|
192
|
+
originalContent: 'old line',
|
|
193
|
+
newContent: 'new line',
|
|
194
|
+
diffStat: {
|
|
195
|
+
user_added_lines: 1,
|
|
196
|
+
user_removed_lines: 1,
|
|
197
|
+
user_added_chars: 0,
|
|
198
|
+
user_removed_chars: 0,
|
|
199
|
+
model_added_lines: 0,
|
|
200
|
+
model_removed_lines: 0,
|
|
201
|
+
model_added_chars: 0,
|
|
202
|
+
model_removed_chars: 0,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "Edit", status: CoreToolCallStatus.Error, resultDisplay: diffResult }));
|
|
206
|
+
await waitUntilReady();
|
|
207
|
+
const output = lastFrame();
|
|
208
|
+
expect(output).toContain('Edit');
|
|
209
|
+
expect(output).toContain('styles.scss → Failed (+1, -1)');
|
|
210
|
+
expect(output).toMatchSnapshot();
|
|
211
|
+
});
|
|
212
|
+
it('renders correctly for grep results', async () => {
|
|
213
|
+
const grepResult = {
|
|
214
|
+
summary: 'Found 2 matches',
|
|
215
|
+
matches: [
|
|
216
|
+
{
|
|
217
|
+
filePath: 'file1.ts',
|
|
218
|
+
absolutePath: '/file1.ts',
|
|
219
|
+
lineNumber: 10,
|
|
220
|
+
line: 'match 1',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
filePath: 'file2.ts',
|
|
224
|
+
absolutePath: '/file2.ts',
|
|
225
|
+
lineNumber: 20,
|
|
226
|
+
line: 'match 2',
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: grepResult }));
|
|
231
|
+
await waitUntilReady();
|
|
232
|
+
const output = lastFrame();
|
|
233
|
+
expect(output).toContain('→ Found 2 matches');
|
|
234
|
+
// Matches are rendered in a secondary list for high-signal summaries
|
|
235
|
+
expect(output).toContain('file1.ts:10: match 1');
|
|
236
|
+
expect(output).toContain('file2.ts:20: match 2');
|
|
237
|
+
expect(output).toMatchSnapshot();
|
|
238
|
+
});
|
|
239
|
+
it('renders correctly for ls results', async () => {
|
|
240
|
+
const lsResult = {
|
|
241
|
+
summary: 'Listed 2 files. (1 ignored)',
|
|
242
|
+
files: ['file1.ts', 'dir1'],
|
|
243
|
+
};
|
|
244
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: lsResult }));
|
|
245
|
+
await waitUntilReady();
|
|
246
|
+
const output = lastFrame();
|
|
247
|
+
expect(output).toContain('→ Listed 2 files. (1 ignored)');
|
|
248
|
+
// Directory listings should not have a payload in dense mode
|
|
249
|
+
expect(output).not.toContain('file1.ts');
|
|
250
|
+
expect(output).not.toContain('dir1');
|
|
251
|
+
expect(output).toMatchSnapshot();
|
|
252
|
+
});
|
|
253
|
+
it('renders correctly for ReadManyFiles results', async () => {
|
|
254
|
+
const rmfResult = {
|
|
255
|
+
summary: 'Read 3 file(s)',
|
|
256
|
+
files: ['file1.ts', 'file2.ts', 'file3.ts'],
|
|
257
|
+
include: ['**/*.ts'],
|
|
258
|
+
skipped: [{ path: 'skipped.bin', reason: 'binary' }],
|
|
259
|
+
};
|
|
260
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: rmfResult }));
|
|
261
|
+
await waitUntilReady();
|
|
262
|
+
const output = lastFrame();
|
|
263
|
+
expect(output).toContain('Attempting to read files from **/*.ts');
|
|
264
|
+
expect(output).toContain('→ Read 3 file(s) (1 ignored)');
|
|
265
|
+
expect(output).toContain('file1.ts');
|
|
266
|
+
expect(output).toContain('file2.ts');
|
|
267
|
+
expect(output).toContain('file3.ts');
|
|
268
|
+
expect(output).toMatchSnapshot();
|
|
269
|
+
});
|
|
270
|
+
it('renders correctly for todo updates', async () => {
|
|
271
|
+
const todoResult = {
|
|
272
|
+
todos: [],
|
|
273
|
+
};
|
|
274
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: todoResult }));
|
|
275
|
+
await waitUntilReady();
|
|
276
|
+
const output = lastFrame();
|
|
277
|
+
expect(output).toContain('→ Todos updated');
|
|
278
|
+
expect(output).toMatchSnapshot();
|
|
279
|
+
});
|
|
280
|
+
it('renders generic output message for unknown object results', async () => {
|
|
281
|
+
const genericResult = {
|
|
282
|
+
some: 'data',
|
|
283
|
+
};
|
|
284
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: genericResult }));
|
|
285
|
+
await waitUntilReady();
|
|
286
|
+
const output = lastFrame();
|
|
287
|
+
expect(output).toContain('→ Returned (possible empty result)');
|
|
288
|
+
expect(output).toMatchSnapshot();
|
|
289
|
+
});
|
|
290
|
+
it('renders correctly for error status with string message', async () => {
|
|
291
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, status: CoreToolCallStatus.Error, resultDisplay: 'Error occurred' }));
|
|
292
|
+
await waitUntilReady();
|
|
293
|
+
const output = lastFrame();
|
|
294
|
+
expect(output).toContain('→ Error occurred');
|
|
295
|
+
expect(output).toMatchSnapshot();
|
|
296
|
+
});
|
|
297
|
+
it('renders generic failure message for error status without string message', async () => {
|
|
298
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, status: CoreToolCallStatus.Error, resultDisplay: undefined }));
|
|
299
|
+
await waitUntilReady();
|
|
300
|
+
const output = lastFrame();
|
|
301
|
+
expect(output).toContain('→ Failed');
|
|
302
|
+
expect(output).toMatchSnapshot();
|
|
303
|
+
});
|
|
304
|
+
it('does not render result arrow if resultDisplay is missing', async () => {
|
|
305
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, status: CoreToolCallStatus.Scheduled, resultDisplay: undefined }));
|
|
306
|
+
await waitUntilReady();
|
|
307
|
+
const output = lastFrame();
|
|
308
|
+
expect(output).not.toContain('→');
|
|
309
|
+
expect(output).toMatchSnapshot();
|
|
310
|
+
});
|
|
311
|
+
describe('Toggleable Diff View (Alternate Buffer)', () => {
|
|
312
|
+
const diffResult = {
|
|
313
|
+
fileDiff: '@@ -1,1 +1,1 @@\n-old line\n+new line',
|
|
314
|
+
fileName: 'test.ts',
|
|
315
|
+
filePath: '/path/to/test.ts',
|
|
316
|
+
originalContent: 'old content',
|
|
317
|
+
newContent: 'new content',
|
|
318
|
+
};
|
|
319
|
+
it('hides diff content by default when in alternate buffer mode', async () => {
|
|
320
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: diffResult, status: CoreToolCallStatus.Success }), {
|
|
321
|
+
config: makeFakeConfig({ useAlternateBuffer: true }),
|
|
322
|
+
settings: createMockSettings({ ui: { useAlternateBuffer: true } }),
|
|
323
|
+
});
|
|
324
|
+
await waitUntilReady();
|
|
325
|
+
const output = lastFrame();
|
|
326
|
+
expect(output).toContain('Accepted');
|
|
327
|
+
expect(output).not.toContain('new line');
|
|
328
|
+
expect(output).toMatchSnapshot();
|
|
329
|
+
});
|
|
330
|
+
it('shows diff content by default when NOT in alternate buffer mode', async () => {
|
|
331
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: diffResult, status: CoreToolCallStatus.Success }), {
|
|
332
|
+
config: makeFakeConfig({ useAlternateBuffer: false }),
|
|
333
|
+
settings: createMockSettings({ ui: { useAlternateBuffer: false } }),
|
|
334
|
+
});
|
|
335
|
+
await waitUntilReady();
|
|
336
|
+
const output = lastFrame();
|
|
337
|
+
expect(output).toContain('Accepted');
|
|
338
|
+
expect(output).toMatchSnapshot();
|
|
339
|
+
});
|
|
340
|
+
it('shows diff content when expanded via ToolActionsContext', async () => {
|
|
341
|
+
const { lastFrame, waitUntilReady } = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, resultDisplay: diffResult, status: CoreToolCallStatus.Success }), {
|
|
342
|
+
config: makeFakeConfig({ useAlternateBuffer: true }),
|
|
343
|
+
settings: createMockSettings({ ui: { useAlternateBuffer: true } }),
|
|
344
|
+
toolActions: {
|
|
345
|
+
isExpanded: () => true,
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
await waitUntilReady();
|
|
349
|
+
// Verify it shows the diff when expanded
|
|
350
|
+
expect(lastFrame()).toContain('new line');
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
describe('Visual Regression', () => {
|
|
354
|
+
it('matches SVG snapshot for an Accepted file edit with diff stats', async () => {
|
|
355
|
+
const diffResult = {
|
|
356
|
+
fileName: 'test.ts',
|
|
357
|
+
filePath: '/mock/test.ts',
|
|
358
|
+
fileDiff: '--- a/test.ts\n+++ b/test.ts\n@@ -1 +1 @@\n-old\n+new',
|
|
359
|
+
originalContent: 'old',
|
|
360
|
+
newContent: 'new',
|
|
361
|
+
diffStat: {
|
|
362
|
+
model_added_lines: 1,
|
|
363
|
+
model_removed_lines: 1,
|
|
364
|
+
model_added_chars: 3,
|
|
365
|
+
model_removed_chars: 3,
|
|
366
|
+
user_added_lines: 0,
|
|
367
|
+
user_removed_lines: 0,
|
|
368
|
+
user_added_chars: 0,
|
|
369
|
+
user_removed_chars: 0,
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
const renderResult = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "edit", description: "Editing test.ts", resultDisplay: diffResult, status: CoreToolCallStatus.Success }));
|
|
373
|
+
await renderResult.waitUntilReady();
|
|
374
|
+
await expect(renderResult).toMatchSvgSnapshot();
|
|
375
|
+
});
|
|
376
|
+
it('matches SVG snapshot for a Rejected tool call', async () => {
|
|
377
|
+
const renderResult = await renderWithProviders(_jsx(DenseToolMessage, { ...defaultProps, name: "read_file", description: "Reading important.txt", resultDisplay: "Rejected by user", status: CoreToolCallStatus.Cancelled }));
|
|
378
|
+
await renderResult.waitUntilReady();
|
|
379
|
+
await expect(renderResult).toMatchSvgSnapshot();
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
//# sourceMappingURL=DenseToolMessage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DenseToolMessage.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/messages/DenseToolMessage.test.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,kBAAkB,EAMlB,cAAc,GACf,MAAM,yBAAyB,CAAC;AAMjC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,YAAY,GAAG;QACnB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,kBAAkB;QAC/B,MAAM,EAAE,kBAAkB,CAAC,OAAO;QAClC,aAAa,EAAE,gBAAqC;QACpD,mBAAmB,EAAE,SAAS;QAC9B,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OAAK,YAAY,GAAI,CACvC,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,UAA+B,GAC9C,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,eAAe,GAAG,gBAAgB,CAAC;QACzC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,eAAoC,GACnD,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,UAAU,GAAa;YAC3B,QAAQ,EAAE,2CAA2C;YACrD,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,kBAAkB;YAC5B,eAAe,EAAE,aAAa;YAC9B,UAAU,EAAE,aAAa;YACzB,QAAQ,EAAE;gBACR,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,EAAE;gBACpB,kBAAkB,EAAE,EAAE;gBACtB,iBAAiB,EAAE,EAAE;gBACrB,mBAAmB,EAAE,CAAC;gBACtB,iBAAiB,EAAE,GAAG;gBACtB,mBAAmB,EAAE,EAAE;aACxB;SACF,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,CAC7C,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,UAA+B,GAC9C,EACF;YACE,QAAQ,EAAE,kBAAkB,CAAC;gBAC3B,MAAM,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE;aAChE,CAAC;SACH,CACF,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,MAAM,OAAO,CAAC,GAAG,EAAE,CACjB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAC9D,CAAC;QACF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,mBAAmB,GAAG;YAC1B,IAAI,EAAE,MAAe;YACrB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,sBAAsB;YAChC,QAAQ,EACN,gEAAgE;YAClE,eAAe,EAAE,uBAAuB;YACxC,UAAU,EAAE,sBAAsB;SACnC,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,kBAAkB,CAAC,gBAAgB,EAC3C,aAAa,EAAE,SAAS,EACxB,mBAAmB,EACjB,mBAAsD,GAExD,EACF,EAAE,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,UAAU,GAAa;YAC3B,QAAQ,EAAE,uCAAuC;YACjD,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,sBAAsB;YAChC,eAAe,EAAE,UAAU;YAC3B,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE;gBACR,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;gBACtB,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;aACvB;SACF,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,kBAAkB,CAAC,SAAS,EACpC,aAAa,EAAE,UAA+B,GAC9C,EACF,EAAE,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,mBAAmB,GAAG;YAC1B,IAAI,EAAE,MAAe;YACrB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,sBAAsB;YAChC,QAAQ,EACN,gEAAgE;YAClE,eAAe,EAAE,uBAAuB;YACxC,UAAU,EAAE,sBAAsB;YAClC,QAAQ,EAAE;gBACR,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;gBACtB,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;aACX;SACd,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,kBAAkB,CAAC,SAAS,EACpC,aAAa,EAAE,SAAS,EACxB,mBAAmB,EACjB,mBAAiE,GAEnE,EACF,EAAE,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,UAAU,GAAa;YAC3B,QAAQ,EAAE,6CAA6C;YACvD,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,sBAAsB;YAChC,eAAe,EAAE,aAAa;YAC9B,UAAU,EAAE,aAAa;YACzB,QAAQ,EAAE;gBACR,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;gBACtB,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;aACvB;SACF,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,IAAI,EAAC,WAAW,EAChB,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAClC,aAAa,EAAE,UAA+B,GAC9C,EACF,EAAE,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,UAAU,GAAa;YAC3B,QAAQ,EAAE,6CAA6C;YACvD,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,sBAAsB;YAChC,eAAe,EAAE,aAAa;YAC9B,UAAU,EAAE,aAAa;SAC1B,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,IAAI,EAAC,WAAW,EAChB,MAAM,EAAE,kBAAkB,CAAC,SAAS,EACpC,aAAa,EAAE,UAA+B,GAC9C,EACF,EAAE,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,UAAU,GAAa;YAC3B,QAAQ,EAAE,uCAAuC;YACjD,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,sBAAsB;YAChC,eAAe,EAAE,UAAU;YAC3B,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE;gBACR,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,CAAC;gBACrB,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;gBACtB,iBAAiB,EAAE,CAAC;gBACpB,mBAAmB,EAAE,CAAC;aACvB;SACF,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,kBAAkB,CAAC,KAAK,EAChC,aAAa,EAAE,UAA+B,GAC9C,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,UAAU,GAAe;YAC7B,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE;gBACP;oBACE,QAAQ,EAAE,UAAU;oBACpB,YAAY,EAAE,WAAW;oBACzB,UAAU,EAAE,EAAE;oBACd,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,QAAQ,EAAE,UAAU;oBACpB,YAAY,EAAE,WAAW;oBACzB,UAAU,EAAE,EAAE;oBACd,IAAI,EAAE,SAAS;iBAChB;aACF;SACF,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,UAA0C,GACzD,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,qEAAqE;QACrE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,QAAQ,GAAwB;YACpC,OAAO,EAAE,6BAA6B;YACtC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;SAC5B,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,QAAwC,GACvD,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC1D,6DAA6D;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,SAAS,GAAwB;YACrC,OAAO,EAAE,gBAAgB;YACzB,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;YAC3C,OAAO,EAAE,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SACrD,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,SAAyC,GACxD,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,EAAE;SACV,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,UAA+B,GAC9C,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,MAAM;SACmB,CAAC;QAClC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OAAK,YAAY,EAAE,aAAa,EAAE,aAAa,GAAI,CACrE,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,MAAM,EAAE,kBAAkB,CAAC,KAAK,EAChC,aAAa,EAAE,gBAAqC,GACpD,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,MAAM,EAAE,kBAAkB,CAAC,KAAK,EAChC,aAAa,EAAE,SAAS,GACxB,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,MAAM,EAAE,kBAAkB,CAAC,SAAS,EACpC,aAAa,EAAE,SAAS,GACxB,CACH,CAAC;QACF,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACvD,MAAM,UAAU,GAAa;YAC3B,QAAQ,EAAE,uCAAuC;YACjD,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,kBAAkB;YAC5B,eAAe,EAAE,aAAa;YAC9B,UAAU,EAAE,aAAa;SAC1B,CAAC;QAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,UAA+B,EAC9C,MAAM,EAAE,kBAAkB,CAAC,OAAO,GAClC,EACF;gBACE,MAAM,EAAE,cAAc,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;gBACpD,QAAQ,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC;aACnE,CACF,CAAC;YACF,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,UAA+B,EAC9C,MAAM,EAAE,kBAAkB,CAAC,OAAO,GAClC,EACF;gBACE,MAAM,EAAE,cAAc,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;gBACrD,QAAQ,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,CAAC;aACpE,CACF,CAAC;YACF,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAC7D,KAAC,gBAAgB,OACX,YAAY,EAChB,aAAa,EAAE,UAA+B,EAC9C,MAAM,EAAE,kBAAkB,CAAC,OAAO,GAClC,EACF;gBACE,MAAM,EAAE,cAAc,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;gBACpD,QAAQ,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClE,WAAW,EAAE;oBACX,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;iBACvB;aACF,CACF,CAAC;YACF,MAAM,cAAc,EAAE,CAAC;YAEvB,yCAAyC;YACzC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,UAAU,GAAa;gBAC3B,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,eAAe;gBACzB,QAAQ,EAAE,uDAAuD;gBACjE,eAAe,EAAE,KAAK;gBACtB,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE;oBACR,iBAAiB,EAAE,CAAC;oBACpB,mBAAmB,EAAE,CAAC;oBACtB,iBAAiB,EAAE,CAAC;oBACpB,mBAAmB,EAAE,CAAC;oBACtB,gBAAgB,EAAE,CAAC;oBACnB,kBAAkB,EAAE,CAAC;oBACrB,gBAAgB,EAAE,CAAC;oBACnB,kBAAkB,EAAE,CAAC;iBACtB;aACF,CAAC;YAEF,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,KAAC,gBAAgB,OACX,YAAY,EAChB,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,iBAAiB,EAC7B,aAAa,EAAE,UAA+B,EAC9C,MAAM,EAAE,kBAAkB,CAAC,OAAO,GAClC,CACH,CAAC;YAEF,MAAM,YAAY,CAAC,cAAc,EAAE,CAAC;YACpC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,KAAC,gBAAgB,OACX,YAAY,EAChB,IAAI,EAAC,WAAW,EAChB,WAAW,EAAC,uBAAuB,EACnC,aAAa,EAAC,kBAAkB,EAChC,MAAM,EAAE,kBAAkB,CAAC,SAAS,GACpC,CACH,CAAC;YAEF,MAAM,YAAY,CAAC,cAAc,EAAE,CAAC;YACpC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -5,6 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type React from 'react';
|
|
7
7
|
import type { Theme } from '../../themes/theme.js';
|
|
8
|
+
export interface DiffLine {
|
|
9
|
+
type: 'add' | 'del' | 'context' | 'hunk' | 'other';
|
|
10
|
+
oldLine?: number;
|
|
11
|
+
newLine?: number;
|
|
12
|
+
content: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function parseDiffWithLineNumbers(diffContent: string): DiffLine[];
|
|
8
15
|
interface DiffRendererProps {
|
|
9
16
|
diffContent: string;
|
|
10
17
|
filename?: string;
|
|
@@ -12,6 +19,17 @@ interface DiffRendererProps {
|
|
|
12
19
|
availableTerminalHeight?: number;
|
|
13
20
|
terminalWidth: number;
|
|
14
21
|
theme?: Theme;
|
|
22
|
+
disableColor?: boolean;
|
|
23
|
+
paddingX?: number;
|
|
15
24
|
}
|
|
16
25
|
export declare const DiffRenderer: React.FC<DiffRendererProps>;
|
|
26
|
+
export declare const isNewFile: (parsedLines: DiffLine[]) => boolean;
|
|
27
|
+
export interface RenderDiffLinesOptions {
|
|
28
|
+
parsedLines: DiffLine[];
|
|
29
|
+
filename?: string;
|
|
30
|
+
tabWidth?: number;
|
|
31
|
+
terminalWidth: number;
|
|
32
|
+
disableColor?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare const renderDiffLines: ({ parsedLines, filename, tabWidth, terminalWidth, disableColor, }: RenderDiffLinesOptions) => React.ReactNode[];
|
|
17
35
|
export {};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
3
|
import { Box, Text, useIsScreenReaderEnabled } from 'ink';
|
|
4
|
-
import crypto from 'node:crypto';
|
|
5
4
|
import { colorizeCode, colorizeLine } from '../../utils/CodeColorizer.js';
|
|
6
5
|
import { MaxSizedBox } from '../shared/MaxSizedBox.js';
|
|
7
6
|
import { theme as semanticTheme } from '../../semantic-colors.js';
|
|
8
7
|
import { useSettings } from '../../contexts/SettingsContext.js';
|
|
9
|
-
|
|
8
|
+
import { getFileExtension } from '../../utils/fileUtils.js';
|
|
9
|
+
export function parseDiffWithLineNumbers(diffContent) {
|
|
10
10
|
const lines = diffContent.split(/\r?\n/);
|
|
11
11
|
const result = [];
|
|
12
12
|
let currentOldLine = 0;
|
|
@@ -16,6 +16,7 @@ function parseDiffWithLineNumbers(diffContent) {
|
|
|
16
16
|
for (const line of lines) {
|
|
17
17
|
const hunkMatch = line.match(hunkHeaderRegex);
|
|
18
18
|
if (hunkMatch) {
|
|
19
|
+
currentOldLine = parseInt(hunkMatch[1], 10);
|
|
19
20
|
currentOldLine = parseInt(hunkMatch[1], 10);
|
|
20
21
|
currentNewLine = parseInt(hunkMatch[2], 10);
|
|
21
22
|
inHunk = true;
|
|
@@ -68,7 +69,7 @@ function parseDiffWithLineNumbers(diffContent) {
|
|
|
68
69
|
return result;
|
|
69
70
|
}
|
|
70
71
|
const DEFAULT_TAB_WIDTH = 4; // Spaces per tab for normalization
|
|
71
|
-
export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WIDTH, availableTerminalHeight, terminalWidth, theme, }) => {
|
|
72
|
+
export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WIDTH, availableTerminalHeight, terminalWidth, theme, disableColor = false, paddingX = 0, }) => {
|
|
72
73
|
const settings = useSettings();
|
|
73
74
|
const screenReaderEnabled = useIsScreenReaderEnabled();
|
|
74
75
|
const parsedLines = useMemo(() => {
|
|
@@ -77,33 +78,25 @@ export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WID
|
|
|
77
78
|
}
|
|
78
79
|
return parseDiffWithLineNumbers(diffContent);
|
|
79
80
|
}, [diffContent]);
|
|
80
|
-
const
|
|
81
|
-
if (parsedLines.length === 0)
|
|
82
|
-
return false;
|
|
83
|
-
return parsedLines.every((line) => line.type === 'add' ||
|
|
84
|
-
line.type === 'hunk' ||
|
|
85
|
-
line.type === 'other' ||
|
|
86
|
-
line.content.startsWith('diff --git') ||
|
|
87
|
-
line.content.startsWith('new file mode'));
|
|
88
|
-
}, [parsedLines]);
|
|
81
|
+
const isNewFileResult = useMemo(() => isNewFile(parsedLines), [parsedLines]);
|
|
89
82
|
const renderedOutput = useMemo(() => {
|
|
90
83
|
if (!diffContent || typeof diffContent !== 'string') {
|
|
91
84
|
return _jsx(Text, { color: semanticTheme.status.warning, children: "No diff content." });
|
|
92
85
|
}
|
|
93
86
|
if (parsedLines.length === 0) {
|
|
94
|
-
return (_jsx(Box, {
|
|
87
|
+
return (_jsx(Box, { padding: 1, children: _jsx(Text, { dimColor: true, children: "No changes detected." }) }));
|
|
95
88
|
}
|
|
96
89
|
if (screenReaderEnabled) {
|
|
97
90
|
return (_jsx(Box, { flexDirection: "column", children: parsedLines.map((line, index) => (_jsxs(Text, { children: [line.type, ": ", line.content] }, index))) }));
|
|
98
91
|
}
|
|
99
|
-
if (
|
|
92
|
+
if (isNewFileResult) {
|
|
100
93
|
// Extract only the added lines' content
|
|
101
94
|
const addedContent = parsedLines
|
|
102
95
|
.filter((line) => line.type === 'add')
|
|
103
96
|
.map((line) => line.content)
|
|
104
97
|
.join('\n');
|
|
105
98
|
// Attempt to infer language from filename, default to plain text if no filename
|
|
106
|
-
const fileExtension = filename
|
|
99
|
+
const fileExtension = getFileExtension(filename);
|
|
107
100
|
const language = fileExtension
|
|
108
101
|
? getLanguageFromExtension(fileExtension)
|
|
109
102
|
: null;
|
|
@@ -114,26 +107,46 @@ export const DiffRenderer = ({ diffContent, filename, tabWidth = DEFAULT_TAB_WID
|
|
|
114
107
|
maxWidth: terminalWidth,
|
|
115
108
|
theme,
|
|
116
109
|
settings,
|
|
110
|
+
disableColor,
|
|
111
|
+
paddingX,
|
|
117
112
|
});
|
|
118
113
|
}
|
|
119
114
|
else {
|
|
120
|
-
|
|
115
|
+
const key = filename ? `diff-box-${filename}` : undefined;
|
|
116
|
+
return (_jsx(MaxSizedBox, { paddingX: paddingX, maxHeight: availableTerminalHeight, maxWidth: terminalWidth, children: renderDiffLines({
|
|
117
|
+
parsedLines,
|
|
118
|
+
filename,
|
|
119
|
+
tabWidth,
|
|
120
|
+
terminalWidth,
|
|
121
|
+
disableColor,
|
|
122
|
+
}) }, key));
|
|
121
123
|
}
|
|
122
124
|
}, [
|
|
123
125
|
diffContent,
|
|
124
126
|
parsedLines,
|
|
125
127
|
screenReaderEnabled,
|
|
126
|
-
|
|
128
|
+
isNewFileResult,
|
|
127
129
|
filename,
|
|
128
130
|
availableTerminalHeight,
|
|
129
131
|
terminalWidth,
|
|
130
132
|
theme,
|
|
131
133
|
settings,
|
|
132
134
|
tabWidth,
|
|
135
|
+
disableColor,
|
|
136
|
+
paddingX,
|
|
133
137
|
]);
|
|
134
138
|
return renderedOutput;
|
|
135
139
|
};
|
|
136
|
-
const
|
|
140
|
+
export const isNewFile = (parsedLines) => {
|
|
141
|
+
if (parsedLines.length === 0)
|
|
142
|
+
return false;
|
|
143
|
+
return parsedLines.every((line) => line.type === 'add' ||
|
|
144
|
+
line.type === 'hunk' ||
|
|
145
|
+
line.type === 'other' ||
|
|
146
|
+
line.content.startsWith('diff --git') ||
|
|
147
|
+
line.content.startsWith('new file mode'));
|
|
148
|
+
};
|
|
149
|
+
export const renderDiffLines = ({ parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH, terminalWidth, disableColor = false, }) => {
|
|
137
150
|
// 1. Normalize whitespace (replace tabs with spaces) *before* further processing
|
|
138
151
|
const normalizedLines = parsedLines.map((line) => ({
|
|
139
152
|
...line,
|
|
@@ -142,11 +155,13 @@ const renderDiffContent = (parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH,
|
|
|
142
155
|
// Filter out non-displayable lines (hunks, potentially 'other') using the normalized list
|
|
143
156
|
const displayableLines = normalizedLines.filter((l) => l.type !== 'hunk' && l.type !== 'other');
|
|
144
157
|
if (displayableLines.length === 0) {
|
|
145
|
-
return
|
|
158
|
+
return [
|
|
159
|
+
_jsx(Box, { padding: 1, children: _jsx(Text, { dimColor: true, children: "No changes detected." }) }, "no-changes"),
|
|
160
|
+
];
|
|
146
161
|
}
|
|
147
162
|
const maxLineNumber = Math.max(0, ...displayableLines.map((l) => l.oldLine ?? 0), ...displayableLines.map((l) => l.newLine ?? 0));
|
|
148
163
|
const gutterWidth = Math.max(1, maxLineNumber.toString().length);
|
|
149
|
-
const fileExtension = filename
|
|
164
|
+
const fileExtension = getFileExtension(filename);
|
|
150
165
|
const language = fileExtension
|
|
151
166
|
? getLanguageFromExtension(fileExtension)
|
|
152
167
|
: null;
|
|
@@ -164,9 +179,6 @@ const renderDiffContent = (parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH,
|
|
|
164
179
|
if (!isFinite(baseIndentation)) {
|
|
165
180
|
baseIndentation = 0;
|
|
166
181
|
}
|
|
167
|
-
const key = filename
|
|
168
|
-
? `diff-box-${filename}`
|
|
169
|
-
: `diff-box-${crypto.createHash('sha1').update(JSON.stringify(parsedLines)).digest('hex')}`;
|
|
170
182
|
let lastLineNumber = null;
|
|
171
183
|
const MAX_CONTEXT_LINES_WITHOUT_GAP = 5;
|
|
172
184
|
const content = displayableLines.reduce((acc, line, index) => {
|
|
@@ -213,19 +225,27 @@ const renderDiffContent = (parsedLines, filename, tabWidth = DEFAULT_TAB_WIDTH,
|
|
|
213
225
|
return acc;
|
|
214
226
|
}
|
|
215
227
|
const displayContent = line.content.substring(baseIndentation);
|
|
216
|
-
const backgroundColor =
|
|
217
|
-
?
|
|
218
|
-
: line.type === '
|
|
219
|
-
? semanticTheme.background.diff.
|
|
220
|
-
:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
228
|
+
const backgroundColor = disableColor
|
|
229
|
+
? undefined
|
|
230
|
+
: line.type === 'add'
|
|
231
|
+
? semanticTheme.background.diff.added
|
|
232
|
+
: line.type === 'del'
|
|
233
|
+
? semanticTheme.background.diff.removed
|
|
234
|
+
: undefined;
|
|
235
|
+
const gutterColor = disableColor
|
|
236
|
+
? undefined
|
|
237
|
+
: semanticTheme.text.secondary;
|
|
238
|
+
const symbolColor = disableColor
|
|
239
|
+
? undefined
|
|
240
|
+
: line.type === 'add'
|
|
241
|
+
? semanticTheme.status.success
|
|
242
|
+
: line.type === 'del'
|
|
243
|
+
? semanticTheme.status.error
|
|
244
|
+
: undefined;
|
|
245
|
+
acc.push(_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: gutterWidth + 1, paddingRight: 1, flexShrink: 0, backgroundColor: backgroundColor, justifyContent: "flex-end", children: _jsx(Text, { color: gutterColor, children: gutterNumStr }) }), line.type === 'context' ? (_jsxs(_Fragment, { children: [_jsxs(Text, { children: [prefixSymbol, " "] }), _jsx(Text, { wrap: "wrap", children: colorizeLine(displayContent, language, undefined, disableColor) })] })) : (_jsxs(Text, { backgroundColor: backgroundColor, wrap: "wrap", children: [_jsx(Text, { color: symbolColor, children: prefixSymbol }), ' ', colorizeLine(displayContent, language, undefined, disableColor)] }))] }, lineKey));
|
|
226
246
|
return acc;
|
|
227
247
|
}, []);
|
|
228
|
-
return
|
|
248
|
+
return content;
|
|
229
249
|
};
|
|
230
250
|
const getLanguageFromExtension = (extension) => {
|
|
231
251
|
const languageMap = {
|