core/cli: hand the trash switch to the tools

`[trash] enabled` now reaches `delete_path` through the bound instance's
workspace policy, the same channel `[agent] path_denylist` already travels: set
when the session state is built and re-read by `reload_config_from_disk`, so a
config reload in the middle of a chat changes the next delete too.

The policy flag is what `delete_path` consults, so a host that never sets it
gets the safe default (deletes go to the trash) instead of a silent no-op.
This commit is contained in:
2026-10-21 20:22:50 +08:00
parent c4a287c464
commit 17813281d8
7 changed files with 54 additions and 4 deletions
+14
View File
@@ -5,6 +5,7 @@ from pathlib import Path
import pytest
from plyngent.tools.file import copy_path, delete_path, fs_ops, move_path, read_file, write_file
from plyngent.tools.workspace import set_trash_enabled
from tests.test_tools.helpers import call_sync
@@ -169,3 +170,16 @@ def test_permanent_delete_skips_the_trash(workspace: object, monkeypatch: pytest
assert out == "deleted file t.txt"
assert not (workspace / "t.txt").exists()
def test_the_host_switch_turns_the_trash_off(workspace: object, monkeypatch: pytest.MonkeyPatch) -> None:
"""``[trash] enabled = false`` restores the behaviour from before the trash."""
assert isinstance(workspace, Path)
_elsewhere_than_temp(monkeypatch)
set_trash_enabled(enabled=False)
_ = call_sync(write_file, "t.txt", "x")
out = call_sync(delete_path, "t.txt")
assert out == "deleted file t.txt"
assert not (workspace / "t.txt").exists()
+12
View File
@@ -7,12 +7,14 @@ from plyngent.tools import (
WorkspaceError,
active_workspace_policy,
check_command_allowed,
get_trash_enabled,
get_workspace_root,
mode_covers,
parse_access_mode,
resolve_path,
set_command_denylist,
set_path_denylist,
set_trash_enabled,
)
from plyngent.tools.context import SessionState, bind_session
@@ -55,6 +57,16 @@ def test_access_mode_parse_and_covers() -> None:
assert not mode_covers(AccessMode.READ, AccessMode.WRITE)
def test_trash_switch(workspace: object) -> None:
"""Deletes go to the trash until a host clears the switch."""
del workspace
assert get_trash_enabled() is True
set_trash_enabled(enabled=False)
assert get_trash_enabled() is False
set_trash_enabled(enabled=True)
assert get_trash_enabled() is True
def test_config_grant_modes(workspace: object, tmp_path_factory: pytest.TempPathFactory) -> None:
del workspace
outside = tmp_path_factory.mktemp("granted")