-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path__init__.py
More file actions
85 lines (69 loc) · 2.96 KB
/
Copy path__init__.py
File metadata and controls
85 lines (69 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from __future__ import annotations
import functools
import logging
from pathlib import Path
_BUNDLED_DIR = Path(__file__).parent
_log = logging.getLogger(__name__)
@functools.lru_cache(maxsize=32)
def load_prompt(name: str, *, project: str = "kernel") -> str:
if not name or "/" in name or "\\" in name or name in (".", ".."):
raise ValueError(f"Invalid prompt name: {name}")
if not project or "/" in project or "\\" in project or project in (".", ".."):
raise ValueError(f"Invalid project name: {project}")
bundled = _BUNDLED_DIR / project / f"{name}.md"
if not bundled.is_file():
raise FileNotFoundError(f"bundled prompt not found: {bundled}")
parts = [bundled.read_text(encoding="utf-8").strip()]
from patchpilot.config import get_prompts_dirs
seen: set[Path] = set()
for d in get_prompts_dirs():
resolved = d.resolve()
if resolved in seen:
continue
seen.add(resolved)
for candidate in (d / project / f"{name}.md", d / f"{name}.md"):
if candidate.is_file():
try:
text = candidate.read_text(encoding="utf-8").strip()
except (OSError, UnicodeDecodeError):
_log.warning("failed to read external prompt %s", candidate)
continue
if text:
parts.append(text)
break
return "\n\n".join(parts)
@functools.lru_cache(maxsize=64)
def load_external_prompt(name: str, *, project: str = "kernel") -> str:
if not name or "/" in name or "\\" in name or name in (".", ".."):
raise ValueError(f"Invalid prompt name: {name}")
if not project or "/" in project or "\\" in project or project in (".", ".."):
raise ValueError(f"Invalid project name: {project}")
from patchpilot.config import get_prompts_dirs
seen: set[Path] = set()
for d in get_prompts_dirs():
resolved = d.resolve()
if resolved in seen:
continue
seen.add(resolved)
for candidate in (d / project / f"{name}.md", d / f"{name}.md"):
if candidate.is_file():
try:
text = candidate.read_text(encoding="utf-8").strip()
except (OSError, UnicodeDecodeError):
_log.warning("failed to read external prompt %s", candidate)
continue
if text:
return text
return ""
@functools.lru_cache(maxsize=32)
def load_shared_prompt(name: str) -> str:
if not name or "/" in name or "\\" in name or name in (".", ".."):
raise ValueError(f"Invalid prompt name: {name}")
path = _BUNDLED_DIR / "shared" / f"{name}.md"
if not path.is_file():
raise FileNotFoundError(f"shared prompt not found: {path}")
return path.read_text(encoding="utf-8").strip()
def bust_cache() -> None:
load_prompt.cache_clear()
load_external_prompt.cache_clear()
load_shared_prompt.cache_clear()