Skip to content

feat: wire essentials_category for Essentials tab display#9091

Open
christian-byrne wants to merge 3 commits intomainfrom
toolkit/wire-essentials-categorization
Open

feat: wire essentials_category for Essentials tab display#9091
christian-byrne wants to merge 3 commits intomainfrom
toolkit/wire-essentials-categorization

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Feb 22, 2026

Summary

Wire essentials_category through from backend to the Essentials tab UI. Creates a single source of truth for node categorization and ordering.

Changes

New file — src/constants/essentialsNodes.ts:

  • Single source of truth: ESSENTIALS_NODES (ordered nodes per category), ESSENTIALS_CATEGORIES (folder display order), ESSENTIALS_CATEGORY_MAP (flat lookup), TOOLKIT_NOVEL_NODE_NAMES (telemetry), TOOLKIT_BLUEPRINT_MODULES

Refactored files:

  • src/types/nodeSource.ts: Removed inline ESSENTIALS_CATEGORY_MOCK, imports ESSENTIALS_CATEGORY_MAP from centralized constants
  • src/services/nodeOrganizationService.ts: Removed inline NODE_ORDER_BY_FOLDER, imports ESSENTIALS_NODES and ESSENTIALS_CATEGORIES
  • src/constants/toolkitNodes.ts: Re-exports from essentialsNodes.ts instead of maintaining a separate list

Subgraph passthrough:

  • src/stores/subgraphStore.ts: Passes essentials_category from GlobalSubgraphData and extracts it from definitions.subgraphs[0] as fallback
  • src/platform/workflow/validation/schemas/workflowSchema.ts: Added essentials_category to SubgraphDefinitionBase and zSubgraphDefinition

Tests:

  • src/constants/essentialsNodes.test.ts: 6 tests validating no duplicates, complete coverage, basics exclusion
  • src/stores/subgraphStore.test.ts: 2 tests for essentials_category passthrough

All 43 relevant tests pass. Typecheck, lint, format clean.

Depends on: Comfy-Org/ComfyUI#12573

Fixes COM-15221

┆Issue is synchronized with this Notion page by Unito

@christian-byrne christian-byrne requested a review from a team as a code owner February 22, 2026 09:42
@notion-workspace
Copy link

@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 22, 2026
@dosubot
Copy link

dosubot bot commented Feb 22, 2026

Related Documentation

Checked 0 published document(s) in 1 knowledge base(s). No updates required.

How did I do? Any feedback?  Join Discord

@github-actions
Copy link

github-actions bot commented Feb 22, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 02/25/2026, 08:19:37 AM UTC

Links

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 22, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Introduce a centralized essentials node constants module, re-export toolkit sets, add an optional essentials_category to subgraph schema and node definitions, route ordering and category resolution through the new mappings, and add tests for mappings, passthrough, and canonicalization.

Changes

Cohort / File(s) Summary
Essentials constants & tests
src/constants/essentialsNodes.ts, src/constants/essentialsNodes.test.ts
Add centralized ESSENTIALS_CATEGORIES, EssentialsCategory type, ESSENTIALS_NODES, ESSENTIALS_CATEGORY_MAP, ESSENTIALS_CATEGORY_CANONICAL, TOOLKIT_NOVEL_NODE_NAMES, TOOLKIT_BLUEPRINT_MODULES; add invariants tests (uniqueness, mappings, exclusions, canonicalization, presence of comfy_essentials).
Toolkit exports
src/constants/toolkitNodes.ts
Remove in-file TOOLKIT_* definitions; re-export TOOLKIT_NOVEL_NODE_NAMES as TOOLKIT_NODE_NAMES and TOOLKIT_BLUEPRINT_MODULES from ./essentialsNodes.
Workflow schema
src/platform/workflow/validation/schemas/workflowSchema.ts
Extend SubgraphDefinitionBase and zSubgraphDefinition to include optional essentials_category?: string.
Subgraph store & tests
src/stores/subgraphStore.ts, src/stores/subgraphStore.test.ts
Propagate optional essentials_category into exported node definitions when loading/registering subgraph blueprints; add tests asserting passthrough and normalization (tests duplicated in diff).
Node organization service
src/services/nodeOrganizationService.ts
Replace hard-coded folder order and NODE_ORDER_BY_FOLDER with dynamic ordering using ESSENTIALS_CATEGORIES for folder priority and ESSENTIALS_NODES for per-folder node ordering.
Node source types & tests
src/types/nodeSource.ts, src/types/nodeSource.test.ts
Remove local mock mapping; import ESSENTIALS_CATEGORY_CANONICAL and ESSENTIALS_CATEGORY_MAP; add/export getEssentialsCategory; add tests for canonicalization and fallbacks; add Blueprint = 'blueprint' to NodeSourceType.
Public node def shape
src/schemas/nodeDefSchema (referenced)
ComfyNodeDefV1 now may include optional essentials_category?: string as part of exported node definitions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 I hopped through constants, tidy and neat,
Placed categories where blueprints and nodes meet,
I nudged labels, sorted order with care,
A little rabbit mapping everywhere. 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'feat: wire essentials_category for Essentials tab display' clearly and concisely describes the main objective of the changeset.
Description check ✅ Passed The PR description covers all required template sections: Summary explains the change and its purpose, Changes details what was modified with clear subsections, and critical design decisions are highlighted.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch toolkit/wire-essentials-categorization

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

@github-actions
Copy link

github-actions bot commented Feb 22, 2026

🎭 Playwright: ✅ 543 passed, 0 failed · 7 flaky

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

@github-actions
Copy link

github-actions bot commented Feb 22, 2026

📦 Bundle: 4.41 MB gzip 🔴 +329 B

Details

