pub struct PersonaPostsConfig {Show 16 fields
pub persona: String,
pub enabled: bool,
pub post_interval_seconds: u64,
pub interval_jitter_pct: u32,
pub active_hours: Option<ActiveHoursConfig>,
pub candidates_per_draft: usize,
pub post_history_store: String,
pub post_history_path: Option<String>,
pub post_history_lookback_days: i64,
pub topic_brief: Option<String>,
pub engagement_refresh_seconds: u64,
pub engagement_top_n: usize,
pub engagement_max_age_days: i64,
pub engagement_min_age_hours: i64,
pub writer_provider: Option<AgentProviderConfig>,
pub image_source: ImageSource,
}Expand description
Per-persona proactive-posting configuration.
When present, the daemon registers a PersonaPostScheduler that
fires DaemonCommand::PersonaPost on the configured cadence
(gated by active_hours). The handler runs the topic generator,
drafts candidate threads via the existing review pipeline, sends
them to Telegram for review, posts the chosen draft.
Configured under [[daemon.persona_posts]] blocks.
Fields§
§persona: StringPersona registry name (e.g. "heartbit-ghost:x").
enabled: boolWhether this poster is enabled.
post_interval_seconds: u64Posting interval, in seconds. Default 14400 (4 hours). 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 post_interval_seconds tick, as a
percentage (0–50). Default 25 = ±25%, so a base 4h interval
fires somewhere in [3h, 5h]. Prevents the daemon from posting
on a perfectly predictable cadence — that’s a textbook bot
signature on X. 0 disables jitter (use only for tests).
active_hours: Option<ActiveHoursConfig>Optional "HH:MM-HH:MM" window during which posts are allowed.
Outside this window, the scheduler tick is a no-op. When absent,
posting is allowed 24/7.
candidates_per_draft: usizeNumber of candidate threads to draft per tick (1..=10). Default 3.
post_history_store: StringBackend for the post history store: "in_memory" or "jsonl".
post_history_path: Option<String>Path to the JSONL store file (only used when
post_history_store == "jsonl"). Tilde expansion happens at
store-construction time.
post_history_lookback_days: i64How far back to check for topic duplicates. Default 30 days.
topic_brief: Option<String>Optional fallback brief used when the persona declares no topic-context provider, or appended to the provider’s output.
engagement_refresh_seconds: u64Engagement-collector tick interval, in seconds. Default 21600 = 6h.
Each tick batch-refreshes every eligible Posted tweet’s metrics
from the X API and writes a fresh [EngagementSnapshot].
engagement_top_n: usizeHow many top-engaged posts to inject as writer few-shot exemplars.
Default 5. Set to 0 to disable injection — the writer then runs
without exemplars, matching pre-P2.0 behavior.
engagement_max_age_days: i64Ignore tweets older than this many days when refreshing engagement. Default 30 — older tweets rarely accrue new engagement.
engagement_min_age_hours: i64Ignore tweets younger than this many hours when refreshing engagement. Default 24 — gives the algorithm time to fan out.
writer_provider: Option<AgentProviderConfig>Override LLM provider for the writer + style-critic stages of the
proactive-post pipeline. When set, these two “engagement voice”
agents use this provider; the researcher and fact-check stages
keep using the global [provider]. Use this to point the
engagement voice at a different model (e.g. Grok via OpenRouter)
without affecting verification or research quality.
Configured under [daemon.persona_posts.writer_provider]. When
absent, the writer and critic share the global provider.
image_source: ImageSourceHow to produce the optional head-tweet image. Default online
(Openverse CC0/public-domain search). ai uses the image
generator; none disables images.
Trait Implementations§
Source§impl Clone for PersonaPostsConfig
impl Clone for PersonaPostsConfig
Source§fn clone(&self) -> PersonaPostsConfig
fn clone(&self) -> PersonaPostsConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more