Skip to content

Conversation

@bigcat88
Copy link
Contributor

@bigcat88 bigcat88 commented Dec 31, 2025

Summary

Backend part: Comfy-Org/ComfyUI#11582

  • Move API node pricing definitions from hardcoded frontend functions to backend-defined JSONata expressions
  • Add price_badge field to node definition schema containing JSONata expression and dependency declarations
  • Implement async JSONata evaluation with signature-based caching for efficient reactive updates
  • Show one decimal in credit badges when meaningful (e.g., 1.5 credits instead of 2 credits)

Screenshots (if applicable)

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 31, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

📝 Walkthrough

Walkthrough

Replaces static node pricing with a JSONata-driven runtime: adds the jsonata dependency, introduces a price_badge schema and store field, implements async compile/evaluate/caching in a new composable, and updates badge rendering to subscribe to pricingRevision and batch canvas redraws.

Changes

Cohort / File(s) Summary
Dependency / Workspace
package.json, pnpm-workspace.yaml
Added jsonata to dependencies and registered it in the pnpm workspace catalog.
Pricing Schema
src/schemas/nodeDefSchema.ts
Added zPriceBadge, zPriceBadgeDepends, zWidgetDependency; exported PriceBadge and WidgetDependency; extended zComfyNodeDef with optional price_badge.
Runtime Pricing Composable
src/composables/node/useNodePricing.ts
New JSONata-based pricing pipeline: extract price_badge from node defs, compile/cache rules per node type, build normalized widget/input context, async evaluation with signature-based re-eval, non-blocking scheduling, error-tolerant behavior, and public API (getNodeDisplayPrice, getNodePricingConfig, getRelevantWidgetNames, pricingRevision).
Badge Rendering / Node Badge
src/composables/node/useNodeBadge.ts
Rewrote badge wiring to use a cached getter, subscribe to pricingRevision, register widget/connection watchers, and queue canvas redraws when pricing changes.
Node Definitions Store
src/stores/nodeDefStore.ts
Added price_badge?: PriceBadge to ComfyNodeDefImpl and initialize from constructor input.
Tests
src/composables/node/useNodePricing.test.ts
Reworked tests/helpers to create PriceBadge-backed mock nodes; added coverage for JSONata expressions, widget normalization, connectivity scenarios, edge cases, and getNodePricingConfig.

Sequence Diagrams

sequenceDiagram
    autonumber
    participant Badge as Badge Renderer
    participant Pricing as useNodePricing
    participant Store as NodeDefStore
    participant Cache as Compiled Rule Cache
    participant Jsonata as JSONata Engine
    participant UI as Canvas Renderer

    Note over Badge,Pricing: getNodeDisplayPrice (fast-path vs async)
    Badge->>Pricing: getNodeDisplayPrice(node)
    alt cached label available
        Pricing-->>Badge: return cached label
    else
        Pricing->>Store: fetch node definition (price_badge)
        Store-->>Pricing: return price_badge
        Pricing->>Cache: lookup compiled rule for node type
        alt compiled rule cached
            Cache-->>Pricing: compiled rule
        else
            Pricing->>Jsonata: compile rule.expr
            Jsonata-->>Pricing: compiled rule
            Pricing->>Cache: store compiled rule
        end
        Pricing->>Jsonata: evaluate rule with context (async)
        Jsonata-->>Pricing: evaluation result
        Pricing->>Pricing: format & cache display label
        Pricing->>Badge: increment pricingRevision (reactive)
    end
    Badge->>UI: queue redraw (requestAnimationFrame)
    UI->>UI: batch render on next frame
Loading

Possibly related PRs

Suggested reviewers

  • Myestery
  • jojodecayz
✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@DrJKL
Copy link
Contributor

DrJKL commented Jan 5, 2026

@coderabbitai review full

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 5, 2026

@DrJKL I'll perform a full review of all the changes in this PR.

✅ Actions performed

Full review triggered.

1 similar comment
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 5, 2026

@DrJKL I'll perform a full review of all the changes in this PR.

✅ Actions performed

