Files
2026-07-13 13:12:33 +08:00

123 lines
5.2 KiB
Python

from __future__ import annotations
import json
from opensquilla.engine.runtime_events import append_runtime_event
from opensquilla.engine.turn_runner.agent_bootstrap_stage import (
_final_diff_contract_mode_from_env,
_positive_int_from_env,
_post_tool_empty_recovery_mode_from_env,
_reasoning_prefill_recovery_mode_from_env,
_runtime_recovery_mode_from_env,
_source_diff_candidate_mode_from_env,
_source_diff_preservation_mode_from_env,
_tool_loop_observer_mode_from_env,
)
def test_append_runtime_event_writes_jsonl(tmp_path) -> None:
path = tmp_path / "nested" / "runtime_events.jsonl"
append_runtime_event(
str(path),
{
"feature": "tool_loop_observer",
"reason": "reasoning_only",
"details": {"iteration": 3},
},
)
event = json.loads(path.read_text(encoding="utf-8"))
assert event["feature"] == "tool_loop_observer"
assert event["reason"] == "reasoning_only"
assert event["details"] == {"iteration": 3}
assert isinstance(event["created_at"], str)
assert isinstance(event["timestamp"], str)
def test_append_runtime_event_ignores_missing_path(tmp_path) -> None:
append_runtime_event(None, {"feature": "tool_loop_observer"})
assert list(tmp_path.iterdir()) == []
def test_tool_loop_observer_mode_env(monkeypatch) -> None:
monkeypatch.setenv("OPENSQUILLA_TOOL_LOOP_OBSERVER_MODE", "log")
assert _tool_loop_observer_mode_from_env() == "log"
monkeypatch.setenv("OPENSQUILLA_TOOL_LOOP_OBSERVER_MODE", "invalid")
assert _tool_loop_observer_mode_from_env() == "off"
monkeypatch.delenv("OPENSQUILLA_TOOL_LOOP_OBSERVER_MODE")
assert _tool_loop_observer_mode_from_env() == "off"
def test_runtime_recovery_modes_from_env(monkeypatch) -> None:
monkeypatch.setenv("OPENSQUILLA_RUNTIME_RECOVERY_MODE", "warn_model")
monkeypatch.setenv("OPENSQUILLA_FINAL_DIFF_CONTRACT_MODE", "warn_model")
monkeypatch.setenv("OPENSQUILLA_POST_TOOL_EMPTY_RECOVERY_MODE", "warn_model")
monkeypatch.setenv("OPENSQUILLA_REASONING_PREFILL_RECOVERY_MODE", "recover")
assert _runtime_recovery_mode_from_env() == "warn_model"
assert _final_diff_contract_mode_from_env() == "warn_model"
assert _post_tool_empty_recovery_mode_from_env() == "warn_model"
assert _reasoning_prefill_recovery_mode_from_env() == "recover"
monkeypatch.setenv("OPENSQUILLA_RUNTIME_RECOVERY_MODE", "invalid")
monkeypatch.setenv("OPENSQUILLA_FINAL_DIFF_CONTRACT_MODE", "invalid")
monkeypatch.setenv("OPENSQUILLA_POST_TOOL_EMPTY_RECOVERY_MODE", "invalid")
monkeypatch.setenv("OPENSQUILLA_REASONING_PREFILL_RECOVERY_MODE", "invalid")
assert _runtime_recovery_mode_from_env() == "log"
assert _final_diff_contract_mode_from_env() == "log"
assert _post_tool_empty_recovery_mode_from_env() == "log"
assert _reasoning_prefill_recovery_mode_from_env() == "log"
def test_source_diff_preservation_mode_from_env(monkeypatch) -> None:
monkeypatch.setenv("OPENSQUILLA_SOURCE_DIFF_PRESERVATION_MODE", "block")
assert _source_diff_preservation_mode_from_env() == "block"
monkeypatch.setenv("OPENSQUILLA_SOURCE_DIFF_PRESERVATION_MODE", "off")
assert _source_diff_preservation_mode_from_env() == "off"
monkeypatch.setenv("OPENSQUILLA_SOURCE_DIFF_PRESERVATION_MODE", "invalid")
assert _source_diff_preservation_mode_from_env() == "log"
monkeypatch.delenv("OPENSQUILLA_SOURCE_DIFF_PRESERVATION_MODE")
assert _source_diff_preservation_mode_from_env() == "log"
assert _source_diff_preservation_mode_from_env("block") == "block"
assert _source_diff_preservation_mode_from_env("off") == "off"
assert _source_diff_preservation_mode_from_env("invalid") == "log"
monkeypatch.setenv("OPENSQUILLA_SOURCE_DIFF_PRESERVATION_MODE", "off")
assert _source_diff_preservation_mode_from_env("block") == "off"
def test_source_diff_candidate_mode_from_env(monkeypatch) -> None:
monkeypatch.setenv("OPENSQUILLA_SOURCE_DIFF_CANDIDATE_MODE", "warn_model")
assert _source_diff_candidate_mode_from_env() == "warn_model"
monkeypatch.setenv("OPENSQUILLA_SOURCE_DIFF_CANDIDATE_MODE", "off")
assert _source_diff_candidate_mode_from_env() == "off"
monkeypatch.setenv("OPENSQUILLA_SOURCE_DIFF_CANDIDATE_MODE", "invalid")
assert _source_diff_candidate_mode_from_env() == "log"
monkeypatch.delenv("OPENSQUILLA_SOURCE_DIFF_CANDIDATE_MODE")
assert _source_diff_candidate_mode_from_env() == "log"
assert _source_diff_candidate_mode_from_env("warn_model") == "warn_model"
assert _source_diff_candidate_mode_from_env("off") == "off"
assert _source_diff_candidate_mode_from_env("invalid") == "log"
monkeypatch.setenv("OPENSQUILLA_SOURCE_DIFF_CANDIDATE_MODE", "off")
assert _source_diff_candidate_mode_from_env("warn_model") == "off"
def test_runtime_recovery_source_loop_max_nudges_env(monkeypatch) -> None:
monkeypatch.setenv("OPENSQUILLA_RUNTIME_RECOVERY_SOURCE_LOOP_MAX_NUDGES", "3")
assert _positive_int_from_env("OPENSQUILLA_RUNTIME_RECOVERY_SOURCE_LOOP_MAX_NUDGES", 1) == 3
monkeypatch.setenv("OPENSQUILLA_RUNTIME_RECOVERY_SOURCE_LOOP_MAX_NUDGES", "invalid")
assert _positive_int_from_env("OPENSQUILLA_RUNTIME_RECOVERY_SOURCE_LOOP_MAX_NUDGES", 1) == 1