DeepSeek Smart Focus Manager

Autografts typing into the DeepSeek chat input on keypress, but blocks all other programmatic autofocus.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         DeepSeek Smart Focus Manager
// @description  Autografts typing into the DeepSeek chat input on keypress, but blocks all other programmatic autofocus.
// @match        https://chat.deepseek.com/*
// @run-at       document-start
// @version 0.0.1.20250512102624
// @namespace https://greasyfork.org/users/1435046
// ==/UserScript==

(function() {
  'use strict';

  //
  // 1) PREVENT all programmatic .focus() calls on TEXTAREA,
  //    *unless* the textarea has a special allowFocus flag.
  //
  const originalFocus = HTMLElement.prototype.focus;
  Object.defineProperty(HTMLElement.prototype, 'focus', {
    configurable: true,
    enumerable: true,
    writable: true,
    value: function(...args) {
      if (this.tagName === 'TEXTAREA') {
        // only allow if we've explicitly marked it
        if (this._allowDeepSeekFocus) {
          // consume the flag and focus
          delete this._allowDeepSeekFocus;
          return originalFocus.apply(this, args);
        }
        // otherwise swallow the focus()
        return;
      }
      // not a textarea => no change
      return originalFocus.apply(this, args);
    }
  });


  //
  // 2) AUTO-FOCUS & INJECT TEXT when you type anywhere on the page.
  //
  document.addEventListener('keydown', e => {
    // only letters/digits, not in an input already
    const active = document.activeElement;
    if (
      e.key.length === 1 &&
      /^[\w]$/i.test(e.key) &&
      !e.ctrlKey && !e.metaKey &&
      !(active && /^textarea|input$/i.test(active.tagName))
    ) {
      const textarea = document.getElementById('chat-input');
      if (!textarea) return;

      // prevent default so the page doesn’t try anything else
      e.preventDefault();

      // mark that *we* are allowed to focus it now
      textarea._allowDeepSeekFocus = true;
      textarea.focus();

      // insert the character where the cursor would go
      const start = textarea.selectionStart;
      const end   = textarea.selectionEnd;
      textarea.setRangeText(e.key, start, end, 'end');

      // notify React/MUI/etc.
      textarea.dispatchEvent(new Event('input',  { bubbles: true }));
      textarea.dispatchEvent(new Event('change', { bubbles: true }));
    }
  });
})();