feat: role-based tool access, confirmation gates, and new orchestrator tools
- auth_utils: get_user_role() reads role from auth.json (admin|user, default user) - manage_passwords: new `role` command to promote/demote users (admin-only by convention) - tools/__init__: TOOL_ROLES map, CONFIRM_REQUIRED set, get_tools_for_role(), get_openai_tools_for_role() — both orchestrators now filter tools by caller's role - tools/system: cortex_restart (detached subprocess, 5s delay), cortex_logs (admin-only) - tools/web: http_fetch — direct URL fetch, distinct from web_search - tools/files: file_list (directory listing), file_write (restricted paths, admin-only) - tools/notify: nc_talk_send — proactive outbound via notification.py - orchestrator_engine + openai_orchestrator: user_role param; CONFIRM_REQUIRED tools return a confirmation-request result instead of executing — loop breaks after Claude asks user to confirm in a follow-up message - home/scott/auth.json: role set to admin Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -115,6 +115,16 @@ def get_user_gemini_key(username: str) -> str | None:
|
||||
return _read_auth(username).get("gemini_api_key") or None
|
||||
|
||||
|
||||
def get_user_role(username: str) -> str:
|
||||
"""Return the user's role: 'admin' or 'user' (default).
|
||||
|
||||
Role is stored as auth.json["role"]. Any unrecognised value falls back to 'user'.
|
||||
Set via: manage_passwords.py role <username> admin|user
|
||||
"""
|
||||
role = _read_auth(username).get("role", "user")
|
||||
return role if role in ("admin", "user") else "user"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# JWT helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user