{#if configLoading} Loading… {:else if form.enabled} Enabled {:else} Disabled {/if}
{#if form.enabled && effectiveNextRun !== null}

Next run in {countdownLabel}

{/if}
{#if configError}

{configError}

{:else}
Prompts

Open the editor for the system + task prompts (with a variable palette).

Model
Reasoning effort
Interval
{ const n = Number.parseInt(e.currentTarget.value, 10); form = { ...form, intervalHours: Number.isNaN(n) ? 0 : n }; }} onchange={(e) => { const clamped = Math.max(0, Math.min(24, form.intervalHours)); form = { ...form, intervalHours: clamped }; e.currentTarget.value = String(clamped); }} aria-label="Heartbeat interval hours" /> h { const n = Number.parseInt(e.currentTarget.value, 10); form = { ...form, intervalMinutes: Number.isNaN(n) ? 0 : n }; }} onchange={(e) => { const clamped = Math.max(0, Math.min(59, form.intervalMinutes)); form = { ...form, intervalMinutes: clamped }; e.currentTarget.value = String(clamped); }} aria-label="Heartbeat interval minutes" /> m between runs
{#if saveError}

{saveError}

{:else if justSaved}

Saved.

{/if}
{/if}
Runs
{#if runsError}

{runsError}

{:else if runs.length > 0} {#if stopError}

{stopError}

{/if} {:else if hasLoadedRuns}

No runs yet. Enable the heartbeat to start the loop.

{/if}
{#if promptEditorOpen} { // Sync the form + the diff baseline so the main Save button + formDiffers // stay accurate (the editor persisted the prompts already). `systemPrompt` // may be "" (inherit) — the form stores the raw override. form = { ...form, systemPrompt, taskPrompt }; loadedConfig = { ...loadedConfig, systemPrompt, taskPrompt }; justSaved = true; }} onClose={() => (promptEditorOpen = false)} /> {/if}