Skip to content

Conversation

@benceruleanlu
Copy link
Member

@benceruleanlu benceruleanlu commented Nov 28, 2025

explicitly prevents subgraphs from making an api call since they don't have docs, this was previously reliant on a non-ok resolution

also doesn't try returning anything that has contenttype of text/html to prevent the markdown renderer from crashing

Summary

  • short-circuit blueprint/subgraph nodes in help: skip doc fetch and return the node description, avoiding SPA fallback responses
  • guard node help fetch against HTML/SPA fallbacks using content-type checks; treat them as missing and trigger the existing description fallback
  • keep base URL logic unchanged for non-blueprint nodes

Testing

  • pnpm typecheck
  • pnpm lint:fix
  • pnpm test:unit

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 28, 2025

📝 Walkthrough

Walkthrough

Adds Blueprint node source handling to the help system with early return logic. Refactors error handling in NodeHelpService by introducing a new private tryFetchMarkdown helper method to centralize safe Markdown content fetching across fetchNodeHelp, fetchCustomNodeHelp, and fetchCoreNodeHelp.

Changes

Cohort / File(s) Summary
Node Help System
src/services/nodeHelpService.ts, src/workbench/utils/nodeHelpUtil.ts
Added Blueprint node source handling with immediate description return and URL short-circuit logic. Introduced private tryFetchMarkdown helper method to centralize Markdown fetch operations with improved error handling and HTML/SPA fallback guards. Refactored fetchCustomNodeHelp and fetchCoreNodeHelp to use the new helper, with lastError tracking for better error reporting when both fetch attempts fail.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/node-help-html-fallback

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

@github-actions
Copy link

github-actions bot commented Nov 28, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 11/28/2025, 01:55:38 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Nov 28, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 11/28/2025, 02:05:19 PM UTC

📈 Summary

  • Total Tests: 495
  • Passed: 483 ✅
  • Failed: 0
  • Flaky: 3 ⚠️
  • Skipped: 9 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 474 / ❌ 0 / ⚠️ 3 / ⏭️ 9
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

@github-actions
Copy link

github-actions bot commented Nov 28, 2025

Bundle Size Report

Summary

  • Raw size: 17 MB baseline 17 MB — 🔴 +963 B
  • Gzip: 3.37 MB baseline 3.37 MB — 🔴 +225 B
  • Brotli: 2.58 MB baseline 2.58 MB — 🟢 -103 B
  • Bundles: 97 current • 97 baseline • 36 added / 36 removed

