Donc, après avoir failli casser mon ordinateur, j’ai trouvé une solution de contournement — probablement pas la plus idéale 
Il semble que lorsque l’on clique sur Répondre dans l’intégration Full App Embed, le composeur s’ouvre correctement dans le DOM (#reply-control.open), mais pour une raison inconnue, il reste en display: none.
Je l’ai confirmé dans la console du navigateur : le composeur était présent, mais sa valeur de display calculée était “none”. En exécutant manuellement :
document.querySelector('#reply-control').style.setProperty('display', 'block', 'important');
le composeur est apparu immédiatement et tout a fonctionné normalement.
En tant que solution de contournement, l’ajout du JS suivant au thème Discourse résout le problème pour moi :
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
if (!document.body.classList.contains("embed-mode")) {
return;
}
const fixComposer = () => {
const composer = document.querySelector("#reply-control.open");
if (composer) {
composer.style.setProperty("display", "block", "important");
}
};
const observer = new MutationObserver(fixComposer);
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ["class"],
});
fixComposer();
});
Cela semble le corriger complètement, et j’ai limité le contournement au mode embed afin de ne pas affecter l’interface Discourse normale.
Évidemment, ce n’est probablement pas la solution idéale à long terme, mais j’espère que cela aidera à identifier ce qui cause la persistance de display: none sur le composeur ouvert dans le Full App Embed.