///|
/// llama.cpp 进程级 backend 的 MoonBit 受管 owner。
///
/// package 内只有一个实例;它的 finalizer 负责释放 backend 全局资源。
priv type BackendOwner

///|
/// 原生 model 的 MoonBit 受管 owner。
///
/// native payload 持有 `BackendOwner`,并在释放该引用前先释放原生 model。
priv type ModelOwner

///|
/// 原生 context 的 MoonBit 受管 owner。
///
/// native payload 持有对应的 `ModelOwner`,并在释放该引用前先释放原生 context。
priv type SessionOwner

///|
extern "C" fn BackendOwner::new() -> BackendOwner = "llama_mbt_backend_owner_new"

///|
#borrow(raw_ref, backend)
extern "C" fn ModelOwner::new(
  raw_ref : @raw.LlamaModelRef,
  backend : BackendOwner,
) -> ModelOwner = "llama_mbt_model_owner_new"

///|
#borrow(self)
extern "C" fn ModelOwner::get_raw_ref(self : ModelOwner) -> @raw.LlamaModelRef = "llama_mbt_model_owner_get_raw_ref"

///|
#borrow(raw_ref, model)
extern "C" fn SessionOwner::new(
  raw_ref : @raw.LlamaContextRef,
  model : ModelOwner,
) -> SessionOwner = "llama_mbt_session_owner_new"

///|
#borrow(self)
extern "C" fn SessionOwner::get_raw_ref(
  self : SessionOwner,
) -> @raw.LlamaContextRef = "llama_mbt_session_owner_get_raw_ref"

///|
/// 返回从 Session 对应 model 借用的 vocabulary。
///
/// 返回值不能主动释放,只在当前 SessionOwner 存活期间有效。
#borrow(self)
extern "C" fn SessionOwner::get_vocab_ref(
  self : SessionOwner,
) -> @raw.LlamaVocabRef = "llama_mbt_session_owner_get_vocab_ref"

///|
/// 返回高层已成功写入当前单序列 context 的 token 数。
#borrow(self)
extern "C" fn SessionOwner::get_used_tokens(self : SessionOwner) -> UInt = "llama_mbt_session_owner_get_used_tokens"

///|
/// 成功 decode 后提交相应的逻辑 token 位置。
#borrow(self)
extern "C" fn SessionOwner::advance_used_tokens(
  self : SessionOwner,
  count : Int,
) = "llama_mbt_session_owner_advance_used_tokens"

///|
/// context memory 清空后同步重置高层逻辑 token 位置。
#borrow(self)
extern "C" fn SessionOwner::reset_used_tokens(self : SessionOwner) = "llama_mbt_session_owner_reset_used_tokens"

///|
#borrow(self)
extern "C" fn SessionOwner::is_ready(self : SessionOwner) -> Bool = "llama_mbt_session_owner_is_ready"

///|
#borrow(self)
extern "C" fn SessionOwner::mark_needs_reset(self : SessionOwner) = "llama_mbt_session_owner_mark_needs_reset"

///|
#borrow(self)
extern "C" fn SessionOwner::mark_ready(self : SessionOwner) = "llama_mbt_session_owner_mark_ready"

///|
/// package 内唯一的 backend owner。顶层值只初始化一次,Model 会保留其引用。
let backend_owner : BackendOwner = BackendOwner::new()