Full review triggered.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Fix all issues with AI Agents 🤖
In @src/composables/node/useNodePricing.ts:
- Around line 408-436: In getNodeDisplayPrice, the bare read pricingTick.value
is an intentional reactive dependency for Vue but looks like a no-op; add a
short inline comment immediately above or on the same line explaining that the
read is deliberate to trigger recomputation (e.g., "intentional reactive
dependency to bump computed re-evaluation; do not remove") so future readers
won't remove it; keep the comment concise and reference pricingTick.value and
the purpose of scheduling async evaluation via scheduleEvaluation.
- Around line 336-374: Add a timeout wrapper around the JSONata evaluation so
rule._compiled.evaluate(ctx) cannot hang indefinitely: create a withTimeout
helper that races the evaluation promise against a setTimeout rejection (e.g.,
1s or configurable), then replace the current
Promise.resolve(rule._compiled.evaluate(...)) call with withTimeout(...). Ensure
the resulting promise is still stored in inflight via inflight.set(node, { sig,
promise }) and that the existing .catch and .finally logic that updates cache,
desiredSig checks, and increments pricingTick.value handles timeout rejections
the same as other errors (i.e., log in development and cache an empty label for
the same sig).
- Around line 166-170: Remove the explicit any in the filter callback so
TypeScript infers the input type from node.inputs; update the connectedCount
computation to use a typed callback like node.inputs?.filter(inp =>
inp?.name?.startsWith(prefix) && inp?.link != null).length ?? 0 (or add a proper
Input type and annotate node.inputs as Input[] if needed) and leave g[groupName]
= connectedCount unchanged.
- Around line 151-160: The loop uses unsafe any types for widget/input lookups;
replace (x: any) with the actual types for node.widgets and node.inputs (e.g.,
Widget and Input or the project's defined interfaces) so the find callbacks and
subsequent access (x?.name, widget?.value, slot?.link) are type-checked; update
the variable declarations for widget and slot in the block referencing
rule.depends_on.widgets and rule.depends_on.inputs, ensure normalizeWidgetValue
accepts the Widget.value type, and adjust the i Record type if needed to reflect
the real Input shape rather than relying on any.
- Around line 255-263: compileRule currently forces the jsonata(...) result to
any which bypasses typings; change this to use jsonata's proper Expression type
(or create a local alias) and update CompiledJsonataPricingRule._compiled to
Expression | null; then replace the cast "as any" with a typed assignment like
const compiled: Expression = jsonata(rule.expr) and return { ...rule, _compiled:
compiled } so the code uses correct jsonata types without any casting while
keeping the catch path returning _compiled: null.
- Around line 453-472: Add a readonly price_badge?: PriceBadge property to the
ComfyNodeDefImpl class so price_badge is properly typed (remove the need for the
as any cast in getRelevantWidgetNames), and change the getRelevantWidgetNames
const arrow function into a named function declaration (function
getRelevantWidgetNames(nodeType: string): string[]) keeping the same body and
behavior; locate ComfyNodeDefImpl to add the property and replace the const
getRelevantWidgetNames = (...) => { ... } with a function declaration to match
codebase conventions.

In @src/schemas/nodeDefSchema.ts:
- Around line 222-228: The default value for the depends_on field on zPriceBadge
omits input_groups which can cause type mismatches with zPriceBadgeDepends;
update the default object used in zPriceBadge.depends_on to include
input_groups: [] (so the default becomes { widgets: [], inputs: [],
input_groups: [] }) and ensure the shape matches zPriceBadgeDepends to avoid
narrowing issues.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/composables/node/useNodeBadge.ts (1)

148-156: Clarify the intent of the discarded computed value.

The call to computedWithWidgetWatch(() => 0) registers widget listeners but discards the returned computed. While the comments explain this, the pattern is unusual and could confuse future maintainers.

Consider extracting this into a dedicated function in useWatchWidget that explicitly only registers listeners without returning a computed, or add a more prominent comment explaining why this pattern is necessary.

📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 14528aa and 15b124b.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (5)
  • package.json
  • pnpm-workspace.yaml
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
  • src/schemas/nodeDefSchema.ts
🧰 Additional context used
📓 Path-based instructions (11)
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/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.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/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
src/**/{services,composables}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/{services,composables}/**/*.{ts,tsx}: Use api.apiURL() for backend endpoints instead of constructing URLs directly
Use api.fileURL() for static file access instead of constructing URLs directly

Files:

  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.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/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Use TypeScript exclusively; do not write new JavaScript code
Use sorted and grouped imports organized by plugin/source
Enforce ESLint rules including Vue + TypeScript rules, disallow floating promises, disallow unused imports, and restrict i18n raw text in templates
Do not use any type or as any type assertions; fix the underlying type issue instead
Write code that is expressive and self-documenting; avoid redundant comments and clean as you go
Keep functions short and functional; minimize nesting and follow the arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Use function declarations instead of function expressions when possible
Use es-toolkit for utility functions
Implement proper error handling in code

Files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
**/**/use[A-Z]*.ts

📄 CodeRabbit inference engine (AGENTS.md)

Name composables using the pattern useXyz.ts

Files:

  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
**/*.{ts,tsx,vue,js,jsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Apply Prettier formatting with 2-space indentation, single quotes, no trailing semicolons, and 80-character line width

Files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • package.json
  • src/composables/node/useNodePricing.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Minimize the surface area (exported values) of each module and composable

Files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
🧠 Learnings (5)
📚 Learning: 2025-12-09T03:39:54.501Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7169
File: src/platform/remote/comfyui/jobs/jobTypes.ts:1-107
Timestamp: 2025-12-09T03:39:54.501Z
Learning: In the ComfyUI_frontend project, Zod is on v3.x. Do not suggest Zod v4 standalone validators (z.uuid, z.ulid, z.cuid2, z.nanoid) until an upgrade to Zod 4 is performed. When reviewing TypeScript files (e.g., src/platform/remote/comfyui/jobs/jobTypes.ts) validate against Zod 3 capabilities and avoid introducing v4-specific features; flag any proposal to upgrade or incorporate v4-only validators and propose staying with compatible 3.x patterns.

Applied to files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-13T11:03:11.264Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7416
File: src/stores/imagePreviewStore.ts:5-7
Timestamp: 2025-12-13T11:03:11.264Z
Learning: In the ComfyUI_frontend repository, lint rules require keeping 'import type' statements separate from non-type imports, even if importing from the same module. Do not suggest consolidating them into a single import statement. Ensure type imports remain on their own line (import type { ... } from 'module') and regular imports stay on separate lines.

Applied to files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-17T00:40:09.635Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.stories.ts:45-55
Timestamp: 2025-12-17T00:40:09.635Z
Learning: Prefer pure function declarations over function expressions (e.g., use function foo() { ... } instead of const foo = () => { ... }) for pure functions in the repository. Function declarations are more functional-leaning, offer better hoisting clarity, and can improve readability and tooling consistency. Apply this guideline across TypeScript files in Comfy-Org/ComfyUI_frontend, including story and UI component code, except where a function expression is semantically required (e.g., callbacks, higher-order functions with closures).

Applied to files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-30T22:22:33.836Z
Learnt from: kaili-yang
Repo: Comfy-Org/ComfyUI_frontend PR: 7805
File: src/composables/useCoreCommands.ts:439-439
Timestamp: 2025-12-30T22:22:33.836Z
Learning: When accessing reactive properties from Pinia stores in TypeScript files, avoid using .value on direct property access (e.g., useStore().isOverlayExpanded). Pinia auto-wraps refs when accessed directly, returning the primitive value. The .value accessor is only needed when destructuring store properties or when using storeToRefs().

Applied to files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-11T12:25:15.470Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Applied to files:

  • src/composables/node/useNodeBadge.ts
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodePricing.ts
🧬 Code graph analysis (2)
src/composables/node/useNodeBadge.ts (3)
src/scripts/app.ts (1)
  • app (1772-1772)
src/utils/migration/migrateReroute.ts (1)
  • node (91-107)
src/stores/commandStore.ts (1)
  • label (52-54)
src/composables/node/useNodePricing.ts (3)
src/schemas/nodeDefSchema.ts (1)
  • PriceBadge (230-230)
src/stores/commandStore.ts (1)
  • label (52-54)
src/stores/nodeDefStore.ts (2)
  • useNodeDefStore (293-455)
  • nodeDef (82-108)
🔇 Additional comments (9)
package.json (1)

174-174: LGTM!

The jsonata dependency addition aligns with the PR's objective to use JSONata expressions for pricing evaluation. The catalog reference correctly points to the version defined in pnpm-workspace.yaml.

src/schemas/nodeDefSchema.ts (2)

200-215: Schema and documentation look good.

The zPriceBadgeDepends schema is well-documented, explaining the autogrow input group behavior and how the count is exposed in the JSONata context. The use of optional().default([]) for array fields ensures safe access.


259-266: LGTM!

The price_badge field is appropriately added as optional to zComfyNodeDef with clear documentation explaining its purpose for API node pricing.

src/composables/node/useNodeBadge.ts (3)

76-84: LGTM! Clean debouncing implementation.

The queueCanvasRedraw function properly batches multiple redraw requests within a single animation frame using a guard flag. This prevents excessive redraws when multiple pricing evaluations complete in quick succession.


86-93: LGTM! Reactive pricing revision watcher.

The watcher correctly triggers canvas redraws only when showApiPricingBadge is enabled. Using flush: 'sync' ensures immediate response to pricing changes.


158-170: LGTM! Efficient badge caching strategy.

The creditsBadgeGetter pattern correctly caches the badge instance and only recreates it when the price label actually changes. This avoids unnecessary object allocations on each badge access while maintaining reactivity.

src/composables/node/useNodePricing.ts (2)

1-12: LGTM! Clear documentation of async behavior.

The header comment effectively documents the JSONata v2.x async nature and explains the implementation strategy (sync getter, async evaluation, reactive tick). This context is valuable for future maintainers.


474-479: LGTM! Clean public API surface.

The composable exposes a minimal, well-documented API: sync getter, config accessor, widget names helper, and a readonly reactive signal for UI updates.

pnpm-workspace.yaml (1)

67-67: LGTM!

The jsonata version ^2.1.0 is appropriately pinned to the latest release in the workspace catalog. The caret allows for minor and patch updates, which is the correct approach. The placement maintains alphabetical ordering.

?.value
)
// Reactive tick to force UI updates when async evaluations resolve.
// We purposely read pricingTick.value inside getNodeDisplayPrice to create a dependency.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Fix all issues with AI Agents 🤖
In @src/composables/node/useNodePricing.ts:
- Around line 151-160: The lookup loops use (x: any) which violates the no-any
rule; replace the explicit any annotations by using the correct domain types
(e.g., Widget and InputSlot or whatever concrete interfaces represent
node.widgets and node.inputs) or let TypeScript infer types by removing the
inline annotations; update the .find callbacks and local variables (widget,
slot, i) to use those types and keep the existing logic calling
normalizeWidgetValue and checking slot.link so behavior is unchanged (refer to
rule.depends_on.widgets, node.widgets, normalizeWidgetValue,
rule.depends_on.inputs, node.inputs, i, widget, slot to find the exact spots).
- Around line 166-170: The filter callback currently uses the unsafe any type
for inp; remove the ": any" and let TypeScript infer the type from node.inputs
(or explicitly cast node.inputs to the correct element type, e.g., Input[] or
NodeInput[] if that type exists) so the predicate becomes (inp) =>
inp?.name?.startsWith(prefix) && inp?.link != null; update the surrounding
typing of node or import/declare the proper input type if needed to ensure
node.inputs is strongly typed before computing connectedCount and assigning
g[groupName].
- Line 336: Repeated casts using (node.constructor as any)?.nodeData should be
replaced by a small typed helper to avoid any and centralize access; add a
getNodeData(node: LGraphNode): NodeData | undefined (with NodeData containing
name?, api_node?, price_badge?) that returns (node.constructor as { nodeData?:
NodeData })?.nodeData, then update all usages such as the nodeName assignment
(currently using (node.constructor as any)?.nodeData?.name ?? '') and other
occurrences (lines referencing api_node and price_badge) to call
getNodeData(node) and read properties from its result.
- Around line 255-263: The compileRule function currently uses an unsafe 'as
any' cast for the jsonata(rule.expr) result; import the jsonata Expression type
and change the compiled field typing so _compiled is typed as Expression | null
(update CompiledJsonataPricingRule accordingly) and cast jsonata(rule.expr) to
Expression instead of any, keeping the try/catch behavior in compileRule.

In @src/schemas/nodeDefSchema.ts:
- Around line 222-228: The default value for the depends_on property in
zPriceBadge omits input_groups, causing inconsistency with zPriceBadgeDepends;
update the default object in the zPriceBadge declaration (depends_on) to include
input_groups: [] alongside widgets: [] and inputs: [] so the default matches
zPriceBadgeDepends and avoids type narrowing issues.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/composables/node/useNodeBadge.ts (1)

148-156: Clarify the intent of discarding the computed return value.

The computedWithWidgetWatch(() => 0) call discards its return value, which is unusual. While the comment explains this registers widget listeners, consider adding a more explicit comment or using a dedicated function if the composable supports it.

🔎 Suggested clarification
-            // Ensure watchers are installed; ignore the returned value.
-            // (This call is what registers the widget listeners in most implementations.)
-            computedWithWidgetWatch(() => 0)
+            // Register widget change listeners to trigger canvas redraws.
+            // The returned computed value is intentionally unused; we only need
+            // the side effect of installing widget watchers.
+            void computedWithWidgetWatch(() => 0)
📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 14528aa and 15b124b.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (5)
  • package.json
  • pnpm-workspace.yaml
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
  • src/schemas/nodeDefSchema.ts
🧰 Additional context used
📓 Path-based instructions (11)
**/*.{ts,tsx,vue,js,jsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Apply Prettier formatting with 2-space indentation, single quotes, no trailing semicolons, and 80-character line width

Files:

  • package.json
  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.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/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.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/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.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/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Use TypeScript exclusively; do not write new JavaScript code
Use sorted and grouped imports organized by plugin/source
Enforce ESLint rules including Vue + TypeScript rules, disallow floating promises, disallow unused imports, and restrict i18n raw text in templates
Do not use any type or as any type assertions; fix the underlying type issue instead
Write code that is expressive and self-documenting; avoid redundant comments and clean as you go
Keep functions short and functional; minimize nesting and follow the arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Use function declarations instead of function expressions when possible
Use es-toolkit for utility functions
Implement proper error handling in code

Files:

  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Minimize the surface area (exported values) of each module and composable

Files:

  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
src/**/{services,composables}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/{services,composables}/**/*.{ts,tsx}: Use api.apiURL() for backend endpoints instead of constructing URLs directly
Use api.fileURL() for static file access instead of constructing URLs directly

Files:

  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
**/**/use[A-Z]*.ts

📄 CodeRabbit inference engine (AGENTS.md)

Name composables using the pattern useXyz.ts

Files:

  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
🧠 Learnings (13)
📚 Learning: 2025-12-09T03:39:54.501Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7169
File: src/platform/remote/comfyui/jobs/jobTypes.ts:1-107
Timestamp: 2025-12-09T03:39:54.501Z
Learning: In the ComfyUI_frontend project, Zod is on v3.x. Do not suggest Zod v4 standalone validators (z.uuid, z.ulid, z.cuid2, z.nanoid) until an upgrade to Zod 4 is performed. When reviewing TypeScript files (e.g., src/platform/remote/comfyui/jobs/jobTypes.ts) validate against Zod 3 capabilities and avoid introducing v4-specific features; flag any proposal to upgrade or incorporate v4-only validators and propose staying with compatible 3.x patterns.

Applied to files:

  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-13T11:03:11.264Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7416
File: src/stores/imagePreviewStore.ts:5-7
Timestamp: 2025-12-13T11:03:11.264Z
Learning: In the ComfyUI_frontend repository, lint rules require keeping 'import type' statements separate from non-type imports, even if importing from the same module. Do not suggest consolidating them into a single import statement. Ensure type imports remain on their own line (import type { ... } from 'module') and regular imports stay on separate lines.

Applied to files:

  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-17T00:40:09.635Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.stories.ts:45-55
Timestamp: 2025-12-17T00:40:09.635Z
Learning: Prefer pure function declarations over function expressions (e.g., use function foo() { ... } instead of const foo = () => { ... }) for pure functions in the repository. Function declarations are more functional-leaning, offer better hoisting clarity, and can improve readability and tooling consistency. Apply this guideline across TypeScript files in Comfy-Org/ComfyUI_frontend, including story and UI component code, except where a function expression is semantically required (e.g., callbacks, higher-order functions with closures).

Applied to files:

  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-30T22:22:33.836Z
Learnt from: kaili-yang
Repo: Comfy-Org/ComfyUI_frontend PR: 7805
File: src/composables/useCoreCommands.ts:439-439
Timestamp: 2025-12-30T22:22:33.836Z
Learning: When accessing reactive properties from Pinia stores in TypeScript files, avoid using .value on direct property access (e.g., useStore().isOverlayExpanded). Pinia auto-wraps refs when accessed directly, returning the primitive value. The .value accessor is only needed when destructuring store properties or when using storeToRefs().

Applied to files:

  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-11T12:25:15.470Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Applied to files:

  • src/schemas/nodeDefSchema.ts
  • src/composables/node/useNodeBadge.ts
  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-21T06:04:12.562Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-21T06:04:12.562Z
Learning: Applies to **/*.{ts,tsx,vue} : Do not use `any` type or `as any` type assertions; fix the underlying type issue instead

Applied to files:

  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Avoid using ts-expect-error; use proper TypeScript types instead

Applied to files:

  • src/composables/node/useNodePricing.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} : 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/composables/node/useNodePricing.ts
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Implement proper TypeScript types throughout the codebase

Applied to files:

  • src/composables/node/useNodePricing.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/composables/node/useNodePricing.ts
📚 Learning: 2025-12-21T06:04:12.562Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-21T06:04:12.562Z
Learning: Applies to **/*.{ts,tsx,vue} : Use function declarations instead of function expressions when possible

Applied to files:

  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-13T05:34:22.209Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7415
File: browser_tests/tests/mobileBaseline.spec.ts:7-15
Timestamp: 2025-12-13T05:34:22.209Z
Learning: In Playwright tests in the Comfy-Org/ComfyUI_frontend repository, the `toPass()` assertion method implements incremental backoff during retries, so increasing the timeout value (e.g., to 5000ms) is sufficient for handling async operations without being overly aggressive.

Applied to files:

  • src/composables/node/useNodePricing.ts
📚 Learning: 2025-12-21T06:04:12.562Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-21T06:04:12.562Z
Learning: Applies to **/*.{ts,tsx,vue} : Write code that is expressive and self-documenting; avoid redundant comments and clean as you go

Applied to files:

  • src/composables/node/useNodePricing.ts
🧬 Code graph analysis (1)
src/composables/node/useNodePricing.ts (2)
src/schemas/nodeDefSchema.ts (1)
  • PriceBadge (230-230)
src/stores/nodeDefStore.ts (2)
  • useNodeDefStore (293-455)
  • nodeDef (82-108)
🔇 Additional comments (8)
package.json (1)

174-174: LGTM!

The jsonata dependency is appropriately added to runtime dependencies using the catalog specifier, consistent with the project's dependency management pattern.

src/schemas/nodeDefSchema.ts (2)

200-215: LGTM!

The zPriceBadgeDepends schema is well-documented with clear explanations for each field, especially the input_groups field which includes a helpful usage example for autogrow inputs.


259-265: LGTM!

The price_badge field is appropriately added to zComfyNodeDef as an optional field with clear documentation explaining its purpose for API node pricing.

src/composables/node/useNodePricing.ts (1)

408-436: LGTM with note on intentional reactive dependency.

The bare pricingTick.value read on line 411 is an intentional reactive dependency pattern. Consider using void pricingTick.value to make the intent clearer and prevent accidental removal.

The sync getter with async fallback pattern is well-designed for avoiding flicker while handling JSONata's async evaluation.

src/composables/node/useNodeBadge.ts (3)

76-93: LGTM!

Good optimization using requestAnimationFrame to batch canvas redraws. The redrawQueued flag prevents redundant RAF calls, and the watch with { flush: 'sync' } ensures pricing updates are immediately reflected.


158-170: Mutable closure state for badge caching.

The lastLabel and lastBadge variables create mutable closure state. This is acceptable here since it's a simple memoization pattern, but consider using a WeakMap for consistency with the caching pattern in useNodePricing.ts if this grows in complexity.


132-139: LGTM!

The hasDynamicPricing check correctly identifies nodes with widget or input dependencies, aligning with the JSONata-based pricing system.

pnpm-workspace.yaml (1)

67-67: The jsonata version ^2.1.0 is the current stable release on npm and is actively maintained. The catalog entry is appropriate.

@bigcat88 bigcat88 force-pushed the feat/backend-api-nodes-pricing-def branch 2 times, most recently from 7d3f77e to 110224b Compare January 6, 2026 17:37
@github-actions
Copy link

github-actions bot commented Jan 6, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/22/2026, 06:38:08 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 6, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 505 passed, 0 failed, 1 flaky, 8 skipped (Total: 514)

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 495 / ❌ 0 / ⚠️ 0 / ⏭️ 8)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 7 / ❌ 0 / ⚠️ 1 / ⏭️ 0)

@github-actions
Copy link

github-actions bot commented Jan 6, 2026

Bundle Size Report

Summary

  • Raw size: 21.7 MB baseline 21.5 MB — 🔴 +130 kB
  • Gzip: 4.5 MB baseline 4.47 MB — 🔴 +29.3 kB
  • Brotli: 3.34 MB baseline 3.31 MB — 🔴 +23.4 kB
  • Bundles: 152 current • 152 baseline • 151 added / 151 removed

Category Glance
Vendor & Third-Party 🔴 +181 kB (10.7 MB) · Graph Workspace 🟢 -64.3 kB (946 kB) · Data & Services 🔴 +13.1 kB (3.12 MB) · Other 🔴 +213 B (6.3 MB) · Panels & Settings 🔴 +4 B (430 kB) · UI Components 🔴 +1 B (32.8 kB) · + 5 more

Per-category breakdown
App Entry Points — 22.3 kB (baseline 22.3 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BlTgwIug.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -6.72 kB 🟢 -5.9 kB
assets/index-D2fvikGY.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +6.72 kB 🔴 +5.9 kB

Status: 1 added / 1 removed

Graph Workspace — 946 kB (baseline 1.01 MB) • 🟢 -64.3 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Cl-1zm3z.js (removed) 1.01 MB 🟢 -1.01 MB 🟢 -200 kB 🟢 -152 kB
assets/GraphView-T7HFkDUh.js (new) 946 kB 🔴 +946 kB 🔴 +191 kB 🔴 +145 kB

Status: 1 added / 1 removed

Views & Navigation — 80.7 kB (baseline 80.7 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-10MQRg0-.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.05 kB
assets/CloudSurveyView-D6FPE7fm.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.61 kB 🔴 +3.06 kB
assets/CloudLoginView-BEzOcn3T.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.1 kB 🔴 +2.73 kB
assets/CloudLoginView-C55b0QxS.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.72 kB
assets/UserCheckView-B5GM5NB2.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.45 kB 🟢 -2.13 kB
assets/UserCheckView-oRk_QO1r.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.44 kB 🔴 +2.13 kB
assets/CloudLayoutView-B3VPG6Le.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/CloudLayoutView-CjuF2Lo_.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.24 kB 🔴 +1.96 kB
assets/CloudSignupView-CSLd5b0q.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.34 kB 🔴 +2.03 kB
assets/CloudSignupView-DK3_3hJk.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.03 kB
assets/CloudForgotPasswordView-BWBn9gBS.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-DHy6Pe-1.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/UserSelectView-Cx-RymVw.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.58 kB
assets/UserSelectView-ff_kT0hn.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-Cq-QjBjN.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudSubscriptionRedirectView-DJhbZatn.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-B2OxSXWi.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/CloudAuthTimeoutView-BwIputLM.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-C_Soh6lM.js (new) 1.97 kB 🔴 +1.97 kB 🔴 +701 B 🔴 +624 B
assets/CloudSorryContactSupportView-CsSgxJS6.js (removed) 1.97 kB 🟢 -1.97 kB 🟢 -703 B 🟢 -626 B
assets/layout-Bm5RsC2H.js (new) 500 B 🔴 +500 B 🔴 +309 B 🔴 +265 B
assets/layout-BrEWWWEo.js (removed) 500 B 🟢 -500 B 🟢 -306 B 🟢 -263 B

Status: 11 added / 11 removed

Panels & Settings — 430 kB (baseline 430 kB) • 🔴 +4 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settings-2SPczzu9.js (removed) 38.3 kB 🟢 -38.3 kB 🟢 -9.22 kB 🟢 -7.33 kB
assets/settings-hzqJG7cr.js (new) 38.3 kB 🔴 +38.3 kB 🔴 +9.22 kB 🔴 +7.31 kB
assets/settings-B2iWSL9x.js (new) 34.3 kB 🔴 +34.3 kB 🔴 +7.93 kB 🔴 +6.61 kB
assets/settings-D4bS3Z6x.js (removed) 34.3 kB 🟢 -34.3 kB 🟢 -7.93 kB 🟢 -6.6 kB
assets/settings-aJKlZz5L.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -7.68 kB 🟢 -6.21 kB
assets/settings-Chig9z1N.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +7.68 kB 🔴 +6.23 kB
assets/settings-BEaFJfwG.js (new) 31.2 kB 🔴 +31.2 kB 🔴 +8.08 kB 🔴 +6.72 kB
assets/settings-ERr_IA1D.js (removed) 31.2 kB 🟢 -31.2 kB 🟢 -8.08 kB 🟢 -6.72 kB
assets/settings-C7KyLuUO.js (new) 30.4 kB 🔴 +30.4 kB 🔴 +7.76 kB 🔴 +6.72 kB
assets/settings-CAe8lz65.js (removed) 30.4 kB 🟢 -30.4 kB 🟢 -7.76 kB 🟢 -6.73 kB
assets/settings-CfriwPVt.js (removed) 29.6 kB 🟢 -29.6 kB 🟢 -7.62 kB 🟢 -6.66 kB
assets/settings-Di06nKxU.js (new) 29.6 kB 🔴 +29.6 kB 🔴 +7.62 kB 🔴 +6.65 kB
assets/settings-BpKJ3vsl.js (new) 29.5 kB 🔴 +29.5 kB 🔴 +7.49 kB 🔴 +6.33 kB
assets/settings-CeebhifS.js (removed) 29.5 kB 🟢 -29.5 kB 🟢 -7.49 kB 🟢 -6.33 kB
assets/settings-Cc5JlSUV.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -7.36 kB 🟢 -6.31 kB
assets/settings-SV8t1Ic-.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +7.36 kB 🔴 +6.33 kB
assets/settings-BpTSS9Vb.js (removed) 28.6 kB 🟢 -28.6 kB 🟢 -7.71 kB 🟢 -6.38 kB
assets/settings-OU-k06qs.js (new) 28.6 kB 🔴 +28.6 kB 🔴 +7.71 kB 🔴 +6.38 kB
assets/settings-BsYXsVso.js (new) 25.9 kB 🔴 +25.9 kB 🔴 +7.64 kB 🔴 +6.17 kB
assets/settings-Cnh-GeSb.js (removed) 25.9 kB 🟢 -25.9 kB 🟢 -7.64 kB 🟢 -6.14 kB
assets/settings-BmldfJV5.js (new) 25.2 kB 🔴 +25.2 kB 🔴 +7.41 kB 🔴 +5.76 kB
assets/settings-CvUS0UPK.js (removed) 25.2 kB 🟢 -25.2 kB 🟢 -7.41 kB 🟢 -5.79 kB
assets/LegacyCreditsPanel-CP6pvOmS.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.22 kB
assets/LegacyCreditsPanel-C8EO6Jer.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.23 kB
assets/SubscriptionPanel-Bs3otuj7.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +4.99 kB 🔴 +4.38 kB
assets/SubscriptionPanel-D4LUq4e-.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5 kB 🟢 -4.4 kB
assets/KeybindingPanel-BssWVOru.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.73 kB 🔴 +3.3 kB
assets/KeybindingPanel-yzMgG2wp.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.73 kB 🟢 -3.31 kB
assets/AboutPanel-BMBXRSn1.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.43 kB
assets/AboutPanel-CKG4Bl53.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/ExtensionPanel-CAMMYbXl.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-DM0rCsHV.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ServerConfigPanel-DW88m-uw.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/ServerConfigPanel-M8vBdu4H.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/UserPanel-_PA8lNTn.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.9 kB 🔴 +1.67 kB
assets/UserPanel-BLHV-f4r.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/cloudRemoteConfig-Cz78esXh.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -769 B 🟢 -662 B
assets/cloudRemoteConfig-D_s9-1nZ.js (new) 1.82 kB 🔴 +1.82 kB 🔴 +772 B 🔴 +669 B
assets/remoteConfig-F08PD4EG.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +521 B 🔴 +453 B
assets/remoteConfig-KDSIvxu_.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -519 B 🟢 -451 B
assets/remoteConfig-CDQywK2g.js (removed) 188 B 🟢 -188 B 🟢 -132 B 🟢 -114 B
assets/remoteConfig-Ct2AL8qi.js (new) 188 B 🔴 +188 B 🔴 +132 B 🔴 +109 B

Status: 21 added / 21 removed

User & Accounts — 3.94 kB (baseline 3.94 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-C7uP8M5w.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.05 kB
assets/auth-Cu2onA8y.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.07 kB
assets/firebaseAuthStore-4GyWqonR.js (removed) 217 B 🟢 -217 B 🟢 -136 B 🟢 -120 B
assets/firebaseAuthStore-yea47aMA.js (new) 217 B 🔴 +217 B 🔴 +138 B 🔴 +118 B
assets/auth-CuzRdI6l.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +130 B
assets/auth-iqvoE3Nt.js (removed) 178 B 🟢 -178 B 🟢 -142 B 🟢 -130 B

Status: 3 added / 3 removed

Editors & Dialogs — 2.8 kB (baseline 2.8 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-D3BxV7pj.js (removed) 2.62 kB 🟢 -2.62 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/useSubscriptionDialog-ktU0Gq30.js (new) 2.62 kB 🔴 +2.62 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/useSubscriptionDialog-D2IjQdE4.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +101 B
assets/useSubscriptionDialog-Dn2ouQq6.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -100 B

Status: 2 added / 2 removed

UI Components — 32.8 kB (baseline 32.8 kB) • 🔴 +1 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SubscribeButton-BI5xoaA1.js (new) 12.5 kB 🔴 +12.5 kB 🔴 +3.01 kB 🔴 +2.69 kB
assets/SubscribeButton-xJfy7ibu.js (removed) 12.5 kB 🟢 -12.5 kB 🟢 -3.01 kB 🟢 -2.7 kB
assets/ComfyQueueButton-CPyqe3TX.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.41 kB
assets/ComfyQueueButton-nH5Guj7y.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/Button-6yCVKRM1.js (new) 3.76 kB 🔴 +3.76 kB 🔴 +1.36 kB 🔴 +1.2 kB
assets/Button-DFwzN-He.js (removed) 3.75 kB 🟢 -3.75 kB 🟢 -1.37 kB 🟢 -1.21 kB
assets/WidgetButton-Cc4dqPv-.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +981 B 🔴 +888 B
assets/WidgetButton-DZqUsIzi.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -981 B 🟢 -881 B
assets/CloudBadge-Ce-1Allp.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +726 B 🔴 +645 B
assets/CloudBadge-U2mvZ2FY.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -729 B 🟢 -647 B
assets/UserAvatar-4JWUZu7Z.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -728 B 🟢 -638 B
assets/UserAvatar-wKdSR6pn.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +726 B 🔴 +635 B
assets/cloudFeedbackTopbarButton-CsOlCge0.js (removed) 866 B 🟢 -866 B 🟢 -525 B 🟢 -445 B
assets/cloudFeedbackTopbarButton-DAf2rVD9.js (new) 866 B 🔴 +866 B 🔴 +525 B 🔴 +446 B
assets/ComfyQueueButton-BpU62eU-.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +114 B
assets/ComfyQueueButton-DJMvvg2U.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -108 B

Status: 8 added / 8 removed

Data & Services — 3.12 MB (baseline 3.11 MB) • 🔴 +13.1 kB

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DZzNEdJR.js (new) 1.95 MB 🔴 +1.95 MB 🔴 +412 kB 🔴 +315 kB
assets/dialogService-BCfYnsGk.js (removed) 1.93 MB 🟢 -1.93 MB 🟢 -409 kB 🟢 -312 kB
assets/api-_QjALlui.js (new) 1.15 MB 🔴 +1.15 MB 🔴 +241 kB 🔴 +186 kB
assets/api-CapZ46JC.js (removed) 1.15 MB 🟢 -1.15 MB 🟢 -241 kB 🟢 -186 kB
assets/releaseStore-CmVKNGlv.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/releaseStore-DK5kBg9O.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.41 kB 🟢 -2.13 kB
assets/keybindingService-C-ATycKg.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.51 kB
assets/keybindingService-Cr3zr6zO.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.74 kB 🔴 +1.52 kB
assets/serverConfigStore-9ynD59UJ.js (removed) 2.64 kB 🟢 -2.64 kB 🟢 -878 B 🟢 -777 B
assets/serverConfigStore-ffeaT_92.js (new) 2.64 kB 🔴 +2.64 kB 🔴 +875 B 🔴 +780 B
assets/userStore-Cebk3SKJ.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +810 B 🔴 +724 B
assets/userStore-DzAgyWmk.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -812 B 🟢 -724 B
assets/audioService-BYQsuQJE.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -933 B 🟢 -822 B
assets/audioService-CFRwzOcD.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +929 B 🔴 +818 B
assets/releaseStore-D04wDvlc.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +109 B
assets/releaseStore-QZCWct5v.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -113 B

Status: 8 added / 8 removed

Utilities & Hooks — 18.1 kB (baseline 18.1 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/colorUtil-CSxFvNqh.js (removed) 7.2 kB 🟢 -7.2 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/colorUtil-DhO9GoJY.js (new) 7.2 kB 🔴 +7.2 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/useErrorHandling-C0cqWNxq.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/useErrorHandling-CboeyUor.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/subscriptionCheckoutUtil-7nJk3Bzz.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -865 B 🟢 -750 B
assets/subscriptionCheckoutUtil-7vFRiExH.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +864 B 🔴 +752 B
assets/markdownRendererUtil-DX9_A3ev.js (removed) 1.78 kB 🟢 -1.78 kB 🟢 -883 B 🟢 -774 B
assets/markdownRendererUtil-zhYszCjH.js (new) 1.78 kB 🔴 +1.78 kB 🔴 +885 B 🔴 +774 B
assets/audioUtils-DprY6GMS.js (new) 970 B 🔴 +970 B 🔴 +547 B 🔴 +458 B
assets/audioUtils-ISWweN0Y.js (removed) 970 B 🟢 -970 B 🟢 -548 B 🟢 -459 B
assets/tailwindUtil-BzCPIUnk.js (removed) 488 B 🟢 -488 B 🟢 -297 B 🟢 -272 B
assets/tailwindUtil-DRBFxWBX.js (new) 488 B 🔴 +488 B 🔴 +296 B 🔴 +267 B
assets/_plugin-vue_export-helper-Dt9-hEHc.js (new) 467 B 🔴 +467 B 🔴 +270 B 🔴 +243 B
assets/_plugin-vue_export-helper-xVPqUhAl.js (removed) 467 B 🟢 -467 B 🟢 -270 B 🟢 -235 B
assets/useCurrentUser-CNc7DKrA.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -102 B
assets/useCurrentUser-CumM6HtD.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +101 B

Status: 8 added / 8 removed

Vendor & Third-Party — 10.7 MB (baseline 10.5 MB) • 🔴 +181 kB

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-BF96kBeR.js (new) 4.1 MB 🔴 +4.1 MB 🔴 +867 kB 🔴 +673 kB
assets/vendor-other-BGT1EIXb.js (removed) 3.92 MB 🟢 -3.92 MB 🟢 -832 kB 🟢 -645 kB
assets/vendor-primevue-DfDkDSrj.js (new) 3.04 MB 🔴 +3.04 MB 🔴 +560 kB 🔴 +328 kB
assets/vendor-primevue-ZNoQ1mvw.js (removed) 3.04 MB 🟢 -3.04 MB 🟢 -560 kB 🟢 -328 kB
assets/vendor-three-BKj_AHFn.js (new) 1.83 MB 🔴 +1.83 MB 🔴 +391 kB 🔴 +283 kB
assets/vendor-three-Dqb1VEds.js (removed) 1.83 MB 🟢 -1.83 MB 🟢 -391 kB 🟢 -283 kB
assets/vendor-tiptap-BxNhpyUI.js (removed) 650 kB 🟢 -650 kB 🟢 -152 kB 🟢 -122 kB
assets/vendor-tiptap-CLU9nzy5.js (new) 650 kB 🔴 +650 kB 🔴 +152 kB 🔴 +122 kB
assets/vendor-chart-Dr8GmMlH.js (removed) 408 kB 🟢 -408 kB 🟢 -98.6 kB 🟢 -80.6 kB
assets/vendor-chart-OCOwIMuw.js (new) 408 kB 🔴 +408 kB 🔴 +98.6 kB 🔴 +80.6 kB
assets/vendor-xterm-AIoMGdmt.js (new) 398 kB 🔴 +398 kB 🔴 +79.3 kB 🔴 +63.5 kB
assets/vendor-xterm-CArXWFIl.js (removed) 398 kB 🟢 -398 kB 🟢 -79.3 kB 🟢 -63.6 kB
assets/vendor-reka-ui-BSEnCSTX.js (removed) 256 kB 🟢 -256 kB 🟢 -50.6 kB 🟢 -42.1 kB
assets/vendor-reka-ui-fnwiwiw0.js (new) 256 kB 🔴 +256 kB 🔴 +50.6 kB 🔴 +42.1 kB
assets/vendor-vue-CRvEKkVc.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +4.37 kB 🔴 +3.92 kB
assets/vendor-vue-ZDzjc7xN.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -4.38 kB 🟢 -3.92 kB

Status: 8 added / 8 removed

Other — 6.3 MB (baseline 6.3 MB) • 🔴 +213 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/nodeDefs-DE71tjdx.js (removed) 437 kB 🟢 -437 kB 🟢 -67.8 kB 🟢 -43.7 kB
assets/nodeDefs-JcuduYmz.js (new) 437 kB 🔴 +437 kB 🔴 +67.8 kB 🔴 +43.6 kB
assets/nodeDefs-Df-Dzp4h.js (new) 403 kB 🔴 +403 kB 🔴 +61.6 kB 🔴 +40.5 kB
assets/nodeDefs-naxJj6nk.js (removed) 403 kB 🟢 -403 kB 🟢 -61.6 kB 🟢 -40.5 kB
assets/nodeDefs-B-NsilFD.js (new) 403 kB 🔴 +403 kB 🔴 +63.6 kB 🔴 +41.9 kB
assets/nodeDefs-CtGbZggL.js (removed) 403 kB 🟢 -403 kB 🟢 -63.6 kB 🟢 -41.8 kB
assets/nodeDefs-CkmgO8pt.js (new) 374 kB 🔴 +374 kB 🔴 +61.9 kB 🔴 +40.4 kB
assets/nodeDefs-DdCHCHTz.js (removed) 374 kB 🟢 -374 kB 🟢 -61.9 kB 🟢 -40.4 kB
assets/nodeDefs-2P19NBSM.js (removed) 365 kB 🟢 -365 kB 🟢 -60.5 kB 🟢 -40.2 kB
assets/nodeDefs-B0YA6E3O.js (new) 365 kB 🔴 +365 kB 🔴 +60.5 kB 🔴 +40.2 kB
assets/nodeDefs-BK0y0AHu.js (removed) 361 kB 🟢 -361 kB 🟢 -60.5 kB 🟢 -41.3 kB
assets/nodeDefs-D3iuHiHg.js (new) 361 kB 🔴 +361 kB 🔴 +60.5 kB 🔴 +41.3 kB
assets/nodeDefs-BdrCgdBR.js (removed) 361 kB 🟢 -361 kB 🟢 -59.2 kB 🟢 -40.6 kB
assets/nodeDefs-Bj9WZ9w2.js (new) 361 kB 🔴 +361 kB 🔴 +59.2 kB 🔴 +40.6 kB
assets/nodeDefs-C5LCxpJf.js (new) 358 kB 🔴 +358 kB 🔴 +58 kB 🔴 +39.8 kB
assets/nodeDefs-DmVgg8Xc.js (removed) 358 kB 🟢 -358 kB 🟢 -58 kB 🟢 -39.8 kB
assets/nodeDefs-BuMyDGCc.js (new) 355 kB 🔴 +355 kB 🔴 +57.3 kB 🔴 +39.1 kB
assets/nodeDefs-D5oNs76O.js (removed) 355 kB 🟢 -355 kB 🟢 -57.3 kB 🟢 -39.1 kB
assets/nodeDefs-BeCd-PGT.js (removed) 334 kB 🟢 -334 kB 🟢 -59.4 kB 🟢 -39 kB
assets/nodeDefs-ZPhGgQ7l.js (new) 334 kB 🔴 +334 kB 🔴 +59.4 kB 🔴 +39 kB
assets/nodeDefs-BSY8OIp6.js (removed) 332 kB 🟢 -332 kB 🟢 -58.2 kB 🟢 -37.8 kB
assets/nodeDefs-DQkRT5Hf.js (new) 332 kB 🔴 +332 kB 🔴 +58.2 kB 🔴 +37.7 kB
assets/core-BTE4rM1e.js (removed) 177 kB 🟢 -177 kB 🟢 -42.8 kB 🟢 -35.8 kB
assets/core-x-cmNh70.js (new) 177 kB 🔴 +177 kB 🔴 +42.8 kB 🔴 +35.8 kB
assets/main-BkOZV5KQ.js (removed) 164 kB 🟢 -164 kB 🟢 -43.8 kB 🟢 -34.7 kB
assets/main-BrduBJgA.js (new) 164 kB 🔴 +164 kB 🔴 +43.8 kB 🔴 +34.6 kB
assets/main-CgH-P3CN.js (removed) 147 kB 🟢 -147 kB 🟢 -39.4 kB 🟢 -31.8 kB
assets/main-Dq3iPfzd.js (new) 147 kB 🔴 +147 kB 🔴 +39.4 kB 🔴 +31.8 kB
assets/main-DJImdXwC.js (removed) 143 kB 🟢 -143 kB 🟢 -39.6 kB 🟢 -31.6 kB
assets/main-vm4xpvmf.js (new) 143 kB 🔴 +143 kB 🔴 +39.6 kB 🔴 +31.6 kB
assets/main-B2N0a5pW.js (new) 136 kB 🔴 +136 kB 🔴 +39.4 kB 🔴 +31.5 kB
assets/main-Cx0gFhdF.js (removed) 136 kB 🟢 -136 kB 🟢 -39.4 kB 🟢 -31.5 kB
assets/main-CmsFN86W.js (removed) 126 kB 🟢 -126 kB 🟢 -38.1 kB 🟢 -31.9 kB
assets/main-Cqjp_FWD.js (new) 126 kB 🔴 +126 kB 🔴 +38.1 kB 🔴 +31.9 kB
assets/main-BbKWbhZz.js (removed) 123 kB 🟢 -123 kB 🟢 -37.9 kB 🟢 -30.7 kB
assets/main-Btwzdco5.js (new) 123 kB 🔴 +123 kB 🔴 +37.9 kB 🔴 +30.7 kB
assets/main-C6uG7HU6.js (removed) 121 kB 🟢 -121 kB 🟢 -37.2 kB 🟢 -31 kB
assets/main-RXM2DF0z.js (new) 121 kB 🔴 +121 kB 🔴 +37.2 kB 🔴 +31 kB
assets/main-DzWcKmzr.js (new) 119 kB 🔴 +119 kB 🔴 +37.1 kB 🔴 +31 kB
assets/main-VnnpXvH2.js (removed) 119 kB 🟢 -119 kB 🟢 -37.1 kB 🟢 -31 kB
assets/main-D6vJTMyD.js (removed) 119 kB 🟢 -119 kB 🟢 -36.6 kB 🟢 -30.7 kB
assets/main-Dt73AJjH.js (new) 119 kB 🔴 +119 kB 🔴 +36.6 kB 🔴 +30.7 kB
assets/main-9SoaPJw3.js (removed) 107 kB 🟢 -107 kB 🟢 -36.6 kB 🟢 -29.1 kB
assets/main-C-7JfYKu.js (new) 107 kB 🔴 +107 kB 🔴 +36.6 kB 🔴 +29.1 kB
assets/main-BVeXk87y.js (removed) 106 kB 🟢 -106 kB 🟢 -36.7 kB 🟢 -28.9 kB
assets/main-CMngmfho.js (new) 106 kB 🔴 +106 kB 🔴 +36.7 kB 🔴 +28.9 kB
assets/Load3D-Bkwa6M1d.js (new) 55.7 kB 🔴 +55.7 kB 🔴 +9.17 kB 🔴 +7.9 kB
assets/Load3D-DK6xaIro.js (removed) 55.7 kB 🟢 -55.7 kB 🟢 -9.18 kB 🟢 -7.91 kB
assets/WidgetSelect-CH3ppOUZ.js (removed) 50.5 kB 🟢 -50.5 kB 🟢 -11.1 kB 🟢 -9.7 kB
assets/WidgetSelect-GSrDYDjw.js (new) 50.5 kB 🔴 +50.5 kB 🔴 +11.1 kB 🔴 +9.7 kB
assets/SubscriptionRequiredDialogContent-B_6yvwFA.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.78 kB 🟢 -5.91 kB
assets/SubscriptionRequiredDialogContent-CugSrRHN.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.91 kB
assets/commands-BeiRiOp3.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +3.96 kB 🔴 +3.07 kB
assets/commands-werCdhrX.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -3.96 kB 🟢 -3.07 kB
assets/commands-CgZysi4T.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +3.68 kB 🔴 +2.83 kB
assets/commands-DFVgUBSf.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -3.68 kB 🟢 -2.85 kB
assets/commands-CrIXusHG.js (new) 19.3 kB 🔴 +19.3 kB 🔴 +3.69 kB 🔴 +2.9 kB
assets/commands-M0rkm8ta.js (removed) 19.3 kB 🟢 -19.3 kB 🟢 -3.69 kB 🟢 -2.89 kB
assets/commands-DBI65Lek.js (removed) 18.8 kB 🟢 -18.8 kB 🟢 -3.79 kB 🟢 -2.96 kB
assets/commands-oyChXnQi.js (new) 18.8 kB 🔴 +18.8 kB 🔴 +3.79 kB 🔴 +2.93 kB
assets/commands-mArdHy-T.js (new) 18.5 kB 🔴 +18.5 kB 🔴 +3.52 kB 🔴 +2.91 kB
assets/commands-Ofgk4qHD.js (removed) 18.5 kB 🟢 -18.5 kB 🟢 -3.52 kB 🟢 -2.91 kB
assets/WidgetRecordAudio-C6FvSVcX.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.96 kB 🟢 -4.43 kB
assets/WidgetRecordAudio-CWBybC0a.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.96 kB 🔴 +4.43 kB
assets/WidgetInputNumber-CYaDIKef.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.49 kB 🟢 -4 kB
assets/WidgetInputNumber-O9jRLnwC.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.49 kB 🔴 +4 kB
assets/commands--jV1_mvz.js (new) 18 kB 🔴 +18 kB 🔴 +3.51 kB 🔴 +2.9 kB
assets/commands-BNUp31dg.js (removed) 18 kB 🟢 -18 kB 🟢 -3.51 kB 🟢 -2.89 kB
assets/commands-C_djaXwb.js (new) 18 kB 🔴 +18 kB 🔴 +3.39 kB 🔴 +2.78 kB
assets/commands-D6LQMdxf.js (removed) 18 kB 🟢 -18 kB 🟢 -3.39 kB 🟢 -2.76 kB
assets/commands-C3TkAluu.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -3.35 kB 🟢 -2.77 kB
assets/commands-CSOf1gcP.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +3.36 kB 🔴 +2.77 kB
assets/commands-DqWk-Mir.js (removed) 17.8 kB 🟢 -17.8 kB 🟢 -3.65 kB 🟢 -2.84 kB
assets/commands-nWIoBCIJ.js (new) 17.8 kB 🔴 +17.8 kB 🔴 +3.65 kB 🔴 +2.84 kB
assets/commands-CSHiZZSm.js (new) 17.2 kB 🔴 +17.2 kB 🔴 +3.57 kB 🔴 +2.73 kB
assets/commands-Dh30X9as.js (removed) 17.2 kB 🟢 -17.2 kB 🟢 -3.57 kB 🟢 -2.71 kB
assets/WidgetImageCrop-BNrPW0RQ.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.62 kB
assets/WidgetImageCrop-pgKEZqtd.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.62 kB
assets/commands-Bhnu7Bw7.js (removed) 17 kB 🟢 -17 kB 🟢 -3.54 kB 🟢 -2.64 kB
assets/commands-BSQfLPDi.js (new) 17 kB 🔴 +17 kB 🔴 +3.54 kB 🔴 +2.64 kB
assets/PanelTemplate-CC0D0fHj.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.79 kB
assets/PanelTemplate-CKGzXC2b.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.79 kB
assets/LazyImage-1763qhMs.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4 kB 🔴 +3.54 kB
assets/LazyImage-DjXVwaWF.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4 kB 🟢 -3.54 kB
assets/AudioPreviewPlayer-BfC7UIUI.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.65 kB
assets/AudioPreviewPlayer-CRUXyOxl.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.98 kB 🟢 -2.65 kB
assets/WidgetWithControl-B2hGEJeH.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.65 kB 🟢 -2.38 kB
assets/WidgetWithControl-EEzDJq_Z.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.65 kB 🔴 +2.38 kB
assets/ValueControlPopover-Cp4r0Bzq.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/ValueControlPopover-DYR7qWL2.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/WidgetBoundingBox-CR9inj7y.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.13 kB 🟢 -993 B
assets/WidgetBoundingBox-KpJ-3L5b.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.13 kB 🔴 +991 B
assets/WidgetGalleria-BcXk_Udc.js (removed) 4.57 kB 🟢 -4.57 kB 🟢 -1.57 kB 🟢 -1.42 kB
assets/WidgetGalleria-TwbSGgZD.js (new) 4.57 kB 🔴 +4.57 kB 🔴 +1.57 kB 🔴 +1.42 kB
assets/Slider-BGJw3sot.js (new) 4.21 kB 🔴 +4.21 kB 🔴 +1.52 kB 🔴 +1.34 kB
assets/Slider-DjsEPml7.js (removed) 4.21 kB 🟢 -4.21 kB 🟢 -1.52 kB 🟢 -1.34 kB
assets/WidgetImageCompare-DROO9TNS.js (removed) 3.79 kB 🟢 -3.79 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/WidgetImageCompare-DvJACElc.js (new) 3.79 kB 🔴 +3.79 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetColorPicker-BQpPE1zD.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.38 kB 🟢 -1.25 kB
assets/WidgetColorPicker-CJ1gHabb.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.38 kB 🔴 +1.25 kB
assets/WidgetTextarea-Co3T48OI.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.33 kB 🔴 +1.17 kB
assets/WidgetTextarea-KBzv8xRB.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.33 kB 🟢 -1.17 kB
assets/preservedQueryNamespaces-BsMrb3S_.js (removed) 3.23 kB 🟢 -3.23 kB 🟢 -1.07 kB 🟢 -929 B
assets/preservedQueryNamespaces-D99dMmBP.js (new) 3.23 kB 🔴 +3.23 kB 🔴 +1.07 kB 🔴 +930 B
assets/WidgetMarkdown-2vdk8Xj7.js (new) 3.22 kB 🔴 +3.22 kB 🔴 +1.28 kB 🔴 +1.13 kB
assets/WidgetMarkdown-DuvfZXqI.js (removed) 3.22 kB 🟢 -3.22 kB 🟢 -1.28 kB 🟢 -1.14 kB
assets/WidgetToggleSwitch-DEDSL78r.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.19 kB 🔴 +1.07 kB
assets/WidgetToggleSwitch-DU32LGa_.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.19 kB 🟢 -1.08 kB
assets/GlobalToast-Bvlbows0.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +942 B
assets/GlobalToast-HPCZBviT.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -949 B
assets/SubscribeToRun-CciR2HoB.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.02 kB
assets/SubscribeToRun-CqvBSyq3.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/cloudSessionCookie-HHd-GL8M.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +933 B 🔴 +813 B
assets/cloudSessionCookie-jhuxVGT9.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -936 B 🟢 -805 B
assets/MediaVideoTop-BQHIk2Ub.js (new) 2.84 kB 🔴 +2.84 kB 🔴 +1.06 kB 🔴 +916 B
assets/MediaVideoTop-VT1eGBOq.js (removed) 2.84 kB 🟢 -2.84 kB 🟢 -1.06 kB 🟢 -918 B
assets/WidgetChart-BOLZl6CK.js (new) 2.79 kB 🔴 +2.79 kB 🔴 +1.06 kB 🔴 +945 B
assets/WidgetChart-BpivfpYx.js (removed) 2.79 kB 🟢 -2.79 kB 🟢 -1.06 kB 🟢 -967 B
assets/WidgetLayoutField-CVaWs0M6.js (new) 2.61 kB 🔴 +2.61 kB 🔴 +1 kB 🔴 +893 B
assets/WidgetLayoutField-D1jdHG3V.js (removed) 2.61 kB 🟢 -2.61 kB 🟢 -1.01 kB 🟢 -894 B
assets/WidgetInputText-Dhqju-No.js (removed) 2.58 kB 🟢 -2.58 kB 🟢 -1.01 kB 🟢 -910 B
assets/WidgetInputText-DlW3eBev.js (new) 2.58 kB 🔴 +2.58 kB 🔴 +1.01 kB 🔴 +911 B
assets/BaseViewTemplate-D2FIE1To.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.05 kB 🟢 -925 B
assets/BaseViewTemplate-OXXdtlo7.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +923 B
assets/Media3DTop-BXBGuOuC.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -1.02 kB 🟢 -881 B
assets/Media3DTop-D1a4iXXS.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +1.02 kB 🔴 +873 B
assets/MediaImageTop-BSoYRHSQ.js (new) 2.34 kB 🔴 +2.34 kB 🔴 +1.01 kB 🔴 +888 B
assets/MediaImageTop-Cz1VI0mc.js (removed) 2.34 kB 🟢 -2.34 kB 🟢 -1.01 kB 🟢 -886 B
assets/MediaAudioTop-BDEsaR6I.js (removed) 2 kB 🟢 -2 kB 🟢 -883 B 🟢 -762 B
assets/MediaAudioTop-BVkzgMl6.js (new) 2 kB 🔴 +2 kB 🔴 +883 B 🔴 +759 B
assets/rolldown-runtime-cVp-94Rc.js (new) 1.96 kB 🔴 +1.96 kB 🔴 +875 B 🔴 +756 B
assets/CloudRunButtonWrapper-CBsc60DQ.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +644 B 🔴 +563 B
assets/CloudRunButtonWrapper-Db6nTZ2U.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -643 B 🟢 -593 B
assets/auto-Bv9cmrEd.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -636 B 🟢 -563 B
assets/auto-ShMUXBDI.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +636 B 🔴 +562 B
assets/rolldown-runtime-CqTjxoQm.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -690 B 🟢 -623 B
assets/widgetPropFilter-DdGUGU83.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -568 B 🟢 -504 B
assets/widgetPropFilter-DfNT0CIY.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +569 B 🔴 +500 B
assets/cloudBadges-2U8Ek23-.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +539 B 🔴 +499 B
assets/cloudBadges-DXz5JyJt.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -537 B 🟢 -480 B
assets/graphHasMissingNodes-Bx39C_4p.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +458 B 🔴 +424 B
assets/graphHasMissingNodes-PlF60DZt.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -460 B 🟢 -421 B
assets/cloudSubscription-CUTS4QXz.js (new) 976 B 🔴 +976 B 🔴 +466 B 🔴 +401 B
assets/cloudSubscription-CYXzTb9D.js (removed) 976 B 🟢 -976 B 🟢 -459 B 🟢 -396 B
assets/previousFullPath-BcDss3RS.js (new) 838 B 🔴 +838 B 🔴 +414 B 🔴 +349 B
assets/previousFullPath-xzPidGnZ.js (removed) 838 B 🟢 -838 B 🟢 -412 B 🟢 -346 B
assets/nightlyBadges-D2EUhmmY.js (new) 594 B 🔴 +594 B 🔴 +358 B 🔴 +312 B
assets/nightlyBadges-R1RcZ8a_.js (removed) 594 B 🟢 -594 B 🟢 -356 B 🟢 -310 B
assets/widget-C_FImE7Q.js (new) 518 B 🔴 +518 B 🔴 +344 B 🔴 +290 B
assets/widget-Dneex3J5.js (removed) 518 B 🟢 -518 B 🟢 -342 B 🟢 -285 B
assets/WidgetBoundingBox-CTWd5ZRc.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +119 B
assets/WidgetBoundingBox-nifCFubT.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -112 B
assets/WidgetInputNumber-CE3GTKqN.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -121 B
assets/WidgetInputNumber-Dqqmmd0X.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +120 B
assets/WidgetLegacy-FEXhtc_O.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -106 B
assets/WidgetLegacy-jc30Om0A.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +111 B
assets/mixpanel.module-B-tghkeR.js (new) 143 B 🔴 +143 B 🔴 +125 B 🔴 +110 B
assets/mixpanel.module-CuV0p_Z6.js (removed) 143 B 🟢 -143 B 🟢 -125 B 🟢 -117 B
assets/Load3D-0VzvD59W.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -117 B
assets/Load3D-Cy8NYnbC.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +107 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 80 added / 80 removed

@github-actions
Copy link

github-actions bot commented Jan 6, 2026

🔧 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

@bigcat88 bigcat88 force-pushed the feat/backend-api-nodes-pricing-def branch 2 times, most recently from 5ab4187 to ff49062 Compare January 6, 2026 20:19
@DrJKL DrJKL added the claude-review Add to trigger a PR code review from Claude Code label Jan 7, 2026
@bigcat88 bigcat88 marked this pull request as ready for review January 18, 2026 08:24
@bigcat88 bigcat88 requested review from a team and jojodecayz as code owners January 18, 2026 08:24
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 18, 2026
@coderabbitai coderabbitai bot requested review from DrJKL and Myestery January 18, 2026 08:25
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@package.json`:
- Line 176: The package.json dependency for "jsonata" is catalog-resolved and
may resolve to a vulnerable version (per CVE-2024-27307); run npm ls jsonata to
determine the actual installed version, and if it falls in the vulnerable ranges
(>=1.4.0 <1.8.7 or >=2.0.0 <2.0.4) update the package resolution to a safe
release (preferably "2.1.0" or any >=1.8.7 / >=2.0.4), update the lockfile (npm
install or npm ci) and re-run tests and npm audit to ensure no transitive
packages still pull a vulnerable jsonata—change the "jsonata" entry in
package.json from the catalog spec to the explicit safe version and commit the
updated lockfile.

DrJKL
DrJKL previously approved these changes Jan 20, 2026
@DrJKL DrJKL removed their assignment Jan 20, 2026
@DrJKL DrJKL requested a review from AustinMroz January 20, 2026 08:59
DrJKL
DrJKL previously approved these changes Jan 21, 2026
AustinMroz
AustinMroz previously approved these changes Jan 21, 2026
Copy link
Collaborator

@AustinMroz AustinMroz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a lot, but the code, bleeding edge autogrow stuff, and reactivity handling all look good to me.

@DrJKL DrJKL added the preview label Jan 21, 2026
@bigcat88 bigcat88 dismissed stale reviews from AustinMroz and DrJKL via 0de24a3 January 22, 2026 06:36
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/composables/node/useNodeBadge.ts`:
- Around line 187-199: The cached badge only updates when
nodePricing.getNodeDisplayPrice(node) changes; include styling/settings in the
invalidation by adding a dependency (e.g. a badgeRevision or
themePaletteRevision) used alongside lastLabel inside the creditsBadgeGetter, or
reset the cache when those settings change via a watcher; update
creditsBadgeGetter to compare both label and revision (or clear
lastLabel/lastBadge in the watcher) so priceBadge.getCreditsBadge(label) is
re-run when palette/theme/badge settings change before pushing the getter onto
node.badges.

@bigcat88 bigcat88 enabled auto-merge (squash) January 22, 2026 08:44
@bigcat88 bigcat88 requested review from AustinMroz and DrJKL January 22, 2026 11:12
@bigcat88 bigcat88 merged commit 5c14227 into main Jan 22, 2026
29 checks passed
@bigcat88 bigcat88 deleted the feat/backend-api-nodes-pricing-def branch January 22, 2026 17:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

preview size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants