lean_ctx/core/knowledge/hooks.rs
1// SPDX-License-Identifier: Apache-2.0
2//! Knowledge bookkeeping the Hive connector keeps: how often its facts
3//! reached an agent (M1, M5) and the session learnings it queues for review
4//! at a session's end. The connector registers [`KnowledgeHooks`] at
5//! start-up ([`register_knowledge_hooks`]); without them (library use,
6//! tests) nothing is counted or queued. Neither hook decides what an agent
7//! is shown.
8
9use std::sync::OnceLock;
10
11use chrono::{DateTime, Utc};
12
13/// `(project_root, session (id, started_at), hive_facts, asked)`.
14pub type DeliveryHook = fn(&str, Option<(&str, DateTime<Utc>)>, usize, bool);
15/// `(project_root, session_id)`.
16pub type SessionEndHook = fn(&str, &str);
17
18/// The registered knowledge bookkeeping.
19#[derive(Clone, Copy)]
20pub struct KnowledgeHooks {
21 pub record_delivery: DeliveryHook,
22 pub session_ended: SessionEndHook,
23}
24
25static HOOKS: OnceLock<KnowledgeHooks> = OnceLock::new();
26
27/// Register the knowledge hooks. The first registration wins.
28pub fn register_knowledge_hooks(hooks: KnowledgeHooks) {
29 let _ = HOOKS.set(hooks);
30}
31
32/// A delivery to an agent in `project_root` handed it `hive_facts` facts
33/// pulled from a Hive vault. `asked`: the agent asked for knowledge (a
34/// recall).
35pub fn record_delivery(
36 project_root: &str,
37 session: Option<(&str, DateTime<Utc>)>,
38 hive_facts: usize,
39 asked: bool,
40) {
41 if let Some(hooks) = HOOKS.get() {
42 (hooks.record_delivery)(project_root, session, hive_facts, asked);
43 }
44}
45
46/// A host session in `project_root` ended. Enqueues only, never network,
47/// never an error for the caller.
48pub fn session_ended(project_root: &str, session_id: &str) {
49 if let Some(hooks) = HOOKS.get() {
50 (hooks.session_ended)(project_root, session_id);
51 }
52}