044e4e82ae
Ten tools ported, all pure pass-throughs to post_to_sandbox: - browser_action (1 tool): the 21-action mega-tool dispatcher kept intact rather than fanned out, to preserve the legacy XML shape. - terminal_execute (1 tool): tmux session driver. - python_action (1 tool): IPython session manager. - proxy / Caido (7 tools): list_requests, view_request, send_request, repeat_request, scope_rules, list_sitemap, view_sitemap_entry. strix_tool decorator gains a strict_mode flag (default True, matching the SDK default). send_request and repeat_request opt out of strict mode because their headers / modifications dicts are free-form — the SDK's strict JSON schema rejects dict[str, X] without enumerated keys. Tests: 12 new tests in test_sdk_sandbox_tools.py covering registration, strict-mode opt-out verification for the two free-form tools, and dispatch shape verification (every wrapper is asserted to forward its full kwarg surface to post_to_sandbox so the in-container handler sees the same payload it always has). Per-file ruff TC002 ignores added for the four new wrapper modules. Phase 2 (tools) is now complete: 24 SDK function tools wrapped across think/todo/notes/web_search/file_edit/reporting/load_skill/finish_scan/ browser/terminal/python/proxy. Total: 7 local + 17 sandbox-bound. Phase 3 (multi-agent orchestration) is next. Refs: PLAYBOOK.md §3.6. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
"""SDK function-tool wrapper for the legacy ``terminal_execute`` tool.
|
|
|
|
The terminal lives in the sandbox container — each persistent tmux
|
|
session is keyed by ``terminal_id`` on the in-container manager. The
|
|
host-side wrapper is a thin pass-through.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from typing import Any
|
|
|
|
from agents import RunContextWrapper
|
|
|
|
from strix.tools._decorator import strix_tool
|
|
from strix.tools._sandbox_dispatch import post_to_sandbox
|
|
|
|
|
|
def _dump(result: dict[str, Any]) -> str:
|
|
return json.dumps(result, ensure_ascii=False, default=str)
|
|
|
|
|
|
@strix_tool(timeout=180)
|
|
async def terminal_execute(
|
|
ctx: RunContextWrapper,
|
|
command: str,
|
|
is_input: bool = False,
|
|
timeout: float | None = None,
|
|
terminal_id: str | None = None,
|
|
no_enter: bool = False,
|
|
) -> str:
|
|
"""Run a shell command in the sandboxed Kali tmux session.
|
|
|
|
Args:
|
|
command: Shell command (or input for an interactive prompt when
|
|
``is_input=True``).
|
|
is_input: Treat ``command`` as input to a running foreground process
|
|
(e.g., feeding y/n to ``apt install``).
|
|
timeout: Seconds to wait before returning partial output. Defaults
|
|
to the in-container manager's policy.
|
|
terminal_id: Persistent session selector. Defaults to ``"default"``.
|
|
no_enter: When True, sends keystrokes without a trailing return.
|
|
Useful for sending raw ANSI control sequences.
|
|
"""
|
|
return _dump(
|
|
await post_to_sandbox(
|
|
ctx,
|
|
"terminal_execute",
|
|
{
|
|
"command": command,
|
|
"is_input": is_input,
|
|
"timeout": timeout,
|
|
"terminal_id": terminal_id,
|
|
"no_enter": no_enter,
|
|
},
|
|
),
|
|
)
|