ComfyUI_frontend icon indicating copy to clipboard operation
ComfyUI_frontend copied to clipboard

Add support for growable inputs

Open AustinMroz opened this issue 2 months ago β€’ 5 comments

autogrow-optional_00002

Also fixes connections to widget inputs created by a dynamic combo breaking on reload.

Performs some refactoring to group the prior dynamic inputs code.

See also, the overarching frontend PR: comfyanonymous/ComfyUI#10832

┆Issue is synchronized with this Notion page by Unito

AustinMroz avatar Nov 22 '25 21:11 AustinMroz

πŸ“ Walkthrough

Walkthrough

Moves match-type and autogrow dynamic-input logic into a centralized dynamicWidgets module, adding applyDynamicInputs and handlers (match-type, autogrow), type-management helpers, schema changes for autogrow, service integration to skip default socket creation when handled, LGraphNode field addition, removal of spliceInputs, and updated tests for autogrow.

Changes

Cohort / File(s) Summary
Core dynamic widgets enhancement
src/core/graph/widgets/dynamicWidgets.ts
Adds applyDynamicInputs dispatcher and dynamicInputs map; implements applyMatchType, applyAutogrow, changeOutputType, combineTypes, intersection, isStrings; rewrites dynamicComboWidget/autogrow behavior for inserting/removing/relinking inputs, preserving connections, and propagating types.
Extension removal
src/extensions/core/index.ts, src/extensions/core/matchType.ts
Removes ./matchType import from index.ts and deletes matchType.ts (logic migrated into dynamicWidgets).
Schema updates
src/schemas/nodeDefSchema.ts
Removes zWidgetTemplate and template from zBaseInputOptions; adds exported zAutogrowOptions (with nested template schema); updates zDynamicComboInputSpec to extend zBaseInputOptions.
Service integration
src/services/litegraphService.ts
Imports applyDynamicInputs and short-circuits input socket creation when applyDynamicInputs(node, inputSpec) returns truthy.
Node runtime shape changes
src/lib/litegraph/src/LGraphNode.ts
Adds public comfyMatchType?: Record<string, Record<string, string>> field; removes spliceInputs method; input slot rendering now considers slot.alwaysVisible.
Interfaces / slots
src/lib/litegraph/src/interfaces.ts, src/lib/litegraph/src/node/NodeInputSlot.ts
Adds optional alwaysVisible?: boolean to INodeInputSlot and NodeInputSlot class.
Type guard util
src/utils/typeGuardUtil.ts
Adds exported isStrings(types: unknown[]): types is string[] type guard.
Tests updated
tests-ui/tests/widgets/dynamicCombo.test.ts
Adds LGraph import, test helper nextTick, helpers addAutogrow/connectInput, updates expected input naming, and introduces Autogrow tests for naming, min/max, growth, and shrink behavior.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Service as litegraphService
    participant Dynamic as dynamicWidgets
    participant Node as LGraphNode
    participant Handler as DynamicHandler

    Service->>Dynamic: applyDynamicInputs(node, inputSpec)
    alt inputSpec handled dynamically
        Dynamic->>Handler: dispatch to specific handler (autogrow / matchType)
        Handler->>Node: add/remove/reorder inputs, update comfyMatchType, adjust output types, relink/prune connections
        Handler-->>Dynamic: handler complete
        Dynamic-->>Service: return true (skip default socket creation)
    else not dynamic
        Dynamic-->>Service: return false (proceed with default socket creation)
    end
    Service->>Node: create input socket (if not skipped)
✨ Finishing touches
  • [ ] πŸ“ Generate docstrings
πŸ§ͺ Generate unit tests (beta)
  • [ ] Create PR with unit tests
  • [ ] Post copyable unit tests in a comment
  • [ ] Commit unit tests in branch austin/growable-inputs

πŸ“œ Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 88e5728a8346d5685d5d926c8201d1f026f09689 and 3baa747509ee76800be70fb290971663f040f6fc.

