Add support for search aliases on subgraphs (#8608)

## Summary

- add commands for setting search aliases and description when in
subgraph
- in future we can add these fields to the dialog when publishing a
subgraph
- map workflow extra metadata on save/load from from/to subgraph node to
allow access via `canvas.subgraph.extra`

## Changes

**What**: 
- new core commands for Comfy.Subgraph.SetSearchAliases &
Comfy.Subgraph.SetDescription to be called when in a subgraph context
- update Publish command to allow command metadata arg for name
- update test executeCommand to allow passing metadata arg

## Review Focus

- When saving a subgraph, the outer workflow "wrapper" is created at the
point of publishing. So unlike a normal workflow `extra` property that
is available at any point, for a subgraph this is not accessible.
To workaround this, the `extra` property that exists on the inner
subgraph node is copied to the top level on save, and restored on load
so extra properties can be set via `canvas.subgraph.extra`.
- I have kept the existing naming format matching `BlueprintDescription`
for `BlueprintSearchAliases` but i'm not sure if the description was
ever used before

## Screenshots


https://github.com/user-attachments/assets/4d4df9c1-2281-4589-aa56-ab07cdecd353

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8608-Add-support-for-search-aliases-on-subgraphs-2fd6d73d365081d083caebd6befcacdd)
by [Unito](https://www.unito.io)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Set subgraph search aliases (comma-separated) and descriptions;
aliases enable discovery by alternative names.
  * Publish subgraphs using a provided name.
* Node definitions now support search aliases so nodes can be found by
alternate names.
  * UI strings added for entering descriptions and search aliases.

* **Tests**
* Added end-to-end and unit tests covering aliases, descriptions, search
behavior, publishing, and persistence.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
pythongosssss
2026-02-04 12:52:30 -08:00
committed by GitHub
parent b8287f6c2f
commit 6feb2022a4
12 changed files with 668 additions and 25 deletions

View File

@@ -171,8 +171,9 @@ export function useCoreCommands(): ComfyCommand[] {
icon: 'pi pi-save',
label: 'Publish Subgraph',
menubarLabel: 'Publish',
function: async () => {
await useSubgraphStore().publishSubgraph()
function: async (metadata?: Record<string, unknown>) => {
const name = metadata?.name as string | undefined
await useSubgraphStore().publishSubgraph(name)
}
},
{
@@ -1095,6 +1096,75 @@ export function useCoreCommands(): ComfyCommand[] {
)
}
},
{
id: 'Comfy.Subgraph.SetDescription',
icon: 'pi pi-pencil',
label: 'Set Subgraph Description',
versionAdded: '1.39.7',
function: async (metadata?: Record<string, unknown>) => {
const canvas = canvasStore.getCanvas()
const subgraph = canvas.subgraph
if (!subgraph) return
const extra = (subgraph.extra ??= {}) as Record<string, unknown>
const currentDescription = (extra.BlueprintDescription as string) ?? ''
let description: string | null | undefined
const rawDescription = metadata?.description
if (rawDescription != null) {
description =
typeof rawDescription === 'string'
? rawDescription
: String(rawDescription)
}
description ??= await dialogService.prompt({
title: t('g.description'),
message: t('subgraphStore.enterDescription'),
defaultValue: currentDescription
})
if (description === null) return
extra.BlueprintDescription = description.trim() || undefined
workflowStore.activeWorkflow?.changeTracker?.checkState()
}
},
{
id: 'Comfy.Subgraph.SetSearchAliases',
icon: 'pi pi-search',
label: 'Set Subgraph Search Aliases',
versionAdded: '1.39.7',
function: async (metadata?: Record<string, unknown>) => {
const canvas = canvasStore.getCanvas()
const subgraph = canvas.subgraph
if (!subgraph) return
const parseAliases = (value: unknown): string[] =>
(Array.isArray(value) ? value.map(String) : String(value).split(','))
.map((s) => s.trim())
.filter(Boolean)
const extra = (subgraph.extra ??= {}) as Record<string, unknown>
let aliases: string[]
const rawAliases = metadata?.aliases
if (rawAliases == null) {
const input = await dialogService.prompt({
title: t('subgraphStore.searchAliases'),
message: t('subgraphStore.enterSearchAliases'),
defaultValue: parseAliases(extra.BlueprintSearchAliases ?? '').join(
', '
)
})
if (input === null) return
aliases = parseAliases(input)
} else {
aliases = parseAliases(rawAliases)
}
extra.BlueprintSearchAliases = aliases.length > 0 ? aliases : undefined
workflowStore.activeWorkflow?.changeTracker?.checkState()
}
},
{
id: 'Comfy.Dev.ShowModelSelector',
icon: 'pi pi-box',