summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/commands/copyCommand.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/ui/commands/copyCommand.ts')
-rw-r--r--packages/cli/src/ui/commands/copyCommand.ts62
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.',
+ };
+ }
+ },
+};