feat(background-agent): make launch() non-blocking
This commit is contained in:
parent
b053df42fb
commit
481770e599
@ -96,9 +96,53 @@ export class BackgroundManager {
|
|||||||
throw new Error("Agent parameter is required")
|
throw new Error("Agent parameter is required")
|
||||||
}
|
}
|
||||||
|
|
||||||
const concurrencyKey = input.agent
|
// Create task immediately with status="pending"
|
||||||
|
const task: BackgroundTask = {
|
||||||
|
id: `bg_${crypto.randomUUID().slice(0, 8)}`,
|
||||||
|
status: "pending",
|
||||||
|
queuedAt: new Date(),
|
||||||
|
// Do NOT set startedAt - will be set when running
|
||||||
|
// Do NOT set sessionID - will be set when running
|
||||||
|
description: input.description,
|
||||||
|
prompt: input.prompt,
|
||||||
|
agent: input.agent,
|
||||||
|
parentSessionID: input.parentSessionID,
|
||||||
|
parentMessageID: input.parentMessageID,
|
||||||
|
parentModel: input.parentModel,
|
||||||
|
parentAgent: input.parentAgent,
|
||||||
|
model: input.model,
|
||||||
|
}
|
||||||
|
|
||||||
await this.concurrencyManager.acquire(concurrencyKey)
|
this.tasks.set(task.id, task)
|
||||||
|
|
||||||
|
// Add to queue
|
||||||
|
const key = this.getConcurrencyKeyFromInput(input)
|
||||||
|
const queue = this.queuesByKey.get(key) ?? []
|
||||||
|
queue.push({ task, input })
|
||||||
|
this.queuesByKey.set(key, queue)
|
||||||
|
|
||||||
|
log("[background-agent] Task queued:", { taskId: task.id, key, queueLength: queue.length })
|
||||||
|
|
||||||
|
// Trigger processing (fire-and-forget)
|
||||||
|
this.processKey(key)
|
||||||
|
|
||||||
|
return task
|
||||||
|
}
|
||||||
|
|
||||||
|
private async processKey(key: string): Promise<void> {
|
||||||
|
// TODO: Implement in Task 4
|
||||||
|
}
|
||||||
|
|
||||||
|
private async startTask(item: QueueItem): Promise<void> {
|
||||||
|
const { task, input } = item
|
||||||
|
|
||||||
|
log("[background-agent] Starting task:", {
|
||||||
|
taskId: task.id,
|
||||||
|
agent: input.agent,
|
||||||
|
model: input.model,
|
||||||
|
})
|
||||||
|
|
||||||
|
const concurrencyKey = this.getConcurrencyKeyFromInput(input)
|
||||||
|
|
||||||
const parentSession = await this.client.session.get({
|
const parentSession = await this.client.session.get({
|
||||||
path: { id: input.parentSessionID },
|
path: { id: input.parentSessionID },
|
||||||
@ -130,29 +174,17 @@ export class BackgroundManager {
|
|||||||
const sessionID = createResult.data.id
|
const sessionID = createResult.data.id
|
||||||
subagentSessions.add(sessionID)
|
subagentSessions.add(sessionID)
|
||||||
|
|
||||||
const task: BackgroundTask = {
|
// Update task to running state
|
||||||
id: `bg_${crypto.randomUUID().slice(0, 8)}`,
|
task.status = "running"
|
||||||
sessionID,
|
task.startedAt = new Date()
|
||||||
parentSessionID: input.parentSessionID,
|
task.sessionID = sessionID
|
||||||
parentMessageID: input.parentMessageID,
|
task.progress = {
|
||||||
description: input.description,
|
toolCalls: 0,
|
||||||
prompt: input.prompt,
|
lastUpdate: new Date(),
|
||||||
agent: input.agent,
|
|
||||||
status: "running",
|
|
||||||
startedAt: new Date(),
|
|
||||||
progress: {
|
|
||||||
toolCalls: 0,
|
|
||||||
lastUpdate: new Date(),
|
|
||||||
},
|
|
||||||
parentModel: input.parentModel,
|
|
||||||
parentAgent: input.parentAgent,
|
|
||||||
model: input.model,
|
|
||||||
concurrencyKey,
|
|
||||||
concurrencyGroup: concurrencyKey,
|
|
||||||
}
|
}
|
||||||
|
task.concurrencyKey = concurrencyKey
|
||||||
|
task.concurrencyGroup = concurrencyKey
|
||||||
|
|
||||||
|
|
||||||
this.tasks.set(task.id, task)
|
|
||||||
this.startPolling()
|
this.startPolling()
|
||||||
|
|
||||||
// Track for batched notifications
|
// Track for batched notifications
|
||||||
@ -220,8 +252,6 @@ export class BackgroundManager {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return task
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTask(id: string): BackgroundTask | undefined {
|
getTask(id: string): BackgroundTask | undefined {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user