πŸ“’ Files selected for processing (6)
  • src/core/graph/widgets/dynamicWidgets.ts (5 hunks)
  • src/lib/litegraph/src/LGraphNode.ts (2 hunks)
  • src/lib/litegraph/src/interfaces.ts (1 hunks)
  • src/lib/litegraph/src/node/NodeInputSlot.ts (1 hunks)
  • src/schemas/nodeDefSchema.ts (1 hunks)
  • tests-ui/tests/widgets/dynamicCombo.test.ts (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/lib/litegraph/src/LGraphNode.ts
  • src/schemas/nodeDefSchema.ts
🧰 Additional context used
πŸ““ Path-based instructions (15)
**/*.{vue,ts,tsx}

πŸ“„ CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
  • tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{ts,tsx,js}

πŸ“„ CodeRabbit inference engine (.cursorrules)

Use es-toolkit for utility functions

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
  • tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{ts,tsx}

πŸ“„ CodeRabbit inference engine (.cursorrules)

Use TypeScript for type safety

**/*.{ts,tsx}: Never use any type - use proper TypeScript types Never use as any type assertions - fix the underlying type issue

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
  • tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{ts,tsx,js,vue}

πŸ“„ CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
  • tests-ui/tests/widgets/dynamicCombo.test.ts
src/**/*.{vue,ts}

πŸ“„ CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles Implement proper error handling Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
src/**/*.ts

πŸ“„ CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions Use TypeScript for type safety

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
**/*.{ts,tsx,js,jsx,vue}

πŸ“„ CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
  • tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{ts,tsx,vue}

πŸ“„ CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
  • tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.ts

πŸ“„ CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Define dynamic setting defaults using runtime context with functions in settings configuration Use defaultsByInstallVersion property for gradual feature rollout based on version in settings configuration

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
  • tests-ui/tests/widgets/dynamicCombo.test.ts
src/**/*.{ts,tsx,vue}

πŸ“„ CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks Avoid using @ts-expect-error; use proper TypeScript types instead Use es-toolkit for utility functions instead of other utility libraries Implement proper TypeScript types throughout the codebase

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
src/**/*.{vue,ts,tsx}

πŸ“„ CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
  • src/core/graph/widgets/dynamicWidgets.ts
src/lib/litegraph/**/*.{js,ts,jsx,tsx}

πŸ“„ CodeRabbit inference engine (src/lib/litegraph/CLAUDE.md)

src/lib/litegraph/**/*.{js,ts,jsx,tsx}: Run ESLint instead of manually figuring out whitespace fixes or other trivial style concerns using the pnpm lint:fix command Take advantage of TypedArray subarray when appropriate The size and pos properties of Rectangle share the same array buffer (subarray); they may be used to set the rectangle's size and position Prefer single line if syntax over adding curly braces, when the statement has a very concise expression and concise, single line statement Do not replace &&= or ||= with = when there is no reason to do so. If you do find a reason to remove either &&= or ||=, leave a comment explaining why the removal occurred When writing methods, prefer returning idiomatic JavaScript undefined over null

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
src/lib/litegraph/**/*.{ts,tsx}

πŸ“„ CodeRabbit inference engine (src/lib/litegraph/CLAUDE.md)

Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code

Files:

  • src/lib/litegraph/src/node/NodeInputSlot.ts
  • src/lib/litegraph/src/interfaces.ts
tests-ui/**/*.test.{js,ts,jsx,tsx}

πŸ“„ CodeRabbit inference engine (tests-ui/CLAUDE.md)

tests-ui/**/*.test.{js,ts,jsx,tsx}: Write tests for new features Follow existing test patterns in the codebase Use existing test utilities rather than writing custom utilities Mock external dependencies in tests Always prefer vitest mock functions over writing verbose manual mocks

Files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{test,spec}.{ts,tsx,js}

πŸ“„ CodeRabbit inference engine (AGENTS.md)

Unit and component tests should be located in tests-ui/ or co-located with components as src/components/**/*.{test,spec}.ts; E2E tests should be in browser_tests/

Files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
🧠 Learnings (15)
πŸ“š Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Do not replace `&&=` or `||=` with `=` when there is no reason to do so. If you do find a reason to remove either `&&=` or `||=`, leave a comment explaining why the removal occurred

Applied to files:

  • src/core/graph/widgets/dynamicWidgets.ts
πŸ“š Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : When writing methods, prefer returning idiomatic JavaScript `undefined` over `null`

Applied to files:

  • src/core/graph/widgets/dynamicWidgets.ts
πŸ“š Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Take advantage of `TypedArray` `subarray` when appropriate

Applied to files:

  • src/core/graph/widgets/dynamicWidgets.ts
πŸ“š Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{ts,tsx} : Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code

Applied to files:

  • src/core/graph/widgets/dynamicWidgets.ts
πŸ“š Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • src/core/graph/widgets/dynamicWidgets.ts
  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{js,ts,jsx,tsx} : When adding features, always write vitest unit tests using cursor rules in @.cursor

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Write tests for new features

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Use existing test utilities rather than writing custom utilities

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Mock external dependencies in tests

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Follow existing test patterns in the codebase

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:48:23.088Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Use Vitest (with happy-dom) for unit and component tests, and Playwright for E2E tests

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Use `vitest` for unit testing in this project

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
πŸ“š Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Prefer the use of `test.extend` over loose variables; import `test as baseTest` from `vitest`

Applied to files:

  • tests-ui/tests/widgets/dynamicCombo.test.ts
🧬 Code graph analysis (1)
tests-ui/tests/widgets/dynamicCombo.test.ts (2)
src/lib/litegraph/src/LGraphNode.ts (4)
  • LGraphNode (209-211)
  • LGraphNode (221-4156)
  • LGraphNode (729-737)
  • LGraphNode (739-745)
src/schemas/nodeDef/migration.ts (1)
  • transformInputSpecV1ToV2 (96-137)
πŸͺ› ESLint
src/core/graph/widgets/dynamicWidgets.ts

[error] 1-1: Resolve error: EACCES: permission denied, open '/mkcuUAlogd' at Object.writeFileSync (node:fs:2409:20) at l (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:13670) at createFilesMatcher (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:14422) at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:70:65) at Object.resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:147:20) at file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:69 at setRuleContext (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint-import-context/lib/index.js:23:20) at fullResolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:30) at relative (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:215:12) at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:220:16) at ExportMap.get (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/export-map.js:88:22) at processBodyStatement (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/namespace.js:9:31) at Program (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/namespace.js:100:21) at ruleErrorHandler (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1173:33) at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:46 at Array.forEach () at SourceCodeVisitor.callSync (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:30) at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-traverser.js:291:18 at Array.forEach () at SourceCodeTraverser.traverseSync (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-traverser.js:290:10) at runRules (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1214:12) at #flatVerifyWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2101:4) at Linter._verifyWithFlatConfigArrayAndWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2189:43) at Linter._verifyWithFlatConfigArray (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2292:15) at Linter.verify (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1677:10) at Linter.verifyAndFix (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2557:20) at verifyText (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/eslint/eslint-helpers.js:1179:45) at readAndVerifyFile (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/eslint/eslint-helpers.js:1320:10)

