Skip to main content

harn_hostlib/
lib.rs

1//! `harn-hostlib`: opt-in host builtins for code intelligence (tree-sitter,
2//! repo scanning, deterministic indexing) and tool execution (search, file
3//! I/O, git, process lifecycle, file watcher).
4//!
5//! This crate is the Rust home of two classes of optional host capabilities:
6//!
7//! 1. **Code intelligence** — `ast/`, `code_index/`, `scanner/`, `fs_watch/`.
8//! 2. **Deterministic tools** — `tools/` (search, fs, git, process).
9//!
10//! These don't belong inside `harn-vm` — pulling tree-sitter grammars,
11//! ripgrep, and `notify` into the VM would balloon the footprint of every
12//! pipeline that doesn't index host code. Instead, this crate exposes a
13//! single [`HostlibCapability`] trait. Embedders such as `harn-cli`'s ACP
14//! server) compose the modules they need via [`HostlibRegistry`] and wire
15//! the resulting builtins into the VM through [`harn_vm::Vm::register_builtin`]
16//! / [`harn_vm::Vm::register_async_builtin`].
17//!
18//! ## Status
19//!
20//! The AST, scanner, code-index, and deterministic-tool surfaces are
21//! implemented. `fs_watch/` still registers its public contract with
22//! [`HostlibError::Unimplemented`] handlers. Module names, method names,
23//! and JSON schemas under `schemas/` are the source of truth for hostlib
24//! request/response compatibility, so they must stay stable while module
25//! bodies evolve.
26
27#![deny(rust_2018_idioms)]
28#![warn(missing_docs)]
29
30pub mod ast;
31pub mod code_index;
32pub mod error;
33pub mod fs;
34pub mod fs_watch;
35pub mod process;
36pub mod scanner;
37pub mod schemas;
38pub mod secret_store;
39pub mod tools;
40
41mod registry;
42
43pub use error::HostlibError;
44pub use registry::{BuiltinRegistry, HostlibCapability, HostlibRegistry, RegisteredBuiltin};
45
46/// Convenience: build a `HostlibRegistry` populated with every capability
47/// the crate ships, register them on the supplied VM, and return the
48/// registry so callers can introspect (e.g. for schema-drift tests).
49///
50/// This is the canonical entry point for embedders that want the full
51/// hostlib surface; pick-and-choose embedders should construct
52/// [`HostlibRegistry`] directly.
53pub fn install_default(vm: &mut harn_vm::Vm) -> HostlibRegistry {
54    let mut registry = HostlibRegistry::new()
55        .with(ast::AstCapability)
56        .with(code_index::CodeIndexCapability::new())
57        .with(scanner::ScannerCapability)
58        .with(fs::FsCapability)
59        .with(fs_watch::FsWatchCapability)
60        .with(tools::ToolsCapability)
61        .with(secret_store::SecretStoreCapability);
62    registry.register_into_vm(vm);
63    registry
64}