Skip to content

Commit 9895b22

Browse files
committed
Emit a task user message event
1 parent b890859 commit 9895b22

File tree

7 files changed

+47
-20
lines changed

7 files changed

+47
-20
lines changed

packages/cloud/src/bridge/ExtensionChannel.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ export class ExtensionChannel extends BaseChannel<
175175
{ from: RooCodeEventName.TaskInteractive, to: ExtensionBridgeEventName.TaskInteractive },
176176
{ from: RooCodeEventName.TaskResumable, to: ExtensionBridgeEventName.TaskResumable },
177177
{ from: RooCodeEventName.TaskIdle, to: ExtensionBridgeEventName.TaskIdle },
178+
{ from: RooCodeEventName.TaskUserMessage, to: ExtensionBridgeEventName.TaskUserMessage },
178179
] as const
179180

180181
eventMapping.forEach(({ from, to }) => {
@@ -220,6 +221,8 @@ export class ExtensionChannel extends BaseChannel<
220221
? {
221222
taskId: task.taskId,
222223
taskStatus: task.taskStatus,
224+
taskAsk: task?.taskAsk,
225+
queuedMessages: task.queuedMessages,
223226
...task.metadata,
224227
}
225228
: { taskId: "", taskStatus: TaskStatus.None },

packages/types/src/cloud.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { TaskStatus, taskMetadataSchema } from "./task.js"
77
import { globalSettingsSchema } from "./global-settings.js"
88
import { providerSettingsWithIdSchema } from "./provider-settings.js"
99
import { mcpMarketplaceItemSchema } from "./marketplace.js"
10-
import { clineMessageSchema } from "./message.js"
10+
import { clineMessageSchema, queuedMessageSchema } from "./message.js"
1111
import { staticAppPropertiesSchema, gitPropertiesSchema } from "./telemetry.js"
1212

1313
/**
@@ -359,6 +359,8 @@ export const INSTANCE_TTL_SECONDS = 60
359359
const extensionTaskSchema = z.object({
360360
taskId: z.string(),
361361
taskStatus: z.nativeEnum(TaskStatus),
362+
taskAsk: clineMessageSchema.optional(),
363+
queuedMessages: z.array(queuedMessageSchema).optional(),
362364
...taskMetadataSchema.shape,
363365
})
364366

@@ -402,6 +404,8 @@ export enum ExtensionBridgeEventName {
402404
TaskResumable = RooCodeEventName.TaskResumable,
403405
TaskIdle = RooCodeEventName.TaskIdle,
404406

407+
TaskUserMessage = RooCodeEventName.TaskUserMessage,
408+
405409
ModeChanged = RooCodeEventName.ModeChanged,
406410
ProviderProfileChanged = RooCodeEventName.ProviderProfileChanged,
407411

@@ -461,31 +465,39 @@ export const extensionBridgeEventSchema = z.discriminatedUnion("type", [
461465
instance: extensionInstanceSchema,
462466
timestamp: z.number(),
463467
}),
468+
464469
z.object({
465-
type: z.literal(ExtensionBridgeEventName.InstanceRegistered),
470+
type: z.literal(ExtensionBridgeEventName.TaskUserMessage),
466471
instance: extensionInstanceSchema,
467472
timestamp: z.number(),
468473
}),
474+
469475
z.object({
470-
type: z.literal(ExtensionBridgeEventName.InstanceUnregistered),
476+
type: z.literal(ExtensionBridgeEventName.ModeChanged),
471477
instance: extensionInstanceSchema,
478+
mode: z.string(),
472479
timestamp: z.number(),
473480
}),
474481
z.object({
475-
type: z.literal(ExtensionBridgeEventName.HeartbeatUpdated),
482+
type: z.literal(ExtensionBridgeEventName.ProviderProfileChanged),
476483
instance: extensionInstanceSchema,
484+
providerProfile: z.object({ name: z.string(), provider: z.string().optional() }),
477485
timestamp: z.number(),
478486
}),
487+
479488
z.object({
480-
type: z.literal(ExtensionBridgeEventName.ModeChanged),
489+
type: z.literal(ExtensionBridgeEventName.InstanceRegistered),
481490
instance: extensionInstanceSchema,
482-
mode: z.string(),
483491
timestamp: z.number(),
484492
}),
485493
z.object({
486-
type: z.literal(ExtensionBridgeEventName.ProviderProfileChanged),
494+
type: z.literal(ExtensionBridgeEventName.InstanceUnregistered),
495+
instance: extensionInstanceSchema,
496+
timestamp: z.number(),
497+
}),
498+
z.object({
499+
type: z.literal(ExtensionBridgeEventName.HeartbeatUpdated),
487500
instance: extensionInstanceSchema,
488-
providerProfile: z.object({ name: z.string(), provider: z.string().optional() }),
489501
timestamp: z.number(),
490502
}),
491503
])

packages/types/src/events.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export enum RooCodeEventName {
3131
Message = "message",
3232
TaskModeSwitched = "taskModeSwitched",
3333
TaskAskResponded = "taskAskResponded",
34+
TaskUserMessage = "taskUserMessage",
3435

3536
// Task Analytics
3637
TaskTokenUsageUpdated = "taskTokenUsageUpdated",
@@ -82,6 +83,7 @@ export const rooCodeEventsSchema = z.object({
8283
]),
8384
[RooCodeEventName.TaskModeSwitched]: z.tuple([z.string(), z.string()]),
8485
[RooCodeEventName.TaskAskResponded]: z.tuple([z.string()]),
86+
[RooCodeEventName.TaskUserMessage]: z.tuple([z.string()]),
8587

8688
[RooCodeEventName.TaskToolFailed]: z.tuple([z.string(), toolNamesSchema, z.string()]),
8789
[RooCodeEventName.TaskTokenUsageUpdated]: z.tuple([z.string(), tokenUsageSchema]),

packages/types/src/message.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,11 @@ export type TokenUsage = z.infer<typeof tokenUsageSchema>
248248
* QueuedMessage
249249
*/
250250

251-
export interface QueuedMessage {
252-
timestamp: number
253-
id: string
254-
text: string
255-
images?: string[]
256-
}
251+
export const queuedMessageSchema = z.object({
252+
timestamp: z.number(),
253+
id: z.string(),
254+
text: z.string(),
255+
images: z.array(z.string()).optional(),
256+
})
257+
258+
export type QueuedMessage = z.infer<typeof queuedMessageSchema>

packages/types/src/task.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { z } from "zod"
22

33
import { RooCodeEventName } from "./events.js"
44
import type { RooCodeSettings } from "./global-settings.js"
5-
import type { ClineMessage, TokenUsage } from "./message.js"
5+
import type { ClineMessage, QueuedMessage, TokenUsage } from "./message.js"
66
import type { ToolUsage, ToolName } from "./tool.js"
77
import type { StaticAppProperties, GitProperties, TelemetryProperties } from "./telemetry.js"
88
import type { TodoItem } from "./todo.js"
@@ -59,8 +59,6 @@ export interface TaskProviderLike {
5959

6060
export type TaskProviderEvents = {
6161
[RooCodeEventName.TaskCreated]: [task: TaskLike]
62-
63-
// Proxied from the Task EventEmitter.
6462
[RooCodeEventName.TaskStarted]: [taskId: string]
6563
[RooCodeEventName.TaskCompleted]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]
6664
[RooCodeEventName.TaskAborted]: [taskId: string]
@@ -71,6 +69,9 @@ export type TaskProviderEvents = {
7169
[RooCodeEventName.TaskResumable]: [taskId: string]
7270
[RooCodeEventName.TaskIdle]: [taskId: string]
7371
[RooCodeEventName.TaskSpawned]: [taskId: string]
72+
73+
[RooCodeEventName.TaskUserMessage]: [taskId: string]
74+
7475
[RooCodeEventName.ModeChanged]: [mode: string]
7576
[RooCodeEventName.ProviderProfileChanged]: [config: { name: string; provider?: string }]
7677
}
@@ -105,11 +106,12 @@ export type TaskMetadata = z.infer<typeof taskMetadataSchema>
105106

106107
export interface TaskLike {
107108
readonly taskId: string
108-
readonly taskStatus: TaskStatus
109-
readonly taskAsk: ClineMessage | undefined
109+
readonly rootTask?: TaskLike
110110
readonly metadata: TaskMetadata
111111

112-
readonly rootTask?: TaskLike
112+
readonly taskStatus: TaskStatus
113+
readonly taskAsk: ClineMessage | undefined
114+
readonly queuedMessages: QueuedMessage[]
113115

114116
on<K extends keyof TaskEvents>(event: K, listener: (...args: TaskEvents[K]) => void | Promise<void>): this
115117
off<K extends keyof TaskEvents>(event: K, listener: (...args: TaskEvents[K]) => void | Promise<void>): this
@@ -141,6 +143,7 @@ export type TaskEvents = {
141143
[RooCodeEventName.Message]: [{ action: "created" | "updated"; message: ClineMessage }]
142144
[RooCodeEventName.TaskModeSwitched]: [taskId: string, mode: string]
143145
[RooCodeEventName.TaskAskResponded]: []
146+
[RooCodeEventName.TaskUserMessage]: [taskId: string]
144147

145148
// Task Analytics
146149
[RooCodeEventName.TaskToolFailed]: [taskId: string, tool: ToolName, error: string]

src/core/task/Task.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,8 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
901901
await provider.setProviderProfile(providerProfile)
902902
}
903903

904+
this.emit(RooCodeEventName.TaskUserMessage, this.taskId)
905+
904906
provider.postMessageToWebview({ type: "invoke", invoke: "sendMessage", text, images })
905907
} else {
906908
console.error("[Task#submitUserMessage] Provider reference lost")

src/core/webview/ClineProvider.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ export class ClineProvider
184184
const onTaskInteractive = (taskId: string) => this.emit(RooCodeEventName.TaskInteractive, taskId)
185185
const onTaskResumable = (taskId: string) => this.emit(RooCodeEventName.TaskResumable, taskId)
186186
const onTaskIdle = (taskId: string) => this.emit(RooCodeEventName.TaskIdle, taskId)
187+
const onTaskUserMessage = (taskId: string) => this.emit(RooCodeEventName.TaskUserMessage, taskId)
187188

188189
// Attach the listeners.
189190
instance.on(RooCodeEventName.TaskStarted, onTaskStarted)
@@ -195,6 +196,7 @@ export class ClineProvider
195196
instance.on(RooCodeEventName.TaskInteractive, onTaskInteractive)
196197
instance.on(RooCodeEventName.TaskResumable, onTaskResumable)
197198
instance.on(RooCodeEventName.TaskIdle, onTaskIdle)
199+
instance.on(RooCodeEventName.TaskUserMessage, onTaskUserMessage)
198200

199201
// Store the cleanup functions for later removal.
200202
this.taskEventListeners.set(instance, [
@@ -207,6 +209,7 @@ export class ClineProvider
207209
() => instance.off(RooCodeEventName.TaskInteractive, onTaskInteractive),
208210
() => instance.off(RooCodeEventName.TaskResumable, onTaskResumable),
209211
() => instance.off(RooCodeEventName.TaskIdle, onTaskIdle),
212+
() => instance.off(RooCodeEventName.TaskUserMessage, onTaskUserMessage),
210213
])
211214
}
212215

0 commit comments

Comments
 (0)