feat: add custom HeaderPanel widget and switchable agent modes
Replace built-in Header with a custom HeaderPanel showing model name, mode badge, and live token usage. Add AgentMode enum (normal/plan/auto) with mode-aware permission gating — Plan mode restricts to read-only tools, Auto mode auto-approves everything. Includes /mode slash command and Ctrl+P keybinding to cycle modes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,7 @@ import time
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
from app.agent.context import SessionContext
|
||||
from app.models.config import AppConfig
|
||||
from app.models.config import AgentMode, AppConfig
|
||||
from app.models.message import Message
|
||||
from app.models.tool_call import ToolCall, ToolResult, ToolResultStatus
|
||||
from app.services.llm import LLMClient, LLMConnectionError, LLMError, LLMStreamError
|
||||
@@ -59,6 +59,12 @@ class AgentLoop:
|
||||
self._skills = skills_manager
|
||||
self._skill_runner = skill_runner
|
||||
self._tools_schema = registry.get_openai_tools_schema()
|
||||
if self._permissions.mode == AgentMode.PLAN:
|
||||
read_only = PermissionsService.READ_ONLY_TOOLS
|
||||
self._tools_schema = [
|
||||
t for t in self._tools_schema
|
||||
if t["function"]["name"] in read_only
|
||||
]
|
||||
self._system_prompt = self._build_system_prompt()
|
||||
self._cancelled = False
|
||||
|
||||
@@ -89,6 +95,14 @@ class AgentLoop:
|
||||
f"\n\nCurrently active skill: {self._skill_runner.active_skill_name}. "
|
||||
"When the skill's objective is complete, call the `finish_skill` tool."
|
||||
)
|
||||
if self._permissions.mode == AgentMode.PLAN:
|
||||
prompt += (
|
||||
"\n\nYou are in PLAN mode. You may only use read-only tools: "
|
||||
"read_file, list_dir, grep_files, find_files, finish. "
|
||||
"Do NOT attempt to write files, edit code, or run commands. "
|
||||
"Instead, describe what changes you would make, which files "
|
||||
"you would modify, and provide the reasoning for each change."
|
||||
)
|
||||
return prompt
|
||||
|
||||
def _get_messages_with_system_prompt(self) -> list[Message]:
|
||||
|
||||
Reference in New Issue
Block a user