Form

A form that locks its fields while saving, moves focus to the first error, and ends with a save area that explains why it cannot save yet.

Placement and sharing

Where this agent is listed and who can use or manage it.

Its managers can edit this agent.

Usage

Form usageTSX
import { Form, FormFooter, FormSection } from "@tulipfarm/sprout/form";
import { Field } from "@tulipfarm/sprout/field";
import { Input } from "@tulipfarm/sprout/input";

<Form label="Change interval" disabled={saving} onSubmit={() => {
  if (error) { setChecked(true); return "invalid"; }
  save(minutes);
}}>
  <FormSection title="Scheduled trigger" description="Start this agent on an interval.">
    <Field label="Run every" required error={checked ? error : undefined}>
      <Input type="number" value={minutes} onChange={…} />
    </Field>
  </FormSection>
  <FormFooter
    dirty={minutes !== saved}
    note="Saving makes you the sponsor."
    submit={{
      label: "Save interval",
      pendingLabel: "Saving interval…",
      state: saving ? { kind: "busy" } : { kind: "ready" },
    }}
    cancel={{ kind: "reset", label: "Discard changes", onReset: reset }}
  />
</Form>

Form renders a noValidate form and prevents the browser submit. Return "invalid" from onSubmitafter you show errors; the form then scrolls to and focuses the first control with aria-invalid="true". disabledlocks every Field, ChoiceGroup, andCheckboxField inside. label names the form.

FormSection is a bordered region named by itstitle, or by label when set. It takes an optionaldescription, a meta badge such as3 / 20, an id to jump to, andlevel2 or 3 for the heading.

Validation and recovery

Clear a field and save. Focus moves to the first error, the footer shows a summary, and Discard changes restores the saved values. While saving, the fields lock and Discard changes hides.

Workspace settings · Models

Conversation compaction

Keeps long chats within the model context by summarizing earlier messages. Applies to every chat in this workspace.

Percent of the model context, 50 to 95.

Kept word for word, 2 to 40.

Footer layouts

bar sits under a divider for page and section forms.stack uses full-width large buttons for sign-in, onboarding, and dialogs. compact fits chat cards: it hides the status line from sight, and its children sit beside the buttons instead of below them.

Bar · Agent schedule

Minutes between runs.

Stack · Sign in
Compact · Chat card

How long should my replies be?

Reply style

Submit states

Blocked submit with a fixTSX
submit={{
  label: "Add Slack destination",
  pendingLabel: "Adding Slack destination…",
  state: team ? { kind: "ready" } : {
    kind: "blocked",
    reason: "Choose a destination team below first.",
    fix: { kind: "jump", label: "Choose a team", target: "slack-destination-team" },
  },
}}

busy shows pendingLabel and setsaria-busy. blocked shows itsreason under the buttons and links it witharia-describedby. Busy and blocked buttons stay focusable so keyboard users hear why. A fix adds a link button:jump focuses an element by id, action runs a callback, and link renders your router link.dirty shows Unsaved changes; a reset cancel shows only while dirty and not busy.

Ready, clean
Ready, unsaved changes
Busy
Blocked with a reason
Blocked, jump to the field
Optional
Blocked, retry action
Blocked, link fix
Error
Loading: form locked while refreshing
Empty: no form to show

No GitHub source available

Connect a personal account, or ask a team integration manager for integration use and repository read permissions.

Sections

Meta badges count choices or items. The header wraps the badge under the title when the section is narrow. Long titles and descriptions wrap.

What it can do

Choose actions by app. Skills guide the work; these choices grant the capability.

3 / 20

Reads rows in the tables you allow.

Adds rows. Changes data.

Posts to attached channels.

Schedules

Give each recurring run its own task. Schedules stay off until activation.

2 added
  • Weekday supplier digest · every day at 08:00
  • Stock check · every 60 minutes

Activate instructions

Runs use the version you activate. Activate again after you change the instructions.

Read rows, Post to Slack

Placement and sharing

Where this agent is listed and who can use or manage it.

Team grants

Teams that can use this agent. Managers can also edit it.

1 of 8

Operations · can use

Delete agent

Removes the agent and stops its active versions.

Compositions

secondarySubmit adds an outline submit such as Save draft; itsonSelect runs before the form submits. Aleave cancel renders a link. Pass form to put the footer outside its form, and summary to replace the status line with your own content. Footer children carry save feedback, alerts, and extra actions.

Agent builder · steps, Save draft secondary submit
  1. 1. Basics
  2. 2. Access
  3. 3. Triggers
  4. 4. Schedules
  5. 5. Review

Identity

Start with the name and the job. Everything else is optional.

0 / 80

Agent administration · one form per section

Placement and sharing

Where this agent is listed and who can use or manage it.

Team enrollment

Teams whose permissions this agent uses when it runs.

Enrolled teams

Optional
New agent · stack footer, leave link

Role

Who this agent is and the job it does.

GitHub Knowledge · footer outside the form

Repositories

Required
Chat question · compact summary actions

Which supplier should I contact first?

Answer

3 late deliveries

1 late delivery

Agent test chat · form without a footer
Table row · footer feedback and actions
Members · stack footer in a dialog

Accessibility

Name every form with label or a surrounding section. Errors render in a destructive Alert. Status lines fade in over 180ms and appear at once with reduced motion. Saving, routing, and data in these examples are sample code; the textarea is a docs-only stand-in.