$result * @param array $findings * @param array $changes * @param array $report * * @throws \InvalidArgumentException */ public function handle( int $workspaceId, string $agentId, int $taskId, array $result = [], array $findings = [], array $changes = [], array $report = [] ): FleetTask { $node = FleetNode::query() ->where('workspace_id', $workspaceId) ->where('agent_id', $agentId) ->first(); $fleetTask = FleetTask::query() ->where('workspace_id', $workspaceId) ->find($taskId); if (! $node || ! $fleetTask) { throw new \InvalidArgumentException('Fleet task not found'); } $status = ($result['status'] ?? '') === 'failed' ? FleetTask::STATUS_FAILED : FleetTask::STATUS_COMPLETED; $fleetTask->update([ 'status' => $status, 'result' => $result, 'findings' => $findings, 'changes' => $changes, 'report' => $report, 'completed_at' => now(), ]); $node->update([ 'status' => FleetNode::STATUS_ONLINE, 'current_task_id' => null, 'last_heartbeat_at' => now(), ]); $creditAmount = max(1, count($findings) + 1); AwardCredits::run($workspaceId, $agentId, 'fleet-task', $creditAmount, $node->id, 'Fleet task completed'); return $fleetTask->fresh(); } }