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