Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 28 additions & 28 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -185,18 +185,18 @@ members = [
# room is still its default under either verb. This is what continuum's
# room/join needs (task #65, Joel: a persona is first-class and can subscribe to
# many rooms). Also fixes `RoomJoinedBody.is_default`, previously hardcoded true.
airc-core = { git = "https://github.com/CambrianTech/airc", rev = "e910008" }
airc-protocol = { git = "https://github.com/CambrianTech/airc", rev = "e910008" }
airc-ipc = { git = "https://github.com/CambrianTech/airc", rev = "e910008" }
airc-lib = { git = "https://github.com/CambrianTech/airc", rev = "e910008" }
airc-wire = { git = "https://github.com/CambrianTech/airc", rev = "e910008" }
airc-core = { git = "https://github.com/CambrianTech/airc", rev = "574ce235" }
airc-protocol = { git = "https://github.com/CambrianTech/airc", rev = "574ce235" }
airc-ipc = { git = "https://github.com/CambrianTech/airc", rev = "574ce235" }
airc-lib = { git = "https://github.com/CambrianTech/airc", rev = "574ce235" }
airc-wire = { git = "https://github.com/CambrianTech/airc", rev = "574ce235" }
# airc-work: the work-board domain (cards/lanes/PRs). `Airc::work_board`
# returns a `WorkBoardProjection` whose types (`WorkCard`, `LaneRecord`,
# `CardState`, …) the positron kanban projector maps → `KanbanViewState`
# at the seam. Only continuum-core (the projector) depends on it; the
# neutral `continuum-positron` contract crate MIRRORS these enums and
# must NOT depend on airc-work.
airc-work = { git = "https://github.com/CambrianTech/airc", rev = "e910008" }
airc-work = { git = "https://github.com/CambrianTech/airc", rev = "574ce235" }

# Candle ML framework — patched via [patch.crates-io] below.
# Fixes: Metal buffer pool leak (#2271), RoPE NEOX convention (#3410)
Expand Down
16 changes: 15 additions & 1 deletion core/continuum-core/src/modules/nav.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,21 @@ async fn advance_caller_cursor(caller: Uuid, room: Uuid, lamport: u64) -> u64 {
let airc = runtime.airc();
// Resolve the event AT this lamport so airc gets the real source event (room +
// kind, and the `SubscriptionAdvanced` emit). No event → nothing to mark.
let events = match airc.page_recent_in(Some(airc_core::RoomId::from_uuid(room)), 256).await {
// airc 574ce235: page_recent_in takes a resolved &Room; the resolver refuses
// rooms outside this scope's subscription set, which is the right refusal here
// too — advancing a read cursor in a room the caller isn't part of would mint
// state about a conversation they never joined.
let room_handle = match airc
.room_by_name_or_channel(&room.to_string(), "advance read cursor in")
.await
{
Ok(r) => r,
Err(err) => {
tracing::warn!(error = %err, caller = %caller, room = %room, "nav: cursor room resolve failed");
return 0;
}
};
let events = match airc.page_recent_in(&room_handle, 256).await {
Ok(e) => e,
Err(err) => {
tracing::warn!(error = %err, caller = %caller, room = %room, "nav: cursor page failed");
Expand Down
15 changes: 13 additions & 2 deletions core/continuum-core/src/persona/airc_citizen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,19 @@ pub trait AircCitizen:
pub(crate) async fn subscribe_every_room(
airc: &airc_lib::Airc,
) -> Result<FilteredEventStream, AircError> {
airc.subscribe_subscribed_filtered(airc_lib::EventFilter::default())
.await
// #445: liveness beacons were 84% of a persona subscription's inbound
// (measured 2026-08-15: 149 of 177 events in the window, 100% discarded
// post-decode as no_continuum_body_hint). Heartbeats already stamp their
// class header at publish, so exclude them at the ROUTER — they never
// cross the socket, never cost a decode. Exclusion, never an allowlist:
// unstamped events keep flowing, so nothing a publisher hasn't classified
// yet can be silently dropped. The same filter still applies client-side
// on the in-process (non-daemon) fallback, which has no router.
let mut filter = airc_lib::EventFilter::default();
filter.headers_filter = airc_core::HeaderFilter::Not(Box::new(airc_core::HeaderFilter::Has {
key: airc_lib::HEADER_HEARTBEAT_KIND.to_string(),
}));
airc.subscribe_subscribed_filtered(filter).await
}

/// Where a reply for `room_id` should be published — the ONE place
Expand Down
Loading