Tree:
e9b04fd836
TEST-s
TEST-x
codex/popi-tv-header-logo
feature/071
feature/0710
feature/260608
feature/627
feature/add_agent_md
feature/add_provider_popi
feature/canvas-chatbot-copilot
feature/composer
feature/gateway
feature/group
feature/handle
feature/handleReconstruction
feature/interaction
feature/new_node
feature/remove
feature/workflow
feature_apikey
feature_gateway-migration
feature_login
handoff-20260429-1057
master
songxh-popiart-node-canvas
test-0523
video_node
xuzhijie-popiart-node-canvas
${ noResults }
20 Commits (e9b04fd8368af01cffd6f4db6214300835b96e7b)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
e9b04fd836 |
Make node continuation and image upload gestures predictable
The canvas now treats the visible plus affordance as part of the output handle hit zone, so users can click or drag from the same right-side target. Empty image input nodes also handle double-click locally before the canvas node double-click centering logic sees the event. Constraint: The plus affordance must not block React Flow handle drag events Rejected: Keep the plus as the primary pointer target | it prevented drag-to-connect from the same visual area Confidence: high Scope-risk: moderate Directive: Keep quick-add visuals non-interactive unless handle dragging is reworked at the React Flow layer Tested: npm run test:run -- src/components/__tests__/ImageInputNode.test.tsx src/components/__tests__/WorkflowCanvas.test.tsx Tested: npm run build Not-tested: npm run lint | existing Next 16 next lint script resolves to nonexistent /lint directory |
2 months ago |
|
|
9c64d38452 |
Align node editing with the canvas-first generation flow
This keeps the testing branch aligned with the current Popi.TV interaction direction: generation is controlled from the selected node context, model/provider selection is simplified around the NewAPI gateway path, Popiai embedding can hydrate workflow state, and media nodes expose names plus dimensions in the canvas header. Constraint: Testing branch needs the full current source state, not runtime logs or local browser artifacts Rejected: Commit logs, browserfs state, and handoff bundles | they are local runtime artifacts rather than application source Confidence: high Scope-risk: moderate Reversibility: clean Directive: Keep model selection consolidated around the NewAPI gateway unless supplier-specific behavior is intentionally reintroduced Tested: npm run test:run -- src/components/__tests__/FloatingNodeHeader.test.tsx src/components/__tests__/nodeHeaderMedia.test.ts src/components/__tests__/WorkflowCanvas.test.tsx Tested: npm run test:run -- src/components/__tests__/ImageInputNode.test.tsx src/components/__tests__/GenerateVideoNode.test.tsx src/components/__tests__/GenerateImageNode.test.tsx Tested: npm run build Tested: git diff --check -- src Not-tested: npm run lint | existing script uses next lint and resolves to nonexistent ./lint directory |
2 months ago |
|
|
d81e035299 |
Align canvas media workflow with Popi-only product direction
The accumulated fixes move the test build toward the current product shape: Popi models are the default provider surface, remote community workflow APIs are removed from the local template flow, media nodes expose accurate preview/preview-modal behavior, and Generate Video owns first-class duration, resolution, and sound defaults instead of burying those values in provider schemas. The test suite was brought back in line with the product mode split: Popi provider mode is the default runtime, while multi-provider model search remains covered explicitly under multi mode. Constraint: Product direction is canvas-owned workflow structure with Popi Models as the tested default provider path. Rejected: Keep legacy community workflow API surface | user requested removing remote data paths and retaining local templates. Rejected: Treat video duration/resolution/sound as hidden provider params | these are user-facing Generate Video controls. Confidence: high Scope-risk: broad Directive: Do not reintroduce remote community template loading without a product decision on hosted templates and i18n ownership. Tested: npm test -- --run src/store/utils/__tests__/nodeDefaults.test.ts src/store/execution/__tests__/generateVideoExecutor.test.ts src/components/__tests__/GenerateVideoNode.test.tsx src/components/__tests__/GenerationComposer.test.tsx Tested: npm run build Tested: npm test -- --run src/components/__tests__/ModelSearchDialog.test.tsx src/store/utils/__tests__/localStorage.test.ts Tested: npm run test:run Not-tested: Live provider generation calls against paid external APIs. |
2 months ago |
|
|
efee30391f |
Make the canvas assistant safe enough to edit and run workflows
The right-side assistant now uses the existing chat/tooling path as a docked canvas surface instead of a hidden floating experiment. It can prepare workflow edits, prepare run actions, and keep all mutations behind an explicit preview/apply step. A shared chat node schema keeps the model prompt and local edit validator aligned with real node types, while the context builder strips broader media payloads before chat requests. Constraint: Keep the deployed master/TEST-s version stable while this work proceeds on a feature branch Constraint: No new dependencies and no broad canvas rewrite Rejected: Directly applying model-suggested edits | local validation and preview remain the safety boundary Rejected: Full multimodal image upload in the first pass | current implementation only exposes media metadata and failure state Confidence: high Scope-risk: moderate Reversibility: clean Directive: Add new AI-editable node fields through src/lib/chat/nodeSchema.ts before exposing them in prompts Tested: npm run test:run -- src/lib/chat/contextBuilder.test.ts src/lib/chat/tools.test.ts src/lib/chat/editOperations.test.ts src/components/__tests__/ChatPanel.test.tsx src/components/__tests__/WorkflowCanvas.test.tsx src/app/api/chat/__tests__/route.test.ts Tested: PROVIDER_MODE=popi NEXT_PUBLIC_PROVIDER_MODE=popi npm run build Tested: Browser smoke on http://localhost:3000 verified docked assistant, close/reopen, selected-node focus, and run controls Not-tested: Live LLM tool-call execution against the gateway |
2 months ago |
|
|
6ca4406ee9 |
Consolidate the product around the Popi model gateway
Default provider mode now exposes only Popi Models while preserving the existing multi-provider implementation behind an explicit multi mode. The model browser, project settings, onboarding, node badges, and model API all share the same provider-mode decision so the test deployment matches the www.popi.art login-aligned direction. This also includes the pending UI and i18n node-label changes already present in the tracked worktree so the committed state matches the verified build. Constraint: Product entry must align with www.popi.art by exposing Popi Models instead of internal NewApiWG naming Constraint: Test deployment should match the full tracked working tree that passed build Rejected: Delete legacy provider code | multi-provider internals remain useful behind PROVIDER_MODE=multi Rejected: UI-only hiding | API and store layers now enforce Popi mode too Confidence: high Scope-risk: broad Reversibility: clean Directive: Keep NewApiWG as the internal provider id unless the gateway API/env contract is migrated Tested: npm run test:run -- src/components/__tests__/ProjectSetupModal.test.tsx src/app/api/models/__tests__/route.test.ts src/lib/__tests__/llmModels.test.ts Tested: npm run test:run -- src/components/__tests__/GenerateImageNode.test.tsx src/components/__tests__/GenerateVideoNode.test.tsx src/components/__tests__/GenerateAudioNode.test.tsx src/components/__tests__/Generate3DNode.test.tsx src/components/__tests__/LLMGenerateNode.test.tsx Tested: npm run test:run -- src/lib/chat/tools.test.ts Tested: PROVIDER_MODE=popi NEXT_PUBLIC_PROVIDER_MODE=popi npm run build Tested: Browser smoke on http://localhost:3000 verified Project Settings and Model Search only expose Popi Models Not-tested: Direct npx tsc --noEmit remains blocked by pre-existing test typing errors outside this change |
2 months ago |
|
|
2718eefb81 |
Keep quick-add menus focused on likely next steps
Node plus actions should offer a short continuation menu while handle dragging remains a full exploration surface. This records the product rule in a dedicated PRD and implements a static priority filter inside the existing connection menu instead of introducing a separate ranking layer. Constraint: Test server flow uses the connection drop menu for both drag-created nodes and node plus quick-add actions Rejected: Split quick-add into a separate menu component | duplicated option compatibility logic and increased drift risk Confidence: high Scope-risk: narrow Directive: Keep quick-add filtering downstream of compatibility filtering so suggestions never create invalid handle connections Tested: npm run test:run -- src/components/__tests__/ConnectionDropMenu.test.tsx src/components/__tests__/WorkflowCanvas.test.tsx Tested: npm run test:run Tested: npm run build Not-tested: npm run lint; current next lint script is not supported by the installed Next CLI |
2 months ago |
|
|
41d9889144 |
Keep master merge tests aligned with current handles
The TEST-s line can fast-forward into master, but the verification gate exposed stale test assumptions: video nodes now expose both input and output Video labels, and WorkflowCanvas tests need the ReactFlow setNodes API used by image node resizing. Constraint: Preserve runtime behavior while making the merge gate reliable Rejected: Change production node labels | the UI behavior is intentional and already deployed on TEST-s Confidence: high Scope-risk: narrow Tested: npm run test:run -- src/components/__tests__/GenerateVideoNode.test.tsx src/components/__tests__/WorkflowCanvas.test.tsx Tested: npm run test:run Tested: npm run build |
2 months ago |
|
|
f5cf6017a0 |
Route generation defaults through NewApiWG
This aligns image, video, and text defaults with the PopiArt NewApi gateway while keeping provider-specific escape hatches available. Chat now uses the OpenAI-compatible NewApiWG route so workflow editing and LLM generation share the same Doubao-first text default. The canvas composer and quick-add controls are tightened so visible actions map to real clickable behavior, while temporarily unused header actions stay hidden. Constraint: Text/chat requests must prefer Doubao-Seed-2.0-lite through NewApiWG. Constraint: Image and video defaults should prefer PopiArt NewApi gateway models when configured. Rejected: Keep /api/chat on Gemini 3 Flash | conflicts with the requested NewApiWG text/chat default. Rejected: Hand-roll AI SDK chat streaming | would risk tool-call and UI stream compatibility. Confidence: high Scope-risk: moderate Directive: Do not add new text/chat defaults without updating src/lib/llmModels.ts and the chat route together. Tested: npm test -- --run src/app/api/chat/__tests__/route.test.ts src/components/__tests__/LLMGenerateNode.test.tsx src/lib/__tests__/llmModels.test.ts src/store/utils/__tests__/nodeDefaults.test.ts src/components/__tests__/GenerationComposer.test.tsx src/lib/chat/tools.test.ts Tested: npm test -- --run src/lib/__tests__/llmModels.test.ts src/store/utils/__tests__/nodeDefaults.test.ts src/components/__tests__/GenerationComposer.test.tsx src/lib/quickstart/__tests__/templates.test.ts src/lib/quickstart/__tests__/validation.test.ts src/lib/quickstart/__tests__/prompts.test.ts src/components/__tests__/ProjectSetupModal.test.tsx Tested: npm test -- --run src/components/__tests__/WorkflowCanvas.test.tsx Not-tested: Full suite; repository has pre-existing unrelated type/test warnings outside this change. |
2 months ago |
|
|
bc1a2d42d7 |
调整图片多角度入口到连接菜单
|
2 months ago |
|
|
95e152842b |
Make the canvas composer the selected-node console
The bottom composer now edits and reruns the current generation node while canvas-visible actions own downstream node creation. NewApiWG media normalization, video frame extraction, and node quick-add keep generated media flows explicit and connected rather than hidden behind the prompt box. Constraint: Composer must not call providers directly or create hidden downstream branches when a node is selected Constraint: NewApiWG video families use inconsistent media schemas, so common media aliases are normalized in the provider adapter Rejected: Let the bottom composer create next-step nodes from selected outputs | hides graph mutation and conflicts with the PRD source-of-truth rules Rejected: Put NewApiWG model-family payload rules in the composer | provider-specific schemas would leak into UI state Confidence: high Scope-risk: moderate Directive: Keep provider payload normalization in provider/executor layers; do not move it into GenerationComposer Tested: npm run test:run -- src/components/__tests__/GenerationComposer.test.tsx Tested: npm run test:run -- src/components/__tests__/WorkflowCanvas.test.tsx Tested: npm run test:run -- src/components/__tests__/GenerateVideoNode.test.tsx Tested: npm run test:run -- src/app/api/generate/providers/__tests__/newapiwg.test.ts src/app/api/generate/__tests__/route.test.ts Tested: npm run test:run -- src/store/execution/__tests__/videoProcessingExecutors.test.ts Tested: npm run build Not-tested: npm run lint fails because next lint is incompatible with the current Next 16 script configuration |
2 months ago |
|
|
acf58cb2c9 |
test: add skip propagation tests and fix WorkflowCanvas mock
Add 14 tests covering: - Optional inputs with no data are skipped - Skip propagation cascades downstream (ANY merge policy) - Shared nodes are not skipped - Backward compatibility without isOptional - Skipped status cleared after workflow completes - Multi-level cascade Also add skippedNodeIds to WorkflowCanvas test mock. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
4 months ago |
|
|
b1ee33ed37 |
test: remove redundant and brittle component tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
4 months ago |
|
|
50662e3cb3 |
fix: update tests for new menu options and dimmedNodeIds store field
ConnectionDropMenu tests expected stale last items and item counts after Router, Switch, and Conditional Switch were added. WorkflowCanvas tests were missing dimmedNodeIds from the mock store state. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
5 months ago |
|
|
57d0cd860e
|
Release: 3D viewer, execute selected nodes, canvas navigation settings (#66)
* refactor: extract schema utilities from generate route Extract INPUT_PATTERNS, InputMapping, ParameterTypeInfo, getParameterTypesFromSchema, coerceParameterTypes, and getInputMappingFromSchema into schemaUtils.ts with 23 new tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract Gemini provider from generate route Move MODEL_MAP and generateWithGemini() into providers/gemini.ts. Remove unused imports (GoogleGenAI, uploadImageForUrl, shouldUseImageUrl, deleteImages, ProviderModel) from route.ts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract Replicate provider from generate route Move generateWithReplicate() into providers/replicate.ts. It imports schema utilities from schemaUtils.ts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract fal.ai, Kie.ai, WaveSpeed providers from generate route Move generateWithFalQueue, generateWithKie, generateWithWaveSpeed and all their helpers into providers/fal.ts, providers/kie.ts, providers/wavespeed.ts. Add barrel export at providers/index.ts. route.ts reduced from 2,838 to 518 lines (POST handler + routing only). Re-export clearFalInputMappingCache from route.ts for test backward compat. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract API header builder from workflow store Replace 6 duplicated header-building if/else chains (across executeWorkflow and regenerateNode) with buildGenerateHeaders() and buildLlmHeaders() utility functions. Add 13 new tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract execution utilities from workflow store Move groupNodesByLevel, chunk, revokeBlobUrl, clearNodeImageRefs, and concurrency settings into executionUtils.ts with 21 new tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract getConnectedInputs and validateWorkflow as pure functions Move getConnectedInputs (136 lines) and validateWorkflow (59 lines) into connectedInputs.ts as pure functions taking (nodeId, nodes, edges). Store methods become thin wrappers. Add 22 new tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: define node executor interface and context types Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract simple node executors Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: unify nanoBanana execution into shared executor Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: unify generateVideo execution into shared executor Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: unify llmGenerate execution into shared executor Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: unify splitGrid execution into shared executor Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: unify videoStitch and easeCurve executors Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: replace switch/if-else with node executor registry Wire extracted executors into workflowStore, replacing the ~1000-line switch statement in executeWorkflow and ~750-line if-else chain in regenerateNode with executor registry calls. Store reduced from 3,402 to 1,782 lines. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: final cleanup of workflowStore module structure Remove dead trackSaveGeneration function (no longer called after executor extraction) and unused type imports. Store: 3,838 -> 1,721 lines (55% reduction). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: video regeneration spinner stuck + cancel error message Fix video element not reloading on regeneration by adding key prop tied to video history ID. Fix cancel showing timeout message by passing "user-cancelled" reason through AbortController and checking it in all three executor catch blocks. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address PR #59 review — 18 bug, security, and robustness fixes Providers: - fal: don't cache failed schema fetches, remove duplicate param spread, SSRF-validate mediaUrl - gemini: remove redundant header overrides, fix nano-banana model ID - kie: module-level MAX_MEDIA_SIZE, post-download size check, upload size guard - replicate: remove duplicate param spread, validate modelId format - wavespeed: post-download size check, NaN-safe parseInt, prevent prompt overwrite Executors: - generateVideo: validate stored fallback inputs same as regular path - nanoBanana: cap imageHistory at 50 entries - splitGrid: handle img.onerror with warning + null data - videoProcessing: add FileReader onerror/onabort handlers Utilities: - connectedInputs: use ?? instead of || for outputText/template - executionUtils: guard orphan children in topological sort, validate chunk() size Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: additional PR review fixes — SSRF, data semantics, sync tracking, error propagation Providers: - replicate: add SSRF validation on mediaUrl before fetch - fal/kie/replicate/wavespeed: large-video returns data="" with url set instead of putting raw URL in data field (violates GenerationOutput.data semantic) - kie: remove stale WaveSpeed JSDoc block from kie provider file - route.ts: update all output handling to support data="" + url for large videos Executors: - generateVideoExecutor/nanoBananaExecutor: track save-generation fetch in pendingImageSyncs via new trackSaveGeneration context method so auto-save waits for server ID resolution - videoProcessingExecutors: throw errors instead of returning in validation branches (encoderSupported, insufficient videos, no video connected) so Promise.allSettled sees rejections - types.ts: add trackSaveGeneration to NodeExecutionContext interface - workflowStore: wire trackSaveGeneration into both execution context sites Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: content-type fallback, replicate polling/validation, atomic gallery append - fal.ts: Use model capabilities to determine fallback content-type (video/mp4 vs image/png) instead of defaulting to video for all models - replicate.ts: Increase polling timeout to 10 min for video models; filter output array to valid strings before URL validation - nanoBananaExecutor.ts: Replace read-modify-write on outputGallery with atomic appendOutputGalleryImage using Zustand set() callback Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: extract _buildExecutionContext to deduplicate NodeExecutionContext construction Replace identical inline context creation in executeWorkflow and regenerateNode with a single shared helper, ensuring consistent behavior across both code paths. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add keyboard shortcuts help dialog - New KeyboardShortcutsDialog component showing all available shortcuts - Accessible via ? button in header and ? key on canvas - Groups shortcuts by category: General, Add Nodes, Layout, Canvas - Auto-detects Mac vs Windows/Linux for modifier key display - Follows existing modal patterns (Escape to close, backdrop click) * feat: add keyboard shortcuts dialog and 3D GLB viewer node - Keyboard shortcuts: press ? or click keyboard icon to view all shortcuts - 3D GLB viewer: upload .GLB files, orbit/rotate, capture as image output - Fix: restore trailing newline in gemini.ts provider * fix: make Prompt node editable when connected to LLM node When a Prompt node receives text from an LLM Generate node, the text should be editable by the user. Previously, the textarea was marked as readOnly when there was an incoming text connection, preventing edits in both the main view and the expanded modal. Changes: - Track last received LLM output to detect when it changes - Only update prompt when LLM node runs again (output changes) - Allow user edits in between LLM runs - Remove readOnly restriction on textarea - Update placeholder text to indicate editability This allows users to edit the LLM-generated text, which will be replaced only when the LLM node runs again, not on every render. Fixes #1470061054246518927 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: PR review fixes — lazy-load three.js, blob URL cleanup, missing integrations - Remove unused `useLoader` import from GLBViewerNode - Add useEffect cleanup to revoke blob URL on node unmount (memory leak) - Replace alert() with useToast for file validation errors - Lazy-load GLBViewerNode via next/dynamic to avoid bundling three.js for all users - Add glbViewer to ConnectionDropMenu IMAGE_SOURCE_OPTIONS - Add glbViewer case to quickstart validation createDefaultNodeData (build fix) - Restore trailing newline in gemini.ts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address PR #64 review — blob leak, error handling, tests, docs Move @types/three to devDependencies, fix blob URL cleanup to track changes (not just unmount), add try/catch to capture and scene disposal, remove GLBViewerNode from barrel export to preserve lazy-loading, fix JSDoc, update CLAUDE.md with glbViewer node and ? shortcut, add connectedInputs and nodeDefaults tests for glbViewer. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: improve GLB viewer — fix viewport sizing, add spot light, handle labels, scroll isolation - Fix 3D viewport not filling node by adding resize={{ offsetSize: true }} for correct measurement in CSS-transformed React Flow nodes - Replace grid/axis indicators with spot light for cleaner scene - Add labeled input (3D) and output (Image) handles matching generate node style - Add native wheel event listener to prevent graph zoom/pan while scrolling to zoom 3D model - Remove redundant CSS workarounds (absolute positioning style, extra relative wrapper) - Add edge-to-edge viewport via contentClassName (removes default padding when GLB loaded) - Overlay controls bar on viewport with gradient background Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add customizable canvas navigation settings (#65) * feat: add customizable canvas navigation settings Add a new settings modal that allows users to configure canvas navigation preferences: - Pan Mode: Space + Drag (default), Middle Mouse, or Always On (ComfyUI-style) - Zoom Mode: Alt + Scroll (default), Ctrl + Scroll, or Scroll (no modifier) - Selection Mode: Click (default) or Alt + Drag Features: - Settings persist in localStorage - New canvas settings button in header (monitor icon) - Modal UI with radio button groups for each setting - React Flow props dynamically configured based on user preferences - Updated wheel event handler to respect zoom mode settings This addresses user requests for ComfyUI/TouchDesigner-style navigation where panning and zooming work without holding modifier keys. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: PR #65 review — altDrag selection bug, icon, dedup, tests - Fix altDrag selection mode: use selectionKeyCode="Alt" instead of selectionOnDrag=true which made drag-select work without any key - Replace misleading video camera icon with arrows-pointing-out for canvas navigation settings button - Extract duplicated settings buttons JSX into settingsButtons variable shared by both configured/unconfigured project branches - Add defensive useEffect to sync CanvasSettingsModal state on open - Add missing semicolon in types/index.ts canvas re-export - Add localStorage tests for getCanvasNavigationSettings and saveCanvasNavigationSettings - Add integration tests for updateCanvasNavigationSettings - Fix WorkflowCanvas test mocks to include canvasNavigationSettings Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: move canvas navigation settings into Project Settings modal Consolidate canvas settings from standalone CanvasSettingsModal into a new "Canvas" tab in ProjectSetupModal. Remove "like ComfyUI" text, add Shift+Drag selection mode, and fix save button to bottom of dialog. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: remove double semicolon in types/index.ts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> * feat: add executeSelectedNodes with topo sort, abort, and downstream propagation Implements the "Run selected nodes" feature (PR #61) with fixes for all 8 review issues: topological ordering via groupNodesByLevel, AbortController cancellation, glbViewer case coverage, AbortError filtering, downstream consumer propagation with dedup guard, and dynamic button label. Also extracts saveLogSession helper to replace 4 inline duplicates across executeWorkflow and regenerateNode. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 3D model saving, error handling, and node improvements - Save 3D models (GLB) to generations folder via save-generation API - Add try-catch to WaveSpeed polling loop to handle network errors - Skip downloading 3D model bodies in WaveSpeed (return URL directly) - Fix schemaUtils false-positive matching for short property names - Stabilize GenerateImageNode output handle ID (always "image") - Fix GLBViewerNode: block-body forEach lint, store-based resize - Use useRef instead of useState for PromptNode lastReceivedText - Add executeGlbViewer tests and abort signal support - Fix annotation stale pass-through when upstream image changes - Skip error status on AbortError in all executor catch blocks - Revoke glbUrl blob URLs in clearNodeImageRefs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: require per-task commits in multi-task plans Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add Generate3DNodeData type definitions Add "generate3d" to NodeType union, Generate3DNodeData interface, Generate3DNodeDefaults, and update NodeDefaultsConfig. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add generate3d node defaults and dimensions Add default dimensions (300x300) and createDefaultNodeData case for the generate3d node type. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: create generate3d executor Extracted from nanoBananaExecutor's 3D handling code. Handles 3D model generation via /api/generate with mediaType: "3d", cost tracking, and auto-save to generations folder. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: create Generate3DNode component Dedicated node component for 3D model generation, modeled after GenerateVideoNode. Features: dynamic input handles from schema, 3D output handle, model browsing, parameter controls, status overlays. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: register generate3d node type across codebase Register in execution index, workflowStore (executeWorkflow, regenerateNode, executeSelectedNodes), nodes index, WorkflowCanvas (nodeTypes, getNodeHandles, minimap color, findCompatibleHandle). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add generate3d source output in connectedInputs Add generate3d case in getSourceOutput() to return 3D URL data, enabling downstream nodes to receive 3D model output. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: route 3D models to generate3d in ModelSearchDialog Add "3d" capability filter, update handleSelectModel to detect 3D models and create generate3d nodes with capabilities passed through, update recent models filter for 3D. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: update ConnectionDropMenu 3D source to use generate3d Change THREE_D_SOURCE_OPTIONS from nanoBanana to generate3d with cube icon and "Generate 3D" label. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: remove 3D code from GenerateImageNode and nanoBananaExecutor - Remove text-to-3d/image-to-3d from IMAGE_CAPABILITIES - Remove is3D memo and conditional handle/label styling - Remove 3D output preview block - Remove output3dUrl from model change handlers - Remove is3DModel detection and mediaType from nanoBanana executor - Remove 3D response handling from nanoBanana executor - Remove output3dUrl from NanoBananaNodeData and its defaults - Remove 3D fallback from nanoBanana in connectedInputs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: update tests and remaining registrations for generate3d - Add Generate3DNode.test.tsx with render, handle, and output tests - Add 3D handle tests to ConnectionDropMenu.test.tsx - Add 3D model routing test to ModelSearchDialog.test.tsx - Update ModelSearchDialog test expectations for capabilities passthrough - Register generate3d in executeNode.ts dispatcher - Add generate3d to WorkflowCanvas keyboard shortcut dimensions - Add generate3d to quickstart validation (VALID_NODE_TYPES, dimensions, defaults) - Add generate3d to chat tools (VALID_NODE_TYPES, description) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: unwrap array inputs for non-array API parameters When multiple images are connected to a generation node, dynamicInputs aggregates them into arrays. Providers wrapped single values into arrays for array-typed params, but never unwrapped arrays for string-typed params, causing API failures (e.g. fal's image_url receiving an array instead of a string). Add symmetric unwrap logic across all four providers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: move 3D from floating action bar to Generate submenu Replace top-level glbViewer button with generate3d option in the Generate combo dropdown, between Video and Text (LLM). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: hide CostIndicator when non-Gemini providers are in workflow The pricing calculator only has reliable data for Gemini models. When non-Gemini providers (fal, replicate, kie, wavespeed) are used, the displayed cost is incomplete/misleading. Add hasNonGeminiProviders() utility and use it to hide the CostIndicator entirely in that case. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add 3D capability badges to ModelSearchDialog Add text-to-3d and image-to-3d capability badge styling. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add play/run icon to LLM Generate node title bar Wire onRun and isExecuting props to BaseNode, matching the pattern used in GenerateImageNode and GenerateVideoNode. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: clear imageRef when user provides new image to prevent stale saves When a user pastes/uploads a new image into a node that already has a saved imageRef, the externalization logic incorrectly assumes the base64 is just hydrated data and discards it. Clear *Ref fields whenever new image data is set so the save logic correctly persists the new image. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: guard against undefined from empty array unwrap in fal provider Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add 3x2 grid layout option to split grid node Change layout selector from count-based to layout-based, allowing both 2x3 and 3x2 (portrait) layouts that produce 6 images. Now shows 7 layout options (2x2, 1x5, 2x3, 3x2, 2x4, 3x3, 2x5) with RxC labels. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: charlieshoelace <charlieshoelace@gmail.com> |
5 months ago |
|
|
895c848eaf
|
feat: add customizable canvas navigation settings (#65)
* feat: add customizable canvas navigation settings Add a new settings modal that allows users to configure canvas navigation preferences: - Pan Mode: Space + Drag (default), Middle Mouse, or Always On (ComfyUI-style) - Zoom Mode: Alt + Scroll (default), Ctrl + Scroll, or Scroll (no modifier) - Selection Mode: Click (default) or Alt + Drag Features: - Settings persist in localStorage - New canvas settings button in header (monitor icon) - Modal UI with radio button groups for each setting - React Flow props dynamically configured based on user preferences - Updated wheel event handler to respect zoom mode settings This addresses user requests for ComfyUI/TouchDesigner-style navigation where panning and zooming work without holding modifier keys. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * fix: PR #65 review — altDrag selection bug, icon, dedup, tests - Fix altDrag selection mode: use selectionKeyCode="Alt" instead of selectionOnDrag=true which made drag-select work without any key - Replace misleading video camera icon with arrows-pointing-out for canvas navigation settings button - Extract duplicated settings buttons JSX into settingsButtons variable shared by both configured/unconfigured project branches - Add defensive useEffect to sync CanvasSettingsModal state on open - Add missing semicolon in types/index.ts canvas re-export - Add localStorage tests for getCanvasNavigationSettings and saveCanvasNavigationSettings - Add integration tests for updateCanvasNavigationSettings - Fix WorkflowCanvas test mocks to include canvasNavigationSettings Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: move canvas navigation settings into Project Settings modal Consolidate canvas settings from standalone CanvasSettingsModal into a new "Canvas" tab in ProjectSetupModal. Remove "like ComfyUI" text, add Shift+Drag selection mode, and fix save button to bottom of dialog. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: remove double semicolon in types/index.ts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> |
5 months ago |
|
|
d22bc0b781 |
feat: parallel workflow execution for independent nodes
- Add level-based topological sort (groupNodesByLevel) to identify nodes that can execute concurrently - Change state from currentNodeId to currentNodeIds[] for tracking multiple executing nodes - Execute nodes in batches using Promise.allSettled with configurable concurrency limit (default 3, adjustable 1-10) - Integrate AbortController for fail-fast cancellation on errors - Pass abort signals to API fetch calls for proper request cancellation - Update UI: multiple nodes show execution border, FloatingActionBar shows "N nodes" during parallel execution - Add concurrency slider in Project Settings > Node Defaults tab - Store concurrency preference in localStorage Workflows with independent generate nodes (e.g., 3 parallel image generations) now complete in ~20-25s instead of ~60-90s sequential. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
5 months ago |
|
|
f0710bf830 |
Add WaveSpeed provider integration
|
5 months ago |
|
|
9b4718e279 |
feat: Template Explorer, Comment Navigation, and Output Node Improvements
## 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> |
6 months ago |
|
|
99ef3b3053 |
test(17-06): add WorkflowCanvas component tests
- Add 31 tests for WorkflowCanvas covering: - Basic rendering (ReactFlow, Background, Controls, MiniMap) - Welcome modal visibility based on canvas state - Node and edge type registration - Drag and drop for nodes, images, and workflows - Keyboard shortcuts (Ctrl+Enter, Ctrl+C, Shift+key node creation) - Canvas configuration (zoom, delete keys, multi-selection) - Group handling support - Add ResizeObserver and DOMMatrixReadOnly mocks to test setup for React Flow Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
6 months ago |