Move cmd restrictions from RoleZero to the terminal

This commit is contained in:
黄伟韬 2024-10-12 14:26:27 +08:00
parent 1b07a42d28
commit 86ad3edaca
4 changed files with 30 additions and 28 deletions

View file

@ -34,8 +34,6 @@ class Engineer2(RoleZero):
goal: str = "Take on game, app, and web development."
instruction: str = ENGINEER2_INSTRUCTION
terminal: Terminal = Field(default_factory=Terminal, exclude=True)
# The cmd in forbidden_terminal_commands will be replace by pass ana return the advise.
forbidden_terminal_commands: dict = {"npm run dev": "Use Deployer.deploy_to_public instead."}
deployer: Deployer = Field(default_factory=Deployer)
tools: list[str] = [
"Plan",

View file

@ -85,8 +85,6 @@ class RoleZero(Role):
"Editor.append_file",
"Editor.open_file",
]
# The cmd in forbidden_terminal_commands will be replace by pass ana return the advise. {"cmd":"forbidden_reason/advice"}
forbidden_terminal_commands: dict = {}
# Equipped with three basic tools by default for optional use
editor: Editor = Editor(enable_auto_lint=True)
browser: Browser = Browser()
@ -546,16 +544,8 @@ class RoleZero(Role):
return human_response
# output from bash.run may be empty, add decorations to the output to ensure visibility.
elif cmd["command_name"] == "Terminal.run_command":
tool_output = ""
# Remove forbidden commands
if any([forbidden_cmd in cmd["args"]["cmd"] for forbidden_cmd in self.forbidden_terminal_commands.keys()]):
for cmd_name, reason in self.forbidden_terminal_commands.items():
# 'true' is a pass command in linux terminal.
cmd["args"]["cmd"] = cmd["args"]["cmd"].replace(cmd_name, "true")
tool_output += f"{cmd_name} is failed to executed. {reason}\n"
tool_obj = self.tool_execution_map[cmd["command_name"]]
tool_output += await tool_obj(**cmd["args"])
tool_output = await tool_obj(**cmd["args"])
if len(tool_output) <= 10:
command_output += (
f"\n[command]: {cmd['args']['cmd']} \n[command output] : {tool_output} (pay attention to this.)"

View file

@ -839,11 +839,11 @@ Explanation: I will first need to read the system design document and the projec
}
]
```
## example 2.1
## example 2
User Requirement: Implement the core game project in Vue/React framework.
Explanation: This is a project that needs to be implemented using Vue.js. Therefore, I need to copy the Vue/React template to the project folder first.
## example 2.2
## example 3
User Requirement: Writing code.
The template is :
public
@ -910,7 +910,7 @@ If the project is a Vue or React Project, install the dependencies after finishi
]
```
## example 3
## example 4
Explanation: Take on one task, such as writing or rewriting a file. Upon completion, finish current task.
```json
@ -927,7 +927,7 @@ Explanation: Take on one task, such as writing or rewriting a file. Upon complet
}
]
```
## example 3.2
## example 5
Explanation: The project have been completed. And this project is a Vue/React Project,so i will deploy the project to the public.
```json
@ -939,7 +939,7 @@ Explanation: The project have been completed. And this project is a Vue/React Pr
}
}
]
## example 3.3
## example 6
Explanation: After install the project. I will deploy the project to the public.
```json
[
@ -951,7 +951,7 @@ Explanation: After install the project. I will deploy the project to the public.
}
]
## example 4
## example 7
I have received a GitHub issue URL.
I will use browser to review the detailed information of this issue in order to understand the problem.
```json
@ -965,7 +965,7 @@ I will use browser to review the detailed information of this issue in order to
]
```
## example 6
## example 8
I need to locating the `openai_api.py` file, so I will search for the `openai_api.py` file.
```json
[
@ -980,7 +980,7 @@ I need to locating the `openai_api.py` file, so I will search for the `openai_ap
## example 7
## example 9
I have located the openai_api.py file. I want to edit this file, so I will open it first.
```json
[
@ -993,7 +993,7 @@ I have located the openai_api.py file. I want to edit this file, so I will open
]
```
## example 8
## example 10
I have opened the openai_api.py file. However, the range of lines shown is from 001 to 100, and I want to see more. Therefore, I want to use the scroll_down command to view additional lines.
```json
[
@ -1004,7 +1004,7 @@ I have opened the openai_api.py file. However, the range of lines shown is from
]
```
## example 9
## example 11
I want to change the key bindings from (w/s) to the arrow keys (up, down). And add the space bar to pause.
the previous file look like:
142| while not self.is_game_over():
@ -1031,7 +1031,7 @@ Editor tool is exclusive. If I use this tool, I cannot use any other commands in
]
```
## example 10
## example 12
I want to add a score variable in the initialization of the game.
the previous file look like:
028| if restart:
@ -1063,7 +1063,7 @@ After executing the command, the file will be:
033| self.location = (0,0)
In the next turn, I will try to add another code snippet
## example 11
## example 13
Create a pull request (Optional): Merge the changes from the new branch into the master branch.
Thought: Now that the changes have been pushed to the remote repository, due to the user's requirement, let's create a pull request to merge the changes into the master branch.
@ -1084,7 +1084,7 @@ Thought: Now that the changes have been pushed to the remote repository, due to
]
```
## example 12
## example 14
The requirement is to create a product website featuring goods such as caps, dresses, and T-shirts.
I believe pictures would improve the site, so I will get the images first.
```json

View file

@ -26,6 +26,11 @@ class Terminal:
self.stdout_queue = Queue(maxsize=1000)
self.observer = TerminalReporter()
self.process: Optional[asyncio.subprocess.Process] = None
# The cmd in forbidden_terminal_commands will be replace by pass ana return the advise. example:{"cmd":"forbidden_reason/advice"}
self.forbidden_commands = {
"npm run dev": "Use Deployer.deploy_to_public instead.",
"pnpm run dev": "Use Deployer.deploy_to_public instead.",
}
async def _start_process(self):
# Start a persistent shell process
@ -60,6 +65,14 @@ class Terminal:
if self.process is None:
await self._start_process()
output = ""
# Remove forbidden commands
for cmd_name, reason in self.forbidden_commands.items():
# 'true' is a pass command in linux terminal.
if cmd_name in cmd:
cmd = cmd.replace(cmd_name, "true")
output += f"{cmd_name} is failed to executed. {reason}\n"
# Send the command
self.process.stdin.write((cmd + self.command_terminator).encode())
self.process.stdin.write(
@ -68,9 +81,10 @@ class Terminal:
await self.process.stdin.drain()
if daemon:
asyncio.create_task(self._read_and_process_output(cmd))
return ""
else:
return await self._read_and_process_output(cmd)
output += await self._read_and_process_output(cmd)
return output
async def execute_in_conda_env(self, cmd: str, env, daemon=False) -> str:
"""