Skip to content

Commit 5d6204f

Browse files
committed
More progress
1 parent 1b2a7b6 commit 5d6204f

File tree

4 files changed

+57
-26
lines changed

4 files changed

+57
-26
lines changed

packages/types/npm/package.metadata.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@roo-code/types",
3-
"version": "1.51.0",
3+
"version": "1.52.0",
44
"description": "TypeScript type definitions for Roo Code.",
55
"publishConfig": {
66
"access": "public",

packages/types/src/message.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,22 @@ export const clineAskSchema = z.enum(clineAsks)
4444

4545
export type ClineAsk = z.infer<typeof clineAskSchema>
4646

47+
// Needs classification:
48+
// - `followup`
49+
// - `command_output
50+
4751
/**
4852
* IdleAsk
4953
*
5054
* Asks that put the task into an "idle" state.
5155
*/
5256

5357
export const idleAsks = [
58+
"completion_result",
5459
"api_req_failed",
55-
"auto_approval_max_req_reached",
60+
"resume_completed_task",
5661
"mistake_limit_reached",
57-
"command_output", // Not sure about this one.
58-
"completion_result",
62+
"auto_approval_max_req_reached",
5963
] as const satisfies readonly ClineAsk[]
6064

6165
export type IdleAsk = (typeof idleAsks)[number]
@@ -70,7 +74,7 @@ export function isIdleAsk(ask: ClineAsk): ask is IdleAsk {
7074
* Asks that put the task into an "resumable" state.
7175
*/
7276

73-
export const resumableAsks = ["resume_task", "resume_completed_task"] as const satisfies readonly ClineAsk[]
77+
export const resumableAsks = ["resume_task"] as const satisfies readonly ClineAsk[]
7478

7579
export type ResumableAsk = (typeof resumableAsks)[number]
7680

@@ -84,7 +88,12 @@ export function isResumableAsk(ask: ClineAsk): ask is ResumableAsk {
8488
* Asks that put the task into an "user interaction required" state.
8589
*/
8690

87-
export const interactiveAsks = ["command"] as const satisfies readonly ClineAsk[]
91+
export const interactiveAsks = [
92+
"command",
93+
"tool",
94+
"browser_action_launch",
95+
"use_mcp_server",
96+
] as const satisfies readonly ClineAsk[]
8897

8998
export type InteractiveAsk = (typeof interactiveAsks)[number]
9099

packages/types/src/task.ts

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

33
import { RooCodeEventName } from "./events.js"
4-
import { type ClineMessage, type ClineAsk, type TokenUsage } from "./message.js"
4+
import { type ClineMessage, type TokenUsage } from "./message.js"
55
import { type ToolUsage, type ToolName } from "./tool.js"
66
import type { StaticAppProperties, GitProperties, TelemetryProperties } from "./telemetry.js"
77

@@ -81,7 +81,7 @@ export type TaskMetadata = z.infer<typeof taskMetadataSchema>
8181
export interface TaskLike {
8282
readonly taskId: string
8383
readonly taskStatus: TaskStatus
84-
readonly taskAsk: ClineAsk | undefined
84+
readonly taskAsk: ClineMessage | undefined
8585
readonly metadata: TaskMetadata
8686

8787
readonly rootTask?: TaskLike

src/core/task/Task.ts

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
189189
abort: boolean = false
190190

191191
// TaskStatus
192-
idleAsk?: IdleAsk
193-
resumableAsk?: ResumableAsk
194-
interactiveAsk?: InteractiveAsk
192+
idleAsk?: ClineMessage
193+
resumableAsk?: ClineMessage
194+
interactiveAsk?: ClineMessage
195195

196196
didFinishAbortingStream = false
197197
abandoned = false
@@ -625,6 +625,16 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
625625
}
626626
}
627627

628+
private findMessageByTimestamp(ts: number): ClineMessage | undefined {
629+
for (let i = this.clineMessages.length - 1; i >= 0; i--) {
630+
if (this.clineMessages[i].ts === ts) {
631+
return this.clineMessages[i]
632+
}
633+
}
634+
635+
return undefined
636+
}
637+
628638
// Note that `partial` has three valid states true (partial message),
629639
// false (completion of partial message), undefined (individual complete
630640
// message).
@@ -726,36 +736,48 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
726736
// The state is mutable if the message is complete and the task will
727737
// block (via the `pWaitFor`).
728738
const isBlocking = !(this.askResponse !== undefined || this.lastMessageTs !== askTs)
729-
const isStateMutable = !partial && isBlocking
730-
let stateMutationTimeouts: NodeJS.Timeout[] = []
739+
const isStatusMutable = !partial && isBlocking
740+
let statusMutationTimeouts: NodeJS.Timeout[] = []
731741

732-
if (isStateMutable) {
742+
if (isStatusMutable) {
733743
if (isInteractiveAsk(type)) {
734-
stateMutationTimeouts.push(
744+
statusMutationTimeouts.push(
735745
setTimeout(() => {
736-
this.interactiveAsk = type
737-
this.emit(RooCodeEventName.TaskInteractive, this.taskId)
746+
const message = this.findMessageByTimestamp(askTs)
747+
748+
if (message) {
749+
this.interactiveAsk = message
750+
this.emit(RooCodeEventName.TaskInteractive, this.taskId)
751+
}
738752
}, 1_000),
739753
)
740754
} else if (isResumableAsk(type)) {
741-
stateMutationTimeouts.push(
755+
statusMutationTimeouts.push(
742756
setTimeout(() => {
743-
this.resumableAsk = type
744-
this.emit(RooCodeEventName.TaskResumable, this.taskId)
757+
const message = this.findMessageByTimestamp(askTs)
758+
759+
if (message) {
760+
this.resumableAsk = message
761+
this.emit(RooCodeEventName.TaskResumable, this.taskId)
762+
}
745763
}, 1_000),
746764
)
747765
} else if (isIdleAsk(type)) {
748-
stateMutationTimeouts.push(
766+
statusMutationTimeouts.push(
749767
setTimeout(() => {
750-
this.idleAsk = type
751-
this.emit(RooCodeEventName.TaskIdle, this.taskId)
768+
const message = this.findMessageByTimestamp(askTs)
769+
770+
if (message) {
771+
this.idleAsk = message
772+
this.emit(RooCodeEventName.TaskIdle, this.taskId)
773+
}
752774
}, 1_000),
753775
)
754776
}
755777
}
756778

757779
console.log(
758-
`[Task#${this.taskId}] pWaitFor askResponse(${type}) -> blocking (isStateMutable = ${isStateMutable}, stateMutationTimeouts = ${stateMutationTimeouts.length})`,
780+
`[Task#${this.taskId}] pWaitFor askResponse(${type}) -> blocking (isStatusMutable = ${isStatusMutable}, statusMutationTimeouts = ${statusMutationTimeouts.length})`,
759781
)
760782

761783
await pWaitFor(() => this.askResponse !== undefined || this.lastMessageTs !== askTs, { interval: 100 })
@@ -775,7 +797,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
775797
this.askResponseImages = undefined
776798

777799
// Cancel the timeouts if they are still running.
778-
stateMutationTimeouts.forEach((timeout) => clearTimeout(timeout))
800+
statusMutationTimeouts.forEach((timeout) => clearTimeout(timeout))
779801

780802
// Switch back to an active state.
781803
if (this.idleAsk || this.resumableAsk || this.interactiveAsk) {
@@ -2581,7 +2603,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
25812603
return TaskStatus.Running
25822604
}
25832605

2584-
public get taskAsk(): ClineAsk | undefined {
2606+
public get taskAsk(): ClineMessage | undefined {
25852607
return this.idleAsk || this.resumableAsk || this.interactiveAsk
25862608
}
25872609
}

0 commit comments

Comments
 (0)