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
159pub 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
205pub 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}