πŸ”΄ Forms with a conscience

You get: human-in-the-loop automation β€” the agent does the work, you make the call. Pairs with: anything where β€œoops” is expensive.

tabstack automate "Fill in the contact form with our standard intro message, but pause before submitting." 
  --url https://prospect.example.com/contact 
  --data @contact-details.json 
  --interactive 
  --allow-actions

What it does

--interactive tells the API to send interactive:form_data:request events when the agent wants human confirmation. The CLI prints the request ID and pauses. You review, then answer with tabstack input.

Without --interactive, the agent runs to completion autonomously. With it, you stay in the loop for consequential steps.

The flow

# 1. Start the automation
tabstack automate "Fill the form and pause before submitting" 
  --url https://example.com/contact 
  --interactive --allow-actions

# CLI output:
# β†’ navigating to https://example.com/contact
# β†’ filling name field
# β†’ filling email field
# β†’ filling message field
# ⏸  Paused β€” agent wants confirmation before submitting
#    request-id: req_abc123
#    Run: tabstack input req_abc123 --data '{"fields":[{"ref":"confirm","value":"yes"}]}'

# 2. Review what the agent filled in, then confirm
tabstack input req_abc123 --data '{"fields":[{"ref":"confirm","value":"yes"}]}'

# Or cancel
tabstack input req_abc123 --data '{"cancelled":true}'

Data file format

{
  "name": "Ashutosh Tripathi",
  "email": "hello@zero8.dev",
  "message": "Hi, I noticed you're building in the agentic space..."
}

Pass it with --data @contact-details.json.

Why this exists

Full automation (--allow-actions without --interactive) is powerful but unforgiving. A form submission, a purchase, a calendar invite β€” these have real-world consequences you can’t easily undo. --interactive gives you a human checkpoint without giving up the time saved by automation.

The agent handles the navigation, field detection, and filling. You handle the decision to proceed.

Capture the result

tabstack automate "Fill and submit the form, report what confirmation message appeared" 
  --url https://example.com/contact 
  --interactive --allow-actions 
  | jq -r 'select(.event=="task:completed") | .data.answer'

When to use --allow-actions

Without --allow-actions, a read-only guardrail is active β€” the agent can navigate and read but not click submit buttons or fill forms. Add --allow-actions only when you intend for the agent to take real actions. --interactive is the safety layer on top of that.