(import-x/namespace)


[error] 1-1: Resolve error: EACCES: permission denied, open '/PyYSKgpRNr' at Object.writeFileSync (node:fs:2409:20) at l (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:13670) at createFilesMatcher (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:14422) at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:70:65) at Object.resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:147:20) at file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:69 at setRuleContext (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint-import-context/lib/index.js:23:20) at fullResolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:30) at relative (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:215:12) at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:220:16) at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/no-unresolved.js:31:34) at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:14:9) at checkSource (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:17:9) at ruleErrorHandler (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1173:33) at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:46 at Array.forEach () at SourceCodeVisitor.callSync (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:30) at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-traverser.js:291:18 at Array.forEach () at SourceCodeTraverser.traverseSync (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-traverser.js:290:10) at runRules (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1214:12) at #flatVerifyWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2101:4) at Linter._verifyWithFlatConfigArrayAndWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2189:43) at Linter._verifyWithFlatConfigArray (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2292:15) at Linter.verify (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1677:10) at Linter.verifyAndFix (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2557:20) at verifyText (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/eslint/eslint-helpers.js:1179:45) at readAndVerifyFile (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/eslint/eslint-helpers.js:1320:10)

(import-x/no-unresolved)


[error] 1-1: Resolve error: EACCES: permission denied, open '/GWyqbUMALu' at Object.writeFileSync (node:fs:2409:20) at l (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:13670) at createFilesMatcher (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:14422) at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:70:65) at Object.resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:147:20) at file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:69 at setRuleContext (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint-import-context/lib/index.js:23:20) at fullResolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:30) at relative (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:215:12) at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:220:16) at importType (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/import-type.js:126:63) at checkImportForRelativePackage (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/no-relative-packages.js:15:38) at file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/no-relative-packages.js:59:40 at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:14:9) at checkSource (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:17:9) at ruleErrorHandler (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1173:33) at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:46 at Array.forEach () at SourceCodeVisitor.callSync (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:30) at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-traverser.js:291:18 at Array.forEach () at SourceCodeTraverser.traverseSync (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-traverser.js:290:10) at runRules (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1214:12) at #flatVerifyWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2101:4) at Linter._verifyWithFlatConfigArrayAndWithoutProcessors (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2189:43) at Linter._verifyWithFlatConfigArray (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2292:15) at Linter.verify (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1677:10) at Linter.verifyAndFix (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:2557:20) at verifyText (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/eslint/eslint-helpers.js:1179:45) at readAndVerifyFile (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/eslint/eslint-helpers.js:1320:10)

(import-x/no-relative-packages)


[error] 1-1: Unable to resolve path to module 'es-toolkit'.

(import-x/no-unresolved)


[error] 3-3: Unable to resolve path to module '@/composables/functional/useChainCallback'.

(import-x/no-unresolved)


[error] 4-4: Unable to resolve path to module '@/lib/litegraph/src/types/globalEnums'.

(import-x/no-unresolved)


[error] 11-11: Unable to resolve path to module '@/lib/litegraph/src/litegraph'.

(import-x/no-unresolved)


[error] 13-13: Unable to resolve path to module '@/schemas/nodeDef/migration'.

(import-x/no-unresolved)


[error] 19-19: Unable to resolve path to module '@/schemas/nodeDefSchema'.

(import-x/no-unresolved)


[error] 20-20: Unable to resolve path to module '@/services/litegraphService'.

(import-x/no-unresolved)


[error] 21-21: Unable to resolve path to module '@/scripts/app'.

(import-x/no-unresolved)


[error] 23-23: Unable to resolve path to module '@/utils/typeGuardUtil'.

(import-x/no-unresolved)

tests-ui/tests/widgets/dynamicCombo.test.ts

[error] 4-4: Unable to resolve path to module '@/lib/litegraph/src/litegraph'.

(import-x/no-unresolved)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: setup
  • GitHub Check: test
  • GitHub Check: lint-and-format
  • GitHub Check: collect
πŸ”‡ Additional comments (21)
src/lib/litegraph/src/node/NodeInputSlot.ts (1)

20-20: LGTM! Clean property addition.

The optional alwaysVisible field is properly typed and aligns with the interface definition.

src/lib/litegraph/src/interfaces.ts (1)

346-346: LGTM! Interface augmentation matches implementation.

The alwaysVisible property is consistently defined across the interface and class.

tests-ui/tests/widgets/dynamicCombo.test.ts (4)

15-17: LGTM! Appropriate async helper for frame-based operations.

The nextTick helper using requestAnimationFrame is suitable for awaiting visual updates and connection changes in autogrow tests.


47-55: LGTM! Clean test helper for autogrow scenarios.

The addAutogrow helper properly constructs autogrow input specs using the migration utility.


56-61: LGTM! Well-structured connection helper.

The connectInput helper creates a test node and establishes connections cleanly for autogrow tests.


110-178: LGTM! Comprehensive autogrow test coverage.

The test suite thoroughly validates autogrow behavior including:

  • Naming by prefix and explicit name lists
  • Min/max constraint enforcement
  • Dynamic growth and shrinkage on connection changes
src/core/graph/widgets/dynamicWidgets.ts (15)

1-1: LGTM! Appropriate utility import.

Using without from es-toolkit aligns with the coding guidelines for utility functions.


30-47: LGTM! Clean widget creation for inline inputs.

The ensureWidgetForInput function properly creates shim widgets and sets the alwaysVisible flag for inputs that need persistent visibility.


75-94: LGTM! Improved input removal with deferred cleanup.

