diff options
Diffstat (limited to 'packages/cli/src/ui/commands/copyCommand.ts')
| -rw-r--r-- | packages/cli/src/ui/commands/copyCommand.ts | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/packages/cli/src/ui/commands/copyCommand.ts b/packages/cli/src/ui/commands/copyCommand.ts new file mode 100644 index 00000000..5714b5ab --- /dev/null +++ b/packages/cli/src/ui/commands/copyCommand.ts @@ -0,0 +1,62 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { copyToClipboard } from '../utils/commandUtils.js'; +import { SlashCommand, SlashCommandActionReturn } from './types.js'; + +export const copyCommand: SlashCommand = { + name: 'copy', + description: 'Copy the last result or code snippet to clipboard', + action: async (context, _args): Promise<SlashCommandActionReturn | void> => { + const chat = await context.services.config?.getGeminiClient()?.getChat(); + const history = chat?.getHistory(); + + // Get the last message from the AI (model role) + const lastAiMessage = history + ? history.filter((item) => item.role === 'model').pop() + : undefined; + + if (!lastAiMessage) { + return { + type: 'message', + messageType: 'info', + content: 'No output in history', + }; + } + // Extract text from the parts + const lastAiOutput = lastAiMessage.parts + ?.filter((part) => part.text) + .map((part) => part.text) + .join(''); + + if (lastAiOutput) { + try { + await copyToClipboard(lastAiOutput); + + return { + type: 'message', + messageType: 'info', + content: 'Last output copied to the clipboard', + }; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + console.debug(message); + + return { + type: 'message', + messageType: 'error', + content: 'Failed to copy to the clipboard.', + }; + } + } else { + return { + type: 'message', + messageType: 'info', + content: 'Last AI output contains no text to copy.', + }; + } + }, +}; |
