Skip to main content

roder_ext_chrome/
extension.rs

1use std::sync::Arc;
2
3use roder_api::capabilities::CapabilityRequest;
4use roder_api::extension::{
5    ExtensionManifest, ExtensionRegistryBuilder, ProvidedService, RoderExtension,
6};
7use semver::Version;
8
9use crate::tools::ChromeToolContributor;
10
11/// The Roder Chrome browser-control extension. Registers the model-facing
12/// `chrome_*` tools, bound to the live process browser bridge.
13pub struct ChromeExtension;
14
15impl ChromeExtension {
16    pub fn new() -> Self {
17        Self
18    }
19}
20
21impl Default for ChromeExtension {
22    fn default() -> Self {
23        Self::new()
24    }
25}
26
27impl RoderExtension for ChromeExtension {
28    fn manifest(&self) -> ExtensionManifest {
29        ExtensionManifest {
30            id: "roder-ext-chrome".to_string(),
31            name: "Chrome Browser Control".to_string(),
32            version: Version::new(0, 1, 0),
33            api_version: "0.1.0".to_string(),
34            description: Some(
35                "Inspect, control, debug, and record the user's live Chrome session through the \
36                 Roder browser extension bridge."
37                    .to_string(),
38            ),
39            provides: vec![ProvidedService::ToolProvider("chrome".to_string())],
40            required_capabilities: vec![
41                CapabilityRequest::new("network.web"),
42                CapabilityRequest::new("fs.readwrite.roder-home"),
43            ],
44        }
45    }
46
47    fn install(&self, registry: &mut ExtensionRegistryBuilder) -> anyhow::Result<()> {
48        registry.tool_contributor(Arc::new(ChromeToolContributor::new()));
49        Ok(())
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn manifest_provides_chrome_tools() {
59        let manifest = ChromeExtension.manifest();
60        assert!(
61            manifest
62                .provides
63                .contains(&ProvidedService::ToolProvider("chrome".to_string()))
64        );
65    }
66
67    #[test]
68    fn extension_installs_into_registry() {
69        let mut builder = ExtensionRegistryBuilder::new();
70        builder.install(ChromeExtension::new()).expect("install");
71        let registry = builder.build().expect("build");
72        assert!(
73            registry
74                .provided_services()
75                .contains(&ProvidedService::ToolProvider("chrome".to_string()))
76        );
77    }
78}