The refactored logic correctly collects inputs to remove and defers their removal until after the new spec is processed, avoiding premature disconnections.


98-161: LGTM! Robust input reordering and re-linking.

The updated logic properly:

  • Tracks insertion points for widgets and inputs
  • Reuses existing inputs when types are compatible
  • Maintains connection integrity during restructuring

185-201: LGTM! Clean dynamic input registry and dispatcher.

The dynamicInputs registry and applyDynamicInputs function provide a clean extension point for dynamic input types.


217-245: LGTM! Proper type change propagation with cleanup.

The changeOutputType function correctly validates connections after type changes and disconnects incompatible links while triggering appropriate callbacks.


247-269: LGTM! Solid type intersection logic.

The combineTypes and intersection functions properly handle wildcard types and compute valid type intersections.


271-335: LGTM! Comprehensive match-type implementation.

The withComfyMatchType function properly:

  • Augments nodes with match-type state
  • Chains connection change handlers
  • Updates input/output types based on connected types
  • Validates type compatibility

337-358: LGTM! Clean match-type application.

The applyMatchType function correctly initializes match-type inputs and triggers the connection change logic.


360-412: LGTM! Well-structured autogrow initialization.

The applyAutogrow function properly:

  • Validates autogrow specs
  • Transforms input specs to v2 format
  • Creates helper functions for input management
  • Initializes minimum required input groups

413-431: LGTM! Clean input group removal.

The removeInputGroup function correctly removes inputs and associated widgets while maintaining tracked state.


433-448: LGTM! Proper growth logic with max constraint.

The inputConnected function correctly adds new input groups when the last group is connected, respecting the maximum limit.


450-482: LGTM! Robust shrink logic with link migration.

The inputDisconnected function properly:

  • Preserves minimum groups
  • Migrates links from removed groups to previous groups
  • Removes trailing empty groups

484-516: LGTM! Clean connection lifecycle management.

The autogrow connection handlers properly:

  • Track pending connections to distinguish new connections from link swaps
  • Chain with existing callbacks
  • Trigger growth/shrinkage asynchronously

202-215: Now I have all the information needed. The review comment's concern is partially correct but misfocused. The real issue is about deprecated API usage, not just about access pattern consistency.

Migrate to Map.get() for links access; indexed access is deprecated.

Lines 228, 304, and 471 use deprecated indexed access (graph.links[id]) which is marked for removal. Line 211 correctly uses the recommended Map method .get(). The codebase has marked indexed property access as deprecated with a note that "backwards compatibility with a Proxy has been added, but will eventually be removed" (see LGraph.ts comment around line 161).

Replace index-style access at lines 228, 304, and 471 with .get() calls to be consistent with line 211 and forward-compatible:

  • Line 228: Change node.graph.links[link_id] to node.graph.links.get(link_id)
  • Line 304: Change this.graph!.links[inp.link] to this.graph!.links.get(inp.link)
  • Line 471: Change node.graph?.links?.[linkId] to node.graph?.links?.get(linkId)
β›” Skipped due to learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Do not replace `&&=` or `||=` with `=` when there is no reason to do so. If you do find a reason to remove either `&&=` or `||=`, leave a comment explaining why the removal occurred
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Take advantage of `TypedArray` `subarray` when appropriate

Comment @coderabbitai help to get the list of available commands and usage tips.

coderabbitai[bot] avatar Nov 22 '25 21:11 coderabbitai[bot]

🎨 Storybook Build Status

βœ… Build completed successfully!

⏰ Completed at: 11/26/2025, 10:26:21 PM UTC

πŸ”— Links


πŸŽ‰ Your Storybook is ready for review!

github-actions[bot] avatar Nov 22 '25 21:11 github-actions[bot]

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 11/26/2025, 10:35:00 PM UTC

πŸ“ˆ Summary

  • Total Tests: 494
  • Passed: 481 βœ…
  • Failed: 0
  • Flaky: 4 ⚠️
  • Skipped: 9 ⏭️

πŸ“Š Test Reports by Browser

  • βœ… chromium: View Report β€’ βœ… 472 / ❌ 0 / ⚠️ 4 / ⏭️ 9
  • βœ… chromium-2x: View Report β€’ βœ… 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • βœ… chromium-0.5x: View Report β€’ βœ… 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • βœ… mobile-chrome: View Report β€’ βœ… 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

πŸŽ‰ Click on the links above to view detailed test results for each browser configuration.

github-actions[bot] avatar Nov 22 '25 21:11 github-actions[bot]

Bundle Size Report

Summary

  • Raw size: 17 MB baseline 17 MB β€” :red_circle: +7.81 kB
  • Gzip: 3.37 MB baseline 3.37 MB β€” :red_circle: +1.8 kB
  • Brotli: 2.58 MB baseline 2.58 MB β€” :red_circle: +987 B
  • Bundles: 93 current β€’ 93 baseline β€’ 52 added / 52 removed

Category Glance App Entry Points :red_circle: +7.81 kB (3.19 MB) Β· Vendor & Third-Party :white_circle: 0 B (8.56 MB) Β· Other :white_circle: 0 B (3.84 MB) Β· Graph Workspace :white_circle: 0 B (944 kB) Β· Panels & Settings :white_circle: 0 B (298 kB) Β· UI Components :white_circle: 0 B (138 kB) Β· + 3 more

Per-category breakdown
App Entry Points β€” 3.19 MB (baseline 3.18 MB) β€’ :red_circle: +7.81 kB

