on main help sign in
fix(ui): restore pills to-do in client/server mode
commit0bbc8a87e8695c5224d870df49f613191122c740 authorChristian Rocha <christian@rocha.is> dateSat 16 May 2026, 08:57 (5 months ago) parent45b1e63
4 files changed+57−1
internal/proto/proto.go+1−1 internal/proto/session.go+8 internal/server/events.go+16 internal/workspace/client_workspace.go+32
internal/proto/proto.go+1−1
@@ -56,7 +56,7 @@ type AgentSession struct {
5656
5757// IsZero checks if the AgentSession is zero-valued.
5858func (a AgentSession) IsZero() bool {
59− return a == AgentSession{}
59+ return a.ID == "" && !a.IsBusy
6060}
6161
6262// PermissionAction represents an action taken on a permission request.
internal/proto/session.go+8
@@ -10,6 +10,14 @@ type Session struct {
1010 CompletionTokens int64 `json:"completion_tokens"`
1111 SummaryMessageID string `json:"summary_message_id"`
1212 Cost float64 `json:"cost"`
13+ Todos []Todo `json:"todos,omitempty"`
1314 CreatedAt int64 `json:"created_at"`
1415 UpdatedAt int64 `json:"updated_at"`
1516}
17+
18+// Todo represents a single todo entry on a session in the proto layer.
19+type Todo struct {
20+ Content string `json:"content"`
21+ Status string `json:"status"`
22+ ActiveForm string `json:"active_form"`
23+}
internal/server/events.go+16
@@ -135,11 +135,27 @@ func sessionToProto(s session.Session) proto.Session {
135135 PromptTokens: s.PromptTokens,
136136 CompletionTokens: s.CompletionTokens,
137137 Cost: s.Cost,
138+ Todos: todosToProto(s.Todos),
138139 CreatedAt: s.CreatedAt,
139140 UpdatedAt: s.UpdatedAt,
140141 }
141142}
142143
144+func todosToProto(todos []session.Todo) []proto.Todo {
145+ if len(todos) == 0 {
146+ return nil
147+ }
148+ out := make([]proto.Todo, len(todos))
149+ for i, t := range todos {
150+ out[i] = proto.Todo{
151+ Content: t.Content,
152+ Status: string(t.Status),
153+ ActiveForm: t.ActiveForm,
154+ }
155+ }
156+ return out
157+}
158+
143159func fileToProto(f history.File) proto.File {
144160 return proto.File{
145161 ID: f.ID,
internal/workspace/client_workspace.go+32
@@ -671,11 +671,27 @@ func protoToSession(s proto.Session) session.Session {
671671 PromptTokens: s.PromptTokens,
672672 CompletionTokens: s.CompletionTokens,
673673 Cost: s.Cost,
674+ Todos: protoToTodos(s.Todos),
674675 CreatedAt: s.CreatedAt,
675676 UpdatedAt: s.UpdatedAt,
676677 }
677678}
678679
680+func protoToTodos(todos []proto.Todo) []session.Todo {
681+ if len(todos) == 0 {
682+ return nil
683+ }
684+ out := make([]session.Todo, len(todos))
685+ for i, t := range todos {
686+ out[i] = session.Todo{
687+ Content: t.Content,
688+ Status: session.TodoStatus(t.Status),
689+ ActiveForm: t.ActiveForm,
690+ }
691+ }
692+ return out
693+}
694+
679695func protoToFile(f proto.File) history.File {
680696 return history.File{
681697 ID: f.ID,
@@ -770,7 +786,23 @@ func sessionToProto(s session.Session) proto.Session {
770786 PromptTokens: s.PromptTokens,
771787 CompletionTokens: s.CompletionTokens,
772788 Cost: s.Cost,
789+ Todos: todosToProto(s.Todos),
773790 CreatedAt: s.CreatedAt,
774791 UpdatedAt: s.UpdatedAt,
775792 }
776793}
794+
795+func todosToProto(todos []session.Todo) []proto.Todo {
796+ if len(todos) == 0 {
797+ return nil
798+ }
799+ out := make([]proto.Todo, len(todos))
800+ for i, t := range todos {
801+ out[i] = proto.Todo{
802+ Content: t.Content,
803+ Status: string(t.Status),
804+ ActiveForm: t.ActiveForm,
805+ }
806+ }
807+ return out
808+}