From 6dfb79dcd2aad0b3ab361c8f36585123716ef272 Mon Sep 17 00:00:00 2001 From: dark Date: Tue, 2 Jun 2026 16:57:55 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E5=A4=8D=20chat=5Fhistory.t?= =?UTF-8?q?xt=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pam_deploy_graph/interactive.py | 12 +++++++++++- tests/test_interactive_cli.py | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/pam_deploy_graph/interactive.py b/pam_deploy_graph/interactive.py index 0b54156..31c2c30 100644 --- a/pam_deploy_graph/interactive.py +++ b/pam_deploy_graph/interactive.py @@ -6,6 +6,8 @@ import time import json import shlex import builtins +import os +import sys from dataclasses import asdict from pathlib import Path from typing import Any, Callable @@ -557,8 +559,16 @@ def _build_prompt_input(input_func: InputFunc) -> InputFunc: "checkpoint", "exit", ] + history = None + try: + history_path = Path("runtime") / "chat_history.txt" + history_path.parent.mkdir(parents=True, exist_ok=True) + history = FileHistory(str(history_path)) + except OSError: + history = None + session = PromptSession( - history=FileHistory(str(Path("runtime") / "chat_history.txt")), + history=history, completer=WordCompleter(commands, ignore_case=True, sentence=True), ) return session.prompt diff --git a/tests/test_interactive_cli.py b/tests/test_interactive_cli.py index 7aaf7d1..c398847 100644 --- a/tests/test_interactive_cli.py +++ b/tests/test_interactive_cli.py @@ -1,8 +1,11 @@ +import builtins from pathlib import Path +import pytest + from pam_deploy_graph.agent import PamDeployAgent from pam_deploy_graph.fake_runner import FakeActionRunner -from pam_deploy_graph.interactive import InteractiveCliSession +from pam_deploy_graph.interactive import InteractiveCliSession, _build_prompt_input PARAMS = { @@ -130,3 +133,31 @@ def test_chat_can_hot_load_mcp_config(tmp_path: Path): assert session.agent.mcp_runner is not None assert session.agent.router.mcp_runner is not None assert any("MCP 配置已加载" in item for item in output) + + +def test_prompt_history_creates_runtime_dir(tmp_path: Path, monkeypatch): + pytest.importorskip("prompt_toolkit") + monkeypatch.chdir(tmp_path) + + prompt = _build_prompt_input(builtins.input) + + assert callable(prompt) + assert (tmp_path / "runtime").is_dir() + + +def test_packaged_chat_uses_plain_input_by_default(monkeypatch): + monkeypatch.setattr("sys.frozen", True, raising=False) + monkeypatch.delenv("PAM_CHAT_PROMPT_TOOLKIT", raising=False) + monkeypatch.delenv("PAM_CHAT_SIMPLE_INPUT", raising=False) + + prompt = _build_prompt_input(builtins.input) + + assert prompt is builtins.input + + +def test_simple_input_env_disables_prompt_toolkit(monkeypatch): + monkeypatch.setenv("PAM_CHAT_SIMPLE_INPUT", "1") + + prompt = _build_prompt_input(builtins.input) + + assert prompt is builtins.input