Summary

  • Raw size: 20.7 MB baseline 20.7 MB — 🔴 +460 B
  • Gzip: 4.41 MB baseline 4.41 MB — 🔴 +329 B
  • Brotli: 3.41 MB baseline 3.41 MB — 🔴 +265 B
  • Bundles: 227 current • 227 baseline • 107 added / 107 removed

Category Glance
Data & Services 🔴 +459 B (2.54 MB) · Panels & Settings 🔴 +1 B (435 kB) · Vendor & Third-Party ⚪ 0 B (8.84 MB) · Other ⚪ 0 B (7.7 MB) · Graph Workspace ⚪ 0 B (970 kB) · Views & Navigation ⚪ 0 B (72.1 kB) · + 5 more

App Entry Points — 17.9 kB (baseline 17.9 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BlPOvsPo.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -6.34 kB 🟢 -5.51 kB
assets/index-CnIV9maJ.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +6.34 kB 🔴 +5.5 kB

Status: 1 added / 1 removed

Graph Workspace — 970 kB (baseline 970 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CexzTp6V.js (removed) 970 kB 🟢 -970 kB 🟢 -209 kB 🟢 -158 kB
assets/GraphView-D9aRx2YC.js (new) 970 kB 🔴 +970 kB 🔴 +209 kB 🔴 +158 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-Crsl4q83.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudSurveyView-K7xuLcSm.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudLoginView-ByUdEcum.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.19 kB 🟢 -2.81 kB
assets/CloudLoginView-CG-qH0om.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.19 kB 🔴 +2.82 kB
assets/CloudSignupView-Bl1HcSjI.js (new) 9.37 kB 🔴 +9.37 kB 🔴 +2.69 kB 🔴 +2.37 kB
assets/CloudSignupView-Dmb6gl1l.js (removed) 9.37 kB 🟢 -9.37 kB 🟢 -2.69 kB 🟢 -2.37 kB
assets/UserCheckView-BWMYD9oJ.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.95 kB
assets/UserCheckView-CQQDHuz2.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/CloudLayoutView-DnQlrhvb.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.1 kB 🟢 -1.82 kB
assets/CloudLayoutView-dWVK0oPs.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.1 kB 🔴 +1.82 kB
assets/CloudForgotPasswordView-ClpJvrJ9.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.93 kB 🔴 +1.7 kB
assets/CloudForgotPasswordView-DSyHol2A.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.93 kB 🟢 -1.7 kB
assets/CloudAuthTimeoutView-B8lrT1at.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-D8HQiAEo.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudSubscriptionRedirectView-DsQBrM5i.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.78 kB 🟢 -1.58 kB
assets/CloudSubscriptionRedirectView-HI4krONV.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.79 kB 🔴 +1.58 kB
assets/UserSelectView-C8aNC_Nw.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.46 kB
assets/UserSelectView-DavpxsfJ.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.46 kB
assets/CloudSorryContactSupportView-CY9LHUzS.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-De5xw-yi.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 435 kB (baseline 435 kB) • 🔴 +1 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-Cdd4Dwd3.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.66 kB
assets/SecretsPanel-dmW_ivFV.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.31 kB 🔴 +4.66 kB
assets/LegacyCreditsPanel-Hp651gN0.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.56 kB 🔴 +4.9 kB
assets/LegacyCreditsPanel-Cq7YCqiI.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.56 kB 🟢 -4.89 kB
assets/SubscriptionPanel-m0WxVAH_.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +4.65 kB 🔴 +4.1 kB
assets/SubscriptionPanel-UEIySKCE.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -4.64 kB 🟢 -4.08 kB
assets/KeybindingPanel-9UOunMQk.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.51 kB 🟢 -3.12 kB
assets/KeybindingPanel-DmMKWmDG.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.51 kB 🔴 +3.11 kB
assets/AboutPanel-4bmNKAxG.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.47 kB
assets/AboutPanel-DVvAp0SC.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.73 kB 🔴 +2.46 kB
assets/ExtensionPanel-BP0EWsV3.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.36 kB
assets/ExtensionPanel-DPkfvO_I.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.64 kB 🟢 -2.36 kB
assets/ServerConfigPanel-BDrJ-H3G.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.12 kB 🟢 -1.92 kB
assets/ServerConfigPanel-Vr8my6-Y.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.12 kB 🔴 +1.9 kB
assets/UserPanel-CRCKp1Lh.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.99 kB 🔴 +1.75 kB
assets/UserPanel-CYzI4PP-.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/cloudRemoteConfig-B1lBG2kr.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +703 B 🔴 +611 B
assets/cloudRemoteConfig-Dt0lQnZj.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -703 B 🟢 -615 B
assets/refreshRemoteConfig-BALV4YsX.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -522 B 🟢 -458 B
assets/refreshRemoteConfig-xnvTGvRw.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +519 B 🔴 +466 B
assets/config-Tm3IpjoS.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-axAeoUrZ.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B2VYgS-a.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BAN61mfQ.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BNn9zn5v.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CIIZ9BHS.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CRqB5n8m.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cs_NVkbc.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CYbBf6ct.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhTbqRj2.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DW8FtJHC.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-FzjdIfFm.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-Ckdb_Tsk.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +990 B
assets/auth-D5YLM5ue.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -983 B
assets/SignUpForm-DjSsX8qS.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.09 kB
assets/SignUpForm-DOcZy72V.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/UpdatePasswordContent-5EOcXL-K.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.06 kB 🟢 -938 B
assets/UpdatePasswordContent-qeT2ZwGn.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +939 B
assets/firebaseAuthStore-BQsAONYK.js (new) 788 B 🔴 +788 B 🔴 +385 B 🔴 +348 B
assets/firebaseAuthStore-CBNp5Pam.js (removed) 788 B 🟢 -788 B 🟢 -380 B 🟢 -341 B
assets/auth-BUsz1i8Q.js (new) 357 B 🔴 +357 B 🔴 +225 B 🔴 +193 B
assets/auth-CZboWtnN.js (removed) 357 B 🟢 -357 B 🟢 -224 B 🟢 -192 B
assets/PasswordFields-DLbVLg8O.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-CK1MFS2B.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Editors & Dialogs — 736 B (baseline 736 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CK16V7Qo.js (removed) 736 B 🟢 -736 B 🟢 -377 B 🟢 -325 B
assets/useSubscriptionDialog-Dy1FWb-9.js (new) 736 B 🔴 +736 B 🔴 +379 B 🔴 +335 B

Status: 1 added / 1 removed

UI Components — 47.1 kB (baseline 47.1 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-DAD3DLYN.js (new) 9.84 kB 🔴 +9.84 kB 🔴 +3.4 kB 🔴 +3 kB
assets/useTerminalTabs-NmgHJdAE.js (removed) 9.84 kB 🟢 -9.84 kB 🟢 -3.39 kB 🟢 -3 kB
assets/ComfyQueueButton-cVRt4Xxw.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.23 kB
assets/ComfyQueueButton-O1fxDdMJ.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.23 kB
assets/SubscribeButton-21O8e5ls.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +1.07 kB 🔴 +943 B
assets/SubscribeButton-DVGWQhXw.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -1.07 kB 🟢 -957 B
assets/cloudFeedbackTopbarButton-C7TnSGBy.js (new) 1.59 kB 🔴 +1.59 kB 🔴 +851 B 🔴 +756 B
assets/cloudFeedbackTopbarButton-CFNgLIag.js (removed) 1.59 kB 🟢 -1.59 kB 🟢 -850 B 🟢 -757 B
assets/ComfyQueueButton-BLdHswOB.js (removed) 793 B 🟢 -793 B 🟢 -391 B 🟢 -352 B
assets/ComfyQueueButton-CzVuUvzP.js (new) 793 B 🔴 +793 B 🔴 +392 B 🔴 +352 B
assets/Button-_rljyWPY.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-3Sx8hN5O.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-BMvJlldl.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-CVilsRHA.js 5.94 kB 5.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-DI3pRSdp.js 7.44 kB 7.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-CnQQLXB-.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-C7_gkZBQ.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 2.54 MB (baseline 2.54 MB) • 🔴 +459 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-uv9EeoNN.js (removed) 1.74 MB 🟢 -1.74 MB 🟢 -391 kB 🟢 -294 kB
assets/dialogService-BByzZiZn.js (new) 1.73 MB 🔴 +1.73 MB 🔴 +390 kB 🔴 +294 kB
assets/api-zyXlN6ut.js (new) 677 kB 🔴 +677 kB 🔴 +153 kB 🔴 +122 kB
assets/api-B0Dfj--7.js (removed) 676 kB 🟢 -676 kB 🟢 -153 kB 🟢 -121 kB
assets/load3dService-BlhMSiJ2.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/load3dService-Dsh7d8le.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/extensionStore-B4YfXOK7.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +4.21 kB 🔴 +3.69 kB
assets/extensionStore-CfltnF2u.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -4.21 kB 🟢 -3.7 kB
assets/releaseStore-exEapnUt.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/releaseStore-pl8b_B66.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.95 kB
assets/keybindingService-B-GSpkZy.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.47 kB
assets/keybindingService-CS1fklPf.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.47 kB
assets/bootstrapStore-BgnKoHR1.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -873 B 🟢 -791 B
assets/bootstrapStore-JqjArLC6.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +876 B 🔴 +792 B
assets/userStore-BxYlCP48.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -720 B 🟢 -675 B
assets/userStore-DlbjQA0N.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +720 B 🔴 +634 B
assets/audioService-BCSj5Qcn.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -849 B 🟢 -725 B
assets/audioService-BV6P53bm.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +850 B 🔴 +727 B
assets/releaseStore-CaqjN0nq.js (new) 760 B 🔴 +760 B 🔴 +381 B 🔴 +347 B
assets/releaseStore-em-j19U4.js (removed) 760 B 🟢 -760 B 🟢 -380 B 🟢 -339 B
assets/settingStore-CNi4kKX7.js (removed) 744 B 🟢 -744 B 🟢 -381 B 🟢 -336 B
assets/settingStore-NC-S6N7V.js (new) 744 B 🔴 +744 B 🔴 +386 B 🔴 +346 B
assets/workflowDraftStore-Bhim3-YC.js (removed) 736 B 🟢 -736 B 🟢 -372 B 🟢 -328 B
assets/workflowDraftStore-CGc081hZ.js (new) 736 B 🔴 +736 B 🔴 +374 B 🔴 +338 B
assets/dialogService-BD_158LK.js (removed) 725 B 🟢 -725 B 🟢 -365 B 🟢 -323 B
assets/dialogService-DINUNIxH.js (new) 725 B 🔴 +725 B 🔴 +366 B 🔴 +331 B
assets/serverConfigStore-CkFMhmxK.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-C1OXs1Mp.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.2 kB
assets/useLoad3d-DiQLQRBF.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.2 kB
assets/useLoad3dViewer-7vMloS_5.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.79 kB
assets/useLoad3dViewer-DkLDS9xA.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useFeatureFlags-CfxKVZwT.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.24 kB 🟢 -1.05 kB
assets/useFeatureFlags-DtDtLl5k.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.24 kB 🔴 +1.05 kB
assets/useWorkspaceUI-9LL4dBXl.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +705 B
assets/useWorkspaceUI-CR08Rxha.js (removed) 3 kB 🟢 -3 kB 🟢 -821 B 🟢 -736 B
assets/subscriptionCheckoutUtil-3cJVto2x.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +952 B
assets/subscriptionCheckoutUtil-OaMvNWaY.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -958 B
assets/useErrorHandling-B-_whQuI.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -629 B 🟢 -532 B
assets/useErrorHandling-ItD30ZBw.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +630 B 🔴 +534 B
assets/useWorkspaceSwitch-B_4Z-FAu.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -546 B 🟢 -486 B
assets/useWorkspaceSwitch-Yltjng8C.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +545 B 🔴 +482 B
assets/useLoad3d-BZ0Pq-BC.js (new) 859 B 🔴 +859 B 🔴 +422 B 🔴 +384 B
assets/useLoad3d-CKwhNdkC.js (removed) 859 B 🟢 -859 B 🟢 -423 B 🟢 -379 B
assets/audioUtils-_dH-V21e.js (removed) 858 B 🟢 -858 B 🟢 -499 B 🟢 -424 B
assets/audioUtils-Cs1x3-dd.js (new) 858 B 🔴 +858 B 🔴 +500 B 🔴 +421 B
assets/useLoad3dViewer-D0w0aau2.js (new) 838 B 🔴 +838 B 🔴 +407 B 🔴 +376 B
assets/useLoad3dViewer-DPfDR1-F.js (removed) 838 B 🟢 -838 B 🟢 -407 B 🟢 -366 B
assets/useCurrentUser-Q7FveD7Y.js (new) 722 B 🔴 +722 B 🔴 +373 B 🔴 +330 B
assets/useCurrentUser-Wd1N7kJM.js (removed) 722 B 🟢 -722 B 🟢 -368 B 🟢 -325 B
assets/_plugin-vue_export-helper-c0As6Sx3.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-C2D2Hl5T.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-Clzmwvt4.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Cddas8Zl.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-BurQ8r4O.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 11 added / 11 removed

Vendor & Third-Party — 8.84 MB (baseline 8.84 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DNX73mqE.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-Cj6OpvOm.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-BnCPTL0g.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-DVmi2O2Z.js 388 kB 388 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BnYkbQDM.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-DtiQ1dr9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-D2jVNnmE.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DK6Ygydn.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.7 MB (baseline 7.7 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CROtxbE6.js (removed) 72.7 kB 🟢 -72.7 kB 🟢 -18.8 kB 🟢 -16.1 kB
assets/core-Dw2tYlR2.js (new) 72.7 kB 🔴 +72.7 kB 🔴 +18.8 kB 🔴 +16.1 kB
assets/groupNode-Cy5ERA4p.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/groupNode-rNuk8hfI.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.6 kB
assets/WidgetSelect-D0EdEgJN.js (removed) 58.1 kB 🟢 -58.1 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/WidgetSelect-EWamJY80.js (new) 58.1 kB 🔴 +58.1 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-3LaJrSO_.js (removed) 46.3 kB 🟢 -46.3 kB 🟢 -8.65 kB 🟢 -7.51 kB
assets/SubscriptionRequiredDialogContentWorkspace-BT2V8NnO.js (new) 46.3 kB 🔴 +46.3 kB 🔴 +8.65 kB 🔴 +7.52 kB
assets/Load3DControls-DQxH6Uow.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/Load3DControls-DRi99MoG.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.64 kB
assets/WorkspacePanelContent-CNIWq_ZP.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.39 kB
assets/WorkspacePanelContent-D0Zo6tQx.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.15 kB 🔴 +5.42 kB
assets/SubscriptionRequiredDialogContent-CRtJpihY.js (new) 25.7 kB 🔴 +25.7 kB 🔴 +6.57 kB 🔴 +5.78 kB
assets/SubscriptionRequiredDialogContent-DvNuSxd1.js (removed) 25.7 kB 🟢 -25.7 kB 🟢 -6.57 kB 🟢 -5.79 kB
assets/Load3dViewerContent-CsNeEZP9.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.49 kB
assets/Load3dViewerContent-Db_n5CFd.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.49 kB
assets/WidgetImageCrop-DiO2BH91.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.5 kB 🔴 +4.85 kB
assets/WidgetImageCrop-Hrx9cLUq.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.5 kB 🟢 -4.85 kB
assets/SubscriptionPanelContentWorkspace-fi_plkWd.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.03 kB 🟢 -4.44 kB
assets/SubscriptionPanelContentWorkspace-Z_4CFLJX.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.04 kB 🔴 +4.45 kB
assets/CurrentUserPopoverWorkspace-CDjKjpLB.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +4.88 kB 🔴 +4.35 kB
assets/CurrentUserPopoverWorkspace-CiX5P0ml.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -4.88 kB 🟢 -4.34 kB
assets/SignInContent-CAk5SvEN.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.75 kB 🔴 +4.16 kB
assets/SignInContent-CzybVyou.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.75 kB 🟢 -4.17 kB
assets/WidgetInputNumber-DBKAFhee.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.75 kB 🟢 -4.22 kB
assets/WidgetInputNumber-EgvBTKJy.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.75 kB 🔴 +4.22 kB
assets/WidgetRecordAudio-B3yLo-DW.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.94 kB 🔴 +4.42 kB
assets/WidgetRecordAudio-DSUP20VN.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.94 kB 🟢 -4.42 kB
assets/Load3D-CTbvj96D.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.51 kB
assets/Load3D-DkMvCXoO.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.51 kB
assets/load3d-D9dGFEf6.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.19 kB 🔴 +3.62 kB
assets/load3d-debIGo3J.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.19 kB 🟢 -3.63 kB
assets/AudioPreviewPlayer-B6k9pEZz.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.19 kB 🔴 +2.85 kB
assets/AudioPreviewPlayer-FgSglkhJ.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.19 kB 🟢 -2.87 kB
assets/changeTracker-D1HfMGrj.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.89 kB 🟢 -2.54 kB
assets/changeTracker-I_lzf_UM.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.55 kB
assets/nodeTemplates-BiC4lTr3.js (new) 9.29 kB 🔴 +9.29 kB 🔴 +3.25 kB 🔴 +2.86 kB
assets/nodeTemplates-Bsn7VylJ.js (removed) 9.29 kB 🟢 -9.29 kB 🟢 -3.25 kB 🟢 -2.86 kB
assets/InviteMemberDialogContent-D5NGhOPV.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.29 kB 🔴 +2.01 kB
assets/InviteMemberDialogContent-fBEYX27v.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.29 kB 🟢 -2 kB
assets/Load3DConfiguration-_SI8PZOF.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.91 kB 🔴 +1.68 kB
assets/Load3DConfiguration-BoBpb_lz.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-B3_T-Zwm.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.99 kB 🔴 +1.73 kB
assets/CreateWorkspaceDialogContent-BlCfGDa-.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/onboardingCloudRoutes-Cc7zneRG.js (removed) 5.41 kB 🟢 -5.41 kB 🟢 -1.83 kB 🟢 -1.59 kB
assets/onboardingCloudRoutes-CoUAtdyc.js (new) 5.41 kB 🔴 +5.41 kB 🔴 +1.83 kB 🔴 +1.62 kB
assets/FreeTierDialogContent-a2ztIqLB.js (removed) 5.39 kB 🟢 -5.39 kB 🟢 -1.89 kB 🟢 -1.66 kB
assets/FreeTierDialogContent-a9q9lKuA.js (new) 5.39 kB 🔴 +5.39 kB 🔴 +1.9 kB 🔴 +1.68 kB
assets/EditWorkspaceDialogContent-6xF7iok1.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.94 kB 🟢 -1.69 kB
assets/EditWorkspaceDialogContent-BBaOgvjM.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.95 kB 🔴 +1.69 kB
assets/ValueControlPopover-BHGModup.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/ValueControlPopover-BQCoBdAn.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/Preview3d-BRtrmFPc.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/Preview3d-BVeGko4x.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.56 kB 🟢 -1.36 kB
assets/CancelSubscriptionDialogContent-g57eRGM2.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/CancelSubscriptionDialogContent-ZiKaEkJk.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/DeleteWorkspaceDialogContent-BhZc5YVd.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.42 kB
assets/DeleteWorkspaceDialogContent-Cimu8acF.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.63 kB 🔴 +1.42 kB
assets/WidgetWithControl-BehSEEwJ.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.77 kB 🟢 -1.59 kB
assets/WidgetWithControl-CvdcbR1G.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.77 kB 🔴 +1.6 kB
assets/LeaveWorkspaceDialogContent-Cv7FKJkn.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.58 kB 🔴 +1.37 kB
assets/LeaveWorkspaceDialogContent-DbGJYlwO.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.58 kB 🟢 -1.37 kB
assets/RemoveMemberDialogContent-BgG-MFCp.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.52 kB 🟢 -1.33 kB
assets/RemoveMemberDialogContent-TPGbToQM.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/RevokeInviteDialogContent-B0hYO8Nh.js (new) 3.95 kB 🔴 +3.95 kB 🔴 +1.54 kB 🔴 +1.35 kB
assets/RevokeInviteDialogContent-C10pqyf-.js (removed) 3.95 kB 🟢 -3.95 kB 🟢 -1.54 kB 🟢 -1.35 kB
assets/InviteMemberUpsellDialogContent-DRTdN1d4.js (removed) 3.82 kB 🟢 -3.82 kB 🟢 -1.4 kB 🟢 -1.23 kB
assets/InviteMemberUpsellDialogContent-yeLZm2TN.js (new) 3.82 kB 🔴 +3.82 kB 🔴 +1.4 kB 🔴 +1.23 kB
assets/tierBenefits-BTiCjrdx.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.3 kB 🟢 -1.15 kB
assets/tierBenefits-C50yKCmo.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.3 kB 🔴 +1.17 kB
assets/saveMesh-CNj2gr_1.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.46 kB 🔴 +1.29 kB
assets/saveMesh-fLUdhuzd.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.45 kB 🟢 -1.28 kB
assets/cloudSessionCookie-DfdU2-6w.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.08 kB 🟢 -943 B
assets/cloudSessionCookie-DyRv8AWn.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.08 kB 🔴 +942 B
assets/GlobalToast-DsJSYMjK.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.03 kB
assets/GlobalToast-L7gVr7nm.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.03 kB
assets/SubscribeToRun-CPEWYCu8.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +880 B
assets/SubscribeToRun-gArn_sVG.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -874 B
assets/CloudRunButtonWrapper-CxfMwOn5.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -782 B 🟢 -700 B
assets/CloudRunButtonWrapper-DGHCOGY6.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +785 B 🔴 +713 B
assets/previousFullPath-C_cYjFUN.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -648 B 🟢 -556 B
assets/previousFullPath-CIG3PdIr.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +649 B 🔴 +571 B
assets/cloudBadges-BkP5iEDK.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -699 B 🟢 -612 B
assets/cloudBadges-DB1FuZkI.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +699 B 🔴 +609 B
assets/cloudSubscription-JCh-HpW_.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +656 B 🔴 +575 B
assets/cloudSubscription-Q0c68gPr.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -653 B 🟢 -569 B
assets/Load3D-DpPvssjl.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -496 B 🟢 -438 B
assets/Load3D-erNaLxm7.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +497 B 🔴 +445 B
assets/nightlyBadges-BjyLFj9d.js (new) 1 kB 🔴 +1 kB 🔴 +528 B 🔴 +482 B
assets/nightlyBadges-D_TzKhaO.js (removed) 1 kB 🟢 -1 kB 🟢 -527 B 🟢 -474 B
assets/Load3dViewerContent-Brfp6kF4.js (removed) 993 B 🟢 -993 B 🟢 -464 B 🟢 -408 B
assets/Load3dViewerContent-Ct7lQc7K.js (new) 993 B 🔴 +993 B 🔴 +466 B 🔴 +419 B
assets/SubscriptionPanelContentWorkspace-B64JSS8U.js (removed) 920 B 🟢 -920 B 🟢 -434 B 🟢 -379 B
assets/SubscriptionPanelContentWorkspace-CTl7hWij.js (new) 920 B 🔴 +920 B 🔴 +437 B 🔴 +387 B
assets/graphHasMissingNodes-BGZ_r-_R.js (new) 761 B 🔴 +761 B 🔴 +373 B 🔴 +329 B
assets/graphHasMissingNodes-DiRBaEFL.js (removed) 761 B 🟢 -761 B 🟢 -372 B 🟢 -319 B
assets/changeTracker-ClL457EN.js (removed) 757 B 🟢 -757 B 🟢 -380 B 🟢 -338 B
assets/changeTracker-Dv0vRabw.js (new) 757 B 🔴 +757 B 🔴 +381 B 🔴 +342 B
assets/WidgetLegacy-Clowb13Z.js (removed) 745 B 🟢 -745 B 🟢 -378 B 🟢 -333 B
assets/WidgetLegacy-Dj_h48CP.js (new) 745 B 🔴 +745 B 🔴 +383 B 🔴 +340 B
assets/WidgetInputNumber-BBEiNlM-.js (new) 469 B 🔴 +469 B 🔴 +263 B 🔴 +226 B
assets/WidgetInputNumber-BC-N8L3T.js (removed) 469 B 🟢 -469 B 🟢 -262 B 🟢 -225 B
assets/AnimationControls-CS8RJ8KB.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-8llC21jy.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-C7TdQsa4.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-D9MrYETV.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-hCSVqQLq.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bdca9E4N.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Boqbp4FE.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-ClFTZZY8.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CnE4PBoq.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CNvwc2P-.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CsOV8HcO.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DBggpNhX.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DC4TJj5_.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DPVHiFlP.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-eBbhcNBX.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-oGOH5erQ.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-htt0vt7m.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-DtY8vzqB.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-k35Nu_-R.js 525 kB 525 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-1z73i49i.js 127 kB 127 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BCR0ud7B.js 179 kB 179 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BQOQJL-T.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BvA8cB3F.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CDjYBGc8.js 200 kB 200 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CK3DvL93.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Csm5QLPb.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dftwv9CD.js 146 kB 146 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DTEsru8O.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-lPfR5YFT.js 165 kB 165 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-zKyLtJXx.js 173 kB 173 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CouvCIvd.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CJNtJ1Vf.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CsrUK1I8.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-DT9GM-Zv.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-vLt-EA1h.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-pufIlXJs.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs--tG2_kTy.js 390 kB 390 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B1CcRnYm.js 443 kB 443 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BOkmcPF-.js 397 kB 397 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C9THNc4O.js 442 kB 442 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CBfcBh4b.js 362 kB 362 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CZlGuvdG.js 385 kB 385 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DB-aHpeo.js 393 kB 393 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DPlU1YTi.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-mmU8eLDX.js 409 kB 409 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-rItghg3p.js 483 kB 483 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-s5_Usl0F.js 393 kB 393 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-BRmRgwNy.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-D-D55K_n.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-DtIjOzur.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-C6m7fecr.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-PwE2kea4.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-BYIJyGB1.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-CMR8YZxL.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-NeEr3XWN.js 586 B 586 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-3ihy3W8s.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-B1dc4Mvs.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-DhNMsSAU.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DJsye3-P.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-CNAR8Elf.js 9.35 kB 9.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-C6rgr8eT.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-CZz83z3_.js 6.95 kB 6.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-BxRXwRGF.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BDX3pgBi.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-BryTE-VI.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-_HM7alVA.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CyuPe5ty.js 3.96 kB 3.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-Du7wrnv6.js 6.8 kB 6.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DjwSopYV.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 51 added / 51 removed

dante01yoon
dante01yoon previously approved these changes Feb 22, 2026
@christian-byrne christian-byrne added the New Browser Test Expectations New browser test screenshot should be set by github action label Feb 23, 2026
@github-actions
Copy link

Updating Playwright Expectations

@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Feb 23, 2026
@benceruleanlu
Copy link
Member

Sorry about the late review, taking a look now

Copy link
Member

@benceruleanlu benceruleanlu left a comment

Choose a reason for hiding this comment

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

  • indexOf is case sensitive, the backend PR adds title cased categories, while the frontend expects lowercased, this will cause mismatches
  • I don't know if snapshot changes are expected

christian-byrne and others added 2 commits February 24, 2026 23:36
- Add essentialsNodes.ts as single source of truth for node categorization
  and ordering, consolidating three separate lists
- Pass essentials_category through subgraphStore from blueprints and
  global subgraph data to node definitions
- Add essentials_category to SubgraphDefinitionBase schema
- Refactor toolkitNodes.ts, nodeSource.ts, nodeOrganizationService.ts
  to import from the centralized constants
- Add tests for constants integrity and subgraph passthrough

Fixes COM-15221

Amp-Thread-ID: https://ampcode.com/threads/T-019c83de-f7ab-7779-a451-0ba5940b56a9
@christian-byrne christian-byrne force-pushed the toolkit/wire-essentials-categorization branch from 70ccad6 to 13e40d0 Compare February 25, 2026 07:43
@christian-byrne
Copy link
Contributor Author

Addressed review feedback:

  1. Case sensitivity fix: Added ESSENTIALS_CATEGORY_CANONICAL map that normalizes backend categories (title-cased like 'Image Generation') to the canonical form used in ESSENTIALS_CATEGORIES (e.g. 'image generation'). This also correctly preserves special cases like '3D''3D' (not '3d'). The normalization happens in getEssentialsCategory() so it's applied uniformly for all consumers.

  2. Snapshot changes: The snapshot changes are expected — the expanded ESSENTIALS_NODES list means more nodes now show essentials badges, changing the badge screenshots.

Also rebased on latest main.

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.

🧹 Nitpick comments (1)
src/constants/essentialsNodes.ts (1)

81-95: Preserve category union type in derived maps.

Line 81 and Line 93 currently widen values to string; that loses EssentialsCategory safety for consumers.

♻️ Proposed type-safety refinement
-export const ESSENTIALS_CATEGORY_MAP: Record<string, string> =
+export const ESSENTIALS_CATEGORY_MAP: Record<string, EssentialsCategory> =
   Object.fromEntries(
     Object.entries(ESSENTIALS_NODES).flatMap(([category, nodes]) =>
       nodes.map((node) => [node, category])
     )
   )

-export const ESSENTIALS_CATEGORY_CANONICAL: ReadonlyMap<string, string> =
+export const ESSENTIALS_CATEGORY_CANONICAL:
+  ReadonlyMap<string, EssentialsCategory> =
   new Map(ESSENTIALS_CATEGORIES.map((c) => [c.toLowerCase(), c]))

As per coding guidelines src/**/*.ts: Use TypeScript for type safety.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/constants/essentialsNodes.ts` around lines 81 - 95, The derived maps
currently widen their value types to string; change their declarations and/or
casts to preserve the EssentialsCategory union. For ESSENTIALS_CATEGORY_MAP,
replace Record<string, string> with Record<string, EssentialsCategory> (or
assert the result: Object.fromEntries(...) as Record<string,
EssentialsCategory>) and ensure the entries are produced from ESSENTIALS_NODES
so values are typed as EssentialsCategory. For ESSENTIALS_CATEGORY_CANONICAL,
change ReadonlyMap<string, string> to ReadonlyMap<string, EssentialsCategory>
and ensure the mapping expression yields EssentialsCategory values (e.g., map c
=> [c.toLowerCase(), c as EssentialsCategory] or otherwise maintain the union
type). Update only the type annotations/casts; do not change runtime logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/constants/essentialsNodes.ts`:
- Around line 81-95: The derived maps currently widen their value types to
string; change their declarations and/or casts to preserve the
EssentialsCategory union. For ESSENTIALS_CATEGORY_MAP, replace Record<string,
string> with Record<string, EssentialsCategory> (or assert the result:
Object.fromEntries(...) as Record<string, EssentialsCategory>) and ensure the
entries are produced from ESSENTIALS_NODES so values are typed as
EssentialsCategory. For ESSENTIALS_CATEGORY_CANONICAL, change
ReadonlyMap<string, string> to ReadonlyMap<string, EssentialsCategory> and
ensure the mapping expression yields EssentialsCategory values (e.g., map c =>
[c.toLowerCase(), c as EssentialsCategory] or otherwise maintain the union
type). Update only the type annotations/casts; do not change runtime logic.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3fa6920 and 13e40d0.

⛔ Files ignored due to path filters (2)
  • browser_tests/tests/nodeBadge.spec.ts-snapshots/node-badge-Hide-built-in-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/nodeBadge.spec.ts-snapshots/node-badge-Show-all-chromium-linux.png is excluded by !**/*.png
📒 Files selected for processing (3)
  • src/constants/essentialsNodes.test.ts
  • src/constants/essentialsNodes.ts
  • src/constants/toolkitNodes.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/constants/essentialsNodes.test.ts

@christian-byrne christian-byrne force-pushed the toolkit/wire-essentials-categorization branch from 13e40d0 to 2112beb Compare February 25, 2026 07:55
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.

🧹 Nitpick comments (2)
src/types/nodeSource.ts (1)

41-45: Normalize whitespace before canonical lookup.

toLowerCase() alone leaves leading/trailing spaces, so values like 'Image Generation ' remain non-canonical and can propagate downstream.

♻️ Proposed fix
 export function getEssentialsCategory(
   name?: string,
   essentials_category?: string
 ): string | undefined {
-  const canonical = essentials_category
-    ? (ESSENTIALS_CATEGORY_CANONICAL.get(essentials_category.toLowerCase()) ??
-      essentials_category.toLowerCase())
+  const normalizedCategory = essentials_category?.trim().toLowerCase()
+  const canonical = normalizedCategory
+    ? (ESSENTIALS_CATEGORY_CANONICAL.get(normalizedCategory) ??
+      normalizedCategory)
     : undefined
   return canonical ?? (name ? ESSENTIALS_CATEGORY_MAP[name] : undefined)
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/types/nodeSource.ts` around lines 41 - 45, The canonical lookup currently
uses essentials_category.toLowerCase() which preserves leading/trailing
whitespace; update the logic in the canonical computation (the canonical
variable) to normalize whitespace by calling trim() before lowercasing (e.g.,
use essentials_category.trim().toLowerCase()) and also normalize the fallback
key when consulting ESSENTIALS_CATEGORY_MAP (normalize name with
trim()/toLowerCase or appropriate casing) so ESSENTIALS_CATEGORY_CANONICAL and
ESSENTIALS_CATEGORY_MAP lookups succeed for values like "Image Generation ".
src/stores/subgraphStore.test.ts (1)

518-585: Add a conflict-precedence case for essentials_category.

Current tests cover direct value and fallback, but not which source wins when both are present and disagree.

🧪 Optional test to lock precedence behavior
 describe('essentials_category passthrough', () => {
+  it('should prefer GlobalSubgraphData essentials_category over definition fallback', async () => {
+    const graphWithEssentials = {
+      ...mockGraph,
+      definitions: {
+        subgraphs: [
+          {
+            ...mockGraph.definitions?.subgraphs?.[0],
+            essentials_category: 'Image Tools'
+          }
+        ]
+      }
+    }
+    await mockFetch(
+      {},
+      {
+        bp_precedence: {
+          name: 'Precedence Blueprint',
+          info: { node_pack: 'test_pack' },
+          data: JSON.stringify(graphWithEssentials),
+          essentials_category: 'Video Generation'
+        }
+      }
+    )
+    const nodeDef = useNodeDefStore().nodeDefs.find(
+      (d) => d.name === 'SubgraphBlueprint.bp_precedence'
+    )
+    expect(nodeDef?.essentials_category).toBe('video generation')
+  })
+
   it('should pass essentials_category from GlobalSubgraphData to node def', async () => {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/stores/subgraphStore.test.ts` around lines 518 - 585, Add a test case in
the same "essentials_category passthrough" suite that creates a conflict (both
GlobalSubgraphData/top-level blueprint object and the nested subgraph definition
include differing essentials_category values) using mockFetch and the same
pattern as the other tests, then find the nodeDef via
useNodeDefStore().nodeDefs.find for the matching 'SubgraphBlueprint.bp_*' name
and assert that the nodeDef.essentials_category equals the canonicalized value
coming from the top-level/global blueprint (i.e., verify the global/top-level
field takes precedence over the nested subgraph definition).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/stores/subgraphStore.test.ts`:
- Around line 518-585: Add a test case in the same "essentials_category
passthrough" suite that creates a conflict (both GlobalSubgraphData/top-level
blueprint object and the nested subgraph definition include differing
essentials_category values) using mockFetch and the same pattern as the other
tests, then find the nodeDef via useNodeDefStore().nodeDefs.find for the
matching 'SubgraphBlueprint.bp_*' name and assert that the
nodeDef.essentials_category equals the canonicalized value coming from the
top-level/global blueprint (i.e., verify the global/top-level field takes
precedence over the nested subgraph definition).

In `@src/types/nodeSource.ts`:
- Around line 41-45: The canonical lookup currently uses
essentials_category.toLowerCase() which preserves leading/trailing whitespace;
update the logic in the canonical computation (the canonical variable) to
normalize whitespace by calling trim() before lowercasing (e.g., use
essentials_category.trim().toLowerCase()) and also normalize the fallback key
when consulting ESSENTIALS_CATEGORY_MAP (normalize name with trim()/toLowerCase
or appropriate casing) so ESSENTIALS_CATEGORY_CANONICAL and
ESSENTIALS_CATEGORY_MAP lookups succeed for values like "Image Generation ".

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 13e40d0 and 2112beb.

📒 Files selected for processing (5)
  • src/constants/essentialsNodes.test.ts
  • src/constants/essentialsNodes.ts
  • src/stores/subgraphStore.test.ts
  • src/types/nodeSource.test.ts
  • src/types/nodeSource.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/constants/essentialsNodes.ts

@christian-byrne christian-byrne force-pushed the toolkit/wire-essentials-categorization branch from 2112beb to d2de2fc Compare February 25, 2026 08:07
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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/types/nodeSource.test.ts`:
- Around line 113-120: The test name says it should normalize title-cased
backend categories but only asserts classification; update the test using
getNodeSource to verify normalization explicitly: call getNodeSource with 'Image
Generation' and assert that the returned category is normalized (e.g., equals
'image generation') or that the result is identical to calling getNodeSource
with the already-lowercased 'image generation'; keep the existing
NodeSourceType.Essentials assertion but add the normalization check so the test
fails if getNodeSource stops lowercasing categories.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2112beb and d2de2fc.

📒 Files selected for processing (5)
  • src/constants/essentialsNodes.test.ts
  • src/constants/essentialsNodes.ts
  • src/stores/subgraphStore.test.ts
  • src/types/nodeSource.test.ts
  • src/types/nodeSource.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/constants/essentialsNodes.ts
  • src/constants/essentialsNodes.test.ts

…tive backend matching

Backend sends title-cased categories (e.g. 'Image Generation') while
frontend uses lowercase (e.g. 'image generation'). Add canonical lookup
map to resolve backend values to the exact form in ESSENTIALS_CATEGORIES,
preserving special cases like '3D'.

Addresses review feedback from benceruleanlu.

Amp-Thread-ID: https://ampcode.com/threads/T-019c93b8-dae2-77ba-92c5-c7a71a424a3f
@christian-byrne christian-byrne force-pushed the toolkit/wire-essentials-categorization branch from d2de2fc to fbebac4 Compare February 25, 2026 08:18
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.

♻️ Duplicate comments (1)
src/types/nodeSource.test.ts (1)

113-123: Past review comment addressed – test now asserts both classification and normalization.

The added expect(getEssentialsCategory('SomeNode', 'Image Generation')).toBe('image generation') closes the gap flagged in the previous review.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/types/nodeSource.test.ts` around lines 113 - 123, The test now verifies
both classification and normalization by calling
getNodeSource('nodes.some_module','Image Generation','SomeNode') and asserting
result.type === NodeSourceType.Essentials, and also checks
getEssentialsCategory('SomeNode','Image Generation') === 'image generation'; no
code changes required—keep the assertions as written to ensure both behavior and
normalization are covered (verify getNodeSource and getEssentialsCategory remain
unchanged and return the expected values).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@src/types/nodeSource.test.ts`:
- Around line 113-123: The test now verifies both classification and
normalization by calling getNodeSource('nodes.some_module','Image
Generation','SomeNode') and asserting result.type === NodeSourceType.Essentials,
and also checks getEssentialsCategory('SomeNode','Image Generation') === 'image
generation'; no code changes required—keep the assertions as written to ensure
both behavior and normalization are covered (verify getNodeSource and
getEssentialsCategory remain unchanged and return the expected values).

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d2de2fc and fbebac4.

📒 Files selected for processing (5)
  • src/constants/essentialsNodes.test.ts
  • src/constants/essentialsNodes.ts
  • src/stores/subgraphStore.test.ts
  • src/types/nodeSource.test.ts
  • src/types/nodeSource.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/types/nodeSource.ts
  • src/constants/essentialsNodes.test.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants