feat: AI-assisted flow builder with 4-stage wizard #87

Merged
chihlasm merged 25 commits from feat/ai-flow-builder into main 2026-02-23 05:03:54 +00:00
2 changed files with 7 additions and 14 deletions
Showing only changes of commit f5e001b199 - Show all commits

View File

@@ -1,4 +1,3 @@
import { useState, useEffect, useRef } from 'react'
import { Check, RefreshCw, SkipForward, ChevronRight, ChevronLeft } from 'lucide-react'
import { useAIFlowBuilderStore } from '@/store/aiFlowBuilderStore'
import { GeneratingAnimation } from './GeneratingAnimation'
@@ -7,6 +6,7 @@ import { cn } from '@/lib/utils'
export function BranchDetailView() {
const {
selectedBranches,
currentBranchIndex,
generateBranchDetail,
assemble,
isLoading,
@@ -15,24 +15,13 @@ export function BranchDetailView() {
setError,
} = useAIFlowBuilderStore()
const [viewingIndex, setViewingIndex] = useState(0)
const viewingIndex = currentBranchIndex
const setViewingIndex = (i: number) => useAIFlowBuilderStore.setState({ currentBranchIndex: i })
const currentBranch = selectedBranches[viewingIndex]
const allBranchesHaveDetail = selectedBranches.every((b) => b.steps)
const branchesWithDetail = selectedBranches.filter((b) => b.steps).length
// Auto-advance to next branch without detail after generation completes
const prevDetailCount = useRef(branchesWithDetail)
useEffect(() => {
if (branchesWithDetail > prevDetailCount.current) {
prevDetailCount.current = branchesWithDetail
const nextIndex = selectedBranches.findIndex((b) => !b.steps)
if (nextIndex !== -1) {
setViewingIndex(nextIndex)
}
}
}, [branchesWithDetail, selectedBranches])
const handleGenerate = async (branchName: string) => {
setError(null)
await generateBranchDetail(branchName)

View File

@@ -136,8 +136,12 @@ export const useAIFlowBuilderStore = create<AIFlowBuilderState>()((set, get) =>
const updatedBranches = selectedBranches.map((b) =>
b.name === branchName ? { ...b, steps: response.steps } : b
)
// Advance to the next branch that still needs detail
const nextIndex = updatedBranches.findIndex((b) => !b.steps)
const currentBranchIndex = nextIndex !== -1 ? nextIndex : updatedBranches.findIndex((b) => b.name === branchName)
set({
selectedBranches: updatedBranches,
currentBranchIndex,
phase: 'detailing',
isLoading: false,
})