Skip to main content

harn_vm/
stdlib.rs

1//! Standard library builtins for the Harn VM.
2
3mod agent_sessions;
4pub mod agent_state;
5pub(crate) mod agents;
6mod agents_daemon;
7pub(crate) mod assemble;
8pub mod asset_paths;
9mod bytes;
10mod calendar;
11pub(crate) mod clock;
12mod collections;
13mod command_policy;
14mod compression;
15mod concurrency;
16mod connectors;
17mod cookies;
18mod crypto;
19mod csv;
20mod datetime;
21mod event_log;
22pub(crate) mod files;
23mod flow;
24mod fs;
25mod git;
26pub(crate) mod harn_entry;
27pub(crate) mod hitl;
28mod hitl_read;
29pub mod host;
30pub(crate) mod io;
31mod iter;
32pub(crate) mod json;
33mod json_query;
34pub(crate) mod json_stream;
35mod junit;
36mod logging;
37pub mod long_running;
38mod math;
39mod memory;
40mod monitors;
41mod multipart;
42mod options;
43mod path;
44mod pool;
45mod postgres;
46pub mod process;
47mod project;
48mod project_catalog;
49mod project_enrich;
50mod regex;
51pub(crate) mod registration;
52mod review;
53mod runtime_scope;
54pub(crate) mod sandbox;
55pub mod secret_scan;
56mod sets;
57pub(crate) mod shapes;
58mod skills;
59mod strings;
60pub(crate) mod supervisor;
61pub mod template;
62mod testbench;
63mod testing;
64pub(crate) mod tool_hooks;
65pub(crate) mod tools;
66pub mod tracing;
67mod transcript_compact;
68mod triggers_stdlib;
69mod tui;
70mod types;
71mod url_parse;
72mod vision;
73pub(crate) mod waitpoint;
74mod waitpoints;
75mod web;
76pub mod workflow_messages;
77
78use crate::http::register_http_builtins;
79use crate::llm::register_llm_builtins;
80use crate::mcp::register_mcp_builtins;
81use crate::mcp_server::register_mcp_server_builtins;
82use crate::vm::Vm;
83
84pub(crate) use crate::schema::{json_to_vm_value, schema_result_value};
85pub(crate) fn set_thread_source_dir(dir: &std::path::Path) {
86    process::set_thread_source_dir(dir);
87}
88
89/// Register core builtins: pure/deterministic, no I/O.
90pub fn register_core_stdlib(vm: &mut Vm) {
91    crate::runtime_context::register_runtime_context_builtins(vm);
92    types::register_type_builtins(vm);
93    math::register_math_builtins(vm);
94    strings::register_string_builtins(vm);
95    json::register_json_builtins(vm);
96    json_stream::register_json_stream_builtins(vm);
97    datetime::register_datetime_builtins(vm);
98    calendar::register_calendar_builtins(vm);
99    regex::register_regex_builtins(vm);
100    bytes::register_bytes_builtins(vm);
101    compression::register_compression_builtins(vm);
102    command_policy::register_command_policy_builtins(vm);
103    runtime_scope::register_runtime_scope_builtins(vm);
104    crypto::register_crypto_builtins(vm);
105    csv::register_csv_builtins(vm);
106    junit::register_junit_builtins(vm);
107    multipart::register_multipart_builtins(vm);
108    url_parse::register_url_builtins(vm);
109    web::register_web_builtins(vm);
110    cookies::register_cookie_builtins(vm);
111    path::register_path_helper_builtins(vm);
112    sets::register_set_builtins(vm);
113    collections::register_collection_builtins(vm);
114    iter::register_iter_builtins(vm);
115    event_log::register_event_log_builtins(vm);
116    shapes::register_shape_builtins(vm);
117    testing::register_testing_builtins(vm);
118    flow::register_flow_builtins(vm);
119}
120
121/// Register I/O builtins (requires OS access).
122pub fn register_io_stdlib(vm: &mut Vm) {
123    io::register_io_builtins(vm);
124    host::register_host_builtins(vm);
125    fs::register_fs_builtins(vm);
126    files::register_file_builtins(vm);
127    git::register_git_builtins(vm);
128    vision::register_vision_builtins(vm);
129    agent_state::register_agent_state_builtins(vm);
130    memory::register_memory_builtins(vm);
131    process::register_process_builtins(vm);
132    process::register_path_builtins(vm);
133    sandbox::register_sandbox_builtins(vm);
134    // Clock builtins overlay process::timestamp/elapsed so they honor
135    // mock_time / advance_time. Register AFTER process to take precedence.
136    clock::register_clock_builtins(vm);
137    testbench::register_testbench_builtins(vm);
138    project::register_project_builtins(vm);
139    tracing::register_tracing_builtins(vm);
140    tui::register_tui_builtins(vm);
141}
142
143/// Register agent builtins (requires network access and async runtime).
144pub fn register_agent_stdlib(vm: &mut Vm) {
145    concurrency::register_concurrency_builtins(vm);
146    connectors::register_connector_builtins(vm);
147    review::register_review_builtins(vm);
148    secret_scan::register_secret_scan_builtins(vm);
149    tools::register_tool_builtins(vm);
150    tool_hooks::register_tool_hooks_builtins(vm);
151    crate::composition::register_composition_builtins(vm);
152    skills::register_skill_builtins(vm);
153    agents_daemon::register_daemon_builtins(vm);
154    triggers_stdlib::register_trigger_builtins(vm);
155    postgres::register_postgres_builtins(vm);
156    waitpoints::register_waitpoint_builtins(vm);
157    monitors::register_monitor_builtins(vm);
158    hitl::register_hitl_builtins(vm);
159    hitl_read::register_hitl_read_builtins(vm);
160    waitpoint::register_waitpoint_builtins(vm);
161    supervisor::register_supervisor_builtins(vm);
162    agents::register_agent_builtins(vm);
163    pool::register_pool_builtins(vm);
164    agent_sessions::register_agent_session_builtins(vm);
165    workflow_messages::register_workflow_message_builtins(vm);
166    transcript_compact::register_transcript_compaction_builtins(vm);
167    assemble::register_assemble_context_builtin(vm);
168    crate::egress::register_egress_builtins(vm);
169    register_http_builtins(vm);
170    register_llm_builtins(vm);
171    register_mcp_builtins(vm);
172    register_mcp_server_builtins(vm);
173    crate::step_runtime::register_step_builtins(vm);
174}
175
176/// Register all standard builtins on a VM (core + io + agent).
177pub fn register_vm_stdlib(vm: &mut Vm) {
178    register_core_stdlib(vm);
179    register_io_stdlib(vm);
180    register_agent_stdlib(vm);
181}
182
183pub(crate) fn rebind_execution_state_builtins(vm: &mut Vm) {
184    concurrency::register_concurrency_builtins(vm);
185}
186
187fn stdlib_probe_vm() -> Vm {
188    let mut vm = Vm::new();
189    register_vm_stdlib(&mut vm);
190    // Name-only/metadata introspection never accesses this path, but passing
191    // a real per-platform temp dir keeps registration logic honest if a
192    // callee someday validates its parent.
193    let tmp = std::env::temp_dir();
194    crate::store::register_store_builtins(&mut vm, &tmp);
195    crate::checkpoint::register_checkpoint_builtins(&mut vm, &tmp, "default");
196    crate::metadata::register_metadata_builtins(&mut vm, &tmp);
197    crate::metadata::register_scan_builtins(&mut vm);
198    vm
199}
200
201/// Return the canonical list of all stdlib builtin names. Used by
202/// harn-lint and harn-lsp to avoid hardcoded duplicate lists.
203pub fn stdlib_builtin_names() -> Vec<String> {
204    let vm = stdlib_probe_vm();
205    let mut names = vm.builtin_names();
206    // Special opcodes/keywords, not registered builtins, but linter
207    // should recognize them as valid function calls.
208    for extra in [
209        "spawn",
210        "await",
211        "cancel",
212        "cancel_graceful",
213        "__signal_interrupted",
214        "__signal_off_interrupt",
215        "__signal_on_interrupt",
216        "__signal_raise",
217        "is_cancelled",
218    ] {
219        names.push(extra.to_string());
220    }
221    names
222}
223
224/// Return discoverable metadata for registered stdlib builtins.
225pub fn stdlib_builtin_metadata() -> Vec<crate::vm::VmBuiltinMetadata> {
226    stdlib_probe_vm().builtin_metadata()
227}
228
229/// Reset thread-local stdlib state. Call between test runs.
230///
231/// Note: `long_running::reset_state()` is intentionally NOT called here
232/// because that store is process-global, not thread-local. Wiping it
233/// from a per-test reset hook lets one test cancel another test's
234/// in-flight worker thread (and lose its `agent_inbox::push`
235/// notification), which surfaces as `walk_dir_long_running` /
236/// `glob_long_running` timing out under parallel test load. The two
237/// call sites that genuinely need a clean handle store —
238/// `stdlib::fs::tests::{walk_dir_long_running,glob_long_running}` — call
239/// `long_running::reset_state()` explicitly while holding
240/// `LONG_RUNNING_TEST_LOCK`.
241pub fn reset_stdlib_state() {
242    logging::reset_logging_state();
243    process::reset_process_state();
244    clock::reset_clock_state();
245    io::reset_io_state();
246    sandbox::reset_sandbox_state();
247    fs::reset_fs_state();
248    json::reset_json_state();
249    json_stream::reset_json_stream_state();
250    host::reset_host_state();
251    crate::egress::reset_egress_policy_for_host();
252    hitl::reset_hitl_state();
253    crate::http::reset_http_state();
254    monitors::reset_monitor_state();
255    waitpoints::reset_waitpoint_state();
256    waitpoint::reset_waitpoint_state();
257    triggers_stdlib::reset_auto_resume_timeouts();
258    postgres::reset_postgres_state();
259    supervisor::reset_supervisor_state();
260    agents::records::reset_eval_metrics();
261    agents::records::reset_friction_events();
262    tools::clear_current_tool_registry();
263    tools::clear_tool_synthesis_cache();
264    vision::reset_vision_state();
265    crate::skills::clear_current_skill_registry();
266    template::reset_prompt_registry();
267    crate::triggers::clear_webhook_intake_state();
268    crate::llm::cache::reset_in_process_cache_state();
269}