( taskId: string, setAppState: SetAppStateFn, )
| 225 | * @returns true if killed successfully |
| 226 | */ |
| 227 | export function killInProcessTeammate( |
| 228 | taskId: string, |
| 229 | setAppState: SetAppStateFn, |
| 230 | ): boolean { |
| 231 | let killed = false |
| 232 | let teamName: string | null = null |
| 233 | let agentId: string | null = null |
| 234 | let toolUseId: string | undefined |
| 235 | let description: string | undefined |
| 236 | |
| 237 | setAppState((prev: AppState) => { |
| 238 | const task = prev.tasks[taskId] |
| 239 | if (!task || task.type !== 'in_process_teammate') { |
| 240 | return prev |
| 241 | } |
| 242 | |
| 243 | const teammateTask = task as InProcessTeammateTaskState |
| 244 | |
| 245 | if (teammateTask.status !== 'running') { |
| 246 | return prev |
| 247 | } |
| 248 | |
| 249 | // Capture identity for cleanup after state update |
| 250 | teamName = teammateTask.identity.teamName |
| 251 | agentId = teammateTask.identity.agentId |
| 252 | toolUseId = teammateTask.toolUseId |
| 253 | description = teammateTask.description |
| 254 | |
| 255 | // Abort the controller to stop execution |
| 256 | teammateTask.abortController?.abort() |
| 257 | |
| 258 | // Call cleanup handler |
| 259 | teammateTask.unregisterCleanup?.() |
| 260 | |
| 261 | // Update task state and remove from teamContext.teammates |
| 262 | killed = true |
| 263 | |
| 264 | // Call pending idle callbacks to unblock any waiters (e.g., engine.waitForIdle) |
| 265 | teammateTask.onIdleCallbacks?.forEach(cb => cb()) |
| 266 | |
| 267 | // Remove from teamContext.teammates using the agentId |
| 268 | let updatedTeamContext = prev.teamContext |
| 269 | if (prev.teamContext && prev.teamContext.teammates && agentId) { |
| 270 | const { [agentId]: _, ...remainingTeammates } = prev.teamContext.teammates |
| 271 | updatedTeamContext = { |
| 272 | ...prev.teamContext, |
| 273 | teammates: remainingTeammates, |
| 274 | } |
| 275 | } |
| 276 | |
| 277 | return { |
| 278 | ...prev, |
| 279 | teamContext: updatedTeamContext, |
| 280 | tasks: { |
| 281 | ...prev.tasks, |
| 282 | [taskId]: { |
| 283 | ...teammateTask, |
| 284 | status: 'killed' as const, |
no test coverage detected