use std::sync::Arc;
use serde::{Deserialize, Serialize};
use trusty_common::uds::server::RpcRouter;
use crate::daemon::api::claude_config_routes as cc;
use crate::daemon::state::DaemonState;
use super::core_ops;
#[cfg(test)]
#[path = "core_tests.rs"]
mod tests;
pub const METHODS: &[&str] = &[
"mpm.health",
"mpm.doctor",
"mpm.errors.list",
"mpm.report_bug",
"mpm.breakers",
"mpm.optimizer",
"mpm.overseer",
"mpm.llm.chat",
"mpm.tmux.sessions",
"mpm.tmux.snapshot",
"mpm.tmux.adopt",
"mpm.claude_config.get",
"mpm.claude_config.apply",
"mpm.claude_config.checkpoints.list",
"mpm.claude_config.checkpoints.create",
"mpm.claude_config.checkpoints.delete",
"mpm.claude_config.restore",
"mpm.claude_config.profiles",
"mpm.claude_config.deploy",
"mpm.claude_config.restart",
];
#[derive(Debug, Clone, Copy, Default, Serialize)]
pub struct NoParams;
impl<'de> Deserialize<'de> for NoParams {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
serde::de::IgnoredAny::deserialize(deserializer)?;
Ok(NoParams)
}
}
#[derive(Debug, Deserialize)]
pub struct TmuxSnapshotParams {
pub name: String,
}
pub fn register(router: RpcRouter, state: &Arc<DaemonState>) -> RpcRouter {
macro_rules! ok {
($router:expr, $name:literal, $req:ty, $resp:ty, |$s:ident, $r:ident| $call:expr) => {{
let held = Arc::clone(state);
$router.typed::<$req, $resp, _, _>($name, move |$r| {
let $s = Arc::clone(&held);
async move { Ok($call) }
})
}};
}
macro_rules! fallible {
($router:expr, $name:literal, $req:ty, $resp:ty, |$s:ident, $r:ident| $call:expr) => {{
let held = Arc::clone(state);
$router.typed::<$req, $resp, _, _>($name, move |$r| {
let $s = Arc::clone(&held);
async move { $call.map_err(Into::into) }
})
}};
}
use crate::daemon::api::types as t;
use crate::daemon::api::{AdoptRequest, DoctorQuery, ErrorsQuery, ReportBugApiRequest};
let r = router;
let r = ok!(r, "mpm.health", NoParams, t::HealthResponse, |s, _p| {
core_ops::health(&s).await
});
let r = ok!(
r,
"mpm.doctor",
DoctorQuery,
crate::core::doctor::DoctorReport,
|s, p| core_ops::doctor(&s, p).await
);
let r = ok!(
r,
"mpm.errors.list",
ErrorsQuery,
t::ErrorsResponse,
|s, p| core_ops::list_errors(&s, p)
);
let r = ok!(
r,
"mpm.report_bug",
ReportBugApiRequest,
t::ReportBugHttpResponse,
|s, p| core_ops::report_bug(&s, p).await
);
let r = ok!(r, "mpm.breakers", NoParams, t::BreakersResponse, |s, _p| {
core_ops::breakers(&s)
});
let r = ok!(
r,
"mpm.optimizer",
NoParams,
t::OptimizerResponse,
|s, _p| core_ops::optimizer(&s)
);
let r = ok!(r, "mpm.overseer", NoParams, t::OverseerResponse, |s, _p| {
core_ops::overseer(&s)
});
let r = fallible!(
r,
"mpm.llm.chat",
t::LlmChatRequest,
t::LlmChatResponse,
|s, p| core_ops::llm_chat(&s, p).await
);
let r = ok!(
r,
"mpm.tmux.sessions",
NoParams,
t::TmuxSessionsResponse,
|s, _p| core_ops::list_tmux_sessions(&s)
);
let r = fallible!(
r,
"mpm.tmux.snapshot",
TmuxSnapshotParams,
t::TmuxSnapshotResponse,
|s, p| core_ops::tmux_snapshot(&s, &p.name)
);
let r = fallible!(
r,
"mpm.tmux.adopt",
AdoptRequest,
t::AdoptResponse,
|s, p| core_ops::adopt_tmux(&s, p)
);
let r = ok!(
r,
"mpm.claude_config.get",
cc::ClaudeConfigQuery,
t::ClaudeConfigResponse,
|s, p| cc::get_claude_config_op(&s, p)
);
let r = fallible!(
r,
"mpm.claude_config.apply",
cc::ApplyConfigRequest,
t::ApplyConfigResponse,
|s, p| cc::apply_claude_config_op(&s, p)
);
let r = ok!(
r,
"mpm.claude_config.checkpoints.list",
cc::CheckpointQuery,
t::CheckpointsResponse,
|s, p| cc::list_checkpoints_op(&s, p)
);
let r = fallible!(
r,
"mpm.claude_config.checkpoints.create",
cc::CreateCheckpointRequest,
t::CreateCheckpointResponse,
|s, p| cc::create_checkpoint_op(&s, p)
);
let r = fallible!(
r,
"mpm.claude_config.checkpoints.delete",
cc::DeleteCheckpointParams,
t::DeleteCheckpointResponse,
|s, p| cc::delete_checkpoint_op(&s, p)
);
let r = fallible!(
r,
"mpm.claude_config.restore",
cc::RestoreRequest,
t::RestoreResponse,
|s, p| cc::restore_checkpoint_op(&s, p)
);
let r = ok!(
r,
"mpm.claude_config.profiles",
NoParams,
t::ProfilesResponse,
|s, _p| cc::list_profiles_op(&s)
);
let r = fallible!(
r,
"mpm.claude_config.deploy",
cc::DeployProfileRequest,
t::DeployProfileResponse,
|s, p| cc::deploy_profile_op(&s, p)
);
fallible!(
r,
"mpm.claude_config.restart",
cc::RestartRequest,
t::RestartResponse,
|s, p| cc::restart_claude_code_op(&s, p).await
)
}