Skip to main content

tandem_server/
lib.rs

1#![recursion_limit = "512"]
2
3use std::path::PathBuf;
4
5use tandem_types::EngineEvent;
6
7use tandem_workflows::{WorkflowRunRecord, WorkflowRunStatus, WorkflowSourceRef};
8
9mod agent_teams;
10pub mod app;
11mod automation_v2;
12#[cfg(feature = "browser")]
13mod browser;
14mod bug_monitor;
15mod bug_monitor_github;
16mod capability_resolver;
17mod config;
18mod http;
19mod mcp_catalog;
20mod memory;
21mod optimization;
22mod pack_builder;
23mod pack_manager;
24mod preset_composer;
25mod preset_registry;
26mod preset_summary;
27mod routines;
28mod runtime;
29mod shared_resources;
30mod util;
31pub mod webui;
32mod workflows;
33
34pub use agent_teams::AgentTeamRuntime;
35pub use automation_v2::types::{
36    AutomationAgentMcpPolicy, AutomationAgentProfile, AutomationAgentToolPolicy,
37    AutomationApprovalGate, AutomationExecutionPolicy, AutomationFailureRecord,
38    AutomationFlowInputRef, AutomationFlowNode, AutomationFlowOutputContract, AutomationFlowSpec,
39    AutomationGateDecisionRecord, AutomationLifecycleRecord, AutomationNodeOutput,
40    AutomationNodeStageKind, AutomationOutputEnforcement, AutomationOutputValidatorKind,
41    AutomationPendingGate, AutomationRunCheckpoint, AutomationRunStatus, AutomationStopKind,
42    AutomationV2RunRecord, AutomationV2Schedule, AutomationV2ScheduleType, AutomationV2Spec,
43    AutomationV2Status, AutomationValidatorSummary, WorkflowPlan, WorkflowPlanChatMessage,
44    WorkflowPlanConversation, WorkflowPlanDraftRecord, WorkflowPlanStep,
45};
46#[cfg(feature = "browser")]
47pub use browser::{
48    install_browser_sidecar, BrowserHealthSummary, BrowserSidecarInstallResult,
49    BrowserSmokeTestResult, BrowserSubsystem,
50};
51pub use bug_monitor::types::{
52    BugMonitorBindingCandidate, BugMonitorCapabilityMatch, BugMonitorCapabilityReadiness,
53    BugMonitorConfig, BugMonitorDraftRecord, BugMonitorIncidentRecord, BugMonitorLabelMode,
54    BugMonitorPostRecord, BugMonitorProviderPreference, BugMonitorReadiness,
55    BugMonitorRuntimeStatus, BugMonitorStatus, BugMonitorSubmission,
56};
57pub use capability_resolver::CapabilityResolver;
58pub use http::serve;
59pub use memory::types::{GovernedMemoryRecord, MemoryAuditEvent};
60pub use optimization::{
61    apply_optimization_execution_override, derive_phase1_metrics_from_run,
62    derive_phase1_validator_case_outcomes_from_run, establish_phase1_baseline,
63    evaluate_phase1_promotion, freeze_optimization_artifact, load_optimization_phase1_config,
64    optimization_snapshot_hash, parse_phase1_metrics, phase1_baseline_replay_due,
65    validate_phase1_candidate_mutation, validate_phase1_workflow_target, OptimizationArtifactRefs,
66    OptimizationBaselineReplayRecord, OptimizationBudgetPolicy, OptimizationCampaignRecord,
67    OptimizationCampaignStatus, OptimizationEvalSpec, OptimizationExecutionOverride,
68    OptimizationExperimentRecord, OptimizationExperimentStatus, OptimizationFrozenArtifact,
69    OptimizationFrozenArtifacts, OptimizationGuardrailKind, OptimizationMetricKind,
70    OptimizationMutableField, OptimizationMutationPolicy, OptimizationPhase1Config,
71    OptimizationPhase1Metrics, OptimizationPromotionDecision, OptimizationPromotionDecisionKind,
72    OptimizationSafetyScope, OptimizationTargetKind, OptimizationValidatedMutation,
73};
74pub use pack_manager::PackManager;
75pub use preset_composer::PromptComposeInput;
76pub use preset_registry::PresetRegistry;
77pub use routines::errors::RoutineStoreError;
78pub use routines::types::{
79    ExternalActionRecord, RoutineHistoryEvent, RoutineMisfirePolicy, RoutineRunArtifact,
80    RoutineRunRecord, RoutineRunStatus, RoutineSchedule, RoutineSessionPolicy, RoutineSpec,
81    RoutineStatus, RoutineTriggerPlan,
82};
83pub use runtime::lease::EngineLease;
84pub use runtime::runs::{ActiveRun, RunRegistry};
85pub use runtime::state::RuntimeState;
86pub use runtime::worktrees::ManagedWorktreeRecord;
87pub use shared_resources::types::{ResourceConflict, ResourceStoreError, SharedResourceRecord};
88pub use util::build::{
89    binary_modified_at_ms, binary_path_for_health, build_id, build_provenance, git_sha,
90};
91pub use util::host::detect_host_runtime_context;
92pub use util::time::now_ms;
93pub use workflows::{
94    canonical_workflow_event_names, dispatch_workflow_event, execute_hook_binding,
95    execute_workflow, parse_workflow_action, run_workflow_dispatcher, simulate_workflow_event,
96};
97
98pub(crate) fn normalize_absolute_workspace_root(raw: &str) -> Result<String, String> {
99    let trimmed = raw.trim();
100    if trimmed.is_empty() {
101        return Err("workspace_root is required".to_string());
102    }
103    let as_path = PathBuf::from(trimmed);
104    if !as_path.is_absolute() {
105        return Err("workspace_root must be an absolute path".to_string());
106    }
107    tandem_core::normalize_workspace_path(trimmed)
108        .ok_or_else(|| "workspace_root is invalid".to_string())
109}
110
111// Re-exports from app::state (impl AppState moved here)
112pub use crate::app::state::{
113    derive_status_index_update, evaluate_routine_execution_policy, sha256_hex, truncate_text,
114    AppState, ChannelRuntime, ChannelStatus, RoutineExecutionDecision, StatusIndexUpdate,
115};
116
117pub use crate::app::startup::{StartupSnapshot, StartupState, StartupStatus};
118
119pub use config::channels::{
120    ChannelsConfigFile, DiscordConfigFile, SlackConfigFile, TelegramConfigFile,
121};
122pub use config::webui::normalize_web_ui_prefix;
123pub use config::webui::WebUiConfig;
124
125// Also need normalize_allowed_users_or_wildcard?
126pub use crate::app::state::extract_persistable_tool_part;
127pub use crate::app::state::run_automation_v2_executor;
128pub use crate::app::state::{
129    automation_lifecycle_event_metadata_for_node, default_model_spec_from_effective_config,
130    record_automation_lifecycle_event, record_automation_lifecycle_event_with_metadata,
131    record_automation_workflow_state_events,
132};
133pub use crate::app::state::{
134    automation_node_required_output_path, clear_automation_subtree_outputs,
135    collect_automation_descendants, refresh_automation_runtime_state,
136};
137pub use crate::app::tasks::{
138    run_agent_team_supervisor, run_automation_v2_scheduler, run_bug_monitor,
139    run_optimization_scheduler, run_routine_executor, run_routine_scheduler,
140    run_session_context_run_journaler, run_session_part_persister, run_status_indexer,
141    run_usage_aggregator,
142};
143pub use config::channels::normalize_allowed_tools;
144pub use config::channels::normalize_allowed_users_or_wildcard;