## ================================================================= ## ThoughtFrame: FSM Viewer (Velocity + Bootstrap + Mermaid) ## ================================================================= #set($fsm = $testbench.getFrameManager().getStateMachine("git/build")) #set($frame = $testbench.getFrameManager().loadFrame("AZkGa0J6boiDT-g06uIv")) $frame._state $frame.findValue("repositoryid") #set($fsmAnalysis = $testbench.getFrameManager().analyzeStateMachine($fsm))

State Machine Viewer

#createFrame($frame $fsm)
State Diagram
#renderFSM($frame $fsmAnalysis)
Interactive Flowchart
      flowchart LR

        %% Build edges with labels (nodes are created implicitly)
        #foreach($edge in $fsmAnalysis.edges)
          #if($edge.to)
            #if($edge.via)
              $edge.from -- "$edge.via" --> $edge.to
            #else
              $edge.from --> $edge.to
            #end
          #else
            #if($edge.via)
              $edge.from -- "$edge.via" --> X((End))
            #else
              $edge.from --> X((End))
            #end
          #end
        #end

        %% Click bindings to descriptions
        #foreach($stateName in $fsmAnalysis.states)
          click $stateName "/$frame.get('framesource')/descriptions/$stateName.html" "Open description for $stateName"
        #end
        
%% Highlight active state
#if($frame.get("state"))
  style $frame.get("state") fill:#E8FAD7,stroke:#22c55e,stroke-width:2px,color:#065f46
#end
      
Class
$fsmAnalysis.className
States
#foreach($s in $fsmAnalysis.states) $s #end
Edges
#foreach($e in $fsmAnalysis.edges) $e.from → $e.to#if($e.via)  ($e.via)#end#if($foreach.count < $fsmAnalysis.edges.size()), #end #end
$pages.include("$apphome/frame/chat/terminal.html")