summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/hooks/slashCommandProcessor.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/ui/hooks/slashCommandProcessor.ts')
-rw-r--r--packages/cli/src/ui/hooks/slashCommandProcessor.ts68
1 files changed, 67 insertions, 1 deletions
diff --git a/packages/cli/src/ui/hooks/slashCommandProcessor.ts b/packages/cli/src/ui/hooks/slashCommandProcessor.ts
index 861d7bd9..97374e4f 100644
--- a/packages/cli/src/ui/hooks/slashCommandProcessor.ts
+++ b/packages/cli/src/ui/hooks/slashCommandProcessor.ts
@@ -9,6 +9,7 @@ import { type PartListUnion } from '@google/genai';
import open from 'open';
import process from 'node:process';
import { UseHistoryManagerReturn } from './useHistoryManager.js';
+import { useStateAndRef } from './useStateAndRef.js';
import {
Config,
GitService,
@@ -80,6 +81,13 @@ export const useSlashCommandProcessor = (
return new GitService(config.getProjectRoot());
}, [config]);
+ const pendingHistoryItems: HistoryItemWithoutId[] = [];
+ const [pendingCompressionItemRef, setPendingCompressionItem] =
+ useStateAndRef<HistoryItemWithoutId | null>(null);
+ if (pendingCompressionItemRef.current != null) {
+ pendingHistoryItems.push(pendingCompressionItemRef.current);
+ }
+
const addMessage = useCallback(
(message: Message) => {
// Convert Message to HistoryItemWithoutId
@@ -105,6 +113,11 @@ export const useSlashCommandProcessor = (
stats: message.stats,
duration: message.duration,
};
+ } else if (message.type === MessageType.COMPRESSION) {
+ historyItemContent = {
+ type: 'compression',
+ compression: message.compression,
+ };
} else {
historyItemContent = {
type: message.type as
@@ -641,6 +654,57 @@ Add any other context about the problem here.
}, 100);
},
},
+ {
+ name: 'compress',
+ altName: 'summarize',
+ description: 'Compresses the context by replacing it with a summary.',
+ action: async (_mainCommand, _subCommand, _args) => {
+ if (pendingCompressionItemRef.current !== null) {
+ addMessage({
+ type: MessageType.ERROR,
+ content:
+ 'Already compressing, wait for previous request to complete',
+ timestamp: new Date(),
+ });
+ return;
+ }
+ setPendingCompressionItem({
+ type: MessageType.COMPRESSION,
+ compression: {
+ isPending: true,
+ },
+ });
+ try {
+ const compressed = await config!
+ .getGeminiClient()!
+ .tryCompressChat(true);
+ if (compressed) {
+ addMessage({
+ type: MessageType.COMPRESSION,
+ compression: {
+ isPending: false,
+ originalTokenCount: compressed.originalTokenCount,
+ newTokenCount: compressed.newTokenCount,
+ },
+ timestamp: new Date(),
+ });
+ } else {
+ addMessage({
+ type: MessageType.ERROR,
+ content: 'Failed to compress chat history.',
+ timestamp: new Date(),
+ });
+ }
+ } catch (e) {
+ addMessage({
+ type: MessageType.ERROR,
+ content: `Failed to compress chat history: ${e instanceof Error ? e.message : String(e)}`,
+ timestamp: new Date(),
+ });
+ }
+ setPendingCompressionItem(null);
+ },
+ },
];
if (config?.getCheckpointEnabled()) {
@@ -767,6 +831,8 @@ Add any other context about the problem here.
loadHistory,
addItem,
setQuittingMessages,
+ pendingCompressionItemRef,
+ setPendingCompressionItem,
]);
const handleSlashCommand = useCallback(
@@ -830,5 +896,5 @@ Add any other context about the problem here.
[addItem, slashCommands, addMessage],
);
- return { handleSlashCommand, slashCommands };
+ return { handleSlashCommand, slashCommands, pendingHistoryItems };
};