feat: add permission modes and CLI orchestration layer
Permission Modes: - Add default/plan/auto_accept modes controlling tool access - Plan mode restricts Task agent to read-only tools only - Auto-accept mode bypasses approval prompts (with confirmation) Approval Scaffolding: - Add ApprovalRule/ApprovalRuleSet for granular tool control - Pattern-based matching on tool name and arguments - Default rules for common safe/dangerous patterns - Prep for future bidirectional approval flow CLI Refactor: - Default to Task agent (main orchestrator) - Add --mode flag and runtime mode switching - Integrate prompt_toolkit for better UX: - Persistent command history (~/.webber_history) - Tab completion for commands and file paths - Auto-suggest from history - Deprecate standalone 'explore' command Other: - Split CHANGELOG.md into per-package files - Update AGENTS.md release procedure for both packages Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,20 +2,36 @@
|
||||
Webber API client.
|
||||
|
||||
Communicates with the Webber API backend for agent execution.
|
||||
Supports permission modes for controlling agent tool access.
|
||||
"""
|
||||
import json
|
||||
import httpx
|
||||
from collections.abc import AsyncIterator
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
from typing import Any
|
||||
|
||||
|
||||
class PermissionMode(str, Enum):
|
||||
"""
|
||||
Permission modes controlling agent tool access.
|
||||
|
||||
- default: All tools available (approval may be required)
|
||||
- plan: Read-only tools only
|
||||
- auto_accept: All tools, no approval prompts
|
||||
"""
|
||||
default = "default"
|
||||
plan = "plan"
|
||||
auto_accept = "auto_accept"
|
||||
|
||||
|
||||
@dataclass
|
||||
class AgentResponse:
|
||||
"""Response from agent execution."""
|
||||
response: str
|
||||
agent_type: str
|
||||
success: bool
|
||||
mode: PermissionMode = PermissionMode.default
|
||||
error: str | None = None
|
||||
|
||||
|
||||
@@ -104,14 +120,16 @@ class WebberClient:
|
||||
agent_type: str,
|
||||
prompt: str,
|
||||
working_dir: str = ".",
|
||||
mode: PermissionMode = PermissionMode.default,
|
||||
) -> AgentResponse:
|
||||
"""
|
||||
Run an agent with the given prompt.
|
||||
|
||||
Args:
|
||||
agent_type: Type of agent (e.g., "explore")
|
||||
agent_type: Type of agent (e.g., "task")
|
||||
prompt: User prompt/query
|
||||
working_dir: Working directory for the agent
|
||||
mode: Permission mode controlling tool access
|
||||
|
||||
Returns:
|
||||
AgentResponse with the result
|
||||
@@ -123,6 +141,7 @@ class WebberClient:
|
||||
"agent_type": agent_type,
|
||||
"prompt": prompt,
|
||||
"working_dir": working_dir,
|
||||
"mode": mode.value,
|
||||
},
|
||||
)
|
||||
response.raise_for_status()
|
||||
@@ -131,6 +150,7 @@ class WebberClient:
|
||||
response=data.get("response", ""),
|
||||
agent_type=data.get("agent_type", agent_type),
|
||||
success=data.get("success", True),
|
||||
mode=PermissionMode(data.get("mode", "default")),
|
||||
error=data.get("error"),
|
||||
)
|
||||
|
||||
@@ -139,14 +159,16 @@ class WebberClient:
|
||||
agent_type: str,
|
||||
prompt: str,
|
||||
working_dir: str = ".",
|
||||
mode: PermissionMode = PermissionMode.default,
|
||||
) -> AsyncIterator[str]:
|
||||
"""
|
||||
Run an agent with streaming response.
|
||||
|
||||
Args:
|
||||
agent_type: Type of agent (e.g., "explore")
|
||||
agent_type: Type of agent (e.g., "task")
|
||||
prompt: User prompt/query
|
||||
working_dir: Working directory for the agent
|
||||
mode: Permission mode controlling tool access
|
||||
|
||||
Yields:
|
||||
Text chunks as they arrive
|
||||
@@ -163,6 +185,7 @@ class WebberClient:
|
||||
"agent_type": agent_type,
|
||||
"prompt": prompt,
|
||||
"working_dir": working_dir,
|
||||
"mode": mode.value,
|
||||
},
|
||||
) as response:
|
||||
response.raise_for_status()
|
||||
|
||||
Reference in New Issue
Block a user