#[cfg(all(
windows,
not(all(
target_vendor = "pc",
target_env = "msvc",
any(target_arch = "x86_64", target_arch = "aarch64")
))
))]
compile_error!(
"Pitboard for Windows is built for x86_64-pc-windows-msvc and aarch64-pc-windows-msvc \
alone, the targets it is built and tested on."
);
#[cfg(not(any(target_os = "macos", target_os = "linux", windows)))]
compile_error!(
"Pitboard runs on macOS, Linux and Windows. Another system needs a host of its own in \
`host/`, saying where its stores, processes and scheduler are."
);
pub(crate) mod api;
pub mod app;
pub mod assumptions;
pub mod audit;
pub mod context;
#[cfg(any(test, feature = "test-support"))]
#[doc(hidden)]
pub mod desktop_testing;
pub mod doctor;
pub mod duty;
pub mod error;
pub(crate) mod in_use;
pub mod label;
pub mod provider;
pub mod redact;
pub mod release;
pub mod schedule;
pub mod service;
pub(crate) mod settings;
pub mod state;
pub mod status;
pub mod statusline;
pub mod switch;
pub mod time;
pub mod usage;
pub mod words;
pub(crate) mod atomic;
pub(crate) mod fault;
pub mod holder;
pub(crate) mod home;
pub mod host;
pub(crate) mod lock;
pub(crate) mod park;
pub(crate) mod pending;
pub(crate) mod proxy;
pub(crate) mod sessions;
#[cfg(any(test, feature = "test-support"))]
#[doc(hidden)]
pub mod stand_in;
pub(crate) mod store;
#[cfg(feature = "test-support")]
#[doc(hidden)]
pub mod testing {
pub use crate::api::scripted::{Answer, Asked, ScriptedApi, Trouble};
pub use crate::desktop_testing as desktop;
pub use crate::duty::warm::run::{Started, WarmScript};
pub use crate::host::Ran;
pub use crate::host::fs::testing as fs;
pub use crate::host::memory::MemoryHost;
pub use crate::provider::claude::api::Renewed;
pub use crate::provider::claude::paths::live_service;
pub use crate::provider::claude::slot::{LIVE_SERVICE, dir_hash, service_for_dir};
pub use crate::stand_in;
pub use crate::store::memory::{Fault, MemoryStore};
pub use crate::store::vault_read;
pub use crate::switch::enroll::{ScriptedSignIn, SignInScript};
pub use crate::time::{Clock, FixedClock};
pub fn variables() -> impl Iterator<Item = &'static str> {
crate::context::variables()
}
pub fn lies_in(path: &std::path::Path, place: &std::path::Path) -> bool {
crate::host::lies_in(path, place)
}
pub fn real_login_places(
started_in: &crate::context::Context,
) -> Result<Vec<std::path::PathBuf>, String> {
use crate::host::user;
let home = user::accounts_own_home().ok_or("this system names no home for this account")?;
let pitboard = user::accounts_own_pitboard_home()
.ok_or("this system names no Pitboard folder for this account")?;
let own = crate::context::Context::new(home).with_pitboard_home(pitboard);
Ok([&own, started_in]
.into_iter()
.flat_map(|ctx| {
[
crate::provider::claude::paths::config_dir(ctx),
crate::provider::claude::paths::config_file(ctx),
crate::provider::codex::paths::home(ctx),
ctx.pitboard_home.clone(),
ctx.home.join("Library/Application Support/Claude"),
ctx.home.join("Library/Application Support/Claude-3p"),
std::path::PathBuf::from("/Applications/Claude.app"),
]
})
.filter(|place| place.is_absolute())
.collect())
}
pub fn vault_write(
ctx: &crate::context::Context,
service: &str,
contents: &str,
) -> crate::error::Result<()> {
let permit = crate::service::gate(ctx)?;
Ok(crate::store::vault_write(ctx, permit, service, contents)?)
}
pub fn vault_delete(ctx: &crate::context::Context, service: &str) -> crate::error::Result<()> {
let permit = crate::service::gate(ctx)?;
Ok(crate::store::vault_delete(ctx, permit, service)?)
}
pub fn signed_in(
ctx: &crate::context::Context,
which: crate::provider::ProviderId,
document: &str,
) -> crate::error::Result<crate::switch::SignIn> {
use crate::provider::LoginKind;
let document = serde_json::from_str(document).expect("a login a test wrote as JSON");
match crate::provider::of(which) {
LoginKind::Document(tool) => {
crate::switch::planted(ctx, crate::service::gate(ctx)?, tool, document)
}
LoginKind::Folder(_) => Err(crate::error::Error::Usage(
"a Claude Desktop sign-in is played by testing::desktop".into(),
)),
}
}
}