feat(perm): 添加会话权限模式管理功能
实现会话权限模式管理功能,包括: 1. 在 pty_process 中定义三种权限模式标志 2. 添加 /perm 命令用于修改会话权限模式 3. 新增 run_command 工具用于执行 bot 控制命令 4. 在会话管理中支持权限模式设置 5. 添加完整的测试用例和文档说明
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
Feature: /perm command — change session permission mode
|
||||
|
||||
Background:
|
||||
Given user "user_abc123" is sending commands
|
||||
|
||||
Scenario: No args shows usage
|
||||
When user sends "/perm"
|
||||
Then reply contains "Usage"
|
||||
And reply contains "bypass"
|
||||
And reply contains "accept"
|
||||
And reply contains "plan"
|
||||
|
||||
Scenario: Set active session to accept mode
|
||||
Given user has session "sess01" in "/tmp/proj1"
|
||||
And active session is "sess01"
|
||||
When user sends "/perm accept"
|
||||
Then reply contains "accept"
|
||||
And reply contains "sess01"
|
||||
And session "sess01" has permission mode "acceptEdits"
|
||||
|
||||
Scenario: Set active session to plan mode
|
||||
Given user has session "sess01" in "/tmp/proj1"
|
||||
And active session is "sess01"
|
||||
When user sends "/perm plan"
|
||||
Then reply contains "plan"
|
||||
And session "sess01" has permission mode "plan"
|
||||
|
||||
Scenario: Set active session back to bypass
|
||||
Given user has session "sess01" in "/tmp/proj1"
|
||||
And active session is "sess01"
|
||||
When user sends "/perm bypass"
|
||||
Then reply contains "bypass"
|
||||
And session "sess01" has permission mode "bypassPermissions"
|
||||
|
||||
Scenario: Unknown mode returns error
|
||||
Given user has session "sess01" in "/tmp/proj1"
|
||||
And active session is "sess01"
|
||||
When user sends "/perm turbo"
|
||||
Then reply contains "Unknown mode"
|
||||
|
||||
Scenario: No active session returns error
|
||||
Given no active session for user "user_abc123"
|
||||
When user sends "/perm accept"
|
||||
Then reply contains "No active session"
|
||||
|
||||
Scenario: Set permission on specific conv_id
|
||||
Given user has session "sess01" in "/tmp/proj1"
|
||||
And user has session "sess02" in "/tmp/proj2"
|
||||
And active session is "sess01"
|
||||
When user sends "/perm plan sess02"
|
||||
Then reply contains "sess02"
|
||||
And session "sess02" has permission mode "plan"
|
||||
|
||||
Scenario: Cannot change permission of another user's session
|
||||
Given session "sess01" in "/tmp/proj1" belongs to user "other_user"
|
||||
When user sends "/perm accept sess01"
|
||||
Then reply contains "another user"
|
||||
|
||||
Scenario: New session with --perm accept
|
||||
When user sends "/new myproject --perm accept"
|
||||
Then reply contains "accept"
|
||||
And session manager has 1 session for user "user_abc123"
|
||||
|
||||
Scenario: New session with --perm plan
|
||||
When user sends "/new myproject --perm plan"
|
||||
Then reply contains "plan"
|
||||
|
||||
Scenario: New session with invalid --perm
|
||||
When user sends "/new myproject --perm turbo"
|
||||
Then reply contains "Invalid"
|
||||
@@ -143,6 +143,15 @@ def check_no_active_session(user_id):
|
||||
assert agent._active_conv.get(user_id) is None
|
||||
|
||||
|
||||
@then(parsers.parse('session "{conv_id}" has permission mode "{mode}"'))
|
||||
def check_session_perm_mode(conv_id, mode):
|
||||
from agent.manager import manager
|
||||
session = manager._sessions.get(conv_id)
|
||||
assert session is not None, f"Session {conv_id!r} not found"
|
||||
assert session.permission_mode == mode, \
|
||||
f"Expected permission_mode={mode!r}, got {session.permission_mode!r}"
|
||||
|
||||
|
||||
# ── Then: mode state ─────────────────────────────────────────────────────────
|
||||
|
||||
@then(parsers.parse('passthrough mode is enabled for user "{user_id}"'))
|
||||
|
||||
@@ -20,6 +20,7 @@ scenarios(
|
||||
"../features/commands/tasks.feature",
|
||||
"../features/commands/nodes.feature",
|
||||
"../features/commands/help.feature",
|
||||
"../features/commands/perm.feature",
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user