diff --git a/ai/internal/hitl/bot.go b/ai/internal/hitl/bot.go index 612f33a..8236873 100644 --- a/ai/internal/hitl/bot.go +++ b/ai/internal/hitl/bot.go @@ -131,7 +131,7 @@ func (b *Bot) Post(ctx context.Context, req PostRequest) error { if err != nil { return err } - if err := b.store.InsertHitl(ctx, rag.HitlMessage{Token: req.Token, ChannelID: msg.ChannelID, MessageID: msg.ID, ActionID: req.ActionID, Target: req.Target, RunID: req.RunID, ScenarioID: req.ScenarioID, SessionID: req.SessionID, ExpiresAt: expires}); err != nil { + if err := b.store.InsertHitl(ctx, rag.HitlMessage{Token: req.Token, ChannelID: msg.ChannelID, MessageID: msg.ID, ActionID: req.ActionID, Target: req.Target, Diagnosis: req.Diagnosis, RunID: req.RunID, ScenarioID: req.ScenarioID, SessionID: req.SessionID, ExpiresAt: expires}); err != nil { return err } b.arm(req.Token, time.Until(expires)) @@ -217,14 +217,9 @@ func (b *Bot) Decide(ctx context.Context, token, decision, by string) (string, e return "", fmt.Errorf("unknown decision %s", decision) } +// edit re-renders the original message with the stored diagnosis, the new status and disabled buttons. func (b *Bot) edit(m *rag.HitlMessage, status string, color int, result map[string]any) error { - ctx := context.Background() - d := map[string]any{} - if se, err := b.store.GetHitl(ctx, m.Token); err == nil { - m = se - } - em := embedFor(d, m.ActionID, m.Target, m.RunID, m.ScenarioID, status, color) - em.Fields = em.Fields[1:] // the diagnosis fields are already in the original message; keep the edit compact + em := embedFor(m.Diagnosis, m.ActionID, m.Target, m.RunID, m.ScenarioID, status, color) if result != nil { rb, _ := json.Marshal(result) em.Fields = append(em.Fields, &discordgo.MessageEmbedField{Name: "Result", Value: "```json\n" + truncate(string(rb), 900) + "\n```"}) diff --git a/ai/internal/rag/store.go b/ai/internal/rag/store.go index 75ef88f..6328afd 100644 --- a/ai/internal/rag/store.go +++ b/ai/internal/rag/store.go @@ -57,6 +57,7 @@ CREATE TABLE IF NOT EXISTS ai.hitl_messages ( message_id text NOT NULL, action_id text NOT NULL, target jsonb NOT NULL DEFAULT '{}'::jsonb, + diagnosis jsonb NOT NULL DEFAULT '{}'::jsonb, run_id text, scenario_id text, session_id text, @@ -302,6 +303,7 @@ type HitlMessage struct { MessageID string ActionID string Target map[string]any + Diagnosis map[string]any RunID *string ScenarioID *string SessionID string @@ -313,20 +315,22 @@ type HitlMessage struct { func (s *Store) InsertHitl(ctx context.Context, m HitlMessage) error { t, _ := json.Marshal(m.Target) - _, err := s.pool.Exec(ctx, `INSERT INTO ai.hitl_messages (token,channel_id,message_id,action_id,target,run_id,scenario_id,session_id,expires_at) - VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)`, m.Token, m.ChannelID, m.MessageID, m.ActionID, t, m.RunID, m.ScenarioID, m.SessionID, m.ExpiresAt) + d, _ := json.Marshal(m.Diagnosis) + _, err := s.pool.Exec(ctx, `INSERT INTO ai.hitl_messages (token,channel_id,message_id,action_id,target,diagnosis,run_id,scenario_id,session_id,expires_at) + VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)`, m.Token, m.ChannelID, m.MessageID, m.ActionID, t, d, m.RunID, m.ScenarioID, m.SessionID, m.ExpiresAt) return err } func (s *Store) GetHitl(ctx context.Context, token string) (*HitlMessage, error) { var m HitlMessage - var t []byte - err := s.pool.QueryRow(ctx, `SELECT token,channel_id,message_id,action_id,target,run_id,scenario_id,COALESCE(session_id,''),expires_at,decided_at,decision,decided_by FROM ai.hitl_messages WHERE token=$1`, token). - Scan(&m.Token, &m.ChannelID, &m.MessageID, &m.ActionID, &t, &m.RunID, &m.ScenarioID, &m.SessionID, &m.ExpiresAt, &m.DecidedAt, &m.Decision, &m.DecidedBy) + var t, d []byte + err := s.pool.QueryRow(ctx, `SELECT token,channel_id,message_id,action_id,target,diagnosis,run_id,scenario_id,COALESCE(session_id,''),expires_at,decided_at,decision,decided_by FROM ai.hitl_messages WHERE token=$1`, token). + Scan(&m.Token, &m.ChannelID, &m.MessageID, &m.ActionID, &t, &d, &m.RunID, &m.ScenarioID, &m.SessionID, &m.ExpiresAt, &m.DecidedAt, &m.Decision, &m.DecidedBy) if err != nil { return nil, err } _ = json.Unmarshal(t, &m.Target) + _ = json.Unmarshal(d, &m.Diagnosis) return &m, nil }