Skip to main content

soma_application/provider_registry/
reports.rs

1use serde_json::{json, Value};
2
3use super::{provider_tool_surface_enabled, ProviderSurface, RegistrySnapshot};
4
5impl RegistrySnapshot {
6    /// A compact JSON summary confirming the snapshot validated: fingerprint,
7    /// provider/action/validator counts, and the action list.
8    pub fn validation_summary(&self) -> Value {
9        let actions = self.action_names();
10        json!({
11            "schema_version": 1,
12            "ok": true,
13            "provider_fingerprint": self.fingerprint.clone(),
14            "provider_count": self.catalogs.len(),
15            "action_count": actions.len(),
16            "compiled_validator_count": self.compiled_validator_count,
17            "actions": actions
18        })
19    }
20
21    /// A detailed JSON report of every provider in the snapshot — its
22    /// tools, prompts, resources, per-surface enablement, and runtime
23    /// security posture — for inspection endpoints.
24    pub fn inspection_report(&self) -> Value {
25        let providers = self
26            .catalogs
27            .iter()
28            .map(|catalog| {
29                let kind = catalog.provider.kind.as_str();
30                let tools = catalog
31                    .tools
32                    .iter()
33                    .map(|tool| {
34                        let rest_enabled =
35                            provider_tool_surface_enabled(tool, ProviderSurface::Rest);
36                        let generic_rest = rest_enabled.then(|| {
37                            json!({
38                                "enabled": true,
39                                "method": "POST",
40                                "path": format!("/v1/tools/{}", tool.name),
41                            })
42                        });
43                        json!({
44                            "name": tool.name.clone(),
45                            "title": tool.title.clone(),
46                            "description": tool.description.clone(),
47                            "input_schema": tool.input_schema.clone(),
48                            "output_schema": tool.output_schema.clone(),
49                            "scope": tool.scope.clone(),
50                            "destructive": tool.destructive,
51                            "requires_admin": tool.requires_admin,
52                            "surfaces": {
53                                "mcp": provider_tool_surface_enabled(tool, ProviderSurface::Mcp),
54                                "rest": rest_enabled,
55                                "cli": provider_tool_surface_enabled(tool, ProviderSurface::Cli),
56                                "palette": provider_tool_surface_enabled(tool, ProviderSurface::Palette)
57                            },
58                            "rest": tool.rest.clone(),
59                            "cli": tool.cli.clone(),
60                            "generic_rest": generic_rest,
61                            "limits": tool.limits.clone(),
62                            "env": tool.env.clone(),
63                        })
64                    })
65                    .collect::<Vec<_>>();
66                let prompts = catalog
67                    .prompts
68                    .iter()
69                    .map(|prompt| {
70                        json!({
71                            "name": prompt.name.clone(),
72                            "description": prompt.description.clone(),
73                            "template": prompt.template.clone(),
74                            "arguments_schema": prompt.arguments_schema.clone(),
75                            "scope": prompt.scope.clone(),
76                            "surfaces": {
77                                "mcp": prompt.mcp.as_ref().map(|mcp| mcp.enabled).unwrap_or(true)
78                            },
79                            "examples": prompt.examples.clone(),
80                        })
81                    })
82                    .collect::<Vec<_>>();
83                let resources = catalog
84                    .resources
85                    .iter()
86                    .map(|resource| {
87                        json!({
88                            "name": resource.name.clone(),
89                            "uri_template": resource.uri_template.clone(),
90                            "description": resource.description.clone(),
91                            "mime_type": resource.mime_type.clone(),
92                            "scope": resource.scope.clone(),
93                            "surfaces": {
94                                "mcp": resource.mcp.as_ref().map(|mcp| mcp.enabled).unwrap_or(true)
95                            },
96                            "annotations": resource.annotations.clone(),
97                        })
98                    })
99                    .collect::<Vec<_>>();
100                json!({
101                    "name": catalog.provider.name.clone(),
102                    "kind": kind,
103                    "title": catalog.provider.title.clone(),
104                    "enabled": catalog.provider.enabled.unwrap_or(true),
105                    "version": catalog.provider.version.clone(),
106                    "source": catalog.provider.source.clone(),
107                    "declared_capabilities": catalog.capabilities.clone(),
108                    "runtime_security": provider_runtime_security(kind),
109                    "tools": tools,
110                    "prompts": prompts,
111                    "resources": resources,
112                })
113            })
114            .collect::<Vec<_>>();
115        json!({
116            "schema_version": 1,
117            "provider_fingerprint": self.fingerprint.clone(),
118            "compiled_validator_count": self.compiled_validator_count,
119            "actions": self.action_names(),
120            "providers": providers,
121        })
122    }
123}
124
125fn provider_runtime_security(kind: &str) -> Value {
126    match kind {
127        "wasm" => json!({
128            "runtime": "wasmtime",
129            "trust": "sandboxed",
130            "capability_enforcement": "registry broker enforces declared host capabilities before dispatch"
131        }),
132        "ai-sdk" | "python" | "langchain" | "llamaindex" => json!({
133            "runtime": "sidecar-process",
134            "trust": "trusted-local-code",
135            "capability_enforcement": "registry broker enforces declared host capabilities before dispatch"
136        }),
137        "openapi" | "mcp" => json!({
138            "runtime": "remote-or-upstream",
139            "trust": "upstream-service",
140            "capability_enforcement": "registry broker enforces declared host capabilities before dispatch"
141        }),
142        _ => json!({
143            "runtime": "in-process",
144            "trust": "trusted-binary",
145            "capability_enforcement": "registry broker enforces declared host capabilities before dispatch"
146        }),
147    }
148}
149
150#[cfg(test)]
151#[path = "reports_tests.rs"]
152mod tests;