Main entry bundles and manifests

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
assets/index-pY6eQLuB.js (new) β€” 2.96 MB :red_circle: +2.96 MB :red_circle: +618 kB :red_circle: +469 kB
~~assets/index-CM3wRx8R.js~~ (removed) 2.95 MB β€” :green_circle: -2.95 MB :green_circle: -615 kB :green_circle: -467 kB
~~assets/index-J6vsBKQ5.js~~ (removed) 227 kB β€” :green_circle: -227 kB :green_circle: -48.6 kB :green_circle: -40 kB
assets/index-BGsBT3fc.js (new) β€” 222 kB :red_circle: +222 kB :red_circle: +47.3 kB :red_circle: +39 kB
assets/index-C-c6Ni8H.js (new) β€” 345 B :red_circle: +345 B :red_circle: +244 B :red_circle: +201 B
~~assets/index-CrnSgeIi.js~~ (removed) 345 B β€” :green_circle: -345 B :green_circle: -243 B :green_circle: -221 B

Status: 3 added / 3 removed

Graph Workspace β€” 944 kB (baseline 944 kB) β€’ :white_circle: 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
assets/GraphView-BQq04Sh8.js (new) β€” 944 kB :red_circle: +944 kB :red_circle: +183 kB :red_circle: +140 kB
~~assets/GraphView-DkL6ca5A.js~~ (removed) 944 kB β€” :green_circle: -944 kB :green_circle: -183 kB :green_circle: -140 kB

Status: 1 added / 1 removed

Views & Navigation β€” 6.54 kB (baseline 6.54 kB) β€’ :white_circle: 0 B

Top-level views, pages, and routed surfaces

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
assets/UserSelectView-DlGIRimQ.js (new) β€” 6.54 kB :red_circle: +6.54 kB :red_circle: +2.14 kB :red_circle: +1.9 kB
~~assets/UserSelectView-U64ogSAu.js~~ (removed) 6.54 kB β€” :green_circle: -6.54 kB :green_circle: -2.14 kB :green_circle: -1.9 kB

Status: 1 added / 1 removed

Panels & Settings β€” 298 kB (baseline 298 kB) β€’ :white_circle: 0 B

Configuration panels, inspectors, and settings screens

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
~~assets/CreditsPanel-BGjmaYft.js~~ (removed) 21.4 kB β€” :green_circle: -21.4 kB :green_circle: -5.15 kB :green_circle: -4.5 kB
assets/CreditsPanel-DIqOMJEC.js (new) β€” 21.4 kB :red_circle: +21.4 kB :red_circle: +5.15 kB :red_circle: +4.5 kB
~~assets/KeybindingPanel-C5z17hHr.js~~ (removed) 13.6 kB β€” :green_circle: -13.6 kB :green_circle: -3.42 kB :green_circle: -3.01 kB
assets/KeybindingPanel-xpP9m_7T.js (new) β€” 13.6 kB :red_circle: +13.6 kB :red_circle: +3.42 kB :red_circle: +3.01 kB
~~assets/ExtensionPanel-CG67aVES.js~~ (removed) 10.4 kB β€” :green_circle: -10.4 kB :green_circle: -2.48 kB :green_circle: -2.16 kB
assets/ExtensionPanel-YAaIgdEO.js (new) β€” 10.4 kB :red_circle: +10.4 kB :red_circle: +2.48 kB :red_circle: +2.17 kB
~~assets/AboutPanel-BitHWgN7.js~~ (removed) 9.16 kB β€” :green_circle: -9.16 kB :green_circle: -2.46 kB :green_circle: -2.21 kB
assets/AboutPanel-BRMIyQ1t.js (new) β€” 9.16 kB :red_circle: +9.16 kB :red_circle: +2.46 kB :red_circle: +2.21 kB
~~assets/ServerConfigPanel-BGnjagu2.js~~ (removed) 6.56 kB β€” :green_circle: -6.56 kB :green_circle: -1.83 kB :green_circle: -1.62 kB
assets/ServerConfigPanel-Bn0nehbu.js (new) β€” 6.56 kB :red_circle: +6.56 kB :red_circle: +1.83 kB :red_circle: +1.63 kB
assets/UserPanel-BcNp4iFL.js (new) β€” 6.23 kB :red_circle: +6.23 kB :red_circle: +1.72 kB :red_circle: +1.51 kB
~~assets/UserPanel-fVMFMLKQ.js~~ (removed) 6.23 kB β€” :green_circle: -6.23 kB :green_circle: -1.72 kB :green_circle: -1.5 kB
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B

Status: 6 added / 6 removed

UI Components β€” 138 kB (baseline 138 kB) β€’ :white_circle: 0 B

