OpenPay (1 crate, 3751 LOC, 83 tests)
op-crypto-extra Extended crypto rails. Stablecoin catalog (USDC, USDT,
PYUSD, DAI, RLUSD, EURC, FDUSD — 26 deployments). L2
catalog (12 chains incl. Optimism, Arbitrum, Base,
zkSync Era, Polygon zkEVM, Linea, Scroll, Starknet).
CCTP v2 BurnMessage encode/decode + domain ids +
attestation. ERC-4337 UserOperation v0.7 +
PackedUserOperation. EIP-7702 set-EOA-code with RLP
signing preimage. Uniswap Permit2 single + batch
transfer EIP-712 hashes. EIP-2612 ERC-20 permit.
BOLT-11 bech32 invoices + LNURL decode. Bitcoin
PSBT v2 (BIP-370). Atomic-swap HTLC. Solana SPL /
Aleo / Aztec confidential-transfer sketches.
Smart Byte (1 crate, 2304 LOC, 30 tests)
smart-byte-acdc Authentic Chained Data Containers (KERI ecosystem).
Acdc + AcdcBuilder (targeted + untargeted) with SAID
derivation. JSON Schema 2020-12 validator with
oneOf partial-disclosure. TEL (RIP/VRT/ISS/REV)
with hash-chained verification. IPEX (apply/offer/
agree/grant/admit/spurn) chained by SAID. Edge
records (I2I/NI2I/DI2I) + EdgeGraph BFS traversal
with cycle detection. Selective disclosure with
full/none/subset plans + compact packing.
CredentialRegistry trait + InMemoryRegistry over
TEL. Composes with smart-byte-core + smart-byte-keri-witness.
EOC (1 crate, 1764 LOC, 16 tests)
eoc-memory Long-term memory primitives. Memory trait + MemoryKind +
EpisodeId. Episodic event log with TimeIndex range
queries. RDF-style Triple store with S/P/O indices.
Bounded attention-budget Scratchpad with
salience-weighted eviction. Rolling SummaryBuffer +
FIFO SlidingWindow. Dream-cycle consolidate()
(episodic → semantic). Ebbinghaus forgetting curve
with reinforcement. Retriever blending cosine
similarity + recency + saturating frequency.
MemGpt three-tier shape (Main/Recall/Archival).
Co-Authored-By: Claude Opus 4.7 <[email protected]>
53 lines
1.6 KiB
Rust
53 lines
1.6 KiB
Rust
//! Episodic log + temporal index integration tests.
|
|
|
|
use eoc_memory::episodic::{Episode, EpisodicLog};
|
|
use eoc_memory::memory::Memory;
|
|
|
|
#[test]
|
|
fn appends_are_monotonic_and_queryable() {
|
|
let mut log = EpisodicLog::new();
|
|
log.append(Episode::new(1_000, "user", "hello"))
|
|
.expect("append 1");
|
|
log.append(Episode::new(2_000, "assistant", "hi"))
|
|
.expect("append 2");
|
|
log.append(Episode::new(5_000, "user", "still there?"))
|
|
.expect("append 3");
|
|
|
|
let in_window = log.range(1_500, 4_000);
|
|
assert_eq!(in_window.len(), 1);
|
|
assert_eq!(in_window[0].payload, "hi");
|
|
|
|
let all = log.range(0, 10_000);
|
|
assert_eq!(all.len(), 3);
|
|
}
|
|
|
|
#[test]
|
|
fn non_monotonic_timestamp_is_rejected() {
|
|
let mut log = EpisodicLog::new();
|
|
log.append(Episode::new(10_000, "user", "first"))
|
|
.expect("first");
|
|
let err = log.append(Episode::new(5_000, "user", "back-dated"));
|
|
assert!(err.is_err(), "non-monotonic timestamp should error");
|
|
}
|
|
|
|
#[test]
|
|
fn recent_returns_newest_first() {
|
|
let mut log = EpisodicLog::new();
|
|
log.append(Episode::new(1, "u", "a")).expect("a");
|
|
log.append(Episode::new(2, "u", "b")).expect("b");
|
|
log.append(Episode::new(3, "u", "c")).expect("c");
|
|
|
|
let recent = log.recent(2).expect("recent ok");
|
|
assert_eq!(recent.len(), 2);
|
|
assert!(recent[0].text.contains('c'));
|
|
assert!(recent[1].text.contains('b'));
|
|
}
|
|
|
|
#[test]
|
|
fn episode_ids_are_deterministic() {
|
|
let a = Episode::new(42, "user", "same payload");
|
|
let b = Episode::new(42, "user", "same payload");
|
|
assert_eq!(a.id, b.id);
|
|
let c = Episode::new(43, "user", "same payload");
|
|
assert_ne!(a.id, c.id);
|
|
}
|