- Add preInit hook to ComfyExtension interface that runs before canvas creation
- Implement preInit invocation in app.ts after extension loading
- Create example extension demonstrating header provider registration
- Add comprehensive tests for hook execution order and error handling
This enables extensions to register services and cross-cutting concerns
before any other initialization occurs.
Co-Authored-By: Claude <noreply@anthropic.com>
Create extensible header registration system for HTTP requests:
- Add HeaderRegistry service with VSCode-style registration patterns
- Create network client adapters for axios and fetch with automatic header injection
- Add comprehensive TypeScript types for header providers
- Include example implementations for extension developers
This provides the foundation for extensions to register custom headers that will be automatically added to all network requests.
Part of #5017
- Replace direct fetch() with fetchWithHeaders across entire codebase
- Replace axios.create() with createAxiosWithHeaders in all services
- Update tests to properly mock network client adapters
- Fix hoisting issues in test mocks for axios instances
- Ensure all network calls now support header injection
This completes Step 2: integrating the header registry infrastructure with all existing HTTP clients in the codebase.
Create extensible header registration system for HTTP requests:
- Add HeaderRegistry service with VSCode-style registration patterns
- Create network client adapters for axios and fetch with automatic header injection
- Add comprehensive TypeScript types for header providers
- Include example implementations for extension developers
This provides the foundation for extensions to register custom headers that will be automatically added to all network requests.
Part of #5017
- Create TypeScript interfaces for header providers
- Implement header registry with priority-based ordering
- Add network client adapters that integrate with the registry
- Add comprehensive unit tests
Co-Authored-By: Claude <noreply@anthropic.com>
Use vi.mock() with factory function to ensure axios mock is set up before module imports. This fixes test failures caused by the store creating axios client at module level.
Fixes test execution in CI
- Move axios mock setup before store import to ensure client is mocked
- Set up default successful responses for customer API endpoints
- Fix TypeScript issues with isAxiosError mock type
Template Workflows:
- Replace direct fetch with api.fetchApi() for API endpoints
- Keep direct fetch for static file URLs (already using api.fileURL())
Model Exporter:
- Add logic to distinguish ComfyUI URLs from external URLs
- Use api.apiURL() for ComfyUI URLs, direct fetch for external URLs
- Maintain existing download functionality
Other files already following correct patterns:
- Upload Audio: Already using api.fetchApi()
- 3D Loading Utils: Already using api.fetchApi() (fetch call is for blob conversion)
- Download Utility: Uses direct fetch for external URLs (correct)
All network calls now use consistent client patterns where appropriate.
- Replace all direct fetch() calls with axios client instance
- Maintain exact same error handling behavior and logic flow
- Use consistent pattern with other services (customerEventsService)
- All customer API endpoints now use centralized client
- Prepares for header registration system implementation
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* Correct some translations that use traditional Chinese to simplified Chinese.
* Update locales [skip ci]
* Correct the rest of the translations
---------
Co-authored-by: github-actions <github-actions@github.com>
- Add comprehensive test coverage for the new --disable-api-nodes argument handling
- Tests verify release fetching is properly skipped when argument is present
- Cover edge cases including multiple args, null argv, and missing system stats
- Ensures backward compatibility when argument is not present
When a node is bypassed from the selection toolbox or by pressing a
keybind for bypass, it will also recursively bypass the contents of a
subgraph. This effect was not applied when clicking the bypass button
from the context menu. The context menu option has been updated to
perform the same action as the others so that behaviour is consistent.
- Adds Step 16 to analyze PRs for marketing-worthy features
- Extracts PR data including media assets (images, videos, GIFs)
- Claude evaluates which features would interest end users
- Generates gtm-summary-VERSION.md for sharing with marketing team
- Many releases will correctly identify no marketing features (normal for bug fixes)
This helps the GTM team identify demo opportunities without manual PR review.
* Restructures the application menu
- rename Workflow to File
- move new & template items to top level
- add View menu and related sub items
Commands
- add "active" state getter shown as checkmark in the menu
Node side panel
- add refresh node defs
- change reset view icon
Help center
- change to use store for visibility
Fixes
- Fix bug with mouse down where if you drag mouse out, mouse up wasn't caught
- Fix issue with canvas info setting not triggering a redraw on change
* Fix missing translation warnings
* Add separator under new
* tidy
* Update locales [skip ci]
* fix some tests
* fix
* Hide icon if there is an active state within the menu item group
* Update locales [skip ci]
* Fix tests
* Implement feedback
- Remove queue, node lib, model lib, workflows, manager, help center
- Add minimap, link visibility
* Update locales [skip ci]
* Add plus icon on "New" menu item
* Update locales [skip ci]
* Fix test
* Fix translations
* Update locales [skip ci]
* Update locales [skip ci]
---------
Co-authored-by: github-actions <github-actions@github.com>
When loading workflows, SubgraphNode would throw an error if an input
exists in the serialized data that doesn't exist in the current subgraph
definition. This can happen when:
- Subgraph definitions change after workflows are saved
- Workflows are shared between users with different subgraph versions
- Dynamic inputs were added that don't exist in the base definition
This change converts the hard error to a warning and continues processing,
allowing workflows to load even with mismatched subgraph configurations.
Fixes#4905
## Summary
This PR fixes#4681 by building upon the foundation laid in PR #1182
(litegraph.js). It prevents incompatible type connections when dragging
from a normal node's output to a SubgraphInputNode's occupied slot.
Before:
https://github.com/user-attachments/assets/03def938-dccc-4b2c-b65b-745abf02a13b
After:
https://github.com/user-attachments/assets/7a0a2ed4-9ecd-4147-be56-d643d448d4cb
## Background
PR #1182 implemented:
- `isValidTarget()` method in SubgraphInput/SubgraphOutput classes for
validation
- Visual feedback during drag (40% opacity for invalid targets)
- Validation at the slot level
However, there was a missing piece: while the visual feedback correctly
showed invalid targets, the actual connection would still be made when
dropped.
## Changes
This PR extends PR #1182 by adding the missing connection prevention:
1. **Added `canConnectToSubgraphInput()` method** to render link
classes:
- `MovingOutputLink`
- `ToOutputRenderLink`
- `FloatingRenderLink`
- All methods use the existing `SubgraphInput.isValidTarget()` from PR
#1182
2. **Added validation in `LinkConnector.dropOnIoNode()`**:
- Checks `canConnectToSubgraphInput()` before allowing the connection
- Logs a warning when rejecting invalid connections
- Follows the same pattern as regular node connections
3. **Added `isSubgraphInputValidDrop()` method**:
- Provides validation for hover states
- Ensures consistent validation across the UI
## Summary
- Partially reverts commit c84218d6 to restore group node functionality
in context menus
- Adds "(Deprecated)" label to indicate the feature is deprecated
- Fixes TypeError when right-clicking on group nodes
- Re-enables tests that were disabled when the feature was removed
## Changes
1. **Restored context menu options** - Added back "Convert to Group Node
(Deprecated)" and "Manage Group Nodes" menu items
2. **Fixed null reference error** - Added null-safe operator to prevent
errors when right-clicking group nodes
3. **Re-enabled tests** - Restored 7 tests that were disabled in commit
586f8824
## Test plan
- [x] Right-click on canvas → verify "Convert to Group Node
(Deprecated)" appears
- [x] Right-click on nodes → verify the same menu option appears
- [x] Select multiple nodes and use the menu option → verify conversion
works
- [x] Right-click on group nodes → verify no errors occur
- [x] Run browser tests → verify all re-enabled tests pass
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-4967-feat-Restore-group-node-conversion-menu-with-deprecated-label-24e6d73d36508149a6f2dbef47223e94)
by [Unito](https://www.unito.io)
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: github-actions <github-actions@github.com>
Side toolbar menu UI updates
## Summary
- Currently the template modal is very hidden. Many users do not find it
- The current icons are quite aleatory
## Changes
**What**:
- Add templates shortcut button
- Add item label in normal size
- Use custom icon
Critical design decisions or edge cases that need attention:
- Sidebar tabs registered using custom icons will have their associated
command registed with an undefined icon (currently only string icons are
accepted, not components). I couldn't see anywhere directly using this
icon, but we should consider autogenerating an icon font so we can use
classes for our custom icons (or locating and updating locations to
support both icon types)
## Screenshots (if applicable)
Normal mode:
<img width="621" height="1034" alt="image"
src="https://github.com/user-attachments/assets/c1d1cee2-004e-4ff8-b3fa-197329b0d2ae"
/>
Small mode:
<img width="176" height="325" alt="image"
src="https://github.com/user-attachments/assets/3824b8f6-bc96-4e62-aece-f0265113d2e3"
/>
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-4946-Update-side-toolbar-menu-24d6d73d365081c5b2bdc0ee8b61dc50)
by [Unito](https://www.unito.io)
---------
Co-authored-by: github-actions <github-actions@github.com>
## Summary
- Add bun.lock, bun.lockb, pnpm-lock.yaml, and yarn.lock to .gitignore
- Allows users to use faster package managers (Bun, pnpm) without making
git status dirty
- Maintains npm as the default while supporting developer choice of
package manager
## Test plan
- [x] Verify .gitignore changes are correct
- [ ] Test that creating these lockfiles doesn't show in git status
- [ ] Confirm existing npm functionality remains unaffected
🤖 Generated with [Claude Code](https://claude.ai/code)
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-4961-feat-Add-alternative-package-manager-lockfiles-to-gitignore-24e6d73d3650817c8fa4fb8e94df5ac6)
by [Unito](https://www.unito.io)
Co-authored-by: Claude <noreply@anthropic.com>