1#![recursion_limit = "256"]
2
3pub mod agent_teams;
4pub mod app;
5pub mod audit;
6pub mod automation_v2;
7pub mod browser;
8pub mod bug_monitor;
9pub mod bug_monitor_github;
10pub mod capability_resolver;
11pub mod config;
12pub mod http;
13pub mod mcp_catalog;
14pub mod mcp_catalog_generated;
15pub mod memory;
16pub mod optimization;
17pub mod pack_builder;
18pub mod pack_manager;
19pub mod preset_composer;
20pub mod preset_registry;
21pub mod preset_summary;
22pub mod routines;
23pub mod runtime;
24pub mod shared_resources;
25pub mod util;
26pub mod webui;
27pub mod workflows;
28
29pub use app::startup::*;
30pub use app::state::automation::lifecycle::record_automation_lifecycle_event_with_metadata;
31pub use app::state::*;
32pub use app::tasks::run_session_context_run_journaler;
33pub use automation_v2::types::*;
34pub use browser::*;
35pub use bug_monitor::types::*;
36pub use config::channels::*;
37pub use http::*;
38pub use memory::types::*;
39pub use optimization::*;
40pub use routines::errors::*;
41pub use routines::types::*;
42pub use runtime::lease::*;
43pub use runtime::runs::*;
44pub use runtime::state::*;
45pub use runtime::worktrees::*;
46pub use shared_resources::types::*;
47pub use tandem_types::EngineEvent;
48pub use tandem_workflows::{WorkflowRunRecord, WorkflowRunStatus, WorkflowSourceRef};
49pub use util::build::*;
50pub use util::host::*;
51pub use util::time::*;
52pub use workflows::{
53 dispatch_workflow_event, execute_workflow, run_workflow_dispatcher, simulate_workflow_event,
54};
55
56pub fn normalize_absolute_workspace_root(raw: &str) -> Result<String, String> {
57 let trimmed = raw.trim();
58 if trimmed.is_empty() {
59 return Err("workspace_root is required".to_string());
60 }
61 let as_path = std::path::PathBuf::from(trimmed);
62 if !as_path.is_absolute() {
63 return Err("workspace_root must be an absolute path".to_string());
64 }
65 tandem_core::normalize_workspace_path(trimmed)
66 .ok_or_else(|| "workspace_root is invalid".to_string())
67}