Clear-Then-Type Field Entry

Setting a field’s value reliably means clearing whatever is there first, then entering the new text — otherwise automation appends to or corrupts the existing content. The framework has write (types, but raises on emoji / CJK / chars outside the layout table) and set_clipboard / hotkey separately, but no single “focus → clear → set value” primitive and no paste strategy for text that write cannot type. This adds the Playwright fill idiom.

plan_field_set() builds the deterministic op-plan (pure, unit-testable); set_field_text() dispatches it through an injectable sink so it is tested without real input. Imports no PySide6.

Headless API

from je_auto_control import set_field_text, plan_field_set

set_field_text("new value")                       # select-all, delete, type
set_field_text("café 🚀", paste=True)             # via clipboard (Unicode-safe)
set_field_text("appended", clear="none")          # no clear, just type
set_field_text("値", paste=True, modifier="command")   # macOS

plan_field_set("hi")
# [{'op': 'hotkey', 'keys': ['ctrl', 'a']},
#  {'op': 'key', 'key': 'delete'},
#  {'op': 'type', 'text': 'hi'}]

clear is "select_all" (the modifier``+A then Delete clear) or ``"none". paste=True enters the text through the clipboard (modifier``+V) the reliable path for Unicode / emoji / CJK that ``write cannot type — rather than typing key by key. modifier is the platform command key ("ctrl"; use "command" on macOS). An unknown clear mode raises ValueError.

Executor commands

AC_set_field_text takes text plus clear / paste / modifier and returns {ops, plan}. It is exposed as the MCP tool ac_set_field_text and as a Script Builder command under Keyboard.