Skip to main content

harn_vm/
lib.rs

1#![allow(clippy::result_large_err, clippy::cloned_ref_to_slice_refs)]
2
3pub mod a2a;
4pub mod agent_events;
5pub mod agent_sessions;
6pub mod bridge;
7pub mod checkpoint;
8mod chunk;
9mod compiler;
10pub mod connectors;
11pub mod event_log;
12pub mod events;
13mod http;
14pub mod jsonrpc;
15pub mod llm;
16pub mod llm_config;
17pub mod mcp;
18pub mod mcp_card;
19pub mod mcp_registry;
20pub mod mcp_server;
21pub mod metadata;
22pub mod observability;
23pub mod orchestration;
24pub mod record_filter;
25pub mod runtime_paths;
26pub mod schema;
27pub mod secrets;
28pub mod skills;
29pub mod stdlib;
30pub mod stdlib_modules;
31pub mod store;
32pub mod tool_annotations;
33pub mod tracing;
34pub mod triggers;
35pub mod trust_graph;
36pub mod value;
37pub mod visible_text;
38mod vm;
39pub mod workspace_path;
40
41pub use checkpoint::register_checkpoint_builtins;
42pub use chunk::*;
43pub use compiler::*;
44pub use connectors::{
45    active_connector_client, clear_active_connector_clients,
46    cron::{CatchupMode, CronConnector},
47    hmac::verify_hmac_signed,
48    install_active_connector_clients, postprocess_normalized_event, ActivationHandle, ClientError,
49    Connector, ConnectorClient, ConnectorCtx, ConnectorError, ConnectorMetricsSnapshot,
50    ConnectorRegistry, GenericWebhookConnector, GitHubConnector, MetricsRegistry,
51    PostNormalizeOutcome, ProviderPayloadSchema, RateLimitConfig, RateLimiterFactory, RawInbound,
52    SlackConnector, TriggerBinding, TriggerKind, TriggerRegistry, WebhookSignatureVariant,
53};
54pub use http::{register_http_builtins, reset_http_state};
55pub use llm::register_llm_builtins;
56pub use llm::trigger_predicate::TriggerPredicateBudget;
57pub use mcp::{
58    connect_mcp_server, connect_mcp_server_from_json, connect_mcp_server_from_spec,
59    register_mcp_builtins,
60};
61pub use mcp_card::{fetch_server_card, load_server_card_from_path, CardError};
62pub use mcp_registry::{
63    active_handle as mcp_active_handle, ensure_active as mcp_ensure_active,
64    get_registration as mcp_get_registration, install_active as mcp_install_active,
65    is_registered as mcp_is_registered, register_servers as mcp_register_servers,
66    release as mcp_release, reset as mcp_reset_registry, snapshot_status as mcp_snapshot_status,
67    sweep_expired as mcp_sweep_expired, RegisteredMcpServer, RegistryStatus,
68};
69pub use mcp_server::{
70    take_mcp_serve_prompts, take_mcp_serve_registry, take_mcp_serve_resource_templates,
71    take_mcp_serve_resources, tool_registry_to_mcp_tools, McpServer,
72};
73pub use metadata::{register_metadata_builtins, register_scan_builtins};
74pub use record_filter::{normalize_record_filter_expression, CompiledRecordFilter};
75pub use stdlib::hitl::{
76    append_hitl_response, HitlHostResponse, HITL_APPROVALS_TOPIC, HITL_DUAL_CONTROL_TOPIC,
77    HITL_ESCALATIONS_TOPIC, HITL_QUESTIONS_TOPIC,
78};
79pub use stdlib::host::{clear_host_call_bridge, set_host_call_bridge, HostCallBridge};
80pub use stdlib::secret_scan::{
81    append_secret_scan_audit, audit_secret_scan_active, scan_content as secret_scan_content,
82    SecretFinding, SECRET_SCAN_AUDIT_TOPIC,
83};
84pub use stdlib::template::{
85    lookup_prompt_consumers, lookup_prompt_span, prompt_render_indices, record_prompt_render_index,
86    PromptSourceSpan, PromptSpanKind,
87};
88pub use stdlib::{
89    register_agent_stdlib, register_core_stdlib, register_io_stdlib, register_vm_stdlib,
90};
91pub use store::register_store_builtins;
92pub use triggers::{
93    append_dispatch_cancel_request, begin_in_flight, binding_version_as_of, clear_dispatcher_state,
94    clear_trigger_registry, drain, dynamic_deregister, dynamic_register, finish_in_flight,
95    install_manifest_triggers, parse_flow_control_duration, pin_trigger_binding, provider_metadata,
96    redact_headers, register_provider_schema, registered_provider_metadata,
97    registered_provider_schema_names, reset_provider_catalog, resolve_live_or_as_of,
98    resolve_live_trigger_binding, resolve_trigger_binding_as_of, run_trigger_harness_fixture,
99    snapshot_dispatcher_stats, snapshot_trigger_bindings, unpin_trigger_binding,
100    DispatchCancelRequest, DispatchError, DispatchOutcome, DispatchStatus, Dispatcher,
101    DispatcherDrainReport, DispatcherStatsSnapshot, HeaderRedactionPolicy, InboxIndex,
102    ProviderCatalog, ProviderCatalogError, ProviderId, ProviderMetadata, ProviderOutboundMethod,
103    ProviderPayload, ProviderRuntimeMetadata, ProviderSchema, ProviderSecretRequirement,
104    RecordedTriggerBinding, RetryPolicy, SignatureStatus, SignatureVerificationMetadata, TenantId,
105    TraceId, TriggerBatchConfig, TriggerBindingSnapshot, TriggerBindingSource, TriggerBindingSpec,
106    TriggerConcurrencyConfig, TriggerDebounceConfig, TriggerDispatchOutcome, TriggerEvent,
107    TriggerEventId, TriggerExpressionSpec, TriggerFlowControlConfig, TriggerHandlerSpec,
108    TriggerHarnessResult, TriggerId, TriggerMetricsSnapshot, TriggerPredicateSpec,
109    TriggerPriorityOrderConfig, TriggerRateLimitConfig, TriggerRegistryError, TriggerRetryConfig,
110    TriggerSingletonConfig, TriggerState, TriggerThrottleConfig, DEFAULT_INBOX_RETENTION_DAYS,
111    TRIGGERS_LIFECYCLE_TOPIC, TRIGGER_ATTEMPTS_TOPIC, TRIGGER_CANCEL_REQUESTS_TOPIC,
112    TRIGGER_DLQ_TOPIC, TRIGGER_INBOX_CLAIMS_TOPIC, TRIGGER_INBOX_ENVELOPES_TOPIC,
113    TRIGGER_INBOX_LEGACY_TOPIC, TRIGGER_OPERATION_AUDIT_TOPIC, TRIGGER_OUTBOX_TOPIC,
114    TRIGGER_TEST_FIXTURES,
115};
116pub use trust_graph::{
117    append_active_trust_record, append_trust_record, query_trust_records,
118    resolve_agent_autonomy_tier, summarize_trust_records, topic_for_agent, AutonomyTier,
119    TrustAgentSummary, TrustOutcome, TrustQueryFilters, TrustRecord, OPENTRUSTGRAPH_SCHEMA_V0,
120    TRUST_GRAPH_GLOBAL_TOPIC, TRUST_GRAPH_TOPIC_PREFIX,
121};
122pub use value::*;
123pub use vm::*;
124
125/// Lex, parse, type-check, and compile source to bytecode in one call.
126/// Bails on the first type error. For callers that need diagnostics
127/// rather than early exit, use `harn_parser::check_source` directly
128/// and then call `Compiler::new().compile(&program)`.
129pub fn compile_source(source: &str) -> Result<Chunk, String> {
130    let program = harn_parser::check_source_strict(source).map_err(|e| e.to_string())?;
131    Compiler::new().compile(&program).map_err(|e| e.to_string())
132}
133
134pub fn json_schema_for_type_expr(type_expr: &harn_parser::TypeExpr) -> Option<serde_json::Value> {
135    let schema = compiler::Compiler::type_expr_to_schema_value(type_expr)?;
136    let json_schema = schema::schema_to_json_schema_value(&schema).ok()?;
137    Some(llm::vm_value_to_json(&json_schema))
138}
139
140pub fn json_schema_for_typed_params(params: &[harn_parser::TypedParam]) -> serde_json::Value {
141    let mut properties = serde_json::Map::new();
142    let mut required = Vec::new();
143
144    for param in params {
145        let param_schema = param
146            .type_expr
147            .as_ref()
148            .and_then(json_schema_for_type_expr)
149            .unwrap_or_else(|| serde_json::json!({}));
150        if param.default_value.is_none() {
151            required.push(serde_json::Value::String(param.name.clone()));
152        }
153        properties.insert(param.name.clone(), param_schema);
154    }
155
156    let mut schema = serde_json::Map::new();
157    schema.insert(
158        "type".to_string(),
159        serde_json::Value::String("object".to_string()),
160    );
161    schema.insert(
162        "properties".to_string(),
163        serde_json::Value::Object(properties),
164    );
165    if !required.is_empty() {
166        schema.insert("required".to_string(), serde_json::Value::Array(required));
167    }
168    serde_json::Value::Object(schema)
169}
170
171/// Reset all thread-local state that can leak between test runs.
172pub fn reset_thread_local_state() {
173    llm::reset_llm_state();
174    llm_config::clear_user_overrides();
175    http::reset_http_state();
176    event_log::reset_active_event_log();
177    stdlib::reset_stdlib_state();
178    connectors::clear_active_connector_clients();
179    orchestration::clear_runtime_hooks();
180    triggers::clear_dispatcher_state();
181    triggers::clear_trigger_registry();
182    events::reset_event_sinks();
183    agent_events::reset_all_sinks();
184    agent_sessions::reset_session_store();
185    mcp_registry::reset();
186}