diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/workflow-mcp-servers/workflow-mcp-servers.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/workflow-mcp-servers/workflow-mcp-servers.tsx index 6364e07a6e4..99b7b5af963 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/workflow-mcp-servers/workflow-mcp-servers.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/workflow-mcp-servers/workflow-mcp-servers.tsx @@ -630,235 +630,239 @@ function ServerDetailView({ - canManage && ( - !open && setToolToDelete(null)} - srTitle='Remove Workflow' - title='Remove Workflow' - text={[ - 'Are you sure you want to remove ', - { text: toolToDelete?.toolName ?? 'this workflow', bold: true }, - ' from this server? The workflow will remain deployed and can be added back later.', - ]} - confirm={{ - label: 'Remove', - onClick: handleDeleteTool, - pending: deleteToolMutation.isPending, - pendingLabel: 'Removing...', - }} - /> - )canManage && ( - { - if (!open) { - setToolToView(null) - setEditingDescription('') - setEditingParameterDescriptions({}) - } - }} - srTitle={toolToView?.toolName ?? 'Edit Tool'} - > - setToolToView(null)}> - {toolToView?.toolName} - - - + {canManage && ( + !open && setToolToDelete(null)} + srTitle='Remove Workflow' + title='Remove Workflow' + text={[ + 'Are you sure you want to remove ', + { text: toolToDelete?.toolName ?? 'this workflow', bold: true }, + ' from this server? The workflow will remain deployed and can be added back later.', + ]} + confirm={{ + label: 'Remove', + onClick: handleDeleteTool, + pending: deleteToolMutation.isPending, + pendingLabel: 'Removing...', + }} + /> + )} + {canManage && ( + { + if (!open) { + setToolToView(null) + setEditingDescription('') + setEditingParameterDescriptions({}) + } + }} + srTitle={toolToView?.toolName ?? 'Edit Tool'} + > + setToolToView(null)}> + {toolToView?.toolName} + + + - - {(() => { - const schema = toolToView?.parameterSchema as - | { properties?: Record } - | undefined - const properties = schema?.properties - const hasParams = properties && Object.keys(properties).length > 0 - return hasParams ? ( -
- {Object.entries(properties).map(([name, prop]) => ( -
-
-
- - {name} - - - {prop.type || 'any'} - + + {(() => { + const schema = toolToView?.parameterSchema as + | { properties?: Record } + | undefined + const properties = schema?.properties + const hasParams = properties && Object.keys(properties).length > 0 + return hasParams ? ( +
+ {Object.entries(properties).map(([name, prop]) => ( +
+
+
+ + {name} + + + {prop.type || 'any'} + +
-
-
-
- - - setEditingParameterDescriptions((prev) => ({ - ...prev, - [name]: e.target.value, - })) - } - placeholder={`Enter description for ${name}`} - /> +
+
+ + + setEditingParameterDescriptions((prev) => ({ + ...prev, + [name]: e.target.value, + })) + } + placeholder={`Enter description for ${name}`} + /> +
-
- ))} -
- ) : ( -

- No inputs configured for this workflow. -

- ) - })()} -
- - setToolToView(null)} - primaryAction={{ - label: updateToolMutation.isPending ? 'Saving...' : 'Save', - onClick: handleSaveToolEdit, - disabled: isSaveToolDisabled, + ))} +
+ ) : ( +

+ No inputs configured for this workflow. +

+ ) + })()} + + + setToolToView(null)} + primaryAction={{ + label: updateToolMutation.isPending ? 'Saving...' : 'Save', + onClick: handleSaveToolEdit, + disabled: isSaveToolDisabled, + }} + /> + + )} + {canManage && ( + { + if (!open) { + setShowAddWorkflow(false) + setSelectedWorkflowId(null) + } }} - /> - - )canManage && ( - { - if (!open) { - setShowAddWorkflow(false) - setSelectedWorkflowId(null) - } - }} - srTitle='Add Workflow' - > - { - setShowAddWorkflow(false) - setSelectedWorkflowId(null) + srTitle='Add Workflow' + > + { + setShowAddWorkflow(false) + setSelectedWorkflowId(null) + }} + > + Add Workflow + + +

+ Select a deployed workflow to add to this MCP server. The workflow will be available + as a tool. +

