DeepSeek Smart Focus Manager

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

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

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

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

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

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

// ==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 }));
    }
  });
})();