- Test: multiple images to same schema-mapped handle aggregate into array
- Test: single image to schema-mapped handle stays as plain string
- Test: multiple images with distinct schema handles remain separate strings
- Test: three images to same handle produce array of length 3
- Fix react-dom version mismatch (19.2.0 -> 19.2.3) to match react
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update dynamicInputs type from Record<string, string> to Record<string, string | string[]> in 4 locations
- Fix getConnectedInputs to aggregate same-key values into arrays instead of overwriting
- Fix dynamicInputs.prompt access to handle array case
- Fix hasPrompt check in POST handler to handle array-typed prompt
- Update processedDynamicInputs type in both Replicate and fal blocks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The proxy was downloading 80-275MB workflow files through a serverless
function, causing timeouts and failures. Now the proxy just returns the
presigned R2 URL and the client downloads directly from R2.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
LLMGenerateNode improvements:
- Add collapsible parameters section with temperature and max tokens sliders
- Add copy to clipboard button for output text
- Clean up UI organization
PromptNode improvements:
- Add text input handle to receive incoming text connections
- Auto-populate prompt when connected to a text source (e.g., another LLM)
ConnectionDropMenu:
- Add Prompt as a target option for text connections
ProjectSetupModal:
- Add max tokens slider for LLM default settings
Test updates:
- Update mocks to include edges and getConnectedInputs
- Fix tests for collapsible parameters section
- Update wrap-around test for new menu options
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
React Flow's internal bounds for nodes were undefined, causing certain nodes
to be incorrectly included in drag selections regardless of their position.
Added statistical outlier detection using IQR to identify and automatically
deselect nodes that are clearly outside the actual selection area.
Also includes:
- Clear selected state and validate position coordinates on workflow load
- Strip selected property when saving workflows (transient UI state)
- Enable prompt nodes to receive text input connections
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The PromptNode now uses local state and only updates on blur to prevent
cursor jumping. Update test to trigger blur after change.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove configurable COMMUNITY_WORKFLOWS_API_URL env var that caused
errors when users copied the placeholder from .env.example.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update getHandleType() to recognize indexed handles (text-0, image-0)
used by external providers like Replicate and fal.ai
- Fix validateWorkflow() to accept indexed text handles for nanoBanana nodes
- Add validation for generateVideo nodes requiring text input
- Use local state pattern in PromptNode to prevent cursor jumping during typing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Validate presigned URLs before fetching by checking:
- Protocol is https
- Hostname ends with .r2.cloudflarestorage.com
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update the community workflow API to fetch presigned URLs from
node-banana-pro, then download workflows directly from R2. This
avoids timeouts when fetching large workflow files (275MB+).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update API routes to fetch from nodebananapro.com
- Remove local workflow JSON files (now hosted on R2)
- Remove LFS tracking (.gitattributes)
- Remove local communityWorkflows.ts metadata (now on server)
- Add COMMUNITY_WORKFLOWS_API_URL env variable option
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## Template Explorer Enhancements
- Add rich metadata and thumbnails for community workflows
- Create communityWorkflows.ts config for workflow metadata
- Reuse TemplateCard for community workflows with tag filtering
- Search now includes workflow descriptions
## Comment Navigation System
- Add comment navigation icon in header with unviewed count badge
- Navigate between nodes with comments using prev/next controls
- Tooltips show comment preview on hover
## Output Node Improvements
- Add custom filename and createDirectory options for output saves
- Remove default React Flow styling from output nodes
- Fix video output node connections
- Preserve node height on resize
## Image Handling Fixes
- Resolve image history race condition and duplicate images on save
- Preserve image history IDs when saving to new directory
- Verify outputImageRef matches selected history index on save
- Persist useExternalImageStorage setting in workflow config
- Paste images directly into selected imageInput nodes
## Model & Generation Fixes
- Use selectedModel.modelId for Gemini generation
- Return 200 with notFound flag instead of 404 for missing files
## Other
- Add git-lfs tracking for large workflow files
- Remove deprecated example workflows
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Two related issues fixed:
1. Image history IDs not syncing before workflow save (PR#27 follow-up):
- Added pending sync tracking for save-generation API calls
- saveToFile() now awaits all pending syncs before saving
- Ensures imageHistory/videoHistory IDs match actual saved filenames
2. Duplicate images created on every save:
- After externalization, store nodes now receive the image refs
- Subsequent saves recognize existing refs and skip creating new files
- Prevents inputs/ and generations/ folders from accumulating duplicates
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add case 'v' to node creation hotkeys in WorkflowCanvas
- Creates generateVideo node at viewport center
- Update CLAUDE.md documentation with new shortcut
- Add ModelSearchDialog renders for image and video model selection
- Dialogs use onModelSelected callback to update local state
- Image dialog uses initialCapabilityFilter='image'
- Video dialog uses initialCapabilityFilter='video'
- Selected models are stored with provider, modelId, and displayName
- Add third tab 'Node Defaults' after Project and Providers
- Add NodeDefaultsConfig state and load/save on modal open/close
- Create UI sections for GenerateImage, GenerateVideo, and LLM defaults
- GenerateImage/Video sections show selected model or system default
- LLM section has provider/model dropdowns and temperature slider
- Clear buttons allow resetting each section to undefined
- Import provider icons and helper types from existing modules
Enable storing default model and settings per node type in localStorage.
New nodes created via shortcuts will use these stored preferences.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change categories from product/style/composition to simple/advanced
- Add provider filter to sidebar (currently shows Gemini)
- Display provider tags on template cards
- Update tests for new category structure
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace model image with new model.png for the Model + Product template,
update the Style Transfer prompt to watercolor children's book style.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Resize workflow screenshot thumbnails from 1024px to 288px
- Create resized primary thumbnails (288px) from large sample images
- Use static paths instead of dynamic content lookup
- 288px = 2x retina for 144px display
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change thumbnail from 160x112 to 144x144 (square)
- Use object-contain instead of object-cover to prevent cropping/distortion
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add template thumbnails to public/template-thumbnails/
- Add hover images for model-product and style-transfer templates
- Update TemplateCard to support hover image with opacity transition
- Replace street-scene.jpg with new-bg-model-product.png in model-product
- Replace house-lake.jpg with style-transfer-reference.png in style-transfer
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The save-generation API changed to use prompt+hash based filenames for
deduplication, but the workflow store was still using timestamp-based IDs
in imageHistory/videoHistory. This caused the carousel to fail loading
images since the IDs didn't match the actual saved filenames.
Now we capture the API response and update the history entry with the
actual imageId returned by the save-generation endpoint. This is backward
compatible - old workflows with timestamp-based filenames continue to work.
- Increase dialog max-width from 4xl to 6xl
- Increase max-height from 80vh to 85vh
- Change card layout to two-column grid
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace WorkflowPreview component with actual template screenshot image
- Remove unused presetWorkflows memo from TemplateExplorerView
- Pass previewImage prop instead of workflow to TemplateDetailModal
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TemplateDetailModal: full details view with description, workflow preview,
metadata, and "Use this workflow" button
- TemplateCard: simplified - removed preview icon and tags row,
card click now opens detail modal
- TemplateExplorerView: wired up new flow where card opens detail modal
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace solid colored boxes with outlined nodes
- Add labels inside each node (Image Input, Prompt, etc.)
- Show model name for generate nodes (Gemini Pro, etc.)
- Use smoothstep edges for visible connections
- Simplify modal by removing redundant legend
- Restore image thumbnails as main preview in TemplateCard
- Add small icon button in top right to trigger workflow preview
- Create WorkflowPreviewModal for larger preview display
- Fix WorkflowPreview to properly show all nodes with fitView
- Add legend showing node type colors in modal
- Replace static previewImage with workflow prop in TemplateCard
- Render WorkflowPreview showing node layout and connections
- Remove getTemplateContent import (no longer needed)
- Pass workflow data from PRESET_TEMPLATES to cards