soma_application/provider_registry/
reports.rs1use serde_json::{json, Value};
2
3use super::{provider_tool_surface_enabled, ProviderSurface, RegistrySnapshot};
4
5impl RegistrySnapshot {
6 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 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;