Busabase
Busabase는 AI 에이전트를 위한 오픈소스(MIT) 데이터베이스 및 작업 공간입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
“We need to abolish names and places, and replace them with hashes.”
— Joe Armstrong, The Mess We’re In
TribleSpace is an embedded knowledge graph built from immutable facts,
content-addressed blobs, and grow-only collections. It combines the
queryability of a database with the distribution semantics of a join
semilattice, in one append-only file or an S3-compatible endpoint.README 전문 보기 ↗
“We need to abolish names and places, and replace them with hashes.” — Joe Armstrong, The Mess We’re In
TribleSpace is an embedded knowledge graph built from immutable facts, content-addressed blobs, and grow-only collections. It combines the queryability of a database with the distribution semantics of a join semilattice, in one append-only file or an S3-compatible endpoint.
TribleSpace is designed from first principles around simple algebra rather than mutable database machinery. Independent writers publish signed collection members; replicas combine evidence by set union; reproducible indexes and rollups are ordinary merge and derivation equations. No mutable branch head, compare-and-swap retry loop, or query planner is required.
Add the crate to a project:
cargo add triblespace ed25519-dalek rand
The example below publishes one self-contained Fragment, freezes one coherent
store snapshot, and queries an admitted collection cover. entity! derives the
author and book identifiers from their contents and carries the text
blobs with the facts that reference them.
use ed25519_dalek::SigningKey;
use rand::rngs::OsRng;
use triblespace::core::collection::{AdmissionPolicy, CollectionPolicy};
use triblespace::prelude::*;
mod literature {
use triblespace::prelude::*;
use triblespace::prelude::blobencodings::UTF8String;
use triblespace::prelude::inlineencodings::{GenId, Handle};
attributes! {
/// The title of a work.
"A74AA63539354CDA47F387A4C3A8D54C" as pub title: Handle<UTF8String>;
/// A quote from a work.
"6A03BAF6CFB822F04DA164ADAAEB53F6" as pub quote: Handle<UTF8String>;
/// The author of a work.
"8F180883F9FD5F787E9E0AF0DF5866B9" as pub author: GenId;
/// The first name of an author.
"0DBB530B37B966D137C50B943700EDB2" as pub firstname: Handle<UTF8String>;
/// The last name of an author.
"6BAA463FD4EAF45F6A103DB9433E4545" as pub lastname: Handle<UTF8String>;
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let key = SigningKey::generate(&mut OsRng);
let mut storage = MemoryRepo::default();
let root = key.verifying_key();
let library = storage.collection(
"library",
CollectionPolicy::new(
AdmissionPolicy::direct(root),
AdmissionPolicy::direct(root),
),
)?;
let author = entity! {
literature::firstname: "Frank",
literature::lastname: "Herbert",
};
let author_id = author.root().expect("intrinsic author id");
let book = entity! {
literature::title: "Dune",
literature::author: &author_id,
literature::quote: "I must not fear. Fear is the mind-killer.",
};
let mut import = author;
import += book;
storage.commit(library, &key, import)?;
let snapshot = storage.snapshot()?;
let facts: TribleSet = library.read(&snapshot)?;
let title = "Dune";
for (first, last, quote) in find!(
(first, last, quote),
pattern!(&facts, [
{ _?author @
literature::firstname: ?first,
literature::lastname: ?last
},
{ _?book @
literature::title: title,
literature::author: _?author,
literature::quote: ?quote
}
])
) {
let first: View<str> = snapshot.get(first)?;
let last: View<str> = snapshot.get(last)?;
let quote: View<str> = snapshot.get(quote)?;
println!(
"'{}'\n - from {title} by {} {}.",
quote.as_ref(),
first.as_ref(),
last.as_ref()
);
}
Ok(())
}
The descriptor's independent READ and WRITE policies participate in collection
identity. Here both are one-root policies. Whether a recipient may extend its
authority is described by the independent delegation-action facts in the
capability definitions signed into its proof prefix, not by a second
collection-policy threshold. Each child may invoke or delegate only actions
its parent permits delegating; the definition handles may differ.
Other strictly verified signers become visible only when
library.admitted(&snapshot) observes sufficient root support for exact
ACTION_WRITE on this descriptor handle through resident proof and definition
evidence. Collection WRITE authority has no wall-clock expiry.
Identical retries deduplicate by intrinsic record identity, distinct commits
coexist, and library.read(&snapshot) reads the union of every admitted
author's commits through the same snapshot. Call
the store's flush operation when an application needs an explicit durability
barrier.
The Getting Started
chapter breaks the example down, while Collection
Workflows
explains descriptors, exact covers, COMMIT/MERGE/DERIVE, and lazy
derived representations.
The Tribles Book is the best place to go deeper:
To build the book locally: cargo install mdbook && ./scripts/build_book.sh
For development setup, see Contributing.
Questions or ideas? Join the Discord.
Licensed under either of
at your option.