import json from apps.admin_console.database.repositories.step_repository import StepRepository def test_android_capture_receipt_survives_cleaning_without_becoming_image_store_id(): receipt = { "ok": True, "action": "screenshot", "verified": True, "device_serial": "device-under-test", "trace_path": "artifacts/android/screen.png", "sha256": "a" * 64, "captured_at": "2026-10-28T00:00:00Z", "content": "large file content must not be copied into the task stream", } cleaned = StepRepository()._clean_tool_payload( {"args": {"action": "screenshot"}, "result": json.dumps(receipt)}, "tool", "android_file", ) assert cleaned["result"] == {key: value for key, value in receipt.items() if key != "content"} assert "post_image_name" not in cleaned wrapped = StepRepository()._clean_tool_payload( {"result": json.dumps({"outcome": json.dumps(receipt)})}, "tool", "android_file" ) assert wrapped["result"] == cleaned["result"] def test_legacy_pause_log_is_normalized_to_failed_llm_trace(): repository = StepRepository() trace = { "trace_id": "pause-log", "type": "log", "name": "artemis.services.llm", "status": "success", "payload": json.dumps( { "message": ( "LLM Error: 503 UNAVAILABLE. {'error': {'message': 'High demand'}}. " "Pausing execution to wait for resume signal..." ) } ), } normalized = repository._normalize_display_trace(trace) assert normalized["type"] == "llm_call" assert normalized["name"] == "llm_pause" assert normalized["status"] == "failed" assert normalized["payload"]["pause"] is True assert normalized["payload"]["error"].startswith("503 UNAVAILABLE") def test_unrelated_log_is_not_presented_as_llm_failure(): repository = StepRepository() trace = { "trace_id": "ordinary-log", "type": "log", "name": "artemis.services.llm", "status": "success", "payload": json.dumps({"message": "LLM request completed"}), } normalized = repository._normalize_display_trace(trace) assert normalized["type"] == "log" assert normalized["status"] == "success" def test_retrying_llm_payload_keeps_user_visible_retry_details(): repository = StepRepository() trace = { "trace_id": "retry-1", "type": "llm_call", "name": "llm_retry", "status": "retrying", "payload": json.dumps( { "error": "503 UNAVAILABLE: high demand", "delay": 1.18, "provider": "openai", "source": "provider_sdk", "recoverable": True, "internal_noise": "do not expose", } ), } normalized = repository._normalize_display_trace(trace) assert normalized["payload"] == { "error": "503 UNAVAILABLE: high demand", "delay": 1.18, "provider": "openai", "source": "provider_sdk", "recoverable": True, } def test_terminal_llm_payload_keeps_wait_and_retry_aggregation(): repository = StepRepository() retries = [ { "delay": 5.0, "scheduled_at": 100.0, "provider": "openai", "source": "provider_sdk", } ] trace = { "type": "llm_call", "name": "llm_pause", "status": "failed", "payload": json.dumps( { "error": "503 UNAVAILABLE", "pause": True, "request_id": "request-1", "provider": "openai", "waited_seconds": 18.5, "retries": retries, "messages": ["private prompt"], } ), } normalized = repository._normalize_display_trace(trace) assert normalized["payload"] == { "error": "503 UNAVAILABLE", "provider": "openai", "pause": True, "request_id": "request-1", "waited_seconds": 18.5, "retries": retries, }