81 lines
2.5 KiB
Go
81 lines
2.5 KiB
Go
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"`
|
|
ProjectName string `json:"project_name,omitempty"`
|
|
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,
|
|
ProjectName: view.ProjectName,
|
|
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()),
|
|
}
|
|
}
|