Reusable component library chunks

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-Bh_6syjA.js (new) β€” 53.9 kB :red_circle: +53.9 kB :red_circle: +8.52 kB :red_circle: +7.32 kB
~~assets/Load3D.vue_vue_type_script_setup_true_lang-CLCSZwHY.js~~ (removed) 53.9 kB β€” :green_circle: -53.9 kB :green_circle: -8.52 kB :green_circle: -7.32 kB
~~assets/WidgetSelect.vue_vue_type_script_setup_true_lang-_TotIMTM.js~~ (removed) 46.9 kB β€” :green_circle: -46.9 kB :green_circle: -10.1 kB :green_circle: -8.76 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-CtZzIXPM.js (new) β€” 46.9 kB :red_circle: +46.9 kB :red_circle: +10.1 kB :red_circle: +8.77 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-BzJV5u-Q.js (new) β€” 12.8 kB :red_circle: +12.8 kB :red_circle: +3.35 kB :red_circle: +2.96 kB
~~assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-C2iS5a8x.js~~ (removed) 12.8 kB β€” :green_circle: -12.8 kB :green_circle: -3.35 kB :green_circle: -2.96 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-BI4bUxBu.js (new) β€” 10.8 kB :red_circle: +10.8 kB :red_circle: +2.97 kB :red_circle: +2.59 kB
~~assets/LazyImage.vue_vue_type_script_setup_true_lang-DfYZUWfZ.js~~ (removed) 10.8 kB β€” :green_circle: -10.8 kB :green_circle: -2.98 kB :green_circle: -2.6 kB
assets/ComfyQueueButton-9sEqsdwj.js (new) β€” 7.73 kB :red_circle: +7.73 kB :red_circle: +2.2 kB :red_circle: +1.95 kB
~~assets/ComfyQueueButton-CUDA53S9.js~~ (removed) 7.73 kB β€” :green_circle: -7.73 kB :green_circle: -2.2 kB :green_circle: -1.95 kB
assets/WidgetButton-BJwMQUy4.js (new) β€” 2.04 kB :red_circle: +2.04 kB :red_circle: +929 B :red_circle: +810 B
~~assets/WidgetButton-D0RxLHdl.js~~ (removed) 2.04 kB β€” :green_circle: -2.04 kB :green_circle: -931 B :green_circle: -811 B
~~assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-BdcB0N2p.js~~ (removed) 2 kB β€” :green_circle: -2 kB :green_circle: -772 B :green_circle: -673 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-C2Oi90lY.js (new) β€” 2 kB :red_circle: +2 kB :red_circle: +773 B :red_circle: +677 B
~~assets/UserAvatar.vue_vue_type_script_setup_true_lang-lBvEY_Sb.js~~ (removed) 1.34 kB β€” :green_circle: -1.34 kB :green_circle: -688 B :green_circle: -593 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-LGT2k2Kx.js (new) β€” 1.34 kB :red_circle: +1.34 kB :red_circle: +688 B :red_circle: +591 B
~~assets/MediaTitle.vue_vue_type_script_setup_true_lang-D2bKwiYb.js~~ (removed) 897 B β€” :green_circle: -897 B :green_circle: -505 B :green_circle: -435 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-oao_lJd-.js (new) β€” 897 B :red_circle: +897 B :red_circle: +502 B :red_circle: +443 B

Status: 9 added / 9 removed

Data & Services β€” 12.5 kB (baseline 12.5 kB) β€’ :white_circle: 0 B

Stores, services, APIs, and repositories

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
assets/keybindingService-D9jNSOpR.js (new) β€” 7.51 kB :red_circle: +7.51 kB :red_circle: +1.83 kB :red_circle: +1.58 kB
~~assets/keybindingService-iviyKE5-.js~~ (removed) 7.51 kB β€” :green_circle: -7.51 kB :green_circle: -1.84 kB :green_circle: -1.58 kB
~~assets/serverConfigStore-BHFq9bew.js~~ (removed) 2.83 kB β€” :green_circle: -2.83 kB :green_circle: -909 B :green_circle: -789 B
assets/serverConfigStore-Dyl2H1OJ.js (new) β€” 2.83 kB :red_circle: +2.83 kB :red_circle: +910 B :red_circle: +795 B
~~assets/audioService-B-200UHc.js~~ (removed) 2.2 kB β€” :green_circle: -2.2 kB :green_circle: -962 B :green_circle: -823 B
assets/audioService-B0H2J7PK.js (new) β€” 2.2 kB :red_circle: +2.2 kB :red_circle: +964 B :red_circle: +834 B

Status: 3 added / 3 removed

Utilities & Hooks β€” 2.94 kB (baseline 2.94 kB) β€’ :white_circle: 0 B

Helpers, composables, and utility bundles

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
~~assets/audioUtils-BYLEjmY_.js~~ (removed) 1.41 kB β€” :green_circle: -1.41 kB :green_circle: -652 B :green_circle: -543 B
assets/audioUtils-t03MKoG5.js (new) β€” 1.41 kB :red_circle: +1.41 kB :red_circle: +651 B :red_circle: +546 B
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B

Status: 1 added / 1 removed

Vendor & Third-Party β€” 8.56 MB (baseline 8.56 MB) β€’ :white_circle: 0 B

External libraries and shared vendor chunks

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
assets/vendor-other-CHtYrYG4.js (new) β€” 3.98 MB :red_circle: +3.98 MB :red_circle: +842 kB :red_circle: +673 kB
~~assets/vendor-other-D3dKDPA9.js~~ (removed) 3.98 MB β€” :green_circle: -3.98 MB :green_circle: -842 kB :green_circle: -673 kB
assets/vendor-primevue-BPFe4rxs.js (new) β€” 1.96 MB :red_circle: +1.96 MB :red_circle: +336 kB :red_circle: +202 kB
~~assets/vendor-primevue-oJ2MsX9s.js~~ (removed) 1.96 MB β€” :green_circle: -1.96 MB :green_circle: -336 kB :green_circle: -202 kB
~~assets/vendor-chart--ViqMbDH.js~~ (removed) 452 kB β€” :green_circle: -452 kB :green_circle: -99.1 kB :green_circle: -81 kB
assets/vendor-chart-Uku4MoHb.js (new) β€” 452 kB :red_circle: +452 kB :red_circle: +99.1 kB :red_circle: +81.1 kB
assets/vendor-tiptap-BJQ60VuL.js (new) β€” 232 kB :red_circle: +232 kB :red_circle: +45.7 kB :red_circle: +37.7 kB
~~assets/vendor-tiptap-DkSGWC41.js~~ (removed) 232 kB β€” :green_circle: -232 kB :green_circle: -45.7 kB :green_circle: -37.7 kB
~~assets/vendor-vue-Dcaw_-2x.js~~ (removed) 160 kB β€” :green_circle: -160 kB :green_circle: -37.3 kB :green_circle: -31.6 kB
assets/vendor-vue-DZ-5RWG0.js (new) β€” 160 kB :red_circle: +160 kB :red_circle: +37.3 kB :red_circle: +31.5 kB
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B

