OpenSpace/openspace/grounding/core/permissions/snapshot.py
2026-07-17 11:43:42 +08:00

105 lines
3.1 KiB
Python

"""Small runtime helpers for permission mode and rule inspection."""
from __future__ import annotations
from pathlib import Path
from typing import Any, Mapping
from .loader import load_tool_permission_context, persist_permission_updates
from .types import (
EXTERNAL_PERMISSION_MODES,
PermissionMode,
SetModeUpdate,
ToolPermissionContext,
)
def _cwd(cwd: str | None = None) -> str:
return str(Path(cwd).expanduser() if cwd else Path.cwd())
def set_session_permission_mode(mode: str, cwd: str | None = None) -> None:
"""Set the live session permission mode through the new runtime store."""
if mode not in EXTERNAL_PERMISSION_MODES:
raise ValueError(f"Unsupported permission mode: {mode!r}")
persist_permission_updates(
(
SetModeUpdate(
destination="session",
mode=mode, # type: ignore[arg-type]
),
),
_cwd(cwd),
)
def load_permission_context(
cwd: str | None = None,
mode: PermissionMode | None = None,
) -> ToolPermissionContext:
"""Load the effective permission context for a workspace."""
return load_tool_permission_context(_cwd(cwd), mode)
def get_permission_mode(
cwd: str | None = None,
mode: PermissionMode | None = None,
) -> str:
"""Return the effective permission mode for a workspace."""
return str(load_permission_context(cwd, mode).mode)
def build_permission_rules_snapshot(
cwd: str | None = None,
mode: PermissionMode | None = None,
) -> dict[str, Any]:
"""Return a display-oriented snapshot of effective permission rules."""
context = load_permission_context(cwd, mode)
persistent_sources = {"userSettings", "projectSettings", "localSettings"}
session_sources = {"session", "cliArg", "command"}
result: dict[str, Any] = {
"mode": {"current": context.mode},
"session": {},
"persistent": {},
"allow": {},
"deny": {},
"ask": {},
"rules_by_source": {},
"additional_working_directories": {
path: value.source
for path, value in dict(context.additional_working_directories).items()
},
}
for behavior, attr in (
("allow", "always_allow_rules"),
("deny", "always_deny_rules"),
("ask", "always_ask_rules"),
):
rules_by_source: Mapping[str, tuple[str, ...]] = getattr(context, attr)
behavior_rules: dict[str, str] = {}
source_snapshot: dict[str, list[str]] = {}
for source, rules in rules_by_source.items():
source_snapshot[str(source)] = list(rules)
for rule in rules:
behavior_rules[str(rule)] = behavior
if source in persistent_sources:
result["persistent"][str(rule)] = behavior
elif source in session_sources:
result["session"][str(rule)] = behavior
result[behavior] = behavior_rules
result["rules_by_source"][behavior] = source_snapshot
return result
__all__ = [
"build_permission_rules_snapshot",
"get_permission_mode",
"load_permission_context",
"set_session_permission_mode",
]