Skip to content
This repository was archived by the owner on Feb 25, 2026. It is now read-only.

Commit c720f50

Browse files
Merge pull request #427 from Kilo-Org/catrielmuller/351-sub-agent-progress
fix(vscode): display sub-agent task tool list in webview
2 parents b7d8d0d + 1ca23dd commit c720f50

4 files changed

Lines changed: 75 additions & 11 deletions

File tree

packages/kilo-vscode/src/KiloProvider.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@ export class KiloProvider implements vscode.WebviewViewProvider {
268268
case "loadMessages":
269269
await this.handleLoadMessages(message.sessionID)
270270
break
271+
case "syncSession":
272+
await this.handleSyncSession(message.sessionID)
273+
break
271274
case "loadSessions":
272275
await this.handleLoadSessions()
273276
break
@@ -584,6 +587,44 @@ export class KiloProvider implements vscode.WebviewViewProvider {
584587
}
585588
}
586589

590+
/**
591+
* Handle syncing a child session (e.g. spawned by the task tool).
592+
* Tracks the session for SSE events and fetches its messages.
593+
*/
594+
private async handleSyncSession(sessionID: string): Promise<void> {
595+
if (!this.httpClient) return
596+
if (this.trackedSessionIds.has(sessionID)) return
597+
598+
this.trackedSessionIds.add(sessionID)
599+
600+
try {
601+
const workspaceDir = this.getWorkspaceDirectory(sessionID)
602+
const messagesData = await this.httpClient.getMessages(sessionID, workspaceDir)
603+
604+
const messages = messagesData.map((m) => ({
605+
id: m.info.id,
606+
sessionID: m.info.sessionID,
607+
role: m.info.role,
608+
parts: m.parts,
609+
createdAt: new Date(m.info.time.created).toISOString(),
610+
cost: m.info.cost,
611+
tokens: m.info.tokens,
612+
}))
613+
614+
for (const message of messages) {
615+
this.connectionService.recordMessageSessionId(message.id, message.sessionID)
616+
}
617+
618+
this.postMessage({
619+
type: "messagesLoaded",
620+
sessionID,
621+
messages,
622+
})
623+
} catch (err) {
624+
console.error("[Kilo New] KiloProvider: Failed to sync child session:", err)
625+
}
626+
}
627+
587628
/**
588629
* Handle loading all sessions.
589630
*/

packages/kilo-vscode/webview-ui/src/App.tsx

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,14 @@ export const DataBridge: Component<{ children: any }> = (props) => {
5050

5151
const data = createMemo(() => {
5252
const id = session.currentSessionID()
53+
const msgs = session.allMessages()
54+
const parts = session.allParts()
5355
return {
54-
session: session.sessions().map((s) => ({ ...s, id: s.id, role: "user" as const })),
56+
session: session.sessions().map((s) => ({ ...s, id: s.id, role: "user" as const })) as unknown as any[],
5557
session_status: {} as Record<string, any>,
5658
session_diff: {} as Record<string, any[]>,
57-
message: id ? { [id]: session.messages() as unknown as SDKMessage[] } : {},
58-
part: id
59-
? Object.fromEntries(
60-
session
61-
.messages()
62-
.map((msg) => [msg.id, session.getParts(msg.id) as unknown as SDKPart[]])
63-
.filter(([, parts]) => (parts as SDKPart[]).length > 0),
64-
)
65-
: {},
59+
message: msgs as unknown as Record<string, SDKMessage[]>,
60+
part: parts as unknown as Record<string, SDKPart[]>,
6661
permission: id ? { [id]: session.permissions() as unknown as any[] } : {},
6762
}
6863
})
@@ -71,8 +66,12 @@ export const DataBridge: Component<{ children: any }> = (props) => {
7166
session.respondToPermission(input.permissionID, input.response)
7267
}
7368

69+
const sync = (sessionID: string) => {
70+
session.syncSession(sessionID)
71+
}
72+
7473
return (
75-
<DataProvider data={data()} directory="" onPermissionRespond={respond}>
74+
<DataProvider data={data()} directory="" onPermissionRespond={respond} onSyncSession={sync}>
7675
{props.children}
7776
</DataProvider>
7877
)

packages/kilo-vscode/webview-ui/src/context/session.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ interface SessionContextValue {
102102
// Messages for current session
103103
messages: Accessor<Message[]>
104104

105+
// All messages keyed by sessionID (includes child sessions)
106+
allMessages: () => Record<string, Message[]>
107+
108+
// All parts keyed by messageID (includes child sessions)
109+
allParts: () => Record<string, Part[]>
110+
105111
// Parts for a specific message
106112
getParts: (messageID: string) => Part[]
107113

@@ -143,6 +149,7 @@ interface SessionContextValue {
143149
selectSession: (id: string) => void
144150
deleteSession: (id: string) => void
145151
renameSession: (id: string, title: string) => void
152+
syncSession: (sessionID: string) => void
146153
}
147154

148155
const SessionContext = createContext<SessionContextValue>()
@@ -790,6 +797,14 @@ export const SessionProvider: ParentComponent = (props) => {
790797
return store.parts[messageID] || []
791798
}
792799

800+
const allMessages = () => store.messages
801+
802+
const allParts = () => store.parts
803+
804+
function syncSession(sessionID: string) {
805+
vscode.postMessage({ type: "syncSession", sessionID })
806+
}
807+
793808
const todos = () => {
794809
const id = currentSessionID()
795810
return id ? store.todos[id] || [] : []
@@ -865,6 +880,8 @@ export const SessionProvider: ParentComponent = (props) => {
865880
selectAgent,
866881
getSessionAgent: (sessionID: string) => store.agentSelections[sessionID] ?? defaultAgent(),
867882
getSessionModel: (sessionID: string) => store.modelSelections[sessionID] ?? provider.defaultSelection(),
883+
allMessages,
884+
allParts,
868885
sendMessage,
869886
abort,
870887
compact,
@@ -877,6 +894,7 @@ export const SessionProvider: ParentComponent = (props) => {
877894
selectSession,
878895
deleteSession,
879896
renameSession,
897+
syncSession,
880898
}
881899

882900
return <SessionContext.Provider value={value}>{props.children}</SessionContext.Provider>

packages/kilo-vscode/webview-ui/src/types/messages.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,11 @@ export interface ResetAllSettingsRequest {
729729
type: "resetAllSettings"
730730
}
731731

732+
export interface SyncSessionRequest {
733+
type: "syncSession"
734+
sessionID: string
735+
}
736+
732737
// Agent Manager worktree messages
733738
export interface CreateWorktreeSessionRequest {
734739
type: "agentManager.createWorktreeSession"
@@ -773,6 +778,7 @@ export type WebviewMessage =
773778
| UpdateConfigMessage
774779
| RequestNotificationSettingsMessage
775780
| ResetAllSettingsRequest
781+
| SyncSessionRequest
776782
| CreateWorktreeSessionRequest
777783

778784
// ============================================

0 commit comments

Comments
 (0)