From d4820b4d57fe8efa298a952b302f682e7e9d622b Mon Sep 17 00:00:00 2001 From: FBLGit Date: Wed, 24 Sep 2025 21:51:11 +0800 Subject: [PATCH 1/7] { "tool": "Edit", "files": [ "apps/server/src/handlers/task/task.claim.handler.ts" ], "tasks": [], "todos": [], "sessionId": "4fc5b425-9315-4274-bdee-018905ad2fe9", "instanceId": "worker-1", "timestamp": 1758721871669 } --- apps/server/src/handlers/task/task.claim.handler.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/server/src/handlers/task/task.claim.handler.ts b/apps/server/src/handlers/task/task.claim.handler.ts index c51c4ec..aaf2b60 100644 --- a/apps/server/src/handlers/task/task.claim.handler.ts +++ b/apps/server/src/handlers/task/task.claim.handler.ts @@ -46,7 +46,7 @@ export class TaskClaimHandler { status: "pending", orderBy: "priority", order: "desc", - limit: 10 // Check up to 10 pending tasks + limit: 20 // Get more tasks to account for filtering }, ctx.metadata?.clientId); if (!pendingTasks || !pendingTasks.tasks || pendingTasks.tasks.length === 0) { @@ -55,6 +55,16 @@ export class TaskClaimHandler { claimed: false, }; } + + // Filter out already assigned tasks since task.list doesn't handle assignedTo: null properly + const unassignedTasks = pendingTasks.tasks.filter(task => !task.assignedTo); + + if (unassignedTasks.length === 0) { + // No unassigned pending tasks available + return { + claimed: false, + }; + } // Try to claim the highest priority pending task let claimedTask = null; From d583bce02e2f8fdfd52ff94135b1358fd2550634 Mon Sep 17 00:00:00 2001 From: FBLGit Date: Wed, 24 Sep 2025 21:53:02 +0800 Subject: [PATCH 2/7] { "tool": "Edit", "files": [ "apps/server/src/handlers/task/task.claim.handler.ts" ], "tasks": [], "todos": [], "sessionId": "4fc5b425-9315-4274-bdee-018905ad2fe9", "instanceId": "worker-1", "timestamp": 1758721982713 } --- apps/server/src/handlers/task/task.claim.handler.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/server/src/handlers/task/task.claim.handler.ts b/apps/server/src/handlers/task/task.claim.handler.ts index aaf2b60..d0407ae 100644 --- a/apps/server/src/handlers/task/task.claim.handler.ts +++ b/apps/server/src/handlers/task/task.claim.handler.ts @@ -56,11 +56,13 @@ export class TaskClaimHandler { }; } - // Filter out already assigned tasks since task.list doesn't handle assignedTo: null properly - const unassignedTasks = pendingTasks.tasks.filter(task => !task.assignedTo); + // Filter out tasks assigned to other workers (but allow tasks assigned to this worker or unassigned) + const availableTasks = pendingTasks.tasks.filter(task => + !task.assignedTo || task.assignedTo === input.workerId + ); - if (unassignedTasks.length === 0) { - // No unassigned pending tasks available + if (availableTasks.length === 0) { + // No available pending tasks for this worker return { claimed: false, }; From b5dcd6b39b848d3c3fabea9c5f31bd436a021f8e Mon Sep 17 00:00:00 2001 From: FBLGit Date: Wed, 24 Sep 2025 21:53:14 +0800 Subject: [PATCH 3/7] { "tool": "Edit", "files": [ "apps/server/src/handlers/task/task.claim.handler.ts" ], "tasks": [], "todos": [], "sessionId": "4fc5b425-9315-4274-bdee-018905ad2fe9", "instanceId": "worker-1", "timestamp": 1758721993946 } --- apps/server/src/handlers/task/task.claim.handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/server/src/handlers/task/task.claim.handler.ts b/apps/server/src/handlers/task/task.claim.handler.ts index d0407ae..ca3ad09 100644 --- a/apps/server/src/handlers/task/task.claim.handler.ts +++ b/apps/server/src/handlers/task/task.claim.handler.ts @@ -68,9 +68,9 @@ export class TaskClaimHandler { }; } - // Try to claim the highest priority pending task + // Try to claim the highest priority available task let claimedTask = null; - for (const task of pendingTasks.tasks) { + for (const task of availableTasks) { try { // First assign the task to the worker await registry.executeHandler("task.assign", { From f9832ba8c040482e59d80e0239776f182c7456ee Mon Sep 17 00:00:00 2001 From: FBLGit Date: Wed, 24 Sep 2025 21:57:52 +0800 Subject: [PATCH 4/7] { "tool": "Edit", "files": [ "apps/server/src/handlers/task/task.claim.handler.ts" ], "tasks": [], "todos": [], "sessionId": "4fc5b425-9315-4274-bdee-018905ad2fe9", "instanceId": "worker-1", "timestamp": 1758722271953 } --- apps/server/src/handlers/task/task.claim.handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/handlers/task/task.claim.handler.ts b/apps/server/src/handlers/task/task.claim.handler.ts index ca3ad09..6125829 100644 --- a/apps/server/src/handlers/task/task.claim.handler.ts +++ b/apps/server/src/handlers/task/task.claim.handler.ts @@ -1,6 +1,6 @@ import { EventHandler, Instrumented, Resilient } from "@/core/decorator"; import type { EventContext } from "@/core/context"; -import { taskClaimInput, taskClaimOutput } from "@/schemas/task.schema"; +import { taskClaimInput, taskClaimOutput, taskListOutput } from "@/schemas/task.schema"; import type { TaskClaimInput, TaskClaimOutput } from "@/schemas/task.schema"; import { redisKey } from "@/core/redis"; import { registry } from "@/core/registry"; From 9afc61d09173f1984e09245cc7ca684fbf0d4cbc Mon Sep 17 00:00:00 2001 From: FBLGit Date: Wed, 24 Sep 2025 21:58:45 +0800 Subject: [PATCH 5/7] { "tool": "Edit", "files": [ "apps/server/src/handlers/task/task.claim.handler.ts" ], "tasks": [], "todos": [], "sessionId": "4fc5b425-9315-4274-bdee-018905ad2fe9", "instanceId": "worker-1", "timestamp": 1758722325056 } --- apps/server/src/handlers/task/task.claim.handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/handlers/task/task.claim.handler.ts b/apps/server/src/handlers/task/task.claim.handler.ts index 6125829..b5d3c0a 100644 --- a/apps/server/src/handlers/task/task.claim.handler.ts +++ b/apps/server/src/handlers/task/task.claim.handler.ts @@ -57,7 +57,7 @@ export class TaskClaimHandler { } // Filter out tasks assigned to other workers (but allow tasks assigned to this worker or unassigned) - const availableTasks = pendingTasks.tasks.filter(task => + const availableTasks = pendingTasks.tasks.filter((task) => !task.assignedTo || task.assignedTo === input.workerId ); From b1819924da824a14d9fbd7cf2b29f336f1f5e1d0 Mon Sep 17 00:00:00 2001 From: FBLGit Date: Wed, 24 Sep 2025 21:59:41 +0800 Subject: [PATCH 6/7] rollback --- .../src/handlers/task/task.claim.handler.ts | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/apps/server/src/handlers/task/task.claim.handler.ts b/apps/server/src/handlers/task/task.claim.handler.ts index b5d3c0a..c51c4ec 100644 --- a/apps/server/src/handlers/task/task.claim.handler.ts +++ b/apps/server/src/handlers/task/task.claim.handler.ts @@ -1,6 +1,6 @@ import { EventHandler, Instrumented, Resilient } from "@/core/decorator"; import type { EventContext } from "@/core/context"; -import { taskClaimInput, taskClaimOutput, taskListOutput } from "@/schemas/task.schema"; +import { taskClaimInput, taskClaimOutput } from "@/schemas/task.schema"; import type { TaskClaimInput, TaskClaimOutput } from "@/schemas/task.schema"; import { redisKey } from "@/core/redis"; import { registry } from "@/core/registry"; @@ -46,7 +46,7 @@ export class TaskClaimHandler { status: "pending", orderBy: "priority", order: "desc", - limit: 20 // Get more tasks to account for filtering + limit: 10 // Check up to 10 pending tasks }, ctx.metadata?.clientId); if (!pendingTasks || !pendingTasks.tasks || pendingTasks.tasks.length === 0) { @@ -55,22 +55,10 @@ export class TaskClaimHandler { claimed: false, }; } - - // Filter out tasks assigned to other workers (but allow tasks assigned to this worker or unassigned) - const availableTasks = pendingTasks.tasks.filter((task) => - !task.assignedTo || task.assignedTo === input.workerId - ); - - if (availableTasks.length === 0) { - // No available pending tasks for this worker - return { - claimed: false, - }; - } - // Try to claim the highest priority available task + // Try to claim the highest priority pending task let claimedTask = null; - for (const task of availableTasks) { + for (const task of pendingTasks.tasks) { try { // First assign the task to the worker await registry.executeHandler("task.assign", { From 5744f61bcf169f2b060c05e883cc098932351002 Mon Sep 17 00:00:00 2001 From: FBLGit Date: Wed, 24 Sep 2025 22:02:16 +0800 Subject: [PATCH 7/7] { "tool": "Edit", "files": [ "apps/server/src/handlers/task/task.assign.handler.ts" ], "tasks": [], "todos": [], "sessionId": "4fc5b425-9315-4274-bdee-018905ad2fe9", "instanceId": "worker-1", "timestamp": 1758722535975 } --- apps/server/src/handlers/task/task.assign.handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/server/src/handlers/task/task.assign.handler.ts b/apps/server/src/handlers/task/task.assign.handler.ts index 5e3d6d9..cc5c1e4 100644 --- a/apps/server/src/handlers/task/task.assign.handler.ts +++ b/apps/server/src/handlers/task/task.assign.handler.ts @@ -51,9 +51,9 @@ export class TaskAssignHandler { throw new Error(`Instance ${input.instanceId} is not available (status: ${status})`); } - // Check if task is already assigned + // Check if task is already assigned to a different worker const previousAssignment = taskData.assignedTo || null; - if (previousAssignment) { + if (previousAssignment && previousAssignment !== input.instanceId) { throw new Error(`Task ${input.taskId} is already assigned to ${previousAssignment}.`); }