Skip to content

Commit 7f8024c

Browse files
decebalclaude
andcommitted
release: v0.13.0 — minor release with WebSocket Mint migration, CI fixes, and dependency updates
- Migrate WebSocket client from WebSockex to Mint.WebSocket (IPv6 support for Fly.io) - Service JWT auth for Core WebSocket endpoint - Resolve all Clippy warnings (collapsible_if, for_kv_map, needless_borrows) - Fix incomplete sync transport test assertion - Remove unused websockex dep from mix.lock - Bump all service and SDK versions to 0.13.0 - Update Cargo.lock with workspace dependency changes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent b6fd686 commit 7f8024c

File tree

39 files changed

+382
-272
lines changed

39 files changed

+382
-272
lines changed

Cargo.lock

Lines changed: 167 additions & 64 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[workspace]
22
resolver = "3"
3-
members = ["apps/core", "apps/registry", "tooling/performance", "sdks/rust"]
3+
members = ["apps/core", "apps/chronon", "apps/registry", "tooling/performance", "sdks/rust"]
44

55
[workspace.dependencies]
66

@@ -29,12 +29,14 @@ bytes = "1.11.1"
2929

3030
# Common utilities
3131
chrono = { version = "0.4", features = ["serde"] }
32+
clap = { version = "4.5", features = ["derive"] }
3233
crc32fast = "1.4"
3334

3435
# Dev / Test
3536
criterion = "0.8"
3637
crossbeam = "0.8"
3738
crossbeam-queue = "0.3"
39+
crossterm = "0.28"
3840
ctrlc = "3.5"
3941

4042
# Storage & Concurrency
@@ -55,6 +57,7 @@ parking_lot = "0.12"
5557
parquet = { version = "57.3", features = ["arrow", "async"] }
5658
prometheus = "0.14"
5759
rand = "0.10"
60+
ratatui = "0.29"
5861
rocksdb = { version = "0.24" }
5962

6063
# Serialization
@@ -64,6 +67,7 @@ sha2 = "0.10"
6467
simd-json = "0.17"
6568
sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "postgres", "json", "chrono", "uuid"] }
6669
tantivy = { version = "0.25" }
70+
tabled = "0.17"
6771
tempfile = "3.23"
6872
thiserror = "2.0"
6973
time = "0.3.47"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: "AllSource Event Store - Monorepo"
33
status: CURRENT
44
last_updated: 2026-03-01
5-
version: "0.12.0"
5+
version: "0.13.0"
66
---
77

88
<div align="center">

apps/control-plane/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ var openAPIYAML []byte
3030
// Control plane configuration constants.
3131
const (
3232
// Version is the current version of the control plane.
33-
Version = "0.12.0"
33+
Version = "0.13.0"
3434
// DefaultPort is the default port the control plane listens on.
3535
DefaultPort = "3901"
3636
// CoreServiceURL is the URL of the core event store service.

apps/control-plane/tracing.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919

2020
const (
2121
serviceName = "allsource-control-plane"
22-
serviceVersion = "0.12.0"
22+
serviceVersion = "0.13.0"
2323
)
2424

2525
// TracingConfig holds OpenTelemetry configuration

apps/core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "allsource-core"
3-
version = "0.12.0"
3+
version = "0.13.0"
44
edition = "2024"
55
rust-version = "1.92"
66
authors = ["AllSource Team"]

apps/core/src/embedded/core.rs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ impl EmbeddedCore {
489489
Some(resolver) => {
490490
let all_vv = resolver.all_version_vectors();
491491
let mut merged = crate::infrastructure::cluster::crdt::VersionVector::new();
492-
for (_region, vv) in &all_vv {
492+
for vv in all_vv.values() {
493493
merged.merge(vv);
494494
}
495495
merged.entries().clone()
@@ -502,17 +502,16 @@ impl EmbeddedCore {
502502
///
503503
/// Returns `None` if sync is not configured (no `node_id`).
504504
pub fn region_id(&self) -> Option<String> {
505-
self.hlc.as_ref().map(|hlc| format!("node-{}", hlc.node_id()))
505+
self.hlc
506+
.as_ref()
507+
.map(|hlc| format!("node-{}", hlc.node_id()))
506508
}
507509

508510
/// Receive events from a remote sync push.
509511
///
510512
/// Applies CRDT conflict resolution to each event and ingests
511513
/// accepted events. Returns `(accepted, skipped)` counts.
512-
pub async fn receive_sync_push(
513-
&self,
514-
events: Vec<ReplicatedEvent>,
515-
) -> Result<(usize, usize)> {
514+
pub async fn receive_sync_push(&self, events: Vec<ReplicatedEvent>) -> Result<(usize, usize)> {
516515
let (Some(_hlc), Some(resolver)) = (&self.hlc, &self.resolver) else {
517516
return Err(crate::error::AllSourceError::InvalidInput(
518517
"sync requires node_id to be configured".to_string(),
@@ -561,13 +560,8 @@ impl EmbeddedCore {
561560
.unwrap_or(serde_json::json!({}));
562561
let metadata = event_data.get("metadata").cloned();
563562

564-
let domain_event = Event::from_strings(
565-
event_type,
566-
entity_id,
567-
tenant_id,
568-
payload,
569-
metadata,
570-
)?;
563+
let domain_event =
564+
Event::from_strings(event_type, entity_id, tenant_id, payload, metadata)?;
571565
store.ingest(domain_event)?;
572566
}
573567
Ok::<(), crate::error::AllSourceError>(())
@@ -587,7 +581,10 @@ impl EmbeddedCore {
587581
/// newer than the threshold are returned).
588582
pub async fn events_for_sync(
589583
&self,
590-
since_vv: &std::collections::BTreeMap<String, crate::infrastructure::cluster::hlc::HlcTimestamp>,
584+
since_vv: &std::collections::BTreeMap<
585+
String,
586+
crate::infrastructure::cluster::hlc::HlcTimestamp,
587+
>,
591588
) -> Result<Vec<ReplicatedEvent>> {
592589
let Some(hlc) = &self.hlc else {
593590
return Err(crate::error::AllSourceError::InvalidInput(
@@ -596,11 +593,9 @@ impl EmbeddedCore {
596593
};
597594

598595
let self_region = format!("node-{}", hlc.node_id());
599-
let since = since_vv
600-
.get(&self_region)
601-
.map(|ts| {
602-
chrono::DateTime::from_timestamp_millis(ts.physical_ms as i64).unwrap_or_default()
603-
});
596+
let since = since_vv.get(&self_region).map(|ts| {
597+
chrono::DateTime::from_timestamp_millis(ts.physical_ms as i64).unwrap_or_default()
598+
});
604599

605600
let store = Arc::clone(&self.store);
606601
let all_events = tokio::task::spawn_blocking(move || {

apps/core/src/embedded/mcp_events.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@
2828
//! # }
2929
//! ```
3030
31-
use crate::embedded::{EmbeddedCore, IngestEvent};
32-
use crate::error::Result;
31+
use crate::{
32+
embedded::{EmbeddedCore, IngestEvent},
33+
error::Result,
34+
};
3335
use serde_json::Value;
3436
use std::future::Future;
3537

@@ -91,12 +93,7 @@ impl<'a> McpToolTracker<'a> {
9193
///
9294
/// On success, emits `mcp.tool.result` with `duration_ms`.
9395
/// On error, emits `mcp.tool.error` with the error message and `duration_ms`.
94-
pub async fn track<F, Fut>(
95-
&self,
96-
workflow_id: &str,
97-
tool_name: &str,
98-
f: F,
99-
) -> Result<Value>
96+
pub async fn track<F, Fut>(&self, workflow_id: &str, tool_name: &str, f: F) -> Result<Value>
10097
where
10198
F: FnOnce() -> Fut,
10299
Fut: Future<Output = Result<Value>>,

apps/core/src/embedded/sync_transport.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,7 @@ impl SyncClient {
4646
/// Perform a full bidirectional sync: pull then push.
4747
///
4848
/// Returns aggregate statistics for the sync operation.
49-
pub async fn sync(
50-
&self,
51-
core: &super::core::EmbeddedCore,
52-
) -> Result<SyncStats> {
49+
pub async fn sync(&self, core: &super::core::EmbeddedCore) -> Result<SyncStats> {
5350
let mut stats = SyncStats::default();
5451

5552
// Phase 1: Pull — get events we haven't seen from the server
@@ -66,10 +63,7 @@ impl SyncClient {
6663
}
6764

6865
/// Pull events from the remote server into the local core.
69-
async fn pull(
70-
&self,
71-
core: &super::core::EmbeddedCore,
72-
) -> Result<SyncStats> {
66+
async fn pull(&self, core: &super::core::EmbeddedCore) -> Result<SyncStats> {
7367
let vv = core.version_vector();
7468
let request = SyncPullRequest {
7569
node_id: self.node_id.clone(),
@@ -105,10 +99,7 @@ impl SyncClient {
10599
}
106100

107101
/// Push local events to the remote server.
108-
async fn push(
109-
&self,
110-
core: &super::core::EmbeddedCore,
111-
) -> Result<SyncStats> {
102+
async fn push(&self, core: &super::core::EmbeddedCore) -> Result<SyncStats> {
112103
// Get the server's version vector first (via a zero-event pull)
113104
let server_vv = self.fetch_server_version_vector().await?;
114105

apps/core/src/embedded/sync_types.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
//! Used by [`SyncClient`](super::sync_transport::SyncClient) and the
44
//! server-side `/api/v1/sync/pull` and `/api/v1/sync/push` endpoints.
55
6-
use crate::infrastructure::cluster::{
7-
crdt::ReplicatedEvent,
8-
hlc::HlcTimestamp,
9-
};
6+
use crate::infrastructure::cluster::{crdt::ReplicatedEvent, hlc::HlcTimestamp};
107
use serde::{Deserialize, Serialize};
118
use std::collections::BTreeMap;
129

0 commit comments

Comments
 (0)