Greasy Fork

Greasy Fork is available in English.

Mistral Chat Prompt Injector

Listens for postMessage events and injects them into chat.mistral.ai's input field

// ==UserScript==
// @name         Mistral Chat Prompt Injector
// @description  Listens for postMessage events and injects them into chat.mistral.ai's input field
// @match        https://chat.mistral.ai/*
// @run-at       document-idle
// @version 0.0.1.20250521151018
// @namespace http://greasyfork.icu/users/1435046
// ==/UserScript==

(function () {
  window.addEventListener('message', event => {

    if (event.data?.type === 'newChatButtonClicked') {
      document.querySelector('button[aria-label="New chat"]').click();
      return;
    }

    if (event.data.type === "prompt" && event.data.content.trim()) {
      const textarea = document.querySelector('textarea[name="message.text"]');
      if (textarea) {
        const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype, "value").set;
        nativeInputValueSetter.call(textarea, event.data.content); // Set like the browser would

        // Now trigger a React-compatible InputEvent
        const inputEvent = new InputEvent('input', {
          bubbles: true,
          cancelable: true,
          inputType: 'insertText',
          data: event.data.content,
        });

        textarea.dispatchEvent(inputEvent);

        document.querySelector('button[type="submit"]').click();

        const submitButton = document.querySelector('button[type="submit"]');
        if (submitButton) {
          const observer = new MutationObserver(() => {
            if (!submitButton.disabled && submitButton.getAttribute('aria-disabled') !== 'true') {
              submitButton.click();
              observer.disconnect();
            }
          });

          observer.observe(submitButton, {
            attributes: true,
            attributeFilter: ['disabled', 'aria-disabled']
          });
        }

      }
    }
  });
})();