Files
tracer-cloud--opensre/surfaces/interactive_shell/prompt_history/storage.py
T
wehub-resource-sync 4b6817381b
CI (OpenClaw E2E) / openclaw test (push) Has been cancelled
CI / coverage-report (push) Has been cancelled
CI / test-kubernetes (push) Has been cancelled
CI / should-run-thorough (push) Has been cancelled
CI / test-thorough (cloudwatch-demo) (push) Has been cancelled
CI / test-thorough (flink-ecs) (push) Has been cancelled
CI / test-thorough (upstream-lambda) (push) Has been cancelled
CI / test-thorough (prefect-ecs-fargate) (push) Has been cancelled
Release / build-binaries (zip, opensre.exe, onefile, windows-latest, windows-x64) (push) Has been cancelled
Benchmark image — build + push to ECR (any adapter) / build + push (push) Has been cancelled
CI / quality (ubuntu-latest) (push) Has been cancelled
CI / test (tools-runtime) (push) Has been cancelled
CI / test (e2e-general) (push) Has been cancelled
CI / test (cli-runtime) (push) Has been cancelled
CI / test (e2e-provider-and-openclaw) (push) Has been cancelled
CI / test (integrations-and-misc) (push) Has been cancelled
Release / verify (push) Has been cancelled
Release / build-python-dist (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-15-intel, darwin-x64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, macos-latest, darwin-arm64) (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04, linux-x64) (push) Has been cancelled
Release / publish-release (push) Has been cancelled
Release / publish-main-release (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-checks (no-LLM) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Interactive Shell Live (PR + post-merge) / turn-live shard ${{ matrix.shard_index }} (push) Has been cancelled
Release / prepare (push) Has been cancelled
Release / build-binaries (tar.gz, opensre, onedir, ubuntu-22.04-arm, linux-arm64) (push) Has been cancelled
Synthetic Deterministic Tests / Synthetic offline (deterministic) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:10:45 +08:00

80 lines
2.2 KiB
Python

"""Persistent command history for the interactive shell prompt."""
from __future__ import annotations
from pathlib import Path
from prompt_toolkit.history import FileHistory, History, InMemoryHistory
from surfaces.interactive_shell.prompt_history.policy import (
HistoryPolicy,
RedactingFileHistory,
)
_HISTORY_FILENAME = "interactive_history"
def prompt_history_path() -> Path:
from config.constants import OPENSRE_HOME_DIR
return OPENSRE_HOME_DIR / _HISTORY_FILENAME
def load_prompt_history(policy: HistoryPolicy | None = None) -> History:
"""Use persistent prompt history when possible, with an in-memory fallback.
When ``policy.enabled`` is False, persistence is skipped entirely and
an in-memory ring is returned. When ``policy.redact`` is False, raw
``FileHistory`` is used so power users can opt out of redaction.
"""
settings = policy or _load_policy()
if not settings.enabled:
return InMemoryHistory()
try:
path = prompt_history_path()
path.parent.mkdir(parents=True, exist_ok=True)
if settings.redact:
return RedactingFileHistory(str(path), max_entries=settings.max_entries)
return FileHistory(str(path))
except OSError:
return InMemoryHistory()
def load_command_history_entries() -> list[str]:
"""Return persisted prompt entries in chronological order."""
try:
path = prompt_history_path()
path.parent.mkdir(parents=True, exist_ok=True)
history = FileHistory(str(path))
raw = list(reversed(list(history.load_history_strings())))
return [line.rstrip("\r\n") for line in raw]
except OSError:
return []
def clear_persisted_history() -> bool:
"""Truncate the on-disk history file. Returns True if the file is gone or empty."""
path = prompt_history_path()
try:
if path.exists():
path.write_text("", encoding="utf-8")
return True
except OSError:
return False
def _load_policy() -> HistoryPolicy:
from config.repl_config import read_history_settings
return HistoryPolicy.load(read_history_settings())
__all__ = [
"clear_persisted_history",
"load_command_history_entries",
"load_prompt_history",
"prompt_history_path",
]