Plugin Discourse RAG (grain post, rerank cross-encoder, citations whitelistées, gate déterministe, réécriture de requête multi-tour) + documentation du chantier (design, éval, sécurité, pipeline). Export sanitisé depuis le monorepo privé via scripts/export_rag_public.py (aucun endpoint interne, IP, compte démo ou chemin d'infrastructure). WIP : agent en test sur groupe restreint, pas encore public sur le forum.
63 lines
1.9 KiB
Ruby
63 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DepiedencapAiCitations
|
|
# Purge MP du compte partagé **demo uniquement**.
|
|
# Jamais un autre membre : username figé, refus staff, MP sans autre humain.
|
|
class DemoPurge
|
|
# Figé volontairement — pas de SiteSetting (un admin pourrait viser un autre compte).
|
|
USERNAME = "demo"
|
|
|
|
def self.demo_user?(user)
|
|
return false if user.blank?
|
|
return false if user.id.to_i <= 0
|
|
return false unless user.username_lower == USERNAME
|
|
return false if user.staff? || user.admin? || user.moderator?
|
|
|
|
true
|
|
end
|
|
|
|
def self.wipe!(user)
|
|
return 0 unless SiteSetting.depiedencap_ai_citations_enabled
|
|
return 0 unless demo_user?(user)
|
|
|
|
locked = User.find_by(username_lower: USERNAME)
|
|
return 0 if locked.blank? || locked.id != user.id
|
|
return 0 if locked.staff? || locked.admin? || locked.moderator?
|
|
|
|
topic_ids =
|
|
Topic
|
|
.joins(:topic_allowed_users)
|
|
.where(archetype: Archetype.private_message)
|
|
.where(topic_allowed_users: { user_id: locked.id })
|
|
.distinct
|
|
.pluck(:id)
|
|
|
|
deleted = 0
|
|
topic_ids.each do |tid|
|
|
topic = Topic.with_deleted.find_by(id: tid)
|
|
next if topic.nil? || topic.deleted_at.present?
|
|
next unless topic.private_message?
|
|
|
|
human_ids =
|
|
TopicAllowedUser.where(topic_id: tid).where("user_id > 0").pluck(:user_id).uniq
|
|
next unless human_ids == [locked.id]
|
|
|
|
first = topic.first_post || topic.posts.with_deleted.order(:post_number).first
|
|
next if first.nil?
|
|
|
|
PostDestroyer.new(
|
|
Discourse.system_user,
|
|
first,
|
|
context: "depiedencap demo purge",
|
|
force_destroy: true,
|
|
).destroy
|
|
deleted += 1
|
|
rescue StandardError => e
|
|
Rails.logger.warn(
|
|
"DepiedencapAiCitations::DemoPurge topic=#{tid}: #{e.class} #{e.message}",
|
|
)
|
|
end
|
|
deleted
|
|
end
|
|
end
|
|
end
|