Просмотр исходного кода

Remove unnecessary trailing resume messages

Saoud Rizwan 1 год назад
Родитель
Сommit
ec33ef5e3a
3 измененных файлов с 31 добавлено и 1 удалено
  1. 13 1
      src/ClaudeDev.ts
  2. 17 0
      src/utils/array-helpers.ts
  3. 1 0
      src/utils/index.ts

+ 13 - 1
src/ClaudeDev.ts

@@ -24,6 +24,7 @@ import { getApiMetrics } from "./shared/getApiMetrics"
 import { HistoryItem } from "./shared/HistoryItem"
 import { combineApiRequests } from "./shared/combineApiRequests"
 import { combineCommandSequences } from "./shared/combineCommandSequences"
+import { findLastIndex } from "./utils"
 
 const SYSTEM_PROMPT =
 	() => `You are Claude Dev, a highly skilled software developer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.
@@ -452,7 +453,8 @@ export class ClaudeDev {
 
 	private async resumeTaskFromHistory() {
 		const modifiedClaudeMessages = await this.getSavedClaudeMessages()
-		// need to modify claude messages for good ux, i.e. if the last message is an api_request_started, then remove it otherwise the user will think the request is still loading
+
+		// Need to modify claude messages for good ux, i.e. if the last message is an api_request_started, then remove it otherwise the user will think the request is still loading
 		const lastApiReqStartedIndex = modifiedClaudeMessages.reduce(
 			(lastIndex, m, index) => (m.type === "say" && m.say === "api_req_started" ? index : lastIndex),
 			-1
@@ -464,6 +466,16 @@ export class ClaudeDev {
 		if (lastApiReqStartedIndex > lastApiReqFinishedIndex && lastApiReqStartedIndex !== -1) {
 			modifiedClaudeMessages.splice(lastApiReqStartedIndex, 1)
 		}
+
+		// Remove any resume messages that may have been added before
+		const lastRelevantMessageIndex = findLastIndex(
+			modifiedClaudeMessages,
+			(m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task")
+		)
+		if (lastRelevantMessageIndex !== -1) {
+			modifiedClaudeMessages.splice(lastRelevantMessageIndex + 1)
+		}
+
 		await this.overwriteClaudeMessages(modifiedClaudeMessages)
 		this.claudeMessages = await this.getSavedClaudeMessages()
 

+ 17 - 0
src/utils/array-helpers.ts

@@ -0,0 +1,17 @@
+/**
+ * Returns the index of the last element in the array where predicate is true, and -1
+ * otherwise.
+ * @param array The source array to search in
+ * @param predicate find calls predicate once for each element of the array, in descending
+ * order, until it finds one where predicate returns true. If such an element is found,
+ * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+ */
+export function findLastIndex<T>(array: Array<T>, predicate: (value: T, index: number, obj: T[]) => boolean): number {
+	let l = array.length
+	while (l--) {
+		if (predicate(array[l], l, array)) {
+			return l
+		}
+	}
+	return -1
+}

+ 1 - 0
src/utils/index.ts

@@ -2,3 +2,4 @@ export * from "./getNonce"
 export * from "./getUri"
 export * from "./process-images"
 export * from "./export-markdown"
+export * from "./array-helpers"