Skip to main content

horto_os_ui_shared/
lib.rs

1//! Horto box setup engine: modular versioned steps, kits, and ops.
2//!
3//! Surfaces (CLI, TUI, status-api) call this crate; they do not embed step logic.
4//!
5//! # Examples
6//!
7//! Dry-run the full pipeline against temporary host paths:
8//!
9//! ```
10//! use horto_os_ui_shared::{setup_run, ApplyMode, HostContext, HostPaths, SetupKind};
11//! use std::path::PathBuf;
12//!
13//! let root = PathBuf::from("/tmp/horto-doc-example");
14//! let _ = std::fs::create_dir_all(root.join("active_setup"));
15//! let paths = HostPaths {
16//!     active_setup: root.join("active_setup"),
17//!     backup: root.join("backup"),
18//!     docker: root.join("docker"),
19//!     etc: root.join("etc"),
20//!     lease_file: root.join("dnsmasq.leases"),
21//! };
22//! let mut ctx = HostContext::new(ApplyMode::DryRun, SetupKind::Full).with_paths(paths);
23//! setup_run(&mut ctx, SetupKind::Full).expect("dry-run");
24//! assert!(!ctx.logs.is_empty());
25//! ```
26
27pub mod build_info;
28pub mod context;
29pub mod embed;
30pub mod error;
31pub mod kits;
32pub mod ops;
33pub mod paths;
34pub mod pipeline;
35pub mod remote;
36pub mod resume;
37pub mod step;
38pub mod steps;
39pub mod tracing_init;
40
41pub use build_info::{footer_line, GIT_COMMIT, LONG_VERSION, VERSION};
42pub use context::{
43    require_root_for_apply, ApplyMode, HostContext, NonInteractivePrompts, PlannedAction,
44    PromptsProvider, StdioPrompts,
45};
46pub use error::{HortoError, Result};
47pub use ops::backup::{
48    backup_disk, backup_etc_initial, backup_etc_timestamped, backup_shrink, backup_status,
49    list_timestamped_etc_backups, plan_disk_backup, probe_disk_backup, BackupStatus,
50    DiskBackupFlags, DiskBackupOpts, DiskBackupProbe, EtcBackupReport, ShrinkBackupOpts,
51};
52pub use ops::catalog::{describe_container, describe_service};
53pub use ops::doctor::{doctor, DoctorFlags, DoctorReport};
54pub use ops::leases::{export_dhcp_leases, read_leases, LeaseEntry};
55pub use ops::runner::{setup_run, setup_step};
56pub use ops::status::{
57    box_status, service_urls, setup_status, BoxStatus, SetupStatusReport, UrlInfo,
58};
59pub use paths::HostPaths;
60pub use pipeline::{lookup, pipeline, SetupKind};
61pub use remote::{
62    classify_ssh_failure, finish_save_api_token, format_surfaces_report, http_get_label,
63    install_ecosystem_after_embedded_apply, install_ecosystem_services, local_api_token_path,
64    normalize_cli_version, offer_save_api_token, parse_api_token_drop, parse_remote_json,
65    probe_api_surface, probe_cli_surface, probe_mcp_surface, probe_remote_cli, probe_ssh_access,
66    probe_ssh_surface, probe_surfaces, pull_remote_api_token, read_local_api_token,
67    remote_box_snapshot, remote_cli_version_is_current, remote_doctor, remote_doctor_report_banner,
68    remote_ensure_ssh_key, remote_install_key_banner, remote_install_payload, remote_probe_arch,
69    remote_progress_message, remote_reboot, remote_reboot_with_sudo_password,
70    remote_run_banner_detail, remote_run_cli, remote_setup_run, remote_setup_status,
71    remote_upload_cli, resolve_local_ecosystem_bins, usable_api_token_hex, wants_reboot_now,
72    write_api_token_file, ApiSurfaceProbe, BoxArch, CliSurfaceProbe, EcosystemInstallChoice,
73    LocalBins, McpHostProbe, ProcessRunner, RemoteBoxCliStatus, RemoteBoxSnapshot, RemoteCliProbe,
74    RemoteOptions, RemoteOptionsInput, RemoteRunFlags, RemoteRunOutcome, RemoteRunRequest, SshEnv,
75    SshSession, SshSurfaceProbe, SurfaceProbeReport, SystemProcessRunner, BOX_BIN_NAMES,
76    DEFAULT_GITHUB_REPO, DEFAULT_INSTALL_DIR, DEFAULT_REMOTE_AGENT_DIR, MIN_API_TOKEN_HEX_LEN,
77};
78pub use resume::{is_stale, StepStatus};
79pub use step::Step;
80pub use tracing_init::init_tracing;
81
82pub use kits::docker::{
83    docker_available, docker_rebuild, list_containers, parse_docker_ps_lines, resolve_stack,
84    ContainerInfo,
85};