[PROTOBUS] Move deleteTasksWithIds to protobus (#3282)

* deleteTasksWithIDs protobus migration

* Moved deleteTasksWithIds to dedicated message type

* Created common StringArrayRequest

* Delete webview-ui/.vite-port
This commit is contained in:
canvrno 2025-05-05 19:03:27 -07:00 committed by GitHub
parent a953f6e768
commit cb7234f967
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 129 additions and 14 deletions

View File

@ -19,6 +19,11 @@ message StringRequest {
string value = 2;
}
message StringArrayRequest {
Metadata metadata = 1;
repeated string value = 2;
}
message String {
string value = 1;
}

View File

@ -11,6 +11,8 @@ service TaskService {
rpc cancelTask(EmptyRequest) returns (Empty);
// Clears the current task
rpc clearTask(EmptyRequest) returns (Empty);
// Deletes multiple tasks with the given IDs
rpc deleteTasksWithIds(StringArrayRequest) returns (Empty);
// Creates a new task with the given text and optional images
rpc newTask(NewTaskRequest) returns (Empty);
}

View File

@ -336,9 +336,6 @@ export class Controller {
case "showTaskWithId":
this.showTaskWithId(message.text!)
break
case "deleteTasksWithIds":
this.deleteTasksWithIds(message.text!)
break
case "exportTaskWithId":
this.exportTaskWithId(message.text!)
break
@ -1757,12 +1754,6 @@ Here is the project's README to help you get started:\n\n${mcpDetails.readmeCont
this.refreshTotalTasksSize()
}
async deleteTasksWithIds(ids: string) {
for (const id of JSON.parse(ids) as string[]) {
await this.deleteTaskWithId(id)
}
}
async deleteTaskFromState(id: string) {
// Remove the task from history
const taskHistory = ((await getGlobalState(this.context, "taskHistory")) as HistoryItem[] | undefined) || []

View File

@ -0,0 +1,23 @@
import { Controller } from ".."
import { Empty, StringArrayRequest } from "../../../shared/proto/common"
import { TaskMethodHandler } from "./index"
/**
* Deletes tasks with the specified IDs
* @param controller The controller instance
* @param request The request containing an array of task IDs to delete
* @returns Empty response
* @throws Error if operation fails
*/
export const deleteTasksWithIds: TaskMethodHandler = async (
controller: Controller,
request: StringArrayRequest,
): Promise<Empty> => {
if (!request.value || request.value.length === 0) {
throw new Error("Missing task IDs")
}
await Promise.all(request.value.map((value) => controller.deleteTaskWithId(value)))
return Empty.create()
}

View File

@ -5,6 +5,7 @@
import { registerMethod } from "./index"
import { cancelTask } from "./cancelTask"
import { clearTask } from "./clearTask"
import { deleteTasksWithIds } from "./deleteTasksWithIds"
import { newTask } from "./newTask"
// Register all task service methods
@ -12,5 +13,6 @@ export function registerAllMethods(): void {
// Register each method with the registry
registerMethod("cancelTask", cancelTask)
registerMethod("clearTask", clearTask)
registerMethod("deleteTasksWithIds", deleteTasksWithIds)
registerMethod("newTask", newTask)
}

View File

@ -18,7 +18,6 @@ export interface WebviewMessage {
| "selectImages"
| "exportCurrentTask"
| "showTaskWithId"
| "deleteTasksWithIds"
| "exportTaskWithId"
| "resetState"
| "requestOllamaModels"

View File

@ -22,6 +22,11 @@ export interface StringRequest {
value: string
}
export interface StringArrayRequest {
metadata?: Metadata | undefined
value: string[]
}
export interface String {
value: string
}
@ -275,6 +280,83 @@ export const StringRequest: MessageFns<StringRequest> = {
},
}
function createBaseStringArrayRequest(): StringArrayRequest {
return { metadata: undefined, value: [] }
}
export const StringArrayRequest: MessageFns<StringArrayRequest> = {
encode(message: StringArrayRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.metadata !== undefined) {
Metadata.encode(message.metadata, writer.uint32(10).fork()).join()
}
for (const v of message.value) {
writer.uint32(18).string(v!)
}
return writer
},
decode(input: BinaryReader | Uint8Array, length?: number): StringArrayRequest {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = createBaseStringArrayRequest()
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break
}
message.metadata = Metadata.decode(reader, reader.uint32())
continue
}
case 2: {
if (tag !== 18) {
break
}
message.value.push(reader.string())
continue
}
}
if ((tag & 7) === 4 || tag === 0) {
break
}
reader.skip(tag & 7)
}
return message
},
fromJSON(object: any): StringArrayRequest {
return {
metadata: isSet(object.metadata) ? Metadata.fromJSON(object.metadata) : undefined,
value: globalThis.Array.isArray(object?.value) ? object.value.map((e: any) => globalThis.String(e)) : [],
}
},
toJSON(message: StringArrayRequest): unknown {
const obj: any = {}
if (message.metadata !== undefined) {
obj.metadata = Metadata.toJSON(message.metadata)
}
if (message.value?.length) {
obj.value = message.value
}
return obj
},
create<I extends Exact<DeepPartial<StringArrayRequest>, I>>(base?: I): StringArrayRequest {
return StringArrayRequest.fromPartial(base ?? ({} as any))
},
fromPartial<I extends Exact<DeepPartial<StringArrayRequest>, I>>(object: I): StringArrayRequest {
const message = createBaseStringArrayRequest()
message.metadata =
object.metadata !== undefined && object.metadata !== null ? Metadata.fromPartial(object.metadata) : undefined
message.value = object.value?.map((e) => e) || []
return message
},
}
function createBaseString(): String {
return { value: "" }
}

