huskies: merge 836

This commit is contained in:
dave
2026-04-29 11:45:33 +00:00
parent edeed3d1b6
commit 186cb38eeb
9 changed files with 1069 additions and 993 deletions
+56
View File
@@ -0,0 +1,56 @@
//! Read/write helpers for the five LWW-map CRDT collections:
//! `tokens`, `merge_jobs`, `active_agents`, `test_jobs`, and `agent_throttle`.
//!
//! Each collection is backed by a `ListCrdt` with a primary-key field.
//! A secondary index in [`super::state::CrdtState`] provides O(1) lookup by
//! key. The write functions follow the same insert-or-update pattern used by
//! [`super::presence`] for the `nodes` collection.
#![allow(dead_code)]
use bft_json_crdt::json_crdt::CrdtNode;
use bft_json_crdt::list_crdt::ListCrdt;
use bft_json_crdt::op::OpId;
mod active_agents;
mod agent_throttle;
mod gateway_projects;
mod merge_jobs;
mod test_jobs;
mod tokens;
#[cfg(test)]
mod tests;
pub use active_agents::{
delete_active_agent, read_active_agent, read_all_active_agents, write_active_agent,
};
pub use agent_throttle::{
delete_agent_throttle, read_agent_throttle, read_all_agent_throttles, write_agent_throttle,
};
pub use gateway_projects::{
delete_gateway_project, read_all_gateway_projects, read_gateway_project, write_gateway_project,
};
pub use merge_jobs::{delete_merge_job, read_all_merge_jobs, read_merge_job, write_merge_job};
pub use test_jobs::{delete_test_job, read_all_test_jobs, read_test_job, write_test_job};
pub use tokens::{delete_token_usage, read_all_token_usage, read_token_usage, write_token_usage};
/// Return the `OpId` of the entry at iter-position `idx`, consistent with
/// `ListCrdt::iter()` and the `[]` index operator.
///
/// The built-in `id_at` counts non-deleted entries including the root sentinel
/// (which has `content = None`), causing an off-by-one mismatch with
/// `iter().enumerate()`. This helper requires `content.is_some()` so that the
/// secondary-index position maps correctly to an OpId.
pub(super) fn list_id_at<T: CrdtNode>(list: &ListCrdt<T>, idx: usize) -> Option<OpId> {
let mut i = 0;
for op in &list.ops {
if !op.is_deleted && op.content.is_some() {
if i == idx {
return Some(op.id);
}
i += 1;
}
}
None
}