+ + setSelectedWorkflowId(value)} + placeholder='Select a workflow...' + searchable + searchPlaceholder='Search workflows...' + disabled={addToolMutation.isPending} + fullWidth + dropdownWidth='trigger' + align='start' + displayLabel={selectedWorkflow?.name} + /> + + + {addToolMutation.isError + ? addToolMutation.error?.message || 'Failed to add workflow' + : null} + +
+ { + setShowAddWorkflow(false) + setSelectedWorkflowId(null) + }} + primaryAction={{ + label: addToolMutation.isPending ? 'Adding...' : 'Add Workflow', + onClick: handleAddWorkflow, + disabled: !selectedWorkflowId || addToolMutation.isPending, + }} + /> +
+ )} + {canManage && ( + { + if (!open) { + setShowEditServer(false) + } }} + srTitle='Edit Server' > - Add Workflow - - -

- Select a deployed workflow to add to this MCP server. The workflow will be available as - a tool. -

- - setSelectedWorkflowId(value)} - placeholder='Select a workflow...' - searchable - searchPlaceholder='Search workflows...' - disabled={addToolMutation.isPending} - fullWidth - dropdownWidth='trigger' - align='start' - displayLabel={selectedWorkflow?.name} + setShowEditServer(false)}>Edit Server + + - - - {addToolMutation.isError - ? addToolMutation.error?.message || 'Failed to add workflow' - : null} - - - { - setShowAddWorkflow(false) - setSelectedWorkflowId(null) - }} - primaryAction={{ - label: addToolMutation.isPending ? 'Adding...' : 'Add Workflow', - onClick: handleAddWorkflow, - disabled: !selectedWorkflowId || addToolMutation.isPending, - }} - /> -
- )canManage && ( - { - if (!open) { - setShowEditServer(false) - } - }} - srTitle='Edit Server' - > - setShowEditServer(false)}>Edit Server - - - + +
+ setEditServerIsPublic(value === 'public')} + > + API Key + Public + +

+ {editServerIsPublic + ? 'Anyone with the URL can call this server without authentication' + : 'Requests must include your Sim API key in the X-API-Key header'} +

+
+
+
+ setShowEditServer(false)} + primaryAction={{ + label: updateServerMutation.isPending ? 'Saving...' : 'Save', + onClick: handleSaveServerEdit, + disabled: + !editServerName.trim() || + updateServerMutation.isPending || + (editServerName === server.name && + editServerDescription === (server.description || '') && + editServerIsPublic === server.isPublic), + }} /> - -
- setEditServerIsPublic(value === 'public')} - > - API Key - Public - -

- {editServerIsPublic - ? 'Anyone with the URL can call this server without authentication' - : 'Requests must include your Sim API key in the X-API-Key header'} -

