From 9a6861bce36967438c4bc6cfb841debc3472973b Mon Sep 17 00:00:00 2001 From: famez Date: Tue, 27 Jan 2026 21:21:23 +0100 Subject: [PATCH 1/3] Actually install playwright browser on base image --- Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Dockerfile b/Dockerfile index 2f0ed15..79c1012 100644 --- a/Dockerfile +++ b/Dockerfile @@ -53,9 +53,14 @@ COPY . . RUN useradd -m -s /bin/bash pentestagent && \ chown -R pentestagent:pentestagent /app +RUN playwright install-deps + # Switch to non-root user (can switch back for privileged operations) USER pentestagent +RUN playwright install + + # Expose any needed ports EXPOSE 8080 From 432e81b28326601e0e008254b9f7b33dd4769aa7 Mon Sep 17 00:00:00 2001 From: famez Date: Tue, 27 Jan 2026 21:22:14 +0100 Subject: [PATCH 2/3] Allow ignoring SSL errors when browsing HTTPS webs with self-signed certificates (throws error otherwise). --- pentestagent/runtime/runtime.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pentestagent/runtime/runtime.py b/pentestagent/runtime/runtime.py index e9f8c06..42754a5 100644 --- a/pentestagent/runtime/runtime.py +++ b/pentestagent/runtime/runtime.py @@ -571,7 +571,8 @@ class LocalRuntime(Runtime): self._playwright = await async_playwright().start() self._browser = await self._playwright.chromium.launch(headless=True) self._browser_context = await self._browser.new_context( - user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" + user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + ignore_https_errors=True ) self._page = await self._browser_context.new_page() From e87c9ca1c835f5c01b1649ee53df8b4cc8cd7100 Mon Sep 17 00:00:00 2001 From: famez Date: Tue, 27 Jan 2026 21:43:37 +0100 Subject: [PATCH 3/3] Fixed error when launching the application in agent mode (state is not a member of PentestAgentAgent). --- pentestagent/agents/base_agent.py | 3 +++ pentestagent/interface/tui.py | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pentestagent/agents/base_agent.py b/pentestagent/agents/base_agent.py index e9172b5..b752e2e 100644 --- a/pentestagent/agents/base_agent.py +++ b/pentestagent/agents/base_agent.py @@ -938,3 +938,6 @@ Call create_plan with the new steps OR feasible=False.""" else: parts.append(f"Error: {r.error}") return "\n".join(parts) + + def get_state(self) -> AgentState: + return self.state_manager.current_state \ No newline at end of file diff --git a/pentestagent/interface/tui.py b/pentestagent/interface/tui.py index df8941c..2b00b67 100644 --- a/pentestagent/interface/tui.py +++ b/pentestagent/interface/tui.py @@ -2954,6 +2954,9 @@ Be concise. Use the actual data from notes.""" self._set_status("thinking", "agent") try: + + from ..agents.base_agent import AgentState + async for response in self.agent.agent_loop(task): if self._should_stop: self._add_system("[!] Stopped by user") @@ -2999,11 +3002,11 @@ Be concise. Use the actual data from notes.""" ) # Check state - if self.agent.state.value == "waiting_input": + if self.agent.get_state() == AgentState.WAITING_INPUT: self._set_status("waiting") self._add_system("? Awaiting input...") break - elif self.agent.state.value == "complete": + elif self.agent.get_state() == AgentState.COMPLETE: break self._set_status("thinking")