diff --git a/src/lib/components/chat/MessageInput/InputVariablesModal.svelte b/src/lib/components/chat/MessageInput/InputVariablesModal.svelte
index 53f4ec02dc..4554ea72d3 100644
--- a/src/lib/components/chat/MessageInput/InputVariablesModal.svelte
+++ b/src/lib/components/chat/MessageInput/InputVariablesModal.svelte
@@ -84,7 +84,7 @@
{variable}
- {#if variables[variable]?.required ?? true}
+ {#if variables[variable]?.required ?? false}
*{$i18n.t('required')}
{/if}
@@ -134,7 +134,7 @@
placeholder={$i18n.t('Enter value (true/false)')}
bind:value={variableValues[variable]}
autocomplete="off"
- required
+ required={variables[variable]?.required ?? false}
/>
{:else if variables[variable]?.type === 'color'}
@@ -159,7 +159,7 @@
placeholder={$i18n.t('Enter hex color (e.g. #FF0000)')}
bind:value={variableValues[variable]}
autocomplete="off"
- required
+ required={variables[variable]?.required ?? false}
/>
{:else if variables[variable]?.type === 'date'}
@@ -170,7 +170,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'datetime-local'}
@@ -181,7 +181,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'email'}
@@ -192,7 +192,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'month'}
@@ -203,7 +203,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'number'}
@@ -214,7 +214,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'range'}
@@ -235,7 +235,7 @@
placeholder={$i18n.t('Enter value')}
bind:value={variableValues[variable]}
autocomplete="off"
- required
+ required={variables[variable]?.required ?? false}
/>
@@ -256,7 +256,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'text'}
@@ -267,7 +267,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'time'}
@@ -278,7 +278,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'url'}
@@ -289,7 +289,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
{...variableAttributes}
/>
{:else if variables[variable]?.type === 'map'}
@@ -311,7 +311,7 @@
placeholder={$i18n.t('Enter coordinates (e.g. 51.505, -0.09)')}
bind:value={variableValues[variable]}
autocomplete="off"
- required
+ required={variables[variable]?.required ?? false}
/>
{:else}
@@ -321,7 +321,7 @@
bind:value={variableValues[variable]}
autocomplete="off"
id="input-variable-{idx}"
- required
+ required={variables[variable]?.required ?? false}
/>
{/if}
diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts
index 85e41d3c38..09bab3cf56 100644
--- a/src/lib/utils/index.ts
+++ b/src/lib/utils/index.ts
@@ -1408,24 +1408,39 @@ export const parseVariableDefinition = (definition: string): Record
// Parse type (explicit or implied)
const type = firstPart.startsWith('type=') ? firstPart.slice(5) : firstPart;
- // Parse properties using reduce
- const properties = propertyParts.reduce((props, part) => {
- // Use splitProperties for the equals sign as well, in case there are nested quotes
- const equalsParts = splitProperties(part, '=');
- const [propertyName, ...valueParts] = equalsParts;
- const propertyValue = valueParts.join('='); // Handle values with = signs
+ // Parse properties; support both key=value and bare flags (e.g., ":required")
+ const properties = propertyParts.reduce(
+ (props, part) => {
+ const trimmed = part.trim();
+ if (!trimmed) return props;
- return propertyName && propertyValue
- ? {
- ...props,
- [propertyName.trim()]: parseJsonValue(propertyValue.trim())
+ // Use splitProperties for the equals sign as well, in case there are nested quotes
+ const equalsParts = splitProperties(trimmed, '=');
+
+ if (equalsParts.length === 1) {
+ // It's a flag with no value, e.g. "required" -> true
+ const flagName = equalsParts[0].trim();
+ if (flagName.length > 0) {
+ return { ...props, [flagName]: true };
}
- : props;
- }, {});
+ return props;
+ }
+
+ const [propertyName, ...valueParts] = equalsParts;
+ const propertyValueRaw = valueParts.join('='); // Handle values with extra '='
+
+ if (!propertyName || propertyValueRaw == null) return props;
+
+ return {
+ ...props,
+ [propertyName.trim()]: parseJsonValue(propertyValueRaw.trim())
+ };
+ },
+ {} as Record
+ );
return { type, ...properties };
};
-
export const parseJsonValue = (value: string): any => {
// Remove surrounding quotes if present (for string values)
if (value.startsWith('"') && value.endsWith('"')) {