65 lines
2.0 KiB
Rust
65 lines
2.0 KiB
Rust
use etcetera::AppStrategyArgs;
|
|
use once_cell::sync::Lazy;
|
|
use rmcp::{ServerHandler, ServiceExt};
|
|
use std::collections::HashMap;
|
|
|
|
// NOTE: "Block" is kept here for backwards compatibility with existing
|
|
// user config/data directories. Changing this would orphan existing installations.
|
|
pub static APP_STRATEGY: Lazy<AppStrategyArgs> = Lazy::new(|| AppStrategyArgs {
|
|
top_level_domain: "Block".to_string(),
|
|
author: "Block".to_string(),
|
|
app_name: "goose".to_string(),
|
|
});
|
|
|
|
pub mod autovisualiser;
|
|
pub mod computercontroller;
|
|
pub mod mcp_server_runner;
|
|
mod memory;
|
|
#[cfg(target_os = "macos")]
|
|
pub mod peekaboo;
|
|
pub mod subprocess;
|
|
pub mod tutorial;
|
|
|
|
pub use autovisualiser::AutoVisualiserRouter;
|
|
pub use computercontroller::ComputerControllerServer;
|
|
pub use memory::MemoryServer;
|
|
pub use tutorial::TutorialServer;
|
|
|
|
/// Type definition for a function that spawns and serves a builtin extension server
|
|
pub type SpawnServerFn = fn(tokio::io::DuplexStream, tokio::io::DuplexStream);
|
|
|
|
fn spawn_and_serve<S>(
|
|
name: &'static str,
|
|
server: S,
|
|
transport: (tokio::io::DuplexStream, tokio::io::DuplexStream),
|
|
) where
|
|
S: ServerHandler + Send + 'static,
|
|
{
|
|
tokio::spawn(async move {
|
|
match server.serve(transport).await {
|
|
Ok(running) => {
|
|
let _ = running.waiting().await;
|
|
}
|
|
Err(e) => tracing::error!(builtin = name, error = %e, "server error"),
|
|
}
|
|
});
|
|
}
|
|
|
|
macro_rules! builtin {
|
|
($name:ident, $server_ty:ty) => {{
|
|
fn spawn(r: tokio::io::DuplexStream, w: tokio::io::DuplexStream) {
|
|
spawn_and_serve(stringify!($name), <$server_ty>::new(), (r, w));
|
|
}
|
|
(stringify!($name), spawn as SpawnServerFn)
|
|
}};
|
|
}
|
|
|
|
pub static BUILTIN_EXTENSIONS: Lazy<HashMap<&'static str, SpawnServerFn>> = Lazy::new(|| {
|
|
HashMap::from([
|
|
builtin!(autovisualiser, AutoVisualiserRouter),
|
|
builtin!(computercontroller, ComputerControllerServer),
|
|
builtin!(memory, MemoryServer),
|
|
builtin!(tutorial, TutorialServer),
|
|
])
|
|
});
|