-
-
- - setShowEditServer(false)} - primaryAction={{ - label: updateServerMutation.isPending ? 'Saving...' : 'Save', - onClick: handleSaveServerEdit, - disabled: - !editServerName.trim() || - updateServerMutation.isPending || - (editServerName === server.name && - editServerDescription === (server.description || '') && - editServerIsPublic === server.isPublic), - }} +
+ )} + {canManage && ( + - - )canManage && ( - - ) + )} ) } diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx index 618870fb2c7..84b272b3f89 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx @@ -503,7 +503,7 @@ export function McpDeploy({ return ( <>
-

+

Create an MCP Server to expose your workflows as tools.

diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/checkbox-list/checkbox-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/checkbox-list/checkbox-list.tsx index 403827b6660..57cb912e660 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/checkbox-list/checkbox-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/checkbox-list/checkbox-list.tsx @@ -78,7 +78,7 @@ function CheckboxItem({ /> diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx index c0bcab52da0..f29ef3eae1d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx @@ -955,7 +955,7 @@ export function ConditionInput({ : 'rounded-t-[4px] border-[var(--border-1)] border-b' )} > - + {isRouterMode ? `Route ${index + 1}` : block.title}
@@ -1105,7 +1105,7 @@ export function ConditionInput({ }} placeholder='Describe when this route should be taken...' disabled={disabled || isPreview} - className='min-h-[100px] resize-none rounded-none border-0 px-3 py-2 text-sm text-transparent caret-foreground placeholder:text-muted-foreground/50 focus-visible:ring-0 focus-visible:ring-offset-0' + className='min-h-[100px] resize-none rounded-none border-0 px-3 py-2 text-sm text-transparent caret-foreground [letter-spacing:inherit] placeholder:text-muted-foreground/50 focus-visible:ring-0 focus-visible:ring-offset-0' rows={4} style={{ height: `${getRouterHeight(block.id)}px` }} /> diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx index ab96212d980..43c818d3b86 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx @@ -453,7 +453,7 @@ export function CredentialSelector({ {needsUpdate && (
-
+
Additional permissions required
@@ -471,7 +471,7 @@ export function CredentialSelector({ }) setShowOAuthModal(true) }} - className='w-full px-2 py-1 font-medium text-caption' + className='w-full px-2 py-1 text-caption' > Update access diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx index 524e7461d47..bf2b4bdb42d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx @@ -211,7 +211,7 @@ export function DocumentTagEntry({ const tagCount = tags.filter((t) => t.tagName?.trim()).length return (
- +
{tagCount > 0 ? `${tagCount} tag(s) configured` : 'No tags'}
@@ -223,7 +223,7 @@ export function DocumentTagEntry({ return (
-

+

No tags defined for this knowledge base

@@ -250,7 +250,7 @@ export function DocumentTagEntry({ }} >

- + {tag.collapsed ? tag.tagName || `Tag ${index + 1}` : `Tag ${index + 1}`} {tag.collapsed && tag.tagName && ( @@ -334,14 +334,14 @@ export function DocumentTagEntry({ disabled={isReadOnly} autoComplete='off' placeholder={placeholder} - className='allow-scroll w-full overflow-auto text-transparent caret-foreground' + className='allow-scroll w-full overflow-auto text-transparent caret-foreground [letter-spacing:inherit]' />
{ if (el) overlayRefs.current[cellKey] = el }} className={cn( - 'absolute inset-0 flex items-center overflow-x-auto bg-transparent px-2 py-1.5 font-medium font-sans text-sm', + 'absolute inset-0 flex items-center overflow-x-auto bg-transparent px-2 py-1.5 font-sans text-sm', !isReadOnly && 'pointer-events-none' )} > diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx index fe7ee8c53af..6c659aff3dc 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx @@ -139,7 +139,7 @@ export function EvalInput({ const renderMetricHeader = (metric: EvalMetric, index: number) => (
- Metric {index + 1} + Metric {index + 1}
@@ -194,7 +194,7 @@ export function EvalInput({ onChange={(e) => updateMetric(metric.id, 'name', e.target.value)} placeholder='Accuracy' disabled={isPreview || disabled} - className='text-transparent caret-foreground placeholder:text-muted-foreground/50' + className='text-transparent caret-foreground [letter-spacing:inherit] placeholder:text-muted-foreground/50' />
@@ -253,7 +253,7 @@ export function EvalInput({ if (el) descriptionOverlayRefs.current[metric.id] = el }} className={cn( - 'absolute inset-0 overflow-auto bg-transparent px-2 py-2 font-medium font-sans text-[var(--code-foreground)] text-sm', + 'absolute inset-0 overflow-auto bg-transparent px-2 py-2 font-sans text-[var(--code-foreground)] text-sm', !(isPreview || disabled) && 'pointer-events-none' )} > @@ -300,9 +300,9 @@ export function EvalInput({ autoComplete='off' data-form-type='other' name='eval-range-min' - className='text-transparent caret-foreground' + className='text-transparent caret-foreground [letter-spacing:inherit]' /> -
+
{formatDisplayText(String(metric.range.min ?? ''), { workflowSearchHighlight: getMetricSearchHighlight(index, ['range', 'min']), })} @@ -321,9 +321,9 @@ export function EvalInput({ autoComplete='off' data-form-type='other' name='eval-range-max' - className='text-transparent caret-foreground' + className='text-transparent caret-foreground [letter-spacing:inherit]' /> -
+
{formatDisplayText(String(metric.range.max ?? ''), { workflowSearchHighlight: getMetricSearchHighlight(index, ['range', 'max']), })} diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/filter-builder/components/filter-rule-row.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/filter-builder/components/filter-rule-row.tsx index b0f33f1dded..7a4545c0426 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/filter-builder/components/filter-rule-row.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/filter-builder/components/filter-rule-row.tsx @@ -114,7 +114,7 @@ export function FilterRuleRow({ }} >
- + {rule.collapsed && rule.column ? formatDisplayText(getColumnLabel(rule.column), { workflowSearchHighlight: getLabelHighlight('column', getColumnLabel(rule.column)), @@ -175,12 +175,12 @@ export function FilterRuleRow({ disabled={isReadOnly} autoComplete='off' placeholder='Enter value' - className='allow-scroll w-full overflow-auto text-transparent caret-foreground' + className='allow-scroll w-full overflow-auto text-transparent caret-foreground [letter-spacing:inherit]' />
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/grouped-checkbox-list/grouped-checkbox-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/grouped-checkbox-list/grouped-checkbox-list.tsx index 5d4b10ea038..3c3e9958381 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/grouped-checkbox-list/grouped-checkbox-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/grouped-checkbox-list/grouped-checkbox-list.tsx @@ -24,20 +24,12 @@ interface SelectedCountDisplayProps { function SelectedCountDisplay({ noneSelected, allSelected, count }: SelectedCountDisplayProps) { if (noneSelected) { - return ( - None selected - ) + return None selected } if (allSelected) { - return ( - All selected - ) + return All selected } - return ( - - {count} selected - - ) + return {count} selected } interface GroupedCheckboxListProps { @@ -130,7 +122,7 @@ export function GroupedCheckboxList({ disabled={disabled} onClick={() => setOpen(true)} className={cn( - 'flex w-full cursor-pointer items-center justify-between rounded-sm border border-[var(--border-1)] bg-[var(--surface-5)] px-2 py-1.5 font-medium font-sans text-[var(--text-primary)] text-sm outline-none focus:outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 dark:bg-[var(--surface-5)]', + 'flex w-full cursor-pointer items-center justify-between rounded-sm border border-[var(--border-1)] bg-[var(--surface-5)] px-2 py-1.5 font-sans text-[var(--text-primary)] text-sm outline-none focus:outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 dark:bg-[var(--surface-5)]', 'hover-hover:bg-[var(--surface-active)]' )} > @@ -168,7 +160,7 @@ export function GroupedCheckboxList({ /> diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx index 721e657cefc..b0b8583cce4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx @@ -132,7 +132,7 @@ export function InputMapping({ return (
-

No workflow selected

+

No workflow selected

Select a workflow above to configure inputs

@@ -274,7 +274,9 @@ function InputMappingField({ placeholder='Enter value or reference' disabled={disabled} autoComplete='off' - className={cn('allow-scroll w-full overflow-auto text-transparent caret-foreground')} + className={cn( + 'allow-scroll w-full overflow-auto text-transparent caret-foreground [letter-spacing:inherit]' + )} style={{ overflowX: 'auto' }} />
- + {formatDisplayText(labelOf(kb), { workflowSearchHighlight })} {!disabled && !isPreview && ( diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx index cb65b0094d9..1ab2223be92 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx @@ -219,7 +219,7 @@ export function KnowledgeTagFilters({ return (
- +
{appliedFilters > 0 ? `${appliedFilters} filter(s) applied` : 'No filters'}
@@ -243,7 +243,7 @@ export function KnowledgeTagFilters({ }} >
- + {filter.collapsed ? filter.tagName || `Filter ${index + 1}` : `Filter ${index + 1}`} {filter.collapsed && filter.tagName && ( @@ -329,14 +329,14 @@ export function KnowledgeTagFilters({ disabled={isReadOnly} autoComplete='off' placeholder={placeholder} - className='allow-scroll w-full overflow-auto text-transparent caret-foreground' + className='allow-scroll w-full overflow-auto text-transparent caret-foreground [letter-spacing:inherit]' />
{ if (el) overlayRefs.current[cellKey] = el }} className={cn( - 'absolute inset-0 flex items-center overflow-x-auto bg-transparent px-2 py-1.5 font-medium font-sans text-sm', + 'absolute inset-0 flex items-center overflow-x-auto bg-transparent px-2 py-1.5 font-sans text-sm', !isReadOnly && 'pointer-events-none' )} > diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx index 8317359e3a9..3c594cc1788 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx @@ -333,7 +333,7 @@ export function LongInput({