pub struct PersonaQuotesConfig {
pub persona: String,
pub enabled: bool,
pub poll_interval_seconds: u64,
pub interval_jitter_pct: u32,
pub active_hours: Option<ActiveHoursConfig>,
pub source_user_ids: Vec<String>,
pub candidates_per_draft: usize,
pub seen_store: String,
pub seen_store_path: Option<String>,
pub max_age_hours: i64,
pub max_candidates_per_tick: usize,
pub writer_provider: Option<AgentProviderConfig>,
}Expand description
Per-persona quote-tweet configuration.
When present, the daemon registers a PersonaQuoteScheduler that
fires DaemonCommand::PersonaQuote on the configured cadence. The
handler polls each source_user_ids entry via X v2
/2/users/{id}/tweets, filters by max_age_hours + not-yet-quoted,
drafts an opinionated-but-charitable quote-tweet via the
quote_writer agent, sends to Telegram for review, posts the
chosen draft via POST /2/tweets with quote_tweet_id.
Configured under [[daemon.persona_quotes]] blocks.
Fields§
§persona: StringPersona registry name (e.g. "heartbit-ghost:x").
enabled: boolWhether this quoter is enabled.
poll_interval_seconds: u64Polling interval, in seconds. Default 5400 (90 min — medium per brainstorm). Recommended ≥60. NOTE: this is NOT enforced at config load — the value is consumed as-is by the (cross-crate) scheduler loop.
interval_jitter_pct: u32Randomness applied to each poll_interval_seconds tick, as a
percentage (0–50). Default 25 = ±25%. Same anti-pattern
rationale as interval_jitter_pct on persona_posts.
active_hours: Option<ActiveHoursConfig>Optional "HH:MM-HH:MM" window during which quote-polls run.
Outside this window, the scheduler tick is a no-op.
source_user_ids: Vec<String>X user IDs (numeric strings) of accounts to poll. Curated list. Required — must contain at least one entry.
candidates_per_draft: usizeNumber of candidate quote-tweets to draft per chosen source tweet (1..=3). Default 3. Bounded tighter than the proactive post pipeline (1..=10) because quote-tweets are higher-stakes (you’re commenting on someone else’s content) and 3 candidates hits the cost/quality knee.
seen_store: StringBackend for the “already quoted” dedup store: "in_memory" or
"jsonl". Default "in_memory".
seen_store_path: Option<String>Path to the JSONL store file (only used when
seen_store == "jsonl"). Tilde expansion at construction time.
max_age_hours: i64Maximum age in hours of a source tweet for it to be quote-able. Default 12 — beyond that the discourse has moved on. Set to 0 to disable the age filter.
max_candidates_per_tick: usizeMaximum number of quote-tweets to draft+review per scheduler tick. Default 1 — pick the best candidate from sources and stop. Set higher to draft multiple quote-tweets per tick (one Telegram review per draft).
writer_provider: Option<AgentProviderConfig>Optional override LLM provider for the quote_writer + critic.
None falls back to the global [provider]. Same shape as
persona_posts.writer_provider.
Trait Implementations§
Source§impl Clone for PersonaQuotesConfig
impl Clone for PersonaQuotesConfig
Source§fn clone(&self) -> PersonaQuotesConfig
fn clone(&self) -> PersonaQuotesConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more