package app import "github.com/hjbdev/patterm/internal/scratchpad" // chromeModel is the semantic host chrome state. Renderers continue to own // ANSI output; this model is the serializable shape a client can draw locally. type chromeModel struct { ProjectKey string `json:"project_key"` FocusedID string `json:"focused_id,omitempty"` FocusedPad string `json:"focused_pad,omitempty"` ActiveAgentID string `json:"active_agent_id,omitempty"` Tabs []childModel `json:"tabs"` Processes []childModel `json:"processes"` AgentTree []childModel `json:"agent_tree"` Sidebar []navEntryModel `json:"sidebar"` Scratchpads []scratchpadModel `json:"scratchpads"` } type childModel struct { ID string `json:"id"` Name string `json:"name"` Kind string `json:"kind"` ParentID string `json:"parent_id,omitempty"` Status string `json:"status"` Owner string `json:"owner"` } type navEntryModel struct { ChildID string `json:"child_id,omitempty"` Pad string `json:"pad,omitempty"` } type scratchpadModel struct { Name string `json:"name"` } func buildChromeModel(projectKey string, view ClientView, children []*Child, pads []scratchpad.Entry) chromeModel { active := view.ActiveAgentID if active == "" { active = activeRootID(children, view.FocusedID) } model := chromeModel{ ProjectKey: projectKey, FocusedID: view.FocusedID, FocusedPad: view.FocusedPad, ActiveAgentID: active, } for _, c := range runningTopLevels(children) { model.Tabs = append(model.Tabs, serializeChildModel(c)) } for _, c := range processList(children) { model.Processes = append(model.Processes, serializeChildModel(c)) } for _, c := range visibleAgentTree(children, active) { model.AgentTree = append(model.AgentTree, serializeChildModel(c)) } for _, n := range sidebarNav(children, active, pads) { model.Sidebar = append(model.Sidebar, navEntryModel{ChildID: n.childID, Pad: n.pad}) } for _, p := range pads { model.Scratchpads = append(model.Scratchpads, scratchpadModel{Name: p.Name}) } return model } func serializeChildModel(c *Child) childModel { if c == nil { return childModel{} } return childModel{ ID: c.ID, Name: c.DisplayName(), Kind: string(c.Kind), ParentID: c.ParentID, Status: string(c.Status()), Owner: string(c.Owner()), } }