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