personal memory agent
1# SPDX-License-Identifier: AGPL-3.0-only
2# Copyright (c) 2026 sol pbc
3
4import argparse
5import os
6import sys
7from pathlib import Path
8
9from .prompts import load_prompt
10from .utils import setup_cli
11
12
13def _load_prompt() -> str:
14 """Return system instruction text for planning."""
15 prompt_content = load_prompt("planner", base_dir=Path(__file__).parent)
16 return prompt_content.text
17
18
19def generate_plan(request: str) -> str:
20 """Return a detailed agent plan for ``request`` using configured provider."""
21 from think.models import generate
22
23 return generate(
24 contents=request,
25 context="planner.generate",
26 temperature=0.3,
27 max_output_tokens=4096,
28 thinking_budget=4096,
29 system_instruction=_load_prompt(),
30 )
31
32
33def parse_args() -> argparse.ArgumentParser:
34 parser = argparse.ArgumentParser(
35 description="Generate an agent plan using configured provider"
36 )
37 parser.add_argument(
38 "task",
39 nargs="?",
40 help="Path to .txt file with the request or '-' for stdin",
41 )
42 parser.add_argument("-q", "--query", help="Request text directly")
43 return parser
44
45
46def main() -> None:
47 parser = parse_args()
48 args = setup_cli(parser)
49 if args.query:
50 request = args.query
51 elif args.task is None:
52 parser.error("request not provided")
53 elif args.task == "-":
54 request = sys.stdin.read()
55 else:
56 if not os.path.isfile(args.task):
57 parser.error(f"File not found: {args.task}")
58 request = Path(args.task).read_text(encoding="utf-8")
59
60 plan = generate_plan(request)
61 print(plan)
62
63
64if __name__ == "__main__": # pragma: no cover - manual execution
65 main()