Form auto-fill
The agent can fill out any form on your site — contact forms, signup, project inquiry, checkout. The flow is deliberately conservative to avoid half-submitted forms.
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.