diff --git a/lib/tools/task-pickup.ts b/lib/tools/task-pickup.ts index 02468e7..7143e17 100644 --- a/lib/tools/task-pickup.ts +++ b/lib/tools/task-pickup.ts @@ -17,7 +17,7 @@ import { dispatchTask } from "../dispatch.js"; import { type Issue, type StateLabel } from "../task-managers/task-manager.js"; import { createProvider } from "../task-managers/index.js"; import { selectModel } from "../model-selector.js"; -import { getProject, getWorker, readProjects } from "../projects.js"; +import { activateWorker, getProject, getWorker, readProjects } from "../projects.js"; import type { ToolContext } from "../types.js"; import { detectContext, generateGuardrails } from "../context-guard.js"; import { isDevTier, isTier, type Tier } from "../tiers.js"; @@ -313,6 +313,27 @@ export function createTaskPickupTool(api: OpenClawPluginApi) { pluginConfig, }); + // 8b. Explicitly update worker state in projects.json + // Defense in depth: ensure state is set even if dispatchTask had issues + const now = new Date().toISOString(); + const stateUpdateParams: { + issueId: string; + model: string; + sessionKey?: string; + startTime?: string; + } = { + issueId: String(issue.iid), + model: modelAlias, + }; + + // Only set sessionKey and startTime on new spawn (not on reuse) + if (dispatchResult.sessionAction === "spawn") { + stateUpdateParams.sessionKey = dispatchResult.sessionKey; + stateUpdateParams.startTime = now; + } + + await activateWorker(workspaceDir, groupId, role, stateUpdateParams); + // 9. Send notification to project group const notifyConfig = getNotificationConfig(pluginConfig); await notify(