package history import ( "context" "fmt" ) // ListAfter 按最旧优先返回 sessionID 中严格新于 after(created_at > after)的 // 至多 limit 条消息,用于前向增量追赶:重连的客户端传入自己已见过的最新 // createdAt,只拉取错过的部分,无论有多少条("before" 游标只能向后走,无法 // 恢复大于一页的空洞)。platform 非空时把该页进一步限制为携带该来源平台的 // 消息,与 List 完全一致。rowid 打破 created_at 的并列,使同一毫秒写入的 // 消息保持插入顺序。返回切片非 nil;limit 钳制到 [1, maxPageLimit]。 func (s *Store) ListAfter(ctx context.Context, sessionID string, after int64, limit int, platform string) ([]Message, error) { limit = clampLimit(limit) query := `SELECT ` + messageColumns + ` FROM chat_messages WHERE session_id = ? AND created_at > ?` args := []any{sessionID, after} if platform != "" { query += ` AND platform = ?` args = append(args, platform) } query += ` ORDER BY created_at ASC, rowid ASC LIMIT ?` args = append(args, limit) rows, err := s.db.QueryContext(ctx, query, args...) if err != nil { return nil, fmt.Errorf("history: list after %s: %w", sessionID, err) } defer func() { _ = rows.Close() }() msgs := make([]Message, 0) for rows.Next() { m, err := scanMessage(rows) if err != nil { return nil, fmt.Errorf("history: scan list after %s: %w", sessionID, err) } msgs = append(msgs, m) } if err := rows.Err(); err != nil { return nil, fmt.Errorf("history: iterate list after %s: %w", sessionID, err) } return msgs, nil }