fix(hitl): keep the diagnosis in the HITL ledger so edited messages retain evidence and rationale

버튼 처리·만료 후 메시지를 편집할 때 빈 진단으로 다시 그려 증거·근거 필드가 "-"로 지워지던
결함을 고친다. ai.hitl_messages에 diagnosis jsonb를 추가해 게시 시점의 진단을 저장하고
편집 시 그대로 재사용한다.
This commit is contained in:
seon committed 2026-10-08 01:47:04 +09:00
1 parent c442601ab3
commit 43696d48c8
2 files changed
+12 -13

No files matched your search

+9 -5
View File
@@ -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
}