Status: 5 added / 5 removed

Other β€” 3.84 MB (baseline 3.84 MB) β€’ :white_circle: 0 B

Bundles that do not match a named category

File Before After Ξ” Raw Ξ” Gzip Ξ” Brotli
assets/WidgetRecordAudio-Ch3Y0tKu.js (new) β€” 20.4 kB :red_circle: +20.4 kB :red_circle: +5.24 kB :red_circle: +4.64 kB
~~assets/WidgetRecordAudio-CHnrLOvr.js~~ (removed) 20.4 kB β€” :green_circle: -20.4 kB :green_circle: -5.24 kB :green_circle: -4.63 kB
~~assets/AudioPreviewPlayer-CrJbSc-N.js~~ (removed) 13.5 kB β€” :green_circle: -13.5 kB :green_circle: -3.4 kB :green_circle: -3.04 kB
assets/AudioPreviewPlayer-o6SaBzVd.js (new) β€” 13.5 kB :red_circle: +13.5 kB :red_circle: +3.4 kB :red_circle: +3.04 kB
~~assets/WidgetGalleria-oHFNenAj.js~~ (removed) 4.1 kB β€” :green_circle: -4.1 kB :green_circle: -1.45 kB :green_circle: -1.31 kB
assets/WidgetGalleria-w_r3nU-B.js (new) β€” 4.1 kB :red_circle: +4.1 kB :red_circle: +1.45 kB :red_circle: +1.3 kB
assets/WidgetColorPicker-BQtQQUjb.js (new) β€” 3.41 kB :red_circle: +3.41 kB :red_circle: +1.38 kB :red_circle: +1.23 kB
~~assets/WidgetColorPicker-DuqwU0eC.js~~ (removed) 3.41 kB β€” :green_circle: -3.41 kB :green_circle: -1.38 kB :green_circle: -1.22 kB
~~assets/WidgetMarkdown-C5H0bcpb.js~~ (removed) 3.1 kB β€” :green_circle: -3.1 kB :green_circle: -1.29 kB :green_circle: -1.13 kB
assets/WidgetMarkdown-EYPC1lpc.js (new) β€” 3.1 kB :red_circle: +3.1 kB :red_circle: +1.29 kB :red_circle: +1.13 kB
assets/WidgetAudioUI-fbPSdJKB.js (new) β€” 2.82 kB :red_circle: +2.82 kB :red_circle: +1.12 kB :red_circle: +1.04 kB
~~assets/WidgetAudioUI-k78Iqydc.js~~ (removed) 2.82 kB β€” :green_circle: -2.82 kB :green_circle: -1.12 kB :green_circle: -1.01 kB
~~assets/MediaVideoTop-BFDrQq-5.js~~ (removed) 2.76 kB β€” :green_circle: -2.76 kB :green_circle: -1.05 kB :green_circle: -904 B
assets/MediaVideoTop-kapao-Dp.js (new) β€” 2.76 kB :red_circle: +2.76 kB :red_circle: +1.05 kB :red_circle: +896 B
~~assets/WidgetChart-B2-gppzM.js~~ (removed) 2.48 kB β€” :green_circle: -2.48 kB :green_circle: -932 B :green_circle: -818 B
assets/WidgetChart-KkWG7Z2c.js (new) β€” 2.48 kB :red_circle: +2.48 kB :red_circle: +933 B :red_circle: +817 B
~~assets/WidgetTextarea-B6Lp_mZj.js~~ (removed) 2.48 kB β€” :green_circle: -2.48 kB :green_circle: -1.01 kB :green_circle: -888 B
assets/WidgetTextarea-BbYUzfqH.js (new) β€” 2.48 kB :red_circle: +2.48 kB :red_circle: +1.01 kB :red_circle: +886 B
~~assets/WidgetImageCompare-BOXn8KLW.js~~ (removed) 2.21 kB β€” :green_circle: -2.21 kB :green_circle: -749 B :green_circle: -661 B
assets/WidgetImageCompare-DtuV4S4S.js (new) β€” 2.21 kB :red_circle: +2.21 kB :red_circle: +748 B :red_circle: +661 B
~~assets/WidgetInputText-BWSmCpjc.js~~ (removed) 1.99 kB β€” :green_circle: -1.99 kB :green_circle: -916 B :green_circle: -851 B
assets/WidgetInputText-D0UsEdHU.js (new) β€” 1.99 kB :red_circle: +1.99 kB :red_circle: +917 B :red_circle: +842 B
~~assets/MediaImageTop-B_ZBEjC1.js~~ (removed) 1.75 kB β€” :green_circle: -1.75 kB :green_circle: -843 B :green_circle: -718 B
assets/MediaImageTop-C3ZnArXi.js (new) β€” 1.75 kB :red_circle: +1.75 kB :red_circle: +843 B :red_circle: +715 B
assets/WidgetToggleSwitch-BrfQeJTo.js (new) β€” 1.58 kB :red_circle: +1.58 kB :red_circle: +760 B :red_circle: +668 B
~~assets/WidgetToggleSwitch-C_oC_TUM.js~~ (removed) 1.58 kB β€” :green_circle: -1.58 kB :green_circle: -761 B :green_circle: -666 B
~~assets/MediaImageBottom--f740vVl.js~~ (removed) 1.57 kB β€” :green_circle: -1.57 kB :green_circle: -737 B :green_circle: -649 B
assets/MediaImageBottom-B1zeKgAj.js (new) β€” 1.57 kB :red_circle: +1.57 kB :red_circle: +740 B :red_circle: +644 B
assets/MediaAudioBottom-CfOFt7Gb.js (new) β€” 1.52 kB :red_circle: +1.52 kB :red_circle: +739 B :red_circle: +660 B
~~assets/MediaAudioBottom-DfzEzZ81.js~~ (removed) 1.52 kB β€” :green_circle: -1.52 kB :green_circle: -740 B :green_circle: -656 B
~~assets/MediaVideoBottom-B0L_gsnF.js~~ (removed) 1.52 kB β€” :green_circle: -1.52 kB :green_circle: -739 B :green_circle: -653 B
assets/MediaVideoBottom-DeUsQ4Nd.js (new) β€” 1.52 kB :red_circle: +1.52 kB :red_circle: +737 B :red_circle: +657 B
~~assets/Media3DBottom-B1nNud0M.js~~ (removed) 1.5 kB β€” :green_circle: -1.5 kB :green_circle: -731 B :green_circle: -652 B
assets/Media3DBottom-XRjfBAkh.js (new) β€” 1.5 kB :red_circle: +1.5 kB :red_circle: +730 B :red_circle: +650 B
assets/Media3DTop-4fN38Efa.js (new) β€” 1.49 kB :red_circle: +1.49 kB :red_circle: +765 B :red_circle: +653 B
~~assets/Media3DTop-BYdNL2Ip.js~~ (removed) 1.49 kB β€” :green_circle: -1.49 kB :green_circle: -765 B :green_circle: -653 B
assets/MediaAudioTop-C1R1QGPq.js (new) β€” 1.46 kB :red_circle: +1.46 kB :red_circle: +741 B :red_circle: +617 B
~~assets/MediaAudioTop-DqRKCSyG.js~~ (removed) 1.46 kB β€” :green_circle: -1.46 kB :green_circle: -740 B :green_circle: -619 B
assets/WidgetSelect-92fxbMTD.js (new) β€” 655 B :red_circle: +655 B :red_circle: +343 B :red_circle: +290 B
~~assets/WidgetSelect-CADI8HK5.js~~ (removed) 655 B β€” :green_circle: -655 B :green_circle: -342 B :green_circle: -289 B
~~assets/WidgetInputNumber-CNM7KUHA.js~~ (removed) 595 B β€” :green_circle: -595 B :green_circle: -331 B :green_circle: -278 B
assets/WidgetInputNumber-EN2-oKOE.js (new) β€” 595 B :red_circle: +595 B :red_circle: +330 B :red_circle: +277 B
assets/Load3D-6DL1jAMU.js (new) β€” 424 B :red_circle: +424 B :red_circle: +267 B :red_circle: +223 B
~~assets/Load3D-BkzeEXGl.js~~ (removed) 424 B β€” :green_circle: -424 B :green_circle: -267 B :green_circle: -223 B
assets/WidgetLegacy-BiuCNirm.js (new) β€” 364 B :red_circle: +364 B :red_circle: +235 B :red_circle: +195 B
~~assets/WidgetLegacy-DsepKb5m.js~~ (removed) 364 B β€” :green_circle: -364 B :green_circle: -236 B :green_circle: -192 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-5lOBdqcC.js 84.5 kB 84.5 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-BOCuaVpE.js 73.4 kB 73.4 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-ClrEFGUz.js 72.4 kB 72.4 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-CyNU0iQX.js 99.3 kB 99.3 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-D7gwLxft.js 114 kB 114 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-DC8o4BCt.js 86.8 kB 86.8 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-DKiesCV4.js 94.3 kB 94.3 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-Hq2q-OtB.js 83.6 kB 83.6 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/main-USAlAlnj.js 82 kB 82 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-_Px5dSNW.js 306 kB 306 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-7z21KPoS.js 285 kB 285 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-BWKZzBPK.js 346 kB 346 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-CGbgH4Yl.js 320 kB 320 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-CjjjdWkV.js 313 kB 313 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-CVrNtxvj.js 288 kB 288 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-DLRSA0IK.js 309 kB 309 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-DQV2gnwA.js 372 kB 372 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/nodeDefs-ofqLG5vz.js 310 kB 310 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB :white_circle: 0 B :white_circle: 0 B :white_circle: 0 B

Status: 23 added / 23 removed

github-actions[bot] avatar Nov 22 '25 21:11 github-actions[bot]

πŸ”§ Auto-fixes Applied

This PR has been automatically updated to fix linting and formatting issues.

⚠️ Important: Your local branch is now behind. Run git pull before making additional changes to avoid conflicts.

Changes made:

  • ESLint auto-fixes
  • Prettier formatting

github-actions[bot] avatar Nov 22 '25 21:11 github-actions[bot]

Going to merge this as is and make a followup PR for additional changes.

This PR includes a change for how inputs added by dynamic combos are keyed. This change can cause workflows made with the current version of dynamic combos to break if loaded in the future. I want to push this change forward so that it isn't blocking any backend release of dynamic combos overlong.

AustinMroz avatar Dec 02 '25 04:12 AustinMroz