diff --git a/frontend/src/components/l1/L1WalkTreeVariant.tsx b/frontend/src/components/l1/L1WalkTreeVariant.tsx new file mode 100644 index 00000000..eaebcf3a --- /dev/null +++ b/frontend/src/components/l1/L1WalkTreeVariant.tsx @@ -0,0 +1,173 @@ +import { useState } from 'react' +import { ChevronLeft } from 'lucide-react' +import { Link } from 'react-router-dom' +import { l1Api } from '@/api/l1' +import type { WalkSession } from '@/types/l1' +import { EscalateModal, ResolveModal } from '@/components/l1/WalkModals' + +interface Props { + session: WalkSession + onSessionUpdate: (s: WalkSession) => void + onDone: () => void +} + +export function L1WalkTreeVariant({ session, onSessionUpdate, onDone }: Props) { + const [showResolve, setShowResolve] = useState(false) + const [showEscalate, setShowEscalate] = useState(false) + const [note, setNote] = useState('') + + // Phase 1: we don't have the live flow-tree fetch wired up here yet + // (the tree-navigation pages have their own loader). The walker shows the + // walked-path side panel, advance buttons stubbed for now — Phase 2 wires + // the actual flow tree fetching + node advancement against tree data. + // The "Yes/No" buttons record a synthetic step so the walked_path JSONB + // grows; this gives us a functional roundtrip until Phase 2 wires the tree. + + const handleAnswer = async (answer: 'yes' | 'no') => { + const nodeId = session.current_node_id || `step-${session.walked_path.length + 1}` + try { + const updated = await l1Api.step(session.id, { + node_id: nodeId, + question: `Step ${session.walked_path.length + 1}`, + answer, + note: note || null, + }) + onSessionUpdate(updated) + setNote('') + } catch (err) { + // Keep silent for v1 — Phase 2 wires real error UI + console.error('step failed', err) + } + } + + const lastError = (err: unknown): string => { + if (typeof err === 'object' && err && 'response' in err) { + const detail = (err as any).response?.data?.detail + if (typeof detail === 'string') return detail + } + return 'Unexpected error' + } + + return ( +
+ {/* Header */} +
+ + + #{session.id.slice(0, 8)} + {session.session_kind === 'proposal' && ( + AI-built + )} + +
+ + +
+
+ + {/* Two-pane body */} +
+
+

+ Step {session.walked_path.length + 1} +

+ {session.status !== 'active' ? ( +
+

+ This session is {session.status}. +

+ +
+ ) : ( +
+

Continue the walk:

+
+ + +
+