mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-13 23:51:16 -07:00
68 lines
1.9 KiB
TypeScript
68 lines
1.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import { debugLogger } from '@google/gemini-cli-core';
|
|
import { copyToClipboard } from '../utils/commandUtils.js';
|
|
import type { SlashCommand, SlashCommandActionReturn } from './types.js';
|
|
import { CommandKind } from './types.js';
|
|
|
|
export const copyCommand: SlashCommand = {
|
|
name: 'copy',
|
|
description: 'Copy the last result or code snippet to clipboard',
|
|
kind: CommandKind.BUILT_IN,
|
|
autoExecute: true,
|
|
action: async (context, _args): Promise<SlashCommandActionReturn | void> => {
|
|
const chat = 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 {
|
|
const settings = context.services.settings.merged;
|
|
await copyToClipboard(lastAiOutput, settings);
|
|
|
|
return {
|
|
type: 'message',
|
|
messageType: 'info',
|
|
content: 'Last output copied to the clipboard',
|
|
};
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : String(error);
|
|
debugLogger.debug(message);
|
|
|
|
return {
|
|
type: 'message',
|
|
messageType: 'error',
|
|
content: `Failed to copy to the clipboard. ${message}`,
|
|
};
|
|
}
|
|
} else {
|
|
return {
|
|
type: 'message',
|
|
messageType: 'info',
|
|
content: 'Last AI output contains no text to copy.',
|
|
};
|
|
}
|
|
},
|
|
};
|