Category Glance
App Entry Points 🔴 +963 B (3.18 MB) · Vendor & Third-Party ⚪ 0 B (8.56 MB) · Other ⚪ 0 B (3.84 MB) · Graph Workspace ⚪ 0 B (949 kB) · Panels & Settings ⚪ 0 B (298 kB) · UI Components ⚪ 0 B (139 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.18 MB (baseline 3.18 MB) • 🔴 +963 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-Cc8nny_R.js (new) 2.95 MB 🔴 +2.95 MB 🔴 +615 kB 🔴 +467 kB
assets/index-DFPhGffA.js (removed) 2.95 MB 🟢 -2.95 MB 🟢 -615 kB 🟢 -467 kB
assets/index-AES1ZIix.js (removed) 227 kB 🟢 -227 kB 🟢 -48.6 kB 🟢 -40 kB
assets/index-Dwp4aeCA.js (new) 227 kB 🔴 +227 kB 🔴 +48.6 kB 🔴 +40 kB
assets/index-DqpqqWML.js (removed) 345 B 🟢 -345 B 🟢 -244 B 🟢 -233 B
assets/index-DvOXRRaR.js (new) 345 B 🔴 +345 B 🔴 +241 B 🔴 +206 B

Status: 3 added / 3 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-C1rf4eOJ.js (new) 949 kB 🔴 +949 kB 🔴 +184 kB 🔴 +140 kB
assets/GraphView-Ci1DtkaG.js (removed) 949 kB 🟢 -949 kB 🟢 -184 kB 🟢 -141 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-B4a3nf8W.js (new) 6.54 kB 🔴 +6.54 kB 🔴 +2.14 kB 🔴 +1.89 kB
assets/UserSelectView-BVo2f_fr.js (removed) 6.54 kB 🟢 -6.54 kB 🟢 -2.14 kB 🟢 -1.9 kB

Status: 1 added / 1 removed

Panels & Settings — 298 kB (baseline 298 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-C3Ko2ZM6.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.15 kB 🔴 +4.5 kB
assets/CreditsPanel-CZSopKs-.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.15 kB 🟢 -4.49 kB
assets/KeybindingPanel-DMLtOVpZ.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.42 kB 🟢 -3.01 kB
assets/KeybindingPanel-DW1DItpk.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/ExtensionPanel-CNcmFtBs.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.57 kB 🔴 +2.25 kB
assets/ExtensionPanel-D0CWMnRE.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.57 kB 🟢 -2.25 kB
assets/AboutPanel-BQE3fNgU.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-CT2cBTU3.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/ServerConfigPanel-9JyAPxyH.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -1.83 kB 🟢 -1.63 kB
assets/ServerConfigPanel-FZaKrbkq.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +1.83 kB 🔴 +1.62 kB
assets/UserPanel-B_7tzc9K.js (removed) 6.23 kB 🟢 -6.23 kB 🟢 -1.72 kB 🟢 -1.5 kB
assets/UserPanel-CXsDqbvC.js (new) 6.23 kB 🔴 +6.23 kB 🔴 +1.72 kB 🔴 +1.51 kB
assets/settings-BhbWhsRg.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-0lNUnrMp.js (new) 53.9 kB 🔴 +53.9 kB 🔴 +8.52 kB 🔴 +7.31 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-DnSg5pjL.js (removed) 53.9 kB 🟢 -53.9 kB 🟢 -8.52 kB 🟢 -7.31 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-BDtKhsBw.js (new) 47 kB 🔴 +47 kB 🔴 +10.1 kB 🔴 +8.78 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-BRENgRaW.js (removed) 47 kB 🟢 -47 kB 🟢 -10.1 kB 🟢 -8.78 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-JmeQMWKj.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.35 kB 🔴 +2.96 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-O6js9unB.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.35 kB 🟢 -2.97 kB
assets/ComfyQueueButton-7gzMcrg_.js (new) 8.44 kB 🔴 +8.44 kB 🔴 +2.48 kB 🔴 +2.21 kB
assets/ComfyQueueButton-DnFEaBgZ.js (removed) 8.44 kB 🟢 -8.44 kB 🟢 -2.48 kB 🟢 -2.21 kB
assets/MediaTitle.vue_vue_type_script_setup_true_lang-DSYYHLJz.js (removed) 897 B 🟢 -897 B 🟢 -503 B 🟢 -429 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-ICa8W9BU.js (new) 897 B 🔴 +897 B 🔴 +502 B 🔴 +437 B
assets/LazyImage.vue_vue_type_script_setup_true_lang-Pm3jgX4e.js 10.8 kB 10.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-Bs-EIQeq.js 1.34 kB 1.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CsMa_P26.js 2.04 kB 2.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-Cf8dNyi2.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 12.5 kB (baseline 12.5 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-BwpdD2WW.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.83 kB 🔴 +1.59 kB
assets/keybindingService-VNP5kPT6.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.84 kB 🟢 -1.58 kB
assets/audioService-2a7s0u5N.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -960 B 🟢 -823 B
assets/audioService-hghKO1ri.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +958 B 🔴 +823 B
assets/serverConfigStore-B5NW8oSr.js 2.83 kB 2.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 2 added / 2 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-B_zcivtg.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -650 B 🟢 -547 B
assets/audioUtils-BcTLUs6d.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +648 B 🔴 +544 B
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-uhYFfslB.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-DisjWJFj.js 3.98 MB 3.98 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-LncEKxae.js 1.96 MB 1.96 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-C4yk8cCR.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-tw3tq7KH.js 160 kB 160 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 3.84 MB (baseline 3.84 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WidgetRecordAudio-CbVxoIwp.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.23 kB 🟢 -4.63 kB
assets/WidgetRecordAudio-CD8Mb-ku.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.23 kB 🔴 +4.63 kB
assets/AudioPreviewPlayer-CVy2UCZC.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.4 kB 🔴 +3.04 kB
assets/AudioPreviewPlayer-DFXe5klx.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.4 kB 🟢 -3.04 kB
assets/WidgetGalleria-CFHkr2qK.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.45 kB 🟢 -1.31 kB
assets/WidgetGalleria-RzBs85Cf.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.45 kB 🔴 +1.3 kB
assets/WidgetColorPicker-DArcOqkv.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.38 kB 🔴 +1.23 kB
assets/WidgetColorPicker-DPoWxs5i.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetMarkdown-ArYXlxNM.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.29 kB 🔴 +1.13 kB
assets/WidgetMarkdown-D_wbPWc4.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.29 kB 🟢 -1.13 kB
assets/WidgetAudioUI-BHQM87ta.js (removed) 2.82 kB 🟢 -2.82 kB 🟢 -1.12 kB 🟢 -1.01 kB
assets/WidgetAudioUI-BlQtzK_g.js (new) 2.82 kB 🔴 +2.82 kB 🔴 +1.12 kB 🔴 +1.02 kB
assets/WidgetTextarea-BaG-H520.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -1.01 kB 🟢 -885 B
assets/WidgetTextarea-BM0gv-3H.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +1.01 kB 🔴 +880 B
assets/WidgetInputText-2h2zTEwM.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +917 B 🔴 +849 B
assets/WidgetInputText-Zi2XS0lQ.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -918 B 🟢 -854 B
assets/MediaImageBottom-BcOwSZCQ.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -747 B 🟢 -646 B
assets/MediaImageBottom-DB2GcH52.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +743 B 🔴 +642 B
assets/MediaAudioBottom-B6eVt0UG.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +741 B 🔴 +652 B
assets/MediaAudioBottom-CDdmCIy9.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -741 B 🟢 -658 B
assets/MediaVideoBottom-3GWpu29a.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -741 B 🟢 -653 B
assets/MediaVideoBottom-XLxF3vZ_.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +739 B 🔴 +650 B
assets/Media3DBottom-C-Z9jmBy.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -737 B 🟢 -650 B
assets/Media3DBottom-D1C67K5h.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +733 B 🔴 +647 B
assets/Media3DTop-CytBnrqx.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +764 B 🔴 +648 B
assets/Media3DTop-YO6ZiaQh.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -767 B 🟢 -651 B
assets/WidgetSelect-CXhxIjXH.js (new) 655 B 🔴 +655 B 🔴 +341 B 🔴 +288 B
assets/WidgetSelect-D5LiZD7e.js (removed) 655 B 🟢 -655 B 🟢 -341 B 🟢 -285 B
assets/WidgetInputNumber-CLoGwgCB.js (removed) 595 B 🟢 -595 B 🟢 -328 B 🟢 -275 B
assets/WidgetInputNumber-DSOVuNho.js (new) 595 B 🔴 +595 B 🔴 +326 B 🔴 +275 B
assets/Load3D-Bb_EUaC1.js (new) 424 B 🔴 +424 B 🔴 +267 B 🔴 +223 B
assets/Load3D-C7OkZQ_0.js (removed) 424 B 🟢 -424 B 🟢 -268 B 🟢 -223 B
assets/WidgetLegacy-C7vH2XqI.js (removed) 364 B 🟢 -364 B 🟢 -238 B 🟢 -193 B
assets/WidgetLegacy-ZgysZzcd.js (new) 364 B 🔴 +364 B 🔴 +235 B 🔴 +192 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BWp4HdfU.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-5lOBdqcC.js 84.5 kB 84.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BOCuaVpE.js 73.4 kB 73.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ClrEFGUz.js 72.4 kB 72.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cw9RZWRY.js 89 B 89 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CyNU0iQX.js 99.3 kB 99.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D7gwLxft.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DC8o4BCt.js 86.8 kB 86.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DKiesCV4.js 94.3 kB 94.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Hq2q-OtB.js 83.6 kB 83.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-USAlAlnj.js 82 kB 82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-Bqc4HR5L.js 1.46 kB 1.46 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-DbyT2UjV.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-6PQqfKb3.js 2.76 kB 2.76 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_Px5dSNW.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-7z21KPoS.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bw_Jitw_.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BWKZzBPK.js 346 kB 346 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGbgH4Yl.js 320 kB 320 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CjjjdWkV.js 313 kB 313 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVrNtxvj.js 288 kB 288 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DLRSA0IK.js 309 kB 309 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DQV2gnwA.js 372 kB 372 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ofqLG5vz.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-C9sMH5oS.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-D4gTOuOo.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CBRsIck7.js 1.58 kB 1.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 17 added / 17 removed

@benceruleanlu benceruleanlu marked this pull request as ready for review November 28, 2025 13:55
@benceruleanlu benceruleanlu requested a review from a team as a code owner November 28, 2025 13:55
@benceruleanlu
Copy link
Member Author

@codex review

@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Nov 28, 2025
@chatgpt-codex-connector
Copy link

Codex Review: Didn't find any major issues. Another round soon, please!

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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: 0

🧹 Nitpick comments (3)
src/services/nodeHelpService.ts (3)

26-44: Custom node help fallback flow looks solid; consider richer error context

The locale-first then non-locale fallback with lastError gives predictable behavior for custom node help. For easier debugging when both lookups fail, you might wrap lastError with the node name and the attempted paths (or a short prefix like "Custom node help not found for ${node.name}: ${lastError}") instead of throwing the bare status text.


51-57: Core help currently has no non-locale fallback unlike custom nodes

Custom nodes try both ${locale}.md and a locale-less .md, but core nodes only attempt /docs/${node.name}/${locale}.md. If your docs layout includes non-localized core markdown, consider mirroring the same fallback pattern here; otherwise the current behavior is fine.


59-80: Harden tryFetchMarkdown against fetch errors and unhelpful HTML status text

Centralizing fetch + HTML guarding here is good, but two edge cases are worth tightening:

  • If fetch rejects (network/CORS issues), the promise bypasses this helper’s { text, errorText } contract and surfaces as a raw exception instead of a structured { text: null, errorText }.
  • For HTML fallbacks returning 200, res.statusText is typically 'OK', so callers can end up throwing Error('OK'), which isn’t very actionable.

You can keep the existing behavior while normalizing these cases, for example:

   private async tryFetchMarkdown(
     path: string
   ): Promise<{ text: string | null; errorText?: string }> {
-    const res = await fetch(api.fileURL(path))
-
-    if (!res.ok) {
-      return { text: null, errorText: res.statusText }
-    }
-
-    const contentType = res.headers?.get?.('content-type') ?? ''
-    const text = await res.text()
-
-    const isHtmlContentType = contentType.includes('text/html')
-
-    if (isHtmlContentType) return { text: null, errorText: res.statusText }
-
-    return { text }
+    try {
+      const res = await fetch(api.fileURL(path))
+
+      if (!res.ok) {
+        return {
+          text: null,
+          errorText: res.statusText || `HTTP ${res.status}`
+        }
+      }
+
+      const contentType = res.headers?.get?.('content-type') ?? ''
+      const text = await res.text()
+
+      if (contentType.includes('text/html')) {
+        return {
+          text: null,
+          errorText: 'Received HTML while expecting markdown'
+        }
+      }
+
+      return { text }
+    } catch (err) {
+      const message =
+        err instanceof Error ? err.message : 'Failed to fetch help markdown'
+      return { text: null, errorText: message }
+    }
   }

This keeps the non-throwing contract for normal failures, makes HTML fallbacks self-describing, and ensures network errors are surfaced in a consistent way.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 63f6854 and d717e3d.

📒 Files selected for processing (2)
  • src/services/nodeHelpService.ts (2 hunks)
  • src/workbench/utils/nodeHelpUtil.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (12)
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

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

Files:

  • src/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.ts
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursorrules)

Use es-toolkit for utility functions

Files:

  • src/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

Use TypeScript for type safety

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

Files:

  • src/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.ts
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

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

Files:

  • src/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.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/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.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/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.ts
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

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

Files:

  • src/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.ts
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

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

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

Files:

  • src/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.ts
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

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

Files:

  • src/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.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/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/workbench/utils/nodeHelpUtil.ts
  • src/services/nodeHelpService.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/services/nodeHelpService.ts
🧬 Code graph analysis (1)
src/services/nodeHelpService.ts (1)
src/scripts/api.ts (1)
  • api (1289-1289)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: setup
🔇 Additional comments (2)
src/workbench/utils/nodeHelpUtil.ts (1)

18-27: Blueprint base URL short-circuit looks correct

Returning '' for NodeSourceType.Blueprint prevents bogus /docs/* URLs while leaving CustomNodes/core behavior unchanged. Please just verify all getNodeHelpBaseUrl call sites treat an empty string as “no docs base” and don’t blindly append paths to it.

src/services/nodeHelpService.ts (1)

10-18: Good early-return for Blueprint node help

Short-circuiting Blueprint nodes to node.description || '' cleanly avoids unnecessary help fetches and SPA HTML fallbacks while keeping the Custom/Core flows unchanged.

@christian-byrne christian-byrne merged commit d94e072 into main Nov 28, 2025
32 checks passed
@christian-byrne christian-byrne deleted the fix/node-help-html-fallback branch November 28, 2025 18:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants