Compare commits

...

3 Commits

Author SHA1 Message Date
nym21 ec960bfefa release: v0.0.80 2025-07-13 21:20:40 +02:00
nym21 79f689dde1 mcp: remove claude results examples due to dead links 2025-07-13 21:20:02 +02:00
nym21 3b3654df56 vec: add local and shared stored_len to raw variant 2025-07-13 19:30:50 +02:00
6 changed files with 67 additions and 63 deletions
Generated
+15 -15
View File
@@ -477,7 +477,7 @@ dependencies = [
[[package]]
name = "brk"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"brk_bundler",
"brk_cli",
@@ -497,7 +497,7 @@ dependencies = [
[[package]]
name = "brk_bundler"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"brk_rolldown",
"log",
@@ -508,7 +508,7 @@ dependencies = [
[[package]]
name = "brk_cli"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"bitcoincore-rpc",
"brk_computer",
@@ -531,7 +531,7 @@ dependencies = [
[[package]]
name = "brk_computer"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"bincode",
"bitcoin",
@@ -557,7 +557,7 @@ dependencies = [
[[package]]
name = "brk_core"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"bincode",
"bitcoin",
@@ -578,7 +578,7 @@ dependencies = [
[[package]]
name = "brk_exit"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"brk_logger",
"ctrlc",
@@ -587,7 +587,7 @@ dependencies = [
[[package]]
name = "brk_fetcher"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"brk_core",
"brk_logger",
@@ -599,7 +599,7 @@ dependencies = [
[[package]]
name = "brk_indexer"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"bitcoin",
"bitcoincore-rpc",
@@ -617,7 +617,7 @@ dependencies = [
[[package]]
name = "brk_interface"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"brk_computer",
"brk_core",
@@ -635,7 +635,7 @@ dependencies = [
[[package]]
name = "brk_logger"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"color-eyre",
"env_logger",
@@ -645,7 +645,7 @@ dependencies = [
[[package]]
name = "brk_mcp"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"axum",
"brk_interface",
@@ -655,7 +655,7 @@ dependencies = [
[[package]]
name = "brk_parser"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"bitcoin",
"bitcoincore-rpc",
@@ -1024,7 +1024,7 @@ dependencies = [
[[package]]
name = "brk_server"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"axum",
"bitcoincore-rpc",
@@ -1054,7 +1054,7 @@ dependencies = [
[[package]]
name = "brk_store"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"brk_core",
"byteview",
@@ -1076,7 +1076,7 @@ dependencies = [
[[package]]
name = "brk_vec"
version = "0.0.79"
version = "0.0.80"
dependencies = [
"arc-swap",
"brk_core",
+15 -15
View File
@@ -4,7 +4,7 @@ members = ["crates/*"]
package.description = "The Bitcoin Research Kit is a suite of tools designed to extract, compute and display data stored on a Bitcoin Core node"
package.license = "MIT"
package.edition = "2024"
package.version = "0.0.79"
package.version = "0.0.80"
package.homepage = "https://bitcoinresearchkit.org"
package.repository = "https://github.com/bitcoinresearchkit/brk"
@@ -26,22 +26,22 @@ axum = "0.8.4"
bincode = { version = "2.0.1", features = ["serde"] }
bitcoin = { version = "0.32.6", features = ["serde"] }
bitcoincore-rpc = "0.19.0"
brk_bundler = { version = "0.0.79", path = "crates/brk_bundler" }
brk_cli = { version = "0.0.79", path = "crates/brk_cli" }
brk_computer = { version = "0.0.79", path = "crates/brk_computer" }
brk_core = { version = "0.0.79", path = "crates/brk_core" }
brk_exit = { version = "0.0.79", path = "crates/brk_exit" }
brk_fetcher = { version = "0.0.79", path = "crates/brk_fetcher" }
brk_indexer = { version = "0.0.79", path = "crates/brk_indexer" }
brk_interface = { version = "0.0.79", path = "crates/brk_interface" }
brk_logger = { version = "0.0.79", path = "crates/brk_logger" }
brk_mcp = { version = "0.0.79", path = "crates/brk_mcp" }
brk_parser = { version = "0.0.79", path = "crates/brk_parser" }
brk_bundler = { version = "0.0.80", path = "crates/brk_bundler" }
brk_cli = { version = "0.0.80", path = "crates/brk_cli" }
brk_computer = { version = "0.0.80", path = "crates/brk_computer" }
brk_core = { version = "0.0.80", path = "crates/brk_core" }
brk_exit = { version = "0.0.80", path = "crates/brk_exit" }
brk_fetcher = { version = "0.0.80", path = "crates/brk_fetcher" }
brk_indexer = { version = "0.0.80", path = "crates/brk_indexer" }
brk_interface = { version = "0.0.80", path = "crates/brk_interface" }
brk_logger = { version = "0.0.80", path = "crates/brk_logger" }
brk_mcp = { version = "0.0.80", path = "crates/brk_mcp" }
brk_parser = { version = "0.0.80", path = "crates/brk_parser" }
brk_rmcp = { version = "0.2.1", features = ["transport-streamable-http-server", "transport-worker"]}
# brk_rmcp = { path = "../rust-sdk/crates/rmcp", features = ["transport-streamable-http-server", "transport-worker"]}
brk_server = { version = "0.0.79", path = "crates/brk_server" }
brk_store = { version = "0.0.79", path = "crates/brk_store" }
brk_vec = { version = "0.0.79", path = "crates/brk_vec" }
brk_server = { version = "0.0.80", path = "crates/brk_server" }
brk_store = { version = "0.0.80", path = "crates/brk_store" }
brk_vec = { version = "0.0.80", path = "crates/brk_vec" }
byteview = "=0.6.1"
clap = { version = "4.5.41", features = ["string"] }
clap_derive = "4.5.41"
+1 -2
View File
@@ -46,8 +46,7 @@ The toolkit can be used in various ways to accommodate as many needs as possible
Just like the website, it's entirely free, with no authentication or rate-limiting.
- **[AI](https://github.com/bitcoinresearchkit/brk/blob/main/crates/brk_mcp/README.md#brk-mcp)** \
LLMs have to possibility to connect to BRK's backend through a [MCP](https://modelcontextprotocol.io/introduction). \
It will give them access to the same tools as the API, with no restrictions, and allow you to have your very own data analysts. \
One-shot output examples: [Document](https://claude.ai/public/artifacts/71194d29-f965-417c-ba09-fdf0e4ecb1d5) // [Dashboard](https://claude.ai/public/artifacts/beef143f-399a-4ed4-b8bf-c986b776de42) // [Dashboard 2](https://claude.ai/public/artifacts/5430ae49-bb3d-4fc1-ab24-f1e33deb40dc)
It will give them access to the same tools as the API, with no restrictions, and allow you to have your very own data analysts.
- **[CLI](https://crates.io/crates/brk_cli)** \
Node runners are strongly encouraged to try out and self-host their own instance using BRK's command line interface. \
The CLI has multiple cogs available for users to tweak to adapt to all situations with even the possibility for web developers to create their own custom website which could later on be added as an alternative front-end.
-8
View File
@@ -47,11 +47,3 @@ Verify that it has access to BRK's tools.
Optionally and highly recommended, giving it unsupervised access gives a more fluid experience and prevents possible issues and errors.
![Image of edit integration meny on Claude Desktop](https://github.com/bitcoinresearchkit/brk/blob/main/assets/claude-step4.png)
#### Results
Some examples of dashboard and documents generated by Claude using BRK's tools:
- [Document](https://claude.ai/public/artifacts/71194d29-f965-417c-ba09-fdf0e4ecb1d5)
- [Dashboard](https://claude.ai/public/artifacts/beef143f-399a-4ed4-b8bf-c986b776de42)
- [Dashboard2](https://claude.ai/public/artifacts/5430ae49-bb3d-4fc1-ab24-f1e33deb40dc)
+16 -16
View File
@@ -57,7 +57,7 @@ where
}
pub fn import(parent: &Path, name: &str, version: Version) -> Result<Self> {
let inner = RawVec::import(parent, name, version)?;
let mut inner = RawVec::import(parent, name, version)?;
let pages_meta = {
let path = inner
@@ -66,12 +66,19 @@ where
if inner.is_empty() {
let _ = fs::remove_file(&path);
}
Arc::new(ArcSwap::new(Arc::new(CompressedPagesMetadata::read(
&path,
)?)))
CompressedPagesMetadata::read(&path)?
};
Ok(Self { inner, pages_meta })
inner.set_stored_len(if let Some(last) = pages_meta.last() {
(pages_meta.len() - 1) * Self::PER_PAGE + last.values_len as usize
} else {
0
});
Ok(Self {
inner,
pages_meta: Arc::new(ArcSwap::new(Arc::new(pages_meta))),
})
}
fn decode_page(&self, page_index: usize, mmap: &Mmap) -> Result<Vec<T>> {
@@ -130,14 +137,6 @@ where
page_index * Self::PER_PAGE
}
fn stored_len__(pages_meta: &Guard<Arc<CompressedPagesMetadata>>) -> usize {
if let Some(last) = pages_meta.last() {
(pages_meta.len() - 1) * Self::PER_PAGE + last.values_len as usize
} else {
0
}
}
#[inline]
pub fn iter(&self) -> CompressedVecIterator<'_, I, T> {
self.into_iter()
@@ -186,7 +185,7 @@ where
#[inline]
fn stored_len(&self) -> usize {
Self::stored_len__(&self.pages_meta.load())
self.inner.stored_len()
}
#[inline]
@@ -486,14 +485,15 @@ where
fn into_iter(self) -> Self::IntoIter {
let pages_meta = self.pages_meta.load();
let stored_len = CompressedVec::<I, T>::stored_len__(&pages_meta);
let stored_len = self.stored_len();
CompressedVecIterator {
vec: self,
mmap: self.create_mmap().unwrap(),
decoded_page: None,
pages_meta,
stored_len,
index: 0,
stored_len,
}
}
}
+20 -7
View File
@@ -28,7 +28,8 @@ pub struct RawVec<I, T> {
parent: PathBuf,
name: &'static str,
pushed: Vec<T>,
stored_len: Arc<AtomicUsize>,
local_stored_len: Option<usize>,
shared_stored_len: Arc<AtomicUsize>,
phantom: PhantomData<I>,
}
@@ -94,11 +95,17 @@ where
name: Box::leak(Box::new(name.to_string())),
parent: parent.to_owned(),
pushed: vec![],
stored_len: Arc::new(AtomicUsize::new(stored_len)),
local_stored_len: Some(stored_len),
shared_stored_len: Arc::new(AtomicUsize::new(stored_len)),
phantom: PhantomData,
})
}
pub fn set_stored_len(&mut self, len: usize) {
self.local_stored_len.replace(len);
self.shared_stored_len.store(len, Ordering::Relaxed);
}
#[inline]
pub fn iter(&self) -> RawVecIterator<'_, I, T> {
self.into_iter()
@@ -151,7 +158,8 @@ where
#[inline]
fn stored_len(&self) -> usize {
self.stored_len.load(Ordering::SeqCst)
self.local_stored_len
.unwrap_or_else(|| self.shared_stored_len.load(Ordering::Relaxed))
}
#[inline]
@@ -195,7 +203,11 @@ where
let mut file = file_opt.unwrap_or(self.open_file()?);
self.file_write_all(&mut file, &bytes)?;
self.stored_len.fetch_add(pushed_len, Ordering::SeqCst);
if let Some(local_stored_len) = self.local_stored_len.as_mut() {
*local_stored_len += pushed_len;
}
self.shared_stored_len
.fetch_add(pushed_len, Ordering::Relaxed);
Ok(())
}
@@ -212,7 +224,7 @@ where
return Ok(());
}
self.stored_len.store(index, Ordering::SeqCst);
self.set_stored_len(index);
let len = index * Self::SIZE_OF_T + HEADER_OFFSET;
@@ -223,7 +235,7 @@ where
}
fn reset(&mut self) -> Result<()> {
self.stored_len.store(0, Ordering::SeqCst);
self.set_stored_len(0);
self.reset_()
}
}
@@ -267,7 +279,8 @@ impl<I, T> Clone for RawVec<I, T> {
name: self.name,
pushed: vec![],
phantom: PhantomData,
stored_len: self.stored_len.clone(),
local_stored_len: None,
shared_stored_len: self.shared_stored_len.clone(),
}
}
}