diff --git a/internal/agentinput/image.go b/internal/agentinput/image.go new file mode 100644 index 0000000..e2d8376 --- /dev/null +++ b/internal/agentinput/image.go @@ -0,0 +1,6 @@ +package agentinput + +type Image struct { + MediaType string + Data []byte +} diff --git a/internal/agents/manager.go b/internal/agents/manager.go index e4fb846..ae2a62e 100644 --- a/internal/agents/manager.go +++ b/internal/agents/manager.go @@ -13,6 +13,7 @@ import ( "sync" "time" + "g.fc.run/ai/byre/internal/agentinput" "g.fc.run/ai/byre/internal/api" "g.fc.run/ai/byre/internal/claude" "g.fc.run/ai/byre/internal/clients" @@ -602,7 +603,7 @@ func (m *Manager) launch(ctx context.Context, sess api.AgentSession, task api.Ta return m.store.GetSession(ctx, sess.Id) } -func (m *Manager) deliver(ctx context.Context, sess api.AgentSession, task api.Task, actor, client, text string, imgs []image, compacting bool) error { +func (m *Manager) deliver(ctx context.Context, sess api.AgentSession, task api.Task, actor, client, text string, imgs []agentinput.Image, compacting bool) error { l, err := m.ensureLive(ctx, sess, task) if err == nil { err = m.syncModel(ctx, l, sess.Model) @@ -642,14 +643,14 @@ func (m *Manager) deliverRecorded(ctx context.Context, sess api.AgentSession, ta return true, m.deliver(ctx, sess, task, ev.Actor, client, text, imgs, isHandoffPrompt(ev.Actor, text)) } -func (m *Manager) readImages(ctx context.Context, ids []string) ([]image, error) { - imgs := []image{} +func (m *Manager) readImages(ctx context.Context, ids []string) ([]agentinput.Image, error) { + imgs := []agentinput.Image{} for _, id := range ids { b, data, err := m.store.ReadBlob(ctx, id) if err != nil { return nil, err } - imgs = append(imgs, image{mediaType: b.ContentType, data: data}) + imgs = append(imgs, agentinput.Image{MediaType: b.ContentType, Data: data}) } return imgs, nil } @@ -702,7 +703,7 @@ func (m *Manager) message(ctx context.Context, sess api.AgentSession, task api.T return m.send(ctx, l, m.agentText(actor, "", text), imgs) } -func (m *Manager) send(ctx context.Context, l *live, text string, imgs []image) error { +func (m *Manager) send(ctx context.Context, l *live, text string, imgs []agentinput.Image) error { err := l.sess.send(ctx, text, imgs) if err != nil { return err @@ -710,7 +711,7 @@ func (m *Manager) send(ctx context.Context, l *live, text string, imgs []image) return m.store.MarkSessionDelivered(ctx, l.id) } -func (m *Manager) recordMessage(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID, client string, images []string) ([]image, bool, error) { +func (m *Manager) recordMessage(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID, client string, images []string) ([]agentinput.Image, bool, error) { implementer := sess.Role == api.Implementer if implementer && isMergeInPrompt(actor, text) { m.ownMerge(sess.Id, task.Id, task.WorktreePath) diff --git a/internal/agents/process.go b/internal/agents/process.go index 3afe0cb..c903bf1 100644 --- a/internal/agents/process.go +++ b/internal/agents/process.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "g.fc.run/ai/byre/internal/agentinput" "g.fc.run/ai/byre/internal/antigravity" "g.fc.run/ai/byre/internal/api" "g.fc.run/ai/byre/internal/claude" @@ -17,13 +18,8 @@ import ( "g.fc.run/ai/byre/internal/mcp" ) -type image struct { - mediaType string - data []byte -} - type agentProcess interface { - send(ctx context.Context, text string, images []image) error + send(ctx context.Context, text string, images []agentinput.Image) error interrupt(ctx context.Context) error setModel(ctx context.Context, model string) error kill() @@ -118,12 +114,8 @@ func (m *Manager) startClaude(ctx context.Context, sess api.AgentSession, l *liv return claudeProcess{s: s}, nil } -func (p claudeProcess) send(ctx context.Context, text string, images []image) error { - imgs := []claude.Image{} - for _, img := range images { - imgs = append(imgs, claude.Image{MediaType: img.mediaType, Data: img.data}) - } - return p.s.Send(text, imgs...) +func (p claudeProcess) send(ctx context.Context, text string, images []agentinput.Image) error { + return p.s.Send(text, images...) } func (p claudeProcess) interrupt(ctx context.Context) error { @@ -196,12 +188,8 @@ func (m *Manager) startCodex(ctx context.Context, sess api.AgentSession, l *live return codexProcess{s: s}, nil } -func (p codexProcess) send(ctx context.Context, text string, images []image) error { - imgs := []codex.Image{} - for _, img := range images { - imgs = append(imgs, codex.Image{MediaType: img.mediaType, Data: img.data}) - } - _, err := p.s.Send(ctx, text, imgs...) +func (p codexProcess) send(ctx context.Context, text string, images []agentinput.Image) error { + _, err := p.s.Send(ctx, text, images...) return err } @@ -267,12 +255,8 @@ func (m *Manager) startAntigravity(ctx context.Context, sess api.AgentSession, l return antigravityProcess{s: s}, nil } -func (p antigravityProcess) send(ctx context.Context, text string, images []image) error { - imgs := []antigravity.Image{} - for _, img := range images { - imgs = append(imgs, antigravity.Image{MediaType: img.mediaType, Data: img.data}) - } - return p.s.Send(text, imgs...) +func (p antigravityProcess) send(ctx context.Context, text string, images []agentinput.Image) error { + return p.s.Send(text, images...) } func (p antigravityProcess) interrupt(ctx context.Context) error { diff --git a/internal/antigravity/session.go b/internal/antigravity/session.go index 9cf61af..2dc3dee 100644 --- a/internal/antigravity/session.go +++ b/internal/antigravity/session.go @@ -20,6 +20,7 @@ import ( "syscall" "time" + "g.fc.run/ai/byre/internal/agentinput" "g.fc.run/ai/byre/internal/mcp" "g.fc.run/ai/byre/internal/procgroup" ) @@ -43,11 +44,6 @@ type Options struct { OnBadLine func(line []byte, reason string) } -type Image struct { - MediaType string - Data []byte -} - type Event struct { Kind string Raw json.RawMessage @@ -460,7 +456,7 @@ type block struct { Text string `json:"text"` } -func (s *Session) Send(text string, images ...Image) error { +func (s *Session) Send(text string, images ...agentinput.Image) error { s.mu.Lock() defer s.mu.Unlock() diff --git a/internal/claude/session.go b/internal/claude/session.go index dc7d865..97870ba 100644 --- a/internal/claude/session.go +++ b/internal/claude/session.go @@ -17,6 +17,7 @@ import ( "sync/atomic" "time" + "g.fc.run/ai/byre/internal/agentinput" "g.fc.run/ai/byre/internal/mcp" "g.fc.run/ai/byre/internal/procgroup" ) @@ -427,12 +428,7 @@ func (s *Session) ID() string { return s.id } -type Image struct { - MediaType string - Data []byte -} - -func (s *Session) Send(text string, images ...Image) error { +func (s *Session) Send(text string, images ...agentinput.Image) error { var content any = text if len(images) > 0 { blocks := []map[string]any{} diff --git a/internal/codex/session.go b/internal/codex/session.go index 5b49daf..5cd3554 100644 --- a/internal/codex/session.go +++ b/internal/codex/session.go @@ -17,6 +17,7 @@ import ( "sync/atomic" "time" + "g.fc.run/ai/byre/internal/agentinput" "g.fc.run/ai/byre/internal/mcp" "g.fc.run/ai/byre/internal/procgroup" ) @@ -58,11 +59,6 @@ func (e Event) Decode() (any, error) { return v, nil } -type Image struct { - MediaType string - Data []byte -} - type RPCError struct { Code int64 `json:"code"` Message string `json:"message"` @@ -368,7 +364,7 @@ func (s *Session) SetModel(model string) { s.stateMu.Unlock() } -func (s *Session) Send(ctx context.Context, text string, images ...Image) (Turn, error) { +func (s *Session) Send(ctx context.Context, text string, images ...agentinput.Image) (Turn, error) { input := []UserInput{} for _, img := range images { input = append(input, UserInput{