feat(plugins): discover packages and persist state

This commit is contained in:
2026-06-16 11:40:31 +08:00
parent 7020f2d67f
commit 41b45e0423
15 changed files with 1127 additions and 0 deletions

View File

@ -8,6 +8,7 @@ from .schema import (
BeaverConfig,
EmbeddingConfig,
MCPServerConfig,
PluginsConfig,
ProviderConfig,
ToolsConfig,
)
@ -19,6 +20,7 @@ __all__ = [
"BeaverConfig",
"EmbeddingConfig",
"MCPServerConfig",
"PluginsConfig",
"ProviderConfig",
"ToolsConfig",
"default_config_path",

View File

@ -16,6 +16,7 @@ from .schema import (
ChannelConfig,
EmbeddingConfig,
MCPServerConfig,
PluginsConfig,
ProviderConfig,
ToolsConfig,
)
@ -73,6 +74,7 @@ def load_config(
providers=_parse_providers(data.get("providers")),
embedding=_parse_embedding(data),
tools=_parse_tools(data.get("tools")),
plugins=_parse_plugins(data.get("plugins")),
authz=_parse_authz(data.get("authz")),
channels=_parse_channels(data.get("channels")),
backend_identity=_parse_backend_identity(data.get("backend_identity") or data.get("backendIdentity")),
@ -188,6 +190,17 @@ def _parse_tools(raw: Any) -> ToolsConfig:
)
def _parse_plugins(raw: Any) -> PluginsConfig:
data = _as_dict(raw)
return PluginsConfig(
search_paths=_string_list(data.get("searchPaths") or data.get("search_paths")),
auto_sync=_bool(
data.get("autoSync") if "autoSync" in data else data.get("auto_sync"),
default=True,
),
)
def _parse_authz(raw: Any) -> AuthzConfig:
data = _as_dict(raw)
return AuthzConfig(

View File

@ -81,6 +81,14 @@ class ToolsConfig:
mcp_servers: dict[str, MCPServerConfig] = field(default_factory=dict)
@dataclass(slots=True)
class PluginsConfig:
"""Declarative plugin discovery settings."""
search_paths: list[str] = field(default_factory=list)
auto_sync: bool = True
@dataclass(slots=True)
class AuthzConfig:
"""External AuthZ service configuration."""
@ -123,6 +131,7 @@ class BeaverConfig:
providers: dict[str, ProviderConfig] = field(default_factory=dict)
embedding: EmbeddingConfig = field(default_factory=EmbeddingConfig)
tools: ToolsConfig = field(default_factory=ToolsConfig)
plugins: PluginsConfig = field(default_factory=PluginsConfig)
authz: AuthzConfig = field(default_factory=AuthzConfig)
channels: dict[str, ChannelConfig] = field(default_factory=dict)
backend_identity: BackendIdentityConfig = field(default_factory=BackendIdentityConfig)