pub mod macros;
mod agent_sessions;
pub mod agent_state;
pub(crate) mod agents;
mod agents_daemon;
mod artifact_emit;
pub(crate) mod assemble;
pub mod asset_paths;
mod bytes;
mod calendar;
mod channel_guardrails;
mod channels;
pub(crate) mod clock;
pub(crate) mod collections;
mod command_policy;
pub(crate) mod compaction;
mod compression;
mod concurrency;
pub(crate) use concurrency::cancelled_vm_error;
mod connectors;
mod cookies;
mod cron;
mod crypto;
mod csv;
mod datetime;
pub(crate) use datetime::date_dict_from_millis;
mod document;
mod durable_step;
mod event_log;
mod external_agent;
pub(crate) mod files;
mod flow;
pub(crate) mod fs;
mod git;
pub(crate) mod git_topology;
mod grounding;
pub(crate) mod harn_entry;
pub(crate) mod hitl;
mod hitl_read;
pub mod host;
pub mod http_response;
pub(crate) mod io;
mod iter;
pub(crate) mod json;
mod json_query;
pub(crate) mod json_stream;
mod jsonrpc;
mod junit;
mod lifecycle_receipts;
mod logging;
pub mod long_running;
mod math;
pub(crate) use math::call_seeded_random_method;
pub(crate) mod memory;
mod monitors;
mod multipart;
mod net;
mod net_policy;
mod oauth_dynreg;
mod oauth_storage;
pub(crate) mod observability;
pub(crate) mod options;
mod package_snapshot;
pub(crate) use package_snapshot::PackageSnapshotRegistry;
mod path;
pub(crate) mod path_scope_guard;
pub(crate) mod pool;
#[cfg(feature = "postgres")]
mod postgres;
#[cfg(feature = "postgres")]
pub use postgres::install_shared_pool_registry;
pub mod process;
pub(crate) mod process_spawn;
mod project;
mod project_catalog;
mod project_enrich;
mod regex;
mod review;
mod runtime_scope;
pub(crate) mod sandbox;
pub mod secret_scan;
pub(crate) mod session_store;
mod sets;
pub(crate) mod shapes;
mod skills;
#[cfg(feature = "sqlite")]
mod sqlite;
pub(crate) mod strings;
pub(crate) mod supervisor;
pub mod template;
mod testbench;
mod testing;
mod timing;
pub mod token_redaction;
pub(crate) mod tool_hooks;
pub(crate) mod tools;
pub mod tracing;
mod transcript_compact;
pub(crate) mod transcript_project;
mod triggers_stdlib;
mod tui;
mod types;
mod url_parse;
mod vision;
pub(crate) mod waitpoint;
mod web;
pub mod workflow_messages;
pub(crate) mod xml;
use crate::http::register_http_builtins;
use crate::llm::register_llm_builtins;
use crate::mcp::register_mcp_builtins;
use crate::mcp_server::register_mcp_server_builtins;
use crate::vm::Vm;
pub(crate) use crate::schema::{json_to_vm_value, schema_result_value};
pub(crate) fn set_thread_source_dir(dir: &std::path::Path) {
process::set_thread_source_dir(dir);
}
pub fn register_core_stdlib(vm: &mut Vm) {
types::register_type_builtins(vm);
math::register_math_builtins(vm);
strings::register_string_builtins(vm);
json::register_json_builtins(vm);
json_stream::register_json_stream_builtins(vm);
xml::register_xml_builtins(vm);
datetime::register_datetime_builtins(vm);
document::register_document_builtins(vm);
calendar::register_calendar_builtins(vm);
cron::register_cron_builtins(vm);
regex::register_regex_builtins(vm);
bytes::register_bytes_builtins(vm);
compression::register_compression_builtins(vm);
command_policy::register_command_policy_builtins(vm);
runtime_scope::register_runtime_scope_builtins(vm);
crypto::register_crypto_builtins(vm);
csv::register_csv_builtins(vm);
junit::register_junit_builtins(vm);
multipart::register_multipart_builtins(vm);
url_parse::register_url_builtins(vm);
web::register_web_builtins(vm);
cookies::register_cookie_builtins(vm);
path::register_path_helper_builtins(vm);
sets::register_set_builtins(vm);
collections::register_collection_builtins(vm);
iter::register_iter_builtins(vm);
event_log::register_event_log_builtins(vm);
durable_step::register_durable_step_builtins(vm);
channels::register_channel_builtins(vm);
channel_guardrails::register_channel_guardrail_builtins(vm);
shapes::register_shape_builtins(vm);
testing::register_testing_builtins(vm);
flow::register_flow_builtins(vm);
lifecycle_receipts::register_lifecycle_receipt_builtins(vm);
net_policy::register_net_policy_builtins(vm);
http_response::register_http_response_builtins(vm);
}
pub fn register_io_stdlib(vm: &mut Vm) {
io::register_io_builtins(vm);
host::register_host_builtins(vm);
fs::register_fs_builtins(vm);
package_snapshot::register_package_snapshot_builtins(vm);
files::register_file_builtins(vm);
git::register_git_builtins(vm);
vision::register_vision_builtins(vm);
agent_state::register_agent_state_builtins(vm);
memory::register_memory_builtins(vm);
session_store::register_session_store_builtins(vm);
net::register_net_builtins(vm);
process::register_process_builtins(vm);
process::register_path_builtins(vm);
sandbox::register_sandbox_builtins(vm);
clock::register_clock_builtins(vm);
crate::durable_rate_limit::register_durable_rate_limit_builtins(vm);
testbench::register_testbench_builtins(vm);
project::register_project_builtins(vm);
grounding::register_grounding_builtins(vm);
tracing::register_tracing_builtins(vm);
observability::register_observability_builtins(vm);
timing::register_timing_builtins(vm);
tui::register_tui_builtins(vm);
}
fn register_agent_stdlib_before_llm(vm: &mut Vm) {
concurrency::register_concurrency_builtins(vm);
connectors::register_connector_builtins(vm);
review::register_review_builtins(vm);
secret_scan::register_secret_scan_builtins(vm);
tools::register_tool_builtins(vm);
tool_hooks::register_tool_hooks_builtins(vm);
crate::composition::register_composition_builtins(vm);
skills::register_skill_builtins(vm);
agents_daemon::register_daemon_builtins(vm);
triggers_stdlib::register_trigger_builtins(vm);
#[cfg(feature = "postgres")]
postgres::register_postgres_builtins(vm);
#[cfg(feature = "sqlite")]
sqlite::register_sqlite_builtins(vm);
monitors::register_monitor_builtins(vm);
hitl::register_hitl_builtins(vm);
hitl_read::register_hitl_read_builtins(vm);
waitpoint::register_waitpoint_builtins(vm);
supervisor::register_supervisor_builtins(vm);
agents::register_agent_builtins(vm);
pool::register_pool_builtins(vm);
oauth_storage::register_oauth_storage_builtins(vm);
oauth_dynreg::register_oauth_dynreg_builtins(vm);
token_redaction::register_token_redaction_builtins(vm);
agent_sessions::register_agent_session_builtins(vm);
artifact_emit::register_artifact_emit_builtins(vm);
external_agent::register_external_agent_builtins(vm);
path_scope_guard::register_path_scope_guard_builtins(vm);
workflow_messages::register_workflow_message_builtins(vm);
transcript_compact::register_transcript_compaction_builtins(vm);
compaction::register_compaction_builtins(vm);
transcript_project::register_transcript_projection_builtins(vm);
assemble::register_assemble_context_builtin(vm);
crate::egress::register_egress_builtins(vm);
crate::security::register_security_builtins(vm);
register_http_builtins(vm);
jsonrpc::register_jsonrpc_builtins(vm);
}
fn register_agent_stdlib_after_llm(vm: &mut Vm) {
register_mcp_builtins(vm);
register_mcp_server_builtins(vm);
crate::step_runtime::register_step_builtins(vm);
}
pub fn register_agent_stdlib(vm: &mut Vm) {
register_agent_stdlib_before_llm(vm);
register_llm_builtins(vm);
register_agent_stdlib_after_llm(vm);
}
pub fn register_vm_stdlib(vm: &mut Vm) {
register_core_stdlib(vm);
register_io_stdlib(vm);
register_agent_stdlib(vm);
vm.project_declared_capability_methods();
if vm.harness().is_none() {
vm.set_harness(crate::harness::Harness::real());
}
harn_builtin_registry::install_builtin_manifest(all_builtin_manifest());
}
pub(crate) fn rebind_execution_state_builtins(vm: &mut Vm) {
concurrency::register_concurrency_builtins(vm);
}
fn stdlib_probe_vm() -> Vm {
let mut vm = Vm::new();
register_vm_stdlib(&mut vm);
let tmp = std::env::temp_dir();
crate::store::register_store_builtins(&mut vm, &tmp);
crate::checkpoint::register_checkpoint_builtins(&mut vm, &tmp, "default");
crate::metadata::register_metadata_builtins(&mut vm, &tmp);
harn_builtin_registry::install_builtin_manifest(all_builtin_manifest());
vm
}
pub fn all_builtin_defs() -> &'static [&'static macros::VmBuiltinDef] {
let defs = ¯os::ALL_BUILTIN_DEFS;
validate_builtin_contracts(defs);
defs
}
fn validate_builtin_contracts(defs: &[¯os::VmBuiltinDef]) {
use harn_builtin_meta::BuiltinExposure;
let mut source_names = std::collections::BTreeSet::new();
let mut capability_methods = std::collections::BTreeSet::new();
for def in defs {
assert!(
def.contract.is_declared(),
"builtin `{}` has no typed exposure/effect contract",
def.sig.name
);
assert!(
!matches!(def.contract.exposure, BuiltinExposure::PureGlobal)
|| def.contract.effects.is_empty(),
"ambient global builtin `{}` declares effects; effects must flow through Harness",
def.sig.name
);
if let BuiltinExposure::CapabilityFunction { authority_argument } = def.contract.exposure {
assert!(
!def.contract.effects.is_empty(),
"capability function `{}` must declare effects",
def.sig.name
);
assert!(
usize::from(authority_argument) < def.sig.params.len(),
"capability function `{}` authority argument is out of range",
def.sig.name
);
}
if def.runtime_only {
assert!(
matches!(def.contract.exposure, BuiltinExposure::RuntimeInternal),
"runtime_only builtin `{}` must use runtime_internal exposure",
def.sig.name
);
}
if let BuiltinExposure::HarnessMethod { method, .. } = def.contract.exposure {
assert!(
!method.is_empty(),
"harness method for `{}` cannot be empty",
def.sig.name
);
let BuiltinExposure::HarnessMethod { capability, method } = def.contract.exposure
else {
unreachable!()
};
assert!(
capability_methods.insert((capability, method)),
"duplicate contract for harness.{}.{}",
capability.field_name(),
method
);
}
if matches!(
def.contract.exposure,
BuiltinExposure::PureGlobal
| BuiltinExposure::CapabilityFunction { .. }
| BuiltinExposure::PrivilegedWire
| BuiltinExposure::HarnessMethod { .. }
) {
assert!(
source_names.insert(def.sig.name),
"duplicate source contract name `{}`",
def.sig.name
);
}
}
}
pub fn force_link() {
let len = std::hint::black_box(macros::ALL_BUILTIN_DEFS.len());
assert!(
len >= 1,
"linkme distributed_slice ALL_BUILTIN_DEFS is empty — \
the binary is missing `harn_vm::stdlib::force_link()` at startup, \
or the linker stripped the harn-vm rlib statics (see linkme issue #36)"
);
}
pub fn all_builtin_manifest() -> &'static [&'static harn_builtin_registry::BuiltinManifestEntry] {
use std::sync::OnceLock;
static AGG: OnceLock<Vec<&'static harn_builtin_registry::BuiltinManifestEntry>> =
OnceLock::new();
AGG.get_or_init(|| {
let mut out = Vec::new();
let mut capability_methods = std::collections::BTreeSet::new();
for def in all_builtin_defs() {
if def.runtime_only {
continue;
}
out.push(
Box::leak(Box::new(harn_builtin_registry::BuiltinManifestEntry {
name: def.sig.name,
signature: &def.sig,
contract: def.contract,
})) as &'static harn_builtin_registry::BuiltinManifestEntry,
);
if let harn_builtin_meta::BuiltinExposure::HarnessMethod { capability, method } =
def.contract.exposure
{
capability_methods.insert((capability, method));
}
for alias in def.aliases {
let signature = Box::leak(Box::new(harn_builtin_meta::BuiltinSignature {
name: alias,
..def.sig
}));
out.push(
Box::leak(Box::new(harn_builtin_registry::BuiltinManifestEntry {
name: alias,
signature,
contract: def.contract,
})) as &'static harn_builtin_registry::BuiltinManifestEntry,
);
}
}
for entry in harn_capability_contracts::manifest() {
let harn_builtin_meta::BuiltinExposure::HarnessMethod { capability, method } =
entry.contract.exposure
else {
unreachable!("leaf capability manifest contains a non-method contract")
};
if !capability_methods.insert((capability, method)) {
let runtime_entry = out
.iter()
.find(|candidate| candidate.contract.exposure == entry.contract.exposure)
.expect("duplicate capability key must have a runtime manifest entry");
assert_eq!(
runtime_entry.contract,
entry.contract,
"runtime effect contract drift for harness.{}.{}",
capability.field_name(),
method
);
assert_eq!(
runtime_entry.signature,
entry.signature,
"runtime signature drift for harness.{}.{}",
capability.field_name(),
method
);
continue;
}
out.push(*entry);
}
for group in harn_builtin_meta::host_capabilities::HOST_CAPABILITY_GROUPS {
for method in group.methods {
if !capability_methods.insert((group.capability, *method)) {
continue;
}
let internal_name: &'static str = Box::leak(
format!("__cap_{}_{}", group.capability.field_name(), method).into_boxed_str(),
);
let params: &'static [harn_builtin_meta::Param] =
Box::leak(Box::new([harn_builtin_meta::Param::new(
"request",
harn_builtin_meta::Ty::Named("dict"),
)]));
let signature = Box::leak(Box::new(harn_builtin_meta::BuiltinSignature::simple(
internal_name,
params,
harn_builtin_meta::Ty::Named("dict"),
)));
out.push(Box::leak(Box::new(
harn_builtin_registry::BuiltinManifestEntry {
name: internal_name,
signature,
contract: harn_builtin_meta::BuiltinContract::harness(
group.capability,
method,
group.effects,
),
},
)));
}
}
out
})
.as_slice()
}
pub fn register_all_macro_builtins(vm: &mut Vm) {
for def in all_builtin_defs() {
vm.register_builtin_def(def);
}
}
pub fn stdlib_builtin_names() -> Vec<String> {
let vm = stdlib_probe_vm();
let mut names = vm.builtin_names();
for extra in harn_parser::builtin_signatures::LANGUAGE_INTRINSICS {
names.push(extra.to_string());
}
names
}
pub fn stdlib_builtin_metadata() -> Vec<crate::vm::VmBuiltinMetadata> {
stdlib_probe_vm().builtin_metadata()
}
pub fn reset_stdlib_state() {
logging::reset_logging_state();
process::reset_process_state();
clock::reset_clock_state();
io::reset_io_state();
sandbox::reset_sandbox_state();
git::reset_git_state();
fs::reset_fs_state();
json::reset_json_state();
json_stream::reset_json_stream_state();
host::reset_host_state();
host::reset_scoped_host_state();
observability::reset_observability_state();
timing::reset_timing_state();
durable_step::reset_durable_step_state();
crate::egress::reset_egress_policy_for_host();
hitl::reset_hitl_state();
crate::http::reset_http_state();
crate::external_agent::reset_external_agent_state();
monitors::reset_monitor_state();
waitpoint::reset_waitpoint_state();
triggers_stdlib::reset_auto_resume_timeouts();
compaction::reset_compaction_state();
agents::reset_agent_worker_state();
agents::workflow::reset_workflow_run_states();
pool::reset_pool_state();
#[cfg(feature = "postgres")]
postgres::reset_postgres_state();
#[cfg(feature = "sqlite")]
sqlite::reset_sqlite_state();
supervisor::reset_supervisor_state();
agents::records::reset_eval_metrics();
agents::records::reset_friction_events();
tools::clear_current_tool_registry();
tools::clear_tool_synthesis_cache();
vision::reset_vision_state();
crate::skills::clear_current_skill_registry();
template::reset_prompt_registry();
crate::triggers::clear_webhook_intake_state();
crate::llm::cache::reset_in_process_cache_state();
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test(flavor = "current_thread")]
async fn register_vm_stdlib_passes_default_harness_only_to_main() {
let chunk = crate::compile_source(
r"
fn __probe_harness_clock(clock: HarnessClock) {
const now = clock.now_ms()
return now >= 0
}
fn main(harness: Harness) {
return __probe_harness_clock(harness.clock)
}
",
)
.expect("compile harness clock probe");
let mut vm = Vm::new();
register_vm_stdlib(&mut vm);
assert!(vm.root_harness_value().is_some());
assert!(vm.global("harness").is_none());
let result = vm
.execute(&chunk)
.await
.expect("execute harness clock probe");
assert!(matches!(result, crate::value::VmValue::Bool(true)));
}
#[test]
fn every_stdlib_builtin_reexport_names_a_registered_builtin() {
let registered: std::collections::HashSet<&str> = all_builtin_defs()
.iter()
.flat_map(|def| std::iter::once(def.sig.name).chain(def.aliases.iter().copied()))
.collect();
let mut checked = 0;
for entry in harn_stdlib::STDLIB_SOURCES {
for name in harn_stdlib::builtin_reexports(entry.module) {
assert!(
registered.contains(name),
"std/{} re-exports '{name}', which is not a registered builtin",
entry.module
);
checked += 1;
}
}
assert!(
checked > 0,
"no re-exports were checked — the table or the module list is not being read"
);
}
#[test]
fn ambient_effect_builtin_allowlist_is_empty() {
let offenders = all_builtin_defs()
.iter()
.filter(|def| {
matches!(
def.contract.exposure,
harn_builtin_meta::BuiltinExposure::PureGlobal
) && !def.contract.effects.is_empty()
})
.map(|def| def.sig.name)
.collect::<Vec<_>>();
assert!(
offenders.is_empty(),
"ambient effect builtins are forbidden; route these through Harness: {offenders:?}"
);
}
#[test]
fn every_source_named_runtime_callable_has_a_typed_contract() {
let manifest_names = all_builtin_manifest()
.iter()
.map(|entry| entry.name)
.collect::<std::collections::HashSet<_>>();
let offenders = stdlib_probe_vm()
.builtin_names()
.into_iter()
.filter(|name| {
!name.starts_with("__")
&& !manifest_names.contains(name.as_str())
&& !harn_parser::builtin_signatures::is_language_intrinsic(name)
})
.collect::<Vec<_>>();
assert!(
offenders.is_empty(),
"runtime callables without typed source contracts bypass the Harness gate: {offenders:?}"
);
}
}