Form auto-fill
The agent can assist with supported website forms, such as contact or project inquiry forms. Form behavior depends on the fields and controls your site uses, so test each important form before relying on it. The agent does not enter payment details or bypass CAPTCHA.
The flow
When the visitor says something like “fill out the contact form” or “hire me”:
- Locate the form. Indexed elements that have a
required: trueflag + sit inside the sameparentgroup (form heading) constitute the target form. - Identify missing values. The agent checks
previouslyFilledFields+user-data-store(cross-session memory) + conversation history. Any required field WITHOUT a known value triggersask_user. - Ask one at a time. Each
ask_useremits a question and field-type hint. The visitor answers, the value is stored. The agent loops back to step 2. - Single atomic submit. Once every required field has a value, the agent emits a single sequence with type-step-per-field + a final click on the submit button.
- Verify success. Next iteration checks for: URL change to
/thank-you, success-modal appearance, form reset, success-toast text. Only if one of these signals fires does the agent emittask_complete.
Field detection
Indexed elements expose:
type—text,email,phone,tel,number,date,password,textarea,selectrequired— when nativerequired,aria-required="true", or the literal attribute is presentparent— the form’s heading text or container, for disambiguationvalue— current value (so the agent can skip already-filled fields)options— for<select>, the list of choices
The agent prioritizes required fields. Optional fields are filled if the visitor provided values; otherwise skipped.
ask_user contract
When the agent needs a value:
{ "type": "ask_user", "question": "What's your email address?", "field_name": "email", "field_type": "email"}The widget renders the question as an assistant bubble. Visitor types the answer. The widget classifies the response (data vs cancel vs new command) and either:
- Data — value gets stored in
formFieldsState, agent gets the value in the next iteration’s context. - Cancel — current task aborts.
- New command — current task suspends; new task starts; on completion, the suspended task resumes (or doesn’t, per visitor follow-up).
Persistent memory
Values the visitor provides during one form-fill (name, email, phone, address) are cached in localStorage under leflux:userData with a 30-day TTL. Next time the visitor fills any form on the same domain, the agent auto-fills those fields without re-asking. This is opt-in per visitor — there’s no server-side identity tied to it.
To opt out: visitor can clear site data, or you can disable this behavior with the data-no-user-memory attribute on your embed snippet.
Multi-step / multi-page forms
If a form spans multiple pages (next-button progression), the agent fills the visible step, clicks Next, re-indexes the new page, fills the next step. Same loop, no special config.
What’s NOT supported
- File uploads — the agent cannot upload files. If a form requires a file, the agent asks the visitor to pick one and pauses.
- CAPTCHA — never bypassed. If a form has a captcha, the agent fills everything up to the captcha and asks the visitor to solve it before the final submit.
- Payment fields — credit card / bank account fields are never filled by the agent. If the visitor explicitly tells the agent a number, the agent refuses and asks the visitor to enter it directly.
Confirmation gate
For destructive or irreversible actions inside a form (e.g. “Delete account” submit, “Purchase” submit, “Send to all customers”), the agent can request explicit confirmation via:
{ "type": "confirmation_required", "message": "Submit this contact form to Acme Sales?", "confirm_label": "Submit", "cancel_label": "Cancel"}Visitor taps Confirm → sequence runs. Cancel → task aborts. This is automatic for actions the agent detects as high-stakes; it’s not configurable per-form today.
Status feedback
While the form-fill sequence executes, the chat shows a transient status bubble: “Submitting form…”, “Filling email…”. These auto-clear on success. Failures surface in the next assistant bubble with a clear reason.
See Action execution for the underlying primitives.