Smoke the SmokeDetector
I'm sorry, but my review is going to be short; your code looks pretty good.



Refactor node deletion

You did a very good job of refactoring your code for the most part. The only repetition that I can find is here:


var parentNode = message.parentNode;
parentNode.removeChild(message);
if (parentNode.children.length === 0){
    messageBlock.style.display = "none";
}



Perhaps it would be best to split this off into a deleteMessage function to keep things simple.



Refactoring message content checking

This conditional is fairly lengthy:


if (messageText.startsWith('sd') || (messageText.startsWith('!!/') &amp;&amp; messageText !== '!!/blame' &amp;&amp; messageText !== '!!/amiprivileged') || isSmokeyResponse)



Perhaps it would be cleaner to split this off into a separate function called isSDCommand.



Variable confusion

In the first part of hideSmokeyMessage, you have this:


var text = innerText(message, '.content');



In the second part, after the conditional, you have this:


var messageText = innerText(message, '.content');



Two variables, same exact content but with different names and in different scopes. That's a little confusing.

You should define the text variable above the first conditional so both parts of the function can use it, since they both need to use it anyway.



Simplifying argument checking

This is your innerText function:


function innerText(element, selector){
    if (!selector) return "";
    var foundElement = element.querySelector(selector);
    if (!foundElement || !foundElement.innerText) return "";
    return foundElement.innerText;
}



First off, if you are going to check for the existence of selector, why not also check for the existence of element? I personally think you could just drop the checking all together because


This isn't some standard function that you are reinventing
You always provide the second parameter


Another simplification you can make is removing the second part of the remaining conditional (the part after the ||). If there is no text, it's going to be "" anyway.

Now your function looks like this:

function innerText(element, selector){
    var foundElement = element.querySelector(selector);
    if (!foundElement) return "";
    return foundElement.innerText;
}


This can be even further simplified with a ternary operator now:

return foundElement ? foundElement.innerText : "";




Nitpick

You can merge the SmokeyIdsBasedOnSite map and the SmokeyUserId together to make it a bit cleaner in that section:

var SmokeyUserId = ({
    "chat.meta.stackexchange.com": 266345,
    "chat.stackexchange.com": 120914,
    "chat.stackoverflow.com": 3735529
})[document.location.host];