refactor(agent-modal): revamped UI/UX for the agent modal (#1838)
Co-authored-by: Dax Raad <d@ironbay.co> Co-authored-by: Dax <mail@thdxr.com>
This commit is contained in:
committed by
GitHub
parent
d16ae1fc4e
commit
81583cddbd
@@ -71,9 +71,11 @@ type ModelSelectedMsg struct {
|
||||
Provider opencode.Provider
|
||||
Model opencode.Model
|
||||
}
|
||||
|
||||
type AgentSelectedMsg struct {
|
||||
Agent opencode.Agent
|
||||
AgentName string
|
||||
}
|
||||
|
||||
type SessionClearedMsg struct{}
|
||||
type CompactSessionMsg struct{}
|
||||
type SendPrompt = Prompt
|
||||
@@ -272,6 +274,7 @@ func (a *App) cycleMode(forward bool) (*App, tea.Cmd) {
|
||||
}
|
||||
|
||||
a.State.Agent = a.Agent().Name
|
||||
a.State.UpdateAgentUsage(a.Agent().Name)
|
||||
return a, a.SaveState()
|
||||
}
|
||||
|
||||
@@ -316,6 +319,45 @@ func (a *App) CycleRecentModel() (*App, tea.Cmd) {
|
||||
return a, toast.NewErrorToast("Recent model not found")
|
||||
}
|
||||
|
||||
func (a *App) SwitchToAgent(agentName string) (*App, tea.Cmd) {
|
||||
// Find the agent index by name
|
||||
for i, agent := range a.Agents {
|
||||
if agent.Name == agentName {
|
||||
a.AgentIndex = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Set up model for the new agent
|
||||
modelID := a.Agent().Model.ModelID
|
||||
providerID := a.Agent().Model.ProviderID
|
||||
if modelID == "" {
|
||||
if model, ok := a.State.AgentModel[a.Agent().Name]; ok {
|
||||
modelID = model.ModelID
|
||||
providerID = model.ProviderID
|
||||
}
|
||||
}
|
||||
|
||||
if modelID != "" {
|
||||
for _, provider := range a.Providers {
|
||||
if provider.ID == providerID {
|
||||
a.Provider = &provider
|
||||
for _, model := range provider.Models {
|
||||
if model.ID == modelID {
|
||||
a.Model = &model
|
||||
break
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
a.State.Agent = a.Agent().Name
|
||||
a.State.UpdateAgentUsage(agentName)
|
||||
return a, a.SaveState()
|
||||
}
|
||||
|
||||
// findModelByFullID finds a model by its full ID in the format "provider/model"
|
||||
func findModelByFullID(
|
||||
providers []opencode.Provider,
|
||||
|
||||
@@ -16,6 +16,11 @@ type ModelUsage struct {
|
||||
LastUsed time.Time `toml:"last_used"`
|
||||
}
|
||||
|
||||
type AgentUsage struct {
|
||||
AgentName string `toml:"agent_name"`
|
||||
LastUsed time.Time `toml:"last_used"`
|
||||
}
|
||||
|
||||
type AgentModel struct {
|
||||
ProviderID string `toml:"provider_id"`
|
||||
ModelID string `toml:"model_id"`
|
||||
@@ -29,6 +34,7 @@ type State struct {
|
||||
Model string `toml:"model"`
|
||||
Agent string `toml:"agent"`
|
||||
RecentlyUsedModels []ModelUsage `toml:"recently_used_models"`
|
||||
RecentlyUsedAgents []AgentUsage `toml:"recently_used_agents"`
|
||||
MessagesRight bool `toml:"messages_right"`
|
||||
SplitDiff bool `toml:"split_diff"`
|
||||
MessageHistory []Prompt `toml:"message_history"`
|
||||
@@ -42,6 +48,7 @@ func NewState() *State {
|
||||
Agent: "build",
|
||||
AgentModel: make(map[string]AgentModel),
|
||||
RecentlyUsedModels: make([]ModelUsage, 0),
|
||||
RecentlyUsedAgents: make([]AgentUsage, 0),
|
||||
MessageHistory: make([]Prompt, 0),
|
||||
}
|
||||
}
|
||||
@@ -83,6 +90,42 @@ func (s *State) RemoveModelFromRecentlyUsed(providerID, modelID string) {
|
||||
}
|
||||
}
|
||||
|
||||
// UpdateAgentUsage updates the recently used agents list with the specified agent
|
||||
func (s *State) UpdateAgentUsage(agentName string) {
|
||||
now := time.Now()
|
||||
|
||||
// Check if this agent is already in the list
|
||||
for i, usage := range s.RecentlyUsedAgents {
|
||||
if usage.AgentName == agentName {
|
||||
s.RecentlyUsedAgents[i].LastUsed = now
|
||||
usage := s.RecentlyUsedAgents[i]
|
||||
copy(s.RecentlyUsedAgents[1:i+1], s.RecentlyUsedAgents[0:i])
|
||||
s.RecentlyUsedAgents[0] = usage
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
newUsage := AgentUsage{
|
||||
AgentName: agentName,
|
||||
LastUsed: now,
|
||||
}
|
||||
|
||||
// Prepend to slice and limit to last 20 entries
|
||||
s.RecentlyUsedAgents = append([]AgentUsage{newUsage}, s.RecentlyUsedAgents...)
|
||||
if len(s.RecentlyUsedAgents) > 20 {
|
||||
s.RecentlyUsedAgents = s.RecentlyUsedAgents[:20]
|
||||
}
|
||||
}
|
||||
|
||||
func (s *State) RemoveAgentFromRecentlyUsed(agentName string) {
|
||||
for i, usage := range s.RecentlyUsedAgents {
|
||||
if usage.AgentName == agentName {
|
||||
s.RecentlyUsedAgents = append(s.RecentlyUsedAgents[:i], s.RecentlyUsedAgents[i+1:]...)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *State) AddPromptToHistory(prompt Prompt) {
|
||||
s.MessageHistory = append([]Prompt{prompt}, s.MessageHistory...)
|
||||
if len(s.MessageHistory) > 50 {
|
||||
|
||||
Reference in New Issue
Block a user