Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/cloud/src/bridge/ExtensionChannel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,9 @@ export class ExtensionChannel extends BaseChannel<
{ from: RooCodeEventName.TaskInteractive, to: ExtensionBridgeEventName.TaskInteractive },
{ from: RooCodeEventName.TaskResumable, to: ExtensionBridgeEventName.TaskResumable },
{ from: RooCodeEventName.TaskIdle, to: ExtensionBridgeEventName.TaskIdle },
{ from: RooCodeEventName.TaskPaused, to: ExtensionBridgeEventName.TaskPaused },
{ from: RooCodeEventName.TaskUnpaused, to: ExtensionBridgeEventName.TaskUnpaused },
{ from: RooCodeEventName.TaskSpawned, to: ExtensionBridgeEventName.TaskSpawned },
{ from: RooCodeEventName.TaskUserMessage, to: ExtensionBridgeEventName.TaskUserMessage },
] as const

Expand Down Expand Up @@ -223,6 +226,8 @@ export class ExtensionChannel extends BaseChannel<
taskStatus: task.taskStatus,
taskAsk: task?.taskAsk,
queuedMessages: task.queuedMessages,
parentTaskId: task.parentTaskId,
childTaskId: task.childTaskId,
...task.metadata,
}
: { taskId: "", taskStatus: TaskStatus.None },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ describe("ExtensionChannel", () => {
RooCodeEventName.TaskInteractive,
RooCodeEventName.TaskResumable,
RooCodeEventName.TaskIdle,
RooCodeEventName.TaskPaused,
RooCodeEventName.TaskUnpaused,
RooCodeEventName.TaskSpawned,
RooCodeEventName.TaskUserMessage,
]

Expand Down Expand Up @@ -231,8 +234,7 @@ describe("ExtensionChannel", () => {
}

// Listeners should still be the same count (not accumulated)
const expectedEventCount = 11 // Number of events we listen to (including TaskUserMessage)
expect(eventListeners.size).toBe(expectedEventCount)
expect(eventListeners.size).toBe(14)

// Each event should have exactly 1 listener
eventListeners.forEach((listeners) => {
Expand Down
22 changes: 22 additions & 0 deletions packages/types/src/cloud.ts
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,8 @@ const extensionTaskSchema = z.object({
taskStatus: z.nativeEnum(TaskStatus),
taskAsk: clineMessageSchema.optional(),
queuedMessages: z.array(queuedMessageSchema).optional(),
parentTaskId: z.string().optional(),
childTaskId: z.string().optional(),
...taskMetadataSchema.shape,
})

Expand Down Expand Up @@ -404,6 +406,10 @@ export enum ExtensionBridgeEventName {
TaskResumable = RooCodeEventName.TaskResumable,
TaskIdle = RooCodeEventName.TaskIdle,

TaskPaused = RooCodeEventName.TaskPaused,
TaskUnpaused = RooCodeEventName.TaskUnpaused,
TaskSpawned = RooCodeEventName.TaskSpawned,

TaskUserMessage = RooCodeEventName.TaskUserMessage,

ModeChanged = RooCodeEventName.ModeChanged,
Expand Down Expand Up @@ -466,6 +472,22 @@ export const extensionBridgeEventSchema = z.discriminatedUnion("type", [
timestamp: z.number(),
}),

z.object({
type: z.literal(ExtensionBridgeEventName.TaskPaused),
instance: extensionInstanceSchema,
timestamp: z.number(),
}),
z.object({
type: z.literal(ExtensionBridgeEventName.TaskUnpaused),
instance: extensionInstanceSchema,
timestamp: z.number(),
}),
z.object({
type: z.literal(ExtensionBridgeEventName.TaskSpawned),
instance: extensionInstanceSchema,
timestamp: z.number(),
}),

z.object({
type: z.literal(ExtensionBridgeEventName.TaskUserMessage),
instance: extensionInstanceSchema,
Expand Down
2 changes: 2 additions & 0 deletions packages/types/src/history.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import { z } from "zod"

export const historyItemSchema = z.object({
id: z.string(),
rootTaskId: z.string().optional(),
parentTaskId: z.string().optional(),
number: z.number(),
ts: z.number(),
task: z.string(),
Expand Down
12 changes: 8 additions & 4 deletions packages/types/src/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ export type TaskProviderEvents = {
[RooCodeEventName.TaskInteractive]: [taskId: string]
[RooCodeEventName.TaskResumable]: [taskId: string]
[RooCodeEventName.TaskIdle]: [taskId: string]

[RooCodeEventName.TaskPaused]: [taskId: string]
[RooCodeEventName.TaskUnpaused]: [taskId: string]
[RooCodeEventName.TaskSpawned]: [taskId: string]

[RooCodeEventName.TaskUserMessage]: [taskId: string]
Expand Down Expand Up @@ -106,9 +109,10 @@ export type TaskMetadata = z.infer<typeof taskMetadataSchema>

export interface TaskLike {
readonly taskId: string
readonly rootTask?: TaskLike
readonly rootTaskId?: string
readonly parentTaskId?: string
readonly childTaskId?: string
readonly metadata: TaskMetadata

readonly taskStatus: TaskStatus
readonly taskAsk: ClineMessage | undefined
readonly queuedMessages: QueuedMessage[]
Expand All @@ -135,8 +139,8 @@ export type TaskEvents = {
[RooCodeEventName.TaskIdle]: [taskId: string]

// Subtask Lifecycle
[RooCodeEventName.TaskPaused]: []
[RooCodeEventName.TaskUnpaused]: []
[RooCodeEventName.TaskPaused]: [taskId: string]
[RooCodeEventName.TaskUnpaused]: [taskId: string]
[RooCodeEventName.TaskSpawned]: [taskId: string]

// Task Execution
Expand Down
18 changes: 12 additions & 6 deletions src/core/task-persistence/taskMetadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,27 @@ import { t } from "../../i18n"
const taskSizeCache = new NodeCache({ stdTTL: 30, checkperiod: 5 * 60 })

export type TaskMetadataOptions = {
messages: ClineMessage[]
taskId: string
rootTaskId?: string
parentTaskId?: string
taskNumber: number
messages: ClineMessage[]
globalStoragePath: string
workspace: string
mode?: string
}

export async function taskMetadata({
messages,
taskId,
taskId: id,
rootTaskId,
parentTaskId,
taskNumber,
messages,
globalStoragePath,
workspace,
mode,
}: TaskMetadataOptions) {
const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId)
const taskDir = await getTaskDirectoryPath(globalStoragePath, id)

// Determine message availability upfront
const hasMessages = messages && messages.length > 0
Expand Down Expand Up @@ -79,9 +83,11 @@ export async function taskMetadata({
}
}

// Create historyItem once with pre-calculated values
// Create historyItem once with pre-calculated values.
const historyItem: HistoryItem = {
id: taskId,
id,
rootTaskId,
parentTaskId,
number: taskNumber,
ts: timestamp,
task: hasMessages
Expand Down
Loading
Loading