merge main into rh-test

This commit is contained in:
bymyself
2025-09-28 15:33:29 -07:00
parent 1c0f151d02
commit ff0c15b119
1317 changed files with 85439 additions and 18373 deletions

View File

@@ -1,9 +1,9 @@
import arc from '@/assets/palettes/arc.json'
import dark from '@/assets/palettes/dark.json'
import github from '@/assets/palettes/github.json'
import light from '@/assets/palettes/light.json'
import nord from '@/assets/palettes/nord.json'
import solarized from '@/assets/palettes/solarized.json'
import arc from '@/assets/palettes/arc.json' with { type: 'json' }
import dark from '@/assets/palettes/dark.json' with { type: 'json' }
import github from '@/assets/palettes/github.json' with { type: 'json' }
import light from '@/assets/palettes/light.json' with { type: 'json' }
import nord from '@/assets/palettes/nord.json' with { type: 'json' }
import solarized from '@/assets/palettes/solarized.json' with { type: 'json' }
import type {
ColorPalettes,
CompletedPalette

View File

@@ -122,14 +122,14 @@ export const CORE_KEYBINDINGS: Keybinding[] = [
key: '.'
},
commandId: 'Comfy.Canvas.FitView',
targetElementId: 'graph-canvas'
targetElementId: 'graph-canvas-container'
},
{
combo: {
key: 'p'
},
commandId: 'Comfy.Canvas.ToggleSelected.Pin',
targetElementId: 'graph-canvas'
targetElementId: 'graph-canvas-container'
},
{
combo: {
@@ -137,7 +137,7 @@ export const CORE_KEYBINDINGS: Keybinding[] = [
alt: true
},
commandId: 'Comfy.Canvas.ToggleSelectedNodes.Collapse',
targetElementId: 'graph-canvas'
targetElementId: 'graph-canvas-container'
},
{
combo: {
@@ -145,7 +145,7 @@ export const CORE_KEYBINDINGS: Keybinding[] = [
ctrl: true
},
commandId: 'Comfy.Canvas.ToggleSelectedNodes.Bypass',
targetElementId: 'graph-canvas'
targetElementId: 'graph-canvas-container'
},
{
combo: {
@@ -153,7 +153,7 @@ export const CORE_KEYBINDINGS: Keybinding[] = [
ctrl: true
},
commandId: 'Comfy.Canvas.ToggleSelectedNodes.Mute',
targetElementId: 'graph-canvas'
targetElementId: 'graph-canvas-container'
},
{
combo: {

View File

@@ -12,7 +12,18 @@ export const CORE_MENU_COMMANDS = [
]
],
[['Edit'], ['Comfy.Undo', 'Comfy.Redo']],
[['Edit'], ['Comfy.ClearWorkflow']],
[['Edit'], ['Comfy.OpenClipspace']],
[['Edit'], ['Comfy.RefreshNodeDefinitions']],
[
['Edit'],
[
'Comfy.RefreshNodeDefinitions',
'Comfy.Memory.UnloadModels',
'Comfy.Memory.UnloadModelsAndExecutionCache'
]
],
[['View'], []],
[
['Help'],
[
@@ -22,8 +33,5 @@ export const CORE_MENU_COMMANDS = [
'Comfy.Help.OpenComfyUIForum'
]
],
[
['Help'],
['Comfy.Help.AboutComfyUI', 'Comfy.Feedback', 'Comfy.ContactSupport']
]
[['Help'], ['Comfy.Help.AboutComfyUI', 'Comfy.ContactSupport']]
]

View File

@@ -1,932 +0,0 @@
import { LinkMarkerShape, LiteGraph } from '@/lib/litegraph/src/litegraph'
import type { ColorPalettes } from '@/schemas/colorPaletteSchema'
import type { Keybinding } from '@/schemas/keyBindingSchema'
import { NodeBadgeMode } from '@/types/nodeSource'
import { LinkReleaseTriggerAction } from '@/types/searchBoxTypes'
import type { SettingParams } from '@/types/settingTypes'
/**
* Core settings are essential configuration parameters required for ComfyUI's basic functionality.
* These settings must be present in the settings store and cannot be omitted.
*
* IMPORTANT: To prevent ID conflicts, settings should be marked as deprecated rather than removed
* when they are no longer needed.
*/
export const CORE_SETTINGS: SettingParams[] = [
{
id: 'Comfy.Validation.Workflows',
name: 'Validate workflows',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.NodeSearchBoxImpl',
category: ['Comfy', 'Node Search Box', 'Implementation'],
experimental: true,
name: 'Node search box implementation',
type: 'combo',
options: ['default', 'litegraph (legacy)'],
defaultValue: 'default'
},
{
id: 'Comfy.LinkRelease.Action',
category: ['LiteGraph', 'LinkRelease', 'Action'],
name: 'Action on link release (No modifier)',
type: 'combo',
options: Object.values(LinkReleaseTriggerAction),
defaultValue: LinkReleaseTriggerAction.CONTEXT_MENU,
defaultsByInstallVersion: {
'1.24.1': LinkReleaseTriggerAction.SEARCH_BOX
}
},
{
id: 'Comfy.LinkRelease.ActionShift',
category: ['LiteGraph', 'LinkRelease', 'ActionShift'],
name: 'Action on link release (Shift)',
type: 'combo',
options: Object.values(LinkReleaseTriggerAction),
defaultValue: LinkReleaseTriggerAction.SEARCH_BOX,
defaultsByInstallVersion: {
'1.24.1': LinkReleaseTriggerAction.CONTEXT_MENU
}
},
{
id: 'Comfy.NodeSearchBoxImpl.NodePreview',
category: ['Comfy', 'Node Search Box', 'NodePreview'],
name: 'Node preview',
tooltip: 'Only applies to the default implementation',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.NodeSearchBoxImpl.ShowCategory',
category: ['Comfy', 'Node Search Box', 'ShowCategory'],
name: 'Show node category in search results',
tooltip: 'Only applies to the default implementation',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.NodeSearchBoxImpl.ShowIdName',
category: ['Comfy', 'Node Search Box', 'ShowIdName'],
name: 'Show node id name in search results',
tooltip: 'Only applies to the default implementation',
type: 'boolean',
defaultValue: false
},
{
id: 'Comfy.NodeSearchBoxImpl.ShowNodeFrequency',
category: ['Comfy', 'Node Search Box', 'ShowNodeFrequency'],
name: 'Show node frequency in search results',
tooltip: 'Only applies to the default implementation',
type: 'boolean',
defaultValue: false
},
{
id: 'Comfy.Sidebar.Location',
category: ['Appearance', 'Sidebar', 'Location'],
name: 'Sidebar location',
type: 'combo',
options: ['left', 'right'],
defaultValue: 'left'
},
{
id: 'Comfy.Sidebar.Size',
category: ['Appearance', 'Sidebar', 'Size'],
name: 'Sidebar size',
type: 'combo',
options: ['normal', 'small'],
// Default to small if the window is less than 1536px(2xl) wide.
defaultValue: () => (window.innerWidth < 1536 ? 'small' : 'normal')
},
{
id: 'Comfy.Sidebar.UnifiedWidth',
category: ['Appearance', 'Sidebar', 'UnifiedWidth'],
name: 'Unified sidebar width',
type: 'boolean',
defaultValue: true,
versionAdded: '1.18.1'
},
{
id: 'Comfy.TextareaWidget.FontSize',
category: ['Appearance', 'Node Widget', 'TextareaWidget', 'FontSize'],
name: 'Textarea widget font size',
type: 'slider',
defaultValue: 10,
attrs: {
min: 8,
max: 24
}
},
{
id: 'Comfy.TextareaWidget.Spellcheck',
category: ['Comfy', 'Node Widget', 'TextareaWidget', 'Spellcheck'],
name: 'Textarea widget spellcheck',
type: 'boolean',
defaultValue: false
},
{
id: 'Comfy.Workflow.SortNodeIdOnSave',
name: 'Sort node IDs when saving workflow',
type: 'boolean',
defaultValue: false
},
{
id: 'Comfy.Graph.CanvasInfo',
category: ['LiteGraph', 'Canvas', 'CanvasInfo'],
name: 'Show canvas info on bottom left corner (fps, etc.)',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.Node.ShowDeprecated',
name: 'Show deprecated nodes in search',
tooltip:
'Deprecated nodes are hidden by default in the UI, but remain functional in existing workflows that use them.',
type: 'boolean',
defaultValue: false
},
{
id: 'Comfy.Node.ShowExperimental',
name: 'Show experimental nodes in search',
tooltip:
'Experimental nodes are marked as such in the UI and may be subject to significant changes or removal in future versions. Use with caution in production workflows',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.Node.Opacity',
category: ['Appearance', 'Node', 'Opacity'],
name: 'Node opacity',
type: 'slider',
defaultValue: 1,
attrs: {
min: 0.01,
max: 1,
step: 0.01
}
},
{
id: 'Comfy.Workflow.ShowMissingNodesWarning',
name: 'Show missing nodes warning',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.Workflow.ShowMissingModelsWarning',
name: 'Show missing models warning',
type: 'boolean',
defaultValue: true,
experimental: true
},
{
id: 'Comfy.Graph.ZoomSpeed',
category: ['LiteGraph', 'Canvas', 'ZoomSpeed'],
name: 'Canvas zoom speed',
type: 'slider',
defaultValue: 1.1,
attrs: {
min: 1.01,
max: 2.5,
step: 0.01
}
},
// Bookmarks are stored in the settings store.
// Bookmarks are in format of category/display_name. e.g. "conditioning/CLIPTextEncode"
{
id: 'Comfy.NodeLibrary.Bookmarks',
name: 'Node library bookmarks with display name (deprecated)',
type: 'hidden',
defaultValue: [],
deprecated: true
},
{
id: 'Comfy.NodeLibrary.Bookmarks.V2',
name: 'Node library bookmarks v2 with unique name',
type: 'hidden',
defaultValue: []
},
// Stores mapping from bookmark folder name to its customization.
{
id: 'Comfy.NodeLibrary.BookmarksCustomization',
name: 'Node library bookmarks customization',
type: 'hidden',
defaultValue: {}
},
// Hidden setting used by the queue for how to fit images
{
id: 'Comfy.Queue.ImageFit',
name: 'Queue image fit',
type: 'hidden',
defaultValue: 'cover'
},
{
id: 'Comfy.GroupSelectedNodes.Padding',
category: ['LiteGraph', 'Group', 'Padding'],
name: 'Group selected nodes padding',
type: 'slider',
defaultValue: 10,
attrs: {
min: 0,
max: 100
}
},
{
id: 'Comfy.Node.DoubleClickTitleToEdit',
category: ['LiteGraph', 'Node', 'DoubleClickTitleToEdit'],
name: 'Double click node title to edit',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.Node.AllowImageSizeDraw',
category: ['LiteGraph', 'Node Widget', 'AllowImageSizeDraw'],
name: 'Show width × height below the image preview',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.Group.DoubleClickTitleToEdit',
category: ['LiteGraph', 'Group', 'DoubleClickTitleToEdit'],
name: 'Double click group title to edit',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.Window.UnloadConfirmation',
name: 'Show confirmation when closing window',
type: 'boolean',
defaultValue: true,
versionModified: '1.7.12'
},
{
id: 'Comfy.TreeExplorer.ItemPadding',
category: ['Appearance', 'Tree Explorer', 'ItemPadding'],
name: 'Tree explorer item padding',
type: 'slider',
defaultValue: 2,
attrs: {
min: 0,
max: 8,
step: 1
}
},
{
id: 'Comfy.ModelLibrary.AutoLoadAll',
name: 'Automatically load all model folders',
tooltip:
'If true, all folders will load as soon as you open the model library (this may cause delays while it loads). If false, root level model folders will only load once you click on them.',
type: 'boolean',
defaultValue: false
},
{
id: 'Comfy.ModelLibrary.NameFormat',
name: 'What name to display in the model library tree view',
tooltip:
'Select "filename" to render a simplified view of the raw filename (without directory or ".safetensors" extension) in the model list. Select "title" to display the configurable model metadata title.',
type: 'combo',
options: ['filename', 'title'],
defaultValue: 'title'
},
{
id: 'Comfy.Locale',
name: 'Language',
type: 'combo',
options: [
{ value: 'en', text: 'English' },
{ value: 'zh', text: '中文' },
{ value: 'zh-TW', text: '繁體中文' },
{ value: 'ru', text: 'Русский' },
{ value: 'ja', text: '日本語' },
{ value: 'ko', text: '한국어' },
{ value: 'fr', text: 'Français' },
{ value: 'es', text: 'Español' },
{ value: 'ar', text: 'عربي' }
],
defaultValue: () => navigator.language.split('-')[0] || 'en'
},
{
id: 'Comfy.NodeBadge.NodeSourceBadgeMode',
category: ['LiteGraph', 'Node', 'NodeSourceBadgeMode'],
name: 'Node source badge mode',
type: 'combo',
options: Object.values(NodeBadgeMode),
defaultValue: NodeBadgeMode.HideBuiltIn
},
{
id: 'Comfy.NodeBadge.NodeIdBadgeMode',
category: ['LiteGraph', 'Node', 'NodeIdBadgeMode'],
name: 'Node ID badge mode',
type: 'combo',
options: [NodeBadgeMode.None, NodeBadgeMode.ShowAll],
defaultValue: NodeBadgeMode.None
},
{
id: 'Comfy.NodeBadge.NodeLifeCycleBadgeMode',
category: ['LiteGraph', 'Node', 'NodeLifeCycleBadgeMode'],
name: 'Node life cycle badge mode',
type: 'combo',
options: [NodeBadgeMode.None, NodeBadgeMode.ShowAll],
defaultValue: NodeBadgeMode.ShowAll
},
{
id: 'Comfy.NodeBadge.ShowApiPricing',
category: ['Comfy', 'API Nodes'],
name: 'Show API node pricing badge',
type: 'boolean',
defaultValue: true,
versionAdded: '1.20.3'
},
{
id: 'Comfy.Notification.ShowVersionUpdates',
category: ['Comfy', 'Notification Preferences'],
name: 'Show version updates',
tooltip: 'Show updates for new models, and major new features.',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.ConfirmClear',
category: ['Comfy', 'Workflow', 'ConfirmClear'],
name: 'Require confirmation when clearing workflow',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.PromptFilename',
category: ['Comfy', 'Workflow', 'PromptFilename'],
name: 'Prompt for filename when saving workflow',
type: 'boolean',
defaultValue: true
},
/**
* file format for preview
*
* format;quality
*
* ex)
* webp;50 -> webp, quality 50
* jpeg;80 -> rgb, jpeg, quality 80
*
* @type {string}
*/
{
id: 'Comfy.PreviewFormat',
category: ['LiteGraph', 'Node Widget', 'PreviewFormat'],
name: 'Preview image format',
tooltip:
'When displaying a preview in the image widget, convert it to a lightweight image, e.g. webp, jpeg, webp;50, etc.',
type: 'text',
defaultValue: ''
},
{
id: 'Comfy.DisableSliders',
category: ['LiteGraph', 'Node Widget', 'DisableSliders'],
name: 'Disable node widget sliders',
type: 'boolean',
defaultValue: false
},
{
id: 'Comfy.DisableFloatRounding',
category: ['LiteGraph', 'Node Widget', 'DisableFloatRounding'],
name: 'Disable default float widget rounding.',
tooltip:
'(requires page reload) Cannot disable round when round is set by the node in the backend.',
type: 'boolean',
defaultValue: false
},
{
id: 'Comfy.FloatRoundingPrecision',
category: ['LiteGraph', 'Node Widget', 'FloatRoundingPrecision'],
name: 'Float widget rounding decimal places [0 = auto].',
tooltip: '(requires page reload)',
type: 'slider',
attrs: {
min: 0,
max: 6,
step: 1
},
defaultValue: 0
},
{
id: 'LiteGraph.Node.TooltipDelay',
name: 'Tooltip Delay',
type: 'number',
attrs: {
min: 100,
max: 3000,
step: 50
},
defaultValue: 500,
versionAdded: '1.9.0'
},
{
id: 'Comfy.EnableTooltips',
category: ['LiteGraph', 'Node', 'EnableTooltips'],
name: 'Enable Tooltips',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.DevMode',
name: 'Enable dev mode options (API save, etc.)',
type: 'boolean',
defaultValue: false,
onChange: (value) => {
const element = document.getElementById('comfy-dev-save-api-button')
if (element) {
element.style.display = value ? 'flex' : 'none'
}
}
},
{
id: 'Comfy.UseNewMenu',
category: ['Comfy', 'Menu', 'UseNewMenu'],
defaultValue: 'Top',
name: 'Use new menu',
type: 'combo',
options: ['Disabled', 'Top', 'Bottom'],
tooltip:
'Menu bar position. On mobile devices, the menu is always shown at the top.',
migrateDeprecatedValue: (value: string) => {
// Floating is now supported by dragging the docked actionbar off.
if (value === 'Floating') {
return 'Top'
}
return value
}
},
{
id: 'Comfy.Workflow.WorkflowTabsPosition',
name: 'Opened workflows position',
type: 'combo',
options: ['Sidebar', 'Topbar', 'Topbar (2nd-row)'],
// Default to topbar (2nd-row) if the window is less than 1536px(2xl) wide.
defaultValue: () =>
window.innerWidth < 1536 ? 'Topbar (2nd-row)' : 'Topbar'
},
{
id: 'Comfy.Graph.CanvasMenu',
category: ['LiteGraph', 'Canvas', 'CanvasMenu'],
name: 'Show graph canvas menu',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.QueueButton.BatchCountLimit',
name: 'Batch count limit',
tooltip:
'The maximum number of tasks added to the queue at one button click',
type: 'number',
defaultValue: 100,
versionAdded: '1.3.5'
},
{
id: 'Comfy.Keybinding.UnsetBindings',
name: 'Keybindings unset by the user',
type: 'hidden',
defaultValue: [] as Keybinding[],
versionAdded: '1.3.7',
versionModified: '1.7.3',
migrateDeprecatedValue: (value: any[]) => {
return value.map((keybinding) => {
if (keybinding['targetSelector'] === '#graph-canvas') {
keybinding['targetElementId'] = 'graph-canvas'
}
return keybinding
})
}
},
{
id: 'Comfy.Keybinding.NewBindings',
name: 'Keybindings set by the user',
type: 'hidden',
defaultValue: [] as Keybinding[],
versionAdded: '1.3.7'
},
{
id: 'Comfy.Extension.Disabled',
name: 'Disabled extension names',
type: 'hidden',
defaultValue: [] as string[],
versionAdded: '1.3.11'
},
{
id: 'Comfy.LinkRenderMode',
category: ['LiteGraph', 'Graph', 'LinkRenderMode'],
name: 'Link Render Mode',
defaultValue: 2,
type: 'combo',
options: [
{ value: LiteGraph.STRAIGHT_LINK, text: 'Straight' },
{ value: LiteGraph.LINEAR_LINK, text: 'Linear' },
{ value: LiteGraph.SPLINE_LINK, text: 'Spline' },
{ value: LiteGraph.HIDDEN_LINK, text: 'Hidden' }
]
},
{
id: 'Comfy.Node.AutoSnapLinkToSlot',
category: ['LiteGraph', 'Node', 'AutoSnapLinkToSlot'],
name: 'Auto snap link to node slot',
tooltip:
'When dragging a link over a node, the link automatically snap to a viable input slot on the node',
type: 'boolean',
defaultValue: true,
versionAdded: '1.3.29'
},
{
id: 'Comfy.Node.SnapHighlightsNode',
category: ['LiteGraph', 'Node', 'SnapHighlightsNode'],
name: 'Snap highlights node',
tooltip:
'When dragging a link over a node with viable input slot, highlight the node',
type: 'boolean',
defaultValue: true,
versionAdded: '1.3.29'
},
{
id: 'Comfy.Node.BypassAllLinksOnDelete',
category: ['LiteGraph', 'Node', 'BypassAllLinksOnDelete'],
name: 'Keep all links when deleting nodes',
tooltip:
'When deleting a node, attempt to reconnect all of its input and output links (bypassing the deleted node)',
type: 'boolean',
defaultValue: true,
versionAdded: '1.3.40'
},
{
id: 'Comfy.Node.MiddleClickRerouteNode',
category: ['LiteGraph', 'Node', 'MiddleClickRerouteNode'],
name: 'Middle-click creates a new Reroute node',
type: 'boolean',
defaultValue: true,
versionAdded: '1.3.42'
},
{
id: 'Comfy.Graph.LinkMarkers',
category: ['LiteGraph', 'Link', 'LinkMarkers'],
name: 'Link midpoint markers',
defaultValue: LinkMarkerShape.Circle,
type: 'combo',
options: [
{ value: LinkMarkerShape.None, text: 'None' },
{ value: LinkMarkerShape.Circle, text: 'Circle' },
{ value: LinkMarkerShape.Arrow, text: 'Arrow' }
],
versionAdded: '1.3.42'
},
{
id: 'Comfy.DOMClippingEnabled',
category: ['LiteGraph', 'Node', 'DOMClippingEnabled'],
name: 'Enable DOM element clipping (enabling may reduce performance)',
type: 'boolean',
defaultValue: true
},
{
id: 'Comfy.Graph.CtrlShiftZoom',
category: ['LiteGraph', 'Canvas', 'CtrlShiftZoom'],
name: 'Enable fast-zoom shortcut (Ctrl + Shift + Drag)',
type: 'boolean',
defaultValue: true,
versionAdded: '1.4.0'
},
{
id: 'Comfy.Pointer.ClickDrift',
category: ['LiteGraph', 'Pointer', 'ClickDrift'],
name: 'Pointer click drift (maximum distance)',
tooltip:
'If the pointer moves more than this distance while holding a button down, it is considered dragging (rather than clicking).\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking.',
experimental: true,
type: 'slider',
attrs: {
min: 0,
max: 20,
step: 1
},
defaultValue: 6,
versionAdded: '1.4.3'
},
{
id: 'Comfy.Pointer.ClickBufferTime',
category: ['LiteGraph', 'Pointer', 'ClickBufferTime'],
name: 'Pointer click drift delay',
tooltip:
'After pressing a pointer button down, this is the maximum time (in milliseconds) that pointer movement can be ignored for.\n\nHelps prevent objects from being unintentionally nudged if the pointer is moved whilst clicking.',
experimental: true,
type: 'slider',
attrs: {
min: 0,
max: 1000,
step: 25
},
defaultValue: 150,
versionAdded: '1.4.3'
},
{
id: 'Comfy.Pointer.DoubleClickTime',
category: ['LiteGraph', 'Pointer', 'DoubleClickTime'],
name: 'Double click interval (maximum)',
tooltip:
'The maximum time in milliseconds between the two clicks of a double-click. Increasing this value may assist if double-clicks are sometimes not registered.',
type: 'slider',
attrs: {
min: 100,
max: 1000,
step: 50
},
defaultValue: 300,
versionAdded: '1.4.3'
},
{
id: 'Comfy.SnapToGrid.GridSize',
category: ['LiteGraph', 'Canvas', 'GridSize'],
name: 'Snap to grid size',
type: 'slider',
attrs: {
min: 1,
max: 500
},
tooltip:
'When dragging and resizing nodes while holding shift they will be aligned to the grid, this controls the size of that grid.',
defaultValue: LiteGraph.CANVAS_GRID_SIZE
},
// Keep the 'pysssss.SnapToGrid' setting id so we don't need to migrate setting values.
// Using a new setting id can cause existing users to lose their existing settings.
{
id: 'pysssss.SnapToGrid',
category: ['LiteGraph', 'Canvas', 'AlwaysSnapToGrid'],
name: 'Always snap to grid',
type: 'boolean',
defaultValue: false,
versionAdded: '1.3.13'
},
{
id: 'Comfy.Server.ServerConfigValues',
name: 'Server config values for frontend display',
tooltip: 'Server config values used for frontend display only',
type: 'hidden',
// Mapping from server config id to value.
defaultValue: {} as Record<string, any>,
versionAdded: '1.4.8'
},
{
id: 'Comfy.Server.LaunchArgs',
name: 'Server launch arguments',
tooltip:
'These are the actual arguments that are passed to the server when it is launched.',
type: 'hidden',
defaultValue: {} as Record<string, string>,
versionAdded: '1.4.8'
},
{
id: 'Comfy.Queue.MaxHistoryItems',
name: 'Queue history size',
tooltip: 'The maximum number of tasks that show in the queue history.',
type: 'slider',
attrs: {
min: 2,
max: 256,
step: 2
},
defaultValue: 64,
versionAdded: '1.4.12'
},
{
id: 'LiteGraph.Canvas.MaximumFps',
name: 'Maximum FPS',
tooltip:
'The maximum frames per second that the canvas is allowed to render. Caps GPU usage at the cost of smoothness. If 0, the screen refresh rate is used. Default: 0',
type: 'slider',
attrs: {
min: 0,
max: 120
},
defaultValue: 0,
versionAdded: '1.5.1'
},
{
id: 'Comfy.EnableWorkflowViewRestore',
category: ['Comfy', 'Workflow', 'EnableWorkflowViewRestore'],
name: 'Save and restore canvas position and zoom level in workflows',
type: 'boolean',
defaultValue: true,
versionModified: '1.5.4'
},
{
id: 'Comfy.Workflow.ConfirmDelete',
name: 'Show confirmation when deleting workflows',
type: 'boolean',
defaultValue: true,
versionAdded: '1.5.6'
},
{
id: 'Comfy.ColorPalette',
name: 'The active color palette id',
type: 'hidden',
defaultValue: 'dark',
versionModified: '1.6.7',
migrateDeprecatedValue(value: string) {
// Legacy custom palettes were prefixed with 'custom_'
return value.startsWith('custom_') ? value.replace('custom_', '') : value
}
},
{
id: 'Comfy.CustomColorPalettes',
name: 'Custom color palettes',
type: 'hidden',
defaultValue: {} as ColorPalettes,
versionModified: '1.6.7'
},
{
id: 'Comfy.WidgetControlMode',
category: ['Comfy', 'Node Widget', 'WidgetControlMode'],
name: 'Widget control mode',
tooltip:
'Controls when widget values are updated (randomize/increment/decrement), either before the prompt is queued or after.',
type: 'combo',
defaultValue: 'after',
options: ['before', 'after'],
versionModified: '1.6.10'
},
{
id: 'Comfy.TutorialCompleted',
name: 'Tutorial completed',
type: 'hidden',
defaultValue: false,
versionAdded: '1.8.7'
},
{
id: 'Comfy.InstalledVersion',
name: 'The frontend version that was running when the user first installed ComfyUI',
type: 'hidden',
defaultValue: null,
versionAdded: '1.24.0'
},
{
id: 'LiteGraph.ContextMenu.Scaling',
name: 'Scale node combo widget menus (lists) when zoomed in',
defaultValue: false,
type: 'boolean',
versionAdded: '1.8.8'
},
{
id: 'LiteGraph.Canvas.LowQualityRenderingZoomThreshold',
name: 'Low quality rendering zoom threshold',
tooltip:
'Zoom level threshold for performance mode. Lower values (0.1) = quality at all zoom levels. Higher values (1.0) = performance mode even when zoomed in. Performance mode simplifies rendering by hiding text labels, shadows, and details.',
type: 'slider',
attrs: {
min: 0.1,
max: 1,
step: 0.01
},
defaultValue: 0.6,
versionAdded: '1.9.1'
},
{
id: 'Comfy.Canvas.NavigationMode',
category: ['LiteGraph', 'Canvas', 'CanvasNavigationMode'],
name: 'Canvas Navigation Mode',
defaultValue: 'legacy',
type: 'combo',
options: [
{ value: 'standard', text: 'Standard (New)' },
{ value: 'legacy', text: 'Drag Navigation' }
],
versionAdded: '1.25.0',
defaultsByInstallVersion: {
'1.25.0': 'legacy'
}
},
{
id: 'Comfy.Canvas.SelectionToolbox',
category: ['LiteGraph', 'Canvas', 'SelectionToolbox'],
name: 'Show selection toolbox',
type: 'boolean',
defaultValue: true,
versionAdded: '1.10.5'
},
{
id: 'LiteGraph.Reroute.SplineOffset',
name: 'Reroute spline offset',
tooltip: 'The bezier control point offset from the reroute centre point',
type: 'slider',
defaultValue: 20,
attrs: {
min: 0,
max: 400
},
versionAdded: '1.15.7'
},
{
id: 'Comfy.Toast.DisableReconnectingToast',
name: 'Disable toasts when reconnecting or reconnected',
type: 'hidden',
defaultValue: false,
versionAdded: '1.15.12'
},
{
id: 'Comfy.Minimap.Visible',
name: 'Display minimap on canvas',
type: 'hidden',
defaultValue: true,
versionAdded: '1.25.0'
},
{
id: 'Comfy.Minimap.NodeColors',
name: 'Display node with its original color on minimap',
type: 'hidden',
defaultValue: false,
versionAdded: '1.26.0'
},
{
id: 'Comfy.Minimap.ShowLinks',
name: 'Display links on minimap',
type: 'hidden',
defaultValue: true,
versionAdded: '1.26.0'
},
{
id: 'Comfy.Minimap.ShowGroups',
name: 'Display node groups on minimap',
type: 'hidden',
defaultValue: true,
versionAdded: '1.26.0'
},
{
id: 'Comfy.Minimap.RenderBypassState',
name: 'Render bypass state on minimap',
type: 'hidden',
defaultValue: true,
versionAdded: '1.26.0'
},
{
id: 'Comfy.Minimap.RenderErrorState',
name: 'Render error state on minimap',
type: 'hidden',
defaultValue: true,
versionAdded: '1.26.0'
},
{
id: 'Comfy.Workflow.AutoSaveDelay',
name: 'Auto Save Delay (ms)',
defaultValue: 1000,
type: 'number',
tooltip: 'Only applies if Auto Save is set to "after delay".',
versionAdded: '1.16.0'
},
{
id: 'Comfy.Workflow.AutoSave',
name: 'Auto Save',
type: 'combo',
options: ['off', 'after delay'], // Room for other options like on focus change, tab change, window change
defaultValue: 'off', // Popular requst by users (https://github.com/Comfy-Org/ComfyUI_frontend/issues/1584#issuecomment-2536610154)
versionAdded: '1.16.0'
},
{
id: 'Comfy.Workflow.Persist',
name: 'Persist workflow state and restore on page (re)load',
type: 'boolean',
defaultValue: true,
versionAdded: '1.16.1'
},
{
id: 'LiteGraph.Node.DefaultPadding',
name: 'Always shrink new nodes',
tooltip:
'Resize nodes to the smallest possible size when created. When disabled, a newly added node will be widened slightly to show widget values.',
type: 'boolean',
defaultValue: false,
versionAdded: '1.18.0'
},
{
id: 'Comfy.Canvas.BackgroundImage',
category: ['Appearance', 'Canvas', 'Background'],
name: 'Canvas background image',
type: 'backgroundImage',
tooltip:
'Image URL for the canvas background. You can right-click an image in the outputs panel and select "Set as Background" to use it, or upload your own image using the upload button.',
defaultValue: '',
versionAdded: '1.20.4',
versionModified: '1.20.5'
},
// Release data stored in settings
{
id: 'Comfy.Release.Version',
name: 'Last seen release version',
type: 'hidden',
defaultValue: ''
},
{
id: 'Comfy.Release.Status',
name: 'Release status',
type: 'hidden',
defaultValue: 'skipped'
},
{
id: 'Comfy.Release.Timestamp',
name: 'Release seen timestamp',
type: 'hidden',
defaultValue: 0
}
]

View File

@@ -0,0 +1,75 @@
export interface DialogAction {
readonly label: string
readonly action: 'openUrl' | 'close' | 'cancel'
readonly url?: string
readonly severity?: 'danger' | 'primary' | 'secondary' | 'warn'
readonly returnValue: string
}
interface DesktopDialog {
readonly title: string
readonly message: string
readonly buttons: DialogAction[]
}
export const DESKTOP_DIALOGS = {
/** Shown when a corrupt venv is detected. */
reinstallVenv: {
title: 'Reinstall ComfyUI (Fresh Start)?',
message: `Sorry, we can't launch ComfyUI because some installed packages aren't compatible.
Click Reinstall to restore ComfyUI and get back up and running.
Please note: if you've added custom nodes, you'll need to reinstall them after this process.`,
buttons: [
{
label: 'Learn More',
action: 'openUrl',
url: 'https://docs.comfy.org',
returnValue: 'openDocs'
},
{
label: 'Reinstall',
action: 'close',
severity: 'danger',
returnValue: 'resetVenv'
}
]
},
/** A dialog that is shown when an invalid dialog ID is provided. */
invalidDialog: {
title: 'Invalid Dialog',
message: `Invalid dialog ID was provided.`,
buttons: [
{
label: 'Close',
action: 'cancel',
returnValue: 'cancel'
}
]
}
} as const satisfies { [K: string]: DesktopDialog }
/** The ID of a desktop dialog. */
type DesktopDialogId = keyof typeof DESKTOP_DIALOGS
/**
* Checks if {@link id} is a valid dialog ID.
* @param id The string to check
* @returns `true` if the ID is a valid dialog ID, otherwise `false`
*/
function isDialogId(id: unknown): id is DesktopDialogId {
return typeof id === 'string' && id in DESKTOP_DIALOGS
}
/**
* Gets the dialog with the given ID.
* @param dialogId The ID of the dialog to get
* @returns The dialog with the given ID
*/
export function getDialog(
dialogId: string | string[]
): DesktopDialog & { id: DesktopDialogId } {
const id = isDialogId(dialogId) ? dialogId : 'invalidDialog'
return { id, ...structuredClone(DESKTOP_DIALOGS[id]) }
}

View File

@@ -1,5 +1,5 @@
import type { FormItem } from '@/platform/settings/types'
import {
AutoLaunch,
CrossAttentionMethod,
CudaMalloc,
FloatingPointPrecision,
@@ -8,7 +8,6 @@ import {
LogLevel,
VramManagement
} from '@/types/serverArgs'
import { FormItem } from '@/types/settingTypes'
export type ServerConfigValue = string | number | true | null | undefined
@@ -20,32 +19,6 @@ export interface ServerConfig<T> extends FormItem {
getValue?: (value: T) => Record<string, ServerConfigValue>
}
export const WEB_ONLY_CONFIG_ITEMS: ServerConfig<any>[] = [
// Launch behavior
{
id: 'auto-launch',
name: 'Automatically opens in the browser on startup',
category: ['Launch'],
type: 'combo',
options: Object.values(AutoLaunch),
defaultValue: AutoLaunch.Auto,
getValue: (value: AutoLaunch) => {
switch (value) {
case AutoLaunch.Auto:
return {}
case AutoLaunch.Enable:
return {
['auto-launch']: true
}
case AutoLaunch.Disable:
return {
['disable-auto-launch']: true
}
}
}
}
]
export const SERVER_CONFIG_ITEMS: ServerConfig<any>[] = [
// Network settings
{

View File

@@ -0,0 +1,30 @@
/**
* Default colors for node slot types
* Mirrors LiteGraph's slot_default_color_by_type
*/
const SLOT_TYPE_COLORS: Record<string, string> = {
number: '#AAD',
string: '#DCA',
boolean: '#DAA',
vec2: '#ADA',
vec3: '#ADA',
vec4: '#ADA',
color: '#DDA',
image: '#353',
latent: '#858',
conditioning: '#FFA',
control_net: '#F8F',
clip: '#FFD',
vae: '#F82',
model: '#B98',
'*': '#AAA' // Default color
}
/**
* Get the color for a slot type
*/
export function getSlotColor(type?: string | number | null): string {
if (!type) return SLOT_TYPE_COLORS['*']
const typeStr = String(type).toLowerCase()
return SLOT_TYPE_COLORS[typeStr] || SLOT_TYPE_COLORS['*']
}

View File

@@ -1,72 +0,0 @@
/**
* Supported workflow file formats organized by type category
*/
/**
* All supported image formats that can contain workflow data
*/
export const IMAGE_WORKFLOW_FORMATS = {
extensions: ['.png', '.webp', '.svg', '.avif'],
mimeTypes: ['image/png', 'image/webp', 'image/svg+xml', 'image/avif']
}
/**
* All supported audio formats that can contain workflow data
*/
export const AUDIO_WORKFLOW_FORMATS = {
extensions: ['.mp3', '.ogg', '.flac'],
mimeTypes: ['audio/mpeg', 'audio/ogg', 'audio/flac', 'audio/x-flac']
}
/**
* All supported video formats that can contain workflow data
*/
export const VIDEO_WORKFLOW_FORMATS = {
extensions: ['.mp4', '.mov', '.m4v', '.webm'],
mimeTypes: ['video/mp4', 'video/quicktime', 'video/x-m4v', 'video/webm']
}
/**
* All supported 3D model formats that can contain workflow data
*/
export const MODEL_WORKFLOW_FORMATS = {
extensions: ['.glb'],
mimeTypes: ['model/gltf-binary']
}
/**
* All supported data formats that directly contain workflow data
*/
export const DATA_WORKFLOW_FORMATS = {
extensions: ['.json', '.latent', '.safetensors'],
mimeTypes: ['application/json']
}
/**
* Combines all supported formats into a single object
*/
export const ALL_WORKFLOW_FORMATS = {
extensions: [
...IMAGE_WORKFLOW_FORMATS.extensions,
...AUDIO_WORKFLOW_FORMATS.extensions,
...VIDEO_WORKFLOW_FORMATS.extensions,
...MODEL_WORKFLOW_FORMATS.extensions,
...DATA_WORKFLOW_FORMATS.extensions
],
mimeTypes: [
...IMAGE_WORKFLOW_FORMATS.mimeTypes,
...AUDIO_WORKFLOW_FORMATS.mimeTypes,
...VIDEO_WORKFLOW_FORMATS.mimeTypes,
...MODEL_WORKFLOW_FORMATS.mimeTypes,
...DATA_WORKFLOW_FORMATS.mimeTypes
]
}
/**
* Generate a comma-separated accept string for file inputs
* Combines all extensions and mime types
*/
export const WORKFLOW_ACCEPT_STRING = [
...ALL_WORKFLOW_FORMATS.extensions,
...ALL_WORKFLOW_FORMATS.mimeTypes
].join(',')