mirror of
https://github.com/NCBM/plyngent.git
synced 2026-07-23 05:55:16 +08:00
core/tools: add ask_into_pty for human-local PTY input
Prompt the human (optional no-echo secret) and write only to the PTY. Tool results never include the answer so secrets stay off external APIs. Empty/Ctrl-C cancel without writing; submit defaults to trailing newline.
This commit is contained in:
+23
-1
@@ -18,9 +18,16 @@ from plyngent.prompting import (
|
||||
class ScriptedBackend:
|
||||
"""Deterministic backend for unit tests."""
|
||||
|
||||
def __init__(self, lines: list[str], *, confirms: list[bool] | None = None) -> None:
|
||||
def __init__(
|
||||
self,
|
||||
lines: list[str],
|
||||
*,
|
||||
confirms: list[bool] | None = None,
|
||||
secrets: list[str] | None = None,
|
||||
) -> None:
|
||||
self.lines = list(lines)
|
||||
self.confirms = list(confirms or [])
|
||||
self.secrets = list(secrets or [])
|
||||
self.interactive = True
|
||||
self.echoes: list[str] = []
|
||||
|
||||
@@ -42,6 +49,13 @@ class ScriptedBackend:
|
||||
msg = "no scripted lines left"
|
||||
raise NonInteractiveError(msg)
|
||||
|
||||
def read_secret_line(self, prompt: str) -> str:
|
||||
del prompt
|
||||
if self.secrets:
|
||||
return self.secrets.pop(0)
|
||||
msg = "no scripted secrets left"
|
||||
raise NonInteractiveError(msg)
|
||||
|
||||
def confirm(self, prompt: str, *, default: bool = False) -> bool:
|
||||
del prompt
|
||||
if self.confirms:
|
||||
@@ -63,6 +77,14 @@ def test_ask_free_text() -> None:
|
||||
assert ask("Name?") == "hello world"
|
||||
|
||||
|
||||
def test_ask_secret() -> None:
|
||||
from plyngent.prompting import ask_secret
|
||||
|
||||
backend = ScriptedBackend([], secrets=["s3cret"])
|
||||
with temporary_backend(backend):
|
||||
assert ask_secret("Password?") == "s3cret"
|
||||
|
||||
|
||||
def test_ask_default_when_empty_uses_backend_default() -> None:
|
||||
backend = ScriptedBackend([])
|
||||
with temporary_backend(backend):
|
||||
|
||||
Reference in New Issue
Block a user