From 19ed65aa0da712855ade3a8a392d36e49993171e Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Sun, 18 Oct 2026 15:24:36 +0800 Subject: [PATCH] fix(chat): persist empty managed Codex conversations before binding Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../evidence/empty-managed-chat-reopened.png | Bin 0 -> 55747 bytes .../capabilities/native_chat/codex_adapter.py | 51 +++++++++------ tests/test_chat_agent.py | 58 ++++++++++++++++++ tests/test_chat_agent_model_http.py | 4 +- 4 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 examples/personal-workspace-browser/evidence/empty-managed-chat-reopened.png diff --git a/examples/personal-workspace-browser/evidence/empty-managed-chat-reopened.png b/examples/personal-workspace-browser/evidence/empty-managed-chat-reopened.png new file mode 100644 index 0000000000000000000000000000000000000000..28c3684d67d1e8def8270cffb9565455f0af74bc GIT binary patch literal 55747 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 None: self.returncode = -1 +@pytest.mark.parametrize("resume", [False, True]) +def test_managed_chat_materializes_only_new_threads_without_a_turn(monkeypatch, tmp_path, resume): + process = _FakeAppServerProcess() + if not resume: + process.stdout = io.StringIO(process.stdout.getvalue() + json.dumps({ + "id": 3, "result": {}, + }) + "\n") + monkeypatch.setattr(chat_agent.shutil, "which", lambda _: "codex") + monkeypatch.setattr(chat_agent.subprocess, "Popen", lambda *a, **k: process) + adapter = chat_runtime.CodexAppServerAdapter.start( + codex_bin="codex", work_dir=tmp_path, goal_id="fixture", objective="Chat", + resume_thread_id="thread-loopx-chat" if resume else None, + ) + try: + requests = [json.loads(line) for line in process.stdin.getvalue().splitlines()] + names = [row for row in requests if row["method"] == "thread/name/set"] + assert names == ([] if resume else [{ + "method": "thread/name/set", "id": 3, + "params": {"threadId": "thread-loopx-chat", "name": "LoopX Chat"}, + }]) + assert adapter.upstream_thread_id == "thread-loopx-chat" + assert not any(row["method"] in {"turn/start", "thread/fork"} for row in requests) + assert [row["method"] for row in requests].count( + "thread/resume" if resume else "thread/start") == 1 + finally: + adapter.close_session() + + +def test_failed_empty_thread_materialization_closes_without_publishing_or_replaying(monkeypatch, tmp_path): + from loopx.chat_store import ChatSessionStore + + process = _FakeAppServerProcess() + process.stdout = io.StringIO(process.stdout.getvalue() + json.dumps({ + "id": 3, "error": {"code": -32603, "message": "private provider detail"}, + }) + "\n") + real_which, real_popen = chat_agent.shutil.which, chat_agent.subprocess.Popen + monkeypatch.setattr(chat_agent.shutil, "which", lambda name: "codex" if name == "codex" else real_which(name)) + launches = [] + monkeypatch.setattr(chat_agent.subprocess, "Popen", lambda command, *a, **k: + (launches.append(command) or process) if command[0] == "codex" else real_popen(command, *a, **k)) + store = ChatSessionStore(tmp_path) + controller = chat_runtime.ChatRuntimeController(store=store, codex_bin="codex") + monkeypatch.setattr(controller, "capabilities", lambda: [{"agent_id": "codex", "available": True}]) + try: + with pytest.raises(chat_agent.CodexChatAgentError, match="rejected thread/name/set") as caught: + controller.open_session(goal_id="loopx-manager", agent_id="codex", work_dir=tmp_path, + objective="Chat", mode="new", channel_id="manager") + assert "private provider detail" not in str(caught.value) + assert store.list_sessions() == [] + assert controller.adapters == {} + assert len(launches) == 1 and process.returncode == 0 + methods = [json.loads(line)["method"] for line in process.stdin.getvalue().splitlines()] + assert methods.count("thread/start") == 1 + assert not set(methods) & {"thread/resume", "thread/fork", "turn/start"} + finally: + controller.close() + + @pytest.mark.parametrize("reported", [None, "fixture-model"]) def test_requested_model_is_not_reported_as_observed_without_native_readback(tmp_path, monkeypatch, reported): from loopx.chat_runtime import CodexAppServerAdapter diff --git a/tests/test_chat_agent_model_http.py b/tests/test_chat_agent_model_http.py index 27bd65b932..f833f7f6a2 100644 --- a/tests/test_chat_agent_model_http.py +++ b/tests/test_chat_agent_model_http.py @@ -123,7 +123,9 @@ def test_http_replay_withholds_legacy_raw_reasoning_without_rewriting_history(tm server = chat_server.ChatHTTPServer(("127.0.0.1", 0), chat_server.ChatRequestHandler) server.verbose = False server.chat_store = store - server.runtime_controller = SimpleNamespace(close=lambda: None) + # A completed replay has no exited execution to recover. Keep the HTTP + # fixture's terminal recovery hook aligned with the real controller. + server.runtime_controller = SimpleNamespace(close=lambda: None, recover_exited_turn=lambda *_: None) thread = threading.Thread(target=server.serve_forever, daemon=True) thread.start() connection = http.client.HTTPConnection("127.0.0.1", server.server_port, timeout=5)