mirror of https://github.com/kortix-ai/suna.git
wip
This commit is contained in:
parent
b370a34ee4
commit
fa7e932f08
|
@ -51,15 +51,8 @@ You are a world-class web developer who can create, edit, and delete files, and
|
||||||
|
|
||||||
RULES:
|
RULES:
|
||||||
- All current file contents are available to you in the <current_workspace_state> section
|
- All current file contents are available to you in the <current_workspace_state> section
|
||||||
- Each file in the workspace state includes:
|
- Each file in the workspace state includes its full content
|
||||||
* content: The full file contents
|
|
||||||
* line_count: Total number of lines in the file
|
|
||||||
* lines: Array of line objects containing:
|
|
||||||
- number: Line number (1-based)
|
|
||||||
- content: The line's content
|
|
||||||
- length: Length of the line
|
|
||||||
- Use str_replace for precise replacements in files
|
- Use str_replace for precise replacements in files
|
||||||
- Use insert_lines to add new content at specific line numbers (use the line numbers from the workspace state)
|
|
||||||
- NEVER include comments in any code you write - the code should be self-documenting
|
- NEVER include comments in any code you write - the code should be self-documenting
|
||||||
- Always maintain the full context of files when making changes
|
- Always maintain the full context of files when making changes
|
||||||
- When creating new files, write clean code without any comments or documentation
|
- When creating new files, write clean code without any comments or documentation
|
||||||
|
@ -68,7 +61,6 @@ RULES:
|
||||||
[create_file(file_path, file_contents)] - Create new files
|
[create_file(file_path, file_contents)] - Create new files
|
||||||
[delete_file(file_path)] - Delete existing files
|
[delete_file(file_path)] - Delete existing files
|
||||||
[str_replace(file_path, old_str, new_str)] - Replace specific text in files
|
[str_replace(file_path, old_str, new_str)] - Replace specific text in files
|
||||||
[insert_lines(file_path, insert_line, new_content)] - Insert content at specific line number
|
|
||||||
[execute_command(command)] - Execute terminal commands
|
[execute_command(command)] - Execute terminal commands
|
||||||
</available_tools>
|
</available_tools>
|
||||||
|
|
||||||
|
@ -82,21 +74,15 @@ ALWAYS RESPOND WITH MULTIPLE SIMULTANEOUS ACTIONS:
|
||||||
</actions>
|
</actions>
|
||||||
|
|
||||||
EDITING GUIDELINES:
|
EDITING GUIDELINES:
|
||||||
1. Review the current file contents and line information in the workspace state
|
1. Review the current file contents in the workspace state
|
||||||
2. Use line numbers from the workspace state for precise insertions
|
2. Make targeted changes with str_replace
|
||||||
3. Make targeted changes with str_replace or insert_lines
|
3. Write clean, self-documenting code without comments
|
||||||
4. Write clean, self-documenting code without comments
|
4. Use create_file for new files and str_replace for modifications
|
||||||
|
|
||||||
Example workspace state for a file:
|
Example workspace state for a file:
|
||||||
{
|
{
|
||||||
"index.html": {
|
"index.html": {
|
||||||
"content": "<!DOCTYPE html>\\n<html>\\n<head>...",
|
"content": "<!DOCTYPE html>\\n<html>\\n<head>..."
|
||||||
"line_count": 15,
|
|
||||||
"lines": [
|
|
||||||
{"number": 1, "content": "<!DOCTYPE html>", "length": 15},
|
|
||||||
{"number": 2, "content": "<html>", "length": 6},
|
|
||||||
...
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +134,7 @@ if __name__ == "__main__":
|
||||||
thread_id,
|
thread_id,
|
||||||
{
|
{
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": "Let's create a marketing website for my AI Agent 'Jarvis' using HTML, CSS, Javascript. Use images from pixabay, pexels, and co. Style it cyberpunk style. Make it like Ironmen Jarvis."
|
"content": "Let's create a identical 1to1 Airbnb Clone using HTML, CSS, Javascript. Use images from pixabay, pexels, and co."
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
import os
|
import os
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from collections import defaultdict
|
||||||
|
from typing import Optional, List
|
||||||
from agentpress.tool import Tool, ToolResult, tool_schema
|
from agentpress.tool import Tool, ToolResult, tool_schema
|
||||||
from agentpress.state_manager import StateManager
|
from agentpress.state_manager import StateManager
|
||||||
|
|
||||||
|
@ -84,20 +87,8 @@ class FilesTool(Tool):
|
||||||
try:
|
try:
|
||||||
with open(full_path, 'r') as f:
|
with open(full_path, 'r') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
lines = content.split('\n')
|
|
||||||
|
|
||||||
# Create file state object with content and line information
|
|
||||||
files_state[rel_path] = {
|
files_state[rel_path] = {
|
||||||
"content": content,
|
"content": content
|
||||||
"line_count": len(lines),
|
|
||||||
"lines": [
|
|
||||||
{
|
|
||||||
"number": i + 1,
|
|
||||||
"content": line,
|
|
||||||
"length": len(line)
|
|
||||||
}
|
|
||||||
for i, line in enumerate(lines)
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error reading file {rel_path}: {e}")
|
print(f"Error reading file {rel_path}: {e}")
|
||||||
|
@ -203,48 +194,6 @@ class FilesTool(Tool):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return self.fail_response(f"Error replacing string: {str(e)}")
|
return self.fail_response(f"Error replacing string: {str(e)}")
|
||||||
|
|
||||||
@tool_schema({
|
|
||||||
"name": "insert_lines",
|
|
||||||
"description": "Insert lines at a specific line number in a file",
|
|
||||||
"parameters": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"file_path": {"type": "string", "description": "Path to the file"},
|
|
||||||
"insert_line": {"type": "integer", "description": "Line number to insert at"},
|
|
||||||
"new_content": {"type": "string", "description": "Content to insert"}
|
|
||||||
},
|
|
||||||
"required": ["file_path", "insert_line", "new_content"]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
async def insert_lines(self, file_path: str, insert_line: int, new_content: str) -> ToolResult:
|
|
||||||
try:
|
|
||||||
full_path = Path(os.path.join(self.workspace, file_path))
|
|
||||||
if not full_path.exists():
|
|
||||||
return self.fail_response(f"File '{file_path}' does not exist")
|
|
||||||
|
|
||||||
content = full_path.read_text().expandtabs()
|
|
||||||
lines = content.split('\n')
|
|
||||||
|
|
||||||
if insert_line < 0 or insert_line > len(lines):
|
|
||||||
return self.fail_response(f"Invalid line number {insert_line}")
|
|
||||||
|
|
||||||
# Insert new content
|
|
||||||
new_lines = new_content.expandtabs().split('\n')
|
|
||||||
updated_lines = lines[:insert_line] + new_lines + lines[insert_line:]
|
|
||||||
new_content = '\n'.join(updated_lines)
|
|
||||||
|
|
||||||
full_path.write_text(new_content)
|
|
||||||
|
|
||||||
# Show snippet around the edit
|
|
||||||
start_line = max(0, insert_line - self.SNIPPET_LINES)
|
|
||||||
end_line = insert_line + len(new_lines) + self.SNIPPET_LINES
|
|
||||||
snippet = '\n'.join(updated_lines[start_line:end_line])
|
|
||||||
|
|
||||||
return self.success_response(f"Lines inserted successfully. Snippet of changes:\n{snippet}")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
return self.fail_response(f"Error inserting lines: {str(e)}")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
async def test_files_tool():
|
async def test_files_tool():
|
||||||
|
|
Loading…
Reference in New Issue