diff --git a/src-tauri/recipes.json b/src-tauri/recipes.json index 5d881b6..f1eec82 100644 --- a/src-tauri/recipes.json +++ b/src-tauri/recipes.json @@ -11,9 +11,9 @@ { "id": "agent_id", "label": "Agent ID", "type": "string", "required": true, "placeholder": "e.g. my-bot" }, { "id": "guild_id", "label": "Guild", "type": "discord_guild", "required": true }, { "id": "channel_id", "label": "Channel", "type": "discord_channel", "required": true }, - { "id": "name", "label": "Display Name", "type": "string", "required": true, "placeholder": "e.g. MyBot" }, + { "id": "name", "label": "Display Name", "type": "string", "required": false, "placeholder": "e.g. MyBot" }, { "id": "emoji", "label": "Emoji", "type": "string", "required": false, "placeholder": "e.g. \ud83e\udd16" }, - { "id": "persona", "label": "Persona", "type": "textarea", "required": true, "placeholder": "You are..." } + { "id": "persona", "label": "Persona", "type": "textarea", "required": false, "placeholder": "You are..." } ], "steps": [ { "action": "create_agent", "label": "Create independent agent", "args": { "agentId": "{{agent_id}}", "independent": true } }, diff --git a/src/lib/actions.ts b/src/lib/actions.ts index 1846917..5e07c9e 100644 --- a/src/lib/actions.ts +++ b/src/lib/actions.ts @@ -81,6 +81,7 @@ export interface ResolvedStep { label: string; args: Record; description: string; + skippable: boolean; } export function resolveSteps( @@ -92,6 +93,14 @@ export function resolveSteps( if (step.action === "config_patch") { resolved.params = params; } + // A step is skippable if any of its template args resolved to empty string + const skippable = Object.entries(step.args).some(([key, origValue]) => { + if (typeof origValue === "string" && origValue.includes("{{")) { + const rv = resolved[key]; + return typeof rv === "string" && rv.trim() === ""; + } + return false; + }); const actionDef = getAction(step.action); const description = actionDef?.describe(resolved) || step.label; return { @@ -100,6 +109,7 @@ export function resolveSteps( label: step.label, args: resolved, description: description || step.label, + skippable, }; }); } diff --git a/src/pages/Cook.tsx b/src/pages/Cook.tsx index c2c4ec3..fb093b9 100644 --- a/src/pages/Cook.tsx +++ b/src/pages/Cook.tsx @@ -48,9 +48,10 @@ export function Cook({ const handleNext = () => { const steps = resolveSteps(recipe.steps, params); setResolvedStepList(steps); - setStepStatuses(steps.map(() => "pending")); + // Auto-skip steps whose template args resolved to empty + setStepStatuses(steps.map((s) => (s.skippable ? "skipped" : "pending"))); setStepErrors({}); - setHasConfigPatch(steps.some((s) => s.action === "config_patch")); + setHasConfigPatch(steps.some((s) => !s.skippable && s.action === "config_patch")); setPhase("confirm"); }; @@ -75,8 +76,7 @@ export function Cook({ const handleExecute = () => { setPhase("execute"); - const statuses: StepStatus[] = resolvedStepList.map(() => "pending"); - setStepStatuses([...statuses]); + const statuses = [...stepStatuses]; runFrom(0, statuses); }; @@ -131,7 +131,12 @@ export function Cook({ return (
-

{recipe.name}

+
+ +

{recipe.name}

+
{phase === "params" && (
{resolvedStepList.map((step, i) => ( -
+
{statusIcon(stepStatuses[i])}
-
{step.label}
- {step.description !== step.label && ( +
+ {step.label} + {stepStatuses[i] === "skipped" && phase === "confirm" && ( + (skipped — empty params) + )} +
+ {step.description !== step.label && stepStatuses[i] !== "skipped" && (
{step.description}
)} {stepErrors[i] && ( @@ -198,9 +208,6 @@ export function Cook({ Use "Apply Changes" in the sidebar to restart the gateway and activate config changes.

)} - )}