View File

@ -6,7 +6,7 @@
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"
import { Empty, EmptyRequest, Metadata } from "./common"
import { Empty, EmptyRequest, Metadata, StringArrayRequest } from "./common"
export const protobufPackage = "cline"
@ -133,6 +133,15 @@ export const TaskServiceDefinition = {
responseStream: false,
options: {},
},
/** Deletes multiple tasks with the given IDs */
deleteTasksWithIds: {
name: "deleteTasksWithIds",
requestType: StringArrayRequest,
requestStream: false,
responseType: Empty,
responseStream: false,
options: {},
},
/** Creates a new task with the given text and optional images */
newTask: {
name: "newTask",

View File

@ -10,6 +10,7 @@ import { vscode } from "@/utils/vscode"
import Thumbnails from "@/components/common/Thumbnails"
import { normalizeApiConfiguration } from "@/components/settings/ApiOptions"
import { validateSlashCommand } from "@/utils/slash-commands"
import { TaskServiceClient } from "@/services/grpc-client"
interface TaskHeaderProps {
task: ClineMessage
@ -669,7 +670,7 @@ const DeleteButton: React.FC<{
}> = ({ taskSize, taskId }) => (
<VSCodeButton
appearance="icon"
onClick={() => vscode.postMessage({ type: "deleteTasksWithIds", text: JSON.stringify([taskId]) })}
onClick={() => taskId && TaskServiceClient.deleteTasksWithIds({ value: [taskId] })}
style={{ padding: "0px 0px" }}>
<div
style={{

View File

@ -4,6 +4,7 @@ import { vscode } from "@/utils/vscode"
import { Virtuoso } from "react-virtuoso"
import { memo, useMemo, useState, useEffect, useCallback } from "react"
import Fuse, { FuseResult } from "fuse.js"
import { TaskServiceClient } from "@/services/grpc-client"
import { formatLargeNumber } from "@/utils/format"
import { formatSize } from "@/utils/format"
import { ExtensionMessage } from "@shared/ExtensionMessage"
@ -61,12 +62,12 @@ const HistoryView = ({ onDone }: HistoryViewProps) => {
}, [])
const handleDeleteHistoryItem = useCallback((id: string) => {
vscode.postMessage({ type: "deleteTasksWithIds", text: JSON.stringify([id]) })
TaskServiceClient.deleteTasksWithIds({ value: [id] })
}, [])
const handleDeleteSelectedHistoryItems = useCallback((ids: string[]) => {
if (ids.length > 0) {
vscode.postMessage({ type: "deleteTasksWithIds", text: JSON.stringify(ids) })
TaskServiceClient.deleteTasksWithIds({ value: ids })
setSelectedItems([])
}
}, [])